Gelöst: Ofensteuerung Drooff fire+

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

nw378
Beiträge: 297
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: Ofensteuerung Drooff fire+

Beitrag von nw378 »

Sooo knapp vor dem Ziel, und dann klappt's immer noch nicht... :roll:

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

Code: Alles auswählen

String    drooffSend  {channel="http:url:drooff:command"} 
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?
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

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

Re: Ofensteuerung Drooff fire+

Beitrag 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...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

nw378
Beiträge: 297
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: Ofensteuerung Drooff fire+

Beitrag 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. :D :D :D
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

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

Re: Gelöst: Ofensteuerung Drooff fire+

Beitrag von udo1toni »

Prima :)

Nächste Woche kommt dann jemand und hat ein Binding dazu... :lol: (weil es doch immer so läuft...)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

nw378
Beiträge: 297
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: Gelöst: Ofensteuerung Drooff fire+

Beitrag 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
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

nw378
Beiträge: 297
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: Gelöst: Ofensteuerung Drooff fire+

Beitrag 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)
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

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

Re: Gelöst: Ofensteuerung Drooff fire+

Beitrag von udo1toni »

openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

nw378
Beiträge: 297
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: Gelöst: Ofensteuerung Drooff fire+

Beitrag von nw378 »

Kann sein. :oops: :lol:

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.
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

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

Re: Gelöst: Ofensteuerung Drooff fire+

Beitrag von udo1toni »

Ja, prima. Dann ist der Link auch gut, um die Kommunikationsebene über Thing im Zusammenhang zu haben...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten