From 11528c83e9594237c7d753e80fdfa7b5dfd2c3e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Tue, 7 Feb 2023 00:17:19 +0100 Subject: [PATCH] Documentation for `vbus` component (#2397) Co-authored-by: Samuel Sieb Co-authored-by: Samuel Sieb Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- components/vbus.rst | 274 ++++++++++++++++++++++++ images/resol_deltasol_bs_plus.jpg | Bin 0 -> 10818 bytes images/resol_vbus_adapter_schematic.png | Bin 0 -> 17730 bytes index.rst | 3 + 4 files changed, 277 insertions(+) create mode 100644 components/vbus.rst create mode 100644 images/resol_deltasol_bs_plus.jpg create mode 100644 images/resol_vbus_adapter_schematic.png diff --git a/components/vbus.rst b/components/vbus.rst new file mode 100644 index 000000000..9cb76c84b --- /dev/null +++ b/components/vbus.rst @@ -0,0 +1,274 @@ +VBus Component +============== + +.. seo:: + :description: Instructions for integrating a solar energy collector controller using VBus protocol in ESPHome. + :image: resol_deltasol_bs_plus.jpg + :keywords: VBUS RESOL SOLAR + +The ``VBus`` Component provides status reading connectivity to solar heat energy collector controllers using VBus +protocol. These devices are mainly produced by Resol, often also found under different brand names like Viessmann, +Kioto, Wagner etc. The component currently supports natively Resol DeltaSol C, DeltaSol CS2, DeltaSol CS Plus, and DeltaSol BS Plus +but any device can be added via lambda by knowing `its packet structure `__. + +.. figure:: ../images/resol_deltasol_bs_plus.jpg + :align: center + +The device must be connected via a :doc:`UART bus ` supporting the receiving line only. The UART bus +must be configured at the same speed of the module which is by default 9600bps. The controller outputs data every second. + +To connect to this and read data from the bus a level shifting is needed as the voltage is around 8V (direct connection +would damage the MCU). Although this is a symmetric connection supporting long wires, for our read-only purposes it's +enough to adapt the level appropriately to 3.3V using a circuit like below: + +.. figure:: ../images/resol_vbus_adapter_schematic.png + :align: center + +Another approach, with PCB design ready to be manufactured `can be found here `__. + +.. warning:: + + Do not connect the GND pin of your module with the ground of Resol unit as that may damage the output port of it. + The output of the device is symmetric, meaning that the signal is not referenced to the ground, but rather it's a + differential signal between the two wires. However, the MCU references the signal against the ground, so the two + grounds are not supposed to be connected to each other as can be seen in the circuit depicted above. + + +Component +--------- + +.. code-block:: yaml + + # Example configuration entry + uart: + id: resol + rx_pin: GPIO3 + baud_rate: 9600 + + vbus: + uart_id: resol + + logger: + baud_rate: 0 # disable uart logger on ESP8266 + +.. warning:: + + If you are using the :doc:`logger` make sure you are not using the same pins for it or otherwise disable the UART + logging with the ``baud_rate: 0`` option. + +Configuration variables: + +- **uart_id** (*Optional*, :ref:`config-id`): Manually specify the ID of the UART hub used to connect to the device. + +.. note:: + + Functionality of the sensors depends on the type of the device and the the scheme arrangement of the hydraulic + system it controls. The actual arrangement number set up can be determined from the settings of the device. Please + check the user manual and assess your arrangement to determine the functionality of each sensor and name them + accordingly. + + +Sensor +------ + +.. code-block:: yaml + + # Example configuration entry + sensor: + - platform: vbus + model: deltasol_bs_plus + temperature_1: + name: Temperature 1 + temperature_2: + name: Temperature 2 + temperature_3: + name: Temperature 3 + temperature_4: + name: Temperature 4 + pump_speed_1: + name: Pump Speed 1 + pump_speed_2: + name: Pump Speed 2 + operating_hours_1: + name: Operating Hours 1 + operating_hours_2: + name: Operating Hours 2 + heat_quantity: + name: Heat Quantity + time: + name: Device Time + version: + name: Device firmware version + + +Configuration variables: + +- **model** (**Required**): Specify the model of the connected controller. Currently supported models are: ``deltasol_bs_plus``, ``deltasol_c``, ``deltasol_cs2``, ``deltasol_cs_plus``. + + +Supported sensors: + +- for **deltasol_bs_plus**: ``temperature_1``, ``temperature_2``, ``temperature_3``, ``temperature_4``, ``pump_speed_1``, ``pump_speed_2``, ``operating_hours_1``, ``operating_hours_2``, ``heat_quantity``, ``time``, ``version``. +- for **deltasol_c**: ``temperature_1``, ``temperature_2``, ``temperature_3``, ``temperature_4``, ``pump_speed_1``, ``pump_speed_2``, ``operating_hours_1``, ``operating_hours_2``, ``heat_quantity``, ``time``. +- for **deltasol_cs2**: ``temperature_1``, ``temperature_2``, ``temperature_3``, ``temperature_4``, ``pump_speed``, ``operating_hours``, ``heat_quantity``, ``version``. +- for **deltasol_cs_plus**: ``temperature_1``, ``temperature_2``, ``temperature_3``, ``temperature_4``, ``temperature_5``, ``pump_speed_1``, ``pump_speed_2``, ``operating_hours_1``, ``operating_hours_2``, ``heat_quantity``, ``time``, ``version``, ``flow_rate``. + + +All sensors are *Optional* and support all other options from :ref:`Sensor `. + +.. note:: + + Sensors are updated every time a data packet is sent by the device. Some models send data very often, possibly every second. If you are + concerned about the load on the receiving database, you can add a ``throttle`` filter to the sensors. + + + +Binary Sensor +------------- + +.. code-block:: yaml + + # Example configuration entry + binary_sensor: + - platform: vbus + model: deltasol_bs_plus + relay1: + name: Relay 1 On + relay2: + name: Relay 2 On + sensor1_error: + name: Sensor 1 Fault + sensor2_error: + name: Sensor 2 Fault + sensor3_error: + name: Sensor 3 Fault + sensor4_error: + name: Sensor 4 Fault + collector_max: + name: Option Collector Max + collector_min: + name: Option Collector Min + collector_frost: + name: Option Collector Frost + tube_collector: + name: Option Tube Collector + recooling: + name: Option Recooling + hqm: + name: Option Heat Quantity Measurement + + +Configuration variables: + +- **model** (**Required**): Specify the model of the connected controller. Currently supported models are: ``deltasol_bs_plus``, ``deltasol_c``, ``deltasol_cs2``, ``deltasol_cs_plus``. + +Supported sensors: + +- for **deltasol_bs_plus**: ``relay1``, ``relay2``, ``sensor1_error``, ``sensor2_error``, ``sensor3_error``, ``sensor4_error``, ``collector_max``, ``collector_min``, ``collector_frost``, ``tube_collector``, ``recooling``, ``hqm``. +- for **deltasol_c**: ``sensor1_error``, ``sensor2_error``, ``sensor3_error``, ``sensor4_error``. +- for **deltasol_cs2**: ``sensor1_error``, ``sensor2_error``, ``sensor3_error``, ``sensor4_error``. +- for **deltasol_cs_plus**: ``sensor1_error``, ``sensor2_error``, ``sensor3_error``, ``sensor4_error``. + + +All binary sensors are *Optional* and support all other options from :ref:`Binary Sensor `. + + +``Custom`` VBus sensors +----------------------- + +Devices on a VBus are identified with a source address. There can be multiple devices on the same bus, +each device type has a different address. + + +.. code-block:: yaml + + sensor: + - platform: vbus + model: custom + dest: 0x10 + source: 0x1234 + command: 0x100 + sensors: + - id: temp1 + name: Temp 1 + lambda: return ((x[1] << 8) + x[0]) / 10.0; + + +Configuration variables: + +- **model** (**Required**): Set to ``custom``. +- **dest** (**Required**): The ``DFA`` value corresponding to your device (see below). +- **source** (**Required**): The address corresponding to ``your device model`` (see below). +- **command** (**Required**): The ``command`` corresponding to your device (see below). +- **sensors** (**Required**): A list of :ref:`Sensor ` definitions that include a ``lambda`` to do the decoding and return a ``float`` value. + +- **lambda** (**Required**, :ref:`lambda `): Code to parse a value from the incoming data packets and return it. + The data packet is in a `std::vector` called `x`. + + +``custom`` VBus binary sensors +------------------------------ + +Configuration variables: + +- **model** (**Required**): Set to ``custom``. +- **dest** (**Required**): The ``DFA`` value corresponding to your device (see below). +- **source** (**Required**): The address corresponding to ``your device model`` (see below). +- **command** (**Required**): The ``command`` corresponding to your device (see below). +- **binary_sensors** (**Required**): A list of :ref:`Binary Sensor ` definitions that include a ``lambda`` to do the decoding and return a ``bool`` value. + +- **lambda** (**Required**, :ref:`lambda `): Code to parse a value from the incoming data packets and return it. + The data packet is in a `std::vector` called `x`. + +To determine the correct values for the parameters above, visit `packet definitions list `__. In the search field of the **Packets** table, enter the name of your device. + +To extract the values with a :ref:`lambda `, look in the packet structure by clicking the **Bytes** link in the table. Each value is placed at an ``offset`` within the packet. +For ``float`` values, let's look at the temperature example: the value is stored as a ``16``-bit value in ``2`` bytes little-endian format. Since it's always the second byte containing the upper byte, it needs to be shifted by ``8`` bits (multiplied by ``256``) (e.g. ``0x34, 0x12 -> 0x1234``). The result needs to be multiplied by the factor, which is ``0.1``, to obtain the correct values: ``((x[1] << 8) + x[0]) * 0.1f)``. The number within the square brackets is the ``[offset]``. +For ``binary`` values, multiple binary values are stored within a single numeric value encoded with a bitmask. To extract the binary value all you have to do is to apply *bitwise AND* operator ``&`` between the value at the corresponding offset and the ``mask`` shown in the table. + +For example to decode some sensors of `DeltaSol BS Plus` via lambdas: + +.. code-block:: yaml + + # Example configuration entry + sensor: + - platform: vbus + model: custom + dest: 0x10 + source: 0x4221 + command: 0x100 + sensors: + - id: scheme + name: Arrangement scheme + icon: mdi:pipe-wrench + accuracy_decimals: 0 + entity_category: diagnostic + lambda: return x[14]; // Configured arrangement scheme + - id: temp2 + name: Temperature DHW + state_class: measurement + unit_of_measurement: "°C" + lambda: return ((x[3] << 8) + x[2]) * 0.1f; // Temperature 2 + + binary_sensor: + - platform: vbus + model: custom + dest: 0x10 + source: 0x4221 + command: 0x100 + binary_sensors: + - name: Heat Quantity Measurement On + id: bin_hqm + icon: mdi:counter + lambda: return x[15] & 0x20; // Option Heat Quantity Measurement enabled + + +See Also +-------- + +- :doc:`/components/uart` +- :doc:`/components/binary_sensor/index` +- :doc:`/components/sensor/index` +- `Resol manuals `__ +- `VBus protocol `__ +- :ghedit:`Edit` diff --git a/images/resol_deltasol_bs_plus.jpg b/images/resol_deltasol_bs_plus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0eaf55349807edeb9636051e9fe3a8c20ec4ea77 GIT binary patch literal 10818 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 AY5)KL literal 0 HcmV?d00001 diff --git a/index.rst b/index.rst index 683dfc295..90af27ca5 100644 --- a/index.rst +++ b/index.rst @@ -358,6 +358,7 @@ Miscellaneous TX20, components/sensor/tx20, tx20.jpg, Wind speed & Wind direction uFire EC sensor, components/sensor/ufire_ec, ufire_ec.png, EC & Temperature uFire ISE sensor, components/sensor/ufire_ise, ufire_ise.png, pH & Temperature + Resol VBus, components/vbus, resol_deltasol_bs_plus.jpg Motion @@ -420,6 +421,7 @@ Binary Sensor Components XPT2046, components/binary_sensor/xpt2046, xpt2046.jpg CAP1188 Capacitive Touch Sensor, components/binary_sensor/cap1188, cap1188.jpg Touchscreen, components/touchscreen/index, touch.svg + Resol VBus, components/vbus, resol_deltasol_bs_plus.jpg LD2410, components/sensor/ld2410, ld2410.jpg Custom Binary Sensor, components/binary_sensor/custom, language-cpp.svg @@ -725,6 +727,7 @@ Misc Components Grow Fingerprint Reader, components/fingerprint_grow, fingerprint.svg SML, components/sml, sml.svg Atlas Scientific Peristaltic Pump, components/ezo_pmp, ezo-pmp.jpg + Resol VBus, components/vbus, resol_deltasol_bs_plus.jpg Demo, components/demo, description.svg Copy, components/copy, content-copy.svg