Retour à l'accueil

Raspberry Pi et compteur MIR S-05 : BLE GATT

Les développeurs obtiennent des instructions pour connecter Raspberry Pi au compteur MIR S-05.10 via Bluetooth. Services GATT décrits, ingénierie inverse du protocole via les journaux HCI Android, scripts bleak pour lire les relevés. Adapté à l'intégration dans des systèmes de maison intelligente.

Intégration BLE du compteur MIR S-05 avec Raspberry Pi Zero
Advertisement 728x90

Intégration du compteur électrique MIR C-05.10 au Raspberry Pi via Bluetooth : GATT et ingénierie inverse

Le Raspberry Pi Zero 2W, grâce à son module Bluetooth intégré, permet de lire les données du compteur électrique MIR C-05.10-230-5(80)-G2Z1B-KNQ-S-D sans avoir besoin d'une sonde optique USB. L'interface s'appuie sur un profil GATT via BLE. Commencez par installer les paquets Bluetooth nécessaires :

sudo apt update
sudo apt install -y bluez bluez-tools bluetooth python3-pip
python3 -m pip install --break-system-packages bleak
sudo systemctl enable bluetooth
sudo systemctl restart bluetooth

Dans l'utilitaire bluetoothctl, lancez une recherche (scan on), associez-vous au périphérique (pair MAC), marquez-le comme fiable (trust MAC) et connectez-vous (connect MAC). Les compteurs apparaissent sous la forme C05-numéro_de_série.

Une fois connecté, les services GATT deviennent accessibles. Le service principal pour le SPP-sur-BLE est 4880c12c-fdcb-4077-8920-a450d7f9b907, qui propose la caractéristique fec26ec4-6d71-4442-9f81-55bc21d658d6 (notification/écriture sans réponse). Le service OTA de Silicon Labs peut être ignoré en toute sécurité.

Google AdInline article slot

Lecture des caractéristiques GATT de base

Un script Python utilisant bleak permet d'analyser les caractéristiques disponibles et d'activer les notifications :

import asyncio
from bleak import BleakClient

ADDR = "E4:06:BF:87:CD:69"

CHARS = [
    "00002a29-0000-1000-8000-00805f9b34fb",
    "00002a24-0000-1000-8000-00805f9b34fb",
    "00002a25-0000-1000-8000-00805f9b34fb",
    "00002a27-0000-1000-8000-00805f9b34fb",
    "00002a26-0000-1000-8000-00805f9b34fb",
    "2bb1d64f-451a-4541-ac89-24df683309dc",
    "d24a5138-1448-48ea-a983-f7df274c6d89",
    "4335a5be-fbbd-464e-8659-1a4212239e3e",
    "b3f7e595-2951-42fa-879e-0d9dfa5e846e",
    "fec26ec4-6d71-4442-9f81-55bc21d658d6",
    "f7bf3564-fb6d-4e53-88a4-5e37e0326063",
]

def fmt(data: bytes) -> str:
    try:
        txt = data.decode("utf-8", errors="strict")
        return f'hex={data.hex(" ")} | utf8={txt!r}'
    except Exception:
        return f'hex={data.hex(" ")}' 

async def main():
    def cb(sender, data):
        print(f"NOTIFY {sender}: {fmt(bytes(data))}")

    async with BleakClient(ADDR, timeout=20.0) as client:
        print("connected:", client.is_connected)

        for uuid in CHARS:
            try:
                data = await client.read_gatt_char(uuid)
                print(f"READ {uuid}: {fmt(bytes(data))}")
            except Exception as e:
                print(f"READ {uuid}: ERROR: {e}")

        try:
            await client.start_notify("fec26ec4-6d71-4442-9f81-55bc21d658d6", cb)
            print("notify enabled on fec26...")
        except Exception as e:
            print("notify fec26 error:", e)

        await asyncio.sleep(10)

asyncio.run(main())

La sortie révèle les détails du périphérique : fabricant NPO "MIR", modèle C05, numéro de série 50912525161818 et version du micrologiciel v2.81.9.0. Les autres caractéristiques sont verrouillées et nécessitent une authentification (READ_NOT_PERMITTED).

Ingénierie inverse du protocole via les journaux HCI Android

Pour analyser le trafic de communication, un appareil Android rooté est indispensable. Activez les options pour les développeurs, lancez l'enregistrement HCI Bluetooth et activez le débogage USB. Après vous être associé à l'application officielle "MIR DP", extrayez les journaux avec adb bugreport ou les commandes suivantes :

Google AdInline article slot
adb shell su -c "cp /data/misc/bluetooth/logs/btsnoop_hci.log /sdcard/Download/btsnoop_hci.log && chmod 666 /sdcard/Download/btsnoop_hci.log"
adb pull /sdcard/Download/btsnoop_hci.log

Le fichier binaire btsnoop_hci.log peut être analysé avec Wireshark ou des outils assistés par IA. Ce processus dévoile la séquence exacte de commandes BLE utilisée pour l'initialisation et la récupération des données : consommation totale d'énergie, relevés des tarifs T1/T2, date/heure, intensité du courant et tension.

Script d'interrogation séquentielle pour les relevés du compteur

Le protocole exige des requêtes BLE individuelles pour chaque point de données. Voici un modèle de script :

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
Reading MIR C-05 meter data via BLE.
1. Connect and initialize.
2. Enable notifications.
3. Send sequential read commands.
"""

# Insert commands extracted from HCI logs here: write-without-response to fec26ec4...

Le script gère l'initialisation du service, active les notifications et envoie les requêtes de lecture. Les réponses sont converties en unités standard : kWh, A et V.

Google AdInline article slot

Points clés :

  • La connexion BLE reste stable sans nécessiter de nouvelle association.
  • Les caractéristiques GATT sont protégées ; un code PIN propriétaire est requis pour un accès complet.
  • Les journaux HCI sont indispensables pour décoder le protocole SPP-sur-BLE.
  • Une intégration transparente dans Home Assistant est possible via MQTT ou l'exécution directe du script.
  • L'interrogation séquentielle est obligatoire ; l'envoi de requêtes par lots provoquera une rupture de connexion.

— Editorial Team

Advertisement 728x90

Lire ensuite