From e9c204bc4914a68a287655ec820b3b5999d45da7 Mon Sep 17 00:00:00 2001 From: clssn Date: Fri, 1 May 2020 16:38:54 +0200 Subject: [PATCH] Document Numato integration (#12749) --- source/_integrations/numato.markdown | 211 ++++++++++++++++++++++ source/images/supported_brands/numato.png | Bin 0 -> 13692 bytes 2 files changed, 211 insertions(+) create mode 100644 source/_integrations/numato.markdown create mode 100644 source/images/supported_brands/numato.png diff --git a/source/_integrations/numato.markdown b/source/_integrations/numato.markdown new file mode 100644 index 00000000000..eeb95e0d5b2 --- /dev/null +++ b/source/_integrations/numato.markdown @@ -0,0 +1,211 @@ +--- +title: Numato USB GPIO Expander +description: Instructions on how to integrate a Numato GPIO expander into Home Assistant. +ha_category: + - DIY + - Binary Sensor + - Sensor + - Switch +logo: numato.png +ha_release: "0.110" +ha_iot_class: Local Push +ha_domain: numato +--- + +The `numato` integration is the base for all related GPIO platforms of the +[Numato 32 Port USB GPIO expander](https://numato.com/product/32-channel-usb-gpio-module-with-analog-inputs): + +- [Binary Sensor](#binary-sensor) +- [Sensor](#sensor) +- [Switch](#switch) + +The whole configuration of all Numato devices is located in the general setup +of this integration. The following minimalistic example configures a couple of +binary_sensor, switch and sensor ports for a single device with ID 0. + +```yaml +numato: + devices: + - id: 0 + binary_sensors: + ports: + 2: Window Livingroom Open + 3: Window Livingroom Glassbreak + 4: Doorbell + sensors: + ports: + 1: + name: Soil Moisture Ficus + switches: + ports: + 5: Relay Light Outdoor + 6: Relay Circulation Pump + 7: Door Opener +``` + +{% configuration %} +discover: + description: List of OS device files (/dev/...) to try during discovery + required: false + default: List of /dev/ttyACM0 .. /dev/ttyACM9 + type: list +devices: + description: List of Numato 32 Port USB GPIO devices. + required: true + type: list + keys: + id: + description: ID configured in the device (not the Linux device since this can change). + required: true + type: integer + binary_sensors: + description: Configuration of ports for the `binary_sensor` platform + type: map + keys: + invert_logic: + description: Whether to invert the logic, so a high voltage level is interpreted as false. + required: false + default: false + type: boolean + ports: + description: Map of port numbers to names. + required: true + type: map + keys: + "port: name": + description: The port numbers and corresponding names. + required: true + type: string + sensors: + description: Configuration of ports for the `sensor` platform + type: map + keys: + ports: + description: Map of port numbers to ADC configurations. + required: true + type: map + keys: + "port: adc_config": + description: The port number and corresponding ADC configuration. + required: true + type: map + keys: + name: + description: Name of the ADC sensor port. + required: true + type: string + source_range: + description: Range within the ADC's resolution to map values from. + required: false + default: [0, 1024] + type: list + destination_range: + description: Range to map values from the source range to in a linear fashion. + required: false + default: [0.0, 100.0] + type: list + unit: + description: Unit of the destination values. + required: false + type: string + default: \% + switches: + description: Configuration of ports for the `sensor` platform + type: map + keys: + invert_logic: + description: Whether to invert the logic, so a value of true leads to a low voltage level at the output. + required: false + default: false + type: boolean + ports: + description: Map of port numbers to names. + required: true + type: map + keys: + "port: name": + description: The port numbers and corresponding names. + required: true + type: string +{% endconfiguration %} + +## Binary Sensor + +The `numato` binary_sensor platform allows you to operate the GPIOs of your +[Numato](https://numato.com) 32 port USB GPIO expander in binary input mode. + +
+ +As the Numato devices do not have internal pull-up or pull-down circuitry, +be careful not to destroy a port by creating a short circuit. Refer to the +[Numato documentation](https://numato.com/docs/32-channel-usb-gpio-module-with-analog-inputs/#gpio-with-switches-8) +on how to connect a switch to an input port, for example. + +
+ +## Sensor + +The `numato` sensor platform allows you to operate some GPIOs of your USB GPIO +expander in analog input mode. + +The Numato device has a number of built-in analog-digital-converters (ADCs) to +convert a voltage level between VCC and GND into a 10-bit integer value. Read +the [IO Ports](#io-ports) section for constraints on the ports to use. + +By default, the ADC's whole 10-bit range will be mapped to a float value between +0.0 and 1.0. Use the optional `source_range` to map from a specific range and +the `destination_range` to specify the value range to represent the entity +state. + +## Switch + +The `numato` switch platform allows you to operate the GPIOs of your +[Numato](https://numato.com) 32 port USB GPIO expander in output mode. + +## IO Ports + +The IO port numbers used in this configuration refer to the port numbers +printed on the PCB. Note that the Sensor platform can be configured on ports +1-7 only. These are the only ports on the 32 port device equipped with an ADC. + +For details about the GPIO layout, take a look at the [Numato 32 GPIO +documentation](https://numato.com/docs/32-channel-usb-gpio-module-with-analog-inputs). + +## Device IDs + +This integration uses a internal device ID to identify the device, which is +_not_ the Linux device path. The Linux device path (e.g., `/dev/ttyACM0`) can +change, for example, when you disconnect and re-connect the device or if you +connect the device to a different USB port. + +The internal device ID is 0 by default. If you have only one device, you should +not need to care about changing it. If you have multiple devices, their IDs are +shown in the console log during startup of Home Assistant. + +### Configure the Device ID + +Configure your Numato device's ID with the following steps. Though you can use +any terminal emulator to connect to and communicate with your device, the +following steps are based on using _GNU Screen_. On a Debian or Ubuntu-based OS +install _Screen_ like `sudo apt install screen`. + +1. Plug in only the one device to assign an id to so it'll get /dev/ttyACM0 +2. Wait a couple of seconds as your Linux OS may be trying to identify the + device as a Modem right after plugging it in +3. Run `screen /dev/ttyACM0` +4. Type `id get` to see the current ID +5. Type `id set 00000005` and hit enter to assign ID 5 +6. Type `id get` to validate and expect `00000005` as a reply +7. Quit screen with: Ctrl-a + \ and confirm with `y` + +Note that during communication with the device the ID values are strictly 32 +bit hexadecimal numbers (8 hex digits) with leading `0` padding. + +Hint: It is a good practice to put sticky labels with the IDs onto the PCBs in +order to avoid confusion of devices and their port configuration since this +could easily destroy your device. + +
+Numato devices used by Home Assistant are expected to be exclusive to Home +Assistant and remain permanently connected. +
diff --git a/source/images/supported_brands/numato.png b/source/images/supported_brands/numato.png new file mode 100644 index 0000000000000000000000000000000000000000..835c262be3e41be64d698337b6dee9c22252f23a GIT binary patch literal 13692 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 NFIBZwYL#pv{vVFQuJix^ literal 0 HcmV?d00001