PERL WARNING: Argument ".f" isn't numeric in ...

Begonnen von Joachim2112, 21 November 2022, 18:01:30

Vorheriges Thema - Nächstes Thema

Joachim2112

Hallo,

ich habe folgendes Problem (und ganz viele Dinge schon im Forum gefunden, aber nicht die Lösung dazu - schade):

im FHEM Log finde ich folgende Ausgabe:

2022.11.20 22:17:53 1: PERL WARNING: Argument ".f" isn't numeric in subtraction (-) at (eval 4320) line 40.
2022.11.20 22:17:53 3: eval: {
fhem("set myWday $wday");
my $myadc01 = ReadingsVal("ADC_Ch0_dummy","state",0);
# $myadc01 = int($myadc01/1000)*1000;
# $myadc01 = sprintf(".1f",($myadc01/10000))*10000;
my $myadc02 = ReadingsVal("ADC_Ch01_dummy","state",0);
my $myadc03 = ReadingsVal("ADC_Ch02_dummy","state",0);
my $myadc04 = ReadingsVal("ADC_Ch03_dummy","state",0);
my $myadc05 = ReadingsVal("ADC_Ch04_dummy","state",0);
my $myadc06 = ReadingsVal("ADC_Ch05_dummy","state",0);
my $myadc_0_av = int(($myadc01+$myadc02+$myadc03+$myadc04+$myadc05+$myadc06)/6);
# my $myadc_0_proc = 100 - (sprintf(".2f",($myadc_0_av/(65535)))*(100));
my $myadc_0_proc = 100 - (sprintf(".2f",($myadc_0_av/(65535/2)))*(100));
# my $myadc_0_av = sprintf(".f",(5500+100000000/(($myadc01+$myadc02+$myadc03+$myadc04+$myadc05+$myadc06)/6)));
fhem("set ADC_Ch01_dummy $myadc01");
fhem("set ADC_Ch02_dummy $myadc02");
fhem("set ADC_Ch03_dummy $myadc03");
fhem("set ADC_Ch04_dummy $myadc04");
fhem("set ADC_Ch05_dummy $myadc05");
fhem("set ADC_Ch06_dummy $myadc06");
fhem("set ADC_Ch0_av_dummy $myadc_0_av ");
my $myadc11 = ReadingsVal("ADC_Ch1_dummy","state",0);
my $myadc12 = ReadingsVal("ADC_Ch11_dummy","state",0);
my $myadc13 = ReadingsVal("ADC_Ch12_dummy","state",0);
my $myadc14 = ReadingsVal("ADC_Ch13_dummy","state",0);
my $myadc15 = ReadingsVal("ADC_Ch14_dummy","state",0);
my $myadc16 = ReadingsVal("ADC_Ch15_dummy","state",0);
my $myadc_av = sprintf(".f",($myadc11+$myadc12+$myadc13+$myadc14+$myadc15+$myadc16)/6);
....

Der Code ist :

define Zisterne_Ueberwachung at +*00:02:00 {\
fhem("set myWday $wday");;\
my $myadc01 = ReadingsVal("ADC_Ch0_dummy","state",0);;\
# $myadc01 = int($myadc01/1000)*1000;;\
# $myadc01 = sprintf("%.1f",($myadc01/10000))*10000;;\
my $myadc02 = ReadingsVal("ADC_Ch01_dummy","state",0);;\
my $myadc03 = ReadingsVal("ADC_Ch02_dummy","state",0);;\
my $myadc04 = ReadingsVal("ADC_Ch03_dummy","state",0);;\
my $myadc05 = ReadingsVal("ADC_Ch04_dummy","state",0);;\
my $myadc06 = ReadingsVal("ADC_Ch05_dummy","state",0);;\
my $myadc_0_av = int(($myadc01+$myadc02+$myadc03+$myadc04+$myadc05+$myadc06)/6);;\
# my $myadc_0_proc = 100 - (sprintf("%.2f",($myadc_0_av/(65535)))*(100));;\
my $myadc_0_proc = 100 - (sprintf("%.2f",($myadc_0_av/(65535/2)))*(100));;\
# my $myadc_0_av = sprintf("%.f",(5500+100000000/(($myadc01+$myadc02+$myadc03+$myadc04+$myadc05+$myadc06)/6)));;\
fhem("set ADC_Ch01_dummy $myadc01");;\
fhem("set ADC_Ch02_dummy $myadc02");;\
fhem("set ADC_Ch03_dummy $myadc03");;\
fhem("set ADC_Ch04_dummy $myadc04");;\
fhem("set ADC_Ch05_dummy $myadc05");;\
fhem("set ADC_Ch06_dummy $myadc06");;\
fhem("set ADC_Ch0_av_dummy $myadc_0_av ");;\
my $myadc11 = ReadingsVal("ADC_Ch1_dummy","state",0);;\
my $myadc12 = ReadingsVal("ADC_Ch11_dummy","state",0);;\
my $myadc13 = ReadingsVal("ADC_Ch12_dummy","state",0);;\
my $myadc14 = ReadingsVal("ADC_Ch13_dummy","state",0);;\
my $myadc15 = ReadingsVal("ADC_Ch14_dummy","state",0);;\
my $myadc16 = ReadingsVal("ADC_Ch15_dummy","state",0);;\
my $myadc_av = sprintf("%.f",(($myadc11+$myadc12+$myadc13+$myadc14+$myadc15+$myadc16)/6));;\

.....

Was mir selbst auffällt ist, dass im Log das % Zeichen im sprintf fehlt.
Info: Der gleiche Code lief ca. 10 Jahre auf dem Raspi und nun, nach neuer Installation (anderes Thema: SD Karte kaputt und keine Sicherung  :o :-[ :'( ) nicht mehr.

Wer kann helfen?

Vielen Dank und beste Grüße Joachim

betateilchen

Du musst vermutlich das % Zeichen in Deinem Code escapen (oder doppeln?)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Joachim2112

Dankeschön - das wars ...

%% statt % in den sprintf :-)
z.B.

sprintf("%%.f",(5500+100000000/(($myadc01+$myadc02+$myadc03+$myadc04+$myadc05+$myadc06)/6)));;\


Gibt es zufällig einen guten Link / gute Erklärung wann und welche Zeichen "escaped" werden müssen ?

Beste Grüße Joachim

betateilchen

Ohne jetzt in die Details zu gehen: es steht meines Wissens auch irgendwo in der commandref und betrifft vornehmlich die Zeichen % und @ bei denen dieser Effekt auftritt.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

ZitatOhne jetzt in die Details zu gehen: es steht meines Wissens auch irgendwo in der commandref und betrifft vornehmlich die Zeichen % und @ bei denen dieser Effekt auftritt.
Das sollte fuer "attr global featurelevel X", mit X <= 5.6 gelten.
Ohne dieses Attribut explizit gesetzt zu haben ist featurelevel (mit einem aktuellen FHEM) 6.1.
5.6 ist bei einer Installation der Fall, was seit 7 Jahren kein update erfahren hat.

betateilchen

Zitat von: rudolfkoenig am 21 November 2022, 22:12:05
ist bei einer Installation der Fall, was seit 7 Jahren kein update erfahren hat.

Möchtest Du das ausschließen?

ZitatInfo: Der gleiche Code lief ca. 10 Jahre auf dem Raspi und nun, nach neuer Installation (anderes Thema: SD Karte kaputt und keine Sicherung
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!