Hallo Leute,
ich habe zwar schon so paar Sachen mit fhem gemacht, aber irgendwie stehe ich aufm Schlauch wie ich mein Problem lösen kann.
Problem: Frau lässt stundenlang das Badfenster auf. Auf -> vergessen ;D Dann darf ich mich über ein angenehmes 5° kühles Toilettenevent freuen ;). Alle Bemühungen dies auf eine nicht technische Methode abzustellen sind gescheitert. Daher hängt nun ein HM Fensteraktor im Bad und soll mich ... und vor allem sie ... nach einer x-beliebigen Zeit erinnern, dass das Fenster noch geöffnet ist.
Ich brauche also einen countdown der nach dem Öffnen event losrennt und mir nach z.B. 30min wieder eine Aktion ausführt. Idee wäre ein timestamp-on-change-reading auf den state des Aktors und dann DOIF welches auf den "offen" state schaut und den timestamp vergleicht.
Leider bekomme ich das doif aber nicht getrigger um regelmäßig die Zeitdifferenz zu berechnen.
jemand ne Idee?
danke,
Chris
Hallo Chris,
dafür gibt es doch den Wachhund :D
defmod WD_BadOg_open watchdog FensterBOg:open 00:10 FensterBOg:closed set Sonos_Arbeitszimmer speak 15 de Fenster im oberen Bad offen
attr WD_BadOg_open autoRestart 1
attr WD_BadOg_open room Bad
Gruß Otto
hast du das gleiche Problem, oder war das nur Pseudo code ;D
Ich habe das bei mir über watchdog gelöst.
defmod wd_F_Bad_open watchdog Fenster_Bad:on 00:00:10 Fenster_Bad:off set cm fakeSC HK_Bad 1
attr wd_F_Bad_open autoRestart 1
attr wd_F_Bad_open room 08_Heizung
Sobald das Fenster 10 Sekunden geöffnet ist, wird der Heizkörper runtergefahren.
Oder anderes Beispiel:
Ist das Fenster länger als 12 Stunden geöffnet, wird die Anzeigefarbe im Statusdisplay geändert.
defmod wd_Fenster_Bad watchdog Fenster_Bad:on 12:00:00 Fenster_Bad:off {\
Write_HomeStatus ("Fenster_Bad","warning");;\
}
attr wd_Fenster_Bad autoRestart 1
attr wd_Fenster_Bad room 00_Fenster
cool, danke Jungs! manchmal ist es einfach :)
Hallo
das Problem kenn ich auch ;D
hab es über den Enigma2 Rec gelöst, und das funktioniert sehr gut, nach 15min. Lüften wird alle 5 min. die Nachricht eingeblendet :D, hier mal der Code
defmod Fenster_Status DOIF ([FK_Bad] =~ "offen" and [Bad:temperature] < 18) (set WZ_Receiver msg yesno 60 \nDas Badfenster ist jetzt seit {(round([FK_Bad:state:sec]/60,1))} Minuten offen\n \
\
\nDie Feuchtigkeit im Bad beträgt [Bad:humidity] %\n\
\
\nDie Aussentemparatur beträgt [Aussenbereich:temperature] °C\n)
attr Fenster_Status cmdIcon initialize:general_an@red disable:general_aus@lime
attr Fenster_Status devStateIcon cmd_1.*:general_an@lime:cmd_2 cmd_2:general_aus@red:cmd_1 initialize:helper_doif@lime:disabled disabled:helper_doif@red:initialize
attr Fenster_Status icon fts_window_1wbb_open
attr Fenster_Status repeatcmd 300
attr Fenster_Status stateFormat {(ReadingsVal($name,"state","") eq "disabled") ? "<span style='color:#00FF00'>Automatik Aus</span>":"<span style='color:#FF0000'>Automatik An</span>"}
attr Fenster_Status wait 900
attr Fenster_Status webCmd initialize:disable
Generisch für alle Fenster mit eigenen Timern pro Fenster geht das z.B. auch mit dem monitoring Modul.
Mir würde da noch DOIF mit dem Attribut wait und einen DOELSE einfallen.
Das scheint ein "beliebtes" Problem zu sein.
Hier mit einem Notify und einer Routine in 99_myUtils.
mqtt_d_doors:(haustuer|garage|hoftuer):.* {
my $door=$EVTPART0;
#Log 1, "Alexa ".$EVENT;
$door=~ s/[:]+//g;
if ($EVTPART1 =~ /open/i){
unless(istdurchzug($door,$NAME)){
frontdoor($door,0);
}
AnalyzeCommand(undef,"defmod at_alexa_$door at +00:02:02 setreading $NAME $door 122");
}elsif($EVTPART1 =~ /closed/i){
AnalyzeCommand(undef,"delete at_alexa_$door.*");
}else{
my $elapsed=int($EVTPART1);
frontdoor($door,int($elapsed/60));
my $nr=List::Util::min(rand(1800)+7000,$elapsed*(rand(1)+1));
my $ne=strftime('%H:%M:%S', gmtime($nr));
$nr+=$elapsed;
$nr=int($nr);
AnalyzeCommand(undef,"defmod at_alexa_$door$nr at +$ne setreading $NAME $door $nr");
#Log 1, "Alexa $door ".$ne." ".$nr." ".$elapsed." ".($elapsed*1.5);
}
return undef;
}
mqtt_d_doors ist ein MQTT device, dass in den readings den Status der entsprechen Türen empfängt. Wenn eine Tür geöffnet tut Alexa das kund. Das macht sie in größern Abständen immer wieder, solange bis die Tür geschlossen wurde.
sub frontdoor($$)
{
my ($door,$cnt)=@_;
my $find="DOOR";
my $replace="$door";
my $msg='<speak><voice name="Vicki"><lang xml:lang="de-DE"><amazon:emotion name="excited" intensity="high">Es zieht.</amazon:emotion></lang></voice><voice name="Hans"><lang xml:lang="de-DE">Kein Wunder. Die DOOR ist offen.</lang></voice></speak>';
$msg =~ s/$find/$replace/;
if ($cnt>0){
$find="offen";
my $std=int($cnt / 60);
my $mnt=$cnt % 60;
#Log 1, $cnt." ".$std." ".$mnt;
my $replace="seit $cnt Minuten offen";
if ($std > 0){
$replace="seit einer Stunde und $mnt Minuten offen";
}
if ($std > 1){
$replace="mehr als $std Stunden offen";
}
$msg =~ s/$find/$replace/;
}
my $actor ='d_doorbell';
if (ReadingsAge($actor,"last$door",123)>120){
alexa_speak($msg);
my $callnumber=ReadingsNum($actor,"last$door",0)+1;
readingsSingleUpdate($defs{$actor},"last$door",$callnumber,0);
}
}
ja, jeder hat da etwas :)
Hier ein Bespiel für die Ansage bei schnell ansteigender Feuchte bzw. bei schnell fallender Temperatur:
defmod di_Fenster_Bad_Ansage DOIF subs {\
sub send_alexa {\
my ($dev,$text,$volume)=@_;;\
$volume=20 if (!defined ($volume));;\
fhem("attr $dev speak_volume $volume");;\
fhem("set $dev speak $text");;\
}\
}\
\
##{[FS];;send_alexa("echo_Keller","Bitte Fenster öffnen",70);;}\
{if ([$SELF:increase]) {send_alexa("echo_Bad","Bitte Fenster öffnen");;set_State("Ansage Öffnen")}}\
{if ([BadFenster:state] eq "open") {set_Reading ("temp",ReadingsVal("TH_Bad_HM","measured-temp",0));;set_State("Fenster geöffnet")}}\
{if ([$SELF:cold]) {send_alexa("echo_Bad","Bitte Fenster schließen");;set_State("Ansage Schließen")}}
attr di_Fenster_Bad_Ansage DOIF_Readings increase: [?Bad_Fenster] eq "closed" and [TH_Bad_HM:humidity:diff] > 5,\
cold:[?BadFenster] eq "open" and ([$SELF:temp] - [TH_Bad_HM:measured-temp]) > 0.5
attr di_Fenster_Bad_Ansage event-on-change-reading .*
attr di_Fenster_Bad_Ansage room Fenster
Ich werde dazu noch eine Version für mehrere Fenster ins Wiki stellen.