Frage zu den Trovis Registern
Closed this issue · 5 comments
Hi Jens,
ich bin über das MikroController Forum (https://www.mikrocontroller.net/topic/346223) auf deine umfangreiche Zusammenfassung aufmerksam geworden.
Ich hab das ganze Setup mit dem ESP auch an meiner Trovis am laufen und es funktioniert so weit mit den Beispielen perfekt. Ich möchte jetzt aber noch mehr Register auslesen (und später auch Coils schreiben), blicke aber bei der Meter Metrics
Definition im SMI Script von Tasmota nicht ganz durch. Vielleicht kannst du mir da ein wenig Licht ins Dunkel bringen, da das Tasmota Wiki mir hier unvollständig erscheint. Das hier ist daher weniger ein Issue, könnte aber vielleicht auch anderen helfen und evtl. in der Doku irgendwie erwähnt werden.
Aus deinem Beispiel:
+2,4,m,0,19200,SekHK,2,5,rF7030009000E,rF703001C0004,F703006A
2,F7031CSSss@i0:10,Außentemp.,°C,Temp_Outside,1
2,F7031Cx06SSss@i0:10,Vorlauftemp.,°C,Temp_Flow,1
2,F7031Cx14SSss@i0:10,Rücklauftemp.,°C,Temp_Return,1
2,F7031Cx26SSss@i0:10,Speichertemp.,°C,Temp_Vessel,1
2,F70308xxxxUUuu@i1:0.1,Messwertm3-h,l/h,Metric_M3H,0
2,F70304UUuu@i2:1,StellsignalRk1,%,CtrlSig_RK1,0
Dazu folgende Fragen:
-
Warum
rF7030009000E
in i0? Wenn ich mir das Register für die Außentemperatur unter https://raw.githubusercontent.com/Tom-Bom-badil/samson_trovis_557x/master/_register.py ansehe, dann ist doch die Außentemperatur nur auf ID 09 und 10, also nur 2 Register.
Das Tasmota Wiki unter https://tasmota.github.io/docs/Smart-Meter-Interface/#meter-definition schreibt dazu
0000/0002 = Register # (as Hexadecimal codification, without the prefix 0x. Example: 0x0079 -> 0079)
the number of requested registers is fixed to 2, however with the char 'r' before the hex string the complete request string may be specified
Müsste dann nicht einfachF7030009
reichen (wenn man nur die Außentemperatur betrachtet)? -
Woher kommt die
000E
inrF7030009000E
oder die0004
inrF703001C0004
? Probieren? -
Bei den Metrics sind für mich manche Zahlen auch "magic". Woher kommt die
1C
in2,F7031CSSss@i0:10,Außentemp.,°C,Temp_Outside,1
? Hier ist die Doku von Tasmota leider echt dünn für den decoder bei ModBUS.
EBus, MODBus, RAW - hex values of data blocks to compare:
- xx = ignore value (1 byte) or xN = ignore N bytes
- ss = extract a signed byte
- uu = extract an unsigned byte
- UUuu = extract an unsigned word (high order byte first)
- uuUU = extract an unsigned word (low order byte first)
- UUuuUUuu = extract an unsigned long word (high order byte first)
- uuUUuuUU = extract an unsigned long word (low order byte first)
- SSss = extract a signed word (high order byte first)
- ssSS = extract a signed word (low order byte first)
- SSssSSss = extract a signed long word (high order byte first)
- ssSSssSS = extract a signed long word (low order byte first)
Die F7
leite ich mal aus der Station/Unit ID ab. Finde das zwar irgendwie doppelt, weil bei der Meter Definition schon erwähnt, aber ok. Die 03
bezieht sich wahrscheinlich auch nochmal auf die Instruction to read a Holding Register. Aber was bedeutet die 1C
?
Letztendlich möchte ich aber nochmal ein großes Danke sagen, für deine Pionierarbeit!
Das Lesen der Holging Register geht so, wobei der CRC durch den SMI-Code hinzugefügt wird.
In meinem Beispiel werden insgesamt drei ModBus-Anfragen gestellt.
Die Erste liest (mit einem Aufruf) 15 (0x0E) Register (also 0x09 bis 0x16) in i0. Aus der ModBus-Antwort werden dann lediglich vier Register ausgewertet.
Die Zweite liest (aus historischen Gründen, nun aber unnötigerweise) vier Register (0x1C-0x1F) in i1. Aus der ModBus-Antwort wird dann lediglich ein Register ausgewertet.
Die Dritte Abfrage fragt schließlich Register 0x6A und 0x6B ab (man beachte das fehlende "r" am Anfang). Aus der ModBus-Antwort wird dann lediglich das erste Register ausgewertet.
Ich habe das Trovis-Skript mal bzgl. der aktuell abgefragten Register optimiert.
Das Lesen von Coils funktioniert ähnlich. Am besten mit sensor53 d1
auf der Konsole schauen, was versendet und empfangen wird. Dann mit sensor53 d0
ausschalten und schauen, ob dein Skript wie erwartet funktioniert.
Danke für die schnelle Antwort, aber eine Sache frage ich mich dann noch.
Wenn rF7030009000E
die ModBus Anfrage i0
ist, wie kommt man dann auf auf das 1C
in der Auswertung des Ergebnisses bei F7031CSSss@i0
?
Jede ModBus-Antwort startet mit <ClientID><Length>... und wenn 0x0E Register angefordert wurden und jeder Register zwei Byte breit ist, dann beträgt die Länge 2*0x0E = 0x1C. Einfach meinem Link "Lesen der/von ..." folgen, da ist der Aufbau von Request und Response erklärt.
Danke, jetzt hab ich es geschnallt mit dem Auslesen. Einziger Wermutstropfen aktuell ist, dass mit SMI nur auslesen geht und zum Schreiben man manuell die GPIO Belegung ändern muss. Ich hab das ganze mal versucht nur von HomeAssistant via Modbus abzufragen, aber irgendwie hab ich das Gefühl, dass ich nur auf jede 10te Anfrage auch eine Antwort bekomme. Gleiches kann ich mit ModBusSend
über Tasmota direkt auch nachvollziehen.
Eigentliches Ziel war es, den Automatik Modus zu ändern auf Sonne bzw. Mond anhand von Regeln in HomeAssistant, aber das läuft nicht zuverlässig genug so.
Nachdem ich jetzt auch die Uhrzeit via SMI auslesen kann, fällt mir aber gerade auf, dass sich auch diese Werte nicht sofort aktualisieren.
Egal, meine ursprünglichen Fragen sind jetzt geklärt. Vielleicht sind meine anderen Probleme auch auf Hardwareprobleme zurückzuführen.
Danke dir nochmals!
Also mit der SL ist sicherlich auch ein Button im WebUI möglich, den man dann auch per MQTT (also Home Assistant) steuern kann und der den Modbus-Schreibbefehl sendet und den Heizungsmodus steuert. Da kenne ich mich nicht aus, aber du könntest ein Issue in gemus Repo versuchen. Am Ende läuft das noch parallel zu meinem Skript... das hätte sicher ein paar Anhänger.
Deine Kommunikationsprobleme kannst du vielleicht beheben, wenn du 5573-TX mit ESP-RX direkt verbindest statt das Signal durch ein evtl. eingesetztes Developmentboard zu leiten - hat bei mir bei einigen Developmentboards geholfen.