FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: tfriedrich85 am 20 Januar 2020, 08:57:19

Titel: DOIF - Zuällig A oder B ausführen
Beitrag von: tfriedrich85 am 20 Januar 2020, 08:57:19
Hallo zusammen,

ich möchte gerne unter bestimmten Bedingungen einen zufälligen Radiosender aus einer Liste von Radiosendern abspielen.
Die Bedingungnen im DOIF funktionieren schon. Jedoch klappt ein " set .... OR set... nicht.


([E3a.4:"^on$"] and [07:10-23:00] and (!($we))  and [Sonos_Bad:state] ne "PLAYING" ) ((set Sonos_Bad Volume 15; set Sonos_Bad StartRadio Loungeradio;) or (set Sonos_Bad Volume 15; set Sonos_Bad StartRadio Klassik;))
DOELSE ()

Habt ihr dafür eine Idee?
Titel: Antw:DOIF - Zuällig A oder B ausführen
Beitrag von: Gisbert am 20 Januar 2020, 09:38:36
Hallo Friedrich,

ich hoffe der Name stimmt, ansonsten bitte ignorieren.

Ich glaube, so wie du das vor hast, wird es nicht funktionieren.
Wenn ich das umsetzen müsste, würde ich den Zufall in die Bedingungen einbauen.
Z.B. bei gerader Stundenzahl Loungeradio, bei ungerader Stundenzahl Klassik. Das ist jetzt nicht so zufällig, aber immerhin.
In Perl liefert {strftime("%H", localtime)%2} eine 1 bei ungerader Stunde und eine 0 bei gerader Stunde.
Du könntest es auch noch Minuten machen ( {strftime("%M", localtime)%2} ), dann wäre es "mehr" zufällig, aber dann musst du mit deinem DOIF schauen, dass du nicht im Minutentakt einen Senderwechsel bekommst.

Im Moment bin jedoch noch überfragt, wie man das in ein DOIF reinbekommt, in einem notify wäre es halt Perl.

Viele Grüße Gisbert
Titel: Antw:DOIF - Zuällig A oder B ausführen
Beitrag von: Otto123 am 20 Januar 2020, 09:51:42
Hi,

or ist ein Operator für die Bedingung, nicht für das Ausführen von Befehlen.
Und eigentlich ist beim DOIF der Trenner zwischen den Befehlen das Komma und nicht semikolon. Siehe Doku.

Du musst also anders Vorgehen. Du kannst irgendwo eine List anlegen und musst dann zufällig aus dieser Liste dem set Befehl den Sender mitgeben: Also z.b:

set Sonos_Bad StartRadio {(Hier steht der Aufruf einer Funktion die irgendeinen Radiosender zurückgibt)}
Oder so
set Sonos_Bad StartRadio [Radiosender:Sender]
Dann musst Du in einem Gerät Radiosender das reading Sender mit irgendeiner Funktion mit dem Sendernamen setzen. Das Gerät Radiosender kann das DOIF selbst sein.

Gruß Otto
Titel: Antw:DOIF - Zuällig A oder B ausführen
Beitrag von: Per am 20 Januar 2020, 12:00:01
Entweder in die Bedingung den "Zufall" mit einbauen und dann entsprechend viele Zweige oder mittels IF oder do (Wert)?a:b den Zufall in den Command-Teil.

Wenn du die letzte Stelle der Linuxzeit auswertest, hast du "Zufall" genug ;)
Titel: Antw:DOIF - Zuällig A oder B ausführen
Beitrag von: tfriedrich85 am 20 Januar 2020, 13:19:30
Danke Otto,

ich habe deine Variante 1 gewählt funktioniert super.
Hier meine Lösung
Aufruf:
set Sonos_Bad StartRadio {ZufallsSender()})

Funktion:
sub ZufallsSender() {
    my @Sender = ("Klassik", "Loungeradio", "Radiorock");
my $Ergebnis = $Sender[rand @Sender];
#Log 1, "Sender: $Ergebnis";
    return $Ergebnis;
}


Danke
Titel: Antw:DOIF - Zuällig A oder B ausführen
Beitrag von: Otto123 am 20 Januar 2020, 13:55:54
Du musst noch aufpassen DOIF macht das eventuell anders als der Rest von FHEM (set magic)
Dein Code wird im DOIF gehen, aber ansonsten musst Du es so machen (Die runden extra Klammern) ;):
set Sonos_Bad StartRadio {(ZufallsSender())}

https://fhem.de/commandref_DE.html#set

Was auch bei einer solch kurzen Liste als Kurzform für zufällige Dinge ginge:
{(("Klassik", "Loungeradio", "Radiorock")[int(rand 3)])}
Titel: Antw:DOIF - Zuällig A oder B ausführen
Beitrag von: CoolTux am 20 Januar 2020, 14:12:05
Eine kleine Hilfe sollten da noch mehr Sender hinzukommen und Du nicht immer die Sub anpassen wollen

$indexend = $#texte;
$index = int( rand( $indexend ) );

$text = $texte[$index];


$#texte sucht automatisch nach dem letzten Index eines Array texte womit man die Gesamtzahl an Indexen hat.

Danach wird per Zufall ein Index rausgesucht aus dem Array und dann der passende Indexwert ermittelt.
Titel: Antw:DOIF - Zuällig A oder B ausführen
Beitrag von: tfriedrich85 am 20 Januar 2020, 14:12:47
Hallo Otto,

hab ich ergänzt! Vielen Dank für die Syntax - Unterstützung....

PS: Ich habe am Wochenende Restore trainiert! Ich hab mir jetzt Skripte gebaut um in 30 min von einem neuen Rasperian zu einem funktionierenden Fhem zu kommen.
http://heinz-otto.blogspot.com/2015/12/backup-und-restore-von-fhem.html (http://heinz-otto.blogspot.com/2015/12/backup-und-restore-von-fhem.html)

Danke für den Hinweis!
Titel: Antw:DOIF - Zuällig A oder B ausführen
Beitrag von: Otto123 am 20 Januar 2020, 14:21:10
@leon Ist nicht @Sender schon die Länge des Arrays?   ;)
{my @Sender = ("Klassik", "Loungeradio", "Radiorock");;return @Sender}

hat er schon richtig gemacht oder ich habe Dich falsch verstanden?

Meine Perlausdruck war fest gestrickt :)
Titel: Antw:DOIF - Zuällig A oder B ausführen
Beitrag von: CoolTux am 20 Januar 2020, 14:33:59
Nicht ganz denke ich.

{my @Sender = ("Klassik", "Loungeradio", "Radiorock");;return @Sender}

Gibt 3 aus, aber wenn Du dann versuchst den Wert vom Index 3 zu holen greifst Du ins Leere da immer bei 0 angefangen wird zu zählen

$a[0] = Klassik
$a[1] = Loungeradio
$a[2] = Radiorock

ein int( rand(3) ) könnte 3 ergeben

und $a[3] gibt es nicht.

Es sei denn ich übersehe gerade etwas in Deinem Code.
Titel: Antw:DOIF - Zuällig A oder B ausführen
Beitrag von: Otto123 am 20 Januar 2020, 15:27:55
Zitat von: CoolTux am 20 Januar 2020, 14:33:59
ein int( rand(3) ) könnte 3 ergeben
also ich glaube es nicht :) und ich habe es auch noch nie erlebt
Perl Doc sagt:
Zitatran EXPR
Returns a random fractional number greater than or equal to 0 and less than the value of EXPR

Gruß Otto
Titel: Antw:DOIF - Zuällig A oder B ausführen
Beitrag von: CoolTux am 20 Januar 2020, 15:46:16
Hallo Otto,

Danke für die Info. Ich werde mir das mal in Ruhe für mich selbst anschauen. Eventuell habe ich mir da damals mehr Arbeit wie nötig gemacht.


Grüße