Ankündigung

Einklappen
Keine Ankündigung bisher.

HTTP Binding unter OH3

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    HTTP Binding unter OH3

    Hallo,
    ich habe folgendes Problem.
    Ich bin von OH2.5 auf 3.2 umgestiegen und nun hat sich ja das HTTP Binding verändert.
    Ich möchte von OH3.2 auf meine Comexio Heizungssteuerung zugreifen und Statusabfragen lesen, sowie Einstellungen über OH3 tätigen.
    Der Comexio Server nimmt anfragen an, die so aufgebaut sein müssen:

    Abfrage:
    http://192.168.178.230/api/?action=get&marker=M53
    Hier wird der Merker M35 gelesen.

    Schreiben:
    http://192.168.178.230/api/?action=s...er=M53&value=1
    Hier wird dem Merker der Zustand "1" zugeordnet.

    Wie kann man das am besten mit dem neuen Binding lösen?

    Lesen geht. Dazu habe ich ein Things angelegt:

    Thing http:url:Comexio_abfragen "Comexio abfragen" [ baseURL="http://192.168.178.230/", refresch=30, timeout=3000, commandMethod="GET", delay=1000] {
    Channels:
    Type number : Speicher_oben [ stateExtension="api/?action=get&marker=M1", commandExtension="REGEX(.*)"]
    Type number : Speicher_Bereitschaft [ stateExtension="api/?action=get&marker=M2", commandExtension="REGEX(.*)"]
    Type number : abfrage_PV_Freigabe [ stateExtension="api/?action=get&marker=M53", commandExtension="REGEX(.*)"]
    Type number : abfrage_PV_ein [ stateExtension="api/?action=get&marker=M157", commandExtension="REGEX(.*)"]
    }

    und unter Items folgendes item:

    Number Heizung_Speicher_oben "Oben [%.1f °C]" <heating> {channel="http:url:Comexio_abfragen:Speicher_oben" }
    Number Heizung_Speicher_Bereitschaft "Bereitschaft [%.1f °C]" <heating> {channel="http:url:Comexio_abfragen:Speicher_Berei tschaft"}
    Number Heizung_abfrage_PV_Freigabe "PV Heizung Freigabe [%f]" <heating> {channel="http:url:Comexio_abfragen:abfrage_PV_Fre igabe"}
    Number Heizung_abfrage_PV_ein "PV Heizung ein [%f]" <heating> {channel="http:url:Comexio_abfragen:abfrage_PV_ein "}

    Aber wie schreibe ich nun meine eigenen Werte zurück?
    Mein Test geht nicht:

    Thing http:url:Comexio_steuern "Comexio steuern" [ baseURL="http://192.168.178.230/", commandMethod="PUT", delay=1000] {
    Channels:
    Type string : HZ_Vorlauf_Pumpe_send [ stateContent="api/?action=set&marker=M49", onValue= "&value=1", offValue= "&value=0"]
    Type string : HZ_PV_send [ stateContent="api/?action=set&marker=M53", onValue= "&value=1", offValue= "&value=0"]
    }

    Switch HZ_Vorlauf_Pumpe "Vorlaufpumpe" (gHeizung_alle) {channel="http:url:Comexio_steuern:HZ_Vorlauf_Pump e_send"}
    Switch HZ_PV "PV Heizung Freigabe" (gHeizung_alle) {channel="http:url:Comexio_steuern:HZ_PV_send"}

    Könnte mir da jemand einen Tipp geben?

    Besten Dank
    Zuletzt geändert von meins0273; 28.12.2021, 12:47.

    #2
    Ich versuche mal mein Glück, wobei ich keine Gewähr geben kann, da ich das Heizungssystem nicht kenne.


    Vorab mal zum lesenden Teil: (Auch wenn der laut aussage funktioniert)
    Wo hast du denn dein Beispiel für die Thing Konfiguration her bzw. warum verwendest du eine commandExtension bei Werten die du nur lesen/abfragen möchtest?

    commandExtension ist nur zum senden von Kommandos (also Befehlen) notwendig.
    Nach offizieller Doku (https://www.openhab.org/addons/bindings/http/#channels) ist das optional und wird mit der URL von stateExtension überschrieben, wenn man es nicht setzt.

    Das würde ich daher schon mal bei dem Abfrage-Thing rauswerfen, um der Übersichtlichkeit willen.



    Damit dann auch zum Schreiben-Part:
    Punkt 1 der mir auffällt:
    Wie kommst du hier auf commandMethod="PUT"?
    Hier hätte ich deiner URL nach ein GET als Parameter erwartet.
    (Das hat nichts mit dem action=get zu tun, was du weiter oben eingibst, sondern ist spezifisch zum HTTP Standard.)


    Punkt 2: (Hier ist der Part von den Abfragewerten oben indirekt ebenfalls von Interesse.)

    Ich vermute dass die Vorlaufpumpe und die PV Heizungsfreigabe nicht nur befehle erhalten, sondern auch mit einer anderen action an die Heizung abgefragt werden können oder?
    Vorausgesetzt dem ist so, wäre es sinnvoll dem Thing sowohl eine stateExtension, als auch eine CommandExtension zu vergeben.
    Damit weiß openhab auch, ob aktuell EIN oder AUS ist.
    (Das wäre zum Beispiel bei einem Neustart ja spannend, wenn openHAB das erst nach dem ersten Befehl selbst mitspeichert.)

    Anbei mal ein Beispiel wie das aussehen könnte für ein schreibendes Thing:

    Code:
    // commandMethod habe ich weg gelassen, da das der Default Wert ist
    Thing http:url:Comexio_steuern "Comexio steuern" [ baseURL="http://192.168.178.230/", delay=1000] {
        Channels:
                                                 // aktueller Pumpenstatus                   // URL für das senden eines Wertes bis zum Wert selbst 
            Type string : HZ_Vorlauf_Pumpe_send [ stateExtension="api/?action=get&marker=M49", commandExtension="api/?action=set&marker=M49&value=", onValue="1", offValue="0"]
    }

    Kommentar


      #3
      Hallo Confectrician,

      vielen Dank für deine Antwort.

      So den ersten Teil habe ich so wie von dir angegeben abgeändert.
      Funktioniert gut.

      Thing http:url:Comexio_abfragen "Comexio abfragen" [ baseURL="http://192.168.178.230/", refresch=30, timeout=3000, commandMethod="GET", delay=1000] {
      Channels:
      Type number : Speicher_oben [ stateExtension="api/?action=get&marker=M1"]
      Type number : Speicher_Bereitschaft [ stateExtension="api/?action=get&marker=M2"]
      Type number : Speicher_mitte [ stateExtension="api/?action=get&marker=M4"]
      Type number : Speicher_unten [ stateExtension="api/?action=get&marker=M5"]
      Type number : Aussenfuehler [ stateExtension="api/?action=get&marker=M6"]
      Type number : Ofen_Ruecklauf [ stateExtension="api/?action=get&marker=M10"]
      Type number : Ofen_Vorlauf [ stateExtension="api/?action=get&marker=M11"]
      Type number : Vorlauf_ist [ stateExtension="api/?action=get&marker=M7"]
      Type number : Vorlauf_soll [ stateExtension="api/?action=get&marker=M47"]
      Type number : Vorlauf_soll_min [ stateExtension="api/?action=get&marker=M41"]
      Type number : Vorlauf_soll_max [ stateExtension="api/?action=get&marker=M42"]
      Type number : abfrage_Vorlauf_Pumpe [ stateExtension="api/?action=get&marker=M49"]
      Type number : abfrage_PV_Freigabe [ stateExtension="api/?action=get&marker=M53"]
      Type number : abfrage_PV_ein [ stateExtension="api/?action=get&marker=M157"]
      Type number : abfrage_Raumheizung_Freigabe [ stateExtension="api/?action=get&marker=M51"]
      Type number : abfrage_Raumheizung_ein [ stateExtension="api/?action=get&marker=M158"]
      Type number : abfrage_Heizstab_Freigabe [ stateExtension="api/?action=get&marker=M143"]
      Type number : abfrage_Heizstab_ein [ stateExtension="api/?action=get&marker=M188"]
      Type number : abfrage_Pellet_Freigabe [ stateExtension="api/?action=get&marker=M136"]
      Type number : abfrage_ofen_Fehler [ stateExtension="api/?action=get&marker=M137"]
      Type number : abfrage_Pellet_ein [ stateExtension="api/?action=get&marker=M130"]
      Type number : abfrage_Ofen_Pumpe [ stateExtension="api/?action=get&marker=M134"]
      Type number : abfrage_Zirkulation [ stateExtension="api/?action=get&marker=M512"]
      Type number : Winterbetreib_abfragen [ stateExtension="api/?action=get&marker=M156"]
      }

      Nur das setzten geht nicht:
      Er macht da überhaupt nichts. Weder bekomme ich eine Status angezeigt, noch wird etwas an die Steuerung gesendet :-(

      Thing http:url:Comexio_steuern "Comexio steuern" [ baseURL="http://192.168.178.230/", delay=1000] {
      Channels:
      Type string : n_abfrage_ofen_Fehler [ stateExtension="api/?action=get&marker=M137", commandExtension="api/?action=set&marker=M137&value=", onValue="1", offValue="0"]
      }


      Super wäre natürlich wenn man mit dem gleichen Item den Status angezeigt bekommt und den Status auch ändern kann.

      Hast Du vielleicht noch einen Tipp für mich.

      Danke und Gruß

      Kommentar


        #4
        Gar nicht so einfach das auf dem Blatt Papier zu debuggen.
        Ich glaube es liegt hieran: https://www.openhab.org/addons/bindi...url-formatting
        Wir haben dem Thing noch nicht gesagt, an welche Stelle von dem Link er Wert 1 oder 0 gesetzt werden soll.

        Wenn ich recht haben sollte, könnte es mal mit dem %2$s in der commandExtension funktionieren.

        Beispiel: (Mit dem # Button im Editor kannst du auch solche Code-Blöcke verwenden. Das ist deutlich lesbarer.)

        Code:
        Thing http:url:Comexio_steuern "Comexio steuern" [
               baseURL="http://192.168.178.230/",
              delay=1000
        ] {
          Channels:
            Type string : n_abfrage_ofen_Fehler [
              stateExtension="api/?action=get&marker=M137",
              commandExtension="api/?action=set&marker=M137&value=%2$s",
              onValue="1",
              offValue="0"
            ]
        }

        Spricht eigentlich was dagegen, dass über die Oberfläche einzurichten?
        (Ich weiß, ist unter hartgesottenen Usern sehr verpönt. Ich betreibe aus nostalgischen Gründen auch einen gesunden MischMasch aus beiden formen.)

        Ich hab die HTTP Things alle direkt über die UI eingerichtet und das war problemlos.
        Ich hab aber glaube bisher auch keine Commands senden dürfen.
        Ich frage nur die Rheinpegel hier in der Gegend ab.

        Kommentar


          #5
          Super, schon wieder etwas weiter.

          Die Meldung kommt jetzt in Openhab an. Switch wird eingeschaltet.
          Leider geht aber die Richtung zur Comexio noch nicht. Da wird nichts versendet. Oder der String ist nicht richtig.

          Wenn es einfacher geht, mache ich es auch über die UI. Aber da kenne ich mich noch weniger aus :-(

          Besten Dank.



          Kommentar


            #6
            Gibt es denn von der Comexio api eine Doku online?
            Vielleicht braucht die Steuerung doch eine andere http Methode, als ich angenommen habe.

            Kommentar


              #7
              Hier die Info die ich im Handbuch gefunden habe:

              Der Zugriff erfolgt über http-Requests (http-get). Sie können die Funktion einfach testen, indem Sie die Befehle in der Addressleiste eines Browsers eingeben. Ein Befehl hat folgende Form:
              http://<Comexio-Ip>/api/?action=<Aktion>&<Datenpunkt>&value=<Wert>
              Dabei ist <Comexio-Ip> die Ip-Adresse Ihres Comexio Servers. Für die <Aktion> sind folgende Werte zugelassen: get für das Lesen von Werten und set für das Schreiben von Werten. Welcher Wert geschrieben werden soll, wird über ...&value=<Wert> festgelegt. Beim Lesen kann dieser Teil des Aufrufes weggelassen werden. Bei Zahlen muss für Nachkommastellen als Seperator ein Punkt anstelle eines Kommas verwendet werden, also 3.14 anstatt 3,14. Die Datenpunkte können wie folgt verwendet werden:
               Ein und Ausgänge: ext=<Gerät>&io=<Ein/Ausgang> Dabei ist <Gerät> der Name der Erweiterung und <Ein/Ausgang> der Eingang bzw. Ausgang der ausgelesen werden soll z.B. I1.
               Merker: marker=<id> Dabei ist <id> die Id des Merkers z.B. M1.
               1-Wire: onewire=<id> Dabei ist <id> die Comexio Id des 1-Wire Gerätes z.B. OT1.
              Rückgabewerte
              Erfolgreicher Aufruf
              Bei einem lesenden Zugriff wird der Wert des Datenpunktes zurückgegeben. Bei digitalen Datenpunkten steht eine 0 für false bzw. off und eine 1 für true bzw. on.
              COMEXIO Handbuch Seite 87
              Bei erfolgreichen Schreiben wird eine 0 oder eine 1 zurückgegeben. Die Eins gibt dabei an, ob sich durch die Wertänderung der Zustand eines Ausgangs geändert hat.
              Fehlermeldungen
               Action invalid : Die Aktion ist ungültig, also weder get noch set.
               Invalid Element : Der angegeben Datenpunkt wurde nicht gefunden, obwohl der Datenpunktselektor korrekt ist.
               Forbidden : Der Datenpunkt ist nicht für diese Aktion freigegeben
               No Datapoint : Der Datenpunkt existiert nicht.
              Beispiele
              http://192.168.1.254/api/?action=get...O-Server&io=I1 Liest den Eingang I1 von der Erweiterung „IO-Server“ von dem Gerät mit der Ip-Adresse 192.168.1.254.
              http://192.168.1.254/api/?action=set...&io=Q1&value=1 Setzt den Ausgang Q1 von der Erweiterung „Extension1“ von dem Gerät mit der Ip-Adresse 192.168.1.254 auf 1 (Schaltet das Relais an)
              http://192.168.1.254/api/?action=set...=M1&value=17.5 Setzt den Merker auf den Wert 17,5. Ist der Merker auf Analog gestellt wird diesem dieser Wert zugewiesen, ist der Merker auf Digital gestellt, dann wird der Wert gerundet. Hier hat er dann den Wert Logisch 1 ( = true ).
              http://192.168.1.254/api/?action=get&onewire=OT1 Liest den Wert des 1-Wire Temperatursensors OT1.

              Und wie gesagt, unter 2.5 hat es mit dem zugriff geklappt.

              Besten Dank für deine Mühe.

              Kommentar


                #8
                Vielleicht mache ich auch einen Grundlegenden Fehler:

                Die Things Datei:

                Code:
                Thing http:url:Comexio_steuern "Comexio steuern" [ baseURL="http://192.168.178.230/", delay=1000] {
                    Channels:
                    Type number : s_abfrage_ofen_Fehler [ stateExtension="api/?action=get&marker=M137"
                    , commandExtension="api/?action=set&marker=M137&value=%2$s"
                    , onValue="1", offValue="0"]
                }
                die Items Datei:

                Code:
                Switch    s_HZ_ofen_Fehler         "Ofen Fehler"       {channel="http:url:Comexio_steuern:s_abfrage_ofen_Fehler"}
                Die Sidemap:

                Code:
                Default item=s_HZ_ofen_Fehler
                Würde das im Grunde so passen?

                Dann müsste er doch bei jeder Änderung des Switches die Daten an den Comexio senden.
                Wenn ich in Comexio den Flag ändere, ändert sich der Switch in Openhab. Also geht die Leseeinheit.
                Zuletzt geändert von meins0273; 30.12.2021, 10:11.

                Kommentar


                  #9
                  Hast du zu genau dem item noch die alte config aus dem openHAB 2 dass man das mal vergleichen kann?
                  Ich sehe da gerade den Fehler auch nicht. (In der Sitemap könntest du nen Switch statt default nehmen, aber das sollte auch so erst mal funktionieren.)

                  Kommentar


                    #10
                    ZB. so:

                    Code:
                    Switch    HZ_Vorlauf_Pumpe    "Vorlaufpume"   {http=">[ON:GET:http://192.168.178.230/api/?action=set&marker=M49&value=1] >[OFF:GET:http://192.168.178.230/api/?action=set&marker=M49&value=0]"}
                    Habe ich in der "Switch/Number" Definition ein Problem?

                    Kommentar


                      #11
                      Frohes neues Jahr allen zusammen.


                      Hier die Definition von OH2.5:

                      Schreiben:
                      Code:
                      Switch HZ_Vorlauf_Pumpe "Vorlaufpume" (gHeizung_alle) { http=">[ON:GET:http://192.168.178.230/api/?action=set&marker=M49&value=1] >[OFF:GET:http://192.168.178.230/api/?action=set&marker=M49&value=0]" }
                      Switch HZ_PV "PV Heizung Freigabe" (gHeizung_alle) { http=">[ON:GET:http://192.168.178.230/api/?action=set&marker=M53&value=1] >[OFF:GET:http://192.168.178.230/api/?action=set&marker=M53&value=0]" }
                      Lesen:
                      Code:
                      Number Heizung_Speicher_oben "Oben [%.1f °C]" <heating> (gHeizung_alle, gWasserspeicher,cTEmp_Speicher) { http="<[http://192.168.178.230/api/?action=get&marker=M1:10000:REGEX((.*))]" }
                      Number Heizung_Speicher_Bereitschaft "Bereitschaft [%.1f °C]" <heating> (gHeizung_alle, gWasserspeicher, cTEmp_Speicher) { http="<[http://192.168.178.230/api/?action=get&marker=M2:10000:REGEX((.*))]" }
                      Zuletzt geändert von meins0273; 01.01.2022, 14:30.

                      Kommentar


                        #12
                        Ausprobieren kann ich das natürlich nicht, aber nach meinem Verständnis müsste die Konfiguration so aussehen:

                        Code:
                        Thing http:url:Comexio "Comexio" [ baseURL="http://192.168.178.230/api/?action=",
                                                           delay=1000,
                                                           refresh=10
                                                         ] {
                            Channels:
                            Type number : ChM1   [stateExtension="get&marker=M1"]
                            Type number : ChM2   [stateExtension="get&marker=M2"]
                            Type switch : ChM49  [ stateExtension="get&marker=M49", commandExtension="set&marker=M49&value=%2$s", onValue="1", offValue="0"]
                            Type switch : ChM53  [ stateExtension="get&marker=M53", commandExtension="set&marker=M53&value=%2$s", onValue="1", offValue="0"]
                            Type switch : ChM137 [ stateExtension="get&marker=M137", commandExtension="set&marker=M137&value=%2$s", onValue="1", offValue="0"]
                        }
                        Code:
                        Switch HZ_Vorlauf_Pumpe "Vorlaufpume" (gHeizung_alle) {channel="http:urlComexio:ChM49"}
                        Switch HZ_PV "PV Heizung Freigabe" (gHeizung_alle) {channel="http:urlComexio:ChM53"}
                        Number Heizung_Speicher_oben "Oben [%.1f °C]" <heating> (gHeizung_alle, gWasserspeicher,cTEmp_Speicher) {channel="http:urlComexio:ChM1"}
                        Number Heizung_Speicher_Bereitschaft "Bereitschaft [%.1f °C]" <heating> (gHeizung_alle, gWasserspeicher, cTEmp_Speicher) {channel="http:urlComexio:ChM2"}
                        baseURL kann so lang sein, wie man sie haben will. Ein switch ist immer ein switch. number kennt kein onValue und offValue.

                        Kommentar


                          #13
                          Hallo udo1toni,


                          super. vielen Dank.

                          damit kann ich nun die Merker in der Comexio setzen. Musst nur die BaseURL abkürzen und wieder zu den Extensions schreiben. (Wobei ich dies, wenn ich Zeit habe, nochmals testen werde)

                          Code:
                          Thing http:url:Comexio "Comexio" [ baseURL="http://192.168.178.230/",
                                                             delay=1000,
                                                             refresh=30
                                                           ] {
                              Channels:
                                  Type switch : ChM137 [ stateExtension="api/?action=get&marker=M137", commandExtension="api/?action=set&marker=M137&value=%2$s", onValue="1",
                          
                          offValue="0"]
                          Nun geht aber das lesen nicht mehr. es kommt in der items definiton immer "UNDEF"

                          Liegt ja sicher an dem Rückgabewert 0 oder 1. Das müsste ich nun noch zu einem Switch transformieren. Wo kann ich dies noch einbauen?

                          Besten Dank.
                          Zuletzt geändert von meins0273; 02.01.2022, 16:40.

                          Kommentar


                            #14
                            Was ich bis jetzt rausgefunden habe:

                            stateTransformation="[MAP(comexio.map):]

                            Nur was muss hinter den :

                            würde das so gehen?

                            Kommentar


                              #15
                              Was liefert denn die stateURL zurück?

                              Kommentar

                              Lädt...
                              X