HM-CC-RT-DN und HM-SEC-RHS, Set nur wenn Fenster geschlossen

Begonnen von MarkOtti, 03 Juni 2015, 20:38:40

Vorheriges Thema - Nächstes Thema

MarkOtti

Hallo Forum,

ich habe mir aus den Codeschnipseln im Wiki eine Funktion gebastelt, die alle Heizkörper abweichend vom programmierten Zeitplan per controlMode auf "night" setzt, sobald keiner im Haus ist (Anwesenheitserkennung) oder die Aussentemperatur einen gewissen Wert übersteigt. Ein zweites Script prüft ob Wärme von den Heizkörpern angefordert wird oder nicht und schaltet dann dementsprechend den Gasbrenner ein oder aus. Soweit funktioniert das ganze auch reibungslos.
Allerdings statte ich jetzt nach und nach viele Fenster mit den o. g. Fensterkontakten aus. Die WindowOpen-Erkennung funktioniert. Wenn jetzt aber ein Fenster geöffnet ist (Soll-Temperatur bei 12 Grad) und ich komme nach Hause (Anwesenheitserkennung schaltet das Stellventil von Nacht- auf Tagbetrieb um) wird somit die Soll-Temperatur auf 21 Grad angehoben. Das ist bl...

Ich nutze folgenden Befehl, um die Stellventile umzustellen, wobei $controlMode "night" oder "auto" enthalten kann:
$cmdret = CommandSet(undef, ".*_Clima controlMode $controlMode");

Ich gehe davon aus, dass ich abgewandelte Teile vom stateFHTTK dazu nutzen kann, scheitere aber an dem Punkt, sobald mehrere Fensterkontakte und Stellventile pro Raum im Einsatz sind.

foreach my $dev (sort keys %defs) {
if($defs{$dev}{chanNo} eq "03" && $defs{$dev}{TYPE} eq "CUL_HM") {
my $devState = ReadingsVal($defs{$dev}{NAME},"trigLast","");
if($devState =~ "/open/i") {
$state = "open";
$cOpen++;
} elsif ($devState =~ "/closed/i") {
$cClosed++;
} else {
$cUnknown++
}
$c++;
}
}


Kann mir hierbei jemand helfen?

Vielen Dank

stromer-12

Meine Fensterkontakte schalten nicht direkt die Thermostate, sondern ich simuliere in FHEM per virtuellen Device die Fensterkontakte. Dadurch kann ich zB. auch die Heizung verzögert ansteuern, habe aber trotzdem sofort den Fensterstatus.
FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

MarkOtti

Hallo zusammen,

vorerst Danke an stromer-12 für den Hinweis. Die Idee hatte ich auch schon, habe aber nach einer Lösung gesucht, die soviel Autonomie wie möglich erhält, falls FHEM mal ausfällt. Daher ist es Absicht, dass die Stellventile direkt auf die Fensterkontakte reagieren, ohne das FHEM dazwischenfunkt.

Habe mein Script in FHEM jetzt wie folgt angepasst:

sub checkControlMode() {
  my $name            = "checkControlMode";
  my $controlMode     = "auto";
  my $oldControlMode  = ReadingsVal("ControlMode","state","auto");
  my $NetworkState   = ReadingsVal("NetworkState","state","present");
  my $WeatherState    = ReadingsVal("WeatherState","state","cold");
  my $cmdret;
  my $devState;
  my $dev;
  my @WindowRecPeers;
  my $WindowRecState;
  my $Peer;
  my $WindowRecDev;
  my $command;
  if($NetworkState eq "absent") {
    $controlMode = "night";
  }
  if($WeatherState eq "warm") {
    $controlMode = "night";
  }
  Log 3, "checkControlMode: old controlMode ($oldControlMode), new controlMode ($controlMode)";
  if($oldControlMode ne $controlMode) {
    Log 1, "checkControlMode: change ControlMode from $oldControlMode to $controlMode";
    $cmdret = CommandSet(undef, "ControlMode $controlMode");
  } else {
    Log 3, "checkControlMode: controlMode haven´t to be changed";
  }
  foreach $dev (sort keys %defs) {
    if($defs{$dev}{chanNo} eq "04" && $defs{$dev}{TYPE} eq "CUL_HM")  {
      $WindowRecDev   = $defs{$dev}{device}."_WindowRec";
      @WindowRecPeers = split(",", ReadingsVal($WindowRecDev,"peerList",""));
      $WindowRecState = "closed";
      foreach $Peer (@WindowRecPeers) {
        if (ReadingsVal($Peer,"state","closed") ne "closed") {
        $WindowRecState = "open";
      }
      }
      if($WindowRecState eq "closed") {
    $command = $defs{$dev}{NAME}." controlMode ".$controlMode;
        $cmdret = CommandSet(undef, $command);
      Log 1, "checkControlMode: $command";
      }
    }
  }
}


Diese wird durch einen notify Eintrag aufgerufen:

define notifyControlMode notify NetworkState|WeatherState { checkControlMode() }

Ich weiß, der Programmierer vor dem Herrn werde ich mit diesem Script nicht, aber es funktioniert.

Jetzt habe ich aber noch folgendes Problem. Erweitere ich das notify um die desired-temp der Stellventile, endet das in einer Endlosschleife, da dieses Script ja auch eine Änderung der desired-temp bewirkt.

Hat noch jemand eine Idee, wie ich dieses Script nur ausführen lassen kann, wenn die Programmierung des Stellventils die desired-temp verändert?

bommel-bs

Hallo MarkOtti,

ich senke die Solltemperatur auch an meinen Heizkörpern ab, wenn die Außentemperatur über 20 °C ist. Dafür habe ich ein notify, welches einen virtuellen Fensterkontakt schalten. Diesen virtuellen Fensterkontakt habe ich mit jedem Thermometer gekoppelt.

define SommerTemp notify Temp_outside:temperature:.* {\
my $outTemp = ReadingsVal("Temp_outside", "temperature", "0");;\
        my $lastStatus = ReadingsVal("SommerTemp","lastStatus","-");;\
        my $endtime = AttrVal("SommerTemp","endtime","-");;\
        my $aktStatus = "";;\
if ( $outTemp > 20 ) { \
                $aktStatus = "open";;\
}\
else { \
                $aktStatus = "closed";;\
}\
        Log 4, ("SommerTemp - aktStatus: $aktStatus");;\
        Log 4, ("SommerTemp - endtime: $endtime");;\
        if (( $lastStatus ne $aktStatus ) && ($hour < $endtime)) {\
             fhem("setreading SommerTemp lastStatus $aktStatus");;\
             fhem ("set virtualWeatherDoor postEvent $aktStatus");;\
             fhem ("setreading SommerTemp $aktStatus 1");;\
             Log 2, ("SommerTemp - set virtualWeatherDoor postEvent $aktStatus");;\
        }\
}\


Das hat den Vorteil, das ich mir keine Zustände der einzelnen Ventile merken muß. Ich merke mir nur einmal den Zustand des virtuellen Fensterkontaktes. Das klappt auch mit den Fensterkontakten, die ich bei einigen Thermostaten im Einsatz habe.

Gruß
Stefan