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?
Nun, das hier: http://de.selfhtml.org/perl/
LG
pah
Wenn man zu einem aus fhem ermittelten Wert 0 addiert, fallen normalerweise die Einheiten weg und das Ergebnis sollte numerisch sein.
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
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!