«

»

Jul 18

Anwesenheits-Simulation mit Homematic: Licht und andere Aktoren zufällig schalten

Ein neues Homematic-Projekt passend zur Urlaubszeit:

Wir bauen uns eine Anwesenheits-Simulation zur Abschreckung von Einbrechern.
Unser Haus soll den Eindruck erwecken, dass jemand zuhause ist. Ein guter Anfang ist die Rolladen-Steuerung. Gehen die Rolladen abends automatisch runter und morgends wieder hoch, ist es für vorbeifahrende Gauner schonmal schwerer zu erkennen, dass niemand zuhause ist. Bitte nicht das Haus mit halb geschlossenen Rolladen verlassen, wie in meiner Nachbarschaft einige praktizieren. Dass heisst übersetzt: „wir sind mindestens 2 Wochen in Urlaub und keiner ist da“.

Die Homematic-Rolladensteuerung ist wahrscheinlich jedem bekannt, darauf gehe ich hier nicht näher ein. Nur ein Tipp:  Lasst die Rolladen zeitlich versetzt hoch- und runterfahren, vielleicht in 1-2 Minuten Abstand das erweckt nicht den Eindruck, dass eine vollautomatische Steuerung den Job auch ohne Anwesenheit übernimmt.

Zufällige Lichtsteuerung

Eine Anwesenheits-Simulation soll den Eindruck erwecken, dass jemand im Haus ist. Also wären Lampen, die sich zufällig ein- und ausschalten eine geeignete Sache. Die Lampen sollten natürlich so gewählt werden, dass sie einen von außen sichtbaren Lichtschein werfen. Also z.B. eine Flur-Beleuchtung, sofern die Haustür Glas-Elemente besitzt.  Dass diese Lampen mit Homematic-Schaltaktoren versehen sind, wird natürlich hier vorausgesetzt.

Zufalls-Generator ?

Mit Homematic Lampen schalten ist einfach.  Aber für unsere Anwesenheits-Simulation müssen wir diese zufällig schalten. Einbrecher erkennen sonst leicht die „an“-„aus“ Muster einer statischen Programmierung.

Wir brauchen also: Einen Zufalls-Generator !
Aber: Kann die Homematic „Zufall“ ??

Ja und Nein.  „Echter“ Zufall im mathematischen Sinne ist gar nicht so einfach. Eine präzise Zufalls-Ermittlung ist aber für unsere Zwecke gar nicht nötig. Wir begnügen uns also mit „Pseudo-Zufall“. Und das ist auch mit Homematic-Mitteln möglich:

Es geht los…

Wir brauchen:

  • Zwei Homematic-Variablen:   „_ZUFALL_“  und „Zufall_10“
  • Programme:  Ein Initialisierungs-Script „Zufall_Seed“, ein weiteres Seed-Script „Zufall_Temp“ und ein Aktualisierungsprogramm „Zufall_Akt“
  • Ein Programm für die regelmäßige Änderung der Zufalls-Werte

1. Variable „_ZUFALL_“ anlegen:

Die Variable „_ZUFALL_“ ist eine Hilfsvariable, welche den Pseudo-Zufallswert enthalten wird. Aus diesem Wert leiten wir uns einen Arbeitswert für die Verwendung in Homematic-Programmen ab. In unserem Fall möchten wir einen Wert zwischen 0 und 10 erzeugen, daher heisst die Arbeitsvariable „Zufall_10“.

2. Programm anlegen „Zufall_Seed“:

Die _ZUFALL_ Variable muss nun mit einem Zufallswert „gefüttert“ werden. Hierfür verwenden wir ein Homematic-Programm „Zufall_Seed“ mit eingebautem Script:

Initialisierung des Zufalls-Wertes bei CCU-Neustart

Initialisierung des Zufalls-Wertes bei CCU-Neustart

In das Script packen wir den folgenden Code:

var seed = system.Date("%S").ToInteger();
var sv_rand = dom.GetObject("_ZUFALL_");
sv_rand.State(seed);

Was passiert: Die Sekunden der aktuellen Systemzeit werden als Startwert verwendet. Das ist natürlich kein echter Zufall, der Pseudo-Zufall reicht aber, wenn das Seed-Script zu einer „zufälligen“ Uhrzeit aufgerufen wird. Das sollte zunächst beim Neustart der CCU-Zentrale erfolgen, damit die Variable nicht leer ist. (Homematic-Programm anlegen, ohne Ausführungs-Bedingung)

3. Periodische Neuinitialisierung nach zufälligem Zeitpunkt: Programm „Zufall_Temp“ anlegen

Die Anzahl der Sekunden nach beim Neustart der Zentrale ist schon mal prima Pseudo-zufällig. Die Zentrale wird aber zu selten neu gestartet, um den Zufallswert durchgängig zu initialisieren.Also nehmen wir als weiteren periodischen Event den Änderungsimpuls eines Temperatursensors. (Ein Bewegungsmelder oder Schalter ginge auch, aber wenn niemand zuhause ist…).  Der Trick:  Ein Homematic Temperatursensor meldet in Intervallen den Temperaturstand zurück. Er ändert sich laufend, und kann einen Event „bei Veränderung“ auslösen. Wann diese Änderung der Temperatur genau stattfindet ist schonmal gut pseudo-zufällig:

Homematic Temperatur Zufallssteuerung

„Zufall_Temp“: Programm für den Zufalls-„Seed“ durch den Temperatur-Sensor

Innerhalb dieses Programmes rufen wir lediglich das schon oben erwähnte Programm „Zufall_Seed“ nochmal auf:

var ausfuehren = dom.GetObject("Zufall_Seed");
ausfuehren.ProgramExecute();

So, jetzt haben wir schonmal tolle Pseudo-Zufallszahlen in der Variable „_ZUFALL_“. Jetzt müssen wir nur noch Sicherstellen, dass sich die Werte auch öfters ändern, auch wenn mal zufälligerweise KEINE Änderung der Temperatur in den letzten Minuten stattgefunden hat:

4. Periodische Änderung der Zufallszahl:  Das Programm „Zufall_akt“

Hierfür nehmen wir einfach alle X-Minuten den letzten Wert und rechnen mit einer mathematischen Formel den Wert unserer Variablen „_ZUFALL_“ weiter:

Das Programm Zufall_Akt:  Regelmäßig "neue" Zufallswerte erzeugen

Das Programm Zufall_Akt: Regelmäßig „neue“ Zufallswerte erzeugen

Für das Script verwenden wir diesmal den folgenden Code:

var a = 1297;
var b = 4693;
var m = 21870;

var sv_rand = dom.GetObject("_ZUFALL_");

var  rand = 0 + sv_rand.State();
rand = ((rand * a) + b) % m;
rand = rand + 10000;

var randstr = rand.ToString(rand);
randstr = randstr.Substr(3,1);

var randstr_sys = dom.GetObject("zufall_10");
randstr_sys.State(randstr);
sv_rand.State(rand);

Was passiert hier? Der Wert unserer Variable „_Zufall_“ wird ausgelesen und es werden Additionen und Multiplikationen ausgeführt, welche hier natürlich keine zufälligen neuen Werte, aber durchaus brauchbare Pseudo-Werte ergeben. Dieses Programm wird alle 8 Minuten aufgerufen und liefert in Kombination mit dem Programm „Zufall_Temp“ ganz brauchbare Werte. Das Ergebnis sind wechselnde 5-stellige Zahlen in der Variablen _ZUFALL_

5. Brauchbare Zufallszahlen ableiten

Für Programme brauchen wir vereinfachte Zufallszahlen, welche in Ausführungs-Entscheidungen innerhalb der CCU-Programme eingebaut werden können:  Die Homematic soll ein Programm ausführen, wenn eine bestimmte Wahrscheinlichkeit (Zufallswert) eintrifft.

Also machen wir aus den 5-stelligen Zahlen in „_ZUFALL_“ noch schnell eine einstellige Zahl mit Werten zwischen 0 und 9:  Auch das ist in unserem obenstehenden Programm-Script „Zufall_akt“ enthalten: Dieses befüllt ebenfalls die Variable „Zufall_10“ mit einer solchen Ziffer.

6. Zufallszahl  verwenden

Bringen wir alles zusammen:
Wir haben eine Zufalls-Ziffer in der Variable „Zufall_10“ in der Homematic-CCU, welche sich alle 8 Minuten ändert und einen (fast) zufälligen Wert enthält.
Diese können wir nun mit einem Programm verwenden, welches die Lampen zufällig ein- und ausschaltet:

Programm mit Auslösungs-Timer alle 8 Minuten:

Wenn „Zufall_10“ < 5 dann Lampe ein, ansonsten Lampe aus.

Die Ein-Ausschalt-Intervalle lassen sich dadurch natürlich schön feinsteuern. So kann über größere Werte als „5“ auch die Einschaltphase länger werden und durch kleinere Werte kürzer.

Einfach mal ausprobieren.
Natürlich lassen sich auch die Werte / Intervalle der Zufallszahl-Erzeugung kleiner stellen. Mit einer CCU2 sollten auch minütliche Berechnungen möglich sein, die schwächere CCU1 hingegen sollte wegen des schwachen Prozessors nicht überfordert werden.

Viel Spaß beim nachbauen…

Kami

 

2 Kommentare

  1. Christoph

    Hi Kami,

    danke für die Idee und die Skripte.
    Ein kleiner Fehler hat sich aber eingeschlichen:
    Im Skript für Zufall_akt hast Du Objekt „zufall_10“ aufgerufen. Korrekt muss es „Zufall_10“ sein. Zumindest muss es in Groß-/Kleinschreibung mit der Variablen übereinstimmen.

    Und an alle: Dann sollte man noch beim zufälligen ein-/ausschalten der Lampen eine Abfrage auf eine Anwesenheitsvariable einbauen, so dass die Lampen nur an-/ausgeschaltet werden, wenn man nicht anwesend ist. So kann man die Automatik sozusagen auch ausschalten (sei es manuell oder automatisch, wie Du es einen Monat vorher schon beschrieben hast.)

    Christoph

  2. Christoph

    Ach noch eine Ergänzung:
    Wenn man mehrere Lampen damit schalten möchte, dann sollte man sich unterschiedliche Intervalle aus der Zufall_10 aussuchen, ansonsten schalten die Lampen ja alle gleichzeitig.
    Nimmt man bei Lampe A (Flur) das Intervall 1-2 für an und bei Lampe B (Wohnzimmer) 3-7 und bei Lampe C Küche (8-10), dann hat man abwechselnde An-Zeiten und kann auch die wahrscheinliche Dauer an die Nutzung anpassen (z.B. Flur kurz, Wohnzimmer lang).
    Man könnte für den Flur auch nur die 1 nehmen, was dann einer wahrscheinlichen Brenn-Dauer von 8 Minuten entspricht (wenn man Zufall_akt alle 8 Minuten ausführt). Hat allerdings auch den Nachteil, dass die Lampe wahrscheinlich nur alle 72 MInuten für 8 MInuten brennt.

    Es gibt viel zu Bedenken

    Christoph

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Sie können diese HTML-Tags verwenden: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>