Homematic und Siemens Webserver ozw672

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

stephanflug
Beiträge: 10
Registriert: 12.12.2011, 13:40

Homematic und Siemens Webserver ozw672

Beitrag von stephanflug » 21.02.2017, 21:19

Hallo ,

hätte an euch einige Frage?

Gibt es da für Homematic auch eine Lösung. :?

Siehe Link:

Code: Alles auswählen

forum.fhem.de/index.php?topic=32866.0
Habe das Gerät bei mir im Einsatz und möchte gerne eine Werte abfragen und schreiben.
Wenn ich die Befehle im Internet Explorer Eingebe bekomme ich Werte.


Anmeldung

Code: Alles auswählen

https://192.168.2.17/api/auth/login.json?user=maxmuster&pwd=muster
https://192.168.2.17/api/menutree/list.json?SessionId=xxxxxxxxxxxxxxxxxxxxx

Aussentemperatur ID1237

Code: Alles auswählen

https://192.168.2.17/api/menutree/read_datapoint.json?SessionId=xxxxxxxxxxxxxxxxxxxxxxxxxx&Id=1237&Id=2
Raumtemperatur ID1253

Code: Alles auswählen

https://192.168.2.17/api/menutree/read_datapoint.json?SessionId=xxxxxxxxxxxxxxxxxxxxxxxxxx&Id=1253&Id=2
Zuletzt geändert von alchy am 21.02.2017, 22:07, insgesamt 1-mal geändert.
Grund: Code in Codetags posten

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Re: Homematic und Siemens Webserver ozw672

Beitrag von alchy » 21.02.2017, 22:08

Jup, das habe ich schon mal irgendwo programmiert, nur wo muss ich suchen 8)

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

stephanflug
Beiträge: 10
Registriert: 12.12.2011, 13:40

Re: Homematic und Siemens Webserver ozw672

Beitrag von stephanflug » 22.02.2017, 07:32

Guten Morgen alchy,

danke erstmals gestern für die schnelle Antwort von dir.Wäre super wenn du mir weiterhelfen könntest.

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Re: Homematic und Siemens Webserver ozw672

Beitrag von alchy » 22.02.2017, 19:48

CUxD Addon ist installiert - cuxd.exec mit mehreren Kanälen ist installiert und funktioniert?
(siche Signatur)

Dann versuch mal im Script executer oder unter Script testen.

Code: Alles auswählen

! Steuern eines Siemens-Webserver OZW 672 (c) by Alchy v0.1
var url = "https://192.168.2.17/api/auth/login.json?user=maxmuster&pwd=muster";
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -q --no-check-certificate -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
string srueck = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
if ( (srueck.Find("false") == -1) && (srueck) ) { 
string tmpa  = srueck.StrValueByIndex(",",0).StrValueByIndex(":",1);
string sSID = tmpa.Substr(2, tmpa.Length()-3);
WriteLine(" SessionID erfolgreich geholt:"#sSID);
string befehl = "https://192.168.2.17/api/menutree/read_datapoint.json?SessionId="#sSID#"&Id=1237&Id=2";
!dom.GetObject("CUxD.CUX2801001:2.CMD_EXEC").State("wget -q --no-check-certificate -O - '"#befehl#"'");
dom.GetObject("CUxD.CUX2801001:2.CMD_SETS").State("wget -q --no-check-certificate -O - '"#befehl#"'");
dom.GetObject("CUxD.CUX2801001:2.CMD_QUERY_RET").State(1);
string sback = dom.GetObject("CUxD.CUX2801001:2.CMD_RETS").State();
WriteLine(" Befehl abgesetzt");
WriteLine("Ausgabe: "#sback);
}else{
WriteLine(" Fehler beim Holen der SessionID ");
}
ist schon uralt und blind geschrieben, da ich natürlich keinen Siemens OZW 672 habe.

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

stephanflug
Beiträge: 10
Registriert: 12.12.2011, 13:40

Re: Homematic und Siemens Webserver ozw672

Beitrag von stephanflug » 22.02.2017, 20:18

Hallo Alchy,

muss sagen der script ist auf Anhieb gegangen.Ein großes Lob an dich.Jetzt habe ich noch einige Fragen.

Wie bekomme ich den ausgelesen Wert in eine Systemvariable?
Wie kann ich einen Wert schreiben?

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Re: Homematic und Siemens Webserver ozw672

Beitrag von alchy » 22.02.2017, 20:38

stephanflug hat geschrieben:Hallo Alchy,
muss sagen der script ist auf Anhieb gegangen.Ein großes Lob an dich.Jetzt habe ich noch einige Fragen.
Du musst mir schon mal zeigen, was da so ausgegeben wird (schön wäre JSON Ausgabe des Scriptexecuters).
Ich mag es manchmal Glück haben im Blind programmieren, aber es ist nicht spaßig.
stephanflug hat geschrieben: Wie bekomme ich den ausgelesen Wert in eine Systemvariable?
Signatur Links zu Homematic Script Bibliothek
Aber auf die Schnelle:
Was gehen sollte, wäre in dem du ein Systemvariable vom Typ Zeichenkette anlegst, nennen wir sie mal:
Siemens Aussentemperatur
und das Script eben so ausführst

Code: Alles auswählen

! Steuern eines Siemens-Webserver OZW 672 (c) by Alchy v0.1
var url = "https://192.168.2.17/api/auth/login.json?user=maxmuster&pwd=muster";
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -q --no-check-certificate -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
string srueck = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
if ( (srueck.Find("false") == -1) && (srueck) ) { 
string tmpa  = srueck.StrValueByIndex(",",0).StrValueByIndex(":",1);
string sSID = tmpa.Substr(2, tmpa.Length()-3);
WriteLine(" SessionID erfolgreich geholt:"#sSID);
string befehl = "https://192.168.2.17/api/menutree/read_datapoint.json?SessionId="#sSID#"&Id=1237&Id=2";
dom.GetObject("CUxD.CUX2801001:2.CMD_SETS").State("wget -q --no-check-certificate -O - '"#befehl#"'");
dom.GetObject("CUxD.CUX2801001:2.CMD_QUERY_RET").State(1);
string sback = dom.GetObject("CUxD.CUX2801001:2.CMD_RETS").State();
WriteLine(" Befehl abgesetzt");
WriteLine("Ausgabe: "#sback);
if ( (dom.GetObject(ID_SYSTEM_VARIABLES)).Get("Siemens Aussentemperatur") ) { dom.GetObject(ID_SYSTEM_VARIABLES).Get("Siemens Aussentemperatur").State( (sback)); 
WriteLine("Variable mit "#sback #"beschrieben");
}
}else{
WriteLine(" Fehler beim Holen der SessionID ");
}
Das Ganze müsste dann noch auf den neusten Stand gebracht werden.

Wenn du einen anderen Befehl ausführen willst, brauchst du nur die Zeile
string befehl = "https://192.168.2.17....

anzupassen.
stephanflug hat geschrieben:Wie kann ich einen Wert schreiben?
Beschreiben eines Datenpunktes kann man glaube mit

Code: Alles auswählen

string befehl = "https://192.168.2.17/api/menutree/write_datapoint.json?SessionId="#sSID#"&Id=XXXX&Type=Enumeration&Value=0&EnumValue=0";
Wobei du die Id = XXXX usw. selber anpassen musst.
Du hast doch die Kiste :wink: ich nicht.

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

stephanflug
Beiträge: 10
Registriert: 12.12.2011, 13:40

Re: Homematic und Siemens Webserver ozw672

Beitrag von stephanflug » 22.02.2017, 21:07

Habe es gerade getestet.

Code: Alles auswählen

 SessionID erfolgreich geholt:5fade7df-e6f2-4df5-b061-c03b9035d907
 Befehl abgesetzt
Ausgabe: {
	"Data": 
		{
		
			"Type": "Numeric",
			"Value": "        7.7",
			"Unit": "°C"
		
		},
    	"Result": 
		{
		"Success": "true"
    		}
}

Variable mit {
	"Data": 
		{
		
			"Type": "Numeric",
			"Value": "        7.7",
			"Unit": "°C"
		
		},
    	"Result": 
		{
		"Success": "true"
    		}
}
beschrieben
Die Werte werden richtig in die Systemvariable geschrieben.Nur wie bekomme ich nur den Value Wert in die Systemvariable als Zahl?

Derzeit wird mir in der Systemvariable das angezeigt.

Code: Alles auswählen

Siemens Aussentemperatur: { "Data": { "Type": "Numeric", "Value": " 7.7", "Unit": "°C" }, "Result": { "Success": "true" } }

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Re: Homematic und Siemens Webserver ozw672

Beitrag von alchy » 22.02.2017, 21:34

die JSON Ausgabe des Scriptexecuters wäre schön. :roll:

Wenn du schreibst, das script ist gegangen, gehe ich von aus, auch richtig gegangen ist.
Bei der Rückgabe kann man aber nicht davon reden.

Code: Alles auswählen

! Steuern eines Siemens-Webserver OZW 672 (c) by Alchy v0.2
var url = "https://192.168.2.17/api/auth/login.json?user=maxmuster&pwd=muster";
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -q --no-check-certificate -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
string srueck = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
if ( (srueck.Find("false") == -1) && (srueck) ) { 
string tmpa  = srueck.StrValueByIndex(",",0).StrValueByIndex(":",1);
string sSID = tmpa.Substr(2, tmpa.Length()-3);
WriteLine(" SessionID erfolgreich geholt:"#sSID);
string befehl = "https://192.168.2.17/api/menutree/read_datapoint.json?SessionId="#sSID#"&Id=1237&Id=2";
dom.GetObject("CUxD.CUX2801001:2.CMD_SETS").State("wget -q --no-check-certificate -O - '"#befehl#"'");
dom.GetObject("CUxD.CUX2801001:2.CMD_QUERY_RET").State(1);
string sback = dom.GetObject("CUxD.CUX2801001:2.CMD_RETS").State();
WriteLine(" Befehl abgesetzt");
WriteLine("Ausgabe: "#sback);
string tmpb  = sback.StrValueByIndex(",",1).StrValueByIndex(":",1);
var tmpc = (tmpb.Substr(2, tmpb.Length()-3)).ToFloat();
if ( (dom.GetObject(ID_SYSTEM_VARIABLES)).Get("Siemens Aussentemperatur") ) { dom.GetObject(ID_SYSTEM_VARIABLES).Get("Siemens Aussentemperatur").State( (tmpc)); WriteLine("Variable mit "#tmpc #" beschrieben");}else{ WriteLine("Variable nicht vorhanden, Wert "#tmpc #"kann nicht gespeichert werden");}
}else{ WriteLine(" Fehler beim Holen der SessionID ");}
Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Sechserpack
Beiträge: 83
Registriert: 26.02.2017, 22:31
Hat sich bedankt: 3 Mal
Danksagung erhalten: 2 Mal

Re: Homematic und Siemens Webserver ozw672

Beitrag von Sechserpack » 18.12.2017, 15:30

Hallo alchy, hallo zusammen,

ich würde gern den Thread reaktivieren, da ich vor dem ähnlichen Thema stehe. Ich würde gerne einige Werte meiner Wärmepumpen-Regelung in HM sehen und darauf reagieren können (z.B. Umschaltung Heiz- oder Kühlbetrieb, Legionellenprogramm, etc.).

Ich habe mir den Siemens Webserver ozw672 für meine Wärmepumpe (Fujitsu Waterstage) mit Siemens-Regelung ebenfalls gekauft und in Betrieb genommen. Der Webserver ist im Netz erreichbar und "redet" mit der Wärmepumpen-Regelung. Im Webinterface sehe ich alle Werte der Anlage.

Allerdings komme ich nicht so weit wie stephanflug im Frühjahr, der ja immerhin irgendwelche Rückgabewerte in einer Systemvariable gesehen hat.

Wenn ich den Skriptschnipsel

Code: Alles auswählen

! Steuern eines Siemens-Webserver OZW 672 (c) by Alchy v0.1
var url = "https://192.168.XXX.XXX/api/auth/login.json?user=homematic&pwd=XXXXXXX";
dom.GetObject("CUxD.CUX2801001:3.CMD_SETS").State("wget -q --no-check-certificate -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801001:3.CMD_QUERY_RET").State(1);
string srueck = dom.GetObject("CUxD.CUX2801001:3.CMD_RETS").State();
if ( (srueck.Find("false") == -1) && (srueck) ) {
string tmpa  = srueck.StrValueByIndex(",",0).StrValueByIndex(":",1);
string sSID = tmpa.Substr(2, tmpa.Length()-3);
WriteLine(" SessionID erfolgreich geholt:"#sSID);
string befehl = "https://192.168.XXX.XXX/api/menutree/read_datapoint.json?SessionId="#sSID#"&Id=1237&Id=2";
!dom.GetObject("CUxD.CUX2801001:4.CMD_EXEC").State("wget -q --no-check-certificate -O - '"#befehl#"'");
dom.GetObject("CUxD.CUX2801001:4.CMD_SETS").State("wget -q --no-check-certificate -O - '"#befehl#"'");
dom.GetObject("CUxD.CUX2801001:4.CMD_QUERY_RET").State(1);
string sback = dom.GetObject("CUxD.CUX2801001:4.CMD_RETS").State();
WriteLine(" Befehl abgesetzt");
WriteLine("Ausgabe: "#sback);
}else{
WriteLine(" Fehler beim Holen der SessionID ");
}
bekomme ich die Meldung " Fehler beim Holen der SessionID ".

Im Browser funktioniert die erste URL und ich bekomme eine Session-ID zurück.

Code: Alles auswählen

{
	
	"SessionId": "4195fb7b-d1df-4af8-926c-90557833027a",
	
    "Result": {
		"Success": "true"
    }
}
Rufe ich die URL per SSH auf der CCU auf:

Code: Alles auswählen

wget  --no-check-certificate -O - "https://192.168.XXX.XXX/api/auth/login.json?user=homematic&pwd=XXXXXXX"
bekomme ich:

Code: Alles auswählen

--2017-12-18 15:04:57--  https://192.168.XXX.XXX/api/auth/login.json?user=homematic&pwd=XXXXXXX
Connecting to 192.168.17.155:443... connected.
OpenSSL: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
Unable to establish SSL connection.
Ein testweiser Aufruf mit curl im cuxd/extras-Verzeichnis liefert mir die gleiche Meldung. Ich vermute mal, die OpenSSL-Version auf der CCU verträgt sich nicht mit den SSL-Bibliotheken auf dem Webserver?

wget auf der CCU hat die Version "GNU Wget 1.13.4 built on linux-gnueabi.". CCU2 ist auf Firmwarestand 2.29.23. CUxD Version 1.12. Der Webserver ist der OZW672.01, Software Version 7.00, build 07.00.21.52. Eine Version der SSL-Bibliotheken habe ich nicht auf Anhieb gefunden.

Scheint ja eher in den Bereich SSL/TLS-Handshake zu gehören.

Jemand eine Idee?

Viele Grüße,

Sebastian

Sechserpack
Beiträge: 83
Registriert: 26.02.2017, 22:31
Hat sich bedankt: 3 Mal
Danksagung erhalten: 2 Mal

Re: Homematic und Siemens Webserver ozw672

Beitrag von Sechserpack » 18.12.2017, 16:52

Hallo zusammen,

gerade gesehen, dass man den Webserver auch auf Port 80 mit einfachem HTTP (ohne -S) ansprechen kann (muss vorher in der Konfiguration aktiviert werden). Ist natürlich nicht so schön und leichter abhörbar, aber zu Testzwecken und im eigenen LAN kann man das ja mal machen.

Also neuer Versuch mit folgendem Skript-Schnipsel:

Code: Alles auswählen

! Steuern eines Siemens-Webserver OZW 672 (c) by Alchy v0.1
var url = "http://192.168.XXX.XXX/api/auth/login.json?user=homematic&pwd=XXXXXX";
dom.GetObject("CUxD.CUX2801001:3.CMD_SETS").State("wget -q  -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801001:3.CMD_QUERY_RET").State(1);
string srueck = dom.GetObject("CUxD.CUX2801001:3.CMD_RETS").State();
if ( (srueck.Find("false") == -1) && (srueck) ) {
string tmpa  = srueck.StrValueByIndex(",",0).StrValueByIndex(":",1);
string sSID = tmpa.Substr(2, tmpa.Length()-3);
WriteLine(" SessionID erfolgreich geholt:"#sSID);
string befehl = "http://192.168.XX.XXX/api/menutree/read_datapoint.json?SessionId="#sSID#"&Id=1200";
!dom.GetObject("CUxD.CUX2801001:4.CMD_EXEC").State("wget -q --no-check-certificate -O - '"#befehl#"'");
dom.GetObject("CUxD.CUX2801001:4.CMD_SETS").State("wget -q -O - '"#befehl#"'");
dom.GetObject("CUxD.CUX2801001:4.CMD_QUERY_RET").State(1);
string sback = dom.GetObject("CUxD.CUX2801001:4.CMD_RETS").State();
WriteLine(" Befehl abgesetzt");
WriteLine("Ausgabe: "#sback);
}else{
WriteLine(" Fehler beim Holen der SessionID ");
}
Liefert dann

Code: Alles auswählen

{
  "sback": "\{\n\t\"Data\": \n\t\t\{\n\t\t\n\t\t\t\"Type\": \"Numeric\",\n\t\t\t\"Value\": \"       21.6\",\n\t\t\t\"Unit\": \"°C\"\n\t\t\n\t\t},\n    \t\"Result\": \n\t\t\{\n\t\t\"Success\": \"true\"\n    \t\t}\n}",
  "srueck": "\{\n\t\n\t\"SessionId\": \"288590e8-f2d6-4a83-befc-2cc75ac8fa5d\",\n\t\n    \"Result\": \{\n\t\t\"Success\": \"true\"\n    }\n}",
  "sessionId": "",
  "befehl": "http:\/\/192.168.XXX.XXX\/api\/menutree\/read_datapoint.json?SessionId=288590e8-f2d6-4a83-befc-2cc75ac8fa5d&Id=1200",
  "tmpa": "\"288590e8-f2d6-4a83-befc-2cc75ac8fa5d\"",
  "httpUserAgent": "",
  "sSID": "288590e8-f2d6-4a83-befc-2cc75ac8fa5d",
  "url": "http:\/\/192.168.XXX.XXX\/api\/auth\/login.json?user=homematic&pwd=XXXXXXXXX",
  "STDOUT": " SessionID erfolgreich geholt:288590e8-f2d6-4a83-befc-2cc75ac8fa5d\r\n Befehl abgesetzt\r\nAusgabe: \{\n\t\"Data\": \n\t\t\{\n\t\t\n\t\t\t\"Type\": \"Numeric\",\n\t\t\t\"Value\": \"       21.6\",\n\t\t\t\"Unit\": \"°C\"\n\t\t\n\t\t},\n    \t\"Result\": \n\t\t\{\n\t\t\"Success\": \"true\"\n    \t\t}\n}\n\r\n"
}
Und ich bekomme tatsächlich den korrekten Wert (21.6) des Parameters 1200 (bei mir Rücklauftemperatur Wärmepumpe) in sback zurück.

Jetzt "nur noch" mehrere Werte in einem Zug abfragen und diese in Systemvariablen schreiben (und dabei das restliche "Geraffel" loswerden). Hat da jemand ein paar Tips für mich?

Viele Grüße,

Sebastian

Antworten

Zurück zu „HomeMatic allgemein“