feat: initial myprimal MQTT bridge service

Dynamic MySolem/MyIndygo IoT bridge with MQTT, Home Assistant
autodiscovery, and Homebridge EasyMQTT compatibility.

- Device discovery via MySolem API on startup (all modules/inputs/outputs)
- Configurable poll engine (fast/normal/slow buckets, per-input overrides)
- MQTT retained state publishing + HA autodiscovery payloads
- Unified manual command routing (linesControl vs sendManualModuleCommand)
- Runtime config via MQTT $config/set, persisted to config.json
- Expression override system (API-provided > hardcoded > passthrough)
- Minimal REST API: /health, /state, /control, /rediscover
- Docker deployment (Dockerfile + docker-compose.yml)
- 38 unit tests

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-28 01:05:24 +02:00
commit 941abd98d5
48 changed files with 12118 additions and 0 deletions
+66
View File
@@ -0,0 +1,66 @@
# LRPR — Filter Pressure Sensor (LRPR-0D6800)
**Module ID**: `6a17218be0b88ea3e925524f`
**Serial**: `1D00010D68000001`
**MAC**: `C8:B9:61:0D:68:00`
**UUID**: `1D0058B9610D680000000001000D6800`
**Firmware**: 6.3.0 | **Hardware**: A | **Manufacturer**: `1D`
**Type**: `lr-pr`
**Role**: Measures filter pressure — indicates filter cleanliness / pump running state
---
## Input
| Input ID | Type | Unit | Interval |
|---|---|---|---|
| `6a17218be0b88ea3e9255251` | 8 (pressure) | bar (unit code 6) | 1 min |
Raw-to-bar expression: `(1.5 × raw 500) / 1000`
### Latest readings (2026-06-04)
```
16:01 0.091 bar ← pump stopped / off
16:00 0.715 bar
15:59 0.741 bar
15:58 0.730 bar
18:41 0.081 bar ← pump off
```
Normal operating pressure ~0.700.75 bar. Drop to ~0.08 bar signals pump has stopped.
This sensor can be used to detect filtration start/stop and detect dirty filter (rising pressure).
---
## Remote state
- Battery: **94%**
- Last radio contact: 2026-06-04T20:05:14Z
- Relay: `60ca4276ad69dac1558f7c61` (LRMB10)
- No programs, no outputs — pure sensor
---
## Pressure Alert Configuration
From `poolPressureAlertsVariables` in the input object (retrieved via mobile API):
| Parameter | Value | Meaning |
|---|---|---|
| `staticPressure` | 0.919 bar | Baseline pressure at pump start |
| `nominalPressure` | 1.7275 bar | Expected operating pressure |
| `maximalPressure` | 1.0615 bar | Upper alert threshold |
| `atmosphericPressure` | 1.015 bar | Calibration reference |
| `filterCloggedMargin` | 0.5 bar | Rise above static = filter clogged alert |
| `filterPreCloggedMargin` | 0.3 bar | Rise above static = pre-clog warning |
| `activeFilterCloggedAlert` | true | Filter clog alert enabled |
| `activeWaterLevelLowAlert` | true | Low water level alert enabled |
| `activeSuctionValveClosedAlert` | true | Suction valve closed alert enabled |
| `waterLevelLowCount` | 6 | Ticks below threshold before alert |
## Notes
- `secondaryBatteryVoltage: 80` — secondary power source present
- Unit code 6 = bar; type 8 = pressure sensor
- Backwash reminder alerts fire every ~15 days (shared with pool notebook)