MQTT2_DEVICE readingList Perl Hash-Referenz zurückgeben ?

Begonnen von TomLee, 09 Dezember 2021, 17:09:13

Vorheriges Thema - Nächstes Thema

TomLee

#15
ZitatWenn es numerisch sein muss, sollte man ReadingsNum() verwenden und einen numerischen Ersatzwert angeben. Dann müßte das auch klappen...

Zitatirgendwann in dem ganzen Ablauf (warum auch immer ) kommt der Ersatzwert zum Zuge

Bevor das untergeht, ich hab mich nicht weiter mit beschäftigt, vlt. kam das nicht so rüber, das war mehr eine Frage.

Es gibt doch keinen Grund das der Ersatzwert irgendwann genommen wird, ich sehe ihn jedenfalls noch nicht, das Reading ist doch immer vorhanden.

Es kann doch am Ende nur daran liegen das in der Schleife irgendwann mal der Verweis auf  in dem ReadingsNum nicht korrekt übergeben wird. mit der Umlaufvariablen nicht den key enthält.

Beta-User

Zitat von: TomLee am 13 Dezember 2021, 18:57:29
Es gibt doch keinen Grund das der Ersatzwert irgendwann genommen wird, ich sehe ihn jedenfalls noch nicht, das Reading ist doch immer vorhanden.
_Vermutlich_ sollte das so sein. Letztlich würde ich aber empfehlen, sich nicht einfach darauf zu verlassen, dass das ja klappen muss (die Erfahrung lehrt: was schiefgehen kann, geht irgendwann auch schief), sondern einfach - wo ohne großen Aufwand möglich - dafür zu sorgen, dass es selbst dann keine komischen Ergebnisse gibt, wenn der unmögliche Fall eingetreten ist ::) . Und ReadingsNum() "schreit" geradezu nach einem Ersatzwert (wegen der Prototypes)...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

#17
Ich hab mich weiter mit der Meldung

PERL WARNING: Argument "unknown" isn't numeric in numeric ne (!=)

beschäftigt, ich bin jetzt der Meinung die kommt nicht weil der Ersatzwert irgendwann mal in der Schleife genommen wird, sondern (drücks in meinen Worten aus, bin ja kein Programmierer) Perl selbst ist, aufgrund dessen das zum Vergleich != verwendet wird, in der Lage festzustellen das der angegebene Ersatzwert kein numerischer Wert ist und warnt nur das im Falle das er zum Zuge kommt nicht korrekt ist.
Nimmt man bspw. ne (mit Ersatzwert unknown,ja ich weiß ist nicht korrekt, nur zum Test) kommt die Meldung nicht.

Also sollte eigentlich alles so passen:

{my $c;my $h = {sx => 'speed',ix => 'intensity',fp => 'palette',fx => 'effect',ps => 'preset'};for (keys %{$h}) {if ($EVENT){next if $EVENT !~ m,(?<=<$_>)([\d]+)(?=<\/$_>),;$c->{$h->{$_}}=$1 if $1 ne ReadingsNum($NAME,$h->{$_},0);}};return $c;}

Beta-User

Das ist nicht "Perl selbst", das irgendwelche Eventualitäten für die Zukunft prüfen würde. Dazu müßte es wissen, was der Parameter an der Stelle soll, und wie dann die Rückgabe weiter verarbeitet wird...
Das ist ein "runtime"-Ergebnis, es ist also in der Tat irgendwas schiefgegangen. Müßte eigentlich auch am Zeitstempel zu erkennen sein.

Kann aber natürlich sein, dass das nichts sinnvolles hergibt, weil: häufig werden Eingaben in FHEM bei der Eingabe geprüft. Das ist aber eher eine formalisierte Minimalprüfung, ob das überhaupt laufen kann. Zu dem Zeitpunkt ist aber z.B. vermutlich $EVENT leer, usw., usf..
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

Zitatvermutlich $EVENT leer

Daran hab ich auch gedacht, ob korrekt weiß ich selbst nicht genau, auf jedenfall hab ich in dem Ausführungsteil if ($EVENT) (ist auch oben in dem esit noch drin, sehe ich gerade) eingebaut gehabt, mit Ersatzwert unknown, Vergleich mit != und es kam auch zu der Meldung.
Ich bin bis jetzt noch nicht drauf gekommen warum Despee diese Prüfung eingebaut hat.

Beta-User

weiß jetzt nicht ganz genau, wo du gedanklich bist.

!= und numerischer Ersatzwert sollten immer funktionieren, und wenn man einen numerischen Wert erwartet, sollte auch numerisch gefragt/geprüft werden.
Die Prüfung an sich ist ein "eocr+"-Ersatz, also setze das Reading nur, wenn es anders ist als bisher, und verändere auch den Zeitstempel nicht.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files