Hauptmenü

Fhem_set () Frage

Begonnen von Sirel, 13 März 2024, 20:15:34

Vorheriges Thema - Nächstes Thema

Sirel

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

Damian

dann eher:

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

bei fhem_set dagegen braucht man set nicht mehr anzugeben.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Sirel

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


Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF