In diesem Beitrag möchte ich dir zeigen, wie ich ein 8-fach Modbus Relais von Waveshare in Homeassistant eingebunden habe.
Material
- Modbus Relais
- Modbus->USB Converter
- 5V Netzteil
Aufbau
Der Aufbau ist nicht kompliziert. Die Anschlüsse A+, B- und GND müssen mit den entsprechend gleichnamigen Anschlüssen am Relais verbunden werden. Dann ist nur noch eine Spannungsversorgung für das Relais notwendig und man kann loslegen.
Mitgelieferte Software
Im Waveshare Wiki findet man neben zahlreichen Beispielen auch einen Beispielcode in Python. Dieser sendet die Daten direkt über „serial“ an das Modbus Relais und zur Berechnung der Paritätsbytes wird ebenfalls ein eigenes Pythonmodul mitgeliefert. Das ist etwas umständlich, da es für Modbus bereits fertige Pythonmodule wie minimalmodbus gibt.
Steuerung mit Minimalmodbus
Nach der Installation mit
1 |
pip3 install minimalmodbus |
kann das Modul verwendet werden. Folgendes wäre ein Beispielcode:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import minimalmodbus modbusrelay_heizung = minimalmodbus.Instrument('/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0', 2, debug = True) modbusrelay_heizung.serial.timeout = 0.1 def set_relais(relay, state): if state == "on": modbusrelay_heizung.write_bit(int(relay)-1, 1) if state == "off": modbusrelay_heizung.write_bit(int(relay)-1, 0) def get_relais(): binary_relais = modbusrelay_heizung.read_bits(0, 8, 1) print("Relais:" + str(binary_relais)) |
In Zeile 3 wird der Pfad zum USB -> Modbus Konverter und die ID des Relais angegeben. Die ID wird in den meisten Fällen 1 sein. Bei mir habe ich sie aber geändert, da am selben Modbus auch ein Stromzähler hängt, der die ID 1 bekommen hat. Mit den Funktionen get_relais()
und set_relais(relais, on/off)
kann man jetzt die Relais schalten und deren Status abfragen.
Einbindung in Homeassistant
Um das Modbus Relais in Homeassistant einzubinden, verwende ich MQTT. Dieses sollte bereits installiert und eingebunden sein. Mein Code sieht dann folgendermaßen aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
#!/usr/bin/env python3 import paho.mqtt.client as mqtt import requests import time import minimalmodbus modbusrelay_heizung = minimalmodbus.Instrument('/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0', 2, debug = True) modbusrelay_heizung.serial.timeout = 0.1 print(modbusrelay_heizung) def set_relais(relay, state): if state == "on": modbusrelay_heizung.write_bit(int(relay)-1, 1) if state == "off": modbusrelay_heizung.write_bit(int(relay)-1, 0) def get_relais(): binary_relais = modbusrelay_heizung.read_bits(0, 8, 1) print("Relais:" + str(binary_relais)) for i in range(8): if binary_relais[i] == 1: client.publish("modbus/relais_heizung/get/" + str(i+1), "on") else: client.publish("modbus/relais_heizung/get/" + str(i+1), "off") def on_connect(client, userdata, flags, rc): print("Connected with result code "+str(rc)) client.subscribe("modbus/relais_heizung/set/#") def on_message(client, userdata, msg): splitted_topic = msg.topic.split("/") relay = splitted_topic[3] print("Relay " + relay + " " + msg.payload.decode()) ready = False while not(ready): set_relais(relay, msg.payload.decode()) time.sleep(0.1) get_relais() ready = True client = mqtt.Client() client.connect("localhost",1883,60) client.on_connect = on_connect client.on_message = on_message get_relais() client.loop_forever() |
Hinzu kommt jetzt die Anbindung an MQTT. Wichtig ist dabei
- Z. 8: Siehe oben
- S. 23+25: Hier werden die Statuswerte der Relais an MQTT gesendet
- Z. 29: Hier wird das MQTT Topic subscribed, an das nachher die Befehle zum setzen gesendet werden
- Z. 43: Hier findet die Verbindung zum MQTT Broker statt
In Homeassistant verwende ich nun folgende Konfiguration:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
switch: - unique_id: modbus_relais_heizung_1 name: "Modbus Relais Heizung 1" state_topic: "modbus/relais_heizung/get/1" command_topic: "modbus/relais_heizung/set/1" payload_on: "on" payload_off: "off" state_on: "on" state_off: "off" qos: 0 - unique_id: modbus_relais_heizung_2 name: "Modbus Relais Heizung 2" state_topic: "modbus/relais_heizung/get/2" command_topic: "modbus/relais_heizung/set/2" payload_on: "on" payload_off: "off" state_on: "on" state_off: "off" qos: 0 - unique_id: modbus_relais_heizung_3 name: "Modbus Relais Heizung 3" state_topic: "modbus/relais_heizung/get/3" command_topic: "modbus/relais_heizung/set/3" payload_on: "on" payload_off: "off" state_on: "on" state_off: "off" qos: 0 - unique_id: modbus_relais_heizung_4 name: "Modbus Relais Heizung 4" state_topic: "modbus/relais_heizung/get/4" command_topic: "modbus/relais_heizung/set/4" payload_on: "on" payload_off: "off" state_on: "on" state_off: "off" qos: 0 - unique_id: modbus_relais_heizung_5 name: "Modbus Relais Heizung 5" state_topic: "modbus/relais_heizung/get/5" command_topic: "modbus/relais_heizung/set/5" payload_on: "on" payload_off: "off" state_on: "on" state_off: "off" qos: 0 - unique_id: modbus_relais_heizung_6 name: "Modbus Relais Heizung 6" state_topic: "modbus/relais_heizung/get/6" command_topic: "modbus/relais_heizung/set/6" payload_on: "on" payload_off: "off" state_on: "on" state_off: "off" qos: 0 - unique_id: modbus_relais_heizung_7 name: "Modbus Relais Heizung 7" state_topic: "modbus/relais_heizung/get/7" command_topic: "modbus/relais_heizung/set/7" payload_on: "on" payload_off: "off" state_on: "on" state_off: "off" qos: 0 - unique_id: modbus_relais_heizung_8 name: "Modbus Relais Heizung 8" state_topic: "modbus/relais_heizung/get/8" command_topic: "modbus/relais_heizung/set/8" payload_on: "on" payload_off: "off" state_on: "on" state_off: "off" qos: 0 |
Jetzt kann ich die Relais auch in Homeassistant schalten. Dabei muss das Pythonskript dauerhaft laufen, was man bspw. mit einer systemd Service Unit erreicht.
Gleichzeitig Modbus Relais und Stromzähler auslesen
Da ich, wie bereits erwähnt, einen Stromzähler und Relais an einem Modbus hängen habe und immer nur ein Programm auf den Modbus zugreifen kann, muss ich im selben Skript auch den Stromzähler auslesen. Das Skript dazu sieht so aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 |
#!/usr/bin/env python3 import paho.mqtt.client as mqtt import requests import time import minimalmodbus import influxdb modbusrelay_heizung = minimalmodbus.Instrument('/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0', 2, debug = True) modbusrelay_heizung.serial.timeout = 0.1 print(modbusrelay_heizung) influxclient = influxdb.InfluxDBClient(host="serverpi", port=8086, database="energy") relais_freigabe = True def set_relais(relay, state): if state == "on": modbusrelay_heizung.write_bit(int(relay)-1, 1) if state == "off": modbusrelay_heizung.write_bit(int(relay)-1, 0) def get_relais(): binary_relais = modbusrelay_heizung.read_bits(0, 8, 1) print("Relais:" + str(binary_relais)) for i in range(8): if binary_relais[i] == 1: client.publish("modbus/relais_heizung/get/" + str(i+1), "on") else: client.publish("modbus/relais_heizung/get/" + str(i+1), "off") def on_connect(client, userdata, flags, rc): print("Connected with result code "+str(rc)) client.subscribe("modbus/relais_heizung/set/#") def on_message(client, userdata, msg): splitted_topic = msg.topic.split("/") relay = splitted_topic[3] print("Relay " + relay + " " + msg.payload.decode()) ready = False while not(ready): if relais_freigabe: set_relais(relay, msg.payload.decode()) time.sleep(0.1) get_relais() ready = True else: print("Warte 1 sek") time.sleep(1) client = mqtt.Client() client.connect("localhost",1883,60) client.on_connect = on_connect client.on_message = on_message get_relais() client.loop_start() while True: try: time.sleep(0.1) time1 = time.perf_counter() # ------------------ Modbus Heizung ------------------ modbus_instrument = "/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0" name = "heizung" # ------------------ # try: modbuszaehler = minimalmodbus.Instrument('/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0', 1, debug = True) modbuszaehler.serial.timeout = 1.0 print(modbuszaehler) input_register = { "Spannung_L1": { "port": 0, "digits": 2, "Unit": "V", "use": True}, "Spannung_L2": { "port": 2, "digits": 2, "Unit": "V", "use": True}, "Spannung_L3": { "port": 4, "digits": 2, "Unit": "V", "use": True}, "Strom_L1": { "port": 6, "digits": 2, "Unit": "A", "use": True}, "Strom_L2": { "port": 8, "digits": 2, "Unit": "A", "use": True}, "Strom_L3": { "port": 10, "digits": 2, "Unit": "A", "use": True}, "Wirkleistung_L1": { "port": 12, "digits": 2, "Unit": "W", "use": True}, "Wirkleistung_L2": { "port": 14, "digits": 2, "Unit": "W", "use": True}, "Wirkleistung_L3": { "port": 16, "digits": 2, "Unit": "W", "use": True}, "Scheinleistung_L1": { "port": 18, "digits": 2, "Unit": "VA", "use": True}, "Scheinleistung_L2": { "port": 20, "digits": 2, "Unit": "VA", "use": True}, "Scheinleistung_L3": { "port": 22, "digits": 2, "Unit": "VA", "use": True}, "Blindleistung_L1": { "port": 24, "digits": 2, "Unit": "VAr", "use": True}, "Blindleistung_L2": { "port": 26, "digits": 2, "Unit": "VAr", "use": True}, "Blindleistung_L3": { "port": 28, "digits": 2, "Unit": "VAr", "use": True}, "Leistungsfaktor_L1": { "port": 30, "digits": 2, "Unit": "", "use": True}, "Leistungsfaktor_L2": { "port": 32, "digits": 2, "Unit": "", "use": True}, "Leistungsfaktor_L3": { "port": 34, "digits": 2, "Unit": "", "use": True}, "Phasenwinkel_L1": { "port": 36, "digits": 2, "Unit": "Grad", "use": True}, "Phasenwinkel_L2": { "port": 38, "digits": 2, "Unit": "Grad", "use": True}, "Phasenwinkel_L3": { "port": 40, "digits": 2, "Unit": "Grad", "use": True}, "Durchschnittliche_Spannung_zu_N": { "port": 42, "digits": 2, "Unit": "V", "use": True}, "Durchschnittlicher_Strom_zu_N": { "port": 46, "digits": 2, "Unit": "A", "use": True}, "aktueller_Gesamtstrom": { "port": 48, "digits": 2, "Unit": "A", "use": True}, "aktuelle_Gesamtwirkleistung": { "port": 52, "digits": 2, "Unit": "W", "use": True}, "aktuelle_Gesamtscheinleistung": { "port": 56, "digits": 2, "Unit": "VA", "use": True}, "aktuelle_Gesamtblindleistung": { "port": 60, "digits": 2, "Unit": "VAr", "use": True}, "aktueller_Gesamtleistungsfaktor": { "port": 62, "digits": 2, "Unit": "", "use": True}, "aktueller_Gesamtphasenwinkel": { "port": 66, "digits": 2, "Unit": "A", "use": True}, "Frequenz": { "port": 70, "digits": 2, "Unit": "Hz", "use": True}, "Import_Wh_seit_reset": { "port": 72, "digits": 2, "Unit": "kWh", "use": True}, "Export_Wh_seit_reset": { "port": 74, "digits": 2, "Unit": "kWH", "use": True}, "Import_VArh_seit_reset": { "port": 76, "digits": 2, "Unit": "kVArh", "use": True}, "Export_VArh_seit_reset": { "port": 78, "digits": 2, "Unit": "kVArh", "use": True}, "VAh_seit_reset": { "port": 80, "digits": 2, "Unit": "kVAh", "use": True}, "Ah_seit_reset": { "port": 82, "digits": 2, "Unit": "Ah", "use": True}, "Gesamtwirkleistung": { "port": 84, "digits": 2, "Unit": "W", "use": True}, "Max_Gesamtwirkleistung": { "port": 86, "digits": 2, "Unit": "W", "use": True}, "Gesamtscheinleistung": { "port": 100, "digits": 2, "Unit": "VA", "use": True}, "Max_Gesamtscheinleistung": { "port": 102, "digits": 2, "Unit": "VA", "use": True}, "Gesamtstrom_Neutralleiter": { "port": 104, "digits": 2, "Unit": "A", "use": True}, "Max_Strom_Neutralleiter": { "port": 106, "digits": 2, "Unit": "A", "use": True}, "Spannung_L1_L2": { "port": 200, "digits": 2, "Unit": "V", "use": True}, "Spannung_L2_L3": { "port": 202, "digits": 2, "Unit": "V", "use": True}, "Spannung_L3_L1": { "port": 204, "digits": 2, "Unit": "V", "use": True}, "Durchschnittsspannung_L_L": { "port": 206, "digits": 2, "Unit": "V", "use": True}, "Strom_Neutralleiter": { "port": 224, "digits": 2, "Unit": "A", "use": True}, "THD_Spannung_L1": { "port": 234, "digits": 2, "Unit": "%", "use": True}, "THD_Spannung_L2": { "port": 236, "digits": 2, "Unit": "%", "use": True}, "THD_Spannung_L3": { "port": 238, "digits": 2, "Unit": "%", "use": True}, "THD_Strom_L1": { "port": 240, "digits": 2, "Unit": "%", "use": True}, "THD_Strom_L2": { "port": 242, "digits": 2, "Unit": "%", "use": True}, "THD_Strom_L3": { "port": 244, "digits": 2, "Unit": "%", "use": True}, "THD_Durchschnittliche_Spannung_zu_N": { "port": 248, "digits": 2, "Unit": "%", "use": True}, "THD_Durchschnittlicher_Strom_zu_N": { "port": 250, "digits": 2, "Unit": "%", "use": True}, "Strom_L1_demand": { "port": 258, "digits": 2, "Unit": "A", "use": True}, "Strom_L2_demand": { "port": 260, "digits": 2, "Unit": "A", "use": True}, "Strom_L3_demand": { "port": 262, "digits": 2, "Unit": "A", "use": True}, "Max_Strom_L1_demand": { "port": 264, "digits": 2, "Unit": "A", "use": True}, "Max_Strom_L2_demand": { "port": 266, "digits": 2, "Unit": "A", "use": True}, "Max_Strom_L3_demand": { "port": 268, "digits": 2, "Unit": "A", "use": True}, "THD_Spannung_L1_L2": { "port": 334, "digits": 2, "Unit": "%", "use": True}, "THD_Spannung_L2_L3": { "port": 336, "digits": 2, "Unit": "%", "use": True}, "THD_Spannung_L3_L1": { "port": 338, "digits": 2, "Unit": "%", "use": True}, "THD_Durchschnittliche_Spannung_zu_L_L": { "port": 340, "digits": 2, "Unit": "%", "use": True}, "Total_kwh": { "port": 342, "digits": 2, "Unit": "kwh", "use": True}, "Total_kvarh": { "port": 344, "digits": 2, "Unit": "kvarh", "use": True}, "Import_L1_kwh": { "port": 346, "digits": 2, "Unit": "kwh", "use": True}, "Import_L2_kwh": { "port": 348, "digits": 2, "Unit": "kwh", "use": True}, "Import_L3_kwh": { "port": 350, "digits": 2, "Unit": "kwh", "use": True}, "Export_L1_kwh": { "port": 352, "digits": 2, "Unit": "kwh", "use": True}, "Export_L2_kwh": { "port": 354, "digits": 2, "Unit": "kwh", "use": True}, "Export_L3_kwh": { "port": 356, "digits": 2, "Unit": "kwh", "use": True}, "Gesamtstrom_L1_kwh": { "port": 358, "digits": 2, "Unit": "kwh", "use": True}, "Gesamtstrom_L2_kwh": { "port": 360, "digits": 2, "Unit": "kwh", "use": True}, "Gesamtstrom_L3_kwh": { "port": 362, "digits": 2, "Unit": "kwh", "use": True}, "Import_L1_kvarh": { "port": 364, "digits": 2, "Unit": "kvarh", "use": True}, "Import_L2_kvarh": { "port": 366, "digits": 2, "Unit": "kvarh", "use": True}, "Import_L3_kvarh": { "port": 368, "digits": 2, "Unit": "kvarh", "use": True}, "Export_L1_kvarh": { "port": 370, "digits": 2, "Unit": "kvarh", "use": True}, "Export_L2_kvarh": { "port": 372, "digits": 2, "Unit": "kvarh", "use": True}, "Export_L3_kvarh": { "port": 374, "digits": 2, "Unit": "kvarh", "use": True}, "Total_L1_kvarh": { "port": 376, "digits": 2, "Unit": "kvarh", "use": True}, "Total_L2_kvarh": { "port": 378, "digits": 2, "Unit": "kvarh", "use": True}, "Total_L3_kvarh": { "port": 380, "digits": 2, "Unit": "kvarh", "use": True}, } heizung_json_body = [ { "measurement": name, "fields": {} }, ] relais_freigabe = False for key in input_register: if input_register[key]["use"] == True: heizung_json_body[0]["fields"][key] = round(modbuszaehler.read_float(functioncode=4, registeraddress=input_register[key]["port"], number_of_registers=input_register[key]["digits"]), 2) relais_freigabe = True # ------------------ Tasmota Haus ------------------ tasmota_url = "http://tasmota-1ae72e-1838.fritz.box" name = "tasmota_haus" # ------------------ try: r = requests.get(tasmota_url + "/cm?cmnd=status%2010") json = r.json() tasmota_values = {} tasmota_haus_json_body = [ { "measurement": name, "fields": {} }, ] for key in json["StatusSNS"]["MT175"]: try: tasmota_values[key] = float(json["StatusSNS"]["MT175"][key]) except: tasmota_values[key] = str(json["StatusSNS"]["MT175"][key]) tasmota_haus_json_body[0]['fields']['Leistung'] = tasmota_values['Power_curr'] tasmota_haus_json_body[0]['fields']['Import_kWh'] = tasmota_values['Total'] tasmota_haus_json_body[0]['fields']['Export_kWh'] = tasmota_values['Total_out'] #print(tasmota_haus_json_body) except: print("Fehler beim Lesen von Tasmota Haus") # ------------------ Tasmota Heizung ------------------ tasmota_url = "http://tasmota-1ae72e-1838.fritz.box" name = "tasmota_heizung" # ------------------ try: r = requests.get(tasmota_url + "/cm?cmnd=status%2010") json = r.json() tasmota_values = {} tasmota_heizung_json_body = [ { "measurement": name, "fields": {} }, ] for key in json["StatusSNS"]["METER1"]: try: tasmota_values[key] = float(json["StatusSNS"]["METER1"][key]) except: tasmota_values[key] = str(json["StatusSNS"]["METER1"][key]) tasmota_heizung_json_body[0]['fields']['Leistung'] = tasmota_values['Power_curr'] tasmota_heizung_json_body[0]['fields']['Import_kWh'] = tasmota_values['Total'] tasmota_heizung_json_body[0]['fields']['Export_kWh'] = tasmota_values['Total_out'] #print(tasmota_heizung_json_body) except: print("Fehler beim Lesen von Tasmota Haus") # ------------------ Heizungsleistung berechnen ------------------ try: heizung_json_body[0]['fields']['Leistung'] = tasmota_heizung_json_body[0]['fields']['Leistung']-tasmota_haus_json_body[0]['fields']['Leistung'] + heizung_json_body[0]['fields']['aktuelle_Gesamtwirkleistung'] if(tasmota_heizung_json_body[0]['fields']['Leistung']>=0 and tasmota_haus_json_body[0]['fields']['Leistung']>=0): # Voll Netzbetrieb heizung_json_body[0]['fields']['Leistung_Netz'] = heizung_json_body[0]['fields']['Leistung'] heizung_json_body[0]['fields']['Leistung_PV'] = 0.0 elif(tasmota_heizung_json_body[0]['fields']['Leistung']<=0 and tasmota_haus_json_body[0]['fields']['Leistung']<=0): # PV Betrieb heizung_json_body[0]['fields']['Leistung_Netz'] = 0.0 heizung_json_body[0]['fields']['Leistung_PV'] = heizung_json_body[0]['fields']['Leistung'] else: #Mischung heizung_json_body[0]['fields']['Leistung_Netz'] = tasmota_heizung_json_body[0]['fields']['Leistung'] heizung_json_body[0]['fields']['Leistung_PV'] = tasmota_haus_json_body[0]['fields']['Leistung']*-1 # Modbus Leistung dazurechnen heizung_json_body[0]['fields']['Leistung_Modbus'] = heizung_json_body[0]['fields']['aktuelle_Gesamtwirkleistung'] except: print("Fehler beim Berechnen von Heizungsleistung") # ------------------ Zählerstand Heizung berechnen ------------------ heizung_json_body[0]['fields']['Zaehlerstand_Einspeisung'] = tasmota_haus_json_body[0]['fields']['Export_kWh'] - tasmota_heizung_json_body[0]['fields']['Export_kWh'] heizung_json_body[0]['fields']['Zaehlerstand_Bezug'] = tasmota_heizung_json_body[0]['fields']['Import_kWh'] - tasmota_haus_json_body[0]['fields']['Import_kWh'] heizung_json_body[0]['fields']['Zaehlerstand_PV'] = heizung_json_body[0]["fields"]['Total_kwh'] print(heizung_json_body) influxclient.write_points(heizung_json_body) # except: # print("Fehler beim Lesen von Modbuszähler Heizung") time2 = time.perf_counter() timedifference = time2-time1 if timedifference < 60: time.sleep(60-timedifference) except: print("Fehler beim Auslesen vom Modbuszähler") time.sleep(60) |
Hinzu kommt hier die Verbindung zur Influx Datenbank (Z. 12) und das eigentliche Auslesen des Stromzählers ab Z. 57. Es werden auch noch andere Stromzähler, die über Tasmota angebunden sind, ausgelesen, um einige Werte zu berechnen. Wichtig hier ist auch die Variable relais_freigabe
, die dafür sorgt, dass wenn gerade der Stromzähler ausgelesen wird, mit dem Setzen des Relais noch kurz gewartet wird, da dies nicht gleichzeitig passieren kann.
Bildquelle: waveshare.com, wikipedia.org