FHEM Forum

FHEM => Automatisierung => Thema gestartet von: crissiloop am 08 November 2013, 15:03:58

Titel: Variable in userreading übergeben
Beitrag von: crissiloop am 08 November 2013, 15:03:58
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
Titel: Antw:Variable in userreading übergeben
Beitrag von: herrmannj am 08 November 2013, 17:58:38
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


Titel: Antw:Variable in userreading übergeben
Beitrag von: justme1968 am 08 November 2013, 18:23:10
dafür (readings als enduser setzen) gibt es inzwischen setreading. schau mal in die commandref.

gruss
  andre
Titel: Antw:Variable in userreading übergeben
Beitrag von: herrmannj am 08 November 2013, 19:46:44
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
Titel: Antw:Variable in userreading übergeben
Beitrag von: crissiloop am 12 November 2013, 17:24:16
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
Titel: Antw:Variable in userreading übergeben
Beitrag von: justme1968 am 12 November 2013, 17:29:20
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
Titel: Antw:Variable in userreading übergeben
Beitrag von: crissiloop am 12 November 2013, 18:02:55
Besten Dank

Gruß
Christian