FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: jannis am 03 Dezember 2020, 12:37:30

Titel: stateFormat ... reagiert nicht auf Änderung des Perl-Codes
Beitrag von: jannis am 03 Dezember 2020, 12:37:30
Ich setze stateFormat mit Perl ein.

Wenn ich jetzt fogenden Code in 99_myUtils.pm schreibe

sub jkGefrierschrank($) {
my ($geraet) = @_;
return "$geraet ist eiskalt";
}


... und in dann im Device nutze:
attr Gefrierschrank1 stateFormat { jkGefrierschrank("$name") }

... steht beim Device korrekt:
Gefrierschrank1 ist eiskalt

soweit so gut.

Ändere ich jetzt etwas in dem Perlcode, ersetze z.B. eiskalt durch bitterkalt ...

sub jkGefrierschrank($) {
my ($geraet) = @_;
return "$geraet ist bitterkalt";
}


... wird das in der Anzeige des Devices nicht geändert ... da steht noch immer

Gefrierschrank1 ist eiskalt

und nicht
Gefrierschrank1 ist bitterkalt

Was ich erfolglos probiert habe:

Das einzige was geholfen hat:
Das Attribut "stateFormat" im Device zum Bearbeiten aufrufen und ohne Änderung speichern.

Jetzt steht oben beim Device richtig:
Gefrierschrank1 ist bitterkalt

Was ist  der korrekte Weg, um nach Perl-Code-Änderungen eine korrekte stateFormat-Anzeige zu erhalten?
Sieht jemand meinen/e Denkfehler? Und kann mir ein paar Anstöße geben, um Fhem noch besser zu verstehen?
Titel: Antw:stateFormat ... reagiert nicht auf Änderung des Perl-Codes
Beitrag von: Beta-User am 03 Dezember 2020, 12:58:24
Es muss einfach nur (irgendein) Reading an dem betreffenden Device aktualisiert werden; der stateFormat-Code wird am Ende jeder Reading-Aktualisierungsschleife ausgeführt.
Titel: Antw:stateFormat ... reagiert nicht auf Änderung des Perl-Codes
Beitrag von: jannis am 03 Dezember 2020, 13:12:24
Zitat von: Beta-User am 03 Dezember 2020, 12:58:24
Es muss einfach nur (irgendein) Reading an dem betreffenden Device aktualisiert werden; der stateFormat-Code wird am Ende jeder Reading-Aktualisierungsschleife ausgeführt.

Ein bißchen habe ich das befürchtet. Bei meinem Device kommen aber nur wenige und selten Readings an. Kann ich das stateFormat auch anders anstoßen?
Titel: Antw:stateFormat ... reagiert nicht auf Änderung des Perl-Codes
Beitrag von: Beta-User am 03 Dezember 2020, 13:17:10
Ich wüßte im Moment weder wie, noch wieso.

Evtl. fällt jemand was ein, wenn du den use-case etwas näher erläuterst.
Titel: Antw:stateFormat ... reagiert nicht auf Änderung des Perl-Codes
Beitrag von: frank am 03 Dezember 2020, 13:18:19
hilft ein browser refresh?
Titel: Antw:stateFormat ... reagiert nicht auf Änderung des Perl-Codes
Beitrag von: Beta-User am 03 Dezember 2020, 13:26:20
Zitat von: frank am 03 Dezember 2020, 13:18:19
hilft ein browser refresh?
Vermutlich nicht. evalStateFormat() wird eigentlich nur innerhalb des initialen Setzen des Attributs (https://svn.fhem.de/trac/browser/trunk/fhem/fhem.pl#L3068) und eben gegen Ende von readingsEndUpdate() aufgerufen.

Aber wie angedeutet: ich verstehe nicht wirklich, für was man sowas braucht, für mich ist die Frage "von hinten durch ..."-verdächtig, aber vermutlich übersehe ich mal wieder was...
Titel: Antw:stateFormat ... reagiert nicht auf Änderung des Perl-Codes
Beitrag von: frank am 03 Dezember 2020, 13:39:04
ZitatAber wie angedeutet: ich verstehe nicht wirklich, für was man sowas braucht, für mich ist die Frage "von hinten durch ..."-verdächtig, aber vermutlich übersehe ich mal wieder was...
ich bin auch schon neugierig!  8)
Titel: Antw:stateFormat ... reagiert nicht auf Änderung des Perl-Codes
Beitrag von: jannis am 03 Dezember 2020, 13:52:10
Zitat von: frank am 03 Dezember 2020, 13:18:19
hilft ein browser refresh?

War auch erfolglos ... auch Browser-Cache löschen.

Zum Usecase:
Der Temperatursensor des Gefrierschranks sendet alle 2 Stunden einen Temperaturwert. Also kommt nur alle 2 Stunden ein Reading an. Wenn ich zwischenzeitliche an meinem Perl-Code bastle und die stateFormat Ausgabe verändere, will ich nicht 2h warten, bis sich die Anzeige im Device aktualisiert.

Und ja: das Basteln am Perlcode kommt natürlich nicht häufig vor. Wenn man aber dabei ist, will man doch sofort die Ausgabe prüfen ... bzw. würde gerne ...
Titel: Antw:stateFormat ... reagiert nicht auf Änderung des Perl-Codes
Beitrag von: Beta-User am 03 Dezember 2020, 13:57:03
...dann wirf es doch direkt in die Kommandozeile:

{ jkGefrierschrank("Gefrierschrank1") }
PS: in stateFormat-Code kannst du die Quotes um das $name weglassen. Dann sieht man auch besser, dass es ein Parameter ist...

PPS: Falls du eigentlich farbige Aufgabe als devStateIcon haben willst (dunkelblau=eiskalt etc. ...): Schau mal nach pah-Color im wiki zu Color (aber nutze es nicht in stateFormat, sondern in devStateIcon, bitte).
Titel: Antw:stateFormat ... reagiert nicht auf Änderung des Perl-Codes
Beitrag von: jannis am 03 Dezember 2020, 16:25:54
Eins noch:

Ich hätte gerne dass wenn sich im Device Thermometer die temperature ändert sich automatisch auch die "Grad"zahl im Device Gefrierschrank ändert:

Zitat
DEVICE           reading                      attribut
----------------------------------------------------------------------------------------
Thermometer   temperature                -
Gefrierschrank  Grad                          userReadings Grad { ReadingsVal("Thermometer","temperature",0) }
                        dummyreading

Mein Gefrierschrank hat keine eigenen readings. Über userReadings soll er sich aber die aktuelle Temperatur vom Thermometer holen.

Behelfsmäßig habe ich beim Gefrierschrank ein dummyreading eingefügt und kann das per notify setreading Gefrierschrank dummyreading 9999
anstoßen. Schön finde ich das nicht. Aber ich nehme an, für userReadings gilt genau das Gleiche wie für stateFormat:
Das Device muss angestoßen werden, sonst reagiert sein "userReading" nicht.
Titel: Antw:stateFormat ... reagiert nicht auf Änderung des Perl-Codes
Beitrag von: Beta-User am 03 Dezember 2020, 16:32:22
Zitat von: Beta-User am 03 Dezember 2020, 13:26:20
für mich ist die Frage "von hinten durch ..."-verdächtig, aber vermutlich übersehe ich mal wieder was...
qed...

Und via userReadings auf "fremde" Devices hören geht auch nicht.

Schau dir mal readingsProxy (https://fhem.de/commandref_modular.html#readingsProxy) an, das müßte zumindest einen Teil der Aufgabenstellung erledigen können, wenn ich die wenigen Bruchstücke jetzt korrekt sortiert habe.

(Aber trotzdem bleibt dieses Informationsgeschubse "strange". Warum heißt nicht gleich das Thermometer "Gefrierschrank"? Warum soll alles mögliche in ein anderes Device? Zu Anzeigezwecken wäre dann z.B. ReadingsGroup m.E. einfacher... Fragen über Fragen...)
Titel: Antw:stateFormat ... reagiert nicht auf Änderung des Perl-Codes
Beitrag von: jannis am 03 Dezember 2020, 16:57:29
Zitat von: Beta-User am 03 Dezember 2020, 16:32:22
(Aber trotzdem bleibt dieses Informationsgeschubse "strange". Warum heißt nicht gleich das Thermometer "Gefrierschrank"? Warum soll alles mögliche in ein anderes Device? Zu Anzeigezwecken wäre dann z.B. ReadingsGroup m.E. einfacher... Fragen über Fragen...)

Das Thermometer heißt nicht "Gefrierschrank", weil ich eine ganze Reihe von Thermometern für die unterschiedlichsten Vorgänge habe, die ich je nach Wunsch gemeinsam über strukturierte Namen anspechen will. Außerdem habe ich auch noch eine WLAN-Steckdose, mit der ich den Stromverbrauch für den Gefrierschrank messe ... und ich kann ja nicht alles Gefrierschrank nennen :)

Aber ich verstehe schon, dass das Geschubse stange ist. Im Grunde kann ich die Daten ja jederzeit wieder da abfragen, wo sie angefallen sind (z.B. dem Thermometer). So liegen sie nicht redundant herum.

Mein dummy-Device "Gefrierschrank" werde ich aber beibehalten, um dort z.B. als Attribut zu speichern, wann er zuletzt abgetaut wurde oder welches meiner Device der Thermostat und welches die WLAN-Steckdose ist ... falls ich die mal tausche.

"ReadingGroups" kenne ich noch nicht.
Titel: Antw:stateFormat ... reagiert nicht auf Änderung des Perl-Codes
Beitrag von: Beta-User am 03 Dezember 2020, 17:04:53
Ok, dann wird das etwas klarer.

Neben readingsGroup würde ich dann noch folgende Stichworte zum Austesten in den Raum werfen:

- "setreading" => einfach beim "Hauptschalter" (der Steckdose?) die betreffenden Readings zum Abtauen, ... mit abspeichern (alternativ: comment-Attribut oder eben userAttr+eigenes Attribut, wie du das scheinbar bisher gemacht hast...). Aber den Dummy nur wegen der Attribute bzw. eigenen Infos...? MAn. unnötig.
- Wenn man in FHEMWEB Dinge strukturieren will, gibt's dafür z.B. auch "group"
- Über "alias" kann man Dinge schon gleich nennen, aber ob das sinnvoll ist, ist wieder eine andere Frage (in verschiedenen Räumen soll das angeblich hilfreich sein, weil man dann einfach sagen kann: "Mach das Licht im ...zimmer an"...)