FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: StefanD am 06 Dezember 2014, 16:49:59

Titel: [Gelöst] Heizkreispumpe ausschalten bei mind. 3 nicht geschlossenen Fenstern
Beitrag von: StefanD am 06 Dezember 2014, 16:49:59
Hallo zusammen,

ich beschäftige mich seit Kurzem mit FHEM, da meiner Frau und meinen Kindern mit Argumenten bezüglich ,,Heizen für draußen" nicht beizukommen ist. Mit FHEM kann ich hier mit Fakten (abgeschaltete Heizkreispumpe) hoffentlich was bewegen, zumindest aber die Problematik etwas eindämmen.

Das, bzw. mein Hauptproblem sind über längere Zeit gekippte oder gar offene Fenster und eine offene Haustür, wenn die Kinder vor dem Haus oder unten im Garten sind.

Die Haustür wird mit einem HM-SEC-Sco, die Fenster mit einem HM-Sec-RHS und die Fenster im Kinderzimmer mit FHTTK überwacht. Da wir in einer gemieteten DHH wohnen, kann und möchte ich nur minimal in die Heizungsanlage/-steuerung eingreifen. Die Grundkontrolle bleibt bei der Heizungssteuerung. In die Zuleitung zur Heizkreispumpe habe ich den HM-ES-PMSw1-Pl dazwischen, der autom. einschaltet, wenn die Heizungssteuerung die Zirkulationspumpe einschaltet.

Die Heizkreispumpe abzuschalten, wenn die Haustür mehr als 3min offen ist, habe ich gelöst, das war keine Herausforderung, was mir aber in der Umsetzung Probleme bereitet ist, wie ich das Gleiche bei mehr als 3 nicht geschlossenen Fenstern erreiche. Ich weiß, das mit structure die Fenstern zusammenfassen kann, aber dabei fehlt mir zum Einen die Anzahl nicht geschlossener Fenster zum Anderen habe ich zwei Typen von Sensoren im Einsatz, die den Zustand unterschiedlich melden.

Hier eine Aufstellung der Sensoren:

HM-Sec-RHS:
eg_gt_Fenster
eg_ku_Fenster
eg_ku_Fenster
eg_wz_Balkontuer
og_ba_Fenster
og_sz_Fenster
dg_st_Fenster

FHTTK:
og_Julia_Fenster
og_Lena_Fenster

Mein bisher gedanklicher Ansatz ist ein dummy, der die Anzahl der aktuell nicht geschlossenen Fenster enthält. Aktualisiert wird dieser über notify auf jeden Sensor, der immer den Status aller Sensoren ausliest, damit die Anzahl immer korrekt ist.
Das dummy device könnte man mit einem watchdog überwachen, der die Heizkreispumpe ausschaltet, wenn der Wert mind. 3 beträgt.
Jetzt hapert es dummerweise an der Umsetzung... ...oder auch an einem eleganterem Lösungsansatz.
Das was ich bisher über die Suche sowie Mr. Google gefunden habe, hat mir noch nicht die erforderliche Erleuchtung geliefert. Das Einsteiger-PDF habe ich natürlich auch schon 2x durch und im Wiki auch schon gestöbert.

Viele Grüße
Stefan
Titel: Antw:Heizkreispumpe ausschalten bei mind. 3 nicht geschlossenen Fenstern
Beitrag von: chris1284 am 07 Dezember 2014, 09:17:17
http://fhem.de/commandref_DE.html#THRESHOLD

das besipiel "Heizung in Kombination mit mehreren Fensterkontakten" deckt deines denke ich schon gut ab
Titel: Antw:Heizkreispumpe ausschalten bei mind. 3 nicht geschlossenen Fenstern
Beitrag von: StefanD am 07 Dezember 2014, 14:23:47
Ich bin mir sicher, dass es etwas gibt, das meine Anforderungen umsetzt, nur fällt auch jetzt der Groschen noch nicht.  ;)

Was ich aus dem THRESHOLD nicht raus lese ist, wo dort meine Anforderung mit den mind. 3 nicht geschlossenen Fenstern abgedeckt wird.

Ein, zwei Sätze mehr würden mir vielleicht helfen, eure Gedankengänge zu verstehen und die Chance erhöhen, dass es auch bei mir Klick macht.  :)

Viele Grüße
Stefan
Titel: gelöst:Heizkreispumpe ausschalten bei mind. 3 nicht geschlossenen Fenstern
Beitrag von: StefanD am 10 Dezember 2014, 17:38:50
Am Sonntag hat's in den Gehirnwinungen geklickt. Hatte nur nicht ausreichend Zeit das Thema fertig zu machen, aber meine Anforderung ist nun erfüllt und umgesetzt.  :)

Meine Lösung sieht wie folgt aus:

Alle Fenster habe ich in kaskadierten structure Objekten zusammengeführt. D.h. ein structure Objekt pro Geschoss und eines für alle Fenster.

Ein dummy Device dient als Sammler diverser Attribute, basierend darauf die Heizkreispumpe aus-, bzw. wieder eingeschaltet wird:
define dmy_StoppHeizungspumpe dummy

Sobald sich an dem structure Objekt für alle Fenster etwas tut, ruft ein notify eine Funktion in der 99_myUtils.pm auf:
define nfy_st_Alle_Fenster notify st_alle_Fenster {CountNonClosedWindows("dmy_StoppHeizungspumpe")}
# CountNonClosedWindows
# basiert auf http://www.fischer-net.de/hausautomation/fhem/56-fhem-status-mehrerer-geraete-aggregieren.html
sub CountNonClosedWindows($) {
  Log 3, "CountNonClosedWindows start";
  my ($device) = @_;
  my $name = "CountNonClosedWindows";
  my $ret;
  if(!$defs{$device}) {
    $ret = "device $device does not exists. Please define it first!";
    Log 1, "$name $ret";
    return $ret;
  }
  my $c = 0;
  my $cOpen = 0;
  my $cClosed = 0;
  my $cUnknown = 0;

  foreach my $dev (sort keys %defs) {
if(AttrVal("$dev","subType","") eq "threeStateSensor") {
  my $devState = ReadingsVal($defs{$dev}{NAME},"state","");
      if($devState eq "open") {
        $cOpen++;
      } elsif ($devState eq "tilted") {
$cOpen++;
      } elsif ($devState eq "closed") {
        $cClosed++;
      } else {
        Log 0, "DEBUG unknown:$dev";
        $cUnknown++
      }
      $c++;
      Log 3, "CountNonClosedWindows $dev: $devState";
    }
  }
 
  Log 3, "CountNonClosedWindows Found $c devices: open: $cOpen closed: $cClosed unknown: $cUnknown";
  fhem "setreading $device summary $c";
  fhem "setreading $device closed $cClosed";
  fhem "setreading $device open $cOpen";
  fhem "setreading $device unkown $cUnknown";
  Log 3, "CountNonClosedWindows end";
}


Die Funktion basiert in großen Teilen auf dem Blogpost http://www.fischer-net.de/hausautomation/fhem/56-fhem-status-mehrerer-geraete-aggregieren.html (http://www.fischer-net.de/hausautomation/fhem/56-fhem-status-mehrerer-geraete-aggregieren.html)
Ursprünglich hatte ich noch einen Block für die FTTKs mit im Script, da mir diese aber mit einer viel zu hohen Latenz ihre Stati an FEHEM übermitteln, werden diese die Tage ebenfalls durch die HM Drehgriffkontakte ersetzt. Das hat zus. den Vorteil, dass ich Alarm schlagen kann, wenn die Kinder ein Fenster nicht nur kippen, sondern richtig öffnen.

Desweiteren ist noch der optische Sensor an der Haustür mit eingebunden. Ein DOIF setzt hier mit 60s Verzögerung ein Reading im dummy:
define doif_Haustuer DOIF ([eg_vr_Haustuer:open]) (setreading dmy_StoppHeizungspumpe frontdooropen 1) DOELSE (setreading dmy_StoppHeizungspumpe frontdooropen 0)
attr doif_Haustuer wait 60:60


Die Heizungspumpe, die an einem HM-ES-PMSw1-Pl hängt, wird letztendlich auch von einem DOIF geschaltet. Hier ist eine 90s Verzögerung eingebaut, damit sehr kurze Zustandsänderungen an den Fenstern nicht umgehend zum Schaltvorgang führen. Um gegenüber der Heizungssteuerung, die nach wie vor noch die Hoheit über die Pumpe hat, noch genügend Einfluss zu haben, werden die Schaltbefehle immer ausgeführt und bei gleichartigen Befehlen nicht zurückgehalten:
define doif_Heizungspumpe DOIF ([dmy_StoppHeizungspumpe:open:d] >= 3 or [dmy_StoppHeizungspumpe:frontdooropen:d] == 1) (set kg_hr_Heizkreispumpe_Sw off) DOELSEIF ([dmy_StoppHeizungspumpe:open:d] == 0 and [dmy_StoppHeizungspumpe:frontdooropen:d] == 0) (set kg_hr_Heizkreispumpe_Sw on)
attr doif_Heizungspumpe do always
attr doif_Heizungspumpe wait 90:90


Das Ganze ist natürlich erstmal ein Anfang und kann sicherlich auch anders und/oder eleganter gelöst werden. Ebenso ruft dieser Anfang förmlich nach einer Erweiterung, die die Temperaturunterschiede (innen/außen) berücksichtigt, ob das offene Küchenfenster der Zuluft für die laufende Dunstabzugshaube dient, usw.   ::)
Ein Anfang ist jedenfalls gemacht und ich bin schon gespannt, ob der Umgang mit offenen Fenstern/Türen bei kalten Außentemperaturen jetzt etwas bewusster erfolgt...  ;)

Viele Grüße
Stefan