Lampe abhängig vom Anwesenheit und Tageslicht schalten

Begonnen von smmmo, 14 Dezember 2014, 19:04:26

Vorheriges Thema - Nächstes Thema

smmmo

Hallo,

wenn es dunkel ist und ich nach Hause komme, dann soll eine Lampe angeschaltet werden. Hab doch ne Weile gebraucht, bis es so funktioniert hat, daher wollte ich das mal als Inspiration für alle anderen Einsteiger hinterlassen.

Gelöst habe ich das mit der Kombination aus Twilight (weiß wann es "dunkel" ist) und Presence (weiß ob mein Handy im WLAN ist).

Nach einigen Tagen hat sich herausgestellt, dass mein Nexus5 hin und wieder mal nicht per ping erreichbar ist (obwohl es "zu Hause" ist). Als Workaround wird der Zeitpunkt des letzten Status-Wechsels zu "absent" gemerkt. Das Licht wird nur angeschaltet, wenn der aktuelle Status auf "present" wechselt und der letzte Wechsel zu "absent" länger als 20 Minuten in der Vergangenheit liegt.


# Device definieren ("Nexus5" kann durch IP-Adresse ersetzt werden). Events werden nur ausgelöst, wenn sich der Status ändert.
define Nexus PRESENCE lan-ping Nexus5
attr Nexus event-on-change-reading state

# Twilight definieren. siehe http://fhem.de/commandref_DE.html#Twilight (mein Beispiel bezieht sich auf Berlin)
define myTw Twilight 52.514772 13.406067 0 638242

# Letzten Nexus-Abwesend-State merken
define storeLastNexusAbsent notify Nexus:absent {\
$data{lastOffTime} = time();;\
}

# Licht schalten wenn Nexus5 ins Wlan kommt
# Dabei sicherstellen, dass seit dem letzten Absent mind. 20*60 Sekunden vergangen sind
define lightOnWhenComingHome notify Nexus:.* {\
  my $nexusState = ReadingsVal("Nexus", "state", "unknown");;\
  Log 1, "Nexus-State: $nexusState";;\
  if($nexusState eq "present"){\
    if($data{lastOffTime}+20*60 < time()){\
      my $twilightLicht=ReadingsVal("myTw","light","6");;\
      Log 1, "Twilight-Licht: $twilightLicht";;\
      if($twilightLicht<5){\
        Log 1, "Licht wird geschaltet";;\
        fhem "set WohnzimmerLampe on";;\
      }\
    }\
  }\
}


Gruss
smo