Esempio n. 1
0
    def get(self, unique_id):
        """Get the status of a controller"""
        if not utils_general.user_has_permission('edit_controllers'):
            abort(403)

        try:
            control = DaemonControl()
            active = control.controller_is_active(unique_id)
            return {'is_active': active}, 200
        except Exception:
            abort(500, custom=traceback.format_exc())
Esempio n. 2
0
def get_condition_value(condition_id):
    """
    Returns condition measurements for Conditional controllers
    :param condition_id: Conditional condition ID
    :return: measurement: multiple types
    """
    sql_condition = db_retrieve_table_daemon(ConditionalConditions).filter(
        ConditionalConditions.unique_id == condition_id).first()

    # Check Measurement Conditions
    if sql_condition.condition_type in ['measurement',
                                        'measurement_past_average',
                                        'measurement_past_sum']:
        device_id = sql_condition.measurement.split(',')[0]
        measurement_id = sql_condition.measurement.split(',')[1]

        device_measurement = db_retrieve_table_daemon(
            DeviceMeasurements, unique_id=measurement_id)
        if device_measurement:
            conversion = db_retrieve_table_daemon(
                Conversion, unique_id=device_measurement.conversion_id)
        else:
            conversion = None
        channel, unit, measurement = return_measurement_info(
            device_measurement, conversion)

        if None in [channel, unit]:
            logger.error(
                "Could not determine channel or unit from measurement ID: "
                "{}".format(measurement_id))
            return

        max_age = sql_condition.max_age

        if sql_condition.condition_type == 'measurement':
            return_measurement = get_last_measurement(
                device_id, unit, measurement, channel, max_age)
        elif sql_condition.condition_type == 'measurement_past_average':
            measurement_list = []
            measurements_str = get_past_measurements(
                device_id, unit, measurement, channel, max_age)
            for each_set in measurements_str.split(';'):
                measurement_list.append(float(each_set.split(',')[1]))
            return_measurement = sum(measurement_list) / len(measurement_list)
        elif sql_condition.condition_type == 'measurement_past_sum':
            measurement_list = []
            measurements_str = get_past_measurements(
                device_id, unit, measurement, channel, max_age)
            for each_set in measurements_str.split(';'):
                measurement_list.append(float(each_set.split(',')[1]))
            return_measurement = sum(measurement_list)
        else:
            return

        return return_measurement

    # Return GPIO state
    elif sql_condition.condition_type == 'gpio_state':
        try:
            import RPi.GPIO as GPIO
            GPIO.setmode(GPIO.BCM)
            GPIO.setup(int(sql_condition.gpio_pin), GPIO.IN)
            gpio_state = GPIO.input(int(sql_condition.gpio_pin))
        except Exception as e:
            gpio_state = None
            logger.error("Exception reading the GPIO pin: {}".format(e))
        return gpio_state

    # Return output state
    elif sql_condition.condition_type == 'output_state':
        control = DaemonControl()
        return control.output_state(sql_condition.output_id)

    # Return the duration the output is currently on for
    elif sql_condition.condition_type == 'output_duration_on':
        control = DaemonControl()
        return control.output_sec_currently_on(sql_condition.output_id)

    # Return controller active state
    elif sql_condition.condition_type == 'controller_status':
        controller_type, _, _ = which_controller(sql_condition.controller_id)
        control = DaemonControl()
        return control.controller_is_active(sql_condition.controller_id)
Esempio n. 3
0
def get_condition_value(condition_id):
    """
    Returns condition measurements for Conditional controllers
    :param condition_id: Conditional condition ID
    :return: measurement: multiple types
    """
    sql_condition = db_retrieve_table_daemon(ConditionalConditions).filter(
        ConditionalConditions.unique_id == condition_id).first()

    # Check Measurement Conditions
    if sql_condition.condition_type == 'measurement':
        device_id = sql_condition.measurement.split(',')[0]
        measurement_id = sql_condition.measurement.split(',')[1]

        device_measurement = db_retrieve_table_daemon(DeviceMeasurements,
                                                      unique_id=measurement_id)
        if device_measurement:
            conversion = db_retrieve_table_daemon(
                Conversion, unique_id=device_measurement.conversion_id)
        else:
            conversion = None
        channel, unit, measurement = return_measurement_info(
            device_measurement, conversion)

        if None in [channel, unit]:
            logger.error(
                "Could not determine channel or unit from measurement ID: "
                "{}".format(measurement_id))
            return

        max_age = sql_condition.max_age
        # Check if there hasn't been a measurement in the last set number
        # of seconds. If not, trigger conditional
        last_measurement = get_last_measurement(device_id, unit, measurement,
                                                channel, max_age)
        return last_measurement

    # Return GPIO state
    elif sql_condition.condition_type == 'gpio_state':
        try:
            GPIO.setmode(GPIO.BCM)
            GPIO.setup(int(sql_condition.gpio_pin), GPIO.IN)
            gpio_state = GPIO.input(int(sql_condition.gpio_pin))
        except Exception as e:
            gpio_state = None
            logger.error("Exception reading the GPIO pin: {}".format(e))
        return gpio_state

    # Return output state
    elif sql_condition.condition_type == 'output_state':
        control = DaemonControl()
        return control.output_state(sql_condition.output_id)

    # Return the duration the output is currently on for
    elif sql_condition.condition_type == 'output_duration_on':
        control = DaemonControl()
        return control.output_sec_currently_on(sql_condition.output_id)

    # Return controller active state
    elif sql_condition.condition_type == 'controller_status':
        controller_type, _, _ = which_controller(sql_condition.controller_id)
        control = DaemonControl()
        return control.controller_is_active(controller_type,
                                            sql_condition.controller_id)