Example #1
0
def validate_wait_until(value):
    schema = cv.Schema({
        vol.Required(CONF_CONDITION): validate_recursive_condition
    })
    if isinstance(value, dict) and CONF_CONDITION in value:
        return schema(value)
    return validate_wait_until({CONF_CONDITION: value})
Example #2
0
File: uart.py Project: khzd/pi4home
def validate_data(value):
    if isinstance(value, text_type):
        return value.encode('utf-8')
    if isinstance(value, str):
        return value
    if isinstance(value, list):
        return cv.Schema([cv.hex_uint8_t])(value)
    raise vol.Invalid("data must either be a string wrapped in quotes or a list of bytes")
Example #3
0
 def validator(value):
     value = validator_(value)
     if extra_validators is not None:
         value = cv.Schema([extra_validators])(value)
     if single:
         if len(value) != 1:
             raise vol.Invalid("Cannot have more than 1 automation for templates")
         return value[0]
     return value
Example #4
0
def validate_raw(value):
    if isinstance(value, dict):
        return cv.Schema({
            cv.GenerateID():
            cv.declare_variable_id(int32),
            vol.Required(CONF_DATA):
            [vol.Any(vol.Coerce(int), cv.time_period_microseconds)],
        })(value)
    return validate_raw({CONF_DATA: value})
Example #5
0
def validate_raw(value):
    if isinstance(value, dict):
        return cv.Schema({
            cv.GenerateID(): cv.declare_variable_id(int32),
            vol.Required(CONF_DATA): [vol.Any(vol.Coerce(int), cv.time_period_microseconds)],
            vol.Optional(CONF_CARRIER_FREQUENCY): vol.All(cv.frequency, vol.Coerce(int)),
        })(value)
    return validate_raw({
        CONF_DATA: value
    })
Example #6
0
def validate_datapoint(value):
    if isinstance(value, dict):
        return cv.Schema({
            vol.Required(CONF_FROM): cv.float_,
            vol.Required(CONF_TO): cv.float_,
        })(value)
    value = cv.string(value)
    if '->' not in value:
        raise vol.Invalid("Datapoint mapping must contain '->'")
    a, b = value.split('->', 1)
    a, b = a.strip(), b.strip()
    return validate_datapoint({CONF_FROM: cv.float_(a), CONF_TO: cv.float_(b)})
Example #7
0
    def validator_(value):
        if isinstance(value, list):
            try:
                # First try as a sequence of actions
                return [schema({CONF_THEN: value})]
            except vol.Invalid as err:
                if err.path and err.path[0] == CONF_THEN:
                    err.path.pop(0)

                # Next try as a sequence of automations
                try:
                    return cv.Schema([schema])(value)
                except vol.Invalid as err2:
                    if 'Unable to find action' in str(err):
                        raise err2
                    raise vol.MultipleInvalid([err, err2])
        elif isinstance(value, dict):
            if CONF_THEN in value:
                return [schema(value)]
            return [schema({CONF_THEN: value})]
        # This should only happen with invalid configs, but let's have a nice error message.
        return [schema(value)]
Example #8
0
    if CONF_OPTIMISTIC in config:
        add(template.set_optimistic(config[CONF_OPTIMISTIC]))
    if CONF_ASSUMED_STATE in config:
        add(template.set_assumed_state(config[CONF_ASSUMED_STATE]))

    if CONF_RESTORE_STATE in config:
        add(template.set_restore_state(config[CONF_RESTORE_STATE]))

    setup_component(template, config)


BUILD_FLAGS = '-DUSE_TEMPLATE_SWITCH'

CONF_SWITCH_TEMPLATE_PUBLISH = 'switch.template.publish'
SWITCH_TEMPLATE_PUBLISH_ACTION_SCHEMA = cv.Schema({
    vol.Required(CONF_ID): cv.use_variable_id(switch.Switch),
    vol.Required(CONF_STATE): cv.templatable(cv.boolean),
})


@ACTION_REGISTRY.register(CONF_SWITCH_TEMPLATE_PUBLISH, SWITCH_TEMPLATE_PUBLISH_ACTION_SCHEMA)
def switch_template_publish_to_code(config, action_id, template_arg, args):
    for var in get_variable(config[CONF_ID]):
        yield None
    rhs = var.make_switch_publish_action(template_arg)
    type = SwitchPublishAction.template(template_arg)
    action = Pvariable(action_id, rhs, type=type)
    for template_ in templatable(config[CONF_STATE], args, bool_):
        yield None
    add(action.set_state(template_))
    yield action
Example #9
0
import voluptuous as vol

from pi4home import automation
import pi4home.config_validation as cv
from pi4home.const import CONF_ID, CONF_INTERVAL
from pi4home.cpp_generator import Pvariable
from pi4home.cpp_helpers import setup_component
from pi4home.cpp_types import App, PollingComponent, Trigger, pi4home_ns

IntervalTrigger = pi4home_ns.class_('IntervalTrigger', Trigger.template(),
                                    PollingComponent)

CONFIG_SCHEMA = automation.validate_automation(
    cv.Schema({
        cv.GenerateID():
        cv.declare_variable_id(IntervalTrigger),
        vol.Required(CONF_INTERVAL):
        cv.positive_time_period_milliseconds,
    }).extend(cv.COMPONENT_SCHEMA.schema))


def to_code(config):
    for conf in config:
        rhs = App.register_component(IntervalTrigger.new(conf[CONF_INTERVAL]))
        trigger = Pvariable(conf[CONF_ID], rhs)
        setup_component(trigger, conf)

        automation.build_automations(trigger, [], conf)
Example #10
0
from pi4home.components import binary_sensor, uart
import pi4home.config_validation as cv
from pi4home.const import CONF_ID, CONF_UART_ID
from pi4home.cpp_generator import Pvariable, get_variable
from pi4home.cpp_helpers import setup_component
from pi4home.cpp_types import App, Component

DEPENDENCIES = ['uart']

RDM6300Component = binary_sensor.binary_sensor_ns.class_(
    'RDM6300Component', Component, uart.UARTDevice)

CONFIG_SCHEMA = cv.Schema({
    cv.GenerateID():
    cv.declare_variable_id(RDM6300Component),
    cv.GenerateID(CONF_UART_ID):
    cv.use_variable_id(uart.UARTComponent),
}).extend(cv.COMPONENT_SCHEMA.schema)


def to_code(config):
    for uart_ in get_variable(config[CONF_UART_ID]):
        yield
    rhs = App.make_rdm6300_component(uart_)
    var = Pvariable(config[CONF_ID], rhs)
    setup_component(var, config)


BUILD_FLAGS = '-DUSE_RDM6300'
Example #11
0
    setup_component(template, config)

    if CONF_LAMBDA in config:
        for template_ in process_lambda(
                config[CONF_LAMBDA], [],
                return_type=optional.template(std_string)):
            yield
        add(template.set_template(template_))


BUILD_FLAGS = '-DUSE_TEMPLATE_TEXT_SENSOR'

CONF_TEXT_SENSOR_TEMPLATE_PUBLISH = 'text_sensor.template.publish'
TEXT_SENSOR_TEMPLATE_PUBLISH_ACTION_SCHEMA = cv.Schema({
    vol.Required(CONF_ID):
    cv.use_variable_id(text_sensor.TextSensor),
    vol.Required(CONF_STATE):
    cv.templatable(cv.string_strict),
})


@ACTION_REGISTRY.register(CONF_TEXT_SENSOR_TEMPLATE_PUBLISH,
                          TEXT_SENSOR_TEMPLATE_PUBLISH_ACTION_SCHEMA)
def text_sensor_template_publish_to_code(config, action_id, template_arg,
                                         args):
    for var in get_variable(config[CONF_ID]):
        yield None
    rhs = var.make_text_sensor_publish_action(template_arg)
    type = TextSensorPublishAction.template(template_arg)
    action = Pvariable(action_id, rhs, type=type)
    for template_ in templatable(config[CONF_STATE], args, std_string):
        yield None
Example #12
0
File: spi.py Project: khzd/pi4home
from pi4home import pins
import pi4home.config_validation as cv
from pi4home.const import CONF_CLK_PIN, CONF_ID, CONF_MISO_PIN, CONF_MOSI_PIN
from pi4home.cpp_generator import Pvariable, add
from pi4home.cpp_helpers import gpio_input_pin_expression, gpio_output_pin_expression, \
    setup_component
from pi4home.cpp_types import App, Component, pi4home_ns

SPIComponent = pi4home_ns.class_('SPIComponent', Component)
SPIDevice = pi4home_ns.class_('SPIDevice')
MULTI_CONF = True

CONFIG_SCHEMA = vol.All(
    cv.Schema({
        cv.GenerateID(): cv.declare_variable_id(SPIComponent),
        vol.Required(CONF_CLK_PIN): pins.gpio_output_pin_schema,
        vol.Optional(CONF_MISO_PIN): pins.gpio_input_pin_schema,
        vol.Optional(CONF_MOSI_PIN): pins.gpio_output_pin_schema,
    }), cv.has_at_least_one_key(CONF_MISO_PIN, CONF_MOSI_PIN))


def to_code(config):
    for clk in gpio_output_pin_expression(config[CONF_CLK_PIN]):
        yield
    rhs = App.init_spi(clk)
    spi = Pvariable(config[CONF_ID], rhs)
    if CONF_MISO_PIN in config:
        for miso in gpio_input_pin_expression(config[CONF_MISO_PIN]):
            yield
        add(spi.set_miso(miso))
    if CONF_MOSI_PIN in config:
        for mosi in gpio_input_pin_expression(config[CONF_MOSI_PIN]):
Example #13
0
def validate_raw(value):
    if isinstance(value, dict):
        return cv.Schema({
            cv.GenerateID(): cv.declare_variable_id(int32),
            vol.Required(CONF_DATA): [vol.Any(vol.Coerce(int), cv.time_period_microseconds)],
            vol.Optional(CONF_CARRIER_FREQUENCY): vol.All(cv.frequency, vol.Coerce(int)),
        })(value)
    return validate_raw({
        CONF_DATA: value
    })


PLATFORM_SCHEMA = cv.nameable(switch.SWITCH_PLATFORM_SCHEMA.extend({
    cv.GenerateID(): cv.declare_variable_id(RemoteTransmitter),
    vol.Optional(CONF_JVC): cv.Schema({
        vol.Required(CONF_DATA): cv.hex_uint32_t,
    }),
    vol.Optional(CONF_LG): cv.Schema({
        vol.Required(CONF_DATA): cv.hex_uint32_t,
        vol.Optional(CONF_NBITS, default=28): cv.one_of(28, 32, int=True),
    }),
    vol.Optional(CONF_NEC): cv.Schema({
        vol.Required(CONF_ADDRESS): cv.hex_uint16_t,
        vol.Required(CONF_COMMAND): cv.hex_uint16_t,
    }),
    vol.Optional(CONF_SAMSUNG): cv.Schema({
        vol.Required(CONF_DATA): cv.hex_uint32_t,
    }),
    vol.Optional(CONF_SONY): cv.Schema({
        vol.Required(CONF_DATA): cv.hex_uint32_t,
        vol.Optional(CONF_NBITS, default=12): cv.one_of(12, 15, 20, int=True),
Example #14
0
from pi4home.cpp_generator import Pvariable, add
from pi4home.cpp_helpers import setup_component
from pi4home.cpp_types import App, Component, pi4home_ns

ESP_PLATFORMS = [ESP_PLATFORM_ESP32]

CONF_ESP32_BLE_ID = 'esp32_ble_id'
ESP32BLETracker = pi4home_ns.class_('ESP32BLETracker', Component)
XiaomiSensor = pi4home_ns.class_('XiaomiSensor', sensor.Sensor)
XiaomiDevice = pi4home_ns.class_('XiaomiDevice')
XIAOMI_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend(
    {cv.GenerateID(): cv.declare_variable_id(XiaomiSensor)})

CONFIG_SCHEMA = cv.Schema({
    cv.GenerateID():
    cv.declare_variable_id(ESP32BLETracker),
    vol.Optional(CONF_SCAN_INTERVAL):
    cv.positive_time_period_seconds,
}).extend(cv.COMPONENT_SCHEMA.schema)


def make_address_array(address):
    return [HexInt(i) for i in address.parts]


def to_code(config):
    rhs = App.make_esp32_ble_tracker()
    ble = Pvariable(config[CONF_ID], rhs)
    if CONF_SCAN_INTERVAL in config:
        add(ble.set_scan_interval(config[CONF_SCAN_INTERVAL]))

    setup_component(ble, config)
Example #15
0
import voluptuous as vol

from pi4home.automation import ACTION_REGISTRY, maybe_simple_id
from pi4home.components.power_supply import PowerSupplyComponent
import pi4home.config_validation as cv
from pi4home.const import CONF_ID, CONF_INVERTED, CONF_LEVEL, CONF_MAX_POWER, \
    CONF_MIN_POWER, CONF_POWER_SUPPLY
from pi4home.core import CORE
from pi4home.cpp_generator import Pvariable, add, get_variable, templatable
from pi4home.cpp_types import Action, pi4home_ns, float_

PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({})

BINARY_OUTPUT_SCHEMA = cv.Schema({
    vol.Optional(CONF_POWER_SUPPLY):
    cv.use_variable_id(PowerSupplyComponent),
    vol.Optional(CONF_INVERTED):
    cv.boolean,
})

BINARY_OUTPUT_PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
    BINARY_OUTPUT_SCHEMA.schema)

FLOAT_OUTPUT_SCHEMA = BINARY_OUTPUT_SCHEMA.extend({
    vol.Optional(CONF_MAX_POWER):
    cv.percentage,
    vol.Optional(CONF_MIN_POWER):
    cv.percentage,
})

FLOAT_OUTPUT_PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
    FLOAT_OUTPUT_SCHEMA.schema)
Example #16
0
        raise vol.Invalid(u"Could not find '{}' file. '{}' does not seem to point to an "
                          u"pi4home-core copy.".format(library_json, value))
    return value


def validate_commit(value):
    value = cv.string(value)
    if re.match(r"^[0-9a-f]{7,}$", value) is None:
        raise vol.Invalid("Commit option only accepts commit hashes in hex format.")
    return value


PI4HOME_CORE_VERSION_SCHEMA = vol.Any(
    validate_simple_pi4home_core_version,
    cv.Schema({
        vol.Required(CONF_LOCAL): validate_local_pi4home_core_version,
    }),
    vol.All(
        cv.Schema({
            vol.Optional(CONF_REPOSITORY, default=LIBRARY_URI_REPO): cv.string,
            vol.Optional(CONF_COMMIT): validate_commit,
            vol.Optional(CONF_BRANCH): cv.string,
            vol.Optional(CONF_TAG): cv.string,
        }),
        cv.has_at_most_one_key(CONF_COMMIT, CONF_BRANCH, CONF_TAG)
    ),
)


def validate_platform(value):
    value = cv.string(value)
Example #17
0
import voluptuous as vol

from pi4home.components import i2c, sensor
import pi4home.config_validation as cv
from pi4home.const import CONF_ADDRESS, CONF_ID
from pi4home.cpp_generator import Pvariable
from pi4home.cpp_helpers import setup_component
from pi4home.cpp_types import App, Component

DEPENDENCIES = ['i2c']
MULTI_CONF = True

ADS1115Component = sensor.sensor_ns.class_('ADS1115Component', Component,
                                           i2c.I2CDevice)

CONFIG_SCHEMA = cv.Schema({
    cv.GenerateID():
    cv.declare_variable_id(ADS1115Component),
    vol.Required(CONF_ADDRESS):
    cv.i2c_address,
}).extend(cv.COMPONENT_SCHEMA.schema)


def to_code(config):
    rhs = App.make_ads1115_component(config[CONF_ADDRESS])
    var = Pvariable(config[CONF_ID], rhs)
    setup_component(var, config)


BUILD_FLAGS = '-DUSE_ADS1115_SENSOR'
Example #18
0
from pi4home import pins
from pi4home.components import sensor
import pi4home.config_validation as cv
from pi4home.const import CONF_ID, CONF_PIN, CONF_UPDATE_INTERVAL
from pi4home.cpp_generator import Pvariable
from pi4home.cpp_helpers import setup_component
from pi4home.cpp_types import App, PollingComponent

DallasComponent = sensor.sensor_ns.class_('DallasComponent', PollingComponent)
MULTI_CONF = True

CONFIG_SCHEMA = cv.Schema({
    cv.GenerateID():
    cv.declare_variable_id(DallasComponent),
    vol.Required(CONF_PIN):
    pins.input_pin,
    vol.Optional(CONF_UPDATE_INTERVAL):
    cv.update_interval,
}).extend(cv.COMPONENT_SCHEMA.schema)


def to_code(config):
    rhs = App.make_dallas_component(config[CONF_PIN],
                                    config.get(CONF_UPDATE_INTERVAL))
    var = Pvariable(config[CONF_ID], rhs)
    setup_component(var, config)


BUILD_FLAGS = '-DUSE_DALLAS_SENSOR'
Example #19
0
import pi4home.config_validation as cv
from pi4home.const import (CONF_BIT_DEPTH, CONF_CLOCK_PIN, CONF_DATA_PIN, CONF_ID,
                           CONF_NUM_CHANNELS, CONF_NUM_CHIPS, CONF_UPDATE_ON_BOOT)
from pi4home.cpp_generator import Pvariable, add
from pi4home.cpp_helpers import gpio_output_pin_expression, setup_component
from pi4home.cpp_types import App, Component

MY9231OutputComponent = output.output_ns.class_('MY9231OutputComponent', Component)
MULTI_CONF = True

CONFIG_SCHEMA = cv.Schema({
    cv.GenerateID(): cv.declare_variable_id(MY9231OutputComponent),
    vol.Required(CONF_DATA_PIN): pins.gpio_output_pin_schema,
    vol.Required(CONF_CLOCK_PIN): pins.gpio_output_pin_schema,
    vol.Optional(CONF_NUM_CHANNELS): vol.All(vol.Coerce(int),
                                             vol.Range(3, 1020)),
    vol.Optional(CONF_NUM_CHIPS): vol.All(vol.Coerce(int),
                                          vol.Range(1, 255)),
    vol.Optional(CONF_BIT_DEPTH): cv.one_of(8, 12, 14, 16, int=True),
    vol.Optional(CONF_UPDATE_ON_BOOT): vol.Coerce(bool),
}).extend(cv.COMPONENT_SCHEMA.schema)


def to_code(config):
    for di in gpio_output_pin_expression(config[CONF_DATA_PIN]):
        yield
    for dcki in gpio_output_pin_expression(config[CONF_CLOCK_PIN]):
        yield
    rhs = App.make_my9231_component(di, dcki)
    my9231 = Pvariable(config[CONF_ID], rhs)
    if CONF_NUM_CHANNELS in config:
Example #20
0
EFFECTS_SCHEMA = cv.Schema({
    vol.Optional(CONF_LAMBDA):
    cv.Schema({
        vol.Required(CONF_NAME):
        cv.string,
        vol.Required(CONF_LAMBDA):
        cv.lambda_,
        vol.Optional(CONF_UPDATE_INTERVAL, default='0ms'):
        cv.positive_time_period_milliseconds,
    }),
    vol.Optional(CONF_RANDOM):
    cv.Schema({
        cv.GenerateID(CONF_EFFECT_ID):
        cv.declare_variable_id(RandomLightEffect),
        vol.Optional(CONF_NAME, default="Random"):
        cv.string,
        vol.Optional(CONF_TRANSITION_LENGTH):
        cv.positive_time_period_milliseconds,
        vol.Optional(CONF_UPDATE_INTERVAL):
        cv.positive_time_period_milliseconds,
    }),
    vol.Optional(CONF_STROBE):
    cv.Schema({
        cv.GenerateID(CONF_EFFECT_ID):
        cv.declare_variable_id(StrobeLightEffect),
        vol.Optional(CONF_NAME, default="Strobe"):
        cv.string,
        vol.Optional(CONF_COLORS):
        vol.All(
            cv.ensure_list(
                cv.Schema({
                    vol.Optional(CONF_STATE, default=True):
                    cv.boolean,
                    vol.Optional(CONF_BRIGHTNESS, default=1.0):
                    cv.percentage,
                    vol.Optional(CONF_RED, default=1.0):
                    cv.percentage,
                    vol.Optional(CONF_GREEN, default=1.0):
                    cv.percentage,
                    vol.Optional(CONF_BLUE, default=1.0):
                    cv.percentage,
                    vol.Optional(CONF_WHITE, default=1.0):
                    cv.percentage,
                    vol.Required(CONF_DURATION):
                    cv.positive_time_period_milliseconds,
                }),
                cv.has_at_least_one_key(CONF_STATE, CONF_BRIGHTNESS, CONF_RED,
                                        CONF_GREEN, CONF_BLUE, CONF_WHITE)),
            vol.Length(min=2)),
    }),
    vol.Optional(CONF_FLICKER):
    cv.Schema({
        cv.GenerateID(CONF_EFFECT_ID):
        cv.declare_variable_id(FlickerLightEffect),
        vol.Optional(CONF_NAME, default="Flicker"):
        cv.string,
        vol.Optional(CONF_ALPHA):
        cv.percentage,
        vol.Optional(CONF_INTENSITY):
        cv.percentage,
    }),
    vol.Optional(CONF_ADDRESSABLE_LAMBDA):
    cv.Schema({
        vol.Required(CONF_NAME):
        cv.string,
        vol.Required(CONF_LAMBDA):
        cv.lambda_,
        vol.Optional(CONF_UPDATE_INTERVAL, default='0ms'):
        cv.positive_time_period_milliseconds,
    }),
    vol.Optional(CONF_ADDRESSABLE_RAINBOW):
    cv.Schema({
        cv.GenerateID(CONF_EFFECT_ID):
        cv.declare_variable_id(AddressableRainbowLightEffect),
        vol.Optional(CONF_NAME, default="Rainbow"):
        cv.string,
        vol.Optional(CONF_SPEED):
        cv.uint32_t,
        vol.Optional(CONF_WIDTH):
        cv.uint32_t,
    }),
    vol.Optional(CONF_ADDRESSABLE_COLOR_WIPE):
    cv.Schema({
        cv.GenerateID(CONF_EFFECT_ID):
        cv.declare_variable_id(AddressableColorWipeEffect),
        vol.Optional(CONF_NAME, default="Color Wipe"):
        cv.string,
        vol.Optional(CONF_COLORS):
        cv.ensure_list({
            vol.Optional(CONF_RED, default=1.0):
            cv.percentage,
            vol.Optional(CONF_GREEN, default=1.0):
            cv.percentage,
            vol.Optional(CONF_BLUE, default=1.0):
            cv.percentage,
            vol.Optional(CONF_WHITE, default=1.0):
            cv.percentage,
            vol.Optional(CONF_RANDOM, default=False):
            cv.boolean,
            vol.Required(CONF_NUM_LEDS):
            vol.All(cv.uint32_t, vol.Range(min=1)),
        }),
        vol.Optional(CONF_ADD_LED_INTERVAL):
        cv.positive_time_period_milliseconds,
        vol.Optional(CONF_REVERSE):
        cv.boolean,
    }),
    vol.Optional(CONF_ADDRESSABLE_SCAN):
    cv.Schema({
        cv.GenerateID(CONF_EFFECT_ID):
        cv.declare_variable_id(AddressableScanEffect),
        vol.Optional(CONF_NAME, default="Scan"):
        cv.string,
        vol.Optional(CONF_MOVE_INTERVAL):
        cv.positive_time_period_milliseconds,
    }),
    vol.Optional(CONF_ADDRESSABLE_TWINKLE):
    cv.Schema({
        cv.GenerateID(CONF_EFFECT_ID):
        cv.declare_variable_id(AddressableTwinkleEffect),
        vol.Optional(CONF_NAME, default="Twinkle"):
        cv.string,
        vol.Optional(CONF_TWINKLE_PROBABILITY):
        cv.percentage,
        vol.Optional(CONF_PROGRESS_INTERVAL):
        cv.positive_time_period_milliseconds,
    }),
    vol.Optional(CONF_ADDRESSABLE_RANDOM_TWINKLE):
    cv.Schema({
        cv.GenerateID(CONF_EFFECT_ID):
        cv.declare_variable_id(AddressableRandomTwinkleEffect),
        vol.Optional(CONF_NAME, default="Random Twinkle"):
        cv.string,
        vol.Optional(CONF_TWINKLE_PROBABILITY):
        cv.percentage,
        vol.Optional(CONF_PROGRESS_INTERVAL):
        cv.positive_time_period_milliseconds,
    }),
    vol.Optional(CONF_ADDRESSABLE_FIREWORKS):
    cv.Schema({
        cv.GenerateID(CONF_EFFECT_ID):
        cv.declare_variable_id(AddressableFireworksEffect),
        vol.Optional(CONF_NAME, default="Fireworks"):
        cv.string,
        vol.Optional(CONF_UPDATE_INTERVAL):
        cv.positive_time_period_milliseconds,
        vol.Optional(CONF_SPARK_PROBABILITY):
        cv.percentage,
        vol.Optional(CONF_USE_RANDOM_COLOR):
        cv.boolean,
        vol.Optional(CONF_FADE_OUT_RATE):
        cv.uint8_t,
    }),
    vol.Optional(CONF_ADDRESSABLE_FLICKER):
    cv.Schema({
        cv.GenerateID(CONF_EFFECT_ID):
        cv.declare_variable_id(AddressableFlickerEffect),
        vol.Optional(CONF_NAME, default="Addressable Flicker"):
        cv.string,
        vol.Optional(CONF_UPDATE_INTERVAL):
        cv.positive_time_period_milliseconds,
        vol.Optional(CONF_INTENSITY):
        cv.percentage,
    }),
})
Example #21
0
CONF_WAKEUP_PIN_MODE = 'wakeup_pin_mode'
CONF_ESP32_EXT1_WAKEUP = 'esp32_ext1_wakeup'

CONFIG_SCHEMA = cv.Schema({
    cv.GenerateID():
    cv.declare_variable_id(DeepSleepComponent),
    vol.Optional(CONF_SLEEP_DURATION):
    cv.positive_time_period_milliseconds,
    vol.Optional(CONF_WAKEUP_PIN):
    vol.All(cv.only_on_esp32, pins.internal_gpio_input_pin_schema,
            validate_pin_number),
    vol.Optional(CONF_WAKEUP_PIN_MODE):
    vol.All(cv.only_on_esp32, cv.one_of(*WAKEUP_PIN_MODES), upper=True),
    vol.Optional(CONF_ESP32_EXT1_WAKEUP):
    vol.All(
        cv.only_on_esp32,
        cv.Schema({
            vol.Required(CONF_PINS):
            cv.ensure_list(pins.shorthand_input_pin, validate_pin_number),
            vol.Required(CONF_MODE):
            cv.one_of(*EXT1_WAKEUP_MODES, upper=True),
        })),
    vol.Optional(CONF_RUN_DURATION):
    cv.positive_time_period_milliseconds,
    vol.Optional(CONF_RUN_CYCLES):
    cv.invalid("The run_cycles option has been removed in 1.11.0 as "
               "it was essentially the same as a run_duration of 0s."
               "Please use run_duration now.")
}).extend(cv.COMPONENT_SCHEMA.schema)


def to_code(config):
Example #22
0
    return config


CONFIG_SCHEMA = vol.All(
    cv.Schema({
        cv.GenerateID():
        cv.declare_variable_id(EthernetComponent),
        vol.Required(CONF_TYPE):
        cv.one_of(*ETHERNET_TYPES, upper=True),
        vol.Required(CONF_MDC_PIN):
        pins.output_pin,
        vol.Required(CONF_MDIO_PIN):
        pins.input_output_pin,
        vol.Optional(CONF_CLK_MODE, default='GPIO0_IN'):
        cv.one_of(*CLK_MODES, upper=True, space='_'),
        vol.Optional(CONF_PHY_ADDR, default=0):
        vol.All(cv.int_, vol.Range(min=0, max=31)),
        vol.Optional(CONF_POWER_PIN):
        pins.gpio_output_pin_schema,
        vol.Optional(CONF_MANUAL_IP):
        wifi.STA_MANUAL_IP_SCHEMA,
        vol.Optional(CONF_DOMAIN, default='.local'):
        cv.domain_name,
        vol.Optional(CONF_USE_ADDRESS):
        cv.string_strict,
        vol.Optional('hostname'):
        cv.invalid("The hostname option has been removed in 1.11.0"),
    }), validate)


def to_code(config):
    rhs = App.init_ethernet()
Example #23
0
UARTDevice = pi4home_ns.class_('UARTDevice')
MULTI_CONF = True


def validate_rx_pin(value):
    value = pins.input_pin(value)
    if CORE.is_esp8266 and value >= 16:
        raise vol.Invalid(
            "Pins GPIO16 and GPIO17 cannot be used as RX pins on ESP8266.")
    return value


CONFIG_SCHEMA = vol.All(
    cv.Schema({
        cv.GenerateID(): cv.declare_variable_id(UARTComponent),
        vol.Optional(CONF_TX_PIN): pins.output_pin,
        vol.Optional(CONF_RX_PIN): validate_rx_pin,
        vol.Required(CONF_BAUD_RATE): cv.positive_int,
    }).extend(cv.COMPONENT_SCHEMA.schema),
    cv.has_at_least_one_key(CONF_TX_PIN, CONF_RX_PIN))


def to_code(config):
    rhs = App.init_uart(config[CONF_BAUD_RATE])
    var = Pvariable(config[CONF_ID], rhs)

    if CONF_TX_PIN in config:
        add(var.set_tx_pin(config[CONF_TX_PIN]))
    if CONF_RX_PIN in config:
        add(var.set_rx_pin(config[CONF_RX_PIN]))

    setup_component(var, config)
Example #24
0
    CONF_LEVEL
from pi4home.cpp_generator import Pvariable, add, get_variable, templatable
from pi4home.cpp_helpers import setup_component
from pi4home.cpp_types import App, Component, pi4home_ns, Action, float_

Servo = pi4home_ns.class_('Servo', Component)
ServoWriteAction = pi4home_ns.class_('ServoWriteAction', Action)

MULTI_CONF = True

CONFIG_SCHEMA = cv.Schema({
    vol.Required(CONF_ID):
    cv.declare_variable_id(Servo),
    vol.Required(CONF_OUTPUT):
    cv.use_variable_id(FloatOutput),
    vol.Optional(CONF_MIN_LEVEL, default='3%'):
    cv.percentage,
    vol.Optional(CONF_IDLE_LEVEL, default='7.5%'):
    cv.percentage,
    vol.Optional(CONF_MAX_LEVEL, default='12%'):
    cv.percentage,
}).extend(cv.COMPONENT_SCHEMA.schema)


def to_code(config):
    for out in get_variable(config[CONF_OUTPUT]):
        yield

    rhs = App.register_component(Servo.new(out))
    servo = Pvariable(config[CONF_ID], rhs)

    add(servo.set_min_level(config[CONF_MIN_LEVEL]))
Example #25
0
import voluptuous as vol

import pi4home.config_validation as cv
from pi4home.const import CONF_CSS_URL, CONF_ID, CONF_JS_URL, CONF_PORT
from pi4home.core import CORE
from pi4home.cpp_generator import Pvariable, add
from pi4home.cpp_helpers import setup_component
from pi4home.cpp_types import App, Component, StoringController, pi4home_ns

WebServer = pi4home_ns.class_('WebServer', Component, StoringController)

CONFIG_SCHEMA = cv.Schema({
    cv.GenerateID(): cv.declare_variable_id(WebServer),
    vol.Optional(CONF_PORT): cv.port,
    vol.Optional(CONF_CSS_URL): cv.string,
    vol.Optional(CONF_JS_URL): cv.string,
}).extend(cv.COMPONENT_SCHEMA.schema)


def to_code(config):
    rhs = App.init_web_server(config.get(CONF_PORT))
    web_server = Pvariable(config[CONF_ID], rhs)
    if CONF_CSS_URL in config:
        add(web_server.set_css_url(config[CONF_CSS_URL]))
    if CONF_JS_URL in config:
        add(web_server.set_js_url(config[CONF_JS_URL]))

    setup_component(web_server, config)


REQUIRED_BUILD_FLAGS = '-DUSE_WEB_SERVER'
Example #26
0
    if CORE.is_esp8266 and value[CONF_NUMBER] >= 16:
        raise vol.Invalid(
            "Pins GPIO16 and GPIO17 cannot be used as pulse counters on ESP8266."
        )
    return value


PLATFORM_SCHEMA = cv.nameable(
    sensor.SENSOR_PLATFORM_SCHEMA.extend({
        cv.GenerateID():
        cv.declare_variable_id(PulseCounterSensorComponent),
        vol.Required(CONF_PIN):
        validate_pulse_counter_pin,
        vol.Optional(CONF_COUNT_MODE):
        cv.Schema({
            vol.Required(CONF_RISING_EDGE): COUNT_MODE_SCHEMA,
            vol.Required(CONF_FALLING_EDGE): COUNT_MODE_SCHEMA,
        }),
        vol.Optional(CONF_INTERNAL_FILTER):
        validate_internal_filter,
        vol.Optional(CONF_UPDATE_INTERVAL):
        cv.update_interval,
    }).extend(cv.COMPONENT_SCHEMA.schema))


def to_code(config):
    for pin in gpio_input_pin_expression(config[CONF_PIN]):
        yield
    rhs = App.make_pulse_counter_sensor(config[CONF_NAME], pin,
                                        config.get(CONF_UPDATE_INTERVAL))
    pcnt = Pvariable(config[CONF_ID], rhs)
Example #27
0
    if not isinstance(value, string_types):
        raise vol.Invalid("Not valid dumpers")
    if value.upper() == "ALL":
        return list(sorted(list(DUMPERS)))
    raise vol.Invalid("Not valid dumpers")


CONFIG_SCHEMA = cv.Schema({
    cv.GenerateID():
    cv.declare_variable_id(RemoteReceiverComponent),
    vol.Required(CONF_PIN):
    vol.All(pins.internal_gpio_input_pin_schema, pins.validate_has_interrupt),
    vol.Optional(CONF_DUMP, default=[]):
    vol.Any(validate_dumpers_all,
            cv.ensure_list(cv.one_of(*DUMPERS, lower=True))),
    vol.Optional(CONF_TOLERANCE):
    vol.All(cv.percentage_int, vol.Range(min=0)),
    vol.Optional(CONF_BUFFER_SIZE):
    cv.validate_bytes,
    vol.Optional(CONF_FILTER):
    cv.positive_time_period_microseconds,
    vol.Optional(CONF_IDLE):
    cv.positive_time_period_microseconds,
}).extend(cv.COMPONENT_SCHEMA.schema)


def to_code(config):
    for pin in gpio_input_pin_expression(config[CONF_PIN]):
        yield
    rhs = App.make_remote_receiver_component(pin)
    receiver = Pvariable(config[CONF_ID], rhs)
Example #28
0
CONFIG_SCHEMA = cv.Schema({
    cv.GenerateID():
    cv.declare_variable_id(ESP32Camera),
    vol.Required(CONF_NAME):
    cv.string,
    vol.Required(CONF_DATA_PINS):
    vol.All([pins.input_pin], vol.Length(min=8, max=8)),
    vol.Required(CONF_VSYNC_PIN):
    pins.input_pin,
    vol.Required(CONF_HREF_PIN):
    pins.input_pin,
    vol.Required(CONF_PIXEL_CLOCK_PIN):
    pins.input_pin,
    vol.Required(CONF_EXTERNAL_CLOCK):
    cv.Schema({
        vol.Required(CONF_PIN):
        pins.output_pin,
        vol.Optional(CONF_FREQUENCY, default='20MHz'):
        vol.All(cv.frequency, vol.In([20e6, 10e6])),
    }),
    vol.Required(CONF_I2C_PINS):
    cv.Schema({
        vol.Required(CONF_SDA): pins.output_pin,
        vol.Required(CONF_SCL): pins.output_pin,
    }),
    vol.Optional(CONF_RESET_PIN):
    pins.output_pin,
    vol.Optional(CONF_POWER_DOWN_PIN):
    pins.output_pin,
    vol.Optional(CONF_MAX_FRAMERATE, default='10 fps'):
    vol.All(cv.framerate, vol.Range(min=0, min_included=False, max=60)),
    vol.Optional(CONF_IDLE_FRAMERATE, default='0.1 fps'):
    vol.All(cv.framerate, vol.Range(min=0, max=1)),
    vol.Optional(CONF_RESOLUTION, default='640X480'):
    cv.one_of(*FRAME_SIZES, upper=True),
    vol.Optional(CONF_JPEG_QUALITY, default=10):
    vol.All(cv.int_, vol.Range(min=10, max=63)),
    vol.Optional(CONF_CONTRAST, default=0):
    camera_range_param,
    vol.Optional(CONF_BRIGHTNESS, default=0):
    camera_range_param,
    vol.Optional(CONF_SATURATION, default=0):
    camera_range_param,
    vol.Optional(CONF_VERTICAL_FLIP, default=True):
    cv.boolean,
    vol.Optional(CONF_HORIZONTAL_MIRROR, default=True):
    cv.boolean,
    vol.Optional(CONF_TEST_PATTERN, default=False):
    cv.boolean,
}).extend(cv.COMPONENT_SCHEMA.schema)
Example #29
0
    sensor.setup_sensor(template, config)
    setup_component(template, config)

    if CONF_LAMBDA in config:
        for template_ in process_lambda(config[CONF_LAMBDA], [],
                                        return_type=optional.template(float_)):
            yield
        add(template.set_template(template_))


BUILD_FLAGS = '-DUSE_TEMPLATE_SENSOR'

CONF_SENSOR_TEMPLATE_PUBLISH = 'sensor.template.publish'
SENSOR_TEMPLATE_PUBLISH_ACTION_SCHEMA = cv.Schema({
    vol.Required(CONF_ID):
    cv.use_variable_id(sensor.Sensor),
    vol.Required(CONF_STATE):
    cv.templatable(cv.float_),
})


@ACTION_REGISTRY.register(CONF_SENSOR_TEMPLATE_PUBLISH,
                          SENSOR_TEMPLATE_PUBLISH_ACTION_SCHEMA)
def sensor_template_publish_to_code(config, action_id, template_arg, args):
    for var in get_variable(config[CONF_ID]):
        yield None
    rhs = var.make_sensor_publish_action(template_arg)
    type = SensorPublishAction.template(template_arg)
    action = Pvariable(action_id, rhs, type=type)
    for template_ in templatable(config[CONF_STATE], args, float_):
        yield None
    add(action.set_state(template_))
Example #30
0
                                     config[CONF_CLOSE_ACTION])
    if CONF_STOP_ACTION in config:
        automation.build_automations(var.get_stop_trigger(), [],
                                     config[CONF_STOP_ACTION])
    if CONF_OPTIMISTIC in config:
        add(var.set_optimistic(config[CONF_OPTIMISTIC]))
    if CONF_ASSUMED_STATE in config:
        add(var.set_assumed_state(config[CONF_ASSUMED_STATE]))


BUILD_FLAGS = '-DUSE_TEMPLATE_COVER'

CONF_COVER_TEMPLATE_PUBLISH = 'cover.template.publish'
COVER_TEMPLATE_PUBLISH_ACTION_SCHEMA = cv.Schema({
    vol.Required(CONF_ID):
    cv.use_variable_id(cover.Cover),
    vol.Required(CONF_STATE):
    cv.templatable(cover.validate_cover_state),
})


@ACTION_REGISTRY.register(CONF_COVER_TEMPLATE_PUBLISH,
                          COVER_TEMPLATE_PUBLISH_ACTION_SCHEMA)
def cover_template_publish_to_code(config, action_id, template_arg, args):
    for var in get_variable(config[CONF_ID]):
        yield None
    rhs = var.make_cover_publish_action(template_arg)
    type = CoverPublishAction.template(template_arg)
    action = Pvariable(action_id, rhs, type=type)
    state = config[CONF_STATE]
    if isinstance(state, string_types):
        template_ = cover.COVER_STATES[state]