Files
harbour-aira/README.it.md
T
Carlo fddd21e16a 0.4.0: interfaccia in italiano e inglese, scelta nelle impostazioni
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
2026-10-10 08:19:20 +02:00

6.8 KiB

harbour-aira — versione italiana

English version: README.md


harbour-aira

App nativa Sailfish OS per una pompa di calore Aira Home: mostra lo stato dell'impianto e invia i comandi dell'acqua calda sanitaria e del riscaldamento (temperatura obiettivo della casa, per zona).

L'interfaccia è in inglese e italiano: di serie segue la lingua del telefono e ripiega sull'inglese; la si può scegliere anche nelle impostazioni dell'app.

architettura

Anteprime del layout (valori veri dell'impianto, non screenshot — vedi Stato). Queste sono in italiano; quelle in inglese stanno in docs/anteprima/:

Home Altri comandi Impostazioni Copertina
home comandi impostazioni copertina

La lingua dell'interfaccia

L'inglese è la lingua sorgente delle stringhe (sta direttamente nel codice); l'italiano sta nel catalogo translations/harbour-aira-it.ts, che lupdate aggiorna e lrelease compila in build.

La scelta fatta nelle impostazioni è salvata in QSettings con il codice della lingua; vuoto (o lingua assente) significa lingua di sistema, con ripiego sull'inglese quando non esiste il catalogo corrispondente.

Qt 5.6 non ha QQmlEngine::retranslate() (arriva con Qt 5.10): installare un traduttore non basta a ritradurre quello che è già a schermo. L'app quindi, al cambio di lingua, ricarica la radice QML — la scelta ha effetto subito, al prezzo di tornare alla pagina iniziale.

Anche i numeri seguono la lingua: le temperature passano da QLocale, quindi in italiano si scrive 23,0 °C e in inglese 23.0 °C.

Perché c'è un bridge (e non una chiamata diretta al cloud)

Il cloud Aira espone gRPC su HTTP/2. Qt 5.6 — il toolkit su cui gira ogni app Sailfish — non ha HTTP/2, quindi un client nativo non può parlarci direttamente. Le alternative (impacchettare grpcio per aarch64 con PyOtherSide, oppure riscrivere Cognito + gRPC in C++) sono fragili e costose.

Quindi la logica resta sul server, dove Python e i token già funzionano, e l'app è un client sottile che parla HTTP/1.1 + JSON. Effetto collaterale gradito: credenziali e token non stanno mai sul telefono.

 Jolla (QML/C++ Qt 5.6)  --HTTP/1.1 + JSON-->  bridge (Linux in LAN)  --gRPC-->  cloud Aira
                                               bridge/aira_bridge.py

Il bridge

Il codice sta in bridge/: istruzioni complete in bridge/README.md (in inglese, perché è la parte che serve a chi prova l'app su un altro impianto).

cd bridge
python3 -m venv .venv && . .venv/bin/activate
pip install -r requirements.txt
export AIRA_CONFIG_DIR="$HOME/.config/aira"
python setup_creds.py            # email e password Aira: salvate in un file 600
python aira_bridge.py --port 8790

Al primo avvio il bridge genera un token in $AIRA_CONFIG_DIR/aira_bridge.json (permessi 600): è il valore da incollare nelle impostazioni dell'app. API completa in docs/PROTOCOL.md.

Impostazioni nell'app

Indirizzo e token si configurano nella pagina Impostazioni (QSettings in ~/.config/harbour/aira/aira.conf): niente dati personali nel binario.

Build

Servono l'SDK Sailfish (sfdk) e un target aarch64 (Jolla Phone 2026):

sfdk target install SailfishOS-5.0.0.62-aarch64
sfdk target use SailfishOS-5.0.0.62-aarch64
sfdk build           # RPM in RPMS/
sfdk deploy          # sul dispositivo collegato

Sorgenti dal tarball (harbour-aira-<versione>.tar.gz, se ne hai ricevuto uno): estrarre in una cartella nuova (mai sopra una estrazione precedente: i Makefile restano stale), oppure clonare direttamente questo repository. Il log dell'app inizia con harbour-aira v<versione> build <data>: serve a distinguere una build nuova da una stale senza indovinare.

Verifica locale, senza SDK

cd tests && mkdir -p build && cd build
~/Qt/5.15.2/gcc_64/bin/qmake ../core_test.pro && make && ./core_test

Copre la logica pura (src/airajson.cpp): normalizzazione dell'indirizzo, lettura del riassunto, etichette di stato, corpo dei comandi, messaggi d'errore. La UI Silica si verifica solo sul dispositivo.

Stato

  • 39/39 verifiche del nucleo, compilazione senza warning
  • 27/27 verifiche offline del bridge (bridge/test_bridge_commands.py)
  • 99/99 stringhe tradotte nel catalogo italiano: il test carica il .qm compilato come fa main.cpp e verifica che in inglese l'etichetta di stato sia la sorgente e in italiano quella tradotta, e che togliendo il catalogo si torni all'inglese
  • numeri formattati con QLocale: il separatore decimale segue la lingua (verificato per entrambe)
  • qmllint pulito su tutti i QML (valida solo la sintassi: senza il modulo Silica una proprietà inesistente passa in silenzio)
  • provata dal vivo in sola lettura su un impianto Aira Home
  • l'app non è ancora stata compilata né eseguita su un telefono: le immagini in docs/anteprima/ sono anteprime di layout costruite con i valori veri dell'impianto, non screenshot

Non c'è ancora la UI per il raffrescamento (il bridge sa farlo), né orari e curve; non è nella Jolla Store: è un client non ufficiale che parla con le API Aira usando il proprio account.

Struttura

harbour-aira.pro        progetto qmake (icona, qml, docs)
src/airajson.{h,cpp}    logica pura, testabile senza SDK
src/apiclient.{h,cpp}   QNetworkAccessManager + watchdog di timeout
src/settings.{h,cpp}    QSettings su AppConfigLocation (sandbox SailJail)
src/translator.{h,cpp}  lingua dell'interfaccia: locale di sistema, ripiego
                        sull'inglese, ricarica della UI al cambio
src/main.cpp            context properties: appSettings, api, translator
qml/harbour-aira.qml    ApplicationWindow + copertina
qml/pages/MainPage.qml  dashboard e comandi acqua/riscaldamento
qml/pages/CommandsPage.qml  gli altri comandi, con lo stato attuale in cima
qml/pages/SettingsPage.qml
qml/components/InfoRow.qml
qml/components/ActionButton.qml  pulsante di comando, con conferma opzionale
tests/core_test.cpp     verifiche del nucleo (headless)
bridge/aira_bridge.py   servizio HTTP/1.1 + JSON verso il cloud (gRPC)
bridge/setup_creds.py   salva le credenziali Aira (file 600)
bridge/aira_probe.py    sonda di sola lettura: login + stato impianto
bridge/test_bridge_commands.py  verifiche offline dei comandi (27 controlli)
bridge/harbour-aira-bridge.service  unit systemd utente
bridge/README.md        istruzioni di installazione del bridge (inglese)
docs/PIANO.md           piano di progetto e scelte
docs/PROTOCOL.md        API del bridge
translations/           harbour-aira-it.ts (l'inglese è la lingua sorgente)
docs/anteprima/         anteprime di layout in inglese (in italiano: it/)

Licenza

MIT.