Abfrage mehrerer Datenpunkte über die Text-Schnittstelle per HM-Script "in einem Rutsch"

Das Langzeitarchiv für HomeMatic

Moderator: Co-Administratoren

Antworten
Benutzeravatar
Baxxy
Beiträge: 10766
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 602 Mal
Danksagung erhalten: 2201 Mal

Abfrage mehrerer Datenpunkte über die Text-Schnittstelle per HM-Script "in einem Rutsch"

Beitrag von Baxxy » 06.05.2022, 17:43

Ich würde gerne den Durchschnittswert der letzten 24h für mehrere Datenpunkte "in einem Rutsch" per HM-Script auslesen.

Die Beispiele im Wiki zeigen ja immer nur einen Datenpunkt, so das ich z.B. bei 3 DP's 3x system.Exec() bemühen muss.
Das sieht dann grob so aus...

Code: Alles auswählen

string out;
string test;
system.Exec("curl 'http://192.168.1.26:8082/query/text.gy?dp=491&b=-24h&ag=avg'", &out);
out = out.ToFloat().ToString(1);
test = out;
system.Exec("curl 'http://192.168.1.26:8082/query/text.gy?dp=288&b=-24h&ag=avg'", &out);
out = out.ToFloat().ToString(1);
test = test#";" + out;
system.Exec("curl 'http://192.168.1.26:8082/query/text.gy?dp=1231&b=-24h&ag=avg'", &out);
out = out.ToFloat().ToString(1);
test = test#";" + out #";";
WriteLine("Output: "# test);
... und gibt mir die Werte als String aus...

Code: Alles auswählen

Output: 23.9;16.2;22.5;
Funktioniert, aber gefällt mir nicht. :wink:

Die Frage ist, kann man die Abfrage kombinieren so das mit einem Aufruf die Werte von mehreren Datenpunkten abgefragt und zurückgegeben werden?
Und wenn ja, wie sähe dann ein Beispiel aus?

Oder gibt es Alternativen?

(Ziel ist es das Ganze später per CuxD zu machen und Callback zu nutzen um die ReGa nicht zu blockieren)

mademyday
Beiträge: 272
Registriert: 03.10.2014, 12:46
System: CCU
Wohnort: Enzkreis
Hat sich bedankt: 3 Mal
Danksagung erhalten: 43 Mal

Re: Abfrage mehrerer Datenpunkte über die Text-Schnittstelle per HM-Script "in einem Rutsch"

Beitrag von mademyday » 06.05.2022, 20:41

du kannst einfach mehrere sh-Befehle in ein system.Exec packen, zB so:

Code: Alles auswählen

string out;

system.Exec("
  echo curl_sagt_1
  echo curl_result_2
  echo curl_query_3
", &out);

WriteLine(out);
ergibt dann

Code: Alles auswählen

curl_sagt_1
curl_result_2
curl_query_3
würde ich aber bei curl/Web-Querys nicht machen, weil die gerne mal länger laufen und die ccu dann blockieren


ich würde ein entsprechendes shell-Skript erstellen, welches am Ende dann eine Homematic-Systemvariable befüllt - und dieses Skript würde ich dann entweder per cron einplanen - oder wenn die ccu per system.Exec der Auslöser sein muss, per & in den Hintergrund schicken und auf die SV-Änderung/-Aktualisierung triggern

Mathias
Beiträge: 1780
Registriert: 03.11.2010, 10:25
System: CCU
Wohnort: Aachen
Hat sich bedankt: 58 Mal
Danksagung erhalten: 258 Mal
Kontaktdaten:

Re: Abfrage mehrerer Datenpunkte über die Text-Schnittstelle per HM-Script "in einem Rutsch"

Beitrag von Mathias » 06.05.2022, 21:14

/query/text.gy kann bisher nur einen Datenpunkt verarbeiten.

Theoretisch könnte mit Auszügen aus text.gy ein Skript gebaut werden, dass mehrere Datenpunkte abfragt und die Ergebnisse zurückliefert. Das könnte in der Skriptumgebung vom CCU-Historian entwickelt werden. Nachher kann es dann über die JSON-RPC-Schnittstelle per CURL ausgeführt werden.

Benutzeravatar
Baxxy
Beiträge: 10766
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 602 Mal
Danksagung erhalten: 2201 Mal

Re: Abfrage mehrerer Datenpunkte über die Text-Schnittstelle per HM-Script "in einem Rutsch"

Beitrag von Baxxy » 07.05.2022, 17:19

Zunächst mal Danke für die Denkanstöße. :)

@Mathias:
Das eine multiple Datenpunktabfrage per /query/text.gy nicht möglich ist hatte ich schon vermutet. Schade, denn das wäre (für mich) wohl die optimalste Option.
Mit der Scriptumgebung "Groovy" hadere ich auch. Es gibt ja ein Beispiel was (u.a.) den Durchschnittswert eines DP's ausgibt. Das auf den avg-Wert runterzustrippen bekomme ich noch hin, aber das auf mehrere DP's zu erweitern liegt aktuell außerhalb meiner Fähigkeiten. Dazu kommt das die Scriptausführung per JSON-RPC laut Wiki noch auf der ToDo Liste ist, und es dazu keinerlei Dokumentation gibt.

@mademyday:
Die Verkettung mehrerer curl-Aufrufe per system.Exec() habe ich nicht auf die Reihe bekommen, dafür war dein Beispiel leider zu simpel.
Vermutlich hakelt's irgendwo beim Escaping oder so.
Dafür habe ich die Idee mit dem shell-Script aufgegriffen.
Ein shell-Script wird nun 1x täglich direkt durch ein CUxD-Timer-Device per SYSTEM|CMD_EXEC aufgerufen, holt dann die avg-Werte von 7 Historian DP's und schreibt diese als string in eine Datei im tmpfs.
Die kann ich dann problemlos per system.Exec() auslesen und weiterverarbeiten.

Nicht sehr elegant, läuft jetzt erstmal als Test. Mal sehen...

Grüße, Baxxy

mademyday
Beiträge: 272
Registriert: 03.10.2014, 12:46
System: CCU
Wohnort: Enzkreis
Hat sich bedankt: 3 Mal
Danksagung erhalten: 43 Mal

Re: Abfrage mehrerer Datenpunkte über die Text-Schnittstelle per HM-Script "in einem Rutsch"

Beitrag von mademyday » 08.05.2022, 08:47

Baxxy hat geschrieben:
07.05.2022, 17:19
@mademyday:
Die Verkettung mehrerer curl-Aufrufe per system.Exec() habe ich nicht auf die Reihe bekommen, dafür war dein Beispiel leider zu simpel.
das wollte ich so "nicht auf mir sitzen lasen" :)

Code: Alles auswählen

string out; string err;

system.Exec("date;
  curl -s \"http://172.20.1.60:8181/test.exe?x=dom.GetObject('BidCos-RF.MEQ1112472:1.STATE').Value();\" | \
    sed \"s|.*<x>|x:|; s|</x>.*|;|\"
 echo
  curl -s \"http://172.20.1.60:8181/test.exe?KZH=dom.GetObject(ID_SYSTEM_VARIABLES).Get('IstKZH').Value();\" | \
    sed \"s|.*<KZH>|KZH:|; s|</KZH>.*|;|\"
 echo
  curl -s \"http://172.20.1.60:8181/test.exe?HP=dom.GetObject(ID_SYSTEM_VARIABLES).Get('Heizperiode').Value();\" | \
    sed \"s|.*<HP>|HP:|; s|</HP>.*|;|\"
", &out, &err );

WriteLine( '--- out: ---\n' # out );
WriteLine( '--- err: ---\n' # err );

WriteLine("--- Ende ---");
-->

Code: Alles auswählen

--- out: ---
Sun May  8 08:46:26 CEST 2022
x:true;
KZH:false;
HP:true;
--- err: ---

--- Ende ---
Disclaimer: wie gesagt, wg evtl. CCU-Blockade würde ich das so nicht machen :)

Benutzeravatar
Baxxy
Beiträge: 10766
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 602 Mal
Danksagung erhalten: 2201 Mal

Re: Abfrage mehrerer Datenpunkte über die Text-Schnittstelle per HM-Script "in einem Rutsch"

Beitrag von Baxxy » 08.05.2022, 10:33

mademyday hat geschrieben:
08.05.2022, 08:47
das wollte ich so "nicht auf mir sitzen lasen"
Alles gut, mir liegt sowas auch nicht wirklich, daher arbeite ich gerne mit "Anschauungsmaterial". :wink:
Danke für das ausführliche Beispiel. Schon interessant was alles geht.
Ich bekomme das zwar weiterhin nicht auf mehrere Historian-Abfragen adaptiert, aber das macht nix da ich den Ansatz nicht weiter verfolgen möchte.
Die ReGa-Blockade wäre einfach zu groß.
Mein shell-Script läuft mit der Abfrage von 7 DP's so zwischen 1 und 5s, es scheint als ob der Historian nach unbestimmter Zeit erstmal "aufgeweckt" werden muss so das die erste Abfrage ziemlich lange dauert. Weitere Abfragen in kurzen Abständen gehen dann recht fix, vielleicht wird irgendwas gecached.

lange Abfrage:

Code: Alles auswählen

May  8 10:27:48 RM user.info Historian-Query: Historian Durchschnittswerte Abfrage gestartet.
May  8 10:27:52 RM user.info Historian-Query: Historian Durchschnittswerte Abfrage beendet. Werte: 14.1;15.7;15.6;15.5;15.4;15.3;15.5;
kurze Abfrage:

Code: Alles auswählen

May  8 10:28:58 RM user.info Historian-Query: Historian Durchschnittswerte Abfrage gestartet.
May  8 10:28:58 RM user.info Historian-Query: Historian Durchschnittswerte Abfrage beendet. Werte: 14.1;15.7;15.6;15.5;15.4;15.3;15.5;
Im Großen und Ganzen habe ich erreicht was ich wollte, bin aber für "Optimierungsvorschläge" offen. :)

Grüße, Baxxy

PaulM
Beiträge: 318
Registriert: 16.02.2015, 17:05
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 129 Mal
Danksagung erhalten: 35 Mal

Re: Abfrage mehrerer Datenpunkte über die Text-Schnittstelle per HM-Script "in einem Rutsch"

Beitrag von PaulM » 08.05.2022, 11:41

mein derzeitiger Lösungsweg mit jq:
Programm Abfrage
über CUxD Exec 2801xxx mit curl mit allen erhältlichen Daten, ohne Selektion oder weitere Verarbeitung
Ich nehme --tries=2 --timeout=15 um das Blockade-Risiko zu minimieren

Programm Auswertung bei Aktualisierung von CUX2801xxx mit Skript
1. Lesen des kompletten Inhalts von CUX2801xxx
2. schrittweise Auswertung mit jq, Verarbeitung und Speicherung in CUxD-Geräten oder SV's

Code: Alles auswählen

system.Exec("printf $(echo '"#antwort#"' | jq '.Wetterpause')", &stdout, &stderr);
string Wetterpause = stdout;
if (Wetterpause == "true") {  dom.GetObject('M_wetterpause j/n').State(1); }  
anschließend weitere angepasste jq Auswertungen im Skript

allgemeine Frage:
gibt es das Blockade-Risiko auch, wenn alle Daten ohnehin im Speicher der CCU sind, insbesondere lesbar als SV oder Gerät mit .Value() ?

Gruß
Paul
Mit Mut und Entschlossenheit gegen Intoleranz

Benutzeravatar
Baxxy
Beiträge: 10766
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 602 Mal
Danksagung erhalten: 2201 Mal

Re: Abfrage mehrerer Datenpunkte über die Text-Schnittstelle per HM-Script "in einem Rutsch"

Beitrag von Baxxy » 08.05.2022, 12:31

Dein Programm "Abfrage" über CUxD blockiert das System m.E. nicht. Da wird ja ein unabhängiger Prozess erzeugt und man braucht eigentlich auch keine Timeouts für curl da man ja den EXEC_TIMEOUT direkt im CuxD setzen kann.
Ich bin da noch am experimentieren, aktuell sieht ein beispielhafter curl Befehl bei mir so aus (aus dem shell-script):

Code: Alles auswählen

# Daten von Historian abrufen
dp1=$(curl -sS --connect-timeout 1.0 --max-time 4.0 'http://'$host'/query/text.gy?dp='$dp1q'&b=-24h&ag=avg')
Da Programm "Auswertung" ja erst gestartet wird wenn der Datensatz lokal vorliegt, wird nur so lange blockiert wie das Script für die Auswertung/Abarbeitung braucht. Würde ich sagen...

Grüße, Baxxy

Antworten

Zurück zu „CCU-Historian“