Shelly lässt sich nicht in Homeassistant einbinden, MQTT Topics passen nicht zur Developer Doku

  • Hi,

    zum 2. Mal habe ich jetzt mit der neuen Firmware massive Probleme bei der Einbindung in Systeme.
    Diese super unzweckmäßigen json-payloads erzwingen ein massiven Overhead für einfache Aufgaben.

    Meine erste Begegnung mit dieser neuen Strukturlosen Kreation hatte ich, als ich einen Shelly 2.5 nach Defekt tauschen musste. Zum Haare raufen.

    Was will ich?

    Ich habe ein Shelly PLUS Plug S, dessen Relay via mqtt aus Home Assistant als switch oder fan ein und ausgeschaltet werden können soll.

    Früher war das einfach (Gen 1 Shelly): Ein einfacher Switch mit Status-Rückmeldung

    Code
    mqtt:
    - platform: switch
      unique_id: "baddehumidifier"
      command_topic: shellies/shellyplug-s-BC7479/relay/0/command
      state_topic: shellies/shellyplug-s-BC7479/relay/0
      payload_on: "on"
      payload_off: "off"
      name: "Bad Entfeuchter"
      icon: mdi:air-humidifier

    Mit dem PLUS Plug S bekomme ich das jetzt erst nach stundenlangem probieren hin

    Dieses ganze templating ist sowas von überflüssig. Warum kann das nicht einfach "einfach" gemacht werden, wie mqtt ursprünglich gedacht ist?
    Ein Topic, ein Wert. Fertig. Super easy zu implementieren, statt jetzt irgendwelche Payloads parsen und craften zu müssen.
    Das ist wie wenn man eine mysql-Tabelle mit nur einer Spalte anlegt und dann die strukturierten Daten als json-text alle in die eine Spalte schreibt.
    Eine für mich wirklich nicht erklärbare Design-Entscheidung :cursing:

    Übrigens was in der Developer-Doku steht, funktioniert auch nicht.

    https://shelly-api-docs.shelly.cloud/gen2/ComponentsAndServices/Mqtt schreibt
    > <topic_prefix>/command/<component:id> where individual components accept specific commands

    In meinem Fall also:
    shellies/shellyplusplugs-kitchenboostfan/command/switch:0

    Ich hab versucht diverse Dinge hin zu schreiben

    * on
    * on,0
    * true
    * 1

    auf nichts hat der Shelly reagiert. Auch habe ich versucht switch durch output oder relay zu ersetzen. Geht alles nicht.
    Das wäre noch ein akzeptables Topic, was auch von anderen Microcontrollern aus dezentral ansprechbar wäre und in $homeassistant keine harakiri workarounds zum payload craften braucht. Und leider ist das jetzt so unnötig verfrickelt in der neuen Firmware, dass nichtmal mehr chatgpt ansatzweise durchsteigt.

    hmpf. Und der neue Shelly PLUS Plug S ist nicht sonderlich gesprächig. Von den alten Shellies war ich gewohnt, dass die alle paar Sekunden mal wieder ein status-Update von sich gegeben haben. (sehr löblich)

    Hat von euch das jemand hinbekommen, die neuen Shellies per mqtt anzusprechen ohne davor jedes Mal googlen zu müssen? Dieses JSON-Zeug in mqtt ist echt Krebs.

  • Hmm :/ meine Plus Plug S haben sich ganz einfach in HA einbinden lassen. Hierzu war nur die IP des MQTT Servers einzustellen und einen Benutzer nebst Passwort einzutragen. Das Gerät taucht dann automatisch in den MQTT-Entities von HA auf ohne irgendwelche kryptischen Eingaben in der Konfiguration zu machen.

    Schalten und messen funktioniert auch und das ohne "nachzuhelfen".

  • Hallo Sprinterfreak ,

    jetzt hast du mich neugierig gemacht :)

    Nach meiner Einschätzung sind verschiedene Design Ansätze für MQTT völlig in Ordnung. Mir persönlich ist da ein kleines JSON viel lieber als ein komplexes XML :D.

    Ich hab mir kurz die Doku angesehen und kann dich beruhigen. Die von dir gewählte Variante 'MQTT Control' verwendet kein JSON. Dieses hättest du nur bei "RPC over MQTT" oder allen anderen RPC Calls.

    Bei mir funktioniert dieser Part wie du ihn erwartest, aber dazu komme ich gleich.


    Ich fange mal bei null an, um den Fehler einzugrenzen

    Ich gehe davon aus, dass du 'MQTT Control' aktiviert hast und dein Prefix stimmt und MQTT aktiv verbunden ist.

    Der Inhalt kann nicht angezeigt werden, da Sie keine Berechtigung haben, diesen Inhalt zu sehen.


    Zum Debuggen von MQTT kannst du folgendes machen:

    Installiere dir die Mosquitto-Tools oder etwas vergleichbares um den MQTT Traffic mitzulesen. Es gibt sogar einen Error Pfad auf den du subscriben kannst.

    Code
    # Alles mitlesen
    mosquitto_sub -h 192.168.xxx.xxx -t "shelly-hoehle/#" -u "user" -P "password"
    
    # Nur den Error Pfad mitlesen
    mosquitto_sub -h 192.168.xxx.xxx -t "shelly-hoehle/error/switch:0" -u "user" -P "password"
    
    # weitere Pfade siehe Doku

    Somit kannst du sicherstellen, dass Home Assistant die richtigen Werte übermittelt.

    Dieser Befehl funktioniert zum Einschalten:

    Code
    mosquitto_pub -h 192.168.xxx.xxx -t "shelly-hoehle/command/switch:0" -u "user" -P "password" -m "on"

    Valide Werte für dich wären "on", "off", "toogle". Siehe hier: https://shelly-api-docs.shelly.cloud/gen2/Component…ch#mqtt-control

    Wenn das alles funktioniert, kannst du die Fehlersuche auf HA eingrenzen.

    Home Assistant MQTT

    Hier fehlt mir im Augenblick etwas Zeit mich reinzudenken. Deshalb nur meine Gedanken, was ich kontrollieren würde.

    Code
      state_value_template: "{{ iif(value_json['output'], 'true', 'false') }}"

    Versuche doch erstmal nur on, off oder toggle - zum herantasten:

    Code
    state_value_template: "toggle"
    • Passt hier überhaupt 'iif' oder müsste es 'if' heißen? Ich weiß es nicht auswendig.
    • Schicke doch mal "{{ value_json['output'] }} ab und beobachte, was du z.B. mit o.g. Tool auf der Konsole sehen kannst. Was wird hier geschickt?


    Ich weiß aus eigener Erfahrung, dass diese Variablen Berechnung in dieser Double Mustache Syntax (wie heißt die eigentlich genau?) im YAML extrem frickelig ist. Da gehen einem komplett die Augen über, vor allem wenn du auch noch URL Encodierung für REST Commands dazu nimmst.

    Hier an der Stelle verstehe und Teile ich dann auch deinen Frust. :beer:

    Schreibe mal wie weit du gekommen bist, vielleicht kommst du ja nun schon bis zum Ziel.


    Viele Grüße,
    Marco

  • Ich glaube ich habe deinen Texte beim ersten mal nicht richtig verstanden und habe mich von deinem verständlichem Frust ablenken lassen.
    Bei dir funktioniert bereits alles, aber der Weg dorthin war sehr steinig?

    Ich lass meinen Post dennoch im Original stehen.

    Zitat

    Übrigens was in der Developer-Doku steht, funktioniert auch nicht.

    Den Punkt konnte ich meiner Ansicht nach mit meinem Post widerlegen. Mit dem Mosquitto Befehl geht es, wie in der Dokumentation beschrieben.

    Zitat

    Hat von euch das jemand hinbekommen, die neuen Shellies per mqtt anzusprechen ohne davor jedes Mal googlen zu müssen? Dieses JSON-Zeug in mqtt ist echt Krebs.

    Ja, die Shellys schon. Ich verstehe die Doku mittlerweile relativ gut, auch wenn nicht immer einfach zu Lesen.

    Bei Home Assistant und YAML ist das schon deutlich schwieriger für mich gewesen. Und dort ist diese JSON Transformation naturgemäß schwer zu Lesen.
    Dies macht man so, weil man sehr universell und Leistungsfähig sein möchte. Anders bekommt man es so generisch und konfigurierbar nicht sinnvoll hin.
    Hier wären eher Wrapper in Form von Addons schön, so dass man sich das gefrickel sparen kann und einfach nur ein Addon konfiguriert.

    Viele Grüße,
    Marco

  • Hi,

    Captain_Byte nö. Der Shelly hat auf mqtt nichts nach homeassistant/# geschrieben. Also kann da auch nichts autodiscovert haben.

    marco.gr Leider hat mein Shelly die ganzen Optionen die Du zeigst halt einfach nicht. Und dementsprechend existieren auch die Topics die Du beschreibst, was ich geschrieben habe auch schon probiert zu haben, einfach nicht.

    Der Inhalt kann nicht angezeigt werden, da Sie keine Berechtigung haben, diesen Inhalt zu sehen.

    Das wars, was ich an Optionen hab.

    Zum Abgleich der Firmwarestand:

    Der Inhalt kann nicht angezeigt werden, da Sie keine Berechtigung haben, diesen Inhalt zu sehen.

    Ich nehme an marco.gr , Du hast noch eine ältere Firmware. Solltest Du dann lieber nicht updaten, weil dann ist bei Dir alles in den Fritten...
    Übrigens die Template-Expression in den Double-Curly-Brackets nennt sich Jinja2. Ansich sehr geil. Aber man sollte das halt nicht brauchen müssen um eine simple Aktion wie "Relais Ein" auszuführen.

    Das mit den regelmäßigen Status-Updates hat sich jetzt auch geklärt. Ich hatte keinen NTP eingerichtet. Das Ding hatte keine Uhzeit. (Brauch es auch bei meiner Anwendung nicht!) Weil jetzt aber in diesen Be.... JSON-Payloads auch Energiemesswerte jedes Mal übertragen werden ist dabei wohl die Software auf dem Shelly beim erstellen der Payload kaputt gegangen. Wieder total unnötig, wenn ich nur den Status eines Relais haben will.

  • Dieses Thema enthält 12 weitere Beiträge, die nur für registrierte Benutzer sichtbar sind.