def output_sec_on(output_id, past_seconds): """ Return the number of seconds a output has been ON in the past number of seconds """ # Get the number of seconds ON stored in the database output = db_retrieve_table_daemon(Output, unique_id=output_id) client = InfluxDBClient(INFLUXDB_HOST, INFLUXDB_PORT, INFLUXDB_USER, INFLUXDB_PASSWORD, INFLUXDB_DATABASE, timeout=5) if not output_id: return None # Get the number of seconds not stored in the database (if currently on) output_time_on = 0 if output.is_on(): control = DaemonControl() output_time_on = control.output_sec_currently_on(output_id) query = query_string('duration_time', output.unique_id, value='SUM', past_sec=past_seconds) query_output = client.query(query) sec_recorded_on = 0 if query_output: sec_recorded_on = query_output.raw['series'][0]['values'][0][1] sec_currently_on = 0 if output_time_on: sec_currently_on = min(output_time_on, past_seconds) return sec_recorded_on + sec_currently_on
def output_sec_on(output_id, past_seconds, output_channel=0): """Return the number of seconds a output has been ON in the past number of seconds.""" # Get the number of seconds ON stored in the database if not output_id: return None output = db_retrieve_table_daemon(Output, unique_id=output_id) # Get the number of seconds not stored in the database (if currently on) output_time_on = 0 try: control = DaemonControl() if control.output_state(output_id, output_channel=output_channel) == 'on': output_time_on = control.output_sec_currently_on( output_id, output_channel=output_channel) except Exception: logger.exception("output_sec_on()") data = query_string('s', output.unique_id, measure='duration_time', channel=output_channel, value='SUM', past_sec=past_seconds) sec_recorded_on = 0 if data: sec_recorded_on = data[0][1] sec_currently_on = 0 if output_time_on: sec_currently_on = min(output_time_on, past_seconds) return sec_recorded_on + sec_currently_on
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)