Anwesenheitsimulation / Weihnachtsbeleuchtung

Begonnen von OK_DE, 03 November 2016, 22:22:23

Vorheriges Thema - Nächstes Thema

OK_DE

Hallo,

Da die dunkle Jahreszeit wieder angebrochen ist und man immer mehr von Einbrüchen liest habe ich mir Gedanken um eine Anwesenheitsimmulation gemacht.
Das ganze kann man auch für die Weihnachtsbeleuchtung verwenden.
Nach einigem herumprobieren mit at's habe ich eine elegantere Lösung gefunden die ich euch nicht vorenthalten möchte.


#---------Start:Anwesenheitssimulation---------
define ANWESENHEITSSIMULATOR_DOIF DOIF ([{sunset("CIVIL")}|0123456])({fhem 'set Lampe on-for-timer  '.int((rand(120))*60+120*60)})
attr ANWESENHEITSSIMULATOR_DOIF do always
attr ANWESENHEITSSIMULATOR_DOIF timerWithWait 1
attr ANWESENHEITSSIMULATOR_DOIF wait rand(20)*60
#---------Stop:Anwesenheitssimulation---------


Beschreibung:
Nach Sonnenuntergang sunset("CIVIL")
An bestimmten Wochentagen 0123456 wobei 0=Sonntag
Warte 1 bis 20 Minuten wait rand(20)*60
Bis du eine Lampe (Device) für mindestens 2 Stunden bis maximal 4 Stunden anschaltest int((rand(120))*60+120*60)

Hinweis: Das Anschalten der Lampe musste ich in eine fhem() Anweisung packen, da andernfalls die Berechungen mit rand eine Fehlermeldung "not a number" erzeugte.

igami

versuch es mal mit

define ANWESENHEITSSIMULATOR_DOIF DOIF ([{sunset("CIVIL")}|0123456])(set Lampe on-for-timer  {(int((rand(120))*60+120*60))})

siehe Berechnungen im Ausführungsteil
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

knopf_piano

Das hab ich, dummy Tageslicht wird per sunset ermittelt.

###################################################
# Für die Adventszeit :-)
###################################################
define Ntfy_AdventFreigabeAussen notify Tageslicht:dunkel {\
   if($month==12 || ($month==1 && $mday<14)) {\
       fhem("set SchalterSteckdoseMarkise_Freigabe on-for-timer 20700");;\
   }\
}

define Tmr_AdventFreigabeAussen at *05:45:00 {\
   if($month==12 || ($month==1 && $mday<14)) {\
       fhem("set SchalterSteckdoseMarkise_Freigabe on");;\
   }\
}

define Ntfy_AdventFreigabeAussenHellOff notify Tageslicht:hell {\
   if($month==12 || ($month==1 && $mday<14)) {\
       fhem("set SchalterSteckdoseMarkise_Freigabe off");;\
   }\
}

Gesendet von meinem GT-I9301I mit Tapatalk

zotac nano mit proxmox und ganz viel zeug drauf

moonsorrox

Zitat von: igami am 04 November 2016, 06:07:29
versuch es mal mit

define ANWESENHEITSSIMULATOR_DOIF DOIF ([{sunset("CIVIL")}|0123456])(set Lampe on-for-timer  {(int((rand(120))*60+120*60))})

siehe Berechnungen im Ausführungsteil

ich habe das mal ausprobiert. der Timer wird auch gesetzt, aber das Licht welches ich dafür genutzt habe geht nicht an.
Ich hatte den Startzeitpunkt 17:09:23 und Triggerzeitpunkt sollte 17:26:34 sein, aber es ist nichts passiert.

Funktioniert das bei dir..?
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

igami

Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

moonsorrox

 OK, ich dachte dies ist ein funktionierendes Beispiel....!
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

OK_DE

Antwort zu moonsorrox Frage:
Ich habe es exakt wie du oben beschrieben für mein Lampen Device definiert, es funktioniert einwandfrei.

Bei der Weihnachtsbeleuchtung wollte ich es auch verwenden da ging es dann plötzlich nicht.
Den Grund habe ich erst nach längerer Fehlersuche ermitteln können. Die Weihnachtsbeleuchtung hängt an einer Funksteckdose. Diese ist als Dummy definiert. Dummys können aber wie sich herausgestellt hat die Anweisung on-for-timer nicht.

Lösung waren zwei Befehle im DOIF erst Lampe on und dann eine AT Anweisung die die Lampe nach der berechneten Zeit wieder ausschaltet.

Vielleicht der gleiche Fehler ?

justme1968

attr <dummy> useSetExtensions 1 und dann geht auch on-for-timer.

oder readingsProxy statt dummy verwenden.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

moonsorrox

#8
Zitat von: OK_DE am 26 November 2016, 10:45:14
Antwort zu moonsorrox Frage:
Ich habe es exakt wie du oben beschrieben für mein Lampen Device definiert, es funktioniert einwandfrei.

Bei der Weihnachtsbeleuchtung wollte ich es auch verwenden da ging es dann plötzlich nicht.
Den Grund habe ich erst nach längerer Fehlersuche ermitteln können. Die Weihnachtsbeleuchtung hängt an einer Funksteckdose. Diese ist als Dummy definiert. Dummys können aber wie sich herausgestellt hat die Anweisung on-for-timer nicht.

Lösung waren zwei Befehle im DOIF erst Lampe on und dann eine AT Anweisung die die Lampe nach der berechneten Zeit wieder ausschaltet.

Vielleicht der gleiche Fehler ?

Ich habe das nicht weiter verfolgt. Ich hatte das Beispiel einfach mal ausprobiert falls ich mal gebrauchen kann, da es nicht funktionierte hab ich erst mal nichts weiter gemacht.
Ich schaue mir das nochmal an.

Wenn es bei dir gut läuft stell ruhig den funktionierenden Code ein, da ja grad Weihnachtszeit und beleuchtungszeit ist findet das sicher mehrere Interessenten  :D

EDIT:// habe das jetzt nochmals probiert und warum auch immer, jetzt läuft es  ::)
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

hartenthaler

Schöner Ansatz! Ich habe ihn noch etwas weiter gesponnen.

#################################################################
#
# Simulation der Anwesenheit von Bewohnern

## Ampel zum manuellen Aktivieren bzw. Deaktivieren der Simulation
define Anwesenheitssimulation dummy
attr Anwesenheitssimulation comment Simulation von nach aussen sichtbaren Abläufen um Einbrechern gegenüber eine Anwesenheit der Bewohner vorzutäuschen
attr Anwesenheitssimulation devStateIcon ja:ampel_gruen:nein nein:ampel_rot:ja .*:ampel_gruen
attr Anwesenheitssimulation group Automatik
attr Anwesenheitssimulation room Automatik
attr Anwesenheitssimulation setList state:ja,nein
attr Anwesenheitssimulation webCmd state

## Simulator für die Anwesenheit
define di_Anwesenheitssimulator DOIF ([{sunset("CIVIL")}|0123456] and [Anwesenheitssimulation] eq "ja")({fhem 'set Anwesenheitssimulator.Lampensteuerung on-for-timer '.int((rand(120))*60+120*60)})
attr di_Anwesenheitssimulator comment Sofern Anwesenheitssimulation angeschaltet ist:\
nach Sonnenuntergang an bestimmten Wochentagen (Sonntag=0) Anwesenheitssimulator.Lampen nach einer Wartezeit von bis zu 20 Minuten für 2 bis 4 Stunden einschalten\
([{sunset("CIVIL")}|0123456] and [Anwesenheitssimulation])({fhem 'set Anwesenheitssimulator.Lampensteuerung on-for-timer '.int((rand(120))*60+120*60)})
attr di_Anwesenheitssimulator do always
attr di_Anwesenheitssimulator room Automatik
attr di_Anwesenheitssimulator timerWithWait 1
attr di_Anwesenheitssimulator wait rand(20)*60

## Steuerungselement, das vom Anwesenheitssimulator gesteuert wird (beherrscht on-for-timer)
define Anwesenheitssimulator.Lampensteuerung dummy
attr Anwesenheitssimulator.Lampensteuerung devStateIcon undefined:light_question
attr Anwesenheitssimulator.Lampensteuerung icon light_light
attr Anwesenheitssimulator.Lampensteuerung room Automatik
attr Anwesenheitssimulator.Lampensteuerung setList on off
attr Anwesenheitssimulator.Lampensteuerung useSetExtensions 1

## Steuerung der Lampen in Abhängigkeit vom Steuerungselement
define n_Anwesenheitssimulator.Lampensteuerung notify Anwesenheitssimulator.Lampensteuerung:(on|off) set Anwesenheitssimulator.Lampen $EVENT

## Struktur mit den Lampen, die in die Anwesenheitssimulation einbezogen sind
define Anwesenheitssimulator.Lampen structure Lampen Wohnzimmer_Lampen Buero_Lampen
attr Anwesenheitssimulator.Lampen devStateIcon undefined:light_question
attr Anwesenheitssimulator.Lampen icon light_light
attr Anwesenheitssimulator.Lampen room Automatik,Licht


Um die Simulation zu aktivieren/deaktivieren gibt es eine Ampel, die manuell gesetzt wird. Der Simulator selbst stammt aus dem obigen Post. Er steuert ein dummy Element, das per on-for-timer für eine gewisse Zeit aktiviert wird. Diese Aktivität wiederum steuert dann z.B. Lampen, die ich zu diesem Zweck in einer Structur zusammen gefasst habe, damit man die einbezogenen Lampen leicht verwalten kann.

Was bleibt zu tun?

  • akustische Simulation (Sonos); Starten des Fernsehers für einige Zeit
  • Lampen nicht alle gleichzeitig starten, sondern leicht zeitversetzt
fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

OK_DE

Funktionierende Anwesenheitssimulation:
Schaltet 1 bis 20 Minuten nach Sonnenuntergang die Lampe für 2 bis 4 Stunden an jedem Tag an.
#---------Start:Anwesenheitssimulation---------
define ANWESENHEITSSIMULATOR_DOIF DOIF ([{sunset("CIVIL")}|0123456])(set Lampe on-for-timer {(int((rand(120))*60+120*60))})
attr ANWESENHEITSSIMULATOR_DOIF do always
attr ANWESENHEITSSIMULATOR_DOIF timerWithWait 1
attr ANWESENHEITSSIMULATOR_DOIF wait rand(20)*60
#---------Stop:Anwesenheitssimulation---------


Achtung: Lampe aus dem Beispiel muss den Befehl on-for-timer unterstützen. Sonst keine Funktion.
Dummys tun das nicht. Hier muss ist zwingend für dem Dummy noch folgender Parameter gesetzt werden. attr Lampe useSetExtensions 1


Funktionierende Weihnachtsbeleuchtung
Schaltet bei Sonnenuntergang nur im Dezember und Januar die Beleuchtung an und zwischen 22:00 und 0:00 Uhr nur im Dezember oder Januar wieder aus.
Realisierung diesmal ohne on-for-timer. Wer will kann auch noch die Einschaltverzögerung aus obigem Beispiel einbauen.

#---------Start:Weihnachtsbeleuchtung---------
define WEIHNACHTSBELEUCHTUNG_DOIF DOIF ([{sunset("CIVIL")}] and ($month==12 or $month==1)) (set FUNKSTECKDOSE_AUSSEN_1 on) \
DOELSEIF ([([22:00]+(60*int(rand(120))))] and ($month==12 or $month==1)) (set FUNKSTECKDOSE_AUSSEN_1 off)
attr WEIHNACHTSBELEUCHTUNG_DOIF do always
#---------Stop:Weihnachtsbeleuchtung---------

hartenthaler

Zur Lampensteuerung während der Adventszeit habe ich eine Funktion hier im Forum abgekupfert, die mir die Adventszeit bestimmt. Sie gehört in die 99_myUtils.pm

use HTTP::Date;

################################################################
###                Berechnen der Adventszeit                 ###
################################################################

# liefert 1 für die Zeit zwischen dem Samstag vor dem 1. Advent bis zu Heilige Drei König

sub advent() {
  my ($Sekunde, $Minute, $Stunde, $Monatstag, $Monat, $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);
  my $adv=0;
   
  if($Monat<1) {
    $adv=1 if ($Monatstag<7); # also bis zum 6. Januar
  } else {
    $Jahr+=1900;
  my $wday = (localtime(str2time("$Jahr-12-25")))[6];
  $wday = $wday ? $wday : 7;
  my $time -= ($wday+22)*86400;
  $adv=1 if ($time<time);
  }
  return $adv;
}


Die zur Weihnachtsbeleuchtung gehörenden Lampen habe ich in einer Struktur zusammengefasst, die sich leicht verwalten lässt.

### Struktur, die die ganze Weihnachtsbeleuchtung zusammenfasst
define Weihnachtsbeleuchtung structure room FS20_1231 FS20_3111 FS20_1111
attr Weihnachtsbeleuchtung devStateIcon undefined:light_question
attr Weihnachtsbeleuchtung group Weihnachten
attr Weihnachtsbeleuchtung icon christmas_tree
attr Weihnachtsbeleuchtung room 1_Wohnung,Licht


Das zentrale Element ist die Zeitschaltuhr, die in Abhängigkeit von der Uhrzeit und der berechneten Aussenhelligkeit während des (zeitlich erweiterten) Advents die Lampen einschaltet.

### Zeitschaltuhr
define di_Weihnachtsbeleuchtung DOIF ( ([6:30-9:00] or [13:00-23:00]) and [Wetter.Helligkeit:light] < 5 and advent)\
  (set Weihnachtsbeleuchtung on)\
DOELSE\
  (set Weihnachtsbeleuchtung off)


Die Helligkeit wird näherungsweise dem twilight-Modul entnommen, wobei die Koordinaten und die Yahoo! Wetter-ID für den jeweiligen Standort angepasst werden müssen

define Wetter.Helligkeit Twilight 52.6 13.2 0 638242
attr Wetter.Helligkeit comment https://de.wikipedia.org/wiki/Sonnenstand
attr Wetter.Helligkeit group Helligkeit
attr Wetter.Helligkeit room Helligkeit,Wetter
attr Wetter.Helligkeit stateFormat { "Helligkeit (0-6): " . ReadingsVal($name, "light", 0) . "<br>Sonne: " . ReadingsVal($name, "elevation_txt", 0) . " " . ReadingsVal($name, "azimuth_txt", "")}
attr Wetter.Helligkeit userReadings azimuth_txt:azimuth.* { grad2himmelsrichtung(ReadingsVal($name,"azimuth",""),"im")},\
elevation_txt:elevation.* { elevation_text(ReadingsVal($name,"elevation",""))}


Wenn man statt der Gradzahl lieber eine Himmelsrichtung angezeigt bekommen möchte und den Höhenwinkel gerne als Text hätte, dann benötigt man noch zwei Funktion in 99_myUtils.pm, aber beides ist für die Funktion "Adventsbeleuchtung natürlich nicht nötig.

#################################################################
###         Umrechnung Gradzahl in Himmelsrichtung            ###
#################################################################

#---------------------------------------------------------------------------
# grad2himmelsrichtung(Grad) liefert bei Grad=0 oder =360 als Ergebnis "N"; Grad sollte zwischen 0 und 360 liegen
# zweiter optionaler Parameter definiert das Wort vor der Himmelsrichtung, etwa "aus" (Standard) oder "im"
#---------------------------------------------------------------------------
sub grad2himmelsrichtung($;$) {
  my ($value, $aus_im) = @_;
  $aus_im //= "aus";
  $aus_im .= " ";
  my $hr = $aus_im . "N";
 
  if (!defined $value or $value < 0) { $hr = "aus undefinierter Richtung"; }
  else {
    $value = $value % 360;
 
    if ($value < 22.5)      { $hr = $aus_im . "N"; }
    elsif ($value < 67.5)   { $hr = $aus_im . "NO"; }
    elsif ($value < 112.5)  { $hr = $aus_im . "O"; }
    elsif ($value < 157.5)  { $hr = $aus_im . "SO"; }
    elsif ($value < 202.5)  { $hr = $aus_im . "S"; }
    elsif ($value < 247.5)  { $hr = $aus_im . "SW"; }
    elsif ($value < 292.5)  { $hr = $aus_im . "W"; }
    elsif ($value < 337.5)  { $hr = $aus_im . "NW"; }
  }

  return $hr;
}


#################################################################
###           Textdarstellung des Höhenwinkels                ###
#################################################################

sub elevation_text($) {
  my ($elevation) = @_;
 
  if (!defined $elevation or $elevation < -90 or $elevation > 90) { return "in undefinierter Höhe über/unter dem Horizont"; }
  else {
    my $ueber_unter = "über";
    if ($elevation < 0) {
      $ueber_unter = "unter";
    $elevation = -$elevation;
    }
    $elevation = int($elevation+0.5);

    return $elevation . "° " . $ueber_unter . " dem Horizont";
  }
}
fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

schwabenuwe2103

Zitat von: hartenthaler am 01 Dezember 2016, 23:49:23

Was bleibt zu tun?

  • Lampen nicht alle gleichzeitig starten, sondern leicht zeitversetzt
[/color]
[/list]

Das Beispiel für die Anwesenheitssimulation konnte ich sehr gut für mein Szenario übernehmen. Dankeschön für den tollen Vorschlag! Perfekt wäre es, wenn das von Dir erwähnte zeitversetzte Starten der Lampen noch möglich wäre. Gibt es dazu schon eine Idee? Mir selber fällt nur die umständliche Variante ein, dass man zusätzlich eine Simulation2 nach gleichem Muster baut und dort eben die Timervariablen und die zu schaltenden Leuchten zur Simulation1 variiert. Dies ist aber nicht sonderlich elegant.

Grüße, Uwe

Icinger

Für so eine Anwesenheitssimulation eignet sich das RandomTimer-Modul hervorragend.
Am besten die einzelnen defines mit fortlaufender Nummer anlegen
zB
Zufall_1
Zufall_2
Zufall_3
etc.

Dann lassen sie diese alle gleichzeitig mittels
attr Zufall_.* disable 1
bzw.
attr Zufall_.* disable 0
ein- und ausschalten.

lg, Stefan
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

schwabenuwe2103

Hallo Stefan, lieben Dank für Deinen Tipp.

Könnte die Umsetzung des RandomTimers dann so aussehen?

Annahme: Die Flurlichter im UG, EG und DG habe ich bereits als Device definiert. Sie heissen: UG.Flurlicht, EG.Flurlicht und DG.Flurlicht

Jetzt, wie von Dir beschrieben, die defines mit fortlaufender Nummer anlegen (der Timer soll zwischen 17:00 und 23:00 aktiv sein und zwischen An und Ausschalten der Leuchten sollen 10 Minuten liegen:


define Zufall_1 RandomTimer 17:00:00 UG.Flurlicht 23:00:00 600 
define Zufall_2 RandomTimer 17:00:00 EG.Flurlicht 23:00:00 600
define Zufall_3 RandomTimer 17:00:00 DG Flurlicht 23:00:00 600


Paßt das soweit?

Was bezweckt man dann noch mit den von Dir genannten Attributen bzw. wie würde man das sinnvoll zu meinen o.g. Zeilen ergänzen können?

attr Zufall_.* disable 1
attr Zufall_.* disable 0

Sorry, bin Anfänger und wurstle mich gerade durch.....

Grüße, Uwe







Icinger

Bei mir siehts so aus:

define Zufall1 RandomTimer *{sunset_abs(-734)} RGB1 22:30:00 2700
define Zufall2 RandomTimer *{sunset_abs(208)} EG_WC_Licht 23:00:00 1350
define Zufall3 RandomTimer *{sunset_abs(-354)} EG_SZ_Sternenhimmel 23:30:00 1900
define Zufall4 RandomTimer *{sunset_abs(-4297)} KU_Wippschalter_Kaffee_Sw02_Licht 22:00:00 3700

um die Lichter von Sonnenuntergang bis eben gegen 22:00-00:00 brennen zulassen.

und dann ein
define ntf_Urlaubsmodus notify dmy_Urlaubsmodus.* {Log 3,"Urlaubsmodus_Dummy: $EVENT";
                           if ($EVENT eq "Abwesend") {
                               fhem "attr Zufall.* disable 0"
                           } else {
                               fhem "attr Zufall.* disable 1"
                           }
sucheSchaltzeit();
                          }


Welches auf den Hausstatus ("Urlaub","Arbeit","Abwesend" etc.) lauscht.

lg, Stefan
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

schwabenuwe2103

Prima, jetzt ist es klar  :). Dankeschön für Dein ausführliches Beispiel.
Grüße, Uwe