Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues MQTT Plugin

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

    Ja, Du musst nur bedenken, dass in MQTT keine Datentypen kennt, sondern dass generell nur eine Folge von Bytes übermittelt wird. Damit Absender und Empfänger sich verstehen, müssen sie sich einig sein, wie die Payload des MQTT Telegramms zu interpretieren ist.

    Um über json artige Strukturen zu kommunizieren, muss die json Struktur in einen String gewandelt werden, der dann als Payload übertragen wird. Dein Item muss als Wert also den kompletten Json String enthalten.

    Nachtrag: Der Unterschied ist, dass Du im Moment über SmartHomeNG versuchst eine Python Datenstruktur zu versenden, während MQTT.fx einen String sendet. Das siehst Du auch an der Fehlermeldung die Du gepostet hast: Dort versucht java.io.StringReader einen String zu lesen und als Json zu interpretieren. Da kein String gesendet wurde, geht das natürlich daneben.

    Eine Möglichkeit für Dich ist, gleich einen String in der Logik zu definierten, oder über json.dumps() die Json Struktur in einen String zu wandeln.

    Code:
    # rockrobo_ini.py
    sh.Rockrobo( '{"command": "zoned_cleanup", "zone_ids": ["Bad"]}' )
    sollte funktionieren, wenn Du das Item als type: str definierst.
    Zuletzt geändert von Msinn; 19.07.2019, 07:27.
    Viele Grüße
    Martin

    Stay away from negative people. They have a problem for every solution.

    Kommentar


      Kurze Rückmeldung: funktioniert. Danke! ;-)

      Kommentar


        Hallo zusammen,

        ich scheitere jetzt schon seit längerem an der Herausforderung, dass ich gerne die Werte verschiedener Items per MQTT senden und empfangen möchte.
        Leider komme ich mit allen Beispielen nicht weiter, vermutlich weil ich ein blutiger Anfänger bin, was das betrifft.

        Mein Ziel:
        Ich nutze einen Raspberrypi, der per RS485 mit einer Helios Lüftung verbunden ist. Der liest und schreibt verschiedene Parameter über das "helios" Plugin.
        Zwei dieser Items heißen z.B.: ventilation.bypass.is_on und ventilation.rs485._incoming_temp
        Das MQTT Plugin ist installiert und zeigt mir an, dass es den MQTT Broker sieht und auch, dass der Nachrichten schickt.

        Kann mir bitte jemand einen Tipp geben, was ich tun muss, um z.B. den Wert des items ventilation.rs485._incoming_temp per MQTT zu senden oder den Wert des items ventilation.bypass.is_on durch eine empfangene MQTT Nachricht zu setzen?

        Ich krieg das irgendwie nicht auf die Reihe und das frustriert mich schon langsam so sehr, dass ich daran denke, das ganze Projekt abzubrechen.
        Schonmal vielen Dank für Eure Mühe und Tipps.

        Viele Grüße

        Martin.

        Kommentar


          Mir ist nicht klar was Du genau tun willst.

          Ich habe Deienen Post so verstanden, dass Bei Dir SmartHomeNG über das helios Plugin mit dem Raspberry Pi kommuniziert. Du möchtest jetzt Werte von Items, die Du über das helios Plugin empfangen hast, über das mqtt Plugin versenden.

          Um Dir helfen zu können, wie die Daten versendet werden müssen, muss ich etwas über den geplanten Empfänger der Information wissen.

          Zum einen musst Du wissen, auf welches Topic der andere Client „lauscht“. Wenn Du nicht mit genau diesem Topic sendest, wird der Broker das Paket nie an den anderen Client ausliefern.

          zum anderen musst Du wissen, wie der andere Client die Daten erwartet. Das MQTT Protocol kennt keine Datentypen. Die Payload des Paketes ist immer eine Folge von Bytes. Die beiden Clients die über MQTT kommunizieren (hier: SmartHomeNG und der andere Client über den Du nichts geschrieben hast), müssen sich einig sein, wie diese Bytefolge zu interpretieren ist (z.B. ein String, eine Integer, ein Float Wert, ...)
          Viele Grüße
          Martin

          Stay away from negative people. They have a problem for every solution.

          Kommentar


            Guten Morgen Martin,

            das ist genau richtig. Ich möchte die Werte, die das helios Plugin auf dem Raspberry von der Lüftungsanlage empfängt per MQTT weitersenden - und auch Werte per MQTT an den Raspberry schicken, die dieser dann per helios Plugin an die Lüftung weitergibt.

            Bei mir läuft ein Mosquitto MQTT Broker und ein Openhab System, das die Werte empfangen soll - ggf. sollen einzelne von da aus noch auf den KNX-Bus gesendet werden. Aber da bin ich noch sehr weit weg.

            Ziel 1 ist, Werte von der Helios Lüftung auf den Openhab zu bekommen (logische, numerische und evtl. gibt es noch weitere). In Openhab bin ich ein wenig fitter und traue mir zu, die Werte ins benötigte Format zu konvertieren (aber manchmal ist mein Mut auch größer als mein Programmier-Talent).

            Danke für Deine Unterstüzugn

            viele Grüße
            Martin

            Kommentar


              Poste doch mal die Definitionen der Items die Du übertragen möchtest und die Namen der MQTT Topics unter denen das passieren soll.
              Viele Grüße
              Martin

              Stay away from negative people. They have a problem for every solution.

              Kommentar


                Guten Abend,

                Hier die Definitionen der Items, die ich übertragen möchte, aus der helios.yaml

                Code:
                ventilation:
                    rs485:
                        _fanspeed:
                            name: 'Aktuelle Lüftungsstufe (EC300Pro: 1..8)'
                            type: num
                            helios_var: fanspeed
                            visu_acl: rw
                            sqlite: 'yes'
                # hier kommt noch viel Zeug, was ich nicht übertragen möchte
                #...
                # folgendes dann doch wieder:
                    # Summer bypass
                    bypass:
                
                        # '============================================================================================ #'
                        is_on:
                            name: Summer bypass on --> 1
                            type: num
                            eval: 1 if (sh.ventilation.rs485._bypass_disabled()==0) else 0
                            eval_trigger: ventilation.rs485._bypass_disabled
                        _outside_temp:
                            name: 'DIN/EN: Außenluft, outdoor air / ODA, grün; Luft von draussen'
                            type: num
                            helios_var: outside_temp
                            visu_acl: r
                            sqlite: 'yes'
                
                        # rrd: yes
                        # rrd_min: yes
                        # rrd_max: yes
                        # Achtung: Bei starkem Frost wird der Zuluftventilator automatisch gestoppt.
                        # In diesem Fall weicht die 'outside_temp' von der tatsächlichen Außentemperatur
                        # stark ab, da keine Frischluft mehr in die Anlage geführt wird.
                        # (Erwärmung des WT Anlage durch die Raumtemperatur sowie durch die ggf. gerade
                        # abkühlende Vorheizung verfälschen dann die Werte)
                        _incoming_temp:
                            name: 'DIN/EN: Zuluft, supply air / SUP, blau; Luft in die Räume'
                            type: num
                            helios_var: incoming_temp
                            visu_acl: r
                            sqlite: 'yes'
                
                        # rrd: yes
                        # rrd_min: yes
                        # rrd_max: yes
                        _inside_temp:
                            name: 'DIN/EN: Abluft, extract air / ETA, gelb; Luft aus den Räumen'
                            type: num
                            cache: true    # schmeisst sonst beim Start Fehler div/0 bei Berechnungen
                            helios_var: inside_temp
                            visu_acl: r
                            sqlite: 'yes'
                
                        # rrd: yes
                        # rrd_min: yes
                        # rrd_max: yes
                        _exhaust_temp:
                            name: 'DIN/EN: Fortluft, exhaust air, braun; Luft nach draussen'
                            type: num
                            helios_var: exhaust_temp
                            visu_acl: r
                            sqlite: 'yes'
                die MQTT-Topics sind noch frei definierbar. Folgende Topics kann ich mir für die entsprechenden items (in []) vorstellen:
                Code:
                lueftung/stufe                 [ventilation:rs485:fanspeed]
                lueftung/bypass              [ventilation:bypass:_ison]
                lueftung/temp_aussen    [ventilation:bypass:_outside_temp]
                lueftung/temp_zuluft       [ventilation:bypass:_incoming_temp]
                lueftung/temp_raumluft   [ventilation:bypass:_inside_temp]
                lueftung/temp_fortluft      [ventilation:bypass:_exhaust_temp]
                Die Items [ventilation:rs485:fanspeed] und [ventilation:bypass:_ison] würde ich gerne per MQTT schreiben können, also den Bypass aktivieren / deaktivieren und die Lüftungsstufe steuern.
                Es gibt noch einige Items mit dem Namen booster - das könnte eine interessante Funktion für später sein, aber ich will es ja nicht gleich übertreiben.
                Ich hoffe, das ist verständlich geschrieben - falls nicht liefere ich nach Kräften nach!

                Danke sehr und gute Nacht.
                Zuletzt geändert von msteffel; 31.07.2019, 07:46.

                Kommentar


                  Eine Möglichkeit die Werte zu senden ist, in jedem Item ein mqtt_topic bzw. mqtt_topic_out zu definieren. Ich habe das beispielhaft für die ersten 3 Items mal getan:
                  Code:
                  ventilation:
                     rs485:
                         _fanspeed:
                             name: 'Aktuelle Lüftungsstufe (EC300Pro: 1..8)'
                             type: num
                             helios_var: fanspeed
                             visu_acl: rw
                             sqlite: 'yes'
                             mqtt_topic_out: 'lueftung_stufe'
                  # hier kommt noch viel Zeug, was ich nicht übertragen möchte
                  #...
                  # folgendes dann doch wieder:
                     # Summer bypass
                     bypass:
                         # '============================================================================================ #'
                         is_on:
                             name: Summer bypass on --> 1
                             type: num
                             eval: 1 if (sh.ventilation.rs485._bypass_disabled()==0) else 0
                             eval_trigger: ventilation.rs485._bypass_disabled
                             mqtt_topic_out: 'lueftung_bypass'
                         _outside_temp:
                             name: 'DIN/EN: Außenluft, outdoor air / ODA, grün; Luft von draussen'
                             type: num
                             helios_var: outside_temp
                             visu_acl: r
                             sqlite: 'yes'
                             mqtt_topic_out: 'temp_aussen'
                  
                           ...
                  Eine andere Möglichkeit wäre, ein Hilfseitem anzulegen und dort die Werte so aufzubereiten, wie der empfangende Client sie benötigt (z.B. einen Json String zu senden).
                  Viele Grüße
                  Martin

                  Stay away from negative people. They have a problem for every solution.

                  Kommentar


                    Hallo Martin.

                    WOW. Das war einfach - und hat (fast) auf Anhieb geklappt.
                    Jetzt kann ich sogar per MQTT die Lüftungsstufe der Anlage schneller / langsamer stellen.
                    Temperaturen auslesen geht auch.
                    Vielen lieben Dank!
                    Wie lange ich mich damit geplagt hab, und dabei habe ich immer zu kompliziert gedacht.
                    Nochmals vielen Dank und viele Grüße

                    Martin.

                    Kommentar


                      Hallo,

                      zum Schalten meiner neuen Osram Zigbee Steckdose nutze ich zigbee2mqtt, mosquitto und das mqtt Plugin der shNG (V1.6).

                      Vielleicht ist es ein allgemeineres Problem, da es sich aber auf Post #106 bezieht, poste ich es hier.

                      Zur Kommunikation mit dem mqtt Broker verwende ich das Item:
                      Code:
                      mqtt:
                        hplaserjet_out:
                          name: hplaserjet_out
                          type: str
                          visu_acl: rw
                          enforce_uptdates: true
                          mqtt_topic_out: 'zigbee2mqtt/osramdose1/set'
                      das durch die folgende Logik switch_osramdose1.py gesetzt wird:
                      Code:
                      #!/usr/bin/env python3
                      
                      logger.info("GEH LOGIK {0}".format( logic.filename))
                      
                      if sh.EG.HWR.LaserJet():
                          sh.mqtt.hplaserjet_out( '{"state": "on"}' )
                      else:
                          sh.mqtt.hplaserjet_out( '{"state": "off"}' )

                      Zum Schalten habe ich ein weiteres Item definiert, auf das ich über die smartVISU zugreifen möchte:
                      Code:
                      EG:
                         HWR:
                              name: EG_HWR
                              SV_page: room
                             
                              LaserJet:
                                  name: EG_HWR_LaserJet
                                  type: bool
                                  enforce_updates: 'true'
                                  visu_acl: rw
                      Dieses Item soll dann meine Logik triggern (in logics.yaml):
                      Code:
                      HpLaserJet:
                          filename: switch_osramdose1.py
                          watch_item: EG.HWR.LaserLet
                      Im Log-File sieht alles gut aus, im Backend auch. Allerdings wird beim Umschalten des Items EG.HWR.LaserJet die Logik nicht getriggert. Ich habe im backend den Wert geändert und auch im interaktiven Modus, ohne Erfolg. Führe ich im Backend die Logik manuell aus, schaltet die Steckdose. Die Kommunikation mit dem broker scheint zu funktionieren. Es sieht so aus, also ob das watch_item die Logik nicht triggert. Woran könnte das liegen?

                      Gibt es einen einfacheren Weg als über 2 Items und eine Logik zu gehen?

                      Danke & Grüße
                      Gerd

                      Kommentar


                        Hallo!
                        Ist da ein Tippfehler in „watch_item:...“ ...?
                        EG.HWR.LaserLet <—>. EG.HWR.LaserJet

                        Kommentar


                          Tatsächlich, das war's, es funktioniert wie gedacht. Wie oft habe ich darauf geschaut, ob ich mich vertippt habe.

                          Vielen Dank für den Hinweis!

                          Nun noch die Frage, ob es einen einfacheren Weg gibt?

                          Kommentar


                            Du könntest auf die Logik verzichten und im HWR.LaserJet mit on_change direkt die gewünschten Werte in hplaserjet_out setzen.

                            Alternativ könntest Du mit einem eval in hplaserjet_out den String in Abhängigkeit von HWR.LaserJet berechnen.
                            Zuletzt geändert von Msinn; 02.08.2019, 10:15. Grund: Alternatvie hinzugefügt
                            Viele Grüße
                            Martin

                            Stay away from negative people. They have a problem for every solution.

                            Kommentar


                              Vielen Dank für die beiden Vorschläge.

                              Ich habe mich für den ersten entschieden, da mir das Pushen für diesen Anwendungsfall sinnvoller erschien.

                              Zur Dokumentation noch meine neue Item-Definition:

                              Code:
                              EG:
                                  HWR:
                                      LaserJet:
                                          name: EG_HWR_LaserJet
                                          type: bool
                                          on_change: mqtt.hplaserjet_out = '{ "state":"on"}' if sh.EG.HWR.LaserJet() else '{"state":"off"}'
                                          enforce_updates: 'true'
                                          visu_acl: rw
                              Funktioniert ebenso, ist aber viel schlanker. Prima.

                              Kommentar

                              Lädt...
                              X