Sterowanie bramą Life przez telefon i Internet dzięki Arduino

Pisałem niedawno o pracach, które prowadziłem w garażu. Przypomnę, że zmiany miały związek z instalacją napędów firmy Life do bramy wjazdowej i bramy garażowej. Wypadałoby trochę ulepszyć to co wyprodukowała fabryka i podłączyć siłowniki do systemu automatyki domowej. Nie będzie to trudne.

Najstarsi czytelnicy bloga być może pamiętają, że dawno, dawno temu przygotowałem sterowanie bramą z napędem Somfy przez telefon. Opierało się ono na oprogramowaniu z projektu Domotic Home i wydawaniu komend przez pilota podłączonego do karty przekaźnikowej routera. Teraz będzie prościej i tak jak chciałem od początku. Przy starym napędzie zasilanie z garażu było poprowadzone do centralki przy bramie wjazdowej, natomiast ona sterowała oświetleniem przed garażem – były więc poprowadzone przewody spowrotem do garażu. Teraz oświetleniem będzie sterować bezpośrednio Arduino, więc pozostąły 3 wolne przewody idące do bramy – w sam raz do sterowania ruchem skrzydeł.

Life RG UNI 24 DL

Sterować bramą można conajmniej na dwa sposoby. Zwierając wejścia 6 i 10 centralki GE UNI 24R DL wywołuje się funkcję krok, która powoduje otwieranie bramy jeżeli jest zamknięta, zamykanie jeżeli jest otwarta, zatrzymanie gdy się porusza i ruszenie w przeciwnym kierunku jeżeli została zatrzymana. Bardziej złożoną opcją, użyteczną gdy chcemy mieć pewność czy zamykamy czy otwieramy bramę, to odpowiednie będzie zwieranie wejścia 6 z 8 i 9 – wystarczą więc do tego trzy przewody (akurat tyle mam). Mi jednak na razie wystarcza polecenie step, więc dwa przewody wędrują od wejść centrali, do modułu przekaźnikowego przy moim głównym Arduino Mega. I to wszystko w temacie bramy wjazdowej.

Nieco więcej zachodu jest z bramą garażową. Napęd Life Probo używa sterownika RG1 24DL, w którym niestety nie ma możliwości wydania określonego polecenia otwórz bądź zamknij. Jest tylko jedno wspólne, które otwiera lub zamyka bramę zależnie od jej stanu. O ile w przypadku bramy wjazdowej nie jest to problemem, bo w skrajnym przypadku mogę nawet sprawdzić widok z kamery, żeby przekonać się w jakim jest stanie, o tyle w przypadku garażu, jak już się zdecydowałem na sterowanine, to chcę mieć pewność, że jest zamknięta. Dodatkowo chciałbym dodać elementy zwiększające bezpieczeństwo, wygodę i funkcję wietrzenia garażu.

Life Probe 70DL

Sterowanie poleceniem krok jest analogiczne jak przy bramie wjazdowej (wejścia 6 i 10). Dodatkowo jednak wejście 11, opisane jako foto podłączyłem do złącza NC jednego z przekaźników. Jest to wejście od tzw. fotokomórki. Zwarcie tego wejścia powoduje, że napęd działa i przyjmuje komendy w normalnym trybie (stąd NC a nie NO w przekaźniku), natomiast rozwarcie powoduje natychmiastowe zatrzymanie napędu (i uniemożliwia uruchomienia do czasu ponownego zwarcia styku).

Oczywiście podłączenie tego złącza do bariery podczerwienie (fotokomórki) byłoby zbyt proste, bo ja chcę ją użyć do czegoś jeszcze. Bariera posiada dwa elementy – nadajnik, do którego doprowadzamy zasilanie 12-24V i odbiornik, który również wymaga zasilania, a dodatkowo ma wyjście przekaźnikowe. Zasada działania jest bardzo prosta – jeżeli między nadajnikiem a odbiornikiem coś się znajdzie (samochód, noga, itp.), to przekaźnik rozwiera styk. W normalnym wypadku byłoby to sygnałem dla sterownika bramy, że należy awaryjnie zatrzymać bramę.

bariera podczerwieni

W naszym przypadku przekaźnik bariery zostanie podłączony do Arduino – tradycyjnie – jeden przewód do wejścia cyfrowego z aktywowanym rezystorem podciągającym, a drugi do masy. Arduino powiąże stan wejścia z jednym z wyjść, które będzie sterować przekaźnikiem, który z kolei będzie podłączony do wejścia foto w napędzie bramy. Da to sytuację, jakbyśmy podłączyli fotokomórkę bezpośrednio (oczywiście z dokładnością do awarii Arduino). To co zyskujemy, to informacja kiedy coś jest lub przekracza wejście do garażu. Będzie więc wiadomo kiedy ostatnio ktoś przechodził lub przejeżdżał przez wjazd. Gdy garaż jest celowo z jakiegoś powodu otwarty będzie można aktywaować alarm (choćby wysłać smsa z taką informacją). Gdy jest ciemno będzie można zapalić światło. Ponieważ garaż jest niewielki, a samochód to pokaźnych rozmiarów kombi, więc bardzo interesuje mnie moment podczas wjeżdżania, gdy cały samochód jest już w środku i mogę zamknąć bramę – poznam to po tym, że zgaśnie odpowiednia dioda informacyjna.

Dodatkowo w każdym momencie mogę odciąć zasilanie od napędu – bo przewody zasilające podłączone są przez złącze NC jednego z przekaźników – tak na wszleki wypadek – może być przypadtne np. w sytuacji gdy będzie uzbrojony alarm i będę pewny, że nie będę chciał otwierać bramy przed jego rozbrojeniem.

Aby wiedzieć w jakim stanie jest brama, zamontowałem kontaktrony – jeden zwarty gdy brama jest zamkięta, a drugi – lekko uchylona. Mam więc wiedzę o trzech stanach – brama zamknięta, w pozycji „wietrzenie” i otwarta (być może nie do końca, ale jednak). Dzięki temu będę mógł wysyłać informację, gdy brama jest długo otwarta, bo np. zapomniałem ją zamknąć, czemu wbrew pozorom sprzyja łatwość sterowania nią. Będę też mógł wprowadzić funkcję automatycznego wietrzenia garażu – po wprowadzeniu samochodu brama zamiast się od razu zamykać, na jakiś czas pozostanie lekko uchylona. Na jak długo? Pewnie zależnie od temperatury na zewnątrz.

Mając wykonane wszystkie połączenia można przejść do programowania. Na początek włączymy możliwość sterowania bramami przez przyciski od oświetlenia garażu, opisane ostatnio. W pierwszej kolejności dostroimy czasy, po których wciśnięcie uznajemy za średnie lub długie. W tym celu uzupełnimy program, którego tworzenie zaczęliśmy kilka odcinków wcześniej.

#define MEDIUMKEYPRESS 600
#define LONGKEYPRESS 2200

Jeżeli puścimy przycisk szybciej niż po 600ms, to jest to krótkie wciśnięcie, jeżeli po ponad 2200ms, to jest długie. Takie czasy bardzo dobrze się sprawdzają. Teraz trzeba przerobić funkcję checkInputs(). Ponieważ przyciski mają sterować też bramą, to trzeba zrezygnować z zapalania/gaszenia światła od razu po wciśnięciu przycisku – będzie się to działo dopiero po puszczeniu. Jest to niestety mniej naturalne, ale poprzednie podejście powodowałoby, że światło zapalałoby lub gasiło się nawet wtedy gdy chcielibyśmy wywołać tylko ruch bramy. Zmodyfikujmy więc funkcję:

// sprawdza stany wejść, jeżeli nastąpiła zmiana, to powiadamia
void checkInputs()
{
  int inp, w;

  for(w=0; w<INPUT_SIZE; w++ )
  {
    inp=digitalRead(input_pins[w]);
    if(inp!=input[w] && isAfter(input_lastchange[w]+INPUTDEBOUNCETIME) )
    { 
      // przycisk od światła głównego
      if(w==GARAGEKEY1 && inp==HIGH)
      {
        // długie wciśnięcie - otwieramy bramę
        if( isAfter(input_lastchange[w]+LONGKEYPRESS) )
        {
          runCommand( String(String(ID)+"c200") );
          runCommand( String(String(ID)+"l"+String(GARAGEGATESTEP)) );                    
        }
        // zapalamy na dłużej po średnim wciśnięciu jeżeli było zgaszone
        else if( output[GARAGELIGHT1]==LOW && isAfter(input_lastchange[w]+MEDIUMKEYPRESS) )
        {
          runCommand( String(String(ID)+"c7200000") );
          runCommand( String(String(ID)+"l"+String(GARAGELIGHT1)) );          
        }
        // zapalamy po krótkim wciśnięciu
        else if( output[GARAGELIGHT1]==HIGH ) 
        {
          runCommand( String(String(ID)+"c90000") );
          runCommand( String(String(ID)+"l"+String(GARAGELIGHT1)) );
        }
        // gasimy jeżeli było zapalone
        else if( output[GARAGELIGHT1]==LOW ) 
        {
          runCommand( String(String(ID)+"h"+String(GARAGELIGHT1)) );
        }
      }

      //przycisk światła pomocniczego
      if(w==GARAGEKEY2 && inp==HIGH)
      {
        // długie wciśnięcie
        if( isAfter(input_lastchange[w]+LONGKEYPRESS) )
        {
          runCommand( String(String(ID)+"c200") );
          runCommand( String(String(ID)+"l"+String(GATESTEP)) );
        }        
        else if( inp==HIGH && output[GARAGELIGHT2]==LOW && isAfter(input_lastchange[w]+MEDIUMKEYPRESS) )
        {
          runCommand( String(String(ID)+"c7200000") );
          runCommand( String(String(ID)+"l"+String(GARAGELIGHT2)) );          
        }        
        else if( output[GARAGELIGHT2]==HIGH ) 
        {
          runCommand( String(String(ID)+"c90000") );
          runCommand( String(String(ID)+"l"+String(GARAGELIGHT2)) );
        }
        else if( output[GARAGELIGHT2]==LOW ) 
        {
          runCommand( String(String(ID)+"h"+String(GARAGELIGHT2)) );
        }
      }

      if(w==GARAGEBARRIER) // fotokomórka w garażu
      {
          runCommand( String(String(ID)+"c0") );
          if( inp==LOW ) runCommand( String(String(ID)+"l"+String(GARAGEGATESTOP)) );
          if( inp==HIGH ) runCommand( String(String(ID)+"h"+String(GARAGEGATESTOP)) );
      }

      input[w]=inp; 
      input_lastchange[w]=time;
      sendMessage('i', String(String(w)+inp) );
    }
  }
}

Podsumowując – puszczając przycisk po krótkim wciśnięciu – zapalamy światło na kilkadziesiąt sekund, po średnim – na kilka godzin, po długim – otwieramy bramę. Puszczenie przycisku po krótkim lub średnim przytrzymaniu gasi światło jeżeli było zapalone.

W powyższej funkcji łatwo odnaleźć także fragment kodu łączący logicznie wejście z bariery podczerwieni z wejściem foto sterownika napędu bramy. Właśnie dzięki temu fotokomórka działa tak jakby była podłączona bezpośrednio do Life.

Co jednak ze sterowaniem przez Internet i komórkę? Jeżeli chodzi o Internet, sprawa jest chwilowo prosta – z sieci lokalnej lub przez VPN mogę w każdej chwili wysłać polecenie do Arduino, zgodnie ze zdefiniowanym protokołem. Oczywiście nie jest to rozwiązanie docelowe, o czym za chwilę. Jeżeli natomiast chodzi o sterowanie telefonem, sprawa jest jeszcze prostsza. Bez problemu działa rozwiązanie przygotowane dla bramy Somfy, z jedną zmianą – wywołanie skryptu /mojdom/brama z poziomu php przez exec, wystarczyło zmienić na właściwą komendę http wywołaną przez funkcję fopen. Zmiana sprowadziła się więc do modyfikacji jednej liniki kodu. Jest to potwierdzenie, że gdy dobrze przemyśli się projekt, to późniejsze zmiany czy rozbudowa są łatwe i bezproblemowe.

Jak chciałbym sterować systemem w przyszłości? Przez www – zarówno z telefonu jak i komputera. Ponieważ stawiam na bezpieczeństwo, więc rozwiązanie może nie być oczywiste. Przede wszystkim nie chcę otwierać serwera www z routera OpenWRT (lub innej jednostki centralnej) na świat. Po drugie cała komunikacja musi być szyfrowana – w grę wchodzi więc tylko https.

Ponieważ dysponuję serwerem dedykowanym w sieci, będzie on pośredniczył w komunikacji. Będzie na nim uruchomiona strona z przyjaznym dla zwykłego człowieka interfejsem do sterowania funkcjami domu. Urządzenia uprawnione będą łączyć się ze stroną, i być może autoryzować za pomocą certyfikatów. Polecenia będą przekazywane do bezpiecznego serwera www mojego routera, który będzie miał otwary port na zewnątrz, wyłącznie dla połączeń z jednego uprawnionego adresu. Ponieważ jednak chcę mieć pewność, że ewentualne włamanie na serwer nie zapewni w łatwy sposób sterowania moim domem, dodatkowe zabezpiecznie zostanie oparte o pin przekazywany przez cookies (dla ułatwienia przechowywany w telefonie przez kilka godzin, żeby nie wpisywać za każdym razem), nie przechowywany nigdy na serwerze pośredniczącym. Można się zastanawiać nad bezpieczeństwem przechowywania pinu w telefonie, bo co z kradzieżą telefonu? Jest to kompromis między bezpieczeństwem a wygodą. Natomiast tak samo można stracić pilota do bramy lub klucze, tylko dostęp z telefonu łatwiej zdalnie i błyskawicznie unieważnić… Poza tym mam jeszcze jedno niebanalne zabezpieczenie, którego niestety, z przyczyn bezpieczeństwa, opisać nie mogę…

Przy okazji przeprowadzonych prac, uruchomiłem także czujnik zalania garażu i powiadomienie na telefon o jego ewentualnym zadziałaniu. W samą porę przed wyjazdem wakacyjnym. Być może wkrótce go krótko opiszę, choć temat był poruszany przy okazji Arduino podlewającego ogródek.

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

0 odpowiedzi na Sterowanie bramą Life przez telefon i Internet dzięki Arduino

  1. deCks pisze:

    a może cos podobnego w mniejszych pieniadzach da sie stworzyc ? http://allegro.pl/domofon-gsm-modul-dla-5-abonentow-2-wyjscia-i3535719010.html – pomysl jest taki aby do tego dokupic zestaw natynkowy z mikforonem i glosnikiem, podczas gdy ktos dzowni mozna otworzyc mu brame albo furtke… ew dzwoniac na numer urzadzenia otworzy nam on brame lub furtke

  2. dopler pisze:

    Cała instrukcja! Szukałem informacji by podrasować mój napęd garażowy i trafiłem tutaj. Wszystko elegancko opisane, tylko brać się do pracy i tuningu 😉 Mam nadzieję, że u Pana wszystko działa tak, jak Pan sobie zaplanował. Ja w wolnej chwili też planuje się tym zająć. Pozdrawiam!

Dodaj komentarz

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