
Witam serdecznie,
chciałbym przedstawić forumowiczom bardzo (jak dla mnie) ciekawe zastosowanie minikomputera Raspberry Pi+.
Repozytorium i sposób instalacji dostępne są pod tym adresem: https://github.com/tm-poland/sowa
Do tej pory do sterowania pompami kotła na paliwo stałe (drewno/ węgiel) stosowałem sterowniki Au... i Eu... do tego programator czasowy do bojlera, żeby lepiej wykorzystywać tańszą energię taryfy dwustrefowej G12w, programator czasowy do cyrkulacji CWU, termostat z kapilarą do cyrkulacji oraz przekaźnik czasowy do zrobienia tego, czego nie umieli producenci ww. sterowników. Ponieważ mam zawory odcinające z siłownikiem przed pompami, konieczne wydawało się wcześniej stosowanie dodatkowo przekaźników z cewką 230V, kontrolki faz, itd. Jednym słowem 1m2 ściany oblepiony "elektroniką" i kilogramy plastiku i metalu.
Teram mam tylko jedną "puszkę" i to własnej produkcji





Od bardzo długiego czasu chodził mi po głowie podobny projekt, jednak czegoś brakowało, żeby zacząć - tym "czymś" okazało się właśnie Raspberry Pi. Ten minikomputer ma dla poniższego zastosowania niesamowite zalety: bardzo małe zapotrzebowanie na energię, dużo wyjść sygnałowych, możliwość programowania w popularnych językach programowania. Dla mnie C (C++), ale jak się później okazało równie dobrym wyborem okazał się Python.
Zaczynałem od testów w Pythonie. To było moje pierwsze zetknięcie z tym językiem. Po kilku godzinach miałem już prosty działający sterownik z serwerem TCP/IP.
Po wielu wieczorach bardzo przyjemnej pracy, wykorzystując Pythona, PHP, JavaScript i skrypty powłoki powstał "serwer kotłowni".
Backend to wielowątkowy serwer z obsługą zapytań po TCP/IP napisany w Pythonie konfigurowany jak każdy serwer linuxowy za pomocą pliku konfiguracyjnego. Niesamowitą zaletą tego serwera jest małe zapotrzebowanie na zasoby. Na początku się tego obawiałem, wiedząc jak bardzo Python jest językiem wysokopoziomowym, ale niepotrzebnie - wyszło lepiej niż się tego spodziewałem. Gdyby nie biblioteka "1-wire", to obciążenie procesora byłoby bliskie zeru.

Wszystko jest zamknięte w taniej, fajnej i przestronnej obudowie SEZ-506 SK.
Z ciekawszych elementów widocznych na zdjęciach powyżej można wymienić moduł 8-przekaźnikowy ze stykami o obciążalności 10A oraz moduł termopary, czyli przetwornik analogowo-cyfrowy na bazie MAX6675.
Na płytce uniwersalnej widać dużą ilość potencjometrów. Służyły mi do regulacji jasności diod. Może niezbyt fachowy pomysł, ale zdał egzamin. Teraz po zmierzeniu rezystancji można by je zamienić na stałe oporniki.
Dobrym pomysłem jest też użycie potencjometru do sterowania oporem magistrali 1-wire (odczyt temperatur). Domyślnie potrzeba 4.7 kOhm, jednak przy długich przewodach trzeba zmniejszyć tą wartość i w tym pomaga rezystor regulowany.
Minikomputer podłączony jest pod sieć za pomocą Ethernetu. Wcześniej miałem WiFi, ale jednak co po kablu to po kablu. WiFi działało bezproblemowo, ale jednak kabel zapewnia spokój umysłu.
System działa całkowicie samodzielnie. Nie potrzebuje podłączenia do sieci. Potrzebne jest to dla użytkownika, żeby mógł pooglądać sobie jak to działa i korzystać ze "stacji pogodowej".
Dodatkowo mam podłączenie do upsa przez USB, żeby po dłuższej przerwie w dostawie prądu serwer i RPi miękko się wyłączył.
Włączanie i wyłączanie serwera jest oczywiście obsługiwane przez skrypty systemowe, tak więc bezproblemowo automatycznie się uruchamia i wyłącza.
Aby oglądać w przeglądarce działanie systemu/ serwera, konieczne jest zainstalowanie na RPI serwera www (np. lighttpd) i żeby przetrzymywać stany serwer bazy danych MySQL lub obsługę SQLite3. Oczywiście nic nie stoi n przeszkodzie by używać zdalnego serwera bazy danych i nie obciążać tym zadaniem RPi.
Frontendem jest strona/aplikacja napisana w PHP z Ajaxem. Bardzo przyjemna - intuicyjna i jak na obecne czasy przystało - przyjazna do "palcowania" na tablecie czy smartfonie. Oczywiście wszystkie odczyty są pobieranie i odświeżane na bieżąco niezauważalnie dla użytkownika.
Zrzuty z przeglądarki komputera:







Zrzuty ze smartfona:




Teraz może troszkę o funkcjonalności.
Żeby przybliżyć złożoność i mnogość ustawień, zamieszczę przykładowy plik konfiguracyjny systemu:
Code:
# Plik konfiguracyjny SOWA1
#===== USTAWIENIA GŁÓWNE =====
[general]
debug = False
loglevel = 2
logfile = ./log/sowa.log
dioda = 5
czujnik_temp = 00000585ad32
czujnik_temp_zew = 0000061b5cab
czujnik_temp_wew = 0000061cff31
port = 8888
relay_on = 0
relay_off = 1
password = ala*
host =
#===== BAZA DANYCH =====
[mysql]
wlaczone = True
user = pi
pass = ###
db = sowa
host = localhost
freq_zapisu = 300
[sqlite3]
wlaczone = True
db = sowa.db
freq_zapisu = 300
#===== OBIEG CO =====
[co]
wlaczone = True
czas_probek_temp = 60
t_petli = 1
histereza = 2
gpio = 21
rozpalanie_delta = 2
wygaszanie_delta = 1
dioda = 24
rozpalanie_dioda = 25
wygaszanie_dioda = 23
rozpalanie = True
wygaszanie = True
czujnik_temp_zasilania = 00042b12abff
czujnik_temp_powrotu = 00042e078dff
gdy_priorytet_cwu = True
temp_alarm = 95
# temp przy ktorej wylacza sie rozpalanie i zaczyna pracować pompa co
temp_rozpalanie = 45
# temperatura poniżej której możliwe jest uruchomienie wygaszania
temp_wygaszanie = 40
# temp przy ktorej zaczyna pracowac pompa co i ponizej ktorej przestaje pracowac
# z uwzględnieniem histerezy, gdy wylaczone wygaszanie
temp_start = 45
# minimalna temperatura przy ktorej dziala pompa co gdy wlaczona jest opcja
# wygaszania
temp_min = 34
#===== OBIEG CWU =====
[cwu]
wlaczone = True
czujnik_temp = 00042b12c6ff
gpio = 26
dioda = 18
t_petli = 1
# pozwala na dorzewanie wody gdy systen ma stan rozpalania, czyli gdy piec
# dopiero nabiera temperatury
gdy_rozpalanie = True
# gdy priorytet jest włączony inne moduły powinny przestać pracować, chyba że
# mają ustawioną opcje pozwalającą na ignorowanie priorytetu CWU
priorytet = True
temp_max = 50
# min. temperatura zasilania CO, przy której włączy się dogrzewanie CWU
temp_min_co = 30
temp_alarm = 95
histereza = 4
#===== CYRKULACJA CWU =====
[cyrkulacja]
wlaczone = True
histereza = 2
czujnik_temp = 00042e06cbff
t_petli = 1
gpio = 19
dioda = 27
harmonogram_wlaczony = True
harmonogram = <01-01-2014 06:00>1,2,3,4,5</31-12-2014 07:00>;
<01-01-2014 06:00>6,7</31-12-2014 09:00>
temp_max = 25
temp_alarm = 95
manual = False
#===== GRZAŁKA =====
[grzalka]
wlaczone = True
t_petli = 1
gpio = 16
dioda = 22
histereza = 2
temp_max = 45
# czy grzałka ma grzać jak działa obieg CWU
gdy_cwu = False
# czy grzałka ma grzać jak działa obieg co w trybie pracy lub rozpalania
# nie dotyczy to trybu wygaszania, wtedy grzałka może działać bezwarunkowo
gdy_co = False
# grzałka włączona 24h
manual = False
# czy włączony harmonogram grzania
harmonogram_wlaczony = True
# harmonogram grzania grzałki
# poniedzialek to 1 niedziela 7
# przykład: "<01-01-2014 13:00>1,2,3,4,5</31-03-2014 15:00>"
harmonogram = <01-01-2014 13:00>1,2,3,4,5</31-03-2014 15:00>;
<01-04-2014 15:00>1,2,3,4,5</30-09-2014 17:00>;
<01-10-2014 13:00>1,2,3,4,5</31-12-2014 15:00>;
<01-01-2014 04:00>1,2,3,4,5</31-12-2014 06:00>;
<01-01-2014 06:00>6,7</31-12-2014 09:00>;
<01-01-2014 16:00>6,7</31-12-2014 21:00>
#===== OGRZEWANIE PODŁOGOWE =====
[ogrzewanie_podlogowe]
wlaczone = True
histereza = 2
czujnik_temp = 00042e06edff
gdy_rozpalanie = False
gdy_priorytet_cwu = True
gpio = 20,13
dioda = 17
temp_min_co = 25
temp_alarm = 95
t_petli = 1
#===== TERMOPARA =====
[termopara]
wlaczone = True
gpio_cs = 10
gpio_clock = 11
gpio_data = 9
t_petli = 1
temp_alarm = 150
tylko_gdy_co = True
Funkcjonalności:
* odczyt temperatury wewnętrznej (z domu) i zewnętrznej
* sterowanie pompami CO, odczyty temperatur z zasilania, powrotu, temperatury spalin
* sterowanie pompami CWU z odczytem temperatury CWU
* sterowanie pompami cyrkulacji CWU z odczytem temperatury
* sterownia grzałką zasobnika CWU
* sterowanie pompami ogrzewania podłogowego z odczytem temperatury
Dodatkowo:
* możliwość generowania statystyk działania systemu dla dowolnie wybranego przedziału czasowego
* możliwość odczytania stanów systemu dla dowolnie wybranego przedziału czasowego
* konfigurowanie systemu z przeglądarki (zabezpieczone hasłem) lub z pliku konfiguracyjnego
* obserwacja dzienników pracy systemu na bieżąco za pomocą przeglądarki
System ma budowę modułową, czyli użytkownik może np. wyłączyć wszystkie moduły pozostawiając jedynie sterowanie grzałką bojlera.
Żeby połączyć się z serwerem np. z pracy lub z plaży, wystarczy forwardować port serwera WWW na zewnątrz lub skorzystać z połączenia VPN.
To tyle. Oczywiście mam nowe pomysły na rozszerzanie funkcjonalności. Niestety ponieważ niepotrzebne mi było/ nie dysponuję sprzętem, nie zaimplementowałem obsługi wentylatora i zaworów cztero- i trójdrogowych, ale pewnie... kto wie... może... zobaczymy.

W najbliższym czasie dodam obsługę alarmów. Dotychczas serwer "rozgania" temperaturę bez powiadamiania, ale przydałaby się może jakaś krótka informacja mailem lub SMS-em. Zobaczymy.
Pisanie tego wszystkiego zajęło mi kilkanaście wieczorów (czasem nocy), ale bardzo się opłaciło. Jestem niesamowicie zadowolony z siebie,

Od strony programistycznej: całość to ok. 1600 linii kodu w Pythonie, ok. 1100 mix PHP i HTML oraz ok. 600 w JavaSript. Było więcej, ale każdą wolną chwilę spędzam na jednym z moich ulubionych zajęć - optymalizacji

Koszty, koszty: wszystko, co potrzebne zamknęło się w 300-350 zł. Dużo kupowałem u chińczyków, ale głównie dla frajdy otrzymywania "prezentów" z końca świata, czasami też niektóre elementy są u nich łatwiej dostępne.
Repozytorium i sposób instalacji dostępne są pod tym adresem: https://github.com/tm-poland/sowa
Błędy i uwagi proszę zgłaszać przy pomocy githuba: https://github.com/tm-poland/sowa/issues
Cool? Ranking DIY