Temat: HomeServices by BBarwik v1.0
Witam.
Jako że moje skrypty do stacji meteo ( http://eko.one.pl/forum/viewtopic.php?id=7073 ), wydane dość dawno bo w sumie to aż 2 lata temu, zdobyły dość sporą popularność postanowiłem opublikować nowy zestaw skryptów do sterowania domem które używam.
Dość długo trzeba było czekać, nie mieszkam już w domu jednorodzinnym tylko w mieszkaniu w Wawie, więc aktualizuje/usprawniam te systemy dopiero jak pojawiam się u siebie w domu.
Aktualnie w zestawie HomeServices znajdują się:
- Wykres z temperaturami
- Sterowanie przekaźnikami
- Automatyczne włączanie przekaźnika wg. danych z termometrów (sterowanie ogrzewaniem)
- Aplikacja na androida do sterowania
Do pełnego działania skryptów będą potrzebne następujące rzeczy:
- Urządzenie które pozwoli odczytać temperaturę lub inne wartości z sensorów. Ja stosuje MP00202 i termometry DS18B20
- Urządzenie sterujące przekaźnikami, z możliwością przełączenia przekaźnika i odczytania jego stanu. Ja używam http://allegro.pl/modul-8-przekaznikow- … 34811.html
- Serwer www, php-cli + sterowniki potrzebne do kontroli urządzeń usb.
- Przyda się z 1 mb miejsca na dysku ;d
- Podstawowa znajomość php
Na początek trzeba pobrać archiwum z adresu http://bbarwik.com/control.zip (Ostatnia aktualizacja 30 grudnia)
Struktura plików w nim:
data/ - folder na zapisywanie danych przez skrypty
sensors/ - miejsce na zapis historii temperatury
www/ - folder z plikami dostępnymi z przeglądaki
www/js/ - skrypty js do wykresów temperatury, można przerzucić na inny serwer i zaoszczędzić 300 kb
www/meteo.php - skrypt php wyświetlający wykresy temperatury
www/piec.php - skrypty php do sterowania piecem
www/meteo_data.php - skrypt wysyłający dane dla wykresów
www/index.php - strona główna, sterowanie przekaźnikami, aktualna temperatura
www/api.php - api do działania aplikacji na telefonie
config.php - praktycznie jedynie plik który trzeba edytować, konfiguracja skryptów
functions.php - dodatkowe funkcje
cron.php - skrypt który trzeba dodać do crona aby wszystko działało
convert.php - konwerter starych plików z temperaturami do nowego formatu
digitemp.conf - plik konfiguracyjny dla digitempa
Teraz trzeba to wszystko wrzucić na serwer, sugeruje utworzeniu folderu /control i wrzucenie wszystkiego do niego, api ścieżki do plików wyglądały następująco: /control/www/index.php, /control/digitemp.conf, itd...
Trzeba teraz skongurować digitempa aby dane przez niego zwracane miały format ID:WARTOŚĆ, przykład:
28B4562E0500009C:38.125000
28DC502E05000062:43.312500
281E447405000033:22.000000
28716A2E0500004D:35.250000
2873702E050000E2:41.750000
2807772E050000F7:37.187500
W tym celu kopiujemy swój config digitempa (/root/.digitemprc) do /control/digitemp.conf i zmieniamy wartość LOG_FORMAT na:
LOG_FORMAT "%R:%C"
Ok, teraz pora na konfiguracje /control/config.php
Na początek do ustawienia jest, hasło. Zmieniamy wartość hasła na takie jakie nam odpowiada
$password = "nasze_haslo";
Teraz sekcja switches, czyli nasze przekaźniki. Zakładam domyślnie że mamy ich 8, może być dowolna ilość tylko trzeba potem będzie edytować funkcje w dalszej części configa.
$switches = array(
"1" => array("name" => "Przekaźnik 1", "www_name" => "Przekaźnik 1", "type" => 1, "timers" => array(15,30,60,120), "max_time" => 240, "timer" => "/control/data/timer_1", "custom_state" => "/control/data/cstate_1"),
"2" => array("name" => "Przekaźnik 2", "www_name" => "Przekaźnik 2", "type" => 1, "timers" => array()),
"3" => array("name" => "Przekaźnik 3", "www_name" => "Przekaźnik 3", "type" => 2, "timers" => array()),
"4" => array("name" => "Przekaźnik 4", "www_name" => "Przekaźnik 4", "type" => 3, "timers" => array()),
"5" => array("name" => "Przekaźnik 5", "www_name" => "Przekaźnik 5", "type" => 1, "timers" => array(15,60), "timer" => "/control/data/timer_5"),
"6" => array("name" => "Przekaźnik 6", "www_name" => "Przekaźnik 6", "type" => 3, "timers" => array()),
"7" => array("name" => "Przekaźnik 7", "www_name" => "Przekaźnik 7", "type" => 1, "timers" => array(15,60), "timer" => "/control/data/timer_7"),
"8" => array("name" => "Przekaźnik 8", "www_name" => "Przekaźnik 8", "type" => 2, "timers" => array())
);
Wszystkie przekaźniki muszą zawierać wartości name, www_name, type i timers (jako array). Ich kolejność może być dowolna, nie ma co sugerować się wartościami od 1 do 8. Będą wyświetlane na stronie i aplikacji wg. ów kolejności.
Pierwsza wartość, czyli klucz (to przed =>) to id przekaźnika. Standardowo wartości od 1 do 8. Opis innych pól:
name - nazwa przekaźnika wyświetlana w aplikacji na telefonie
www_name - nazwa przekaźnika wyświetlana w przeglądarce
type - rodzaj przekaźnika. 0 - nie działa, 1 - przekaźnik typu on/off, 2 - przekaźnik typu switch, jedyne działanie to przełącz stan (to wyłącznika schodowego), 3 - signal (załącza przekaźnik i po 1 sec. wyłącza, do np. sterowania bramą), 5 - kategoria (do aplikacji na telefonie, grupuje przekaźniki, nie wymaga klucza i timers)
times - możliwość czasowego włączenia przekaźnika, najlepiej dawać wielokrotności dwójki w array (żeby ładnie to w aplikacji na
telefonie wyglądało). Działa póki co tylko dla type = 1, ale przy type 0,2,3 jest to pole wymagane jako array();
max_time - maksymalny czas działania w minutach przy standardowym włączeniu, wymagany dla pieca
timer - plik z plikiem w którym będzie czas o którym przekaźnik ma się wyłączyć. Jak używamy włączenia czasowego lub dotyczy pieca to jest wymagany
custom_state - plik w którym będzie przechowywany specjalny stan przekaźnika, w praktyce tylko dla pieca, jeśli będzie działał wg. jakiegoś programu to jego nazwa będzie w nim
Kolejne wartości dotyczą sensorów (termometrów):
$sensors_state_file = "/control/data/last_meteo";
$sensors_state_history_dir = "/control/sensors";
$sensors_data_limit = 20000;
$sensors = array(
"LABEL_TERMOMETRY" => array("type" => 2, "name" => "Termometry"),
"281E447405000033" => array("type" => 1, "name" => "Przykładowy", "visible" => true),
);
$sensors_state_file - plik z ostatnim odczytem danych z termometrów, sugeruje nie zmieniać
$sensors_state_history_dir - katalog z plikami w których będzie historia temperatur, sugeruje nie zmieniać
$sensors_data_limit - limit pomiarów dla wykresu w meteo.php
$sensors - tutaj wrzucamy termometry, klucz to id termometra które zwraca digitemp, opis pól w array:
type - 1 to termometr, 2 to kategoria, wartość LABEL_TERMOMETRY sugeruje zostawić, oddziela termometry w apce na androidzie, można dodać własne kategorie
name - nazwa termometru/kategorii
visible - czy wyświetlać domyślnie na wykresie
Kolejny element, ogrzewanie:
$heating = array(
"enabled" => true,
"id" => 1,
"programs" => "/control/data/heating_programs"
);
wartości:
enable - true/false, czy sterowanie ogrzewaniem działa
id - id przekaźnika odpowiedzialnego za ogrzewanie
programs - plik z programami dla pieca, sugeruje nie zmieniać
I ostatnie zmienne:
$extra_links = array(
"meteo.php" => "Wykresy temperatur"
);
Są to dodatkowe linki wyświetlane na dole w index.php
Trzeba będzie jeszcze trochę pozmieniać w funkcjach.
w
function get_state()
trzeba zmienić polecenie
system("/bin/RelayBoard /dev/ttyUSB1 get > /tmp/relay_state");
W praktyce jeśli używacie RelayBoard to zmieńcie /dev/ttyUSB1 na link wskazujący na wasze urządzenie oraz ścieżkę do pliku RelayBoard. Jak nie używacie relaybaord trzeba będzie jeszcze edytować 3 następne linijki, tak aby zmienna $state zawierała stan przekaźników.
w
function update_sensors_state()
zmieniamy
system("digitemp_DS9097U -s /dev/ttyUSB0 -q -a -c /control/digitemp.conf > /tmp/digitemp");
na naszą komendę do digitempa, w praktyce należy zmienić jedynie digitemp_DS9097U na nasz model o ile mamy inny i /dev/ttyUSB0 na ścieżkę do naszego urządzenia
w
function power_on($id,$time = -1,$extra = "") {
trzeba zmienić
system("/bin/RelayBoard /dev/ttyUSB1 on ".($id)."");
Na polecenie które włączy u nas przekaźnik o id $id
w
function power_off($id) {
trzeba zmienić
system("/bin/RelayBoard /dev/ttyUSB1 off ".($id)."");
Na polecenie które wyłączy u nas przekaźnik o id $id
w
function power_inv($id) {
trzeba zmienić
system("/bin/RelayBoard /dev/ttyUSB1 inv ".($id)."");
Na polecenie które przełączy u nas przekaźnik o id $id (to jest akcja dla type = 2)
Powoli zbliżamy się do końca.
Konwersja starych danych z temperaturą na nowy format
Nowy format danych jest mocno zoptymalizowany. Dane są przechowywane w formacie binarnym, po 6 bajtów na jeden rekord. Jest to ponad 3x mniej niż w poprzedniej wersji. 1 termometr z zapisem co 10 min przez rok wygeneruje 315 KB danych.
Co prawda dałoby się to upchać jeszcze do 5 bajtów gdyby pozbyć się sekund i jednostek minut w wartości czasu, ale nie chciało mi się już tego robić
Trzeba uruchomić skrypt convert.php z dwoma parametrami, jeden to stary plik z danymi, a drugi to lokalizacja nowego pliku z danymi, przykład
/usr/bin/php-cli convert.php '/root/stary_plik.txt' '/control/sensors/281E447405000033'
Końcowa konfiguracja
Teraz należy dodać wpis do crona aby skrypt /control/cron.php uruchamiał się co minute (Danę z sensorów będą i tak zapisywane co 10 minut, komenda crontab -e)
* * * * * cd /control; /usr/bin/php-cli cron.php
I na koniec należy skonfigurować serwer www aby umożliwiał dostęp do /control/www, najłatwiej będzie zrobić to poleceniem:
ln -s /control/www /www/control
Należy pamiętać o tym że serwer musi obsługiwać skrypty php.
Dodawanie programów dla pieca:
1. Nazwa: dowolna
2. Warunki: tutaj musi być id termometru (masz podane id poniżej przy termometrach np. 28716A2E0500004D) znak porównawczy czyli <, >, = (ciekawe czy ktoś kiedyś użyje równości) oraz temperatura, kolejne termometry oddzielone enterem (muszą się wszystkie zgadzać by program został załączony). Przykłady
28716A2E0500004D < 18
28B4562E0500009C > 19.5
albo
281E447405000033 < 10.55
3. Ramy czasowe, przykłady (zachowaj format, różne ramy czasowe oddzielone enterem, od 0:00 do 23:59, nie można dać np. 23:00-7:00 tylko trzeba 23:00-23:59 <enter> 0:00-7:00):
12:00-16:00
19:30-23:30
albo
8:00-21:00
Reszty już raczej nie muszę opisywać
Zostaje jeszcze aplikacja na androida, pobieramy ją z adresu http://bbarwik.com/app.apk
Po instalacji, otwieramy i klikamy na ikonkę w prawym górnym roku, wprowadzamy adres:
http://nasz_serwer/control/api.php?pass=nasze_haslo
Załadują się wtedy informacje o przekaźnikach i termometrach.
Screeny:
Kontakt do mnie to bbarwik@gmail.com, proszę jednak unikać proszenia mnie o pomoc w konfigurowaniu bo zazwyczaj nie mam czasu na takie rzeczy. Ew. błędy i propozycje proszę przedstawiać w tym temacie, jak wrócę do domu w grudniu i będę rozwijał dalej ten system to wtedy się wszystkim zajmę. Chyba że będą jakieś błędy krytyczne to poprawię je od razu.
Byłoby miło gdyby osoby które korzystają z tego, podrzuciły link do swoich wykresów temperatury, dobrze by było wiedzieć że ktoś z tego korzysta
MR3420v2 + 2xWDR3600 + Foxconn NT-435 + Foxconn NT-535.
Niestety teraz wynajmuję mieszkanie więc tymczasowo plany rozbudowy wstrzymane