import esphome.codegen as cg import esphome.config_validation as cv from esphome import automation from esphome.components import sensor from esphome.const import CONF_ID, CONF_SENSOR, CONF_RESTORE integration_ns = cg.esphome_ns.namespace('integration') IntegrationSensor = integration_ns.class_('IntegrationSensor', sensor.Sensor, cg.Component) ResetAction = integration_ns.class_('ResetAction', automation.Action) IntegrationSensorTime = integration_ns.enum('IntegrationSensorTime') INTEGRATION_TIMES = { 'ms': IntegrationSensorTime.INTEGRATION_SENSOR_TIME_MILLISECOND, 's': IntegrationSensorTime.INTEGRATION_SENSOR_TIME_SECOND, 'min': IntegrationSensorTime.INTEGRATION_SENSOR_TIME_MINUTE, 'h': IntegrationSensorTime.INTEGRATION_SENSOR_TIME_HOUR, 'd': IntegrationSensorTime.INTEGRATION_SENSOR_TIME_DAY, } IntegrationMethod = integration_ns.enum('IntegrationMethod') INTEGRATION_METHODS = { 'trapezoid': IntegrationMethod.INTEGRATION_METHOD_TRAPEZOID, 'left': IntegrationMethod.INTEGRATION_METHOD_LEFT, 'right': IntegrationMethod.INTEGRATION_METHOD_RIGHT, } CONF_TIME_UNIT = 'time_unit' CONF_INTEGRATION_METHOD = 'integration_method' CONFIG_SCHEMA = sensor.SENSOR_SCHEMA.extend({ cv.GenerateID(): cv.declare_id(IntegrationSensor), cv.Required(CONF_SENSOR): cv.use_id(sensor.Sensor), cv.Required(CONF_TIME_UNIT): cv.enum(INTEGRATION_TIMES, lower=True), cv.Optional(CONF_INTEGRATION_METHOD, default='trapezoid'): cv.enum(INTEGRATION_METHODS, lower=True), cv.Optional(CONF_RESTORE, default=False): cv.boolean, }).extend(cv.COMPONENT_SCHEMA) def to_code(config): var = cg.new_Pvariable(config[CONF_ID]) yield cg.register_component(var, config) yield sensor.register_sensor(var, config) sens = yield cg.get_variable(config[CONF_SENSOR]) cg.add(var.set_sensor(sens)) cg.add(var.set_time(config[CONF_TIME_UNIT])) cg.add(var.set_method(config[CONF_INTEGRATION_METHOD])) cg.add(var.set_restore(config[CONF_RESTORE])) @automation.register_action('sensor.integration.reset', ResetAction, automation.maybe_simple_id({ cv.Required(CONF_ID): cv.use_id(IntegrationSensor), })) def sensor_integration_reset_to_code(config, action_id, template_arg, args): paren = yield cg.get_variable(config[CONF_ID]) yield cg.new_Pvariable(action_id, template_arg, paren)