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())
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)
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)