0.7.2: il tasto del boost diventa Stop mentre e' in corso
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.
This commit is contained in:
@@ -27,6 +27,8 @@ e ripiega sull'inglese; la si può scegliere anche nelle impostazioni dell'app.
|
|||||||
in Home scorre da 30:00 a 00:00 e in copertina prende il posto dell'obiettivo
|
in Home scorre da 30:00 a 00:00 e in copertina prende il posto dell'obiettivo
|
||||||
dell'acqua. I secondi vengono dalla fine del boost letta dall'impianto: il
|
dell'acqua. I secondi vengono dalla fine del boost letta dall'impianto: il
|
||||||
conto è giusto anche se il boost l'ha avviato qualcun altro
|
conto è giusto anche se il boost l'ha avviato qualcun altro
|
||||||
|
- **Il tasto del boost diventa *Stop*** mentre il boost è in corso, in Home e in
|
||||||
|
copertina: un tocco lo ferma, invece di farne ripartire un altro
|
||||||
- **Assenza con le date**: toccando *Assenza* si apre una finestra dove si
|
- **Assenza con le date**: toccando *Assenza* si apre una finestra dove si
|
||||||
scelgono il primo e l'ultimo giorno (calendario, un tocco ciascuno). In quel
|
scelgono il primo e l'ultimo giorno (calendario, un tocco ciascuno). In quel
|
||||||
periodo la casa resta a 15 °C e riprende il programma normale il giorno scelto
|
periodo la casa resta a 15 °C e riprende il programma normale il giorno scelto
|
||||||
|
|||||||
@@ -21,6 +21,9 @@ status, domestic hot water, and the house target temperature per zone.
|
|||||||
it ticking down from 30:00 to 00:00, and the cover page shows it in place of
|
it ticking down from 30:00 to 00:00, and the cover page shows it in place of
|
||||||
the hot water target. The seconds come from the plant's own boost end time, so
|
the hot water target. The seconds come from the plant's own boost end time, so
|
||||||
the count is right even if the boost was started from somewhere else
|
the count is right even if the boost was started from somewhere else
|
||||||
|
- **The boost button turns into *Stop*** while a boost is running, on the home
|
||||||
|
screen and on the cover: tapping it stops the boost instead of starting
|
||||||
|
another one
|
||||||
- **Away mode with dates**: tapping *Away* opens a dialog where you pick the
|
- **Away mode with dates**: tapping *Away* opens a dialog where you pick the
|
||||||
first and the last day (calendar, one tap each). The house is kept at 15 °C
|
first and the last day (calendar, one tap each). The house is kept at 15 °C
|
||||||
for that period and resumes its normal programme on the day you chose as the
|
for that period and resumes its normal programme on the day you chose as the
|
||||||
|
|||||||
+30
-1
@@ -435,7 +435,36 @@ la scatola, cioe' **sopra** l'etichetta che sporge. Da li' l'impressione che si
|
|||||||
riga della Home**, cosi' se la disposizione non torna si legge dal registro
|
riga della Home**, cosi' se la disposizione non torna si legge dal registro
|
||||||
quale riga finisce dove invece di dedurlo da uno screenshot.
|
quale riga finisce dove invece di dedurlo da uno screenshot.
|
||||||
|
|
||||||
## 13. Conseguenze dell'uso reale (0.7.0)
|
## 13. Il tasto del boost diventa Stop, e la riga che spostava i tasti — v0.7.2
|
||||||
|
|
||||||
|
Carlo: *"Il boost funziona ma la scritta sposta in basso i pulsanti facendoli
|
||||||
|
coprire. Il pulsante di avvio boost dovrebbe diventare stop boost se il boost e'
|
||||||
|
attivo"*.
|
||||||
|
|
||||||
|
Due cose distinte, e la prima va detta perche' evita confusione: la riga che
|
||||||
|
**copriva** i tasti era il difetto di 0.7.1 (il tasto piu' basso del contenuto),
|
||||||
|
che al momento della segnalazione non era ancora installata sul telefono -- il
|
||||||
|
bridge si aggiorna da solo sul server, l'app no. La riga che invece li
|
||||||
|
**spostava** era nuova e vera: il conto alla rovescia prendeva il posto del
|
||||||
|
suggerimento ma con un carattere piu' grande (`fontSizeSmall` contro
|
||||||
|
`fontSizeExtraSmall`), quindi la Home cresceva di una decina di pixel e tutto
|
||||||
|
scendeva. Ora e' una riga sola, di altezza fissa, con il carattere del
|
||||||
|
suggerimento: sostituirsi non sposta piu' niente.
|
||||||
|
|
||||||
|
**Come è stato fatto (0.7.2).**
|
||||||
|
- tasto del boost condizionale (`Stop` con il glifo di stop quando `boostActive`)
|
||||||
|
**anche in copertina**: una copertina che riavvia il boost quando vuoi fermarlo
|
||||||
|
e' peggio di un tasto che non fa niente;
|
||||||
|
- `quick-boost-stop.png` disegnato in casa con `scripts/make_glyphs.py`, come gli
|
||||||
|
altri tre glifi;
|
||||||
|
- "Stop boost" per intero non ci sta accanto all'icona (92 px contro 73): resta
|
||||||
|
`Stop`, il senso lo porta il glifo. E' `tests/label_fit_check.py` a dirlo, che
|
||||||
|
adesso legge anche le etichette condizionali;
|
||||||
|
- `tests/cover_action_check.py` legge tutti i comandi dell'azione e tutte le
|
||||||
|
icone citate: prima si aspettava un solo letterale e su un invio condizionale
|
||||||
|
segnalava un problema inesistente.
|
||||||
|
|
||||||
|
## 14. Conseguenze dell'uso reale (0.7.0)
|
||||||
|
|
||||||
Deciso con l'uso, non in anticipo:
|
Deciso con l'uso, non in anticipo:
|
||||||
|
|
||||||
|
|||||||
@@ -176,8 +176,12 @@ CoverBackground {
|
|||||||
// Il componente e' in Sailfish.Silica 1.0 (verificato nella guida dell'SDK).
|
// Il componente e' in Sailfish.Silica 1.0 (verificato nella guida dell'SDK).
|
||||||
CoverActionList {
|
CoverActionList {
|
||||||
CoverAction {
|
CoverAction {
|
||||||
iconSource: "../icons/quick-boost.png"
|
// Anche dalla copertina il tasto ferma quando il boost e' in corso:
|
||||||
onTriggered: api.sendCommand("hot_water_boost_on")
|
// altrimenti un tocco per fermarlo ne farebbe ripartire un altro.
|
||||||
|
iconSource: api.boostActive ? "../icons/quick-boost-stop.png"
|
||||||
|
: "../icons/quick-boost.png"
|
||||||
|
onTriggered: api.sendCommand(api.boostActive ? "hot_water_boost_off"
|
||||||
|
: "hot_water_boost_on")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 1.4 KiB |
+47
-24
@@ -223,27 +223,38 @@ Page {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Conto alla rovescia del boost, da 30:00 a 00:00 (richiesta
|
// Una sola riga, sempre della stessa altezza: mentre il boost corre
|
||||||
// dell'utente): si vede solo mentre il boost e' in corso.
|
// il conto alla rovescia prende il posto del suggerimento senza
|
||||||
Label {
|
// spostare niente sotto. Il carattere e' quello del suggerimento
|
||||||
visible: api.configured && api.boostActive
|
// (fontSizeExtraSmall): se fosse piu' grande, la riga piu' alta
|
||||||
x: Theme.horizontalPageMargin
|
// spingerebbe giu' i pulsanti e la riga di contorno finirebbe loro
|
||||||
width: parent.width - 2 * Theme.horizontalPageMargin
|
// addosso (segnalato da Carlo).
|
||||||
text: qsTr("Boost · %1").arg(api.boostCountdown)
|
Item {
|
||||||
color: Theme.highlightColor
|
visible: api.configured
|
||||||
font.pixelSize: Theme.fontSizeSmall
|
width: parent.width
|
||||||
font.bold: true
|
height: Math.max(contoRovescia.implicitHeight,
|
||||||
}
|
suggerimento.implicitHeight)
|
||||||
|
|
||||||
Label {
|
Label {
|
||||||
// Con il boost in corso questa riga sparisce: al suo posto c'e'
|
id: contoRovescia
|
||||||
// il conto alla rovescia, cosi' la Home resta di una schermata.
|
visible: api.boostActive
|
||||||
visible: api.configured && !api.boostActive
|
x: Theme.horizontalPageMargin
|
||||||
x: Theme.horizontalPageMargin
|
width: parent.width - 2 * Theme.horizontalPageMargin
|
||||||
width: parent.width - 2 * Theme.horizontalPageMargin
|
text: qsTr("Boost · %1").arg(api.boostCountdown)
|
||||||
text: qsTr("Tap a value to adjust it")
|
color: Theme.highlightColor
|
||||||
color: Theme.secondaryColor
|
font.pixelSize: Theme.fontSizeExtraSmall
|
||||||
font.pixelSize: Theme.fontSizeExtraSmall
|
font.bold: true
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
id: suggerimento
|
||||||
|
visible: !api.boostActive
|
||||||
|
x: Theme.horizontalPageMargin
|
||||||
|
width: parent.width - 2 * Theme.horizontalPageMargin
|
||||||
|
text: qsTr("Tap a value to adjust it")
|
||||||
|
color: Theme.secondaryColor
|
||||||
|
font.pixelSize: Theme.fontSizeExtraSmall
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---- azioni rapide --------------------------------------------- //
|
// ---- azioni rapide --------------------------------------------- //
|
||||||
@@ -268,14 +279,26 @@ Page {
|
|||||||
// sopra (segnalato da Carlo: "la riga sotto copre i
|
// sopra (segnalato da Carlo: "la riga sotto copre i
|
||||||
// pulsanti"). Vedi tests/label_fit_check.py.
|
// pulsanti"). Vedi tests/label_fit_check.py.
|
||||||
height: Theme.itemSizeMedium
|
height: Theme.itemSizeMedium
|
||||||
text: qsTr("Boost")
|
// Mentre il boost e' in corso il tasto ferma invece di
|
||||||
|
// avviare: dice cosa succede premendolo, come il tasto
|
||||||
|
// dell'assenza. "Stop boost" per intero non ci sta accanto
|
||||||
|
// all'icona (92 px contro 73 disponibili): resta "Stop",
|
||||||
|
// che il glifo di stop rende inequivocabile.
|
||||||
|
text: api.boostActive ? qsTr("Stop") : qsTr("Boost")
|
||||||
// La casella dell'icona la decide il tema: senza, l'Image
|
// La casella dell'icona la decide il tema: senza, l'Image
|
||||||
// prende la misura del file e si mangia il testo.
|
// prende la misura del file e si mangia il testo.
|
||||||
icon.source: "../icons/quick-boost.png"
|
icon.source: api.boostActive ? "../icons/quick-boost-stop.png"
|
||||||
|
: "../icons/quick-boost.png"
|
||||||
icon.width: Theme.iconSizeExtraSmall
|
icon.width: Theme.iconSizeExtraSmall
|
||||||
icon.height: Theme.iconSizeExtraSmall
|
icon.height: Theme.iconSizeExtraSmall
|
||||||
onClicked: remorse.execute(boostBtn, qsTr("Starting DHW boost"),
|
onClicked: remorse.execute(
|
||||||
function() { api.sendCommand("hot_water_boost_on") })
|
boostBtn,
|
||||||
|
api.boostActive ? qsTr("Stopping DHW boost")
|
||||||
|
: qsTr("Starting DHW boost"),
|
||||||
|
function() {
|
||||||
|
api.sendCommand(api.boostActive ? "hot_water_boost_off"
|
||||||
|
: "hot_water_boost_on")
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
Button {
|
Button {
|
||||||
|
|||||||
+10
-1
@@ -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.7.1
|
Version: 0.7.2
|
||||||
Release: 1
|
Release: 1
|
||||||
Group: Qt/Qt
|
Group: Qt/Qt
|
||||||
License: MIT
|
License: MIT
|
||||||
@@ -37,6 +37,15 @@ 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.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
|
* 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
|
- 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,
|
la piglia dal tema (Theme.itemSizeExtraSmall, ~56 px) e non dal contenuto,
|
||||||
|
|||||||
@@ -72,12 +72,22 @@ def comandi(d, cx, cy, w, h):
|
|||||||
d.ellipse([kx - r, y - r, kx + r, y + r], fill=BIANCO)
|
d.ellipse([kx - r, y - r, kx + r, y + r], fill=BIANCO)
|
||||||
|
|
||||||
|
|
||||||
|
def stop(d, cx, cy, w, h):
|
||||||
|
"""Ferma il boost: quadrato pieno dentro un anello (il segno universale)."""
|
||||||
|
r = min(w, h) / 2
|
||||||
|
d.ellipse([cx - r, cy - r, cx + r, cy + r], outline=BIANCO,
|
||||||
|
width=max(2, int(h * 0.12)))
|
||||||
|
q = r * 0.46
|
||||||
|
d.rectangle([cx - q, cy - q, cx + q, cy + q], fill=BIANCO)
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
DEST.mkdir(parents=True, exist_ok=True)
|
DEST.mkdir(parents=True, exist_ok=True)
|
||||||
disegni = (
|
disegni = (
|
||||||
("quick-boost.png", fiamma, 0.62),
|
("quick-boost.png", fiamma, 0.62),
|
||||||
("quick-away.png", casa, 0.80),
|
("quick-away.png", casa, 0.80),
|
||||||
("quick-commands.png", comandi, 0.90),
|
("quick-commands.png", comandi, 0.90),
|
||||||
|
("quick-boost-stop.png", stop, 0.90),
|
||||||
)
|
)
|
||||||
# il glifo riempie il suo riquadro (un filo di margine): la misura sul
|
# il glifo riempie il suo riquadro (un filo di margine): la misura sul
|
||||||
# telefono la decide Theme.iconSizeExtraSmall nel pulsante, non il file
|
# telefono la decide Theme.iconSizeExtraSmall nel pulsante, non il file
|
||||||
|
|||||||
+2
-2
@@ -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.7.1"));
|
app->setApplicationVersion(QStringLiteral("0.7.2"));
|
||||||
|
|
||||||
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.7.1 build" << __DATE__ << __TIME__;
|
qDebug() << "harbour-aira v0.7.2 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);
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ def main():
|
|||||||
problemi.append("usa `iconSource`, non `icon.source`: `icon.source` e' del "
|
problemi.append("usa `iconSource`, non `icon.source`: `icon.source` e' del "
|
||||||
"pulsante Button e qui non darebbe errore, solo nessuna icona")
|
"pulsante Button e qui non darebbe errore, solo nessuna icona")
|
||||||
|
|
||||||
for m in re.finditer(r'iconSource\s*:\s*"([^"]+)"', testo):
|
for m in re.finditer(r'"(\.\./icons/[^"]+\.png)"', testo):
|
||||||
icona = (COPERTINA.parent / m.group(1)).resolve()
|
icona = (COPERTINA.parent / m.group(1)).resolve()
|
||||||
if not icona.exists():
|
if not icona.exists():
|
||||||
problemi.append("l'icona %s non esiste (risolta da %s)"
|
problemi.append("l'icona %s non esiste (risolta da %s)"
|
||||||
@@ -70,9 +70,17 @@ def main():
|
|||||||
else:
|
else:
|
||||||
print("icona: %s -> %s" % (m.group(1), icona.relative_to(RADICE)))
|
print("icona: %s -> %s" % (m.group(1), icona.relative_to(RADICE)))
|
||||||
|
|
||||||
comandi = re.findall(r'sendCommand\("([^"]+)"', testo)
|
# L'invio puo' essere condizionale (il tasto del boost avvia o ferma) e
|
||||||
|
# scritto su piu' righe: si prende tutto il testo fra sendCommand( e la
|
||||||
|
# parentesi di chiusura, poi tutti i letterali che sembrano un id.
|
||||||
|
comandi = []
|
||||||
|
for m in re.finditer(r"sendCommand\(([^)]*)\)", testo, re.S):
|
||||||
|
comandi += [s for s in re.findall(r'"([^"]+)"', m.group(1))
|
||||||
|
if re.match(r"^[a-z][a-z_]*$", s)]
|
||||||
if not comandi:
|
if not comandi:
|
||||||
problemi.append("l'azione non invia nessun comando: a che serve?")
|
problemi.append("l'azione non invia nessun comando: a che serve?")
|
||||||
|
else:
|
||||||
|
print("comandi inviati: %s" % ", ".join(comandi))
|
||||||
for c in comandi:
|
for c in comandi:
|
||||||
if not BRIDGE.exists():
|
if not BRIDGE.exists():
|
||||||
print("salto il controllo del comando %r: manca %s" % (c, BRIDGE))
|
print("salto il controllo del comando %r: manca %s" % (c, BRIDGE))
|
||||||
|
|||||||
@@ -563,47 +563,57 @@
|
|||||||
<translation>Acqua calda</translation>
|
<translation>Acqua calda</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/pages/MainPage.qml" line="232"/>
|
<location filename="../qml/pages/MainPage.qml" line="243"/>
|
||||||
<source>Boost · %1</source>
|
<source>Boost · %1</source>
|
||||||
<translation>Boost · %1</translation>
|
<translation>Boost · %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/pages/MainPage.qml" line="244"/>
|
<location filename="../qml/pages/MainPage.qml" line="254"/>
|
||||||
<source>Tap a value to adjust it</source>
|
<source>Tap a value to adjust it</source>
|
||||||
<translation>Tocca un valore per regolarlo</translation>
|
<translation>Tocca un valore per regolarlo</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/pages/MainPage.qml" line="252"/>
|
<location filename="../qml/pages/MainPage.qml" line="263"/>
|
||||||
<source>Quick actions</source>
|
<source>Quick actions</source>
|
||||||
<translation>Azioni rapide</translation>
|
<translation>Azioni rapide</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/pages/MainPage.qml" line="271"/>
|
<location filename="../qml/pages/MainPage.qml" line="287"/>
|
||||||
<source>Boost</source>
|
<source>Boost</source>
|
||||||
<translation>Boost</translation>
|
<translation>Boost</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/pages/MainPage.qml" line="288"/>
|
<location filename="../qml/pages/MainPage.qml" line="287"/>
|
||||||
|
<source>Stop</source>
|
||||||
|
<translation>Stop</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/MainPage.qml" line="296"/>
|
||||||
|
<source>Stopping DHW boost</source>
|
||||||
|
<translation>Fermo il boost</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/MainPage.qml" line="311"/>
|
||||||
<source>Home</source>
|
<source>Home</source>
|
||||||
<translation>Torna</translation>
|
<translation>Torna</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/pages/MainPage.qml" line="288"/>
|
<location filename="../qml/pages/MainPage.qml" line="311"/>
|
||||||
<source>Away</source>
|
<source>Away</source>
|
||||||
<translation>Assenza</translation>
|
<translation>Assenza</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/pages/MainPage.qml" line="294"/>
|
<location filename="../qml/pages/MainPage.qml" line="317"/>
|
||||||
<source>Away mode off</source>
|
<source>Away mode off</source>
|
||||||
<translation>Assenza disattivata</translation>
|
<translation>Assenza disattivata</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/pages/MainPage.qml" line="316"/>
|
<location filename="../qml/pages/MainPage.qml" line="339"/>
|
||||||
<source>More</source>
|
<source>More</source>
|
||||||
<translation>Altro</translation>
|
<translation>Altro</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/pages/MainPage.qml" line="339"/>
|
<location filename="../qml/pages/MainPage.qml" line="362"/>
|
||||||
<source>Outside %1 °C · Thermostat %2 °C · Zones %3</source>
|
<source>Outside %1 °C · Thermostat %2 °C · Zones %3</source>
|
||||||
<translation>Esterno %1 °C · Termostato %2 °C · Zone %3</translation>
|
<translation>Esterno %1 °C · Termostato %2 °C · Zone %3</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -618,7 +628,7 @@
|
|||||||
<translation>Bridge non configurato. Apri le impostazioni e inserisci l'indirizzo del server e il token.</translation>
|
<translation>Bridge non configurato. Apri le impostazioni e inserisci l'indirizzo del server e il token.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/pages/MainPage.qml" line="277"/>
|
<location filename="../qml/pages/MainPage.qml" line="297"/>
|
||||||
<source>Starting DHW boost</source>
|
<source>Starting DHW boost</source>
|
||||||
<translation>Avvio del boost ACS</translation>
|
<translation>Avvio del boost ACS</translation>
|
||||||
</message>
|
</message>
|
||||||
|
|||||||
Reference in New Issue
Block a user