Variable in userreading übergeben

Begonnen von crissiloop, 08 November 2013, 15:03:58

Vorheriges Thema - Nächstes Thema

crissiloop

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
FHEM 5.5 auf Cubietruck

1x HMLAN, 1x HMUSB, 12x HM-LC-Bl1 PBU-FM, 5x HM-LC-Sw1-Pl, 1x HM-LC-Sw1-FM, 2x HM-LC-Sw2-FM, 2x HM-SEC-RHS, 3x HM-SEC-SD, 8x HM-SEC-SC, 3x HM-RC-4-2, 1x HM-RC-8, 1x HM-Sec-SFA-SM, Jeelink, 7x Technoline TX 29 DTH-IT

herrmannj

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



justme1968

dafür (readings als enduser setzen) gibt es inzwischen setreading. schau mal in die commandref.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

herrmannj

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

crissiloop

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
FHEM 5.5 auf Cubietruck

1x HMLAN, 1x HMUSB, 12x HM-LC-Bl1 PBU-FM, 5x HM-LC-Sw1-Pl, 1x HM-LC-Sw1-FM, 2x HM-LC-Sw2-FM, 2x HM-SEC-RHS, 3x HM-SEC-SD, 8x HM-SEC-SC, 3x HM-RC-4-2, 1x HM-RC-8, 1x HM-Sec-SFA-SM, Jeelink, 7x Technoline TX 29 DTH-IT

justme1968

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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

crissiloop

FHEM 5.5 auf Cubietruck

1x HMLAN, 1x HMUSB, 12x HM-LC-Bl1 PBU-FM, 5x HM-LC-Sw1-Pl, 1x HM-LC-Sw1-FM, 2x HM-LC-Sw2-FM, 2x HM-SEC-RHS, 3x HM-SEC-SD, 8x HM-SEC-SC, 3x HM-RC-4-2, 1x HM-RC-8, 1x HM-Sec-SFA-SM, Jeelink, 7x Technoline TX 29 DTH-IT