Seite 1 von 2

Daten von einer CCU3 auf eine andere übertragen

Verfasst: 20.09.2022, 01:06
von Bembi
Moin Zusammen,

Ich habe zwei CCU3s mit unterschiedlichen Komponenten (im gleichen Netz, aber unterschiedliche Subnetze). Die Kernstati einzelner Komponenten lege ich in Variablen ab.
Nun würde ich gerne einzelne Variablenwerte der einen CCU auf die andere CCU übernehmen, damit ich sie dort weiter nutzen kann.

Hat da jemand für mich den gedanklichen Ansatz bzw. ein Besipiel?

Re: Daten von einer CCU3 auf eine andere übertragen

Verfasst: 20.09.2022, 05:30
von rr745
nur einmalig , oder permanent ?
man könnte die werte via http request übertragen.

Re: Daten von einer CCU3 auf eine andere übertragen

Verfasst: 20.09.2022, 09:23
von Tyfys
Dort ging es um das gleiche Thema : viewtopic.php?f=26&t=68854&start=10

Re: Daten von einer CCU3 auf eine andere übertragen

Verfasst: 22.09.2022, 01:47
von Bembi
Moin,
habe das hier versucht...
Geht (sprich keine syslog Fehler), nur die Variable ist leer

string stdout;

string url ='http://ccu3-176.domain.tld:8181/test.ex ... me").Value()';
WriteLine(url);
system.Exec("wget --no-check-certificate -q -O - '"#url#"'");
WriteLine(stdout);

WriteLine("Hallo Welt!");

Re: Daten von einer CCU3 auf eine andere übertragen

Verfasst: 22.09.2022, 07:00
von MichaelN
Und unter Skript testen kommt "Hallo Welt"?Würde mich wundern. Das hier sollte einen Fehler werfen

Code: Alles auswählen

string url ='http://ccu3-176.domain.tld:8181/test.ex ... me").Value()';
Was soll die) und das Value?

Und dein wget hat zuviel "

Re: Daten von einer CCU3 auf eine andere übertragen

Verfasst: 22.09.2022, 09:05
von rentier-s
Hast Du in der zweiten CCU in den Sicherheitseinstellungen die Umleitung auf HTTPS aktiv? Dann wäre https://ccu3-176.domain.tld:48181 richtig. Außerdem empfiehlt sich, den Remote-API Zugriff auf die IP-Adresse der sendenden CCU zu beschränken und mit Authentifizierung zu arbeiten.

Auflösen kann die CCU den Hostnamen hoffentlich, ggf. erstmal mit der IP-Adresse probieren. Außerdem muss die CCU den richtigen Gateway kennen.

Wenn Netzwerkseitig alles richtig eingestellt ist, klapp das hier auf jeden Fall, selbst im Einsatz:

Code: Alles auswählen

var x = dom.GetObject("meineSysVar").Value();
string url='https://192.168.x.y:48181/remote.exe?sv=dom.GetObject("dortigeSysVar").State('#x#')';
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("wget --no-check-certificate -q -O - --user ersteCCU --password Passwort '"#url#"'");
Ohne CUxD müsste das mit System.Exec() ähnlich funktionieren.

Re: Daten von einer CCU3 auf eine andere übertragen

Verfasst: 22.09.2022, 16:10
von mademyday
ich nutze dafür ein Skript mit Bestandteilen hier aus dem Forum, s.u.

vielleicht helfen meine als Gedankenstütze dort notierten Kommentare?!
(via Port 8181, wie bei der ccu2, kommt bei meiner ccu3 nämlich "401 - Unauthorized")

Code: Alles auswählen

! --- auf ccu2 + ccu3: IP-Adressen für den eingeschränkten Zugriff: 172.20.1.0/24;
! --- auf ...... ccu3: Port-Freigabe: 8183;
! ---
! --- ccu2 --> ccu3: Port 8183 !
Skript:

Code: Alles auswählen

! --- Prog: pSystemvariable_zu_CCU3_spiegeln

! --- Systemvariable zu einer zweiten CCU senden
! --- https://homematic-forum.de/forum/viewtopic.php?f=19&t=74606&p=722724&hilit=8181#p722724

! --- Beispiel: curl "http://localhost:8181/run.exe?x=dom.GetObject(ID_SYSTEM_VARIABLES).Get('log').State('test');"

! --- auf ccu2 + ccu3: IP-Adressen für den eingeschränkten Zugriff: 172.20.1.0/24;
! --- auf ...... ccu3: Port-Freigabe: 8183;
! ---
! --- ccu2 --> ccu3: Port 8183 !
! --- s. https://homematic-forum.de/forum/viewtopic.php?f=65&t=72884&hilit=user+8181&start=20#p717791
! --- "direkt auf der Zentrale nicht via Port 8181 (welcher über lighttpd geht) sondern via Port 8183"
! --- [15:29] ~ # curl "http://172.20.1.30:8183/ccu2.exe?x=dom.GetObject(ID_SYSTEM_VARIABLES).Get('log').State('test');"
! --- <xml><_exec>/ccu2.exe</exec><sessionId></sessionId><httpUserAgent>User-Agent: curl/7.65.0</httpUserAgent><x>true</x></xml>
! --- [15:31] ~ # uname -a
! --- Linux homematic-ccu2 3.4.113.ccu2 #1 PREEMPT Wed Jan 20 16:21:07 CET 2021 armv5tejl GNU/Linux
! ---
! --- ccu3 --> ccu2: Port 8181 !
! --- [15:33] ~ # curl "http://172.20.1.60:8181/ccu3.exe?x=dom.GetObject(ID_SYSTEM_VARIABLES).Get('log').State('test');"
! --- <xml><_exec>/ccu3.exe</exec><sessionId></sessionId><httpUserAgent>User-Agent: curl/7.61.1</httpUserAgent><x>true</x></xml>
! --- [15:33] ~ # uname -a
! --- Linux ccu3-webui 4.14.34 #1 SMP PREEMPT Thu Jun 23 16:59:40 CEST 2022 armv7l GNU/Linux

! ---

! --- source_ccu: 'exe'-Name..............: http://<target_ccu>/<source_ccu>.exe?x=...
! --- target_ccu: IP-Adresse/Hostname+Port: http://<target_ccu>/<source_ccu>.exe?x=...
if( 1 ) {
  string target_ccu = "172.20.1.30:8183";
  string source_ccu = "ccu2";
} else {
  string target_ccu = "172.20.1.60:8181";
  string source_ccu = "ccu3";
}

if( dom.GetObject("$this$") ) {
  string prog = dom.GetObject("$this$").Name();
} else { string prog = "-not defined-"; }

! ---

if( (dom.GetObject("$src$")) && (dom.GetObject("$src$").IsTypeOf(OT_VARDP)) ) {
  string src_vardp = dom.GetObject("$src$").Name();
  var    src_val   = dom.GetObject(ID_SYSTEM_VARIABLES).Get(src_vardp).Value();

} else {
  string src_vardp = ""; 
  var    src_val   = "";
}

! ---

if( ( ! dom.GetObject("$this$") ) || ( ! dom.GetObject("$src$") ) ) {
  WriteLine( "DEBUG!" );
  src_vardp = "log";
  src_val   = "--- \"Gruss\" von der '" # source_ccu # "' (Prog: " # prog # ")! ---";
  ! src_val   = dom.GetObject(ID_SYSTEM_VARIABLES).Get('vWetter_aktuell').Value();
}

! ---
! ---
! ---

var src_type = src_val.Type();
if ( src_type == "string" ) {
  src_val = src_val.Replace( "'", "\\'" );
  src_val = "'" # src_val.UriEncode() # "'";
}

if( ! dom.GetObject("$this$") ) {
  WriteLine( "\nsrc_vardp: " # src_vardp );
! WriteLine( src_vardp # ": " # dom.GetObject(ID_SYSTEM_VARIABLES).Get(src_vardp).Value() );
  WriteLine( "src_type.: " # src_type );
  WriteLine( "src_val..: " # src_val # "\n" );
}

string log = "Prog: " # prog # " --- src_vardp: " # src_vardp # " (" # src_type # ") --- system.Exec() mit curl ...";
WriteLine(log); if(1||dom.GetObject("$this$")){dom.GetObject(ID_SYSTEM_VARIABLES).Get('log').State(log);}

! ---

! system.Exec( 
! WriteLine(
system.Exec(
  "curl --max-time 10 --retry 3 --retry-delay 20 --retry-max-time 60 \"http://" # target_ccu # "/" # source_ccu 
    # ".exe?x=dom.GetObject(ID_SYSTEM_VARIABLES).Get('" # src_vardp # "').State(" # src_val # ");\" -q &"
);

! ---

WriteLine("--- Ende ---");
Programm:
pSystemvariable_zu_CCU3_spiegeln.jpg
pSystemvariable_zu_CCU3_spiegeln

Re: Daten von einer CCU3 auf eine andere übertragen

Verfasst: 27.09.2022, 01:26
von Bembi
Moin Zusammen,

danke für all die Vorschläge...
Wie ich sehe schreibt Ihr von der Quell CCU auf die Ziel CCU.
Geht natürlich auch....
Werde ich testen und berichten.

Ich hatte nur die Idee, dass sich die Ziel CCU den Wert von der Quell CCU holt (also lesen).
Das aus Lastverteilungsgründen.
Meine oben genanntes Beispiel funktioniert soweit (Hallo Welt kommt / kein Fehler).
Kommt eben nur kein Wert zurück.

Re: Daten von einer CCU3 auf eine andere übertragen

Verfasst: 27.09.2022, 06:33
von Xel66
Bembi hat geschrieben:
27.09.2022, 01:26
Ich hatte nur die Idee, dass sich die Ziel CCU den Wert von der Quell CCU holt (also lesen).
Das aus Lastverteilungsgründen.
Ganz schlechte Idee. Die schreibende CCU kann sowas nach dem Prinzip "fire and forget" absetzen. Eine auf eine Antwort wartende CCU (muss ja per Script gemacht werden), kann diese eben blockieren (zumindest bis zum hoffentlich angelegten Timeout). "Externe" Netzwerkkommunikationen sind immer mit einem aufmerksamen Auge zu betrachten. Und eine URL-Abfrage ist nicht wirklich eine Last für den aufrufenden Rechner. Es wird nur zum Problem, wenn er auf eine Antwort warten muss. Und der Zielrechner steckt es ganz locker weg.

Gruß Xel66

Re: Daten von einer CCU3 auf eine andere übertragen

Verfasst: 27.09.2022, 06:52
von mademyday
Bembi hat geschrieben:
27.09.2022, 01:26
Wie ich sehe schreibt Ihr von der Quell CCU auf die Ziel CCU.
da nur die Quell-CCU wissen kann, dass sich ein Wert geändert hat, macht das IMHO auch Sinn, dass diese das Spiegeln mit der Werte-Änderung/Aktualisierung triggert