Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues MQTT Plugin

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

    ja Doku ist ein grundsätzliches Problem in der Software Branche.
    ich denke aber bei SHNG müssen wir mehr an die Anwender als an die Code-Freaks denken.
    Praktische Tipps und how-too guides helfen mehr als die Dokumentation von Parametern.

    Aber das hier war ganz klar mein Fehler, dass ich nicht mehr wusste und nicht kontrolliert habe, was läuft.

    Aber wenn in der SHNG Dokumentation erklärt wäre, wie die Broker Architektur implementiert ist und funktioniert, würde ich als Laie damit besser zurecht kommen.
    z.B. habe ich vor über einem Jahr schon mit dem plugin gekämpft und weiß auch heute immer noch nicht, wie man eine Anwendung sinnvoll anbindet.

    Meine Heizung z.B. liefert einen Sack voll Parameter, die ich an SHNG übergebe.
    Ist das so sinnvoll, wie ich es realisiert habe? oder macht man das anders:

    Code:
        # Write state to SmartHomeNG
        def StateToMQTT (self,typeOfValue,value):
            client = mqtt.Client()
            client.connect("localhost", 1883)
            client.publish(typeOfValue, str(value))
            client.disconnect()
            # print (typeOfValue, ":", str(value))
    Mein Wechselrichter liefert über SBFSpot ein JSON Dokument, was ich dann in einer LOGIK parse.

    Kommentar


      Zitat von whe Beitrag anzeigen
      Aber wenn in der SHNG Dokumentation erklärt wäre, wie die Broker Architektur implementiert ist und funktioniert,
      Das ist genau das Problem.

      Ich muss davon ausgehen können, dass jemand der MQTT einsetzt und SmartHomeNG daran anschließen will, auch weiss wie MQTT funktioniert. Wir haben im SmartHomeNG Team einfach nicht die Kapazitäten, um so etwas für die Technologien zu dokumentieren, die an SmartHomeNG angeschlossen werden können.

      Mit Deiner Begründung müssten wir in SmartHomeNG analog zu Deinem Wunsch MQTT zu dokumentieren, das gleiche für für weitere Technologien (KNX, Homematic, Hue, Modbus, Homeconnect, 1-Wire, EnOcean und ähnliches) tun. Du sieht hoffentlich, welchen Aufwand das generieren würde. So wünschenswert das ist, sehe ich nicht, dass das leistbar ist.


      Zitat von whe Beitrag anzeigen
      Ist das so sinnvoll, wie ich es realisiert habe? oder macht man das anders:
      Nein, das ist so nicht sinnvoll. Dafür gibt es das MQTT Plugin. In Deinem Beispiel würdest Du einfach ein Item anlegen. Bei Wertänderung des Items wird dann der Wert unter dem angegebenen Topic publiziert:

      Code:
      myitem:
          type: str
          mqtt_topic_out: <hier gehört das Topic rein, dass Du der Funktion in 'typeOfValue' übergibst)

      Insgesamt gibt es mehrere Plugins, die über MQTT kommunizieren. Das mqtt Modul implementiert den Transport Layer, während die Plugins sich um den Inhalt der Payload kümmern. Bisher sind das die Plugins mqtt, tasmota und shelly. mqtt ist ein Plugin zur generischen Implementierung von beliebigen Payloads.
      Viele Grüße
      Martin

      There is no cloud. It's only someone else's computer.

      Kommentar


        Hat jemand einen Tipp wie ich es schaffe ein MQTT in JSON Format abzusetzten. Hintergrund: mein valetudo will für das reinigen eines Segments ein JSON (siehe auch https://valetudo.cloud/pages/integra...tioncapability).

        Ich hätte das jetzt folgendermaßen probiert:
        Code:
                        cleanwintergarten:
                            type: bool
                            visu_acl: rw
                            on_update:
                             - .cleanwintergartenhelper = 'temp'
                            cleanwintergartenhelper:  
                                type: str
                                mqtt_topic: 'robots/Z10/MapSegmentationCapability/clean/set'
                                #id 8 .. wintergarten
                                eval: '{"segment_ids": ["8"],"iterations": 1}'
                                enforce_updates: true        ​
        Also ein bool item welches ich später per knx triggern kann. Dieses setzt bei einer Änderung das cleanwintergartenhelper item auf einen temporären Wert und eval überschreibt diesen mit dem String der den Roboter starten würde.

        Leider bekomme ich dann nur diese Meldung "Item glob.robots.vacuum.segments.cleanwintergarten.clea nwintergartenhelper: value "{'segment_ids': ['8'], 'iterations': 1}" does not match type str. Via mqtt None".

        Wie könnte man das korrekt lösen?

        Ich hätte auch versucht den String bereits bei on_update des items cleanwintergarten zu übergeben. Da konnte ich das yaml file im Backend aber nicht mal mehr speichern.

        Besten Dank
        Zuletzt geändert von mayrjohannes; 18.12.2022, 22:11.

        Kommentar


          In YAML Dateien macht es einen Unterschied, ob Du einen String in Single-Quotes oder in Double-Quotes einschließt. Wenn Du Double-Quotes verwendest, musst Du zumindest die im String verwendeten Double Quotes escapen. Probiere mal

          Code:
          "{\"segment_ids\": [\"8\"],\"iterations\": 1}"
          Dass Du beim anderen Versuch die YAML Datei nicht speichern konntest, liegt daran, dass das dann kein gültiges YAML war. Vermutlich wurden die geschweiften Klammern interpretiert. In dem Fall müsstest Du die auch escapen.

          Das hat aber im engeren Sinne nichts mit MQTT zu tun, sondern damit, wie Du die Daten in die YAML Datei schreibst.
          Viele Grüße
          Martin

          There is no cloud. It's only someone else's computer.

          Kommentar


            Hallo Msinn, hab mich da jetzt etwas damit beschäftigt und du hast mich jedenfalls auf die richtige Fährte gebracht. Aber es liegt weniger am casten der { und " sondern mehr an den ":".
            Ich bin mir jetzt nicht sicher ob der Editor im Backend auf swagger basiert, aber jedenfalls gibt es da ein paar Probleme mit den ":" (siehe: https://stackoverflow.com/questions/...-a-yaml-string). Dort gibt es zwar ein paar Lösungsvorschläge, von denen funktioniert aber keiner.

            Der String funktioniert ja für eval im helperitem, aber nicht für on_update im bool-Item.

            Ich hab jetzt folgende Varianten versucht:
            Variante A funktioniert prinzipiell und es lässt sich alles schön im Backend speichern, aber die ":" fehlen halt und am Empfänger gibt es entsprechend eine parse error
            Code:
                            cleanwintergarten:
                                type: bool
                                visu_acl: rw
                                on_update:
                                 - .cleanwintergartenhelper = '{"segment_ids" ["8"],"iterations" 1}'
                                                  
                                cleanwintergartenhelper:  
                                    type: str
                                    mqtt_topic: 'robots/Z10/MapSegmentationCapability/clean/set'
                                    enforce_updates: true    ​
            Variante B published den mqtt nur mit 'abc' und in der smarthomeNG log bekomme ich folgende Warning: 2022-12-19 20:17:20 WARNING lib.item.item Item glob.robots.vacuum.segments.cleanwintergarten.clea nwintergartenhelper: value "{'segment_ids': ['8'], 'iterations': 1}" does not match type str. Via mqtt None
            Code:
                            cleanwintergarten:
                                type: bool
                                visu_acl: rw
                                on_update:
                                 - .cleanwintergartenhelper = 'abc'
                                                  
                                cleanwintergartenhelper:  
                                    type: str
                                    mqtt_topic: 'robots/Z10/MapSegmentationCapability/clean/set'
                                    eval: "{\"segment_ids\": [\"8\"], \"iterations\": 1}"
                                    enforce_updates: true    ​
            Variante C kann ich nur über nano editieren und speichern (wegen der Doppelpunkte nicht über das Backend). Wenn ich smarthomeNG dann aber neu starte gibt es die selbe Fehlermeldung wie im Backend.
            Code:
                            cleanwintergarten:
                                type: bool
                                visu_acl: rw
                                on_update:
                                 - .cleanwintergartenhelper = '{"segment_ids": ["8"],"iterations": 1}'
                                                  
                                cleanwintergartenhelper:  
                                    type: str
                                    mqtt_topic: 'robots/Z10/MapSegmentationCapability/clean/set'
                                    enforce_updates: true    ​
            Variante A und C funktioniert auch mit
            Code:
            "{\"segment_ids\": [\"8\"], \"iterations\": 1}"
            nur wenn man die Doppelpunkte entfernt.

            Wie könnte ich da meine ":" reinbekommen?

            Das ganze ist ganz und gar kein MQTT Thema, deswegen vermutlich im vollkommen falschen Thread. Kann man das irgendwie verschieben?
            Zuletzt geändert von mayrjohannes; 19.12.2022, 20:32.

            Kommentar


              Der Editor in der Admin GUI ist Codewarrier. Das ist ein normaler Texteditor. Sämtliches escapen damit Du eine gültige YAML Datei erhältst musst Du selber machen, wie bei jedem anderen Texteditor auch. Auch den Doppelminkt musst Du (je nach Stringtyp) escapen. Welche Möglichkeiten es dazu gibt, findest Du in verschiedenen YAML Dokumentationen im Internet.

              Der einzige Unterschied zwischen dem Editor in der Admin GUI und anderen Texteditoren ist, dass SmartHomNG die Daten bereits nicht speichert, wenn es keine gültige YAML Datei ist. Wenn Du andere Editoren (Notepad, …) nutzt, kannst Du eine beliebige Datei speichern und SmartHomeNG beschwert sich über den Fehler erst, wenn es die Dazei laden will und dabei feststellt, dass es keine gültige YAML Datei ist.

              Eine Quick&Dirty Lösung für Dein Problem könnte zum Beispiel der Einsatz einer Logik sein, in der Du das Item mit dem gewünschten String befüllst, der als Payload gesendet werden soll. Damit umgehst Du erstmal das Escaping-Problem in der YAML Datei.
              Viele Grüße
              Martin

              There is no cloud. It's only someone else's computer.

              Kommentar


                Ich habe das Problem nun nicht in die Tiefe verfolgt aber könnte man nicht das eval einfach anders schreiben ohne escapen zu müssen oder Gänsefüsschen zu nutzen?

                Siehe dazu hier eine schöne Übersicht in der Lösung. Vielleicht klappt ja > oder | damit

                Kommentar


                  Da, wie ich das sehe, die Zuweisung ein konstanter String ist, muss die Zuweisung auch nicht per eval erfolgen.

                  Noch ‘ne Quick&Dirty Lösung:
                  Wenn man ein eval nutzen möchte, kann man aber die kritischen Zeichen anders in den Sting einbauen:
                  Code:
                  eval: ‘“erster Teil des Strings“ + chr(58) + “zweiter Teil des Strings“‘
                  58 ist der ASCII Code für den Doppelpunkt.
                  Viele Grüße
                  Martin

                  There is no cloud. It's only someone else's computer.

                  Kommentar


                    Hallo zusammen,

                    ich kämpfe gerade mit dem Attribut "mqtt_topic_init". Das beim Start von SH eine entprechende Message gesendet wird, wäre genau das was ich bräuchte. Aber irgendwie kommt eben genau diese Nachricht bei mir nicht bei einem Client an (spätere Nachrichten wie bei "mqtt_topic_out" funktionieren ohne Probleme). Broker und Client laufen in diesem Fall weiter, SH wird neugestartet. Ich nehme an, es wäre so gedacht, dass diese Init Message auch bei einem Neustart des Brokers gesendet werden würde?
                    Meine Frage: Gibt es irgendwelche besondere Voraussetzungen für diese Funktionalität, Broker Version?, "mqtt_retain" muss nicht aktiv sein, nehme ich an? mqtt_qos sollte auch egal sein, nehme ich an?

                    Gruß
                    Franz

                    Kommentar

                    Lädt...
                    X