XML per http Post ändern

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
maddin2020
Beiträge: 26
Registriert: 29. Sep 2019 11:21

XML per http Post ändern

Beitrag von maddin2020 »

Hallo der Winter kommt nun und ich hänge fest. Kann sich jemand das einmal anschauen wie ich an eine per http Post command in eine XML Datei die auf dem Heizungscontroller liegt einen Bereich verändern kann.

Zur Zeit sieht es so aus

http.cfg

Code: Alles auswählen

 HeizungUGsend.url=http://192.168.178.205/data/changes.xml

    HeizungUGsend.updateInterval=1000
Items

Code: Alles auswählen

Number SollTempWohnTest " Solltemperatur WohnTest [%.1f °C]" <temp_control> 
{http=">[*:POST:HeizungUGsend:10000:XPATH(/Devices/Device/HEATAREA[@nr='1']/T_TARGET/text())]"}
Sitemap

Code: Alles auswählen

Setpoint item=SollTempWohnTest label=“Test” step=0.2 minValue=22.0 maxValue=25.0
Bisher klappt es aber nicht hat jemand ein Tip für mich
Zuletzt geändert von maddin2020 am 2. Okt 2019 14:40, insgesamt 1-mal geändert.

Benutzeravatar
udo1toni
Beiträge: 13859
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: XML per http Post ändern

Beitrag von udo1toni »

Bitte markiere Code, Konfigurationen, Logs und allgemein Dinge, die von der Text Konsole kommen, immer als Code (nicht als Zitat!), da die Forensoftware ansonsten eventuell Änderungen am Text vornimmt (z.B. :) statt : ) ohne Leerzeichen dazwischen).
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

maddin2020
Beiträge: 26
Registriert: 29. Sep 2019 11:21

Re: XML per http Post ändern

Beitrag von maddin2020 »

Hi Udo, Danke für die Info hab es direkt geändert. Kannst du mir dort vielleicht weiterhelfen. Ich habe schon sämtliche Anleitungen durch und komme einfach dort nicht weiter.

Benutzeravatar
udo1toni
Beiträge: 13859
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: XML per http Post ändern

Beitrag von udo1toni »

Super, das ist schon viel besser.

Du hast im Label keinen Platzhalter für den Wert. Entferne einfach mal das label="Test"

Code: Alles auswählen

Setpoint item=SollTempWohnTest step=0.2 minValue=22.0 maxValue=25.0
Hast Du mal ein Sample, was konkret von der Adresse geliefert wird?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

maddin2020
Beiträge: 26
Registriert: 29. Sep 2019 11:21

Re: XML per http Post ändern

Beitrag von maddin2020 »

Hi danke Udo das du mir hilfst. Hänge echt schon lang daran fest. Also ich habe Fussbodenheizungscontroller von Moehlenhoff.

Auf diesem Controller gibt es XML Dateien die eine Anbindung an Openhab ermöglichen. Die XML Datei changes.xml dient dazu die Daten zu verändern.
Hier ein Auszug aus der Anleitung
Befehle an die Basis senden
Befehle werden immer als XML Datei an die Basis gesendet. Per http post wird der XML-Befehl an die URL: http ://<IP>/data/changes.xml gesendet. Der Inhalt der changes.xml ist prinzipiell immer, der entsprechende Ausschnitt aus der static.xml. Alle Einstellungen, die über das standardmäßig integrierte Webfrontend ( http ://<IP>) verändert werden können, sind auch Bestandteil des Befehlsschatzes der XML Schnittstelle.
Vom Aufbau sieht das ganze dann so aus das ich z.B. um die Solltemperatur in einem Raum verändern möchte das ich den Text zwischen den zwei Felder T_Target als Text verändern möchte. Im Openhab ist es aber als Number bzw. Setpoint deklariert. Ich vermute dort liegt das Problem.

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?> <Devices> <Device> <ID>EZR010A49</ID> <HEATAREA nr="1"> <T_TARGET>20.6</T_TARGET> </HEATAREA> </Device> </Devices>

Auslesen kann ich die aktuelle Ist und Solltemperatur schon länger aus der XML Datei und folgendem Befehl daher dachte ich es geht auch so einfach reinzuschreiben.

Code: Alles auswählen

Number IstTempWohnzimmer " Isttemperatur Wohnzimmer[%.1f °C]"  {http="<[HeizungUG:10000:XPATH(/Devices/Device/HEATAREA[@nr='1']/T_ACTUAL/text())]"} 
Hoffe ich habe es einigermaßen erklären können.


EDIT: Ich habe gerade noch gelesen das ich die ID bei Befehlen in die Changes.xml mitsenden muss wie bekomme ich die in meine XPATH Anweisung mit rein.

so vielleicht ??

Code: Alles auswählen

Number SollTempWohnTest " Solltemperatur WohnTest [%.1f °C]" <temp_control> 
{http=">[*:POST:HeizungUGsend:10000:XPATH(/Devices/Device/ID[@EZR010A49]/HEATAREA[@nr='1']/T_TARGET/text())]"}
Danke für die Hilfe schätze das sehr
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
udo1toni
Beiträge: 13859
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: XML per http Post ändern

Beitrag von udo1toni »

Ah, Du möchtest XPATH als Output verwenden. Ich fürchte, das geht nicht. Du wirst stattdessen eine Rule verwenden müssen, die bei Änderung des Items den http Request absetzt.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

maddin2020
Beiträge: 26
Registriert: 29. Sep 2019 11:21

Re: XML per http Post ändern

Beitrag von maddin2020 »

Ok danke für den Hinweis heißt die Rule sollte ungefähr so aussehen

Items

Code: Alles auswählen

Number      SollTempWohnTest         " Solltemperatur WohnTest [%.1f °C]"           <temp_control> 
Sitemap

Code: Alles auswählen

Setpoint item=SollTempWohnTest label="Test" step=0.2 minValue=22.0 maxValue=25.0

Code: Alles auswählen

var XMLString = "<?xml version="1.0" encoding="UTF-8"?> <Devices> <Device> <ID>EZR010A49</ID> <HEATAREA nr="1"> <T_TARGET>20.6</T_TARGET> </HEATAREA> </Device> </Devices>"


rule "Solltemperatur Wohnzimmer"
when
Item SollTempWohnTest changed
then
sendHttpPostRequest(http://192.168.178.29/data/changes.xml, “application/xml”, XMLString)
logInfo("Heizung","Neuer Sollwert Wohnzimmer")
end
Aber wie bekomme ich jetzt das Item "SollTempWohnTest" in den XML String und passt dass sonst so ?

Benutzeravatar
udo1toni
Beiträge: 13859
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: XML per http Post ändern

Beitrag von udo1toni »

Du musst die Variable XMLString dynamisch füllen, am einfachsten, indem Du den String in zwei Teile aufteilst, eben den Teil vor dem Wert und den Teil hinter dem Wert. Anschließend baust Du den String zusammen, also ungefähr so:

Code: Alles auswählen

rule "Solltemperatur Wohnzimmer"
when
    Item SollTempWohnTest changed
then
    logInfo("Heizung","Neuer Sollwert Wohnzimmer: {}°C",SollTempWohnTest.state)
    val String strXML1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <Devices> <Device> <ID>EZR010A49</ID> <HEATAREA nr=\"1\"> <T_TARGET>"
    val String strXML2 = "</T_TARGET> </HEATAREA> </Device> </Devices>"
    sendHttpPostRequest(http://192.168.178.29/data/changes.xml, "application/xml", strXML1 + SollTempWohnTest.state.toString + strXML2)
end
Man beachte auch das Escapen der Anführungszeichen... ;)
Die fixen Strings kann man wunderbar als Konstante (val statt var) definieren. Da diese Strings sich ausschließlich auf dieses eine Gerät beziehen kann (die ID ist mit eingebaut) ist es sinnlos, sie außerhalb der Rule zu definieren.
Natürlich kannst Du die ID ebenfalls auslagern (ebenso wie die Heatarea), nach dem gleichen Schema wie die Temperatur.

dann böte es sich allerdings an, alle Solltemperaturen in einer Gruppe zusammenzufassen und die IDs sowie die Heatareas in einer Hashmap zu hinterlegen. Dann kann man die Rule so allgemein gestalten, dass alle Thermostaten individuell gesetzt werden, durch nur eine einzige Rule.

Ich nutze knx, aber das Prinzip ist ähnlich.

Folgende Rule verwende ich, um die Betriebsarten zu setzen. Dabei passt die Rückmeldung von knx nicht exakt zum Steuerbefehl, also brauche ich eine Rule, um das passende Item korrekt zu setzen.

Code: Alles auswählen

rule "Betriebsart RTR"
 when
	Member of GHeat_Mode changed
 then
	var Integer newMode 
	val mode = (triggeringItem.state as DecimalType).toBigDecimal.toBigInteger
	val iName = triggeringItem.name.split("_").get(0).toString
	logDebug("rtr","Name is: {}, Mode is: {}",iName,mode)
	switch (mode) {
		case mode.testBit(0) : newMode = 1
		case mode.testBit(2) : newMode = 3
		case mode.testBit(3) : newMode = 4
		default : newMode = 2
	}
	var myItem = GHeat_Set.members.filter[ f | f.name.startsWith(iName) ].head
	var Integer oldMode = 0
	if(myItem.state instanceof Number) oldMode = (myItem.state as Number).intValue
	if(oldMode != newMode) {
		logDebug("rtr","Name is: {}, oldMode is: {}, newMode is: {}",myItem.name,oldMode,newMode)
		myItem.postUpdate(newMode)
	}	
end
Die rule triggert auf alle Items, die sich in der Gruppe GHeat_Mode befinden (das ist die Rückmeldung der Betriebsart). Es wird der rückgemeldete wert bestimmt, und um welchen Thermostaten es sich handelt.
Anschließend prüft die Rule, ob die gemeldete Betriebsart zur angezeigten Betriebsart passt, falls nicht, korrigiert sie die angezeigte Betriebsart.

Die wesentlichen Punkte sind also, alle Items der einen Seite und alle Items der anderen Seite in zwei Gruppen zusammenzufassen. Dabei sollten die Namen so gewählt werden, dass der Name des zu steuernden Items aus dem triggernden Item "errechnet" werden kann.
In Deinem Fall müsstest Du über eine Hashmap die passende ID und die korrekte Heatarea bestimmen, um den nötigen String zu errechnen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

maddin2020
Beiträge: 26
Registriert: 29. Sep 2019 11:21

Re: XML per http Post ändern

Beitrag von maddin2020 »

Hi danke Udo nun funktioniert ! Danke vielmals für deine Hilfe :D

Beasty
Beiträge: 10
Registriert: 15. Mai 2022 23:20

Re: XML per http Post ändern

Beitrag von Beasty »

Hallöchen!
Ich habe hier auch zwei Möhkenhoff Steuerelemente für die Regelung der Fußbodenheizung.
Ich habe schon viel gesucht, aber keine Anleitung gefunden, wie man die Dinger in OpenHab einbindet. Kann mir jemand einen Schubs in die richtige Richtung geben? Bin leider noch ziemlicher Anfänger... Auslesen der Temperatur würde mir vielleicht erstmal reichen ;)

LG Sebastian

Antworten