Zurück zur Startseite

Raspberry Pi und MIR S-05 Zähler: BLE GATT

Entwickler erhalten Anleitungen zum Verbinden von Raspberry Pi mit MIR S-05.10 Zähler via Bluetooth. GATT-Dienste beschrieben, Protokoll-Reverse via Android HCI-Logs, bleak-Skripte zum Auslesen der Messwerte. Geeignet für Integration in Smart-Home-Systeme.

BLE-Integration des MIR S-05 Zählers mit Raspberry Pi Zero
Advertisement 728x90

Integration des MIR C-05.10 Stromzählers mit dem Raspberry Pi über Bluetooth: GATT und Reverse Engineering

Der Raspberry Pi Zero 2W kann dank seines integrierten Bluetooth-Moduls Daten vom Stromzähler MIR C-05.10-230-5(80)-G2Z1B-KNQ-S-D auslesen – ganz ohne USB-Optokopf. Die Kommunikation basiert auf einem GATT-Profil über BLE. Zunächst müssen die erforderlichen Bluetooth-Pakete installiert werden:

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

Im bluetoothctl-Tool starten Sie einen Scan (scan on), koppeln das Gerät (pair MAC), markieren es als vertrauenswürdig (trust MAC) und verbinden sich (connect MAC). Die Zähler erscheinen dabei unter dem Namen C05-Seriennummer.

Nach der Verbindung werden die GATT-Dienste zugänglich. Der primäre Dienst für SPP-over-BLE ist 4880c12c-fdcb-4077-8920-a450d7f9b907 mit dem Merkmal fec26ec4-6d71-4442-9f81-55bc21d658d6 (Notify/Write without Response). Der OTA-Dienst von Silicon Labs kann getrost ignoriert werden.

Google AdInline article slot

Auslesen grundlegender GATT-Merkmale

Ein Python-Skript mit bleak kann die verfügbaren Merkmale scannen und Benachrichtigungen aktivieren:

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())

Die Ausgabe liefert Gerätedetails: Hersteller NPO "MIR", Modell C05, Seriennummer 50912525161818 und Firmware-Version v2.81.9.0. Weitere Merkmale sind gesperrt und erfordern eine Authentifizierung (READ_NOT_PERMITTED).

Reverse Engineering des Protokolls über Android-HCI-Logs

Zur Analyse des Kommunikationsverkehrs ist ein gerootetes Android-Gerät erforderlich. Aktivieren Sie die Entwickleroptionen, schalten Sie das Bluetooth-HCI-Snoop-Logging ein und aktivieren Sie das USB-Debugging. Nach der Kopplung mit der offiziellen App „MIR DP“ können Sie die Logs mit adb bugreport oder folgenden Befehlen extrahieren:

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

Die binäre Datei btsnoop_hci.log lässt sich mit Wireshark oder KI-gestützten Tools parsen. Dieser Prozess deckt die exakte BLE-Befehlssequenz für die Initialisierung und Datenabfrage auf: Gesamtenergieverbrauch, Zählerstände für Tarif T1/T2, Datum/Uhrzeit, Stromaufnahme und Spannung.

Sequenzielles Polling-Skript für Zählerstände

Das Protokoll erfordert individuelle BLE-Anfragen für jeden Datenpunkt. Hier ist eine Skriptvorlage:

#!/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...

Das Skript übernimmt die Dienstinitialisierung, aktiviert Benachrichtigungen und versendet sequenzielle Leseanfragen. Die Antworten werden in Standardeinheiten umgewandelt: kWh, A und V.

Google AdInline article slot

Wichtige Erkenntnisse:

  • Die BLE-Verbindung bleibt stabil, ohne dass eine erneute Kopplung nötig ist.
  • GATT-Merkmale sind geschützt; für den Vollzugriff ist ein herstellerspezifischer PIN erforderlich.
  • HCI-Logs sind unverzichtbar, um das SPP-over-BLE-Protokoll zu entschlüsseln.
  • Eine nahtlose Integration in Home Assistant ist über MQTT oder direkte Skriptausführung möglich.
  • Sequenzielles Polling ist zwingend erforderlich; das Senden von Batch-Anfragen führt zum Verbindungsabbruch.

— Editorial Team

Advertisement 728x90

Weiterlesen