Sortie · sept. 2026

AccueilWatt-GuardianManuel

ESP32 · ÉCRAN TFT · ROUTEUR MAÎTRE

Manuel — Watt-Guardian

Chaque page de l'interface web embarquée du routeur maître : ce que fait chaque carte, chaque zone de saisie, chaque bouton et badge, les valeurs acceptées et les comportements.

Le Watt-Guardian est le maître de l'écosystème : il mesure la puissance réseau, calcule le surplus et orchestre les dimmers (locaux et distants) ainsi que les relais. Cette page est une référence d'écran par écran de son interface web embarquée, servie sur l'adresse locale du routeur. Pour les concepts (régulation PV, chaîne maître/esclave, gammes de licence), voir les guides thématiques.

Conventions de lecture

Le id est l'identifiant technique du champ (utile au support). Modifier un champ ne change la valeur qu'en mémoire : tant que vous n'avez pas cliqué un bouton Sauvegarder et Appliquer, rien n'est écrit — un redémarrage perdrait la modification. Un avertissement « modifications non sauvegardées » s'allume dès qu'un champ d'un formulaire est touché.

Badges utilisés dans ce manuel

Immédiat appliqué à chaud   Reboot effectif au prochain démarrage   non testé fonction désactivée   conditionnel visible selon le matériel ou la gamme de licence

Gammes de licence. Plusieurs fonctions sont réservées à une gamme : basic < pro < max < ultra. Un champ verrouillé apparaît grisé avec un cadenas et un lien vers la page Licence. Le mode DIY (firmware compilé sans secret de licence) débloque tout. Les écrans concernés portent ci-dessous le badge conditionnel.

Éléments communs à toutes les pages

La barre latérale, la barre du haut et le pied de page sont identiques sur les pages d'administration (sauf en mode point d'accès et sur l'assistant, qui ont leur propre habillage). Ils ne sont pas redécrits dans chaque écran.

Barre latérale (menu)

ÉlémentRôle
Watt-Guardian (logo)Lien vers la racine / — le tableau de bord.
Bloc d'étatVersion firmware (version), réseau Wi-Fi (WIFI), signal RSSI en dBm, nom (name) — rafraîchis en continu depuis /state.
ParamètresGuardian · Moniteur d'énergie · Météo · Batterie · Historique · Broker MQTT · Réseau Wifi · Minuteur · Sauvegardes · Licence · Communauté.
SystèmeInformations système · Debug · Performance · Console logs.
RebootAppelle /reboot : redémarrage immédiat (le bandeau d'état passe en violet « Appareil injoignable » puis vert « Appareil redémarré »).
Badges dynamiquesconditionnel Historique / Météo / Batterie / Statistiques affichent un badge de gamme (Premium, Nj, MAX, ULTRA) si la fonction est verrouillée ; Informations affiche MAJ si une mise à jour OTA est disponible ; Communauté peut afficher une pastille d'invitation.

Les pages Statistiques et Trophées s'atteignent depuis le tableau de bord, Mise à niveau depuis la page Licence, et l'Assistant au premier démarrage.

Barre du haut & pied de page

En haut : un bandeau d'état global (#status-banner) et l'horloge locale (#heure-topbar). Le bandeau résume l'état calculé à partir de /state :

Code couleur du bandeau. Vert = fonctionnement normal ; Orange = fonctionnement partiel (MQTT déconnecté, sonde Dallas absente, modulator distant injoignable, token Enphase bientôt expiré…) ; Rouge = erreur (Wi-Fi coupé, aucune source d'énergie configurée, mesure injoignable, token Enphase expiré) ; Violet = appareil injoignable (reboot en cours).

Données live (SSE)

Les pages reçoivent l'état en temps réel via EventSource('/events') — une connexion unique partagée qui émet les évènements state (état général, ~toutes les 4 s), chain (chaîne de modulators), battery (EMS batterie) et ota_status (mise à jour). Un repli par interrogation directe de /state prend le relais si le flux est muet plus de 12 s.

Écran « Tableau de bord »

Accès : racine / (logo de la barre latérale). C'est l'écran principal : mesure réseau/PV, routage, diagramme d'architecture, score de qualité, état des services et commandes.

Cet écran est un tableau de bord sans formulaire persistant : ses seuls contrôles sont des boutons de commande. Les cartes affichent des valeurs lues dans /state et /modulator/chain.

Cartes d'affichage

CarteValeurs (champ source)
RéseauÉtat textuel state.
WattmètrePuissance réseau signée watt (+ = soutirage, − = injection), courbe 60 s, production pv_production, conso calculée (pv_production + watt), bornes delta / deltaneg.
DimmersDimmer local (dimmerlocal, Plocal) + dimmers distants de la chaîne (/modulator/chain) ; total routé total_charge, capacité, % d'utilisation. conditionnel chaîne masquée si chain_gated_by_tier.
Température dimmer localtemp_dimmer, sonde dallas_dimmer, alerte dimmer_mqtt_lost / dimmer_sensor_lost, plafond tmax.
Auto-conso · CO₂ évité · Pic du jourCalculés depuis pv_production, watt, wh_today, puissance_route (+ historique local du navigateur).
Score qualitéNote (donut) combinant auto-conso et stabilité. Boutons d'échelle 5 s / 24 h / 7 j. conditionnel détail réservé aux gammes max/ultra (ou DIY).
ServicesWi-Fi / MQTT (mqtt_connected) / NTP (ntp_sync) / Énergie (mode, wattIsValid).
Santé du systèmeTâches FreeRTOS et mutex (/debug/tasks : tasks, mutex_ok, mutex_timeout).
Architecture du systèmeDiagramme SVG : réseau, source, routeur, dimmer local, chaîne, proxy, bus MQTT et sondes découvertes.
Délégation HTTPS / proxyconditionnel visible si proxy actif — état, hôte, empreinte, dernières tentatives (/proxy/status).

Boutons de commande (carte « Commandes »)

Bouton (id)Endpoint appeléRôle
Éteindre / Allumer — btn-onoff/get?disengage_dimmer=on|offCoupe ou réactive le dimmer local. conditionnel désactivé tant que la sonde du dimmer manque (dimmer_temp_ok + dallas_dimmer).
Boost — btn-boost/boostLance/arrête la marche forcée (lit ok / msg).
Relais 1/2/3 — btn-relay1/2/3/get?relay1=2 (resp. relay2, relay3)Bascule le relais. conditionnel visible selon has_relay1/2/3 et relays_visible_count.
Switch écran — screen/get?servermode=screenconditionnel visible si écran TFT présent (has_tft).
Re-tester (proxy) — proxy-card-discover/proxy/discoverRelance la découverte mDNS du proxy.

Badges du titre. Le tableau de bord affiche la gamme active (tier), un badge DIY si diy_build, et un badge d'alerte si la chaîne est bridée par la licence (chain_gated_by_tier) ou si des modulators/sondes configurés ne sont pas actifs.

Mode point d'accès (index-ap)

Tant que le Wi-Fi n'est pas configuré, le routeur démarre en point d'accès et sert une version minimale du tableau de bord (assets locaux, pas d'Internet). La barre latérale ne contient qu'un lien Configuration. Cartes : State (state), Sigma (watt), Routed Power (dimmerdistant_puissance), bouton écran. /state y est interrogé toutes les 2 s (pas de SSE).

Écran « Moniteur d'énergie »

Accès : menu › Moniteur d'énergie. Choisit, teste et active la source de mesure du réseau/PV. C'est ici (et non sur la page Configuration) que l'on paramètre Shelly, Enphase, Fronius, une source HTTP générique ou Home Assistant via MQTT.

Carte « Source de mesure »

Champ (id)TypeValeursRôle
Type de source — sourceTypeliste0 Aucune · 1 Shelly EM · 2 Enphase · 3 Fronius · 4 HTTP générique · 5 HA MQTTSélectionne le panneau de configuration affiché ci-dessous. Défaut = mode courant.

Panneau Shelly (cfg-shelly)

Champ (id)TypeRôle
EMtexteIP du Shelly EM (none pour désactiver).
TRIcaseTriphasé (Shelly 3EM).

Panneau Enphase (cfg-enphase)

Champ (id)TypePlage / valeursRôle
IP_ENPHASEtexteIPAdresse de l'Envoy.
PORT_ENPHASEtextedéfaut 443Port HTTPS.
Type (enphaseType/Type)radioS / RModèle d'Envoy.
Version (enphaseVersion/envversion)radio5 / 7 (déf. 7)Firmware Envoy.
tokentexteJWTJeton d'accès. La date d'expiration s'affiche (rouge si expiré, jaune si < 30 j).
envdelaycurseur0–60 s (déf. 5)Délai mini entre deux mesures. Immédiat sauvegarde auto via /get?envdelay=…&save=1.

Conditionnel. L'option Enphase est désactivée sans proxy HTTPS actif (proxy_enabled + proxy_active) ni PSRAM (psram_total > 0) : le handshake TLS de l'Envoy a besoin de l'un des deux.

Panneau Fronius (cfg-fronius)

Champ (id)TypeRôle
IP_FRONIUStexteIP de l'onduleur Fronius.
FRONIUS_APItexte (lecture seule)Version d'API (V1).

Panneau HTTP générique (cfg-generic)

Pour interroger n'importe quelle source exposant une valeur en JSON. Deux blocs symétriques (réseau / production) :

Champ (id)TypeRôle
GEN_URL_GRID / GEN_URL_PRODtexteURL à interroger (réseau / production).
GEN_METHOD_GRID / GEN_METHOD_PRODlisteGET ou POST.
GEN_BODY_GRID / GEN_BODY_PRODtexteCorps de requête (POST).
GEN_PATH_GRID / GEN_PATH_PRODtexteChemin JSON pointé (ex. data.power).
GEN_SCALE_GRID / GEN_SCALE_PRODnombreFacteur d'échelle (déf. 1, pas 0,01).
GEN_INVERT_GRIDcaseInverse le signe de la valeur réseau.
GEN_AUTHtexteEn-tête Authorization.
GEN_POLLnombrePériode d'interrogation (1000–30000 ms, déf. 3000).

Panneau Home Assistant MQTT (cfg-hamqtt)

Champ (id)TypeRôle
HA_TOPIC_GRID / HA_TOPIC_PRODtexte (datalist)Topic MQTT réseau / production (auto-complété par les topics découverts).
HA_PATH_GRID / HA_PATH_PRODtexteChemin JSON optionnel dans la charge utile.
HA_SCALE_GRID / HA_SCALE_PRODnombreFacteur d'échelle (déf. 1).
HA_INVERT_GRIDcaseInverse le signe réseau.

Carte « Mode debug — Shelly virtuel » (debugShellyCard)

conditionnel visible seulement sur un firmware DEBUG (debug_mode) et en source Shelly. Champ debugShellyIP (IP:Port d'un Shelly simulé). Bouton Utiliser (btnDebugUse) → /setdebugshelly?ip= (surcharge en RAM uniquement).

Boutons & tests

BoutonEndpoint(s)Rôle
Tester (source courante)/testshelly?ip= · /testenphase… (+ /testenphase_status) · /testfronius?IP_FRONIUS= · /testgeneric?which= · /testhamqtt?which= (+ /testhamqtt_status)Mesure à blanc ; lit ok, grid/value, msg. Les tests Enphase et HA sont asynchrones (202 + sondage du statut).
Sauvegarder & Activer — btnSaveActivate/get?…&save=1 ou /setgeneric / /sethamqtt, puis /setsource?source=<1..5>Enregistre les paramètres de la source choisie puis l'active. conditionnel activé seulement après un test réussi.

Bandeau d'état live. #liveState (non testé / test en cours / actif / inactif / erreur) et #liveValue (« Grid : N W ») reflètent wattIsValid, mode et enphase_token_err de /state.

Écran « Météo »

Accès : menu › Météo. Affiche les conditions actuelles (open-meteo), une prévision PV 24 h et une estimation de production via forecast.solar. conditionnel profondeur selon la gamme (mode 1 = info ; mode 2 = prévisions ; mode 3 = optim. prédictive ; forecast.solar = max/ultra).

Carte « Configuration »

Champ (id)TypeRôle
Activer la récupération météo — w_enabledcaseActive les appels météo. Refusé si aucune coordonnée n'est définie.
Coordonnéeslecture seuleLatitude/longitude affichées (w_geo_display) ; elles se règlent dans Configuration › Localisation.

Bouton Sauvegarder (w_save) → /setweather?enabled=.

Carte « Configuration PV — forecast.solar » (fs_card_row)

conditionnel visible seulement en gamme max/ultra (ou DIY).

Champ (id)TypePlageRôle
Activer la prévision PV — fs_enabledcaseActive forecast.solar.
Puissance crête — fs_kwpnombre0,1–50 kWc (déf. 3,0)Puissance installée.
Inclinaison — fs_decnombre0–90° (déf. 30)Inclinaison des panneaux.
Azimut — fs_aznombre−180–180° (0 = Sud)Orientation.

Bouton Sauvegarder/setforecastsolar?enabled=&kwp=&dec=&az=.

Cartes d'affichage

Conditions actuelles (/weather : temp, label, cloud, wind_kmh, is_day, code, age_ms). Prévisions 24 h : KPIs (pic W/m², énergie kWh/m², fenêtre PV) et bande synoptique 8×3 h depuis forecast (objets r/c/t). Prévision PV (/forecast : wh_today, wh_tomorrow, peak_w, peak_time).

Écran « Batterie »

Accès : menu › Batterie. Lit une batterie domestique Victron Cerbo GX via MQTT et propose un asservissement du routage au niveau de charge. conditionnel fonction réservée à la gamme ULTRA (ou DIY).

Carte « Configuration » (b_config_card)

Champ (id)TypePlage / valeursDéfautRôle
Activer la lecture EMS — b_enabledcaseoffActive la lecture batterie.
Type d'onduleur — b_typelisteVictron Cerbo GX (MQTT)victron-mqttProtocole de lecture.
VRM Portal ID — b_portal_idtexte≤ 31 car.Identifiant du portail Victron.
Période — b_poll_periodcurseur15–120 s15Cadence de lecture.
Mode de routage — b_route_off / b_route_socradioDésactivé (0) / Asservi SOC (1)0Conditionne le routage au niveau de charge.
SOC minimum — b_min_soccurseur5–99 %80conditionnel visible en mode asservi. Seuil au-dessus duquel le surplus part vers les charges.
Hystérésis — b_hystcurseur1–30 %5Évite le yo-yo autour du seuil. Un aperçu de la décision s'affiche en direct.

Bouton Sauvegarder (b_save) → /setbattery?enabled=&type=&portal_id=&poll_period_s=&route_mode=&min_soc_pct=&hysteresis_pct=.

Carte « État batterie »

Anneau SOC + indicateurs depuis /getbattery et l'évènement SSE battery : data_valid, soc_pct, power_w (signé : < 0 = charge, > 0 = décharge), voltage_v, current_a, temp_c, last_update_ms.

Écran « Historique »

Accès : menu › Historique. Trace réseau, production et puissance routée par dimmer sur une fenêtre réglable. conditionnel profondeur selon la gamme (history_days_allowed : 0 / 7 / 15 / 30 jours ; DIY = tout).

Sélecteur de fenêtre (h_window_group)

BoutonAttributsRôle
6 h / 24 h / 7 j / 15 j / 30 jdata-window, data-agg (raw/hour/day), data-min-days, data-tierRecharge le graphe via /history/ring. conditionnel chaque bouton est désactivé (cadenas + gamme requise) si data-min-days dépasse history_days_allowed ; défaut actif = 24 h.

Bouton Sauvegarder maintenant (h_save_btn) → POST /history/save (force une écriture NVS ; lit ok, last_snap, recent/medium/long).

Format des données. /history/ring renvoie records (tableaux positionnels : horodatage, réseau W, production W, local W, dimmers 1-3 W) plus total_pages, max_days, count, capacity, last_snap, aggregate. La pagination utilise from, to, page, page_size, aggregate.

Écran « Configuration » (Guardian)

Accès : menu › Guardian. Règle la régulation du routage, les dimmers local/distant, le boost, les sondes, la délégation HTTPS, l'écran, le style du dashboard, le NTP/langue/géoloc et le mappage des broches GPIO. Le bouton vert Sauvegarder et Appliquer (btnSubmitMain) envoie tous les champs via /get puis /get?save=yes, et applique NTP/météo/proxy.

Carte « Paramètres du Guardian »

Comporte la visualisation de la bande morte (zone de régulation), alimentée par les deux champs ci-dessous et par watt live.

Champ (id)TypeRôle
Limite consommation — Delta — deltanombre (W)Seuil de soutirage au-dessus duquel le Guardian réduit la puissance routée.
Limite injection — Deltaneg — deltanegnombre (W)Seuil d'injection sous lequel il augmente la puissance routée.

Carte « Gestion des dimmers »

Dimmer local (blockDimmerLocal) :

Champ (id)TypePlageRôle
Activer le dimmer local — dimmerlocalcase0/1Active la sortie dimmer locale.
Limiteur — localfusenombre% (0 = sans limite)Plafond de puissance locale.
Température max — tmaxnombre°CCoupure thermique auto.
Puissance de démarrage — triggernombre%Seuil mini anti court-cycle.
Puissance de la charge — charge1nombreWPuissance nominale (sert à la répartition).
Type de charge — dimmer_typeliste— / chauffage / ECS / pompe / lumière / ventilation / autreType d'appareil piloté.

Boost (marche forcée, dimmer local) :

Champ (id)TypePlageRôle
Température max — boost_tempnombre20–95 °CSécurité thermique du boost.
Puissance — boost_powernombre1–100 %Niveau forcé.
Durée — boost_durationnombre5–480 min (pas 5)Durée (libellé « 1h00 » live).

Dimmer distant : champ dimmer (hostname/IP ou none) ; bouton Rechercher (btnScanDimmer) → /scandimmers (renvoie dimmers autonomes + piloted).

Carte « Sondes de température »

Sondes locales (Dallas) — bouton Rechercher (btnScanDallas) → /resetdallas puis relecture de /state (paires addr0/1… + dallas0/1…).

Sondes distantes (MQTT) — slots SubscribeTEMP1 à SubscribeTEMP4 ; bouton Rechercher (btnScanSensors) → /scansensors (renvoie sensors : name/topic). conditionnel le nombre de slots visibles dépend de mqtt_slots et de la gamme.

Affectation des sondes — selects assign-dimmer, assign-relay1/2/3 (valeurs : aucune / adresse ROM 16 hex / MQTT1…). Immédiat chaque changement enregistre via /get (avec save=yes). Alerte warn-dallas-shared si une même sonde est affectée à plusieurs organes. conditionnel blocs relais visibles selon has_relay1/2/3.

Carte « Délégation HTTPS (watt-proxy) »

Champ (id)TypeDéfautRôle
Activer la délégation — proxy_enabledcaseoffDélègue les handshakes HTTPS au watt-proxy.
Découverte mDNS — proxy_autocaseonRecherche automatique du proxy sur le réseau.
Hôte du proxy — proxy_hosttextehôte ou hôte:port (si découverte manuelle).

Boutons : Tester / découvrir (btnProxyDiscover) → /proxy/discover + /proxy/status ; Apairer (btnProxyPair) → /proxy/pair ; Désappairer (btnProxyUnpair) → /proxy/unpair. État dans proxyStatus / proxyPairStatus.

Cartes « Écran » & « Style du dashboard »

Écran TTGO TFT (screenCard, conditionnel si has_tft) : screentime (délai d'extinction, 0 = toujours allumé), flip (orientation, Immédiat via /get?servermode=flip) ; bouton ON/OFF Oled → /get?servermode=screen.

Écran S3-HMI (hmiCard, conditionnel si has_hmi) : hmi_screentime, hmi_rotation (0/90/180/270°), hmi_night_start_hour / hmi_night_end_hour (0–23), hmi_brightness_day / hmi_brightness_night (0–255).

Style du dashboard (DASHBOARD_STYLE_CARD, conditionnel cartes à écran graphique) : select dashboard_style (variantes Tesla, Mega, Data, Gauge, Bars, Timeline, Triangle, Retro, Forecast, Battery, Chain — l'offre s'adapte à la carte). Immédiat via /setdashboard_style?n=. Verrouillé (badge MAX) si dashboard_style_unlocked est faux.

Cartes « NTP & fuseau », « Langue » & « Localisation »

Champ (id)TypeRôle
Serveur NTP — ntp_server + bouton TestertexteServeur de temps ; le bouton vérifie via /testntp?ntp_server=.
Fuseau horaire — ntp_timezonelisteChaînes POSIX par région (heure d'été auto).
Langue — langlisteFR · EN · ES · IT · DE. Immédiat via /setlanguage?lang=.
Libellé des modulators — modulator_label_modelistenom / type / personnalisé / type+nom. Immédiat via /setmodulatorlabel?mode=.
Latitude / Longitude — geo_lat / geo_lonnombre−90..90 / −180..180. Bouton Détecter (géoloc navigateur). Sert à la météo. Enregistré via /setweather?lat=&lon=.

Carte « Paramétrage GPIO »

Repliable. Chaque broche affiche sa valeur compilée par défaut ; laisser vide = valeur par défaut.

Champ (id)PlageEffet
Bus OneWire — gpio_one_wire0–40Réinitialise la détection des sondes. Immédiat
Dimmer / Zero-cross — gpio_dimmer / gpio_zerocross0–48Broches de commande. Reboot
Relais 1/2/3 — gpio_relay1/2/30–48conditionnel selon has_relay1/2/3. Reboot
Résolution Dallas — gpio_temp_precision9–12 bitsPrécision / temps de conversion. Reboot

Bouton Appliquer les GPIO (btnSaveGpio) → /setgpio (bouton propre, distinct du Sauvegarder principal).

Écran « Broker MQTT »

Accès : menu › Broker MQTT. Configure la connexion au broker et l'auto-découverte Home Assistant, avec un bandeau d'état live et un bouton de test.

Carte « Broker MQTT »

Champ (id)TypeDéfautRôle
Serveur — MQTT_SERVERtexteHôte/IP du broker.
Port — MQTT_PORTnombre1883Port du broker.
Utilisateur — MQTT_USERtexteIdentifiant (optionnel).
Mot de passe — MQTT_PASSWORDmot de passeMot de passe (optionnel).

Carte « Intégration Home Assistant »

Case HA_ENABLED : active les topics d'auto-découverte HA. conditionnel désactivée (badge MAX + bandeau) si la gamme est inférieure à MAX (hors DIY).

Boutons : Tester (btnTest) → /testmqtt?MQTT_SERVER=&MQTT_PORT= (lit ok, msg) ; Sauvegarder et Appliquer (btnSave) → /applymqtt?…&HA_ENABLED=.

Bandeau d'état. Le bandeau broker passe « non testé » → « connecté » (vert) / « non connecté » (rouge) selon mqtt_connected (/getmqtt) et le résultat du test. Il repasse en « non testé » dès qu'on modifie le serveur ou le port.

Écran « Réseau Wi-Fi »

Accès : menu › Réseau Wifi. Configure le Wi-Fi en mode station (SSID/mot de passe) avec scan asynchrone et résultats cliquables.

Carte « Configuration »

Champ (id)TypeRôle
SSID — ssidtexteNom du réseau cible (pré-rempli depuis /getwifi).
Mot de passe — passwordmot de passeLaisser vide pour conserver le mot de passe actuel (jamais pré-rempli).

Boutons : Rechercher (btnScanWifi) → sonde /scanwifi (réseaux ssid/rssi ; un clic sur un résultat remplit le SSID) ; Sauvegarder et Appliquer (envoi de get?ssid=&password=). Le badge wifiStatusBadge indique « Connecté / Non connecté » selon le signe de RSSI.

Mode point d'accès (wifi-ap)

Page d'onboarding (portail captif), habillage propre, servie quand le routeur est en point d'accès. Contrôles : liste déroulante ssidSelect (réseaux scannés + option « Réseau caché » __manual__ qui révèle ssidManual), bouton de re-scan rescanBtn (scanwifi), indicateur de signal, mot de passe password avec œil togglePwdBtn, bascule de langue FR/EN. La soumission appelle savewifi?ssid=&password= et affiche une superposition de redémarrage. Le bloc serialBlock n'apparaît que si getwifi renvoie un numéro de série.

Écran « Minuteur »

Accès : menu › Minuteur. Programme des plages horaires marche/arrêt (avec température max, et puissance % pour le dimmer) pour le dimmer local et jusqu'à 3 relais. Onglets visibles selon le matériel et la gamme.

Onglet « Dimmer » (dimmer-form)

Champ (id)TypePlageRôle
Heure de démarrage — heure_demarrage_dimmerheureHH:MMDébut de plage.
Heure d'arrêt — heure_arret_dimmerheureHH:MMFin de plage (badge « lendemain » si arrêt ≤ démarrage).
Température max — temperature_dimmernombre20–90 °CCoupure thermique pendant la plage.
Puissance — puissance_dimmernombre0–100 %Niveau forcé (dimmer uniquement).

Onglets « Relais 1/2/3 »

Mêmes champs heure_demarrage_relayN / heure_arret_relayN / temperature_relayN (20–90 °C), sans champ puissance. conditionnel onglets visibles selon has_relay1/2/3 et relays_visible_count ; un onglet trop gourmand pour la gamme affiche un badge (PRO/MAX/ULTRA) et un lien vers la Licence.

Chaque formulaire enregistre via /setminiteur?<prefix> (paramètres heure_demarrage, heure_arret, temperature, + puissance pour le dimmer) ; pré-rempli par /getminiteur?<prefix>. Bouton de réinitialisation par onglet.

Sonde requise. Si la sonde affectée à un organe est perdue, le bloc dimmer est bloqué (alerte rouge, champs désactivés) et le champ température d'un relais est désactivé (alerte orange). Lecture de dimmer_mqtt_lost, dimmer_sensor_lost, relayN_mqtt_lost, relayN_sensor_lost.

Écran « Sauvegardes »

Accès : menu › Sauvegardes. Sauvegarde/restaure la configuration complète (fichier ou MQTT), avec une zone dangereuse de réinitialisation.

Cartes & boutons

Bouton (id)EndpointRôle
Télécharger la sauvegarde — backup/config/export + /getminiteur?… + /stateConstruit et télécharge un fichier JSON (config, mqtt, sources, minuteurs).
Restaurer depuis un fichier — restoreBtn / restoreFilePOST /config/importCharge un .json et restaure les sections (avec _device_token).
Sauvegarder vers MQTT — mqttPush/mqttbackup/pushconditionnel actif si broker connecté.
Restaurer depuis MQTT — mqttPull/mqttbackup/pullRestaure puis redémarre (compte à rebours).
Auto-sauvegarde MQTT — mqttAutoToggle/get?mqtt_backup=&save=1Sauvegarde/restauration auto au boot/reconnexion.
Reset config (garde Wi-Fi) — eraseBtn/config/eraseRéinitialise la config en conservant le réseau.
Factory reset — eraseAllBtn/config/erase?all=1Efface tout (y compris Wi-Fi).
Effacer l'historique — eraseHistBtnPOST /history/clear?confirm=EFFACERVide l'historique 30 j (confirmation « EFFACER »).
Relancer le setup guidé — wizardResetBtn/wizard/resetconditionnel carte visible si wizard_enabled. Renvoie vers l'Assistant.

Zone dangereuse. Les boutons de réinitialisation sont irréversibles et demandent une confirmation. Le statut du broker (mqttStatusBadge) provient de /mqttbackup/status (connected, lastBackup).

Écran « Licence »

Accès : menu › Licence. Affiche la gamme et le matériel, permet d'activer une clé de licence pour débloquer une gamme supérieure, compare les 4 gammes et permet de revenir à la base eFuse.

Cartes & contrôles

Élément (id)TypeRôle
Gamme actuelleaffichageCarte, n° de série (si gravé), type de licence, gamme effective, capacité relais — depuis /state (tier, tier_base, tier_license_active, license_secret_injected, serial…).
Clé de licence — l_keytexteClé HMAC 51 caractères (compteur live l_key_count). Entrée = activation.
Comparaison des gammesaffichage4 cartes basic/pro/max/ultra ; liens « Passer à cette gamme » vers Mise à niveau.

Boutons : Activer (l_btn_activate) → POST /applylicense (lit ok, tier, ou code d'erreur err) ; Effacer la licence (l_btn_clear) → POST /clearlicense (double confirmation). conditionnel carte « Mode DIY » et activation désactivée si license_secret_injected est faux (DIY = tout débloqué).

Mise à niveau (upgrade.html) : page statique « bientôt disponible » expliquant ce que débloquent PRO/MAX/ULTRA et comment être prévenu de l'ouverture de la boutique. Atteinte depuis les cartes de gammes de la page Licence ; lit seulement /state pour la barre latérale.

Écran « Communauté »

Accès : menu › Communauté. Gère deux options indépendantes : les statistiques publiques anonymes (balise) et le relais cloud zero-knowledge (accès distant), plus le partage de localisation.

Cartes & contrôles

Champ (id)TypePlageRôle
Participer aux stats publiques — enabledcaseEnvoi anonyme à la balise communautaire.
Activer le relais cloud — cloud_enabledcaseconditionnel réservé MAX/ULTRA (cloud_allowed). Push chiffré lecture seule.
Cadence d'envoi — cloud_periodcurseur1–120 sImmédiat via /setcloud?push_period_s=.
Pays / Région — country / depttexteISO-2 / 6 car.Localisation grossière.
Apparaître sur la carte — share_geocaseRévèle un aperçu de coordonnées arrondies (±0,5°).
URL balise / relais — beacon_url / cloud_ingest_urltexte≤ 92 car.URLs des serveurs (avancé).

Boutons : Enregistrer (btnSave) → /setcommunity puis /setcloud ; Aperçu (btnPreview) → /community/preview ; Tester (btnTest) → /community/test ; Oublier (btnForget) → /community/forget ; Tester le cloud (btnCloudTest) → /cloud/test.

Bandeau cloud. 5 états selon /state : désactivé · aucune app appairée (cloud_claimed) · actif et synchronisé · erreur d'envoi (HTTP) · en attente du premier envoi (cloud_push_count). Statut détaillé via cloud_last_status.

Écran « Statistiques »

Accès : depuis le tableau de bord, l'historique ou la page Licence. Tableau de bord analytique : KPIs (auto-conso, CO₂, économies, score qualité), performance de régulation, courbes 60 s, records (mémoire navigateur), cumuls long terme, état de la chaîne et conseils. conditionnel réservé à la gamme MAX (ou DIY) ; sinon la page affiche un bandeau de mise à niveau et masque le contenu.

Page d'affichage (pas de formulaire) ; navigation par sommaire ancré. Sources : /state (interrogé chaque seconde : watt, pv_production, wh_today, puissance_route, delta/deltaneg, chaîne…), /modulator/chain (état des dimmers), /stats/cumul.json (cumuls : totals, months, current). Certaines valeurs (records, pics) sont stockées localement dans le navigateur.

Écran « Trophées »

Accès : depuis le tableau de bord. Grille de gamification : 50 exploits (10 catégories × 5 paliers), badges débloqués (avec date) et barres de progression vers les suivants. Un interrupteur darkSwitch bascule le thème sombre (mémorisé dans le navigateur).

Pas de formulaire. Données via /stats/trophies.json : mask (chaîne hex des badges débloqués), counters (compteurs de progression : kwh_routed, op_days, ecs65, deadzone_h, mesh_days…), unlocked (total), unlocks (dates). Les libellés viennent de /lang/<langue>.json.

Écran « Informations système »

Accès : menu › Informations système. Tableau en lecture seule : identité, matériel, mémoire, réseau, source d'énergie, MQTT, système, batterie et relais cloud optionnels — plus la fenêtre de mise à jour OTA.

Données affichées (/info, objet imbriqué)

BlocChamps
Identiténame, product_name, board, fw_build, fs_build, release, compile.
Matérielchip, revision, cores, freq_mhz, flash_size, psram_total, mac.
Mémoireheap_free, heap_total, heap_min, max_alloc, spiffs_used, spiffs_total.
Réseaumode, ssid, rssi, ip, gateway, subnet, dns.
Énergie / MQTT / Systèmemode_name, grid_w, prod_w · broker, connected, ha_discovery · uptime_ms, reset_reason.

conditionnel lignes eFuse (code, série, date, fabricant) si la puce est gravée ; cartes Batterie (si battery_enabled) et Relais cloud (si cloud_allowed/cloud_enabled). Un badge d'alerte signale un FS attendu différent du FS chargé.

Mise à jour OTA

Bouton Vérifier / Mettre à jour → fenêtre OTA : /ota/preflight (proxy), /ota/check (state_label, versions, changelog, tailles), puis POST /ota/apply et sondage /ota/status (machine d'états state_label : downloading → flashing → success). L'évènement SSE ota_status pousse aussi l'avancement.

Écran « Debug forensic »

Accès : menu › Debug. Diagnostic avancé : forensique du dernier crash, heap live, tâches FreeRTOS/mutex, pool TCP LwIP, cache mDNS, journal d'évènements et santé du pipeline HTTP sortant.

Contrôles & sources

Élément (id)EndpointRôle
Rafraîchir auto — autoRefresh + bouton Refreshtous les endpointsRecharge tout (intervalle 10 s).
Lignes — r_n/debug/ring?n=Taille du journal (30/50/100).
Niveau — r_lvl/debug/ringFiltre ERR/WRN/INF.

Endpoints : /debug/boot (dernier reboot), /debug/heap (now_free, now_frag_pct, history…), /debug/tasks (tasks, mutex_ok), /debug/mutex, /debug/ring (events), /debug/lwip_stats (pool TCP), /mdns/diag (cache mDNS), /debug/http_pipeline (santé HTTP sortant). conditionnel carte Batterie si battery_enabled.

Écran « Performance »

Accès : menu › Performance. Heap/système, batterie optionnelle, instantané réseau (LwIP + mDNS) et table de comptage par endpoint HTTP.

Source principale : /perf.json (heap : free/max_alloc/min/frag_pct/psram_free, uptime_ms, total_hits, endpoints : url/hits) interrogé toutes les 5 s. Complété par /debug/lwip_stats et /mdns/diag. Bouton Reset compteurs (btnReset) → /perf/reset ; case autoRefresh (5 s).

Écran « Console logs »

Accès : menu › Console logs. Visionneuse de la console série en direct : interrogation incrémentale du tampon, parsing des lignes [HH:MM:SS][NIV][TAG], coloration par niveau, filtres, pause, auto-scroll et téléchargement brut.

ContrôleRôle
Filtres ALL / INF / WRN / ERR / DBGMasquage côté client par niveau (data-filter).
Auto-scroll — scrollBtnSuit ou fige le défilement.
Pause — pauseBtnSuspend/reprend l'interrogation.
Vider / TéléchargerVide l'affichage / télécharge /log.txt.

Source. La console interroge /cs?c2=<id> toutes les 2 s : réponse texte brut (et non JSON) au format ID}1FLAG}1TEXTE — l'id de séquence permet la lecture incrémentale, le flag « 0 » signale une réinitialisation du tampon. Un indicateur (pollDot) montre l'état de l'interrogation.

Écran « Assistant de configuration »

Accès : au premier démarrage (servi à la place du tableau de bord jusqu'à la fin), ou relancé depuis Sauvegardes. Parcours guidé en 8 étapes, habillage plein écran propre, reprise à la dernière étape enregistrée.

ÉtapeContrôles (id)Endpoint de sauvegarde
1 · BienvenuewelcomeLang (fr/en), welcomeName (lecture seule)/setlanguage?lang=
2 · Restaurationradio restoreChoice, restoreFileInputPOST /config/import (optionnel)
3 · HeurentpServer, ntpTz, ntpTzCustom/applyntp?ntp_server=&ntp_timezone=
4 · Source d'énergiesourceMode (0–5), shellyIp/setsource?source= (+ /get?EM=&save=1 pour Shelly)
5 · Dimmer & chargedimmerEnable, dimmerCharge (0–10000 W), dimmerType/get?dimmerlocal=&charge1=&dimmer_type=&save=1
6 · MQTT (optionnel)mqttHost, mqttPort, mqttUser, mqttPass, mqttHA/applymqtt?…
7 · Communauté (optionnel)radio commChoice, commCountry, commDept/setcommunity?enabled=&country=&dept=
8 · Validationrécapitulatif recapBody/wizard/complete → redirige vers /

Navigation : Précédent / Suivant / Sauter (étapes optionnelles) / Mode expert (/wizard/complete). Chaque changement d'étape est persisté via /wizard/setstep?n=. L'état de reprise vient de /wizard/state (step, language, pvname, mode_source).

Référence vivante. Ce manuel décrit l'interface web du Watt-Guardian telle qu'embarquée dans le firmware. Les libellés exacts peuvent varier selon la langue choisie et la gamme de licence active ; les fonctions verrouillées restent visibles mais grisées. En cas de doute, l'écran Informations système indique la version exacte du firmware et du filesystem.