Wie externe Daten am besten Speichern

Moderatoren: seppy, udo1toni

Bunta
Beiträge: 7
Registriert: 12. Aug 2019 09:18

Wie externe Daten am besten Speichern

Beitrag von Bunta » 12. Aug 2019 09:33

Hallo zusammen!

Vorab kurz die aktuelle Lage.
Ich habe mir eigene "Nodes" gebaut welche bisher diverse Daten wie Temperatur, Luftfeuchte, Luftdruck, Helligkeit, Batteriestand des Nodes, usw. an ein "Gateway" senden. Nodes und Gateway sind Atmega328P. Der Gateway kommuniziert per UART mit einem PI wo ein Pythonskript läuft welches die empfangen Daten in eine MySQL (MariaDB) schreibt.

Nun zu meiner Frage:
Wie bekomme ich es am besten hin diese dort gespeicherten Daten in Openhab anzuzeigen? Sowohl als Item, welches die letzten übermittelten Werte anzeigt, als auch als Graph über diverse, voreingestellte, Zeiträume.

Ich habe diverse Tutorials gefunden wo mit persistence Daten erfasst und dargestellt werden. Hier werden dann ja nur änderungen an Items "geloggt" und dann von Openhab in eine DB (MySQL, rrd4j, etc.) geschrieben. Ich vermute hier werden nach einem gewissen schema Datensätze angelegt, welche dann nach vorgefertigten Filtern ausgegeben werden können.
Ich hätte auch nichts dagegen über diesen Weg meine Daten zu speichern, anstelle diese selbst in eine DB zu schreiben. Jedoch müsste ich ja meine Items irgendwie definieren. Weil Openhab kennt ja meine Eigenbaukonstruktion nicht. Und dann müsste ich irgendwie noch in erfahrung bringen wie mein Pythonskript die Daten an das/die Openhabitems sendet.

Sollte es einen ganz anderen einfachen weg geben... ich bin für alles offen. Danke für eure Hilfe.

PS: Das ganze läuft auf einem Pi3 B+

Benutzeravatar
udo1toni
Beiträge: 1565
Registriert: 11. Apr 2018 18:05
Wohnort: Darmstadt

Re: Wie externe Daten am besten Speichern

Beitrag von udo1toni » 12. Aug 2019 15:20

Hallo,

Du kannst zwei verschiedene Wege gehen.

Weg 1: Du legst Items für jeden Wert an, schaltest die Persistence ein und änderst den Wert einmalig. Dann schaust Du Dir in der Datenbank die Datenstruktur an und passt Deine eigene Datenstruktur so an, dass sie die Daten in exakt diesem Format in die Datenbank schreibt, und zwar in exakt die Tabellen, die openhAB angelegt hat. Die alten Daten kanst Du mittels Anfügeabfrage übernehmen.
In openHAB setzt Du restoreOnStartup, aber ansonsten keinerlei aktive Persistence für diese Werte, so kannst Du die Daten in openHAB anzeigen. Damit Du die aktuellen Daten bekommst, musst Du eine Rule verwenden, die regelmäßig den letzten Stand aus der Datenbank liest und ins Item kopiert.

Das Ganze ist recht umständlich, aber ein gangbarer Weg.

Der zweite Weg läuft ähnlich, nur dass Du die Daten pro Item von Deinem Script abholst und es openHAB überlässt, die Werte in die Datenbank zu schreiben. Das ist aus openHAB-Sicht deutlich geschmeidiger, allerdings wirst Du Dein Script abändern müssen, dahingehend, dass es einen Parameter für den Sensor entgegennimmt und im Gegenzug den Wert liefert. Das Script kannst Du dann mittels exec Binding von openHAB aus aufrufen. Die alten Werte kannst Du trotzdem über eine Anfügeabfrage in die neuen Tabellen übernehmen.

Bunta
Beiträge: 7
Registriert: 12. Aug 2019 09:18

Re: Wie externe Daten am besten Speichern

Beitrag von Bunta » 13. Aug 2019 08:28

Danke udo1toni!
Weg 1 kann ich nachvollziehen und darauf wird es wohl hinauslaufen.

Bei Weg 2, wenn ich das richtig verstehe, überlasse ich es Openhab über das Skript die Daten über das Gateway vom Node anzufordern und abzurufen. Wenn das so gemeint ist geht das in meinem Fall leider nicht. Die Nodes senden automatisch alle x Minuten (aktuell alle 5 Minuten) an das Gateway. Auf dem Pi läuft Pythonskript was die Serial Schnittstalle, welche über das UART läuft, überwacht. Dann wird die Zeile aus dem Buffer, sofern das Endzeichen erreicht wurde, in die MySQL geschrieben. Jetzt könnte ich für diesen Weg maximal hergehen und dann die Daten von Openhab auf meiner Tabelle auslesen lassen, sodass Openhab diese in seiner eigenen hinterlegt. Kann auch sein das ich das falsch verstehe. Sollte es aber so sein finde ich diesen Weg sogar komplizierter als den ersten.

Durch deine Ansätze bin ich auf folgendes Binding gestoßen: https://www.openhab.org/addons/bindings/serial1/
Hier wäre die Frage wie ich sicherstellen kann, dass der Datensatz auch komplett empfangen wurde.

Benutzeravatar
udo1toni
Beiträge: 1565
Registriert: 11. Apr 2018 18:05
Wohnort: Darmstadt

Re: Wie externe Daten am besten Speichern

Beitrag von udo1toni » 13. Aug 2019 18:18

Du hast mich richtig verstanden, allerdings ist die Variante, dass Dein Script die Daten regelmäßig aktiv sendet, genauso realisierbar, Du musst dazu nur das Script leicht anpassen.
openHAB stellt eine RESTful API zur Verfügung, Du kannst aus der REST API Documentation direkt die notwendigen Codeschnipsel erzeugen.
In Deinem Python Script musst Du dann nur die Stelle abwandeln, die sich um das Speichern in der DB kümmert und stattdessen per curl (da gibt's ja eine Bibliothek) die REST API ansteuern (für erste Tests kannst Du die Daten gar parallel schreiben lassen, also sowohl in die DB als auch direkt an openHAB).

Der Aufruf muss nur den Wert in das richtige Item schreiben, um den Rest kümmert sich dann openHAB mit der jdbc Persistence (alternativ auch influxDB, rdd4j, whatever...)

Der Weg 1 dürfte ein steiniger Weg sein (und vor allem dürften es Stolpersteine sein), auch, weil er sehr unüblich ist.

Das Serial Binding könntest Du natürlich auch verwenden, um direkt Daten zu empfangen, allerdings macht es keinen Spaß, die serielle Kommunikation mit der Rule engine zu bauen, die ist halt nicht für solche Aufgaben gedacht.

Bunta
Beiträge: 7
Registriert: 12. Aug 2019 09:18

Re: Wie externe Daten am besten Speichern

Beitrag von Bunta » 14. Aug 2019 09:49

Nochmals besten Dank für deine Antwort.
Dann werde ich wohl doch zu Weg 2 gehen. Muss mir das mal mit curl mal anschauen. Habe auch mit REST APIs bisher nichts gemacht. Bin aber gespannt wie gut das damit klappt.
Das bedeutet aber auch das ich in meinem Pythonskript jedes Item entsprechend ansprechen muss. Z.B.

Node ID 2
Sensoren für Temp., Luftfeuchte, Luftdruck, Helligkeit, Batterie
Jeder Sensorwert ist dann ja ein Item. Für gleichbleibende Sensorentypen kann man das sicher anhand der Node ID automatisieren für alle.

Ändert sich aber der Node in der Hardware/Sensoren, muss man das ja auch klassifizieren und für jeden "Node-Typ" die richtigen Befehle ausführen. Da muss ich auf jeden Fall auch noch nachbessern im übermittelten Code. Also das eine Typennummer mitgeschickt wird anhand das Gateway entscheiden kann wie die Nachricht verarbeitet wird.

Wenn MQTT nur Funk könnte würde ich das ja gern nutzen. Aber meines Wissens nach geht das nur mit WLAN. Dann würde ich die Nodes und den Gateway über MQTT laufen lassen. Würde glaube einiges vereinfachen.

Benutzeravatar
udo1toni
Beiträge: 1565
Registriert: 11. Apr 2018 18:05
Wohnort: Darmstadt

Re: Wie externe Daten am besten Speichern

Beitrag von udo1toni » 15. Aug 2019 23:23

Du könntest ein SonOff Basic der neuen Bauart verwenden, der hat einen RF433 Chip mit an Bord. Man muss noch ein bisschen löten und natürlich eine andere Firmware aufspielen, aber dann wird das empfangene Telegramm in ein Topic geschrieben.

Siehe https://community.openhab.org/t/it-is-p ... eway/79821

Allerdings müsste man ja immer noch die Daten aufbereiten, das geht zwar auch in einer Rule, aber das macht keinen Spaß.. die Rule Engine ist einfach nicht dazu gedacht. Mach das besser in Python (oder einer anderen Sprache... egal...) und übergib die Daten geordnet an openHAB, das wird wesentlich eleganter sein (zumal Du ja schon ein funktionierendes Script hast - da kannst Du sicherlich drauf aufbauen).

Bunta
Beiträge: 7
Registriert: 12. Aug 2019 09:18

Re: Wie externe Daten am besten Speichern

Beitrag von Bunta » 16. Aug 2019 13:36

Ich werde den Weg über die API wählen. Der wirkt mir am besten und ich umgehe so nicht die Persistenz von Openhab. Die alten Daten lasse ich dann nach dem Openhab schema einlaufen wie du es gesagt hast.

Ich danke dir wirklich vielmals für deine diversen Vorschläge und vor allem die netten Antworten. So freundlich ist man das Internet und andere Foren nicht gewöhnt. Danke! :)

Benutzeravatar
udo1toni
Beiträge: 1565
Registriert: 11. Apr 2018 18:05
Wohnort: Darmstadt

Re: Wie externe Daten am besten Speichern

Beitrag von udo1toni » 16. Aug 2019 16:13

Bunta hat geschrieben:
16. Aug 2019 13:36
Ich danke dir wirklich vielmals für deine diversen Vorschläge und vor allem die netten Antworten. So freundlich ist man das Internet und andere Foren nicht gewöhnt. Danke! :)
Immer gerne :)

Bunta
Beiträge: 7
Registriert: 12. Aug 2019 09:18

Re: Wie externe Daten am besten Speichern

Beitrag von Bunta » 18. Aug 2019 21:44

Sooo. Mal nicht nur Fragen stellen sondern auch Ergebnisse berichten.

Ich habe, wie von dir vorgeschlagen, das ganze per CURL im Pythonskript schön erstellt. Habe wie geschrieben die Daten der Node um den NodeType erweitert. Somit weiß ich je nach Typ welches Werte ankommen, in welcher Reihenfolge, und welche ich wo wegschreiben muss.
Dann habe ich meine DB "stillgelegt" und dafür die Persistenz von Openhab und MariaDB aktiviert. Diese legt nun alle Daten für die von mir definierten Items, bzw. Itemgroupen, ab.
Anhand dieser Daten ist es dann ein einfaches diagramme mit den Openhab-Boardmitteln zu erstellen.
Genau so habe ich es mir am Ende vorgestellt. Danke dir nochmal für die vielen Denkanstöße.

Nun muss ich nur noch die Daten aus meiner alten Tabelle auf die 5 neuen, durch Openhab erstellten, verteilen. Das bekomme ich aber auch schnell raus. ;)

Benutzeravatar
udo1toni
Beiträge: 1565
Registriert: 11. Apr 2018 18:05
Wohnort: Darmstadt

Re: Wie externe Daten am besten Speichern

Beitrag von udo1toni » 18. Aug 2019 22:43

Bunta hat geschrieben:
18. Aug 2019 21:44
Nun muss ich nur noch die Daten aus meiner alten Tabelle auf die 5 neuen, durch Openhab erstellten, verteilen. Das bekomme ich aber auch schnell raus. ;)
Prima. Für die Datenübernahme musst Du eine Anfügeabfrage basteln.

Hast Du ein Frontend für den Zugriff auf die Datenbank? Ich nutze seit geraumer Zeit HeidiSQL, was sozusagen die Windows Desktop Variante von phpMyAdmin darstellt.
Tipp: erstelle eine weitere Tabelle, die das Zielformat hat und teste die Abfrage daran. Die ersten Versuche gehen bei mir immer schief... ;)

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste