0.7.0: assenza con date, conto alla rovescia del boost, catalogo rifatto

- AwayDialog.qml: popup con inizio e fine (Dialog, ValueButton,
  DatePickerDialog: componenti e proprieta' verificati nella guida Silica
  dell'SDK). Il tasto Assenza apre il popup invece di mandare il comando;
- conto alla rovescia 30:00 -> 00:00 in Home e in copertina, con i secondi
  dell'impianto (AiraJson::countdown + timer che si riallinea a ogni lettura);
- commandPayload accetta campi extra (start/end);
- catalogo: lupdate leggeva solo i C++ e marcava 151 voci QML come obsolete.
  Ora src e qml espliciti: 197 stringhe, 0 non tradotte;
- versione 0.7.0 (spec, main.cpp), PROTOCOL, README/PIANO, post per il forum.
This commit is contained in:
Carlo
2026-10-11 12:05:59 +02:00
parent 6ef6f5bfd8
commit d2cb9d692f
17 changed files with 481 additions and 80 deletions
+47 -4
View File
@@ -399,7 +399,50 @@ uno resta senza argomento obbligatorio si vede lì (74/74). Provato dal vivo con
un `ping` (200, con la ricezione dall'impianto) e con un boost fuori intervallo,
respinto con 400 **prima** di partire.
**Stato attuale (0.6.9).** 85/85 verifiche del nucleo, 74/74 del bridge,
191/191 stringhe tradotte, `qmllint` pulito, contratto UI↔bridge rispettato.
All'impianto è stato inviato un solo comando, di prova e innocuo: un `ping`
diagnostico, che non cambia nulla. Nessun comando di regolazione è mai partito.
## 11. Assenza con le date e conto alla rovescia del boost — v0.7.0
**Richieste dell'utente (11/10/2026), da applicare come dati:**
1. il **boost** deve essere di **30 minuti**;
2. l'**assenza** si imposta da un **popup con data di inizio e fine**;
3. durante l'assenza l'impianto **tiene la casa a 15 °C** e **riprende
normalmente il giorno prima del rientro**;
4. mentre il boost è in corso si deve vedere un **conto alla rovescia da 30:00 a
00:00**.
## 12. Conseguenze dell'uso reale (0.7.0)
Deciso con l'uso, non in anticipo:
- il **boost** è di **mezz'ora** (era un'ora);
- l'**assenza** non è più "N giorni": si scelgono **due date** in un popup, e la
casa resta a **15 °C**;
- mentre il boost corre, **conto alla rovescia** in Home e in copertina.
Resta aperto: il popup chiede *inizio* e *fine*, dove "fine" è il giorno in cui
l'impianto ricomincia a scaldare (nell'uso di Carlo: il giorno prima del rientro).
Se preferisce indicare il *rientro* e far togliere un giorno all'app, è una riga.
**Come è stato fatto (0.7.0).**
- Bridge: i comandi con durata hanno il loro ramo e i default in cima al file;
per l'assenza `_periodo_assenza` legge `start` ed `end` (AAAA-MM-GG) e li
traduce in `current_time`/`end_time`. La fine è la **mezzanotte del giorno
indicato nel fuso dell'impianto** (`PLANT_TZ = Europe/Rome`, dichiarato dallo
stato): da lì la pompa riprende il programma. Il fuso della *macchina* non si
usa: alle date di cambio ora sbaglia di un'ora (lo hanno visto i test).
- Bridge: `/summary` espone `boost_active` e `boost_remaining_seconds`, calcolati
dalla fine del boost letta dall'impianto (`hot_water_boost.end_time`). Il conto
alla rovescia dell'app si basa su quelli, non su quando l'app ha visto partire
il comando: se il boost l'ha avviato il telefono di casa o l'app ufficiale, il
numero è comunque giusto.
- App: `AwayDialog.qml` (Dialog + due `ValueButton` + `DatePickerDialog`, come
nell'esempio della guida Silica), il conto alla rovescia in Home sotto le
letture e in copertina al posto dell'obiettivo dell'acqua calda. La formattazione
`mm:ss` sta in `AiraJson::countdown` (C++, verificata in `tests/core_test.cpp`),
i secondi li fa scorrere un timer del client, che si riallinea a ogni rilettura.
- Catalogo: `lupdate harbour-aira.pro` leggeva solo i C++ e marcava 151 voci QML
come obsolete (l'italiano sarebbe rimasto a metà senza accorgersene). Ora:
`lupdate src qml -ts translations/harbour-aira-it.ts`. 197 stringhe, 0 non
tradotte.
+4 -2
View File
@@ -37,6 +37,8 @@ Valori pronti per la dashboard.
"manual_mode": false,
"force_heating": false,
"force_heating_remaining": "0s",
"boost_active": false,
"boost_remaining_seconds": 0,
"inline_heater": false,
"hot_water_heating": true,
"configured_modes": "PUMP_MODE_STATE_HEATING",
@@ -153,9 +155,9 @@ Risposta: `{"ok": true, "id": "...", "result": {...}}`.
| `set_hot_water_target` | 45–60 | temperatura ACS obiettivo |
| `set_heating_setpoint` | 5–30 | temperatura obiettivo della casa (zona, default 1) |
| `set_cooling_setpoint` | 5–30 | temperatura obiettivo del raffrescamento (zona, default 1) |
| `hot_water_boost_on` / `hot_water_boost_off` | minuti, 15–240 (default 60) | boost ACS una tantum |
| `hot_water_boost_on` / `hot_water_boost_off` | minuti, 15–240 (default 30) | boost ACS una tantum |
| `hot_water_heating_on` / `hot_water_heating_off` | minuti, 15–1440 (default 60) | riscaldamento ACS |
| `away_mode_on` / `away_mode_off` | giorni, 1–60 (default 7) | modalità assenza |
| `away_mode_on` / `away_mode_off` | `start` ed `end`, AAAA-MM-GG | assenza con date; la casa resta a 15 °C |
| `night_mode_1h` | — | night mode per un'ora |
| `force_heating_on` / `force_heating_off` | minuti, 15–240 (default 60) | riscaldamento forzato |
| `heating_on` / `heating_off` | — | funzione riscaldamento |