FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: MarkoP am 23 Juli 2020, 15:43:44

Titel: [gelöst] Zufallsgenerator
Beitrag 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.
Titel: Antw:Zufallsgenerator
Beitrag von: MadMax-FHEM am 23 Juli 2020, 15:52:29
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
Titel: Antw:Zufallsgenerator
Beitrag 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?

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.
Titel: Antw:Zufallsgenerator
Beitrag von: Wuppi68 am 23 Juli 2020, 16:02:11
<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>
Titel: Antw:Zufallsgenerator
Beitrag von: MadMax-FHEM am 23 Juli 2020, 16:13:40
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
Titel: Antw:Zufallsgenerator
Beitrag von: Der_Tom am 23 Juli 2020, 17:41:44
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
Titel: Antw:Zufallsgenerator
Beitrag von: MarkoP am 24 Juli 2020, 09:41:50
@Beta-User
Danke, werde mir beide Befehle mal ansehen.
Titel: Antw:Zufallsgenerator
Beitrag von: MarkoP am 24 Juli 2020, 12:23:46
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?
Titel: Antw:Zufallsgenerator
Beitrag von: Beta-User am 24 Juli 2020, 12:25:12
1. Hatte ich irgendwo im Zusammenhang mit rand() geschweifte Klammern verwendet?

2. https://wiki.fhem.de/wiki/Zeitangaben,_rechnen_mit (https://wiki.fhem.de/wiki/Zeitangaben,_rechnen_mit)
EDIT: und Perl in at MUSS lt. Commandref eine Zeitangabe zurückliefern, Perl ist <timespec>.
Titel: Antw:Zufallsgenerator
Beitrag von: Otto123 am 24 Juli 2020, 12:48:42
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
Titel: Antw:Zufallsgenerator
Beitrag von: MarkoP am 24 Juli 2020, 14:01:13
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 ...
Titel: Antw:Zufallsgenerator
Beitrag von: Beta-User am 24 Juli 2020, 14:11:58
Es ist doppelt nicht korrekt:

1. die Sprache heißt weiterhin Perl (https://de.wikipedia.org/wiki/Perl_(Programmiersprache)). Eine Auswahl für alles andere findest du hier https://de.wikipedia.org/wiki/Pearl (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.
Titel: Antw:Zufallsgenerator
Beitrag von: Otto123 am 24 Juli 2020, 14:32:49
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
Titel: Antw:Zufallsgenerator
Beitrag von: MarkoP am 27 Juli 2020, 08:10:11
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 ...
Titel: Antw:Zufallsgenerator
Beitrag von: Otto123 am 27 Juli 2020, 09:16:05
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
Titel: Antw:Zufallsgenerator
Beitrag von: MarkoP am 27 Juli 2020, 10:56:03
Also kann nicht einfach eine Zeitspanne an den Trigger angehängt werden, sondern es muss die Ausführung mit einem Wartebefehl (Sleep) unterbrochen werden.
Gibt es da keine einfachere Möglichkeit?

Bei der 2. Variante ist ein at im notify definiert, sehr umständlich finde ich.
Frage mich zusätzlich ob das so überhaupt funktionieren würde wenn das notify außerhalb von 17:00 Uhr - 17:20 Uhr ausgelöst würde.
Oder muss ich den Code so verstehen, dass das innere at um 17 Uhr + (20) Minuten nur dann ausgeführt wurde, wenn irgendwann vorher das notify ausgeführt ausgelöst wurde?
Titel: Antw:Zufallsgenerator
Beitrag von: Otto123 am 27 Juli 2020, 13:03:18
Ich weiß ja nicht was Du machen willst :)

Ein notify reagiert auf events und ein at reagiert auf eine Zeit.
Man kann ein notify noch auf einen Zeitraum beschränken (disabledForIntervals)

Was ist daran kompliziert? Du hast ein Ereignis und willst nicht sofort etwas ausführen sondern verzögert?

Die 2. Variante kannst Du beliebig verwenden. So wie ich geschrieben habe drückst Du einen Knopf und damit wird 17:00 Uhr + etwas ausgeführt
Du kannst auch define xyz at +{strftime("%H:%M",gmtime(rand(20)*60))} set ... schreiben, das wäre analog dem sleep Befehl: Die Ausführung wird verzögert.
Genau genommen macht ein sleep intern nichts anderes: es definiert intern ein (quasi unsichtbares) at.

Du kannst auch sleep {strftime("%H:%M",gmtime(rand(20)*60))}; set ... schreiben. Siehe auch - help sleep - ;)

Gruß Otto

Titel: Antw:Zufallsgenerator
Beitrag von: MarkoP am 27 Juli 2020, 15:20:30
Das mit dem notify ist aktuell mehr Neugierde.

Zufall ist meiner Meinung halt das Stichwort beim Thema Einbruchsabschreckung. Deshalb finde ich starre Ereignisse zu immer wiederkehrenden Zeitpunkten nicht unbedingt sinnvoll.
Diebe sind ja nicht dumm und beobachten in der Regel vorher bevor sie einbrechen. Und Hausautomatic ist auch unter Dieben inzwischen bekannt. So können potentielle Einbrecher auch feststellen, dass es nur Fake ist wenn das Licht jeden Tag exakt zum gleichen Zeitpunkt an-/ausgeht. Was den Abschreckungseffekt verpuffen lässt.

Mit kompliziert meinte ich eher die Schreibweise, aber der letzte Ansatz gefällt mir sehr gut
define xyz notify dummy:on sleep {strftime("%H:%M",gmtime(rand(20)*60))}; set ...
Das ist auch nach 6 Monaten noch nachvollziehbar.
Außerdem ist es kurz und kompakt in der Schreibweise.

Danke für alle Hinweise. Jetzt bin ich erst mal ein Stück weiter.
Titel: Antw:Zufallsgenerator
Beitrag von: Beta-User am 27 Juli 2020, 15:28:11
Wenn du Anwesenheitssimulation machen willst, solltest du evtl. doch nochmal einen Blick auf RandomTimer werfen. Der ist zwar "ein bißchen starr", aber vermutlich mußt du auch eine selbstgestrickte Lösung irgendwie an Rahmenbedingungen knüpfen und irgendwann beginnen und enden lassen.... Vermutlich bietet der RandomTimer ausreichend Optionen, das Ergebnis undeterministisch aussehen zu lassen ;) .
Titel: Antw:Zufallsgenerator
Beitrag von: Christoph Morrison am 30 Juli 2020, 13:40:07
Zitat von: MarkoP am 27 Juli 2020, 15:20:30
Diebe sind ja nicht dumm und beobachten in der Regel vorher bevor sie einbrechen. Und Hausautomatic ist auch unter Dieben inzwischen bekannt. So können potentielle Einbrecher auch feststellen, dass es nur Fake ist wenn das Licht jeden Tag exakt zum gleichen Zeitpunkt an-/ausgeht. Was den Abschreckungseffekt verpuffen lässt.

Hast du dich bezüglich Einbruchsprävention schon mal beraten lassen?
Titel: Antw:Zufallsgenerator
Beitrag von: Wuppi68 am 02 August 2020, 12:52:24
es gibt immer noch 2 Typen von Einbrechern ...

welche die geplant Dein Besitz an sich nehmen wollen
und solche die spontan die Gelegenheit nutzen

Die ersten haben einen Plan und lassen sich kaum aufhalten
und unsere Heim Automation kann im Normalfall nur reaktiv arbeiten - also nur wenn es "zu spät" ist