DOIF - Zuällig A oder B ausführen

Begonnen von tfriedrich85, 20 Januar 2020, 08:57:19

Vorheriges Thema - Nächstes Thema

tfriedrich85

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?

Gisbert

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
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Otto123

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
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

Per

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 ;)

tfriedrich85

#4
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

Otto123

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)])}
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

CoolTux

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.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

tfriedrich85

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

Danke für den Hinweis!

Otto123

@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 :)
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

CoolTux

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.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Otto123

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
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

CoolTux

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
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net