Skip to content

About

Dashboard de supervision temps réel pour batteries Indevolt — SolidFlex, BK1600. Option : OpenDTU. Local, sans cloud, Docker ready.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Repository files navigation

⚡ Indevolt Dashboard

Version Docker License Nginx Standalone

Dashboard de supervision temps réel pour batteries Indevolt / C3 Techno
SolidFlex 2000 ECO · SFA1800 · Micro-onduleurs Homiles via OpenDTU

📦 Installation · ⚙️ Configuration · 📖 Onglets · 🐳 Docker · ❓ FAQ


📸 Aperçu

Indevolt Dashboard — Onglet Live

Onglet Temps réel — Flux d'énergie avec sélecteur de modèle. De gauche à droite : nœuds sources/charges, hub batterie central avec SOC et tendance, métriques clés en bas.

Navigation multi-onglets :


✨ Fonctionnalités

Catégorie Fonctionnalité
📡 Temps réel Polling toutes les 30s · Flux d'énergie animé · SOC avec tendance · Seuil flux réseau 10W
🔋 Batteries Contrôle mode direct · Planificateur horaire visuel drag & drop · Forçage charge/décharge
☀️ Solaire Micro-onduleurs OpenDTU (HM-400, HM-800) · Prévision forecast.solar · Météo Open-Meteo
📊 Historique Graphiques 7j avec zoom · Historique 30j multi-sélection avec barres groupées · Comparaison N vs N-1
📋 Journal Détection coupures réseau, bypass, alertes SOC/temp · Export PDF horodaté
💾 Persistance Stockage serveur via sidecar Python (survit aux rechargements de page)
🎨 Thème Mode clair / sombre / auto (suit le système) · Bascule en un clic dans le header
📱 Responsive Mobile complet · Bottom nav fixe · Swipe entre onglets · Pinch-to-zoom

🚀 Installation rapide

Prérequis

  • Docker Engine ≥ 20.x
  • Docker Compose v2
  • Accès réseau local à votre monitoring onduleur 5openDtu) et à la batterie Indevolt (même sous-réseau)

1. Cloner le dépôt

git clone https://github.com/struppy/indevolt-dashboard.git
cd indevolt-dashboard

2. Lancer les conteneurs

mkdir -p data/store
docker compose up -d

3. Ouvrir le dashboard

http://VOTRE_IP_SERVEUR:8480

✅ Le dashboard est accessible depuis n'importe quel navigateur sur votre réseau local.


⚙️ Configuration

🔑 Paramètres obligatoires

Ces paramètres sont à renseigner dans l'interface (onglet ⚙️ Paramètres), ou peuvent être pré-configurés en éditant html/index.html avant le premier lancement.

Connexion onduleur

Paramètre Valeur par défaut Description
Adresse IP 192.168.1.71 IP locale de votre onduleur Indevolt
Port 8080 Port HTTP de l'API locale
Modèle SolidFlex ECO Voir modèles supportés ci-dessous

Modèles supportés

Modèle Description
SolidFlex 2000 ECO (sans MPPT) Mode ECO sans entrée solaire directe
SolidFlex 2000 ECO + OpenDTU Mode ECO avec micro-onduleurs HM-400/HM-800 via OpenDTU
SolidFlex 2000 / PowerFlex 2000 (avec MPPT) Avec contrôleur MPPT intégré
BK1600 / BK1600 Ultra Gamme BK1600

🌤️ Paramètres optionnels

Localisation météo & solaire

Paramètre Défaut Description
Latitude 48.5734 Latitude de l'installation (Strasbourg par défaut)
Longitude 7.7521 Longitude de l'installation
Puissance crête PV 2000 W Somme des puissances des micro-onduleurs
Inclinaison panneaux 35° Angle d'inclinaison du toit
Azimuth 0° Orientation (0° = plein sud, -90° = est, +90° = ouest)

Alertes

Paramètre Défaut Description
Seuil SOC alerte 20% Notification batterie faible
Seuil température 45°C Alerte surchauffe batterie
Limite export réseau 500 W Alerte dépassement export

Tarifs électricité

Paramètre Défaut Description
Prix import 0.2516 €/kWh Tarif EDF/fournisseur import
Prix export 0.13 €/kWh Tarif rachat surplus

🔧 OpenDTU (micro-onduleurs)

Si vous utilisez des micro-onduleurs avec OpenDTU :

  1. Activer OpenDTU dans Paramètres → renseigner l'IP de votre passerelle OpenDTU
  2. C'est tout — aucune modification de code requise

Le dashboard interroge automatiquement l'API OpenDTU (/api/livedata/status) et détecte tous les onduleurs déclarés dans OpenDTU. Ajouter ou retirer un onduleur dans OpenDTU se reflète au prochain poll (~30 s), sans toucher à index.html.

💡 Si un onduleur ne remonte pas de données AC/DC détaillées, le dashboard affiche une estimation proportionnelle à sa limite de puissance (indiqué visuellement).


📖 Onglets

⚡ Live — Tableau de bord principal

Vue synthétique de l'installation en temps réel.

Ce que vous voyez :

  • Flux d'énergie : diagramme avec les 4 nœuds (Solaire, Sortie AC, Réseau, Sortie BKP) reliés au hub batterie central
  • Hub batterie : SOC en anneau coloré (vert > 60%, orange > 30%, rouge < 30%), puissance instantanée, tendance SOC sur 5 minutes
  • Métriques : Production solaire · Consommation totale · Import/Export réseau · Autonomie estimée · Économies du jour · Taux d'autoconsommation
  • Mode opérationnel actif (Autoconsommation / Charge / Décharge / Programmé)

Indicateurs d'état :

  • 🟢 Connecté — données fraîches
  • 🟡 Données anciennes — connexion instable
  • 🔴 Hors ligne — onduleur injoignable

🔋 Batteries — Contrôle & planification

Contrôle complet du mode de fonctionnement et suivi de santé.

Contrôle rapide :

  • Boutons directs : Autoconsommation / Contrôle temps réel / Programmé

Planificateur horaire visuel :

  • Timeline 24h avec créneaux colorés par mode
  • Clic sur la timeline → ajoute un créneau
  • Glisser-déposer pour déplacer · Handles pour redimensionner
  • Snap automatique à 30 minutes
  • 4 modes : Autoconsommation 🟢 · Charge forcée 🔵 · Décharge forcée 🟠 · Programmé 🟣
  • SOC cible par créneau (arrêt automatique quand atteint)

Forçage immédiat :

  • ⬆ Forcer charge jusqu'à X% SOC
  • ⬇ Forcer décharge jusqu'à Y% SOC
  • Arrêt automatique dès que le SOC cible est atteint

Suivi santé :

  • Compteur de cycles (estimation sur 6 000 cycles de vie)
  • Courbe de dégradation SOC max sur 60 jours
  • Projection durée de vie restante

☀️ Solaire — Production & prévisions

Supervision des micro-onduleurs et prévision météo.

Micro-onduleurs (OpenDTU) :

  • État de chaque onduleur (En ligne / Hors ligne)
  • Puissance AC instantanée · Production du jour
  • Température · RSSI WiFi · Taux de succès radio

Prévision forecast.solar :

  • Production estimée en kWh pour aujourd'hui, demain et J+2
  • Courbe horaire de production prévue
  • Basé sur la position réelle des panneaux (inclinaison + azimuth)

Météo Open-Meteo :

  • Icônes météo WMO sur 3 jours
  • Température min/max · Précipitations
  • Rayonnement horaire (W/m²)

Paramètres PV directement dans l'onglet :

  • Puissance crête, inclinaison, azimuth → mise à jour immédiate des prévisions

📊 Historique — Graphiques & tendances

Analyse des données sur 7 jours et 30 jours.

Graphique temps réel (7 jours) :

  • 4 courbes : SOC · Production solaire · Puissance batterie · Échanges réseau
  • Zoom : boutons 5min / 10min / 15min / 30min / 1h / 2h
  • Molette souris sur le graphique pour zoomer
  • Pinch-to-zoom sur mobile
  • Buffer 6h de données (point toutes les 30s)

Historique 30 jours :

  • Graphique barres avec multi-sélection : combinez Production / Import / Export / Charge / Décharge
  • Barres groupées côte à côte par jour — chaque catégorie a sa couleur dédiée
  • Sélecteur de plage : 7j / 14j / 30j ou dates personnalisées

Comparaison hebdomadaire :

  • Semaine N vs semaine N-1
  • Tableau d'évolution avec flèches colorées (↑ mieux · ↓ moins bien)

Export :

  • Rapport mensuel HTML téléchargeable (imprimable en PDF)

🎨 Thème — Mode clair / sombre

Choisissez l'apparence du dashboard selon vos préférences.

Mode Comportement
🌓 Auto Suit automatiquement les préférences de votre système (macOS / Windows / Android)
🌙 Sombre Thème sombre original — fond #0a0d0f, accents verts
☀️ Clair Thème clair optimisé — contrastes WCAG AA, graphiques adaptés

Changer de thème :

  • Bouton 🌓 dans le header — cycle Auto → Sombre → Clair en un clic
  • Onglet Paramètres — sélecteur avec sauvegarde persistante

Les graphiques Canvas s'adaptent automatiquement : grilles, labels et légendes passent du blanc au noir selon le thème actif.


📡 API — Documentation

Référence des endpoints disponibles :

  • API locale Indevolt (registres Modbus)
  • Proxy nginx (routes disponibles)
  • Endpoints sidecar Python (stockage persistant)
  • Exemples de requêtes curl

📋 Logs — Journal d'événements

Traçabilité complète de l'installation.

Détection automatique :

Événement Sévérité
⚡ Coupure réseau (tension < 50V) 🔴 Critique
⚡ Retour réseau ℹ️ Info
↔ Passage en bypass ⚠️ Avertissement
🔋 Franchissement seuil SOC bas ⚠️ Avertissement
🔋 SOC critique (< 10%) 🔴 Critique
🌡 Dépassement seuil température 🔴 Critique
⚙ Changement de mode opérationnel ℹ️ Info
🔗 Connexion/déconnexion ℹ️ Info
📅 Activation créneau planifié ℹ️ Info

Fonctionnalités :

  • Filtre par type d'événement
  • Badge rouge sur l'onglet en cas d'alerte
  • Persistance serveur (survit aux rechargements)
  • Export PDF horodaté avec tableau complet

⚙️ Paramètres

Tous les réglages de l'installation :

  • Installation : IP, port, modèle, capacité (Wh), limite export réseau
  • OpenDTU (activation, IP passerelle)
  • Localisation météo (lat/lon)
  • Alertes (SOC, température, alerte sonore)
  • Tarifs électricité (import/export)
  • Mode nuit (horaires automatiques)
  • Thème clair / sombre / auto
  • Notifications push navigateur
  • Compteur de cycles (date de départ, cycles initiaux)

🐳 Docker

Structure des fichiers

indevolt-dashboard/
├── docker-compose.yml      # Orchestration nginx + sidecar Python
├── nginx/
│   └── default.conf        # Proxy inverse + routes API
├── html/
│   └── index.html          # Dashboard (fichier unique ~330 KB)
├── settings_api.py         # Sidecar Python — persistance données
├── data/
│   └── store/              # Données JSON (créé automatiquement)
├── .gitignore
└── README.md

docker-compose.yml

version: '3.8'
services:
  nginx:
    image: nginx:alpine
    ports:
      - "8480:80"
    volumes:
      - ./html:/usr/share/nginx/html:ro
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - settings-api
    restart: unless-stopped

  settings-api:
    image: python:3.11-alpine
    working_dir: /app
    volumes:
      - ./settings_api.py:/app/settings_api.py:ro
      - ./data:/data:rw
    command: python settings_api.py
    restart: unless-stopped

Commandes utiles

# Démarrer
docker compose up -d

# Voir les logs
docker compose logs -f

# Redémarrer après modification de index.html
docker compose restart nginx

# Arrêter
docker compose down

# Arrêter et supprimer les données
docker compose down -v

Ports utilisés

Port Service Description
8480 nginx Dashboard web (accès navigateur)
8081 settings-api API Python interne (non exposé hors Docker)

🔒 Sécurité

  • Le proxy nginx est configuré pour n'autoriser que les IPs du sous-réseau 192.168.1.x — il refuse les requêtes vers d'autres destinations (protection SSRF)
  • Aucune donnée n'est envoyée vers l'extérieur sauf :
    • api.open-meteo.com — météo (pas de clé API)
    • api.forecast.solar — prévision production (pas de clé API)
  • Le dashboard est conçu pour un usage LAN uniquement — ne pas exposer sur internet sans authentification
  • Depuis la v2.2.1, les endpoints /api/, /indevolt-api/ et /opendtu-api/ ne renvoient plus d'en-têtes CORS permissifs (Access-Control-Allow-Origin: *) : ils ne sont accessibles qu'en same-origin, ce qui empêche un site tiers de lire/écrire les réglages ou de piloter l'onduleur via le navigateur d'un utilisateur du réseau

❓ FAQ

Le dashboard affiche "Non connecté" en permanence

Vérifiez que l'IP de l'onduleur est correcte dans Paramètres. Vérifiez que le serveur Docker est sur le même sous-réseau que l'onduleur. Testez curl http://IP_ONDULEUR:8080/Indevolt.GetData depuis le serveur.

Les micro-onduleurs affichent 0 W

Activez OpenDTU dans Paramètres et renseignez l'IP de votre passerelle OpenDTU. Les onduleurs sont détectés automatiquement — vérifiez qu'ils sont bien déclarés dans l'interface OpenDTU.

La prévision solaire semble incorrecte

Ajustez la puissance crête (W), l'inclinaison et l'azimuth dans l'onglet Solaire. Ces 3 paramètres sont essentiels pour forecast.solar.

L'historique se vide après redémarrage

Vérifiez que le volume ./data:/data:rw est bien monté dans docker-compose.yml et que le dossier data/store/ existe sur l'hôte.


🔄 Mise à jour

git pull
docker compose restart nginx

Les données persistantes dans data/store/ ne sont pas affectées.


📋 Changelog

v2.2.2 — 2026-08-03

  • 🐛 Fix cycles batterie fiables — le compteur de cycles de charge estimés restait bloqué à 0 et n'évoluait jamais : la fonction de détection de cycle n'était jamais appelée depuis la boucle de traitement des données, et le suivi de charge en cours vivait uniquement en mémoire du navigateur (perdu à chaque rechargement de page). Le calcul tourne désormais en continu côté sidecar Python (settings-api), indépendamment de tout onglet ouvert
  • 🐛 Fix compteur de cycles initial ("Cycles au départ") : la valeur saisie dans les paramètres n'était jamais sauvegardée (handlers oninput/onchange manquants sur les champs)

v2.2.1 — 2026-07-07

  • 🔒 Correctif sécurité critique — suppression du CORS wildcard (Access-Control-Allow-Origin: *) sur settings_api.py et les proxys nginx (/api/, /indevolt-api/, /opendtu-api/) : un site tiers pouvait lire/écrire les réglages et piloter l'onduleur depuis le navigateur d'un utilisateur du réseau
  • 🐛 Fix XSS stockée dans le journal d'événements (registre onduleur non reconnu injecté sans échappement)
  • 🐛 Fix XSS dans le visualiseur JSON de l'onglet API tester
  • 🐛 Fix XSS via le numéro de série des packs batterie (SFA1800) non échappé
  • 🐛 Fix inv.limit (OpenDTU) non coercé en nombre avant affichage

Voir CHANGELOG.md pour le détail complet.

v2.2 — 2026-03-27

  • 🗑️ Suppression onglet Comparatif — fonctionnalité multi-installations retirée (complexité architecturale incompatible avec un déploiement mono-site ; voir contexte)
  • ✨ Paramètres installation unique — IP, port, modèle, capacité, limite export regroupés dans une section dédiée, synchronisés avec le live panel
  • 🐛 Fix bandeau live — select modèle mis à jour en temps réel sans F5
  • 🐛 Fix onglet API — bouton Indevolt cliquable, raccourcis restaurés, IP correcte

v2.1 — 2026-03-24

  • ✨ Thème clair/sombre/auto — bascule header + sélecteur Paramètres, graphiques Canvas adaptatifs
  • ✨ Historique multi-sélection — barres groupées côte à côte, légende colorée par catégorie
  • 🐛 Fix graphiques vides à l'ouverture de l'onglet Historique (canvas invisible au chargement)
  • 🐛 Fix seuil flux réseau abaissé 50W → 10W (point animé plus réactif)
  • 🐛 Fix prix export à 0€ accepté (n'était pas sauvegardé)
  • 🌍 Dates au format dd-mm-yyyy partout (graphiques, CSV, noms de fichiers, rapports)
  • 🧹 Suppression du graphique 7j redondant dans l'onglet Paramètres

v2.0

  • Multi-installations, planificateur drag & drop, journal d'événements, comparatif hebdomadaire
  • Forecast.solar, météo Open-Meteo, OpenDTU
  • Persistance serveur via sidecar Python

ℹ️ Pourquoi la suppression du Comparatif

L'onglet Comparatif permettait de superviser plusieurs onduleurs Indevolt en parallèle depuis un seul dashboard. Cette fonctionnalité a été retirée en v2.2 pour les raisons suivantes :

  • Complexité architecturale : la gestion multi-installations (paramètres globaux vs par installation, synchronisation du state, cycle de sauvegarde) générait des effets de bord difficiles à maîtriser — installations non persistées après reload, sélecteur non rafraîchi, paramètres écrasés.

  • Usage mono-site : le dashboard est typiquement déployé sur un serveur dédié à une installation physique unique. La comparaison multi-sites ne correspond pas au besoin opérationnel courant.

  • Maintenabilité : la dette technique accumulée rendait toute évolution risquée. Une suppression propre vaut mieux qu'un code fragile maintenu sous perfusion.

Si vous avez un besoin réel de supervision multi-sites, la solution recommandée est de déployer une instance du dashboard par onduleur, accessibles depuis des ports différents.


📄 Licence

MIT — Libre d'utilisation, modification et distribution.


Fait avec ☕ pour la communauté Indevolt / C3 Techno

Ce projet n'est pas affilié à C3 Techno — utilisation de l'API locale à vos risques et périls

About

Dashboard de supervision temps réel pour batteries Indevolt — SolidFlex, BK1600. Option : OpenDTU. Local, sans cloud, Docker ready.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages