Faire remonter les données de température et d'humidité des couveuses dans Odoo

Pour intégrer les données des capteurs de température et d’humidité dans Odoo, il est possible d’utiliser Odoo IoT Box, MQTT, ou une API REST en fonction des équipements utilisés.

1️⃣ Choisir une méthode de récupération des données

📡 Méthodes possibles :

MéthodeAvantages
Odoo IoT BoxSolution native, plug & play avec Odoo. Connexion via USB, Wi-Fi ou Bluetooth.
MQTT (Mosquitto, etc.)Idéal pour les capteurs IoT communicants en temps réel. Compatible avec Raspberry Pi et ESP32.
API RESTCompatible avec les couveuses modernes disposant d’une API. Permet une gestion centralisée des données.
Connexion directe via un Raspberry PiAlternative si l’IoT Box n’est pas disponible, en utilisant Odoo IoT Framework.

2️⃣ Intégration avec Odoo

🔹 Via MQTT (IoT - Communication temps réel)

Si votre couveuse utilise un capteur DHT11/DHT22, AM2302, ou un capteur connecté via un microcontrôleur (ESP8266, ESP32, Arduino), voici comment envoyer les données à Odoo :

📌 Installation du broker MQTT

Sur le serveur Odoo, installez Mosquitto :

sudo apt update

sudo apt install mosquitto mosquitto-clients


📌 Connexion du capteur à MQTT

Sur votre ESP32/ESP8266 (MicroPython) :

import network

from umqtt.simple import MQTTClient

import dht

import machine

import time


# Configuration WiFi

ssid = "VOTRE_WIFI"

password = "VOTRE_MDP"

mqtt_server = "ADRESSE_IP_ODDOO"


# Connexion WiFi

wifi = network.WLAN(network.STA_IF)

wifi.active(True)

wifi.connect(ssid, password)


while not wifi.isconnected():

    pass


# Connexion au broker MQTT

client = MQTTClient("esp32_couveuse", mqtt_server)

client.connect()


# Lecture des capteurs et envoi des données à MQTT

capteur = dht.DHT22(machine.Pin(4))  # Modifier selon votre connexion GPIO


while True:

    capteur.measure()

    temp = capteur.temperature()

    humidity = capteur.humidity()

    

    client.publish("couveuse/temperature", str(temp))

    client.publish("couveuse/humidity", str(humidity))

    

    time.sleep(10)  # Envoi toutes les 10 secondes


📌 Récupération dans Odoo

Dans Odoo (module personnalisé) :

import paho.mqtt.client as mqtt

from odoo import models, fields, api


class Incubator(models.Model):

    _name = 'incubation.management'

    _description = 'Gestion des couveuses'


    name = fields.Char(string="Nom de la couveuse", required=True)

    temperature = fields.Float(string="Température (°C)")

    humidity = fields.Float(string="Humidité (%)")


    @api.model

    def update_sensor_data(self, topic, message):

        """ Met à jour les données de la couveuse avec les valeurs des capteurs """

        incubator = self.search([], limit=1)  # Supposons une seule couveuse gérée

        if topic == "couveuse/temperature":

            incubator.temperature = float(message)

        elif topic == "couveuse/humidity":

            incubator.humidity = float(message)


# Fonction de callback MQTT

def on_message(client, userdata, msg):

    odoo_model = userdata['odoo_model']

    odoo_model.update_sensor_data(msg.topic, msg.payload.decode())


client = mqtt.Client()

client.user_data_set({'odoo_model': Incubator})

client.on_message = on_message

client.connect("ADRESSE_IP_ODDOO")

client.subscribe("couveuse/#")

client.loop_start()


🔹 Via une API REST

Si votre couveuse dispose d’une API, on peut faire une requête GET pour récupérer les valeurs :


import requests

from odoo import models, fields, api


class Incubator(models.Model):

    _name = 'incubation.management'

    _description = 'Gestion des couveuses'


    name = fields.Char(string="Nom de la couveuse", required=True)

    temperature = fields.Float(string="Température (°C)")

    humidity = fields.Float(string="Humidité (%)")


    @api.model

    def fetch_sensor_data(self):

        """ Récupère les données de la couveuse via API """

        url = "http://couveuse_ip/api/data"

        response = requests.get(url)

        if response.status_code == 200:

            data = response.json()

            incubator = self.search([], limit=1)

            incubator.temperature = data['temperature']

            incubator.humidity = data['humidity']


🔹 Ensuite, planifier cette requête toutes les 10 minutes avec un cron job Odoo.

3️⃣ Représentation des données dans Odoo

Une fois les données récupérées, voici les meilleurs modules pour les visualiser :

Module OdooUtilité
Graphes dans Odoo StudioAffichage simple sous forme de courbes dans le module Incubation.
Odoo BI (Tableau de Bord)Personnalisation des dashboards pour suivre l’évolution des données.
Odoo IoT BoxVisualisation native pour les capteurs IoT.
Odoo Web Charts (OCA)Intégration avancée pour des graphiques plus détaillés.
Matplotlib avec OdooGénération de rapports avec courbes de température/humidité.

🔹 Créer un Graphique avec Odoo (Vue XML)

Ajoutez un graphique de température/humidité dans Odoo Studio ou via du XML :

<record id="view_incubator_graph" model="ir.ui.view">

    <field name="name">incubator.management.graph</field>

    <field name="model">incubation.management</field>

    <field name="arch" type="xml">

        <graph string="Évolution Température/Humidité">

            <field name="temperature"/>

            <field name="humidity"/>

            <field name="create_date" interval="day"/>

        </graph>

    </field>

</record>


🔹 Visualisation avancée avec Matplotlib

Si vous voulez générer des rapports détaillés :

import matplotlib.pyplot as plt

from odoo import models, api


class IncubatorReport(models.Model):

    _name = 'incubation.report'


    @api.model

    def generate_graph(self):

        data = self.env['incubation.management'].search([])

        temperatures = [x.temperature for x in data]

        humidities = [x.humidity for x in data]

        dates = [x.create_date for x in data]


        plt.figure(figsize=(10, 5))

        plt.plot(dates, temperatures, label="Température (°C)", color='r')

        plt.plot(dates, humidities, label="Humidité (%)", color='b')

        plt.legend()

        plt.title("Évolution Température & Humidité")

        plt.xlabel("Date")

        plt.ylabel("Valeurs")

        plt.grid()

        plt.savefig("/mnt/data/incubator_report.png")




4️⃣ Conclusion

Récupération des données via MQTT, API REST ou Odoo IoT Box

Stockage et gestion des valeurs dans Odoo Livestock ou un module personnalisé

Visualisation et analyse avec graphiques Odoo, BI, ou Matplotlib