Ich habe an den Fenstern des Untergeschosses ReedRelais aus früheren Zeiten, die bereits verkabelt waren und nun als Fensterkontakte dienen sollen. Die Signale werden auf einen DS2408 geschaltet, der über einen DS2482-800 (I2C-1Wire-Bridge) mittels I2C am BananaPi angeschlossen ist, auf dem FHEM läuft. Alles okay. Ob Fenster geschlossen oder geöffnet ist kann leicht mit folgendem Code festgestellt werden:
fhem.cfg:
...
define OpenWinDoorDummy dummy
define RRuDS2408 OWDevice 29.86xxxxxxxxx 2
attr RRuDS2408 IODev OWSERVER
attr RRuDS2408 model DS2408
attr RRuDS2408 room OWDevice
define notity.RRuDS2408 notify RRuDS2408:sensed.* { evtHandlerWindowInformer($NAME,$EVENT);; }
...
Funktion in 99_myUlils.pm:
sub
evtHandlerWindowInformer($$)
{
my $Component = shift;
my $State = shift;
my $OnOff = " ";
my $idx = 0;
my $win = " ";
my $value = " ";
my @def = ("KochF","HausD","SchuppenD","GarageD","BadF","WohnFL","WohnFR","WohnFV");
if (substr($State, 0, 6) eq "sensed") {
$idx = int(substr($State, 7, 1));
$value = substr($State, 10, 1);
$OnOff = ($value eq '1' ? 'on' : 'off');
$win = $def[$idx];
fhem('setreading OpenWinDoorDummy '.$win.' '.$OnOff);
}
}
Auswertung mit TabletUI einwandfrei, reagiert schnell und zuverlässig. Man hätte das sicherlich auch mit readingProxys machen können, aber die Schreibarbeit schien mir hier das Minimum zu sein.
Nun möchte ich aber gern die 6 Fensterkontakte mit den 6 Heizkörperthermostaten "peeren", d.h. Heizung aus, wenn Fenster auf ist und zurück, wenn Fenster wieder geschlossen ist. Ich finde aber beim Suchen nur was mit den originalen Fensterkontakten.
Kann mir da mal jemand einen Hinweis geben wie ich vorgehen kann? Vielleicht könnte das gleich in der Funktion geschehen? Wenn "off", dann Heizventil zu und wenn "on", dann alte Temp. Wie könnte das genau aussehen?
such mal nach virtuellen fensterkontakten (fk) bei homematik.
Zitat von: manne44 am 05 Februar 2016, 12:45:33
Kann mir da mal jemand einen Hinweis geben wie ich vorgehen kann? Vielleicht könnte das gleich in der Funktion geschehen? Wenn "off", dann Heizventil zu und wenn "on", dann alte Temp. Wie könnte das genau aussehen?
Wenn du es in der Funktion machen willst, würde ich mir noch ein "@def2" machen, mit den Namen der dazugehörigen Thermostaten. Bei den Türen einen Leerstring. Wenn das Fenster geöffnet wurde, schickst du an das Thermostat ein "controlManu off", wenn es geschlossen wurde ein "controlMode auto". Vorher prüfen, ob es kein Leerstring ist. So in der Art mache ich das auch.
Vielen Dank für die Antworten.
@Deudi: Genauso wollte ich es auch machen, aber ich habe die Befehle für das Einschalten und Ausschalten des Auto-Modus nicht gekannt. Steht zwar in der Commandref, aber auch extrem kurz. Vielen Dank, nun ist alles paletti.
Hallo,
abschließend nochmal der vollständige Code, wobei der Winterbetrieb noch nicht berücksichtigt ist, denn im Sommer muß das Thermostat nicht "arbeiten" (Batterie). Damit nur bei Änderungen die Funktion aufgerufen wird das "event-on-change-reading" und wenn ein Fenster im Wohnzimmer geöffnet wird, dann alle beiden Thermostate ausschalten.
In der fhem.cfg:
define OpenWinDoorDummy dummy
define RRuDS2408 OWDevice 29.00000000000 2
attr RRuDS2408 IODev OWSERVER
attr RRuDS2408 model DS2408
attr RRuDS2408 room OWDevice
attr RRuDS2408 event-on-change-reading sensed.*
define notity.RRuDS2408 notify RRuDS2408:sensed.* { evtHandlerWindowInformer($NAME,$EVENT);; }
und in der 99_myUtil.pm:
sub
evtHandlerWindowInformer($$)
{
my $Component = shift;
my $State = shift;
my $OnOff = " ";
my $idx = 0;
my $value = " ";
my @def = ("KochF","HausD","SchuppenD","GarageD","BadF","WohnFL","WohnFR","WohnFV");
my @term = ("KochT_Clima","","","","BadT_Clima","-","-","-");
if (substr($State, 0, 6) eq "sensed") {
$idx = int(substr($State, 7, 1));
$value = substr($State, 10, 1);
$OnOff = ($value eq '1' ? 'on' : 'off');
fhem('setreading OpenWinDoorDummy '.$def[$idx].' '.$OnOff);
# ToDo: Nur bei Winterbetrieb wenn Heizung an ist
if ($term[$idx] ne "") { # keine Tür
if ($value eq '1') { # Fenster geöffnet
if ($term[$idx] eq "-") {
{fhem ('set WohnTR_Clima controlManu off');}
{fhem ('set WohnTL_Clima controlManu off');}
} else {
{fhem ('set '.$term[$idx].' controlManu off');}
}
} else {
if ($term[$idx] eq "-") {
{fhem ('set WohnTR_Clima controlMode auto');}
{fhem ('set WohnTL_Clima controlMode auto');}
} else {
{fhem ('set '.$term[$idx].' controlMode auto');}
}
}
}
Vielen Dank nochmals für die Hilfe.