Script zum Auswerten und kombinieren von mqtt Daten

  • Ich habe nie richtig Programmieren gelernt, bin aber absolut in der Lage Beispielcode für meine Zwecke anzupassen. Ich habe schon ein wenig gegoogelt doch die Beispiele, die ich fand gingen nie über eine Ausgabe des abonnierte Topics/Payloads hinaus. Vielleicht könnt ihr mich ja in die richtige Richtung lootsen, gerne auch auf eine andere Website für Bash oder Python.

    Ausgangslage:

    Ich habe zwei Außenensoren für Temperatur und Luftfeuchtigkeit, wegen der Gegebenheiten hängt einer davon bis Mittags in der Sonne und der andere Sensor danach, was die ermittelten Daten leider unbrauchbar macht. Diese 433mHz Sensoren lasse ich mit rtl_433 und einem entsprechenden Funkempfänger am Pi auslesen und an mosquitto senden. Hier kommen von jedem Sensor etwa alle 30 Sekunden neue Werte.


    Außerdem habe ich ein Python Script gefunden und auf Einzeltopics angepasst, mit dem ich Wetterdaten von openweathermap.org (OWM) für meinen Ort abrufe und ebenfalls nach mosquitto veröffentliche. Das läuft alle 2 Minuten per cron-job.

    Was will ich tun?

    Da OWM sicher keine Messstation in meinem Dorf hat, dürften die erhaltenen Daten irgendwie extrapoliert sein und auch meine Außensensoren sind nur für Consumer "Wetterstationen" gedacht, also auch nicht sonderlich genau. Deshalb möchte ich Mittelwerte bilden.


    Ich möchte ein dauerhaft laufendes Script (Batch oder Python), das 6 topics abonniert. Jeweils temperature_C und humidity meiner beiden Sensoren und der OWM-Daten.


    Immer wenn nun Daten von OWM eintreffen (alle 2 min) sollen die zuletzt empfangenen und gespeicherten Daten meiner Funksensoren kombiniert werden und als neues Topic an mqtt gehen. Also getrennt nach topic, wenn owm/temperature_C dann bilde Mittelwert der Temperaturen und wenn topic owm/humidity reinkommt dann Mittelwert der Luftfeuchten bilden.

    Code
    05:30 - 12:00 -> (OWM + Sensor1) / 2
    12:01 - 21:59 -> (OWM + Sensor2) / 2
    22:00 - 05:29 -> (OWM + Sensor1 + Sensor2) / 3

    Das ganze ich nicht wirklich wichtig oder nötig, ich würde gerne aber meine Skills etwas erweitern.

  • Ich möchte ein dauerhaft laufendes Script (Batch oder Python), das 6 topics abonniert.

    Mal allem vorangestellt: ich habe keine fertige Lösung für dein Problem. Aber ich empfand es reizvoll genug, darüber immer mal wieder nachzudenken.


    Ich würde weder Python noch ein Bash-Skript nehmen. Das ist vor allem der Tatsache geschuldet, dass ich ein Bash-Skript für zu umständlich halte und ich meine Python-Kenntnisse erst einmal ordentlich aufpolieren müsste. Ich würde Node Red nehmen.


    Im Rahmen dieses Forums darf ich weder noch will ich hier eine detaillierte Hilfestellung geben, weil dieses Forum wirklich nicht der richtige Platz für abgefeimte Programmierung ist und niemand hier einen brauchbaren Support leisten kann (oder will). Zumindest so viel:

    • Node Red ist einfach aufzusetzen und kann zusammen mit Homebridge auf deinem Raspi laufen.
    • Es wird vielfach verwendet und daher gibt es auch vielfachen Support der Community. Ich empfehle YouTube-Videos, sich sich mit Node Red beschäftigen und speziell diejenigen, die Node Red + MQTT zum Thema haben. Dein Tag reicht nicht aus, sie alle zu sehen. Ein, zwei werden reichen, damit du tätig werden kannst.
    • Node Red ist zu 90% Klicki-Bunti, das heißt, dass vor allem deine Fähigkeiten an der Maus gefragt sind. Aber darin sollten wir ja alle Meister sein.
    • Node Red bringt allen Support für deine Aufgabenstellung mit. Es kann um HomeKit- und Homebridge-Fähigkeiten erweitert werden.
    • In Node Red wird in Javascript programmiert, wobei dein Javascript-Beitrag nicht sonderlich groß sein sollte. Wenn ich deine Aufgabenstellung betrachte, handelt es sich ja eigentlich nur um etwas Addition und Division. Wenn du erst einmal msg.payload verstanden hast, sollte das für dich kein großes Problem darstellen.

    Sehr vereinfacht würde deine Aufgabenstellung in Node Red so aussehen (sehr, sehr vereinfacht):


    Deine Sensoren sollten vielleicht das MQTT-Retain-Flag setzen, so dass der MQTT-Broker (mosquitto) sie zwischenspeichert. Ansonsten sind die Sensorwerte nicht mehr vorhanden, wenn die OWM-Daten reinkommen. Alternativ kannst du die Werte auch in Node Red zwischenspeichern, siehe flow.set und flow.get.


    Für Fragen, wie das alles genau funktioniert und wie man dieses oder jenes verwirklicht, verweise ich dann an irgendwelche Node Red-Foren. Wie gesagt, hier können wir nicht weiterhelfen.

  • Danke sschuste für den Tipp. Für meine Zwecke scheint das aber übertrieben. Vielleicht schau ich mir das mal bei einem anderen, zukünftigen Projekt an.


    Allerdings hatte ich gerade noch eine Idee, mit einem etwas pragmatischerem Ansatz. Da ich ohnehin zwei Raspis am start habe, habe ich einfach auf dem zweiten auch noch einen Broker aufgesetzt, der von rtl_433 Nachrichten mit Retain-Flag annimmt. Leider kann ich das bei rtl_433 nicht auf topics bzw Messageormat eingrenzen und man kann auch nur eine Pub-Verbindung mit dem selben Broker anlegen, deshalb zwei Broker.


    Jetzt will ich dann am Ende meines vorhandenen Python-Scripts ein Bash-Script starten, welches dann je nach Zeit über mosquitto_sub -C 1 -t rtl/sensor1/temperature_C den letzten Wert abgreift und zusätzlich auch noch das topic rtl/sensor1/time überprüft, in dem der Zeitstempel der letzten Übertragung hinterlegt ist. -C 1 "wartet" auf nur eine Nachricht und beendet dann die Subscription, da ratain ja gecached wird, kommt die Antwort sofort.


    Ich berichte dann nächste Woche


    Läuft schon fast. Ich hab mein vorhandenes Python Skript, dass die Daten von OWM holt und nach mqtt schickt, erweitert. Allerdings sehr unfein über einen externen Aufruf des Linuxprogramms.


    Kann mir bitte noch wer verraten, wie ich direkt in Python/paho.mqtt einen einmaligen Wert auslese, also das equivalent zum mosquitto_sub -C 1?


    und ja, ich weiß, das Python mit round() nicht immer korrekt kaufmännisch rundet, ist hierfür aber nicht wirklich relevant.

    Einmal editiert, zuletzt von Spy () aus folgendem Grund: Ein Beitrag von ApplePrime mit diesem Beitrag zusammengefügt.