Luftbefeuchter automatisch steuern

Begonnen von yetiman, 15 Dezember 2014, 22:08:16

Vorheriges Thema - Nächstes Thema

yetiman

Hallo an alle,

wir haben bei uns im Winter immer wieder das Problem, dass die Luftfeuchtigkeit sehr gering ist.
Deshalb habe ich mir einen simplen Luftbefeuchter gekauft, diesen in eine simple Intertechno Steckdose gesteckt und steuere diesen nun über FHEM.
Die aktuelle/tatsächliche Luftfeuchtigkeit wird über ein Homematic Wandthermostat gemessen und je nach Wert wird der Luftbefeuchter eingeschaltet.

Über das Sonos Modul wird durchgesagt, wenn irgendetwas "passiert"...

Das Ganze ist ein wenig komplexer geworden und nahezu komplett über einen Dummy konfigurierbar.
Vielleicht kann sich jemand davon ja ein paar Ideen holen ;-)

Falls Fragen, gerne.


#########################################################################
## EG Humidity
#########################################################################
define NTFY_Humidity_EG notify wz_wandthermostat_Climate:* {CheckHumidity('AutoHumidityControl')}
attr NTFY_Humidity_EG room System
#########################################################################
define AutoHumidityControl dummy
attr AutoHumidityControl userattr humidityThreshold humidityThresholdTop humidityControl:on,off humidityWaitSecBeforeOnAgain DebugMe:on,off SonosAnnouncement:on,off SonosPlayer SonosVolume HumidifierDevice
attr AutoHumidityControl DebugMe on
attr AutoHumidityControl HumidifierDevice eg_steckdose_befeuchter
attr AutoHumidityControl SonosAnnouncement off
attr AutoHumidityControl SonosPlayer Sonos_Esszimmer
attr AutoHumidityControl SonosVolume 30
attr AutoHumidityControl alias Autom. Luftbefeuchtung
attr AutoHumidityControl fm_type state
attr AutoHumidityControl group 18 Luftbefeuchtung EG
attr AutoHumidityControl humidityThreshold 43
attr AutoHumidityControl humidityThresholdTop 45
attr AutoHumidityControl humidityWaitSecBeforeOnAgain 1200
attr AutoHumidityControl room EG
attr AutoHumidityControl sortby 20
#########################################################################
define GlobalHumidityControl dummy
attr GlobalHumidityControl alias Auto Luftbefeuchtung
attr GlobalHumidityControl devStateIcon on:control_on_off:off off:control_home:on
attr GlobalHumidityControl fm_type state,onbutton,offbutton
attr GlobalHumidityControl group 18 Luftbefeuchtung EG
attr GlobalHumidityControl room EG
attr GlobalHumidityControl setList on:noArg off:noArg
attr GlobalHumidityControl sortby 10
attr GlobalHumidityControl webCmd on:off
#########################################################################
define AT_GlobalHumidityControl_OFF at *23:00:00 {\
    fhem ("{Trigger_GlobalHumidityControl('off')}");;\
}
define AT_GlobalHumidityControl_ON at *10:00:00 {\
    fhem ("{Trigger_GlobalHumidityControl('on')}");;\
}
#########################################################################
define NTFY_GlobalHumidityControl notify GlobalHumidityControl { fhem "{Trigger_GlobalHumidityControl('$EVENT')}" }




99_myUtils.pm
sub CheckHumidity($){
my ($dummyDevice) = @_; #Call like CheckHumidity('dummyName') - The Dummy holds all values
    #User Attributes
    my $DebugMe = AttrVal($dummyDevice,'DebugMe','off');
    my $humidityThreshold = AttrVal($dummyDevice,'humidityThreshold','43');
my $humidityThresholdTop = AttrVal($dummyDevice,'humidityThresholdTop','45');
    my $humidityWaitSecBeforeOnAgain = AttrVal($dummyDevice,'humidityWaitSecBeforeOnAgain','1200');
    my $SonosAnnouncement = AttrVal($dummyDevice,'SonosAnnouncement','off');
    my $SonosPlayer = AttrVal($dummyDevice,'SonosPlayer','Sonos_Esszimmer');
    my $SonosVolume = AttrVal($dummyDevice,'SonosVolume','35');
    my $HumidifierDevice = AttrVal($dummyDevice,'HumidifierDevice','');
   
    #Readings
my $humidityControl = ReadingsVal($dummyDevice,"humidityControl","");
    my $currentHumidity = ReadingsVal("wz_wandthermostat_Climate","humidity","");
    my $oldHumidity = ReadingsVal($dummyDevice,"currentHumidity",""); #Get the current Humidity Value from Dummy Device
    my $Residents = ReadingsVal("rgr_Residents","presence","absent");
    my $GlobalHumidityControl = ReadingsVal("GlobalHumidityControl","state","off");
   
    #Set Readings into Dummy Device
    CommandSetReading(undef, "$dummyDevice oldHumidity $oldHumidity");
CommandSetReading(undef, "$dummyDevice currentHumidity $currentHumidity");
   
   
    # First time ONLY, set $humidityControl
    if ($humidityControl eq ''){
    CommandSetReading(undef, "$dummyDevice humidityControl off");
    }
   
    if ($GlobalHumidityControl eq 'on'){
if ($currentHumidity < $humidityThreshold){
if ($DebugMe eq 'on'){Log 0, "DEBUG HUMIDITY: Humidity $currentHumidity under Threshold $humidityThreshold."}; #DEBUG Logging

if ($humidityControl eq 'off'){
if ($DebugMe eq 'on'){Log 0, "DEBUG HUMIDITY: HumidityControl is off at the moment."}; #DEBUG Logging

if (time-time_str2num(ReadingsTimestamp($dummyDevice,'humidityControl','')) >= $humidityWaitSecBeforeOnAgain ){
if ($DebugMe eq 'on'){Log 0, "DEBUG HUMIDITY: More than $humidityWaitSecBeforeOnAgain seconds passed. I will switch HumidityControl to ON."}; #DEBUG Logging

#NOW we have to set everything ON...
CommandSetReading(undef, "$dummyDevice humidityControl on");
if ($HumidifierDevice ne ''){ fhem ("set $HumidifierDevice on")}; # Set Device to ON

#Announcements
if ($Residents eq 'present'){
if ($SonosAnnouncement eq 'on'){ fhem ("set $SonosPlayer Speak $SonosVolume de Eine Luftfeuchtigkeit von $currentHumidity wurde gemessen. Ich schalte den Luftbefeuchter an.")};
}
fhem ("set pushmsgIngo msg 'Humidity' 'Unter Threshold von $humidityThreshold UND länger als $humidityWaitSecBeforeOnAgain aus. current: $currentHumidity / old: $oldHumidity'");

} else {
if ($DebugMe eq 'on'){Log 0, "DEBUG HUMIDITY: Humidity is not ok, but HumidityControl is OFF no longer than $humidityWaitSecBeforeOnAgain seconds."}; #DEBUG Logging
}   
} else {
if ($DebugMe eq 'on'){Log 0, "DEBUG HUMIDITY: Nothing to do, HumidityControl is already $humidityControl"}; #DEBUG Logging
}
} elsif ($currentHumidity >= $humidityThreshold){
if ($DebugMe eq 'on'){Log 0, "DEBUG HUMIDITY: Humidity is ok at the moment ($currentHumidity)"}; #DEBUG Logging

if ($humidityControl eq 'on' && $currentHumidity >= $humidityThresholdTop){
if ($DebugMe eq 'on'){Log 0, "DEBUG HUMIDITY: I will set HumidityControl to OFF for now."}; #DEBUG Logging

#NOW we have to set everything OFF...
CommandSetReading(undef, "$dummyDevice humidityControl off");
if ($HumidifierDevice ne ''){ fhem ("set $HumidifierDevice off")}; # Set Device to OFF

#Announcements
if ($Residents eq 'present'){
if ($SonosAnnouncement eq 'on'){ fhem ("set $SonosPlayer Speak $SonosVolume de Die Luftfeuchtigkeit liegt jetzt bei $currentHumidity und ist damit okay. Ich schalte den Luftbefeuchter aus.")};
}
fhem ("set pushmsgIngo msg 'Humidity' 'Ist jetzt ok. Habe ausgeschaltet! current: $currentHumidity / old: $oldHumidity.'");

} else {
if ($DebugMe eq 'on'){Log 0, "DEBUG HUMIDITY: Nothing to do, HumidityControl is already $humidityControl"}; #DEBUG Logging
}

}
}

#Last but not least. set current Status into dummy device...
my $HumidityControlStatus = ReadingsVal($dummyDevice,"humidityControl","off");
fhem ("set $dummyDevice $HumidityControlStatus / current: $currentHumidity / old: $oldHumidity");
}


sub Trigger_GlobalHumidityControl($){
my ($newStatus) = @_; #on or off
    my $DebugMe = AttrVal('AutoHumidityControl','DebugMe','off');
my $SonosPlayer = AttrVal('AutoHumidityControl','SonosPlayer','Sonos_Esszimmer');
    my $SonosVolume = AttrVal('AutoHumidityControl','SonosVolume','35');
    my $GlobalHumidityControl = ReadingsVal("GlobalHumidityControl","state","off");
   
    if ($DebugMe eq 'on'){Log 0, "DEBUG Trigger_GlobalHumidityControl: Trigger Value $newStatus"}; #DEBUG Logging
   
if ($newStatus eq 'on'){
    if ($GlobalHumidityControl ne 'on'){
fhem ("set GlobalHumidityControl on");
fhem ("set pushmsgIngo msg 'Humidity EG' 'Ich übernehme jetzt wieder die Steuerung des Luftbefeuchters.'");
fhem ("set $SonosPlayer Speak $SonosVolume de Ich übernehme jetzt wieder die Steuerung des Luftbefeuchters.");
        }
    } elsif ($newStatus eq 'off'){
if ($GlobalHumidityControl ne 'off'){
my $HumidifierDevice = AttrVal('AutoHumidityControl','HumidifierDevice','');

CommandSetReading(undef, "AutoHumidityControl humidityControl off");
fhem ("set AutoHumidityControl off");

fhem ("set GlobalHumidityControl off");
fhem ("set $HumidifierDevice off");
fhem ("set pushmsgIngo msg 'Humidity EG' 'Die automatische Steuerung des Luftbefeuchters wurde ausgeschaltet.'");
fhem ("set $SonosPlayer Speak $SonosVolume de Die automatische Steuerung des Luftbefeuchters wurde ausgeschaltet.");
}
    }
}


Ingo

Bennemannc

Hallo,

also ich bin da eher jemand, der es sich einfach machen möchte. Also hätte ich THRESHOLD genommen zum Schalten. Wenn zu bestimmten Zeiten nichts passieren soll, wird der Threshold einfach über at enabled oder disabled. Wenn dazu noch eine Ansage gemacht werden soll, hätte ich das mit einem Notify gelöst.

Gruß Christoph
Cubietruck, Fhem 5.8
CC-RT-DN|LC-SW2-FM|RC-12|RC-19|LC-SW4-BA-PCB|LCp-SW1-BA-PCB|ES-PMSw1-Pl|LC-Bl1PBU-FM|PBI-4-FM|CC-VD|CC-TC|SEC-SC(2)|RC-KEY3-B|LC-Sw1PBU-FM|PB-2-FM|WDS100-C6-O|WDC7000|LC-Bl1-FM
Module: Dewpoint,FB_Callmonitor,HCS,Panstamp,at,notify,THRESHOLD,average,DOIF

yetiman

@justus: Ich habe mir den hier gekauft und bin soweit zufrieden damit :-)
http://www.amazon.de/Medisana-60065-UHW-Luftbefeuchter/dp/B0047O0LKE/ref=sr_1_1?ie=UTF8&qid=1425238374&sr=8-1&keywords=luftbefeuchter

@Christoph: Ja, wenn ich Threshold damals gekannt hätte, hätte ich das warscheinlich auch gemacht.
Allerdings kann ich mit dieser Lösung sehr schön im Webfrontend meine Einstellungen vornehmen ;-)