[gelöst] Zufallsgenerator

Begonnen von MarkoP, 23 Juli 2020, 15:43:44

Vorheriges Thema - Nächstes Thema

MarkoP

Hallo,

ich wollte mal fragen ob es in Fhem bzw. Pearl einen Zufallsgenerator gibt.
Ich würde gerne ein zeitliches Ereignis etwas variabler gestalten - in dem Fall ein per at geschaltetes Licht in einem Rahmen von 20 Minuten variable ausschalten.
Fhem-Server läuft per Bridge mit eigener IP auf einem Docker-Container auf meinem NAS. Alle Geräte haben eine statische IP im Netzwerk und laufen im gleichen Subnetzwerk. DHCP ist deaktiviert. DNS läuft über den Router (Fritzbox Cable), alternative über Googles 8.8.8.8

MadMax-FHEM

Schon mit der Suche probiert!?

Suche nach: "random" liefert das https://forum.fhem.de/index.php/topic,14010.msg87704.html#msg87704

Und auch google bzgl. Perl befragt hätte wohl eine entsprechende Funktion geliefert (zum "selber bauen")...

Nicht zu danken für's suchen (lassen)... ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Beta-User

@MadMax-FHEM
RandomTimer ist eher für "reguläre Tages- oder Wochenabläufe" geeignet, hier geht es nur um einmalige Vorgänge, oder?

Zitat von: MarkoP am 23 Juli 2020, 15:43:44
ich wollte mal fragen ob es in Fhem bzw. Pearl einen Zufallsgenerator gibt.
Ob Pearl einen im Angebot hat, kann ich nicht sagen, aber eine Suche nach "int(rand(" (beides Perl-Funktionen) sollte einige Ergebnisse hier im Forum liefern, z.B. das hier: https://forum.fhem.de/index.php/topic,105963.msg999095.html#msg999095. Und für allg. Perl-Infos gibt es entsprechende Seiten: https://perldoc.perl.org/functions/rand.html

PS: RandomTimer nutzt intern auch rand.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Wuppi68

<ironic>
also ich finde die Frage viel zu unspezifisch ;-)

Wie soll der Wertebereich aussehen?
Wie hoch soll die Auflösung sein? Minuten, Sekunden, 100stel Sekunden ...
Wie hoch soll/darf die Entropie sein?

Reicht nicht auch ein rand(20)

</ironic>
FHEM unter Proxmox als VM

MadMax-FHEM

Zitat von: Beta-User am 23 Juli 2020, 16:00:38
@MadMax-FHEM
RandomTimer ist eher für "reguläre Tages- oder Wochenabläufe" geeignet, hier geht es nur um einmalige Vorgänge, oder?
Ob Pearl einen im Angebot hat, kann ich nicht sagen, aber eine Suche nach "int(rand(" (beides Perl-Funktionen) sollte einige Ergebnisse hier im Forum liefern, z.B. das hier: https://forum.fhem.de/index.php/topic,105963.msg999095.html#msg999095. Und für allg. Perl-Infos gibt es entsprechende Seiten: https://perldoc.perl.org/functions/rand.html

PS: RandomTimer nutzt intern auch rand.

Drum ja: ;)

Zitat von: MadMax-FHEM am 23 Juli 2020, 15:52:29
Und auch google bzgl. Perl befragt hätte wohl eine entsprechende Funktion geliefert (zum "selber bauen")...

Dann geht der Dank für "diese Suche" an dich ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Der_Tom

#5
Zitat von: MarkoP am 23 Juli 2020, 15:43:44
Hallo,

ich wollte mal fragen ob es in Fhem bzw. Pearl einen Zufallsgenerator gibt.
Ich würde gerne ein zeitliches Ereignis etwas variabler gestalten - in dem Fall ein per at geschaltetes Licht in einem Rahmen von 20 Minuten variable ausschalten.

MSwitch hat eine solche Funktion integriert ( muss aber nachinstalliert werden ) .

ZitatMSwitch_RandomTime
Format: HH:MM:SS-HH:MM:SS
Bei Aktivierung wird vor jedem Ausfuehren eines verzoegerten Befehls (Delay) eine Zufallszeit generiert,
die im Rahmen der hier angegebenen Zeitspanne liegt. Auf diese Zufallszahl kann in den Delays zugegriffen werden,
durch die Angabe '[random]' statt einer direkten Zeitangabe.
Bei nicht gesetztem Attribut ergibt die Angabe von '[random]' immer '00:00:00'

gruss tom

PS:als trigger für das abschalten kann natürlich auch ein Event dienen , z.B:  licht:state:on

MarkoP

@Beta-User
Danke, werde mir beide Befehle mal ansehen.
Fhem-Server läuft per Bridge mit eigener IP auf einem Docker-Container auf meinem NAS. Alle Geräte haben eine statische IP im Netzwerk und laufen im gleichen Subnetzwerk. DHCP ist deaktiviert. DNS läuft über den Router (Fritzbox Cable), alternative über Googles 8.8.8.8

MarkoP

Also wenn ich Halbwegs durchblicke würde ich das ganze mit einem zweigeteilten Befehl angehen:
define xyz at *17:00 { fhem (" ;; define xyz2 at +{int{rand(20)}} set ... }
Der erste Define der jeden Tag um 17 Uhr ausgelöst aber keinen ausführenden Befehl hat und darauf aufbauend ein zweites Define mit einer Relativen Angabe auf Basis von Rand als Zufallszahl

Oder könnte man das ganze auch Zusammenfassen indem man schreibt:
define xyz at *17:00 +{int{rand(20)} set ...

Wie kann ich angeben, dass die Zufallszahl als Minuten und nicht als Sekunden interpretiert werden?
Reicht es wenn ich im Timespec die Sekunden weglassen und meine Schreibweise anwende oder wird die relative Angabe trotzdem in Sekunden umgerechnet?
Fhem-Server läuft per Bridge mit eigener IP auf einem Docker-Container auf meinem NAS. Alle Geräte haben eine statische IP im Netzwerk und laufen im gleichen Subnetzwerk. DHCP ist deaktiviert. DNS läuft über den Router (Fritzbox Cable), alternative über Googles 8.8.8.8

Beta-User

#8
1. Hatte ich irgendwo im Zusammenhang mit rand() geschweifte Klammern verwendet?

2. https://wiki.fhem.de/wiki/Zeitangaben,_rechnen_mit
EDIT: und Perl in at MUSS lt. Commandref eine Zeitangabe zurückliefern, Perl ist <timespec>.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Otto123

Zitat von: MarkoP am 24 Juli 2020, 12:23:46
Wie kann ich angeben, dass die Zufallszahl als Minuten und nicht als Sekunden interpretiert werden?
{POSIX::strftime("%H:%M:%S",gmtime(rand(20)*60))}
liefert zufällige minuten und sekunden zurück
{POSIX::strftime("%H:%M",gmtime(rand(20)*60))}
liefert zufällige minuten
{POSIX::strftime("%H:%M",gmtime(17*3600+rand(20)*60))}
für 17:00 +

Bitte in der Kommandozeile ausprobieren :)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

MarkoP

ZitatHatte ich irgendwo im Zusammenhang mit rand() geschweifte Klammern verwendet?
Nein, aber du hast geschreiben, dass es sich um Pearl-Funktionen handelt. Meines Wissens müssen diese doch immer in geschweifte Klammern gesetzt werden. Deshalb meine Schreibweise.
Wenn es nicht korrekt ist musst du mich bitte korregieren.

@Otto123
Deine Ausführungen sind Pearl-Funktionen, also wäre es so im at korrekt, oder?
define xyz at *{strftime("%H:%M",gmtime(17*3600+rand(20)*60))} set ...
Fhem-Server läuft per Bridge mit eigener IP auf einem Docker-Container auf meinem NAS. Alle Geräte haben eine statische IP im Netzwerk und laufen im gleichen Subnetzwerk. DHCP ist deaktiviert. DNS läuft über den Router (Fritzbox Cable), alternative über Googles 8.8.8.8

Beta-User

Es ist doppelt nicht korrekt:

1. die Sprache heißt weiterhin Perl. Eine Auswahl für alles andere findest du hier https://de.wikipedia.org/wiki/Pearl.

2. Die geschweiften Klammern _außen herum_ braucht man, um fhem.pl zu signalisieren, dass bestimmte Dinge Perl-Code (!) sind. Innerhalb des Codes selbst können teils auch geschweifte Klammern auftauchen, die haben dann aber in der Regel andere Bedeutungen, die dich jedenfalls für solche einfachen Aufgaben nicht interessieren. Jedenfalls bei dem Suchbegriff, den ich ins Spiel gebracht habe, war daher auch keine der Perl-Funktionen mit einem in geschweiften Klammern notierten Funktionsaufruf zu finden...

Bevor du also zukünftig was verbesserst, mach' es erst so, wie beschrieben, und erst, wenn das nicht klappt, kannst du (nach einem Blick ins log) selbst kreativ werden und den (vermeintlichen) Fehler verbessern.

Wenn du so wie bisher weitermachst, es "verbesserst", um dich dann zu beklagen, dass es nicht tut, riskierst du jedenfalls, eventuelle Helfer zu vergraulen.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Otto123

Zitat von: MarkoP am 24 Juli 2020, 14:01:13
@Otto123
Deine Ausführungen sind Pearl-Funktionen, also wäre es so im at korrekt, oder?
define xyz at *{strftime("%H:%M",gmtime(17*3600+rand(20)*60))} set ...
Ja sieht gut aus. Probier es aus :) Ich habe es jetzt auch probiert, ich war nicht sicher denn ohne * passiert etwas anderes.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

MarkoP

#13
Danke, hab's probiert.
Klappt erstmal.

Ginge das auch mit einem Notity? Beispielsweise in der Form:
define xyz notify dummy:on+{strftime("%H:%M",gmtime(17*3600+rand(20)*60))} set ...
Fhem-Server läuft per Bridge mit eigener IP auf einem Docker-Container auf meinem NAS. Alle Geräte haben eine statische IP im Netzwerk und laufen im gleichen Subnetzwerk. DHCP ist deaktiviert. DNS läuft über den Router (Fritzbox Cable), alternative über Googles 8.8.8.8

Otto123

Moin,

im notify musst Du eine Verzögerung direkt in den Ausführungsteil bauen - NICHT in das regExp vom Trigger!

define xyz notify dummy:on {my $delay=rand(20)*60;;fhem("sleep $delay;; set ... ")}

Oder die Kombination aus beidem:
define xyz notify dummy:on define xyz at {strftime("%H:%M",gmtime(17*3600+rand(20)*60))} set ...

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz