Seite 1 von 2

Wetterstation mit seriellem Interface RS232

Verfasst: 20. Feb 2022 08:10
von Norick
Hallo
ich habe eine Elsner Wetterstation die über RS485 folgende Daten (siehe Anhang) schickt:

Code: Alles auswählen

W+04.8030101N99900.2N?151515151515?1882
Das ganze läuft via einem RS232-Konverter (COM-Port 3) was soweit auch funktioniert. Installiert habe ich das "serial binding" in openhab3 (windows).


Nun meine Fragen:
- wie kann ich nun den Datenstream zerpflücken sodass ich dann dem Format entsprechend die Temperatur, Wind etc. anzeigen kann auf dem GUI?
- Muss dies im yaml-file gemacht werden oder kann hierzu auch ein Pythonscript erstellt werden?

Danke für die Antworten

Re: Wetterstation mit seriellem Interface RS232

Verfasst: 20. Feb 2022 15:11
von udo1toni
Wo die Konvertierung in Daten erledigt wird, ist zweitrangig. Du kannst also gerne ein Python Script implementieren, welches dann entweder von openHAB regelmäßig aufgerufen wird, oder (besser) im Hintergrund läuft und die Daten per mqtt bereitstellt. Wie komfortabel Du das ganze programmierst, bleibt natürlich Dir überlassen, üblich wäre es aber, ein JSON Objekt zusammenzubauen.

Re: Wetterstation mit seriellem Interface RS232

Verfasst: 23. Feb 2022 06:39
von Norick
danke für die Antwort. Könnte man es auch mit "Blockly" die Konvertierung machen? Dies könnte auf den ersten Blick auch einfach sein.

Welches "Binding" o.ä. müsste ich für ein Pythonscript installieren?

Re: Wetterstation mit seriellem Interface RS232

Verfasst: 23. Feb 2022 19:15
von udo1toni
Ob das mit Blockly einfach zu bewerkstelligen ist? Nun ja. Meine Erfahrung mit Blockly ist, dass man einen extrem begrenzten Befehlssatz hat und durch das ständige Schachteln von Anweisungen nach kürzester Zeit nicht mehr erkennbar ist, wie der Code funktioniert.
Ich bin kein Experte, was die Programmierung von solchen Routinen betrifft, aber so ins Blaue wäre es etwas wie (Pseudo-Code):

Code: Alles auswählen

int i = 0
get data as string
for each char in data
    i++
    if i > 1 and i < 7 temp = temp + char
    if i > 6 and i < 9 sos = sos + char
    if i > 8 and i < 11 sow = sow + char
    if i > 10 and i < 13 soo = soo + char
    if i > 13 and i < 17 light = light + char
    if i > 16 and i < 21 wind = wind + char
    if i == 13 daem = if(char = "J") "ON" else "OFF"
    if i == 21 rain = if(char = "J") "ON" else "OFF"
next
fTemp = val(temp)
also es werden die Daten geholt (dafür wird es eine Funktion brauchen, die das erledigt). Anschließend werden die Daten zeichenweise eingelesen und von Stelle x - y in eine lokale Variable geschrieben (Zerlegen des Streams in einzelne Daten).
Anschließend wird die Temperatur als vorzeichenbehafteter Wert in eine echte Zahl umgewandelt.
Danach kommt es nur noch darauf an, wie man die Daten bereitstellen will. Als JSON würde man einfach eine passende Zeichenkette erzeugen.

Code: Alles auswählen

json = '{"temperature":"' + fTemp.toString + '","southdir":"' + sos + '","westdir":"' + sow + '","eastdir":"' + soo + '","dusk":"' + daem + '","rain":"' + rain + '","light":"' + light + '","wind":"' + wind + '"}'
Und schon kann man dieses JSON Objekt über mqtt in ein Topic schreiben (paho-mqtt wäre eine Bibliothek für python).
Vermutlich gibt es elegantere Verfahren, sie führen aber zum gleichen Ergebnis, so man denn JSON und mqtt verwenden möchte, man erhält ein JSON Objekt, in dem alle relevanten Daten mit eindeutiger Bezeichnung abrufbar sind.

Code: Alles auswählen

{
    "temperature": "12.3",
    "southdir": "3",
    "westdir": "55",
    "eastdir": "1",
    "dusk": "OFF",
    "rain": "OFF",
    "light": "999",
    "wind": "1.2"
}
In openHAB nutzt man dann mqtt um das JSON abzuholen und in einen String Channel zu speichern. Der String Channel wird mit diversen Items gekoppelt (Number und Switch). Dabei werden wird das jeweilige Datum über das Profile JSONPATH ausgewählt. In den einzelnen Items landen also die Einzelwerte.

Re: Wetterstation mit seriellem Interface RS232

Verfasst: 25. Feb 2022 06:55
von Norick
Vielen Dank für die sehr ausführliche Beschreibung. Das heisst man benötigt immer für die Datenbereitstellung ein JSON Objekt mit MQTT um es in einem String Channel zu speichern? Das heisst für dann für die Datenaufbereitung kann Blockly, Python etc. verwendet werden?

Wenn ich Python verwende welches Binding wird dazu verwendet?

Re: Wetterstation mit seriellem Interface RS232

Verfasst: 25. Feb 2022 17:38
von udo1toni
Du musst das nicht zwingend mit JSON und MQTT erledigen, es ist aber naheliegend. Stell Dir vor, Du wendest Dich irgendwann enttäuscht von openHAB ab (soll nicht passieren, aber rein hypothetisch), dann möchtest Du nicht alle Scripte, die Du mal zur extra Anbindung von eigenen Dingen geschrieben hast, umständlich an das neue System anpassen. Wenn Du MQTT zur Anbindung nutzt, hast Du zu jedem anderen (ernstzunehmenden) System Kompatibilität. Und jede mir bekannte Hardware, die MQTT nutzt, verwendet in diesem Zusammenhang auch JSON um Daten blockweise zur Verfügung zu stellen.

In openHAB benötigst Du in diesem Fall nur das MQTT Binding sowie die JSONPATH Transformation.

Python selbst ist vollkommen unabhängig, Du könntest mit Python auch auf die REST API von openHAB zugreifen oder einen Webserver verwenden, aber das ist aller viel zu kompliziert. Der MQTT Zugriff ist innerhalb weniger Minuten implementiert, wenn Du auch nur ein wenig Ahnung von Python hast :)

Re: Wetterstation mit seriellem Interface RS232

Verfasst: 27. Feb 2022 11:14
von Norick
Vielen Dank für deine Antwort. Das sind doch gute Argumente für MQT und JSON. Ich werde versuchen dies so zu implementieren und melde mich dann...

Bis dahin vielen Dank für den tollen Support

Re: Wetterstation mit seriellem Interface RS232

Verfasst: 27. Feb 2022 11:19
von udo1toni
Immer gerne :)

Re: Wetterstation mit seriellem Interface RS232

Verfasst: 28. Feb 2022 07:00
von Norick
kurze Frage: ich habe zwar gesucht aber wo legst du ein neues json file (skript) an für die Programmierung?

Re: Wetterstation mit seriellem Interface RS232

Verfasst: 28. Feb 2022 11:41
von udo1toni
Gar nicht. Die UI erstellt die Scripte. Es ist nicht vorgesehen, die Script von Hand zu erstellen. Wenn Du das tust (also indem Du die Dateien manuell bearbeitest) musst Du openHAB herunterfahren und nach dem Bearbeiten wieder starten.