Hallo
ich habe mir eine kleine Temperatur ansage zusammen gebaut.
define AnsageTemperatur notify AnsageTempDum:on {\
if (ReadingsVal("TemperaturAussen_b", "temperature","") <= -6){\
fhem("set MyTTS tts :ansage.mp3: Drausen ist es eissig kaalt, unter minus fumpf grad");; fhem("set AnsageTempDum off") \
}\
if (ReadingsVal("TemperaturAussen_b", "temperature","") >= -5 && ("TemperaturAussen_b", "temperature","") <= -1){\
fhem("set MyTTS tts :ansage.mp3: Drausen hat es minus temperaturen");; fhem("set AnsageTempDum off") \
}\
if (ReadingsVal("TemperaturAussen_b", "temperature","") == 0){\
fhem("set MyTTS tts :ansage.mp3: Drausen hat es null Grad");; fhem("set AnsageTempDum off") \
}\
if (ReadingsVal("TemperaturAussen_b", "temperature","") >= 1 && ("TemperaturAussen_b", "temperature","") <= 4){\
fhem("set MyTTS tts :ansage.mp3: Drausen hat es unter fumpf Grad");; fhem("set AnsageTempDum off") \
}\
if (ReadingsVal("TemperaturAussen_b", "temperature","") >= 5 && ("TemperaturAussen_b", "temperature","") <= 9){\
fhem("set MyTTS tts :ansage.mp3: Drausen hat es unter tzeen Grad");; fhem("set AnsageTempDum off") \
}\
if (ReadingsVal("TemperaturAussen_b", "temperature","") >= 10 && ("TemperaturAussen_b", "temperature","") <= 20){\
fhem("set MyTTS tts :ansage.mp3: Drausen ist es kuehl, aber uber tzeen Grad");; fhem("set AnsageTempDum off") \
}\
if (ReadingsVal("TemperaturAussen_b", "temperature","") >= 21 && ("TemperaturAussen_b", "temperature","") <= 25){\
fhem("set MyTTS tts :ansage.mp3: Drausen ist es angenehm, ueber zwansik Grad");; fhem("set AnsageTempDum off") \
}\
if (ReadingsVal("TemperaturAussen_b", "temperature","") >= 26 && ("TemperaturAussen_b", "temperature","") <= 28){\
fhem("set MyTTS tts :ansage.mp3: Drausen ist es warm, ueber fumpfundzwansik Grad");; fhem("set AnsageTempDum off") \
}\
if (ReadingsVal("TemperaturAussen_b", "temperature","") >= 29){\
fhem("set MyTTS tts :ansage.mp3: Drausen ist es heis");; fhem("set AnsageTempDum off") \
}\
}
(Beim TTS sind es keine Schreibfehler. Anders mach es die Schwedische stimme nicht, finde den Akzent nett)
Die temperatur bekomme ich von einem HM-WDS10-TH-O
Wert sieht so aus: temperature 12.2
Dummy wird durch einen Lichtschalter gesetzt.
Nun habe ich das Problem, dass wenn der Dummy gesetzt wird, immer die " unter 5 Grad" Ansage kommt und dann erst die die zu Aktuellen Temperatur passt. Hab schon etwas rumprobiert, nur entweder geht dann garnix mehr oder es bleibt unverändert.
Im Logfile steht außerdem noch:
2016.01.27 17:03:55 1: PERL WARNING: Argument "" isn't numeric in numeric le (<=) at (eval 24527) line 17.
2016.01.27 17:03:55 3: eval: my $EVTPART0='on';my $TYPE='dummy';my $SELF='AnsageTemperatur';my $EVENT='on';my $NAME='AnsageTempDum';{
if (ReadingsVal("TemperaturAussen_b", "temperature","") <= -6){
fhem("set MyTTS tts :ansage.mp3: Drausen ist es eissig kaalt, unter minus fumpf grad"); fhem("set AnsageTempDum off")
}
if (ReadingsVal("TemperaturAussen_b", "temperature","") >= -5 && ("TemperaturAussen_b", "temperature","") <= -1){
fhem("set MyTTS tts :ansage.mp3: Drausen hat es minus temperaturen"); fhem("set AnsageTempDum off")
}
if (ReadingsVal("TemperaturAussen_b", "temperature","") == 0){
fhem("set MyTTS tts :ansage.mp3: Drausen hat es null Grad"); fhem("set AnsageTempDum off")
}
if (ReadingsVal("TemperaturAussen_b", "temperature","") >= 1 && ("TemperaturAussen_b", "temperature","") <= 4){
fhem("set MyTTS tts :ansage.mp3: Drausen hat es unter fumpf Grad"); fhem("set AnsageTempDum off")
}
if (ReadingsVal("TemperaturAussen_b", "temperature","") >= 5 && ("TemperaturAussen_b", "temperature","") <= 9){
fhem("set MyTTS tts :ansage.mp3: Drausen hat es unter tzeen Grad"); fhem("set AnsageTempDum off")
}
if (ReadingsVal("TemperaturAussen_b", "temperature","") >= 10 && ("TemperaturAussen_b", "temperature","") <= 20){
fhem("set MyTTS tts :ansage.mp3: Drausen ist es kuehl, aber uber tzeen Grad"); fhem("set AnsageTempDum off")
}
if (ReadingsVal("TemperaturAussen_b", "temperature","") >= 21 && ("TemperaturAussen_b", "temperature","") <= 25){
fhem("set MyTTS tts :ansage.mp3: Drausen ist es angenehm, ueber zwansik Grad"); fhem("set AnsageTempDum off")
}
if (ReadingsVal("TemperaturAussen_b", "temperature","") >= 26 && ("TemperaturAussen_b", "temperature","") <= 28){
fhem("set MyTTS tts :ansage.mp3: Drausen ist es warm, ueber fumpfundzwansik Grad"); fhem("set AnsageTempDum off")
}
if (ReadingsVal("TemperaturAussen_b", "temperature","") >= 29){
fhem("set MyTTS tts :ansage.mp3: Drausen ist es heis"); fhem("set AnsageTempDum off")
}
}
Liegt das daran das die Temperatur Kommastellen hat und ich nur auf Ganze Zahlen prüfe?
ist doch logisch - und die von Dir beschrieben perl Warnung beschreibt doch Dein Problem eindeutig.
Du vergleichst default-Werte aus ReadingsVal() die Du als alphanumerisch definiert hast ("" ist ein leerer String) mit numerischen Werten. Da kann nix sinnvolles rauskommen.
Ersetzt zuerst in allen ReadingsVal() Aufrufen den default-Wert durch einen sinnvollen numerischen Wert und teste dann nochmal.
hi
danke erstmal für die antwort.
Ich habe mal die 5 genommen.
if (ReadingsVal("TemperaturAussen_b", "temperature","5") >= -5 && ("TemperaturAussen_b", "temperature","5") <= -1) ......
ich bekomme immer noch 2 ansagen. nun aber die für unter 10 und über 10 Grad. Aktuell 12 Grad.
Im Log:
2016.01.27 18:58:19 1: PERL WARNING: Useless use of a constant (temperature) in void context at (eval 1395) line 23.
2016.01.27 18:58:19 3: eval: my $EVTPART0='on';my $TYPE='dummy';my $SELF='AnsageTemperatur';my $EVENT='on';my $NAME='AnsageTempDum';{
if (ReadingsVal("TemperaturAussen_b", "temperature","5") <= -6){
fhem("set MyTTS tts :ansage.mp3: Drausen ist es eissig kaalt, unter minus fumpf grad"); fhem("set AnsageTempDum off")
}
if (ReadingsVal("TemperaturAussen_b", "temperature","5") >= -5 && ("TemperaturAussen_b", "temperature","5") <= -1){
fhem("set MyTTS tts :ansage.mp3: Drausen hat es minus temperaturen"); fhem("set AnsageTempDum off")
}
if (ReadingsVal("TemperaturAussen_b", "temperature","5") == 0){
fhem("set MyTTS tts :ansage.mp3: Drausen hat es null Grad"); fhem("set AnsageTempDum off")
}
if (ReadingsVal("TemperaturAussen_b", "temperature","5") >= 1 && ("TemperaturAussen_b", "temperature","5") <= 4){
fhem("set MyTTS tts :ansage.mp3: Drausen hat es unter fumpf Grad"); fhem("set AnsageTempDum off")
}
if (ReadingsVal("TemperaturAussen_b", "temperature","5") >= 5 && ("TemperaturAussen_b", "temperature","5") <= 9){
fhem("set MyTTS tts :ansage.mp3: Drausen hat es unter tzeen Grad"); fhem("set AnsageTempDum off")
}
if (ReadingsVal("TemperaturAussen_b", "temperature","5") >= 10 && ("TemperaturAussen_b", "temperature","5") <= 20){
fhem("set MyTTS tts :ansage.mp3: Drausen ist es kuehl, aber uber tzeen Grad"); fhem("set AnsageTempDum off")
}
if (ReadingsVal("TemperaturAussen_b", "temperature","5") >= 21 && ("TemperaturAussen_b", "temperature","5") <= 25){
fhem("set MyTTS tts :ansage.mp3: Drausen ist es angenehm, ueber zwansik Grad"); fhem("set AnsageTempDum off")
}
if (ReadingsVal("TemperaturAussen_b", "temperature","5") >= 26 && ("TemperaturAussen_b", "temperature","5") <= 28){
fhem("set MyTTS tts :ansage.mp3: Drausen ist es warm, ueber fumpfundzwansik Grad"); fhem("set AnsageTempDum off")
}
if (ReadingsVal("TemperaturAussen_b", "temperature","5") >= 29){
fhem("set MyTTS tts :ansage.mp3: Drausen ist es heis"); fhem("set AnsageTempDum off")
}
}
Ich kann mir vorstellen das es Probleme mit dem Vorzeichen gibt. Eventuell mal im Netz nach Perl und Vorzeichen oder negativ werten suchen.
Gruß
also laut SELFHTML / PERL solte alles mit vorzeichen stimmen und negative zahlen solten auch verarbeitet werden können
if (ReadingsVal("TemperaturAussen_b", "temperature","5") >= -5 && ("TemperaturAussen_b", "temperature","5") <= -1)
Dir ist aber schon klar, dass Du in allen Deinen if-Abfragen beim zweiten Temperaturwert das ReadingsVal() vor der Klammer vergessen hast?
Sowas unübersichtliches, wie Du da zusammenschraubst, würde ich ausserdem nie direkt im notify umsetzen, sondern immer in einer Funktion in der 99_myUtils.pm. Irgendwas in der Art:
sub tempAnsage {
my $temp = ReadingsVal("TemperaturAussen_b", "temperature","20");
if ($temp <= -6)
{ fhem("set MyTTS tts :ansage.mp3: Drausen ist es eissig kaalt, unter minus fumpf grad"); }
elsif ($temp >= -5 && $temp <= -1){
{ fhem("set MyTTS tts :ansage.mp3: Drausen hat es minus temperaturen"); }
elsif ($temp == 0)
{ fhem("set MyTTS tts :ansage.mp3: Drausen hat es null Grad"); }
elsif ($temp >= 1 && $temp <= 4)
{ fhem("set MyTTS tts :ansage.mp3: Drausen hat es unter fumpf Grad"); }
elsif ($temp >= 5 && $temp <= 9)
{ fhem("set MyTTS tts :ansage.mp3: Drausen hat es unter tzeen Grad"); }
elsif ($temp >= 10 && $temp <= 20)
{ fhem("set MyTTS tts :ansage.mp3: Drausen ist es kuehl, aber uber tzeen Grad"); }
elsif ($temp >= 21 && $temp <= 25)
{ fhem("set MyTTS tts :ansage.mp3: Drausen ist es angenehm, ueber zwansik Grad"); }
elsif ($temp >= 26 && $temp <= 28)
{ fhem("set MyTTS tts :ansage.mp3: Drausen ist es warm, ueber fumpfundzwansik Grad"); }
else
{ fhem("set MyTTS tts :ansage.mp3: Drausen ist es heis"); }
}
fhem("set AnsageTempDum off");
}
Kuck mal an. Habe ich total übersehen. Stimmt bei jeder zweiten Abfrage, das könnte eine Erklärung sein.
;D
Und ausserdem sollte man in einem notify nicht ausgerechnet das device verändern, das das notify ausgelöst hat. Aber das ist ein anderes Thema.
Du denkst bestimmt an Schleifenbildung. Naja das bekommt man ja mit ;D
Hallo
besten dank es war das 2. ReadingsVal nun haut alles so hin wie es soll.
Vielen dank! auch für den anreiz mit 99_myUtils.pm