DIY my Dose is a universal liquid dosing controller built on Home Assistant and ESP32 (ESPHome). It controls up to 4 peristaltic pumps with automatic dosing, precise calibration, safety checks, alerts and statistics.
Designed for any liquid dosing use case : reef aquariums, freshwater tanks, hydroponics, plant care, brewing, DIY lab, and more. Each pump is fully configurable — name, schedule, frequency, compatibility with other pumps. No logic is imposed : you decide everything.
✅ Stable v1.0.7 — running on a real reef aquarium. Automatic dosing, hierarchical safety watchdog and safety locks fully operational. See the ROADMAP for upcoming features.
- Automatic dosing — configurable time window (start/end) per pump, or full 24h mode
- Clock-aligned scheduling — full day mode aligns doses to exact clock hours (e.g. 24 doses → every hour at :00)
- Auto-calculated interval — derived from window duration and requested frequency
- Manual dose — triggerable at any time from the dashboard
- Cycle reset option — manual dose can optionally shift the auto schedule
- Compatibility matrix — minimum delay between each pump pair (6 configurable pairs), offsets calculated automatically
- Mechanical delay — configurable delay between sequential doses (1–30s)
- Real-time validation — warning if window is too short for requested frequency
- Global pause — stops all pumps instantly
- 3-level HA watchdog — Soft (pump stop + warning) → Hard (all pumps stop + lock) → Lock (forced reset). Each level triggered at configurable multiples of dose duration (default ×2 / ×4 / ×8)
- ESP32 hardware watchdog — pump cut directly by the ESP32 at ×6 dose duration, even if Home Assistant crashes or WiFi is down
- Safety lock — system lock activated by hard/ESP32/lock watchdog. Blocks all dosing until manually unlocked from dashboard
- Per-pump overrides — each watchdog level can be configured globally or overridden per pump (expert mode)
- Hierarchy validation — sensor warns if multipliers are misconfigured (soft ≥ hard, etc.)
- Dose blocked notification — push notification when a dose is prevented by the safety lock
- Physical manual dose button — a hardware button on the ESP32 triggers a manual dose, works even without dashboard access (planned in v1.3.0)
- Simulation mode — test full timing and sequencing without affecting real data
- Configurable interval — simulate doses every 1–10 min
- Real pump toggle — optionally fire real pumps during simulation
- Auto-reload — automations reload automatically when simulation ends
- Tank management — remaining volume, % level, days remaining, low level alert per pump
- Statistics — weekly / monthly / yearly / total volumes, successful and missed doses
- 7-day graph — tank level history per pump (Mini Graph Card)
- Notifications — pump offline, low tank, missed dose (via HA mobile app)
- Calibration — real flow rate measurement (ml/s), auto-deactivates after run
- Full reset — clears all stats, preserves calibration, requires confirmation
- Simulation mode — test timing and sequencing at configurable intervals (1–10 min)
- Stats are fully protected (counters and tank volumes unchanged)
- Optional real pump trigger for hardware verification
- Red warning banner when active — impossible to forget
- Desktop + mobile dashboard — separate files, same features
- French and English — dashboard language set by file choice
- Free pump names — each pump has a user-defined label displayed throughout the UI
- Per-pump colors — via DMC theme CSS variables
| Domain | Pump 1 | Pump 2 | Pump 3 | Pump 4 |
|---|---|---|---|---|
| Reef aquarium | Kh | Ca | Mg | Phyto |
| Hydroponics | Nutrient A | Nutrient B | pH Up | pH Down |
| Indoor plants | N fertilizer | P fertilizer | K fertilizer | Booster |
| Brewing | Acid | Base | Additive 1 | Additive 2 |
| DIY lab | Solution 1 | Solution 2 | Solution 3 | Solution 4 |
Each pump has a free name, a free color, and its own independent dosing settings. No constraints tied to any specific domain.
The core logic — split into 5 files for readability:
| File | Role |
|---|---|
dmd_config.yaml |
All configurable parameters (names, doses, windows, delays, simulation...) |
dmd_sensors.yaml |
Calculated sensors (interval, next dose, window validation, tank levels...) |
dmd_scripts.yaml |
Triggerable actions (manual dose, calibration, tank reset, full reset...) |
dmd_stat.yaml |
Statistics (volumes, counters, timestamps, missed doses...) |
dmd_automations.yaml |
Automatic logic (schedules doses, sends alerts, handles compatibility delays...) |
These 5 files are identical regardless of language. No editing needed — everything is configured from the dashboard.
Defines the notify.dmd_admin service used for all alerts.
Lives in common/ so it can be shared with other projects on the same HA instance.
This is the only file you need to edit — just point it to your mobile device.
DIY my Dose uses CSS variables to colorize each pump. Without the theme, all card colors disappear.
| Theme variable | Used for |
|---|---|
p1-color |
Pump 1 color (hex) |
p2-color |
Pump 2 color (hex) |
p3-color |
Pump 3 color (hex) |
p4-color |
Pump 4 color (hex) |
p1-bg,p2-bg... are auto-generated transparent variants — do not edit them.
The theme is separate from the package so it can be reused by other projects. If you already use a custom theme, just paste the variables into it (see Installation).
Visual interface — reads the entities from the package files. Language is set by the file you choose. Copy only one to HA. Four files available:
| File | Language | Format |
|---|---|---|
dashboadmd_dmd_desktop_fr.yaml |
🇫🇷 Français | Desktop / PC |
dashboadmd_dmd_desktop_en.yaml |
🇬🇧 English | Desktop / PC |
dashboadmd_dmd_mobile_fr.yaml |
🇫🇷 Français | Mobile |
dashboadmd_dmd_mobile_en.yaml |
🇬🇧 English | Mobile |
Reference files for contributing dashboards in other languages. Do not upload to HA.
- ESP32 with ESPHome — 4 relay switches named
switch.dmd_pompe_1to_4 - Home Assistant 2023.x or higher
1. Enable packages and themes in configuration.yaml
homeassistant:
packages: !include_dir_named packages
frontend:
themes: !include_dir_merge_named themes2. Copy the package files
config/
└── packages/
├── common/
│ └── notify.yaml ← edit this: point to your mobile device
└── dmd/
├── dmd_config.yaml
├── dmd_stat.yaml
├── dmd_sensors.yaml
├── dmd_scripts.yaml
└── dmd_automations.yaml
3. Copy the theme
config/themes/dmc_theme.yaml
Already using a custom theme? No need to switch. Paste these variables into your existing theme:
p1-color: "#F5C518" # Pump 1 — yellow (default) p2-color: "#E8547A" # Pump 2 — pink (default) p3-color: "#4A9FD4" # Pump 3 — blue (default) p4-color: "#2ECC71" # Pump 4 — green (default) p1-bg: "rgba(245, 197, 24, 0.12)" p2-bg: "rgba(232, 84, 122, 0.12)" p3-bg: "rgba(74, 159, 212, 0.12)" p4-bg: "rgba(46, 204, 113, 0.12)" p1-bg-light: "rgba(245, 197, 24, 0.06)" p2-bg-light: "rgba(232, 84, 122, 0.06)" p3-bg-light: "rgba(74, 159, 212, 0.06)" p4-bg-light: "rgba(46, 204, 113, 0.06)"
4. Copy one dashboard
In HA: Settings → Dashboards → Add dashboard → paste YAML content
5. Restart Home Assistant
6. Activate the theme
User profile → Theme → DMC
7. First configuration
In the Settings view, configure each pump:
- Name (e.g. "Kh", "Nutrient A", "pH Up"...)
- Tank volume (ml)
- Daily dose (ml)
- Frequency (doses/day)
- Time window (start → end) or enable Full Day mode
- Compatibility delays between pump pairs
- Alert threshold (ml)
Then run a calibration before enabling automatic dosing.
Edit packages/common/notify.yaml to match your mobile device:
notify:
- platform: group
name: dmd_admin
services:
- service: mobile_app_your_deviceTranslation files are in translations/. To add a new language:
- Copy
translations/en.yaml - Translate the values
- Create the corresponding dashboard file
- Submit a pull request
The hardware design (peristaltic pump wiring, ESP32 setup) is based on a build originally published on Joy-Reef.com.
DIY my Dose is a complete software rewrite — the original used an Arduino with cloud connectivity. This project replaces that with a fully local ESP32 + ESPHome solution integrated into Home Assistant, with no cloud dependency.
If you know of earlier sources that inspired the Joy-Reef hardware design, please open an Issue so we can credit them properly.
Copyright (c) 2026 DIY Moi Ca
Personal use only — no commercial use, no redistribution without permission. See LICENSE for full terms.
Made with ❤️ for the DIY community — diymoica.com
DIY my Dose est un contrôleur de dosage liquide universel basé sur Home Assistant et ESP32 (ESPHome). Il pilote jusqu'à 4 pompes péristaltiques avec dosage automatique, calibration précise, sécurités, alertes et statistiques.
Conçu pour tout usage de dosage liquide : aquariophilie récifale, eau douce, hydroponie, plantes, brassage, laboratoire DIY, et bien plus. Chaque pompe est entièrement configurable — nom, plage horaire, fréquence, compatibilité avec les autres pompes. Aucune logique n'est imposée : vous décidez de tout.
⚠️ Pré-release — testé activement sur un aquarium récifal réel. Les fonctionnalités principales sont opérationnelles. Voir la ROADMAP pour ce qui arrive avant v1.0.0.
- Dosage automatique — fenêtre horaire (début/fin) configurable par pompe, ou mode 24h complet
- Planning aligné sur l'horloge — le mode jour entier aligne les doses aux heures exactes (ex : 24 doses → toutes les heures à :00)
- Intervalle calculé automatiquement — dérivé de la durée de fenêtre et de la fréquence demandée
- Dose manuelle — déclenchable à tout moment depuis le dashboard
- Option reset de cycle — une dose manuelle peut décaler le planning automatique
- Matrice de compatibilité — délai minimum entre chaque paire de pompes (6 paires configurables), offsets calculés automatiquement
- Délai mécanique — délai configurable entre doses séquentielles (1–30s)
- Validation en temps réel — alerte si la fenêtre est trop courte pour la fréquence demandée
- Pause globale — arrête toutes les pompes instantanément
- Watchdog HA 3 niveaux — Soft (arrêt pompe + warning) → Hard (arrêt toutes pompes + verrou) → Verrou (reset forcé). Chaque niveau déclenché à un multiple configurable de la durée de dose (défaut ×2 / ×4 / ×8)
- Watchdog hardware ESP32 — coupure directe par l'ESP32 à ×6 durée de dose, même si Home Assistant plante ou si le WiFi est coupé
- Verrou de sécurité — verrou système activé par le watchdog hard/ESP32/verrou. Bloque tout dosage jusqu'au déverrouillage manuel depuis le dashboard
- Overrides par pompe — chaque niveau de watchdog est configurable globalement ou par pompe (mode expert)
- Validation de hiérarchie — sensor d'alerte si les multiplicateurs sont mal configurés (soft ≥ hard, etc.)
- Notification dose bloquée — notification push quand une dose est empêchée par le verrou de sécurité
- Bouton de dose manuelle physique — un bouton hardware sur l'ESP32 déclenche une dose manuelle, fonctionne même sans accès au dashboard (prévu en v1.3.0)
- Mode simulation — testez le timing complet sans affecter les données réelles
- Intervalle configurable — simulez les doses toutes les 1–10 min
- Toggle pompes réelles — déclenchez optionnellement les vraies pompes en simulation
- Rechargement auto — les automations se rechargent automatiquement à la fin de la simulation
- Gestion des réservoirs — volume restant, % niveau, jours restants, alerte seuil bas par pompe
- Statistiques — volumes semaine / mois / année / total, doses réussies et manquées
- Graphique 7 jours — historique des niveaux réservoirs par pompe (Mini Graph Card)
- Notifications — pompe hors ligne, réservoir bas, dose manquée (via app mobile HA)
- Calibration — mesure du débit réel (ml/s), désactivation automatique après la mesure
- Reset complet — efface toutes les stats, préserve la calibration, confirmation requise
- Mode simulation — testez le timing et l'enchaînement à intervalle configurable (1–10 min)
- Stats entièrement protégées (compteurs et volumes réservoirs inchangés)
- Déclenchement réel des pompes optionnel (pour vérification hardware)
- Bannière rouge visible quand actif — impossible d'oublier
- Dashboard desktop + mobile — fichiers séparés, mêmes fonctionnalités
- Français et anglais — la langue est définie par le fichier de dashboard choisi
- Noms libres par pompe — label personnalisé affiché dans toute l'interface
- Couleurs par pompe — via les variables CSS du thème DMC
| Domaine | Pompe 1 | Pompe 2 | Pompe 3 | Pompe 4 |
|---|---|---|---|---|
| Aquariophilie récifale | Kh | Ca | Mg | Phyto |
| Hydroponie | Nutriment A | Nutriment B | pH Up | pH Down |
| Plantes d'intérieur | Engrais N | Engrais P | Engrais K | Stimulateur |
| Brassage | Acide | Base | Additif 1 | Additif 2 |
| Laboratoire | Solution 1 | Solution 2 | Solution 3 | Solution 4 |
Chaque pompe a un nom libre, une couleur libre, et ses propres réglages de dosage indépendants. Aucune contrainte liée à un domaine d'application spécifique.
Le cœur du projet — découpé en 5 fichiers pour rester lisible :
| Fichier | Rôle |
|---|---|
dmd_config.yaml |
Tous les paramètres configurables (noms, doses, fenêtres, délais, simulation...) |
dmd_sensors.yaml |
Les capteurs calculés (intervalle, prochaine dose, validation fenêtre, niveaux...) |
dmd_scripts.yaml |
Les actions déclenchables (dose manuelle, calibration, reset réservoir, reset total...) |
dmd_stat.yaml |
Les statistiques (volumes, compteurs, horodatages, doses manquées...) |
dmd_automations.yaml |
La logique automatique (planifie les doses, envoie les alertes, gère les délais...) |
Ces 5 fichiers sont identiques quelle que soit la langue choisie. Aucune modification nécessaire — tout se configure depuis le dashboard.
Définit le service notify.dmd_admin utilisé pour toutes les alertes.
Dans common/ pour pouvoir être partagé avec d'autres projets sur le même HA.
C'est le seul fichier à modifier — indiquez simplement votre appareil mobile.
DIY my Dose utilise des variables CSS pour coloriser chaque pompe. Sans le thème, toutes les couleurs disparaissent.
| Variable dans le thème | Utilisation |
|---|---|
p1-color |
Couleur de la pompe 1 (hex) |
p2-color |
Couleur de la pompe 2 (hex) |
p3-color |
Couleur de la pompe 3 (hex) |
p4-color |
Couleur de la pompe 4 (hex) |
p1-bg,p2-bg... sont des variantes transparentes calculées automatiquement — ne pas les modifier.
Le thème est séparé du package pour pouvoir être réutilisé par d'autres projets. Si vous utilisez déjà un thème personnalisé, copiez simplement les variables dedans (voir Installation).
Interface visuelle — lit les entités créées par les fichiers package. La langue est définie par le fichier choisi. N'en copier qu'un seul sur HA. Quatre fichiers disponibles :
| Fichier | Langue | Format |
|---|---|---|
dashboadmd_dmd_desktop_fr.yaml |
🇫🇷 Français | Desktop / PC |
dashboadmd_dmd_desktop_en.yaml |
🇬🇧 English | Desktop / PC |
dashboadmd_dmd_mobile_fr.yaml |
🇫🇷 Français | Mobile |
dashboadmd_dmd_mobile_en.yaml |
🇬🇧 English | Mobile |
Fichiers de référence pour contribuer des dashboards dans d'autres langues. Ne pas uploader sur HA.
- ESP32 avec ESPHome — 4 relais nommés
switch.dmd_pompe_1à_4 - Home Assistant 2023.x ou supérieur
1. Activer les packages et thèmes dans configuration.yaml
homeassistant:
packages: !include_dir_named packages
frontend:
themes: !include_dir_merge_named themes2. Copier les fichiers package
config/
└── packages/
├── common/
│ └── notify.yaml ← à modifier : indiquer votre appareil mobile
└── dmd/
├── dmd_config.yaml
├── dmd_stat.yaml
├── dmd_sensors.yaml
├── dmd_scripts.yaml
└── dmd_automations.yaml
3. Copier le thème
config/themes/dmc_theme.yaml
Vous utilisez déjà un thème personnalisé ? Pas besoin d'en changer. Collez ces variables dans votre thème existant :
p1-color: "#F5C518" # Pompe 1 — jaune (défaut) p2-color: "#E8547A" # Pompe 2 — rose (défaut) p3-color: "#4A9FD4" # Pompe 3 — bleu (défaut) p4-color: "#2ECC71" # Pompe 4 — vert (défaut) p1-bg: "rgba(245, 197, 24, 0.12)" p2-bg: "rgba(232, 84, 122, 0.12)" p3-bg: "rgba(74, 159, 212, 0.12)" p4-bg: "rgba(46, 204, 113, 0.12)" p1-bg-light: "rgba(245, 197, 24, 0.06)" p2-bg-light: "rgba(232, 84, 122, 0.06)" p3-bg-light: "rgba(74, 159, 212, 0.06)" p4-bg-light: "rgba(46, 204, 113, 0.06)"
4. Copier un dashboard
Dans HA : Paramètres → Tableaux de bord → Ajouter → coller le contenu YAML
5. Redémarrer Home Assistant
6. Activer le thème
Profil utilisateur → Thème → DMC
7. Premier paramétrage
Dans la vue Réglages, configurer chaque pompe :
- Nom (ex : "Kh", "Nutriment A", "pH Up"...)
- Volume du réservoir (ml)
- Dose quotidienne (ml)
- Fréquence (doses/jour)
- Fenêtre horaire (début → fin) ou activer le mode Jour Entier
- Délais de compatibilité entre paires de pompes
- Seuil d'alerte (ml)
Puis lancer une calibration avant d'activer le dosage automatique.
Modifier packages/common/notify.yaml :
notify:
- platform: group
name: dmd_admin
services:
- service: mobile_app_votre_appareilLes fichiers de traduction sont dans translations/. Pour ajouter une nouvelle langue :
- Copier
translations/en.yaml - Traduire les valeurs
- Créer le dashboard correspondant
- Soumettre une pull request
Le montage électronique (câblage des pompes péristaltiques, configuration ESP32) est basé sur un montage publié à l'origine sur Joy-Reef.com.
DIY my Dose est une réécriture logicielle complète — le montage original utilisait un Arduino avec une connexion cloud. Ce projet le remplace par une solution entièrement locale ESP32 + ESPHome intégrée à Home Assistant, sans aucune dépendance cloud.
Si vous connaissez des sources antérieures qui ont inspiré le montage Joy-Reef, signalez-le via Issues pour qu'on puisse les créditer correctement.
Copyright (c) 2026 DIY Moi Ca
Usage personnel uniquement — pas d'usage commercial, pas de redistribution sans autorisation. Voir LICENSE pour les conditions complètes.
Fait avec ❤️ pour la communauté DIY — diymoica.com