Syntaxprobleme - oder wer kann mir helfen die Warnings zu beseitigen?

Begonnen von DerFrickler, 18 Dezember 2014, 21:02:10

Vorheriges Thema - Nächstes Thema

DerFrickler

Ich wollte hier mal den Mittelwert aus drei DECT!200 Messungen bilden, möglicherweise (muss ich noch mal analog nachmessen) ergibt sich ja dadurch eine Annäherung an die tatsächliche Raum(Mitte)temperatur.

folgende Zeilen bereiten mir Sorgen...

define notify.temperature.measures.FBDECT_18 notify FBDECT_18:temperature.* {\
     fhem ("set temperature.measures.FBDECT_18 " .ReadingsVal("FBDECT_18","temperature",0));;\
\
     my $temp16=Value("temperature.measures.FBDECT_16");;\
     Log 3, ('value:     '.$temp16);;\
     my $temp17=Value("temperature.measures.FBDECT_17");;\
     Log 3, ('value:     '.$temp17);;\
     my $temp18=Value("temperature.measures.FBDECT_18");;\
     Log 3, ('value:     '.$temp18);;\
     my $tempWZ=($temp16+$temp17+$temp18)/3;;\
     Log 3, ('value:     '.$tempWZ);;\
     fhem ("set temperature.measures.Wohnzimmer $tempWZ");;\
}


Die dabei benutzten dummies sind wie folgt deklariert (wesentliche Daten):


Internals:
NAME            temperature.measures.FBDECT_16
STATE           22.2 °C
TYPE             dummy

Readings:
state            22.2 C (measured)

Attributes:
stateFormat  {sprintf("%.1f °C", ReadingsVal($name,"state",0)." °C")}

für FBDECT_17 und 18 ähnlich...


als Ergebnis bekomme ich folgenden Output im Log:

2014.12.18 20:19:27 1: PERL WARNING: Argument "21.2 C (measured) M-BM-0C" isn't numeric in sprintf at (eval 320858) line 1.
2014.12.18 20:19:27 3: eval: {
     fhem ("set temperature.measures.FBDECT_18 " .ReadingsVal("FBDECT_18","temperature",0));

     my $temp16=Value("temperature.measures.FBDECT_16");
     Log 3, ('value:     '.$temp16);
     my $temp17=Value("temperature.measures.FBDECT_17");
     Log 3, ('value:     '.$temp17);
     my $temp18=Value("temperature.measures.FBDECT_18");
     Log 3, ('value:     '.$temp18);
     my $tempWZ=($temp16+$temp17+$temp18)/3;
     Log 3, ('value:     '.$tempWZ);
     fhem ("set temperature.measures.Wohnzimmer $tempWZ");
}
2014.12.18 20:19:27 3: value:     22.2 °C
2014.12.18 20:19:27 3: value:     24.1 °C
2014.12.18 20:19:27 3: value:     21.2 °C


Demnach scheint "Value" nicht ausreichend zu sein um nur den Zahlenwert zu erfassen. Wer kann mir da weiterhelfen?


betateilchen

Wenn man zu einem aus fhem ermittelten Wert 0 addiert, fallen normalerweise die Einheiten weg und das Ergebnis sollte numerisch sein.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

DerFrickler

#3
fangen wir mal mit {sprintf("%.1f °C", ReadingsVal($name,"state",0)." °C")} an... das ." °C" am Ende habe ich übrigens entfernt, war ein Relikt aus den ersten Versuchen.

Ich gehe mal davon aus dass ReadingsVal den Zahlenwert und den Textanhang zurück gibt. Dem hingegen erwartet %.1f  einen reinen Zahlenwert als Gleitkommazahl. Das Ergebnis wird korrekt dargestellt, nur wird ständig die Warnung ausgegeben. Diese Warnung würde ich gerne loswerden. So ganz nebenbei handelt es sich bei der Codezeile um ein leicht abgewandeltes Beispiel aus der Commandref.

Wo kann ich Details zu ReadingsVal finden?

Vielen Dank!

Nachtrag:
ReadingsNum ist hier die Lösung

DerFrickler

es geht auch einfacher...

Das Attribut State gibt es ja zweimal.. 1. als STATE in den Internals und dann 2. als state in den Readings.

Das notify sorgt dafür das es in den Readings mit      fhem ("set temperature.measures.FBDECT_16 $EVTPART1");;\ als reiner Zahlenwert geschrieben wird. Mit diesem Wert rechne ich dann auch.

Das attr temperature.measures.FBDECT_16 stateFormat {sprintf("%.1f °C", ReadingsVal($name,"state",0))} sorgt dann für eine Ausgabe mit einer Nachkommastelle und dem "°C" Zusatz.

Keine Warnings mehr....

Einen schönen Tag noch!