Hallo zusammen,
ich verzweifel langsam und hoffe mir kann jemand helfen.
mein funktionierendes notify:
Modbus1_Slave1.:ShutterButtonBlock:.* {
if ($EVTPART1 eq "1")
{fhem ("setreading ($NAME)_Shutter. nState locked;")}
else
{fhem ("setreading ($NAME)_Shutter. nState unlocked;sleep 3;setreading ($NAME)_Shutter. nState lastrun")}
}
Das lastrun am ende möchte ich mit einem Reading Wert ersetzen, was mir aber nicht gelingen will.
Wenn ich folgenden Code im Webinterface ausführe, wird das Reading angezeigt
{ReadingsVal("Modbus1_Slave11_Shutter1","nLast","na")}
also habe ich das notify so geändert:
Modbus1_Slave1.:ShutterButtonBlock:.* {
if ($EVTPART1 eq "1")
{fhem ("setreading ($NAME)_Shutter. nState locked;")}
else
{fhem ("setreading ($NAME)_Shutter. nState unlocked;sleep 3;setreading ($NAME)_Shutter. nState {ReadingsVal("($NAME)_Shutter.","nLast","na")} ")}
}
aber das notify funktioniert dann nicht mehr
ich habe jede menge an Variationen probiert mit {fhem (..)}, in () usw.
im Log immer Syntaxfehler:
n_ShutterButtonBlock return value: syntax error at (eval 3821) line 5, near ""setreading ($NAME)_Shutter. nState unlocked;sleep 3;setreading ($NAME)_Shutter. nState {ReadingsVal("("
wenn ich die " durch ' ersetze funktioniert das notify wieder,
Modbus1_Slave1.:ShutterButtonBlock:.* {
if ($EVTPART1 eq "1")
{fhem ("setreading ($NAME)_Shutter. nState locked;")}
else
{fhem ("setreading ($NAME)_Shutter. nState unlocked;sleep 3;setreading ($NAME)_Shutter. nState {ReadingsVal('($NAME)_Shutter.','nLast','na')} ")}
}
aber als wert wird "{ReadingsVal('(Modbus1_Slave11)_Shutter.','nLast','na')}" gesetzt
ist bestimmt nur ein Syntax Problem
Grüße Marco
Modbus1_Slave1.:ShutterButtonBlock:.* {
my $lastrun=ReadingsVal("Modbus1_Slave11_Shutter1","nLast","na");
if ($EVTPART1 eq "1")
{fhem ("setreading ($NAME)_Shutter. nState locked;")}
else
{fhem ("setreading ($NAME)_Shutter. nState unlocked;sleep 3;setreading ($NAME)_Shutter. nState $lastrun")}
}
Hallo Marvin,
dank dir, dein code funktioniert, da es aber mehrere slaves und manchmal 2 rolladen betrifft habe ich wie folgt abgeändert.
Dann setzt er aber nur noch "na"
Modbus1_Slave1.:ShutterButtonBlock:.* {
my $lastrun=ReadingsVal("($NAME)_Shutter.","nLast","na");
if ($EVTPART1 eq "1")
{fhem ("setreading ($NAME)_Shutter. nState locked;")}
else
{fhem ("setreading ($NAME)_Shutter. nState unlocked;sleep 3;setreading ($NAME)_Shutter. nState $lastrun")}
}
Wofür ist denn die Klammer um $NAME? Ich denke, die gehört dort nicht hin. In keinem Fall.
der name wurde nicht aufgelöst ohne, aber ich hatte auch so viel ausprobiert.
ich mache sie mal weg
mit dem code:
Modbus1_Slave1.:ShutterButtonBlock:.* {
my $lastrun=ReadingsVal("$NAME_Shutter.","nLast","na");
if ($EVTPART1 eq "1")
{fhem ("setreading ($NAME)_Shutter. nState locked;")}
else
{fhem ("setreading ($NAME)_Shutter. nState unlocked;sleep 3;setreading ($NAME)_Shutter. nState $lastrun")}
}
folgender fehler:
n_ShutterButtonBlock return value: Global symbol "$NAME_Shutter" requires explicit package name at (eval 4210) line 2.
Bitte ein wenig mit Perl beschäftigen. Das liegt natürlich daran, dass Perl denkt, dass die Variable nicht $NAME sondern $NAME_shutter heißt. Diese gibt es nicht. Das löst du durch die Anführungszeichen und konkatenierung von Strings.
ReadingsVal($NAME."_Shutter","nLast","na");
Edit: In den anderen Fällen klappt das übrigens wegen devspec.
wenn perl bei der interpolation mit einem variablennamen nicht klar kommt weil das ende nicht erkannt wird kann man die variable innerhalb eines strings so schreiben:"... ${NAME}_Shutter ..."
gruss
andre
perl ist neuland für mich
ich danke euch beiden, so funktioniert es auch
grüße Marco