Skip to content

Modbus migration #1

Description

@straybiker

Waarom

De Poolstation cloud API is onbetrouwbaar (saveSign/changemode geven 500, historiek van API-breuken bij Idegis). De NEO12 draait op het Domotic/Multi-Tec platform met een aparte, geïsoleerde RS-485 Modbus-poort (bevestigd: de LAN-module zit op een eigen connector, app/cloud blijven werken). De officiële registertabel (v1.62/1.63) is publiek beschikbaar én er bestaat een kant-en-klare HA-integratie.

Architectuur (herzien)

NEO12 (RS-485, Modbus RTU 9600 8E1, slave 2)
   │ A/B twisted pair, max 50 cm
Olimex ESP32-POE-ISO als transparante serial↔TCP bridge (ESPHome stream_server)
   │ Ethernet + voeding via PoE (1 kabel)
HA: IdegisModbus HACS-integratie (julianbl) via Modbus TCP

De software-laag is nu de bestaande [julianbl/IdegisModbus](https://github.com/julianbl/IdegisModbus) HACS-integratie in plaats van eigen ESPHome modbus_controller YAML. Die verwacht exact deze opstelling: een Modbus TCP bridge naar de RS-485 poort. Voordelen: config flow i.p.v. YAML, alle entities kant-en-klaar (zie fase 2b), read-modify-write op relay-registers zodat schema-bits bewaard blijven, blok-polling, diagnostics met raw register dumps, en community-onderhoud.

Safety-overweging bij deze keuze. In bridge-modus draait er geen logica op de ESP zelf. Dat is aanvaardbaar omdat de NEO12 zijn eigen hardware flow-interlock heeft (productie stopt bij flow-alarm, onafhankelijk van alles), en het toestel een Modbus-watchdog heeft (holding 0x10/0x11) als extra vangnet. De HA-automation is een optimalisatielaag (target % vs pomp-RPM), geen primaire beveiliging. Wil je later tóch on-device logica, dan herflash je dezelfde hardware OTA naar modbus_controller (variant in bijlage).

Fase 0 — Verificatie

  1. RS-485 poort ✅ LAN-module zit op een aparte connector; cloud/app en lokale Modbus kunnen permanent naast elkaar.
  2. Registertabel ✅ Officiële Tabla modbus 1.63.xlsm + protocol-PDF in [julianbl/IdegisModbus](https://github.com/julianbl/IdegisModbus); v1.62 in markdown bij [hirofairlane/ha-idegis-astralpool](https://github.com/hirofairlane/ha-idegis-astralpool/blob/main/docs/02-modbus-reference.md). Idegis Domotic 2 = AstralPool Elite Connect (zelfde firmware/registerkaart; dit toestel meldde zich als "Elite Connect LS").
  3. Fysieke poort checken: hoe biedt de NEO12 de Modbus-poort aan? Bij de Domotic-serie zijn de klemmen gelabeld "+", "−", "C" (= B, A, GND). Als er geen klemmen maar enkel een interne connector is, is de officiële Idegis C-MOD insteekmodule de nette (maar dure) oplossing. Verkeerde polariteit = geen respons → A/B wisselen is de eerste fix.
  4. Bij eerste verbinding: slave-adres bevestigen (fabrieksdefault 2, geldig 1–5), capability bitmap lezen (holding 0x06), serienummer noteren (0x09–0x0B). Verwacht bitmap NEO12 (standaard zout, géén LS-variant): elektrolyse (bit 15 low-salt = 0), pH en ORP bevolkt (geen PPM), temperatuur, zout, UV. Relevante extra registers: pH input 0x51 / setpoint holding 0x57; ORP input 0x81 / setpoint holding 0x87 — de ORP-gestuurde productie loopt op het toestel zelf, HA hoeft daar niets voor te doen.

Fase 1 — Hardware (DIN-rail, max 2 × 38 mm vrij, PoE, geen extra voeding)

Olimex ESP32-POE-ISO op DIN-clip, ~€37

  • ESP32-POE-ISO basisversie (€24,95): Ethernet, PoE-gevoed (802.3af), galvanisch geïsoleerd. Geen -16MB/-EA/-WROVER nodig; -IND enkel bij vorstgevoelige opstelplaats.
  • Officiële DIN-CLIP-ESP32-POE-ISO (€5,95) rechtstreeks op de rail.
  • RS-485 transceiver: zie BoM Include ORP and relays states cibernox/homeassistant-poolstation#2 — bridge-modus vereist auto-direction.
  • Eén PoE-kabel erin, A/B/GND eruit. Na de eerste flash gaan alle updates OTA; fysieke toegang is nooit meer nodig.

Alternatief zonder firmware: een Waveshare RS485 TO POE ETH (B) gateway (±€35, DIN-clip) doet exact hetzelfde voor de HACS-integratie. De Olimex-route kost hetzelfde maar houdt de on-device optie (bijlage) open.

Bekabeling

  • Afstand verdeelkast ↔ NEO12 is max 50 cm → kort twisted pair (stukje UTP) op de NEO12-klemmen (A/B/GND); afscherming en 120Ω terminatie onnodig op deze lengte. Weghouden van 230V-bekabeling.
  • Scheiding sterkstroom/signaal respecteren; aansluiting desgewenst laten aftekenen door de elektricien i.v.m. AREI.
  • Galvanische isolatie: het -ISO board laat de ESP-GND zweven t.o.v. het netwerk; de bus is de enige galvanische verbinding, dus geen aardlus. De NEO12 Modbus-poort is bovendien zelf geïsoleerd.

BoM

# Onderdeel Specificatie Aantal Richtprijs Bron
1 Olimex ESP32-POE-ISO Basisversie 1 €24,95 Olimex shop, TME, Mouser
2 RS-485 module, auto-direction 3.3V-variant (XY-K485 of MAX3485/SP3485-gebaseerd; 5V-versies zetten 5V op RX en ESP32-GPIO's zijn niet 5V-tolerant). Werkt in bridge- én on-device modus. Meestal met ingebouwde 120Ω + biasing 1 (+1 reserve) €2–5 AliExpress, Otronic
3 Olimex DIN-CLIP-ESP32-POE-ISO Officiële DIN-clip, let op de -ISO variant 1 €5,95 Olimex shop
4 Twisted pair, kort 0,5 m stukje UTP 1 €0 voorraad
5 UTP-patchkabel Naar PoE-switchpoort 1 €2 voorraad
6 Draadjes/kroonklemmen 3.3V/GND/TX/RX naar module cibernox#2; A/B/GND overgang set €2 voorraad
Totaal ±€37

Fase 2a — ESP flashen als bridge

ESPHome met de [oxan/esphome-stream-server](https://github.com/oxan/esphome-stream-server) external component:

esphome:
  name: pool-modbus-bridge

esp32:
  board: esp32-poe-iso

ethernet:
  type: LAN8720
  mdc_pin: GPIO23
  mdio_pin: GPIO18
  clk_mode: GPIO17_OUT
  phy_addr: 0
  power_pin: GPIO12

external_components:
  - source: github://oxan/esphome-stream-server

uart:
  id: rs485_uart
  tx_pin: GPIO4
  rx_pin: GPIO36
  baud_rate: 9600
  parity: EVEN

stream_server:
  uart_id: rs485_uart
  port: 502

Protocol (officiële tabel): 9600 8E1, slave 2, functies 0x03/0x04 lezen en 0x06/0x10 schrijven. Coil-functies (0x01/0x05/0x15) zijn verboden — de integratie gebruikt ze niet, maar niet handmatig proberen.

Fase 2b — HACS-integratie installeren

  1. HACS → custom repository https://github.com/julianbl/IdegisModbus (Integration) → installeren → HA herstart.
  2. Settings → Devices & Services → Add → "Idegis Modbus": host = IP van de ESP, port = 502, slave = 2. De config flow valideert de verbinding (leest input 0x40).
  3. Options: polling-interval, UV entities aan (de NEO12 heeft UV), inputs/diagnostics/buttons naar wens.

Entities die je krijgt: switches (pomprelais e.a.), numbers (Target Electrolysis Production, Target pH/ORP/Cl), sensors (temperatuur, zout, pH, ORP, productie %, celstroom/-spanning, g/h, UV- en elektrolysetellers), binary sensors (Electrolysis ON, Water Flow Problem, digitale inputs, relaisstatus, UV-alarmen), reset-buttons (partial hours, pumpstop, UV).

Fase 3 — Parallelle validatie (1–2 weken)

  1. HACS-integratie draait naast de Poolstation cloud integratie (aparte poorten, geen conflict).
  2. Vergelijk per sensor: cloud vs Modbus (pH, ORP, temperatuur, zout, productie %, alarmen), template-kaart met beide waarden.
  3. Test schrijven: Target Electrolysis Production via de number-entity, verifieer in de app.
  4. Test het flow-scenario gecontroleerd: pomp uit → Water Flow Problem binary sensor + productiestop (native interlock van het toestel).
  5. Kalibreer de scan interval (integratie pollt in blokken; 10–15 s is realistisch).

Fase 4 — Cutover

  1. automation.pool_electrolysis_sync_safety aanpassen:
    • number.zwembadcontroller_target_production → de Target Electrolysis Production number van de integratie (3 plaatsen: trigger, 2× set_value, variabele target_prod)
    • input_number.pool_previous_electrolysis, input_select.pool_pump_rpm en input_select.pool_control blijven ongewijzigd
  2. Hardening: retry bij schrijffout + notificatie.
  3. Overweeg de Modbus-watchdog (holding 0x10/0x11) te configureren zodat het toestel terugvalt naar een veilige toestand als de bridge/HA langdurig wegvalt. Gedrag eerst testen: de watchdog triggert óók bij een HA-herstart als de timeout te kort staat.
  4. Overige verwijzingen naar poolstation entities (dashboards, andere automations) migreren.
  5. Poolstation cloud integratie in HA verwijderen of als read-only backup houden; de app blijft sowieso werken via de LAN-module.
  6. Historiek: desgewenst de nieuwe entities dezelfde entity_id geven na verwijdering van de oude.

Risico's

  • Pre-1.0 integratie: IdegisModbus is jong (april 2026). Mitigatie: parallelfase, en de auteur waarschuwt zelf elke write te valideren. Jij kan bijdragen — het is dezelfde workflow als je pypoolstation-werk.
  • Slave adres: default 2, niet 1; bij geen respons 1–5 proberen.
  • Firmwareverschillen: capability bitmap (0x06) verifiëren; NEO12 = Neolysis-familie, zelfde kaart als Domotic 2/Elite Connect.
  • Watchdog-gedrag: eerst gecontroleerd testen vóór activeren.

Uitbreidingen (later, optioneel)

Uit hirofairlane docs/05-sensors-extra.md, gerangschikt op prijs/waarde; alles in de apparatuurruimte, niets in het bad:

  1. Druktransducer 0–5 bar (G1/4") + ADS1115 op de filteruitgang (~€15): vuile-filter- en backwash-alarm.
  2. DS18B20 + LM393 leksensor (~€5): kasttemperatuur + lekdetectie.
  3. JSN-SR04T ultrasoon in de skimmerdeksel (~€8): waterniveau + bijvul-automatisering.
  4. RS485 Modbus troebelheidssonde (€60–95): kan op dezelfde bus op een ander slave-adres.

Niet kopen (zelfde bron): TDS-meters (verzadigen in zoutwater), "6-in-1" probes, elektronische cyanuurzuur- of hardheidssensoren.

iSaver frequentieregelaar: RPM-sturing verhuist al mee naar lokaal via de NEO12-relais (0x110-zone, switches in de integratie), geen actie nodig. Rechtstreekse RS-485 sturing kan later, maar het iSaver-"Modbus" is pseudo (slave 0xAA, functie 0xC3, 1-byte CRC): TCP-gateways en standaard Modbus-stacks werken niet, enkel raw-UART op een ESP (community-bewezen, zie [HA-forum](https://community.home-assistant.io/t/modbus-isaver-pool-pump-inverter-custom-commands-issue-response-missing-bytes/714637)). Nooit op dezelfde bus als de NEO12; tweede RS-485 module op een vrije UART. Quirk: RS-485 neemt pas over nadat de unit via het frontpaneel is aangezet.

Bijlage — variant met on-device safety (ESPHome modbus_controller)

Zelfde hardware, andere firmware: modbus_controller i.p.v. stream_server. De auto-direction module uit de BoM werkt hier ook, flow_control_pin is dan niet nodig. Registers: setpoint productie = holding 0x41; lezen: input 0x41/0x42 (target/actueel %), 0x43/0x44 (stroom/spanning, /100), 0x51 (pH /100), 0x81 (ORP), 0xB1 (temp /10), 0xC1 (zout /100), 0x240 (flow-alarm), 0x200 (algemeen alarm). On-device regel: flow weg → holding 0x41 = 0. Overstappen = OTA herflash, hardware blijft.

Bronnen

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentation

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions