Daten von einer CCU3 auf eine andere übertragen

HMIP lokale Installation

Moderator: Co-Administratoren

rentier-s
Beiträge: 368
Registriert: 19.06.2017, 09:24
Hat sich bedankt: 20 Mal
Danksagung erhalten: 65 Mal

Re: Daten von einer CCU3 auf eine andere übertragen

Beitrag von rentier-s » 27.09.2022, 09:32

Der Vollständigkeit halber:

Der ursprüngliche Ansatz hätte theoretisch funktioniert, man muss system.Exec allerdings die Ausgabevariable mitgeben.

Code: Alles auswählen

string output;
system.Exec("wget -O - https://seite.tld", &soutput);
WriteLine(output);

Eine andere CCU über die Remote Scripting API abzufragen funktioniert damit aber aus unerfindlichen Gründen nicht.

Mit CUxD klappt es und blockiert auch nichts.

Code: Alles auswählen

string url = "https://andereCCU:48181/remote.exe?sv=dom.GetObject(\"Systemvariable\").Value()";

string cmd = "wget -q -O - --no-check-certificate --user ich --password geheim '"#url#"'";

dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State(cmd);
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
string xml = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();

WriteLine(xml);

Abgesehen davon, dass man immer auf Verdacht abfragen muss, ob sich der Wert vielleicht geändert hat, muss man sich auch noch um das Parsen der XML Ausgabe kümmern.

Den Wert von der Quell CCU zu pushen ist also deutlich sinnvoller und einfacher.

Bembi
Beiträge: 56
Registriert: 04.02.2015, 02:15
System: CCU und Access Point
Hat sich bedankt: 7 Mal
Danksagung erhalten: 9 Mal

Re: Daten von einer CCU3 auf eine andere übertragen

Beitrag von Bembi » 28.09.2022, 02:04

Moin an alle, jeder hat zum Teil zur Lösung beigetragen, das Ergebnis möchte ich Euch (und der Nachwelt :-) ) nicht vorenthalten.
Weil es mal wieder typisch eQ3 ist.

Push (= Fire and forget) macht durchaus Sinn, wobei in diesen speziellen Fall die Daten nicht zeitkritisch sind.
Ich glaube ich werde das auch so final umsetzen, war aber trotzdem neugierig, wieso das mit dem Pull hapert.
Ich hole mir so ja auch Wetterdaten und ein paar Daten aus meiner Wärmepumpe.

Code: Alles auswählen

string stdout;
string stderr;
integer xLen = 0;
integer xPos = 0;
string strFilter = "xyz";
string strResult;

string  url ='http://ccu3-176.mydomain.tld:8181/test.exe?xyz=dom.GetObject(ID_SYSTEM_VARIABLES).Get("TH RSZG Humi").Value()';
system.Exec("wget --timeout=10 -q -O - '" # url # "'", &stdout, &stderr);

!stderr delivers only result with wget option -v instead of -q
WriteLine(stderr); 

xPos = stdout.Find(strFilter) +4;
xLen = stdout.Length() - (xPos +12);

strResult = stdout.Substr(xPos, xLen);

WriteLine(strResult);
WriteLine("Hallo Welt!");
Anmerkungen:
- IP statt FQDN macht den (ersten) Aufruf schneller weil die Namensauflösung wegfällt, wenngleich nicht unbedingt best practise.
- Name der exe ist ja wohl völlig egal
- xyz=dom.GetObject... xyz ist ja nur das zurückgelieferte XML Tag. Zum Filtern sollte das Tag aber eindeutig sein(sprich x= ist schlecht).
- Port 8181 / 8183 macht bei mir (CCU3 zu CCU3) keinen Unterschied. Geht beides.
- dom.GetObject(ID_SYSTEM_VARIABLES).Get("TH RSZG Humi") und dom.GetObject("TH RSZG Humi") macht keinen Unterschied.
- Die Korrekturwerte +4 und (xPos +12) filtern die XML Tag vor und hinter dem Wert raus.
- Die Frage, warum "- (xPos +12)" und nicht "-xPos - 12", möge eQ3 beantworten, die haben es nicht so mit allgemeiner Mathematik.
- Anmeldung (wget mit --user UserName --password Passwort) war bei mir akut nicht erforderlich, muss ich testen, kann nicht schaden.

Warum es vorher nicht funktioniert hat war die Tatsache, dass da eine XML Struktur zurückkommt (kann man sich ja im Browser angucken). Sollte einer String variable eigentlich wurscht sein, ist es aber nicht. Das direkte Ausgeben von stdout liefert nichts.
Wenn ich den stdout aber auseinander rupfe, dann bekomme ich was ich will. Das brachte mich mal auf die Idee zu gucken, woran es scheitert, und siehe da

Code: Alles auswählen

WriteLine(stdout.Substr(1, stdout.Length()));
liefert den XML string, allerdings ohne die erste Klammer, also "xlm>" anstelle "<xml>"
jedoch

Code: Alles auswählen

WriteLine(stdout.Substr(0, stdout.Length()));
liefert nichts. Muss ich jetzt nicht unbedingt verstehen. Eigentlich kenne ich diese Funktion (aus anderern Programmiersprachen) nur so, das die 1 "starte mit dem ersten Zeichen" bedeutet.
Zuletzt geändert von Bembi am 28.09.2022, 11:42, insgesamt 1-mal geändert.

MichaelN
Beiträge: 9645
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 697 Mal
Danksagung erhalten: 1614 Mal

Re: Daten von einer CCU3 auf eine andere übertragen

Beitrag von MichaelN » 28.09.2022, 07:04

Bembi hat geschrieben:
28.09.2022, 02:04
dom.GetObject(ID_SYSTEM_VARIABLES).Get("TH RSZG Humi") und dom.GetObject("TH RSZG Humi") macht keinen Unterschied.
Aber nur solange "TH RSZG Humi" ein einziges Mal als Objekt Name verwendet wurde.
Bembi hat geschrieben:
28.09.2022, 02:04
Eigentlich kenne ich diese Funktion (aus anderern Programmiersprachen) nur so, das die 1 "starte mit dem ersten Zeichen" bedeutet.
Es ist bei Programmier Sprachen vollkommen normal, das die Auflistung bei 0 beginnt. 1 ist eher unüblich.
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Tyfys
Beiträge: 544
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 123 Mal

Re: Daten von einer CCU3 auf eine andere übertragen

Beitrag von Tyfys » 28.09.2022, 10:07

Bembi hat geschrieben:
28.09.2022, 02:04

Code: Alles auswählen

strResult = stdout.Substr(xPos, XLen);
Kleiner Tippfehler bei XLen - wurde als xLen definiert - also mit kleinem x.
Gruß
Harry

Tyfys
Beiträge: 544
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 123 Mal

Re: Daten von einer CCU3 auf eine andere übertragen

Beitrag von Tyfys » 22.10.2022, 12:20

Bembi hat geschrieben:
28.09.2022, 02:04
dass da eine XML Struktur zurückkommt
und dieser Beitrag viewtopic.php?f=31&t=59101&p=738627#p738627

hat mich dann auf diese Idee gebracht:

Code: Alles auswählen

string stdout;
string stderr;
string strFilter = "xyz";
string strResult;
string  url ='http://ccu3-176.mydomain.tld:8181/test.exe?xyz=dom.GetObject(ID_SYSTEM_VARIABLES).Get("TH RSZG Humi").Value()';
system.Exec("wget --timeout=10 -q -O - '" # url # "'", &stdout, &stderr);
xml x;
strResult = x.Parse(stdout).GetChildNode(strFilter).GetText();
WriteLine(strResult);
je nach erwartetem Variablentype müsste der Rückgabewert (hier strResult) noch konvertiert werden
(.z.B. mit .ToInteger() oder .ToFloat(). )

Man erspart sich also das selbst Ermitteln mit .Find() und .Substr().
Gruß
Harry

rtlplus
Beiträge: 91
Registriert: 17.10.2009, 02:09
Wohnort: Schweiz
Hat sich bedankt: 1 Mal

Re: Daten von einer CCU3 auf eine andere übertragen

Beitrag von rtlplus » 30.03.2024, 11:39

Hallo miteinander
bei mir funktioniert das alles nicht. Ich habe alles ausprobiert. Alle Variationen aber die Systemvariable, die auf beiden CCU's (1x CCU2 und 1x CCU3) gleich heisst (BatterieLeer) kommt in der CCU2 nie an. Den Inhalt meine ich. Kann mir jemand weiterhelfen?
Gruess, René

MichaelN
Beiträge: 9645
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 697 Mal
Danksagung erhalten: 1614 Mal

Re: Daten von einer CCU3 auf eine andere übertragen

Beitrag von MichaelN » 30.03.2024, 11:56

Auf Basis dieser Fehlerbeschreibung kann man nur den Rat geben alles genauso zu machen wie hier beschrieben
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

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

Re: Daten von einer CCU3 auf eine andere übertragen

Beitrag von mademyday » 04.04.2024, 18:02

rtlplus hat geschrieben:
30.03.2024, 11:39
...bei mir funktioniert das alles nicht. Ich habe alles ausprobiert...
ich würde mal auf System-Ebene anfangen, um erstmal ein gültiges Kommando zusammen zu bauen:
auf der sendenden CCU3 eine ssh-session aufmachen (putty/user root/ssh muss in der Systemkonfig der CCU3 zugelassen sein und ein PW für den user root eingetragen sein/das ist nicht(!) das WebUI-PW!) und in der shell testen, zB sowas:

Code: Alles auswählen

wget --timeout=5 "http://IP_DER_CCU2:8181/test.exe?x=dom.GetObject(ID_SYSTEM_VARIABLES).Get('log').State('Test: von ccu3 aus eine SV auf der ccu2 beschreiben!');" -q -O -
Im Erfolgsfall (Voraussetzung es gibt die zu beschreibende Systemvariable auf der ccu2, hier: "log" - und der Wertetyp kann das zu Schreibende aufnehmen, hier "string") sollte sowas aus Ergebnis kommen:

Code: Alles auswählen

<xml><exec>/test.exe</exec><sessionId></sessionId><httpUserAgent>User-Agent: Wget/1.19.5 (linux-gnueabihf)</httpUserAgent><x>true</x></xml>
--> das "<x>true</x>" steht für OK

Gegenprobe, von der ccu3 aus den Wert der ccu2-SV auslesen:

Code: Alles auswählen

wget --timeout=5 "http://IP_DER_CCU2:8181/test.exe?x=dom.GetObject(ID_SYSTEM_VARIABLES).Get('log').Value();" -q -O -
sollte liefern:

Code: Alles auswählen

<xml><exec>/test.exe</exec><sessionId></sessionId><httpUserAgent>User-Agent: Wget/1.19.5 (linux-gnueabihf)</httpUserAgent><x>Test: von ccu3 aus eine SV auf der ccu2 beschreiben!</x></xml>
--> auch hier, das zwischen den x-Tags ist der SV-Inhalt

wenn du das hast, kann man anfangen und ein HomeMatic-Skript für ein WebUI-Programm zusammen bauen;
bei Problemen, falls das so nicht klappt, jeweils das -q gegen ein -v austauschen und nochmal testen...

* ggf auf der ccu2 in der Systemsteuerung die Firewall konfigurieren, dass die ccu3 auch rankommt (eingeschränkt + ip_der_ccu3 eintragen sollte reichen)

Antworten

Zurück zu „HomeMatic IP mit CCU“