Notify mit mehreren Bedingungen

4,663 views
Skip to first unread message

gmb

unread,
Dec 15, 2010, 3:34:58 PM12/15/10
to FHEM users
Hallo FHEMler,
seit zwei Monaten betreibe ich eine FHEM-Installation auf einer
Seagate Dockstar unter Debian mit zwei FHTs, einigen Fenster-/
Türkontakten und einem Außensensor KS300 - sowie einem CUL.

Zuallererst möchte ich mich vielmals bei Rudolf und allen anderen
Code- und Text-Produzenten bedanken. In FHEM steckt wirklich sehr viel
Arbeit, soweit ich das auch nur ansatzweise überblicken kann.

Leider habe ich selber mit Perl bisher nichts zu tun gehabt und meine
Linux-Kenntnisse sind auch nicht gerade preisverdächtig, weswegen ich
jetzt in eine Sackgasse geraten bin:

Der FHT heiz_bad soll morgens mit Aktivierung des Bewegungsmelders
piri_schlaf für eineinhalb Stunden die Temperatur auf 23 Grad Celsius
erhöhen und danach wieder absenken - aber nur wenn folgende
Bedingungen erfüllt sind: Es ist zwischen 4:30 Uhr und 9:00 Uhr, der
Fensterkontakt luft_bad ist "Closed" und der Türkuntakt tfk_tuer ist
"on".

Seit einer Woche tüftle ich nun an folgender Formel:

define mobabr notify piri_schlaf:on* { if(($hour > 4 || $hour < 9) &&
($value{tfk_tuer} eq "on") && ($value{luft_bad} eq "Closed")) { fhem
("set heiz_bad desired-temp 23.0") } }

Probleme: Die zusätzlichen Bedingungen (Kontakte, eingeschränkte
Zeiten) werden nicht berücksichtigt, d.h. das Notify wird immer
ausgelöst, wenn piri_schlaf ein "on"-Ereignis liefert; mal abgesehen
davon, dass ich den Beginn der "scharfen" Zeit mangels Fähigkeiten auf
4 Uhr statt 4:30 Uhr legen musste.

Ich bin jetzt mit meinem Latein am Ende. Kann jemand von Euch mir
vielleicht weiter helfen und mich aufklären, warum das Notify tut was
es nicht soll?

Grüße
Gerhard

Rudolf Koenig

unread,
Dec 16, 2010, 2:20:10 AM12/16/10
to fhem-...@googlegroups.com
> Der FHT heiz_bad soll morgens mit Aktivierung des Bewegungsmelders
> piri_schlaf f�r eineinhalb Stunden die Temperatur auf 23 Grad Celsius
> erh�hen und danach wieder absenken - aber nur wenn folgende
> Bedingungen erf�llt sind: Es ist zwischen 4:30 Uhr und 9:00 Uhr, der
> Fensterkontakt luft_bad ist "Closed" und der T�rkuntakt tfk_tuer ist
> "on".

Nicht getestet:

define mobabr_on notify piri_schlaf:on* {\
my $hm = sprintf("%02d:%02d", $hour, $min);;\
if( $hm > "04:30" && $hm < "09:00" &&\
$value{tfk_tuer} eq "on" &&\
$value{luft_bad} eq "Closed" &&\
!$data{mobabr_on}) {\
$data{mobabr_on} = 1;;\
fhem "set heiz_bad desired-temp 23.0";;\
fhem "define at_mobabr_off at +01:30 trigger mobabr_off"\
}\
}

define mobabr_off notify mobabr_off {\
fhem "set heiz_bad desired-temp 18.0";;\
delete($data{mobabr_on})\
}

gmb

unread,
Dec 16, 2010, 10:08:36 PM12/16/10
to FHEM users
Danke!

(in den nächsten 5 Stunden im Logfile gefunden...)
Unknown command }\ Erledigt.
Unrecognized character \xA0 Erledigt.

Jetzt kommt´s:
Argument "04:30" isn't numeric in numeric gt (>) at (eval 20) line 1.

>  if( $hm > "04:30" && $hm  < "09:00" &&\

Ich vermute mal, ich muss jeweils die Stunden und die Minuten einzeln
vergleichen.
Ich schau mal, wie ich morgen weiterkomme. Habe schon viel zu viel
Zeit heute vergrübelt.

Vielen Dank jedenfalls für diesen Lösungsansatz. Wenn ich das richtig
begriffen habe, hast Du sogar eine Sicherung gegen wiederholtes
Neutriggern eingebaut!?.

Rudolf Koenig

unread,
Dec 17, 2010, 3:13:41 AM12/17/10
to fhem-...@googlegroups.com
> Argument "04:30" isn't numeric in numeric gt (>) at (eval 20) line 1.

sollte wohl
if( $hm gt "04:30" && $hm lt "09:00" &&\
sein.

gmb

unread,
Dec 17, 2010, 3:43:09 PM12/17/10
to FHEM users
>    if( $hm gt "04:30" && $hm lt "09:00" &&\

Script tut immer noch nicht.

Ich habe mal zum Testen einige Abfragen rausgenommen; es sieht nun so
aus (aus fhem.cfg kopiert):

define mobabr_on notify piri_schlaf:on* {\
my $hm = sprintf("%02d:%02d", $hour, $min);;\
if( $hm gt "18:00" && $hm lt "23:00" &&\
!$data{mobabr_on}) {\
$data{mobabr_on} = 1;;\
fhem "set heiz_bad desired-temp 17.0";;\
fhem "define at_mobabr_off at +0:05 trigger mobabr_off"\
}\
}

define mobabr_off notify mobabr_off {\
fhem "set heiz_bad desired-temp 12.0";;\
delete($data{mobabr_on})\

Keine Reaktion, wenn der PIRI aktiviert wird. Im Log taucht nur "FS20
set piri_schlaf on" auf.
Dieses !$data{mobabr_on}) {\$data{mobabr_on} = 1;;\ macht mir noch
Kopfzerbrechen. Ich schau mal, ob ich mit meinem Perl-Studium
weiterkomme.

Gerhard

gmb

unread,
Dec 17, 2010, 8:40:01 PM12/17/10
to FHEM users

Das Script scheitert offenbar am Zeitvergleich. Aber für heute reicht
´s mir mit dem herumprobieren ...

Gerhard

Rudolf Koenig

unread,
Dec 18, 2010, 3:01:14 AM12/18/10
to FHEM users
> Das Script scheitert offenbar am Zeitvergleich.

Stimmt, hab vergessen im sprintf das % Zeichen zu schuetzen.

Folgendes loggt richtig bei mir, wenn ich "trigger piri_schlaf on"
absetze:

define mobabr_on notify piri_schlaf:on* {\
my $hm = sprintf("%%02d:%%02d", $hour, $min);;\
Log 1, $hm;;\
if( $hm gt "04:30" && $hm lt "09:00") {\
Log 1, "Hallo";;\
}\
}

Zrrronggg!

unread,
Dec 18, 2010, 10:30:04 AM12/18/10
to FHEM users
1. Super Idee. Ich wollte was ähnliches machen, habs aber verworfen
weil ich dachte: Na, dann ist die Heizung ja dauernd an, nur weil
einer mal was aus dem Kleiderschrank holt." Auf die Idee, die Uhrzeit
mit den typischen "Langsamwachwerdzeiten zu checken bin ich gar nicht
gekommen.

2. Wenn das Script irgendwann komplett läuft, könntest du (Gerhard)das
dann nochmal hier in endvariante Posten (für den Fall dass da noch
unentdeckte Fehler drin sind)? Ich würde das dann auch kommentiert ins
Wiki übertragen als Codebeispiel für andere. 8wenn keiner was dagegen
hat)

gmb

unread,
Dec 18, 2010, 10:33:09 AM12/18/10
to FHEM users
> Folgendes loggt richtig bei mir, wenn ich "trigger piri_schlaf on"
> absetze:

Ich habe das ursprüngliche Script gerade mit der Änderung ausgiebig
getestet. Es funktioniert ohne Probleme.

Vielen Dank für die Hilfe! Ich verstehe jetzt einiges besser.
(Und meine Frau wird nicht mehr jeden Abend detailliert ausgefragt,
wann sie denn gedenke, das Bad zu benutzen.)

Gerhard

gmb

unread,
Dec 18, 2010, 11:05:08 AM12/18/10
to FHEM users
> 2. Wenn das Script irgendwann komplett läuft, könntest du (Gerhard)das
> dann nochmal hier in endvariante Posten (für den Fall dass da noch
> unentdeckte Fehler drin sind)? Ich würde das dann auch kommentiert ins
> Wiki übertragen als Codebeispiel für andere. 8wenn keiner was dagegen
> hat)

Also hier nun die funktionierende Version:

define badbenutzung_on notify piri_schlaf:on* {\
my $hm = sprintf("%%02d:%%02d", $hour, $min);;\
if( $hm gt "04:30" && $hm lt "09:00" &&\
$value{tfk_tuer} eq "on" &&\
$value{luft_bad} eq "Closed" &&\
!$data{badbenutzung_on}) {\
$data{badbenutzung_on} = 1;;\
fhem "set heiz_bad desired-temp 23.0";;\
fhem "define at_badbenutzung_off at +01:30 trigger
badbenutzung_off"\
}\
}

define badbenutzung_off notify badbenutzung_off {\
fhem "set heiz_bad desired-temp 18.0";;\
delete($data{badbenutzung_on})\
}

Der piri_schlaf überwacht den Nachttisch meiner Frau und schlägt an,
wenn sie das erste Mal nach dem Wecker greift. Da sie die
Schlummertaste regelmäßig benutzt, ist sichergestellt, dass die
Badheizung genügend Zeit hat (ca. 30 Min sollten es aber schon sein).

luft_bad (der Fensterkontakt des zu steuernden Heizungsreglers) wird
abgefragt, weil der Regler eine gewünschte Änderung (z.B. aus FHEM)
offenbar auch dann umsetzt, wenn das Fenster gerade geöffnet ist.

Der tfk_tuer ist eine Art Abwesenheitsschalter.

Rudolf hat eine sehr gute Lösung für mein Problem gefunden. Alleine
hätte ich das nie hinbekommen. Ich hätte jetzt bald einen via notify
getriggerten Dummi-Schalter als Ersatz für den Zeitvergleich benutzt.
So ist das doch nun viel eleganter ...

Zrrronggg!

unread,
Dec 18, 2010, 10:22:54 PM12/18/10
to FHEM users
Kommt mir alles so bekannt vor, von 30 min Vorlauf Heizung Bad
angefangen bis hin zu "Dummy Schalter als Lösungsansatz"
Reply all
Reply to author
Forward
0 new messages