def run(self): sensors = None datalogger = None try: # initialise objects sensors = Sensors(self.T_OFFSET,self.P_OFFSET,self.H_OFFSET) datalogger = DataLogger(self.DATALOGFILE, self.DATALOGKEYS, self.DATALOGMAXFILESIZE) self.scheduler = HeaterScheduler() self.modemanager = ModeManager( scheduler=self.scheduler, callbackfunc=self.modemanagercallbackfunc) self.mqttclient = MqttClient(subscribelist=self.SUBSCRIBELIST) self.heatercontroller = HeaterController() # initialise state self.modemanager.setMode(self.modemanager.AUTO) # initial data t_avg,p_avg,h_avg = sensors.getData() # present ourselves self.mqttclient.publish({topics.IOTHERMSTATUS:'Active'}) self.mqttclient.publish({topics.IOTHERMVERSION:__version__ +' '+ __status__}) self.mqttclient.publish({topics.MODE:self.modemanager.currentmode.name}) self.mqttclient.publish({topics.TARGETTEMPERATURE:self.modemanager.currentmode.targettemperature}) t = 0 while True: t_,p,h = sensors.getData() messages = self.mqttclient.getData() # use temperature value from mqtt if self.USE_OTHERTEMPERATURE and topics.OTHERTEMPERATURE in messages: t = float( messages[topics.OTHERTEMPERATURE] ) if not self.USE_OTHERTEMPERATURE: t = t_ # calculate averages t_avg = (t_avg + t)/2 p_avg = (p_avg + p)/2 h_avg = (h_avg + h)/2 # calculate derivatives d_t = (t - t_avg)/self.REFRESH_SECONDS d_p = (p - p_avg)/self.REFRESH_SECONDS d_h = (h - h_avg)/self.REFRESH_SECONDS # process data from subscribed topics self.processMessages( messages ) # prepare for publishing messages = self.prepareMessages(t, p, h, d_t, d_p, d_h) datalogger.log(messages) self.mqttclient.publish(messages) # update the heatercontroller with the current and target temperatures #print('targettemperature = {}'.format(self.modemanager.currentmode.targettemperature)) self.heatercontroller.update(t,self.modemanager.currentmode.targettemperature) sleep(self.REFRESH_SECONDS) finally: print('IOThermostat: Stopping IOThermostat..') if datalogger: datalogger.close() if sensors: sensors.close() if self.scheduler: self.scheduler.close() if self.heatercontroller: self.heatercontroller.close() if self.mqttclient: self.mqttclient.close()