Hallo zusammen,
ich möchte in einem notify ein sleep machen und danach direkt ein paar Perl befehle zu Berechnung aufrufen.
Ziel ist das ich beim Schließen des Fensters eine gewisse zeit warten möchte bis die Heizung wieder angeht.
Um zu prüfen ob nochmals ein zweites notify durch ein weiteres Fenster öffnen während der Wartezeit aufgerufen wurde möchte ich das nochmal abprüfen.
Geht vielleicht einfacher aber bisher habe ich noch nichts besseres gefunden.
Mein Problem ist, ich das FHEM sleep hier nicht sauber hineinbekomme...
Hat jemand eine Idee wie der Code dazu aussehen muss ??
set Fenster.STATUS geschlossen,
sleep 10;
{
my $statustime = time_str2num(ReadingsTimestamp("Fenster.STATUS", "state", 0));;
$statustime = $statustime + 10;;
my $nowtime = time();;
if ( $statustime <= $nowtime ){
fhem ("set Heizung tmHeating");;
}
}
Das bringt mir den Fehler
syntax error at (eval 875) line 11, near "}
)"
danke Schon mal !
Okay, zwar keine Antwort auf die Frage, aber warum so kompliziert??
Ich mache das hier bei mir über ein simples watchdog:
defmod wd_F_Haustuer_close watchdog Haustuer:off 00:01:00 Haustuer:on {\
fhem ("set HK_Flur tmHeating");; \
}
attr wd_F_Haustuer_close autoRestart 1
attr wd_F_Haustuer_close room 08_Heizung
Damit wird die Heizung erst 1 Minute nach dem letzen Schließen der Haustür wieder hochgefahren.
Das Öffnen der Tür überwacht ein zweites watchdog, womit die Heizung nach 30s runtergefahren wird
defmod wd_F_Haustuer_open watchdog Haustuer:on 00:00:30 Haustuer:off {\
fhem ("set HK_Flur tmOff");;\
}
attr wd_F_Haustuer_open autoRestart 1
attr wd_F_Haustuer_open room 08_Heizung
Zitat von: th0nix am 10 Dezember 2020, 23:53:11
set Fenster.STATUS geschlossen,
sleep 10;
{
Warum Koma nach geschlossen? Ist es ein notify oder ein DOIF?
EDIT: und schau mal die Funktion ReadingsAge()
Zitat von: Nobbynews am 11 Dezember 2020, 00:14:50
defmod wd_F_Haustuer_close watchdog Haustuer:off 00:01:00 Haustuer:on {\
fhem ("set HK_Flur tmHeating");; \
}
Warum den Umweg über Perl?
defmod wd_F_Haustuer_close watchdog Haustuer:off 00:01:00 Haustuer:on set HK_Flur tmHeating
Altlast aus meinen Anfängen....
Muss ich mal ändern.
Ich kriege das gemeldete Problem gar nicht reproduziert: was muss man dafuer machen?
Abgesehen davon:
- nach Komma wird nicht getrennt, damit ist das erste Befehl: set Fenster.STATUS geschlossen,\n sleep 10
- in einem perl Ausdruck wuerde ich ein sleep durch Folgendes realisieren: InternalTimer(time()+$seconds, sub(){...perlcode...}, undef);
- es wurde mW nirgendwo zugesichert, dass man die drei Befehlsarten (FHEM, Shell, perl) mischen darf.
Was funktionieren soll:
- mehrere FHEM Befehle, getrennt duch ;
- ein perl Ausdruck: {}
- ein Shell-Befehl: ""
Vielen Dank für die Antworten!
Das mit dem Watchdog werde ich gleich mal testen.
Dennoch würde mich die Lösung interessieren ;)
Anbei nochmal die komplette Definition:
defmod Fenster.stop notify Kueche.Fenster:alarm:.* \
IF ([Fenster:alarm:] eq "AccessControl: Window/Door is open") \
(\
set Heizung tmOff, \
set Fenster.STATUS offen\
) ELSE (\
set Fenster.STATUS geschlossen,\
sleep 10, { \
my $statustime = time_str2num(ReadingsTimestamp("Fenster.STATUS", "state", 0));;;; \
$statustime = $statustime + 10;;;;\
\
my $nowtime = time();;;;\
\
if ( $statustime <= $nowtime ){\
fhem ("set Kueche.Heizung tmHeating");;;;\
}\
}\
)
attr Fenster.stop room Kueche
setstate Fenster.stop active
setstate Fenster.stop 2020-12-10 23:46:14 state active
Danke
Thonix
Hinter sleep muss ein Semikolon.
Bei einem Semikolon kommt
syntax error at (eval 3815) line 11, near "}
)"
Zitat von: amenomade am 11 Dezember 2020, 01:35:44
Warum den Umweg über Perl?
defmod wd_F_Haustuer_close watchdog Haustuer:off 00:01:00 Haustuer:on set HK_Flur tmHeating
So Richtig komme ich mit dem watchdog nicht klar.
Ich habe einen Sensor welcher in dem Alarm-Event den Wert "AccessControl: Window/Door is open" oder "AccessControl: Window/Door is closed" kennt.
Mein Ziel ist es, das ich beim Schließen des Fensters eine gewisse Zeit warten möchte bis die Heizung wieder angeht. Dabei soll sichergestellt werden das inzwischen das Fenster nicht wieder geöffnet wurde.
Bedeutet die Zeit soll nach dem letzten öffnen abgelaufen sein, bevor das die Heizung wieder angeht.
Wie ich den Wotchdog nun verstanden habe kann ich nicht triggern das Fenster:alarm:.* nur losläuft wenn Fenster:alarm:.* = "AccessControl: Window/Door is closed" ist ?
Zitat von: th0nix am 11 Dezember 2020, 21:04:46
Vielen Dank für die Antworten!
Das mit dem Watchdog werde ich gleich mal testen.
Dennoch würde mich die Lösung interessieren ;)
Anbei nochmal die komplette Definition:
defmod Fenster.stop notify Kueche.Fenster:alarm:.* \
IF ([Fenster:alarm:] eq "AccessControl: Window/Door is open") \
(\
set Heizung tmOff, \
set Fenster.STATUS offen\
) ELSE (\
set Fenster.STATUS geschlossen,\
sleep 10, { \
my $statustime = time_str2num(ReadingsTimestamp("Fenster.STATUS", "state", 0));;;; \
$statustime = $statustime + 10;;;;\
\
my $nowtime = time();;;;\
\
if ( $statustime <= $nowtime ){\
fhem ("set Kueche.Heizung tmHeating");;;;\
}\
}\
)
attr Fenster.stop room Kueche
setstate Fenster.stop active
setstate Fenster.stop 2020-12-10 23:46:14 state active
Danke
Thonix
Mache Mal die Hälfte der Semikolons weg.
Du benutzt Perl, dafür wird in der DEF ein Semikolon zum Abschluss eines Befehls gesetzt und im RAW wird es verdoppelt. Du hast 4 Semikolons, das sind zu viele.
Zitat von: frober am 11 Dezember 2020, 22:31:13
Mache Mal die Hälfte der Semikolons weg.
Du benutzt Perl, dafür wird in der DEF ein Semikolon zum Abschluss eines Befehls gesetzt und im RAW wird es verdoppelt. Du hast 4 Semikolons, das sind zu viele.
Hi frober,
leider kein Erfolg. Meldung bleibt die gleiche. Wenn ich das sleep raus nehme geht es beides.
ein sleep mit Komma wird auch genommen - da ist das halt blocking - was ich eigentlich nicht möchte.
Thonix
einfach mal auf rudi hören:
ZitatWas funktionieren soll:
- mehrere FHEM Befehle, getrennt duch ;
- ein perl Ausdruck: {}
- ein Shell-Befehl: ""
die drei möglichkeiten sollen
nicht gemischt werden.
perl also:
ganz oder gar nicht
Zitat von: th0nix am 11 Dezember 2020, 21:55:25
So Richtig komme ich mit dem watchdog nicht klar.
Ich habe einen Sensor welcher in dem Alarm-Event den Wert "AccessControl: Window/Door is open" oder "AccessControl: Window/Door is closed" kennt.
Wie ich den Wotchdog nun verstanden habe kann ich nicht triggern das Fenster:alarm:.* nur losläuft wenn Fenster:alarm:.* = "AccessControl: Window/Door is closed" ist ?
Am einfachsten im Event-Monitor den Eintrag markieren und dann ein watchdog erzeugen lassen und modifizieren.
Ggf. kann man auch über eventmap da etwas machen und einfachere Ausgaben erzeugen.
Bitte mal ein list vom Sensor posten.
Mein device Haustuer ist aus anderen Gründen ein dummy. Dahinter verbirgt sich im Endeffekt
MQTT2_Haustuer:doorWindow:.*(open|close)
Hinter sleep müssen es schon zwei Semikolons sein (zwei im Editor, in Raw Definition werden es dann schon vier).
Ich würde es mit DOIF und wait machen, die Syntax ist vergleichbar mit IF, man muss sich keine Gedanken über Dopplung von Semikolons machen und man braucht keine sleeps:
define d_Fensterstop DOIF ([Fenster:alarm:] eq "AccessControl: Window/Door is open")
(set Heizung tmOff, set Fenster.STATUS offen)
DOELSE
(set Fenster.STATUS geschlossen)
{ my $statustime = time_str2num(ReadingsTimestamp("Fenster.STATUS", "state", 0));
$statustime = $statustime + 10;
my $nowtime = time();
if ( $statustime <= $nowtime ){
fhem ("set Kueche.Heizung tmHeating");
}
}
attr wait 0:0,10
Im Editor immer nur ein Semikolon angeben.
Dann braucht man gar nicht mehr dieses Test von Timestamp, da ein neues Öffnen des Fensters das DOIF wieder auf cmd1 setzten wird.
Zitat von: amenomade am 12 Dezember 2020, 11:22:26
Dann braucht man gar nicht mehr dieses Test von Timestamp, da ein neues Öffnen des Fensters das DOIF wieder auf cmd1 setzten wird.
ja, den Code habe ich mir gar nicht genau genug anschaut. Das ist ein weiterer Vorteil von wait, dass ein Timer automatisch abgebrochen wird, wenn sich die Bedingung ändert, bzw. keine Wiederholung innerhalb der Zeitspanne stattfindet.
Es könnte schon ausreichen:
define d_Fensterstop DOIF ([Fenster:alarm:] eq "AccessControl: Window/Door is open")
(set Heizung tmOff, set Fenster.STATUS offen)
DOELSE
(set Fenster.STATUS geschlossen) (set Kueche.Heizung tmHeating)
attr wait 0:0,10
sieht zumindest etwas einfacher aus ;)
Damit es nicht missverstanden wird: meine Aussagen beziehen sich auf dem "normalen" notify.
Hier geht es aber um das FHEM-Modul IF (ein FHEM-Befehl), was erst ab Antwort #6 bekannt war.
Dieses Befehl ermoeglicht zwar auch das Ausfuehren von FHEM-Befehlen und perl-Ausdruecken, ist aber eine Ebene "tiefer", hat eine (leicht?) andere Syntax, und benoetigt ein zusaetzliches schuetzen des Trenners Semikolon duch Verdoppelung .
DOIF ist auch ein FHEM-Befehl, und der Nachfolger von IF, wenn ich es als Aussenstehender richtig verstanden habe.
Weiterhin: wenn das Frontend (FHEMWEB) weiss, dass es sich um ein einziges FHEM-Befehl handelt (z.Bsp. DEF-Fenster mit modify oder die attr Felder), werden Newlines mit \ ergaenzt, und ; durch ;; ersetzt.
Das ist _nicht_ der Fall im Raw-Definition Fenster, beim Editieren der fhem.cfg oder wenn man oben links auf + klickt.