環境センサRS-BTEVS1のBLE AdvertisingData受信 – サンプルスクリプト[btevs1_widget_01.py]

 
サンプルスクリプト [btevs1_widget_01.py]

"""
Receive BLE AdvertisingData from RS-BTEVS1 and make widget on Windows11
        Python 3.11 amd bleak 0.20.2(2023-04-19)
        btevs1_test_06.py  1R0  7-July-2023
        Copyright 2023 RATOC SYstems, Inc. Osaka Japan
"""
import asyncio
from bleak import BleakScanner
import time

from tkinter import Label  # Tk
import tkinter.ttk as ttk
import tkinter as tk


#  Get AdvertisementData
 
async def get_advdata():
    global label
    global scanner      # = BleakScanner()
    global prv_dsptxt

    btevs1 = 'F5:7A:BC:3E:B5:0A'
        
    print("wait AdvertisementData")
    
    await scanner.start()
    await asyncio.sleep(10.0)
    await scanner.stop()

    devices = scanner.discovered_devices_and_advertisement_data
   
    print("Discover device: ", devices )        # Dict[ str, Tuple[BLEdevice,AdvertisementData]]
    if devices != {}:
        if btevs1 in devices:
            tp = devices[ btevs1 ]
            print("Tuple: ", tp[1])
            if tp != None:
                advd = tp[1]                            # get AdvertisingData
                vd = advd.manufacturer_data.get(2912)   # 2912 = 0x0B60 : RATOC Systems   
                if vd != None:
                    #print("v:", vd )
                    co2d = vd[0:0+2]
                    co2 =int.from_bytes(co2d, byteorder='little', signed=False)
                    tempd = vd[6:6+2]
                    temp =int.from_bytes(tempd, byteorder='little', signed=False)
                    temp = temp/10
                    hm = vd[8]
                    rsval = advd.rssi
                    dev_name = advd.local_name
                    print("RSSI:", rsval, dev_name )
                    print("CO2:", co2, "ppm Temp:", temp,"℃ ",hm, "%")
                    prv_dsptxt = "CO2 : "+str(co2)+"ppm" + "\r\n"+ " 温度:"+str(temp)+"℃ 湿度:"+str(hm) + "%"
                    now = time.strftime("%H:%M:%S")
                    print( now )
                    # dsp_txt = prv_dsptxt
                    # retuen dsp_txt                
    dsp_txt = prv_dsptxt 
    return dsp_txt
    
def tick():
    global root
    global label
    global prv_dsptxt

    now = time.strftime("%H:%M:%S")
    now_sec = now[6:6+2]

    if now_sec == "00":
        dsp_txt= asyncio.run( get_advdata())
        prv_dsptxt = dsp_txt
    else:
        dsp_txt = prv_dsptxt

    now = time.strftime("%H:%M:%S")
    label.config(text=dsp_txt, font=("Times",'20'))
    root.title("BTEVS1 環境データ      " + now )
    label.after(1000, tick)
    return now

# Set up Main Window
root=tk.Tk()

w = root.winfo_screenwidth()
h = root.winfo_screenheight()

w = w-450
h = h-250

now = time.strftime("%H:%M:%S")
root.title("BTEVS1 環境データ      " + now )
root.geometry("400x150+"+str(w)+"+"+str(h))

# set up main frame and put it
frame = ttk.Frame(root)
#label_frame = tk.Label(frame)
#button_frame = tk.Button(frame)

frame.pack(fill = tk.BOTH, padx=20,pady=10)

scanner = BleakScanner()
dsp_txt= asyncio.run( get_advdata())
prv_dsptxt = dsp_txt

now = time.strftime("%H:%M:%S")

label = Label(frame, text=dsp_txt, font=("Times", '20'))

print("Loop Start","\r\n")

now = tick()

label.pack()

# main loop
root.mainloop()

print("end")


  ※ e2eStore会員ログインが必要です。