|
| 1 | +# Time-of-Use (TOU) Controls: V1 vs V2 |
| 2 | + |
| 3 | +Solis hybrid inverters expose two independent, non-interacting sets of scheduled charge/discharge controls. SolisConnect maps both, but they cover different register ranges, different slot counts, and different levels of Modbus/SolisCloud parity. |
| 4 | + |
| 5 | +## Summary |
| 6 | + |
| 7 | +| | Time-Charging (V1) | Grid Time of Use V2 | |
| 8 | +| --- | --- | --- | |
| 9 | +| Enable switch | `switch.solis_time_of_use` — bit 1 of storage-mode register `43110` | `switch.solis_time_of_use_v2_switch` — bitfield register `43707`, one bit per slot | |
| 10 | +| Slot count | 4 | 6 | |
| 11 | +| Per-slot fields | Start/end hour+minute for charge and discharge | Start/end hour+minute, target SOC, cut-off voltage, battery current, per slot, for charge and discharge | |
| 12 | +| Charge/discharge current | One global pair (`43141`/`43142`), not per-slot | Per-slot (register offset `+1` in each slot block) | |
| 13 | +| Target SOC | Not available | Per-slot (register offset `+0` in each slot block) | |
| 14 | +| Cut-off voltage | Not available | Per-slot (register offset `+2` in each slot block) | |
| 15 | +| Modbus registers | `43143-43190` | `43707-43791` | |
| 16 | +| SolisCloud support | **Not mapped** — Modbus only | Mapped: control CIDs `5916-5987` | |
| 17 | +| SolisCloud enablement gate | N/A | CID `6798` (`0xAA55`) reports whether the inverter supports V2; SolisConnect does not yet enforce this gate (see caveat below) | |
| 18 | + |
| 19 | +## Time-Charging (V1) |
| 20 | + |
| 21 | +The older scheduling mechanism. One shared charge current and one shared discharge current apply across all slots; only the start/end times vary per slot. |
| 22 | + |
| 23 | +- Enable: bit 1 (`Time of Use`) of the storage-mode bitfield at register `43110` (`switch_sensors.py`). This bit requires either `Self-Use Mode` (bit 0) or `Feed-In Priority Mode` (bit 6) to be conflict-free with the other storage-mode bits. |
| 24 | +- Global settings: `Time-Charging Charge Current` (`43141`) and `Time-Charging Discharge Current` (`43142`), both in amps, editable as `number` entities. |
| 25 | +- Per slot (1-4), each slot is a block of paired hour/minute registers exposed as HA `time` entities: |
| 26 | + - Charge Start / Charge End |
| 27 | + - Discharge Start / Discharge End |
| 28 | +- Register layout: slot 1 starts at `43143`, slot 2 at `43153`, slot 3 at `43163`, slot 4 at `43173` (each slot block is 8 registers of data plus a 2-register reserved gap). |
| 29 | +- **No SolisCloud mapping exists for any V1 register.** V1 TOU can only be read or controlled over local Modbus. There is no plan tracked to add cloud CIDs for it, since Solis's own control-CID scheme (used by `mkuthan/solis-cloud-control`) is built around V2 semantics. |
| 30 | + |
| 31 | +## Grid Time of Use V2 |
| 32 | + |
| 33 | +The newer, richer scheduling mechanism with independent settings per slot. |
| 34 | + |
| 35 | +- Enable: dedicated bitfield register `43707` (`Time of Use V2 Switch`), 12 bits — one per slot (bits 0-5 for charge slots 1-6, bits 6-11 for discharge slots 1-6). This is a separate switch entity from the V1 enable bit; the two schedules do not share a switch. |
| 36 | +- Per slot (1-6), each slot block is 7 registers, base offset `43708 + (slot - 1) * 7` (charge) and `43750 + (slot - 1) * 7` (discharge) — e.g. Slot 1 charge SOC is `43708`, Slot 2 charge SOC is `43715`: |
| 37 | + - `+0`: cut-off/target SOC (%, editable `number`, 0-100) |
| 38 | + - `+1`: battery current (A, editable `number`, 0-300, ×0.1) |
| 39 | + - `+2`: cut-off voltage (V, editable `number`, 0-300, ×0.1) |
| 40 | + - `+3..+6`: start hour, start minute, end hour, end minute (paired into a `time` entity) |
| 41 | +- SolisCloud mapping (`sensor_data/cloud_mapping.py`, `_tou_v2_mappings()`): |
| 42 | + - Slot enable bits -> CIDs `5916-5927` (charge slots 1-6, then discharge slots 1-6), merged into the shared `43707` bitfield by `CloudDataRetrieval._merge_bit_words`. |
| 43 | + - Target SOC -> CIDs `5928-5933` (charge), `5965, 5969, 5973, 5977, 5981, 5984` (discharge). |
| 44 | + - Battery current -> CIDs `5948-5963` family (charge), `5967-5986` family (discharge). |
| 45 | + - Cut-off voltage -> the paired CID in the same current/voltage CID families. |
| 46 | + - Start/end time pairs -> CIDs `5946, 5949, 5952, 5955, 5958, 5961` (charge), `5964, 5968, 5972, 5976, 5980, 5987` (discharge); the cloud API represents each pair as a single `HH:MM-HH:MM` string, which SolisConnect composes from/decomposes into the paired hour/minute registers. |
| 47 | +- **Known caveat:** SolisCloud CID `6798` reports whether the connected inverter actually supports TOU V2 (value `43605` / `0xAA55` = supported). SolisConnect does not yet read this gate, so cloud-only or dual-protocol entries on a V2-unsupported inverter may have TOU V2 writes rejected by the device with no advance warning from the integration. |
| 48 | + |
| 49 | +## Practical implications |
| 50 | + |
| 51 | +- V1 and V2 are independent schedules on the inverter itself; enabling one does not disable the other, and having both enabled is a device-level conflict outside SolisConnect's control — check your inverter's own firmware behavior before enabling both. |
| 52 | +- If you only have local Modbus, either scheme is fully readable and writable. |
| 53 | +- If you are on SolisCloud-only or a dual-protocol setup where cloud may become active, only V2 is safe to rely on for control; V1 entities will read/write successfully over Modbus but will not fail over to cloud (there is no cloud mapping to fall back to) and will simply stop updating if cloud becomes the active protocol. |
0 commit comments