FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Lazgar am 23 Dezember 2016, 08:03:46

Titel: [gelöst] Problem mit Lüftersteuerung
Beitrag von: Lazgar am 23 Dezember 2016, 08:03:46
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
Titel: Antw:Problem mit Lüftersteuerung
Beitrag von: Otto123 am 23 Dezember 2016, 08:28:25
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
Titel: Antw:Problem mit Lüftersteuerung
Beitrag von: Beta-User am 23 Dezember 2016, 09:06:07
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
Titel: Antw:Problem mit Lüftersteuerung
Beitrag von: KölnSolar am 23 Dezember 2016, 09:14:29
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
Titel: Antw:Problem mit Lüftersteuerung
Beitrag von: Otto123 am 23 Dezember 2016, 09:23:57
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
Titel: Antw:Problem mit Lüftersteuerung
Beitrag von: Lazgar am 23 Dezember 2016, 09:33:55
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...
Titel: Antw:Problem mit Lüftersteuerung
Beitrag von: KölnSolar am 23 Dezember 2016, 09:42:23
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)
Titel: Antw:Problem mit Lüftersteuerung
Beitrag von: Otto123 am 23 Dezember 2016, 09:44:11
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
Titel: Antw:Problem mit Lüftersteuerung
Beitrag von: Lazgar am 23 Dezember 2016, 10:07:54
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") }}\
}
Titel: Antw:Problem mit Lüftersteuerung
Beitrag von: KölnSolar am 23 Dezember 2016, 10:26:05
Jo Perl... :'(
Zahlenvergleiche:     ==, !=, > .......
Charactervergleiche: eq, ne, gt .....
Prima, dass es jetzt klappt
Bitte noch dem Betreff Deines ersten Beitrags ein [gelöst] voranstellen.
Titel: Antw:Problem mit Lüftersteuerung
Beitrag von: Lazgar am 24 Dezember 2016, 00:48:53
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