FHEM Forum

FHEM => Automatisierung => Thema gestartet von: flipse am 08 Oktober 2020, 14:20:58

Titel: Wassersprinkler, Timer und Syntaxprobleme
Beitrag von: flipse am 08 Oktober 2020, 14:20:58
Hallo zusammen,

ich würde gerne 2 Variablen nutzen
1x für Genereller Timer zur Steuerung der Dauer der Sprinkler
1x für Delay zum Schließen der Ventile

Manuell eingetragen funktioniert alles wie im Skript unten
Leider kann ich die definierten at's nicht über die Variablen zeitlich steuern.
Wie kann ich das anpassen?


Wassersprinkler:on.*|Wassersprinkler:off.* {

Log 1, "Reading Wassersprinkler:".ReadingsVal('Wassersprinkler', 'state', '');;

my $timerDuration = '20';;
my $ventilTimer = '05';;

if (ReadingsVal('Wassersprinkler', 'state', '') eq "on")
{
Log 1, "[Wassersprinkler_n] Wassersprinkler eingeschaltet: 1. Ventil öffnen, 2. Pumpe einschalten.";;
SendMail("[INFO] Wassersprinkler eingeschaltet ". $EVENT, "Wassersprinkler eingeschaltet: 1. Ventil öffnen, 2. Pumpe einschalten. Laufzeitbegrenzung $timerDuration Min definiert");;

#fhem 'set ZWave_SW_Zisterne_Ventil.01 on';;
#fhem 'set ZWave_SW_Zisterne_Garten on';;


if (defined($defs{"at_Sprinkler_Laufzeitbegrenzung"})) {
Log 1, "[Wassersprinkler_n] at_Sprinkler Laufzeitbegrenzung existiert bereits und wird gelöscht und erneuert.";;
fhem 'delete at_Sprinkler_Laufzeitbegrenzung';;
}

Log 1, "[Wassersprinkler_n] Laufzeitbegrenzung $timerDuration Min wird eingerichtet";;
fhem 'define at_Sprinkler_Laufzeitbegrenzung at +00:20:00 {Log 1, "[Wassersprinkler_n] Laufzeitbegrenzung erreicht. Beende Wassersprinkler"};;{SendMail("[INFO] Laufzeitbegrenzung erreicht. Wassersprinkler ausschalten.","Laufzeitbegrenzung erreicht. Wassersprinkler ausschalten.")};;set Wassersprinkler off;';;

#attribute im wassersprinkler_notify schreiben
fhem 'setreading Wassersprinkler next_off {(POSIX::strftime("%Y-%m-%d %H:%M:%S",localtime(time+20*60)))}';;



if (!defined($defs{"at_Sprinkler_Laufzeitbegrenzung"})) {
Log 1, "[Wassersprinkler_n] Fehler bei der Einstellung der Laufzeitbegrenzung.";;
SendMail("[INFO] Wassersprinkler Laufzeitbegrenzung FEHLER", "Laufzeitbegrenzung konnte nicht eingerichtet werden.");;
}

}
else
{
Log 1, "[Wassersprinkler_n] Wassersprinkler ausgeschaltet: 1. Pumpe ausschalten, 2. Ventil nach $ventilTimer Minuten schließen";;

fhem 'set ZWave_SW_Zisterne_Garten off';;
fhem 'define Zisterne_Ventil_Schliessen at +00:05:00 {Log 1, "[Wassersprinkler_n] Schließe Ventil"};;{SendMail("[INFO] Wassersprinkler ausschalten: Ventil zeitverzögert geschlossen.","Ventil wurde zeitverzögert geschlossen, damit Rohre leerlaufen können.")};;set ZWave_SW_Zisterne_Ventil.01 off;';;

if (!defined($defs{"Zisterne_Ventil_Schliessen"})) {
Log 1, "[Wassersprinkler_n] Fehler bei der Einstellung der Ventilschließung.";;
SendMail("[INFO] Wassersprinkler Ventil-Timer FEHLER", "Ventil-Timer konnte nicht eingerichtet werden.");;
}

SendMail("[INFO] Wassersprinkler ausschalten ". $EVENT, "Wassersprinkler ausschalten: 1. Pumpe ausschalten, 2. Ventil nach $ventilTimer Minuten schließen");;
}
}


Titel: Antw:Wassersprinkler, Timer und Syntaxprobleme
Beitrag von: amenomade am 08 Oktober 2020, 23:26:38
my $timerDuration = '20';;
my $ventilTimer = '05';;


als Readings in einem Device (z.B dummy) oder im at selbst definieren?
Titel: Antw:Wassersprinkler, Timer und Syntaxprobleme
Beitrag von: flipse am 08 Oktober 2020, 23:59:29
oh, ich glaube ich habe es falsch beschrieben.
Für mich ist es schon ok, die beiden Variablen in der Funktion zu definieren.
Was ich leider nicht hinbekommen habe, ist, diese überall zu verwenden.
Beispiel:

fhem 'define at_Sprinkler_Laufzeitbegrenzung at +00:20:00 {Log 1, "[Wassersprinkler_n] Laufzeitbegrenzung erreicht. Beende Wassersprinkler"};;{SendMail("[INFO] Laufzeitbegrenzung erreicht. Wassersprinkler ausschalten.","Laufzeitbegrenzung erreicht. Wassersprinkler ausschalten.")};;set Wassersprinkler off;';;


hier ist die Laufzeitbegrenzung immer noch manuell und statisch mit +00:20:00 definiert.
Sobald ich versuche die 20 durch $timerDuration zu ersetzen, bekomme ich einen Fehler, da die Variable nicht ausgewertet wird, sondern der text $timerDuration genutzt wird.

Titel: Antw:Wassersprinkler, Timer und Syntaxprobleme
Beitrag von: amenomade am 09 Oktober 2020, 00:08:18
at +{"00:".$variable.":00"}

Das .":00" am Ende kann man sich sparen
Titel: Antw:Wassersprinkler, Timer und Syntaxprobleme
Beitrag von: flipse am 09 Oktober 2020, 00:50:58
[SendMail] Subject: [FHEM] [INFO] Wassersprinkler eingeschaltet on Content: Wassersprinkler eingeschaltet: 1. Ventil öffnen, 2. Pumpe einschalten. Laufzeitbegrenzung 20 Min definiert
2020.10.09 00:46:53 1 : [Wassersprinkler_n] Laufzeitbegrenzung 20 Min wird eingerichtet
2020.10.09 00:46:53 1 : [Wassersprinkler_n] Fehler bei der Einstellung der Laufzeitbegrenzung.
2020.10.09 00:46:54 2 : [SendMail] Subject: [FHEM] [INFO] Wassersprinkler Laufzeitbegrenzung FEHLER Content: Laufzeitbegrenzung konnte nicht eingerichtet werden.
2020.10.09 00:46:53 1 : ERROR evaluating my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $NAME= $evalSpecials->{'%NAME'};my $SELF= $evalSpecials->{'%SELF'};my $TYPE= $evalSpecials->{'%TYPE'};{"00:".$timerDuration.":00"}: Global symbol "$timerDuration" requires explicit package name at (eval 819423) line 1.

2020.10.09 00:46:53 1 : define at_Sprinkler_Laufzeitbegrenzung at +{"00:".$timerDuration.":00"} {Log 1, "[Wassersprinkler_n] Laufzeitbegrenzung erreicht. Beende Wassersprinkler"};{SendMail("[INFO] Laufzeitbegrenzung erreicht. Wassersprinkler ausschalten.","Laufzeitbegrenzung erreicht. Wassersprinkler ausschalten.")};set Wassersprinkler off: the function ""00:".$timerDuration.":00"" must return a timespec and not Global symbol "$timerDuration" requires explicit package name at (eval 819423) line 1. .
2020.10.09 00:46:53 3 : define at_Sprinkler_Laufzeitbegrenzung at +{"00:".$timerDuration.":00"} {Log 1, "[Wassersprinkler_n] Laufzeitbegrenzung erreicht. Beende Wassersprinkler"};;{SendMail("[INFO] Laufzeitbegrenzung erreicht. Wassersprinkler ausschalten.","Laufzeitbegrenzung erreicht. Wassersprinkler ausschalten.")};;set Wassersprinkler off; : the function ""00:".$timerDuration.":00"" must return a timespec and not Global symbol "$timerDuration" requires explicit package name at (eval 819423) line 1. .


Hat leider nicht funktioniert.
Auch wenn ich die Variable als Zahl statt Text deklariere
Titel: Antw:Wassersprinkler, Timer und Syntaxprobleme
Beitrag von: amenomade am 09 Oktober 2020, 00:57:22
Ja weil es innerhalb single quotes ist: fhem 'define.....'
fhem 'define at_Sprinkler_Laufzeitbegrenzung at +00:20:00 {Log 1, "[Wassersprinkler_n] Laufzeitbegrenzung erreicht. Beende Wassersprinkler"};;{SendMail("[INFO] Laufzeitbegrenzung erreicht. Wassersprinkler ausschalten.","Laufzeitbegrenzung erreicht. Wassersprinkler ausschalten.")};;set Wassersprinkler off;';;

Damit wird die Variable nicht interpretiert. Du muss das string zerlegen, und deine Variable konkatenieren. Oder die single quotes und double quotes austauschen.

Also entweder
fhem "         'Sache ohne Variable'       $variable        "
oder
fhem ('blablabla'.$variable.'blablabla')
Titel: Antw:Wassersprinkler, Timer und Syntaxprobleme
Beitrag von: flipse am 10 Oktober 2020, 10:52:36
perfekt. vielen Dank. hat funktioniert