def run(self): self.db = self._get_db_connection(read_db_config()) self.sensors = self.sensors = self._get_sensor_list() # Ascolto per notifiche sulla tabella sensori self.db.set_notification('sensori') while True: # inizio transazione e blocco la tabella sensori self.db.begin_transaction() self.db.lock_table('sensori') # Ricarico la configuraizone se ho ricevuto notifiche if self._needs_reload(): self.sensors = self.sensors = self._get_sensor_list() detections = [] self.log.debug('Elaboro elenco sensori') # per ciascun sensore ricavo i dati e li scrivo a database # id_sensore, driver_params, driver, driver_low_level_param for sid, spars, driver, driverpars in self.sensors: param = driverpars.split(' ') + spars.split(' ') driver = driver.upper() if driver in self.DRIVERS_COMMANDS: try: exec_data = self._driver_exec(self.DRIVERS_COMMANDS[driver], param) measuredata = self._decode_driver_result(sid, driver, exec_data) except Exception as e: self.log.error( "Impossibile decodificare l'output del driver: %s", repr(e)) measuredata = none if measuredata is not None: detections.append(measuredata) if len(detections): err = self._write_sensor_data(detections) # Eseguo il commit e rilascio i lock sul sensori self.db.commit() if not err else self.db.rollback() self.db.end_transaction() # attendo time.sleep(self.SLEEP_TIME)
def run(self): self.db = self._get_db_connection( smac_utils.read_db_config() ) # inizializzo lo swich passando il log attuale self.sw = Switch(self.log) # inizializzo lo switcher inviandogli la configurazione del pi self.log.info('Invio configurazione allo switcher') # Lo switcher non configurato ignora ogni comando. Tuttavia # nel caso fosse già configurato ignorerebbe il set_gipio_pin self.sw.reload() while not self.sw.set_gpio_pin(self._get_gpio_pin()): self.log.error('Impossible configurare lo switcher') sleep(30) delay_check = 0 self.db.set_notification(Database.EVT_ALTER_RELE_PIN) self.db.set_notification(Database.EVT_ALTER_PROGRAM) while True: # inizio transazione self.db.begin_transaction() # Ottengo pid e temperatura di rifemento (pid, trif) = self._get_current_schedule() # commit e chiudo transazione self.db.commit() self.db.end_transaction() # se pid -1 significa sistema spento imposto una temperatura # fittizia (-100) per costringere il sistema a spegnersi trif = Decimal(-100) if pid == -1 else trif sensordata = self._get_sensor_data() if not sensordata: self.log.error('Impossibile ottenere stato dei sensori') delay_check = self.SLEEP_TIME * 2 self.sw.off() elif not self._is_actual_data(sensordata['lastup'], self.TIME_THRESHOLD): self.log.error( 'Dati sensore non aggiornati (%s)', sensordata['lastup']) delay_check = self.SLEEP_TIME self.sw.off() else: self.log.debug( 'Ultimo aggiornamento dati %s', sensordata['lastup']) rating = self._get_temp_rating( sensordata['temp'], sensordata['tavg'], sensordata['tfor'] ) # Imposto lo stato del sistema in base ai parametri rilevati delay_check = self._set_system_state( trif, sensordata['temp'], rating ) # attendo eventi sul db fino a delay_check if self.db.wait_notification(delay_check): self._check_db_events()
def __init__(self, log): self.log = log dbd = read_db_config() self.db = Database( dbd['host'], dbd['user'], dbd['pass'], dbd['schema'])