Automatyka Domowa, Budynkowa eHouse1 – kod źródłowy C++ dla linux

Inteligentny Dom eHouse automatyka domowa kod źródłowy oprogramowania C,C++, Object C dla systemów operacyjnych LINUX.

Artykuł jest rozwinięciem automatyka Domowa, kod źródłowy C.
Podłączenie automatyki budynkowej eHouse do “komputera PC” zostało opisane inteligentny dom eHouse1 + linux dla różnych dystrybucji linuxa.
Opis ramki transmisyjnej protokołu eHouse1 po magistrali RS-485 oraz struktury danych statusu zostały omówiony w artykule inteligentny dom – eHouse 1 programowanie C

Opisano kod źródłowy napisany w języku C++ do obsługi automatyki domowej eHouse z dowolnych urządzeń zawierających system operacyjny linux w dowolnej wersji.
W momencie pisania niniejszego artykułu posiada ono następującą funkcjonalność:

  • Obsługa automatyki domowej eHouse 1 przez port RS-485 / RS-232 / USB
  • Synchonizacja czasu sterowników
  • Inicjowanie sekwencyjnego rozsyłania statusów ze sterowników
  • Wysyłanie pomiarów temperatur ogólnych (zewnętrznych Pn,pd,zach,wsch,pokojowej,poziomu oświetlenia z zaprogramowanych czujników) do przetwarzania przez sterowniki
  • Odbieranie logów ze sterowników
  • Odbieranie potwierdzeń zdarzeń podczerwieni Nadawania (do zewnętrznych urządzeń) oraz odbioru (sterowanie pilotem sony) do przetwarzania przez server
  • przesyłanie zdarzeń i potwierdzeń między sterownikami inteligentnego domu eHouse1 (jako gateway)
  • Wysyłanie zdarzeń sterujących do sterowników automatyki domowej eHouse1
  • ładowanie do matrycy statusu w postaci struktury do bezpośredniego dekodowania statusu binarnego
  • możliwość tworzenia własnych algorytmów sterujących w oparciu o odebrane statusy ze sterowników i przesyłanie zdarzeń do inteligentnego domu eHouse1

Oprogramowanie w poniższej formie nie zawiera jedynie

  • możliwości zmiany konfiguracji sterowników automatyki domowej eHouse1
  • upgradu firmwaru sterowników inteligentnego domu eHouse1

co jest osiągalne tylko przez aplikację eHouse.exe dla Windows

Do konfiguracji konieczne jest ustawienie definicji w pliku Inteligentny dom eHouse – open source c dla Linux konfiguracja globals.h:

ETHERNET_EHOUSE=0 (domyślnie jest Ethernet oraz eHouse1 zarządzany przez CommManager) – włączenie obsługi RS-485 / eHouse1

EHOUSE1_DEVS_COUNT=x (gdzie x najwyższy AdresL RoomManager’a – domyślnie 15) w przypadku zbyt niskiej liczby sterowniki o większym numerze nie zdążą wysłać swojego statusu do oprogramowania gdyż zostanie zainicjowane kolejne żądanie (Query). Parametr ten wpływa na czas między kolejnymi wysłaniami zapytania o status, synchronizację czasu itd.

COM_PORT – definicja ta zawiera ścieżkę portu szeregowego (domyślnie /dev/ttyUSB0 – dla przejściówki USB>RS-232 gdyż szczególnie w przypadku mikrokomputerów trudno znaleźć jest port szeregowy RS-232). Nie zaleca się edytować tego ustawienia lecz odremować linie z odpowiednim portem szeregowym (ttyUSB0..2 lub ttyS0..2 dla portów RS-232 bez przejściówek USB).

STATUS_ARRAYS_SIZE – liczba matrycy statusów sterowników eHouse1 min AdresL+1 najwyższego RM. Nie należy zmieniać tej liczby ręcznie lecz odremować wymaganą ilość ze względu na to że wartość ta jest wykorzystywana jako maska dla indeksu tabeli statusów. W przeciwnym razie indeksy niektórych sterowników będą się pokrywały i będą sekwencyjnie nadpisywane. (domyślnie jest 15 RM i o ile nie mamy większej liczby RM niż 15 nie należy nic zmieniać).
oraz definicje które RoomManagery i ich czujniki realizują pomiary temperatur zewnętrznych i oświetlenia – podajemy index eH[AdrL] gdzie AdrL – składowa niska adresu – musi być mniejsza od rozmiaru macierzy statusu eH[]

  • T_NORTH_RM – eH[AdrL] RM mierzący temperaturę zewnętrzną – północ
  • T_NORTH_ADC – Numer wejścia ADC[1..7] – do którego podłączony jest czujnik temperatury zewnętrznej – północ
  • T_SOUTH_RM – eH[AdrL] RM mierzący temperaturę zewnętrzną – południe
  • T_SOUTH_ADC – Numer wejścia ADC[1..7] – do którego podłączony jest czujnik temperatury zewnętrznej – południe
  • T_WEST_RM – eH[AdrL] RM mierzący temperaturę zewnętrzną – zachód
  • T_WEST_ADC – Numer wejścia ADC[1..7] – do którego podłączony jest czujnik temperatury zewnętrznej – zachód
  • T_EAST_RM – eH[AdrL] RM mierzący temperaturę zewnętrzną – wschód
  • T_EAST_ADC – Numer wejścia ADC[1..7] – do którego podłączony jest czujnik temperatury zewnętrznej – wschód
  • T_ROOM_RM – eH[AdrL] RM mierzący temperaturę wewnętrzną – dla HeatMangera na potrzeby CO
  • T_ROOM_ADC – Numer wejścia ADC[1..7] – do którego podłączony jest czujnik temperatury pokojowej – dla HeatManagera na potrzeby CO
  • LIGHT_LEVEL_RM – eH[AdrL] RM mierzący poziom oświetlenia na zewnątrz
  • LIGHT_LEVEL_ADC – Numer wejścia ADC[0] – do którego podłączony jest czujnik poziomu oświetlenia zewnętrznego

Wszystkie sterowniki automatyki budynkowej eHouse1 muszą być zaprogramowane w trybie rozszerzonego adresu aby oprogramowanie działało poprawnie (statusy, wysyłanie zdarzeń, przekazywanie zdarzeń między sterownikami za pośrednictwem oprogramowania).
Należy używać kolejnych adresów AdresL począwszy od 1 ze względu, że oprogramowanie dla wygody status danego sterownika zapisuje w matrycy statusów eH[AdresL] o indeksie równym składowej niskiej Adresu. W komórkę 0 wpisywany jest status HeatManagera o ile jest on jest zainstalowany.

Po odpowiednim ustawieniu powyższych parametrów i skompilowaniu aplikacja jest gotowa do pracy.
Kod źródłowy znajduje się pod poniższymi linkami:
Inteligentny dom eHouse 1 open source linux C++ obsługa RS-485
Inteligentny budynek eHouse Server open source linux C++ całość

Cały server eHouse1 uruchamia się jedną funkcją “int uart(void)” która pracuje w pętli nieskończonej.
pętlę tą można przerwać jedynie poprzez wyjście z aplikacji lub uruchomieniu funkcji “TerminateUart()”.
Aplikacja ta stanowi szablon oprogramowania i nie ma obsługi wielowątkowości dla procesów komunikacyjnych.
Ma charakter minimalistyczny aby umożliwić zrozumienie, poznanie, naukę oraz obsługę systemu inteligentnego domu eHouse 1, a nie stworzyć zaawansowany Server w postaci binarnej spełniający wymagania wszystkich.

Aby zwiększyć jej funkcjonalność należy uruchomić funkcję serwis “uart()” w wątku o niskim lub najniższym priorytecie o ile użyty sprzęt na to pozwala i posiada wystarczającą moc obliczeniową. Bardzo korzystne było by także ładowanie konfiguracji z plików tekstowych co nie wymagało by ciągłego przekompilowania kodu przy najprostszej zmianie ustawień.

Do wysyłanie zdarzeń systemowych eHouse w trybie “DirectEvent” służy funkcja:
“void SendDirectEventeHouse1(const unsigned char *evt)” – pozwala ona na bezpośrednie wysłanie zdarzenia do sterownika inteligentnego domu eHouse 1 pracującego na magistrali RS-485. Parametrem jest tu zmienna typu string o długości 10B w kodzie binarnym zawierająca zdarzenie systemowe w następującej postaci
evt[0] – adrh
evt[1] – adrl
evt[2] – komenda
evt[3] – arg1 (argumenty odpowiednie dla danej komendy
evt[4] – arg2 (argumenty odpowiednie dla danej komendy
evt[5] – arg3 (argumenty odpowiednie dla danej komendy
evt[6] – arg4 (argumenty odpowiednie dla danej komendy
evt[7] – arg5 (argumenty odpowiednie dla danej komendy
evt[8] – arg6 (argumenty odpowiednie dla danej komendy
evt[9] – arg7 (argumenty odpowiednie dla danej komendy

Na uwagę zasługuje także funkcja “void RS485PerformData(void)” która jest uruchamiana cyklicznie po odbiorze wszystkich statusów i realizuje przetwarzanie danych oraz wysyłanie zdarzeń.
np.
void RS485PerformData(void)
{

if ((eH[0].HM.OUT.o1) & //wyjście 1 HM jest włączone i
((eH[1].RM.OUT.o7) | (eH[2].RM.OUT.o11)) & //wyjście 7 z RM(55,1) lub wyjście 11 z RM(55,2) jest włączone i
(((eH[1].RM.ADC[1].MSB<<8)+eH[1].RM.ADC[1].LSB)>0x230)) //pomiar z czujnika ADC[1] z RM (55,1) jest większy niż 0x230
{ //uruchamia zdarzenie dla RM (55,3) ustawienie wyjścia 9 na 32 sekundy
SendDirectEventeHouse1((unsigned char *)”\x37\x03\x01\x09\x01\x1f\x0\x0\x0\x0″);
}
else
{ //uruchamia zdarzenie dla RM (55,3) wyłącza 9 wyjścia
SendDirectEventeHouse1((unsigned char *)”\x37\x03\x01\x09\x00\x0\x0\x0\x0\x0″);
}

}

Można do niej wpisać dowolne algorytmy sterujące dla systemu inteligentnego eHouse znacznie rozszerzając jego funkcjonalność w stosunku do systemu w wersji seryjnej.