Warnung "Fenster noch immer offen" mit DOIF oder anders lösen

Begonnen von Tinko, 13 April 2016, 22:45:24

Vorheriges Thema - Nächstes Thema

Tinko

Moin Moin

Meine Experimente gehen weiter voran. ich hätte eigentlich gedacht dass ich zu dem folgenden Theme wieder irgendwo einen thread finde (weil ich glaube, dass es ein Standard-Thema für fhem ist)... leider Fehlanzeige. Eventuell fehlen mir aber auch einfach die richtigen Suchbegriffe. Also wenn ihr mich in die richtige Richtung schubsen könntet, dass wäre super.

Die Aufgabe. ich habe mir einen Fenstersensor HM-Sec-RHS besorgt, montiert und gepaired. Nun würde ich gern folgendes Szenario lösen.

Wenn das Fenster mehr als 10 min offen ist, soll etwas passieren (Notification aufs Handy z.B.) und von da ab soll dies alle 10 min wiederholt werden, bis das Fenster wieder geschlossen wird.

Ich habe es zunächst mit einem normalen notify und at (+*00:10:00) versucht. Das wird nur immer ausgeführt auch wenn das Fenster innerhalb der ersten 10min geschlossen wurde. Außerdem führt das +* leider dazu dass alle 10 min ausgeführt wird, egal was danach mit dem Fenster passiert. Mein Code war so:

HM_Bath_Window:open.*|HM_Bath_Window:tilted.* define at_HM_Bath_Window at +*00:10:00 {<ur perl code>} ; attr at_HM_Bath_Window room Bath


So gehts also nicht. Ich vermute es muss mit einem DOIF gehen. aber meine ersten Versuche verliefen im Sande.


Gruß Mathias
Don't hate me cause u ain't me!

Raspberry PI II mit FHEM Jessy
HM-USB und Phillips Hue

Koelschejeck

Hi,
Ich bin zwar auch noch bloody Beginner, aber ich hatte das selbe Problem und mir folgenden Code zusammen gesammelt und in die Fhem.cfg geschrieben:

define watchdog_fenster_bad watchdog FKBad:open 01:00:00 FKBad:closed {\\
  system("/opt/fhem/mail_fenster_auf.sh");;;;\\
  fhem("setstate watchdog_fenster_bad defined");;;;\\
}

Bei mir sendet er nach einer Stunde eine E-Mail über das Shell Skript (.sh). Vielleicht ist das ein Anfang für dich. Push ist sicherlich noch ne Spur eleganter. Für Emails musst du auch noch ein paar Pakete nach installieren und konfigurieren..


Gesendet von meinem HTC One_M8 mit Tapatalk

Rince

Mit DOIF ist das recht einfach.
Wenn ich kurz die Commandref zitieren darf:

ZitatKurzreferenz   back
⟨⟩ kennzeichnet optionale Angaben

Definition
define <name> DOIF ⟨(<Bedingung>) ⟨⟨(⟨<Befehle>⟩)⟩ ⟨⟨⟨DOELSEIF (<Bedingung>) ⟨(⟨<Befehle>⟩)⟩⟩ ... ⟩⟨DOELSE ⟨(⟨<Befehle>⟩)⟩⟩⟩⟩⟩
Befehlstrennzeichen ist das Komma (<Befehl>, <Befehl>, ...)
Befehlssequenzen werden in runde Klammern gesetzt (<Befehlssequenz A>) (<Befehlssequenz B>) ...
Enthält ein Befehl Kommata, ist er zusätzlich in runde Klammern einzuschliessen (<Befehlsteil a>, <Befehlsteil b> ... )
Perl-Befehle {<Perl-Befehl>} sind in geschweifte Klammern einzuschliessen
Jede Berechnung {(<Berechnung>)⟨<Berechnung>⟩} in einem Befehl ist in geschweifte Klammern einzuschliessen und muss mit einer geöffneten runden Klammer beginnen.

2 Befehle definieren und mit dem Attribut wait den einen Befehl nach 10 Minuten ausführen lassen, 50 Minuten später den nächsten...

Code kann ich dir auch geben, aber erst heute Nacht.
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Hollo

Zitat von: Tinko am 13 April 2016, 22:45:24
...ich hätte eigentlich gedacht dass ich zu dem folgenden Theme wieder irgendwo einen thread finde (weil ich glaube, dass es ein Standard-Thema für fhem ist)... leider Fehlanzeige...

Guckst Du hier... https://forum.fhem.de/index.php/topic,36504.msg287778.html#msg287778   :)
FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"

Tinko

Zitat von: Rince am 14 April 2016, 08:09:49
Mit DOIF ist das recht einfach.
Wenn ich kurz die Commandref zitieren darf:

2 Befehle definieren und mit dem Attribut wait den einen Befehl nach 10 Minuten ausführen lassen, 50 Minuten später den nächsten...

Code kann ich dir auch geben, aber erst heute Nacht.

Ich würde es gern mit einem DOIF versuchen. Ich glaube dabei lerne ich auch etwas was ich in anderen Situationen nutzen kann. Deine kurze Erklärung verstehe ich aber noch nicht. Die Erinnerung das Fenster zu zu machen soll ja im regelmäßigen Abstand (unendlich lange) kommen bis das Fenster wieder zu ist. Wie kann das mit nur zwei befehlen gehen?

Don't hate me cause u ain't me!

Raspberry PI II mit FHEM Jessy
HM-USB und Phillips Hue

Prof. Dr. Peter Henning

Es ist ziemlicher Unsinn, solche eher komplexen Schaltbefehle in einem Skript zu verpacken - das gehört besser in eine Perl-Datei, weil es sonst kaum wartbar ist.

Mit dem folgenden Code legt das Öffnen eines von zwei Fenstern einen at-Timer an, der alle drei Minuten die Audionachricht: "Das Fenster im Badezimmer ist offen" oder  "Das Fenster in Dominics Zimmer ist offen" abspielt - aber nur dann, wenn die Außentemperatur beim Start < 15 ° ist.

Das Schließen des Fensters killt diesen Timer wieder.

###############################################################################
#
#  FensterHelper
#
###############################################################################

sub FHelper($$){
my ($device,$event)= @_;
my $msg;

Log 1,"device = $device, event=$event";


if ( ($event !~ /.*closed.*/) && (ReadingsVal('A.OWB.T',"temperature",0)<15) ){
   if ($device eq "BZ.F"){
     $msg="20";
   }elsif ($device eq "DZ.F"){ 
     $msg="26";
   }
   fhem("define F.".$device.".timer at +*00:03 set WZ.Gong.MP3 playTone ".$msg);
   fhem("attr F.".$device.".timer room hidden");
}elsif( ($event =~ /.*closed.*/) && Value("F.".$device.".timer") ){
   fhem("delete F.".$device.".timer")
}
}

Damian

Ich wüsste nicht, was da so komplex sein soll an dieser Anforderung:

di DOIF ([HM_Bath_Window:"open|tilted"]) ({<perl code>})
attr di wait 600
attr di repeatcmd 600


Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Prof. Dr. Peter Henning

Oh, richtig. DOIF ist geeignet, das wollte ich nicht in Abrede stellen.

Aber wenn man da noch die Temperatur hinzupacken würde, und verschiedene Events abfangen will, wird es eben sehr schnell unübersichtlich. Die Idee der Helperfunktion hat da für mich mehr Charme.

LG

pah

Rince


di DOIF ([HM_Bath_Window:"open|tilted"] and [Aussenthermometer:temperature] < 15) ({<perl code>})


Hält sich auch in einem überschaubaren Rahmen  8)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Prof. Dr. Peter Henning


Ellert

#10
Zitat von: Tinko am 17 April 2016, 08:13:01
Ich würde es gern mit einem DOIF versuchen. Ich glaube dabei lerne ich auch etwas was ich in anderen Situationen nutzen kann. Deine kurze Erklärung verstehe ich aber noch nicht. Die Erinnerung das Fenster zu zu machen soll ja im regelmäßigen Abstand (unendlich lange) kommen bis das Fenster wieder zu ist. Wie kann das mit nur zwei befehlen gehen?

Hier mal ein Vorschlag mit zweistufiger Temperaturabhängigkeit, den ich aus meinem Fenster-DOIF extrahiert habe.

define FensterStatus DOIF([HM_SEC_SCo] eq "open" and $cmd =~ "^(4|0)\$")
   (Befehl 1)
DOELSEIF ([?HM_SEC_SCo] eq "open" and [?HM_CC_RT_DN:measured-temp] >= 16.5 and [$SELF] =~ "cmd_(1|3)")
   (Befehl 2)
DOELSEIF ([?HM_SEC_SCo] eq "open" and [?HM_CC_RT_DN:measured-temp] < 16.5 and [$SELF] =~ "cmd_(1|2)")
   (Befehl 3)
DOELSEIF ([HM_SEC_SCo] eq "closed" and $cmd != 4)
   (Befehl 4)

und die Attribute
attr FensterStatus do always
attr FensterStatus repeatcmd 0.1:300:60:0
attr FensterStatus selftrigger 1
attr FensterStatus wait 0.1:300:60:0


Diese DOIF Version wird benötigt: https://forum.fhem.de/index.php/topic,51060.0.html

Befehl 1 wird ausgeführt, wenn das Fenster geöffnet wird.
Befehl 2 wird nach 300 s ausgeführt, wenn T >= 16.5 und alle 300 s wiederholt bis T < 16.5 oder das Fenster geschlossen wird.
Befehl 3 wird nach 60 s ausgeführt, wenn T < 16.5 und alle 60 s wiederholt bis T >= 16.5 oder das Fenster geschlossen wird.
Befehl 4 wird augeführt, wenn das Fenster geschlossen wird.

Prof. Dr. Peter Henning

Und damit sind wir bei dem, was ich bemängelt habe. Das ist kaum mehr wartbar, in 3 Jahren weißt niemand mehr, warum in jener Zeile dieses steht. ;D

LG

pah

Tinko

Zitat von: Prof. Dr. Peter Henning am 18 April 2016, 15:41:19Und damit sind wir bei dem, was ich bemängelt habe. Das ist kaum mehr wartbar, in 3 Jahren weißt niemand mehr, warum in jener Zeile dieses steht. ;D

LG

pah

nAbend



Ok. Ich versuche mal mit der Idee das ganze in einer Perl-Datei bevor ich den DOIF versuche. Folgendes habe ich schon gemacht:


       
  • Zuerst die 99 myUtils anlegen
  • einen Dummy anlegen "define Bathroom_Window dummy"
  • ein Notify, dass das Perl-Skript starten soll "define Bathroom_Window_notify notify HM_Bath_Window {WindowNotification(,,HM_Bath_Window", ,,open")}"
  • 99_myUtils.pm editiert (code weiter unten)
  • shutdown restart
Mein Sensor heißt "HM_Bath_Window"
Meine 99_myUtils.pm sieht nach meinen Anpassungen so aus:
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;
use POSIX;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

# Enter you functions below _this_ line.

###############################################################################
#
#  FensterHelper
#
###############################################################################

sub WindowNotification($$){
my ($device, $event)= @_;
my $msg;

Log 1,"device = $device, event=$event";

if ( ($event !~ /.*closed.*/) ){ #&& (ReadingsVal('A.OWB.T',"temperature",0)<15) ){
   if ($device eq "HM_Bath_Window"){
     $msg="open";
#   }elsif ($device eq "other device"){ 
#     $msg="text";
   }
   fhem("define F.".$device.".timer at +*00:00:10 set Bathroom_Window ".$msg);
   fhem("attr F.".$device.".timer room Bathroom");
}elsif( ($event =~ /.*closed.*/) && Value("F.".$device.".timer") ){
   fhem("delete F.".$device.".timer")
}
}

1;



Das notify löst aus. Aber den at sehe ich nicht. dadurch natürlich auch nicht wie der dummy nach 10 sek auf open gesetzt wird.
Habt ihr einen Tipp wo der Fehler suchen könnte?


Gruß Tinko
Don't hate me cause u ain't me!

Raspberry PI II mit FHEM Jessy
HM-USB und Phillips Hue

Tinko

Nach viel Rumprobieren habe ich den Fehler gefunden.  :o

Der Aufruf des Perl-Skripts durch das Notify ist falsch. Die Anführungsstriche müssen bei mir immer oben sein.

{WindowNotification("HM_Bath_Window", "open")}

Das funktioniert nun also prinzipiell. Mein Perl-Skript wird durch den Fenstersensor getriggert aufgerufen. Momentan übergebe ich ja einen String als zweiten parameter "open". Mein nächster Versuch war nun den tatsächlichen Status des Sensors zu übergeben. Folgendes funktioniert aber ist das elegant?

{WindowNotification("HM_Bath_Window",fhem("get HM_Bath_Window param state"))}

Muss man in man befindet sich ja durch die geschweiften Klammern auf Perl-Ebene. Muss man nun tatsächlich wieder auf FHEM-Ebene wechseln oder gibt es einen eleganteren Weg?

Danke Tinko
Don't hate me cause u ain't me!

Raspberry PI II mit FHEM Jessy
HM-USB und Phillips Hue

CoolTux

Wenn Du verrätst auf was Dein Notify triggert, ich gehe mal vom Fenster Sensor aus, könnte man vielleicht sagen das es so gehen sollte.


{WindowNotification("HM_Bath_Window", "$EVTPART1")}

das EVTPART hängt so ein bisschen vom tatsächlichen Event ab.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net