HC-Calc : ma calculatrice intelligente pour heures creuses

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: host est 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

ComposantChoix
BackendPython · Flask
FrontendHTML / CSS / JS vanilla — aucun framework
ConfigJSON fichier local
PolicesJetBrains Mono + Outfit (self-hosted)
DéploiementDocker 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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *