Hi all,
Wanna try to get this working and it's kind of OK with "mini NUT".
Service is started :
Code: Select all
[Unit]
Description=Beaconing Service
After=multi-user.target
[Service]
User=root
Type=idle
ExecStart=/home/pi/beaconservice.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
I changed the script a little bit to use Python 3 and I'm using DZ switch only and no DZ variable :
Code: Select all
#!/usr/bin/python3
# Based on mybeaconservice.py by jmleglise
# URL : https://github.com/jmleglise/mylittle-domoticz/
########################################################################
#
URL_DOMOTICZ = 'http://127.0.0.1:8080/json.htm?type=command¶m=switchlight&idx=PARAM_IDX&switchcmd=PARAM_CMD'
DOMOTICZ_USER=''
DOMOTICZ_PASS=''
SWITCH_MODE=1
#
# Configure your Beacons in the TAG_DATA table with : [Name,MacAddress,Timeout,0,idx,mode]
# Name : the name of the uservariable used in Domoticz
# macAddress : case insensitive
# Timeout is in secondes the elapsed time without a detection for switching the beacon AWAY. Ie :if your beacon emits every 3 to 8 seondes, a timeout of 15 secondes seems good.
# 0 : used by the script (will keep the time of the last broadcast)
# idx of the uservariable in Domoticz for this beacon
# mode : SWITCH_MODE = One update per status change / REPEAT_MODE has been disabled and is only available if you use a DZ VAR instead of DZ switch
TAG_DATA = [
["Tag_White","ee:8d:ff:be:bd:54",15,0,39,SWITCH_MODE,1],
["Tag_Blue","f8:e2:5c:ad:eb:f9",15,0,38,SWITCH_MODE,1]
]
import logging
# choose between DEBUG (log every information) or WARNING (change of state) or CRITICAL (only error)
logLevel=logging.WARNING
logOutFilename='/var/log/beacon_presence.log' # output LOG : File or console (comment this line to console output)
ABSENCE_FREQUENCY=5 # frequency of the test of absence. in seconde. (without detection, switch "AWAY")
################ Nothing to edit under this line #####################################################################################
import os
import subprocess
import sys
import struct
import bluetooth._bluetooth as bluez
import time
import requests
import signal
import threading
LE_META_EVENT = 0x3e
OGF_LE_CTL=0x08
OCF_LE_SET_SCAN_ENABLE=0x000C
EVT_LE_CONN_COMPLETE=0x01
EVT_LE_ADVERTISING_REPORT=0x02
def packed_bdaddr_to_string(bdaddr_packed):
return ':'.join('%02x'%i for i in struct.unpack("<BBBBBB", bdaddr_packed[::-1]))
def hci_toggle_le_scan(sock, enable):
cmd_pkt = struct.pack("<BB", enable, 0x00)
bluez.hci_send_cmd(sock, OGF_LE_CTL, OCF_LE_SET_SCAN_ENABLE, cmd_pkt)
def handler(signum = None, frame = None):
time.sleep(1) #here check if process is done
sys.exit(0)
for sig in [signal.SIGTERM, signal.SIGINT, signal.SIGHUP, signal.SIGQUIT]:
signal.signal(sig, handler)
def le_handle_connection_complete(pkt):
status, handle, role, peer_bdaddr_type = struct.unpack("<BHBB", pkt[0:5])
device_address = packed_bdaddr_to_string(pkt[5:11])
interval, latency, supervision_timeout, master_clock_accuracy = struct.unpack("<HHHB", pkt[11:])
def request_thread(idx, cmd, name):
try:
url = URL_DOMOTICZ
url=url.replace('PARAM_IDX',str(idx))
url=url.replace('PARAM_CMD',str(cmd))
url=url.replace('PARAM_NAME',str(name))
result = requests.get(url,auth=(DOMOTICZ_USER, DOMOTICZ_PASS))
logging.debug(" %s -> %s" % (threading.current_thread(), result))
except requests.ConnectionError as e:
logging.critical(' %s Request Failed %s - %s' % (threading.current_thread(), e, url) )
class CheckAbsenceThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
time.sleep(ABSENCE_FREQUENCY)
for tag in TAG_DATA:
elapsed_time_absence=time.time()-tag[3]
if elapsed_time_absence>=tag[2] : # sleep execute after the first Home check.
tag[6]=1
logging.warning('Tag %s not seen since %i sec => update absence',tag[0],elapsed_time_absence)
threadReqAway = threading.Thread(target=request_thread,args=(tag[4],"Off",tag[0]))
threadReqAway.start()
while True:
time.sleep(ABSENCE_FREQUENCY)
for tag in TAG_DATA:
elapsed_time_absence=time.time()-tag[3]
if elapsed_time_absence>=tag[2] and elapsed_time_absence<(tag[2]+ABSENCE_FREQUENCY) : #update when > timeout ant only 1 time , before the next absence check [>15sec <30sec]
tag[6]=1
logging.warning('Tag %s not seen since %i sec => update absence',tag[0],elapsed_time_absence)
threadReqAway = threading.Thread(target=request_thread,args=(tag[4],"Off",tag[0]))
threadReqAway.start()
FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
if "logOutFilename" in globals() :
logging.basicConfig(format=FORMAT,filename=logOutFilename,level=logLevel)
else:
logging.basicConfig(format=FORMAT,level=logLevel)
#Reset Bluetooth interface, hci0
os.system("hciconfig hci0 down")
os.system("hciconfig hci0 up")
#Make sure device is up
interface = subprocess.Popen(["hciconfig"], stdout=subprocess.PIPE, shell=True)
(output, err) = interface.communicate()
output = output.decode()
if "RUNNING" in output: #Check return of hciconfig to make sure it's up
logging.debug('OK hci0 interface is up and running !')
else:
logging.critical('Error : hci0 interface is NOT running. Do you have a BLE device connected to hci0 ? Check with hciconfig !')
sys.exit(1)
devId = 0
try:
sock = bluez.hci_open_dev(devId)
logging.debug('Connect to bluetooth device %i',devId)
except:
logging.critical('Unable to connect to bluetooth device...')
sys.exit(1)
old_filter = sock.getsockopt( bluez.SOL_HCI, bluez.HCI_FILTER, 14)
hci_toggle_le_scan(sock, 0x01)
for tag in TAG_DATA:
tag[3]=time.time()-tag[2] # initiate lastseen of every beacon "timeout" sec ago. = Every beacon will be AWAY. And so, beacons here will update
th=CheckAbsenceThread()
th.daemon=True
th.start()
while True:
old_filter = sock.getsockopt( bluez.SOL_HCI, bluez.HCI_FILTER, 14)
flt = bluez.hci_filter_new()
bluez.hci_filter_all_events(flt)
bluez.hci_filter_set_ptype(flt, bluez.HCI_EVENT_PKT)
sock.setsockopt( bluez.SOL_HCI, bluez.HCI_FILTER, flt )
pkt = sock.recv(255)
ptype, event, plen = struct.unpack("BBB", pkt[:3])
if event == bluez.EVT_INQUIRY_RESULT_WITH_RSSI:
i =0
elif event == bluez.EVT_NUM_COMP_PKTS:
i =0
elif event == bluez.EVT_DISCONN_COMPLETE:
i =0
elif event == LE_META_EVENT:
subevent, = struct.unpack("B", pkt[3:4])
pkt = pkt[4:]
if subevent == EVT_LE_CONN_COMPLETE:
le_handle_connection_complete(pkt)
elif subevent == EVT_LE_ADVERTISING_REPORT:
num_reports = struct.unpack("B", pkt[0:1])[0]
report_pkt_offset = 0
for i in range(0, num_reports):
macAdressSeen=packed_bdaddr_to_string(pkt[report_pkt_offset + 3:report_pkt_offset + 9])
for tag in TAG_DATA:
if macAdressSeen.lower() == tag[1].lower(): # MAC ADDRESS
#rssi = struct.unpack("b", pkt[-1:])[0]
#logging.debug('Tag %s Detected %s - RSSI %s - DATA unknown %s', tag[0], macAdressSeen, rssi,struct.unpack("b", pkt[-2:])[0]) # Signal strenght + unknown (hope it's battery life).
elapsed_time=time.time()-tag[3] # lastseen
if tag[5]==SWITCH_MODE and tag[6]==1 : # Update only once : after an absence (>timeout). It's back again
tag[6]=0
threadReqHome = threading.Thread(target=request_thread,args=(tag[4],"On",tag[0]))
threadReqHome.start()
logging.warning('Tag %s seen after an absence of %i sec : update presence',tag[0],elapsed_time)
tag[3]=time.time() # update lastseen
sock.setsockopt( bluez.SOL_HCI, bluez.HCI_FILTER, old_filter )
However... I am facing quite a lot false/positive (too many actually) :
Code: Select all
2020-01-19 00:01:39,861 - root - WARNING - Tag Tag_White not seen since 27 sec => update absence
2020-01-19 00:01:43,322 - root - WARNING - Tag Tag_White seen after an absence of 30 sec : update presence
2020-01-19 00:04:50,028 - root - WARNING - Tag Tag_White not seen since 28 sec => update absence
2020-01-19 00:04:52,469 - root - WARNING - Tag Tag_White seen after an absence of 30 sec : update presence
2020-01-19 00:06:30,135 - root - WARNING - Tag Tag_White not seen since 20 sec => update absence
2020-01-19 00:06:32,826 - root - WARNING - Tag Tag_White seen after an absence of 23 sec : update presence
2020-01-19 00:07:00,171 - root - WARNING - Tag Tag_White not seen since 23 sec => update absence
2020-01-19 00:07:03,684 - root - WARNING - Tag Tag_White seen after an absence of 27 sec : update presence
2020-01-19 00:24:21,041 - root - WARNING - Tag Tag_White not seen since 22 sec => update absence
2020-01-19 00:24:21,907 - root - WARNING - Tag Tag_White seen after an absence of 23 sec : update presence
2020-01-19 00:29:01,286 - root - WARNING - Tag Tag_White not seen since 20 sec => update absence
2020-01-19 00:29:03,668 - root - WARNING - Tag Tag_White seen after an absence of 23 sec : update presence
2020-01-19 01:14:23,523 - root - WARNING - Tag Tag_White not seen since 25 sec => update absence
2020-01-19 01:14:24,705 - root - WARNING - Tag Tag_White seen after an absence of 27 sec : update presence
2020-01-19 01:26:34,147 - root - WARNING - Tag Tag_White not seen since 23 sec => update absence
2020-01-19 01:26:34,200 - root - WARNING - Tag Tag_White seen after an absence of 23 sec : update presence
2020-01-19 02:11:30,844 - root - WARNING - Tag Tag_White seen after an absence of 24 sec : update presence
2020-01-19 02:11:33,148 - root - WARNING - Tag Tag_Blue seen after an absence of 27 sec : update presence
2020-01-19 02:20:55,742 - root - WARNING - Tag Tag_White not seen since 22 sec => update absence
2020-01-19 02:20:56,072 - root - WARNING - Tag Tag_White seen after an absence of 23 sec : update presence
2020-01-19 02:36:36,521 - root - WARNING - Tag Tag_White not seen since 25 sec => update absence
2020-01-19 02:36:37,816 - root - WARNING - Tag Tag_White seen after an absence of 27 sec : update presence
2020-01-19 02:56:57,501 - root - WARNING - Tag Tag_White not seen since 23 sec => update absence
2020-01-19 02:56:57,539 - root - WARNING - Tag Tag_White seen after an absence of 23 sec : update presence
2020-01-19 03:40:19,738 - root - WARNING - Tag Tag_White not seen since 20 sec => update absence
2020-01-19 03:40:22,818 - root - WARNING - Tag Tag_White seen after an absence of 23 sec : update presence
2020-01-19 03:41:29,813 - root - WARNING - Tag Tag_White not seen since 20 sec => update absence
2020-01-19 03:41:32,270 - root - WARNING - Tag Tag_White seen after an absence of 23 sec : update presence
2020-01-19 04:26:21,907 - root - WARNING - Tag Tag_White not seen since 22 sec => update absence
2020-01-19 04:26:30,214 - root - WARNING - Tag Tag_White seen after an absence of 30 sec : update presence
2020-01-19 04:30:32,131 - root - WARNING - Tag Tag_White not seen since 21 sec => update absence
2020-01-19 04:30:33,395 - root - WARNING - Tag Tag_White seen after an absence of 23 sec : update presence
2020-01-19 04:52:13,169 - root - WARNING - Tag Tag_White not seen since 22 sec => update absence
2020-01-19 04:52:14,134 - root - WARNING - Tag Tag_White seen after an absence of 23 sec : update presence
2020-01-19 05:05:53,888 - root - WARNING - Tag Tag_White not seen since 28 sec => update absence
2020-01-19 05:05:56,270 - root - WARNING - Tag Tag_White seen after an absence of 30 sec : update presence
2020-01-19 05:25:54,834 - root - WARNING - Tag Tag_White not seen since 21 sec => update absence
2020-01-19 05:26:08,265 - root - WARNING - Tag Tag_White seen after an absence of 34 sec : update presence
2020-01-19 05:42:25,594 - root - WARNING - Tag Tag_White not seen since 24 sec => update absence
2020-01-19 05:42:32,461 - root - WARNING - Tag Tag_White seen after an absence of 30 sec : update presence
2020-01-19 05:53:36,202 - root - WARNING - Tag Tag_White not seen since 26 sec => update absence
2020-01-19 05:53:36,302 - root - WARNING - Tag Tag_White seen after an absence of 27 sec : update presence
2020-01-19 06:08:37,021 - root - WARNING - Tag Tag_White not seen since 20 sec => update absence
2020-01-19 06:08:39,446 - root - WARNING - Tag Tag_White seen after an absence of 23 sec : update presence
2020-01-19 06:26:28,090 - root - WARNING - Tag Tag_White not seen since 26 sec => update absence
2020-01-19 06:26:36,427 - root - WARNING - Tag Tag_White seen after an absence of 34 sec : update presence
2020-01-19 06:43:59,080 - root - WARNING - Tag Tag_White not seen since 27 sec => update absence
2020-01-19 06:44:02,409 - root - WARNING - Tag Tag_White seen after an absence of 30 sec : update presence
2020-01-19 06:53:39,633 - root - WARNING - Tag Tag_White not seen since 21 sec => update absence
2020-01-19 06:53:41,379 - root - WARNING - Tag Tag_White seen after an absence of 23 sec : update presence
2020-01-19 07:09:30,328 - root - WARNING - Tag Tag_White not seen since 26 sec => update absence
2020-01-19 07:09:38,510 - root - WARNING - Tag Tag_White seen after an absence of 34 sec : update presence
2020-01-19 07:20:10,917 - root - WARNING - Tag Tag_White not seen since 22 sec => update absence
2020-01-19 07:20:23,089 - root - WARNING - Tag Tag_White seen after an absence of 34 sec : update presence
2020-01-19 07:22:01,031 - root - WARNING - Tag Tag_White not seen since 24 sec => update absence
2020-01-19 07:22:07,311 - root - WARNING - Tag Tag_White seen after an absence of 30 sec : update presence
2020-01-19 07:29:21,212 - root - WARNING - Tag Tag_White not seen since 24 sec => update absence
2020-01-19 07:29:42,769 - root - WARNING - Tag Tag_White seen after an absence of 46 sec : update presence
2020-01-19 07:41:41,879 - root - WARNING - Tag Tag_White not seen since 20 sec => update absence
2020-01-19 07:41:56,097 - root - WARNING - Tag Tag_White seen after an absence of 34 sec : update presence
2020-01-19 08:02:23,089 - root - WARNING - Tag Tag_White not seen since 26 sec => update absence
2020-01-19 08:02:23,458 - root - WARNING - Tag Tag_White seen after an absence of 27 sec : update presence
2020-01-19 08:08:13,435 - root - WARNING - Tag Tag_White not seen since 25 sec => update absence
2020-01-19 08:08:14,684 - root - WARNING - Tag Tag_White seen after an absence of 27 sec : update presence
2020-01-19 08:14:23,766 - root - WARNING - Tag Tag_White not seen since 21 sec => update absence
2020-01-19 08:14:25,231 - root - WARNING - Tag Tag_White seen after an absence of 23 sec : update presence
2020-01-19 08:19:04,047 - root - WARNING - Tag Tag_White not seen since 20 sec => update absence
2020-01-19 08:19:06,990 - root - WARNING - Tag Tag_White seen after an absence of 23 sec : update presence
2020-01-19 08:21:24,155 - root - WARNING - Tag Tag_White not seen since 21 sec => update absence
2020-01-19 08:21:25,949 - root - WARNING - Tag Tag_White seen after an absence of 23 sec : update presence
2020-01-19 08:49:35,666 - root - WARNING - Tag Tag_White not seen since 22 sec => update absence
2020-01-19 08:49:36,483 - root - WARNING - Tag Tag_White seen after an absence of 23 sec : update presence
2020-01-19 08:52:55,872 - root - WARNING - Tag Tag_White not seen since 25 sec => update absence
2020-01-19 08:53:04,955 - root - WARNING - Tag Tag_White seen after an absence of 34 sec : update presence
2020-01-19 09:03:16,462 - root - WARNING - Tag Tag_White not seen since 20 sec => update absence
2020-01-19 09:03:18,630 - root - WARNING - Tag Tag_White seen after an absence of 23 sec : update presence
2020-01-19 09:20:57,489 - root - WARNING - Tag Tag_White not seen since 24 sec => update absence
2020-01-19 09:21:00,166 - root - WARNING - Tag Tag_White seen after an absence of 27 sec : update presence
2020-01-19 09:32:38,116 - root - WARNING - Tag Tag_White not seen since 22 sec => update absence
2020-01-19 09:32:38,745 - root - WARNING - Tag Tag_White seen after an absence of 23 sec : update presence
2020-01-19 09:44:28,735 - root - WARNING - Tag Tag_White not seen since 22 sec => update absence
2020-01-19 09:44:28,991 - root - WARNING - Tag Tag_White seen after an absence of 23 sec : update presence
2020-01-19 10:02:19,752 - root - WARNING - Tag Tag_Blue not seen since 24 sec => update absence
2020-01-19 10:03:04,345 - root - WARNING - Tag Tag_Blue seen after an absence of 68 sec : update presence
2020-01-19 10:14:40,359 - root - WARNING - Tag Tag_White not seen since 28 sec => update absence
2020-01-19 10:17:20,116 - root - WARNING - Tag Tag_White seen after an absence of 187 sec : update presence
2020-01-19 10:17:40,542 - root - WARNING - Tag Tag_White not seen since 20 sec => update absence
2020-01-19 10:38:41,564 - root - WARNING - Tag Tag_Blue not seen since 22 sec => update absence
2020-01-19 10:38:42,676 - root - WARNING - Tag Tag_Blue seen after an absence of 23 sec : update presence
2020-01-19 11:52:54,206 - root - WARNING - Tag Tag_Blue not seen since 24 sec => update absence
2020-01-19 11:53:24,184 - root - WARNING - Tag Tag_Blue seen after an absence of 54 sec : update presence
2020-01-19 11:53:44,262 - root - WARNING - Tag Tag_Blue not seen since 20 sec => update absence
2020-01-19 11:54:02,790 - root - WARNING - Tag Tag_Blue seen after an absence of 38 sec : update presence
2020-01-19 11:54:24,307 - root - WARNING - Tag Tag_Blue not seen since 21 sec => update absence
2020-01-19 12:30:27,773 - root - WARNING - Tag Tag_Blue seen after an absence of 2184 sec : update presence
2020-01-19 12:30:32,816 - root - WARNING - Tag Tag_White seen after an absence of 7992 sec : update presence
2020-01-19 12:30:56,187 - root - WARNING - Tag Tag_White not seen since 23 sec => update absence
2020-01-19 12:30:56,193 - root - WARNING - Tag Tag_Blue not seen since 28 sec => update absence
2020-01-19 12:45:11,713 - root - WARNING - Tag Tag_Blue seen after an absence of 883 sec : update presence
2020-01-19 12:46:03,066 - root - WARNING - Tag Tag_White seen after an absence of 930 sec : update presence
2020-01-19 12:46:06,888 - root - WARNING - Tag Tag_Blue not seen since 23 sec => update absence
2020-01-19 12:46:28,925 - root - WARNING - Tag Tag_Blue seen after an absence of 45 sec : update presence
2020-01-19 12:46:46,919 - root - WARNING - Tag Tag_White not seen since 25 sec => update absence
2020-01-19 12:46:56,934 - root - WARNING - Tag Tag_Blue not seen since 28 sec => update absence
2020-01-19 12:52:22,590 - root - WARNING - Tag Tag_White seen after an absence of 361 sec : update presence
2020-01-19 12:52:33,920 - root - WARNING - Tag Tag_Blue seen after an absence of 364 sec : update presence
2020-01-19 12:52:47,282 - root - WARNING - Tag Tag_White not seen since 24 sec => update absence
2020-01-19 12:52:57,298 - root - WARNING - Tag Tag_Blue not seen since 23 sec => update absence
2020-01-19 12:54:04,826 - root - WARNING - Tag Tag_Blue seen after an absence of 90 sec : update presence
2020-01-19 12:54:37,402 - root - WARNING - Tag Tag_Blue not seen since 20 sec => update absence
2020-01-19 12:54:49,529 - root - WARNING - Tag Tag_Blue seen after an absence of 33 sec : update presence
2020-01-19 12:55:47,472 - root - WARNING - Tag Tag_Blue not seen since 23 sec => update absence
2020-01-19 12:56:01,629 - root - WARNING - Tag Tag_Blue seen after an absence of 37 sec : update presence
2020-01-19 12:56:37,522 - root - WARNING - Tag Tag_Blue not seen since 20 sec => update absence
2020-01-19 12:57:41,242 - root - WARNING - Tag Tag_White seen after an absence of 318 sec : update presence
2020-01-19 12:58:47,629 - root - WARNING - Tag Tag_White not seen since 26 sec => update absence
Both TAGS were at home today...
Since i'm also using l2ping to ping the Bluetooth of my phone and i can't use l2ping to ping "mini NUT", is anyone knowing a bluetooth beacon which responds to l2ping command ?
Thank you