Esempio n. 1
0
 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)
Esempio n. 5
0
        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("")
Esempio n. 7
0
		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("")