Exemplo n.º 1
0
def pm_thread(sensor_name, status_logger, pins, serial_id):

    status_logger.debug("Thread {} started".format(sensor_name))

    sensor_logger = SensorLogger(sensor_name=sensor_name, terminal_out=True)

    sensor_type = config.get_config(sensor_name)
    init_time = config.get_config(sensor_name + "_init")

    init_count = 0

    if sensor_type == "PMS5003":

        # initialize sensor
        sensor = Plantower(pins=pins, id=serial_id)

        # warm up time  - readings are not logged
        while init_count < init_time:
            try:
                time.sleep(1)
                sensor.read()
                init_count += 1
            except PlantowerException as e:
                status_logger.exception("Failed to read from sensor PMS5003")
                blink_led((0x550000, 0.4, True))

    elif sensor_type == "SPS030":

        # initialize sensor
        while True:
            try:
                sensor = Sensirion(
                    retries=1, pins=pins,
                    id=serial_id)  # automatically starts measurement
                break
            except SensirionException as e:
                status_logger.exception("Failed to read from sensor SPS030")
                blink_led((0x550000, 0.4, True))
                time.sleep(1)

        # warm up time  - readings are not logged
        while init_count < init_time:
            try:
                time.sleep(1)
                sensor.read()
                init_count += 1
            except SensirionException as e:
                status_logger.exception("Failed to read from sensor SPS030")
                blink_led((0x550000, 0.4, True))

    # start a periodic timer interrupt to poll readings every second
    processing_alarm = Timer.Alarm(process_readings,
                                   arg=(sensor_type, sensor, sensor_logger,
                                        status_logger),
                                   s=1,
                                   periodic=True)
Exemplo n.º 2
0
    def run(self):
        print("Running...")

        self.sensor_logger = SensorLogger(self.config, self.dbconn)
        self.fridge_control = FridgeControl(self.config, self.dbconn)
        self.control = ControlInterface(self.logger, self.dbconn, self.config)

        children = []

        for process in range(self.THREADS):
            pid = os.fork()
            if pid:
                children.append(pid)
            else:
                self.runFermentThread(process)
                os._exit(0)

        for i, child in enumerate(children):
            os.waitpid(child, 0)
Exemplo n.º 3
0
    # Remove residual files from the previous run (removes all files in the current and processing dir)
    remove_residual_files()

    # Get a dictionary of sensors and their status
    sensors = get_sensors()

    # Join the LoRa network
    lora = False
    if (True in sensors.values()
            or gps_on) and config.get_config("LORA") == "ON":
        lora = LoRaWAN(status_logger)

    # Initialise temperature and humidity sensor thread with id: TEMP
    if sensors[s.TEMP]:
        TEMP_logger = SensorLogger(sensor_name=s.TEMP, terminal_out=True)
        if config.get_config(s.TEMP) == "SHT35":
            temp_sensor = TempSHT35(TEMP_logger, status_logger)
    status_logger.info("Temperature and humidity sensor initialized")

    # Initialise PM sensor threads
    if sensors[s.PM1]:
        initialize_pm_sensor(sensor_name=s.PM1,
                             pins=('P3', 'P17'),
                             serial_id=1,
                             status_logger=status_logger)
    if sensors[s.PM2]:
        initialize_pm_sensor(sensor_name=s.PM2,
                             pins=('P11', 'P18'),
                             serial_id=2,
                             status_logger=status_logger)
Exemplo n.º 4
0
        PM_transistor.value(1)

    # Perform a hardware test if it's in the config.
    if config.get_config("hardware_test").lower() == "yes":
        from hardwaretest import HardwareTester  # Only import if needed
        test_logger = logger_factory.create_status_logger(
            "hardware_test_logger",
            level=DEBUG,
            terminal_out=True,
            filename="hardware_test_log.txt")
        t = HardwareTester(test_logger)
        t.run_test()

    # Initialise temperature and humidity sensor thread with id: TEMP
    if sensors[s.TEMP]:
        TEMP_logger = SensorLogger(sensor_name=s.TEMP)
        sensor_loggers.append(TEMP_logger)
        if config.get_config(s.TEMP) == "SHT35":
            # Start reading and logging from sensor.
            temp = TempSHT35(TEMP_logger, status_logger)
            temp.start_timer()
    status_logger.info("Temperature and humidity sensor initialised")

    # Initialise PM sensor loggers and threads
    if sensors[s.PM1]:
        pm1_sensor_logger = SensorLogger(sensor_name=s.PM1)
        sensor_loggers.append(pm1_sensor_logger)

        initialise_pm_sensor(
            sensor_name=s.PM1,
            sensor_logger=pm1_sensor_logger,
Exemplo n.º 5
0
    def run(self):
        print("Running..")

        brews = 1
        brewcount = 0

        # add the pumps
        hlt_recirc = Pump(Pump.PUMP_BROWN)
        mlt_recirc = Pump(Pump.PUMP_MARCH)
        transfer = Pump(Pump.PUMP_MARCH)

        # This will run forever.
        while True:

            # Initially this will just be doing a single batch at a time
            # but this could allow recipes to be stacked.
            try:
                # load the recipe xml
                recipe = Recipe('step_mash_recipe.xml')

                # parse the recipe xml
                recipe.parse()
            except Exception as e:
                error_str = "Recipe parsing failed!"
                self.logger.critical(error_str)
                print(error_str)

            print("Mash steps are:")
            mash_steps = recipe.get_mash_steps()

            for steps in mash_steps:
                print(steps.tag, steps.attrib)
                for step in steps:
                    print(step.tag, step.text)

            # setup the vessels
            self.vessel_hlt = VesselHlt(self.logger, self.dbconn)
            self.vessel_hlt.strike_in_mlt(self.strike_in_mlt)
            self.vessel_hlt.set_target_strike_time()  # UNIX timestamp
            self.vessel_hlt.add_steps(recipe.get_mash_steps())

            self.vessel_mlt = VesselMlt(self.logger, self.dbconn)
            self.vessel_mlt.strike_in_mlt(self.strike_in_mlt)
            self.vessel_mlt.add_steps(recipe.get_mash_steps())

            self.vessel_ktl = VesselKettle(self.logger, self.dbconn)

            self.sensor_logger = SensorLogger(self.logger, self.dbconn)

            self.control = ControlInterface(self.logger, self.dbconn)

            children = []

            # Create forks for each vessel.
            # from http://www.petercollingridge.co.uk/blog/running-multiple-processes-python
            start_time = time.time()
            processes = self.VESSEL_COUNT + 2  # number of vessels plus the logger and webservice threads
            for process in range(self.VESSEL_COUNT):
                pid = os.fork()
                if pid:
                    children.append(pid)
                else:
                    self.processLauncher(process)
                    os._exit(0)

            # Wait for all the vessels to complete.
            for i, child in enumerate(children):
                os.waitpid(child, 0)

            brewcount += 1

            if (brewcount == brews):
                print("All batches completed. Exiting.")
                os._exit(0)
Exemplo n.º 6
0
def pm_thread(sensor_name, status_logger, pins, serial_id):
    """
    Method to run as a thread that reads, processes and logs readings form pm sensors according to their type
    :param sensor_name: PM1 or PM2
    :type sensor_name: str
    :param status_logger: status logger
    :type status_logger: LoggerFactory object
    :param pins: serial bus pins (TX, RX)
    :type pins: tuple(int, int)
    :param serial_id: serial bus id (0, 1 or 2)
    :type serial_id: int
    """

    status_logger.debug("Thread {} started".format(sensor_name))

    sensor_logger = SensorLogger(sensor_name=sensor_name, terminal_out=True)

    sensor_type = config.get_config(sensor_name)
    init_time = int(config.get_config(sensor_name + "_init"))

    init_count = 0

    if sensor_type == "PMS5003":

        # initialise sensor
        sensor = Plantower(pins=pins, id=serial_id)

        time.sleep(1)

        # warm up time  - readings are not logged
        while init_count < init_time:
            try:
                time.sleep(1)
                sensor.read()
                init_count += 1
            except PlantowerException as e:
                status_logger.exception("Failed to read from sensor PMS5003")
                blink_led((0x550000, 0.4, True))

    elif sensor_type == "SPS030":

        # initialise sensor
        while True:
            try:
                sensor = Sensirion(
                    retries=1, pins=pins,
                    id=serial_id)  # automatically starts measurement
                break
            except SensirionException as e:
                status_logger.exception("Failed to read from sensor SPS030")
                blink_led((0x550000, 0.4, True))
                time.sleep(1)

        # warm up time  - readings are not logged
        while init_count < init_time:
            try:
                time.sleep(1)
                sensor.read()
                init_count += 1
            except SensirionException as e:
                status_logger.exception("Failed to read from sensor SPS030")
                blink_led((0x550000, 0.4, True))

    # start a periodic timer interrupt to poll readings every second
    processing_alarm = Timer.Alarm(process_readings,
                                   arg=(sensor_type, sensor, sensor_logger,
                                        status_logger),
                                   s=1,
                                   periodic=True)