0.6.3: nuova icona (casa con l'onda calda); conteggi del README inglese allineati a 85/85
@@ -1,5 +1,7 @@
|
||||
# harbour-aira — versione italiana
|
||||
|
||||
<img src="icons/172x172/harbour-aira.png" width="96" alt="icona">
|
||||
|
||||
*English version: [README.md](README.md)*
|
||||
|
||||
---
|
||||
@@ -157,8 +159,8 @@ python3 tests/ui_contract_check.py http://192.168.3.21:8790
|
||||
## Stato
|
||||
|
||||
- **85/85** verifiche del nucleo, compilazione senza warning (comprese le frasi
|
||||
di stato, breve ed estesa: quello che la Home dice dell'impianto è verificato
|
||||
senza telefono)
|
||||
di stato, breve ed estesa, e la severita' degli allarmi: quello che la Home
|
||||
dice dell'impianto è verificato senza telefono)
|
||||
- **48/48** verifiche offline del bridge (`bridge/test_bridge_commands.py`),
|
||||
comprese le conversioni Wh→kWh e degli importi delle statistiche
|
||||
- **191/191** stringhe tradotte nel catalogo italiano: il test carica il `.qm`
|
||||
@@ -225,6 +227,7 @@ docs/PIANO.md piano di progetto e scelte
|
||||
docs/PROTOCOL.md API del bridge
|
||||
docs/UX-STUDIO.md studio UX e cosa è cambiato nella 0.6.0
|
||||
docs/ux/ schemi dello studio UX
|
||||
docs/icona/ proposte di icona e confronto prima/dopo
|
||||
translations/ harbour-aira-it.ts (l'inglese è la lingua sorgente)
|
||||
docs/anteprima/ anteprime di layout in inglese (in italiano: it/)
|
||||
```
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
# harbour-aira
|
||||
|
||||
<img src="icons/172x172/harbour-aira.png" width="96" alt="icon">
|
||||
|
||||
Native Sailfish OS app to monitor and control an **Aira Home** heat pump: plant
|
||||
status, domestic hot water, and the house target temperature per zone.
|
||||
|
||||
@@ -142,9 +144,9 @@ python3 tests/ui_contract_check.py http://192.168.3.21:8790
|
||||
|
||||
Verified so far:
|
||||
|
||||
- **79/79** core checks (`tests/core_test.cpp`), compiled with no warnings —
|
||||
including the one-line and extended status sentences, so what the home says
|
||||
about the plant is verified without a phone
|
||||
- **85/85** core checks (`tests/core_test.cpp`), compiled with no warnings —
|
||||
including the one-line and extended status sentences and the alarm severity,
|
||||
so what the home says about the plant is verified without a phone
|
||||
- **48/48** bridge checks, offline (`bridge/test_bridge_commands.py`) —
|
||||
including that a zone command always carries every zone, that absurd values
|
||||
are refused (40 °C, zone 3, text), and the Wh→kWh / money conversions of the
|
||||
@@ -235,6 +237,7 @@ docs/PIANO.md project plan and decisions (Italian)
|
||||
docs/PROTOCOL.md bridge API
|
||||
docs/UX-STUDIO.md UX review and what changed in 0.6.0 (Italian)
|
||||
docs/ux/ UX study wireframes
|
||||
docs/icona/ icon proposals and the before/after comparison
|
||||
docs/anteprima/ layout previews (English; docs/anteprima/it/ Italian)
|
||||
```
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.4 KiB |
@@ -1,6 +1,6 @@
|
||||
Name: harbour-aira
|
||||
Summary: Control your Aira heat pump through a local bridge
|
||||
Version: 0.6.2
|
||||
Version: 0.6.3
|
||||
Release: 1
|
||||
Group: Qt/Qt
|
||||
License: MIT
|
||||
@@ -37,6 +37,10 @@ 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.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
|
||||
|
||||
@@ -1,20 +1,25 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Genera le icone di harbour-aira (86/108/128/172 px) in icons/<size>/.
|
||||
|
||||
Disegno originale (nessun logo di terzi): sfondo blu sfumato, goccia bianca e
|
||||
un punto caldo arancione — acqua calda + pompa di calore.
|
||||
Disegno scelto: **casa con l'onda calda dentro** — la proposta A di
|
||||
scripts/icon_proposals.py, dove restano le altre direzioni provate. E' un
|
||||
disegno originale: nessun logo di terzi, visto che il permesso per nome e logo
|
||||
Aira non e' ancora arrivato.
|
||||
|
||||
Uso: python3 scripts/make_icons.py
|
||||
"""
|
||||
from PIL import Image, ImageDraw
|
||||
|
||||
import math
|
||||
import pathlib
|
||||
|
||||
from PIL import Image, ImageDraw
|
||||
|
||||
SIZES = [86, 108, 128, 172]
|
||||
BASE = 172 # si disegna grande e si ridimensiona: bordi puliti a ogni taglia
|
||||
BASE = 344 # si disegna grande e si ridimensiona: bordi puliti a ogni taglia
|
||||
|
||||
TOP = (12, 62, 130) # blu profondo
|
||||
BOTTOM = (24, 148, 190) # azzurro
|
||||
WARM = (255, 138, 46) # arancione
|
||||
WHITE = (255, 255, 255, 240)
|
||||
|
||||
|
||||
def rounded_mask(size, radius):
|
||||
@@ -32,29 +37,29 @@ def gradient(size):
|
||||
return img.resize((size, size))
|
||||
|
||||
|
||||
def onda(d, x0, x1, y, ampiezza, spessore, fill, creste=2):
|
||||
"""L'onda calda: due creste dentro il corpo della casa."""
|
||||
punti = []
|
||||
passi = 120
|
||||
for i in range(passi + 1):
|
||||
t = i / passi
|
||||
x = x0 + (x1 - x0) * t
|
||||
punti.append((x, y + ampiezza * math.sin(2 * math.pi * creste * t)))
|
||||
d.line(punti, fill=fill, width=int(spessore), joint="curve")
|
||||
|
||||
|
||||
def draw_icon(size):
|
||||
img = gradient(size).convert("RGBA")
|
||||
d = ImageDraw.Draw(img)
|
||||
|
||||
# goccia: cerchio + triangolo verso l'alto
|
||||
cx = size * 0.5
|
||||
cy = size * 0.60
|
||||
r = size * 0.19
|
||||
d.ellipse([cx - r, cy - r, cx + r, cy + r], fill=(255, 255, 255, 235))
|
||||
d.polygon([(cx, cy - 2.35 * r), (cx - r * 0.98, cy + r * 0.10), (cx + r * 0.98, cy + r * 0.10)],
|
||||
fill=(255, 255, 255, 235))
|
||||
# ricentra la goccia: il triangolo allunga verso l'alto
|
||||
shift = -size * 0.05
|
||||
img = img.transform(img.size, Image.AFFINE, (1, 0, 0, 0, 1, shift))
|
||||
|
||||
d = ImageDraw.Draw(img)
|
||||
# punto caldo in basso a destra, dentro la goccia
|
||||
wr = size * 0.085
|
||||
wx, wy = cx + r * 0.10, cy + r * 0.30
|
||||
for i in range(int(wr), 0, -1):
|
||||
a = int(255 * (1 - i / wr) + 90)
|
||||
d.ellipse([wx - i, wy - i, wx + i, wy + i], fill=WARM + (a,))
|
||||
# tetto e corpo della casa
|
||||
d.polygon([(size * 0.16, size * 0.50), (size * 0.50, size * 0.24),
|
||||
(size * 0.84, size * 0.50)], fill=WHITE)
|
||||
d.rectangle([size * 0.24, size * 0.50, size * 0.76, size * 0.78], fill=WHITE)
|
||||
|
||||
# onda calda dentro il corpo: sta sotto il tetto, altrimenti a 86 px si fonde
|
||||
onda(d, size * 0.26, size * 0.74, size * 0.665, size * 0.040, size * 0.078,
|
||||
WARM + (255,), creste=2)
|
||||
return img
|
||||
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ Q_DECL_EXPORT int main(int argc, char *argv[])
|
||||
|
||||
app->setOrganizationName(QStringLiteral("harbour"));
|
||||
app->setApplicationName(QStringLiteral("aira"));
|
||||
app->setApplicationVersion(QStringLiteral("0.6.1"));
|
||||
app->setApplicationVersion(QStringLiteral("0.6.3"));
|
||||
|
||||
Settings 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
|
||||
// o una stale (trappola nota del build engine).
|
||||
qDebug() << "harbour-aira v0.6.1 build" << __DATE__ << __TIME__;
|
||||
qDebug() << "harbour-aira v0.6.3 build" << __DATE__ << __TIME__;
|
||||
|
||||
view->rootContext()->setContextProperty(QStringLiteral("appSettings"), &settings);
|
||||
view->rootContext()->setContextProperty(QStringLiteral("api"), &api);
|
||||
|
||||