documentazione 0.5.0: PROTOCOL (/stats, campi dispositivo), PIANO, conteggi dei test

This commit is contained in:
2026-10-10 09:15:48 +02:00
parent 4f279a18b0
commit a48ec86822
4 changed files with 291 additions and 215 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
# Dipendenze del bridge. La libreria parla gRPC con il cloud Aira e porta con # Dipendenze del bridge. La libreria parla gRPC con il cloud Aira e porta con
# se' il resto (grpcio, protobuf, pycognito, boto3, bleak...). # se' il resto (grpcio, protobuf, pycognito, boto3, bleak...).
# Versione fissata: e' quella su cui il bridge e' stato provato (27/27). # Versione fissata: e' quella su cui il bridge e' stato provato (48/48).
pyairahome==2.3.0 pyairahome==2.3.0
+15 -9
View File
@@ -211,17 +211,23 @@ andrebbe disegnata a mano.
2. **Dati**: "Il tuo riscaldamento (questo mese)" con calore prodotto, elettricità 2. **Dati**: "Il tuo riscaldamento (questo mese)" con calore prodotto, elettricità
usata, efficienza (COP riscaldamento / acqua calda); "I tuoi risparmi" con il usata, efficienza (COP riscaldamento / acqua calda); "I tuoi risparmi" con il
risparmio totale del periodo, la CO₂ evitata e il risparmio Smart Tariff Control. risparmio totale del periodo, la CO₂ evitata e il risparmio Smart Tariff Control.
3. **Impianto**: stato (connessione, modalità, vacanza, messaggi luminosi, ultima 3. **Impianto**: stato (connessione, modalità, assenza, notte, riscaldamento forzato,
lettura), accessori (termostato: zona, temperatura, umidità, segnale, batteria), resistenza interna, temperature, zone, ultima lettura), accessori (termostato: zona,
versioni (piattaforma, connettività, controllo climatico, unità esterna, EEPROM, temperatura, umidità, segnale, batteria, articolo), versioni (ID dispositivo,
dispositivo ID) ed errori. piattaforma, connettività, controllo climatico, unità esterna, EEPROM) ed errori.
Le luci di firma (`signature_lights`, `led_pattern`) restano per ora solo in
`/summary`: la pagina non le mostra.
### Lavoro ### Lavoro
- **Bridge 0.4.0**: nuova rotta `/stats` (COP, risparmi, ottimizzazione, insight) e - **Bridge 0.4.0**: nuova rotta `/stats` (COP, risparmi, ottimizzazione, insight) e
blocco `device` in `/summary` (id breve, versioni, termostato, connessione); campi del dispositivo in `/summary` (`device_*`, `version_*`, `thermostat_*`,
cache breve lato bridge, perché sono chiamate al cloud più lente di `/state`. `connected_via`, `timezone`); cache di 10 minuti lato bridge, perché sono quattro
- **App 0.5.0**: `MainPage` riordinata, nuove `DataPage.qml` e `InfoPage.qml`, chiamate al cloud, più lente di `/state`.
nuove stringhe nei due cataloghi, anteprime rigenerate, test del nucleo estesi al - **App 0.5.0**: `MainPage` riordinata, nuove `DataPage.qml` e `PlantPage.qml`
parsing dei nuovi campi, versione e README aggiornati. (quest'ultima si è chiamata `InfoPage` nella prima stesura del piano), nuovo
componente `ValueRow.qml`, 86 stringhe nuove tradotte (170 in totale), anteprime
rigenerate (dati, impianto) in italiano e inglese, test del nucleo estesi al
parsing delle statistiche e alla formattazione di importi e mesi (61/61), versione,
README e `docs/PROTOCOL.md` aggiornati.
- Nessun comando nuovo all'impianto: tutto questo è **sola lettura**. - Nessun comando nuovo all'impianto: tutto questo è **sola lettura**.
+71 -2
View File
@@ -16,7 +16,7 @@ Nessuna autenticazione: serve a distinguere "server irraggiungibile" da
"token sbagliato". "token sbagliato".
```json ```json
{"ok": true, "version": "0.2.0"} {"ok": true, "version": "0.4.0"}
``` ```
## GET /summary ## GET /summary
@@ -54,11 +54,80 @@ Valori pronti per la dashboard.
"zone2_mode": "PUMP_MODE_STATE_IDLE", "zone2_mode": "PUMP_MODE_STATE_IDLE",
"zone2_cooling_setpoint": 0.0, "zone2_cooling_setpoint": 0.0,
"errors_count": 0, "errors_count": 0,
"pump_updated": "2026-10-09 18:52:17.199340" "pump_updated": "2026-10-09 18:52:17.199340",
"device_id": "1f4b26",
"device_uuid": "1f4b26c4-1800-4b21-8ea2-236925a92aeb",
"version_platform": "6.10.0",
"version_connectivity": "3.30.1",
"version_climate_control": "3.9.12",
"version_outdoor_unit": "1.30.0",
"version_outdoor_eeprom": "0.114.0",
"connected_via": "Cloud",
"timezone": "Europe/Rome",
"thermostats_count": 1,
"thermostat_zone": 1,
"thermostat_article": "201884",
"thermostat_temperature": 22.8,
"thermostat_humidity": 73.3,
"thermostat_rssi": -79,
"thermostat_battery_low": false
} }
} }
``` ```
Il blocco del dispositivo serve alle pagine "Impianto" e "Accessori" dell'app:
`device_id` sono le prime 6 cifre dell'UUID (come le mostra l'app ufficiale),
`connected_via` è la via di connessione, le `version_*` sono le versioni del
software e i campi `thermostat_*` descrivono il termostato a parete (assenti se
l'impianto non ne ha: in quel caso `thermostats_count` è 0 e gli altri sono
`null`). Il termostato manda i decimali come interi (228 = 22,8 °C): la
conversione la fa il bridge, non l'app.
## GET /stats
I numeri che Aira calcola nel cloud: sono gli stessi della scheda "Dati"
dell'app ufficiale (verificati sullo stesso periodo). Il bridge li tiene in
cache per **10 minuti** (`ttl`), perché sono quattro chiamate e cambiano
lentamente.
```json
{
"ok": true,
"stats": {
"period_days": 30,
"currency": "EUR",
"month": {
"label": "2026-10",
"heat_kwh": 70.8,
"energy_kwh": 29.3,
"cop_heating": null,
"cop_dhw": 4.42
},
"cop_monthly": [
{"month": "2026-09", "heating_cop": null, "dhw_cop": 4.42, "avg_outdoor": 21.8}
],
"insights": [
{"date": "2026-10-01", "energy_kwh": 29.3, "heat_kwh": 70.8}
],
"savings": {"amount": 21.78, "co2_kg": 38.1, "show": true, "points": 31},
"smart_tariff": {"amount": 2.71, "hours": 180},
"monthly_savings": [{"month": "2026-09", "amount": 3.52}]
}
}
```
- `month`: l'ultimo periodo con dati — calore prodotto (`heat_kwh`), elettricità
usata (`energy_kwh`) ed efficienza (COP) di acqua calda e riscaldamento.
**`null` significa "nessun dato"**: su un impianto recente il riscaldamento può
non averne ancora (mentre l'acqua calda sì). `label` è il mese `AAAA-MM`.
- `cop_monthly` e `monthly_savings`: le serie mese per mese, per il dettaglio.
- `savings`: risparmio in bolletta sugli ultimi `period_days` giorni (30), CO₂
evitata e numero di punti usati dal calcolo; `show` è il permesso di Aira a
mostrare il dato.
- `smart_tariff`: il risparmio del mese mobile dovuto allo Smart Tariff Control.
- Questa rotta è di **sola lettura**: non invia nessun comando all'impianto.
## GET /state ## GET /state
Stato completo e grezzo dal cloud (42 campi: curve climatiche per zona, Stato completo e grezzo dal cloud (42 campi: curve climatiche per zona,
+17 -16
View File
@@ -1,4 +1,5 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="it_IT"> <TS version="2.1" language="it_IT">
<context> <context>
<name>AiraJson</name> <name>AiraJson</name>
@@ -91,7 +92,7 @@
<message> <message>
<location filename="../src/apiclient.cpp" line="125"/> <location filename="../src/apiclient.cpp" line="125"/>
<source>Enter the bridge address</source> <source>Enter the bridge address</source>
<translation>Inserisci l'indirizzo del bridge</translation> <translation>Inserisci l&apos;indirizzo del bridge</translation>
</message> </message>
<message> <message>
<location filename="../src/apiclient.cpp" line="141"/> <location filename="../src/apiclient.cpp" line="141"/>
@@ -201,7 +202,7 @@
<message> <message>
<location filename="../qml/pages/CommandsPage.qml" line="92"/> <location filename="../qml/pages/CommandsPage.qml" line="92"/>
<source>Night mode for one hour</source> <source>Night mode for one hour</source>
<translation>Night mode per un'ora</translation> <translation>Night mode per un&apos;ora</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/CommandsPage.qml" line="97"/> <location filename="../qml/pages/CommandsPage.qml" line="97"/>
@@ -266,7 +267,7 @@
<message> <message>
<location filename="../qml/pages/CommandsPage.qml" line="132"/> <location filename="../qml/pages/CommandsPage.qml" line="132"/>
<source>Domestic hot water will stop being heated</source> <source>Domestic hot water will stop being heated</source>
<translation>L'acqua calda smetterà di essere riscaldata</translation> <translation>L&apos;acqua calda smetterà di essere riscaldata</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/CommandsPage.qml" line="137"/> <location filename="../qml/pages/CommandsPage.qml" line="137"/>
@@ -281,7 +282,7 @@
<message> <message>
<location filename="../qml/pages/CommandsPage.qml" line="154"/> <location filename="../qml/pages/CommandsPage.qml" line="154"/>
<source>Commands go through the bridge and may take a few seconds. The status refreshes by itself afterwards.</source> <source>Commands go through the bridge and may take a few seconds. The status refreshes by itself afterwards.</source>
<translation>I comandi passano dal bridge e possono richiedere qualche secondo. Dopo l'invio lo stato si aggiorna da solo.</translation> <translation>I comandi passano dal bridge e possono richiedere qualche secondo. Dopo l&apos;invio lo stato si aggiorna da solo.</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -332,7 +333,7 @@
<message> <message>
<location filename="../qml/pages/DataPage.qml" line="106"/> <location filename="../qml/pages/DataPage.qml" line="106"/>
<source>Numbers calculated by Aira in the cloud: the app only reads them from your own bridge.</source> <source>Numbers calculated by Aira in the cloud: the app only reads them from your own bridge.</source>
<translation>Numeri calcolati da Aira nel cloud: l'app li legge soltanto dal tuo bridge.</translation> <translation>Numeri calcolati da Aira nel cloud: l&apos;app li legge soltanto dal tuo bridge.</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/DataPage.qml" line="126"/> <location filename="../qml/pages/DataPage.qml" line="126"/>
@@ -382,7 +383,7 @@
<message> <message>
<location filename="../qml/pages/DataPage.qml" line="170"/> <location filename="../qml/pages/DataPage.qml" line="170"/>
<source>Efficiency (COP) is how much heat the pump delivers for each unit of electricity: higher is better.</source> <source>Efficiency (COP) is how much heat the pump delivers for each unit of electricity: higher is better.</source>
<translation>L'efficienza (COP) è quanto calore la pompa produce per ogni unità di elettricità: più alta è, meglio è.</translation> <translation>L&apos;efficienza (COP) è quanto calore la pompa produce per ogni unità di elettricità: più alta è, meglio è.</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/DataPage.qml" line="179"/> <location filename="../qml/pages/DataPage.qml" line="179"/>
@@ -407,7 +408,7 @@
<message> <message>
<location filename="../qml/pages/DataPage.qml" line="193"/> <location filename="../qml/pages/DataPage.qml" line="193"/>
<source>Not released into the air</source> <source>Not released into the air</source>
<translation>Non immessa nell'aria</translation> <translation>Non immessa nell&apos;aria</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/DataPage.qml" line="199"/> <location filename="../qml/pages/DataPage.qml" line="199"/>
@@ -417,7 +418,7 @@
<message> <message>
<location filename="../qml/pages/DataPage.qml" line="200"/> <location filename="../qml/pages/DataPage.qml" line="200"/>
<source>Saving from heating when energy is cheaper</source> <source>Saving from heating when energy is cheaper</source>
<translation>Risparmio scaldando quando l'energia costa meno</translation> <translation>Risparmio scaldando quando l&apos;energia costa meno</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/DataPage.qml" line="208"/> <location filename="../qml/pages/DataPage.qml" line="208"/>
@@ -460,12 +461,12 @@
<message> <message>
<location filename="../qml/pages/MainPage.qml" line="87"/> <location filename="../qml/pages/MainPage.qml" line="87"/>
<source>Attention: one error on the plant</source> <source>Attention: one error on the plant</source>
<translation>Attenzione: un errore sull'impianto</translation> <translation>Attenzione: un errore sull&apos;impianto</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/MainPage.qml" line="88"/> <location filename="../qml/pages/MainPage.qml" line="88"/>
<source>Attention: %1 errors on the plant</source> <source>Attention: %1 errors on the plant</source>
<translation>Attenzione: %1 errori sull'impianto</translation> <translation>Attenzione: %1 errori sull&apos;impianto</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/MainPage.qml" line="90"/> <location filename="../qml/pages/MainPage.qml" line="90"/>
@@ -485,7 +486,7 @@
<message> <message>
<location filename="../qml/pages/MainPage.qml" line="96"/> <location filename="../qml/pages/MainPage.qml" line="96"/>
<source>The heat pump is heating the hot water.</source> <source>The heat pump is heating the hot water.</source>
<translation>La pompa di calore sta scaldando l'acqua calda.</translation> <translation>La pompa di calore sta scaldando l&apos;acqua calda.</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/MainPage.qml" line="98"/> <location filename="../qml/pages/MainPage.qml" line="98"/>
@@ -510,7 +511,7 @@
<message> <message>
<location filename="../qml/pages/MainPage.qml" line="190"/> <location filename="../qml/pages/MainPage.qml" line="190"/>
<source>Bridge not configured. Open the settings and enter the server address and the token.</source> <source>Bridge not configured. Open the settings and enter the server address and the token.</source>
<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&apos;indirizzo del server e il token.</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/MainPage.qml" line="213"/> <location filename="../qml/pages/MainPage.qml" line="213"/>
@@ -689,7 +690,7 @@
<message> <message>
<location filename="../qml/pages/MainPage.qml" line="487"/> <location filename="../qml/pages/MainPage.qml" line="487"/>
<source>Commands are sent to the bridge and from there to the plant: they may take a few seconds.</source> <source>Commands are sent to the bridge and from there to the plant: they may take a few seconds.</source>
<translation>I comandi vengono inviati al bridge e da lì all'impianto: possono richiedere qualche secondo.</translation> <translation>I comandi vengono inviati al bridge e da lì all&apos;impianto: possono richiedere qualche secondo.</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -877,7 +878,7 @@
<message> <message>
<location filename="../qml/pages/PlantPage.qml" line="168"/> <location filename="../qml/pages/PlantPage.qml" line="168"/>
<source>No errors reported by the plant.</source> <source>No errors reported by the plant.</source>
<translation>Nessun errore segnalato dall'impianto.</translation> <translation>Nessun errore segnalato dall&apos;impianto.</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/PlantPage.qml" line="175"/> <location filename="../qml/pages/PlantPage.qml" line="175"/>
@@ -912,7 +913,7 @@
<message> <message>
<location filename="../qml/pages/SettingsPage.qml" line="85"/> <location filename="../qml/pages/SettingsPage.qml" line="85"/>
<source>Changing the language reloads the app.</source> <source>Changing the language reloads the app.</source>
<translation>Cambiando la lingua l'app si ricarica.</translation> <translation>Cambiando la lingua l&apos;app si ricarica.</translation>
</message> </message>
<message> <message>
<location filename="../qml/pages/SettingsPage.qml" line="92"/> <location filename="../qml/pages/SettingsPage.qml" line="92"/>