Ankündigung

Einklappen
Keine Ankündigung bisher.

Anfängerfrage: Weiterleitung Items nach MQTT

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

    Anfängerfrage: Weiterleitung Items nach MQTT

    Hallo zusammen,

    ich bin noch völliger Neuling in Openhab und versuche mich gerade daran meine Wärmepumpe (Rotex) in die Visu (Edomi) einzubinden. Leider scheitere ich noch an der Umsetzung. Folgende Konfiguration:

    Edomi inklusive Mosquitto als Docker auf einem Timberwolf 2500
    pyHPSU (Python Script zum auslesen einer Rotex-Wärmepumpe) als Docker auf dem Timberwolf
    Openhab 2.4.0 ebenfalls als Docker auf dem Timberwolf

    Das pyHPSU kann einzelne Parameter nach openhab senden, diese kommen dort auch an, ich habe testweise auch einzelne Werte in der Basic UI visualisiert.
    MQTT funktioniert ebenfalls, zumindest kann ich Werte von MQTT.fx nach Edomi senden.

    Letzlich scheitere ich noch daran die Werte die in openhab ankommen nach MQTT weiterzuleiten bzw. auf entsprechende Topics umzusetzen.
    Jeder Parameter aus dem pyHPSU-Skript bekommt in OH ein eigenes Item, muss ich für die Weiterleitung nun noch jeweils ein zweites Item generieren oder funktioniert das auch nur mit einem Item?

    Falls ich ein zweites Item benötige wird ja auch eine rule fällig um die einzelnen Werte umzusetzen? Wie müsste so was dann genau aussehen?

    Leider waren meine bisherigen Versuche nicht erfolgreich, ich hoffe hier kann mir jemand einen Denkanstoß und ein paar Tipps geben, oder zumindest den grundsätzlichen Aufbau beschreiben,

    Danke und viele Grüße

    #2
    Nutzt Du openHAB ausschließlich zur Weiterleitung nach edomi? Es böte sich an, das python Script dahingehend zu ändern, dass es direkt nach MQTT sendet (es gibt eine Bibliothek paho-mqtt, mit der das sehr einfach erreicht werden kann)
    Ansonsten brauchst Du nicht zwingend mehrere Items zum Weiterleiten. openHAB nutzt ein Modell namens Profiles, um gezielt Kommandos oder Statusänderungen von einem Channel zu einem anderen Channel weiterzuleiten (beide Channel werden dazu mit dem selben Item verlinkt und zusätzlich wird über das Profile angegeben, wie die Befehle weitergeleitet werden) Profiles stehen mit der aktuellen Version zur Verfügung (das ist OH2.5)

    Alternativ kann man das auch per Rule machen. Gegeben zwei Items empfangen_1 und senden_1. Die Rule dazu:
    Code:
    rule "weiterleiten"
    when
        Item empfangen_1 received command
    then
        senden_1.sendCommand(receivedCommand)
    end
    Diese Rule kann auch für mehrere gleiche Itempaare verwendet werden. Dazu müssen alle sendenden Items in einer Gruppe zusammengefasst werden, genauso alle empfangenden Items (gSenden und gEmpfangen):
    Code:
    rule "weiterleiten"
    when
        Member of gEmpfangen received command
    then
        var sender = gSenden.members.filter[i | i.name.split("_").get(1) == triggeringItem.name.split("_").get(1)].head
        sender.sendCommand(receivedCommand)
    end
    In der zweiten Rule wird die Gruppe gSenden nach einem Item gefiltert, dessen hinterer Namensteil identisch mit dem hinteren Namensteil des Items ist, welches die Rule ausgelöst hat. Eine Rule, beliebig viele Itempaare (einzige Voraussetzungen: der hintere Namensteil ist identisch und eindeutig, der vordere Namenteil unterscheidet sich, die jeweiligen Items sind den beiden Gruppen zugeordnet.
    Falls es sich nicht um ein Kommando handelt, sondern nur um einen Status, muss der Trigger auf changed oder received Update lauten, statt receivedCommand muss dann triggeringItem.state verwendet werden. In der aktuellen Version OH2.5 gibt es auch newState als implizite Variable

    Kommentar


      #3
      ok, vielen Dank schon mal vorab, werde mich am WE mal daran machen und das testen.

      Prinzipiell kann das python-Skript auch MQTT, nur gibt es da aktuell noch Probleme und das läuft in meinem Fall nicht zuverlässig. D.h. im Moment will ich openhab wirklich nur als Relais-Station verwenden, es ist aber durchaus denkbar dass der Anwendungsbereich mal noch weiter wächst, daher würde ich mich jetzt schon gerne vertraut machen mit OH

      Kommentar


        #4
        ich komme leider nicht wirklich weiter, kann ich das Ganze denn in der PaperUI definieren oder muss ich dafür in die text-files?

        Die rule habe ich erstellt, sehe auch im log dass der Wert umgesetzt wird, es wird aber nichts rausgeschickt.

        Meine beiden Items habe ich definiert, was muss aber beim zweiten Item das an MQTT senden soll genau in der geschweiften Klammer stehen, für mein laienhaftes Verständnis liegt hier der Fehler:

        Code:
        Number Rotex_t_dhw "Temperatur im Warmwasserspeicher [%.1f]"
        Number Rotex_t_dhw_edomi "Temperatur im Warmwasserspeicher [%.1f]" {???}

        Kommentar


          #5
          Ja sicher, Du musst in Paper UI eine mqtt Bridge anlegen, darunter ein Thing, in dem Thing Channel. Die Channel musst Du mit den Items verlinken.

          Momentan unterwegs per Handy, ich kann später genauer antworten...

          Kommentar


            #6
            Ich hoffe ich hab das jetzt richtig verstanden, danke für Deine Geduld.
            Bei den Things hab ich den MQTT Broker (läuft auf anderem Docker) und ein Generic MQTT Thing.

            1.JPG
            Unter dem Broker hab ich aktuell keine Channels verlinkt, dafür unter dem Generic MQTT Thing plus die Items

            1.JPG

            Der Channel sieht folgendermaßen aus:

            1.JPG

            Hier noch die Items sowie die rules dazu:

            Number Rotex_t_dhw "Temperatur im Warmwasserspeicher [%.1f]"
            Number Rotex_t_dhw_edomi "Temperatur im Warmwasserspeicher [%.1f]" {mqtt=">[Mosquitto:edomi/set/internal/1160:state:value]"}
            Number Rotex_flow_rate "Durchfluss [%.1f l/h]"
            Number Rotex_flow_rate_edomi "Durchfluss [%.1f l/h]" {mqtt="<Mosquitto:/edomi/set/internal/1162:state"}
            Code:
            rule "Sensorwert rotex_t_dhw nach mqtt weiterleiten"
            when
            Item Rotex_t_dhw changed
            then
            Rotex_t_dhw_edomi.sendCommand(triggeringItem.state )
            end
            
            
            rule "Sensorwert rotex_flow_rate nach mqtt weiterleiten"
            when
            Item Rotex_flow_rate changed
            then
            Rotex_flow_rate_edomi.sendCommand(triggeringItem.s tate)
            end
            Auf dem MQTT.fx tut sich aber leider noch gar nichts, vermutlich hab ich Openhab einfach noch nicht verstanden

            Kommentar


              #7
              Du wirfst da was durcheinander. Es gibt zwei mqtt Bindings, das ist mqtt v1 und mqtt v2. Seit mqtt v2 offiziell "stabil" angeboten wird, ist mqtt v1 ein legacy binding.
              Du kannst auch mqtt v1 verwenden, musst dann aber explizit die Verwendung von legacy Bindings zulassen und anschließend natürlich mqtt v1 installieren.

              Der bessere Weg ist natürlich, mqtt v2 zu verwenden. Der Broker wird ja schon online angezeigt, prima. Das generic Thing ist dem Broker zugeordnet (man kann die Bridge beim Anlegen des Things in einer Drop-Down-Liste auswählen)?
              Nun musst Du noch den bereits angelegten Channel mit einem Item verlinken (sieht ja so aus, als wäre das bereits der Fall... Linked Items zeigt sogar zwei Items an.)

              In der items- Definition hast Du {mqtt="..."} geschrieben. Das bezieht sich ausschließlich auf mqtt v1.


              Das Topic muss allerdings ein vollständiges Topic sein (das Topic darf nicht mit einem / enden)

              Kommentar


                #8
                Edit: unten genannter Punkt mit der Einheit hat sich erledigt, lag an der Item-Definition. Aktuell läuft die Verbindung zwischen OH und Edomi

                so bin ein Stück weitergekommen, alles komplett neu aufgesetzt und siehe da die ersten Werte kommen an .
                Allerdings habe ich mit anderen Werten noch Probleme. Der Volumenstrom der Pumpe wird als Ganzzahl von dem Python-Skript, diesen Wert bekomme ich dann nach Edomi.
                Temperaturen aber werden z.B. als "43.7 °C" gesendet, die Nachhricht wird zwar gesendet, aber ohne Wert, d.h. in MQTT.fx sehe ich einfach ein leeres Feld.

                Ich vermute dass das an dem °C liegt, korrekt? Wie müsste denn dann eine entsprechende Transformation aussehen?
                Zuletzt geändert von jockele; 25.02.2020, 12:56.

                Kommentar


                  #9
                  Du musst mir etwas auf die Sprünge helfen... Wo kommt die Temperatur her?

                  Falls diese z.B. über ein Weather Addon rein kommt, so kann es sein, dass das betreffende Item auf UoM konfiguriert ist, damit hält es dann auch die Einheit und übergibt sie.
                  Die wirst Du innerhalb einer Rule los, indem Du den Wert zwangsweise von der Einheit befreist:
                  Code:
                  rule "Temperaturwert nach mqtt weiterleiten"
                  when
                      Item Temperatur changed
                  then
                      if(Temperatur.state instanceof Number)
                          Temperatur_edomi.sendCommand((Temperatur.state as Number).floatValue)
                  end
                  Das if() sorgt dafür, dass nur gültige Werte übertragen werden (ansonsten gibt's eine nullpointer exception im log, das ist hässlich)
                  Der eigentliche Clou ist, den Status explizit als Zahl zu betrachten und diese Zahl in einen Float Wert zu konvertieren. Dabei verliert der Status seine Einheit.

                  Dieser Weg gilt aber nur für Items, die mit UoM arbeiten (UoM = Units of Measurement). Ob das der Fall ist, kann ich anhand der Konfiguration evtl. ahnen

                  Kommentar

                  Lädt...
                  X