TCP proxy pro OIG Box, která dekóduje XML rámce, publikuje data do MQTT (HA autodiscovery), dekóduje warningy a loguje neznámé senzory pro doplnění mapy. Součástí je DNS přepis, aby Box mluvil na lokální proxy místo cloudu.
- 🔄 Multi‑mode proxy: ONLINE (forward) / OFFLINE (lokální ACK + queue) / REPLAY (vyprazdňování fronty)
- 💾 Persistentní fronty: SQLite fronta pro cloud (frames) i MQTT (messages)
- 🔌 Odolnost vůči výpadkům: automatická detekce výpadku cloudu, lokální ACK generování
- 📡 MQTT autodiscovery: entity se zakládají přes
homeassistant/.../config(retain) - 🧭 Diagnostika komunikace: samostatné zařízení „OIG Proxy“ se stavovými senzory (stav, fronty, poslední data, IsNewSet telemetrie)
- 🧾 Eventy:
tbl_eventsse publikuje a mapuje do HA (Type/Confirm/Content)
proxy/– hlavní Python proxy (main.py), načítá mapping ze sdílenéhosensor_map.json, dekóduje warning bity (ERR_*).addon/oig-proxy/– Home Assistant add-on (config.json, Dockerfile, run), používá stejnýsensor_map.json.dnsmasq.conf,Corefile– ukázka DNS přepisu.logs/– prázdné (logy necommitujeme).
- Publikuje tabulky do MQTT:
oig_local/<device_id>/<tbl_name>/state(payload JSON). - Zakládá entity v HA přes MQTT discovery (
homeassistant/sensor/.../config,homeassistant/binary_sensor/.../config). - Načítá mapu senzorů z
/data/sensor_map.json; neznámé klíče loguje do/data/unknown_sensors.json. - Dekóduje warningy z bitových polí
ERR_*(warnings_3f) a přidává<ERR_X>_warningsse seznamem hlášek. - Udržuje režimy komunikace a fronty:
- ONLINE: forward BOX ↔ cloud, ACK z cloudu, učení ACK patternů
- OFFLINE: lokální ACK, ukládání frame do
cloud_queue.db - REPLAY: vyprazdňování
cloud_queue.dbpo obnovení cloudu
- Publikuje diagnostiku proxy do samostatného zařízení:
- Topic:
oig_local/oig_proxy/proxy_status/state(default) - Entity zakládá z
proxy_status:*v mapě (stav, fronty, poslední data, IsNewSet)
- Topic:
- Publikuje eventy do proxy zařízení:
- Topic:
oig_local/oig_proxy/tbl_events/state(default) - Entity:
tbl_events:Type,tbl_events:Confirm,tbl_events:Content
- Topic:
- Volitelně ukládá capture všech frames do
/data/payloads.db(pokudcapture_payloads=true).
OIG Box --DNS override--> HA host (addon OIG Proxy, port 5710) --TCP--> oigservis.cz (cloud)
| |
| XML frame | Parse + map + warnings decode
|---------------------------->| Publish state to MQTT: oig_local/<device_id>/<table>/state
| Send HA discovery: homeassistant/sensor/.../config
| Availability: oig_local/<device_id>/availability
MQTT Broker (mosquitto addon) <--+
|
v
Home Assistant (entities vytvářené z discovery)
Proxy typicky vytvoří dvě „větve“ zařízení:
-
OIG Proxy (
oig_proxy) – diagnostika komunikace (stálé zařízení, bez vazby na box ID)proxy_status:*(stav, fronty, poslední data, IsNewSet)tbl_events:*(Type/Confirm/Content)
-
OIG zařízení podle
device_id(autodetekce z komunikace)- skupiny podle
device_mapping(např. Střídač/Baterie/Síť/FVE/Spotřeba…) – jedendevice_id, více zařízení
- skupiny podle
Poznámka: změny typu entity (sensor ↔ binary_sensor) vyžadují vymazat staré retained discovery config topics, jinak HA drží původní component.
- V HA otevři Nastavení → Doplňky → Obchod s doplňky.
- Nainstaluj doplněk Mosquitto broker a spusť ho.
- V Nastavení → Zařízení a služby → MQTT (integrace) přidej MQTT integraci.
- Host: obvykle
core-mosquitto - Port:
1883 - Uživatelské jméno/heslo: dle konfigurace Mosquitto (doporučeno vytvořit separátní účet).
- Host: obvykle
- V HA otevři Nastavení → Doplňky → Obchod s doplňky.
- Vpravo nahoře klikni na ⋮ (tři tečky) → Repozitáře.
- Přidej repo:
https://github.com/Muriel2Horak/oig-proxya potvrď. - Najdi doplněk OIG Proxy a klikni Instalovat.
- Otevři záložku Konfigurace a nastav minimálně:
target_server:oigservis.cztarget_port:5710proxy_port:5710mqtt_host:core-mosquittomqtt_port:1883mqtt_username,mqtt_password: účet z Mosquittolog_level:INFO(na laděníDEBUG)
- (Volitelné) ladicí záznam do SQLite:
capture_payloads: true– ukládá rámce do/data/payloads.dbcapture_raw_bytes: true– ukládá i hrubé bajty (raw_b64) pro low-level analýzu
- Klikni Uložit.
- Na záložce Info dej Spustit.
- Ověření:
- v logu add-onu uvidíš
🚀 OIG Proxy naslouchá na 0.0.0.0:5710 - po připojení BOXu uvidíš
BOX připojen - v MQTT by měly vznikat retained discovery topicy
homeassistant/.../config
- v logu add-onu uvidíš
BOX musí místo cloudu (oigservis.cz) chodit na IP Home Assistanta, kde běží add-on.
Nejjednodušší je udělat DNS override v lokální síti.
- Na PC v síti:
nslookup oigservis.cz <IP_DNS_serveru> - Na HA (Terminal & SSH add-on):
nslookup oigservis.cz - Očekávání:
oigservis.czse překládá na IP HA (ne na veřejnou IP).
- V routeru najdi sekci typu LAN / DHCP / DNS nebo DNS Rebind / Hostnames / Local DNS.
- Přidej statický záznam:
- hostname:
oigservis.cz - typ:
A - IP:
<IP Home Assistanta v LAN>
- hostname:
- Ujisti se, že DHCP rozdává jako DNS server router (nebo DNS, který ten override umí).
- Restartuj BOX (nebo aspoň jeho síť), aby si načetl nový DNS.
- Pokud router používá DoH/DoT nebo „DNS proxy“, zkontroluj, že lokální host override má prioritu (u některých routerů je potřeba vypnout DoH pro LAN).
Tento add-on spouští dnsmasq (poslouchá na 53/udp a 53/tcp) a umí lokálně přepsat oigservis.cz na IP HA (viz ha_ip + dns_upstream v konfiguraci add-onu).
- V HA v add-onu OIG Proxy nastav (Konfigurace):
ha_ip: IP Home Assistanta v LAN (nebo ponech prázdné – add-on se ji pokusí autodetekovat)dns_upstream: DNS upstream (default8.8.8.8, nebo dej IP tvého routeru/DNS)
- Ujisti se, že add-on běží a že port 53 je dostupný z LAN (add-on používá
host_network: true). - V routeru (DHCP server) nastav jako DNS server IP Home Assistanta.
- Restartuj BOX (nebo obnov DHCP lease), aby si načetl nový DNS.
- Ověř z klienta v LAN:
nslookup oigservis.cz <IP_HA>→ musí vracet IP HA.
Poznámky:
- Tohle ovlivní všechny zařízení v LAN, které používají DNS z DHCP. Pokud nechceš ovlivnit celou síť, nastav DNS jen pro BOX (pokud router umí per‑device DHCP options), nebo použij Variantu A/C.
- Provozuj lokální DNS server (Pi-hole / AdGuard Home / dnsmasq) v LAN.
- Nastav v něm DNS přepis:
oigservis.cz→<IP Home Assistanta>
- Nastav v routeru DHCP tak, aby klientům (včetně BOXu) rozdával jako DNS právě tento DNS server.
- Zkontroluj, že klienti nemají „fallback“ na veřejné DNS (např. 8.8.8.8).
Funguje jen pro testování z PC, ne pro BOX:
- Přidej do hosts:
oigservis.cz <IP_HA>
- BOX má natvrdo veřejné DNS: v routeru zablokuj odchozí DNS (TCP/UDP 53) mimo lokální DNS server, nebo přesměruj DNS provoz na svůj DNS (policy routing/NAT).
- DNS cache: po změně záznamu restartuj BOX; na PC může pomoct flush DNS cache.
- Více domén: pokud se v komunikaci objeví i jiné domény, přidej je do override stejně (logy/proxy capture ti to odhalí).
- OpenWrt (dnsmasq): v LuCI → Network → DHCP and DNS → Hostnames přidej
oigservis.cz→<IP_HA>.- CLI: přidej do
/etc/hostsřádek<IP_HA> oigservis.cza restartuj dnsmasq:service dnsmasq restart.
- CLI: přidej do
- MikroTik: IP → DNS → Static přidej
oigservis.czs adresou<IP_HA>a zapniAllow Remote Requests.
cd proxy
MQTT_HOST=... MQTT_PORT=1883 python -u main.py
Nebo docker-compose v rootu (doplnit env pro MQTT a cílový server).
- Spuštění testů:
./scripts/run_tests.sh(volitelné env:COVERAGE_FAIL_UNDER=80,RUN_INTEGRATION=0). - Sonar + Bandit:
./scripts/run_sonar.sh(vyžadujeSONAR_TOKENaSONAR_HOST_URLv.env; volitelněSONAR_CONFIGURE_QG=1aSONAR_QUALITY_GATE_NAME="Security A +0"). - SonarCloud: nastav
SONAR_HOST_URL=https://sonarcloud.io,SONAR_ORGANIZATION=<org>,SONAR_PROJECT_KEY=<org>_<project>aSONAR_CLOUD_TOKEN(pro PR analýzu iSONAR_PR_KEY,SONAR_PR_BRANCH,SONAR_PR_BASE). - Reporty se generují do
reports/(coverage.xml,junit.xml,bandit.json) a jsou v.gitignore.
cd addon/oig-proxy
docker buildx build --platform linux/amd64,linux/arm64 -t ghcr.io/muriel2horak/oig-proxy:1.0.0 --push .
config.json používá image ghcr.io/muriel2horak/oig-proxy-{arch}; po pushi lze tag přepsat na konkrétní verzi.
TARGET_SERVER(defaultoigservis.cz),TARGET_PORT(5710) – cíl, kam proxy přeposílá.PROXY_PORT(5710) – lokální port pro Box.MQTT_HOST/PORT/USERNAME/PASSWORD– broker.MQTT_NAMESPACE(defaultoig_local) – prefix topiců.PROXY_DEVICE_ID(defaultoig_proxy) – pevnédevice_idpro proxy/status/event senzory.PROXY_STATUS_INTERVAL(default60) – periodické publikováníproxy_statusdo MQTT (užitečné po restartu HA).SENSOR_MAP_PATH(default/data/sensor_map.jsonv add-onu).MAP_RELOAD_SECONDS(0 = vypnuto) – periodický reload mapy.UNKNOWN_SENSORS_PATH(default/data/unknown_sensors.json).CAPTURE_PAYLOADS(defaultfalse) – ukládá všechny frames do/data/payloads.db.CAPTURE_RAW_BYTES(defaultfalse) – ukládá i hrubé bajty (raw_b64) pro low-level analýzu.
OIG zařízení CBB podporuje až 3 nezávislé bateriové banky. Proxy publikuje pouze aktivní banku (SubD=0) s reálnými daty. Neaktivní banky (SubD=1,2) jsou úmyslně filtrováním zahojena, aby se zabránilo cyklování hodnot v HA.
Aktuální chování:
- Tabulka
tbl_batt_prmsje fragmentována do 3 variant (SubD=0,1,2), každá reprezentuje jednu banku. - Pouze SubD=0 (aktivní banka) je publikována do MQTT.
- SubD=1,2 jsou záměrně ignorovány – mají nulové hodnoty, nejsou potřebné.
- Pokud budete v budoucnu aktivovat druhou nebo třetí banku, požaduje se rozšíření mappingu v
sensor_map.jsona úprava logiky proxy.
Technické detaily: Viz analysis/subd_analysis.md pro popis fragmentace, analýzu polí a možné budoucí rozšíření na multi-bank systémy.