logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Wnętrze i inżynieria wsteczna elektrycznego podgrzewacza wody Ariston Velis 80 Wi-Fi na ESP32 (cz1)

p.kaczmarek2 12 Paź 2025 11:11 6150 79

TL;DR

  • Rozebrano i zbadano elektryczny podgrzewacz wody Ariston Velis 80 Wi‑Fi z modułem ESP32 oraz aplikacją Ariston NET, pod kątem inżynierii wstecznej sterowania.
  • W środku znaleziono panel z dwucyfrowym wyświetlaczem 7‑segmentowym, ESP32‑WATG‑32D, dodatkowy mikrokontroler, zasilacz na LNK623DG i pamięć Flash FM25Q64A13 64 M‑BIT.
  • Urządzenie kosztowało 322€, a dokumentacja podaje dla wersji 80 masę 27 kg, pojemność 65 litrów, hałas 15 dB oraz 27 kWh tygodniowo w trybie smart.
  • Przechwycono komunikację UART 115200 i 9600 baud, zbudowano dekoder PulseView do weryfikacji długości i CRC, a w logach rozpoznano ramki 0x23 i 0x25.
  • Dekodowanie nie jest jeszcze kompletne; protokół wymaga dalszej analizy, zanim da się wgrać własny firmware i sterować bojlerem z Home Assistant.
REKLAMA
📢 Słuchaj (AI):
  • #61 21849248
    DeDaMrAz
    Poziom 22  
    Posty: 612
    Pomógł: 34
    Ocena: 130
    Jestem w trakcie symulowania tego na suchym stole warsztatowym (wygodniej 😁) jest stabilny i działa, wszystkie elementy sterujące są teraz uruchomione, więc więcej testów nastąpi. W tej chwili nie ma implementacji HA (odkrywanie), a indeks jest nadal szorstki + dziennik jest ciężki do debugowania do celów testowych. Po zakończeniu testów opublikuję więcej ustaleń i udokumentuję wszystko na przyszłość.

    Myślę, że już to opublikowałem, ale warto powtórzyć

    ### CMD 0x33 — Control Write (ESP → Boiler, on demand)
    
    To change boiler settings, the ESP sends a CMD 0x33 with a 2-byte register ID and value:
    
    | Register | Value        | Description                         |
    | -------- | ------------ | ----------------------------------- |
    | `05 21`  | `01` / `00`  | App/UI power state ON / OFF         |
    | `06 21`  | `01` / `00`  | Mode selector (manual/eco, TBD map) |
    | `DD 27`  | `01`         | Power ON                            |
    | `DD 27`  | `05`         | Standby                             |
    | `DD 27`  | `09`         | Boost ON                            |
    | `79 2D`  | `XX XX` (LE) | Target temperature x 10             |
    | `0A 21`  | `01` / `00`  | Anti-legionella ON/OFF              |
    | `CC 4B`  | `08`         | WiFi STA connected                  |
    | `CC 4B`  | `06`         | WiFi connecting                     |
    | `CC 4B`  | `04`         | WiFi AP mode                        |
    | `CC 4B`  | `00`         | WiFi OFF                            |


    To tylko zestaw poleceń sterowania WiFi, istnieje zestaw telemetrii (cmd 0x23), inicjacja systemu / raport (cmd 0x52) i ogólny (0x25) zestaw poleceń, który jestem w trakcie pełnego zrozumienia.

    ## Byte-Level Frame Maps (working decode)
    
    Conventions:
    - Offsets below are payload offsets (start at payload byte 0, not frame start).
    - `u16le@N` means little-endian 16-bit value using payload bytes `[N]` and `[N+1]`.
    - `?` means not yet fully decoded/confirmed.
    
    ### CMD23 response maps
    
    1) Water tuple response (len=12), query: `60 10 68 13 69 13 6A 13 6B 13 43 51`
    - `u16le@0`  : water/avg temp candidate #1 (x10 C)
    - `u16le@2`  : water/avg temp candidate #2 (x10 C)
    - `u16le@4`  : water/avg temp candidate #3 (x10 C)
    - `u16le@6`  : water/avg temp candidate #4 (x10 C)
    - `u16le@8`  : water/avg temp candidate #5 (x10 C)
    - `u16le@10` : often `0xFFFF` sentinel
    
    2) Current/target response (len=12), query: `4A D8 ... 71 9E`
    - bytes `0..7`   : status/unknown block (`?`)
    - `u16le@8`      : `TEMP_CUR` (x10 C)
    - `u16le@10`     : `TEMP_SET` (x10 C)
    
    3) Heater response (len=10), query: `4F 9D ... 57 D1`
    - bytes `0..1`   : status word (`?`) commonly `C9 00`
    - `u16le@2`      : heater power (W), observed `0` or `1500`
    - bytes `4..7`   : error/status reserved (`?`)
    - bytes `8..9`   : status tail (`?`) commonly `9B 00`
    
    4) Time-to-temp/showers response (len=7), query: `D3 4B ... CC 4B`
    - byte `0`       : status/flags (`?`) usually `00`
    - byte `1`       : status/flags (`?`) often `04`/`4E`
    - byte `2`       : showers candidate
    - byte `3`       : time-to-temp candidate
    - byte `4`       : status (`?`) often `00`
    - byte `5`       : constant-like `0x1B` in many captures (`?`)
    - byte `6`       : mode/state nibble-like (`?`) often `08/06/05/00`
    
    5) On-time response (len=6), query: `DA 40 ... CF 3D`
    - `u16le@0`      : uptime-like counter (minutes in current interpretation)
    - bytes `2..5`   : reserved/flags (`?`) usually zeros in baseline
    - Note: this is not heater-active runtime.
    
    6) Status block A response (len=12), query: `44 DC ... 4D DC`
    - payload often all zeros in idle/heating runs
    - field semantics unknown (`?`)
    
    7) Status block B response (len=6), query: `C0 F2 ... D0 F9`
    - `u16le@0`      : small state code (often `4`)
    - `u16le@2`      : usually `0`
    - `u16le@4`      : usually `0`
    
    8) Status block C response (len=7), query: `C0 F9 ... D4 3D`
    - `u16le@0`      : usually `0`
    - `u16le@2`      : often `0x024E` (=590, may correlate with target 59.0 C in some runs)
    - remaining bytes : flags/status (`?`)
    
    9) Status block D response (len=6), query: `D1 40 ... DB 40`
    - `u16le@0`, `u16le@2`, `u16le@4` are non-zero status words (`?`)
    - seen values drift with runtime/heating; semantics pending
    
    10) Status block E response (len=4), query: `D9 3E D0 3D D2 3D C4 3E`
    - often all zeros in current captures
    - semantics pending
    
    ### CMD25 response maps
    
    For registers where response len=8 (`44..47 24`, `79 2D`, `7A 2D`, etc.), payload is usually 4 little-endian words:
    - `u16le@0`, `u16le@2`, `u16le@4`, `u16le@6`
    
    Known high-confidence examples:
    - `44 24` -> `1500, 200, 3000, 1500`
    - `45 24` -> `1500, 0,   3000, 1000`
    - `46 24` -> `100,  50,  3000, 100`
    - `47 24` -> `10,   1,   100,  10`
    
    `CMD25` 4-byte responses are often:
    - word-like status pairs (`u16le@0`, `u16le@2`) or
    - byte flags in `[0..3]` depending on register.
    
    ### CMD52 payload maps (identity/init)
    
    `CMD52` is used for module identity and boot/session initialization.
    Frame format reminder: `C3 41 52 [LEN] [PAYLOAD...] [CHK]`
    
    1) MAC announcement (`LEN=9`)
    - Example payload: `03 0F 01 78 42 1C 14 3E 18`
    - byte `0`        : group/type (`03`)
    - byte `1`        : field id (`0F`)
    - byte `2`        : sub-id/version (`01`)
    - bytes `3..8`    : MAC address bytes (`78 42 1C 14 3E 18`)
    
    2) Serial announcement (`LEN=15`)
    - Example payload: `03 10 01 31 37 32 35 32 32 46 4B 30 37 30 30`
    - byte `0`        : group/type (`03`)
    - byte `1`        : field id (`10`)
    - byte `2`        : sub-id/version (`01`)
    - bytes `3..14`   : ASCII serial (e.g. `172522FK0700`)
    
    3) Combined/session info (`LEN=18`)
    - Example payload: `03 29 00 0E 73 19 31 37 32 35 32 32 46 4B 30 37 30 30`
    - byte `0`        : group/type (`03`)
    - byte `1`        : field id (`29`)
    - byte `2`        : mode/subtype (`00`)
    - bytes `3..5`    : session/config triplet (`0E 73 19`) (`?`)
    - bytes `6..17`   : ASCII serial echo (`172522FK0700`)
    
    4) Init request A (`LEN=3`)
    - Payload: `02 2C 00`
    - byte `0`        : init class (`02`)
    - byte `1`        : init opcode (`2C`) (`?`)
    - byte `2`        : arg/status (`00`)
    - Sent in retries during early startup.
    
    5) Init request B (`LEN=3`)
    - Payload: `03 21 00`
    - byte `0`        : init class (`03`)
    - byte `1`        : init opcode (`21`) (`?`)
    - byte `2`        : arg/status (`00`)
    
    6) Init request C (`LEN=3`)
    - Payload: `02 0B 00`
    - byte `0`        : init class (`02`)
    - byte `1`        : init opcode (`0B`) (`?`)
    - byte `2`        : arg/status (`00`)
    
    7) Boiler ACK to CMD52 (`RX`, len=4)
    - Example payload: `1D FE 00 13`
    - bytes `0..3`    : ACK/status block (`?`) used as handshake success marker.
  • REKLAMA
  • #62 21849286
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14655
    Pomógł: 655
    Ocena: 12662
    Bardzo dobra robota! Z niecierpliwością czekam na dalsze postępy!
    Dodaj mały tekst pokazujący "Łącznie odebrane bajty" i "wysłane" pod tabelą urządzeń, dobrze jest mieć taki wyświetlacz do debugowania.
    Pomogłem? Kup mi kawę.
  • #63 21849289
    DeDaMrAz
    Poziom 22  
    Posty: 612
    Pomógł: 34
    Ocena: 130
    O nie, pomyślałem o tym, ale oryginalny moduł jest bardzo gadatliwy - będzie wysyłał około 100+ klatek na minutę, a to jest jedna pełna klatka


    Zrzut ekranu programu UART Viewer z tabelą ramek TX/RX i danymi heks oraz stanem grzałki i temperatur

    Dodano po 2 [godzinach] 1 [minucie]:


    Zrzut ekranu panelu AristonESP32 z przyciskami sterowania i statusem temperatury wody

    Następna integracja HA.....


    Zrzut ekranu panelu AristonESP32 z sekcjami Controls, Sensors i Activity oraz logo MQTT.
  • REKLAMA
  • #64 21849431
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14655
    Pomógł: 655
    Ocena: 12662
    Nieźle! Dlaczego niektóre elementy sterujące to przełączniki, a niektóre to naciśnięcia?
    Pomogłem? Kup mi kawę.
  • REKLAMA
  • #65 21849434
    DeDaMrAz
    Poziom 22  
    Posty: 612
    Pomógł: 34
    Ocena: 130
    p.kaczmarek2 napisał:
    Dlaczego niektóre elementy sterujące to przełączniki, a niektóre to naciśnięcia?


    ponieważ to 😁


    Zrzut ekranu z tekstem „by Espressif” i „Firmware: ariston_alpha_1”.

    Dodano po 2 [godzinach] 36 [minutach]:


    Zrzut ekranu panelu AristonESP32 z kontrolkami, czujnikami i dziennikiem aktywności MQTT


    Zrzut ekranu panelu AristonESP32 z przyciskami sterowania i danymi o temperaturze oraz stanie urządzenia

    To na razie tyle..... Sterownik wymaga dopracowania i kilku poprawek, ale w końcu jest gotowy do uruchomienia i nabrania do niego trochę wody i przetestowania przez długi czas przed weryfikacją sterownika i opublikowaniem go.

    Muszę prześledzić wprowadzone zmiany i uzyskać dane z rzeczywistych testów, a następnie opublikuję czysty PR.
  • #66 21850651
    DeDaMrAz
    Poziom 22  
    Posty: 612
    Pomógł: 34
    Ocena: 130
    Okno sterowania Ariston Water Heater z temperaturą 27°C i celem 50°C oraz przyciskami +/-

    Działa na stole warsztatowym, wciąż czeka na pojawienie się chipów DOWD, aby zastąpić ten w oryginalnym module i spakować go.

    Sterownik jest nadal w fazie alfa i będzie wymagał trochę czasu na testy w prawdziwym życiu, zanim będę mógł go wepchnąć do PR.
  • #67 21865836
    n1bs
    Poziom 4  
    Posty: 8
    >>21850651 Świetna robota! Wielkie dzięki za ciężką pracę!

    W oczekiwaniu... Czy mógłbyś podzielić się swoim pomysłem na "arystony bez wifi"? Co chciałeś z tym zrobić? Może mógłbym pomóc w niektórych pracach na tym etapie?
  • #68 21866196
    DeDaMrAz
    Poziom 22  
    Posty: 612
    Pomógł: 34
    Ocena: 130
    n1bs napisał:
    Czy mógłbyś podzielić się swoim pomysłem na "arystony bez wifi"?


    Wciąż pracuję nad modelem z obsługą WiFi i dekodowaniem większej ilości ruchu. Jak wspomniałem wcześniej, mam 2 płytki, które nie obsługują WiFi i będę nad nimi pracował, ale ogólna idea jest taka, że mogę przynajmniej przejąć czujniki dotykowe i umożliwić sterowanie w ten sposób - nie jest to idealne, ale robiłem to już wcześniej, więc byłby to pierwszy krok. Następnie spróbuję zbadać inne opcje i być może "włączyć" na nich kontrolę WiFi, nie jestem jeszcze pewien, ponieważ robię to w wolnym czasie i jest to czasochłonne, ale ostatecznym celem jest również kompatybilność z HA.

    Mam nadzieję, że to ma sens. Ciąg dalszy nastąpi....
  • #69 21866970
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14655
    Pomógł: 655
    Ocena: 12662
    Z pewnością słyszałem, że działa to w przypadku urządzeń TuyaMCU. Są one zupełnie inne, ale nadal jest to coś do rozważenia. Możesz kupić termostat bez WiFi, tylko MCU, i dodać tam moduł WiFi, a MCU będzie już miał oprogramowanie układowe TuyaMCU...
    Pomogłem? Kup mi kawę.
  • #70 21877080
    n1bs
    Poziom 4  
    Posty: 8
    >>21866196
    To ma sens! Chciałem tylko jakoś pomóc :) Dzięki za posunięcie tego projektu do przodu!

    Dodane po 2 [minutach]:

    >>21866970
    Tak, większość kontrolerów Tuya wykorzystuje natywne MCU i po prostu komunikuje się za pośrednictwem własnego modułu przez Wi-Fi, więc mając to na miejscu, stosunkowo łatwo jest przejąć polecenia i zbadać protokół. W przypadku tych "starych" / nie-wifi aristonów jest to nieco trudniejsze, ponieważ możliwe jest, że oprogramowanie układowe jest również inne (przynajmniej nie dostałem żadnego wyjścia UART na tych samych pinach, co wersja wifi). Ale MCU tutaj jest dość elastyczny i może zrobić UART na prawie każdym pinie, co czyni ślepe sprawdzanie dość... bezużytecznym. Ale prawdopodobnie bardziej doświadczona osoba ode mnie może zobaczyć więcej potencjalnych miejsc do sprawdzenia.
  • #71 21877168
    sq3evp
    Poziom 39  
    Posty: 6570
    Pomógł: 219
    Ocena: 873
    Ale zrobić pomiar temperatury wody zdalnie pewnie można? W sumie to chociaż tyle jest możliwe? Gdzie sygnał musi być podawany z czujników.
  • #72 21877212
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14655
    Pomógł: 655
    Ocena: 12662
    Czy wiadomo jakie czujniki tam są? Może by się dało podsłuchać pomiar zewnętrznym MCU.
    Pomogłem? Kup mi kawę.
  • #73 21877695
    n1bs
    Poziom 4  
    Posty: 8
    >>21877212
    Są 2 zbiorniki, każdy ma osobną sondę z 2x termistorami. Jeden znajduje się na samym dole zbiornika, drugi na środku.
    Myślałem o całkowitej wymianie głównego MCB na własny (może być nawet arduino, nie jest to duży problem, aby zakodować regulator pid i ponownie wykorzystać płytkę zasilania). Patrząc na obecną płytkę drukowaną nie widzę żadnego zabezpieczenia przed wzrostem temperatury, użycie 2 sekund na zbiornik może być jednym z powodów, dla których nie widzimy tutaj przekaźnika / przełącznika temperatury HW.
    W każdym razie, jeśli DeDaMrAz nie znajdzie nic przydatnego z głównego PCB - prawdopodobnie wykonałbym niestandardową płytkę + esp jako interfejs wifi / homeassistant.
  • #74 21894948
    QuanticComparatorLog
    Poziom 1  
    Posty: 1
    >>21847065 Cześć! Jestem w tym zupełnie nowy, ale czy przed próbą z mojej strony znalazłeś jakieś rozwiązanie? Mam również ten sam bojler bez wifi i chcę przeczytać jak najwięcej informacji. Mam również pod ręką ESP32 i chcę go zintegrować z Home Assistant
  • REKLAMA
  • #76 21895074
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14655
    Pomógł: 655
    Ocena: 12662
    Fajnie, więc jak w końcu rozwiązałeś ochronę przed flashowaniem ESP32?
    Pomogłem? Kup mi kawę.
  • #77 21895183
    DeDaMrAz
    Poziom 22  
    Posty: 612
    Pomógł: 34
    Ocena: 130
    p.kaczmarek2 napisał:
    Czy udało Ci się rozwiązać ESP32 flash protection?


    Nie, zdecydowałem się pominąć tę część, ponieważ wszystkie bezpieczniki elektroniczne są spalone i doszedłem do wniosku, że wymiana chipa to zbyt dużo pracy. Więc zrezygnowałem z całkowitej wymiany modułu.

    Ponadto, ponieważ w ESP32 nie mamy odsłoniętego UART, zmieniłem domyślny routing w SDK dla wygody (piny są bliżej siebie) w PR.
  • #78 21895214
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14655
    Pomógł: 655
    Ocena: 12662
    Jak uzyskać moduł do wymiany?
    Pomogłem? Kup mi kawę.
  • #79 21896825
    Konto nie istnieje
    Poziom 1  
  • #80 21917569
    meteoropata
    Poziom 1  
    Posty: 1
    Witam wszystkich!
    Znalazłem tę stronę szukając informacji związanych z naprawą urządzeń.
    To co robicie jest godne pochwały i życzę Wam wielu sukcesów!
    Wiem, że nie jest to związane z tematem, ale chciałbym zapytać, czy ktoś jest skłonny odczytać dla mnie wartości niektórych elementów z płyty głównej. Kocioł jest nowy, ale podczas instalacji niektóre elementy SMD zostały uszkodzone i nie mogę znaleźć ich wartości. Są to tranzystor Q3 oraz kondensatory C7, C8, C9 i C11.
    Z góry dziękuję!
    Zielona płytka PCB z wyświetlaczem 7‑segmentowym „88”, sprężynami kontaktowymi i układami scalonymi
📢 Słuchaj (AI):

Podsumowanie tematu

✨ Dyskusja dotyczy wnętrza i inżynierii wstecznej elektrycznego podgrzewacza wody Ariston Velis 80 Wi‑Fi oraz próby zastąpienia fabrycznego modułu Wi‑Fi otwartym firmware na ESP32/OBK. Omówiono budowę urządzenia: dwa zbiorniki, dwie grzałki 1,5 kW, dwa czujniki temperatury na zbiornik, panel dotykowy, tag NFC oraz komunikację między głównym MCU a modułem Wi‑Fi przez UART 5 V. Autor analizował protokół przy użyciu analizatora logicznego, PulseView, eksportu UART i później zdalnego rejestratora na RPi Zero W z izolacją ADUM1200. Udało się zdekodować część ramek: odczyt temperatur, ustawianie temperatury, stan zasilania, licznik pryszniców, czas do osiągnięcia temperatury i część stanów grzałek. W toku rozmowy pojawiły się też informacje o zabezpieczeniu flash ESP32, szyfrowaniu pamięci, możliwości wymiany modułu, adapterach poziomów logicznych oraz pomysłach na pełne lokalne sterowanie bez chmury producenta i integrację z Home Assistant.
REKLAMA