From 8d4bccafb20f07ec4afa8b96443d178df751aee0 Mon Sep 17 00:00:00 2001 From: Andre Lengwenus Date: Tue, 10 May 2022 11:05:54 +0200 Subject: [PATCH] Add docs for SML (#1493) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- components/images/sml-log.png | Bin 0 -> 19704 bytes components/sml.rst | 179 ++++++++++++++++++++++++++++++++++ images/sml.svg | 1 + index.rst | 1 + 4 files changed, 181 insertions(+) create mode 100644 components/images/sml-log.png create mode 100644 components/sml.rst create mode 100644 images/sml.svg diff --git a/components/images/sml-log.png b/components/images/sml-log.png new file mode 100644 index 0000000000000000000000000000000000000000..a4cd2daca53aa916e1bfd55a03bddf403666a906 GIT binary patch literal 19704 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 Z!(CQ3ACH(Hz|+bYJYD@<);T3K0RV%emJa{` literal 0 HcmV?d00001 diff --git a/components/sml.rst b/components/sml.rst new file mode 100644 index 000000000..6d805e8ec --- /dev/null +++ b/components/sml.rst @@ -0,0 +1,179 @@ +SML (Smart Message Language) +============================ + +.. seo:: + :description: Instructions for setting up SML sensors + :image: sml.svg + :keywords: sml + +The ``SML`` component connects to smart meters which use the *Smart Message Language* (SML) protocol. + +Although the SML protocol is well defined, it gives a lot of freedom to the manufacturers how to store +and identify the transmitted data. Within a telegram the physical values are identified by *OBIS* codes +(Object Identification System). If it is known which code the manufacturer assigns to the physical value, +the corresponding value can be extracted. + +Hardware +-------- + +This component is passive, it does not transmit any data to your equipment. Usually a smart meter transmit +a telegram at regular intervals (2-4 seconds) on its own. +This component decodes and updates the configured sensors at the pace the data is received. + +Most smart meters transmit the telegrams using an infrared optical interface. As a sensor a suitable photo +transistor (e.g. BPW40) can be attached to the ESP's UART (emitter to `GND` and collector to `RX` pin). A more +mature solution can be found `here +`_ (in German). +There are plenty of other examples and ready to buy solutions on the web. + +Configuration +------------- + +As the communciation with the sensor is done using UART, you need to have the :ref:`UART bus ` +in your configuration. The interface parameters should be set to 9600/8N1 or 9600/7E1 depending on your +smart meter. If you see checksum errors in the log try changing the interface parameter. + +.. code-block:: yaml + + # Example configuration entry + uart: + id: uart_bus + rx_pin: GPIO3 + baud_rate: 9600 + data_bits: 8 + parity: NONE + stop_bits: 1 + + sml: + id: mysml + uart_id: uart_bus + + sensor: + - platform: sml + name: "Total energy" + sml_id: mysml + server_id: "0123456789abcdef" + obis_code: "1-0:1.8.0" + unit_of_measurement: kWh + accuracy_decimals: 1 + device_class: energy + state_class: total_increasing + filters: + - multiply: 0.0001 + + text_sensor: + - platform: sml + name: "Manufacturer" + sml_id: mysml + server_id: "0123456789abcdef" + obis_code: "129-129:199.130.3" + format: text + + +Configuration variables: +------------------------ + +.. _sml-platform: + +SML platform +************ + +- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. +- **uart_id** (*Optional*, :ref:`config-id`): Manually specify the ID of the :ref:`UART Component ` if you want + to use multiple UART buses. + +Sensor +****** + +- **obis_code** (*Required*, string): Specify the OBIS code you want to retrieve data for from the device. + The format must be (A-B:C.D.E, e.g. 1-0:1.8.0) +- **server_id** (*Optional*, string): Specify the device's server_id to retrieve the OBIS code from. Should be specified if more then one device is connected to the same hardware sensor component. +- **sml_id** (*Optional*, :ref:`config-id`): The ID of the :ref:`SML platform ` +- All other options from :ref:`Sensor `. + +Text Sensor +*********** + +- **obis_code** (*Required*, string): Specify the OBIS code you want to retrieve data for from the device. + The format must be (A-B:C.D.E, e.g. 1-0:1.8.0) +- **server_id** (*Optional*, string): Specify the device's server_id to retrieve the OBIS code from. Should be specified if more then one device is connected to the same hardware sensor component. +- **sml_id** (*Optional*, :ref:`config-id`): The ID of the :ref:`SML platform ` +- **format** (*Optional*, string): Override the automatic interpretation of the transmitted binary data value. Possible values (`int`, `uint`, `bool`, `hex`, `text`). +- All other options from :ref:`Text Sensor `. + + +Getting OBIS codes and sensor ids +--------------------------------- + +The physical values in the transmitted SML telegram are identified by a *server id* and *OBIS codes*. The *server id* +identifies your smart meter. If you have only one hardware component attached to your optical sensor you usually +don't have to care about the server id and you may ommit it in your configuration. + +In order to get the server id and the available OBIS codes provided by your smart meter, simply set up the +:ref:`SML platform ` and observe the log output (the :ref:`log level ` +must be set to at least ``debug``!). + +Your log output will show something like this: + +.. figure:: images/sml-log.png + :align: center + :width: 100.0% + + OBIS information in the log of the `SML` component + +Each line represents a combination of the server id (in brackets), the OBIS code and the transmitted hex value +(in square brackets). + + +Precision errors +---------------- +Many smart meters emit very huge numbers for certain OBIS codes (like the accumulated total active energy). +This may lead to precision errors for the values reported by the sensor component to ESPHome. This shows in +the fact that slightly wrong numbers may be reported to HomeAssistant. This is a result from internal limitations +in ESPHome and has nothing to do with the SML component. + +If you cannot live with this, you can use the `TextSensor` with an appropriate format to transmit the value as +a string to HomeAssistant. On the HomeAssistant side you can define a `Template Sensor `_ +to cast the value into the appropriate format and do some scaling. + +For ESPHome we have: + +.. code-block:: yaml + + # ESPHome configuration file + text_sensor: + - platform: sml + name: "Total energy text" + obis_code: "1-0:1.8.0" + format: uint + +The `format` parameter is optional. If ommited, the SML component will try to guess the correct datatype +from the received SML message. + +And in HomeAssistant: + +.. code-block:: yaml + + # Home Assistant configuration.yaml + template: + - sensor: + - name: "Total Energy Consumption" + unit_of_measurement: "kWh" + state: > + {% if states('sensor.total_energy_text') == 'unavailable' %} + {{ states('sensor.total_energy_consumption') }} + {% else %} + {{ ((states('sensor.total_energy_text') | float) * 0.0001) | round(2) }} + {% endif %} + +Usually the template sensor's value would turn to 0 if the ESP device is unavailable. +This results in problems when using the sensor in combination with the `Utility Meter `_ integration. +The state template provided above checks for the sensor's availability and keeps the +current state in case of unavailability. + + +See Also +-------- + +- :apiref:`sml/sml.h` +- :ghedit:`Edit` diff --git a/images/sml.svg b/images/sml.svg new file mode 100644 index 000000000..ae3e8d33c --- /dev/null +++ b/images/sml.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/index.rst b/index.rst index 961793cce..8d9391366 100644 --- a/index.rst +++ b/index.rst @@ -679,6 +679,7 @@ Misc Components Prometheus, components/prometheus, prometheus.svg PipSolar - compatible PV Inverter, components/pipsolar, pipsolar.jpg Grow Fingerprint Reader, components/fingerprint_grow, fingerprint.svg + SML, components/sml, sml.svg Demo, components/demo, description.svg Copy, components/copy, content-copy.svg