In dem Beitrag mit dem Titel: "EVU Smartmeter mit ESP32 auslesen und Daten per MQTT senden" (link) habe ich beschrieben, wie sich die Smartmeter der EVUs über die Kundenschnittstelle auslesen lassen. Die Messdaten stehen dann als Topics über den mqtt Broker zur Verfügung und können in diversen Homeautomationen (HomeMatic, Homeassistant, etc.) weiterverarbeitet werden. Dazu benötigt man lediglich eine ESP32-Platine und ein paar wenige Kleinteile, um die Verbindung zum Smartmeter herstellen zu können. Als kleines Update habe ich den Aufbau (damals mit Stiftleisten auf Lochrasterplatine) mittlerweile ein wenig geschönt und eine Platine gefertigt.
Layout im Designtool |
Der zugehörige Schaltplan entspricht im Wesentlichen auch der Skizze im damaligen Beitrag. Um ein wenig Komfort mit der neuen Platine zu erhalten, ist die Verbindung zur Kundenschnittstelle des Smartmeters über eine RJ-Buchse steckbar. Und auch die Spannungsversorgung habe ich über eine USB-Buchse realisiert.
Nach dem Bestücken und Aufstecken der ESP32 Platine bekam das Gerät noch ein kleines Gehäuse spendiert und verrichtet nun im E-Verteilerschrank seinen Dienst.
Die Hardware ist somit fertig und funktionstüchtig. Zum Thema Software habe ich mir auch überlegt, etwas zu ändern. Bis jetzt lief auf dem ESP ein Programm, das die Daten des Smartmeters entschlüsselt und dann per MQTT an die IP Adresse des Brokers gesendet hat. Da ich mittlerweile jedoch auch ein Anwender der ESPHome Integration in meiner HomeAssistant Umgebung bin, habe ich den ESP mit einem ESPHome Basisimage geflasht. Auf GitHub gibt es das Repository von Andre-Schuiki, auf dem er eine Version für ISKRA und SIEMENS Smartmeter für die Verwendung mit ESPHome veröffentlicht. Unter folgendem Link ist die Anleitung zur Installation zu finden: https://github.com/Andre-Schuiki/esphome_im350/tree/main/esp_home
Das Script für das ESPHome Graät sieht bei mir folgendermassen aus:
esphome: name: kelagsmartmeter friendly_name: KelagSmartmeter libraries: - "Crypto" # !IMPORTANT! we need this library for decryption! esp32: board: esp32dev framework: type: arduino # Enable logging logger: # Enable Home Assistant API api: encryption: key: "da kommt der key rein des neu angelegten ESPHome Gerätes rein" ota: password: "das automatisch generierte ota passwort" wifi: ssid: !secret wifi_ssid password: !secret wifi_password # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "Kelagsmartmeter Fallback Hotspot" password: "
das automatisch generierte password
" captive_portal: external_components: - source: type: local path: custom_esphome sensor: - platform: siemens_im350 update_interval: 5s trigger_pin: 26 # this pin goes to pin 2 of the customer interface and will be set to high before we try to read the data from the rx pin rx_pin: 16 # this pin goes to pin 5 of the customer interface tx_pin: 17 # not connected at the moment, i added it just in case we need it in the future.. decryption_key: "00AA01BB02CC03DD04EE05FF06AA07BB" # you get the key from your provider! use_test_data: false # that was just for debugging, if you set it to true data are not read from serial and the test_data string is used test_data: "7EA077CF022313BB45E6E700DB0849534B697460B6FA5F200005C8606F536D06C32A190761E80A97E895CECA358D0A0EFD7E9C47A005C0F65B810D37FB0DA2AD6AB95F7F372F2AB11560E2971B914A5F8BFF5E06D3AEFBCD95B244A373C5DBDA78592ED2C1731488D50C0EC295E9056B306F4394CDA7D0FC7E0000" delay_before_reading_data: 1000 # this is needed because we have to wait for the interface to power up, you can try to lower this value but 1 sec was ok for me max_wait_time_for_reading_data: 1100 # maximum time to read the 123 Bytes (just in case we get no data) ntp_server: "pool.ntp.org" #if no ntp is specified pool.ntp.org is used ntp_gmt_offset: 3600 ntp_daylight_offset: 3600 counter_reading_p_in: name: reading_p_in filters: - lambda: return x / 1000; unit_of_measurement: kWh accuracy_decimals: 3 device_class: energy counter_reading_p_out: name: reading_p_out filters: - lambda: return x / 1000; unit_of_measurement: kWh accuracy_decimals: 3 device_class: energy counter_reading_q_in: name: reading_q_in filters: - lambda: return x / 1000; unit_of_measurement: kvarh device_class: energy counter_reading_q_out: name: reading_q_out filters: - lambda: return x / 1000; unit_of_measurement: kvarh device_class: energy current_power_usage_in: name: power_usage_in filters: - lambda: return x / 1000; unit_of_measurement: kW accuracy_decimals: 3 device_class: energy current_power_usage_out: name: power_usage_out filters: - lambda: return x / 1000; unit_of_measurement: kW accuracy_decimals: 3 device_class: energy # Extra sensor to keep track of uptime - platform: uptime name: IM350_Uptime Sensor switch: - platform: restart name: IM350_Restart