Cześć, Jakiś czas temu zakupiłem dwa „lidlowe” termostaty grzejnikowe RT2000BT (Comet Blue). W oryginalnej aplikacji EUROprog brakowało mi kilku funkcji. Wgryzłem się w temat „Bluetooth LE” i okazało się, że możliwe jest napisanie aplikacji na androida posiadającej funkcje, których nie ma fabryczny soft.
Moja aplikacja posiada następujące funkcje:
- Pokazanie aktualnej temperatury na czujniku termostatu (uwzględnia offset).
- Pokazanie aktualnie ustawionej temperatury.
- Pokazanie zaprogramowanych temperatur (oszczędzania i grzania).
- Możliwość ręcznej zmiany ustawionej temperatury.
- Możliwość zmiany trybu pracy auto/manual.
- Pokazanie stanu naładowania baterii.
- Aplikacja pamięta ostatnio wprowadzony PIN (jeżeli mamy kilka urządzeń, to najlepiej ustawić na nich ten sam PIN).
Aplikację testowałem na dwóch urządzeniach jedno z androidem 5.1, drugie z androidem 4.4. Jeżeli będziecie mieli jakieś problemy to dajcie znać.
Nie będę tu opisywał zasad komunikacji BLE i kodu aplikacji w javie, przedstawię tylko, w jaki sposób można odczytać/zapisać dane do Comet Blue, które są uniwersalne dla wszystkich platform. Listę charakterystyk zawierających interesujące nas dane otrzymałem na dwa sposoby:
- analiza logów z pliku btsnoop_hci.log za pomocą programu Wireshark.
- za pomocą aplikacji na androida: nRF Master Control Panel (BLE)
Najważniejsze dane są zawarte w charakterystykach serwisu 47e9ee00-47e9-11e4-8939-164230d1df67. Odczyt poniższych charakterystyk jest możliwy po podaniu PIN. W tym celu do charakterystyki 47e9ee30-47e9-11e4-8939-164230d1df67
musimy zapisać aktualny PIN ustawiony w aplikacji EUROprog.
Service: 47e9ee00-47e9-11e4-8939-164230d1df67
Characteristic | Data | Value |
---|---|---|
47e9ee01-47e9-11e4-8939-164230d1df67 | Actual time | 37:11:12:01:10 |
47e9ee10-47e9-11e4-8939-164230d1df67 | Monday | 25:84:00:00:00:00:00:00 |
47e9ee11-47e9-11e4-8939-164230d1df67 | Tuesday | 25:84:00:00:00:00:00:00 |
47e9ee12-47e9-11e4-8939-164230d1df67 | Wednesday | 25:84:00:00:00:00:00:00 |
47e9ee13-47e9-11e4-8939-164230d1df67 | Thursday | 25:84:00:00:00:00:00:00 |
47e9ee14-47e9-11e4-8939-164230d1df67 | Friday | 25:84:00:00:00:00:00:00 |
47e9ee15-47e9-11e4-8939-164230d1df67 | Saturday | 2a:84:00:00:00:00:00:00 |
47e9ee16-47e9-11e4-8939-164230d1df67 | Sunday | 2a:84:00:00:00:00:00:00 |
47e9ee20-47e9-11e4-8939-164230d1df67 | Holiday_1 | 09:06:02:10:09:0d:02:10:00 |
47e9ee21-47e9-11e4-8939-164230d1df67 | Holiday_2 | 00:00:00:00:00:00:00:00:00 |
47e9ee22-47e9-11e4-8939-164230d1df67 | Holiday_3 | 00:00:00:00:00:00:00:00:00 |
47e9ee23-47e9-11e4-8939-164230d1df67 | Holiday_4 | 00:00:00:00:00:00:00:00:00 |
47e9ee24-47e9-11e4-8939-164230d1df67 | Holiday_5 | 00:00:00:00:00:00:00:00:00 |
47e9ee25-47e9-11e4-8939-164230d1df67 | Holiday_6 | 00:00:00:00:00:00:00:00:00 |
47e9ee26-47e9-11e4-8939-164230d1df67 | Holiday_7 | 00:00:00:00:00:00:00:00:00 |
47e9ee27-47e9-11e4-8939-164230d1df67 | Holiday_8 | 00:00:00:00:00:00:00:00:00 |
47e9ee2a-47e9-11e4-8939-164230d1df67 | status | 00:00:08 |
47e9ee2b-47e9-11e4-8939-164230d1df67 | Settings | 34:2f:21:2f:fc:04:0a |
47e9ee2c-47e9-11e4-8939-164230d1df67 | Battery | 43 |
47e9ee2d-47e9-11e4-8939-164230d1df67 | Soft | soft cobl0126 |
47e9ee2e-47e9-11e4-8939-164230d1df67 | unknown | "1e-00" |
47e9ee30-47e9-11e4-8939-164230d1df67 | pin | 43:b1:01:00 |
Jak zinterpretować dane zapisane w Hex:
- Aktualny czas (47e9ee01-47e9-11e4-8939-164230d1df67):
Name | Value | Data |
---|---|---|
Actual time | 37:11:12:01:10 | 16.01.18 17:55 |
Wartości zamieniamy na DEC i czytamy od prawej.
- Dni tygodnia (4 przedziału czasu grzania, 2 bajty każdy przedział)
Name | Value | Data |
---|---|---|
Mo-Su | 25:84:00:00:00:00:00:00 | 06:10-22:00 |
Zamieniam na DEC i mnożymy przez 10 min: h25 = d37 3710min=370min=6h10min h84=d132 13210min=1320min=22:00
- Urlop
Name | Value | Data |
---|---|---|
Holiday 1-8 | 09:06:02:10:09:0d:02:10:18 | 9:00 6.02.16 do 9:00 13.02.16; 12°C |
Wartości zamieniamy na DEC i czytamy od lewej, ostatni bajt pomnożony przez 0,5 to temperatura.
- Aktualny status urządzenia (47e9ee2a-47e9-11e4-8939-164230d1df67)
Name | Value |
---|---|
Status | 00:00:08 |
Tej charakterystyki nie mam rozszyfrowanej w 100%, to co wiem to opiszę:
-
pierwszy bajt od lewej
- 00 - tryb automatyczny
- 01 - tryb manualny
- 08 - blokada rodzicielska
- 10 - ochrona przed zamarzaniem
-
drugi bajt
- 00 - silnik w spoczynku
- 01 - silnik w ruchu
- Ustawienia (47e9ee2b-47e9-11e4-8939-164230d1df67)
Name | Value |
---|---|
Settings | 34:2f:21:2f:fc:04:0a |
bajt | hex | dec | wartość | opis |
---|---|---|---|---|
0 | 0a | 10 | 10 | czas otwarte okno[min] |
1 | 04 | 04 | 04 | czułość "okno" możliwe ustawienia 04,08,0c |
2 | fc | 252 | -2,5 | offset |
3 | 2f | 47 | 23,5 | T comfort |
4 | 21 | 33 | 16,5 | T economy |
5 | 39 | 57 | 28,5 | T target |
6 | 32 | 50 | 64 | T actual |
- Bajty 0 i 1 - ustawienia funkcji „otwarte okno:
- Bajt 2 – ustawienia offsetu temperatury mierzonej.
- Bajt 3 – zaprogramowana temperatura grzania/komfortowa
- Bajt 4 – zaprogramowana temperatura oszczędzania/ekonomiczna
- Bajt 5 – docelowa temperatura w danym momencie
- Bajt 6 – aktualnie zmierzona temperatura
W przypadku temperatur wartości otrzymujemy mnożąc prze 0.5.
- Bateria (47e9ee2c-47e9-11e4-8939-164230d1df67)
Name | Value | Data |
---|---|---|
Battery | 43 | 67% |
- PIN (47e9ee30-47e9-11e4-8939-164230d1df67)
Name | Value | Data |
---|---|---|
pin | 43:b1:01:00 | 110 915 |
Czytamy bajty od prawej: 0001b143, zamieniamy na DEC i otrzymujemy pin jaki ustawiliśmy w aplikacji EUROprog.
- Niestety nie udało mi się w pełni rozszyfrować danych z charakterystyki „status”. Pokazywały się tam czasami inne wartości, ale jak na razie nie umiem ich zinterpretować. W lewym dolnym rogu aplikacji wyświetlają się aktualne wartości tej charakterystyki, więc może uda się kiedyś ustalić, co oznaczają te dane.
- Nie wiem, czy to wina mojej aplikacji, czy softu w termostacie, ale czasami samoistnie zmieniają się ustawienia zaprogramowanej temperatury dla soboty i niedzieli. Zapisane dane zachowują się jakby zostały przesunięte o jeden bajt.
Kod źródłowy: Cały kod aplikacji udostępniam na GitHub. Może ktoś będzie miał chęć coś zmienić/dodać/ulepszyć. W celach niekomercyjnych, możecie korzystać do woli, ale jak coś wymyślicie to się pochwalcie ;)
- connect to web github
- connect to domoticz
- openhub
- home assistant
- iobroker