Ankündigung

Einklappen
Keine Ankündigung bisher.

KNX MQTT Gateway... und zwar bidirektional :-)

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

    KNX MQTT Gateway... und zwar bidirektional :-)

    Hallo zusammen,

    ich würde gerne OpenHAB als MQTT-Gateway von und zu KNX nutzen. Aktuell habe ich insgesamt über 1000 KNX Gruppenadressen vergeben, deshalb sollte das Ganze möglichst gut skalieren, d.h. schlank und ressourcenarm ablaufen und eine gute Wartbarkeit wäre auch nicht unwichtig :-)

    Usecase:

    Ein KNX-Taster schaltet auf einem KNX-Aktor ein Licht an. Der Status des Aktors soll an MQTT übertragen werden.

    So weit, so gut, und auch relativ simpel.

    Was aber, wenn der KNX-Aktor auch gleichzeitig von MQTT aus geschaltet werden soll?

    Und genau hier versagt meine Vorstellungskraft, wie ich das richtig und rückkopplungsfrei in KNX abbilde. Am elegantesten wäre es IMO, Rules zu vermeiden (um Ressourcen zu sparen), und der Einfachheit halber direkt zwei Channels zu brücken. Ich könnte mir folgendes Setup vorstellen:

    knx.things:
    Code:
    Type switch: kg_heizraum_beleuchtung_onoff "KG Heizraum Beleuchtung An/Aus" [ ga="1/0/30+<1/7/30" ]
    Dabei ist 1/0/30 die Schalt-GA (An/Aus) und 1/7/30 die Status-GA.

    mqtt.things:
    Code:
    Type switch: kg_heizraum_beleuchtung_onoff "KG Heizraum Beleuchtung An/Aus" [ stateTopic="building/kg/heizraum/beleuchtung/status", commandTopic="building/kg/heizraum/beleuchtung/onoff", on="1", off="0", postCommand="true" ]
    knx.items:
    Code:
    Switch kg_heizraum_beleuchtung_onoff "KG Heizraum Beleuchtung An/Aus [%s]" (gZabbixOnOff) { channel="knx:device:bridge:generic:kg_heizraum_bel euchtung_onoff", channel="mqtt:topic:mqtt1:building:kg_heizraum_bel euchtung_onoff" }
    Wenn ich das aber so implementiere, passiert folgendes:
    1. Der KNX-Aktor kann vom KNX-Taster aus geschaltet werden, und der Status wird in der OpenHAB-Sitemap korrekt abgebildet.
      1. ...in MQTT allerdings sehe ich den Schaltvorgang weder unter building/kg/heizraum/beleuchtung/onoff, noch unter building/kg/heizraum/beleuchtung/status.
    2. Der KNX-Aktor kann von der OpenHAB-Sitemap aus geschaltet werden, und der Status wird in der OpenHAB-Sitemap und am KNX-Taster korrekt abgebildet.
      1. ...in MQTT sehe ich den Schaltvorgang unter building/kg/heizraum/beleuchtung/onoff, aber auf building/kg/heizraum/beleuchtung/status kommt nichts an.
    3. Das Senden einer "1" auf building/kg/heizraum/beleuchtung/onoff bewirkt gar nichts.
    Als Problem sehe ich mindestens das korrekte Weiterleiten der Status-Updates.

    Hat jemand Ideen, wie man sowas ohne Rules lösen kann?
    Zuletzt geändert von wuestenfuchs; 03.05.2022, 17:59.
    "Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren." - Benjamin Franklin

    #2
    Da schlagen die Begrifflichkeiten zu...

    commandTopic ist die Senderichtung, also von openHAB in Richtung mqtt.
    stateTopic ist die Empfangsrichtung, also von mqtt in Richtung openHAB.
    postCommand=true bewirkt in diesem Zusammenhang lediglich, dass das stateTopic als Command gewertet wird. Es bewirkt keine Umkehr der Parameterfunktion.

    Kommentar


      #3
      Ah - ich habe das Pferd also von der falschen Seite aus aufgesattelt! Intuitiv hatte ich das andersrum vermutet und habe wohl auch die Dokumentation völlig falsch gedeutet ;-) Gut, mit folgender Konfig kann ich von MQTT aus den Aktor schalten:

      mqtt.things:
      Code:
      Type switch: kg_heizraum_beleuchtung_onoff "KG Heizraum Beleuchtung An/Aus" [ commandTopic="building/kg/heizraum/beleuchtung/status", stateTopic="building/kg/heizraum/beleuchtung/onoff", on="1", off="0", postCommand="true" ]
      Was noch gar nicht funktioniert, ist die Übertragung der Statusrückmeldung des Aktors auf MQTT. Eigentlich liegen OpenHAB ja alle Informationen vor, um 'building/kg/heizraum/beleuchtung/status' (Status-Topic in MQTT) mit '1/7/30' (Status-GA in KNX) zu verknüpfen. Gibt es da noch einen Schalter, den ich übersehen habe, damit der Status richtig auf MQTT ausgegeben wird?
      Zuletzt geändert von wuestenfuchs; 05.05.2022, 07:30.
      "Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren." - Benjamin Franklin

      Kommentar


        #4
        Der Status wird von knx gesendet und kommt in openHAB als update an. In dieser Form wird er auch weitergeleitet. Bindings verarbeiten updates aber nicht, sondern ignorieren sie. Ausweg: Du setzt im Link zum mqtt item das Profile auf "follow", dann sollte das update als Command gewertet werden und entsprechend an das commandTopic senden.

        Kommentar


          #5
          An profile=follow habe ich auch schon gedacht und es testweise wie folgt implementiert:

          knx.things:
          Code:
          Type switch: kg_heizraum_beleuchtung_onoff "KG Heizraum Beleuchtung An/Aus" [ ga="1/0/30+<1/7/30" ]
          mqtt.things:
          Code:
          Type switch: kg_heizraum_beleuchtung_onoff "KG Heizraum Beleuchtung An/Aus" [ commandTopic="building/kg/heizraum/beleuchtung/status", stateTopic="building/kg/heizraum/beleuchtung/onoff", on="1", off="0", postCommand="true" ]
          knx.items:
          Code:
          Switch kg_heizraum_beleuchtung_onoff "KG Heizraum Beleuchtung An/Aus [%s]" (gZabbixOnOff) { channel="knx:device:bridge:generic:kg_heizraum_bel euchtung_onoff", channel="mqtt:topic:mqtt1:building:kg_heizraum_bel euchtung_onoff" [profile="follow"] }
          Ergebnis:

          Auf building/kg/heizraum/beleuchtung/onoff passiert gar nichts, aber auf building/kg/heizraum/beleuchtung/status kommen die Ein- und Aus-Befehle nun jeweils doppelt an, d.h. schalte ich das Licht am Taster An, kommt folgendes:
          Code:
          1
          1
          Bei Aus dasselbe:
          Code:
          0
          0
          Habe schon mehrere Varianten durchprobiert, aber ich komme irgendwie nicht weiter.
          "Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren." - Benjamin Franklin

          Kommentar


            #6
            Wenn ich die Befehls- und Status-Items frein säuberlich trenne, funktioniert alles wie erwartet:

            knx.things:
            Code:
            Type switch: kg_technikraum_beleuchtung_onoff_knx "KG Technikraum Beleuchtung An/Aus" [ ga="1/0/60" ]
            Type switch: kg_technikraum_beleuchtung_status_knx "KG Technikraum Beleuchtung Status" [ ga="<1/7/60" ]
            mqtt.things:
            Code:
            Type switch: kg_technikraum_beleuchtung_onoff_mqtt "KG Technikraum Beleuchtung An/Aus" [ stateTopic="building/kg/technikraum/beleuchtung/onoff", postCommand="true" ]
            Type switch: kg_technikraum_beleuchtung_status_mqtt "KG Technikraum Beleuchtung Status" [ commandTopic="building/kg/technikraum/beleuchtung/status" ]
            knx.items:
            Code:
            Switch kg_technikraum_beleuchtung_onoff "KG Technikraum Beleuchtung An/Aus [%s]" { channel="knx:device:bridge:generic:kg_technikraum_ beleuchtung_onoff_knx", channel="mqtt:topic:mqtt1:building:kg_technikraum_ beleuchtung_onoff_mqtt" }
            Switch kg_technikraum_beleuchtung_status "KG Technikraum Beleuchtung Status [%s]" (gZabbixOnOff) { channel="knx:device:bridge:generic:kg_technikraum_ beleuchtung_status_knx", channel="mqtt:topic:mqtt1:building:kg_technikraum_ beleuchtung_status_mqtt" [profile="follow"] }
            Wenn ich vom KNX-Taster aus schalte, wird der Status auf building/kg/technikraum/beleuchtung/status korrekt ausgegeben. Ebenso kann ich den KNX-Aktor von MQTT aus schalten, indem ich ein "ON" oder "OFF" auf building/kg/technikraum/beleuchtung/onoff schreibe.

            Der Nachteil der Trennung ist, dass ich z.B. in die Schalter in den OpenHAB-Sitemaps keinen aktuellen Status anzeigen.
            "Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren." - Benjamin Franklin

            Kommentar


              #7
              Okay, ich hab mir die obige Konfiguration mit kombiniertem Befehls-/Status-Item nochmal angeschaut. An-/Aus-Befehle auf MQTT werden sehr wohl übertragen, was ich oben übersehen habe. Eigentlich funktioniert jetzt hier alles, bis auf das Problem, dass die Werte auf das MQTT Status-Topic doppelt gesendet werden.

              Wenn ich mir das Timing anschaue, habe ich die Vermutung, dass der doppelte Wert daher kommt, dass sowohl der Ein-/Ausschaltbefehl, als auch der Status auf building/kg/heizraum/beleuchtung/status übertragen werden. Könnte das sein?
              Zuletzt geändert von wuestenfuchs; 06.05.2022, 16:33.
              "Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren." - Benjamin Franklin

              Kommentar


                #8
                Mein erster Tipp wäre, dass openHAB fälschlicherweise selbst ein postUpdate absetzt. Dagegen hilft autoupdate="false".

                Kommentar


                  #9
                  Habe es gerade probiert mit:

                  knx.items:
                  Code:
                  Switch kg_heizraum_beleuchtung_onoff    "KG Heizraum Beleuchtung An/Aus [%s]"    (gZabbixOnOff)    { channel="knx:device:bridge:generic:kg_heizraum_beleuchtung_onoff_knx", channel="mqtt:topic:mqtt1:building:kg_heizraum_beleuchtung_onoff_mqtt" [profile="follow"], autoupdate="false" }
                  Leider keine Änderung.

                  Im events.log erscheint sowohl mit, als auch ohne autoupdate="false", beim Ein- und Ausschalten folgender Eintrag:
                  Code:
                  2022-05-06 19:56:07.668 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'kg_heizraum_beleuchtung_onoff' changed from OFF to ON
                  2022-05-06 19:56:09.317 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'kg_heizraum_beleuchtung_onoff' changed from ON to OFF
                  "Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren." - Benjamin Franklin

                  Kommentar

                  Lädt...
                  X