Seite auswählen

Zufallsgenerator Skript für Anwesenheitssimulation, Lampen..

,
Zufallsgenerator Skript für Anwesenheitssimulation, Lampen..
Print Friendly, PDF & Email
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:
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();
!####################################################


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:

random1.jpg

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

Fähigkeiten

Gepostet am

19. März 2014

3 Kommentare

  1. Ja, wenn Du die entsprechenden mathematischen Formeln in der mathematisch stark reduzierten HM-Skripsprache das abbilden kannst. Also alles nur mit den vier Grundrechenarten!
    Sicher ist alles mit mehr oder weniger Aufwand möglich, aber die aktuelle Lösung funktioniert doch.

  2. Hi, ich teste gerade dein Skript. Ich habe als Wert 0.6 eingestellt und hätte nun erwartet, dass 40% der Zeit das Licht an ist. Das kann ich so aber nicht feststellen. Rein nach meiner Beobachtung, befindet sich der Wert wesentlich häufiger unter 0.5. Rein subjektiv recht häufig um 0.3. random_tp kommt eigentlich nie über 0.7 hinaus (einen Tag lang sporatisch beobachtet). Die Berechnung der Zufallszahl führe ich alle 3 Minuten durch. Das Licht bleibt dann, wenn der Wert mal über 0.6 geht, meist auch nur die 3 Minuten an, weil er direkt mit der nächsten Berechnung drunter kommt. Grundsätzlich ist das wohl ok, weil es sich um ein Flur-Licht handelt, verstehen tue ich es aber nicht so recht, da ich anhand deiner Beschreibung mit einem anderen Verhalten gerechnet hatte.

Kommentar absenden

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

Translate »