[Perl] Readings zählen und zufällige Rückgabe

Begonnen von balli1187, 31 Januar 2020, 15:33:26

Vorheriges Thema - Nächstes Thema

balli1187

Hallo Forum,

Ich bräuchte etwas Hilfe von den Perl Experten:
Ich habe einen Dummy mit mehreren Readings angelegt, in denen Sprachantwortem stehen.
Diese möchte ich alszufällige antworten über meinen Echo ausgeben lassen.

Die "Zufälligkeit" soll durch eine mit "Rand" generierte Ziffer in einem UserReading dargestellt werden. Soweit hatte es funktioniert.
Um nun noch etwas flexibler zu sein, soll das userReading zuerst schauen, wie viele Readings mit einem bestimmten Namen es gibt und anschließend das "Rand()" über diese Anzahl laufen lassen. Ich hatte dazu diesen Beitrag gefunden:

https://forum.fhem.de/index.php?topic=97471.0

Wenn ich das ganze aber zusammen in ein Reading packe, erhalte ich nur die Anzahl der Readings aber das randomisieren läuft nicht mehr. Kann mir jemand sagen wieso und wie es richtig sein müsste?
Hier der Code des userReadings
nr_sleep {round(rand(return grep( m/sleep_.*/, ( keys %{$hash->{READINGS}} ))),0)}



Gesendet von iPhone mit Tapatalk
FHEM auf QNAP im docker, nanoCUL per ser2net an VU+, 2x Echo Dot, 3x HM-ES-PMSw1-Pl, 3x HM-LC-Bl1PBU-FM, 6x Sonoff Basic, div. "Shelly Eigenbauten" von Papa Romeo, ESPRGBWW-Controller, ...
Projekte: Smart Mirror in Spiegelschrank auf RPi Zero

KernSani

Ich würde mal das "return" weglassen.

Aber dumme Frage: wieso machst du das etwas umständlich über Readings und nicht einfach mit einem array?
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Otto123

Hallo balli1187

Zitat von: KernSani am 31 Januar 2020, 16:12:10
... nicht einfach mit einem array?
In der Art https://forum.fhem.de/index.php/topic,107449.msg1015120.html#msg1015120  :D

Außerdem musst Du mit dem round und rand aufpassen, ich würde int(rand()) machen. Warum steht auch in dem Link ;)

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

balli1187

Danke - das return war es!

Ich hab das so angefangen, da ich keine bessere Idee hatte [emoji28]
Das mit dem Array schau ich mir mal an.

@Otto: danke, da werd ich noch nachbessern. War auch auf Grund fehlenden besseren Wissens so umgesetzt.


Gesendet von iPhone mit Tapatalk
FHEM auf QNAP im docker, nanoCUL per ser2net an VU+, 2x Echo Dot, 3x HM-ES-PMSw1-Pl, 3x HM-LC-Bl1PBU-FM, 6x Sonoff Basic, div. "Shelly Eigenbauten" von Papa Romeo, ESPRGBWW-Controller, ...
Projekte: Smart Mirror in Spiegelschrank auf RPi Zero

balli1187

@Otto123: bevor ich es anpasse, wollte ich mal gucken was int() eigentlich macht und hab bei perldoc in dererklärung folgendes gefunden:
You should not use this function for rounding: one because it truncates towards 0 , and two because machine representations of floating-point numbers can sometimes produce counterintuitive results.

Wäre es vielleicht doch ratsamer einen anderen Weg zu nehmen? Gibt es eine Funktion die immer aufrundet? Ich habe kein Reading mit "0" und müsste das sonst noch abfangen.


Gesendet von iPhone mit Tapatalk
FHEM auf QNAP im docker, nanoCUL per ser2net an VU+, 2x Echo Dot, 3x HM-ES-PMSw1-Pl, 3x HM-LC-Bl1PBU-FM, 6x Sonoff Basic, div. "Shelly Eigenbauten" von Papa Romeo, ESPRGBWW-Controller, ...
Projekte: Smart Mirror in Spiegelschrank auf RPi Zero

Otto123

Du arbeitetest doch mit einem array ? Der Index in einem Array läuft von 0 bis Länge des Array-1

Mit round könntest du auf ein Element außerhalb des Array kommen. 
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

balli1187

Hab noch nicht auf Array umgestellt, sondern wollte erstmal gucken was das int() macht. Und dabei bin ich auf die Beschreibung gestoßen, die mich halt etwas abgeschreckt hat.


Gesendet von iPhone mit Tapatalk
FHEM auf QNAP im docker, nanoCUL per ser2net an VU+, 2x Echo Dot, 3x HM-ES-PMSw1-Pl, 3x HM-LC-Bl1PBU-FM, 6x Sonoff Basic, div. "Shelly Eigenbauten" von Papa Romeo, ESPRGBWW-Controller, ...
Projekte: Smart Mirror in Spiegelschrank auf RPi Zero

Otto123

Ja ok, du verwendest nicht direkt den Index des Arrays  aber Du liest die Anzahl der Readings aus. Nehmen wir an du hast eine Anzahl 5.
rand(5) liefert eine Zahl zwischen 0 und kleiner 5
Dein round ergibt aber wieder eine Zahl zwischen 0 und 5  Das wäre eine Anzahl von 6
Du solltest also int(rand() +1 verwenden. Damit bekommst Du Zahlen zwischen 1 und 6
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