NEWS
Werte aus .txt Datei auslesen Attribut speichern [gelöst]
-
Hallo zusammen,
ich bin gerade dabei meine verschiedenen Smarthome Plattformen auf IOBroker zusammenzuführen. Unter anderem habe ich einen Raspberry Pi angeschlossen welcher durch ein Python Skript über GPIO bestimmte Füllwerte meiner Zisterne/Heizöltanks ermittelt. Diese werden in eine TXT datei geschrieben als Liste und jede Stunde wird die Liste um den aktuellsten Wert erweitert.
Der jetzige Anwendungsfall wäre wie folgt:
Ich habe auf meinem "iobroker Server" eine .txt datei liegen welche mir mit einem Timestamp stündlich die aktuellen Werte in eine neue Zeile einer Textdatei schreibt. Die Werte sind mit Tabstopp getrennt.
Ich möchte nun immer die letzte Zeile der Textdatei, oder Teile davon, in als Attribut über IOBroker auslesen lassen damit ich mir dies als Kennzahl anzeigen lassen kann.
Zur Not kann ich auch eine Extra Logdatei generieren lassen welche immer nur den aktuellen Wert als Zahl enthält und diesen überschreibt.Gibt es eine Möglichkeit dies einfach zu realisieren?
Ich danke euch.
-
klar geht das.
wie sieht der wert aus,
welches betriebssystem? -
Die Tabelle sieht wie folgt aus (beispielhaft weitere Werte oben abgeschnitten):
Zisternenstand.logDie relevanten Werte stehen in den letzten beiden Spalten. Vorletzte Spalte Liter, letzte Spalte Füllwert in Prozent.
Das Betriebssystem ist Linux. Besser gesagt eine Raspbian Buster Version.
-
@chronos81 sagte: Python Skript
Schreibe per http-request über die Simple-API direkt in einen ioBroker-Datenpunkt.
-
- in den einstellungen des javascript adapters das folgende modul eintragen
tail - folgendes skript im javascript-adapter anlegen und die geünschten/geforderten Werte am Anfang, inklusive den korrekten Pfad zur Datei eintragen.
var dp_liter = "javascript.0.liter"; var dp_füllwert = "javascript.0.füllwert"; var filename = "Zisternenstand.log" Tail = require('tail').Tail; tail = new Tail(filename ); tail.on("line", function(data) { console.log(data); let a = data.split(" "); setState(dp_liter,a[3]); setState(dp_füllwert,a[4]); });
Solange das Skript läuft schaut es auf die Datei und immer wenn ein neuer 'Wert geschrieben wird, werden die Werte in einen Datenpunkt geschrieben.
Ich habe es jetzt nicht ausprobiert, aber ich denke, jede geschrieben Zeile sollte mit einem "neue Zeile"-Zeichen abgechlossen sein. - in den einstellungen des javascript adapters das folgende modul eintragen
-
@chronos81 wie @paul53 schreibt: Bau in dein Python-Skript einen Aufruf ein, siehe https://github.com/ioBroker/ioBroker.simple-api (Den Adapter musst du Installieren)
Dann könntest du z.B. per
http://ipaddress:8087/set/javascript.0.test?value=1
den Wert des Datenpunktes
javascript.0.test
auf 1 setzen (der vorher schon existieren muss).
Wie macht man einenrequest
in Python? Die Anleitung sieht z.B. ganz verständlich aus: https://lerneprogrammieren.de/python-http-requests-tutorial/ -
@bananajoe sagte: Den Adapter musst du Installieren
Oder die im Web-Adapter (Port 8082) eingebaute Simple-API verwenden.
-
Oder Node-Red nutzen.
-
@mickym sagte in Werte aus .txt Datei auslesen und als Attribut speichern:
Oder Node-Red nutzen.
<ironie> Immer diese militante Minderheit der Node-Red Benutzer<ironie off>
-
Hallo zusammen, ich bin überwältigt von den vielen Antworten und Hilfestellungen. Ich werde mich heute Abend mal dran setzen und mir die verschiedenen Möglichkeiten anschauen. Danke auch, dass teilweise Folgefragen schon beantwortet wurden (z.B. wie macht man einen request usw...)
Ich versuche mich da nun etwas "reinzufuchsen" und melde mich ggf. bei weiteren Fragen oder sonst wenn es geklappt hat. -
@oliverio said in Werte aus .txt Datei auslesen und als Attribut speichern:
Hallo oliverio,
ich habe das soweit probiert allerdings scheint der Pfad noch nicht zu passen bei mir. Die Berechtigungen sind erteilt und die Datei liegt auf dem gleichen Gerät auf dem auch der iobroker läuft. Habe ich den Pfad richtig deklariert? -
@chronos81
sieht eigentlich gut aus, aber die Datei scheint dort nicht zu liegen bzw. scheint die Berechtigung nicht zu passen.
Mit welchen Benutzer wird die Datei geschrieben?ls -l <setze hier den kompletten pfad ein>
-
@OliverIO Sorry ich habe mich geirrt da ich zwei Raspis habe habe ich die IP's vertauscht. Der IObroker läuft auf einem anderen Device. Ich habe nun zum Testen erst mal nachgebaut wie es sich verhält wenn ich die Datei nun auf dem richtigen Gerät liegen habe. Das Skript läuft nun auch. Allerdings finde ich keine neuen Objekte die ich nun erwartet hätte im Objektbaum.
-
@chronos81
ah ja, hätte ich erwähnen sollen.
die musst du selber anlegen.
der befehl schreibt nur in bereits existierende Datenpunkte -
@oliverio Hi danke,
also ich habe nun zwei Datenpunkte im Ordner 0_userdata --> 0 angelegt. Ich habe sie zunächst vom Datentyp String angelegt. muss ich diese im Skript nun noch richtig ansprechen damit die Daten hier erscheinen?
Sorry für die Anfängerfragen -
@chronos81
eigentlich nicht
probier mal aus
wir werden sehen ob das skript meckert -
@chronos81 sagte: zwei Datenpunkte im Ordner 0_userdata --> 0 angelegt.
Die IDs sind im Skript anzupassen:
var dp_liter = "0_userdata.0.dp_liter"; var dp_füllwert = "0_userdata.0.dp_füllwert";
-
@oliverio sagte in Werte aus .txt Datei auslesen und als Attribut speichern:
ah ja, hätte ich erwähnen sollen.
die musst du selber anlegen.Aber @BananaJoe hat es
@bananajoe sagte in Werte aus .txt Datei auslesen und als Attribut speichern:
der vorher schon existieren muss
-
@homoran
ja, aber im Rahmen eines anderen Lösungswegs.
Ich kann verstehen, wenn Anfänger, die von iobroker, von javascript, von Programmierung generell keinerlei Ahnung haben, das die da den Wald vor lauter Bäumen nicht sehen
und meist auch den einzelnen Zusammenhang nicht verstehen.
Wenn ich (du ja bei javascript auch nicht wobei das verstehst auch du) bei einem skript drauf
schau, dann weiß ich meist relativ schnell um was es da geht.
Non programmierer sehen nur Zeichen, die für sie aneinander gereiht keinen Sinn machen.Wenn ich dran denk, das ich die ersten Zeilen javascript mit einem netscape navigator 4 ausprobiert habe. Aber damals war das so grottig langsam und die async-logik hab ich damals auch noch nicht so richtig verstanden.
-
@oliverio
Hallo ich habe nun die Datenpunkte im Skript angepasst wie von @paul53 netterweise beschrieben. Ebenfalls habe ich mehrfach die Schreibweise und den Datenpfad geprüft. Leider kommt jedoch nichts bei den Werten an.
Es wird auch kein Fehler angezeigt. Hast du noch ne Idee was ich prüfen könnte?Dankeschön.