예제 #1
0
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
예제 #2
0
파일: influx.py 프로젝트: rosaLux161/Mycodo
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
예제 #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 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)
예제 #4
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)