Notes de version¶
Sowel est versionné et déployé via CI/CD depuis v1.0.0 (avril 2026, spec 055). Chaque version est publiée sous forme de :
- Release GitHub avec un changelog généré — github.com/mchacher/sowel/releases
- Image Docker multi-arch taggée
ghcr.io/mchacher/sowel:<version>et:latest
Cette page résume toutes les versions publiées, de la plus récente à la plus ancienne. Pour le diff complet entre deux versions : https://github.com/mchacher/sowel/compare/v<a>...v<b>.
Mettre à jour une instance en cours. Sowel interroge GitHub toutes les heures et fait apparaître la mise à jour disponible dans la barre supérieure. Un clic sur la pastille ouvre la feuille des mises à jour et applique la nouvelle version en un clic (ajouté en v1.9.0). En ligne de commande : cd /opt/sowel && docker compose pull && docker compose up -d.
1.12.x — UX station météo¶
v1.12.1 — 2026-05-20¶
- Build : remontée de la limite de pré-cache PWA workbox à 5 MiB. Le bundle UI principal a dépassé les 2 MiB par défaut après la refonte spec 114, ce qui a cassé le build Docker de la v1.12.0. Aucun changement runtime. Un follow-up découpera le bundle via
manualChunkspour pouvoir redescendre la limite.
v1.12.0 — 2026-05-20¶
- UI : refonte de la station météo (spec 114). La vignette "Station Météo" affiche désormais une tuile 1×1 épurée sur PC comme sur mobile — température extérieure en gros mono + humidité en dessous, rien d'autre — et un tap (ou clic sur desktop) ouvre un drawer avec le détail complet. Le drawer surface en plus les valeurs calculées par Sowel
rain_24h/rain_1h, donc les utilisateurs dont le plugin Netatmo n'auto-binde que la pluie instantanée (rainmm/h) voient quand même le vrai cumul 24 h. La ligne compacte de zone passe à 4 valeurs (temp / humidité / pluiemm/24h/ vent) avec le même fallback. LeWeatherPanelde la page détail injecte aussi les valeurs calculées dans la carte du module pluviomètre, et le module vent reçoit une petite flèche directionnelle + abréviation boussole dérivées dewind_angle. - UI : lisibilité de l'histogramme historique. En 7 j / 30 j, les échantillons horaires bruts sont désormais agrégés en totaux journaliers (un seul après-midi pluvieux donne une seule barre du jeudi au lieu de deux pics détachés étiquetés deux fois "jeu. 14"). Plafond de ticks par plage (7 j → 7 labels, 30 j → 10), libellés X sur deux lignes en 7 j (jour de la semaine + numéro), format compact
JJ/MMen 30 j, taille de police adaptative sur largeur mobile. Le tooltip passe à "Jeudi 14 mai" sur les buckets journaliers. - UI : PWA. Ajout de la balise standard
mobile-web-app-capableà côté de la variante Apple pour faire taire l'avertissement de dépréciation de Chrome dans DevTools.
1.11.x — Isolation soft des plugins¶
v1.11.1 — 2026-05-19¶
- Fiabilité : Sowel installe désormais des handlers globaux pour
uncaughtExceptionetunhandledRejection(spec 112). Quand un throw échappe à toutes les autres protections (un callbacksetIntervaldans le core, une promesse non awaited dans un publish MQTT, une surprise d'un module natif), les nouveaux handlers loggent une entréefatalavec la stack complète vers stdout et versdata/logs/sowel.N.log, puis exit proprement pour que la politique de restart de Docker relance le conteneur. Avant, un crash non rattrapé ne laissait aucune trace et Docker bouclait silencieusement. Désormais, toute investigation post-incident a au minimum une ligne de log par où commencer. Pas de changement de comportement sur le chemin nominal ; les handlers sont du pur filet de sécurité. - Sécurité : un nouveau journal d'audit persiste toute action sensible dans la nouvelle table SQLite
audit_log(spec 113). Les évènements capturés couvrent l'authentification (login success/failure, logout, création/suppression d'API tokens), la gestion utilisateur (création/modification/suppression/changement de mot de passe), les modifications de settings, l'activation/désactivation de modes, l'export/restauration de backups, et l'installation/désinstallation/mise à jour/activation/désactivation de plugins. Chaque entrée enregistre l'acteur (id user + username + type de token), l'IP source, l'action, la cible et un blob JSONmetaavec redaction automatique des valeurs sur les clés sensibles (password,token,secret,apiKey). Un nouvel endpoint admin-onlyGET /api/v1/auditexpose le journal avec filtres par acteur, préfixe d'action et plage de dates. La rétention est de 365 jours, purgée au boot.
v1.11.0 — 2026-05-19¶
- Durcissement sécurité : chaque plugin d'intégration tourne désormais avec des Proxies scopés autour de son
PluginDeps(spec 111). Quatre invariants sont enforces au niveau JavaScript : un plugin ne peut lire ou écrire que les settings sous son propre préfixeintegration.<own-id>.(plus une petite allowlist de globaux commehome.latitude), ne peut émettre que des events d'une whitelistsystem.*(pas d'usurpation d'events de domaine), ne peut muter que les devices appartenant à sa propre intégration, et les erreurs des méthodes lifecycle (refresh,getStatus, etc.) sont confinées avec des valeurs de repli typées au lieu de faire tomber le core. Validé en local contre les 13 plugins de la registry avec zéro faux positif. Pas de breaking change pour les auteurs de plugins : la forme dePluginDepset les signatures sont bit-pour-bit identiques, donc les plugins existants continuent de tourner sans modification. L'isolation est inconditionnelle dans cette release ; pas de mécanisme d'opt-out. Le rollback se fait par downgrade de l'image Docker. - Audit : la spec 089 (SHA256 supply-chain des plugins) plus la spec 111 ferment ensemble les vecteurs de menace dominants côté plugins. Les vecteurs résiduels (accès direct à
better-sqlite3depuis un plugin,fetcharbitraire, boucles infinies,process.exit) nécessiteraient une hard isolation via worker threads et restent documentés comme hors scope tant que la registry n'accueille que des owners de confiance. - Docs : nouvelle section "Scoping des plugins" dans
plugin-development.md(EN+FR) qui explique les quatre invariants pour les auteurs de plugins, les allowlists explicites dansscoped-deps.ts, et ce contre quoi le Proxy ne protège pas.
1.10.x — Le changelog à portée de clic¶
v1.10.3 — 2026-05-17¶
- Refactor : toutes les résolutions de bindings côté UI et moteur de recettes passent désormais par un résolveur partagé catégorie-d'abord. Les équipements re-bindés manuellement (avec l'alias = clé device) fonctionnent partout : vue zone, détail équipement, feuille mobile, toggle mobile direct, fermer-toutes-vannes, et dispatch piloté par recette (motion-light, switch-light, presence-heater, state-trigger-light). Ferme la classe de bug latent qui avait causé l'incident pool-cover de v1.10.2. Spec 110.
v1.10.2 — 2026-05-17¶
- Correctif : le bouton ON/OFF de la pompe piscine ne passe plus à la ligne sous l'icône dans la vue compacte de zone.
- Correctif : les boutons OUVRIR/STOP/FERMER du volet piscine (et de tout volet) réapparaissent dans la vue compacte de zone, dans la feuille mobile du tableau de bord, et dans la page de détail équipement quand le binding a été créé avec la clé du device comme alias (ex : après un re-binding manuel via l'UI). Les contrôles résolvent désormais les bindings move/position par catégorie, comme le widget du tableau de bord le faisait déjà.
v1.10.1 — 2026-05-17¶
- Correctif : une annonce de découverte partielle envoyée par un plugin d'intégration ne détruit plus silencieusement les bindings d'équipement. Avant ce correctif, si un device Tasmota / Zigbee2MQTT / etc. omettait temporairement une de ses clés lors d'une reconnexion, la ligne
device_data/device_ordersétait supprimée et le CASCADE FK effaçait le binding d'équipement correspondant. C'est ce qui avait fait disparaître la commande du volet piscine après le restart de v1.10.0. Les lignes bound sont désormais préservées à travers les re-découvertes partielles ; seules les vraies lignes orphelines continuent d'être nettoyées (spec 109).
v1.10.0 — 2026-05-17¶
- Chaque ligne de la feuille des mises à jour expose désormais une icône changelog discrète à côté du bouton Mettre à jour. Cliquez pour ouvrir les notes de version correspondantes (cette page pour le cœur Sowel, la page GitHub release pour les plugins) dans un nouvel onglet. Fini les mises à jour à l'aveugle (spec 107).
- Les notes de version sont désormais dans la table des matières du Guide utilisateur.
- La CI refuse maintenant de publier une release sans entrée correspondante sur cette page, en EN et FR (spec 108). Conséquence : chaque lien « Voir les changements » de l'application tombe sur une section remplie.
1.9.x — Pastille de mise à jour actionnable¶
v1.9.0 — 2026-05-17¶
- La pastille de mise à jour de la barre supérieure ouvre désormais une feuille
UpdatesSheetlistant le cœur Sowel et les plugins obsolètes, avec un boutonMettre à jourpar ligne (spec 106). Remplace l'ancienne redirection aveugle vers/plugins, qui laissait les mises à jour du cœur invisibles.
1.8.x — Graphiques et flux d'activité¶
v1.8.1 — 2026-05-17¶
- Les graphiques temporels utilisent désormais une échelle de temps linéaire sur l'axe X. Les données détection / contact / météo éparse ne sont plus comprimées visuellement quand les événements sont groupés dans le temps.
v1.8.0 — 2026-05-16¶
- Nouveau flux d'activité dans la vue zone (spec 101). Affiche les événements des dernières 24 h avec un plafond adaptatif (10 sur mobile, 100 sur desktop), filtré par catégorie de liaison et limité à la zone courante.
1.7.x — Durcissement WAN¶
v1.7.0 — 2026-05-15¶
- Durcissement WAN (spec 105) : CSP et vérification d'origine WebSocket renforcés pour une exposition publique sûre via tunnel Cloudflare. Google Fonts autorisé pour la police Nunito. Socket Docker accessible à l'utilisateur non-root
sowel. - CI : runner GitHub ARM64 natif avec builds parallèles — le temps de release multi-arch passe d'environ 15 min à 3 min.
1.6.x — Design system et chaîne d'approvisionnement plugins¶
v1.6.6 — 2026-05-15¶
- L'assistant de configuration déclenche automatiquement le redémarrage après validation ; séparateur décimal unifié pour les champs latitude/longitude.
- CI : politique de rétention GHCR — les anciennes versions de conteneurs sont automatiquement purgées à chaque release.
v1.6.5 — 2026-05-15¶
- Assistant de configuration Maison au premier login. Le helper de redémarrage passe désormais
--force-recreatepour réellement redémarrer.
v1.6.4 — 2026-05-15¶
- L'installation de plugin ne refuse plus que les liens symboliques qui sortent du paquet ; les liens internes sont autorisés (spec 089 C1).
v1.6.3 — 2026-05-14¶
- L'auto-mise à jour normalise le fichier compose vers
:latest, force la recréation du conteneur et vérifie la nouvelle version (spec 104). - CI : création de la release GitHub conditionnée à la réussite du build ARM64.
v1.6.2 — 2026-05-14¶
- Durcissement de la chaîne d'approvisionnement plugins (spec 089 C1+C2) : hashes SHA256 figés dans le registre, confirmation d'installation pour le namespace communautaire, confinement du chemin de restauration, liste blanche d'extensions, refus des liens symboliques, plafond de taille.
v1.6.1 — 2026-05-14¶
- Correction du build Docker — le répertoire
design-system/est désormais copié dans l'étape de build UI.
v1.6.0 — 2026-05-14¶
- Refonte UI majeure pour parité avec le design system (specs 094–100) :
- Nouvelle palette et nouveaux tokens du design system
- Sidebar refactorisée en composants réutilisables
- Vue zone en 2 colonnes sur desktop avec bande d'agrégation et pills variantes
- Toolbar de commandes zone icon-only
- Chrome unifié pour les widgets du tableau de bord
- Typographie polie (letter-spacing, standardisation H1, tabular nums par défaut)
- Refactor du chrome des lignes d'équipement avec halo lumineux
- Alignement strict avec la maquette sur les panneaux de zone, parité mobile
- Installateur en une commande (
install.sh) ajouté.
1.5.x — Extension énergie et recettes¶
v1.5.10 — 2026-05-10¶
- Revert interne sur la documentation.
v1.5.9 — 2026-05-09¶
- Sélecteur de recettes réécrit en popover compacte (latéral sur desktop, bottom-sheet sur mobile). Palette pastel et coins arrondis sur le graphique énergie par usage.
v1.5.8 — 2026-05-08¶
- Nouvelle recette
state-trigger-light(spec 092). Les slots de recette gagnent les contraintescrossZoneetincludeDescendants, ainsi qu'un sélecteur "zone d'abord" pour les slots équipement unique.
v1.5.7 — 2026-05-08¶
- Sous-compteurs en puissance uniquement et graphique de répartition énergie par usage (spec 091). Cumul Wh des sous-compteurs exposé comme donnée calculée sur l'équipement.
v1.5.6 — 2026-05-03¶
- Toggle activer/désactiver par mapping sur les publications MQTT (spec 090).
v1.5.5 — 2026-05-03¶
- Hot-load plugin : invalidation du cache pour les imports transitifs.
v1.5.4 — 2026-05-03¶
- API plugin : getter
getDeviceDataLastUpdatedexposé ; bump du registreshelly_mqtt.
v1.5.3 — 2026-05-03¶
- La requête de production énergie retombe sur le bucket horaire quand le bucket raw manque. Le tooltip de consommation sépare HP/HC entre réseau pur et autoconsommation.
v1.5.2 — 2026-05-03¶
- Pastilles compactes en barre supérieure remplacent la bannière d'alarme et le warning d'intégration. Le statut énergie live se sépare selon la source dominante. Le dechargement plugin appelle toujours
stop().
v1.5.1 — 2026-05-03¶
- Writer d'autoconsommation (spec 086 étapes E+F), plus corrections de bugs sur l'agrégateur et l'historique. Nouveau getter
getDeviceDataValuepour l'hydratation des plugins.
v1.5.0 — 2026-05-02¶
- Page de flux de puissance en direct (
/energy/live) avec auto-détection des sources. Plugin Shelly MQTT ajouté au registre. Outil de migration de l'historique pour les équipements orphelins.
1.4.x — Pompe à chaleur piscine¶
v1.4.2 — 2026-05-01¶
- Le tableau de bord mobile affiche la pompe à chaleur piscine comme un thermostat. Les intégrations désactivées restent visibles sur la page Intégrations. Toggle activer/désactiver directement sur la ligne.
v1.4.1 — 2026-05-01¶
- Toggle persistant Activer/Désactiver sur le drawer d'intégration. Les anciennes images
ghcr.io/mchacher/sowelsont purgées automatiquement après auto-mise à jour.
v1.4.0 — 2026-05-01¶
- Nouveau type d'équipement
pool_heat_pumpet scaffolding du plugin Modbus associé.
1.3.x — Équipements piscine¶
v1.3.2 — 2026-04-19¶
- La logique de rappel d'alarme passe dans le publisher de notification Telegram (spec 083). Remplissages adaptatifs au thème pour l'icône de pompe piscine (dark mode). Pill Ouvert/Fermé sur les cartes compactes de volets et de couverture piscine.
v1.3.1 — 2026-04-19¶
- Mise en page des slots de recette : colonnes de largeur égale pour les paires homogènes.
v1.3.0 — 2026-04-19¶
- Nouveaux types d'équipement
pool_pumpetpool_cover(spec 081), avec contrôles inline dans la vue zone compacte et un sélecteur de canal dédié côté device. Les appareils multi-canaux peuvent désormais alimenter plusieurs équipements. Le registre plugins peut être rechargé à la demande depuis l'UI.
1.2.x — Dispatch équipement v2 et catégories de domaine¶
v1.2.15 — 2026-04-19¶
- Plugin Tasmota enregistré en v1.0.0 (spec 080). Le
install()plugin redirige versupdate()en cas de réinstallation.
v1.2.14 — 2026-04-18¶
- Les devices stockent les valeurs enum ; l'UI surface les valeurs d'action dynamiquement (spec 079). Nouveau type d'effet bouton
zone_orderavec sélection équipement "zone d'abord" (spec 078).
v1.2.13 — 2026-04-18¶
- Refactor :
dispatchConfig,apiVersion, fallback brute-force supprimés (spec 074). Le dispatch v2 est désormais l'unique chemin.
v1.2.12 — 2026-04-18¶
- Catégories de commande pour la résolution des ordres de zone (spec 077). Nouvelles catégories température/humidité extérieures et mise à jour du plugin
netatmo-weather(spec 076).
v1.2.11 — 2026-04-18¶
- Nouvelles catégories de domaine pour
media_player,applianceetthermostat(spec 073).
v1.2.10 — 2026-04-18¶
- L'ordre de zone sur thermostat passe par la catégorie de consigne (spec 070).
v1.2.9 — 2026-04-18¶
- Les ordres de zone résolvent les alias par catégorie au lieu de noms en dur (spec 069).
v1.2.8 — 2026-04-18¶
- Dispatch d'ordres v2 — les plugins reçoivent directement
orderKeyau lieu d'un blobdispatchConfig(spec 067).
v1.2.7 — 2026-04-15¶
- Les ordres de zone volet utilisent l'état OPEN/CLOSE au lieu d'une position.
v1.2.6 — 2026-04-12¶
- Nouvelle option
onChangeOnlysur les publications MQTT.
v1.2.5 — 2026-04-12¶
- Restauration du snapshot à chaque reconnexion — revert du changement de v1.2.4 après effets de bord.
v1.2.4 — 2026-04-12¶
- Les publications MQTT ne bouclent plus sur snapshot à la reconnexion du broker ; republication au changement de mapping.
v1.2.3 — 2026-04-12¶
- Suppression du verrou par fichier PID — il causait une boucle de crash Docker au redémarrage du conteneur.
v1.2.2 — 2026-04-12¶
- Nettoyage interne.
v1.2.1 — 2026-04-12¶
- Le helper d'auto-mise à jour préserve le
working_dircompose de l'hôte.
v1.2.0 — 2026-04-12¶
- Registre plugins découplé de la cadence de release de Sowel + champ de compatibilité
sowelVersion(spec 066).
1.1.x — Eau et freecooling¶
v1.1.7 — 2026-04-12¶
- Les badges et boutons de mise à jour utilisent désormais le rouge au lieu de l'ambre.
v1.1.6 — 2026-04-12¶
- Nettoyage interne.
v1.1.5 — 2026-04-12¶
- Le helper d'auto-mise à jour conserve
AutoRemovedésactivé temporairement pour le debug.
v1.1.4 — 2026-04-12¶
- Nettoyage interne.
v1.1.3 — 2026-04-12¶
- L'auto-mise à jour pull par tag de version au lieu de
:latest(évite la course avec des releases concurrentes).
v1.1.2 — 2026-04-12¶
- Nouvelle recette freecooling — ferme les volets avant le lever du soleil (spec 065).
v1.1.1 — 2026-04-12¶
- Les paquets recette peuvent s'installer et se mettre à jour à chaud sans redémarrage du moteur.
v1.1.0 — 2026-04-12¶
- Nouveau type d'équipement
water_valve(spec 062) et recette d'arrosage automatique (spec 063). - Données météo calculées : pluie-1h / pluie-24h plus graphiques à barres cumulatifs (spec 064).
- Le fuseau horaire est désormais auto-dérivé de la localisation du domicile (spec 061), avec un fallback sûr quand la table settings manque sur une installation fraîche.
- Polish UX recettes, secondes sur l'horloge, auto-démarrage des plugins après install/update.
1.0.x — Premières versions¶
v1.0.8 — 2026-04-11¶
- Nettoyage interne.
v1.0.7 — 2026-04-11¶
- Pattern de conteneur helper pour l'auto-mise à jour + améliorations de détection (spec 060).
v1.0.6 — 2026-04-11¶
- Nettoyage interne.
v1.0.5 — 2026-04-06¶
- Registre plugins distant, récupéré au runtime avec fallback local (spec 059).
- Image Docker passée à Debian Trixie pour Python 3.13+ (compatibilité bridge Panasonic Comfort Cloud).
- CI : build
amd64uniquement à ce stade (~5 min vs ~15 min) ; l'ARM64 reviendra plus tard. - Comparaison semver-aware pour les mises à jour de plugins.
v1.0.4 — 2026-04-06¶
- Nettoyage interne.
v1.0.3 — 2026-04-06¶
- L'export line-protocol du backup gère les valeurs non-string d'InfluxDB. La restauration vide
recipe_logpour éviter les FK orphelines. L'image Docker runtime conservepython3pour le bridge Panasonic Comfort Cloud.
v1.0.2 — 2026-04-06¶
- Le backup inclut désormais
refresh_tokenspour qu'une instance restaurée garde les utilisateurs connectés.
v1.0.1 — 2026-04-06¶
- Le
PRAGMA foreign_keysdu backup est déplacé hors de la transaction SQLite (il n'avait aucun effet à l'intérieur).
v1.0.0 — 2026-04-06¶
- Première version versionnée. Ajoute le versioning
package.json, le Dockerfile, le pipeline GitHub Actions de release et ledocker-compose.ymlde référence (spec 055). Tout ce qui précède ne vit que dans l'historique git pré-release.