readingsGroup Meldung:isn't numeric in numeric

Begonnen von stefan-dd, 02 August 2018, 16:57:44

Vorheriges Thema - Nächstes Thema

stefan-dd

Hallo,
ich lese mit folgender Zeile die Signalstärke meiner ESP`s aus. Das funktioniert auch. Leider wird mit jedem Aufruf die log vollgeschrieben.
defmod Host readingsGroup TYPE=ESPEasy:+HOST,presence,RSSI,+ESP_BUILD_GIT
attr Host valueStyle {return undef if($READING =~ m/TIME/);; ($VALUE eq "absent")?'style="color:red"':($VALUE <= -85)?'style="color:red"':($VALUE <= -80)?'style="color:#cccc00"':undef}

Im log steht:

2018.08.02 16:44:36 1: PERL WARNING: Argument "192.168.1.219" isn't numeric in numeric le (<=) at (eval 501247) line 1.
2018.08.02 16:44:36 1: PERL WARNING: Argument "v2.0-20180121" isn't numeric in numeric le (<=) at (eval 501250) line 1.
2018.08.02 16:44:36 1: PERL WARNING: Argument "192.168.1.206" isn't numeric in numeric le (<=) at (eval 501251) line 1.
2018.08.02 16:44:36 1: PERL WARNING: Argument "present" isn't numeric in numeric le (<=) at (eval 501252) line 1.
2018.08.02 16:44:36 1: PERL WARNING: Argument "-" isn't numeric in numeric le (<=) at (eval 501253) line 1.
2018.08.02 16:44:36 1: PERL WARNING: Argument "v2.0.0-dev12" isn't numeric in numeric le (<=) at (eval 501254) line 1.
2018.08.02 16:44:36 1: PERL WARNING: Argument "192.168.1.206" isn't numeric in numeric le (<=) at (eval 501255) line 1.
2018.08.02 16:44:36 1: PERL WARNING: Argument "present" isn't numeric in numeric le (<=) at (eval 501256) line 1.
2018.08.02 16:44:36 1: PERL WARNING: Argument "-" isn't numeric in numeric le (<=) at (eval 501257) line 1.
2018.08.02 16:44:36 1: PERL WARNING: Argument "v2.0.0-dev12" isn't numeric in numeric le (<=) at (eval 501258) line 1.
2018.08.02 16:44:36 1: PERL WARNING: Argument "192.168.1.206" isn't numeric in numeric le (<=) at (eval 501259) line 1.
2018.08.02 16:44:36 1: PERL WARNING: Argument "present" isn't numeric in numeric le (<=) at (eval 501260) line 1.

Jedes Mal werden ca 100 Zeilen geschrieben, mehrere für jeden ESP.
Wie bekomme ich die Meldungen weg? Kann man definieren das nicht numerische Informationen auch ok sind?

Otto123

Hi,

$VALUE vorher auf numerischen Inhalt testen? So ähnlich wie die Beispiele in der commandref
if ($boost =~ m/^\d+$/) && ($boost > 0)

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

stefan-dd

Danke, wie bekomme ich das Codeschnippsel in das attr mit eingebaut? Bei meinen Versuchen hagelt es nur Fehlermeldungen.

Wzut

Zitat von: stefan-dd am 02 August 2018, 16:57:44
attr Host valueStyle {return undef if($READING =~ m/TIME/);; ($VALUE eq "absent")?'style="color:red"':($VALUE <= -85)?'style="color:red"':($VALUE <= -80)?'style="color:#cccc00"':undef}
Selbst erfunden oder irgendwo abgeschrieben ?
Tipp : lösche das Attribut valueStyle , die Warnungen im Log sollten verschwunden sein.
Dann überlege dir was genau du wie einfärben möchtest und ändere es in kleinen Schritten :
Reading Time bei absent rot und bei present nicht ändern ?
Value <= -80 bzw. -85 , rot /gelb aber bei welchem Reading ? vermutlich RSSI ?
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

stefan-dd

{ if($READING eq "RSSI" && $VALUE gt "-90"){ 'style="color:red"' }elsif
    ($READING eq "RSSI" && $VALUE gt "-80" ){ 'style="color:orange"' }elsif
    ($VALUE eq "absent" ){ 'style="color:red"' }else{ 'style="color:black"' } }


So funktioniert es. Ist es verbesserungswürdig?

Wzut

Zitat von: stefan-dd am 03 August 2018, 14:13:49
Ist es verbesserungswürdig?
reine Glaubensfrage ... du must es lesen und verstehen können :)
rot / orange hätte ich nicht mit gt sondern lt abgefragt und dem absent hätte ich auch den Reading Namen spendiert.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

stera

Hallo,

könntet ihr mir bitte in dem Fall einmal helfen, um die Logs wegzubekommen. Bei der Abfrage ist es nun mal leider so, das Nummerische und "ok|low" Werte kommen. Wie kann ich das ValueFormat besten sauber formatieren? Die Funktion an sich funktioniert einwandfrei.

Danke und viele Grüße


defmod ReadingGroup_Battery readingsGroup .*:[Bb]attery
attr ReadingGroup_Battery room SensorÜberwachung
attr ReadingGroup_Battery valueFormat { return undef if( $VALUE > 50 );;;; return undef if( $VALUE eq "ok" );;;;}
attr ReadingGroup_Battery valueIcon {'battery.low' => 'unknown@red','battery.ok' => 'general_ok@green','battery' => '{if ($VALUE <= 25) {"measure_battery_".(sprintf("%.0f",(($VALUE)/25))*25)."\@red"} else {if ($VALUE <= 50) {"measure_battery_".(sprintf("%.0f",(($VALUE)/25))*25)."\@orange"} else {if ($VALUE <= 75) {"measure_battery_".(sprintf("%.0f",(($VALUE)/25))*25)."\@yellow"} else {"measure_battery_".(sprintf("%.0f",(($VALUE)/25))*25)."\@green"}}}}'}\
attr ReadingGroup_Battery verbose 0



2022.01.20 15:34:28.037 1: PERL WARNING: Argument "ok" isn't numeric in numeric gt (>) at (eval 146052) line 1.
2022.01.20 15:34:28.037 1: PERL WARNING: Argument "ok" isn't numeric in numeric gt (>) at (eval 146053) line 1.
2022.01.20 15:34:28.037 1: PERL WARNING: Argument "ok" isn't numeric in numeric gt (>) at (eval 146054) line 1.
2022.01.20 15:34:28.037 1: PERL WARNING: Argument "ok" isn't numeric in numeric gt (>) at (eval 146055) line 1.

Beta-User

#7
Wenn du wissen willst, ob ein Wert eine Nummer ist, kannst du "looks_like_number" verwenden. Sinnvollerweise wäre die Prüfung auch umzudrehen, "ok" soll ja immer "gut" sein, oder...

Versuch's mal so:
attr ReadingGroup_Battery valueFormat { return undef if( $VALUE eq "ok" );; return undef if( looks_like_number($VALUE) && $VALUE > 50 );;}

Oder direkt zusammengefasst:
attr ReadingGroup_Battery valueFormat { return undef if $VALUE eq 'ok' || looks_like_number($VALUE) && $VALUE > 50 }

(Notiz an mich selbst: das undef: muss das...?)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

stera

Zitat von: Beta-User am 21 Januar 2022, 12:10:58
Wenn du wissen willst, ob ein Wert eine Nummer ist, kannst du "looks_like_number" verwenden. Sinnvollerweise wäre die Prüfung auch umzudrehen, "ok" soll ja immer "gut" sein, oder...

Versuch's mal so:
attr ReadingGroup_Battery valueFormat { return undef if( $VALUE eq "ok" );; return undef if( looks_like_number($VALUE) && $VALUE > 50 );;}

Oder direkt zusammengefasst:
attr ReadingGroup_Battery valueFormat { return undef if $VALUE eq 'ok' || looks_like_number($VALUE) && $VALUE > 50 }

(Notiz an mich selbst: das undef: muss das...?)


Perfekt, vielen Dank für die schnelle Lösung. Ich habe die verkürzte Version benutzt und keine Logs mehr vorhanden..  ;)

Vielen Dank und einen schönen Tag noch