class TempSensorAdaptor(Thread): deviceConfigReader = None tempSensorEmulator = None enableTempEmulator = False currentTemp = 0 currentSensorData = None sh = None def __init__(self, configDir): Thread.__init__(self) self.deviceConfigReader = ConfigReader(configDir, "Device") self.sh = sense_hat.SenseHat() self.currentSensorData = SensorData("Temperature") #SensorEmulator simulates temperature range from 25 degree to 15 degree #temperature is changed after a random period of time in range 10 sec to 1 sec self.tempSensorEmulator = SensorEmulator(30, 15, 10, 1) self.tempSensorEmulator.daemon = True self.tempSensorEmulator.start() if self.deviceConfigReader.getProperty("enableEmulator") == "True": self.enableTempEmulator = True self.tempSensorEmulator.enableTempEmulator = True def getCurrentTemp(self): return self.currentTemp def getCurrentSensorData(self): self.currentSensorData.addNewValue( self.currentTemp) # refresh SensorData only when it is called. return self.currentSensorData def run(self): while True: if self.enableTempEmulator: #If enableTempEmulator is false then using sense_hat to get current temperature! self.currentTemp = self.tempSensorEmulator.getCurrValue() else: self.currentTemp = self.sh.get_temperature() def setflagEnableTempEmulator(self, enableTempEmulator): self.enableTempEmulator = enableTempEmulator self.tempSensorEmulator.enableTempEmulator = enableTempEmulator
class SensorManagementApp(Thread): tempSensorAdaptor = None tempSensorData = None tempActuatorEmulator = None airConActuatorEmulator = None mqttClient_TempSensor = None mqttClient_AirCon = None confiReader = None pollCycleSecs = None mqttGatewayHost = None mqttGatewayPort = None def __init__(self, configDir): Thread.__init__(self) #Set all the custom variables from configuration file self.confiReader = ConfigReader(configDir, "Device") self.pollCycleSecs = int(self.confiReader.getProperty("pollCycleSecs")) self.confiReader = ConfigReader(configDir, "mqtt.gateway") self.mqttGatewayHost = self.confiReader.getProperty("host") self.mqttGatewayPort = int(self.confiReader.getProperty("port")) #Start temperature Sensor Adaptor self.tempSensorAdaptor = TempSensorAdaptor(configDir) self.tempSensorAdaptor.daemon = True self.tempSensorAdaptor.start() #Initialize Temperature Actuator Emulator and AirConditioner Actuator Emulator self.tempActuatorEmulator = TempActuatorEmulator() self.airConActuatorEmulator = AirConActuatorEmulator() #Initialize a mqttClient_TempSensor with custom call back methods and start listening on Temperature ActuatorData from gateway broker self.mqttClient_TempSensor = mqttClientConnector.MqttClientConnector( self.mqttGatewayHost, self.mqttGatewayPort, self.on_connect, self.on_message_TempActuator, self.on_publish_TempSensorData, self.on_subscribe_TempActuator) self.mqttClient_TempSensor.connect() self.mqttClient_TempSensor.subscribeTopic( "iot/actuatorData/temperature", 1) #Initialize a mqttClient_AirCon with custom call back methods and start listening on AirConditioner ActuatorData from gateway broker self.mqttClient_AirCon = mqttClientConnector.MqttClientConnector( self.mqttGatewayHost, self.mqttGatewayPort, self.on_connect, self.on_message_AirConActuator, self.on_publish_AirConStatus, self.on_subscribe_AirConActuator) self.mqttClient_AirCon.connect() self.mqttClient_AirCon.subscribeTopic( "iot/actuatorData/airConditioner", 1) # custom callback when connect to Gateway broker def on_connect(self, mqttc, obj, flags, rc): print("Successfully Connect to GatewayBroker!! rc: " + str(rc)) #custom callback when subscribed actuatorData arrive, then tiger temperature ActuatorEmulator def on_message_TempActuator(self, mqttc, obj, msg): print("TempActuatorData arrived from topic:" + msg.topic + " QoS:" + str(msg.qos) + " Message:" + str(msg.payload.decode("utf-8"))) self.tempActuatorEmulator.process_message(str(msg.payload)) #custom callback when Temperature SensorData publish success def on_publish_TempSensorData(self, mqttc, obj, mid): print( "Successfully published SensorData to topic iot/sensorData/temperature !! mid: " + str(mid)) #custom callback when successfully subscribe to Temperature Actuator def on_subscribe_TempActuator(self, mqttc, obj, mid, granted_qos): print( "Successfully Subscribed to topic: iot/actuatorData/temperature !! " + str(mid) + " Granted_QoS:" + str(granted_qos)) #custom callback method when subscribed AirConditionerActuatorData arrive, then tiger air Conditioner ActuatorEmulater def on_message_AirConActuator(self, mqttc, obj, msg): print("AirConditionerActuatorData arrived from topic:" + msg.topic + " QoS:" + str(msg.qos) + " Message:" + str(msg.payload.decode("utf-8"))) self.airConActuatorEmulator.process_message(str(msg.payload)) #custom callback when air conditioner status publish success def on_publish_AirConStatus(self, mqttc, obj, mid): print( "Successfully published AirConditionerStatus to topic iot/status/AirConditioner !! mid: " + str(mid)) #custom callback when air Conditioner actuatorData subscribe success def on_subscribe_AirConActuator(self, mqttc, obj, mid, granted_qos): print( "Successfully Subscribed to topic: iot/actuatorData/airConditioner !! " + str(mid) + " Granted_QoS:" + str(granted_qos)) def run(self): while True: #Read new temperature sensorData and publish to gateway broker self.tempSensorData = self.tempSensorAdaptor.getCurrentSensorData() self.mqttClient_TempSensor.publishMessage( "iot/sensorData/temperature", str(self.tempSensorData.toDict()), 2) sleep(self.pollCycleSecs) #wait for next poll