Mój HomeMatic

Blog opisujący moją przygodę z HomeMatic

Wilgoć w łazience

Dla ludzi, którzy nigdy nie próbowali rozwiązać problemu wilgoci w łazience zadanie może wydawać się banalne. Tak przynajmniej było ze mną. Teoretycznie wystarczy wietrzenie, podgrzanie łazienki, ręczne włączenie wyciągu, założenie wentylatora z czujnikiem wilgotności.
Niestety każde z tych rozwiązań  ma swoje wady. Najkorzystniejszy wydaje się być wentylator z czujnikiem wilgotności. Nic jednak w tym bardziej mylnego. Wilgotność w pomieszczeniu zależna jest także od czynników zewnętrznych takich jak mróz czy opady atmosferyczne. Generalnie podczas zimy wilgotność powietrza jest bardzo niska –  woda  w powietrzu „zamarza” stąd mniejsza wilgotność, zaś tuż przed burzą wilgotność może gwałtownie wzrosnąć. Stosowanie czujnika wilgotności mija się zupełnie z celem gdyż w okresie zimowym taki wentylator z czujnikiem może w ogóle się nie włączyć zaś latem w trakcie opadów może pracować długo bez większych skutków gdyż powietrze zasysane do łazienki z zewnątrz jest i tak bardzo wilgotne.

Rozwiązaniem idealnym jest kalkulacja punktu rosy. Problem jednak polega na tym, że punkt rosy należałoby wyliczać dla…. wszystkich elementów występujących w łazience. Oczywiście można by ograniczyć ilość przedmiotów do najchłodniejszych ale i tak oznaczałoby to, że dla tych wybranych należałoby robić pomiar temperatury aby zobaczyć, czy nie został przekroczony punkt rosy (np. dla ścian, okien, narożników pomieszczenia). Jest to raczej nierealne. Co prawda widziałem projekt gdzie ktoś zrobił pomiar ścian pirometrem przy różnych temperaturach zewnętrznych dzięki czemu powstała swoista „mapa zależności temperaturowych”, dzięki której w oparciu o temperaturę zewnętrzną mógł sprawdzać teoretycznie temperaturę okna i ściany zewnętrznej ale sam wykonałem to inaczej.

Rozwiązaniem, które zastosowałem u siebie jest pomiar różnicy wilgotności pomiędzy łazienką a pozostałymi pomieszczeniami. Wyliczam średnią wilgotność z pozostałych pomieszczeń i porównuję ją z wilgotnością w łazience. To powoduje, że wentylator pracuje zawsze wtedy gdy jest taka potrzeba niezależnie od tego czy wilgotność ogólna (poza łazienką) wynosi 30% (zima) czy 60% (latem) podczas opadów deszczu.

Do pomiaru wilgotności wykorzystałem dane pochodzące z termostatów pokojowych HM-TC-IT-WM-W-EU z systemu grzewczego oraz regulator ściemniacz HM-LC-Dim2T-SM, który posłużył do regulacji obrotów dwóch wentylatorów.

Przy budowie założeń przyjąłem, że wzrost różnicy wilgotności o 10% oznacza konieczność uruchomienia wentylatora. Do tego przygotowałem dwie zmienne systemowe „Wilgotnosc procent G” oraz „Wilgotnosc procent D” do których zapisuję wyliczone wartości gdzie „G” to łazienka górna a „D” dolna. Dodatkowo dwie zmienne „Osuszanie G” oraz „Osuszanie D”, do których zapisuję stan osuszania (włączone/wyłączone). Proces osuszania powoduje cykliczne włączanie wentylatorów na kilka minut. Po spadku wilgotności poniżej założonego progu proces osuszania jest wyłączany.

Ponieważ górna łazienka w okresie zimowym wykorzystywana jest jako suszarnia więc dodatkowo w górnej łazience po wykryciu wilgoci dłużej niż 30 minut podnoszona jest temperatura.
Skrypt uruchamiany jest cyklicznie co 3 minuty i wygląda on tak:

string Interface="BidCos-RF.";

!-- parter
string thermD1 = "NEQ0122503:"; !-- lazienkaD
string thermD2 = "MEQ0479456:"; !-- salon
string thermD3 = "MEQ0479440:"; !-- sypialnia
string thermD4 = "MEQ0479339:"; !-- dzieciecy

!-- pietro
string thermG1 = "MEQ0865128:"; !-- lazienkaG
string thermG2 = "MEQ0479457:"; !-- niebieski
string thermG3 = "MEQ0479332:"; !-- brazowy

!--wentylator
string Wentylator = "GEQ0210176:";

!-- wilgotnosc D
var WilgotnoscD = ((dom.GetObject(Interface#thermD1#"2.ACTUAL_HUMIDITY").Value()
/((dom.GetObject(Interface#thermD2#"2.ACTUAL_HUMIDITY").Value()
+dom.GetObject(Interface#thermD3#"2.ACTUAL_HUMIDITY").Value()
+dom.GetObject(Interface#thermD4#"2.ACTUAL_HUMIDITY").Value()
)/3))-1)*100;
var Wproc= dom.GetObject("Wilgotnosc procent");
Wproc.State(WilgotnoscD);

!-- wilgotnosc G
var WilgotnoscG = ((dom.GetObject(Interface#thermG1#"2.ACTUAL_HUMIDITY").Value()
/((dom.GetObject(Interface#thermG2#"2.ACTUAL_HUMIDITY").Value()
+dom.GetObject(Interface#thermG3#"2.ACTUAL_HUMIDITY").Value()
)/2))-1)*100;

var Wproc= dom.GetObject("Wilgotnosc procent G");
Wproc.State(WilgotnoscG);

!-- parametry D
var CNumber="1";
real WSmax=100.00; !-- maksymalna wartosc parametru
real WSmin=60.00; !-- minimalna wartosc parametru
real WPmax=25.00; !-- maksymalna wilgotnosc - gorny prog
real WPmin=10.00; !-- dolny prog zalaczenia
real WPminw=8.00; !-- dolny prog wylaczenia
real WWilgotnosc = 15;
real WCState=0.00;
real WState = 0.00;

WCState=dom.GetObject(Interface#Wentylator#CNumber#".LEVEL").Value();
var WCStatel= dom.GetObject("Osuszanie D");
var WCStatelv=WCStatel.Value();

if(WilgotnoscD>WPmax){
WState=1;
} else {
WState=((((WSmax-WSmin)/(WPmax-WPmin))*WilgotnoscD)+WSmin)/100;
}

if(WilgotnoscD>WPmin){
if(WCState<>WState){
dom.GetObject(Interface#Wentylator#CNumber#".RAMP_TIME").State(5);
dom.GetObject(Interface#Wentylator#CNumber#".LEVEL").State(WState);
if(WCStatelv==0){
WCStatel.State(1);
}
}
}

if(WilgotnoscD<WPminw){
if(WCStatelv>0){
dom.GetObject(Interface#Wentylator#CNumber#".RAMP_STOP").State(5);
dom.GetObject(Interface#Wentylator#CNumber#".LEVEL").State(0);
WCStatel.State(0);
}
}

!-- lazienka gorna
var CNumber="2";
real WSmax=100.00; !-- maksymalna wartosc parametru
real WSmin=50.00; !-- minimalna wartosc parametru
real WPmax=25.00; !-- maksymalna wilgotnosc - gorny prog
real WPmin=10.00; !-- dolny prog zalaczenia
real WPminw=8.00; !-- dolny prog wylaczenia
real WWilgotnosc = 15;
real WCState=0.00;
real WState = 0.00;
real WWTemp = 23.5; !-- temperatura dogrzewania
integer TWork=590; !-- czas pracy wentylatora
integer TSleep=1800; !-- czas przerwy wentylatora
integer TSpeek=14400; !-- czas po ktorym wywola komunikat o wysuszeniu (obecnie 4h)
integer WTime = system.Date("%Y-%m-%d %H:%M:%S").ToTime().ToInteger()-dom.GetObject("Osuszanie G").Timestamp().ToInteger();!-- czas wlaczonego osuszania
integer WTimeD=WTime-((WTime/(TWork+TSleep))*(TWork+TSleep)); !-- wTime modulo

WCState=dom.GetObject(Interface#Wentylator#CNumber#".LEVEL").Value();
var WCStatel= dom.GetObject("Osuszanie G");
var WCStatelv=WCStatel.Value();

if(WilgotnoscG>WPmax){
WState=1;
} else {
WState=((((WSmax-WSmin)/(WPmax-WPmin))*WilgotnoscG)+WSmin)/100;
}

if(WilgotnoscG>WPmin){
if(WCState<>WState){
dom.GetObject(Interface#thermG1#"2.SET_TEMPERATURE").State(WWTemp);
if(WCStatelv==0){
WCStatel.State(1);
dom.GetObject(Interface#Wentylator#CNumber#".RAMP_TIME").State(5);
dom.GetObject(Interface#Wentylator#CNumber#".LEVEL").State(WState);
} else {
if(WTimeD>(TSleep+TWork)){
!-- WCStatel.State(1); !-- odswiez czas zalaczenia osuszania
dom.GetObject(Interface#Wentylator#CNumber#".RAMP_TIME").State(5);
dom.GetObject(Interface#Wentylator#CNumber#".LEVEL").State(WState);    !-- wlacz ponownie went.
} else {
if(WTimeD>TWork){ !-- uspij wentylator
dom.GetObject(Interface#Wentylator#CNumber#".RAMP_STOP").State(5);
dom.GetObject(Interface#Wentylator#CNumber#".LEVEL").State(0);
}
}
}
}
}

if(WilgotnoscG<WPminw){
if(WCStatelv>0){
dom.GetObject(Interface#Wentylator#CNumber#".RAMP_STOP").State(5);
dom.GetObject(Interface#Wentylator#CNumber#".LEVEL").State(0);
dom.GetObject(Interface#thermG1#"2.AUTO_MODE").State(1);
WCStatel.State(0);
if(WTime&gt;TSpeek){
string  Gerwazy = "BidCos-RF.MEQ0276857:1";
var GerwazyG= dom.GetObject("Gerwazy glosnosc").Variable();
dom.GetObject(Gerwazy#".SUBMIT").State(GerwazyG#",1,108000,6");
}
}
}
Updated: 21 kwietnia 2018 — 01:13

6 komentarzy

Add a Comment
  1. Czym mierzysz wilgotność w łazienkach ?
    Też za pomocą termostatów pokojowych ?

    1. Tak. Oczywiście za pomocą termostatów pokojowych.

      Na marginesie – brak termostatów czyli próba mierzenia temperatury w pomieszczeniu tylko głowicą (tylko przy grzejniku) to błąd.

  2. Czy są jakieś anglojęzyczne źródła do nauki pisania skryptów ?

  3. Niestety nie. Też nie lubię barbarzyńskiego 😉

  4. Podoba mi się możliwośc pisania skryptu bo to w zasadzie czyni to urządzenie nieograniczonym. Czy jest w CCU3 jakieś narzędzie do śledzenia kodu, by móc analizować błędy kodu/składni? Czy da się krok po kroku prowadzić weryfikację. Zastanawiam się, na ile będzie to droga przez mękę a na ile producent przewidział debugger to takich analiz.
    Wklejam link witryny gdzie jest kod do wersji angielskiej, ale tłumaczonej z niemieckiego. https://homematic-forum.de/forum/viewtopic.php?t=45485

    1. Jest tylko prosta weryfikacja poprawności składni. Debuggera nie ma ale jest funkcja WriteLine i można sobie coś tam wyświetlić. Link do projektu znam no ale… to nieoficjalna wersja no i brak jest aktualizacji.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Mój HomeMatic © 2016 Frontier Theme