XML-Seite per cronjob auslesen

Einrichtung, Nutzung und Hilfe zu RaspberryMatic (OCCU auf Raspberry Pi)

Moderatoren: jmaus, Co-Administratoren

stefan-fd
Beiträge: 10
Registriert: 01.06.2017, 22:35
Wohnort: Fulda

XML-Seite per cronjob auslesen

Beitrag von stefan-fd » 12.03.2018, 17:12

Hi,

ich würde gerne auf dem Raspimatic eine im LAN befindliche Webseite (XML) auslesen und einen dort vorhandenen Wert per XML API in eine Systemvariable schreiben.

Es geht um ein Heizöl-Füllstandmessgerät, das einen mini Webserver mit XML bereitstellt. Ich habe im Forum sowohl posts zu cronjobs, als auch andere Wege zur Heizöl Füllstandserfassung gefunden. Allerdings bringt mich das nicht so richtig weiter.

Der Aufruf von "http://192.168.0.69/xml" bringt:

Code: Alles auswählen

<seqSmartbox xsi:schemaLocation="xxxx"><seqHeader><indication>Manuelle Abfrage</indication><authCode>xxxx</authCode><devOperator></devOperator><devLocation>Keller</devLocation><devID>x-xxx</devID><devVersion>V6.12</devVersion></seqHeader><seqData><seqTanks><tankNumber>1</tankNumber><tankName>Heizöl</tankName><seqTankLevel><tankLevel>1817</tankLevel>
[...]

wobei mich die Info <tankLevel>, in diesem Fall mit 1817 Litern interessiert.

Mit dem Aufruf von "http://192.168.0.155/config/xmlapi/stat ... value=1817" schreibe ich in meine Systemvariable "Heizöl".

Nun geht es darum, ein Skript (welche Sprache?) auf dem Raspimatic zu hinterlegen und dieses im 1-Minutentakt oder größer auszuführen.
Hat jemand einen Tipp oder vielleicht eine andere Herangehensweise? Belastet das den Raspi stark?

Danke vorab.
Stefan

Benutzeravatar
Black
Beiträge: 5480
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 424 Mal
Danksagung erhalten: 1074 Mal
Kontaktdaten:

Re: XML-Seite per cronjob auslesen

Beitrag von Black » 12.03.2018, 18:42

wenn du einen 17 KW Brenner hast, wird dein Ölbrenner in einer Stunde recht genau 1.7l Öl durch seine Düse pressen.

in einer Stunde.

Wenn du Stündlich deinen Tank ausliest, und du 1800l im Tank hast ist die Gefahr recht gering, das in den nächsten 59 Minuten dein Öl schlagartig und überraschend alle wird.

so als Denkanstoss, ob ich die 1 Minute Tastrate für zu hoch halte....

greetz, Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

stefan-fd
Beiträge: 10
Registriert: 01.06.2017, 22:35
Wohnort: Fulda

Re: XML-Seite per cronjob auslesen

Beitrag von stefan-fd » 12.03.2018, 19:19

JA! :-D Ich habe sogar an stündlich gedacht. Aber die Finger waren schneller als das Hirn ;-) Danke

stefan-fd
Beiträge: 10
Registriert: 01.06.2017, 22:35
Wohnort: Fulda

[geloest]: XML-Seite per cronjob auslesen

Beitrag von stefan-fd » 17.03.2018, 12:27

Es funktioniert 8)

Code: Alles auswählen

	load tclrega.so

	set url http://192.168.0.69/xml
	exec /usr/bin/wget -q -O /usr/local/addons/heizoel/heizoel-kellertank.xml $url

	set f [open "/usr/local/addons/heizoel/heizoel-kellertank.xml"]
	set input [read $f]
	close $f

	
	regexp "<seqTankLevel>(.*?)</seqTankLevel>" $input dummy seqTankLevel  ; 
	regexp "<tankLevel>(.*?)</tankLevel>" $seqTankLevel dummy tankLevel  ; 
	
			   
	set rega_cmd ""
	append rega_cmd "var c0 = dom.GetObject('Heizoel');"
	append rega_cmd "c0.State('$tankLevel');"

	rega_script $rega_cmd
TCL war mir bis vor wenigen Tagen noch unbekannt. :wink:

Aufruf aus der Raspimatic per Timer und Skript (Ausführung ganztätig / Intervall / 1 Std):

Code: Alles auswählen

string stdout;
string stderr;
system.Exec("tclsh /usr/local/addons/heizoel/heizoel.tcl", &stdout, &stderr);
Die Quelle für obiges Skript, dankenswerterweise von: http://homematic-forum.de/forum/viewtop ... nderground

Benutzeravatar
Black
Beiträge: 5480
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 424 Mal
Danksagung erhalten: 1074 Mal
Kontaktdaten:

Re: XML-Seite per cronjob auslesen

Beitrag von Black » 17.03.2018, 12:44

alles gut...

2 Kleinigkeiten

ich täte bei dem URL aufruf als Datei zum abspeichern den Pfad /tmp/ benutzen anstatt /usr/local/
tmp liegt meines wissen in einer ramdisk und usr/local ist flash speicher. schont also eher den Speicher.

Dein Aufruf var c0 = dom.GetObject('Heizoel'); ist sachlich korrekt, ich empfehle und mache es auch selber,
immer mit var c0 = dom.GetObject (ID_SYSTEM_VARIABLES).Get ('Heizoel'); zuzugreifen.

solltest du mal zufälligerweise aus irgendwelchen Gründen mal 2 Objecte mit dem gleichen Namen im Sysvar Space und irgendeinem anderen Space haben,
so ergibt deine Lösung ein Zufälliges ergebnis, welches Object gegriffen wird. Mit ID_SYSTEM VARIABLES wird immer im Bereich Systemvariablen geschaut.

Gruss und ein schönes Wochenende,

Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

stefan-fd
Beiträge: 10
Registriert: 01.06.2017, 22:35
Wohnort: Fulda

Re: XML-Seite per cronjob auslesen

Beitrag von stefan-fd » 17.03.2018, 13:30

Prima Hinweise, habe es bereits umgesetzt. Jetzt habe ich die permanente Heizöl-Inventur im ccu-historian :D
Vielen Dank und gleichfalls schönes Wochenende!
Stefan

Benutzeravatar
jmaus
Beiträge: 9862
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 464 Mal
Danksagung erhalten: 1880 Mal
Kontaktdaten:

Re: [geloest]: XML-Seite per cronjob auslesen

Beitrag von jmaus » 17.03.2018, 16:02

Auch meinerseits der Optimierungshinweis den system.Exec() Aufruf wie folgt zu gestalten (da du offensichtlich ja nicht die ausgaben von system.Exec() benötigst):

Also statt:
stefan-fd hat geschrieben:

Code: Alles auswählen

string stdout;
string stderr;
system.Exec("tclsh /usr/local/addons/heizoel/heizoel.tcl", &stdout, &stderr);
einfach nur:

Code: Alles auswählen

system.Exec("tclsh /usr/local/addons/heizoel/heizoel.tcl &");
Dann läuft das tclsh Script im Hintergrund ab und blockiert nicht die ReGaHss während seiner Ausführungszeit.
RaspberryMatic 3.75.7.20240420 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

stefan-fd
Beiträge: 10
Registriert: 01.06.2017, 22:35
Wohnort: Fulda

Re: XML-Seite per cronjob auslesen

Beitrag von stefan-fd » 17.03.2018, 16:22

:-) Auch hierfür herzlichen Dank! Ich habe gerade noch mittels Deines tollen Email-Addons die Warnmeldung bei Bestand <= 500 ltr eingestellt. Super!! (Auf die Gefahr hin, dass es hier offtopic ist) - Ich brauchte mehrere Anläufe mit der Email-Erzeugung, da ich für den Heizölbestand die TCL-Variable V4 nehmen wollte. In der Email wurde dann immer "null" gezeigt. Funktioniert das Addon nur mit Variablen V1-V3?
Viele Grüße
Stefan

Benutzeravatar
jmaus
Beiträge: 9862
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 464 Mal
Danksagung erhalten: 1880 Mal
Kontaktdaten:

Re: XML-Seite per cronjob auslesen

Beitrag von jmaus » 17.03.2018, 16:24

stefan-fd hat geschrieben:... Ich habe gerade noch mittels Deines tollen Email-Addons die ...
Der Dank an dem Email-Addon gebürt anderen. Allen voran HMside (Andreas Bünting) der sich vor allem in den letzten Jahren dem Addon sehr angenommen hat. Ich habe hier vor allem nur die Portierung zu RaspberryMatic sichergestellt.
RaspberryMatic 3.75.7.20240420 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

tinus16
Beiträge: 12
Registriert: 05.05.2017, 18:40

Re: XML-Seite per cronjob auslesen

Beitrag von tinus16 » 18.03.2018, 17:14

Es geht auch mit mehr als drei Variablen. Eventuell hilft Dir ja meine Vorlage weiter. Ist ev. etwas unübersichtlich, bastle aber immer mehr darein.

Gruß Tinus

Code: Alles auswählen

load tclrega.so

array set values [rega_script {
var v30 = system.Date("%d.%m.%Y").ToString();
var v31 = system.Date("%H:%M").ToString();
var v1 = dom.GetObject("BidCos-RF.JEQ0735938:1.WIND_SPEED").Value();
var v2 = dom.GetObject("BidCos-RF.JEQ0735938:1.TEMPERATURE").Value();
var v3 =  dom.GetObject("BidCos-RF.JEQ0735938:1.HUMIDITY").Value();
var v4 =  dom.GetObject("Gefriertruhe").Value();
var v5 =  dom.GetObject("Strom Tag").Value();
var v6 =  dom.GetObject("Gas Tag").Value();
var v7 =  dom.GetObject("Wasser Tag").Value();
var v14 = dom.GetObject("Rasp_Strom_Verbrauch").Value();
var v15 =  dom.GetObject("BidCos-RF.LEQ0811509:1.TEMPERATURE").Value();
if (dom.GetObject("Alarmzone 1").Value() == 'false') {
   var v8 = "ALARM ausgelöst";
}else {
   var v8 = "ALARM nicht ausgelöst";
}
if (dom.GetObject("Serverstatus").Value() == 'false') {
   var v9 = "Server läuft";
}else {
   var v9 = "Server ausgefallen";
}
if (dom.GetObject("Garagentor").Value() == 'false') {
   var v10 = "Tor wurde geschlossen";
}else {
   var v10 = "Tor wurde geöffnet";
}
if (dom.GetObject("Schwarze Tonne morgen").Value() == 'false') {
   var v11 = "Ja";
}else {
   var v11 = "Nein";
}
if (dom.GetObject("Gelber Sack morgen").Value() == 'false') {
   var v12 = "Ja";
}else {
   var v12 = "Nein";
}
if (dom.GetObject("Blaue Tonne morgen").Value() == 'false') {
   var v13 = "Ja";
}else {
   var v13 = "Nein";
}
} ]

set v1 $values(v1)
set v2 $values(v2)
set v3 $values(v3)
set v4 $values(v4)
set v5 $values(v5)
set v6 $values(v6)
set v7 $values(v7)
set v8 $values(v8)
set v9 $values(v9)
set v10 $values(v10)
set v11 $values(v11)
set v12 $values(v12)
set v13 $values(v13)
set v14 $values(v14)
set v15 $values(v15)
set v30 $values(v30)
set v31 $values(v31)
Tinker S
RaspberryMatic auf Thinkerboard S + LAN Gateway
Diverse Aktoren Funk und Wired RS485 - 1-Wire zur Zählererfassung
IP-Symcon - FHZ 1300 PC mit einigen Temperatursendern

Antworten

Zurück zu „RaspberryMatic“