[gelöst] Zufallszahl direkt im "set..." Befehl

Begonnen von Borkk, 26 Juli 2020, 10:45:24

Vorheriges Thema - Nächstes Thema

Borkk

Hallo Zusammen,

ich bin gerade dabei mein FHEM "aufzuräumen", dabei versuche ich wenn möglich Notify´s zu vereinfachen. Zu einer Sache finde ich aber keine Lösung.

Ich würde diesen funktionierende Notify:

if (
Value ("trigger_presence") eq "xxx"
&&
Value ("speak_volume") eq "normal"){
my $zufallszahl = int(rand(10)+100);
my $t1 = (ReadingsVal("ansagen_presence","$zufallszahl",""));
fhem ("set fl_echo speak_ssml $t1")}
}


gegen diesen ersetzen:

IF ([trigger_presence] eq "xxx" and [speak_volume] eq "normal") (set fl_echo speak_ssml <speak>[ansagen_presence:int(rand(10)+100)]</speak>)

Konkret bezieht sich meine Frage auf die eckige Klammer. Kann man das "int(rand(10)+100)" direkt in der Form einbinden? Wenn ja mit welchem Syntax. Ich habe schon " ' { und ( ohne Erfolg ausprobiert.
Proxmox & Docker:  FHEM, Raspberrymatic, ConBee3, Nginx ReverseProxy, ConfigDB, MQTT, NodeRed, InfluxDB, Grafana, HmIP Akt- /Sensoren, Shelly´s, Alexa, ASC, Gardena, E-Paper, FritzBox; (Tado° x), iBeacon, OLED ; ESP32/8266, SwitchBot ... (Netatmo & Homekit über HomeAssistant)

TomLee

So klappts bei mir:

<speak>[ansagen_presence] {(int(rand(10)+100))}</speak>)

Gruß

Thomas

Borkk

Zitat von: TomLee am 26 Juli 2020, 11:26:15
So klappts bei mir:

<speak>[ansagen_presence] {(int(rand(10)+100))}</speak>)

Ok, dann spricht er den state von "ansagen_presence" und danach eine Zahl von 100 bis 109. Ich benötige aber die Zufallszahl um z.B. das Reading "100" des Dummys "ansagen_presence" zufällig auszuwählen.

Im Ergebnis muss der set Befehl so ausgeführt werden:

set fl_echo speak_ssml <speak>[ansagen_presence:100]</speak>)
Proxmox & Docker:  FHEM, Raspberrymatic, ConBee3, Nginx ReverseProxy, ConfigDB, MQTT, NodeRed, InfluxDB, Grafana, HmIP Akt- /Sensoren, Shelly´s, Alexa, ASC, Gardena, E-Paper, FritzBox; (Tado° x), iBeacon, OLED ; ESP32/8266, SwitchBot ... (Netatmo & Homekit über HomeAssistant)

TomLee

Ich weiß nicht ob bzw. wie es auch in den eckigen Klammern geht:

<speak>{(ReadingsVal("ansagen_presence",int(rand(10)+100),"100"))}</speak>

Borkk

Zitat von: TomLee am 26 Juli 2020, 12:18:27
Ich weiß nicht ob bzw. wie es auch in den eckigen Klammern geht:

<speak>{(ReadingsVal("ansagen_presence",int(rand(10)+100),"100"))}</speak>

das geht so nicht.

Scheint dann wohl doch keine "Anfängerfrage" zu sein  ;). Es geht mir nicht um einen lauffähigen Perl Code, den habe ich ganz oben gepostet und der tut genau das was ich brauche. Ich wollte es vereinfachen und direkt in einen set Befehl in [] packen.

Vielleicht muss ich das Ganze noch ein wenig erklären. Ich habe in einem Dummy (ansagen_presence) pro Roommate, 10 Texte mit z.B. "setreading ansagen_presence 100 <...text...>" gespeichert. Wenn nun ein Roommate nach Hause kommt, wird zur Begrüßung zufällig einer der 10 Readings (100-109) vom Echo neben der Eingangstür gesprochen.
Proxmox & Docker:  FHEM, Raspberrymatic, ConBee3, Nginx ReverseProxy, ConfigDB, MQTT, NodeRed, InfluxDB, Grafana, HmIP Akt- /Sensoren, Shelly´s, Alexa, ASC, Gardena, E-Paper, FritzBox; (Tado° x), iBeacon, OLED ; ESP32/8266, SwitchBot ... (Netatmo & Homekit über HomeAssistant)

TomLee

#5
Bei mir klappt das genauso wie du es jetzt nochmal schilderst, es wird zufällig irgendein Reading (100-109) des Dummy ausgegeben:

defmod doif_Test DOIF ($SELF eq "on") (set OG_Echo_Wohnzimmer speak_ssml <speak>{(ReadingsVal("du_Testy",int(rand(10)+100),"100"))}</speak>)

attr doif_Test cmdState on|off
attr doif_Test devStateIcon on:general_an:off off|initialize.*:general_aus:on
attr doif_Test do always
attr doif_Test room Test
attr doif_Test setList on off


defmod du_Testy dummy
attr du_Testy alexaName rosine
attr du_Testy devStateStyle { if ($READING eq "temperature" && $VALUE > 24);;'style="color:red"'}
attr du_Testy genericDeviceType contact
attr du_Testy homebridgeMapping ContactSensorState:reading=state
attr du_Testy room Test
attr du_Testy setList open closed

setstate du_Testy 07:07
setstate du_Testy 2020-07-26 11:56:39 100 depp
setstate du_Testy 2020-07-26 12:01:16 101 dobittle
setstate du_Testy 2020-07-26 11:58:48 102 doof
setstate du_Testy 2020-07-26 11:59:10 103 park
setstate du_Testy 2020-07-26 11:59:35 104 nochmal
setstate du_Testy 2020-07-26 11:59:54 105 nochmal
setstate du_Testy 2020-07-26 12:00:15 106 wieder
setstate du_Testy 2020-07-26 12:00:32 107 immer wieder
setstate du_Testy 2020-07-26 12:01:00 108 dolittle
setstate du_Testy 2020-07-26 12:01:33 109 docker
setstate du_Testy 2020-02-03 00:01:38 Bioabfall 2
setstate du_Testy 2020-04-13 16:00:33 battery low
setstate du_Testy 2020-02-03 00:00:09 nextWaste Bioabfall_1
setstate du_Testy 2020-07-18 01:04:41 rasptemp VCHI initialization failed
setstate du_Testy 2020-07-12 19:35:51 state 07:07
setstate du_Testy 2020-06-28 10:15:22 temp_cal 26
setstate du_Testy 2020-06-28 10:14:19 temperature 24
setstate du_Testy 2020-07-10 10:58:45 x s78261)

TomLee

OK,Ok, Hab jetzt mal den ersten Beitrag richtig gelesen  ::)

Es sollte klappen wenn du den Zufallswert zuvor in eine Variable schreibst und die dann in die eckigen Klammern:


{my $d = int(rand(10)+100);; fhem ("set OG_Echo_Wohnzimmer speak_ssml <speak>[du_Testy:$d]</speak>")}

TomLee

#7
Und jetzt verstehe ich erst auf was du aus bist, du magst es so kurz wie möglich haben und auf Perl verzichten, darum der FHEM-Befehl IF.

Glaube nicht das du da jetzt eine Funktion reingebastelt bekommst, wissen aber nicht.

Im Wiki zu set magic steht

Syntax 1

[<Präfix>:<Gerätename>:<Name des Gerätevariable>:<Suffix>]

Syntax 2

{(<Perlausdruck>)}

Verstehe es so, wenn du jetzt eine Funktion verwenden möchtest (int/rand), auf die zweite Syntax zurückgreifen musst, weil IF ist ein FHEM-Befehl. Dann wird der Code wieder länger, aber auch in Perl kann man (wenn man möchte) set magic verwenden.

Borkk

Zitat von: TomLee am 26 Juli 2020, 13:47:49
OK,Ok, Hab jetzt mal den ersten Beitrag richtig gelesen  ::)

Es sollte klappen wenn du den Zufallswert zuvor in eine Variable schreibst und die dann in die eckigen Klammern:


{my $d = int(rand(10)+100);; fhem ("set OG_Echo_Wohnzimmer speak_ssml <speak>[du_Testy:$d]</speak>")}


Danke TomLee, das entspricht ja in etwa meinem Perl Code von ganz oben. Aber genau das "zuvor nochmal in eine Variable schreiben" wollte ich umgehen. Ist aber kein Beinbruch wenn es nicht geht. Ich dacht es gäbe eine Möglichkeit es direkt in [dummy:xxx] zu schreiben. Ich suche ja keine grundsätzliche Lösung, die habe ich ja.
Proxmox & Docker:  FHEM, Raspberrymatic, ConBee3, Nginx ReverseProxy, ConfigDB, MQTT, NodeRed, InfluxDB, Grafana, HmIP Akt- /Sensoren, Shelly´s, Alexa, ASC, Gardena, E-Paper, FritzBox; (Tado° x), iBeacon, OLED ; ESP32/8266, SwitchBot ... (Netatmo & Homekit über HomeAssistant)

Wzut

#9
Zitat von: Borkk am 26 Juli 2020, 10:45:24
wenn möglich Notify´s zu vereinfachen

my $zufallszahl = int(rand(10)+100);
my $t1 = (ReadingsVal("ansagen_presence","$zufallszahl",""));
fhem ("set fl_echo speak_ssml $t1")
einfacher wird es wenn man überflüssige my Variablen weglässt -> int(rand(10)+100) direkt in ReadingsVal("ansagen_presence", $zufallszahl, "")
und dann noch statt my $t1 das alles direkt ins set. Dann noch den Umweg über fhem einsparen und direkt CommandSet benutzen :)
Axo und <speak> soll noch drumherum ? Und weil es so schön ist ReadingsNum statt ReadingsVal und die " ersetzen wir auch gleich noch durch '

CommandSet(undef, 'fl_echo speak_ssml <speak>'.ReadingsNum('ansagen_presence', int(rand(10)+100), 100).'</speak>');

Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Borkk

Zitat von: Wzut am 26 Juli 2020, 19:34:24

einfacher wird es wenn man überflüssige my Variablen weglässt -> int(rand(10)+100) direkt in ReadingsVal("ansagen_presence", $zufallszahl, "")
und dann noch statt my $t1 das alles direkt ins set. Dann noch den Umweg über fhem einsparen und direkt CommandSet benutzen :)
Axo und <speak> soll noch drumherum ? Und weil es so schön ist ReadingsNum statt ReadingsVal und die " ersetzen wir auch gleich noch durch '

CommandSet(undef, 'fl_echo speak_ssml <speak>'.ReadingsNum('ansagen_presence', int(rand(10)+100), 100).'</speak>');


Danke Wzut, dein Code ist in der Tat kürzer aber (für mich) nicht einfacher ::) :-[ , da das Ganze ja noch in weitere Abhängigkeiten eingebunden ist. Ich lasse es einfach so aber vielen Dank für deinen Vorschlag.
Proxmox & Docker:  FHEM, Raspberrymatic, ConBee3, Nginx ReverseProxy, ConfigDB, MQTT, NodeRed, InfluxDB, Grafana, HmIP Akt- /Sensoren, Shelly´s, Alexa, ASC, Gardena, E-Paper, FritzBox; (Tado° x), iBeacon, OLED ; ESP32/8266, SwitchBot ... (Netatmo & Homekit über HomeAssistant)

Wzut

Zitat von: Borkk am 26 Juli 2020, 23:24:47
in der Tat kürzer aber (für mich) nicht einfacher
und genau das ist der springende Punkt, eigenen Code in notifys / 99_myUtils Subs immer so schreiben das man selbst in vier Wochen noch versteht was man da geschrieben hat.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Borkk

Zitat von: Wzut am 27 Juli 2020, 06:07:32
und genau das ist der springende Punkt, eigenen Code in notifys / 99_myUtils Subs immer so schreiben das man selbst in vier Wochen noch versteht was man da geschrieben hat.

Genau. Ich habe über die Jahre immer dazugelernt und konnte dann so manche Abläufe deutlich vereinfachen, Code sparen und (zumindest bilde ich mir das ein) Fhem dadurch z.T. schneller und und stabiler machen. Und das schöne an FHEM ist ja, es kommen immer neue Module dazu, die einem vieles schon abnehmen (z.B. ASC). Ich setze den Threat mal auf gelöst, Danke.
Proxmox & Docker:  FHEM, Raspberrymatic, ConBee3, Nginx ReverseProxy, ConfigDB, MQTT, NodeRed, InfluxDB, Grafana, HmIP Akt- /Sensoren, Shelly´s, Alexa, ASC, Gardena, E-Paper, FritzBox; (Tado° x), iBeacon, OLED ; ESP32/8266, SwitchBot ... (Netatmo & Homekit über HomeAssistant)