Licht mit mehreren Sensoren on-for-Timer schalten und Zeiten addieren

Begonnen von ripper, 05 Dezember 2016, 16:39:06

Vorheriges Thema - Nächstes Thema

ripper

Hallo,

ich habe meine Gangbeleuchtung, die vorher mit zwei "normalen" Bewegungsmeldern geschalten wurde umgebaut.
Ziel sollte es sein das Licht weiterhin über erkannte Bewegung zu Schalten, aber auch über einen (bzw. sind es jetzt zwei) Schalter das Licht einschalten zu können. ABER es sollte durch drücken eines Schalters nicht auf "on" gesetzt werden. Ich hatte vorher immer das Problem dass, das Licht dann nicht mehr ausgeschaltet wurde. Also wollte ich auch nur ein "on-for-timer" haben, der sich bei mehrfachem Betätigen des Schalters addiert um das Licht auch für einen Längeren Zeitraum einschalten zu können.
Zusätzlich habe ich mit den neuen Bewegungsmeldern das Problem, dass wir nicht mehr gesehen werde, wenn wir zur Wohnungstür reinkommen. Also habe ich den Türsensor auch noch mit einbezogen.

Als Bewegungsmelder habe ich zwei HM-Sen-MDIR-WM55
Das Licht schalte ich mit einem HM-LC-SW1-FM
und an der Tür ist ein HM-SEC-SCo verbaut.

Ich hab im Forum einen Beitrag gefunden in dem es um Restlaufzeit von on-for-timer geht. https://forum.fhem.de/index.php/topic,30169.msg228677.html#msg228677
Den Timer hab ich so übernommen:
Internals:
   COMMAND    {if(ReadingsVal("d_Ga_lichtDecke",'state',0)>0) {fhem("set d_Ga_lichtDecke ".(ReadingsVal("d_Ga_lichtDecke",'state',0)-1))} else {fhem("attr a_Ga_lichtDecke_laufzeit disable 1;save")}}
   DEF        +*00:00:01 {if(ReadingsVal("d_Ga_lichtDecke",'state',0)>0) {fhem("set d_Ga_lichtDecke ".(ReadingsVal("d_Ga_lichtDecke",'state',0)-1))} else {fhem("attr a_Ga_lichtDecke_laufzeit disable 1;save")}}
   NAME       a_Ga_lichtDecke_laufzeit
   NR         125
   NTM        16:18:32
   PERIODIC   yes
   RELATIVE   yes
   REP        -1
   STATE      disabled
   TIMESPEC   00:00:01
   TRIGGERTIME 1480951112.19944
   TRIGGERTIME_FMT 2016-12-05 16:18:32
   TYPE       at
   Readings:
     2016-12-05 16:18:31   state           disabled
Attributes:
   disable    1
   group      Licht_helper
   room       Automatik


und mir einen Dummy für das Licht gebaut. Dieser hat noch ein userReading für on und off bekommen auf dass man dann reagieren kann
Internals:
   CHANGED
   NAME       d_Ga_lichtDecke
   NR         124
   STATE      0
   TYPE       dummy
   Readings:
     2016-12-05 07:11:37   onOff           off
     2016-12-05 07:11:37   state           0
Attributes:
   event-on-change-reading onOff
   group      Licht_helper
   room       Automatik
   userReadings onOff {return "on" if (ReadingsVal('d_Ga_lichtDecke','state','') > 1);;;; return "off"}


dann habe ich (versucht) eine kleine sub zu schreiben. Bzw zwei. Eine für die Bewegungsmelder
sub gangbeweg($$) {
my ($motion, $hour) = @_;
my $melder = "MotionSensor";

if (ReadingsVal($motion,'brightness','') <= "60" && ($hour <= "21" && $hour >= "6")) {Ga_lichtDecke("$melder");
}
elsif (ReadingsVal($motion,'brightness','') <= "60" ) {fhem ("set Ga_lichtNacht on-for-timer 30");
}

}


und eine zweite die dann die aktuelle on-for-timer Zeit ausliest und dann je nachdem welcher Sensor betätigt wurde eine definierte Zeit zur aktuellen Laufzeit hinzuaddiert.
sub Ga_lichtDecke($) {
my ($ausloeser) = @_;

my $currentTime = ReadingsVal('d_Ga_lichtDecke','state','0');
my $plusTime = 240;   #Time für Buttons
my $tuerTime = 120;  #Time für Tuere oeffnen
my $motionTime = 60; #Time für Bewegungsmelder
my $newTime = 0;

if($ausloeser eq "MotionSensor"){
$newTime = $currentTime + $motionTime
}
elsif($ausloeser eq "Ga_tuer"){
$newTime = $currentTime + $tuerTime
}
else { $newTime = $currentTime + $plusTime}

if (ReadingsVal('a_Ga_lichtDecke_laufzeit','state','') eq "disabled") {fhem ("set d_Ga_lichtDecke $newTime; attr a_Ga_lichtDecke_laufzeit disable 0;");
}
else {fhem ("set d_Ga_lichtDecke $newTime");
}

}


Beim Notify der Tür prüfe ich beim öffnen noch ob die aktuelle Uhrzeit zwischen Sonnenuntergang und Aufgang liegt. Um es auch nur einzuschalten, wenn wir nach Hause kommen und es schon "Dunkel" ist. Außerdem checke ich noch ob das Licht schon an ist, um die Zeit nicht zu verlängern wenn wir eh das Haus verlasen.
Internals:
   CFGFN
   DEF        Ga_tuer:open {
if ((ReadingsVal('d_Ga_lichtDecke','onOff','') eq 'off') and ($hms ge sunset_abs() or $hms le sunrise_abs())) {Ga_lichtDecke($NAME)}
}
   NAME       LichtAnGangTuer
   NOTIFYDEV  Ga_tuer
   NR         168575
   NTFY_ORDER 50-LichtAnGangTuer
   REGEXP     Ga_tuer:open
   STATE      2016-12-05 13:41:05
   TYPE       notify
   Readings:
     2016-12-03 10:50:07   state           active
Attributes:
   group      Licht_helper
   room       Automatik


Vielleicht kann ich hier mit meinem Konstrukt auch mal jemand helfen nachdem ich von vielen Beiträgen hier schon sehr Profitieren konnte.
Ich lasse mich aber natürlich auch gerne auf einen einfacheren Weg führen, da ich auf jeden Fall noch Anfänger bin und mich freue was zu lernen.

Viele Grüße
Flo