Seite 3 von 3
Re: Ofensteuerung Drooff fire+
Verfasst: 4. Dez 2024 19:54
von nw378
Sooo knapp vor dem Ziel, und dann klappt's immer noch nicht...
Was ich bislang gemacht habe:
Den CURL Befehl kann ich eingrenzen auf:
Code: Alles auswählen
curl 'http://192.168.178.48/php/easpanelW.php' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H 'X-Requested-With: XMLHttpRequest' --data-raw 'Betrieb=3&Leistung=4&Helligkeit=60&Bedienung=1&LED=1&AB=0'
Als nächstes application/xml und text/xml für den Inhaltstyp, um das originale Thing mit einem send-Channel nutzen zu können. Beides klappt nicht.
Dann ein Thing auf Textbasis angelegt:
Code: Alles auswählen
Thing http:url:drooff "Drooff"
baseURL="http://192.168.178.48/",
refresh=10,
timeout=8000,
commandMethod="POST"
] {
Channels:
Type string : command "Kommando" [ stateExtension="php/easpanelW.php/", commandExtension=" -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H 'X-Requested-With: XMLHttpRequest' --data-raw %2$s" ]
}
mit einen
und in einer Rule
Code: Alles auswählen
drooffSend.sendCommand("'Betrieb=3&Leistung=4&Helligkeit=60&Bedienung=1&LED=1&AB=0'")
Klappt auch nicht.
Dritter Ansatz: per sendHttpPostRequest in einer Regel:
Code: Alles auswählen
rule "rule name"
when
Item drooffTest changed
then
val String URL = "http://192.168.178.48/php/easpanelW.php"
var String contenttype = "application/x-www-form-urlencoded; charset=UTF-8"
var String content = "-H 'X-Requested-With: XMLHttpRequest' --data-raw 'Betrieb=3&Leistung=4&Helligkeit=60&Bedienung=1&LED=1&AB=0'"
sendHttpPostRequest(URL, contenttype,content )
end
Wieder ohne Erfolg.
Vielleicht ist auch irgendwo ein Syntaxfehler, aber zumindest VSC hat sich nicht beschwert.
Bliebe noch der Weg über eine Bash-Datei? Wie kann ich denn hier die Parameter Betrieb=... AB=... and die Bash übergeben?
Re: Ofensteuerung Drooff fire+
Verfasst: 4. Dez 2024 20:49
von udo1toni
Es gibt ja zwei Möglichkeiten, entweder direkt über executeCommandLine() oder alternativ über das Exec Binding.
Aus der offiziellen Doku:
Code: Alles auswählen
var ScriptResponse = executeCommandLine(Duration.ofSeconds(60), "path/to/your/script.sh", "xyz", "fred.file");
Es wird
path/to/your/script.sh ausgeführt, dabei werden die beiden Werte
xyz und
fred.file als Parameter übergeben, openHAB wartet bis zu
60 Sekunden auf eine Antwort (sprich: Ende des Scripts), diese Antwort landet in der Variablen
ScriptResponse
Hier werden zwei Parameter übergeben, aber natürlich kann man auch mehr oder weniger Parameter übergeben.
Verwendest Du das exec Binding, so kannst Du nur einen Parameter übergeben, allerdings hindert Dich niemand, diesen Parameter so zu gestalten, dass Du ihn anschließend im Script zerlegen kannst...
Re: Ofensteuerung Drooff fire+
Verfasst: 5. Dez 2024 11:01
von nw378
Heureka, es ist vollbracht.
Was ich nicht wusste, ist, dass der Parameter einfach mit $1 in der Bash übernommen werden kann. Allerdings nicht als '$1' (erster Versuch).
Die '' sind nun Teil des Parameters geworden.
Für die Nachwelt, und - weil Teil 1 der Lösung - Auslesen des Ofens - aus 2021 es von diesem Thread ins ioBroker Forum geschafft hat...
So sieht die Lösung jetzt so aus:
.things (whitelist nicht vergessen!)
Code: Alles auswählen
Thing exec:command:drooff_send "fire+ Kommando" [command="/home/drooff_send.sh %2$s", timeout=5, autorun=true]
drooff_send.sh
Code: Alles auswählen
#!/bin/bash
curl 'http://192.168.178.48/php/easpanelW.php' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H 'X-Requested-With: XMLHttpRequest' --data-raw $1
.items
Code: Alles auswählen
Number firePlus_Betriebsart (gDrooff)
Number firePlus_Bedienung (gDrooff)
Number firePlus_Leistung (gDrooff)
Number firePlus_Helligkeit (gDrooff)
Number firePlus_LED (gDrooff)
Number firePlus_AB (gDrooff)
String firePlus_Command "Command" {channel="exec:command:drooff_send:input"}
.rules
Code: Alles auswählen
rule "drooff: fire+ auslesen"
when
Item firePlusInput received update
then
val strData = newState.toString.replace("\\","#").split("#n")
if(strData.size < 13)
return ;
firePlus_temp.postUpdate(Integer::parseInt(strData.get(5)))
firePlus_schieber.postUpdate(Float::parseFloat(strData.get(6)))
firePlus_pressure.postUpdate(Float::parseFloat(strData.get(7)))
firePlus_status.postUpdate(strData.get(8))
firePlus_Bedienung.postUpdate(Integer::parseInt(strData.get(1)))
firePlus_Betriebsart.postUpdate(Integer::parseInt(strData.get(2)))
firePlus_Leistung.postUpdate(Integer::parseInt(strData.get(3)))
firePlus_Helligkeit.postUpdate(Integer::parseInt(strData.get(4)))
firePlus_LED.postUpdate(Integer::parseInt(strData.get(10)))
firePlus_AB.postUpdate(Integer::parseInt(strData.get(11)))
end
rule "drooff: sende Befehl zu fire+"
when
Member of gDrooff received command
then
val vBetrieb = firePlus_Betriebsart.state.toString
val vLeistung = firePlus_Leistung.state.toString
val vHelligkeit = firePlus_Helligkeit.state.toString
val vBedienung = 1
val vLED = firePlus_LED.state.toString
val vAB = firePlus_AB.state.toString
var strJSON = "'Betrieb=" + vBetrieb + "&Leistung=" + vLeistung + "&Helligkeit=" + vHelligkeit + "&Bedienung=" + vBedienung + "&LED=" + vLED + "&AB=" + vAB + "'"
firePlus_Command.sendCommand(strJSON)
end
Ergebnis in der Sitemap:
drooff.jpg
Bearbeitungszeit (ok, mit Unterbrechung): 4 Jahre.

Re: Gelöst: Ofensteuerung Drooff fire+
Verfasst: 5. Dez 2024 14:00
von udo1toni
Prima
Nächste Woche kommt dann jemand und hat ein Binding dazu...

(weil es doch immer so läuft...)
Re: Gelöst: Ofensteuerung Drooff fire+
Verfasst: 5. Dez 2024 16:22
von nw378
Hehe, die Gefahr ist da.
Aber das Rätsellösen und der Moment, wenn's dann plötzlich klappt, machen ja auch Spaß.
VG
Re: Gelöst: Ofensteuerung Drooff fire+
Verfasst: 16. Mär 2025 12:55
von nw378
Update.
Einfach, weil's so schön funktioniert:
Die Regeln zum Füttern der Items mit den Daten des Ofens habe ich in eine Transformation ausgelagert.
Sieht charmanter aus und da so auch die Verknüpfung über Channels gegeben ist, erscheinen die Items auch in der UI an dem Thing.
Da (inzwischen?) mehrere Parameter beim Script übergeben werden können, reicht ein Skript aus und liefert sowohl Int, Float wie String zurück.
.items:
Code: Alles auswählen
Group gDrooff
//Betrieb, Kommando
Switch drooff_Betrieb
String firePlus_Command "Command" {channel="http:url:drooff:command"}
//Daten
Number:Dimensionless firePlus_Progress {channel="http:url:drooff:input" [profile="transform:JS", toItemScript="drooff.js?part=12&typ=progress"], stateDescription=""[pattern="%.0f %%"]}
Number:Temperature firePlus_temp {channel="http:url:drooff:input" [profile="transform:JS", toItemScript="drooff.js?part=5&typ=float"], unit="°C", stateDescription=""[pattern="%.0f °C"]}
Number:Pressure firePlus_pressure {channel="http:url:drooff:input" [profile="transform:JS", toItemScript="drooff.js?part=7&typ=float"], unit="Pa", stateDescription=""[pattern="%.0f Pa"]}
Number firePlus_schieber {channel="http:url:drooff:input" [profile="transform:JS", toItemScript="drooff.js?part=6&typ=int"], stateDescription=""[pattern="%.0f %%"]}
String firePlus_error {channel="http:url:drooff:input" [profile="transform:JS", toItemScript="drooff.js?part=9&typ=error"]}
String firePlus_Status {channel="http:url:drooff:input" [profile="transform:JS", toItemScript="drooff.js?part=8&typ=status"]}
Number firePlus_Bedienung (gDrooff) {channel="http:url:drooff:input" [profile="transform:JS", toItemScript="drooff.js?part=1&typ=int"]}
Number firePlus_Betriebsart (gDrooff) {channel="http:url:drooff:input" [profile="transform:JS", toItemScript="drooff.js?part=2&typ=int"]}
Number firePlus_Leistung (gDrooff) {channel="http:url:drooff:input" [profile="transform:JS", toItemScript="drooff.js?part=3&typ=int"]}
Number firePlus_Helligkeit (gDrooff) {channel="http:url:drooff:input" [profile="transform:JS", toItemScript="drooff.js?part=4&typ=int"]}
Number firePlus_LED (gDrooff) {channel="http:url:drooff:input" [profile="transform:JS", toItemScript="drooff.js?part=10&typ=int"]}
Number firePlus_AB (gDrooff) {channel="http:url:drooff:input" [profile="transform:JS", toItemScript="drooff.js?part=11&typ=int"]}
drooff.js:
Code: Alles auswählen
(function(input) {
let data = input.replaceAll('\\n','#').split('#');
if(data.size = 13)
switch (typ) {
case "float" : return parseFloat(data[part]);
case "int" : return parseInt(data[part]);
case "string" : return (data[part]);
case "progress" : return (parseFloat(data[part])/8.7);
case "error" :
switch (data[part]) {
case "0": return "ok";
case "1": return "Temperaturfühler defekt?";
case "2": return "Feinzugmessung defekt?";
case "3": return "Luftschieber defekt?";
case "4": return "Wahlschalter?";
case "5": return "Kaminzug?";
case "6": return "Luftschieber klemmt?";
case "7": return "Temperaturfühler defekt?";
case "8": return "Temperaturfühler defekt?";
case "9": return "Kein Zug im Kamin!";
}
case "status" :
switch (data[part]) {
case "aus" : return "aus";
case "Violett" : return "Glut erhalten";
case "Orange" : return "Glutabbrand";
case "Gruen blinkt" : return "Anheizen";
case "Gruen" : return "Regelbetrieb";
case "Gelb" : return "Holz nachlegen";
case "Gelb blinkt" : return "Holz nachlegen";
}
}
})(input)
Re: Gelöst: Ofensteuerung Drooff fire+
Verfasst: 17. Mär 2025 09:59
von udo1toni
Re: Gelöst: Ofensteuerung Drooff fire+
Verfasst: 17. Mär 2025 10:56
von nw378
Kann sein.
Ich gebe zu, da hat es mein innerer Monk auf die Spitze getrieben. (Es lief ja vorher auch schon reibungslos...)
Aber jetzt mit dem Script und der Kommunikation in beiden Richtung über das http Thing ist das Ding nun wirklich fertigoptimiert.
Den letzten Beitrag habe ich hier nur platziert, falls mal jemand über ähnliche Baustellen stolpert. Ich hole mir hier auch immer gerne Inspirationen.
Re: Gelöst: Ofensteuerung Drooff fire+
Verfasst: 17. Mär 2025 23:16
von udo1toni
Ja, prima. Dann ist der Link auch gut, um die Kommunikationsebene über Thing im Zusammenhang zu haben...