Łączenie kotła Vaillant z Raspberry Pi przez eBUS

Rozpoczął się sezon grzewczy. Tegoroczne lato nie rozpieszczało nas wysokimi temperaturami, podobnie jak początek jesieni, więc już na początku października przyszła pora na uruchomienie ogrzewania, pierwszy raz po zmianie kotła na gazowy . A jak uruchomić coś i nie wiedzieć co się dokładnie dzieje w środku? Co prawda pierwszy krok zrobiłem już dawno - na ważniejszych rurach, zaraz po zainstalowaniu nowego urządzenia, umieściłem termometry, z których odczyty trafiają do mojego systemu. Nie po to jednak kupiłem urządzenie, które obsługuje magistralę Ebus, żeby teraz tego nie wykorzystać. 

eBUS

Ebus, czyli Energy Bus, to interfejs komunikacyjny zaprojektowany do łączenia urządzeń związanych z ogrzewaniem. Asynchroniczna transmisja odbywa się z użyciem dwóch przewodów z prędkością 2400 bitów na sekundę. Szynę zaprojektowano tak, żeby poza transmisją danych, mogła także zasilać urządzenia. Stąd też wybór dość wysokich poziomów napięcia dla obu sygnałów logicznych: 9-12V dla 0 i 15-24V dla 1. Przy zalecanym przewodzie o przekroju 0,75mm², Vaillant podaje, że urządzenia mogą być oddalone nawet o 300 metrów. Do jednej szyny może być podłączonych równolegle wiele urządzeń.

Standard przewiduje także ogólny poziom komunikacji - adresację, podział na jednostki nadrzędne i podrzędne oraz sposób przekazywania komend i parametrów. Został on zaimplementowany przez kilku producentów (w tym przez Vaillanta), ale komendy różnią się między poszczególnymi realizacjami. Stąd też przy zgodności na poziomie sprzętowym, nie ma jej na wyższym poziomie.

Konwerter serial ttl-eBUS

Ponieważ eBUS jest interfejsem szeregowym, nie ma większego problemu ze zbudowaniem konwertera między portem szeregowym a magistralą eBUS. Opis konwertera i wiele innych informacji można znaleźć na stronie EBUS-FHEMWiki , Niestety informacje są w języku niemieckim, bo standard jest popularny głównie wśród producentów zza naszej zachodniej granicy. Właśnie taki konwerter udało mi się kupić z pośrednictem popularnego portalu ogłoszeniowego.

Z jednej strony do konwertera przykręca się dwa przewody magistrali, z drugiej 5V interfejs szeregowy (dwie linie danych, zasilanie i masę). Zwykle do tego interfejsu polecane są konwertery USB - serial ttl, ja jednak na razie zdecydowałem się na użycie standardowego portu szeregowego Raspbery Pi oraz konwersję napięcia z 3,3V na 5V. Docelowo być może spróbuję użyć Arduino do udostępnienia danych przez IP. Oprogramowanie, które będę używał bez problemu przyjmuje transmisję szeregową zarówno przez UDP, jak i TCP. Nie powinno więc być dużego problemu z tym. Chociaż jak znam życie, to pewnie motywacja do zmiany działającego rozwiązania będzie niewielka.

Sam konwerter ma formę płytki PCB, którą trzeba jakoś opakować. Przygotowałem więc i wydrukowałem obudowę , używając do tego fioletowego filamentu PLA .

Oba z najczęściej polecanych modeli konwerterów USB też mam, więc sprawdziłem je i jest prawdą, że opóźnienia są mniejsze, a powtórzone odczyty mniej powszechne. Warto więc rozważyć użycie jednego z nich. Są one też bez problemu rozpoznawane przez Raspberry Pi z Raspbianem.

Połączenie konwertera eBUS z Raspberry Pi

Raspberry Pi posiada port szeregowy działający z napięciem 3,3V, zlokalizowany na pinach 8 i 10 portu GPIO. Będziemy też potrzebowali napięcia 3,3V (pin 1), 5V (pin 2) oraz masy (pin 6).

Sygnał, jak i oba napięcia trzeba podłączyć do konwertera poziomów logicznych. 5V dodatkowo powędruje do konwertera TTL.

Samo podłączenie nie jest specjalnie skomplikowane, a w przygotowaniu odpowiednich złącz bardzo pomaga odpowiednia zaciskarka.

Port szeregowy i konwerter napięć był używany też przy podłączeniu centrali Satel do Raspberry Pi , nie jest to więc nic nowego.

Podłączenie do kotła Vaillant ecoTec VC 146

W tym miejscu muszę zaznaczyć, jak wszyscy, w podobnym przypadku, że jeżeli ktoś planuje podobne działania jak ja, to musi wiedzieć co robi. Ja oczywiście nie biorę odpowiedzialności za jakiekolwiek rady umieszczone na tym blogu. Każdy robi to na własną odpowiedzialność. Niemniej u mnie działa :-)

Zacznę od tego, że bardzo mi się podoba konstrukcja tego kotła. Obudowę zdejmuje się luzując tylko jeden wkręt, znajdujący się na dole. Panel z elektroniką odblokowuje się z użyciem czterech dość luźnych zatrzasków. Konstrukcja jest na tyle dobra, a materiały dobrej jakości, że trzeba dużego braku delikatności, żeby je połamać. Mi przynajmniej udało się tego nie zrobić.

Pływa główna posiada wygodne, wyjmowane konektory, a wśród nich jeden, oznaczony jako BUS. To właśnie nasz eBUS. Należy podłączyć do niego przewód i wyprowadzić go na zewnątrz przez przepusty. Złożenie konstrukcji to tylko kilka ruchów. I to wszystko. W takich momentach naprawdę docenia się staranność przy projektowaniu i przemyślaną konstrukcję.

Przygotowanie Raspberry Pi

Tyle zabaw manualnych, pora zająć się przygotowaniem systemu. Przyznam, że Raspberry Pi, konkretnie model B+ pierwszej wersji tego komputerka wygrzebałem w szafie z zasobami. Jest to zapas dla mojego głównego Raspberry Pi zarządzającego domem i spełniającego kilka innych funkcji. Jasne jest, że dla tak ważnego elementu powinno się mieć awaryjną sztukę. Ja jednak niedługo planuję migrację do Raspberry Pi 3, więc i zapasowy sprzęt można już wykorzystać. W każdym razie komputerek trzeba było zaopatrzyć w system operacyjny. Ściągnąłem więc ze strony Raspbiana opartego na nowym Debianie 9 (Strech), wydanym całkiem niedawno. Mimo, że Raspberry jest dwie generacje do tyłu, to nowy system działa bez problemu.

Po przeniesieniu obrazu na kartę, w pierwszej kolejności przeedytowałem pliki z partycji boot. W config.txt dodałem linię enable_uart=1, dla włączenia portu szeregowego. Na wszelki wypadek, żeby uniknąć wysyłania do portu szeregowania tekstów przy starcie systemu operacyjnego, usunąłem z pliku cmndline.txt opcje odpowiadające za konsolę szeregową. Utworzyłem też pusty plik o nazwie ssh na tej partycji, bo to umożliwia zalogowanie przez ssh w tej wersji systemu.

W dalszej kolejności należy wyłączyć konsolę na porcie szeregowym po uruchomieniu systemu. Można to zrobić używają raspi-config (Interfacing oprions/serial). W efekcie powinien pojawić się komunikat:

│ The serial login shell is disabled │ The serial interface is enabled

Dla działania portu szeregowego z akceptowalnymi opóźnieniami należy jeszcze ustawić flagę low_latency na porcie szeregowym używając polecenia:

sudo setserial /dev/ttyAMA0 low_latency

Oczywiście /dev/ttyAMA0, to właśnie nasz port szeregowy.

Instalacja oprogramowania

Do wymiany danych z kotłem użyjemy oprogramowania ebusd . Dla Raspbiana dostępna jest gotowa paczka .deb do zainstalowania. Wystarczy ją ściągnąć i uruchomić instalację przez:

sudo dpkg -i ebusd-3.0_armhf.deb (dla aktualnej wersji 3.0)

Do tego potrzebne są też pliki konfiguracyjne, które znajdują się w osobnym projekcie ebusd-configuration . Co prawda w tej chwili nie ma jeszcze paczki dystrybucyjnej dla wersji 3.0, jednak pliki z 2.1.x są z nią zgodne. Należy je umieścić w podkatalogu /etc/ebusd/.

W paczce z oprogramowaniem dostaniemy dwa programy:

  1. ebusd - daemon, który ma być uruchomiony cały czas w tle i nieustannie komunikować się (głównie odczytywać dane) z magistralą eBUS
  2. ebusctl - program do komunikacji z ebusd, za pomocą którego wydajemy mu polecenia i sprawdzamy stan; ebusctl może być też uruchamiany na innym komputerze niż ebusd, a komunikacja będzie się odbywać przez TCP (domyślny port 8888) - tego rozwiązania będę używał

Uruchomienie

Pierwsze uruchomienie programu najwygodniej przeprowadzić jest z ebusd działającym na pierwszym planie, żeby od razu widzieć komunikaty bez zaglądania do loga i w razie czego łatwo zatrzymać program. Można to zrobić dzięki komendzie:

sudo ebusd -f –scan-config -d/dev/ttyAMA0 –latency=20000

Opcja -f odpowiada za pozostawienie programu na pierwszym planie. Druga wymusza skanowanie szyny w poszukiwaniu urządzeń. Kolejna wskazuje port szeregowy. Ostatnia określa akceptowany poziom opóźnienia i jest konieczna dla współpracy z portem szeregowym na pinach GPIO. W przypadku konwertera USB nie byłaby konieczna.

To czego najbardziej oczekujemy, to komunikat:

[bus notice] signal acquired

Informuje on o odebraniu komunikacji. Jeżeli się nie pojawia to albo coś jest źle podłączone, albo trzeba pokręcić potencjometrem na konwerterze w celu ustawienia właściwego poziomu rezystancji. W każdym razie wynikiem musi być powyższy komunikat. W razie problemów warto posiłkować się terminalem szeregowym ustawionym na prędkość 2400 i oczekiwać regularnego pojawiania się znaków.

Gdy już mamy sygnał, powinno rozpocząć się skanowanie szyny:

[main notice] starting initial broadcast scan

Które z kolei po pewnym czasie powinno dać efekt w postaci znalezienia jakiegokolwiek partnera do rozmowy. W moim znaleziony został kocioł, a następnie wczytane odpowiednie pliki konfiguracyjne do komunikacji z nim:

2017-10-05 12:52:43.722 [bus notice] new master 03, master count 2 2017-10-05 12:52:48.826 [bus notice] scan 08: ;Vaillant;BAI00;0204;9602 2017-10-05 12:52:48.898 [main notice] read common config file /etc/ebusd/vaillan__t/scan.csv 2017-10-05 12:52:48.907 [main notice] read common config file /etc/ebusd/vaillan__t/broadcast.csv 2017-10-05 12:52:48.914 [main notice] read common config file /etc/ebusd/vaillan__t/general.csv _2017-10-05 12:52:48.929 [main notice] read scan config file /etc/ebusd/vaillant/_08.bai.csv for ID “bai00”, SW0204, HW9602 2017-10-05 12:52:50.597 [main notice] found messages: 196 (2 conditional on 24 c__onditions, 0 poll, 9 update)

W tej chwili ebusctl info powinien już pokazać odpowiednią informację:

version: ebusd 3.0.595c7c0 signal: acquired symbol rate: 23 max symbol rate: 76 reconnects: 0 masters: 3 messages: 197 conditional: 2 poll: 0 update: 9 address 00: master #1 address 03: master #11 address 08: slave #11, scanned “MF=Vaillant;ID=BAI00;SW=0204;HW=9602”, loaded “vaillant/bai.0010015600.inc” ([HW=9602]), “vaillant/08.bai.csv” address 31: master #8, ebusd address 36: slave #8, ebusd

Z kolei ebusctl find wskaże listę rejestrów, o które możemy pytać:

bai AccessoriesOne = no data stored bai AccessoriesTwo = no data stored bai AntiCondensValue = no data stored bai averageIgnitiontime = no data stored bai BlockTimeHcMax = no data stored bai BoilerType = no data stored bai ChangesDSN = no data stored bai CirPump = no data stored bai CodingResistor = no data stored bai CounterStartattempts1 = no data stored […]

W tej chwili jeszcze nie wiem dlaczego jedynym urządzeniem widocznym dla programu jest kocioł gazowy, a nie mam na liście sterownika VRC 700, jednak wszystko w swoim czasie.

Można już ustawić usługę do startu wraz z systemem. Trzeba najpierw podać właściwe opcje (jak wyżej, poza -f) w pliku /etc/default/ebusd, a potem ustawić usługę przez sudo systemctl enable ebusd.

Na koniec sprawdźmy jeszcze czy działa odczyt, np. pytając o aktualną temperaturę wody w zbiorniku c.w.u.:

pi@rpi2:/var/log $ ebusctl read StorageTemp 43.81;ok

Jak widać wszystko jest w porządku. W następnym kroku zajmiemy się pobieraniem i analizą danych. Potem trzeba będzie jakoś rozwiązać problem z komunikacją z VRC 700, żeby móc także sterować ogrzewaniem. To jednak temat na osobne wpisy.

Po co to wszystko?

Ktoś mógłby się zastanawiać, po co wogóle łączyć system automatyki domowej z kotłem. Powodów jest przynajmniej kilka.

  1. Żeby wiedzieć. Dobry monitoring domu to podstawa, a instalacja grzewcza jest jedną z najważniejszych w budynku. Można by powiedzieć nawet, że podstawową przynajmniej przez pół roku. Dobrze jest wiedzieć jak działa kocioł i co się dzieje w instalacji. Choćby po to, żeby coś zoptymalizować, czy wcześnie zauważyć, gdy zaczyna się dziać coś niedobrego.
  2. Żeby oszczędzać sterując ogrzewaniem - na codzień i podczas nieobecności. O możliwych oszczędnościach pisałem już przy okazji tekstu o systemie sterowania ogrzewaniem Bero , więc nie ma sensu się teraz powtarzać. Bero (także integrowane z system inteligentnego domu) i sterowanie kotłem oraz klimatyzatorem ma dać pełną kontrolę nad procesem ogrzewania domu.
  3. Żeby znać koszty - odczytywać zużycie gazu i wiedzieć jakiego rachunku się spodziewać.
  4. Żeby uniknąć zakupu firmowego internetowego sterownika do kotła, którego cena jest na tyle wysoka, że jego koszt zwracałby się bardzo długu. Tutaj za niewielką część tej ceny mam wiele więcej.
  5. Klucz do dobrej automatyki domowej to integracja różnych systemów. Im więcej czujników/danych i im szersze możliwości wpływania na różne instalacje ma system inteligentnego domu, tym lepiej może on działać. To naprawdę tak działa - z czasem budowanie nowych funkcjonalności przychodzi dużo prościej. To jednak też temat na szerszy wpis.
  6. A dlaczego nie? Zawsze można się czegoś nowego nauczyć :-)

Dla mnie te powody są wystarczające, żeby zainwestować trochę czasu w integrację. Bo koszt przy wydatkach na całą operację wymiany kotła jest właściwie pomijalny.

Zobacz także opis adaptera eBus w wersji 5 .