DOIF Anfängerproblem bei der Kombination verschiedener Funktionen

Begonnen von Kermit20, 08 Mai 2015, 10:43:33

Vorheriges Thema - Nächstes Thema

Kermit20

Hi,

wie es der Titel schon erahnen lässt, bin ich noch "Anfänger" und baue mir gerade mein FHEM mit vielen kleinen Funktionen auf. Aktuell scheitere ich an der Steuerung meiner Zirkulationspumpe. Aktuell habe ich folgendes realisiert:

1. Zirkulationspumpe wird mittels Funksteckdose gesteuert (An / Aus )
2. 1-Wire Sensoren an allen relvanten Stellen des Heizsystems installiert und eingebunden.
3. Damit ich die Pumpe nicht immer von Hand schalten muss, wenn ich Warmes Wasser möchte, habe ich mit Threshold Schaltzeiten sowie Schwellwerte definiert... das funktioniert auch
define TH_Zirkulationspumpe THRESHOLD TMPF2F_Wasser_ruek:temperature:7:44 Warm_Wasser_Pumpe
4. Residentsmodul eingerichtet  -> funktioniert -> home und absent werden entsprechend gesetzt
5. DOIF eingerichtet um Zeitgesteuert die Schwellwerte im Threshold Modul anzupassen
define DI_Zirkulation DOIF ([05:30-23:00|8] or [07:00-23:00|7]) (set TH_Zirkulation desired 44) DOELSE (set TH_Zirkulation desired 15)

Nun möchte ich den nächsten Schritt machen und nur die Schwellwerte des Thresholds erhöhen, wenn der Residentsstatus auf "home" ist und Wochen Wochenende/Feiertags abhängige Timeslots berücksichtigen.

Ich hoffe ihr habe verstanden, was ich ausdrücken will =) Da ich kein Programmierer bin, scheitere ich aktuell an der Umsetzung der Zeiten im DOIF Kontext. Kann mir hier einer einen Hinweis geben ? Muss ich noch "DummyVariablen" einbauen ?

Danke im Voraus

Jan
RPi1: FHEM mit HMLAN und CUL Eigenbau: diverse Homematic Geräte; Technoline Temp/Feuchte 868 MHz // Schalsteckdosen 433 MHz
RPi2: FHEM mit Viessmann(optolink) mit VControl und 1W Sensoren
RPi3: Apache / Owncloud 9

satprofi

Hallo.
Ich versuchs mal


define DI_Zirkulation DOIF (([05:30-23:00|8] or [07:00-23:00|7]) and [Anwesend] eq "present")) (set TH_Zirkulation desired 44) DOELSE (set TH_Zirkulation desired 15)


Anwesend ist deine Abfrage, die ,wie auch immer, von die übergeben wird.
Ich habe ähnliches mit Braucwasserpumpe, etc. die nur arbeiten wenn jemand daheim ist.

gruss
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Kermit20

Danke. Ich werde es mal testen.

Werde Berichten.... bei mir ist es übrigens auch die Brauchwasserpumpe / Heißwasserzirkulation habe mich da missverständlich ausgedrückt.
RPi1: FHEM mit HMLAN und CUL Eigenbau: diverse Homematic Geräte; Technoline Temp/Feuchte 868 MHz // Schalsteckdosen 433 MHz
RPi2: FHEM mit Viessmann(optolink) mit VControl und 1W Sensoren
RPi3: Apache / Owncloud 9

Kermit20

So ;D konnte es nicht abwarten und habe mich mal zu Hause aufgeschaltet und es probiert:

Dickes Danke ! Es funktioniert. Es hatte sich lediglich ein kleiner Syntaxfehler eingeschlichen (doppelte Klammer hinter der Residentsvariable).

Ich poste folgend (für alle mit dem selben Brett vorm Kopf), mit einer kleinen Beschreibung, die Lösung:

############################################################################################################################

Schalten einer Brauchwasser Zirkulationspumpe o.ä. in Abhängigkeit zur Anwesenheit und unterschiedlicher Zeitintervallen an Werk, Wochenende und Feiertagen.

- Schalter für Pumpe sollte definiert sein und manuell über FHEM zu schalten sein.
- Definition des THRESHOLD Moduls/Funktion nach der folgenden Syntax:

define TH_Zirkulationspumpe THRESHOLD TMPF2F_Wasser_ruek:temperature:7:44 Warm_Wasser_Pumpe

-> TMPF2F_Wasser_ruek = 1Wire sensor
-> temperature = Sensor Reading
-> 7 = hysteresis
-> 44 = desired_value / Schwellwert

Nach der Definition, wird die Pumpe ausgeschaltet, sobald die Temperatur 44 °C erreicht hat. Sie wird wieder angeschaltet, sobald die Temperatur 37 °C (desired_value "minus" Hysteresis) erreicht hat.

Nun haben wir eine Steuerung, welche das warme Wasser immer einmal durch den Kreislauf pumpt und so warmes Wasser an den Entnahmestellen bereitstellt. Sobald warmes Wasser überall zur Verfügung steht, wird die Pumpe abgeschaltet. Kühlt das Wasser wieder ab (wir würden bei Warmwasserentnahme nicht direkt warmes Wasser am Hahn entnehmen können), wird die Pumpe wieder eingeschaltet und bringt wieder warmes Wasser in den Kreislauf.

Soweit so gut. Nun möchten wir die Automatisierung noch erweitern. Zum einen bereitet die Therme nicht rund um die Uhr heißes Wasser zu und zum anderen sind wir nicht immer zu Hause.

Hier kommen nun die Module "Residents" und "DOIF" ins Spiel. Die Einrichtung von Residents möchte ich aufgrund der guten Beschreibung im WIKI und der Vielfalt hier nicht weiter erläutern. Mit dem DOIF Modul, wird nun alles verknüpft:

define DI_Zirkulation_Test DOIF (([04:30-22:00|8] or [07:00-23:00|7]) and [Fam_xxx] eq "home") (set TH_Zirkulationspumpe  desired 44) DOELSE (set TH_Zirkulationspumpe desired 15)

Durch die Definition, bekommt das System nun die gewünschte Dynamik:

1. Durch die Zeitangaben ([04:30-22:00|8] or [07:00-23:00|7]) werden die Aktionszeiten definiert. Werktags 04:30-22:00 Uhr und Wochenende sowie Feiertags 07:00-23:00 Uhr
2. Durch die UND Verknüpfung  [and [Fam_xxx] eq "home")] wird in diesem Fall die Variable des RESIDENTS Modul abgefragt -> Moduldefinition (Fam_xxx) Wert = home

Diese beiden Parameter werden nun genutzt um das THRESHOLD Modul zu kontrollieren. Während der angegebenen Zeiten und jemand zu Hause ist, wird die Zieltemperatur des THRESHOLDS auf 44 °C gesetzt... außerhalb dieser Zeiten, wird die Temperatur auf 15 °C gesetzt.

############################################################################################################################

Mein Ziel ist es mit dieser Steuerung die Brennerstarts, die Laufzeit sowie den Gasverbrauch zu reduzieren und somit die Anlage und das Portmoniae zu schonen =)

Ich hoffe,dass ich mit dieser kleinen Zusammenfassung andderen Anfängern wie mir helfen kann.

Gruß Jan
RPi1: FHEM mit HMLAN und CUL Eigenbau: diverse Homematic Geräte; Technoline Temp/Feuchte 868 MHz // Schalsteckdosen 433 MHz
RPi2: FHEM mit Viessmann(optolink) mit VControl und 1W Sensoren
RPi3: Apache / Owncloud 9

dieda

Nur mal so als Frage: Warum so aufwendig?

Du hast die Bedingungen:
schalte in einem bestimmten Zeitintervall
nur wenn jemand daheim ist
nur wenn die Temperatur unter dem gewünschten Wert gefallen ist

In der Referenz steht:
ZitatAnwendungsbeispiel: Licht soll zwischen 06:00 und 10:00 angehen, getriggert wird nur durch den Taster nicht um 06:00 bzw. 10:00 Uhr

define di_motion DOIF ([?06:00-10:00] and [button])(set lamp on-for-timer 600)
attr di_motion do always

also müsste es heißen

Zitat(([?04:30-22:00|8] or [?07:00-23:00|7]) and [dein Messfühler:dein Reading]<dein Wert and [Fam_xxx] eq "home") (set Zirkulationspumpe  on-for.timer x)

Komponenten:
Sensoren und Aktoren: FS20, Max!, Zigbee, Zwave
IODev:  Cul1101, MaxLan, ZWAVE, Deconz
Router: KD-Fritte (6360)
Sonstiges: Raspberries,  1x LMS,1 FHEM, 1 x zum Testen,  Logitech-Clients,  Onkyo, SamsungTV, Squeezebox, TabletUIs

Kermit20

hmmm  :o gute Frage ist durchaus eine Variante. Ich habe mir Eingebildet, dass Variablen wie Außentemperatur usw. Einfluss haben könnten.... aber das würde deine Abfrage ja auch abdecken. Ich müsste lediglich die Dauer kennen, die die Pumpe zum umwälzen braucht (ist ja Messbar) zu weit heizen kann sie nicht, weil die maximal Temperatur ja durch den Speicher vorgegeben wird.

Einen Vorteil sehe ich bei deiner Variante noch.... Wenn man das Pumpvolumen kennt und die Differenz zum nächsten Heizzyklus... dann könnten am es noch etwas optimaler hinbekommen... aber die Werte bekommt man sicherlich nur schwer ermittelt.

Ich schaue mal ob ich es bei mir noch umstelle, oder ob diese Variante für weitere Verknüpfungen Vorteile haben könnte.
RPi1: FHEM mit HMLAN und CUL Eigenbau: diverse Homematic Geräte; Technoline Temp/Feuchte 868 MHz // Schalsteckdosen 433 MHz
RPi2: FHEM mit Viessmann(optolink) mit VControl und 1W Sensoren
RPi3: Apache / Owncloud 9

Damian

(([?04:30-22:00|8] or [?07:00-23:00|7]) and [dein Messfühler:dein Reading]<dein Wert and [Fam_xxx] eq "home") (set Zirkulationspumpe  on-for.timer x)


Diese Variante unterscheidet sich allerdings an einer Stelle erheblich von dem Button-Beispiel, denn der Messfühler sendet zyklisch und damit würde auch zyklisch Zirkulationspumpe geschaltet und zwar im Takt der Events des Messfühlers - das möchte man normalerweise aber nicht.

Eine ähnliche Variante wie Kermit20 habe ich bei mir auch mit THRESHOLD und DOIF in Kombination mit 1-wire Sensoren und sie funktioniert ganz gut. Der Vorteil von der temperaturgesteuerten Lösung (so wohl zum Einschalten als auch zum Ausschalten) hat den Vorteil, dass die Pumpe keine Minute zu lang oder auch zu kurz läuft.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

dieda

Die Frage ist doch, wie groß ist die Schalthysterese. Ziel: z. B 45 Grad. DOIF soll bei unterschreiten von 40 loslegen. D. h. die Pumpe läuft nur so lange, wie dieser Wert unterschritten wird. Der Sender sendet alle 30 Sekunden und sitzt in der Zirkulationsleitung vorm Kessel. Also nicht zu lang.
Komponenten:
Sensoren und Aktoren: FS20, Max!, Zigbee, Zwave
IODev:  Cul1101, MaxLan, ZWAVE, Deconz
Router: KD-Fritte (6360)
Sonstiges: Raspberries,  1x LMS,1 FHEM, 1 x zum Testen,  Logitech-Clients,  Onkyo, SamsungTV, Squeezebox, TabletUIs

Damian

Zitat von: dieda am 08 Mai 2015, 19:14:38
Die Frage ist doch, wie groß ist die Schalthysterese. Ziel: z. B 45 Grad. DOIF soll bei unterschreiten von 40 loslegen. D. h. die Pumpe läuft nur so lange, wie dieser Wert unterschritten wird. Der Sender sendet alle 30 Sekunden und sitzt in der Zirkulationsleitung vorm Kessel. Also nicht zu lang.

Dennoch: In der Zirkulationsphase, die evtl. 10 Minuten dauern kann, wird dann 20 mal geschaltet (alle 30 Sekunden). Hinzu kommt zusätzliche Nachlaufzeit (vom letzten Trigger) von 10 Minuten, wenn on for timer auf 10 Minuten steht.

Bei der anderen Lösung wird jeweils nur einmal zum Ein- und Ausschalten geschaltet und es gibt keine unnötige Nachlaufzeit.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

satprofi

Hallo.
Jetzt habe ich ein Brett vorm Kopf.
Möchte das ein Actor schaltet wenn, Leistung unter bestimmten Wert zw. bestimmter Uhrzeit, oder bestimmter Wert bei definirter Uhrzeit schaltet, wenn 3. Wert vorhanden.
Leider schaltete jetzt der Actor, obwohl 3. Wert nicht vorhanden, und schaltete aus wenn 2. Argument noch nicht eintraf.


(([Pac] < 1900 and [17:45-19:30]) or ([Ueberschuss:state:d] < 800 and [19:00-07:30]) and [load_kWh_daily] > 9.5) (set Netz_Schuetz_aus on)


Wo ist da der Denkfehler?

gruss
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

RitterSport

Zitat von: Damian am 08 Mai 2015, 16:48:11
(([?04:30-22:00|8] or [?07:00-23:00|7]) and [dein Messfühler:dein Reading]<dein Wert and [Fam_xxx] eq "home") (set Zirkulationspumpe  on-for.timer x)


Diese Variante unterscheidet sich allerdings an einer Stelle erheblich von dem Button-Beispiel, denn der Messfühler sendet zyklisch und damit würde auch zyklisch Zirkulationspumpe geschaltet und zwar im Takt der Events des Messfühlers - das möchte man normalerweise aber nicht.


Wenn er das oben genannte DOIF und on-for-timer ergänzen würde, mit einem DOELSEIF Temp>X (set pumpe of), dann müsste ich doch mit einem solchen DOIF eine Threshold "simuliert" haben ?
Ein reines zyklisches Verhalten wäre dann nicht gegeben.

Damian

Zitat von: RitterSport am 09 Mai 2015, 00:46:02
Wenn er das oben genannte DOIF und on-for-timer ergänzen würde, mit einem DOELSEIF Temp>X (set pumpe of), dann müsste ich doch mit einem solchen DOIF eine Threshold "simuliert" haben ?
Ein reines zyklisches Verhalten wäre dann nicht gegeben.

Ich ging von dem ursprünglich Beispiel mit dem button aus, dort war do always gesetzt. Wenn man natürlich kein do always setzt, dann sollte es dagegen schon korrekt so funktionieren wie dieda es vorgeschlagen hat (es gibt dann keine unnötige Wiederholung) und man braucht auch keinen ELSE(IF)-Fall (den Zustand cmd_2 gibt es trotzdem). Vorausgesetzt die on-for-time-Zeitspanne ist richtig gewählt: lang genug, um nach Abwesenheit das Wasser lang genug zirkulieren zu lassen und kurz genug um nicht unnötig zu pumpen.

Man kann auch zum Abschalten, wie du vorschlägst, den DOELSEIF-Fall definieren (auch hier natürlich ohne do always arbeiten).

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF