0.6.5: sulla copertina l'acqua si chiama Acqua calda come in Home; attuale piu' grande, obiettivo attaccato

This commit is contained in:
2026-10-11 08:24:49 +02:00
parent 462ea035ca
commit a788255593
10 changed files with 89 additions and 47 deletions
+1 -1
View File
@@ -41,7 +41,7 @@ e ripiega sull'inglese; la si può scegliere anche nelle impostazioni dell'app.
tocco, più i pulsanti per quello che uno stato non ce l'ha: ciclo legionella e tocco, più i pulsanti per quello che uno stato non ce l'ha: ciclo legionella e
night mode per un'ora. Gli interruttori seguono l'impianto, non lo anticipano night mode per un'ora. Gli interruttori seguono l'impianto, non lo anticipano
- **Copertina** con casa e acqua calda, ognuna con il valore che l'impianto sta - **Copertina** con casa e acqua calda, ognuna con il valore che l'impianto sta
tenendo adesso e il suo obiettivo ("22,9 / 19,0 °C"), più il pallino di stato tenendo adesso e il suo obiettivo ("22,9/19,0 °C"), più il pallino di stato
come nella Home come nella Home
- Indirizzo e token del bridge stanno nelle impostazioni dell'app (QSettings), - Indirizzo e token del bridge stanno nelle impostazioni dell'app (QSettings),
mai nel binario mai nel binario
+1 -1
View File
@@ -36,7 +36,7 @@ status, domestic hot water, and the house target temperature per zone.
the buttons for what has no state: legionella cycle and night mode for one the buttons for what has no state: legionella cycle and night mode for one
hour. The switches follow the plant — they never anticipate it hour. The switches follow the plant — they never anticipate it
- **Cover page** showing the house and the hot water, each with the value the - **Cover page** showing the house and the hot water, each with the value the
plant is keeping right now and its target ("22.9 / 19.0 °C"), plus a status dot plant is keeping right now and its target ("22.9/19.0 °C"), plus a status dot
that matches the home screen that matches the home screen
- Address and bridge token live in the app settings (QSettings), never in the - Address and bridge token live in the app settings (QSettings), never in the
binary binary
+5 -4
View File
@@ -328,10 +328,11 @@ logo Aira è ancora in sospeso.
**0.6.4 — la copertina.** Due righe con l'etichetta davanti, "Casa" e "Acqua", **0.6.4 — la copertina.** Due righe con l'etichetta davanti, "Casa" e "Acqua",
ognuna con temperatura attuale / impostata. Le frasi lunghe di prima ("ACS ognuna con temperatura attuale / impostata. Le frasi lunghe di prima ("ACS
53,4 °C · obiettivo 55 °C") sulla cover, che è stretta, venivano tagliate a metà: 53,4 °C · obiettivo 55 °C") sulla cover, che è stretta, venivano tagliate a metà:
il numero vero spariva proprio dove lo si guarda di sfuggita. Per stare nella il numero vero spariva proprio dove lo si guarda di sfuggita. L'acqua si chiama
colonna stretta dell'etichetta, sulla cover l'acqua si chiama "Acqua"; in Home "Acqua calda" anche qui, come in Home: per stare nella colonna stretta
resta "Acqua calda". dell'etichetta il valore attuale è più grande e l'obiettivo più piccolo e
attaccato ("51,5/55,0 °C").
**Stato attuale (0.6.4).** 85/85 verifiche del nucleo, 48/48 del bridge, **Stato attuale (0.6.5).** 85/85 verifiche del nucleo, 48/48 del bridge,
191/191 stringhe tradotte, `qmllint` pulito, contratto UI↔bridge rispettato. 191/191 stringhe tradotte, `qmllint` pulito, contratto UI↔bridge rispettato.
Nessun comando è stato inviato all'impianto: tutto quanto sopra è a sola lettura. Nessun comando è stato inviato all'impianto: tutto quanto sopra è a sola lettura.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

+58 -25
View File
@@ -4,10 +4,12 @@ import Sailfish.Silica 1.0
// Copertina: legge api.summary (context property C++), quindi non dipende // Copertina: legge api.summary (context property C++), quindi non dipende
// dallo scope delle property della pagina principale. // dallo scope delle property della pagina principale.
// //
// Due righe con l'etichetta davanti: "attuale / impostata" per la casa e per // Due righe con l'etichetta davanti — "Casa" e "Acqua calda" — ognuna con il
// l'acqua. Prima erano frasi lunghe ("casa · obiettivo 19,0 °C", "ACS 53,4 °C · // valore attuale e l'obiettivo. L'etichetta dell'acqua e' lunga e la cover e'
// obiettivo 55 °C") e sulla cover, che e' stretta, venivano tagliate a meta': // stretta: percio' il valore attuale sta piu' grande e l'obiettivo piu' piccolo
// il numero vero spariva proprio dove serve di sfuggita. // e attaccato ("51,5/55,0 °C"), invece di due numeri della stessa taglia che
// costringerebbero a tagliare. Prima erano frasi lunghe ("ACS 53,4 °C ·
// obiettivo 55 °C") e il numero vero spariva a meta' riga.
CoverBackground { CoverBackground {
id: cover id: cover
@@ -16,9 +18,10 @@ CoverBackground {
return api.formatValue(v) return api.formatValue(v)
} }
// "22,9 / 19,0 °C": attuale e impostata, con l'unita' una volta sola. // "/19,0 °C": l'obiettivo attaccato al valore attuale. Niente spazio dopo la
function coppia(attuale, impostata) { // barra: con l'etichetta lunga e' quello che tiene la riga dentro la cover.
return cover.t(attuale) + " / " + cover.t(impostata) + " °C" function obiettivo(key) {
return "/" + cover.t(key) + " °C"
} }
// Colore del pallino: gli stessi criteri della Home (vedi MainPage.qml). // Colore del pallino: gli stessi criteri della Home (vedi MainPage.qml).
@@ -66,7 +69,9 @@ CoverBackground {
width: parent.width - 2 * Theme.paddingMedium width: parent.width - 2 * Theme.paddingMedium
spacing: Theme.paddingMedium spacing: Theme.paddingMedium
// ---- casa ---------------------------------------------------------- //
Row { Row {
id: rigaCasa
width: parent.width width: parent.width
spacing: Theme.paddingSmall spacing: Theme.paddingSmall
@@ -74,42 +79,70 @@ CoverBackground {
text: qsTr("House") text: qsTr("House")
color: Theme.secondaryColor color: Theme.secondaryColor
font.pixelSize: Theme.fontSizeExtraSmall font.pixelSize: Theme.fontSizeExtraSmall
width: parent.width * 0.32 width: rigaCasa.width * 0.42
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
} }
Label { Row {
text: cover.coppia("zone1_temperature", "zone1_setpoint") width: rigaCasa.width * 0.58 - rigaCasa.spacing
// Spenta quando i numeri sono vecchi: non deve sembrare fresca. spacing: 0
color: api.stale ? Theme.secondaryColor : Theme.primaryColor
font.pixelSize: Theme.fontSizeSmall
font.bold: true
elide: Text.ElideRight
width: parent.width - parent.width * 0.32 - parent.spacing
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
Label {
id: casaOra
// Spento quando i numeri sono vecchi: non deve sembrare fresco.
text: cover.t("zone1_temperature")
color: api.stale ? Theme.secondaryColor : Theme.primaryColor
font.pixelSize: Theme.fontSizeSmall
font.bold: true
}
Label {
text: cover.obiettivo("zone1_setpoint")
color: Theme.secondaryColor
font.pixelSize: Theme.fontSizeExtraSmall
width: parent.width - casaOra.width
elide: Text.ElideRight
anchors.verticalCenter: parent.verticalCenter
}
} }
} }
// ---- acqua calda --------------------------------------------------- //
Row { Row {
id: rigaAcqua
width: parent.width width: parent.width
spacing: Theme.paddingSmall spacing: Theme.paddingSmall
Label { Label {
text: qsTr("Water") text: qsTr("Hot water")
color: Theme.secondaryColor color: Theme.secondaryColor
font.pixelSize: Theme.fontSizeExtraSmall font.pixelSize: Theme.fontSizeExtraSmall
width: parent.width * 0.32 width: rigaAcqua.width * 0.42
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
} }
Label { Row {
text: cover.coppia("dhw_current", "dhw_target") width: rigaAcqua.width * 0.58 - rigaAcqua.spacing
color: api.stale ? Theme.secondaryColor : Theme.primaryColor spacing: 0
font.pixelSize: Theme.fontSizeSmall
font.bold: true
elide: Text.ElideRight
width: parent.width - parent.width * 0.32 - parent.spacing
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
Label {
id: acquaOra
text: cover.t("dhw_current")
color: api.stale ? Theme.secondaryColor : Theme.primaryColor
font.pixelSize: Theme.fontSizeSmall
font.bold: true
}
Label {
text: cover.obiettivo("dhw_target")
color: Theme.secondaryColor
font.pixelSize: Theme.fontSizeExtraSmall
width: parent.width - acquaOra.width
elide: Text.ElideRight
anchors.verticalCenter: parent.verticalCenter
}
} }
} }
} }
+6 -1
View File
@@ -1,6 +1,6 @@
Name: harbour-aira Name: harbour-aira
Summary: Control your Aira heat pump through a local bridge Summary: Control your Aira heat pump through a local bridge
Version: 0.6.4 Version: 0.6.5
Release: 1 Release: 1
Group: Qt/Qt Group: Qt/Qt
License: MIT License: MIT
@@ -37,6 +37,11 @@ Address and token of the bridge live in the app settings (AppConfigLocation);
no personal data is stored in the binary. no personal data is stored in the binary.
%changelog %changelog
* 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 * Sun Oct 11 2026 Carlo <carlo@carlobaratto.it> - 0.6.4-1
- copertina: due righe con l'etichetta davanti, "Casa" e "Acqua", ognuna con - copertina: due righe con l'etichetta davanti, "Casa" e "Acqua", ognuna con
temperatura attuale / impostata ("22,9 / 19,0 °C"). Prima erano frasi lunghe temperatura attuale / impostata ("22,9 / 19,0 °C"). Prima erano frasi lunghe
+10 -7
View File
@@ -371,7 +371,7 @@ TEXTS["en"].update({
"save_and_test": "Save and test", "save_and_test": "Save and test",
"cover_outdoor": "outside", "cover_outdoor": "outside",
"cover_house": "House", "cover_house": "House",
"cover_water": "Water", "cover_hot_water": "Hot water",
}) })
TEXTS["it"].update({ TEXTS["it"].update({
@@ -414,7 +414,7 @@ TEXTS["it"].update({
"cover_outdoor": "esterna", "cover_outdoor": "esterna",
"night_one_hour": "Modalità notte per un'ora", "night_one_hour": "Modalità notte per un'ora",
"cover_house": "Casa", "cover_house": "Casa",
"cover_water": "Acqua", "cover_hot_water": "Acqua calda",
}) })
@@ -566,12 +566,15 @@ def cover_screen() -> Image.Image:
d.line([(card[0] + 34, card[1] + 100), (card[2] - 34, card[1] + 100)], d.line([(card[0] + 34, card[1] + 100), (card[2] - 34, card[1] + 100)],
fill=BTN_EDGE, width=2) fill=BTN_EDGE, width=2)
y = card[1] + 150 y = card[1] + 150
# due righe: etichetta a sinistra, "attuale / impostata" a destra # due righe: etichetta a sinistra, poi l'attuale piu' grande e l'obiettivo
for lab, val in ((T("cover_house"), dec(22.9) + " / " + dec(19.0) + " °C"), # piu' piccolo attaccato — come nella copertina vera
(T("cover_water"), dec(51.5) + " / " + dec(55.0) + " °C")): colonna = 34 + int((card[2] - card[0] - 68) * 0.42)
for lab, ora, obiettivo in ((T("cover_house"), dec(22.9), dec(19.0)),
(T("cover_hot_water"), dec(51.5), dec(55.0))):
d.text((card[0] + 34, y + 10), lab, font=font(22), fill=SECONDARY) d.text((card[0] + 34, y + 10), lab, font=font(22), fill=SECONDARY)
vw = d.textlength(val, font=font(30, bold=True)) d.text((card[0] + colonna, y), ora, font=font(30, bold=True), fill=PRIMARY)
d.text((card[2] - 34 - vw, y), val, font=font(30, bold=True), fill=PRIMARY) d.text((card[0] + colonna + d.textlength(ora, font=font(30, bold=True)), y + 4),
"/" + obiettivo + " °C", font=font(24), fill=SECONDARY)
y += 72 y += 72
d.text((card[0] + 34, card[3] - 62), d.text((card[0] + 34, card[3] - 62),
T("cover_outdoor") + " " + dec(18.0) + " °C", font=font(22), fill=SECONDARY) T("cover_outdoor") + " " + dec(18.0) + " °C", font=font(22), fill=SECONDARY)
+2 -2
View File
@@ -21,7 +21,7 @@ Q_DECL_EXPORT int main(int argc, char *argv[])
app->setOrganizationName(QStringLiteral("harbour")); app->setOrganizationName(QStringLiteral("harbour"));
app->setApplicationName(QStringLiteral("aira")); app->setApplicationName(QStringLiteral("aira"));
app->setApplicationVersion(QStringLiteral("0.6.4")); app->setApplicationVersion(QStringLiteral("0.6.5"));
Settings settings; Settings settings;
ApiClient api(&settings); ApiClient api(&settings);
@@ -36,7 +36,7 @@ Q_DECL_EXPORT int main(int argc, char *argv[])
// Prima riga del log: dice subito se il device sta girando la build nuova // Prima riga del log: dice subito se il device sta girando la build nuova
// o una stale (trappola nota del build engine). // o una stale (trappola nota del build engine).
qDebug() << "harbour-aira v0.6.4 build" << __DATE__ << __TIME__; qDebug() << "harbour-aira v0.6.5 build" << __DATE__ << __TIME__;
view->rootContext()->setContextProperty(QStringLiteral("appSettings"), &settings); view->rootContext()->setContextProperty(QStringLiteral("appSettings"), &settings);
view->rootContext()->setContextProperty(QStringLiteral("api"), &api); view->rootContext()->setContextProperty(QStringLiteral("api"), &api);
+6 -6
View File
@@ -337,22 +337,22 @@
<context> <context>
<name>CoverPage</name> <name>CoverPage</name>
<message> <message>
<location filename="../qml/cover/CoverPage.qml" line="74"/> <location filename="../qml/cover/CoverPage.qml" line="79"/>
<source>House</source> <source>House</source>
<translation>Casa</translation> <translation>Casa</translation>
</message> </message>
<message> <message>
<location filename="../qml/cover/CoverPage.qml" line="98"/> <location filename="../qml/cover/CoverPage.qml" line="118"/>
<source>Water</source> <source>Hot water</source>
<translation>Acqua</translation> <translation>Acqua calda</translation>
</message> </message>
<message> <message>
<location filename="../qml/cover/CoverPage.qml" line="123"/> <location filename="../qml/cover/CoverPage.qml" line="156"/>
<source>Not updated · last %1</source> <source>Not updated · last %1</source>
<translation>Non aggiornato · ultimo %1</translation> <translation>Non aggiornato · ultimo %1</translation>
</message> </message>
<message> <message>
<location filename="../qml/cover/CoverPage.qml" line="124"/> <location filename="../qml/cover/CoverPage.qml" line="157"/>
<source>outside %1 °C</source> <source>outside %1 °C</source>
<translation>esterna %1 °C</translation> <translation>esterna %1 °C</translation>
</message> </message>