bräuchte Hilfe bei DOIF

Begonnen von hankyzoolander, 05 Juni 2016, 01:01:56

Vorheriges Thema - Nächstes Thema

hankyzoolander

Hallo,
folgendes möchte ich umsetzen.

Ein DS18B20 1Wire misst jede Minute die Temperatur in einem Pufferspeicher.
Ist die Temperatur gleich oder größer 45°C, wird per gpio ein Relais eingeschaltet an dem eine Pumpe hängt.
Ist die Temperatur kleiner 40°C, wird per gpio das Relais ausgescheltet an dem die Pumpe hängt.
Diese Regel soll aber nur von 6Uhr morgens bis 22Uhr abends gelten. Über Nacht (22Uhr-6Uhr) soll das Relais immer ausgeschaltet sein.

Zustand aktuell ist,
DS18B20 1Wire Sensor misst jede Minute die Temperatur.
Relais wird nur zum Test um 21Uhr ausgeschaltet.
Relais wird gleich oder größer 25°C eingeschaltet und kleiner als 23°C ausgeschaltet ( Testhalber, da so die Handwärme reicht zum auslösen)

Problem ist,
Beträgt aber die Temperatur nach 21Uhr gleich oder mehr 25°C, schaltet Relais wieder ein.

Hat jemand eine Idee wie ich das evt in einem DOIF lösen könnte?
betateilchen  <--- my personal hero

CoolTux

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

hankyzoolander

Hallo,
also habe folgende Konstellation.

Pin1= Relais1
Sonde1= Ds18b20
Schalter1= Schalter Automatik oder Handbetrieb
AT = ab 23:00Uhr aus

define pufferpumpe DOIF ([06:00-22:00] and [sonde1:temperature]>=45) (set Pin1 on) DOELSEIF ([sonde1:temperature]<41) (set Pin1 off)

define schalter DOIF ([schalter1:state]on) (set Pin1 on) DOELSEIF ([schalter1:state]off) (set Pin1 off)


Also, von 6Uhr-22Uhr soll gemessen werden ob Puffertemperatur gleich oder größer ist wie 45°C. Ist dies der Fall soll Relais1 eingeschaltet werden. Ist die Temperatur kleiner 41°C soll Relais1 ausgeschaltet werden.
Nach 22Uhr soll diese Automatik nicht mehr vergleichen.
Falls nach 22Uhr  noch genug Temperatur im Puffer vorhanden ist, soll per Schalter Relais1 manuell eingeschaltet werden um Warmwasserboiler oder Heizkörper zu laden.
Falls vergessen wird den Schalter wieder auszuschalten, soll das AT dafür sorgen das Relais1 ab 23Uhr ausgeschaltet wird.

Problem ist, das z.b. Morgens Relais1 nicht eingeschaltet wird, obwohl sonde1 77°C misst.
Erkennt jemand den Fehler?



betateilchen  <--- my personal hero

CoolTux

DOIF arbeitet, sofern nicht anders eingestellt, mit Zustandsänderungen. Wenn also nach 22 Uhr das DOIF pufferpumpe im cmd1 steht dann wird er morgens auch nicht schalten da der zustand cmd1 ja schon geschalten ist.


define pufferpumpe DOIF ([06:00-22:00] and [sonde1:temperature]>=45) (set Pin1 on) DOELSEIF ([22:00-06:00] or [sonde1:temperature]<41) (set Pin1 off)


Bin jetzt nicht so der spezi mit DOIF, aber vielleicht geht es ja so
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

hankyzoolander

also,
habe deinen Code gerade getestet.
Habe Testhalber die Temperaturen runtergesetzt um es mit einem Heizlüfter zu testen. Da das eigentliche System sich nicht bei mir zu Hause befindet, habe ich einen meiner 5 Raspberry Pi`s identisch eingestellt.

([06:00-22:00] and [sonde1:temperature]>=30) (set pin1 on) DOELSEIF ([22:00-06:00] or [sonde1:temperature]<25) (set pin1 off)

das Problem besteht weiterhin.
Wenn die Temperatur größer oder gleich 30°C ist schaltet Relais1 ein. Sinkt Temperatur unter 25°C schaltet Relais1 wieder aus. Also alles richtig.

aber ist Relais1 eingeschaltet weil Temperatur 37°C hat, und ich über das Webinterface Relais1 manuell ausschalte wird bei der nächsten Messung das Relais nicht wieder eingeschaltet obwohl Temperatur 37°C beträgt.
betateilchen  <--- my personal hero

CoolTux

Dann kommst Du wohl um ein do always nicht rum


([06:00-22:00] and [sonde1:temperature]>=30) (set pin1:FILTER=STATE!=on on) DOELSEIF ([sonde1:temperature]<25) (set pin1:FILTER=STATE!=off off)
attr NAME do always
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

hankyzoolander

#6
bei dem Code bekomm ich ne Fehlermeldung

pumpe DOIF: expected DOELSEIF or DOELSE: attr NAME do always


Stop.
es ist erschreckend wie man manchmal auf dem Schlauch stehen kann :-)

hab es nicht gepeilt das do unter attr in der Liste ist.




betateilchen  <--- my personal hero

CoolTux

Vielleicht weiß es jemand anderes noch besser. Ich mag do always nicht weil da immer und immer wieder geschalten wird. Deswegen die FILTER in den Schaltbefehlen.
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

hankyzoolander

also so funktioniert der Code.
Temperatur ist größer 25°C Relais schaltet ein.
Schalte Relais manuell aus, Sensor misst Temperatur wieder größer 25°C und schaltet Relais wieder ein. wunderbar.
Jetzt schaltet er aber nicht mehr abends aus :-/
Habe Zeiten von 6:00uhr bis 15:35 eingestellt zum testen.

Hab in der commandref gelesen das wenn do always aktiviert ist, ein DOELSE hinter der definition stehen soll.
Das bringt aber auch nicht die Lösung.
Wie könnte man das anders lösen? Also ohne ein DOIF.
betateilchen  <--- my personal hero

hankyzoolander

Hier mal der Auszug der commandref
Bei der Angabe von zyklisch sendenden Sensoren (Temperatur, Feuchtigkeit, Helligkeit usw.) wie z. B.:

define di_heating DOIF ([sens:temperature] < 20) (set heating on)

ist die Nutzung des Attributes do always nicht sinnvoll, da das entsprechende Kommando hier: "set heating on" jedes mal ausgeführt wird, wenn der Temperatursensor in regelmäßigen Abständen eine Temperatur unter 20 Grad sendet. Ohne do always wird hier dagegen erst wieder "set heating on" ausgeführt, wenn der Zustand des Moduls auf "cmd_2" gewechselt hat, also die Temperatur zwischendurch größer oder gleich 20 Grad war.

Zu beachten ist, dass bei do always der Zustand "cmd_2" bei Nichterfüllung der Bedingung nicht gesetzt wird. Möchte man dennoch bei Nichterfüllung der Bedingung einen Zustandswechsel auf "cmd_2" erreichen, so muss man am Ende seiner Definition DOELSE ohne weitere Angaben setzen. Wenn das Attribut do always nicht gesetzt ist, wird dagegen bei Definitionen mit einer einzigen Bedingung, wie im obigen Beispiel, der Zustand "cmd_2" bei Nichterfüllung der Bedingung automatisch gesetzt. Ohne diesen automatischen Zustandswechsel, wäre ansonsten die Definition nicht sinnvoll, da der Zustand "cmd_1" ohne do always nur ein einziges Mal ausgeführt werden könnte.


Habe folgenden Code

([06:00-16:02] and [sonde1:temperature]>=30) (set pin1:FILTER=STATE!=on on) DOELSEIF ([sonde1:temperature]<25) (set pin1:FILTER=STATE!=off off) DOELSE


Um 16:02Uhr schreibt das DOIF cmd_3
Also das DOELSE am ende.
Schalte ich das Relais manuell dann aus, wird es über do always auch nicht mehr eingeschaltet.
Schalte ich es aber nicht manuell aus, bleibt es eingeschaltet und die schaltzeiten am Anfang der Definition werden ignoriert.
betateilchen  <--- my personal hero

hankyzoolander

So,
ich habe die Lösung gefunden!! Juhu

also
von 6:Uhr-22Uhr soll mit einem Temperatursensor die Puffertemperatur geprüft werden.
Ist die Temperatur gleich oder größer 45°C wird Relais1 eingeschaltet.
Ist die Temperatur kleiner 41°C wird Relais1 ausgeschaltet.
Wird Relais1 manuell ausgeschaltet, übernimmt das do always das wiedereinschalten.
Ab 22Uhr wird Relais1 ausgeschaltet.
Wird nach 22Uhr Relais1 manuell eingeschaltet, greift der Timer von 6Uhr bis 22Uhr nicht mehr.
Um 23Uhr wird mit einem at Relais1 ausgeschaltet.

DOIF Code

([06:00-22:00] and [sonde1:temperature]>=45) (set pin1:FILTER=STATE!=on on) DOELSEIF ([sonde1:temperature]<41) (set pin1:FILTER=STATE!=off off) DOELSE (set pin1 off)


at Code
*23:00:00 set pin1 off


das DOELSE (set pin1 off) am ende hatte gefehlt.
Bis jetzt funktioniert es. Werde diesen Code heute noch ändern und natürlich berichten ob alles funktioniert wie es gedacht war.
erstmal danke für die Hilfe  :)
betateilchen  <--- my personal hero