Shelly und MQTT: Firmware Update anzeigen

Geflasht oder ungeflasht ...

Moderator: seppy

Moadin
Beiträge: 6
Registriert: 11. Apr 2020 14:08
Answers: 0

Shelly und MQTT: Firmware Update anzeigen

Beitrag von Moadin »

Liebe Forummitglieder

ich versuche bei einem Shelly in Openhab anzuzeigen, ob ein stable Firmware-Update zur Verfügung steht. Bei einem HT Shelly geht das sehr gut, weil dieser announce dies zur Verfügung stellt ("new_fw": false). Ein Shelly 1PM macht das nicht, dort steht im status/sys "available_updates": { ...}
Jetzt möchte ich das gerne in Openhab darstellen, dass wenn ein Update zur Verfügung steht, er mir wie bei den HT-Shelly anzeigt "ON", und wenn keines zur Verfügung steht "OFF".
Ich habe folgendes versucht:

HT Shelly (das funktioniert):

Code: Alles auswählen

UID: mqtt:topic:mosquitto:ht_aussen
label: Shelly HT Aussen
thingTypeUID: mqtt:topic
configuration: {}
bridgeUID: mqtt:broker:mosquitto
location: Balkon
channels:
  - id: fw_update
    channelTypeUID: mqtt:switch
    label: Firmware Update
    configuration:
      stateTopic: shellies/shellyht-aussen/announce
      transformationPattern: JSONPATH:$.new_fw
      off: "false"
      on: "true"
Ich habe dann ein Item gemacht und dort als Switch angelegt und er sollte mir anzeigen, wenn ein FW Update möglich ist.
Wie mache ich das bei einem Shelly 1PM?

Code: Alles auswählen

UID: mqtt:topic:mosquitto:steckdose_balkon_seite
label: Steckdose Balkon seite
thingTypeUID: mqtt:topic
configuration: {}
bridgeUID: mqtt:broker:mosquitto
location: Balkon
channels:
  - id: fw_update
    channelTypeUID: mqtt:string
    label: Firmware Update
    configuration:
      stateTopic: shellyplus1pm-aussensteckdose/status/sys
      transformationPattern: JSONPATH:$.available_updates.stable.version
Hier habe ich nun ein String-Item genommen, weil er ja keine Zahl liefert. Und eigentlich möchte ich sowieso nur, dass wenn im Element available_updates ein "stable" drin steht, soll er einfach "ON" anzeigen. Wenn das Element leer ist oder ein "beta" drin steht, soll er "OFF" anzeigen.

Dies liefert das MQTT (den Code habe ich von der Shelly-Dokumentation, sieht bei mir aber genau gleich aus):

Code: Alles auswählen

"sys": {
    "mac": "A8032ABE54DC",
    "restart_required": false,
    "time": "16:41",
    "unixtime": 1675262494,
    "uptime": 571,
    "ram_size": 234820,
    "ram_free": 162244,
    "fs_size": 458752,
    "fs_free": 110592,
    "cfg_rev": 7,
    "kvs_rev": 1,
    "schedule_rev": 0,
    "webhook_rev": 0,
    "available_updates": {
      "beta": {
        "version": "0.13.0-beta1"
      },
      "stable": {
        "version": "0.12.0"
      }
    }
  },
Kann mir jemand weiterhelfen? Vielen Dank!

Benutzeravatar
udo1toni
Beiträge: 15240
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Shelly und MQTT: Firmware Update anzeigen

Beitrag von udo1toni »

Als ersten Versuch:

Code: Alles auswählen

UID: mqtt:topic:mosquitto:steckdose_balkon_seite
label: Steckdose Balkon seite
thingTypeUID: mqtt:topic
configuration: {}
bridgeUID: mqtt:broker:mosquitto
location: Balkon
channels:
  - id: fw_update
    channelTypeUID: mqtt:string
    label: Firmware Update
    configuration:
      stateTopic: shellyplus1pm-aussensteckdose/status/sys
      transformationPattern: REGEX:(.*stable.*)∩JSONPATH:$.available_updates.stable.version
Wobei auch hier lediglich die Versionsnummer geliefert wird. Durch das vorangestellte REGEX wird aber sichergestellt, dass das Wort stable im JSON Objekt vorhanden ist. REGEX muss natürlich installiert sein, genau wie JSONPath.
Frage dazu: zeigt Shelly hier einfach nur die letzte stable (bzw. beta) Version an, oder zeigt es die letzte stable/beta Version an, die neuer als die installierte Version ist?
Falls letzteres, würde es ja reichen, auszuwerten, ob in stable.version etwas drin steht. Das wäre am einfachsten mit einem Script zu erledigen, dann kan man auch auf das Intersection-Symbol ∩ verzichten und stattdessen sowohl REGEX als auch JSON im Script mit abfrühstücken. Das Script könnte dann zwei beliebige Strings als Ergebnis liefern, also auch ON bzw. OFF, für "stable.version liefert keine/eine leere Zeichenkette"
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Harka
Beiträge: 487
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: Shelly und MQTT: Firmware Update anzeigen

Beitrag von Harka »

Moin,
ich habe hier ein wenig rum gespielt und bin auf folgende Lösung gekommen. Hierfür muss "JavaScript Scripting" installiert sein. Geht möglicherweise sogar noch "schöner"

Code: Alles auswählen

transformationPattern: JS:|var obj = JSON.stringify(JSON.parse(input).available_updates); obj.indexOf('stable') > 0 ? 'ON':'OFF';

Moadin
Beiträge: 6
Registriert: 11. Apr 2020 14:08
Answers: 0

Re: Shelly und MQTT: Firmware Update anzeigen

Beitrag von Moadin »

Vielen Dank für die Tipps. Ich habe mal den ersten umgesetzt und alle Addons installiert:

Code: Alles auswählen

  - id: fw_update
    channelTypeUID: mqtt:string
    label: Firmware Update
    configuration:
      stateTopic: shellyplus1pm-aussensteckdose/status/sys
      transformationPattern: REGEX:(.*stable.*)∩JSONPATH:$.available_updates.stable.version
Als Item habe ich folgendes:

Code: Alles auswählen

label: Firmware Update
type: String
category: ""
groupNames: []
tags: []
Gibt immer "Null" zurück, obwohl ich weiss, dass der Shelly ein Update machen kann auf eine stable Version. Ich habe auch die Variante mit Java versucht, mit dem gleichen Ergebnis. Somit gehe ich davon aus, dass mein Item falsch ist. Ist dem so?

Liebe Grüsse

Benutzeravatar
udo1toni
Beiträge: 15240
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Shelly und MQTT: Firmware Update anzeigen

Beitrag von udo1toni »

Ja, es sieht so aus, dass Dein JSON von oben gar nicht vollständig ist.

Wie lautet das exakte Topic?
Wie lautet die exakte Payload?

Falls nur die erste öffnende Klammer, sowie ab dem letzten Komma die restliche Antwort fehlt, müsste der korrekte Ausdruck dann

Code: Alles auswählen

$.sys.available_updates.stable.version
lauten, um auf die Versionsnummer zu kommen.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Harka
Beiträge: 487
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: Shelly und MQTT: Firmware Update anzeigen

Beitrag von Harka »

Hier klappen beide Lösungsansätze. Sie liefern nach einem Restart des Shellys ON beziehungsweise die Versionsnummer.

Code: Alles auswählen

  - id: Shelly2_Update
    channelTypeUID: mqtt:switch
    label: Shelly2_Update
    description: ""
    configuration:
      stateTopic: ShellyXXXXX/status/sys
      transformationPattern:
        - JS:|var obj = JSON.stringify(JSON.parse(input).available_updates);
          obj.indexOf('stable') > 0 ? 'ON':'OFF';
  - id: Shelly2_UdoRegEx
    channelTypeUID: mqtt:string
    label: Shelly2_UdoRegEx
    description: ""
    configuration:
      stateTopic: ShellyXXXXX/status/sys
      transformationPattern:
        - REGEX:(.*stable.*)∩JSONPATH:$.available_updates.stable.version
e: meine ursprüngliche Idee vom Sonntag habe ich auch gerade zum Laufen gebracht

Code: Alles auswählen

JS:|var obj = JSON.parse(input).available_updates; typeof obj.stable == 'undefined' ? 'OFF':'ON';

Moadin
Beiträge: 6
Registriert: 11. Apr 2020 14:08
Answers: 0

Re: Shelly und MQTT: Firmware Update anzeigen

Beitrag von Moadin »

Vielen Dank für eure Rückmeldungen. Jetzt zeigt mir der Shelly gar nichts mehr an. Ich erhalte im MQTT nur noch dies (vgl. Bild). Ich muss erst mal schauen, wie ich wieder an die Info für die Updates komme.
An was könnte das liegen, dass im MQTT nichts mehr angezeigt wird? Ich weiss, das gehört eigentlich nicht in diesen Thread.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
udo1toni
Beiträge: 15240
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Shelly und MQTT: Firmware Update anzeigen

Beitrag von udo1toni »

Screenshots sind Müll! Bitte wenn, dann im MQTT Explorer (oder auch anderen Debug Tools) Topic und Payload als Text kopieren und hier (als Code markiert) einfügen. Das hat auch den Vorteil, dass Du leicht vor dem veröffentlichen im Forum Daten unkenntlich machen kannst, falls das notwendig sein sollte.
Um den Fehler eingrenzen zu können, müssten wir die exakte Definition des Channels in openHAB kennen, sowie die exakten Topics und die passende Payload aus dem MQTT Explorer.
Siehst Du in openhab.log eine Fehlermeldung bzgl. dem mqtt Thing/Channel? Hast Du openHAB mal neu gestartet?
Funktioniert mqtt ansonsten klaglos (also nur das Firmware-Update-Topic ist vom Ausfall betroffen)?
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Harka
Beiträge: 487
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: Shelly und MQTT: Firmware Update anzeigen

Beitrag von Harka »

.../status/sys wird hier immer bespielt wenn der Shelly neu startet. Ob danach erst wieder Musik ist, wenn eine neuere Version angekündigt wird oder ob das zwischendurch aufgefrischt wird, kann ich nicht sagen.

Moadin
Beiträge: 6
Registriert: 11. Apr 2020 14:08
Answers: 0

Re: Shelly und MQTT: Firmware Update anzeigen

Beitrag von Moadin »

Ich habe in den Shellies direkt kurz die Funktion "Generic status update over MQTT" deaktiviert und dann wieder aktiviert und sofort erschien das Status wieder im MQTT Explorer. Dennoch scheint etwas nicht zu stimmen. Ich habe immer Fehlermeldungen im Logviewer.

In Openhab habe ich folgendes eingetragen als channel:

Code: Alles auswählen

  - id: fw_update
    channelTypeUID: mqtt:string
    label: Firmware Update
    configuration:
      stateTopic: shellyplusht_wohnzimmer/status/sys
      transformationPattern: "[REGEX:(.*stable.*)∩JSONPATH:$.available_updates.stable.version]"
und als zugehöriges item

Code: Alles auswählen

label: Firmware Update
type: String
category: ""
groupNames:
  - wohnzimmer
tags: []
Ich habe hier die Auszüge aus MQTT Explorer. Das ist der Value, den ich von diesem Pfad erhalte: shellyplusht_wohnzimmer/status/sys

Code: Alles auswählen

{"mac":"B8D61A8B2720","restart_required":false,"time":null,"unixtime":null,"uptime":2,"ram_size":268948,"ram_free":142096,"fs_size":393216,"fs_free":172032,"cfg_rev":26,"kvs_rev":0,"webhook_rev":0,"available_updates":{},"wakeup_reason":{"boot":"deepsleep_wake","cause":"status_update"},"wakeup_period":600,"reset_reason":8}
Der logviewer (frontail) von Openhab liefert folgendes:

Code: Alles auswählen

2024-09-15 13:14:51.524 [WARN ] [t.generic.ChannelStateTransformation] - Transformation service [REGEX for pattern (.*stable.*) not found!
und weiter:

Code: Alles auswählen

2024-09-15 13:14:51.525 [WARN ] [t.generic.ChannelStateTransformation] - Executing the JSONPATH-transformation failed: Invalid path '$.available_updates.stable.version]' in '{"mac":"B8D61A8B2720","restart_required":false,"time":null,"unixtime":null,"uptime":1,"ram_size":268944,"ram_free":142120,"fs_size":393216,"fs_free":172032,"cfg_rev":26,"kvs_rev":0,"webhook_rev":0,"available_updates":{},"wakeup_reason":{"boot":"deepsleep_wake","cause":"status_update"},"wakeup_period":600,"reset_reason":8}'. Pattern: '$.available_updates.stable.version]'. Value: '{"mac":"B8D61A8B2720","restart_required":false,"time":null,"unixtime":null,"uptime":1,"ram_size":268944,"ram_free":142120,"fs_size":393216,"fs_free":172032,"cfg_rev":26,"kvs_rev":0,"webhook_rev":0,"available_updates":{},"wakeup_reason":{"boot":"deepsleep_wake","cause":"status_update"},"wakeup_period":600,"reset_reason":8}'
Wenn kein Update vorhanden ist, dann ist auch der Pfad falsch, das ist mir schon klar, weil bei available_updates natürlich nichts drin steht. Ich danke euch sehr für eure Rückmeldungen.

Antworten