Préambule
Contrat Flex Zen Weekend, quatre bandes tarifaires… programmer le départ différé de son lave-linge sans se planter dans les calculs, c’est le genre de micro-problème quotidien qui finit par prendre plus de temps qu’il ne devrait.
La contrainte qui coince : les appareils n’acceptent un délai qu’en heures entières. Mais un programme 40° de lave-linge, c’est 1h15. Donc pour que la fin du cycle tombe en heure creuse après 13h et pendant le pic de production solaire, il faut programmer… combien ? 2h ? 3h ? À quelle heure ça finit exactement ? Multiplié par plusieurs appareils et des plages HC différentes selon les jours, ça devient vite pénible.
La réponse : une petite webapp locale, HC Calc — tu sélectionnes ton appareil et son programme, elle te dit directement « programme +3h de différé ».
Le projet s’intègre dans mon écosystème domotique maison, aux côtés de TeleInfo2MQTT, Daikin2MQTT et compagnie. Pas de cloud, pas de compte, tourne sur le NAS en container Docker.
Le problème en détail
Deux modes de programmation différée selon les appareils :
- Fin différée (lave-linge) : tu programmes l’heure à laquelle le cycle se termine. Idéal pour qu’il soit prêt le matin, mais la fin doit tomber en HC.
- Départ différé (lave-vaisselle) : tu programmes l’heure à laquelle le cycle démarre. C’est le début qui doit tomber en HC et aussi finir avant le retour en HP.
Et dans les deux cas, le délai est forcément en heures entières (1h, 2h, 3h… jusqu’à 12h selon les machines), alors que la durée réelle d’un programme inclut des minutes.
HC Calc prend en compte tout ça : il teste chaque délai de 1h à 12h et retourne le premier qui place le bon moment (départ ou fin) dans une plage HC.
Pré-requis
Avant de commencer, assure-toi d’avoir :
✔️ Un NAS Synology (ou n’importe quelle machine Linux) avec Docker.
✔️ Container Manager installé sur le NAS.
Etape par étape
Récupération des fichiers
Le projet est disponible sur GitHub :
mkdir -p ~/docker/hc-calc && cd ~/docker/hc-calc git clone https://github.com/nalexdouze/hc-calc.git
Ou télécharge l’archive ZIP directement depuis la page du repo et extrais-la dans ton dossier Docker.
Lancement du container
docker compose up -d
Le docker-compose.yml utilise l’image python:3.11-slim directement — pas de build, Flask est installé au premier démarrage :
services:
hc-calc:
image: python:3.11-slim
container_name: hc-calc
restart: unless-stopped
working_dir: /app
network_mode: host
command: >
sh -c "pip install --quiet flask &&
python app.py"
volumes:
- ./config.json:/app/config.json
- ./app.py:/app/app.py:ro
- ./templates:/app/templates:ro
- ./static:/app/static:ro
environment:
- TZ=Europe/Paris
Note :
network_mode: hostest nécessaire sur Synology pour que le container ait accès à internet lors de l’installation de Flask. Sur un environnement Docker standard avec accès réseau en mode bridge, tu peux retirer cette ligne.
L’application est ensuite accessible sur http://IP_DU_NAS:5050
Configuration via l’interface admin
L’interface d’administration est accessible sur /admin. Elle permet de :
- Activer/désactiver les appareils qui apparaissent sur la calculatrice
- Gérer les programmes de chaque appareil : nom et durée (H:mm)
- Configurer les plages HC : nom, heure de début et de fin — y compris les plages qui traversent minuit (ex: 22:00 → 06:00)
La configuration est sauvegardée dans config.json via un bouton ou le raccourci Ctrl+S.
Ajout sur l’écran d’accueil iOS
HC Calc est conçu pour être utilisé depuis le téléphone. Sur Safari :
Partager → Sur l’écran d’accueil
L’icône apple-touch-icon est incluse dans le projet pour un affichage propre.
Fonctionnement du moteur de calcul
Le cœur du projet est une vingtaine de lignes de JavaScript. Pour chaque délai de 1h à 12h :
Mode "fin différée" :
départ = maintenant + délai - durée programme
fin = maintenant + délai
→ on vérifie que "fin" est en HC
Mode "départ différé" :
départ = maintenant + délai
fin = maintenant + délai + durée programme
→ on vérifie que "départ" est en HC
La première valeur de délai (en heures entières) pour laquelle la condition est vraie est retournée. Les alternatives valides sont aussi affichées pour les prochaines heures.
Les plages HC traversant minuit sont gérées correctement : une plage 22:00→06:00 est testée avec un modulo 1440 minutes.
La stack
| Composant | Choix |
|---|---|
| Backend | Python · Flask |
| Frontend | HTML / CSS / JS vanilla — aucun framework |
| Config | JSON fichier local |
| Polices | JetBrains Mono + Outfit (self-hosted) |
| Déploiement | Docker Compose |
Pas de base de données, pas de node_modules, pas de build step. Le config.json est le seul fichier qui change au runtime, monté en volume pour persister entre les redémarrages.
Conclusion
L’interface se présente sous la forme d’un cadran 24h sur lequel les plages HC apparaissent en surbrillance, avec l’aiguille positionnée à l’heure actuelle. Le résultat est immédiat dès que tu changes d’appareil ou de programme.
Trois appareils configurés par défaut : lave-linge (fin différée), lave-vaisselle (départ différé), sèche-linge. Tu peux en ajouter autant que tu veux depuis l’admin, avec leurs programmes et durées réelles.
Le thème clair/sombre/auto est disponible et persisté localement — pratique quand on l’utilise depuis le téléphone en pleine nuit pour programmer la machine avant d’aller dormir 🌙
—
Repo GitHub : nalexdouze/hc-calc
