Hallo an alle,
nachdem ich nun eine Weile hier mitgelesen habe, habe ich mich an die Einbindung zweier MODBUS-Zähler gewagt.
Das Studium dieses Blogs ist mittlerweile zu einer Herausforderung geworden, es werden hier die verschiedensten Zählertypen diskutiert und der Treiber entwickelt sich auch immer noch stürmisch weiter. So hat es bei mir eine Weile gedauert erfolgreich zu sein. Falls also jemand das Gleiche mal vorhat, hier ein paar Anregungen/ Hilfestellungen, speziell auf MODBUS bezogen. MODBUS, in diesem Falle als RTU unidirektional (also einfache Zweidrahtleitung) ist übrigens ein verbreiteter Standart für die Gerätekommunikation in der Steuer- und Regelungstechnik. Mit dem SML-Treiber bekommt TASMOTA einen einfachen Zugang dazu.
Alle Links auf Produkte verstehen sich sebstverständlich nur als Beispiele, ich bin da nirgends dran beteiligt..
Ich habe zwei Saia PCD ALE3D5F D10C3A07 Zähler, davon gibt es übrigens derzeit eine Menge bei eBay. Aufpassen, die haben verschiedenen Busse, MBus ist übrigens nicht gleich MODBUS. Die beiden kommen bei mir hinter die beiden Zähler vom Versorger, die Preise machen es möglich. In meinem Falle sind es keine Zweirichtungszähler.
Um von der Seriellen auf den MODBUS des Zählers zu kommen braucht man einen RS232<>RS485 Wandler. Auch hier aufpassen: ein reiner TTL-Wandler wie dieser hier funktioniert erstmal nicht in beide Richtungen. Dazu kam bei mir ein ESP01 als kleinster Vertreter der ESP828x Gattung. Für zwei Zähler, mit allen Spannungen, Strömen usw. reicht der Scriptspeicher nicht aus. Mit einem Zähler klappt es gerade so, beschränkt man sich auf wenige Messwerte (kWh, Leistung) geht es auch mit zweien. So braucht man in diesem Falle also noch einen I2C EEPROM. Neben Tx und Rx benötigt man so noch zwei freie GPIO's und das bekommt man am ESP01 geboten.
Mit dem gegebenen Script bleiben dann noch ca. 1330 Zeichen frei, genug für noch ein paar Berechnungen.
Der RS232<>485 Wandler kommt bei mir an den Hardware TX/RX des ESP01, hierbei die Leitungen nicht kreuzen (jedenfalls für diesen Adapter). Tx an Tx und Rx an Rx. Das wird nicht im Gerätekonfigmenue eingetragen! Den I2C-Speicher habe ich mit je einem 3,3k Pull Up an GPIO0 (SCL) und GPIO2 (SDA) angeschlossen, dieser wird eingetragen (siehe Bild unten). Beide GPIO's müssen beim Start auf High liegen, auch deswegen die Pull Up's. Klappt vorzüglich, der ESP bootet anstandslos.
Das Ganze ist auf einer Uni-Platine verlötet und auf einen (SONOFF)-Hutschienenadapter montiert. Siehe Bild unten. Ein Elko in der Nähe des ESP01 sorgt für stabile Spannungsverhältnisse.
Die Saia-Zähler haben die MODBUS-Anschlüsse D und /D, der D ist dem B- und der /D dem A+ gleichzusetzen. Nicht vergessen: ein Modbus muss an den Enden mit jeweils 120Ohm abgeschlossen werden (siehe im Bild die Widerstände an den Zählern). Zum MODBUS wird man hier fündig.
Für die Inbetriebnahme und Fehlersuche kann man übrigens gut den RS232 Wandler (siehe oben) zusammen mit dem USB-Programmieradapter verwenden, um mittels eines Terminalprogrammes (was HEX darstellen kann, wie z.B. CoolTerm auf dem Mac) sehr schön zu sehen, was passiert. Es gibt natürlich auch gleich fertige Adapter (hier auf Basis C340), die letztendlich nix anderes sind.
Man kann auch mit QModMaster (das ist nun leider mal für Windows
) per Auswahl Register beschreiben und lesen. Das war für mich alles ganz hilfreich um herauszufinden das die Saia's 8E1 als serielles Hardwareprotokoll nutzen.
Man braucht das hier also nur, wenn man in TASMOTA nach Eingabe von sensor53 d1 nichts zu sehen bekommt.
TASMOTA muss für diesen Einsatzfall bekannterweise selbst kompiliert werden. Dazu sind einige Compilerschalter zwingend notwendig. Wie das alles grundsätzlich geht findet man wirklich oft genug hier in den Foren beschrieben. Die folgenden, notwendigen Schalter packt man am besten in die user_config_override:
#undef USE_RULES // Add support for rules (+8k code)
#define USE_SCRIPT // Add support for script (+17k code)
#define USE_SCRIPT_WEB_DISPLAY
#define USE_24C256 //EEPROM zur Scriptspeichererweiterung, kann übrigens auch ohne drin bleiben
#ifndef USE_SML_M
#define USE_SML_M
#endif
#define SML_MAX_VARS 50
#define METER_DEF_SIZE 3000
Die beiden letzten Parameter sind brandneu, von heute, und werden erst benötigt, wenn es zwei Zähler mit der Folge dieser Anzahl an Decoderzeilen (38) werden. SML_MAX_VARS hieß früher MAX_VARS (nicht zu verwechseln mit MAXVARS aus dem Script selbst). METER_DEF_SIZE (Standart = 2000) ist nun auch über die user_config_override erreichbar, ab ca. 27 Decodern erhöht man das. Sollten diese Parameter zu klein sein, merkt man dass daran, das auf dem WEB-Interface OBIS angezeigt wird, der Trigger >M im Scripter also nicht startet
Bei mir laufen die Zähler auf den MODBUS-Adressen 01 und 03 (wie gleich im Script zu sehen sein wird). Man muss beachten, das der ganze Modbus aus Sicht TASMOTA's als ein Zähler gilt, die beiden Saia's werden über ihre MODBUS-Geräteadressen unterschieden. Also >M 1.
Was mich auch noch Zeit gekostet hat: Bei der Definition des MODBUS-Zählers selbst ist "m" und "M" ein Klein was Anderes: 8N1 oder 8E1 als serielles Hardwareprotokoll. Steht nun auch in der Doku.
Für das Script habe ich auf die Vorarbeit von sunburst hier aus dem Blog zurückgegriffen, bei dem ich mich herzlich bedanke.
Und auch an dieser Stelle nochmal Danke an den Theo Arends, der dieses herrliche Tasmota erfunden hat und an GEMU, der mit seinem Script und nun mit diesem SML-Treiber (und noch anderen Dingen) ganz tolle Erweiterungen geschaffen hat und diese in bemerkenswerter Geschwindigkeit weiterentwickelt. Ich kann Script wirklich nur jedem ans Herz legen.
So nun das Script (es sind übrigens nicht alle möglichen Werte des Zählers enthalten):
>D
>B
=>sensor53 r
>M 1
+1,3,M,1,9600,Meter,1,1,01030023,01030028,0103002d,01030025,0103002a,0103002f,01030032,01030027,0103002c,01030031,0103001B,0103001d,03030023,03030028,0303002d,03030025,0303002a,0303002f,03030032,03030027,0303002c,03030031,0303001B,0303001d
1,=h Domestic Electricity:
1,010304UUuuUUuuxxxx@i10:100,1 Tariff 1 total,kWh,M1_T1_total,2
1,010304UUuuUUuuxxxx@i11:100,1 Tariff 1 partial,kWh,M1_T1_par,2
1,=h Readings:
1,010304UUuuxxxxxxxx@i0:1,1 Voltage L1,V,M1_Voltage_L1,0
1,010304UUuuxxxxxxxx@i1:1,1 Voltage L2,V,M1_Voltage_L2,0
1,010304UUuuxxxxxxxx@i2:1,1 Voltage L3,V,M1_Voltage_L3,0
1,010304xxxxUUuuxxxx@i0:10,1 Current L1,A,M1_Current_L1,2
1,010304xxxxUUuuxxxx@i1:10,1 Current L2,A,M1_Current_L2,2
1,010304xxxxUUuuxxxx@i2:10,1 Current L3,A,M1_Current_L3,2
1,010304UUuuxxxxxxxx@i3:100,1 Active Power L1,kW,M1_PRMS_L1,3
1,010304UUuuxxxxxxxx@i4:100,1 Active Power L2,kW,M1_PRMS_L2,3
1,010304UUuuxxxxxxxx@i5:100,1 Active Power L3,kW,M1_PRMS_L3,3
1,010304UUuuxxxxxxxx@i6:100,1 Active Power total,kW,M1_PRMS_total,3
1,010304xxxxSSssxxxx@i3:100,1 Reactive Power L1,kVAr,M1_QRMS_L1,3
1,010304xxxxSSssxxxx@i4:100,1 Reactive Power L2,kVAr,M1_QRMS_L2,3
1,010304xxxxSSssxxxx@i5:100,1 Reactive Power L3,kVAr,M1_QRMS_L3,3
1,010304xxxxSSssxxxx@i6:100,1 Reactive Power total,kVAr,M1_QRMS_total,3
1,010304UUuuxxxxxxxx@i7:100,1 CosPhi L1,,M1_CosPhi_L1,2
1,010304UUuuxxxxxxxx@i8:100,1 CosPhi L2,,M1_CosPhi_L2,2
1,010304UUuuxxxxxxxx@i9:100,1 CosPhi L3,,M1_CosPhi_L3,2
1,=h________________________________________________
; meter 2 +12 offset
1,=h Heat Pump
1,030304UUuuUUuuxxxx@i22:100,2 Tariff 1 total,kWh,M2_T1_total,2
1,030304UUuuUUuuxxxx@i23:100,2 Tariff 1 partial,kWh,M2_T1_par,2
1,=h Readings:
1,030304UUuuxxxxxxxx@i12:1,2 Voltage L1,V,M2_Voltage_L1,0
1,030304UUuuxxxxxxxx@i13:1,2 Voltage L2,V,M2_Voltage_L2,0
1,030304UUuuxxxxxxxx@i14:1,2 Voltage L3,V,M2_Voltage_L3,0
1,030304xxxxUUuuxxxx@i12:10,2 Current L1,A,M2_Current_L1,2
1,030304xxxxUUuuxxxx@i13:10,2 Current L2,A,M2_Current_L2,2
1,030304xxxxUUuuxxxx@i14:10,2 Current L3,A,M2_Current_L3,2
1,030304UUuuxxxxxxxx@i15:100,2 Active Power L1,kW,M2_PRMS_L1,3
1,030304UUuuxxxxxxxx@i16:100,2 Active Power L2,kW,M2_PRMS_L2,3
1,030304UUuuxxxxxxxx@i17:100,2 Active Power L3,kW,M2_PRMS_L3,3
1,030304UUuuxxxxxxxx@i18:100,2 Active Power total,kW,M2_PRMS_total,3
1,030304xxxxSSssxxxx@i15:100,2 Reactive Power L1,kVAr,M2_QRMS_L1,3
1,030304xxxxSSssxxxx@i16:100,2 Reactive Power L2,kVAr,M2_QRMS_L2,3
1,030304xxxxSSssxxxx@i16:100,2 Reactive Power L3,kVAr,M2_QRMS_L3,3
1,030304xxxxSSssxxxx@i18:100,2 Reactive Power total,kVAr,M2_QRMS_total,3
1,030304UUuuxxxxxxxx@i19:100,2 CosPhi L1,,M2_CosPhi_L1,2
1,030304UUuuxxxxxxxx@i20:100,2 CosPhi L2,,M2_CosPhi_L2,2
1,030304UUuuxxxxxxxx@i21:100,2 CosPhi L3,,M2_CosPhi_L3,2
#
Was dabei rauskommt sieht man im angehängten Bild.
Hoffe es hilft dem Einen oder Anderen.
Viele Grüße
Ekkehard.