[google-translator]
Für die Simulation der Anwesenheit werden gerne die Lampen oder die Rolladen oder was auch immer möglichst zufällig ein und ausgeschaltet. In den meisten Programmiersprachen gibt es für die Programmierung geeignete Algorithmen sog. Randomfunktionen, die beispielsweise gleichverteilte Zahlen zwischen 0.0 und 1.0 erzeugen. Obwohl so eine Funktion für die Hausautomation eine relativ sinnvolle Funktionalität bietet, ist keinerlei Randomfunktion in der HM-Skriptsprache abgebildet. Hiermit soll diesem Mangel mit einem HM-Skript abgeholfen werden.Der gewählte Lösungsansatz ist sicher etwas ungewöhnlich, was dem doch sehr beschränkten Befehlssatz der Homemaic-Skriptsprache geschuldet ist:In der Elektronik verwendet man gerne für die Rauscherzeugung sog. Pseudo-Rauschgeneratoren; Herzstück sind dafür mit XOR-Gattern rückgekoppelte Schieberegister. Wer mehr darüber wissen will: http://de.wikipedia.org/wiki/Linear_r%C3%BCckgekoppeltes_Schieberegister
Dieser eigentlich hardwarenahe Lösungsansatz wird im Folgenden für die softwaremässige Erzeugung von gleichverteilten Zahlen verwendet. Dahinter sind komplizierte Theorien, die aber hier nicht weiter erläutert werden. Deshalb für den reinen Anwender hier mein… Kochrezept:
1 Zwei Systemvariable „random_zahl“ und „random_tp“ vom Variablentyp Zahl anlegen, Wertebereich -2.0 bis 2.0 !
Dabei ist „random_zahl“ eine bei jedem Skriptaufruf neu berechnete Zufallszahl zwischen 0.0 und 1.0 Die Systemvariable „random_tp“ ist eine gemitteltes oder „geglättetes“ Abbild von „random_zahl“ im gleichen Wertebereich.
2 Ein WebUI-Programm anlegen, in dem zyklisch beispielsweise alle 3 Minuten folgendes HM-Skript aufgerufen wird:[codesyntax lang=“text“ title=“HM-Skript“]
!Version 2014.06.02 ; Verfasser :Eugen Stall !zwei Systemvariablen "random_zahl" und "random_tp" als Zahl mit Wertebereich -2.0 bis 2.0 anlegen !Skript speichert Zufallszahl zwischen 0.0 und 1.0 ungefiltert auf "random_zahl und gemittelt auf "random_tp" !############################################## real zahl = 65536.0 * dom.GetObject("random_zahl").State(); zahl = zahl.ToInteger(); if ((zahl <1) || (zahl > 65535)) {zahl= 3757;} !um saubere Startposition sicherzustellen integer zahl_alt = zahl; !############################################## string dualzahl = ""; integer xor ; integer x; !hier wird ein 16bit-Schieberegister mit XOR-Rückkopplungen simuliert if (zahl > 32767) {dualzahl = dualzahl + "1"; zahl = zahl - 32768; x = 1;} else {dualzahl = dualzahl + "0"; x = 0;} xor = x; if (zahl > 16383) {dualzahl = dualzahl + "1"; zahl = zahl - 16384;} else {dualzahl = dualzahl + "0";} if (zahl > 8191) {dualzahl = dualzahl + "1"; zahl = zahl - 8192; x = 1;} else {dualzahl = dualzahl + "0"; x = 0;} if ((xor + x) ==1) {xor = 1;} else {xor = 0;} if (zahl > 4095) {dualzahl = dualzahl + "1"; zahl = zahl - 4096; x = 1;} else {dualzahl = dualzahl + "0"; x = 0;} if ((xor + x) ==1) {xor = 1;} else {xor = 0;} if (zahl > 2047) {dualzahl = dualzahl + "1"; zahl = zahl - 2048 ;} else {dualzahl = dualzahl + "0";} if (zahl > 1023) {dualzahl = dualzahl + "1"; zahl = zahl - 1024 ; x = 1;} else {dualzahl = dualzahl + "0"; x = 0;} if ((xor + x) ==1) {xor = 1;} else {xor = 0;} !niedrigstes neues bit einschieben zahl = zahl_alt * 2; if (zahl > 65535) {zahl = zahl - 65536;} zahl = zahl + xor; !auf 1 normieren und auf Systemvariable random_zahl speichern ############ zahl = 0.0000152590219* zahl; !zahl / 65536 dom.GetObject("random_zahl").State(zahl); !Mittelwertbildung : der Faktor 0.2 bestimmt die Mittelungsstärke. ########### !Je kleiner, desto "ruhiger" das Rauschsignal ######################## real tp_random = dom.GetObject("random_tp").State(); tp_random = tp_random + (0.2 * (zahl - tp_random)); dom.GetObject("random_tp").State(tp_random); tp_random = dom.GetObject("random_tp").State(); !####################################################
[/codesyntax]
3 Jeweils ein WebUI-Programm für die zufällige Steuerung einer Lampe, Rollade oder was auch immer anlegen.
Hier ein Beispiel für die Zufallsteuerung einer Lampe abends zwischen 18 und 23H:
Das Einschaltverhältnis (Lampe EIN zu Lampe AUS) kann man mit dem Schaltwert für „random_tp“ beliebig nach den individuellen Wünschen festlegen. Ich habe in den o.a. Beispiel einen Wert von 0.5 gewählt, was bedeutet, dass die Lampe in dem gewählten Zeitraum für etwa 50% der Zeit leuchtet.
Die Zeitdauer von Eingeschaltet und Pause hängt u.a. vom gewählten Aktualisierungsintervall des Skriptes ab. Kleine Zeiten ( 1 bis 2 Minuten) bedeutet häufiges Schalten, große Intervalle das Gegenteil.
Zur Zeit versuche ich noch die für mich geeigneten Einstellparameter zu ermitteln. Ansonsten läuft das Skript sehr schnell durch, aber trotzdem sollte man im Hinblick auf CCU-Belastung nicht zu häufig die Randomfunktion abfragen.
Viel Spass beim „zufälligen“ Steuern und Regeln
Changelog:
01.06.2014: fehlende Programmzeile im Skript ergänzt
02.06.2014: Programm verkürzt, Durchlaufzeit verbessert