Po co sterować bramą wjazdową inaczej niż standardowym pilotem? Powodów jest kilka. Po pierwsze można otworzyć bramę jadąc do domu, kilkaset metrów wcześniej, żeby nie czekać aż się otworzy. Po drugie gdy trzeba zamknąć bramę (a nie zrobiło się tego będąc w samochodzie), to nie trzeba szukać drugiego pilota, który leży gdzieś w domu. Po trzecie, będąc na nartach nie trzeba prosić nikogo, żeby w dzień zabierania śmieci podjechał z kluczem uchylić furtkę, żeby śmieciarze opróżnili kosz (bo jak nie opróżnią to przez kolejny tydzień nie będzie gdzie wyrzucać śmieci i popiołu z pieca). Można zamiast tego rano otworzyć bramę przez Internet (o furtce też można pomyśleć, ale to kiedy indziej). Oczywiście ostatni przypadek może wydać się wyimaginowany, bo przecież można zrobić osobną furtkę tylko do koszy. Oczywiście, tylko trzeba ją mieć. A jak się nie ma, to można w 15 minut zrobić zdalne otwieranie bramy (z programowaniem w trochę ponad pół godziny).
Czy informacja o 15 minutach jest przesadzona? Nie, chociaż głównie dlatego, że funkcja była dorabiana do istniejącej już infrastruktury i poprzedzona wcześniejszymi przemyśleniami oraz poszukiwaniami rozwiązania. Do rzeczy jednak. Brama wjazdowa ma zainstalowany napęd rodem z marketów, konkretnie Somfy SGS 500 (lub 501), ponoć nazywane wcześniej Somfy Paseo 500. Oczywiście mój system nie różniłby się specjalnie, gdyby chodziło jakiś inny napęd. Zapewne prawie każda centralka do sterowania bramą ma wejście, które po zwarciu odpowiednich styków uruchamia siłowniki. A jeżeli nawet nie ma, to ma piloty zdalnego sterowania.
Ciężko znaleźć sensowną dokumentację techniczną do Somfy SGS, ale w opisie dodatkowych akcesoriów można odnaleźć informację o możliwości podłączenia włącznika kluczykowego. Moje przekonanie o tym, że jak się zewrze styki służące do podłączenia przełącznika kluczykowego, to brama się otworzy lub zamknie, graniczy z pewnością. Rozwiązanie jest o tyle dobre, że nie zużywa baterii w pilocie, a z mojego doświadczenia wynika, że jej wymiana powoduje konieczność ponownego programowania bramy (z czym zawsze są u mnie kłopoty). Niestety w moim przypadku rozwiązanie kablowe jest, póki co, nierealne do zastosowania. Wymagałoby rozbierania kostki na podjeździe. Musiałem wymyślić zatem coś innego.
Do Somfy dołączone były dwa piloty. Co więcej kolejne można dokupić na allegro za około 30 zł. Co jeszcze istotne, do zestawu można dokupić odbiornik uniwersalny i sterować drogą radiową innym urządzeniem elektrycznym (czy bramą innej firmy) przy pomocy tego samego pilota (warto wiedzieć na przyszłość, bo na razie nie mam pomysłu na zastosowanie). Zdjąłem więc obudowę pilota i, jak łatwo się domyślić, dotarłem do mikrostyków przy przyciskach. Pozostało do dwóch złączy przycisku podłączyć kabelki i założyć ponownie obudowę.
Pilot trafił do skrzynki z kartą przekaźnikową podłączoną do routera z OpenWRT. Skrzynkę z kartą zainstalowałem przy okazji przygotowywania sterowania piecem (przez wejście termostatu pokojowego), o czym pewnie napiszę jeszcze kiedyś, bo planuję rozbudowę „logi piecowej”. Samo sterowanie przekaźnikiem z poziomu skryptu php już opisywałem w tekstach o karcie przekaźnikowej i systemie nawadniania ogródka. Ruch bramy wywołuje się więc przez załączenie na moment (u mnie 100ms) i wyłączenie przekaźnika.
Jak to się ma do sterowania bramą przez telefon z Androidem? Wystarczyło tylko wykonać jakąś komunikację między tymi dwoma elementami. Jakimś rozwiązaniem byłoby samodzielne napisanie programu od obsługi do telefonu. Tak się jednak składa, że niedawno kupiłem sobie Arduino, które także z pewnością jeszcze opiszę. Co ma Arduino do OpenWRT i bramy? Póki co nie za dużo, poza tym, że przeszukując Internet trafiłem na projekt Domotic Home, który w skrócie rzecz ujmując pozwala sterować zautomatyzowanym domem przez ethernetową wersją Arduino zapytaniami http. Co ciekawe na potrzeby projektu powstał program sterujący na Androida, a także zostały opublikowane informacje dotyczące protokołu komunikacyjnego, który jest oparty na http i JSON. Nie bardzo nadaje się do wystawienia na zewnątrz, ale do sieci lokalnej nic więcej nie potrzebuję. Prostota i wystarczająca funkcjonalność w jednym.
W moim routerze z OpenWRT nie miałem serwera www, bo nie używam konfiguratorów typu LuCI – wolę pliki konfiguracyjne i linię poleceń. Zainstalowałem więc szybko uhttp i php5-cgi. W ciągu 5 minut wynik działania pierwszego, testowego skryptu miałem w oknie przeglądarki na komputerze. Potem musiałem zmienić jeszcze stronę domyślną na index.php, bo tego wpisu brakowało w konfiguracji.
W następnym kroku, w najprostszy możliwy sposób, zgodnie z protokołem przedstawiłem informację o urządzeniach, którymi aplikacja Domotic Home powinna sterować:
<?php
$ip=”192.168.10.1″;
$outbrama=1;
$outogrzewanie=2;
if( $_GET[’out’]==”all” )
{
echo '{„ip” : „’.$ip.'”, „devices” : [{ „type” : „gate”, „name” : „brama wjazdowa”, „out” : „1”}, {„type” : „plug”, „name” : „ogrzewanie”, „out” : „’.$outogrzewanie.'”}]}’;
}
?>
Teraz po podaniu adresu IP i portu aplikacji w telefonie oraz uruchomieniu synchronizacji, w menu pokazały się opcje sterowania bramą i ogrzewaniem.
Oczywiście samo sterowanie jeszcze nie działa, bo skrypt w php tego nie obsługuje, ale wystarczy dodać do kodu krótki fragment, żeby można było otwierać bramę przy pomocy telefonu.
elseif( $_GET[’out’]==”$outbrama” )
{
echo '{„out”: „$outbrama”, „status” : „1”}’;
exec( '/mojdom/brama’ );
}
Po kliknięciu na kłódkę przy przycisku brama wjazdowa uruchamiany jest skrypt /mojdom/brama, a dołączony do karty przekaźnikowej pilot wysyła sygnał do centralki Somfy SGS, a ta uruchamia siłowniki i otwiera lub zamyka bramę. Proste, prawda? Dlaczego skrypt /mojdom/brama a nie bezpośrednie wywołanie obsługi przekaźnika z poziomu serwera www? Bo skrypt już istnieje i może być wywoływany z tego samego miejsca przez różne mechanizmy (np. można nim otworzyć bramę z crona/at planując to na czas zabierania śmieci podczas wakacyjnego wyjazdu).
Co dalej? Pewne funkcje można dodać jeszcze do Domotic Home (jak sterowanie ogrzewaniem czy odczyty temperatur z czujników), jednak brakuje jeszcze jednej funkcjonalności – otwierania bramy podczas jazdy samochodem. Domotic Home działa tylko w sieci lokalnej (łatwo to zmienić, ale nie chcę tego robić ze względu bezpieczeństwa). Rozwiążę to prawdopodobnie przez wywołanie skryptu przez ssh z poziomu zewnętrznego serwera www (bezpiecznego, dedykowanego). Napiszę też najprostszą możliwą aplikację Androidową, która po uruchomieniu wyśle jedno proste zapytanie http. A aplikację można uruchomić przez zestaw głośnomówiący wypowiadając słowa „uruchom brama wjazdowa”, jako że do wybirania numerów w samochodzie używam Cyberon Voice Commander.
Spodziewam się, że opisanie powyższego mechanizmu zajęło mi więcej czasu niż jego wykonanie. Wyraźnie natomiast widać, że jak już ma się zbudowane jakieś zalążki inteligentnego domu, to dodawanie kolejnych funkcji jest (przynajmniej w niektórych przypadkach) bardzo proste. Pomysły na nowe funkcje przychodzą z czasem, często w obszarach, których automatyzacja początkowo wydała się zbędna.
I wish you could post in english somewhere.
OK. I’ve managed to create a test.php file on my OpenWRT router and it gives me the json formatted answer in the browser.
I have to find an Android based mobile phone to test the application (I have a Windows Mobile one …. not good for out test).
I hope the android application will accept the IP of the server as : 192.168.10.2:8082 as I run a virtual server on my OpenWRT device, on the 8082 port (maybe you could check it before I find an android phone to test)
Thanks a lot for your piece of code
Yes, you can use IP and port number in app’s config. You should also rename test.php to index.php and configure default index page (index.php instead of index.html). 192.168.10.2:8082/?out=all should give you JSON result.
YES, almost everything is working for the moment (I’ve tried it on one of my friend’s Android mobile phone). I have only one problem showing the temperature … the application gives an error when tying to display it (maybe I’ve wrongly set the value to „temp1” and the application expects a number … have to check).
Now, it’ll be nice to have some sort of security as at the moment the JSON result is publicly available. Another small issue is that the application gives you both ON and OFF options for switches, even if it reads the status from the JSON text (it should give you only ON or OFF at a time …)
Thanks again!
Yes, they should think about any kind of authentication. But there is a way you can secure it. You can configure dhcp with static IP for your phone and add (to php script) auth based on IP address.
ON and OFF is for me ok. It can be used when you don’t know or don’t want to check status. You can exec any scripts on ON and OFF.
I’d like to use it on the internet so … whenever I connect, I would have (most of the times) a different public IP on the client.
Anyway, if you could post a piece of code about how to check the IP in the php script, I’d be grateful to you (I’m not a programmer but maybe with an IF it could e done …I’ll wait for your piece of code in case you can post it. Thanks)
I’ve discovered that the temperature gives me error only when I add more than one sensor (I’d like to use 4 sensors).
The temperature sensors were added like this:
{„type” : „temperature”, „name” : „Temperatura 2”, „out” : „9”},
{„type” : „temperature”, „name” : „Temperatura 3”, „out” : „10”}, … and the rest of the other code.
Could you check by adding more than one temperature sensor?
I have problem with 2 sensors. I must take a look at Arduino c code, but now DH website not working (I can’t login). But I think there can be a bug in DH android app.
The original code for arduino (temperature sensor) is:
if(readString.startsWith(„GET /?out=1&status=1”))
{Serial.print(„\n 1 f_MCP9700A \n”);
client.print(„{\”status\” : \”ok\” , \”value\” : \””);
client.print(temperatureReading_1805);
client.print(„\”}”);
}
I suppose you have problems sync-ing as the app has a database where stores some of the info.
Thanks for the code. Now works ok for me with:
else if( $_GET[’out’]==”$outtempzewn” )
{
echo '{„status” : „ok”, „value” : „15”}’;
}
else if( $_GET[’out’]==”$outtempsalon” )
{
echo '{„status” : „ok”, „value” : „14”}’;
}
and sensors defined as:
{„type” : „temperature”,”name” : „Zewnetrzna”,”out” : „3”},{„type” : „temperature”,”name” : „Salon”,”out” : „4”}
I was doing:
if( $_GET[’out’]==”8″ && $_GET[’status’]==”1″ )
{
echo '{„status” : „ok”, „value” : „22”}’;
}
But I remember I’ve tried without status and it was not working either. Let me try again. My email is fpaliuc [at] yahoo.com … it would be easier to talk to you
To tak:
1) Co do uruchamiania z zewnątrz to ja bym próbował jeszcze podpiąć GPSa, tak by telefon sam wysłał sygnał „otwórz bramę” jak wjadę na swoją ulicę.
2) Co do otwierania na wakacje bramy dla „śmieciarzy”. Nie mieszkam w domku, więc nie wiem jak to jest w 100%, ale zapewne śmieciarz jak brama będzie zamknięta, będzie dzwonił domofonem. Temu „automat” ja bym zrobił tak iż dzwonek domofonu o określonej porze powodował by automatyczne otwarcie bramy np na 5min. Wtedy nie masz takiej sytuacja iż masz bramę otwartą np godzinę czy jak śmieciarze się spóźnią to ci nie wezmą śmieci.
1. To właśnie różnica między gażdeciarstwem a funkcjonalnymi rozwiązaniami. Nie zawsze wracasz do domu swoim samochodem, nie zawsze chcesz wjechać na podwórko, zapewne nie chcesz, żeby gps w telefonie działał cały czas i wyczerpywał baterię.
2. Będzie dzwonił i rozwiązaniem jest automatyczne otwieranie furtki po dzwonku. Otwieranie elektrozaczepu nie jest problemem, w przeciwieństwie do wykrycia sygnału dzwonienia w wideodomofonie bez dokumentacji… Póki co brama może być otwarta z zapasem – nawet cały dzień.
ad.2 A nie możesz po prostu podpiąć się pod „dzwonek” w domu? Wystarczy iż złapiesz napięcie na dzwonku gdy dzwonek dzwoni i po sprawie.
ad.1 Nie koniecznie musisz opierać się na GPSie. Możesz opierać się na wstępnej lokalizacji via GPS. Do tego są nawet programy, które ci np gdy wejdziesz do domu włączają WiFi. I wtedy spokojnie możesz ustawić taką zależność jeżeli wjedziesz na swoją ulice i masz w telefonie tryb „samochód” (system głośno mówiący itp) to program uruchomi skrypt który otworzy ci bramę.
1. Nadal zbędny bajer.
2. Tak planuję, ale nie jest to takie proste. Domofon ma 4 przewody – zapewne zasilanie, masa, wideo, audio. Nie ma osobnego sygnału dzwonienia ani dokumentacji. Muszę dojść do tego w jaki sposób przekazywany jest dzwonek i wyprowadzić go jakoś logicznie na zewnątrz (i muszę to zrobić „po drodze”, bo od domofonu nie poprowadzę nowych przewodów).
Sorry for creating you troubles 🙁 . I I don’t know if it’s a bug or not … The sync is the equivalent of http://IP/?out=all
As with more than one light, door, gate, plug it works, I’m not sure it’s that. With one temperature sensor it works. Also, if I add a wattmeter, it crashes again (only one wattmeter).
I’ve sent a message to the guy that developed DomoticHome but… no answer yet.
Czy może ktoś udostępnić działający plik php na czujniki temperatury. Mój email maglo18[at]interia.pl