FHEM Forum

FHEM => Automatisierung => Thema gestartet von: th0nix am 10 Dezember 2020, 23:53:11

Titel: notify mit sleep und perl
Beitrag von: th0nix am 10 Dezember 2020, 23:53:11
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 !
Titel: Antw:notify mit sleep und perl
Beitrag von: Nobbynews am 11 Dezember 2020, 00:14:50
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   
Titel: Antw:notify mit sleep und perl
Beitrag von: amenomade am 11 Dezember 2020, 01:34:00
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()
Titel: Antw:notify mit sleep und perl
Beitrag von: amenomade am 11 Dezember 2020, 01:35:44
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
Titel: Antw:notify mit sleep und perl
Beitrag von: Nobbynews am 11 Dezember 2020, 01:50:45
Altlast aus meinen Anfängen....
Muss ich mal ändern.
Titel: Antw:notify mit sleep und perl
Beitrag von: rudolfkoenig am 11 Dezember 2020, 11:25:05
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: ""
Titel: Antw:notify mit sleep und perl
Beitrag 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
Titel: Antw:notify mit sleep und perl
Beitrag von: Damian am 11 Dezember 2020, 21:11:14
Hinter sleep muss ein Semikolon.
Titel: Antw:notify mit sleep und perl
Beitrag von: th0nix am 11 Dezember 2020, 21:41:25
Bei einem Semikolon kommt

syntax error at (eval 3815) line 11, near "}
)"
Titel: Antw:notify mit sleep und perl
Beitrag von: th0nix am 11 Dezember 2020, 21:55:25
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 ?
Titel: Antw:notify mit sleep und perl
Beitrag von: frober am 11 Dezember 2020, 22:31:13
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.
Titel: Antw:notify mit sleep und perl
Beitrag von: th0nix am 11 Dezember 2020, 22:35:42
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
Titel: Antw:notify mit sleep und perl
Beitrag von: frank am 11 Dezember 2020, 22:43:10
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
Titel: Antw:notify mit sleep und perl
Beitrag von: Nobbynews am 11 Dezember 2020, 22:54:44
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)
Titel: Antw:notify mit sleep und perl
Beitrag von: Damian am 12 Dezember 2020, 11:07:25
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.
Titel: Antw:notify mit sleep und perl
Beitrag 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.
Titel: Antw:notify mit sleep und perl
Beitrag von: Damian am 12 Dezember 2020, 11:27:03
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 ;)
Titel: Antw:notify mit sleep und perl
Beitrag von: rudolfkoenig am 12 Dezember 2020, 11:31:35
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.