Skip to content

Commit ae0d144

Browse files
authored
Merge pull request #3 from fboundy/patch
Tidy README and add TOU V1 vs V2 docs page
2 parents c642da5 + 1caa8dc commit ae0d144

3 files changed

Lines changed: 67 additions & 13 deletions

File tree

‎README.md‎

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,23 @@ Protocol verification status: ⚪ = not yet verified. The columns will be filled
1515

1616
| Type | Inverter | Modbus | Cloud | Combined |
1717
| ------------- | ----------------- | :----: | :---: | :------: |
18-
| S6-EH3P | [S6-EH3P20K-H] | ⚪ | ⚪ | ⚪ |
18+
| S6-EH3P | S6-EH3P20K-H | ⚪ | ⚪ | ⚪ |
1919
| S6-EH3P | S6-EH3P15K-H | ⚪ | ⚪ | ⚪ |
2020
| S6-EH3P | S6-EH3P(12-20)K-H | ⚪ | ⚪ | ⚪ |
2121
| S6-EH3P | S6-EH1P6K-L-PRO | ⚪ | ⚪ | ⚪ |
2222
| S6-EH3P | S6-EH1P6K-L-PLUS | ⚪ | ⚪ | ⚪ |
23-
| S6-EH3P | [S6-EH3P10K-H-ZP] | ⚪ | ⚪ | ⚪ |
24-
| S6-EH3P | [S6-EH3P10K-H-EU] | ⚪ | ⚪ | ⚪ |
25-
| S6-GR1P | [S6-GR1P4K] | ⚪ | ⚪ | ⚪ |
26-
| S5-EH1 | [S5-EH1(3-6)K-L] | ⚪ | ⚪ | ⚪ |
27-
| S5-EH1 | [S5-EH1P5K-L] | ⚪ | ⚪ | ⚪ |
28-
| S5-EH1 | [S5-EH1P6K-L] | ⚪ | ⚪ | ⚪ |
29-
| S5-GC | [S5-GC30K] | ⚪ | ⚪ | ⚪ |
30-
| S5-GC | [S5-GC60K] | ⚪ | ⚪ | ⚪ |
31-
| RAI-\* | [RAI-3K-48ES-5G] | ⚪ | ⚪ | ⚪ |
32-
| RHI-\* | [RHI-3K-48ES-5G] | ⚪ | ⚪ | ⚪ |
33-
| 3P(3-20)K-4G | [3P6K-4G] | ⚪ | ⚪ | ⚪ |
34-
| 1P(2.5-6)K-4G | [1P(2.5-6)K-4G] | ⚪ | ⚪ | ⚪ |
23+
| S6-EH3P | S6-EH3P10K-H-ZP | ⚪ | ⚪ | ⚪ |
24+
| S6-EH3P | S6-EH3P10K-H-EU | ⚪ | ⚪ | ⚪ |
25+
| S6-GR1P | S6-GR1P4K | ⚪ | ⚪ | ⚪ |
26+
| S5-EH1 | S5-EH1(3-6)K-L | ⚪ | ⚪ | ⚪ |
27+
| S5-EH1 | S5-EH1P5K-L | ⚪ | ⚪ | ⚪ |
28+
| S5-EH1 | S5-EH1P6K-L | ⚪ | ⚪ | ⚪ |
29+
| S5-GC | S5-GC30K | ⚪ | ⚪ | ⚪ |
30+
| S5-GC | S5-GC60K | ⚪ | ⚪ | ⚪ |
31+
| RAI-\* | RAI-3K-48ES-5G | ⚪ | ⚪ | ⚪ |
32+
| RHI-\* | RHI-3K-48ES-5G | ⚪ | ⚪ | ⚪ |
33+
| 3P(3-20)K-4G | 3P6K-4G | ⚪ | ⚪ | ⚪ |
34+
| 1P(2.5-6)K-4G | 1P(2.5-6)K-4G | ⚪ | ⚪ | ⚪ |
3535

3636
## Credits and Acknowledgements
3737

‎docs/source/index.rst‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@ Table of Contents
1616
:caption: Advanced
1717

1818
protocols.md
19+
tou.md
1920
migration.md

‎docs/source/tou.md‎

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
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

Comments
 (0)