Check della presenza di un Bluetooth device in python

Check della presenza di un Bluetooth device in python

Su Raspbian e Linux in generale vi sono diversi tool che permettono di effettuale lo scanning dei diversi dispositivi bluetooth. Tra questi hcitool e bluetoothctl.

I due tool sono abbastanza simili, ma noi useremo per i nostri scopi hcitool perchè per i nostri scopi risulta più efficiente.

Verifichiamo lo stato del servizio che gestisce il bluetooth.

sudo systemctl status bluetooth

Se è tutto in ordine possiamo passare a realizzare un programma in python che verifichi la presenza di un determinato device bluetooth e, in ragione di questa, cambi una variabile utente in Domoticz. Abbiamo utilizzato un semplice tag come questo. Questi tag funzionano mediante il protocollo Bluetooth LE che a fronte di un numero ridotto di comandi consente un notevole risparmio di energia e, di conseguenza, rende la carica della batteria di questi dispositivi di lunga durata.

Il programma realizzato è il seguente. Andiamo ad analizzarlo

import os
import signal
import subprocess
import sys
import time
import json
import datetime
import urllib.request, urllib.error, urllib.parse

mac1="Indirizzo MAC bluetooth da verificare"
domoticzIP = "Indirizzo IP Domoticz"
domoticzPort = "Porta Domoticz"


def domoticzrequest (url):
  request2 = urllib.request.Request(url,headers={'User-Agent': 'Mozilla/5.0'})
  response = urllib.request.urlopen(request2)
  return response.read()


cmd=['/bin/timeout','-s','INT','5s','hcitool','lescan']

try:
   output = subprocess.run(cmd, capture_output=True)
   if (str(output).find(mac1) != -1):
      print("Contains given substring ")
      domoticzurl = "http://" + domoticzIP + ":" + domoticzPort + "/json.htm?type=command&param=updateuservariable&vname=Tel1&vtype=2&vvalue=ON"
      json_object = json.loads(domoticzrequest(domoticzurl))
   else:
      print("Doesn't contains given substring")
      domoticzurl = "http://" + domoticzIP + ":" + domoticzPort + "/json.htm?type=command&param=updateuservariable&vname=Tel1&vtype=2&vvalue=OFF"
      json_object = json.loads(domoticzrequest(domoticzurl))
except subprocess.TimeoutExpired:
   print('process ran too long')

Defininiamo anzitutto le variabili che ci serviranno. Rispettivamente il MAC address del device da localizzare, l’inidirizzo IP e porta di Domoticz.

mac1="Indirizzo MAC bluetooth da verificare"
domoticzIP = "Indirizzo IP Domoticz" 
domoticzPort = "Porta Domoticz"

Definiamo quindi la funzione che ci permetterà di inviare la richiesta di modifica della variabile utente a Domoticz.

def domoticzrequest (url):

Definiamo il comando per la scansione

cmd=['/bin/timeout','-s','INT','5s','hcitool','lescan']

In realtà il comando effettivo per la scansione è “hcitool lescan”, ma così come è scritto questo effettuerebbe una scansione all’infinito.

Per evitare che questo accada, viene abbinato al comando timeout che consente di interrompere la scansione dopo un tempo definito. Nel nostro caso, dopo qualche test abbiamo deciso di impostare questo tempo a 5 secondi.

Di seguito il comando contenuto nella stringa “cmd” verrà eseguito invocando al seguente funzione subprocess.run

output = subprocess.run(cmd, capture_output=True)

subprocess.run consente, mediante l’opzione capture_output=True, di catturarne il risultato che verrà posto nella variabile output.

A questo punto andremo a cercare in questa stringa l’indirizzo MAC del device la cui presenza vogliamo confermare.

Se l’indirizzo è presente la funzione “find” restituirà un valore diverso da -1.

A quel punto costruiremo la stringa json che serve ad impostare la variabile utente.

domoticzurl = "http://" + domoticzIP + ":" + domoticzPort + "/json.htm?type=command&param=updateuservariable&vname=Tel1&vtype=2&vvalue=ON"

Nel nostro caso la variabile è “Tel1” e il valore inviaro è “ON”.

Inviamo quindi questa url mediante l’oggetto json con il seguente comando:

json_object = json.loads(domoticzrequest(domoticzurl))

Lo script verrà poi eseguito periodicamente via crontab.

Andiamo a digitare il comando “crontab -e” e aggiungiamo la seguente riga per eseguirlo ogni dieci minuti.

*/10 * * * * python3 /home/<utente>/bluetoothpresencescan.py

Dove bluetoothpresencescan.py è il nome dello script in python e <utente> è il nome dell’utente con cui siamo collegati.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.