Wassersprinkler, Timer und Syntaxprobleme

Begonnen von flipse, 08 Oktober 2020, 14:20:58

Vorheriges Thema - Nächstes Thema

flipse

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");;
}
}



amenomade

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


als Readings in einem Device (z.B dummy) oder im at selbst definieren?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

flipse

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.


amenomade

at +{"00:".$variable.":00"}

Das .":00" am Ende kann man sich sparen
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

flipse

[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

amenomade

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')
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

flipse