Ich poste es doch mal. Es läuft seit über einem Jahr auch stabil - meine generische Funktion für die myUtils.pm , die diverse Readings zum Thema Lüften für alle Räume mit Homematic-Thermostaten generiert. Es wird auch automatisch berücksichtigt, ob der Raum nen CO2- und/oder VOC-Sensor hat und ob "Sommermodus" (=Wohnung möglichst kühlen) oder "Heizmodus" (=Normalbetrieb) herrscht, was ich 2x im jahr über einen Dummy einstelle.
Vielleicht kannst du da ja ggf. interessante Regeln draus ableiten. Ist eigentlich selbsterklärend benannt.
sub calcLueftungsStates($$) {
my ($NAME,$EVENT) = @_;
if (!($NAME =~ /.*floorplan.*/)) {
##### Daten sammeln
my $room;
my $badOben = ($NAME =~ /.*bad.oben.*/);
my $badUnten = ($NAME =~ /.*bad.unten.*/);
my $schlafzimmer = ($NAME =~ /.*schlafzimmer.*/);
my $wohnzimmer = ($NAME =~ /.*(wohnzimmer|stube).*/);
my $kueche = ($NAME =~ /.*(kueche).*/);
my $flur = ($NAME =~ /.*(flur|abstell).*/);
my $kinderzimmer = ($NAME =~ /.*(kinderzimmer).*/);
if ($badOben) {$room = 'bad.oben';}
if ($badUnten) {$room = 'bad.unten';}
if ($schlafzimmer) {$room = 'schlafzimmer';}
if ($wohnzimmer) {$room = 'stube';}
if ($kueche) {$room = 'kueche';}
if ($flur) {$room = 'flur';}
if ($kinderzimmer) {$room = 'kinderzimmer';}
my $thermostat = "$room.wandthermostat_Weather";
my $innenTemp=ReadingsVal($thermostat,"temperature",15);
my $innenHum =ReadingsVal($thermostat,"humidity",90);
my $aussenTemp=ReadingsVal("wohnung.aussenthermometer","temperature",0);
my $aussenHum =ReadingsVal("wohnung.aussenthermometer","humidity","100");
my $heizModus = ReadingsVal("wohnung.heizmodus","state","aus");
my $fenster1 = ReadingsVal("$room.fenster","state","none");
my $fenster2 = ReadingsVal("$room.fenster2","state","none");
my $co2 = ReadingsVal("$room.co2","co2",0);
my $voc = ReadingsVal("$room.raumluft","voc",0);
##### Neu berechnete Werte
my $etwasOffen = (($fenster1 eq "open") || ($fenster2 eq "open"));
my $wandTemp = wallSurfaceTemp($innenTemp,$aussenTemp,0.68);
my $wandHumidity = shiftRelHumidity($innenTemp, $innenHum, $wandTemp);
my $aussenHumidityEqInnen = shiftRelHumidity($aussenTemp, $aussenHum, $innenTemp);
my $schimmelfreiMaxHum = schimmelfreiMaxHum($wandTemp);
my $schimmelGefahr = ($wandHumidity > $schimmelfreiMaxHum);
my $luftZuTrocken = (!$schimmelGefahr && ($innenHum < 40));
my $lueftenSenktLuftfeuchte = ($innenHum > $aussenHumidityEqInnen);
my $entfeuchterAn = ($schimmelGefahr && ($innenHum > 51)) && !$etwasOffen;
my $entfeuchterAus = (($wandHumidity < ($schimmelfreiMaxHum - 3)) || ($innenHum < 50)) || $etwasOffen;
my $luftfeuchteOeffnenEmpfohlen = ($schimmelGefahr && $lueftenSenktLuftfeuchte) || ($luftZuTrocken && !$lueftenSenktLuftfeuchte);
my $luftfeuchteSchliessenEmpfohlen = ($schimmelGefahr && !$lueftenSenktLuftfeuchte) || ($luftZuTrocken && $lueftenSenktLuftfeuchte);
my $kuehlenUeberTemp = 23;
if ($badOben) {
$kuehlenUeberTemp = 25;
} elsif ($badUnten) {
$kuehlenUeberTemp = 25;
} elsif ($schlafzimmer) {
$kuehlenUeberTemp = 22.5;
} elsif ($wohnzimmer) {
$kuehlenUeberTemp = 23;
} elsif ($kueche) {
$kuehlenUeberTemp = 24;
} elsif ($kinderzimmer) {
$kuehlenUeberTemp = 23;
}
my $kuehlenAufTemp = 21;
if ($badOben) {
$kuehlenAufTemp = 22;
} elsif ($badUnten) {
$kuehlenAufTemp = 20;
} elsif ($schlafzimmer) {
$kuehlenAufTemp = 21.5;
} elsif ($wohnzimmer) {
$kuehlenAufTemp = 21.5;
} elsif ($kueche) {
$kuehlenAufTemp = 20;
} elsif ($kinderzimmer) {
$kuehlenAufTemp = 21;
}
my $tempOeffnenEmpfohlen = ( (($heizModus eq "Kühlen") && ($innenTemp > $aussenTemp) && ($innenTemp > $kuehlenUeberTemp))
|| (($heizModus eq "Heizen") && ($innenTemp < $aussenTemp))
) ;
my $tempSchliessenEmpfohlen = ( (($heizModus eq "Kühlen") && (
(($innenTemp < $aussenTemp) && ($innenTemp > $kuehlenUeberTemp))
|| (($innenTemp > $aussenTemp) && ($innenTemp < $kuehlenAufTemp))
)
)
|| (($heizModus eq "Heizen") && ($innenTemp > $aussenTemp))
);
my $luftgueteSensorVorhanden = (($co2 ne '0') || ($voc ne '0'));
my $luftgueteOeffnenEmpfohlen = ((($co2 > 1500) || ($voc > 2000)) && $luftgueteSensorVorhanden);
my $luftgueteSchliessenEmpfohlen = (($co2 < 600) && ($voc < 700) && $luftgueteSensorVorhanden);
my $schliessenEmpfohlen;
if ($luftgueteSchliessenEmpfohlen || !$luftgueteSensorVorhanden) {
if ($luftfeuchteSchliessenEmpfohlen && $tempSchliessenEmpfohlen) {
$schliessenEmpfohlen = true;
} elsif (!$luftfeuchteSchliessenEmpfohlen && !$tempSchliessenEmpfohlen) {
$schliessenEmpfohlen = false;
} else {
if (!$luftfeuchteOeffnenEmpfohlen && !$tempOeffnenEmpfohlen) {
$schliessenEmpfohlen = true;
} else {
if ( ($luftfeuchteSchliessenEmpfohlen && ($heizModus eq "Heizen"))
|| ($tempSchliessenEmpfohlen && ($heizModus eq "Kühlen"))
) {
$schliessenEmpfohlen = true;
} else {
$schliessenEmpfohlen = false;
}
}
}
} else {
$schliessenEmpfohlen = false;
}
my $oeffnenEmpfohlen = (($luftfeuchteOeffnenEmpfohlen || $luftgueteOeffnenEmpfohlen || $tempOeffnenEmpfohlen) && !$schliessenEmpfohlen) ;
my $fenster1richtig = (($fenster1 eq "closed") && $schliessenEmpfohlen) || ($etwasOffen && $oeffnenEmpfohlen) || (!$oeffnenEmpfohlen && !$schliessenEmpfohlen);
my $fenster2richtig = (($fenster2 eq "closed") && $schliessenEmpfohlen) || ($etwasOffen && $oeffnenEmpfohlen) || (!$oeffnenEmpfohlen && !$schliessenEmpfohlen);
##### Alle sinnvollen Werte als Readings setzen
fhem("setreading $thermostat wandTemp ".sprintf("%.1f", $wandTemp));
fhem("setreading $thermostat wandHumidity ".sprintf("%.0f", $wandHumidity));
fhem("setreading $thermostat aussenHumidityEqInnen ".sprintf("%.0f", $aussenHumidityEqInnen));
fhem("setreading $thermostat schimmelfreiMaxHum ".sprintf("%.0f", $schimmelfreiMaxHum));
fhem("setreading $thermostat schimmelGefahr ".($schimmelGefahr?"ja":"nein"));
fhem("setreading $thermostat oeffnenEmpfohlen ".($oeffnenEmpfohlen?"ja":"nein"));
fhem("setreading $thermostat schliessenEmpfohlen ".($schliessenEmpfohlen?"ja":"nein"));
fhem("setreading $thermostat luftfeuchteOeffnenEmpfohlen ".($luftfeuchteOeffnenEmpfohlen?"ja":"nein"));
fhem("setreading $thermostat luftfeuchteSchliessenEmpfohlen ".($luftfeuchteSchliessenEmpfohlen?"ja":"nein"));
fhem("setreading $thermostat luftgueteOeffnenEmpfohlen ".($luftgueteOeffnenEmpfohlen?"ja":"nein"));
fhem("setreading $thermostat luftgueteSchliessenEmpfohlen ".($luftgueteSchliessenEmpfohlen?"ja":"nein"));
fhem("setreading $thermostat tempOeffnenEmpfohlen ".($tempOeffnenEmpfohlen?"ja":"nein"));
fhem("setreading $thermostat tempSchliessenEmpfohlen ".($tempSchliessenEmpfohlen?"ja":"nein"));
fhem("setreading $thermostat fenster1richtig ".($fenster1richtig?"ja":"nein"));
if ($fenster2 ne "none") {
fhem("setreading $thermostat fenster2richtig ".($fenster2richtig?"ja":"nein"));
}
if ($entfeuchterAn) {
fhem("setreading $thermostat entfeuchter an");
} elsif ($entfeuchterAus) {
fhem("setreading $thermostat entfeuchter aus");
}
}
}