Files
harbour-aira/rpm/harbour-aira.spec
T
Carlo 1e2f5bbea3 0.7.8: le diciture della copertina
'T. casa', 'T. acqua', 'Temperatura esterna'. Stringhe proprie della copertina:
la copertina condivideva 'House' e 'Hot water' con la Home, quindi cambiare la
traduzione avrebbe cambiato anche la Home, che resta 'Casa' e 'Acqua calda'.
2026-10-11 18:45:46 +02:00

224 lines
12 KiB
RPMSpec

Name: harbour-aira
Summary: Control your Aira heat pump through a local bridge
Version: 0.7.8
Release: 1
Group: Qt/Qt
License: MIT
URL: https://git.hackatoniclife.com/kaneda/harbour-aira
Source0: %{name}-%{version}.tar.gz
Source1: %{name}.desktop
Requires: sailfishsilica-qt5 >= 0.10.9
BuildRequires: pkgconfig(sailfishapp) >= 1.0.2
BuildRequires: pkgconfig(Qt5Core)
BuildRequires: pkgconfig(Qt5Qml)
BuildRequires: pkgconfig(Qt5Quick)
BuildRequires: pkgconfig(Qt5Network)
BuildRequires: desktop-file-utils
# lupdate/lrelease: i .qm si compilano in build (CONFIG += sailfishapp_i18n).
BuildRequires: qt5-qttools-linguist
%global debug_package %{nil}
%description
Native Sailfish OS client for an Aira Home heat pump.
It does not talk to the Aira cloud directly: the cloud API is gRPC over HTTP/2
and Qt 5.6 has no HTTP/2. A small bridge on the user's server (Python,
pyairahome) keeps the credentials and exposes the plant as JSON over HTTP/1.1.
The app shows the current state, the energy data (heat produced, electricity
used, efficiency, savings) and sends the hot-water and heating commands.
The interface is in English and Italian: by default it follows the phone
language and falls back to English, and the language can also be picked in the
app settings.
Address and token of the bridge live in the app settings (AppConfigLocation);
no personal data is stored in the binary.
%changelog
* Sun Oct 11 2026 Carlo <carlo@carlobaratto.it> - 0.7.8-1
- copertina: le tre diciture diventano "T. casa", "T. acqua" e "Temperatura
esterna". Sono stringhe proprie della copertina, cosi' la Home resta "Casa" e
"Acqua calda".
* Sun Oct 11 2026 Carlo <carlo@carlobaratto.it> - 0.7.7-1
- Regolazioni, acqua calda: un solo tasto del boost che cambia con lo stato
(avvia / ferma) invece di due sempre attivi, con il tempo che resta. Lo stato
e' quello della Home (api.boostActive): stesso dato, stessa verita'.
* Sun Oct 11 2026 Carlo <carlo@carlobaratto.it> - 0.7.6-1
- via il RemorseItem dai tasti rapidi: Silica se lo ri-parenta dentro la fila
dei tre tasti e ci disegna sopra il banner, coprendoli (succedeva premendo);
- la barra messaggi ha altezza fissa e una banda riservata sotto il contenuto,
cosi' non copre piu' niente e non sposta niente quando compare.
* Sun Oct 11 2026 Carlo <carlo@carlobaratto.it> - 0.7.5-1
- La Home manda le sue misure al bridge (rotta /layout): cosi' la disposizione
si corregge guardando i numeri veri del telefono, non deducendoli.
* Sun Oct 11 2026 Carlo <carlo@carlobaratto.it> - 0.7.4-1
- Impostazioni: la versione dell'app scritta a schermo. Servita subito: un
difetto della disposizione era l'app vecchia installata, non un bug.
* Sun Oct 11 2026 Carlo <carlo@carlobaratto.it> - 0.7.3-1
- copertina: l'obiettivo dopo una freccia ("22,5 -> 19,0 °C") invece della barra
vecchia; la riga esterna dice "Esterno" (era "esterna", minuscolo).
* Sun Oct 11 2026 Carlo <carlo@carlobaratto.it> - 0.7.2-1
- il tasto del boost diventa "Stop" (con glifo di stop) mentre il boost e' in
corso, in Home e in copertina: prima un tocco dalla copertina ne faceva
ripartire un altro invece di fermarlo.
- il conto alla rovescia prende il posto del suggerimento nella stessa riga e
con la stessa misura del carattere: essendo piu' alto spingeva giu' i tasti
delle azioni rapide.
- tests/cover_action_check.py controlla tutti i comandi dell'azione (anche
condizionali) e tutte le icone citate.
* Sun Oct 11 2026 Carlo <carlo@carlobaratto.it> - 0.7.1-1
- i tre tasti delle azioni rapide dichiarano la loro altezza: in Silica il tasto
la piglia dal tema (Theme.itemSizeExtraSmall, ~56 px) e non dal contenuto,
quindi con icona E etichetta il testo (~110 px) usciva dalla scatola e la riga
di contorno finiva sopra le etichette (segnalato: "la riga sotto si disallinea
coprendo i pulsanti").
- il registro dell'avvio elenca posizione e altezza di ogni riga della Home.
* Sun Oct 11 2026 Carlo <carlo@carlobaratto.it> - 0.7.0-1
- assenza con le date: popup con inizio e fine (DatePickerDialog, componenti
verificati nella guida Silica dell'SDK). Il bridge manda inizio e fine come
orari veri, l'impianto tiene la casa a 15 °C e riprende il giorno scelto
come fine (per Carlo: il giorno prima del rientro).
- conto alla rovescia del boost da 30:00 a 00:00, in Home e in copertina: i
secondi vengono dalla fine del boost letta dall'impianto, l'app li fa scorrere.
- boost a mezz'ora (era un'ora): richiesta dell'utente.
- catalogo italiano rifatto: lupdate leggeva solo i C++ e marcava 151 voci dei
QML come obsolete. Ora si passano src e qml espliciti: 197 stringhe tradotte.
* Sun Oct 11 2026 Carlo <carlo@carlobaratto.it> - 0.6.9-1
- copertina: azione rapida (P8 del piano). Sulla copertina compare l'icona del
boost: si avvia il boost dell'acqua calda senza aprire l'app. Una sola azione,
perche' la documentazione Silica dice che due si possono avere ma che lo stile
delle app di sistema ne mostra una. La riga dei dati non freschi si sposta
sopra l'area delle azioni (Cover.coverActionArea), cosi' l'icona non la copre.
Componente e nomi verificati nella guida dell'SDK (CoverActionList, CoverAction,
iconSource, onTriggered: attenzione, e' iconSource, non icon.source del Button)
- nuovo controllo statico tests/cover_action_check.py: elenco figlio diretto del
Cover, una sola azione, icona che esiste, comando presente nella tabella del
bridge (un id sbagliato sarebbe un 400 scoperto solo sul telefono)
* Sun Oct 11 2026 Carlo <carlo@carlobaratto.it> - 0.6.8-1
- Home: le icone dei tasti rimpicciolite. Il pulsante Silica, se non si dice
altro, disegna l'icona a Theme.iconSizeMedium (64 px): in un tasto largo un
terzo di schermo restavano 41 px di testo e le etichette uscivano tagliate
("Boos", "Asse", "Altro" no). Ora l'icona e' Theme.iconSizeExtraSmall e i
glifi riempiono il loro riquadro. Etichette piu' corte dove non ci stavano
(Assenza/Torna/Altro, Away/Home/More): con i numeri veri misurati sullo
screenshot ognuna ci sta con margine. La pagina resta "Comandi impianto"
* Sun Oct 11 2026 Carlo <carlo@carlobaratto.it> - 0.6.7-1
- Home: i tre tasti delle azioni rapide hanno un'icona (fiamma = boost, casa =
assenza, tre manopole = comandi). Il tema Sailfish non ha icone per questi
concetti (nell'elenco ufficiale non c'e' nessuna fiamma): sono disegnate con
Pillow in scripts/make_glyphs.py, PNG bianche su trasparente in qml/icons/
* Sun Oct 11 2026 Carlo <carlo@carlobaratto.it> - 0.6.6-1
- Home: toccare "Casa" o "Acqua calda" apre le regolazioni di quell'oggetto e
non piu' casa e acqua insieme; l'acqua porta con se' il boost, che e' suo.
Nuovo controllo statico (tests/qml_focus_check.py) su chi apre e chi mostra
* Sun Oct 11 2026 Carlo <carlo@carlobaratto.it> - 0.6.5-1
- copertina: l'acqua si chiama "Acqua calda" come in Home (era "Acqua"). Con
l'etichetta piu' lunga il valore attuale sta piu' grande e l'obiettivo piu'
piccolo e attaccato ("51,5/55,0 °C"): la riga resta dentro la cover, che e'
stretta, e il numero attuale non si taglia
* Sun Oct 11 2026 Carlo <carlo@carlobaratto.it> - 0.6.4-1
- copertina: due righe con l'etichetta davanti, "Casa" e "Acqua", ognuna con
temperatura attuale / impostata ("22,9 / 19,0 °C"). Prima erano frasi lunghe
("casa · obiettivo 19,0 °C", "ACS 53,4 °C · obiettivo 55 °C") che sulla cover,
stretta, venivano tagliate a meta' e il numero vero non si leggeva
* Sun Oct 11 2026 Carlo <carlo@carlobaratto.it> - 0.6.3-1
- nuova icona: casa con l'onda calda dentro, scelta fra le quattro proposte in
scripts/icon_proposals.py. Ridisegnata a 344 px e rigenerata alle quattro
misure (86/108/128/172); disegno originale, nessun logo di terzi
* Sat Oct 10 2026 Carlo <carlo@carlobaratto.it> - 0.6.2-1
- pallino di stato: rosso solo per un allarme che ferma la macchina (o di
severita' CRITICAL/ERROR); un avviso ora e' ambra. Prima qualunque voce
nell'elenco errori accendeva il rosso, e un semplice avviso (compressore
limitato dalla temperatura esterna, caso reale del 10/10) sembrava un guasto.
Il bridge espone error_severity e alarm_stopping in /summary; l'esito ignoto
resta ambra, il rosso si accende solo su un guasto che sappiamo essere serio
* Sat Oct 10 2026 Carlo <carlo@carlobaratto.it> - 0.6.1-1
- correzione: la Home non si apriva ("Type MainPage unavailable", app senza
pagina iniziale). Causa: due assegnazioni di Component.onCompleted nello
stesso oggetto; in Qt 5.6 la pagina non si crea piu' e il messaggio non dice
quale sia il file. Ora un controllo automatico le intercetta in pochi
millisecondi (tests/qml_check_bindings.py), prima della build
* Sat Oct 10 2026 Carlo <carlo@carlobaratto.it> - 0.6.0-1
- Home di sola consultazione: stato in una riga con pallino colorato, le due
letture (casa e acqua calda) grandi e toccabili, tre azioni rapide; le due
regolazioni e i pulsanti di navigazione escono dalla Home
- pagina Regolazioni: obiettivo casa e obiettivo acqua calda, ognuno con il
valore attuale sempre visibile, slider, valori rapidi e conferma; boost ACS
- Comandi impianto: quattro interruttori al posto di otto pulsanti acceso/
spento, piu' tre pulsanti per le azioni senza stato; diagnostica spostata
nella pagina Impianto
- messaggi dei comandi ancorati in fondo alla pagina, visibili sempre
- numeri vecchi mostrati spenti, con l'ora dell'ultimo aggiornamento
- lo stato si rilegge da solo due secondi dopo un comando
* Sat Oct 10 2026 Carlo <carlo@carlobaratto.it> - 0.5.0-1
- schermata iniziale riordinata come l'app ufficiale: temperatura esterna in
alto, messaggio di stato, scheda dell'impianto con casa e acqua calda
- pagina Dati: calore prodotto, elettricita' usata, efficienza (COP) e risparmi
- pagina Impianto: stato, termostato a parete, versioni del software, errori
* Sat Oct 10 2026 Carlo <carlo@carlobaratto.it> - 0.4.0-1
- interfaccia in inglese e italiano, scelta nelle impostazioni con ripiego
sull'inglese; numeri con il separatore decimale della lingua
* Sat Oct 10 2026 Carlo <carlo@carlobaratto.it> - 0.3.0-1
- pagina Altri comandi: assenza, night mode, riscaldamento forzato, legionella,
ACS on/off, verifica impianto; stato attuale in cima alla pagina
* Fri Oct 09 2026 Carlo <carlo@carlobaratto.it> - 0.2.0-1
- temperatura della casa e obiettivo per zona (slider 5-30 gradi)
* Fri Oct 09 2026 Carlo <carlo@carlobaratto.it> - 0.1.0-1
- prima release: stato impianto, obiettivo ACS, boost ACS
%prep
%setup -q -n %{name}-%{version}
%build
%qmake5
make %{?_smp_mflags}
# Catalogo italiano. Il .pro dichiara CONFIG += sailfishapp_i18n (che sui kit
# recenti genera e installa i .qm da solo), ma su altri kit quel template non li
# produce in modo affidabile — vedi harbour-tide/harbour-quill — e un catalogo
# mancante NON fa fallire la compilazione: l'app resterebbe in inglese senza dire
# niente. Qui lo si rigenera comunque; il file finisce nella stessa cartella dove
# lo cerca src/translator.cpp. Il .ts si cerca con find perche' sfdk usa i
# sorgenti live (shadow build) e la cartella puo' chiamarsi harbour-aira-0.6.0
# (tarball), harbour-aira (clone) o harbour-aira-main (archivio di Gitea).
TS=$(find %{_builddir}/.. -maxdepth 4 -name 'harbour-aira-it.ts' 2>/dev/null | head -1)
if [ -z "$TS" ]; then
echo "ERROR: harbour-aira-it.ts not found" >&2
exit 1
fi
lrelease "$TS" -qm %{_builddir}/harbour-aira-it.qm
%install
make install INSTALL_ROOT=%{buildroot}
mkdir -p %{buildroot}%{_datadir}/applications
# Il catalogo nel data dir dell'app: e' li' che translator.cpp lo carica
# (/usr/share/harbour-aira/translations).
mkdir -p %{buildroot}%{_datadir}/%{name}/translations
install -m 0644 %{_builddir}/harbour-aira-it.qm %{buildroot}%{_datadir}/%{name}/translations/
# Il desktop file si cerca con find: sfdk usa i sorgenti live (shadow build) e
# la cartella sorgente puo' chiamarsi harbour-aira-0.1.0 (tarball), harbour-aira
# (clone) o harbour-aira-main (zip di Gitea).
DESKTOP=$(find %{_builddir}/.. -maxdepth 4 -name '%{name}.desktop' 2>/dev/null | head -1)
if [ -z "$DESKTOP" ] && [ -f %{SOURCE1} ]; then DESKTOP=%{SOURCE1}; fi
if [ -z "$DESKTOP" ]; then
echo "ERROR: %{name}.desktop not found" >&2
exit 1
fi
install -m 0644 "$DESKTOP" %{buildroot}%{_datadir}/applications/%{name}.desktop
desktop-file-validate %{buildroot}%{_datadir}/applications/%{name}.desktop || true
%files
%defattr(-,root,root,-)
%{_bindir}/%{name}
%{_datadir}/applications/%{name}.desktop
%{_datadir}/icons/hicolor/86x86/apps/%{name}.png
%{_datadir}/icons/hicolor/108x108/apps/%{name}.png
%{_datadir}/icons/hicolor/128x128/apps/%{name}.png
%{_datadir}/icons/hicolor/172x172/apps/%{name}.png
%{_datadir}/%{name}/qml
%{_datadir}/%{name}/translations/%{name}*.qm