Perl als Teil eines fhem Befehls

Begonnen von pft42, 06 Dezember 2024, 13:44:05

Vorheriges Thema - Nächstes Thema

pft42

Hallo,
ich verwende fhem schon länger, ändere aber nur selten.
Gerade stolpere ich bei der Umsetzung einiger Tipps aus dem Forum:

Eingabe (in der Weboberfläche):
{sunset()}
Ergebnis
16:56:21ok

Eingabe:
defmod mydummy dummy
setstate mydummy 10:05:00

Ergebnis
STATE      10:05:00auch ok

Eingabe:
setstate mydummy {sunset()}
Ergebnis:
STATE      {sunset()}
Wieso das ? Was mache ich falsch?

Das passiert übrigens analog mit vielen anderen Beisielen, z.B. auch userReadings.
fhem Version ist aktuell, 6.3 und läuft als docker container

marvin78

Die Doku sagt nichts über Verwendung von Perl-Code als Value.

Was du machen kannst, ist sowas:

{fhem("setstate mydummy ".sunset())}

pft42

Vielen Dank, die Lösung vestehe ich.
Ich hatte das auch nicht aus der Doku sondern aus einem Forumsbeitrag:
Zitat von: Thomas41587 am 23 Juli 2020, 14:30:28Danke für die Aufklärungen, jetzt habe ich es verstanden und es funktioniert.
Ich editiere übrigens nicht in der cfg rum, sondern nutze maximal "raw definition".
Die Lösung, für alle die danach suchen:
defmod at_test at *{ReadingsVal("dummy_haus_uhrzeit_rolllaeden_90pz","state","00:00:00")} set dummy1 on
defmod dummy_haus_uhrzeit_rolllaeden_90pz dummy
setstate dummy_haus_uhrzeit_rolllaeden_90pz {sunset()}

Funktioniert selbstverständlich auch mit Uhrzeiten, dann die geschweiften Klammern aber weg lassen im state!

und im Wiki gibt es "ähnliche" Vorschläge Wiki userReadings
Hier geht es zwar um Attribute, aber ich vermute das geht dann so auch nicht, oder?

marvin78

userReadings ist ein ganz anderes Thema (siehe Doku).

Die Doku sagt bei setstate nichts von Perl-Code und so, wie du es da zitiert hast, funktioniert es auch nicht. Ich kenne den Kontext jedoch nicht. Was spricht gegen meinen Vorschlag?

Was hält dich davon ab, die Doku zu lesen?

pft42

Hi marvin78,

Wer sagt denn dass ich die Doku nicht lese?

Du sagst ja selbst, dass sie bei setstate nichts zu Perl-Code sagt. Also gibt sie auch keinen Hinweis, warum das zitierte Beispiel entgegen der Aussage nicht gehen sollte. Ich finde das irritierend.

Und logisch finde ich es auch nicht, dass Perl-Code an manchen Stellen geht und an anderen nicht.

Gegen dein Beispiel spricht natürlich auch nichts. Insofern Danke!

marvin78

Wenn nichts von Perl Code in der Doku zu einem Befehl steht, dann wird auch in den meisten Fällen kein Perl-Code evaluiert. Das spricht dagegen.

Es gibt sinnvolle Stellen für die Evaluierung von Perl-Code und es gibt Stellen, an denen ist nicht so sinvoll ist (Performance könnte bspw. ein Grund sein). Man sollte da immer nach der Doku gehen und wenn es auch nach Ausprobieren nicht geht, hat die Doku sicher auch recht. Tatsächlich ist aber auch der Einsatz von setstate nicht an vielen Stellen sinnvoll. Ich kann aber nicht beurteilen, ob in deinem Anwendungsfall auch so ist. Ergo: Was für dich nicht logisch ist, kann es am Ende doch sein.

pft42

Das hätte ich so nicht erwartet, dass in der Doloku steht, was nicht geht, aber ok.

Nur zum Verständnis (dein Code war ja gut!):
Mache ich das ganze mit Attribut und userReadings, da die Doku hier reichlich Perl-Code zeigt, dann habe ich das gleiche Problem:
attr mydummy userReadings Time {sunset()}

ergibt:
userReadings Time {sunset()}
Der Perl-Code wird also wieder nicht ausgewertet. wo ist mein Denkfehler?

marvin78

Hast du denn verstanden, was userReadings macht (= Doku gelesen)? Das Verhalten ist völlig korrekt.

pft42

Offenbar habe ich es nicht verstanden, also ist Dein "=" falsch.
Aber lassen wir das.

Otto123

Der entscheidende Satz der Doku:
ZitatAfter a single or bulk readings update ...
Also wenn Du bei Deiner Definition z.B. einset mydummy williabsetzt, wird Dein Perlcode ordnungsgemäß evaluiert. ;)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz