def __send_temperatures(self): for waiter in self.__waiters: try: self.currentTemperature = TemperatureReader().read_temp() if self.currentTemperature >= self.stepTemperature: self.state = False if self.currentTemperature < self.stepTemperature: self.state = True if len(self.__waiters) == 0: break if not self.temperatureControlOverriden: self.toggleGPIO() messageProducerObject = MessageProducerFactory.get_message( 'state_change') if (self.lastState != self.state): messageProducerObject.produceMessage(self) self.lastState = self.state messageProducerObject = MessageProducerFactory.get_message( 'send_temperature') messageProducerObject.produceMessage(self) except AttributeError as e: print("Error sending temp", e) break
def __init__(self, config, logger, storage): self.temperatureReader = TemperatureReader(config['temperature_read_file'], config['base_data_directory'], config['temperature_save_file'], config['temperature_sampling_interval']) self.distanceReader = DistanceReader(config['distance_read_file'], config['base_data_directory'], config['distance_save_file'], config['distance_sampling_interval'], config['distance_sample_length']) self.pictureReader = PictureReader(config['photo_save_folder'], config['picture_sampling_interval']) self.soundReader = SoundReader(config['sound_save_folder'], config['sound_sampling_interval'], config['sound_sample_length']) self.soundTime = config['sound_sample_length']; self.temperatureReader.setLogger(logger) self.temperatureReader.setStorage(storage) self.distanceReader.setLogger(logger) self.distanceReader.setStorage(storage) self.pictureReader.setLogger(logger) self.pictureReader.setStorage(storage) self.soundReader.setLogger(logger) self.soundReader.setStorage(storage) self.logger = logger
def __init__(self, config, logger, storage): self.temperatureReader = TemperatureReader(config['temperature_read_file'], config['base_data_directory'], config['temperature_save_file'], config['temperature_sampling_interval']) self.pictureReader = PictureReader(config['photo_save_folder'], config['picture_sampling_interval']) self.soundReader = SoundReader(config['sound_save_folder'], config['sound_sampling_interval'], config['sound_sample_length']) self.soundTime = config['sound_sample_length']; self.temperatureReader.setLogger(logger) self.temperatureReader.setStorage(storage) self.pictureReader.setLogger(logger) self.pictureReader.setStorage(storage) self.soundReader.setLogger(logger) self.soundReader.setStorage(storage) self.logger = logger
class RecordingManager: #uses config map to setup recording threads def __init__(self, config, logger, storage): self.temperatureReader = TemperatureReader( config['temperature_read_file'], config['base_data_directory'], config['temperature_save_file'], config['temperature_sampling_interval']) self.pictureReader = PictureReader(config['photo_save_folder'], config['picture_sampling_interval']) self.soundReader = SoundReader(config['sound_save_folder'], config['sound_sampling_interval'], config['sound_sample_length']) self.soundTime = config['sound_sample_length'] self.temperatureReader.setLogger(logger) self.temperatureReader.setStorage(storage) self.pictureReader.setLogger(logger) self.pictureReader.setStorage(storage) self.soundReader.setLogger(logger) self.soundReader.setStorage(storage) self.logger = logger #starts all recording threads def startRecording(self): self.logger.log("[RecordingManager] starting recording threads") self.temperatureReader.startRecording() self.pictureReader.startRecording() self.soundReader.startRecording() self.logger.log("[RecordingManager] threads started") #requests that all recording threads stop, and waits for all of them to stopshop def stopRecording(self): self.logger.log("[RecordingManager] stopping recording threads") #requesting threads to stop self.temperatureReader.stopRecording() self.pictureReader.stopRecording() self.soundReader.stopRecording() self.logger.log("[RecordingManager] waiting for threads to stop...") #waiting for all threads to stop counter = 0 while self.temperatureReader.isRecording or self.pictureReader.isRecording or self.soundReader.isRecording: counter += 1 if counter > (self.soundTime + 10): #sound thread should have stopped by now if we end up here, because we waited for #more seconds than it is supposed to be recording logger.log( "[RecordingManager] Sound thread did not quit, cannot stop recording" ) return False #stop was unsucessful time.sleep(1) #one more request to stop recording, just to be safe self.temperatureReader.stopRecording() self.pictureReader.stopRecording() self.soundReader.stopRecording() self.logger.log("[RecordingManager] threads stopped") return True #stop was sucessfull #makes all threads quit, used when quitting the application def quitThreads(self): self.stopRecording() self.pictureReader.quit() self.soundReader.quit() self.temperatureReader.quit()
class RecordingManager: #uses config map to setup recording threads def __init__(self, config, logger, storage): self.temperatureReader = TemperatureReader(config['temperature_read_file'], config['base_data_directory'], config['temperature_save_file'], config['temperature_sampling_interval']) self.distanceReader = DistanceReader(config['distance_read_file'], config['base_data_directory'], config['distance_save_file'], config['distance_sampling_interval'], config['distance_sample_length']) self.pictureReader = PictureReader(config['photo_save_folder'], config['picture_sampling_interval']) self.soundReader = SoundReader(config['sound_save_folder'], config['sound_sampling_interval'], config['sound_sample_length']) self.soundTime = config['sound_sample_length']; self.temperatureReader.setLogger(logger) self.temperatureReader.setStorage(storage) self.distanceReader.setLogger(logger) self.distanceReader.setStorage(storage) self.pictureReader.setLogger(logger) self.pictureReader.setStorage(storage) self.soundReader.setLogger(logger) self.soundReader.setStorage(storage) self.logger = logger #starts all recording threads def startRecording(self): self.logger.log("[RecordingManager] starting recording threads") self.temperatureReader.startRecording() self.distanceReader.startRecording() self.pictureReader.startRecording() self.soundReader.startRecording() self.logger.log("[RecordingManager] threads started") #requests that all recording threads stop, and waits for all of them to stopshop def stopRecording(self): self.logger.log("[RecordingManager] stopping recording threads") #requesting threads to stop self.temperatureReader.stopRecording() self.distanceReader.stopRecording() self.pictureReader.stopRecording() self.soundReader.stopRecording() self.logger.log("[RecordingManager] waiting for threads to stop...") #waiting for all threads to stop counter = 0 while self.temperatureReader.isRecording or self.distanceReader.isRecording or self.pictureReader.isRecording or self.soundReader.isRecording: counter += 1 if counter > (self.soundTime + 10): #sound thread should have stopped by now if we end up here, because we waited for #more seconds than it is supposed to be recording logger.log("[RecordingManager] Sound thread did not quit, cannot stop recording") return False #stop was unsucessful time.sleep(1) #one more request to stop recording, just to be safe self.temperatureReader.stopRecording() self.distanceReader.stopRecording() self.pictureReader.stopRecording() self.soundReader.stopRecording() self.logger.log("[RecordingManager] threads stopped") return True #stop was sucessfull #makes all threads quit, used when quitting the application def quitThreads(self): self.stopRecording() self.pictureReader.quit() self.soundReader.quit() self.temperatureReader.quit() self.distancereader.quit()
def main(): # magic constants #configurationFileName = "../../PyStat/thermostat.conf" configurationFileName = "thermostat.conf" currentFileName = "current.set" scheduleFileName = "schedule.conf" databaseName = "pystat.db" # make the static utility classes fileManager = FileManager(configurationFileName, currentFileName, scheduleFileName) configuration = fileManager.read_configuration() temperatureReader = TemperatureReader() weather = ThermostatWeather(configuration.weatherAPIKey, configuration.weatherurl, configuration.latlong, configuration.weatherFlags) # create the database utility class databaseHelper = ThermostatDatabase(databaseName) if configuration is None: print("Configuration file could not be read.") exit(1) if "-1" == configuration.heatPin \ or "-1" == configuration.acPin \ or "-1" == configuration.fanPin \ or configuration.heatPin == configuration.acPin \ or configuration.heatPin == configuration.fanPin \ or configuration.acPin == configuration.fanPin: print("The pin settings provided are invalid:") print("\tHeat pin: " + str(configuration.heatPin)) print("\tAC pin: " + str(configuration.acPin)) print("\tFan pin: " + str(configuration.fanPin)) exit(2) service = ThermostatService(0, "service", configuration, fileManager, temperatureReader) service.start() scheduler = ThermostatScheduler(1, "scheduler", configuration, fileManager, temperatureReader) scheduler.start() web = ThermostatWeb(2, "web", configuration, fileManager, temperatureReader, weather) web.start() while True: current = fileManager.read_current() currentWeather = weather.current_weather() outdoorTemperature = None if currentWeather is not None: outdoorTemperature = currentWeather['temperature'] databaseHelper.insert_current_data( temperatureReader.CurrentTemperature(), current["temperature"], outdoorTemperature, current["mode"], ("heat" in configuration.running), ("ac" in configuration.running), ("fan" in configuration.running)) print("Polling threads") if not service.is_alive(): print("PANIC SERVICE IS DEAD") if not scheduler.is_alive(): print("PANIC SCHEDULER IS DEAD") if not web.is_alive(): print("PANIC WEB IS DEAD") time.sleep(30)