Hallo Leute!
Bin relativ neu bei Fhem und hab da leider noch nicht so den Durchblick.
Ich wollte mittels Raspi+Fhem eine temperaturabhängige Lüftersteuerung bauen.
Den Temperaturfühler habe ich wie folgt angelegt:
define Temp.DHT22 dummy
attr Temp.DHT22 group Sensoren
attr Temp.DHT22 icon temp_temperature
attr Temp.DHT22 room Schrank
attr Temp.DHT22 stateFormat temperature °C
Der dummy wird per Script mit dem Temperaturwert gefüttert.
Den Lüfter habe ich so angelegt:
define Luefter2 dummy
attr Luefter2 group Schalter
attr Luefter2 icon vent_ventilation_control
attr Luefter2 room Schrank
attr Luefter2 setList state:35,55,76,100
attr Luefter2 webCmd state
Jetzt wollte ich per at und If Abfragen, je nach Temperatur, die Geschwindigkeit des Lüfters ändern.
Sieht bei mir so aus:
Define WatchdogTemp at +*00:00:10 {\
If ((ReadingsVal("Temp.DHT22","temperature","1") < 20 )) {\
If ((ReadingsVal("Luefter2","state","0") != "35")) { fhem("set Luefter2 35") }}\
}\
{\
Elsif ((ReadingsVal("Temp.DHT22","temperature","1") >= 20 || ReadingsVal("Temp.DHT22","temperature","1") <= 22 )) {\
If ((ReadingsVal("Luefter2","state","0") != "55")) { fhem("set Luefter2 55") }}\
}\
{\
Elsif ((ReadingsVal("Temp.DHT22","temperature","1") >= 23 || ReadingsVal("Temp.DHT22","temperature","1") <= 25 )) {\
If ((ReadingsVal("Luefter2","state","0") != "75")) { fhem("set Luefter2 75") }}\
}\
{\
Elsif ((ReadingsVal("Temp.DHT22","temperature","1") >= 26 )) {\
If ((ReadingsVal("Luefter2","state","0") != "100")) { fhem("set Luefter2 100") }}\
}
Leider bekomme ich das aber nicht zum Laufen.
Bin in Perl nicht so bewandert, kann mir bitte jemand sagen wo der Fehler liegt?
Danke und LG
Lazgar
hi Lazgar,
ich würde das nicht mit watchdog machen. Nimm doch DOIF. Und die Zeitscheiben würde ich auch nicht machen, aber kann sein das verstehe ich nicht.
so in der Art:(nicht komplett ausformuliert und nicht getestet)
define TempControl DOIF ([Temp.DHT22:temperature] < 20) (set Luefter2 35) DOELSEIF (([Temp.DHT22:temperature] >= 20) (set Luefter2 55) DOELSEIF () ()
Gruß Otto
Hi Lazgar,
der Fehler Bei deinem at dürfte darin liegen, dass Du Perl nutzt, aber die Anfangsbuchstaben groß geschrieben hast ("If" bzw. "Elseif" statt "if" und "elseif").
Das ist case-sensitive, es gibt übrigens auch noch "IF" als Modul (in der commandref dazu stehen auch einige kleinere Beispiele zur Perl-Syntax).
Gruß,
Beta-User
Zitatich würde das nicht mit watchdog machen.
macht er ja nicht. Er hat nur das at mit "WatchdogTemp" benannt ;)
@Lazgar: Wieso ist denn das DHT22 device als dummy definiert ?
ZitatDer dummy wird per Script mit dem Temperaturwert gefüttert.
Existiert das reading "temperature" vielleicht gar nicht, weil das Skript nicht funktioniert ? Stell doch mal das Ergebnis eines "list Temp.DHT22" ein. Und ersetz schon mal die doppelten runden Klammern durch einfache. Macht das Ganze unnötig unübersichtlich.
Grüße Markus
Zitat von: KölnSolar am 23 Dezember 2016, 09:14:29
macht er ja nicht. Er hat nur das at mit "WatchdogTemp" benannt ;)
Oh ist das peinlich :o zu flüchtig den Anfang gelesen ;D
Danke @all für die Unterstutzung!
Hier mal das Ergebnis von list Temp.DHT22:
Internals:
NAME Temp.DHT22
NR 52
STATE 19 °C
TYPE dummy
Readings:
2016-12-23 07:40:25 temperature 19
Attributes:
group Sensoren
icon temp_temperature
room Schrank
stateFormat temperature °C
Ich werde mal die Ifs und Elseifs alle auf Kleinbuchstaben ändern und die doppelten Klammern entfernen.
Kurze frage noch, schreibt man in Perl elsif oder elseif???
Hab irgendwo gesehen das man das elsif schreibt, kommt mir aber komisch vor...
ZitatHab irgendwo gesehen das man das elsif schreibt, kommt mir aber komisch vor...
Versteh ich, aber das Komische ist die richtige Syntax ;)
(nichts Verdächtiges im list zu sehen)
https://wiki.selfhtml.org/wiki/Perl/Bedingte_Anweisungen
Aber wie schon gesagt, wenn Du in Perl nicht so bewandert bist :D DOIF macht es praktisch ohne Perl.
Gruß Otto
Problem gelöst. In der verschachtelten if-Abfrage konnte er den Luefter 2 Auslesen aber weil ich den wer in "" geschrieben habe, nicht vergleichen.
So funktioniert einwandfrei:
Define WatchdogTemp at +*00:00:10 {\
if (ReadingsVal("Temp.DHT22","temperature","1") < 20 ) {\
if (ReadingsVal("Luefter2","state","0") != 35) { fhem("set Luefter2 35") }}\
elsif ((ReadingsVal("Temp.DHT22","temperature","1") >= 20) || (ReadingsVal("Temp.DHT22","temperature","1") <= 22 )) {\
if (ReadingsVal("Luefter2","state","0") != 55) { fhem("set Luefter2 55") }}\
elsif ((ReadingsVal("Temp.DHT22","temperature","1") >= 23) || (ReadingsVal("Temp.DHT22","temperature","1") <= 25 )) {\
if (ReadingsVal("Luefter2","state","0") != 75) { fhem("set Luefter2 75") }}\
elsif (ReadingsVal("Temp.DHT22","temperature","1") >= 26 ) {\
if ((ReadingsVal("Luefter2","state","0") != 100) { fhem("set Luefter2 100") }}\
}
Jo Perl... :'(
Zahlenvergleiche: ==, !=, > .......
Charactervergleiche: eq, ne, gt .....
Prima, dass es jetzt klappt
Bitte noch dem Betreff Deines ersten Beitrags ein [gelöst] voranstellen.
So, leider war mein Problem doch noch nicht ganz gelöst.
Mittlerweile funktioniert es aber einwandfrei!
Hab noch ein bisschen daran gebastellt, hier der vollständige Code, falls es wer brauchen kann:
define Luefter dummy
attr Luefter group Schalter
attr Luefter icon vent_ventilation_control
attr Luefter room Schrank
attr Luefter setList state:35,55,75,100
define Temp.DHT22 dummy
attr Temp.DHT22 group Sensoren
attr Temp.DHT22 icon temp_temperature
attr Temp.DHT22 room Schrank
attr Temp.DHT22 stateFormat temperature °C
defmod Watchdog_Luefter at +*00:00:10 \
{\
if ( ReadingsVal ( "Temp.DHT22" , "temperature" , "1") < 20 )\
{\
if ( ReadingsVal ( "Luefter" , "state" , "0" ) != 35 )\
{\
fhem ( "set Luefter 35" )\
}\
}\
elsif (( ReadingsVal ( "Temp.DHT22" , "temperature" , "1" ) >= 20 ) && ( ReadingsVal ( "Temp.DHT22" , "temperature" , "1" ) <= 22 ))\
{\
if ( ReadingsVal ( "Luefter" , "state" , "0" ) != 55 )\
{\
fhem ( "set Luefter 55" )\
}\
}\
elsif (( ReadingsVal ( "Temp.DHT22" , "temperature" , "1" ) > 22 ) && ( ReadingsVal ( "Temp.DHT22" , "temperature" , "1" ) <= 25 ))\
{\
if ( ReadingsVal ( "Luefter" , "state" , "0" ) != 75 )\
{\
fhem ( "set Luefter 75" )\
}\
}\
elsif ( ReadingsVal ( "Temp.DHT22" , "temperature" , "1" ) > 25 )\
{\
if (ReadingsVal ( "Luefter" , "state","0" ) != 100 )\
{\
fhem ( "set Luefter 100" )\
}\
}\
}
attr Watchdog_Luefter group Steuerung
attr Watchdog_Luefter room Schrank
Danke nochmals für die Hilfe!
LG Lazgar