NEWS
Hilfe:Daten von Serieller Schnittstelle+Tasmota zu ioBroker
-
Ich habe einen Kaminofen der eine Serielle Schnittstelle (RS232) besitzt über die man einigen Daten auslesen kann.
Also wollte ich mal versuchen die Daten mit einem Wemos D1 mini und einem RS232 zu TTL Serielle Port abzugreifen.In den Unterlagen des Kaminofen habe ich folgende Angaben gefunden:
Protokoll: STX DC1 64 ASCII Zeichen ETX
(RS232, 9600, 8, n, 1)Auf den Wemos habe ich die Tasmota DE.bin geflasht
In Tasmota habe ich dann folgende Befehle in der Konsole eingegeben um die SerialBridge zu konfigurieren:
Baudrate 9600
SerialConfig 8N1
SerialDelimiter 128Anschließend habe ich den Wemos D1 über den Port mit der Schnittstelle am Ofen Verbunden und SerialSend5 eingegeben um die Übertragung zu starten. So weit hat alles ganz gut funktioniert und ich erhalte auch fleißig Daten auf der Tasmota Konsole.
Sieht etwa so aus:14:26:04.229 RSL: RESULT = {"SerialReceived":"02114D4158494D414C54454D502E204445532041424252414E4453202020333631DF2020202020202020202020202020202020203138DF202020202020202030252003"} 14:26:04.729 RSL: RESULT = {"SerialReceived":"02114D4158494D414C54454D502E204445532041424252414E4453202020333631DF2020202020202020202020202020202020203138DF202020202020202030252003"} 14:26:05.279 RSL: RESULT = {"SerialReceived":"02114D4158494D414C54454D502E204445532041424252414E4453202020333631DF2020202020202020202020202020202020203138DF202020202020202030252003"} 14:26:05.881 RSL: RESULT = {"SerialReceived":"02114D4158494D414C54454D502E204445532041424252414E4453202020333631DF2020202020202020202020202020202020203138DF202020202020202030252003"} 14:26:06.506 RSL: RESULT = {"SerialReceived":"02114D4158494D414C54454D502E204445532041424252414E4453202020333631DF2020202020202020202020202020202020203138DF202020202020202030252003"} 14:26:06.932 RSL: RESULT = {"SerialReceived":"02114D4158494D414C54454D502E204445532041424252414E4453202020333631DF2020202020202020202020202020202020203138DF202020202020202030252003"} 14:26:07.486 RSL: RESULT = {"SerialReceived":"02114D4158494D414C54454D502E204445532041424252414E4453202020333631DF2020202020202020202020202020202020203138DF202020202020202030252003"} 14:26:08.082 RSL: RESULT = {"SerialReceived":"021141424252414E44204245454E444554202020205A554C554654205A55202020202020202020202020202020202020202020203138DF202020202020202030252003"} 14:26:08.585 RSL: RESULT = {"SerialReceived":"021141424252414E44204245454E444554202020205A554C554654205A55202020202020202020202020202020202020202020203138DF202020202020202030252003"} 14:26:09.136 RSL: RESULT = {"SerialReceived":"021141424252414E44204245454E444554202020205A554C554654205A55202020202020202020202020202020202020202020203138DF202020202020202030252003"}
Ich habe die Ergebnisse auch schon mal online von HEX in Text umwandeln lassen und das sieht dann etwa so aus:
MAXIMALTEMP. DES ABBRANDS 361� 18� 0%
ABBRAND BEENDET ZULUFT ZU 18� 0%
HEIZTUERE NUR Z.FUELLEN OEFFNEN 19� 0%
ABBRAND BEENDET ZULUFT ZU 19� 0%Ich habe aber noch keinen Plan wie ich die Daten jetzt am Besten von der Tasmota Konsole von HEX in Text oder Datenpunkte umwandeln kann und wie ich die Daten in den IoBroker kriege. Bin mir auch nicht sicher ob ich in Tasmota alles richtig eingestellt habe oder ob man was anders einstellen sollte.
Wäre sehr dankbar wenn mir jemand helfen könnte. -
@fritzke316 Vielleicht hilft dies hier ...
-
@martinp Danke für den Tip, werde ich mir mal anschaun
-
sollte wie im Beitrag vorher mit Tasmota Scripting gehen.
Andere Möglichkeit wäre mit NodeRed den Datenpunkt von
hex to string zu konvertieren.per Mqtt Adapter bekommst du die hex Daten nach IoBroker.
NodeRed müsste so sein :
msg.payload = Buffer.from(msg.payload, 'hex').toString(); return msg;
hex in string
-
@ralla66 Super vielen Dank für die ganzen Infos, ich denke ich werde es dann mal mit Tasmota Scripting versuchen.
-
dann poste deine Scripte hier, eventuell kann ich dann helfen.
Stell mal Heiztüre noch ein SerialReceived":"0211...........................02 11 4D 41 ist Temp Max
02 11 41 42 ist Abbrand zuByte 1 - 2 Sync
Byte 3 - 27 Text
Byte 28 - 30 auf / zu
Byte 52 - 54 Wert 18
Byte 62 - 64 Wert
Byte 65 ist %
Byte 66 - 67 EOF -
@ralla66 vielen Dank nochmal, ich werde auf alle Fälle hier weiter posten, da ich vom Programmieren keine Ahnung habe und mich erst mal etwas in das Tasmota Scripting einlesen muss. Wie ich gesehen habe muss ich mir erst mal eine eigene .bin mit der script Funktion compilieren. Ich muss mal schaun wann ich wieder Zeit finde, aber dann komme ich sicherlich gerne auf dein Angebot mit der Hilfe bei den Scripten zurück
-
wie besprochen, teste mal das durchleiten, das script erstellt einen Datenpunkt
im Mqtt Adapter unter Ofen / Gesamt.das script aktivieren und neu booten:
>D 128 res=0 RAL="" >B so(3 1 9600 8N1 1024) >BS +>subscribe EA, cmnd/Ofen/Gesamt >S if upsecs%10==0 then =>serialsend Routine läuft alle 10 sec print ---- SEND nach hterm ---- res=sa() print RES ist : %0res% ;hex 20 sind 32 Byte ;hex 43 sind 67 Ofen Byte RAL=sr(43) print Text ist : %RAL% +>publish Ofen/Gesamt %RAL% #
Blockly Test :
-
@ralla66
Super werde ich morgen mal testen
MIt dem script erstelle ich also den Datenpunkt im IoBroker wo dan die Daten aus der Seriellen Schnittstelle reingeschrieben werden.
Werden die dort dann in hex oder string angezeigt? -
ja genau, kommt als String im Datenpunkt an, brauchste dann nur zerlegen.
Ist einfacher im Blockly den Text zu zerlegen, bleibe am Scripting dran da ich
dieses auch gebrauchen kannUnter Generic ist alles None da ja die Schnittstelle im Script mit
B
so(3 1 9600 8N1 1024)aktiviert wird
script verbessert :
>D 128 res=0 RAL="" >B so(3 1 9600 8N1 1024) >BS +>subscribe EA, cmnd/Ofen/Gesamt >S if upsecs%10==0 then =>serialsend Routine läuft alle 10 sec print ---- SEND nach hterm ---- res=sa() print RES ist : %0res% ;hex 20 sind 32 Byte ;hex 43 sind 67 Ofen Byte if res>0 then RAL=sr(43) print Text ist : %RAL% +>publish Ofen/Gesamt %RAL% endif #
Beispiel Blockly:
Nachtrag, meine selbst kompilierte .bin enthält :
#define USE_WEBSEND_RESPONSE
#define USE_SCRIPT_STATUS
#define USE_SCRIPT_FULL_JSON_PARSER
#define USE_SCRIPT_JSON_EXPORT
#define SUPPORT_MQTT_EVENT
#define USE_SML_M
#define USE_SCRIPT_WEB_DISPLAY
#define USE_SCRIPT_SERIAL
#define USE_DISPLAY
#define SCRIPT_MAXSSIZE 128 -
@ralla66
Ich habe bis jetzt immer den Sonoff Adapter verwendet, sollte es damit auch funktionieren?
Kann ich was anpassen, dass es auch mit dem Sonoff funktioniert? -
ist mir nicht bekannt ob das per Sonoff Adapter geht.
-
@ralla66
Ich denke schon dass es auch mit dem Sonoff Adapter irgendwie funktionieren sollte, weiß aber nicht wie :))Habe mal versucht die Variable %RAL% unter >J einzugeben, dann wird mir folgende Fehlermeldung angezeigt:
2024-01-31 14:17:06.144 warn Cannot parse data "SENSOR": _{"Time":"2024-01-31T14:17:05""gesamt": 18� 0% DAUER DES ABBRANDS 30' 18� 0% DAUER DES ABBRANDS 30' }_ - SyntaxError: Unexpected string in JSON at position 29
Das Script scheint zu funktionieren, vielen Dank nochmal.
Dann werde ich mal den MQTT Adapter Testen. -
zeige mal das Bild vom Blockly
-
@ralla66
Ich habe noch kein Blockly da ich erst mal versucht habe ob ich die Daten vom Script auch in den Sonoff Adapter kriege
Was aber nicht funktioniert hat, also werde ich erstmal den MQTT Adapter installieren müssen.Aber noch eine Andere Frage ist das so richtig, dass in der Tasmota Konsole bei Text ist: der Text 2x hintereinander und etwas durcheinander aufgelistet ist sollte doch in etwa so aussehen: ABBRAND BEENDET ZULUFT ZU 18� 0%
in der Konsole siehts bei mir so aus
15:10:15.418 MQT: stat/tasmota_10A5EF/RESULT = {"SerialSend":"Done"} 15:10:15.421 ---- SEND nach hterm ---- 15:10:15.424 RES ist : 1023 15:10:15.427 Text ist : 18� 0ABBRAND BEENDET ZULUFT ZU 18� 0ABBRAND BEENDET ZULUFT ZU 15:10:15.436 MQT: Ofen/Gesamt = 18� 0ABBRAND BEENDET ZULUFT ZU 18� 0ABBRAND BEENDET ZULUFT ZU 15:10:25.411 SCR: performs "serialsend Routine läuft alle 10 sec" 15:10:25.418 MQT: stat/tasmota_10A5EF/RESULT = {"SerialSend":"Done"} 15:10:25.421 ---- SEND nach hterm ---- 15:10:25.423 RES ist : 1029 15:10:25.427 Text ist : 18� 0HEIZTUERE NUR Z.FUELLEN OEFFNEN 18� 0HEIZTUERE NUR Z.FUELLEN OEFFNEN 15:10:25.433 MQT: Ofen/Gesamt = 18� 0HEIZTUERE NUR Z.FUELLEN OEFFNEN 18� 0HEIZTUERE NUR Z.FUELLEN OEFFNEN 15:10:35.412 SCR: performs "serialsend Routine läuft alle 10 sec" 15:10:35.418 MQT: stat/tasmota_10A5EF/RESULT = {"SerialSend":"Done"} 15:10:35.421 ---- SEND nach hterm ---- 15:10:35.424 RES ist : 1038 15:10:35.427 Text ist : 18� 0HEIZTUERE NUR Z.FUELLEN OEFFNEN 18� 0HEIZTUERE NUR Z.FUELLEN O 15:10:35.434 MQT: Ofen/Gesamt = 18� 0HEIZTUERE NUR Z.FUELLEN OEFFNEN 18� 0HEIZTUERE NUR Z.FUELLEN O 15:10:45.412 SCR: performs "serialsend Routine läuft alle 10 sec" 15:10:45.419 MQT: stat/tasmota_10A5EF/RESULT = {"SerialSend":"Done"} 15:10:45.422 ---- SEND nach hterm ---- 15:10:45.424 RES ist : 1028 15:10:45.428 Text ist : 18� 0DAUER DES ABBRANDS 30' 18� 0DAUER DES ABBRANDS 30' 15:10:45.436 MQT: Ofen/Gesamt = 18� 0DAUER DES ABBRANDS 30' 18� 0DAUER DES ABBRANDS 30' 15:10:55.411 SCR: performs "serialsend Routine läuft alle 10 sec" 15:10:55.418 MQT: stat/tasmota_10A5EF/RESULT = {"SerialSend":"Done"} 15:10:55.421 ---- SEND nach hterm ---- 15:10:55.424 RES ist : 1034 15:10:55.427 Text ist : 18� 0 NACHLEGEZEIT BEACHTEN 18� 0 NACHLEGEZEIT BEACHTEN 15:10:55.432 MQT: Ofen/Gesamt = 18� 0 NACHLEGEZEIT BEACHTEN 18� 0 NACHLEGEZEIT BEACHTEN 15:11:05.412 SCR: performs "serialsend Routine läuft alle 10 sec" 15:11:05.418 MQT: stat/tasmota_10A5EF/RESULT = {"SerialSend":"Done"} 15:11:05.421 ---- SEND nach hterm ---- 15:11:05.424 RES ist : 1027 15:11:05.427 Text ist : 18� 0 NACHLEGEZEIT BEACHTEN 18� 0 NACHLEGEZEIT BEACHTEN 15:11:05.434 MQT: Ofen/Gesamt = 18� 0 NACHLEGEZEIT BEACHTEN 18� 0 NACHLEGEZEIT BEACHTEN
-
nein ist nicht richtig, RES ist die Anzahl der Empfangenen Bytes bei dir um 1038.
Sollte aber max RAL=sr(43) also 67 Byte lang sein.
Copy Fehler im script ?
Das wird wohl daran liegen das die Daten bei dir hintereinander ankommen.
Kann ich ja bei mir nicht testen mit hterm.
Mache mir mal Gedanken dazu. -
@ralla66
Also soweit ich sehen kann sieht das script genau so aus wie bei dir auch RAL=sr(43) ist vorhanden.
Ja bei mir siehts so aus als ob die Daten alle hintereinandergereiht ankommen. -
so auf die schnelle, müßte gehen wenn die Variablen gecleant werden.
+>publish Ofen/Gesamt %RAL%
res=0
RAL=""
endif -
Habe res=0 und RAL="" am Ende vor endif eingetragen aber leider immer noch das selbe Ergebniss:
16:40:45.416 Text ist : HEIZTUERE NUR Z.FUELLEN OEFFNEN 18� 0HEIZTUERE NUR Z.FUELLEN OEFFNEN 18� 16:40:45.423 MQT: Ofen/Gesamt = HEIZTUERE NUR Z.FUELLEN OEFFNEN 18� 0HEIZTUERE NUR Z.FUELLEN OEFFNEN 18� 16:40:55.412 SCR: performs "serialsend Routine läuft alle 10 sec" 16:40:55.418 MQT: stat/tasmota_10A5EF/RESULT = {"SerialSend":"Done"} 16:40:55.419 ---- SEND nach hterm ---- 16:40:55.422 RES ist : 1033 16:40:55.425 Text ist : 18� 0DAUER DES ABBRANDS 30' 18� 0DAUER DES ABBRANDS 3 16:40:55.430 MQT: Ofen/Gesamt = 18� 0DAUER DES ABBRANDS 30' 18� 0DAUER DES ABBRANDS 3 16:41:05.412 SCR: performs "serialsend Routine läuft alle 10 sec" 16:41:05.417 MQT: stat/tasmota_10A5EF/RESULT = {"SerialSend":"Done"} 16:41:05.419 ---- SEND nach hterm ---- 16:41:05.422 RES ist : 1023 16:41:05.425 Text ist : 18� 0DAUER DES ABBRANDS 30' 18� 0DAUER DES ABBRANDS 30' 16:41:05.432 MQT: Ofen/Gesamt = 18� 0DAUER DES ABBRANDS 30' 18� 0DAUER DES ABBRANDS 30' 16:41:15.411 SCR: performs "serialsend Routine läuft alle 10 sec" 16:41:15.417 MQT: stat/tasmota_10A5EF/RESULT = {"SerialSend":"Done"} 16:41:15.419 ---- SEND nach hterm ---- 16:41:15.422 RES ist : 1029 16:41:15.426 Text ist : 18� 0 NACHLEGEZEIT BEACHTEN 18� 0 NACHLEGEZEIT BEACHTEN 16:41:15.431 MQT: Ofen/Gesamt = 18� 0 NACHLEGEZEIT BEACHTEN 18� 0 NACHLEGEZEIT BEACHTEN
-
das muß ich erst in hterm nachbilden und testen.
Getrennt werden muß ja zwischen 0 und Text dann 67 Byte lang.
Also ab 0211 bei SerialReceived