La pagina Regolazioni aveva due tasti sempre attivi (avvia/ferma) che non
dicevano cosa sta facendo l'impianto e potevano contraddire la Home. Ora un
ActionButton solo, con testo e comando da api.boostActive — lo stesso dato della
Home — piu' il tempo che resta quando il boost corre.
Alla pressione Silica ri-parenta il RemorseItem dentro la fila dei tre tasti e
ci disegna sopra il banner (messaggio + conto alla rovescia) a margini fissi:
il suo riquadro non ha la larghezza del tasto, quindi copre i tasti vicini.
Il messaggio lo mostra gia' la NoticeBar, che ora ha altezza fissa a una riga e
una banda riservata sotto il contenuto in tutte e cinque le pagine.
Dopo tre diagnosi dedotte e tre volte sbagliate, le coordinate arrivano dal
telefono: il timer 'misura' le manda a /layout, il bridge le scrive nel suo
registro. Nel QML arrivano versione, schermo, contenuto e y/h/testo di ogni
riga.
Carlo segnalava la riga che copriva i tasti mentre la correzione era nella
0.7.1: non c'era modo di sapere quale build stesse girando. In Impostazioni
ora c'e' 'Versione 0.7.4'. La disposizione l'ho anche misurata, replicandola
in QML nel container: con la scatola da 56 px la riga cade a y=240 dentro i
tasti (176..286), con quella da 152 a y=336 sotto.
'22,5/19,0 °C' era la scrittura vecchia: l'obiettivo ora segue la freccia.
La terza riga dice 'Esterno' (l'italiano era 'esterna %1 °C', minuscolo e
femminile, residuo di quando la riga era un'altra frase). Scelte di Carlo,
chieste prima di toccare.
In Home e in copertina: un tocco ferma il boost invece di farne ripartire un
altro (dalla copertina era il caso peggiore). Il conto alla rovescia ora prende
il posto del suggerimento nella stessa riga e con lo stesso carattere: prima,
essendo piu' alto, spingeva giu' i tasti delle azioni rapide.
Glifo di stop disegnato con scripts/make_glyphs.py. Catalogo 199 voci.
In Silica il tasto piglia l'altezza dal tema (itemSizeExtraSmall, ~56 px) e non
dal contenuto: con icona e etichetta (~110) il testo usciva dalla scatola e la
riga di contorno della colonna finiva sopra le etichette. Ora height:
Theme.itemSizeMedium. Aggiunto il controllo in tests/label_fit_check.py e il
registro di posizione e altezza di ogni riga della Home.
- 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.
La copia del bridge dentro l'app va tenuta allineata: contiene la correzione
del boost, dell'assenza, di ACS off e del riscaldamento forzato, che la
libreria accetta solo con un argomento. Il pacchetto Sailfish non cambia (il
bridge non entra nell'RPM), quindi non serve ricostruire l'RPM.
Sulla copertina compare l'icona del boost (CoverAction). Una sola azione: la
documentazione Silica ammette piu' di una azione ma dice che lo stile delle app
di sistema ne mostra una. CoverBackground eredita da Cover, quindi l'elenco
dichiarato li' si attacca; l'icona e' iconSource (non icon.source del Button:
sbagliarlo non da' errore, l'icona semplicemente non compare). La riga in fondo
si ancora a Cover.coverActionArea, cosi' l'icona non la copre.
Nuovo controllo statico tests/cover_action_check.py: elenco figlio diretto del
Cover, una sola azione, icona che esiste, id del comando presente nella tabella
del bridge. Il componente e' nominato nella guida Silica dell'SDK di Carlo.
Le etichette si leggono da MainPage.qml e dal catalogo, la geometria dai numeri
misurati sul telefono: se un'etichetta si allunga (o l'icona si ingrandisce) il
controllo lo segnala prima della build. Su "Commands" fallisce, come deve.
Le icone della 0.6.7 erano disegnate a piena misura e il pulsante Silica le
portava a Theme.iconSizeMedium (64 px, misurato sullo screenshot del telefono):
in un tasto largo un terzo di schermo restavano 41 px di testo e le etichette
uscivano tagliate. Ora il tasto dichiara icon.width/height:
Theme.iconSizeExtraSmall e i glifi riempiono il loro riquadro.
Con la geometria vera (tasto 161 px, rientri 16, distacco 24) le etichette
Assenza/Torna/Altro e Away/Home/More ci stanno con margine; "Comandi" (8
lettere) no: il tasto dice Altro, la pagina resta Comandi impianto.
Il pulsante Silica non espone il carattere, quindi il testo non si puo'
rimpicciolire: l'unica leva e' l'icona. Prova ripetibile con i numeri misurati
in docs/icona/tasti-alla-misura-vera.png.
Il pallino era rosso per qualunque voce nell'elenco errori: un semplice avviso
(compressore limitato dalla temperatura esterna, caso reale del 10/10) sembrava
un guasto. Ora il ponte espone in /summary anche error_severity e
alarm_stopping, e il livello 3 (rosso) e' riservato agli allarmi che fermano la
macchina o di severita' CRITICAL/ERROR; avviso = ambra. Copertina allineata.
6 verifiche nuove nell'harness del nucleo (avviso/stop/critical/error/
precedenza sul modo attivo/gravita' ignota = ambra).
- CommandsPage: 4 interruttori (TextSwitch) al posto di 8 pulsanti in coppie
accendi/spegni, piu' 3 pulsanti per le azioni senza stato. Gli interruttori
seguono il dato vero (automaticCheck: false), non anticipano l'impianto, e
la sezione 'Stato attuale' non serve piu'.
- La pagina si chiama 'Comandi impianto'.
- PlantPage: frase estesa dello stato, diagnostica (verifica impianto) e le
letture che non avevano posto (pompa, modi consentiti, manuale, sbrinamento,
luci di firma).
- SettingsPage: 'Salva' e 'Prova connessione' diventano 'Salva e prova'.
- ApiClient: dopo un comando riuscito lo stato si rilegge da solo (prima non
si aggiornava nulla: l'aggiornamento automatico non esisteva).
- NoticeBar anche su Dati, Impianto e Comandi; via i messaggi dentro il
contenuto che scorre.
- Home: stato in una riga col pallino, due letture grandi toccabili, tre
azioni rapide; via i due slider, i sette pulsanti e la scheda separata.
- Nuova pagina Regolazioni: un blocco per grandezza, valore attuale sempre
visibile, preimpostazioni per le dita fredde, conferma esplicita; il
pulsante e' attivo solo se c'e' davvero qualcosa da cambiare.
- Messaggi dei comandi spostati in ApiClient (api.notice) con NoticeBar
ancorata in fondo: prima nascevano fuori dallo schermo.
- Stato breve/esteso/livello in C++ (testabile senza SDK), 18 verifiche
nuove: 79/79.
- stale + lastUpdate: la Home dice 'aggiornato alle HH:MM' e spegne i
numeri vecchi invece di farli passare per freschi.
- 192/192 stringhe tradotte (54 nuove).
docs/UX-STUDIO.md: 10 problemi rilevati (esito dei comandi fuori vista,
12 pulsanti con coppie acceso/spento, doppia navigazione, dati vecchi
mostrati come attuali), la proposta (Home di sola consultazione, pagina
Regolazioni, interruttori, feedback ancorato), microcopy, piano di
verifica e decisioni da prendere. Schemi in docs/ux/.
Le chiavi lette dalle pagine vengono confrontate con quelle che /summary e
/stats restituiscono davvero: la UI non si puo' eseguire senza il kit Silica,
quindi un refuso resterebbe invisibile fino al primo build sul telefono.
- home: temperatura esterna e in casa/assente in alto, messaggio di stato,
scheda impianto con temperatura stanza e acqua calda; comandi sotto
- pagina Dati: calore prodotto, elettricita' usata, COP acqua calda e
riscaldamento, risparmio, CO2 evitata, Smart Tariff Control (mese per mese)
- pagina Impianto: stato, termostato a parete, versioni software, errori
- bridge 0.4.0: rotta /stats (servizio statistiche del cloud) e blocco
dispositivo in /summary (ID breve, versioni, termostato)
- C++: parseStats, formatNumber, formatMoney, monthLabel (separatore e
valuta secondo la lingua); 61/61 verifiche del nucleo
- anteprime aggiornate (dati, impianto) in inglese e italiano
L'inglese è la lingua sorgente delle stringhe; l'italiano sta nel catalogo
translations/harbour-aira-it.ts (99 stringhe), che lupdate aggiorna e lrelease
compila in build. Di serie la lingua del sistema, con ripiego sull'inglese.
- nuova classe Translator: risolve la lingua prima di createView e allinea
QLocale::setDefault, così anche i numeri seguono la lingua (23,0 °C in
italiano, 23.0 °C in inglese) — le temperature passano da formatValue, non
più dal toFixed() di JavaScript che metteva sempre il punto
- Qt 5.6 non ha QQmlEngine::retranslate(): al cambio di lingua la radice QML
viene ricaricata (setSource ricrea il componente anche a url invariata)
- le etichette di stato in airajson.cpp usano QCoreApplication::translate per
esteso: lupdate non riconosce una funzione wrapper e le avrebbe perse
- selettore della lingua in Impostazioni (Sistema / English / Italiano)
- test: 41/41, carica il .qm vero come fa main.cpp e verifica entrambe le
lingue, il ripiego e i formati numerici
- anteprime bilingui (docs/anteprima/ inglese, it/ italiano), README e PIANO
aggiornati, spec RPM con i cataloghi in %files
- bridge/ con aira_bridge.py, setup_creds.py, aira_probe.py, test offline
- percorsi di configurazione via AIRA_CONFIG_DIR (default invariato)
- README del bridge in inglese: installazione, servizio, firewall, sicurezza
- README principale aggiornato (il bridge non è più 'fuori dal repo')