INSIDETecBaseWebUISkript-BibiliothekZufallszahlen generieren

Zufallszahlen generieren

Derzeit ist es nicht auf einfache Weise möglich, sich von der HomeMatic-Zentrale (bzw. über ein entsprechendes Tcl-Kommando) Zufallszahlen generieren zu lassen. Die folgenden zwei Ansätze zeigen aber, wie man annähernd eine Zufallszahl generieren kann, um diese dann in anderen Programmen/Skripten weiterverwenden zu können.

Zufallszahlen via "urandom"

Der erste Ansatz nutzt eine spezielle Datei des Betriebssystems (/dev/urandom), von der Benutzerprogramme Zufallszahlen lesen können. Diese Datei ist eine einheitliche Schnittstelle zu einem systemweiten Zufallsgenerator (weitere Informationen dazu auf Wikipedia).

Mittels HEXDUMP wird nun der Inhalt dieser Datei gelesen, in eine Dezimalzahl gewandelt und als String-Variante entsprechend aufgespaltet:
! *
! * Beispiele fuer Zufallszahlen per HM-Script
! *
string stdout;
string stderr;
system.Exec("hexdump -d -n 2  /dev/urandom",&stdout,&stderr);
! * Zahl zwischen 0-65535
var rand=stdout.StrValueByIndex(" ",3).ToInteger();
WriteLine(rand);
! *
! * ...und zwischen 0-10
! *
var  rand10=rand%10;
WriteLine(rand10);
! *
! * ...und zwischen 10-20
! *
var rand20=(rand%10)+10;
WriteLine(rand20);

Zufallszahlen auf Basis eines Kongruenzgenerators

Die Kongruenzgeneratoren bilden eine Klasse von Algorithmen, die zufällig  aussehende Zahlenfolgen erzeugen. Die dadurch erzeugten Zahlen nennt man Pseudozufallszahlen, da sie deterministisch erzeugt werden und somit nicht wirklich zufällig sind. Kongruenzgeneratoren sind die bekanntesten und meistverwendeten rekursiven arithmetischen Zufallszahlengeneratoren. (Quelle: Wikipedia)

Der Vorteil dieses Ansatzes ist der Verzicht auf die Funktion "system.Exec", die u.U. den Betrieb der HomeMatic-Zentrale stören kann.

Zunächst muss eine neue Systemvariable vom Typ "Zahl" angelegt werden, die in unserem Beispiel den Namen "_RANDOM_" erhält. Anschließend erstellt man ein neues Programm (Beispielname: "RANDOM_SET"), dass die eigentliche Zufallszahl in folgendem Skript berechnet:
var a = 1291;
var b = 4691;
var m = 21870;

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

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

sv_rand.State(rand);

Das Programm wird über das Zeitmodul in der "Wenn"-Bedingung alle 7 Minuten ausgeführt und erzeugt jeweils eine neue Zahl, die anschließend über die Systemvariable "_RANDOM_" abgefragt und benutzt werden kann.

Abschließend erstellt man ein weiteres Programm (Beispielname: "RANDOM_SEED"), das diesmal aber keine Wenn-Bedingung enthält und somit nur einmalig beim Starten des HomeMatic-Zentrale ausgeführt wird:
var seed = system.Date("%S").ToInteger();
var sv_rand = dom.GetObject("_RANDOM_");

sv_rand.State(seed);
Das Skript sorgt für die Initialisierung der Zufahlszahl und nutzt dazu den aktuellen Zeitstempel des Systems.

Neue Kommentare:

  • Hallo zusammen, ich versuche seit Tagen verzweifelt, für die Einbindung von FS20 Komponenten an der Homematic Zentrale (1.505), den CUL-Stick (V3.3) von BUSWARE zu konfigurieren. Ich bin streng nach Anleitung aus dem Net... Weiter lesen
  • Hallo, ich habe nun den cux Daemon installiert und die Firmware des CUL geschrieben, bei Status wird folgendes angezeigt: ======================================== USB 1-2 - {CUX} CUL868 [COMM] - /dev/ttyACM0 - V 1.44 CUL... Weiter lesen
  • Hallo, ich habe bei mir den Dimmer HM-LC-Dim1TPBU-FM in Betrieb. Soweit funktioniert alles.Wie komme ich aber an die weiteren Känäle des Dimmers. Bei mir werden in den Geräteeinstellungen die Kanäle Ch:2 und Ch:3 nicht a... Weiter lesen
Kommentare