Ich möchte mit den Fenstergriffsensoren HM-Sec-SC das Verhalten meiner Terrassenrollläden steuern. Wenn der Rollladen zu ist und der Griff geöffnet wird, fährt der Rollladen hoch. Das funktioniert auch schon:
Aber nun soll der Rollladen ja beim Schließen des Griffes nur runter fahren, wenn er beim Öffnen des Griffes auch schon unten war!
Mit meiner bisherigen Idee würde der Rollladen auch runter fahren, wenn er vorher beim Öffnen des Griffes auf war.
Bisher sieht meine Abfrage dazu so aus:
sub Fenstergrifffunktion($$) {
my ($Event,$Griffname) = @_;
my @Namensarray = split(/_Fenstergriffsensor/,$Griffname);
my $Fenstername = $Namensarray[0];
my $Rolloname = $Fenstername."_Rolladen";
if (Value("WZ_Terasse_Fenstergriffsensor") eq "geschlossen" && Value("K_Fenstergriffsensor") eq "geschlossen" && Value("Rolloverzoegerung_Terasse") eq "aktiv") {
fhem("set Rolloverzoegerung_Terasse passiv");
if (defined($defs{Terassenrollos_runter})) {
fhem("delete Terassenrollos_runter");
}
fhem('define Terassenrollos_runter at +00:05:00 {Rollo_runter($we,"K_Rolladen,WZ_Terasse_Rolladen")}');
}
elsif (Value($Griffname) eq "offen" && Value($Rolloname) ne "hoch") {
fhem("set ".$Rolloname." hoch");
}
elsif (Value($Griffname) eq "geschlossen" && Value($Rolloname) ne "runter" && Value("Rolloverzoegerung_Terasse") eq "passiv") {
fhem('define '.$Rolloname.'_runter at +00:05:00 set '.$Rolloname.' '.$WertAlt);
}
}
und wird durch ein Notify ausgelöst:
.*Fenstergriffsensor:contact.* {Fenstergrifffunktion($EVENT,$NAME)}
Meine Idee war, OldValue zu benutzen. Aber wie bekomme ich diesen Status vom Zustand vor dem ersten Notify gespeichert bis zum Notify beim Schließen des Griffes? Ein Dummy ist schwierig, da auch mehrere Griffe mit dieser Funktion bedient werden und auch mehrere Griffe gleichzeitig benutzt werden könnten.
Hat jemand eine Idee?
Gruß
Christian
Hallo Christian,
Du kannst direkt in den jeweiligen "Fenstergriff schreiben" (also den "alten" Status)
readingsSingleUpdate($main::defs{'_Name_des_Griffs_'}, '_denk_Dir_ein_Reading_aus_', 0);
Drei Parameter: #1 Name des Device, #2 Name des Readings, #3 0|1 (wenn 1 dann wird ein event ausgelöst)
Wenn Du bei #2 einen Punkt vor den Namen setzt wird es ein hidden Reading.
Tip: ruf danach WriteStatefile() auf, dann wird der Status ins statefile geschrieben und die logik bleibt nach Absturz/Stromausfall intakt.
vg
Jörg
dafür (readings als enduser setzen) gibt es inzwischen setreading. schau mal in die commandref.
gruss
andre
tatsächlich! Recht hat er (und ich was neues gelernt ;-)
Und fürs Protokoll, es wären 4 Paramter: ... #3 der Value, #4 der trigger
Danke und Grüße
Jörg
Vielen Dank für den Hinweis mit setreading. Damit funktioniert es jetzt!
sub Fenstergrifffunktion($$) {
my ($Event,$Griffname) = @_;
my @Namensarray = split(/_Fenstergriffsensor/,$Griffname);
my $Fenstername = $Namensarray[0];
my $Rolloname = $Fenstername."_Rolladen";
if (Value("WZ_Terasse_Fenstergriffsensor") eq "geschlossen" && Value("K_Fenstergriffsensor") eq "geschlossen" && Value("Rolloverzoegerung_Terasse") eq "aktiv") {
fhem("set Rolloverzoegerung_Terasse passiv");
if (defined($defs{Terassenrollos_runter})) {
fhem("delete Terassenrollos_runter");
}
fhem('define Terassenrollos_runter at +00:05:00 {Rollo_runter($we,"K_Rolladen,WZ_Terasse_Rolladen")}');
}
elsif (Value($Griffname) eq "offen" && Value($Rolloname) ne "hoch") {
my $uebergebenOldValue = OldValue($Rolloname);
Log 3, "alter Wert Rollo: ".$uebergebenOldValue;
fhem("set ".$Rolloname." hoch");
fhem("setreading ".$Rolloname." alt ".$uebergebenOldValue);
}
elsif (Value($Griffname) eq "geschlossen" && Value($Rolloname) ne "runter" && ReadingsVal($Rolloname,"alt","") ne "" && Value("Rolloverzoegerung_Terasse") eq "passiv") {
my $WertAlt = ReadingsVal($Rolloname,"alt","");
fhem('define '.$Rolloname.'_runter at +00:05:00 set '.$Rolloname.' '.$WertAlt);
fhem("deletereading ".$Rolloname." alt");
}
}
Ich habe im Logfile aber folgende 2 Einträge:
2013.11.12 17:13:45 3: deletereading WZ_Terasse_Rolladen alt : Deleted reading alt for device WZ_Terasse_Rolladen
2013.11.12 17:13:45 3: Fenstergriffsensornotify1 return value: Deleted reading alt for device WZ_Terasse_Rolladen
Habe ich das nur als Hinweis zu verstehen oder muss ich mir darüber Gedanken machen? Und warum kommt das als Return Value der Funktion?
Gruß
Christian
wenn du nichts explizit zurück gibst ist die rückgabe der letzen anweisung die rückgabe. und das ist bei dir das deletereading.
setz ein 'return undef' ans ende dann ist der logeintrag weg.
gruss
andre
Besten Dank
Gruß
Christian