FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Sirel am 13 März 2024, 20:15:34

Titel: Fhem_set () Frage
Beitrag von: Sirel am 13 März 2024, 20:15:34
Hallo zusammen,
weiß jemand warum in dieser Konstellation nach Ablauf des Timers nicht das Device (Tor) aus dem Reading ausgelesen und geschaltet wird?

{
if(["^FTK_:open"] and AttrVal("$DEVICE","room","") =~ /Test/)
{
set_Exec("$DEVICE_timer",ReadingsVal("$DEVICE","closing_time",10),'fhem_set("set ReadingsVal("$DEVICE","Tor","") on")'); set_State("cmd_1",0)
}
}


Vielen Dank für eure Hilfe vorab,


Max
Titel: Aw: Fhem_set () Frage
Beitrag von: Damian am 13 März 2024, 21:55:10
dann eher:

'fhem("set ".ReadingsVal("$DEVICE","Tor","")." on"'

bei fhem_set dagegen braucht man set nicht mehr anzugeben.
Titel: Aw: Fhem_set () Frage
Beitrag von: Sirel am 13 März 2024, 22:49:48
Hi Damian,

besten Dank - funktioniert einwandfrei. Top!

Macht es ggf. Sinn so ein generalisiertes Beispiel mit ins Wiki aufzunehmen?
Ich könnte mir vorstellen das andere Nutzer vor ähnlichen Fragen stehen - also ebenfalls indirekt das zu schaltende Device im Ausführungsteil ermitteln und dann schalten wollen.
Wenn mich jemand fragt warum die Schreibweise 'ReadingsVal(...)' bei der Zeitangabe ohne >".< funktioniert, bei 'fhem_set(...)' hingegen dabei sein muss, könnte ich das nicht erklären.
Gestern habe ich an dieser kleinen Syntax fast den ganzen Abend rumgedoktort, also mit >".< usw. in etlichen Varianten, habe aber eben nicht diese korrekte Konstellation getorffen :-|
In der Doku oder im Forum habe ich entweder nur explizit genannte Beispiel 'fhem_set(lampe on)' gefunden, oder Beispiele bei denen über eine Variable die Verzögerungszeit mitgegeben wurde.

Vielleicht würde aber auch schon ein geeigneter Betreff für diesen Post helfen, dass andere Nutzer schneller und ohne Nachfragen ans Ziel kommen. Ich wüsste allerdings nicht, was ein geeigneter Betreff wäre.

Habe besten Dank für Deine schnelle Hilfe und Deinen unermüdlichen Support!

Max

Titel: Aw: Fhem_set () Frage
Beitrag von: Damian am 13 März 2024, 23:33:02
Es ist ein recht komplexes Thema, bedingt durch die Tatsache, dass es sich zum Einen um Perlcode handelt und zum Anderen, weil FHEM-Syntax immer wieder benutzt wird.

"set bla on" ist reiner FHEM-Code, den kann man unter Perl mit der fhem-Perlfunkton ausführen, also fhem("set bla on"). Wenn man nun bla als Device ermitteln will braucht man eine Perlfunkton wie hier ReadingsVal() diese kann man aber nicht direkt in FHEM nutzen also geht set ReadingsVal(...) on nicht und damit auch nicht fhem("set ReadingsVal(...) on").

Man muss in diesem Fall sich zuerst den String in Perl zusammenbauen, bevor man ihn an FHEM übergibt, daher die Syntax "set ".ReadingsVal(...)." on". Der Punkt verbindet in Perl die Einzelteile zusammen. Und wenn der String fertig ist, kannst du den wiederum an die fhem Funktion übergeben, also fhem("set ".ReadingsVal(...)." on").

All das ist bisher nicht DOIF-spezifisch.

Vielleicht erweitere ich die DOIF-Perl-Doku noch um paar weitere solche Anwendungsbeispiele.