Heizungssteuerung ROTH Touchline per HTTPMOD Post request

Begonnen von herry, 26 Februar 2015, 19:28:26

Vorheriges Thema - Nächstes Thema

herry

Guten Tag,

ich habe eine Fußbodenheizung der Fa. Roth Modell Touchline. Der Heizkreisverteiler verfügt über einen Webserver über den man mit einem Java-Applet des Herstellers die einzelnen Temperaturen abfragen und auch einstellen kann.
Ich würde gerne die Raumtemperaturen abfragen und in meinem Floorplan darstellen.
Hierfür habe mittels BURP-Suite den POST Request des Java Applets abgefangen und die Daten in der Response erhalten.

Das ganze sieht dann so aus:

Request

POST /cgi-bin/ILRReadValues.cgi HTTP/1.1
Accept-Language: *
Content-Type: text/xml
User-Agent: SpiderControl/1.0 (iniNet-Solutions GmbH)
Cache-Control: no-cache
Pragma: no-cache
Host: 192.168.178.xx
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Proxy-Connection: keep-alive
Content-Length: 812

<body><version>1.0</version><client>IMaster6_21_00</client><client_ver>6.21.0014</client_ver><file_name>roomsovw</file_name><item_list_size>25</item_list_size><item_list><i><n>G1.name</n></i><i><n>G3.TempSIUnit</n></i><i><n>totalNumberOfDevices</n></i><i><n>G0.TempSIUnit</n></i><i><n>G1.RaumTemp</n></i><i><n>CD.upass</n></i><i><n>G2.name</n></i><i><n>G4.TempSIUnit</n></i><i><n>G1.TempSIUnit</n></i><i><n>G3.name</n></i><i><n>G4.RaumTemp</n></i><i><n>G3.WeekProg</n></i><i><n>G4.name</n></i><i><n>G2.WeekProg</n></i><i><n>G2.RaumTemp</n></i><i><n>G0.WeekProg</n></i><i><n>R0.Taupunkt</n></i><i><n>G0.RaumTemp</n></i><i><n>G4.WeekProg</n></i><i><n>R0.Safety</n></i><i><n>G2.TempSIUnit</n></i><i><n>G3.RaumTemp</n></i><i><n>G0.name</n></i><i><n>R0.SystemStatus</n></i><i><n>G1.WeekProg</n></i></item_list></body>


Response

HTTP/1.1 200 OK
Server: Keil-EWEB/2.1
Content-Type: text/html
Cache-Control: no-cache
Connection: close

<body><version>1.0</version><client>IMaster6_21_00</client><client_ver>6.21.0014</client_ver><file_name>roomsovw</file_name><item_list_size>25</item_list_size><item_list><i><n>G1.name</n><v>Gäste WC</v></i><i><n>G3.TempSIUnit</n><v>0</v></i><i><n>totalNumberOfDevices</n><v>5</v></i><i><n>G0.TempSIUnit</n><v>0</v></i><i><n>G1.RaumTemp</n><v>1879</v></i><i><n>CD.upass</n><v>1234</v></i><i><n>G2.name</n><v>Diele</v></i><i><n>G4.TempSIUnit</n><v>0</v></i><i><n>G1.TempSIUnit</n><v>0</v></i><i><n>G3.name</n><v>Küche</v></i><i><n>G4.RaumTemp</n><v>2026</v></i><i><n>G3.WeekProg</n><v>1</v></i><i><n>G4.name</n><v>Büro</v></i><i><n>G2.WeekProg</n><v>1</v></i><i><n>G2.RaumTemp</n><v>2069</v></i><i><n>G0.WeekProg</n><v>1</v></i><i><n>R0.Taupunkt</n><v>0</v></i><i><n>G0.RaumTemp</n><v>2265</v></i><i><n>G4.WeekProg</n><v>1</v></i><i><n>R0.Safety</n><v>0</v></i><i><n>G2.TempSIUnit</n><v>0</v></i><i><n>G3.RaumTemp</n><v>2111</v></i><i><n>G0.name</n><v>Wohnzimmer</v></i><i><n>R0.SystemStatus</n><v>0</v></i><i><n>G1.WeekProg</n><v>1</v></i></item_list></body>



In meiner Raspberry-Shell kann ich die einzelnen Raumtemperaturen auch  mittes cURL Request abfragen.

curl -s -k  -X 'POST' -H 'Content-Type: text/xml' --data-binary $'<body><item_list><i><n>G0.RaumTemp</n></i></item_list></body>' "http://192.168.xx.xx/cgi-bin/ILRReadValues.cgi"

In der Shell bekomme ich dann als Rückgabewert den o.a Body + den Temperaturwert


Wie aber bekomme ich das in FHEM hin?
Ich habe hierzu zunächst mal das Gerät definiert und recht planlos folgendes versucht.

define RothKeller HTTPMOD http://192.168.178.XX/cgi-bin/ILRReadValues.cgi 120
attr RothKeller setHeader1 Content-Type: text/XML
attr RothKeller requestData {<body><item_list><i><n>G0.RaumTemp</n></i></item_list></body>}


Selbst wenn die Abfrage funktionieren würde, würde ja der komplette Body als String übermittelt.
Wie parst man einen solchen String, so dass ich nun den gewünschten Temperaturwert in eine Variable schreibe und diesen im Floorplan darstellen kann?

Die Doku mit Beispielen zu dem Thema habe ich schon gelesen, allerdings finde ich kein Beispiel welches mir hier weiter hilft.


Kann mir hier jemand helfen?

Vielen Dank

Herry



StefanStrobel

Hallo Herry,

Du kannst Dich an dem ersten Beispiel zu HTTPMOD im Wiki orientieren:
http://www.fhemwiki.de/wiki/HTTPMOD
Dort wird auch eine Anfrage gestellt, deren Antwort mehrere Werte enthält.
Zum Parsen definiert man Paare von Regexes und Readings-Namen.

Beispiel:

attr Heizung reading01Regex G1\.RaumTemp<\/n><v>([0-9]+)<
attr Heizung reading01Name WC


Zum Testen kannst Du Deine Response bei einem Online-Regex-Tester reinkopieren und dann die Regexes ausprobieren, beispielsweise bei https://regex101.com/

Gruss
   Stefan

herry

Danke Stefan,

hat alles soweit funktioniert, manchmal steht man trotz Anleitung einfach auf der Leitung.

Ich habe hier jetzt allerdings für jedes reading ein komplett eigenes Device angelegt was irgendwie unschön aussieht und die Fhem config aufbläht. Wenn ich hier einfach mehrer readings in einem Device definiere, weiß ich leider nicht wie ich diese einzeln im Floorplan plaziert bekomme. Ich denke ich muss mir hier das Thema reading Groups nochmal ansehen.

define Roth_Diele HTTPMOD http://192.168.178.32/cgi-bin/ILRReadValues.cgi 120
attr Roth_Diele userattr fp_Erdgeschoss reading01Name reading01Regex requestData requestHeader1 requestHeader2 stateFormat
attr Roth_Diele fp_Erdgeschoss 390,462,3,Roth_Diele,
attr Roth_Diele reading01Name Roth_Diele
attr Roth_Diele reading01Regex G2\.RaumTemp<\/n><v>([0-9]+)<
attr Roth_Diele requestData <body><version>1.0</version><client>IMaster6_21_00</client><client_ver>6.21.0014</client_ver><file_name>roomsovw</file_name><item_list_size>25</item_list_size><item_list><i><n>G1.name</n></i><i><n>G3.TempSIUnit</n></i><i><n>totalNumberOfDevices</n></i><i><n>G0.TempSIUnit</n></i><i><n>G1.RaumTemp</n></i><i><n>CD.upass</n></i><i><n>G2.name</n></i><i><n>G4.TempSIUnit</n></i><i><n>G1.TempSIUnit</n></i><i><n>G3.name</n></i><i><n>G4.RaumTemp</n></i><i><n>G3.WeekProg</n></i><i><n>G4.name</n></i><i><n>G2.WeekProg</n></i><i><n>G2.RaumTemp</n></i><i><n>G0.WeekProg</n></i><i><n>R0.Taupunkt</n></i><i><n>G0.RaumTemp</n></i><i><n>G4.WeekProg</n></i><i><n>R0.Safety</n></i><i><n>G2.TempSIUnit</n></i><i><n>G3.RaumTemp</n></i><i><n>G0.name</n></i><i><n>R0.SystemStatus</n></i><i><n>G1.WeekProg</n></i></item_list></body>
attr Roth_Diele requestHeader1 Content-Type: text/xml
attr Roth_Diele stateFormat {sprintf("Temperatur im der Diele %.0f °C", ReadingsVal($name,"Roth_Diele",0))}



Ein weiteres Problem ist, dass die Temperaturen ohne Komma übertragen werden sprich 20,52 °C werden als 2052 übertragen. Somit habe ich versucht den Wert einfach mittels attr Roth_Diele reading01Expr $val / 100 umzuwandeln.  Wenn ich das  dem o.g Device hinzufüge werden die Daten nicht mehr aktualisiert und das lezte Reading wird im Format 2052 angezeigt. Was mache ich falsch?


StefanStrobel

Hallo herry,

wenn mal was nicht funktioniert, ist es fast immer hilfreich, wenn man per

attr device verbose 5

das Logging hochdreht und dann im Log (z.B. in einem weiteren Fenster mit tail -f logfile) schaut was so kommt. Die Auswertung einer Expr in HTTPMOD sollte da auch geloggt werden.

Gruss
  Stefan

toto1964

Guten Tag zusammen

Zuerst mal Hallo an Alle hier. Tolles Forum. Hier könnte man ja Stunden lesen. ;D

Nun zu diesem Beitrag:

hoch interessant. Bin seit Monaten am selben Problem. Der einzige Unterschied, ich habe die modellgleich Heizsteuerung von Sauter.

burp liefert:
POST /cgi-bin/ILRReadValues.cgi HTTP/1.1
Accept-Language: *
Content-Type: text/xml
User-Agent: SpiderControl/1.0 (iniNet-Solutions GmbH)
Cache-Control: no-cache
Pragma: no-cache
Host: 192.168.1.25
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Proxy-Connection: keep-alive
Content-Length: 1021

<body><version>§1.0§</version><client>§IMaster6_21_00§</client><client_ver>§6.21.0004§</client_ver><file_name>§V_Main§</file_name><item_list_size>§35§</item_list_size><item_list><i><n>§G1.name§</n></i><i><n>§totalNumberOfDevices§</n></i><i><n>§G1.RaumTemp§</n></i><i><n>§CD.uname§</n></i><i><n>§G2.name§</n></i><i><n>§CD.upass§</n></i><i><n>§G3.name§</n></i><i><n>§G3.kurzID§</n></i><i><n>§G4.RaumTemp§</n></i><i><n>§G1.kurzID§</n></i><i><n>§G0.OPMode§</n></i><i><n>§G4.kurzID§</n></i><i><n>§G3.OPMode§</n></i><i><n>§G3.WeekProg§</n></i><i><n>§G2.WeekProg§</n></i><i><n>§G4.name§</n></i><i><n>§R0.Alarm1§</n></i><i><n>§R0.HeatCool§</n></i><i><n>§G2.RaumTemp§</n></i><i><n>§R0.OutTemp§</n></i><i><n>§G0.WeekProg§</n></i><i><n>§R0.Taupunkt§</n></i><i><n>§G0.RaumTemp§</n></i><i><n>§G4.WeekProg§</n></i><i><n>§R0.Safety§</n></i><i><n>§G2.kurzID§</n></i><i><n>§G1.OPMode§</n></i><i><n>§G0.kurzID§</n></i><i><n>§G4.OPMode§</n></i><i><n>§G2.OPMode§</n></i><i><n>§G0.name§</n></i><i><n>§G3.RaumTemp§</n></i><i><n>§R0.SystemStatus§</n></i><i><n>§isMaster§</n></i><i><n>§G1.WeekProg§</n></i></item_list></body>

der Response liefert dann die dazugehörigen Werte.

Als  Skript möchte ich nun die einzelnen Wert auslesen. Da ich blutiger Anfänger bin, weis ich nicht was ich nun mit dem curl Befehl machen soll.
Respektive stelle ich mir das so vor. Folgende Wert der Zeile soll in eine Variabel geschreien werden.
curl -s -k  -X 'POST' -H 'Content-Type: text/xml' --data-binary $'<body><item_list><i><n>G0.RaumTemp</n></i></item_list></body>' "http://192.168.xx.xx/cgi-bin/ILRReadValues.cgi"

gibt mir dann die Temp des Raumes G0. (glaube ich)

Bin ich da total auf dem Holzweg, habt Ihr evtl. einen Ansatz für mich. D
anke und Grüsse
toto

StefanStrobel

Hallo Toto,

Wenn Dein curl Aufruf den richtigen Wert ermittelt, dann kannst Du einfach URL, Header und Post Daten in einem HTTPMOD Device definieren und dann aus der HTTP Response den gesuchten Wert per ReadingName und passender Regex in Fhem Einlesen.
Schau mal im Fhem Wiki und hier im Forum nach ähnlichen Beispielen.

Gruß
      Stefan

pejonp

#6
Zitat von: herry am 03 März 2015, 23:02:27
...
Ich habe hier jetzt allerdings für jedes reading ein komplett eigenes Device angelegt was irgendwie unschön aussieht und die Fhem config aufbläht.
Hallo Herry,

ich würde es so machen. Vielleicht hilft es dir weiter. Es werden nur die Werte ausgelesen.  Für die Darstellung schau mal hier (http://forum.fhem.de/index.php/topic,10303.msg347411.html#msg347411) und folgende Einträge.

#HTTPMOD Test 1
define DataLogger HTTPMOD http://192.168.178.32/cgi-bin/ILRReadValues.cgi 120
attr DataLogger reading01Name Wert_01
attr DataLogger reading01Regex G0.RaumTemp\<\/n\>\<v\>(\d+)
attr DataLogger reading01Expr $val / 100
attr DataLogger reading02Name Wert_02
attr DataLogger reading02Regex G1.RaumTemp\<\/n\>\<v\>(\d+)
attr DataLogger reading02Expr $val / 100
attr DataLogger reading03Name Wert_03
attr DataLogger reading03Regex G2.RaumTemp\<\/n\>\<v\>(\d+)
attr DataLogger reading03Expr $val / 100
attr DataLogger reading04Name Wert_04
attr DataLogger reading04Regex G3.RaumTemp\<\/n\>\<v\>(\d+)
attr DataLogger reading04Expr $val / 100
attr DataLogger room DataLogger
attr DataLogger stateFormat {sprintf("Wert1: %.1f , Wert2 %.1f ", ReadingsVal($name,"Wert_01",0), ReadingsVal($name,"Wert_02",0))}
attr DataLogger verbose 5

define FileLog_DataLogger FileLog ./log/DataLogger-%Y-%m.log DataLogger.*
attr FileLog_DataLogger logtype text
attr FileLog_DataLogger room DataLogger

pejonp
LaCrossGW 868MHz:WT470+TFA+TX37-IT+EMT7110+W136+WH25A HP1003+WH2621
SignalD(CC1101):Bresser+WS-0101(868MHz WH1080)+Velux KLF200+MAX!+HM-MOD-UART:Smoke HM-SEC-SD+VITOSOLIC 200 RESOL VBUS-LAN+SolarEdge SE5K(Modbus)+Sonnen!eco8(10kWh)+TD3511+DRT710M(Modbus)+ZigBee+Z-Wave+MQTT+vitoconnect

Misery

Moin,

da ich selbst den Heizkreisverteiler habe, habe ich durch Google diesen Beitrag gefunden.
Ich habe mein eigenes Programm geschrieben um die Daten an einen MQTT-Broker zu schicken und will dies anderen "Leidensgenossen" nicht vorenthalten. Falls jemand, wie ich, diesen Beitrag mal findet.

https://github.com/misery/HeatingMqttBridge

Viele Grüße