implementace LED loxone u zaporncyh cen
This commit is contained in:
51
docs/04-modules/signal-outbound.md
Normal file
51
docs/04-modules/signal-outbound.md
Normal file
@@ -0,0 +1,51 @@
|
||||
# Modul: Odchozí signály (Loxone / HTTP)
|
||||
|
||||
## Účel
|
||||
|
||||
- EMS šle **logické signály** (např. `EXPORT_BAN_ACTIVE`) na externí cíle přes **DB konfigurované routy** (`ems.signal_route`).
|
||||
- Každý pokus o odeslání se zapisuje do **`ems.signal_outbound_journal`** (retry, HTTP metadata, stav `queued` → `sent` → `verified`).
|
||||
- **`ems.signal_state`** drží poslední požadovanou / odeslanou / ověřenou hodnotu pro **idempotenci** a diagnostiku readbacku.
|
||||
|
||||
Kritické řízení výkonu (**Deye, EV, TČ**) zůstává ve **Modbus exporteru** a tabulce **`ems.modbus_command`**. Tento modul **nenahrazuje** plánované zápisy výkonu do invertoru ani paralelní zápis na stejné Modbus výstupy.
|
||||
|
||||
## Hranice: signál vs. Modbus
|
||||
|
||||
| Typ akce | Kde |
|
||||
|----------|-----|
|
||||
| Plán, ekonomika, limity výkonu, zápis registrů Deye / nabíječky / TČ | `control_exporter` + `ems.modbus_command` |
|
||||
| Indikace (LED), informativní stav do Loxone, jednoduchý HTTP přepínač (Shelly) | `ems.signal_*` + `services/signal_service.py` |
|
||||
|
||||
Duplicitní ovládání **stejného fyzického výstupu** přes Modbus i přes signálový HTTP kanál se vyhýbe — jedna autoritativní cesta na výstup.
|
||||
|
||||
## Destinace
|
||||
|
||||
| `destination_type` | Chování |
|
||||
|--------------------|---------|
|
||||
| `loxone_vi` | `GET {base}/dev/sps/io/{destination_key}/{value_text}` (stejná konvence jako legacy `send_loxone_setpoints`). |
|
||||
| `http_rest` | Zápis z `route_config_json` (`method`, `path_template` s `{value}` / `{v}`). Verify přes `verify_config_json` (`read_path`, volitelně `json_path` pro JSON odpověď). |
|
||||
|
||||
## Worker běh
|
||||
|
||||
- Zařazení (`enqueue_site_signals`) probíhá po **každém** dokončeném pokusu o `export_setpoints` (včetně předčasných returnů u AUTO bez plánu), v `finally` bloku — aby LED mohla klesnout i při chybějícím plánu.
|
||||
- Odeslání a verify běží v **APScheduler** jobech v `backend/app/lifespan.py` (interval řádů sekund).
|
||||
|
||||
## Konfigurace (příklad Loxone + readback)
|
||||
|
||||
Viz [Loxone integrace – VI/VO](../loxone-integration.md) (`EMS_ExportBan_Active`, `EMS_ExportBan_Active_FB`).
|
||||
|
||||
SQL příklad routy (po doplnění `endpoint_id` z `ems.site_endpoint` pro daný miniserver):
|
||||
|
||||
```sql
|
||||
INSERT INTO ems.signal_route (
|
||||
site_id, destination_type, endpoint_id, signal_code, destination_key,
|
||||
verify_readback, verify_config_json
|
||||
) VALUES (
|
||||
3,
|
||||
'loxone_vi',
|
||||
(SELECT id FROM ems.site_endpoint WHERE site_id = 3 AND endpoint_type = 'loxone_http' LIMIT 1),
|
||||
'EXPORT_BAN_ACTIVE',
|
||||
'EMS_ExportBan_Active',
|
||||
true,
|
||||
'{"loxone_io_name": "EMS_ExportBan_Active_FB"}'::jsonb
|
||||
);
|
||||
```
|
||||
@@ -27,6 +27,7 @@ EMS posílá hodnoty přes HTTP GET: `/dev/sps/io/{název}/{hodnota}`
|
||||
| `EMS_EV1_Power_W` | Analog | 0–22000 | Povolený výkon nabíječky EV č. 1 ve W. 0 = zakázat nabíjení. |
|
||||
| `EMS_EV2_Power_W` | Analog | 0–22000 | Povolený výkon nabíječky EV č. 2 ve W. 0 = zakázat nabíjení. |
|
||||
| `EMS_HeatPump_Enable` | Digital | 0/1 | Povolení provozu tepelného čerpadla. 1 = povolen, 0 = zakázán. |
|
||||
| `EMS_ExportBan_Active` | Digital | 0/1 | **Signál z EMS (journal):** 1 = EMS aktuálně uplatňuje zákaz exportu do sítě (LED / indikace; viz `EXPORT_BAN_ACTIVE` v DB `ems.signal_route`). 0 = export ban neaktivní. Hodnotu periodicky posílá backend po řídicím cyklu; ověření readback viz níže. |
|
||||
|
||||
> **Poznámka k setpointům:** `EMS_Battery_Setpoint_W` a `EMS_Grid_Setpoint_W` jsou informativní vstupy pro AUTO režim. Loxone je předá jako Modbus příkazy do střídače Deye. V ostatních režimech (SELF_SUSTAIN, PRESERVE, MANUAL) Loxone tyto hodnoty ignoruje a řídí se vlastní logikou.
|
||||
|
||||
@@ -40,6 +41,12 @@ Vytvořit jako **Virtual HTTP Output** nebo stav dostupný přes HTTP GET pro EM
|
||||
|---|---|---|
|
||||
| `EMS_Mode_Active` | Analog | Aktuálně aktivní režim v Loxone. EMS čte při startu pro zjištění stavu. |
|
||||
| `EMS_Watchdog_Triggered` | Digital | 1 pokud watchdog přepnul na SELF_SUSTAIN bez příkazu od EMS. Pro diagnostiku. |
|
||||
| `EMS_ExportBan_Active_FB` | Digital | **Readback pro verify:** musí odrážet stejný stav jako `EMS_ExportBan_Active` (např. ve Function Blocku zkopírovat hodnotu z VI na VO). EMS po zápisu čte `GET /dev/sps/io/EMS_ExportBan_Active_FB` a porovná s odeslanou hodnotou. Název lze přepsat v `ems.signal_route.verify_config_json` klíčem `loxone_io_name`. |
|
||||
|
||||
**Export ban – výchozí konfigurace DB (Loxone):**
|
||||
|
||||
- `ems.signal_def`: řádek `EXPORT_BAN_ACTIVE` (seed v migraci).
|
||||
- `ems.signal_route`: jeden řádek na lokalitu — `destination_type = 'loxone_vi'`, `endpoint_id` → `site_endpoint` typu `loxone_http`, `signal_code = 'EXPORT_BAN_ACTIVE'`, `destination_key = 'EMS_ExportBan_Active'`, `verify_readback = true`, `verify_config_json = {"loxone_io_name": "EMS_ExportBan_Active_FB"}`.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user