> For the complete documentation index, see [llms.txt](https://docs.devonyx.fr/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.devonyx.fr/getting-started/logique-dalertes.md).

# Logique d'alertes

### Principe

DashFarm intègre un **moteur de règles** qui détecte automatiquement les situations à risque pour les cultures, sur la base de la dernière météo enregistrée.

Le moteur est **déclaratif :** les règles sont en base et peuve être ajoutées, modifiées ou désactivées sans toucher au code.

### Anatomie d'une règle

Chaque règle (table `regle_alerte`) est composée de :&#x20;

| Champ              | Description                     | Exemple                                           |
| ------------------ | ------------------------------- | ------------------------------------------------- |
| `nom`              | Nom court de la règle           | `Gel sévère`                                      |
| `parametre`        | Champ météo à évaluer           | `temperature`                                     |
| `operateur`        | Opérateur de comparaison        | `<`                                               |
| `seuil`            | Valeur de comparaison           | `0`                                               |
| `niveau`           | Sévérité de l'alerte            | `critique`                                        |
| `message_template` | Message affiché à l'agriculteur | `Risque de gel : protéger les cultures sensibles` |

Les paramètres acceptés correspondent aux colonnes de la table `meteo` : `temperature`, `humidite`, `precipitation`, `vent`.

Les opérateurs supportés : `>`, `<`, `>=`, `<=`, `=`.

### Exemples de règles

```sql
INSERT INTO regle_alerte (nom, parametre, operateur, seuil, niveau, message_template) VALUES
('Gel sévère',        'temperature',   '',  35,   'warning',  'Température élevée : surveiller le stress hydrique'),
('Humidité critique', 'humidite',      '>',  90,   'warning',  'Humidité élevée : risque de mildiou'),
('Sécheresse',        'precipitation', '',  60,   'critique', 'Vent fort : risque de verse');
```

### Algorithme de déclenchement

Le moteur est implémenté dans `server/services/alertes.service.js` . Il s'exécute à la demande via `POST /api/alertes/run`

#### Code source&#x20;

```javascript
export const runAlertes = async () => {
  // On récupère règles, dernière météo, et cultures actives
  const [regles]   = await db.query('SELECT * FROM regle_alerte')
  const [meteos]   = await db.query('SELECT * FROM meteo ORDER BY date_meteo DESC LIMIT 1')
  const [cultures] = await db.query('SELECT * FROM culture WHERE statut = "en cours"')

  if (!meteos.length) return []
  const meteo = meteos[0]
  const alertesCreees = []

  for (const culture of cultures) {
    for (const regle of regles) {
      const valeur = meteo[regle.parametre]
      if (valeur === undefined) continue

      // Évaluation de la règle
      let declenchee = false
      switch (regle.operateur) {
        case '>':  declenchee = valeur >  regle.seuil; break
        case '<':  declenchee = valeur <  regle.seuil; break
        case '>=': declenchee = valeur >= regle.seuil; break
        case '<=': declenchee = valeur <= regle.seuil; break
        case '=':  declenchee = valeur === regle.seuil; break
      }
      if (!declenchee) continue

      // Anti-doublon : on ne crée pas deux alertes actives identiques
      const [existing] = await db.query(`
        SELECT id_alerte FROM alerte
        WHERE id_culture = ? AND id_regle = ? AND statut = 'active'
      `, [culture.id_culture, regle.id_regle])
      if (existing.length) continue

      // 4. Création de l'alerte
      await db.query(`
        INSERT INTO alerte (date_alerte, type_alerte, message, niveau, statut, id_culture, id_regle)
        VALUES (NOW(), ?, ?, ?, 'active', ?, ?)
      `, [regle.nom, regle.message_template, regle.niveau, culture.id_culture, regle.id_regle])

      alertesCreees.push({ culture: culture.nom, regle: regle.nom, niveau: regle.niveau })
    }
  }
  return alertesCreees
}
```

### Déclenchement automatique (évolution future)

Aujourd'hui, l'évaluation est manuelle. Pour une mise en production, on peut planifier l'exécution périodique avec :&#x20;

* **node-cron :** côté Node.js (ex: toutes les heures)
* **cron :** système qui appelle l'endpoint via curl
* **PM2 cron :** intégré au gestionnaire de processus

### Limites actuelles

* Le moteur ne se base que sur la dernière mesure mété, sans tendance ni cumul (ex: "3 jours sans pluie").
* Pas de notion de plage horaire ou de saisonnalité (ex: alerte gel pertinente seulement en hiver)
* Pas de notification push / email / SMS : l'utilisateur doit consulter le dashboard
* Les règles sont évaluées globalement, pas par parcelle / micro-climat.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.devonyx.fr/getting-started/logique-dalertes.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
