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
+20
View File
@@ -114,6 +114,26 @@ int main(int argc, char *argv[])
AiraJson::commandPayload("hot_water_boost_on", QVariant())).object();
check(c2.contains("value") == false, "comando senza parametri: nessun campo value");
// Il popup dell'assenza manda start ed end: devono arrivare nel corpo, e i
// campi vuoti non devono entrarci.
const QJsonObject c3 = QJsonDocument::fromJson(AiraJson::commandPayload(
"away_mode_on", QVariant(), QVariantMap{
{ QStringLiteral("start"), QStringLiteral("2026-11-01") },
{ QStringLiteral("end"), QStringLiteral("2026-11-08") },
{ QStringLiteral("zone"), QString() } })).object();
check(c3.value("start").toString() == "2026-11-01", "campo start nel corpo");
check(c3.value("end").toString() == "2026-11-08", "campo end nel corpo");
check(c3.contains("value") == false, "assenza con date: nessun campo value");
check(c3.contains("zone") == false, "campo vuoto: non entra nel corpo");
// ---- countdown (conto alla rovescia del boost) ------------------------ //
check(AiraJson::countdown(1800) == "30:00", "mezz'ora -> 30:00");
check(AiraJson::countdown(65) == "01:05", "65 secondi -> 01:05");
check(AiraJson::countdown(59) == "00:59", "59 secondi -> 00:59");
check(AiraJson::countdown(0) == "00:00", "zero -> 00:00");
check(AiraJson::countdown(-5) == "00:00", "negativo -> 00:00");
check(AiraJson::countdown(240 * 60) == "240:00", "quattro ore -> 240:00");
// ---- errorMessage ----------------------------------------------------- //
check(AiraJson::errorMessage(R"({"ok":false,"error":"token mancante o errato"})", 401)
== "token mancante o errato", "messaggio d'errore dal corpo");