def le_advertise_packet_handler(mac, adv_type, data, rssi): data_str = raw_packet_to_str(data) # Check for ATC preamble if data_str[6:10] == '1a18': temp = int(data_str[22:26], 16) / 10 hum = int(data_str[26:28], 16) batt = int(data_str[28:30], 16) print("%s - Device: %s Temp: %sc Humidity: %s%% Batt: %s%%" % \ (datetime.now().strftime("%Y-%m-%d %H:%M:%S"), mac, temp, hum, batt)) sub_call = f"/home/openhabian/python/sendToMQTT.sh {temp} {hum} {batt} {mac}" subprocess.call(sub_call, shell=True)
def le_advertise_packet_handler(mac, data, rssi): global prev_data global prev_rot_val print() print("packet len is", len(data)) data_str = raw_packet_to_str(data) data_wo_rssi = (mac, data_str) print("BLE packet: %s %s %d" % (mac, data_str, rssi)) if prev_data is not None: if data_wo_rssi != prev_data: # color differences with previous packet data sys.stdout.write(' ' * 20 + 'data_diff=') for c1, c2 in zip(data_str, prev_data[1]): if c1 != c2: sys.stdout.write('\033[0;33m' + c1 + '\033[m') else: sys.stdout.write(c1) sys.stdout.write('\n') # Advertisement are split into: # <sub-packet length byte> <sub-packet type byte> <sub-packet data (length-1)>" # (types are listed here: https://www.bluetooth.com/specifications/assigned-numbers/generic-access-profile) pkt_start = 4 pkt_data_start = pkt_start + 2 pkt_data_len = data[pkt_start] - 1 assert data[pkt_start + 1] == 0x09 # Type should be "Complete Local Name" print("name is %r" % data[pkt_data_start:pkt_data_start + pkt_data_len].decode('utf-8')) pkt_start = pkt_data_start + pkt_data_len pkt_data_start = pkt_start + 2 pkt_data_len = data[pkt_start] - 1 assert data[pkt_start + 1] == 0xFF # Type should be "Manufacturer Specific Data" print("manufacturer data len is", pkt_data_len) my_data = data[pkt_data_start:pkt_data_start + pkt_data_len] my_data = struct.unpack('B' * pkt_data_len, my_data) print("manufacturer data is", my_data) if my_data[2] == 1: key = pynput.keyboard.Key.right key = KEY_VOLUME_UP keyboard.press(key); keyboard.release(key) elif my_data[2] == 2: key = pynput.keyboard.Key.left key = KEY_VOLUME_DOWN keyboard.press(key); keyboard.release(key) prev_rot_val = my_data[1] prev_data = data_wo_rssi
def le_advertise_packet_handler(mac, adv_type, data, rssi): global prev_data data_str = raw_packet_to_str(data) data_wo_rssi = (mac, data_str) print("BLE packet: %s %02x %s %d" % (mac, adv_type, data_str, rssi)) if prev_data is not None: if data_wo_rssi != prev_data: # color differences with previous packet data sys.stdout.write(' ' * 35 + 'data_diff=') for c1, c2 in zip(data_str, prev_data[1]): if c1 != c2: sys.stdout.write('\033[0;33m' + c1 + '\033[m') else: sys.stdout.write(c1) sys.stdout.write('\n') prev_data = data_wo_rssi
def le_advertise_packet_handler(mac, adv_type, data, rssi): data_str = raw_packet_to_str(data) # Check for ATC preamble if data_str[6:10] == '1a18': temp_raw = int(data_str[22:26], 16) if temp_raw > 1000: temp_raw = temp_raw - 65535 temp = round((temp_raw / 10) * 1.8 + 32, 1) hum = int(data_str[26:28], 16) batt = int(data_str[28:30], 16) temperature_payload = 'MQTT:home/' + deviceName[ mac] + '/temperature:' + str(temp) humidity_payload = 'MQTT:home/' + deviceName[ mac] + '/humidity:' + str(hum) battery_payload = 'MQTT:home/' + deviceName[ mac] + '/battery:' + str(batt) if ser.inWaiting() > 0: time.sleep(0.1) r_buff = ser.read(ser.inWaiting()) if r_buff == RET_REG[0]: print("BROADCAST and MONITOR mode was actived") GPIO.output(M1, GPIO.LOW) time.sleep(0.01) r_buff = "" ser.write(temperature_payload.encode('ascii')) time.sleep(1) # ser.write(('|').encode('ascii')) ser.write(humidity_payload.encode('ascii')) time.sleep(1) # ser.write(('|').encode('ascii')) ser.write(battery_payload.encode('ascii')) time.sleep(1) print(temperature_payload) print(humidity_payload) print(battery_payload)
def le_advertise_packet_handler(mac, adv_type, data, rssi): global lastBLEPaketReceived if args.watchdogtimer: lastBLEPaketReceived = time.time() lastBLEPaketReceived = time.time() #print("reveived BLE packet") data_str = raw_packet_to_str(data) ATCPaketMAC = data_str[10:22].upper() macStr = mac.replace(":", "").upper() atcIdentifier = data_str[6:10].upper() if (atcIdentifier == "1A18" and ATCPaketMAC == macStr) and not args.onlydevicelist or ( atcIdentifier == "1A18" and mac in sensors ): #only Data from ATC devices, double checked advNumber = data_str[-2:] if macStr in advCounter: lastAdvNumber = advCounter[macStr] else: lastAdvNumber = None if lastAdvNumber == None or lastAdvNumber != advNumber: advCounter[macStr] = advNumber print("BLE packet: %s %02x %s %d" % (mac, adv_type, data_str, rssi)) #print("AdvNumber: ", advNumber) #temp = data_str[22:26].encode('utf-8') #temperature = int.from_bytes(bytearray.fromhex(data_str[22:26]),byteorder='big') / 10. global measurements measurement = Measurement(0, 0, 0, 0, 0, 0, 0, 0) if args.influxdb == 1: measurement.timestamp = int((time.time() // 10) * 10) else: measurement.timestamp = int(time.time()) #temperature = int(data_str[22:26],16) / 10. temperature = int.from_bytes(bytearray.fromhex( data_str[22:26]), byteorder='big', signed=True) / 10. print("Temperature: ", temperature) humidity = int(data_str[26:28], 16) print("Humidity: ", humidity) batteryVoltage = int(data_str[30:34], 16) / 1000 print("Battery voltage:", batteryVoltage, "V") print("RSSI:", rssi, "dBm") if args.battery: batteryPercent = int(data_str[28:30], 16) print("Battery:", batteryPercent, "%") measurement.battery = batteryPercent measurement.humidity = humidity measurement.temperature = temperature measurement.voltage = batteryVoltage measurement.rssi = rssi if mac in sensors: try: measurement.sensorname = sensors[mac]["sensorname"] except: measurement.sensorname = mac if "offset1" in sensors[mac] and "offset2" in sensors[ mac] and "calpoint1" in sensors[ mac] and "calpoint2" in sensors[mac]: measurement.humidity = calibrateHumidity2Points( humidity, int(sensors[mac]["offset1"]), int(sensors[mac]["offset2"]), int(sensors[mac]["calpoint1"]), int(sensors[mac]["calpoint2"])) print( "Humidity calibrated (2 points calibration): ", measurement.humidity) elif "humidityOffset" in sensors[mac]: measurement.humidity = humidity + int( sensors[mac]["humidityOffset"]) print("Humidity calibrated (offset calibration): ", measurement.humidity) else: measurement.sensorname = mac if (args.callback): measurements.append(measurement) #print("Length:", len(measurements)) print("")
def le_advertise_packet_handler(mac, adv_type, data, rssi): global lastBLEPaketReceived if args.watchdogtimer: lastBLEPaketReceived = time.time() lastBLEPaketReceived = time.time() data_str = raw_packet_to_str(data) preeamble = "10161a18" paketStart = data_str.find(preeamble) offset = paketStart + len(preeamble) #print("reveived BLE packet")+ atcData_str = data_str[offset:offset + 26] ATCPaketMAC = atcData_str[0:12].upper() macStr = mac.replace(":", "").upper() atcIdentifier = data_str[(offset - 4):offset].upper() if (atcIdentifier == "1A18" and ATCPaketMAC == macStr) and not args.onlydevicelist or ( atcIdentifier == "1A18" and mac in sensors) and len( atcData_str ) == 26: #only Data from ATC devices, double checked advNumber = atcData_str[-2:] if macStr in advCounter: lastAdvNumber = advCounter[macStr] else: lastAdvNumber = None if lastAdvNumber == None or lastAdvNumber != advNumber: advCounter[macStr] = advNumber print("BLE packet: %s %02x %s %d" % (mac, adv_type, data_str, rssi)) #print("AdvNumber: ", advNumber) #temp = data_str[22:26].encode('utf-8') #temperature = int.from_bytes(bytearray.fromhex(data_str[22:26]),byteorder='big') / 10. global measurements measurement = Measurement(0, 0, 0, 0, 0, 0, 0, 0) if args.influxdb == 1: measurement.timestamp = int((time.time() // 10) * 10) else: measurement.timestamp = int(time.time()) #temperature = int(data_str[22:26],16) / 10. temperature = int.from_bytes(bytearray.fromhex( atcData_str[12:16]), byteorder='big', signed=True) / 10. print("Temperature: ", temperature) humidity = int(atcData_str[16:18], 16) print("Humidity: ", humidity) batteryVoltage = int(atcData_str[20:24], 16) / 1000 print("Battery voltage:", batteryVoltage, "V") print("RSSI:", rssi, "dBm") #if args.battery: batteryPercent = int(atcData_str[18:20], 16) print("Battery:", batteryPercent, "%") measurement.battery = batteryPercent measurement.humidity = humidity measurement.temperature = temperature measurement.voltage = batteryVoltage measurement.rssi = rssi currentMQTTTopic = MQTTTopic if mac in sensors: try: measurement.sensorname = sensors[mac]["sensorname"] except: measurement.sensorname = mac if "offset1" in sensors[mac] and "offset2" in sensors[ mac] and "calpoint1" in sensors[ mac] and "calpoint2" in sensors[mac]: measurement.humidity = calibrateHumidity2Points( humidity, int(sensors[mac]["offset1"]), int(sensors[mac]["offset2"]), int(sensors[mac]["calpoint1"]), int(sensors[mac]["calpoint2"])) print( "Humidity calibrated (2 points calibration): ", measurement.humidity) elif "humidityOffset" in sensors[mac]: measurement.humidity = humidity + int( sensors[mac]["humidityOffset"]) print("Humidity calibrated (offset calibration): ", measurement.humidity) if "topic" in sensors[mac]: currentMQTTTopic = sensors[mac]["topic"] else: measurement.sensorname = mac if measurement.calibratedHumidity == 0: measurement.calibratedHumidity = measurement.humidity if (args.callback): measurements.append(measurement) if (args.mqttconfigfile): jsonString = buildJSONString(measurement) myMQTTPublish(currentMQTTTopic, jsonString) #MQTTClient.publish(currentMQTTTopic,jsonString,1) #print("Length:", len(measurements)) print("")
def le_advertise_packet_handler(mac, adv_type, data, rssi): global lastBLEPacketReceived if args.watchdogtimer: lastBLEPacketReceived = time.time() lastBLEPacketReceived = time.time() data_str = raw_packet_to_str(data) global measurements measurement = Measurement(0,0,0,0,0,0,0,0) measurement = ( decode_data_atc(mac, adv_type, data_str, rssi, measurement) or decode_data_qingping(mac, adv_type, data_str, rssi, measurement) ) if measurement: if args.influxdb == 1: measurement.timestamp = int((time.time() // 10) * 10) else: measurement.timestamp = int(time.time()) if args.round: measurement.temperature=round(measurement.temperature,1) measurement.humidity=round(measurement.humidity,1) if mac in sensors and "sensorname" in sensors[mac]: print("Sensorname:", sensors[mac]["sensorname"]) print("Temperature: ", measurement.temperature) print("Humidity: ", measurement.humidity) if measurement.voltage != None: print ("Battery voltage:", measurement.voltage,"V") print ("RSSI:", rssi, "dBm") print ("Battery:", measurement.battery,"%") currentMQTTTopic = MQTTTopic if mac in sensors: try: measurement.sensorname = sensors[mac]["sensorname"] except: measurement.sensorname = mac if "offset1" in sensors[mac] and "offset2" in sensors[mac] and "calpoint1" in sensors[mac] and "calpoint2" in sensors[mac]: measurement.humidity = calibrateHumidity2Points(measurement.humidity,int(sensors[mac]["offset1"]),int(sensors[mac]["offset2"]),int(sensors[mac]["calpoint1"]),int(sensors[mac]["calpoint2"])) print ("Humidity calibrated (2 points calibration): ", measurement.humidity) elif "humidityOffset" in sensors[mac]: measurement.humidity = measurement.humidity + int(sensors[mac]["humidityOffset"]) print ("Humidity calibrated (offset calibration): ", measurement.humidity) if "topic" in sensors[mac]: currentMQTTTopic=sensors[mac]["topic"] else: measurement.sensorname = mac if measurement.calibratedHumidity == 0: measurement.calibratedHumidity = measurement.humidity if args.callback or args.httpcallback: measurements.append(measurement) if args.mqttconfigfile: jsonString=buildJSONString(measurement) myMQTTPublish(currentMQTTTopic,jsonString) #MQTTClient.publish(currentMQTTTopic,jsonString,1) #print("Length:", len(measurements)) print("")