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 (http://www.elv.de/homematic-funk-fenster-drehgriffkontakt-1.html) 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
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
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.
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 (https://forum.fhem.de/index.php/topic,36504.msg287778.html#msg287778) :)
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?
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")
}
}
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
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
di DOIF ([HM_Bath_Window:"open|tilted"] and [Aussenthermometer:temperature] < 15) ({<perl code>})
Hält sich auch in einem überschaubaren Rahmen 8)
Tja, ich gebe mich geschlagen...
LG
pah
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.
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
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 (http://www.fhemwiki.de/wiki/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
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
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.
Zitat von: Tinko am 19 April 2016, 22:35:15
gibt es einen eleganteren Weg?
Value($)
oder
ReadingsVal($$$)
siehe dazu auch in der commandref unter Perl Specials (http://fhem.de/commandref_DE.html#perl)
Die Anführungszeichen müssen nicht nur "immer oben" sein, sondern insbesondere das Unicode-Zeichen 0x0022 und nicht eines der Zeichen 0x8220, 0x8221 oder 0x8223. Tipp: Editor entsprechend einstellen.
LG
pah
Danke für eure Hilfe.
mit ReadingsVal funktioniert super.
Jetzt versuche ich eine Notification auf dem Handy innerhalb des at, dass ja durch das perl skript definiert wird zu realisieren. Aber ich bekomme einen Fehler wegen der Syntax. Ich nehme an irgendwas mit den " ?!
sub WindowNotification($$$){
my ($device, $event, $msg)= @_;
Log 1,"device = $device, event=$event";
if ( ($event !~ /.*closed.*/) ){
fhem("define F.".$device.".timer at +*00:30:00 { system ("curl -s -F 'token=<token>' -F 'user=<user>' -F 'message=$msg' https://api.pushover.net/1/messages.json")} ; attr at_HM_Bath_Window_notifyTimer room Bathroom");
fhem("attr F.".$device.".timer room Bathroom");
}elsif( ($event =~ /.*closed.*/) && Value("F.".$device.".timer") ){
fhem("delete F.".$device.".timer")
}
}
Fehlermeldung:
syntax error at ./FHEM/99_myUtils.pm line 48, near "".timer at +*00:00:10 { system ("curl "
Ich meine auch vor einiger Zeit irgendwo gelesen zu haben, wie man das macht aber ich finde es nicht mehr.
Gruß Tinko