Bluetooth – MQTT Gateway

Bluetooth – MQTT Gateway

Gateway Bluetooth MQTT

Sul mercato esistono numerosi dispositivi Bluetooth e Bluetooth Low Energy, conosciuto anche come Bluetooth LE o BLE, di interesse per la domotica ed in particolare per Home Assistant, in questo articolo vedremo come poter integrare alcune tipologie di dispositivi attraverso l’uso di un gateway che potremo mettere in una posizione a nostro scelta diversa da quella dove gira HA o Hass.io.

In particolare BLE è una tecnologia wireless personal area network progettata e commercializzata per nuove applicazioni nel settore dell’assistenza sanitaria, fitness, per i beacon, per la sicurezza, per l’industria dell’intrattenimento domestico e per le industrie automobilistiche e dell’automazione. Rispetto al classico Bluetooth, il Bluetooth Low Energy ha lo scopo di fornire un consumo energetico e un costo notevolmente ridotto, mantenendo un intervallo di comunicazione simile.

Ultima nota tecnologica BLE opera nella stessa gamma di frequenze (la banda ISM 2.400-2.4835 GHz) della tecnologia Bluetooth classica e di altri protocolli come WiFi e ZigBee, ma utilizza un diverso insieme di canali.

Ritornando ad Home Assistant in molti avrete notato che l’antenna Bluetooth integrata nei Raspberry come Pi3b e successivi non copre una distanza particolarmente elevata, da qui è nata l’esigenza di trovare un modo per estendere la portata del Bluetooth e poter utilizzare in tutta tranquillità una serie di dispositivi che hanno un costo tutto sommato abbordabile rispetto ad altri analoghi ma con diversa tecnologia trasmissiva.

Ho quindi effettuato una “software & hardware selection” basandomi su una serie di requisiti tra cui la possibilità di interfacciarsi con tutti i sensori bluetooth che ho, questa fase di analisi mi ha portato a scegliere sia l’HW che il SW da utilizzare:

  • Raspberry PizeroW: apparato dal costo abbordabile, circa 20 euro, possibilità di installare una distro linux come Raspbian o DietPi e poter utilizzare sia Wifi che Bluetooth. Disponibilità di molte librerie in grado di interfacciarsi con dispositivi domotici BT.
  • bt-mqtt-gateway: pacchetto software ideato da Zewelor (https://github.com/zewelor/bt-mqtt-gateway) che realizza lo strato software deputato a inserire i dati recuperati da molteplici dispositivi bluetooth in MQTT.

La libreria bt-mqtt-gateway ha alcune caratteristiche interessanti:

  • non si preoccupa di interfacciarsi direttamente con i dispositivi che vogliamo monitorare ma lascia questo compito a librerie specializzate.
  • è stato pensata per essere facilmente estensibile: in pratica se qualcuno ha sviluppato una libreria per leggere i dati trasmessi da qualche apparato bluetooth, posso, tramite la realizzazione in Python di un “worker”, integrarlo con il gateway.

Una volta configurato il Raspberry PizeroW con il gateway, questo manderà i dati attraverso il protocollo MQTT al broker Mosquitto che normalmente è installato come add-on di Hass.io (o come software a sé stante con Home Assistant).

Gli apparati che bt-mqtt-gateway al momento gestisce sono i seguenti:

  • Valvole termostatiche EQ3 Bluetooth grazie alla lib python-eq3bt
  • Xiaomi Mi Scale
  • Linak Desk grazie alla lib linak_bt_desk
  • MySensors
  • Xiaomi Mi Flora grazie alla lib miflora
  • Termometro Xiaomi Aqara grazie alla lib mithermometer
  • Beacon/Tag BLE attraverso la lib bluez
  • Oral-B spazzolino con bluetooth

Personalmente sto utilizzando le valvole EQ3 (ne ho 4) che si trovano su Amazon ad un prezzo competitivo (circa 20 Euro), i sensori piante MiFlora (2) e i Nut Beacon (2).

La funzionalità di verifica della presenza di beacon/tag BLE non era presente quando ho individuato bt-mqtt-gateway, però  mi interessava implementarla, sono partito quindi a scrivere un ”worker” in Python che riusciva a leggere un singolo beacon BLE, poi ho coinvolto un professionista come Elvio Sebastianelli (https://github.com/elviosebastianelli, @elvioseba su Telegram) che ha fatto un gran lavoro per rendere perfettamente fruibile la funzionalità di scansione di BLE multipli.

N.B.: come prerequisito per tutte le operazioni di configurazione ed installazione occorre avere una certa familiarità con il S.O. e i comandi Linux.

Installazione del gateway

Come detto occorre un Raspberry PiZeroW con distro linux come DietPi o Raspbian completo di Python versione 3.5 o superiori e pip (Python Package installer):

Da terminale occorre quindi digitare i seguenti comandi:

Configurazione del gateway

Tutte le configurazioni dei vari “worker” devono essere presenti nel file configuration.yaml contenuto nella cartella bt-mqtt-gateway, di default è presente un esempio di configurazione che può essere usato come base di partenza:

Configurazione del servizio con Systemd

Quando saranno finiti i test e le prove è molto più comodo definire un servizio che avvia in automatico il gateway: sempre nella solita cartella bt-mqtt-gateway creata in fase di installazione è presente un esempio da configurare con il path corretto.

Aggiornamento Liberia Bluez

La distro Raspbian Stretch che a sua volta deriva da Debian Stretch ha come default della libreria Bluez per la gestione del Bluetooth la versione 5.43, per aggiornarla alla 5.50 che presenta correzioni di numerosi bug occorre compilare i sorgenti; i passaggi da fare sono i seguenti:

Completata la compilazione riavviate il PiZeroW e controllate la versione di Bluez installata:

 

Configurazione Valvole EQ3

Innanzitutto occorre installare la libreria python-eq3bt con il seguente comando.

Qui https://github.com/rytilahti/python-eq3bt trovate la libreria e alcuni comandi di test.

Nel file configuration.yaml occorre inserire i mac-address BT delle varie valvole nella sezione thermostat.

 

Configurazione Mi Flora

Innanzitutto occorre installare la libreria miflora con il seguente comando:

Qui https://github.com/open-homeautomation/miflora trovate la libreria.

 Nel file configuration.yaml occorre inserire i mac-address BT dei sensori nella sezione miflora.

 

Configurazione BLE Scan

Non ci sono librerie da installare perché la funzionalità si basa sulla libreria bluez, occore solo configurare il gateway editando nel file configuration.yaml la sezione blescanmulti.

 

Configurazioni per Home Assistant

Sempre nel file configuration.yaml sul PizeroW occorre editare la sezione iniziale con i parametri MQTT:

I parametri host, port, user, password vanno personalizzati secondo quanto configurato nell’addon Mosquitto o in generale nel server MQTT, topic_prefix è un parametro a vostra scelta, ovviamente ne va tenuto conto in fase di configurazione su HA.

 

Configurazione Sensori su Home Assistant

Una volta configurato il gateway e riavviato il servizio sul Raspberry PiZeroW, il gateway manderà al server MQTT i dati dei sensori/attuatori bluetooth, occorre quindi configurare dei componenti in HA:

Per le valvole EQ3 sipuò configurare il componente climate e il sensore di apertura della valvola:

Per i sensori Xiaomi Mi Flora si possono configurare i sensori e il componente plant:

Per il tracking dei dispositivi BLE (beacon) come i Nut (www.nutspace.com) è possibile monitorare due parametri:

  1. la presenza o meno del beacon BLE nel raggio di rilevazione del gateway
  2. il parametro Received Signal Strenght Indication (RSSI) da cui si può, in maniera approssimata, ricavare la distanza del beacon dal gateway (con la formula Distance = 10 ^ ((Measured Power – RSSI)/(10 * N))  dove Measured Power è un parametro che dovrete adattare e N=2)

Di seguito ho inserito la configurazione dei sensori, aggiungendo anche il sensore “realisti RSSI” che effettua una azione di filtraggio dei valori RSSI ricevuti dal gateway, su “realistic RSSI” si basa il calcolo della distanza.


Telegram

 

23 risposte

  1. Felice ha detto:

    Ciao, grazie della preziosa guida. Cercavo una cosa del genere da molto tempo! Mi sapresti indicare dove reperire l’elenco delle librerie necessarie per i vari workers? In particolare mi serve quello per la mi scale. Grazie

  2. ANTONIO ha detto:

    ciao, va bene anche per il Raspberry Pi 3?
    grazie

    • Felice ha detto:

      Sì, sto usando in questo momento un rp3. Funziona anche con un pc con debian 9 e un adattatore bluetooth ble su usb supportato da linux

  3. Felice ha detto:

    Comunque c’è un errore grossolano in tutti gli state_topic! Non sono miflora/herbs/temperature ma hostname/miflora/herbs/temperature
    Ovviamente se cambiate, come ho fatto io, il topic_prefix dovete cambiare il topic di conseguenza. Io ho messo btgateway quindi il mio state_topic è btgateway/miflora/herbs/temperature

  4. Giampi ha detto:

    non è un errore grossolano, come è scritto tutte le configurazionisono da personalizzare: # All messages will have that prefix added, remove if you dont need this

  5. Rocco Merico ha detto:

    Ho un problema con home assistant che mi disconnette il gateway, come mai?
    Ho abilitato per ora solo miflora
    log mosquitto:

    1565709944: New client connected from 192.168.2.129 as bt-mqtt-gateway (p2, c0, k60, u’mqtt_user’).
    1565709945: Socket error on client bt-mqtt-gateway, disconnecting.

    • Giampi ha detto:

      Difficile dire cosa possa essere con così pochi dati. Il gateway BT2MQTT sta funzionando? User e password mqtt sono corretti?

      • Rocco Merico ha detto:

        Il gateway sembra funzionare e i dati del miflora vengono letti da home assistant (user e pw sono corretti) solo se lancio manualmente il gateway, allego il debug del gateway:
        pi@raspberrypi:~/bt-mqtt-gateway $ ./gateway.py -d
        2019-08-13 20:44:48,206 INFO bt-mqtt-gw gateway.py:39: – Starting
        2019-08-13 20:44:48,213 DEBUG bt-mqtt-gw.mqtt mqtt.py:28:__init__ – Setting LWT to: btgateway/lwt_topic
        2019-08-13 20:44:56,349 INFO bt-mqtt-gw.workers.miflora miflora.py:16:_setup – Adding 1 miflora devices
        2019-08-13 20:44:56,352 DEBUG bt-mqtt-gw.workers.miflora miflora.py:18:_setup – Adding miflora device ‘herbs’ (C4:7C:8D:6A:5C:90)
        2019-08-13 20:44:56,355 DEBUG bt-mqtt-gw.workers_manager workers_manager.py:60:register_workers – Added miflora config with a 2 seconds timeout
        2019-08-13 20:44:56,363 DEBUG bt-mqtt-gw.workers_manager workers_manager.py:65:register_workers – Added miflora worker with 300 seconds interval and a 60 seconds timeout
        2019-08-13 20:44:56,420 DEBUG bt-mqtt-gw.mqtt mqtt.py:97:callbacks_subscription – Subscribing to: btgateway/miflora/update_interval
        2019-08-13 20:44:56,429 DEBUG bt-mqtt-gw.mqtt mqtt.py:97:callbacks_subscription – Subscribing to: btgateway/homeassistant/status
        2019-08-13 20:44:56,460 DEBUG bt-mqtt-gw.workers_manager workers_manager.py:36:execute – Execution result of command MifloraWorker.config: [{‘topic’: ‘sensor/C4-7C-8D-6A-5C-90/miflora_herbs_temperature/config’, ‘payload’: ‘{“unique_id”: “bt-mqtt-gateway/C4-7C-8D-6A-5C-90/miflora_herbs_temperature”, “state_topic”: “miflora/herbs/temperature”, “name”: “miflora_herbs_temperature”, “device”: {“identifiers”: [“C4:7C:8D:6A:5C:90”, “bt-mqtt-gateway/C4-7C-8D-6A-5C-90/miflora_herbs”], “manufacturer”: “Xiaomi”, “model”: “MiFlora”, “name”: “miflora_herbs”}, “device_class”: “temperature”, “unit_of_measurement”: “\\u00b0C”}’}, {‘topic’: ‘sensor/C4-7C-8D-6A-5C-90/miflora_herbs_moisture/config’, ‘payload’: ‘{“unique_id”: “bt-mqtt-gateway/C4-7C-8D-6A-5C-90/miflora_herbs_moisture”, “state_topic”: “miflora/herbs/moisture”, “name”: “miflora_herbs_moisture”, “device”: {“identifiers”: [“C4:7C:8D:6A:5C:90”, “bt-mqtt-gateway/C4-7C-8D-6A-5C-90/miflora_herbs”], “manufacturer”: “Xiaomi”, “model”: “MiFlora”, “name”: “miflora_herbs”}, “icon”: “mdi:water”, “unit_of_measurement”: “%”}’}, {‘topic’: ‘sensor/C4-7C-8D-6A-5C-90/miflora_herbs_light/config’, ‘payload’: ‘{“unique_id”: “bt-mqtt-gateway/C4-7C-8D-6A-5C-90/miflora_herbs_illuminance”, “state_topic”: “miflora/herbs/light”, “name”: “miflora_herbs_light”, “device”: {“identifiers”: [“C4:7C:8D:6A:5C:90”, “bt-mqtt-gateway/C4-7C-8D-6A-5C-90/miflora_herbs”], “manufacturer”: “Xiaomi”, “model”: “MiFlora”, “name”: “miflora_herbs”}, “device_class”: “illuminance”, “unit_of_measurement”: “lux”}’}, {‘topic’: ‘sensor/C4-7C-8D-6A-5C-90/miflora_herbs_conductivity/config’, ‘payload’: ‘{“unique_id”: “bt-mqtt-gateway/C4-7C-8D-6A-5C-90/miflora_herbs_conductivity”, “state_topic”: “miflora/herbs/conductivity”, “name”: “miflora_herbs_conductivity”, “device”: {“identifiers”: [“C4:7C:8D:6A:5C:90”, “bt-mqtt-gateway/C4-7C-8D-6A-5C-90/miflora_herbs”], “manufacturer”: “Xiaomi”, “model”: “MiFlora”, “name”: “miflora_herbs”}, “icon”: “mdi:leaf”, “unit_of_measurement”: “\\u00b5S/cm”}’}, {‘topic’: ‘sensor/C4-7C-8D-6A-5C-90/miflora_herbs_battery/config’, ‘payload’: ‘{“unique_id”: “bt-mqtt-gateway/C4-7C-8D-6A-5C-90/miflora_herbs_battery”, “state_topic”: “miflora/herbs/battery”, “name”: “miflora_herbs_battery”, “device”: {“identifiers”: [“C4:7C:8D:6A:5C:90”, “bt-mqtt-gateway/C4-7C-8D-6A-5C-90/miflora_herbs”], “manufacturer”: “Xiaomi”, “model”: “MiFlora”, “name”: “miflora_herbs”}, “device_class”: “battery”, “unit_of_measurement”: “%”}’}]
        2019-08-13 20:44:56,522 DEBUG bt-mqtt-gw.workers_manager workers_manager.py:116:update_all – Updating all workers
        2019-08-13 20:44:56,530 INFO bt-mqtt-gw.workers.miflora miflora.py:76:status_update – Updating 1 miflora devices
        2019-08-13 20:44:56,535 DEBUG bt-mqtt-gw.workers.miflora miflora.py:79:status_update – Updating miflora device ‘herbs’ (C4:7C:8D:6A:5C:90)
        2019-08-13 20:44:58,222 DEBUG bt-mqtt-gw.workers_manager workers_manager.py:36:execute – Execution result of command MifloraWorker.status_update: [{‘topic’: ‘miflora/herbs/temperature’, ‘payload’: 31.5}, {‘topic’: ‘miflora/herbs/moisture’, ‘payload’: 61}, {‘topic’: ‘miflora/herbs/light’, ‘payload’: 22}, {‘topic’: ‘miflora/herbs/conductivity’, ‘payload’: 375}, {‘topic’: ‘miflora/herbs/battery’, ‘payload’: 100}]

  6. Andrea ha detto:

    oggi mi sono messo a configurare tutto seguendo passo passo le istruzioni ma facendo partire il GTW in debug mi da il seguente errore

    2019-08-24 23:34:22,573 DEBUG bt-mqtt-gw.workers_manager workers_manager.py:65:register_workers – Added miflora worker with 300 seconds interval and a 35 seconds timeout
    Could not install packages due to an EnvironmentError: [Errno 2] File o directory non esistente: ‘/tmp/pip-req-tracker-_nnp9u7w/b335028404f826f5fc2a92fa2aa1cfd9faf38302a8e05ea0cb3032ee’

    Traceback (most recent call last):
    File “./gateway.py”, line 45, in
    manager.register_workers(global_topic_prefix).start(mqtt)
    File “/home/pi/bt-mqtt-gateway/workers_manager.py”, line 57, in register_workers
    worker_obj = klass(command_timeout, global_topic_prefix, **worker_config[‘args’])
    File “/home/pi/bt-mqtt-gateway/workers/base.py”, line 7, in __init__
    self._setup()
    File “/home/pi/bt-mqtt-gateway/workers/mithermometer.py”, line 15, in _setup
    from mithermometer.mithermometer_poller import MiThermometerPoller
    ModuleNotFoundError: No module named ‘mithermometer’

  7. Gregorio ha detto:

    Scusate una soluzione per Hass.io.. ovvero esiste un addon (bt-mqtt-gateway) installabile direttamente su Hassio?? Grazie

    • Giampi ha detto:

      non esiste un add-on già pronto, aggiungo anche che non avrebbe molto senso visto che potresti usare il bluetooth dell’host dove gira hass.io. ciao

  8. moreno ha detto:

    ciao ho un pizero dove gira già dà un pò il ble gateway,ora volevo aggiungere più dispositivi da monitorare nel configuration.yaml .questo è il mio :

    blescanmulti:
    args:
    devices:
    beacon: F4:60:E2:XX:XX:XX
    smartwath: F4:60:E2:XX:XX:XX
    topic_prefix: blescan
    available_payload: home
    unavailable_payload: not_home
    available_timeout: 0
    unavailable_timeout: 60
    scan_timeout: 10
    scan_passive: true
    update_interval: 60

    ho fatto delle prove ma senza risultati non capisco dove aggiungere un nuovo MAC da monitorare .
    grazie a chi mi dà una mano.

  9. Giampi ha detto:

    Sotto la direttiva “devices”

  10. Ivan ha detto:

    ciao a tutti!!! articili perfetto per quello che devo fare!!!! GRAZIE MILLE!!!!

    durante la configurazione mi sono bloccatto al settaggio del config.yaml

    il mio home assistant e’ accessibile da remote e per questo ho usato supervidor-> add-on -> DuckDNS (genera anche certificato SSL)

    da intranet, ho due modi di accedere:
    1) https://192.168.1.100:8123 –> e prima di accedere mi da un erroire di certificato ssl
    oppure
    2) https://my-home.duckdns.org –> e quest non mi da alcun proiblema di certificato….

    MQTT blocker e’ installato come Supervisor-> add.on -> MQTT broker ed il mio dubbio e’ su come configurare mqtt nel config del gateway:

    mqtt:
    host: 192.168.1.100
    port: 1883
    username: user
    password: password
    #ca_cert: /etc/ssl/certs/ca-certificates.crt # Uncomment to enable MQTT TLS, update path to appropriate location.
    #ca_verify: False # Verify TLS certificate chain and host, disable for testing with self-signed certificates, default to True
    topic_prefix: hostname # All messages will have that prefix added, remove if you dont need this.
    client_id: bt-mqtt-gateway
    availability_topic: lwt_topic

    – dove specifico https?
    – nell’host, specific IP o external URL?
    – come configure la CA?

    mmmm sono bloccato qua 😛

    • Giampi ha detto:

      Non é necessario usare una configurazione mqtt “crittografata”, nel caso tu volessi, ti conviene seguire una guida ad hoc.

  11. Giuseppe ha detto:

    ciao, ci sono possibilità di usare i sensori allagamento Xiaomi MiFlood BLE ? grazie

  12. Mattia ha detto:

    Salve, se io volessi utilizzare dei sensori collegati ad Arduino e che tramite bluetooth possono inviare i dati al gateway, cosa devo modificare nel file configuration.yaml ?

  13. Marco Olivari ha detto:

    Salve,
    il mio Hassio è in un nuc con proxmox, potrebbe funzionare anche creando una VM dedicata e inserendo un adattatore bluethoot?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Advertisment ad adsense adlogger