feat(i18n): Add French and Spanish translations
This commit is contained in:
parent
5971fde145
commit
7597f5ddc0
|
|
@ -1,4 +1,4 @@
|
||||||
🇩🇪 Deutsch | [🇬🇧 English](README.md)
|
🇩🇪 Deutsch | [🇬🇧 English](README.md) | [🇫🇷 Français](README.fr.md) | [🇪🇸 Español](README.es.md)
|
||||||
|
|
||||||
# Modulares Bewässerungssystem
|
# Modulares Bewässerungssystem
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
[🇩🇪 Deutsch](README.de.md) | [🇬🇧 English](README.md) | [🇫🇷 Français](README.fr.md) | 🇪🇸 Español
|
||||||
|
|
||||||
|
# Sistema de riego modular
|
||||||
|
|
||||||
|
Este proyecto implementa un sistema de riego inteligente y modular controlado a través de Home Assistant.
|
||||||
|
|
||||||
|
## Documentación
|
||||||
|
|
||||||
|
La documentación detallada se puede encontrar en el directorio [`docs/`](./docs/):
|
||||||
|
|
||||||
|
* **[Concepto](./docs/concept.es.md)**: Describe la arquitectura del sistema, los componentes utilizados y las decisiones de diseño básicas.
|
||||||
|
* **[Registros MODBUS](./docs/modbus-registers.es.md)**: Define el mapa de registros para la comunicación con los nodos esclavos.
|
||||||
|
* **[Plan del proyecto](./docs/planning.es.md)**: Contiene el plan de desarrollo e implementación.
|
||||||
|
|
||||||
|
## Inicio rápido
|
||||||
|
|
||||||
|
* **Hardware**: Los archivos KiCad para el hardware se encuentran en el directorio [`hardware/`](./hardware/).
|
||||||
|
* **Software**: El firmware basado en Zephyr para los nodos esclavos se encuentra en el directorio [`software/`](./software/).
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
[🇩🇪 Deutsch](README.de.md) | [🇬🇧 English](README.md) | 🇫🇷 Français | [🇪🇸 Español](README.es.md)
|
||||||
|
|
||||||
|
# Système d'irrigation modulaire
|
||||||
|
|
||||||
|
Ce projet met en œuvre un système d'irrigation intelligent et modulaire contrôlé via Home Assistant.
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
La documentation détaillée se trouve dans le répertoire [`docs/`](./docs/) :
|
||||||
|
|
||||||
|
* **[Concept](./docs/concept.fr.md)** : Décrit l'architecture du système, les composants utilisés et les décisions de conception de base.
|
||||||
|
* **[Registres MODBUS](./docs/modbus-registers.fr.md)** : Définit la carte des registres pour la communication avec les nœuds esclaves.
|
||||||
|
* **[Plan du projet](./docs/planning.fr.md)** : Contient le plan de développement et de mise en œuvre.
|
||||||
|
|
||||||
|
## Démarrage rapide
|
||||||
|
|
||||||
|
* **Matériel** : Les fichiers KiCad pour le matériel se trouvent dans le répertoire [`hardware/`](./hardware/).
|
||||||
|
* **Logiciel** : Le firmware basé sur Zephyr pour les nœuds esclaves se trouve dans le répertoire [`software/`](./software/).
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
[🇩🇪 Deutsch](README.de.md) | 🇬🇧 English
|
[🇩🇪 Deutsch](README.de.md) | 🇬🇧 English | [🇫🇷 Français](README.fr.md) | [🇪🇸 Español](README.es.md)
|
||||||
|
|
||||||
# Modular Irrigation System
|
# Modular Irrigation System
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
🇩🇪 Deutsch | [🇬🇧 English](concept.en.md)
|
🇩🇪 Deutsch | [🇬🇧 English](concept.en.md) | [🇫🇷 Français](concept.fr.md) | [🇪🇸 Español](concept.es.md)
|
||||||
|
|
||||||
# Konzept: Modulares Bewässerungssystem
|
# Konzept: Modulares Bewässerungssystem
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
[🇩🇪 Deutsch](concept.de.md) | 🇬🇧 English
|
[🇩🇪 Deutsch](concept.de.md) | 🇬🇧 English | [🇫🇷 Français](concept.fr.md) | [🇪🇸 Español](concept.es.md)
|
||||||
|
|
||||||
# Concept: Modular Irrigation System
|
# Concept: Modular Irrigation System
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,75 @@
|
||||||
|
[🇩🇪 Deutsch](concept.de.md) | [🇬🇧 English](concept.en.md) | [🇫🇷 Français](concept.fr.md) | 🇪🇸 Español
|
||||||
|
|
||||||
|
# Concepto: Sistema de riego modular
|
||||||
|
|
||||||
|
Este documento describe el concepto de un sistema de riego modular e inteligente, controlado de forma centralizada a través de Home Assistant.
|
||||||
|
|
||||||
|
## 1. Descripción general de la arquitectura
|
||||||
|
|
||||||
|
El sistema se divide en tres capas lógicas para garantizar una alta flexibilidad y mantenibilidad:
|
||||||
|
|
||||||
|
1. **Capa de control (Home Assistant):** Toda la lógica, las automatizaciones y la interfaz de usuario residen en Home Assistant. Este es el "cerebro" del sistema.
|
||||||
|
2. **Capa de puerta de enlace (ESP32):** Un puro traductor de protocolos que actúa como puente entre la red doméstica (WLAN/Thread) y el sistema de bus físico de la planta. No contiene lógica de control propia.
|
||||||
|
3. **Capa de actuadores/sensores (nodos esclavos):** Módulos robustos y especializados que se controlan a través de un bus y realizan las tareas reales (conmutación de válvulas, lectura de sensores).
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 2. Componentes del sistema
|
||||||
|
|
||||||
|
* **Depósito de agua:** Un contenedor IBC sirve como depósito de agua.
|
||||||
|
* **Suministro de agua:** Un "ladrón de lluvia" en el bajante dirige el agua de lluvia al depósito.
|
||||||
|
* **Bomba:** Una bomba con un tanque de expansión de presión integrado proporciona la presión de agua necesaria.
|
||||||
|
* **Actuadores:** Válvulas de bola motorizadas de 12V para controlar las salidas de agua.
|
||||||
|
* **Sensor de nivel (preciso):** Un `QDY30A` con salida de 4-20mA e interfaz RS485/MODBUS para la medición continua del nivel del agua.
|
||||||
|
* **Sensores de nivel (Min/Max):** Sensores capacitivos opcionales (`XKC-Y25-NPN` o similar) como protección redundante contra el funcionamiento en seco y el desbordamiento.
|
||||||
|
|
||||||
|
## 3. Puerta de enlace
|
||||||
|
|
||||||
|
La interfaz de comunicación central se implementa como una puerta de enlace "tonta".
|
||||||
|
|
||||||
|
* **Hardware:** Una placa basada en `ESP32C6`.
|
||||||
|
* **Función:** La puerta de enlace actúa como un **convertidor transparente de MODBUS TCP/IP a MODBUS RTU**. Recibe comandos de la red doméstica y los reenvía al bus RS485 y viceversa. No ejecuta su propia lógica de control.
|
||||||
|
* **Conexión a Home Assistant:** La conexión se realiza a través de la red doméstica, ya sea a través de WLAN o en el futuro posiblemente a través de Thread/Matter. En Home Assistant, la integración oficial de MODBUS se utiliza para direccionar directamente la puerta de enlace y los esclavos detrás de ella.
|
||||||
|
|
||||||
|
## 4. Nodos esclavos
|
||||||
|
|
||||||
|
Los nodos esclavos son las unidades de trabajo en el campo. Para mantener bajo el esfuerzo en la producción de series pequeñas (por ejemplo, en JLCPCB), se busca un diseño de placa universal para todos los tipos de esclavos.
|
||||||
|
|
||||||
|
* **Microcontrolador:** Un `STM32G431PB`. Aunque potente, ofrece todos los periféricos necesarios (múltiples UART, ADC, CAN) y permite un diseño de hardware y software uniforme.
|
||||||
|
* **Periféricos por nodo:**
|
||||||
|
* **Dos salidas de lado alto (+12V):** Realizadas a través de un `VND7050AJ`. Perfecto para controlar las válvulas de motor de 12V (`Abrir`/`Cerrar`). La línea `Sense` del controlador se lee a través de un convertidor AD para realizar una detección de posición final sin interruptores de límite físicos midiendo la corriente del motor (corriente del motor en reposo ≈ 0).
|
||||||
|
* **Dos salidas de lado bajo (0V):** Salidas conmutadas a través de MOSFET de canal N. Se pueden utilizar para controlar LED de 12V en botones o para conmutar el relé de estado sólido para la bomba.
|
||||||
|
* **Dos entradas digitales:** Entradas directas y protegidas en el controlador para conectar botones o los sensores NPN capacitivos.
|
||||||
|
|
||||||
|
## 5. Sistema de bus: MODBUS-RTU a través de RS485
|
||||||
|
|
||||||
|
MODBUS-RTU se utiliza de forma consistente como sistema de bus.
|
||||||
|
|
||||||
|
* **Justificación:** Esta elección es pragmática, ya que el sensor de nivel ya requiere MODBUS. Esto significa que solo se requiere un único protocolo simple y extendido para todo el sistema.
|
||||||
|
* **Capa física:** El cableado se realiza a través de RS485. Se utiliza un cable Ethernet Cat-7 disponible en el mercado con conectores RJ45:
|
||||||
|
* 1 par trenzado para las señales de bus `A` y `B`.
|
||||||
|
* 3 pares de cables en paralelo para `+12V` y `GND` para suministrar energía a los esclavos.
|
||||||
|
|
||||||
|
## 6. Software
|
||||||
|
|
||||||
|
* **Sistema operativo (esclavos):** `Zephyr OS`. Es un sistema operativo en tiempo real moderno y potente que permite una estructura de firmware limpia y mantenible.
|
||||||
|
* **Implementación de la lógica:** Toda la lógica de control (por ejemplo, "Si el nivel < 20% y el día de la semana = lunes, entonces enciende la válvula 3 durante 10 minutos") se asigna exclusivamente en **Home Assistant** a través de su motor de automatización.
|
||||||
|
|
||||||
|
### 6.1. Actualización del firmware de los esclavos (OTA)
|
||||||
|
|
||||||
|
El firmware de los esclavos se puede actualizar durante el funcionamiento a través del bus sin necesidad de acceso físico directo.
|
||||||
|
|
||||||
|
* **Concepto:** Se utiliza el cargador de arranque `MCUBoot`. Este está desacoplado del protocolo de comunicación.
|
||||||
|
* **Procedimiento:**
|
||||||
|
1. Un script en Home Assistant lee el nuevo archivo de firmware (`firmware.bin`).
|
||||||
|
2. El script divide el archivo en pequeños paquetes de datos y los envía uno tras otro al esclavo de destino mediante un comando MODBUS.
|
||||||
|
3. La aplicación en ejecución en el esclavo recibe estos paquetes y los escribe directamente en la memoria flash secundaria ("ranura de actualización").
|
||||||
|
4. Después de una transmisión exitosa, el esclavo se reinicia por comando.
|
||||||
|
5. `MCUBoot` comprueba la firma de la nueva imagen, la copia en la ranura principal y la inicia.
|
||||||
|
* **Seguridad:** El nuevo firmware debe marcarse a sí mismo como "funcional" después de iniciarse. Si no lo hace (por ejemplo, debido a un bloqueo), la versión de firmware anterior y estable es restaurada automáticamente por `MCUBoot` en el siguiente reinicio por el watchdog.
|
||||||
|
|
||||||
|
## 7. Conceptos de seguridad y robustez
|
||||||
|
|
||||||
|
* **Comportamiento a prueba de fallos:** Cada nodo esclavo implementa un watchdog. Si no se recibe ninguna consulta MODBUS válida de la puerta de enlace durante un período de tiempo definido (por ejemplo, 15 segundos), el esclavo pasa a un estado seguro: todas las válvulas se cierran y los relés (por ejemplo, para la bomba) se apagan.
|
||||||
|
* **Circuitos de protección eléctrica:** Todas las interfaces externas están protegidas. Las líneas de bus RS485 (`A`/`B`) están protegidas contra sobretensiones con diodos TVS en cada placa. Las entradas y salidas reciben protección ESD básica.
|
||||||
|
* **Fuente de alimentación:** La tensión del bus de 12V se regula en cada nodo esclavo con un convertidor reductor `TPS5430DDAR` eficiente a los 3.3V necesarios para el microcontrolador y los controladores del bus.
|
||||||
|
|
@ -0,0 +1,75 @@
|
||||||
|
[🇩🇪 Deutsch](concept.de.md) | [🇬🇧 English](concept.en.md) | 🇫🇷 Français | [🇪🇸 Español](concept.es.md)
|
||||||
|
|
||||||
|
# Concept : Système d'irrigation modulaire
|
||||||
|
|
||||||
|
Ce document décrit le concept d'un système d'irrigation modulaire et intelligent, contrôlé de manière centralisée via Home Assistant.
|
||||||
|
|
||||||
|
## 1. Aperçu de l'architecture
|
||||||
|
|
||||||
|
Le système est divisé en trois couches logiques pour garantir une flexibilité et une maintenabilité élevées :
|
||||||
|
|
||||||
|
1. **Couche de contrôle (Home Assistant) :** Toute la logique, les automatisations et l'interface utilisateur résident dans Home Assistant. C'est le "cerveau" du système.
|
||||||
|
2. **Couche de passerelle (ESP32) :** Un simple traducteur de protocole qui sert de pont entre le réseau domestique (WLAN/Thread) et le système de bus physique de l'installation. Il ne contient aucune logique de contrôle propre.
|
||||||
|
3. **Couche d'acteurs/capteurs (nœuds esclaves) :** Des modules robustes et spécialisés, commandés via un bus, qui exécutent les tâches réelles (commutation de vannes, lecture de capteurs).
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 2. Composants du système
|
||||||
|
|
||||||
|
* **Réservoir d'eau :** Un conteneur IBC sert de réservoir d'eau.
|
||||||
|
* **Alimentation en eau :** Un "récupérateur d'eau de pluie" sur le tuyau de descente dirige l'eau de pluie dans le réservoir.
|
||||||
|
* **Pompe :** Une pompe avec un vase d'expansion intégré assure la pression d'eau nécessaire.
|
||||||
|
* **Actionneurs :** Des vannes à boisseau sphérique motorisées de 12V pour contrôler les sorties d'eau.
|
||||||
|
* **Capteur de niveau (précis) :** Un `QDY30A` avec une sortie 4-20mA et une interface RS485/MODBUS pour la mesure continue du niveau d'eau.
|
||||||
|
* **Capteurs de niveau (Min/Max) :** Des capteurs capacitifs optionnels (`XKC-Y25-NPN` ou similaire) comme protection redondante contre le fonctionnement à sec et le débordement.
|
||||||
|
|
||||||
|
## 3. Passerelle
|
||||||
|
|
||||||
|
L'interface de communication centrale est réalisée sous la forme d'une passerelle "stupide".
|
||||||
|
|
||||||
|
* **Matériel :** Une carte basée sur `ESP32C6`.
|
||||||
|
* **Fonction :** La passerelle agit comme un **convertisseur transparent MODBUS TCP/IP vers MODBUS RTU**. Elle reçoit les commandes du réseau domestique et les transmet au bus RS485 et vice versa. Elle n'exécute aucune logique de contrôle propre.
|
||||||
|
* **Connexion à Home Assistant :** La connexion se fait via le réseau domestique, soit par WLAN, soit à l'avenir éventuellement par Thread/Matter. Dans Home Assistant, l'intégration MODBUS officielle est utilisée pour adresser directement la passerelle et les esclaves qui se trouvent derrière.
|
||||||
|
|
||||||
|
## 4. Nœuds esclaves
|
||||||
|
|
||||||
|
Les nœuds esclaves sont les unités de travail sur le terrain. Pour réduire les efforts lors de la production en petites séries (par ex. chez JLCPCB), un design de platine universel pour tous les types d'esclaves est visé.
|
||||||
|
|
||||||
|
* **Microcontrôleur :** Un `STM32G431PB`. Bien que puissant, il offre toutes les périphériques nécessaires (plusieurs UART, ADC, CAN) et permet une conception matérielle et logicielle uniforme.
|
||||||
|
* **Périphériques par nœud :**
|
||||||
|
* **Deux sorties High-Side (+12V) :** Réalisées via un `VND7050AJ`. Parfait pour commander les vannes motorisées 12V (`Ouvrir`/`Fermer`). La ligne `Sense` du pilote est lue via un convertisseur AN pour réaliser une détection de fin de course sans interrupteurs de fin de course physiques en mesurant le courant du moteur (courant du moteur à l'arrêt ≈ 0).
|
||||||
|
* **Deux sorties Low-Side (0V) :** Sorties commutées via des MOSFET à canal N. Utilisables pour commander des LED 12V dans des boutons-poussoirs ou pour commuter le relais à semi-conducteurs pour la pompe.
|
||||||
|
* **Deux entrées numériques :** Entrées directes et protégées sur le contrôleur pour connecter des boutons-poussoirs ou les capteurs NPN capacitifs.
|
||||||
|
|
||||||
|
## 5. Système de bus : MODBUS-RTU via RS485
|
||||||
|
|
||||||
|
Le système de bus repose systématiquement sur MODBUS-RTU.
|
||||||
|
|
||||||
|
* **Justification :** Ce choix est pragmatique, car le capteur de niveau requiert déjà MODBUS. Ainsi, un seul protocole simple et largement répandu est nécessaire pour l'ensemble du système.
|
||||||
|
* **Couche physique :** Le câblage est réalisé via RS485. Un câble Ethernet Cat-7 du commerce avec des connecteurs RJ45 est utilisé :
|
||||||
|
* 1 paire torsadée pour les signaux de bus `A` et `B`.
|
||||||
|
* 3 paires de fils en parallèle pour `+12V` et `GND` pour l'alimentation des esclaves.
|
||||||
|
|
||||||
|
## 6. Logiciel
|
||||||
|
|
||||||
|
* **Système d'exploitation (esclaves) :** `Zephyr OS`. C'est un système d'exploitation temps réel moderne et performant qui permet une structure de firmware propre et maintenable.
|
||||||
|
* **Implémentation de la logique :** Toute la logique de commande (par ex. "Si niveau < 20% et jour de la semaine = Lundi, alors activer la vanne 3 pendant 10 minutes") est exclusivement représentée dans **Home Assistant** via son moteur d'automatisation.
|
||||||
|
|
||||||
|
### 6.1. Mise à jour du firmware des esclaves (OTA)
|
||||||
|
|
||||||
|
Le firmware des esclaves peut être mis à jour en cours de fonctionnement via le bus, sans nécessiter d'accès physique direct.
|
||||||
|
|
||||||
|
* **Concept :** Le bootloader `MCUBoot` est utilisé. Celui-ci est découplé du protocole de communication.
|
||||||
|
* **Déroulement :**
|
||||||
|
1. Un script dans Home Assistant lit le nouveau fichier de firmware (`firmware.bin`).
|
||||||
|
2. Le script décompose le fichier en petits paquets de données et les envoie successivement à l'esclave cible par commande MODBUS.
|
||||||
|
3. L'application en cours d'exécution sur l'esclave reçoit ces paquets et les écrit directement dans la mémoire flash secondaire ("slot de mise à jour").
|
||||||
|
4. Après une transmission réussie, l'esclave est redémarré par commande.
|
||||||
|
5. `MCUBoot` vérifie la signature de la nouvelle image, la copie dans le slot primaire et la démarre.
|
||||||
|
* **Sécurité :** Le nouveau firmware doit se marquer comme "fonctionnel" après le démarrage. S'il ne le fait pas (par ex. à cause d'un crash), la version précédente et stable du firmware est automatiquement restaurée par `MCUBoot` au prochain redémarrage par le watchdog.
|
||||||
|
|
||||||
|
## 7. Concepts de sécurité et de robustesse
|
||||||
|
|
||||||
|
* **Comportement Fail-Safe :** Chaque nœud esclave implémente un watchdog. Si aucune requête MODBUS valide n'est reçue de la passerelle pendant une période définie (par ex. 15 secondes), le nœud esclave passe dans un état sûr : toutes les vannes sont fermées et les relais (par ex. pour la pompe) sont désactivés.
|
||||||
|
* **Circuits de protection électrique :** Toutes les interfaces externes sont protégées. Les lignes de bus RS485 (`A`/`B`) sont protégées contre les surtensions par des diodes TVS sur chaque platine. Les entrées et les sorties reçoivent une protection ESD de base.
|
||||||
|
* **Alimentation électrique :** La tension de bus de 12V est régulée sur chaque nœud esclave avec un convertisseur abaisseur `TPS5430DDAR` efficace pour fournir les 3.3V nécessaires au microcontrôleur et aux pilotes de bus.
|
||||||
|
|
@ -0,0 +1,86 @@
|
||||||
|
<svg width="650" height="500" viewBox="0 0 650 500" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.box {
|
||||||
|
fill: #f0f7ff;
|
||||||
|
stroke: #0d47a1;
|
||||||
|
stroke-width: 1.5;
|
||||||
|
rx: 8;
|
||||||
|
}
|
||||||
|
.label-main {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 500;
|
||||||
|
text-anchor: middle;
|
||||||
|
fill: #111;
|
||||||
|
}
|
||||||
|
.label-sub {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
||||||
|
font-size: 12px;
|
||||||
|
text-anchor: middle;
|
||||||
|
fill: #444;
|
||||||
|
}
|
||||||
|
.label-arrow {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
||||||
|
font-size: 13px;
|
||||||
|
text-anchor: middle;
|
||||||
|
fill: #333;
|
||||||
|
}
|
||||||
|
.arrow-line {
|
||||||
|
stroke: #333;
|
||||||
|
stroke-width: 2;
|
||||||
|
}
|
||||||
|
.arrow-head {
|
||||||
|
fill: #333;
|
||||||
|
}
|
||||||
|
.bus-line {
|
||||||
|
stroke: #212121;
|
||||||
|
stroke-width: 4;
|
||||||
|
}
|
||||||
|
.bus-connector {
|
||||||
|
stroke: #212121;
|
||||||
|
stroke-width: 2;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<marker id="arrowhead" viewBox="0 0 10 10" refX="5" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
|
||||||
|
<path d="M 0 0 L 10 5 L 0 10 z" fill="#333" />
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
|
||||||
|
<text x="325" y="30" class="label-main" font-size="20">Systemarchitektur</text>
|
||||||
|
|
||||||
|
<rect x="225" y="60" width="200" height="70" class="box"/>
|
||||||
|
<text x="325" y="90" class="label-main">Home Assistant</text>
|
||||||
|
<text x="325" y="110" class="label-sub">(Logik & UI)</text>
|
||||||
|
|
||||||
|
<line x1="325" y1="130" x2="325" y2="170" class="arrow-line" marker-end="url(#arrowhead)"/>
|
||||||
|
<text x="445" y="155" class="label-arrow">WLAN / Thread</text>
|
||||||
|
<text x="445" y="170" class="label-arrow" font-size="11">(MODBUS TCP/IP)</text>
|
||||||
|
|
||||||
|
|
||||||
|
<rect x="225" y="180" width="200" height="70" class="box"/>
|
||||||
|
<text x="325" y="210" class="label-main">Gateway (ESP32C6)</text>
|
||||||
|
<text x="325" y="230" class="label-sub">(Traductor de protocolo)</text>
|
||||||
|
|
||||||
|
<line x1="325" y1="250" x2="325" y2="300" class="bus-line"/>
|
||||||
|
<line x1="50" y1="300" x2="600" y2="300" class="bus-line"/>
|
||||||
|
<text x="500" y="285" class="label-arrow">RS485 Bus (MODBUS RTU)</text>
|
||||||
|
|
||||||
|
<line x1="125" y1="300" x2="125" y2="340" class="bus-connector"/>
|
||||||
|
<rect x="50" y="340" width="150" height="60" class="box"/>
|
||||||
|
<text x="125" y="365" class="label-main">Slave-Node</text>
|
||||||
|
<text x="125" y="385" class="label-sub">(Ventil, Taster)</text>
|
||||||
|
|
||||||
|
<line x1="325" y1="300" x2="325" y2="340" class="bus-connector"/>
|
||||||
|
<rect x="250" y="340" width="150" height="60" class="box"/>
|
||||||
|
<text x="325" y="365" class="label-main">Slave-Node</text>
|
||||||
|
<text x="325" y="385" class="label-sub">(Bomba, Sensoren)</text>
|
||||||
|
|
||||||
|
<line x1="525" y1="300" x2="525" y2="340" class="bus-connector"/>
|
||||||
|
<rect x="450" y="340" width="150" height="60" class="box"/>
|
||||||
|
<text x="525" y="365" class="label-main">Sensor de nivel</text>
|
||||||
|
<text x="525" y="385" class="label-sub">(QDY30A)</text>
|
||||||
|
|
||||||
|
<text x="325" y="440" class="label-sub" font-size="20">...</text>
|
||||||
|
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.1 KiB |
|
|
@ -0,0 +1,86 @@
|
||||||
|
<svg width="650" height="500" viewBox="0 0 650 500" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.box {
|
||||||
|
fill: #f0f7ff;
|
||||||
|
stroke: #0d47a1;
|
||||||
|
stroke-width: 1.5;
|
||||||
|
rx: 8;
|
||||||
|
}
|
||||||
|
.label-main {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 500;
|
||||||
|
text-anchor: middle;
|
||||||
|
fill: #111;
|
||||||
|
}
|
||||||
|
.label-sub {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
||||||
|
font-size: 12px;
|
||||||
|
text-anchor: middle;
|
||||||
|
fill: #444;
|
||||||
|
}
|
||||||
|
.label-arrow {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
||||||
|
font-size: 13px;
|
||||||
|
text-anchor: middle;
|
||||||
|
fill: #333;
|
||||||
|
}
|
||||||
|
.arrow-line {
|
||||||
|
stroke: #333;
|
||||||
|
stroke-width: 2;
|
||||||
|
}
|
||||||
|
.arrow-head {
|
||||||
|
fill: #333;
|
||||||
|
}
|
||||||
|
.bus-line {
|
||||||
|
stroke: #212121;
|
||||||
|
stroke-width: 4;
|
||||||
|
}
|
||||||
|
.bus-connector {
|
||||||
|
stroke: #212121;
|
||||||
|
stroke-width: 2;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<marker id="arrowhead" viewBox="0 0 10 10" refX="5" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
|
||||||
|
<path d="M 0 0 L 10 5 L 0 10 z" fill="#333" />
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
|
||||||
|
<text x="325" y="30" class="label-main" font-size="20">Systemarchitektur</text>
|
||||||
|
|
||||||
|
<rect x="225" y="60" width="200" height="70" class="box"/>
|
||||||
|
<text x="325" y="90" class="label-main">Home Assistant</text>
|
||||||
|
<text x="325" y="110" class="label-sub">(Logik & UI)</text>
|
||||||
|
|
||||||
|
<line x1="325" y1="130" x2="325" y2="170" class="arrow-line" marker-end="url(#arrowhead)"/>
|
||||||
|
<text x="445" y="155" class="label-arrow">WLAN / Thread</text>
|
||||||
|
<text x="445" y="170" class="label-arrow" font-size="11">(MODBUS TCP/IP)</text>
|
||||||
|
|
||||||
|
|
||||||
|
<rect x="225" y="180" width="200" height="70" class="box"/>
|
||||||
|
<text x="325" y="210" class="label-main">Gateway (ESP32C6)</text>
|
||||||
|
<text x="325" y="230" class="label-sub">(Traducteur de protocole)</text>
|
||||||
|
|
||||||
|
<line x1="325" y1="250" x2="325" y2="300" class="bus-line"/>
|
||||||
|
<line x1="50" y1="300" x2="600" y2="300" class="bus-line"/>
|
||||||
|
<text x="500" y="285" class="label-arrow">RS485 Bus (MODBUS RTU)</text>
|
||||||
|
|
||||||
|
<line x1="125" y1="300" x2="125" y2="340" class="bus-connector"/>
|
||||||
|
<rect x="50" y="340" width="150" height="60" class="box"/>
|
||||||
|
<text x="125" y="365" class="label-main">Slave-Node</text>
|
||||||
|
<text x="125" y="385" class="label-sub">(Ventil, Taster)</text>
|
||||||
|
|
||||||
|
<line x1="325" y1="300" x2="325" y2="340" class="bus-connector"/>
|
||||||
|
<rect x="250" y="340" width="150" height="60" class="box"/>
|
||||||
|
<text x="325" y="365" class="label-main">Slave-Node</text>
|
||||||
|
<text x="325" y="385" class="label-sub">(Pompe, Sensoren)</text>
|
||||||
|
|
||||||
|
<line x1="525" y1="300" x2="525" y2="340" class="bus-connector"/>
|
||||||
|
<rect x="450" y="340" width="150" height="60" class="box"/>
|
||||||
|
<text x="525" y="365" class="label-main">Capteur de niveau</text>
|
||||||
|
<text x="525" y="385" class="label-sub">(QDY30A)</text>
|
||||||
|
|
||||||
|
<text x="325" y="440" class="label-sub" font-size="20">...</text>
|
||||||
|
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.1 KiB |
|
|
@ -1,4 +1,4 @@
|
||||||
🇩🇪 Deutsch | [🇬🇧 English](modbus-registers.en.md)
|
🇩🇪 Deutsch | [🇬🇧 English](modbus-registers.en.md) | [🇫🇷 Français](modbus-registers.fr.md) | [🇪🇸 Español](modbus-registers.es.md)
|
||||||
|
|
||||||
# MODBUS Register Map Definition v1.0
|
# MODBUS Register Map Definition v1.0
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
[🇩🇪 Deutsch](modbus-registers.de.md) | 🇬🇧 English
|
[🇩🇪 Deutsch](modbus-registers.de.md) | 🇬🇧 English | [🇫🇷 Français](modbus-registers.fr.md) | [🇪🇸 Español](modbus-registers.es.md)
|
||||||
|
|
||||||
# MODBUS Register Map Definition v1.0
|
# MODBUS Register Map Definition v1.0
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,85 @@
|
||||||
|
[🇩🇪 Deutsch](modbus-registers.de.md) | [🇬🇧 English](modbus-registers.en.md) | [🇫🇷 Français](modbus-registers.fr.md) | 🇪🇸 Español
|
||||||
|
|
||||||
|
# Definición del mapa de registros MODBUS v1.0
|
||||||
|
|
||||||
|
## 1. Introducción
|
||||||
|
|
||||||
|
Este documento define los registros MODBUS para los nodos esclavos universales del sistema de riego.
|
||||||
|
|
||||||
|
### 1.1. Filosofía de direccionamiento
|
||||||
|
|
||||||
|
Todos los registros se definen en una única lista continua por tipo de registro (`Input` o `Holding`). Una columna "Categoría" asigna lógicamente la función. Las direcciones se agrupan en bloques para dejar espacio para futuras ampliaciones y para aumentar la legibilidad.
|
||||||
|
|
||||||
|
* **`0x0000 - 0x000F`**: Control y estado de la válvula
|
||||||
|
* **`0x0010 - 0x001F`**: Salidas digitales (LEDs / relés)
|
||||||
|
* **`0x0020 - 0x002F`**: Entradas digitales (botones / sensores)
|
||||||
|
* **`0x00F0 - 0x00FF`**: Configuración y estado general del dispositivo
|
||||||
|
* **`0x0100 - 0x01FF`**: Mecanismo de actualización de firmware
|
||||||
|
|
||||||
|
### 1.2. Códigos de función utilizados
|
||||||
|
|
||||||
|
* **`0x03` (Read Holding Registers):** Para leer registros `4xxxx`.
|
||||||
|
* **`0x04` (Read Input Registers):** Para leer registros `3xxxx`.
|
||||||
|
* **`0x06` (Write Single Register):** Para escribir un único registro `4xxxx`.
|
||||||
|
* **`0x10` (Write Multiple Registers):** Para escribir varios registros `4xxxx` a la vez.
|
||||||
|
|
||||||
|
## 2. Registros de entrada (3xxxx, solo lectura)
|
||||||
|
|
||||||
|
| Dirección (hex) | Nombre | Categoría | Descripción |
|
||||||
|
| :--- | :--- | :--- | :--- |
|
||||||
|
| **0x0000** | `VALVE_STATE_MOVEMENT` | Válvula | Registro de estado combinado. **Byte alto**: Movimiento (`0`=Inactivo, `1`=Abriendo, `2`=Cerrando, `3`=Error). **Byte bajo**: Estado (`0`=Cerrado, `1`=Abierto). |
|
||||||
|
| **0x0001** | `MOTOR_CURRENT_MA` | Válvula | Corriente actual del motor en miliamperios (mA). |
|
||||||
|
| **0x0020** | `DIGITAL_INPUTS_STATE` | Entradas | Máscara de bits de las entradas digitales. Bit 0: Entrada 1, Bit 1: Entrada 2. `1`=Activo. |
|
||||||
|
| **0x0021** | `BUTTON_EVENTS` | Entradas | Banderas de eventos para botones (Borrar al leer). Bit 0: Botón 1 presionado. Bit 1: Botón 2 presionado. |
|
||||||
|
| **0x00F0** | `FIRMWARE_VERSION_MAJOR_MINOR` | Sistema | p. ej. `0x0102` para v1.2. |
|
||||||
|
| **0x00F1** | `FIRMWARE_VERSION_PATCH` | Sistema | p. ej. `3` para v1.2.3. |
|
||||||
|
| **0x00F2** | `DEVICE_STATUS` | Sistema | `0`=OK, `1`=Error general. |
|
||||||
|
| **0x00F3** | `UPTIME_SECONDS_LOW` | Sistema | 16 bits inferiores del tiempo de actividad en segundos. |
|
||||||
|
| **0x00F4** | `UPTIME_SECONDS_HIGH` | Sistema | 16 bits superiores del tiempo de actividad. |
|
||||||
|
| **0x0100** | `FWU_LAST_CHUNK_CRC` | Actualización FW | Contiene el CRC16 del último trozo de datos recibido en el búfer. |
|
||||||
|
|
||||||
|
## 3. Registros de retención (4xxxx, lectura/escritura)
|
||||||
|
|
||||||
|
| Dirección (hex) | Nombre | Categoría | Descripción |
|
||||||
|
| :--- | :--- | :--- | :--- |
|
||||||
|
| **0x0000** | `VALVE_COMMAND` | Válvula | `1`=Abrir, `2`=Cerrar, `0`=Detener movimiento. |
|
||||||
|
| **0x0001** | `MAX_OPENING_TIME_S` | Válvula | Tiempo de espera de seguridad en segundos para el proceso de apertura. |
|
||||||
|
| **0x0002** | `MAX_CLOSING_TIME_S` | Válvula | Tiempo de espera de seguridad en segundos para el proceso de cierre. |
|
||||||
|
| **0x0010** | `DIGITAL_OUTPUTS_STATE` | Salidas | Máscara de bits para leer y escribir las salidas. Bit 0: Salida 1, Bit 1: Salida 2. `1`=ON, `0`=OFF. |
|
||||||
|
| **0x00F0** | `WATCHDOG_TIMEOUT_S` | Sistema | Tiempo de espera del watchdog de seguridad en segundos. `0`=Desactivado. |
|
||||||
|
| **0x0100** | `FWU_COMMAND` | Actualización FW | `1`: **Verificar trozo**: El último trozo transmitido fue considerado válido por el cliente. El esclavo ahora debe escribirlo en la flash. `2`: **Finalizar actualización**: Todos los trozos han sido transmitidos. Finalizar la instalación y reiniciar. |
|
||||||
|
| **0x0101** | `FWU_CHUNK_OFFSET_LOW` | Actualización FW | 16 bits inferiores del desplazamiento de 32 bits en el que se escribirá el siguiente trozo. |
|
||||||
|
| **0x0102** | `FWU_CHUNK_OFFSET_HIGH` | Actualización FW | 16 bits superiores del desplazamiento de 32 bits. |
|
||||||
|
| **0x0103** | `FWU_CHUNK_SIZE` | Actualización FW | Tamaño del siguiente trozo en bytes (máx. 256). |
|
||||||
|
| **0x0180** | `FWU_DATA_BUFFER` | Actualización FW | **Dirección de inicio** de un búfer de 128x16 bits (256 bytes). Corresponde a los registros `40384` a `40511`. |
|
||||||
|
|
||||||
|
## 4. Proceso detallado de actualización de firmware
|
||||||
|
|
||||||
|
Este proceso no tiene estado y es robusto frente a errores de transmisión.
|
||||||
|
|
||||||
|
1. **Cliente:** Selecciona un trozo (máx. 256 bytes) del archivo de firmware y calcula su CRC16.
|
||||||
|
2. **Cliente:** Escribe el desplazamiento de destino (p. ej. `0`) en `FWU_CHUNK_OFFSET_...` y el tamaño en `FWU_CHUNK_SIZE`.
|
||||||
|
3. **Cliente:** Escribe los datos del trozo en el `FWU_DATA_BUFFER` (desde la dirección `0x0180`).
|
||||||
|
4. **Esclavo:** Recibe los datos, los coloca en el búfer de RAM y calcula el CRC. El resultado se proporciona en `FWU_LAST_CHUNK_CRC` (`30256`).
|
||||||
|
5. **Cliente:** Lee `FWU_LAST_CHUNK_CRC` y compara el valor con el CRC autocalculado.
|
||||||
|
* **Error:** Volver al paso 3 para enviar el mismo trozo de nuevo.
|
||||||
|
* **Éxito:** Continúa con el siguiente paso.
|
||||||
|
6. **Cliente:** Escribe el comando `1` ("Verificar trozo") en `FWU_COMMAND` (`40256`).
|
||||||
|
7. **Esclavo:** Recibe el comando, toma el trozo verificado del búfer de RAM y lo escribe en la ubicación correcta en la memoria flash.
|
||||||
|
8. **Cliente:** Continúa con el siguiente trozo (vuelta al paso 1 con nuevo desplazamiento y datos).
|
||||||
|
9. **Último trozo:** Después de que el último trozo ha sido transferido y escrito en la flash con el comando `1`, el cliente escribe el comando `2` ("Finalizar actualización") en `FWU_COMMAND`.
|
||||||
|
10. **Esclavo:** Realiza las comprobaciones finales y se reinicia para que MCUBoot pueda realizar la instalación.
|
||||||
|
|
||||||
|
## Apéndice: Registros del sensor de nivel QDY30A
|
||||||
|
|
||||||
|
Estos registros pertenecen al sensor de nivel externo y también se pueden direccionar en el bus. Según el fabricante, se trata de registros de retención (`4xxxx`) que se leen con el código de función `0x03`.
|
||||||
|
|
||||||
|
| Dirección (hex) | Nombre | L/E | Descripción |
|
||||||
|
| :--- | :--- | :-- | :--- |
|
||||||
|
| **0x0000** | `NODE_ADDRESS` | L/E | Dirección del dispositivo del sensor (1-255). |
|
||||||
|
| **0x0001** | `BAUDRATE` | L/E | `0`=1200, `1`=2400, `2`=4800, `3`=9600, `4`=19200, `5`=38400, `6`=57600, `7`=115200. |
|
||||||
|
| **0x0002** | `UNIT` | L/E | `0`=Ninguno, `1`=cm, `2`=mm, `3`=MPa, `4`=Pa, `5`=kPa. |
|
||||||
|
| **0x0003** | `DECIMAL_PLACES` | L/E | Número de decimales para el valor medido (0-3). |
|
||||||
|
| **0x0004** | `CURRENT_MEASUREMENT` | L | El valor medido escalado como un entero de 16 bits con signo. |
|
||||||
|
| **0x0005** | `MEASURING_RANGE_ZERO_POINT` | L/E | Valor bruto para el punto cero de la escala. |
|
||||||
|
| **0x0006** | `MEASURING_RANGE_END_POINT` | L/E | Valor bruto para el punto final de la escala. |
|
||||||
|
|
@ -0,0 +1,85 @@
|
||||||
|
[🇩🇪 Deutsch](modbus-registers.de.md) | [🇬🇧 English](modbus-registers.en.md) | 🇫🇷 Français | [🇪🇸 Español](modbus-registers.es.md)
|
||||||
|
|
||||||
|
# Définition de la carte des registres MODBUS v1.0
|
||||||
|
|
||||||
|
## 1. Introduction
|
||||||
|
|
||||||
|
Ce document définit les registres MODBUS pour les nœuds esclaves universels du système d'irrigation.
|
||||||
|
|
||||||
|
### 1.1. Philosophie d'adressage
|
||||||
|
|
||||||
|
Tous les registres sont définis dans une seule liste continue par type de registre (`Input` ou `Holding`). Une colonne "Catégorie" attribue logiquement la fonction. Les adresses sont regroupées en blocs pour laisser de la place à de futures extensions et pour améliorer la lisibilité.
|
||||||
|
|
||||||
|
* **`0x0000 - 0x000F`** : Commande et état de la vanne
|
||||||
|
* **`0x0010 - 0x001F`** : Sorties numériques (LEDs / relais)
|
||||||
|
* **`0x0020 - 0x002F`** : Entrées numériques (boutons / capteurs)
|
||||||
|
* **`0x00F0 - 0x00FF`** : Configuration et état général de l'appareil
|
||||||
|
* **`0x0100 - 0x01FF`** : Mécanisme de mise à jour du firmware
|
||||||
|
|
||||||
|
### 1.2. Codes de fonction utilisés
|
||||||
|
|
||||||
|
* **`0x03` (Read Holding Registers) :** Pour lire les registres `4xxxx`.
|
||||||
|
* **`0x04` (Read Input Registers) :** Pour lire les registres `3xxxx`.
|
||||||
|
* **`0x06` (Write Single Register) :** Pour écrire un seul registre `4xxxx`.
|
||||||
|
* **`0x10` (Write Multiple Registers) :** Pour écrire plusieurs registres `4xxxx` à la fois.
|
||||||
|
|
||||||
|
## 2. Registres d'entrée (3xxxx, Lecture seule)
|
||||||
|
|
||||||
|
| Adresse (hex) | Nom | Catégorie | Description |
|
||||||
|
| :--- | :--- | :--- | :--- |
|
||||||
|
| **0x0000** | `VALVE_STATE_MOVEMENT` | Vanne | Registre d'état combiné. **Octet haut** : Mouvement (`0`=Inactif, `1`=Ouverture, `2`=Fermeture, `3`=Erreur). **Octet bas** : État (`0`=Fermé, `1`=Ouvert). |
|
||||||
|
| **0x0001** | `MOTOR_CURRENT_MA` | Vanne | Courant moteur actuel en milliampères (mA). |
|
||||||
|
| **0x0020** | `DIGITAL_INPUTS_STATE` | Entrées | Masque de bits des entrées numériques. Bit 0 : Entrée 1, Bit 1 : Entrée 2. `1`=Actif. |
|
||||||
|
| **0x0021** | `BUTTON_EVENTS` | Entrées | Indicateurs d'événements pour les boutons (Effacement à la lecture). Bit 0 : Bouton 1 pressé. Bit 1 : Bouton 2 pressé. |
|
||||||
|
| **0x00F0** | `FIRMWARE_VERSION_MAJOR_MINOR` | Système | ex. `0x0102` pour v1.2. |
|
||||||
|
| **0x00F1** | `FIRMWARE_VERSION_PATCH` | Système | ex. `3` pour v1.2.3. |
|
||||||
|
| **0x00F2** | `DEVICE_STATUS` | Système | `0`=OK, `1`=Erreur générale. |
|
||||||
|
| **0x00F3** | `UPTIME_SECONDS_LOW` | Système | 16 bits inférieurs du temps de fonctionnement en secondes. |
|
||||||
|
| **0x00F4** | `UPTIME_SECONDS_HIGH` | Système | 16 bits supérieurs du temps de fonctionnement. |
|
||||||
|
| **0x0100** | `FWU_LAST_CHUNK_CRC` | Mise à jour FW | Contient le CRC16 du dernier bloc de données reçu dans le tampon. |
|
||||||
|
|
||||||
|
## 3. Registres de maintien (4xxxx, Lecture/Écriture)
|
||||||
|
|
||||||
|
| Adresse (hex) | Nom | Catégorie | Description |
|
||||||
|
| :--- | :--- | :--- | :--- |
|
||||||
|
| **0x0000** | `VALVE_COMMAND` | Vanne | `1`=Ouvrir, `2`=Fermer, `0`=Arrêter le mouvement. |
|
||||||
|
| **0x0001** | `MAX_OPENING_TIME_S` | Vanne | Temporisation de sécurité en secondes pour le processus d'ouverture. |
|
||||||
|
| **0x0002** | `MAX_CLOSING_TIME_S` | Vanne | Temporisation de sécurité en secondes pour le processus de fermeture. |
|
||||||
|
| **0x0010** | `DIGITAL_OUTPUTS_STATE` | Sorties | Masque de bits pour lire et écrire les sorties. Bit 0 : Sortie 1, Bit 1 : Sortie 2. `1`=ON, `0`=OFF. |
|
||||||
|
| **0x00F0** | `WATCHDOG_TIMEOUT_S` | Système | Temporisation du watchdog de sécurité en secondes. `0`=Désactivé. |
|
||||||
|
| **0x0100** | `FWU_COMMAND` | Mise à jour FW | `1` : **Vérifier le bloc** : Le dernier bloc transmis a été jugé valide par le client. L'esclave doit maintenant l'écrire en flash. `2` : **Finaliser la mise à jour** : Tous les blocs ont été transmis. Finaliser l'installation et redémarrer. |
|
||||||
|
| **0x0101** | `FWU_CHUNK_OFFSET_LOW` | Mise à jour FW | 16 bits inférieurs de l'offset 32 bits où le prochain bloc doit être écrit. |
|
||||||
|
| **0x0102** | `FWU_CHUNK_OFFSET_HIGH` | Mise à jour FW | 16 bits supérieurs de l'offset 32 bits. |
|
||||||
|
| **0x0103** | `FWU_CHUNK_SIZE` | Mise à jour FW | Taille du prochain bloc en octets (max. 256). |
|
||||||
|
| **0x0180** | `FWU_DATA_BUFFER` | Mise à jour FW | **Adresse de début** d'un tampon de 128x16 bits (256 octets). Correspond aux registres `40384` à `40511`. |
|
||||||
|
|
||||||
|
## 4. Processus détaillé de mise à jour du firmware
|
||||||
|
|
||||||
|
Ce processus est sans état et robuste aux erreurs de transmission.
|
||||||
|
|
||||||
|
1. **Client :** Sélectionne un bloc (max. 256 octets) dans le fichier de firmware et calcule son CRC16.
|
||||||
|
2. **Client :** Écrit l'offset cible (par ex. `0`) dans `FWU_CHUNK_OFFSET_...` et la taille dans `FWU_CHUNK_SIZE`.
|
||||||
|
3. **Client :** Écrit les données du bloc dans le `FWU_DATA_BUFFER` (à partir de l'adresse `0x0180`).
|
||||||
|
4. **Esclave :** Reçoit les données, les place dans le tampon RAM et calcule le CRC. Le résultat est fourni dans `FWU_LAST_CHUNK_CRC` (`30256`).
|
||||||
|
5. **Client :** Lit `FWU_LAST_CHUNK_CRC` et compare la valeur avec le CRC auto-calculé.
|
||||||
|
* **Erreur :** Retourner à l'étape 3 pour renvoyer le même bloc.
|
||||||
|
* **Succès :** Continue à l'étape suivante.
|
||||||
|
6. **Client :** Écrit la commande `1` ("Vérifier le bloc") dans `FWU_COMMAND` (`40256`).
|
||||||
|
7. **Esclave :** Reçoit la commande, prend le bloc vérifié du tampon RAM et l'écrit à l'emplacement correct dans la mémoire flash.
|
||||||
|
8. **Client :** Continue avec le bloc suivant (retour à l'étape 1 avec un nouvel offset et de nouvelles données).
|
||||||
|
9. **Dernier bloc :** Après que le dernier bloc a été transféré et écrit en flash avec la commande `1`, le client écrit la commande `2` ("Finaliser la mise à jour") dans `FWU_COMMAND`.
|
||||||
|
10. **Esclave :** Effectue les vérifications finales et redémarre pour que MCUBoot puisse effectuer l'installation.
|
||||||
|
|
||||||
|
## Annexe : Registres du capteur de niveau QDY30A
|
||||||
|
|
||||||
|
Ces registres appartiennent au capteur de niveau externe et peuvent également être adressés sur le bus. Selon le fabricant, il s'agit de registres de maintien (`4xxxx`) qui sont lus avec le code de fonction `0x03`.
|
||||||
|
|
||||||
|
| Adresse (hex) | Nom | L/E | Description |
|
||||||
|
| :--- | :--- | :-- | :--- |
|
||||||
|
| **0x0000** | `NODE_ADDRESS` | L/E | Adresse de l'appareil du capteur (1-255). |
|
||||||
|
| **0x0001** | `BAUDRATE` | L/E | `0`=1200, `1`=2400, `2`=4800, `3`=9600, `4`=19200, `5`=38400, `6`=57600, `7`=115200. |
|
||||||
|
| **0x0002** | `UNIT` | L/E | `0`=Aucun, `1`=cm, `2`=mm, `3`=MPa, `4`=Pa, `5`=kPa. |
|
||||||
|
| **0x0003** | `DECIMAL_PLACES` | L/E | Nombre de décimales pour la valeur mesurée (0-3). |
|
||||||
|
| **0x0004** | `CURRENT_MEASUREMENT` | L | La valeur mesurée mise à l'échelle sous forme d'entier signé de 16 bits. |
|
||||||
|
| **0x0005** | `MEASURING_RANGE_ZERO_POINT` | L/E | Valeur brute pour le point zéro de l'échelle. |
|
||||||
|
| **0x0006** | `MEASURING_RANGE_END_POINT` | L/E | Valeur brute pour le point final de l'échelle. |
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
🇩🇪 Deutsch | [🇬🇧 English](planning.en.md)
|
🇩🇪 Deutsch | [🇬🇧 English](planning.en.md) | [🇫🇷 Français](planning.fr.md) | [🇪🇸 Español](planning.es.md)
|
||||||
|
|
||||||
# Projektplan: Modulares Bewässerungssystem
|
# Projektplan: Modulares Bewässerungssystem
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
[🇩🇪 Deutsch](planning.de.md) | 🇬🇧 English
|
[🇩🇪 Deutsch](planning.de.md) | 🇬🇧 English | [🇫🇷 Français](planning.fr.md) | [🇪🇸 Español](planning.es.md)
|
||||||
|
|
||||||
# Project Plan: Modular Irrigation System
|
# Project Plan: Modular Irrigation System
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
[🇩🇪 Deutsch](planning.de.md) | [🇬🇧 English](planning.en.md) | [🇫🇷 Français](planning.fr.md) | 🇪🇸 Español
|
||||||
|
|
||||||
|
# Plan del proyecto: Sistema de riego modular
|
||||||
|
|
||||||
|
| Hecho | Tarea | Fecha | Observaciones |
|
||||||
|
| :---: | :--- | :--- | :--- |
|
||||||
|
| ✅ | **Fase 0: Planificación y definición** | | |
|
||||||
|
| ✅ | Crear y finalizar el concepto | 30.06.2025 | La arquitectura, los componentes y la arquitectura básica están definidos. |
|
||||||
|
| ✅ | Definir el mapa de registros MODBUS | 30.06.2025 | La "API" de los esclavos está definida y constituye la base para el desarrollo del software. |
|
||||||
|
| ☐ | **Fase 1: Prototipo de nodo esclavo (placa de evaluación STM32)** | | **Objetivo:** Un único esclavo cobra vida en la placa de evaluación. |
|
||||||
|
| ☐ | 1.1 Configurar el entorno de desarrollo para STM32/Zephyr | | Instalar la cadena de herramientas, VS Code, el SDK de Zephyr, MCUBoot, etc. y hacer que funcione un "Hola Mundo". |
|
||||||
|
| ☐ | 1.2 Crear el firmware básico para el nodo esclavo | | Implementar la abstracción de hardware (GPIO, ADC, UART para RS485). |
|
||||||
|
| ☐ | 1.3 Implementar la pila MODBUS-RTU en el esclavo | | Basado en el mapa de registros definido. Inicialmente solo funciones de lectura (estado, versión). |
|
||||||
|
| ☐ | 1.4 Implementar la lógica central (p. ej., control de válvulas) | | Implementación de la lógica `VALVE_STATE_MOVEMENT`, medición de corriente para posiciones finales, etc. |
|
||||||
|
| ☐ | **Fase 2: Verificación del firmware del esclavo** | | **Objetivo:** Demostrar que el esclavo se adhiere exactamente a la especificación MODBUS. |
|
||||||
|
| ☐ | 2.1 Probar el nodo esclavo con un PC a través de un adaptador USB-MODBUS | | **Hito crítico.** Leer y escribir los registros con herramientas como "QModMaster" o un script de Python. El firmware del esclavo se valida así independientemente de la puerta de enlace. |
|
||||||
|
| ☐ | 2.2 Probar el mecanismo de actualización de firmware | | Probar el proceso de actualización completo (fragmentación, comprobación de CRC) con un script desde el PC. El esclavo inicialmente solo escribe el firmware en un área de RAM no utilizada. |
|
||||||
|
| ☐ | **Fase 3: Diseño de hardware y construcción de prototipos** | | **Objetivo:** Pasar del desarrollo en la placa de evaluación a un PCB a medida. |
|
||||||
|
| ☐ | 3.1 Diseñar el esquema y el diseño del PCB para el nodo esclavo | | Basado en la experiencia con la placa de evaluación. |
|
||||||
|
| ☐ | 3.2 Pedir y ensamblar placas prototipo | | Por ejemplo, en JLCPCB. Soldar los componentes THT (conectores, etc.) uno mismo. |
|
||||||
|
| ☐ | 3.3 Puesta en marcha del hardware del primer prototipo | | Comprobar voltajes, cargar el firmware y repetir las pruebas de la fase 2 para validar el hardware. |
|
||||||
|
| ☐ | 3.4 Implementar la rutina de escritura en flash para la actualización del firmware | | Aplicar el proceso validado en la RAM en el paso 2.2 a la memoria flash real. |
|
||||||
|
| ☐ | **Fase 4: Desarrollo de la puerta de enlace (placa de evaluación ESP32)** | | **Objetivo:** Construir el puente desde el mundo RS485 a la red doméstica. |
|
||||||
|
| ☐ | 4.1 Crear el firmware de la puerta de enlace (ESPHome) | | Configurar una puerta de enlace simple de MODBUS TCP a RTU en la placa de evaluación ESP32C6. |
|
||||||
|
| ☐ | 4.2 Conectar y probar la puerta de enlace con el prototipo de nodo esclavo | | Probar la cadena: PC (como cliente MODBUS TCP) -> WLAN -> Puerta de enlace -> RS485 -> Esclavo. |
|
||||||
|
| ☐ | **Fase 5: Integración del sistema en Home Assistant** | | **Objetivo:** Hacer que el sistema sea "inteligente". |
|
||||||
|
| ☐ | 5.1 Configurar la integración de MODBUS en Home Assistant | | Crear los sensores y las entidades para el nodo esclavo en `configuration.yaml` o a través de la interfaz de usuario. |
|
||||||
|
| ☐ | 5.2 Crear paneles y automatizaciones en HA | | Visualización de los estados (válvula, bomba, etc.) y creación de la lógica de riego real. |
|
||||||
|
| ☐ | 5.3 Desarrollar un script de Python para la actualización de firmware en HA | | Implementación de la carga basada en fragmentos como un script que se puede llamar desde HA. |
|
||||||
|
| ☐ | **Fase 6: Montaje y puesta en marcha** | | **Objetivo:** Instalar el sistema terminado. |
|
||||||
|
| ☐ | 6.1 Construir y probar todos los nodos esclavos necesarios | | Probar cada esclavo individualmente con el PC a través de un adaptador USB y configurar la dirección MODBUS. |
|
||||||
|
| ☐ | 6.2 Instalación final y cableado del sistema | | Instalación de los componentes en el cobertizo, cableado del bus RS485. |
|
||||||
|
| ☐ | 6.3 Prueba y calibración general del sistema | | Calibrar el sensor de nivel, comprobar los tiempos de funcionamiento de las válvulas, probar el comportamiento a prueba de fallos. |
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
[🇩🇪 Deutsch](planning.de.md) | [🇬🇧 English](planning.en.md) | 🇫🇷 Français | [🇪🇸 Español](planning.es.md)
|
||||||
|
|
||||||
|
# Plan de projet : Système d'irrigation modulaire
|
||||||
|
|
||||||
|
| Fait | Tâche | Date | Remarques |
|
||||||
|
| :---: | :--- | :--- | :--- |
|
||||||
|
| ✅ | **Phase 0 : Planification & Définition** | | |
|
||||||
|
| ✅ | Créer et finaliser le concept | 30.06.2025 | L'architecture, les composants et l'architecture de base sont définis. |
|
||||||
|
| ✅ | Définir la carte des registres MODBUS | 30.06.2025 | L'"API" des esclaves est définie et constitue la base du développement logiciel. |
|
||||||
|
| ☐ | **Phase 1 : Prototype de nœud esclave (carte d'évaluation STM32)** | | **Objectif :** Un seul esclave est mis en service sur la carte d'évaluation. |
|
||||||
|
| ☐ | 1.1 Mettre en place l'environnement de développement pour STM32/Zephyr | | Installer la chaîne d'outils, VS Code, le SDK Zephyr, MCUBoot, etc. et faire fonctionner un "Hello World". |
|
||||||
|
| ☐ | 1.2 Créer le firmware de base pour le nœud esclave | | Implémenter l'abstraction matérielle (GPIO, ADC, UART pour RS485). |
|
||||||
|
| ☐ | 1.3 Implémenter la pile MODBUS-RTU sur l'esclave | | Basé sur la carte des registres définie. D'abord uniquement les fonctions de lecture (état, version). |
|
||||||
|
| ☐ | 1.4 Implémenter la logique de base (par ex. commande de vanne) | | Implémentation de la logique `VALVE_STATE_MOVEMENT`, mesure du courant pour les positions finales, etc. |
|
||||||
|
| ☐ | **Phase 2 : Vérification du firmware de l'esclave** | | **Objectif :** Prouver que l'esclave respecte exactement la spécification MODBUS. |
|
||||||
|
| ☐ | 2.1 Tester le nœud esclave avec un PC via un adaptateur USB-MODBUS | | **Jalon critique.** Lire et écrire les registres avec des outils comme "QModMaster" ou un script Python. Le firmware de l'esclave est ainsi validé indépendamment de la passerelle. |
|
||||||
|
| ☐ | 2.2 Tester le mécanisme de mise à jour du firmware | | Tester le processus de mise à jour complet (fragmentation, vérification CRC) avec un script depuis le PC. L'esclave n'écrit d'abord le firmware que dans une zone RAM inutilisée. |
|
||||||
|
| ☐ | **Phase 3 : Conception matérielle et construction de prototypes** | | **Objectif :** Passer du développement sur la carte d'évaluation à un PCB sur mesure. |
|
||||||
|
| ☐ | 3.1 Concevoir le schéma et le layout du PCB pour le nœud esclave | | Basé sur l'expérience avec la carte d'évaluation. |
|
||||||
|
| ☐ | 3.2 Commander et assembler les cartes prototypes | | Par ex. chez JLCPCB. Souder soi-même les composants THT (connecteurs, etc.). |
|
||||||
|
| ☐ | 3.3 Mise en service matérielle du premier prototype | | Vérifier les tensions, charger le firmware et répéter les tests de la phase 2 pour valider le matériel. |
|
||||||
|
| ☐ | 3.4 Implémenter la routine d'écriture flash pour la mise à jour du firmware | | Appliquer le processus validé en RAM à l'étape 2.2 à la mémoire flash réelle. |
|
||||||
|
| ☐ | **Phase 4 : Développement de la passerelle (carte d'évaluation ESP32)** | | **Objectif :** Construire le pont entre le monde RS485 et le réseau domestique. |
|
||||||
|
| ☐ | 4.1 Créer le firmware de la passerelle (ESPHome) | | Mettre en place une simple passerelle MODBUS TCP vers RTU sur la carte d'évaluation ESP32C6. |
|
||||||
|
| ☐ | 4.2 Connecter et tester la passerelle avec le prototype de nœud esclave | | Tester la chaîne : PC (en tant que client MODBUS TCP) -> WLAN -> Passerelle -> RS485 -> Esclave. |
|
||||||
|
| ☐ | **Phase 5 : Intégration du système dans Home Assistant** | | **Objectif :** Rendre le système "intelligent". |
|
||||||
|
| ☐ | 5.1 Configurer l'intégration MODBUS dans Home Assistant | | Créer les capteurs et les entités pour le nœud esclave dans `configuration.yaml` ou via l'interface utilisateur. |
|
||||||
|
| ☐ | 5.2 Créer des tableaux de bord et des automatisations dans HA | | Visualisation des états (vanne, pompe, etc.) et création de la logique d'irrigation réelle. |
|
||||||
|
| ☐ | 5.3 Développer un script Python pour la mise à jour du firmware dans HA | | Implémentation du téléchargement basé sur des fragments sous forme de script pouvant être appelé depuis HA. |
|
||||||
|
| ☐ | **Phase 6 : Montage et mise en service** | | **Objectif :** Installer le système final. |
|
||||||
|
| ☐ | 6.1 Construire et tester tous les nœuds esclaves nécessaires | | Tester chaque esclave individuellement avec le PC via un adaptateur USB et configurer l'adresse MODBUS. |
|
||||||
|
| ☐ | 6.2 Installation finale et câblage du système | | Installation des composants dans l'abri, câblage du bus RS485. |
|
||||||
|
| ☐ | 6.3 Test et calibrage de l'ensemble du système | | Calibrer le capteur de niveau, vérifier les temps de fonctionnement des vannes, tester le comportement de sécurité. |
|
||||||
Loading…
Reference in New Issue