class tcpu(threading.Thread): def __init__(self, timesleep, post2OneNet): threading.Thread.__init__(self) self.__flag = threading.Event() # 用于暂停线程的标识 self.__flag.set() # 设置为True self.__running = threading.Event() # 用于停止线程的标识 self.__running.set() # 将running设置为True #setDaemon(True)当主线程结束之后,会杀死子线程;如果加上join,并设置等待时间,就会等待线程一段时间再退出 self.setDaemon(True) self.cpum = [0, 0] self.cputimesleep = 1 self.timesleep = timesleep self.onenet = OneNetApi() self.post2OneNet = post2OneNet def run(self): while self.__running.isSet(): time.sleep(self.cputimesleep) self.cpum = self.cpu_usage() if self.post2OneNet: self.onenet.num += 1 if self.onenet.num >= 10: if BasicDef.get_network_status(): self.onenet.set_post_data_flow("CPU", self.cpum[0]) r = self.onenet.post_data_flow() self.onenet.num = 0 def cpu_usage(self, interval=1): # load average, uptime uptime = datetime.datetime.now() - datetime.datetime.fromtimestamp( psutil.boot_time()) cpu = psutil.cpu_percent(interval) return [cpu, uptime] def pause(self): self.__flag.clear() # 设置为False, 让线程阻塞 def resume(self): self.__flag.set() # 设置为True, 让线程停止阻塞 def stop(self): self.__flag.set() # 将线程从暂停状态恢复, 如何已经暂停的话 self.__running.clear() # 设置为False
class tdht22(threading.Thread): def __init__(self, pin, post2OneNet): threading.Thread.__init__(self) self.__flag = threading.Event() # 用于暂停线程的标识 self.__flag.set() # 设置为True self.__running = threading.Event() # 用于停止线程的标识 self.__running.set() # 将running设置为True #setDaemon(True)当主线程结束之后,会杀死子线程;如果加上join,并设置等待时间,就会等待线程一段时间再退出 self.setDaemon(True) self.T_H = [0, 0] self.timesleep = 1 #温湿度传感器DHT22 self.sensor = Adafruit_DHT.DHT22 self.pin = pin self.post2OneNet = post2OneNet if post2OneNet: self.onenet = OneNetApi() def run(self): while self.__running.isSet(): time.sleep(self.timesleep) is_T_H = self.getTH() if is_T_H != False: self.T_H = is_T_H if self.post2OneNet: self.onenet.num += 1 if self.onenet.num >= 1: if BasicDef.get_network_status(): self.onenet.set_post_data_flow("T", self.T_H[0]) self.onenet.set_post_data_flow("H", self.T_H[1]) r = self.onenet.post_data_flow() self.onenet.num = 0 def getTH(self): try: humidity, temperature = Adafruit_DHT.read_retry(self.sensor, self.pin)#24 是 GPIO 的引脚编号 # print(humidity, end='') # print(" ", end='') # print(temperature) except OSError as e: print("Can't find DHT22") return False if humidity == None: return False if temperature == None: return False H = round(humidity,2) T = round(temperature,2) return [T, H] #传感器温度数据校验,将偏差值较大数据丢弃 def checkT(): return "" #传感器湿度数据校验,将偏差值较大数据丢弃 def checkH(): return "" def pause(self): self.__flag.clear() # 设置为False, 让线程阻塞 def resume(self): self.__flag.set() # 设置为True, 让线程停止阻塞 def stop(self): self.__flag.set() # 将线程从暂停状态恢复, 如何已经暂停的话 self.__running.clear() # 设置为False
class ts80053(threading.Thread): def __init__(self, usbdevice, post2OneNet=False, timesleep=2): threading.Thread.__init__(self) self.__flag = threading.Event() # 用于暂停线程的标识 self.__flag.set() # 设置为True self.__running = threading.Event() # 用于停止线程的标识 self.__running.set() # 将running设置为True #setDaemon(True)当主线程结束之后,会杀死子线程;如果加上join,并设置等待时间,就会等待线程一段时间再退出 self.setDaemon(True) self.timesleep = timesleep #usb口转UART CH340 self.device = usbdevice self.client = None self.is_device = True self.post2OneNet = post2OneNet if post2OneNet: self.onenet = OneNetApi() def run(self): self.is_device = self.connect_s80053() while self.__running.isSet(): time.sleep(self.timesleep) if self.is_device: self.co2 = self.read_CO2() if self.post2OneNet: self.onenet.num += 1 if self.onenet.num >= 5: if BasicDef.get_network_status(): self.onenet.set_post_data_flow("co2", self.co2) r = self.onenet.post_data_flow() self.onenet.num = 0 def connect_s80053(self): self.client = ModbusSerialClient(method='rtu', port=self.device, stopbits=1, bytesize=8, baudrate=9600, timeout=0.5) if not self.client.connect(): print("Unable to connect to %s", self.device) return False else: return True def close(self): self.client.close() def read_CO2(self): response = self.client.read_input_registers(address=3, count=1, unit=0xFE) co2 = response.getRegister(0) return co2 #传感器XX数据校验,将偏差值较大数据丢弃 def check(): return "" def pause(self): self.__flag.clear() # 设置为False, 让线程阻塞 def resume(self): self.__flag.set() # 设置为True, 让线程停止阻塞 def stop(self): self.__flag.set() # 将线程从暂停状态恢复, 如何已经暂停的话 self.__running.clear() # 设置为False self.close() # def main(): # usbdevice = '/dev/ttyUSB0' # s80053thread = ts80053(usbdevice) # if not s80053thread.connect_s80053(): # sys.exit(0) # else: # s80053thread.start() # while True: # time.sleep(3) # print(s80053thread.co2) # if __name__ == "__main__": # try: # main() # except KeyboardInterrupt: # pass
class tpmsa003(threading.Thread): def __init__(self, usbdevice, post2OneNet, timesleep=2): threading.Thread.__init__(self) self.__flag = threading.Event() # 用于暂停线程的标识 self.__flag.set() # 设置为True self.__running = threading.Event() # 用于停止线程的标识 self.__running.set() # 将running设置为True #setDaemon(True)当主线程结束之后,会杀死子线程;如果加上join,并设置等待时间,就会等待线程一段时间再退出 self.setDaemon(True) self.timesleep = timesleep #usb口转UART CH340 self.device = usbdevice self.timestamp = None self.apm10 = 0 self.apm25 = 0 self.apm100 = 0 self.pm25 = 0 self.pm10 = 0 self.pm100 = 0 self.gt03um = 0 self.gt05um = 0 self.gt10um = 0 self.gt25um = 0 self.gt50um = 0 self.gt100um = 0 self.all_PMS = [] self.pm_res = False self.is_device = True self.post2OneNet = post2OneNet if post2OneNet: self.onenet = OneNetApi() def run(self): #初始化pm传感器失败时 try: self.open_pm_port() except OSError as e: self.is_device = False print("Unable to connect to %s", self.device) return self.is_device while self.__running.isSet(): time.sleep(self.timesleep) self.pm_res = self.get_pm_data() if self.pm_res == False: continue self.timestamp = self.pm_res['timestamp'] self.apm10 = self.pm_res['apm10'] self.apm25 = self.pm_res['apm25'] self.apm100 = self.pm_res['apm100'] self.pm25 = self.pm_res['pm25'] self.pm10 = self.pm_res['pm10'] self.pm100 = self.pm_res['pm100'] self.gt03um = self.pm_res['gt03um'] self.gt05um = self.pm_res['gt05um'] self.gt10um = self.pm_res['gt10um'] self.gt25um = self.pm_res['gt25um'] self.gt50um = self.pm_res['gt50um'] self.gt100um = self.pm_res['gt100um'] self.all_PMS = [ self.apm10, self.apm25, self.apm100, self.pm10, self.pm25, self.pm100, self.gt03um, self.gt05um, self.gt10um, self.gt25um, self.gt50um, self.gt100um ] if self.post2OneNet: self.onenet.num += 1 if self.onenet.num >= 10: if BasicDef.get_network_status(): self.onenet.set_post_data_flow("apm10", self.apm10) self.onenet.set_post_data_flow("apm25", self.apm25) self.onenet.set_post_data_flow("pm10", self.pm10) self.onenet.set_post_data_flow("pm25", self.pm25) # self.onenet.set_post_data_flow("gt03um", self.gt03um) # self.onenet.set_post_data_flow("gt05um", self.gt05um) r = self.onenet.post_data_flow() self.onenet.num = 0 def open_pm_port(self): self.port = serial.Serial(self.device, baudrate=9600, timeout=2.0) #默认主动模式,不需要发送数据 #self.port.write(b'\x42\x4D\xE1\x00\x00\x01\x70') def read_pm_line(self): rv = b'' while True: ch1 = self.port.read() if ch1 == b'\x42': ch2 = self.port.read() if ch2 == b'\x4d': rv += ch1 + ch2 rv += self.port.read(30) return rv def get_pm_data(self): rcv = self.read_pm_line() # print(rcv) if sum(rcv[:-2]) == rcv[-2] * 256 + rcv[-1]: res = { 'timestamp': self.getDateTime(), 'apm10': rcv[4] * 256 + rcv[5], 'apm25': rcv[6] * 256 + rcv[7], 'apm100': rcv[8] * 256 + rcv[9], 'pm10': rcv[10] * 256 + rcv[11], 'pm25': rcv[12] * 256 + rcv[13], 'pm100': rcv[14] * 256 + rcv[15], 'gt03um': rcv[16] * 256 + rcv[17], 'gt05um': rcv[18] * 256 + rcv[19], 'gt10um': rcv[20] * 256 + rcv[21], 'gt25um': rcv[22] * 256 + rcv[23], 'gt50um': rcv[24] * 256 + rcv[25], 'gt100um': rcv[26] * 256 + rcv[27] } return res else: return False #传感器XX数据校验,将偏差值较大数据丢弃 def checkT(): return "" def getDateTime(self): dt = datetime.datetime.now() return dt.strftime('%x %H:%M:%S %p') def pause(self): self.__flag.clear() # 设置为False, 让线程阻塞 def resume(self): self.__flag.set() # 设置为True, 让线程停止阻塞 def stop(self): self.__flag.set() # 将线程从暂停状态恢复, 如何已经暂停的话 self.__running.clear() # 设置为False