Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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()
Ejemplo n.º 3
0
 def __init__(self, log):
     self.log = log
     dbd = read_db_config()
     self.db = Database(
         dbd['host'], dbd['user'], dbd['pass'], dbd['schema'])