[Gelöst] Problem mit doppelter ansage.

Begonnen von WarLord, 27 Januar 2016, 17:45:12

Vorheriges Thema - Nächstes Thema

WarLord

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?
FHEM auf RaspberryPi B+
HMLAN Adapter + Div HM Komponenten

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

WarLord

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")
    }
}
FHEM auf RaspberryPi B+
HMLAN Adapter + Div HM Komponenten

CoolTux

Ich kann mir vorstellen das es Probleme mit dem Vorzeichen gibt. Eventuell mal im Netz nach Perl und Vorzeichen oder negativ werten suchen.


Gruß
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

WarLord

also laut SELFHTML / PERL solte alles mit vorzeichen stimmen und negative zahlen solten auch verarbeitet werden können
FHEM auf RaspberryPi B+
HMLAN Adapter + Div HM Komponenten

betateilchen

#5
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");
}

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

CoolTux

Kuck mal an. Habe ich total übersehen. Stimmt bei jeder zweiten Abfrage, das könnte eine Erklärung sein.


;D
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

CoolTux

Du denkst bestimmt an Schleifenbildung. Naja das bekommt man ja mit    ;D
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

WarLord

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
FHEM auf RaspberryPi B+
HMLAN Adapter + Div HM Komponenten