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>TSpeek){ string Gerwazy = "BidCos-RF.MEQ0276857:1"; var GerwazyG= dom.GetObject("Gerwazy glosnosc").Variable(); dom.GetObject(Gerwazy#".SUBMIT").State(GerwazyG#",1,108000,6"); } } }
Czym mierzysz wilgotność w łazienkach ?
Też za pomocą termostatów pokojowych ?
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.
Czy są jakieś anglojęzyczne źródła do nauki pisania skryptów ?
Niestety nie. Też nie lubię barbarzyńskiego 😉
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
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.