NAS zapala światło przed domem

Opisywałem ostatnio wydajny NAS QNAP HS-251+, który pojawił się w moim domu. Zadeklarowałem, że można będzie go użyć do sterowania systemami inteligentnego domu. Pora zweryfikować tę tezę i powierzyć mu na próbę jakieś zadanie. Od dawna chciałem, żeby światło przed domem zapalało się, gdy zrobi się ciemno. Teoretycznie do tego wystarczy zwykły czujnik zmierzchowy, ale to przecież byłoby zbyt proste. Poza tym sterowanie elektroniczne daje dużo większe możliwości. Opisywałem też bramkę IP – urządzenia bezprzewodowe, pozwalającą kontrolować urządzenia elektryczne z poziomu routera, komputera, telefonu czy systemu inteligentnego domu, choćby działającego na urządzeniu typu NAS. Pora połączyć dwa światy – HS-251+ i radiowe sterowanie, a potem przekonać się jak to się będzie sprawdzać w praktyce.

Conrad RSL - odbiorniki

Do realizacji tego zadania wybrałem system Conrad RSL. W pierwszej chwili chciałem użyć sterowanej radiowo oprawki do żarówki – RSLR2, co byłoby najprostsze. Niestety po wkręceniu „żarówki LED” do odbiornika i takiego zestawu do lampy przed domem, okazało się, że całość ledwo mieści się w oprawie i bardzo źle wygląda. Trzeba było wymyślić coś innego. Postanowiłem przetestować element, dla którego wybrałem właśnie system Conrad RSL – bezprzewodowy element przełączający, oznaczony numerem produktu 640553 (swoją drogą w oznaczeniach panuje lekki nieporządek). Czym się wyróżnia ten odbiornik? Po pierwsze małymi rozmiarami – jest na tyle niewielki, że daje się go umieścić w płytkich puszkach podtynkowych, mimo gąszczu przewodów, które się już tam znajdują. Ta sztuka u mnie nie udaje się z nieco większym urządzeniem, także przeznaczonym do montażu w puszkach. Co więcej, jeżeli pod tradycyjnym włącznikiem ściennym jest trochę luzu, to jest szansa, żeby go tam zainstalować. I tym sposobem dochodzimy do drugiej zalety tego miniaturowego odbiornika – nie wymaga przewodu neutralnego, którego w większości puszek z włącznikami po prostu nie ma.

Element przełączający 300W - Conrad RSL

Element przełączający podłącza się do przewodu fazowego (co oczywiste) i do przewodu biegnącego do zasilanego urządzenia. Czyli podłączamy go dokładnie tak samo jak tradycyjny włącznik (którego wersje z podświetlaniem też są zasilane w ten sam sposób). Tylko tyle i aż tyle. U konkurencji tego nie znalazłem. Urządzenie ma wyprowadzone dodatkowo dwa przewody, które po podłączeniu do zwykłego wyłącznika sprawiają, że światło będzie można włączać także w tradycyjny sposób – niezależnie od sterowania radiowego. Bardzo wygodne rozwiązanie. Do zalet tego odbiornika warto dodać jeszcze zapamiętywanie stanu przy wyłączeniu prądu (gdy przy zapalonym świetle odetniemy zasilanie i je przywrócimy, lampa nadal będzie świecić) i bezgłośną pracę (nie ma charakterystycznego odgłosu załączania przekaźnika).

Oczywiście są także pewne ograniczenia, ale na szczęście dla sterowania oświetleniem mało istotne. Maksymalna moc załączanego urządzenia musi być mniejsza niż 300W, co nie jest problem w dobie lamp LED. Istotne może być natomiast minimalne obciążenie – 5W. Moje oświetlenie przed domem mieści się w tych widełkach – jest bliskie dolnej granicy, co dość oczywiste, skoro chcę włączać je na całą noc…

Założenia i możliwości

Lampę chcę włączać gdy zacznie robić się ciemno. Czyli gdzieś między zachodem słońca a zmierzchem – powiedzmy w połowie między tymi dwoma czasami, które będziemy wyliczać dla konkretnego długości i szerokości geograficznej. Na razie chciałbym ją gasić o świcie, ale może uznam, że jakaś stała godzina będzie lepsza, ale wtedy należałoby ponownie zapalać światło gdy zadzwoni domofon. Na pewno w przyszłości lampę dołączę jako dodatkowy sygnalizator systemu alarmowego – będzie mrugać w przypadku wywołania alarmu.

Na razie jednak skupimy się na zapalaniu światła wieczorem i gaszeniu rano. Do realizacji od strony NAS wybrałem node.js, co dość naturalne, bo właśnie w oparciu o niego buduję swój system zarządzania inteligentnym domem.

Montaż i parowanie

Pilot systemu Conrad RSL

Montaż odbiornika był bardzo prosty. Zainstalowałem go w puszce z przewodami, gdzie bez większych problemów się zmieścił. Trzeba tylko uważać, żeby mały przycisk, znajdujący się na obudowie, nie był przez nic wciskany. Do montażu oczywiście wyłączyłem wcześniej prąd. Pewnie w tym miejscu należałoby ostrzec, że 230V to niebezpieczne napięcie, trzeba uważać, a jak się nie ma pewności, to lepiej nie ruszać a prace zlecić elektrykowi. Z prądem nie ma żartów.

Po przywróceniu zasilania układ jest przez pewien czas w trybie programowania. Wystarczyło więc nacisnąć wybrany przycisk włączania na pilocie, żeby został on przypisany do odbiornika. Oczywiście wcześniej kody odczytałem i zanotowałem, zgodnie z tym co pisałem przy projekcie bramki. Od tego momentu światło można włączać i wyłączać pilotem. Nie o to jednak nam chodzi, więc należy przejść do programowania.

Przygotowanie NASa

W pierwszej kolejności należy zainstalować Node.js w systemie operacyjnym NAS. Ponieważ system QTS, stosowany przez firmę QNAP jest bardzo intuicyjny, nikomu nie powinno sprawić to problemu. Wystarczy, po zalogowaniu na konto administratora, przejść do sekcji AppCenter, wybrać z listy narzędzia deweloperskie, odnaleźć na liście Node.js i kliknąć przycisk instaluj. System zajmie się instalacją oprogramowania, a w dziale moje aplikacje pojawi się odpowiednia ikona.

QTS AppCenter Nodejs

Pora zweryfikować działanie. Po zalogowaniu na konto admin przez ssh przechodzimy do katalogu /opt/node/bin i sprawdzamy wersję Node.js:

[/opt/node/bin] # ./node --version
v0.8.22

Nie jest najświeższa, ale w zupełności wystarcza. W razie czego można bez problemu zainstalować nowszą wersję. Niestety okazało się, że manager pakietów npm ma problem z uruchomieniem:

[/opt/node/bin] # ./npm
module.js:340
 throw err;
 ^
Error: Cannot find module 'npmlog'
 at Function.Module._resolveFilename (module.js:338:15)
 at Function.Module._load (module.js:280:25)
 at Module.require (module.js:362:17)
 at require (module.js:378:17)
 at /share/CACHEDEV1_DATA/.qpkg/nodejs/node/bin/npm:18:11
 at Object.<anonymous> (/share/CACHEDEV1_DATA/.qpkg/nodejs/node/bin/npm:86:3)
 at Module._compile (module.js:449:26)
 at Object.Module._extensions..js (module.js:467:10)
 at Module.load (module.js:356:32)
 at Function.Module._load (module.js:312:12)

Jednak wystarczyła krótka lektura źródeł internetowych, żeby naprawić problem. Na szczęście QNAP ma dość duże wsparcie społeczności, więc w razie czego na forum zwykle można znaleźć rozwiązanie ewentualnych problemów. W tym wypadku wystarczyło podlinkować npm z innego miejsca:

[/opt/node/bin] # mv npm npm.old
[/opt/node/bin] # ln -s ../lib/node_modules/npm/bin/npm-cli.js npm

Po tym zabiegu można już bez przeszkód zainstalować pakiet SunCalc, który będzie potrzebny przy pisaniu programu.

[/opt/node/bin] # ./npm install suncalc 
npm http GET https://registry.npmjs.org/suncalc
npm http 200 https://registry.npmjs.org/suncalc
npm http GET https://registry.npmjs.org/suncalc/-/suncalc-1.7.0.tgz
npm http 200 https://registry.npmjs.org/suncalc/-/suncalc-1.7.0.tgz
suncalc@1.7.0 node_modules/suncalc

Mamy więc pełen sukces, można przejść do programowania.

Program

Program w node.js będzie dedykowany do zapalania i gaszenia światła o odpowiedniej porze. Oczywiście nic nie stoi na przeszkodzie, żeby kod dołączyć do istniejącego systemu, który odbiera informacje z różnych czujników – o temperaturach, stanie czujek alarmu, zużyciu ekogroszku, informacji o zasilaniu, itp. Połączenie wszystkich informacji i możliwości sterowania w jednym miejscu jest czymś, co sprawia, że system jest bardzo elastyczny i ma duże możliwości.

Skupimy się jednak na naszym zadaniu i tylko tym fragmentem kodu się zajmiemy. Przede wszystkim będziemy potrzebowali informacji, kiedy robi się ciemno i jasno. Pomoże w tym niewielka biblioteka SunCalc, która ma wiele możliwości związanych z wyliczaniem pozycji Słońca i Księżyca. Nas natomiast będzie interesować na razie czas zachodu Słońca, zmierzchu i świtu. Bibliotekę, jak i node.js mamy już zainstalowane. W pierwszej kolejności przygotujemy plik konfiguracyjny config.js, w którym w czytelny sposób przechowamy różne parametry:

exports.sender433host="192.168.2.102";
exports.sender433port=8000;
var codes433={};
codes433['frontLightOff']='2.32.123456789';
codes433['frontLightOn']='2.32.987654321';
exports.codes433=codes433;

W tablicy codes433 przechowujemy, zanotowane wcześniej, kody radiowe sterujące światłem. Sender433host, to adres urządzenia wysyłającego kody radiowe.

Przejdźmy do właściwego programu:

var config=require('./config');
var SunCalc=require('suncalc');
var dgram=require('dgram');

var stateFrontLight=-1;

checkTimes();

function send433(code)
{
 var message = new Buffer(code);
 var client = dgram.createSocket("udp4");
 client.send(message, 0, message.length, config.sender433port, config.sender433host, function(err) {
 client.close();
 });
 console.log("Sending 433 code: "+code);
}

function checkTimes()
{
 var now = new Date();
 var isNight=false;

 var sunTimes=SunCalc.getTimes(now, 54.599586, 18.797837);
 var myNightStart=new Date((sunTimes.dusk.getTime()+sunTimes.sunset.getTime())/2);
 var myDayStart=sunTimes.dawn;
 var minutesAfterMidnight = now.getHours()*60+now.getMinutes();

if( now.getHours()>12 ) //po poludniu
 {
 if( myNightStart<now ) isNight=true;
 else isNight=false;
 }
 else //po polnocy
 {
 if( myDayStart<now ) isNight=false;
 else isNight=true;
 }

if( isNight==true && stateFrontLight!=1 )
 {
 send433( config.codes433['frontLightOn'] );
 send433( config.codes433['frontLightOn'] );
 console.log("night");
 stateFrontLight=1;
 }
 if( isNight==false && stateFrontLight!=0 )
 {
 send433( config.codes433['frontLightOff'] );
 send433( config.codes433['frontLightOff'] );
 console.log("day");
 stateFrontLight=0;
 }

setTimeout( checkTimes, config.checkTimesInterval );
}

Na początku dołączamy obiekt konfiguracji, bibliotekę do obliczeń astronomicznych i wysyłania. Potem definiujemy zmienną stateFrontLight definiującą aktualny stan światła. Ponieważ program został dopiero uruchomiony, więc stan jest nieznany (-1). Główną fukncją jest checkTimes, która wywoływana jest przez timer (wewnątrz samej funkcji), a send433 wysyła pakiet UDP do urządzenia nadającego kody radiowo.

Istotnym zagadnieniem jest, kiedy należy zapalić światło. Biblioteka SunCalc daje nam kilka ciekawych możliwości. Wiemy kiedy zachodzi słońce i kiedy zapada zmierzch dla danej szerokości i długości geograficznej. Zapalanie światła o zachodzie słońca jest przedwczesne, bo jest wtedy jeszcze całkiem jasno, natomiast o zmierzchu – zbyt późne, bo jest już ciemno. Najlepszy będzie moment między tymi dwoma czasami, a wyliczamy go przez średnią arytmetyczną czasów zamienionych na liczbę (timestamp):

new Date((sunTimes.dusk.getTime()+sunTimes.sunset.getTime())/2)

Za moment zapalenia światła uznamy świt – dusk. Mamy więc dwa kluczowe dla czasy. Pozostaje tylko porównać je z aktualnym czasem systemowym i w razie zmiany pory dnia, wywołać wysłanie kodów radiowych (na wszelki wypadek dwukrotne).

Pora sprawdzić działanie w praktyce. Uruchamiamy program i dostajemy taki wynik:

[/opt/node/bin] # ./node index.js 
Sending 433 code: 2.32.123456789
Sending 433 code: 2.32.123456789
day

Program działa dalej i czeka na zachód słońca. Kod został wysłany, ponieważ przy uruchomieniu programu zawsze stan światła jest nieustalony i zawsze wymuszamy jego zapalenie lub zgaszenie – na wypadek gdyby program nie działał podczas przejścia między porami dnia (np. był akurat restart).

Oczywiście /opt/node/bin, to nie jest właściwe miejsce do przechowywania programu. Trzeba też zadbać o uruchamianie przy restarcie NASa, są to jednak drobiazgi. Możemy uznać, że test wypadł pomyślnie, a HS-251+ stał się pełnoprawnym serwerem automatyki domowej.

 

Ten wpis został opublikowany w kategorii Inteligentny Dom i oznaczony tagami , , , , , , , , . Dodaj zakładkę do bezpośredniego odnośnika.

0 odpowiedzi na NAS zapala światło przed domem

  1. Przydało by się jednak jeszcze sprawdzać pogodę. Bo jak jest brzydko (pada), to jednak może warto było by jednak zapalić światło wcześniej.

  2. Spawn666 pisze:

    Zachodzę w głowę jakim cudem działa ten RSL ? Jak może się zasilać bez przewodu Neutralnego ?
    Z innej stron – czy światło świeci się od zmierzchu do świtu ? Czy jest jeszcze jakiś PIR który daje sygnał że ktoś się kręci przed lampą ?

    • techniczny pisze:

      Przewodem neutralnym jest dla niego ten, który idzie przez „żarówkę” do zera.

      • SpeX pisze:

        A jak to się mieści w puszcze?

      • Spawn666 pisze:

        No dobrze ale zamknięcie obwodu powoduje zapalenie żarówki. A zasilenie RSLa to właśnie zamknięcie obwodu. Obwód musi być zamknięty aby nastąpił przepływ prądu, a to od razu powoduje zapalenie żarówki. Chyba że wewnątrz RSLa jest jakieś źródło zasilania (akumulator, kondensator) które ładuje się kiedy obwód jest zamknięty i zasila sterownik kiedy obwód jest rozwarty – to by przy okazji pozwalało zapamiętać stan – choć tylko do czasu eozładowania źródła zasilania.

        • techniczny pisze:

          Nie ulega wątpliwości, że prąd płynie, ale na tyle mały, że lampa nie świeci. Dokładnie taka sama sytuacja ma miejsce w przypadku tradycyjnego podświetlenia przycisków ściennych.

Skomentuj techniczny Anuluj pisanie odpowiedzi

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