myUtils für Shelly mit Originalfirmware: http commands im MQTT2_DEVICE

Begonnen von supernova1963, 19 Juli 2019, 18:09:59

Vorheriges Thema - Nächstes Thema

supernova1963

Hallo zusammen,

auf Rückfrage im Shelly Forum werden derzeit keine weiteren mqtt topics als commands unterstützt.
Da die http Schnittstelle deutlich mehr Optionen bietet, habe ich mir als Zwischenlösung eine 99_myShellyUtils.pm erstellt.

Es können diese http commands an den Shelly gesendet werden.
Die Antworten werden anschließend an den MQTT2_Server in ein sub topic des Shelly mit dem Namen des commands gesendet und vom MQTT2_CLIENT device des Shelly in readings gewandelt.

Nach dem Hochladen der anliegenden 99_myShellyUtils.pm Datei in das /opt/fhem/FHEM - Verzeichnis (linux Standard), muss ausschließlich das Attribut setList um folgende 2 Zeilen erweitert werden.

x_httpcom_login {StorePassword($defs{$NAME},$EVTPART1) }
x_httpcom {  X_PerformShellyHttpRequest($NAME,ReadingsVal($NAME,"ip","").",".$EVTPART1.",".ReadPassword($defs{$NAME})) }

Bitte nicht vergessen das neue my_Utils Modul mit diesem fhem-Befehl zu laden:
reload 99_myShellyUtils.pm
Der set Befehl x_httpcom_login wird einmalig eingegeben und, dank CoolTux, verschlüsselt zum Shelly device abgelegt.
set <Shelly device Name> x_httpcom_login <user>:<password>
Damit der MQTT2_SERVER den eingehenden json-String verarbeitet und in readings umwandelt, muss das Attribut rePublish gesetzt werden.
attr <MQTT2_SERVER Name> rePublish 1

Danach kann der neue set - Befehl z.B. zum auslesen aller settings des Shelly genutzt werden:
set <Shelly device> x_httpcom settings
Als Ergebnis sollten alle Einstellungen des Shelly als einzelne readings zur Verfügung stehen.

Soweit, so gut, aber ... Leider schaffe ich es bisher noch nicht, dass das http_login Passwort mit dem user unverschlüsselt in Klarschrift angezeigt werden.
Über Vorschläge hierzu und Verbesserungen und Korrekturen würde ich mich sehr freuen.

lg

Gernot

Hinweis:
Bitte nur eigenverantwortlich in geeigneter Umgebung testen! Es soll nur eine temporäre Übergangslösung für meine Wünsche zur Überwachung und Steuerung der Shellies darstellen. Idealerweise würden die Shellies die http commands auch über MQTT ausführen.

supernova1963

#1
Meine aktuelle myShellyUtils.pm (ohne mqtt-publish!)

Aktualisiert, da aktuell aus anderem Thema hierauf verwiesen wird.

lg

Gernot

PS: Achtung neue Bezeichnungen!

Nach dem Hochladen der anliegenden 99_myShellyUtils.pm Datei in das /opt/fhem/FHEM - Verzeichnis (linux Standard), muss ausschließlich das Attribut setList um folgende 2 Zeilen erweitert werden.

x_httpcom_login {shelly_SetLogin($NAME,$EVTPART1) }
x_httpcom {  shelly_HttpRequest($NAME,ReadingsVal($NAME,"ip","").",".$EVTPART1.",".shelly_ReadLogin($NAME) }


Der set Befehl x_httpcom_login wird einmalig eingegeben und, dank CoolTux, verschlüsselt zum Shelly device abgelegt.
set <Shelly device Name> x_httpcom_login <user>:<password>
Damit der MQTT2_SERVER den eingehenden json-String verarbeitet und in readings umwandelt, muss das Attribut rePublish gesetzt werden.

Danach kann der neue set - Befehl z.B. zum auslesen aller settings des Shelly genutzt werden:
set <Shelly device> x_httpcom settings
Als Ergebnis sollten alle Einstellungen des Shelly als einzelne readings zur Verfügung stehen.

EDIT 11.08.2020: Anhang aktualisiert

alexander.waller

Ein "reload reload 99_myShellyUtils.pm" ergibt folgendes:

syntax error at ./FHEM/99_myShellyUtils.pm line 50, near "get 'http://'"
Global symbol "$resultjson" requires explicit package name (did you forget to declare "my $resultjson"?) at ./FHEM/99_myShellyUtils.pm line 53.
Global symbol "$resultjson" requires explicit package name (did you forget to declare "my $resultjson"?) at ./FHEM/99_myShellyUtils.pm line 67.

Was stimmt bei mir nicht?

SG
Alex.

supernova1963


gestein

Hallo,

ich verwende Deinen Code um bei meinen Shellys verschiedene Befehle wie "on-for-timer" nachzurüsten.
Funktioniert ganz gut.

Mir ist nun eines aufgefallen:
Sobald der http-Aufruf erfolgreich ist, schreibst Du die Rückgabewerte in das Device zurück.
Allerdings sind die Shelly-Antworten per MQTT und HTTP inkonsistent.

Bei einem Shelly 1 kommt z.B. die Antwort per HTTP auf ein "on-for-timer" und Dein Code schreibt die Werte in die folgenden Readings:
has_timer
ison
overpower
source
timer_duration
timer_remaining
timer_started


Per MQTT-"announce" werden aber die folgenden Readings angelegt:
relays_1_has_timer
relays_1_ison
relays_1_overpower
relays_1_source
relays_1_timer_duration
relays_1_timer_remaining
relays_1_timer_started


Könnte man beim Aufruf von shelly_HttpRequest einen Parameter als Prefix mitgeben, der dann beim Schreiben der Readings beim Namen vorangestellt wird?
Ähnlich wie bei "json2nameValue"?

Danke, lg, Gerhard

supernova1963

Hallo Gerhard,

echt blöd, dass HTTP nicht mit MQTT übereinstimmen.

Dein Vorschlag einen zusätzlichen Parameter zu verwenden, ist sicher auch machbar, aber da dieser nicht parallel im fhem set Befehl nicht abgefragt werden kann, müßte man die gesamte Syntax ändern.

Auf die Schnelle und nicht getestet habe ich versucht den http - command zu überprüfen, ob ein ".../{index}" mitgegeben wird und ggf. einen Prefix für die Readings daraus zu bilden.

Vielleicht hilft es bereits ...

lg

Gernot

Edit: 18:30 geänderter Anhang!
Edit: 01.05.2022 geänderter Anhang auf Empfehlung von @gestein

gestein

Hallo,

Bitte entschuldige, dass ich mich erst jetzt wieder melde.
Es klappte damals nicht gleich auf Anhieb und dann verging die Zeit viel zu schnell.

Nach ein paar Versuchen konnte ich die neue Abfrage in der Funktion ,,shelly_HttpResponse" etwas abändern.
# Prüfung ob es sich um einen HTTP Command mit index Angabe handelt
        my $regex = qr/(?<pref1>[\w]*)\/(?<pref2>[\d])[\?|\/]/mp;
        if ( $httpCMND =~ /$regex/g ) {
          $ReadingsPrefix = $+{pref1}."s_".($+{pref2}+1)."_";
        }


In der Definition der regex musste das erste "\/" raus, weil das $httpCMND zumindest bei mir kein führendes "/" enthält.
Die Definition von $ReadingsPrefix, weil der Prefix "relays_1_" bei "1" beginnt und nicht bei "0" (der Index heißt "relay/0", während der Prefix "relays_1_" heißt).

So funktioniert es zumindest bei mir mit "on-for-timer".

Danke Dir
Lg, Gerhard


supernova1963

Hey,

danke für deinen Hinweis. Ich habe den Anhang entsprechend oben geändert.

Gernot