mirror of
https://github.com/esphome/esphome.git
synced 2026-05-30 07:16:11 +08:00
add-black (#1593)
* Add black Update pre commit Update pre commit add empty line * Format with black
This commit is contained in:
committed by
GitHub
parent
2b60b0f1fa
commit
69879920eb
+23
-7
@@ -1,11 +1,27 @@
|
|||||||
# See https://pre-commit.com for more information
|
# See https://pre-commit.com for more information
|
||||||
# See https://pre-commit.com/hooks.html for more hooks
|
# See https://pre-commit.com/hooks.html for more hooks
|
||||||
repos:
|
repos:
|
||||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
- repo: https://github.com/ambv/black
|
||||||
rev: v2.4.0
|
rev: 20.8b1
|
||||||
hooks:
|
hooks:
|
||||||
- id: trailing-whitespace
|
- id: black
|
||||||
- id: end-of-file-fixer
|
args:
|
||||||
- id: check-yaml
|
- --safe
|
||||||
- id: check-added-large-files
|
- --quiet
|
||||||
- id: flake8
|
files: ^((esphome|script|tests)/.+)?[^/]+\.py$
|
||||||
|
- repo: https://gitlab.com/pycqa/flake8
|
||||||
|
rev: 3.8.4
|
||||||
|
hooks:
|
||||||
|
- id: flake8
|
||||||
|
additional_dependencies:
|
||||||
|
- flake8-docstrings==1.5.0
|
||||||
|
- pydocstyle==5.1.1
|
||||||
|
files: ^(esphome|tests)/.+\.py$
|
||||||
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
|
rev: v3.4.0
|
||||||
|
hooks:
|
||||||
|
- id: no-commit-to-branch
|
||||||
|
args:
|
||||||
|
- --branch=dev
|
||||||
|
- --branch=master
|
||||||
|
- --branch=beta
|
||||||
|
|||||||
+279
-157
File diff suppressed because it is too large
Load Diff
+3685
-2173
File diff suppressed because one or more lines are too long
+50
-23
@@ -177,10 +177,14 @@ class APIClient(threading.Thread):
|
|||||||
try:
|
try:
|
||||||
ip = resolve_ip_address(self._address)
|
ip = resolve_ip_address(self._address)
|
||||||
except EsphomeError as err:
|
except EsphomeError as err:
|
||||||
_LOGGER.warning("Error resolving IP address of %s. Is it connected to WiFi?",
|
_LOGGER.warning(
|
||||||
self._address)
|
"Error resolving IP address of %s. Is it connected to WiFi?",
|
||||||
_LOGGER.warning("(If this error persists, please set a static IP address: "
|
self._address,
|
||||||
"https://esphome.io/components/wifi.html#manual-ips)")
|
)
|
||||||
|
_LOGGER.warning(
|
||||||
|
"(If this error persists, please set a static IP address: "
|
||||||
|
"https://esphome.io/components/wifi.html#manual-ips)"
|
||||||
|
)
|
||||||
raise APIConnectionError(err) from err
|
raise APIConnectionError(err) from err
|
||||||
|
|
||||||
_LOGGER.info("Connecting to %s:%s (%s)", self._address, self._port, ip)
|
_LOGGER.info("Connecting to %s:%s (%s)", self._address, self._port, ip)
|
||||||
@@ -198,14 +202,19 @@ class APIClient(threading.Thread):
|
|||||||
self._socket_open_event.set()
|
self._socket_open_event.set()
|
||||||
|
|
||||||
hello = pb.HelloRequest()
|
hello = pb.HelloRequest()
|
||||||
hello.client_info = f'ESPHome v{const.__version__}'
|
hello.client_info = f"ESPHome v{const.__version__}"
|
||||||
try:
|
try:
|
||||||
resp = self._send_message_await_response(hello, pb.HelloResponse)
|
resp = self._send_message_await_response(hello, pb.HelloResponse)
|
||||||
except APIConnectionError as err:
|
except APIConnectionError as err:
|
||||||
self._fatal_error(err)
|
self._fatal_error(err)
|
||||||
raise err
|
raise err
|
||||||
_LOGGER.debug("Successfully connected to %s ('%s' API=%s.%s)", self._address,
|
_LOGGER.debug(
|
||||||
resp.server_info, resp.api_version_major, resp.api_version_minor)
|
"Successfully connected to %s ('%s' API=%s.%s)",
|
||||||
|
self._address,
|
||||||
|
resp.server_info,
|
||||||
|
resp.api_version_major,
|
||||||
|
resp.api_version_minor,
|
||||||
|
)
|
||||||
self._connected = True
|
self._connected = True
|
||||||
self._refresh_ping()
|
self._refresh_ping()
|
||||||
if self.on_connect is not None:
|
if self.on_connect is not None:
|
||||||
@@ -270,7 +279,9 @@ class APIClient(threading.Thread):
|
|||||||
req += encoded
|
req += encoded
|
||||||
self._write(req)
|
self._write(req)
|
||||||
|
|
||||||
def _send_message_await_response_complex(self, send_msg, do_append, do_stop, timeout=5):
|
def _send_message_await_response_complex(
|
||||||
|
self, send_msg, do_append, do_stop, timeout=5
|
||||||
|
):
|
||||||
event = threading.Event()
|
event = threading.Event()
|
||||||
responses = []
|
responses = []
|
||||||
|
|
||||||
@@ -295,12 +306,15 @@ class APIClient(threading.Thread):
|
|||||||
def is_response(msg):
|
def is_response(msg):
|
||||||
return isinstance(msg, response_type)
|
return isinstance(msg, response_type)
|
||||||
|
|
||||||
return self._send_message_await_response_complex(send_msg, is_response, is_response,
|
return self._send_message_await_response_complex(
|
||||||
timeout)[0]
|
send_msg, is_response, is_response, timeout
|
||||||
|
)[0]
|
||||||
|
|
||||||
def device_info(self):
|
def device_info(self):
|
||||||
self._check_connected()
|
self._check_connected()
|
||||||
return self._send_message_await_response(pb.DeviceInfoRequest(), pb.DeviceInfoResponse)
|
return self._send_message_await_response(
|
||||||
|
pb.DeviceInfoRequest(), pb.DeviceInfoResponse
|
||||||
|
)
|
||||||
|
|
||||||
def ping(self):
|
def ping(self):
|
||||||
self._check_connected()
|
self._check_connected()
|
||||||
@@ -310,7 +324,9 @@ class APIClient(threading.Thread):
|
|||||||
self._check_connected()
|
self._check_connected()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self._send_message_await_response(pb.DisconnectRequest(), pb.DisconnectResponse)
|
self._send_message_await_response(
|
||||||
|
pb.DisconnectRequest(), pb.DisconnectResponse
|
||||||
|
)
|
||||||
except APIConnectionError:
|
except APIConnectionError:
|
||||||
pass
|
pass
|
||||||
self._close_socket()
|
self._close_socket()
|
||||||
@@ -415,7 +431,7 @@ class APIClient(threading.Thread):
|
|||||||
|
|
||||||
|
|
||||||
def run_logs(config, address):
|
def run_logs(config, address):
|
||||||
conf = config['api']
|
conf = config["api"]
|
||||||
port = conf[CONF_PORT]
|
port = conf[CONF_PORT]
|
||||||
password = conf[CONF_PASSWORD]
|
password = conf[CONF_PASSWORD]
|
||||||
_LOGGER.info("Starting log output from %s using esphome API", address)
|
_LOGGER.info("Starting log output from %s using esphome API", address)
|
||||||
@@ -447,24 +463,35 @@ def run_logs(config, address):
|
|||||||
_LOGGER.info("Successfully connected to %s", address)
|
_LOGGER.info("Successfully connected to %s", address)
|
||||||
return
|
return
|
||||||
|
|
||||||
wait_time = int(min(1.5**min(tries, 100), 30))
|
wait_time = int(min(1.5 ** min(tries, 100), 30))
|
||||||
if not has_connects:
|
if not has_connects:
|
||||||
_LOGGER.warning("Initial connection failed. The ESP might not be connected "
|
_LOGGER.warning(
|
||||||
"to WiFi yet (%s). Re-Trying in %s seconds",
|
"Initial connection failed. The ESP might not be connected "
|
||||||
error, wait_time)
|
"to WiFi yet (%s). Re-Trying in %s seconds",
|
||||||
|
error,
|
||||||
|
wait_time,
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
_LOGGER.warning("Couldn't connect to API (%s). Trying to reconnect in %s seconds",
|
_LOGGER.warning(
|
||||||
error, wait_time)
|
"Couldn't connect to API (%s). Trying to reconnect in %s seconds",
|
||||||
timer = threading.Timer(wait_time, functools.partial(try_connect, None, tries + 1))
|
error,
|
||||||
|
wait_time,
|
||||||
|
)
|
||||||
|
timer = threading.Timer(
|
||||||
|
wait_time, functools.partial(try_connect, None, tries + 1)
|
||||||
|
)
|
||||||
timer.start()
|
timer.start()
|
||||||
retry_timer.append(timer)
|
retry_timer.append(timer)
|
||||||
|
|
||||||
def on_log(msg):
|
def on_log(msg):
|
||||||
time_ = datetime.now().time().strftime('[%H:%M:%S]')
|
time_ = datetime.now().time().strftime("[%H:%M:%S]")
|
||||||
text = msg.message
|
text = msg.message
|
||||||
if msg.send_failed:
|
if msg.send_failed:
|
||||||
text = color('white', '(Message skipped because it was too big to fit in '
|
text = color(
|
||||||
'TCP buffer - This is only cosmetic)')
|
"white",
|
||||||
|
"(Message skipped because it was too big to fit in "
|
||||||
|
"TCP buffer - This is only cosmetic)",
|
||||||
|
)
|
||||||
safe_print(time_ + text)
|
safe_print(time_ + text)
|
||||||
|
|
||||||
def on_login():
|
def on_login():
|
||||||
|
|||||||
+106
-61
@@ -1,7 +1,15 @@
|
|||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.const import CONF_AUTOMATION_ID, CONF_CONDITION, CONF_ELSE, CONF_ID, CONF_THEN, \
|
from esphome.const import (
|
||||||
CONF_TRIGGER_ID, CONF_TYPE_ID, CONF_TIME
|
CONF_AUTOMATION_ID,
|
||||||
|
CONF_CONDITION,
|
||||||
|
CONF_ELSE,
|
||||||
|
CONF_ID,
|
||||||
|
CONF_THEN,
|
||||||
|
CONF_TRIGGER_ID,
|
||||||
|
CONF_TYPE_ID,
|
||||||
|
CONF_TIME,
|
||||||
|
)
|
||||||
from esphome.core import coroutine
|
from esphome.core import coroutine
|
||||||
from esphome.util import Registry
|
from esphome.util import Registry
|
||||||
|
|
||||||
@@ -30,36 +38,34 @@ def register_condition(name, condition_type, schema):
|
|||||||
return CONDITION_REGISTRY.register(name, condition_type, schema)
|
return CONDITION_REGISTRY.register(name, condition_type, schema)
|
||||||
|
|
||||||
|
|
||||||
Action = cg.esphome_ns.class_('Action')
|
Action = cg.esphome_ns.class_("Action")
|
||||||
Trigger = cg.esphome_ns.class_('Trigger')
|
Trigger = cg.esphome_ns.class_("Trigger")
|
||||||
ACTION_REGISTRY = Registry()
|
ACTION_REGISTRY = Registry()
|
||||||
Condition = cg.esphome_ns.class_('Condition')
|
Condition = cg.esphome_ns.class_("Condition")
|
||||||
CONDITION_REGISTRY = Registry()
|
CONDITION_REGISTRY = Registry()
|
||||||
validate_action = cv.validate_registry_entry('action', ACTION_REGISTRY)
|
validate_action = cv.validate_registry_entry("action", ACTION_REGISTRY)
|
||||||
validate_action_list = cv.validate_registry('action', ACTION_REGISTRY)
|
validate_action_list = cv.validate_registry("action", ACTION_REGISTRY)
|
||||||
validate_condition = cv.validate_registry_entry('condition', CONDITION_REGISTRY)
|
validate_condition = cv.validate_registry_entry("condition", CONDITION_REGISTRY)
|
||||||
validate_condition_list = cv.validate_registry('condition', CONDITION_REGISTRY)
|
validate_condition_list = cv.validate_registry("condition", CONDITION_REGISTRY)
|
||||||
|
|
||||||
|
|
||||||
def validate_potentially_and_condition(value):
|
def validate_potentially_and_condition(value):
|
||||||
if isinstance(value, list):
|
if isinstance(value, list):
|
||||||
with cv.remove_prepend_path(['and']):
|
with cv.remove_prepend_path(["and"]):
|
||||||
return validate_condition({
|
return validate_condition({"and": value})
|
||||||
'and': value
|
|
||||||
})
|
|
||||||
return validate_condition(value)
|
return validate_condition(value)
|
||||||
|
|
||||||
|
|
||||||
DelayAction = cg.esphome_ns.class_('DelayAction', Action, cg.Component)
|
DelayAction = cg.esphome_ns.class_("DelayAction", Action, cg.Component)
|
||||||
LambdaAction = cg.esphome_ns.class_('LambdaAction', Action)
|
LambdaAction = cg.esphome_ns.class_("LambdaAction", Action)
|
||||||
IfAction = cg.esphome_ns.class_('IfAction', Action)
|
IfAction = cg.esphome_ns.class_("IfAction", Action)
|
||||||
WhileAction = cg.esphome_ns.class_('WhileAction', Action)
|
WhileAction = cg.esphome_ns.class_("WhileAction", Action)
|
||||||
WaitUntilAction = cg.esphome_ns.class_('WaitUntilAction', Action, cg.Component)
|
WaitUntilAction = cg.esphome_ns.class_("WaitUntilAction", Action, cg.Component)
|
||||||
UpdateComponentAction = cg.esphome_ns.class_('UpdateComponentAction', Action)
|
UpdateComponentAction = cg.esphome_ns.class_("UpdateComponentAction", Action)
|
||||||
Automation = cg.esphome_ns.class_('Automation')
|
Automation = cg.esphome_ns.class_("Automation")
|
||||||
|
|
||||||
LambdaCondition = cg.esphome_ns.class_('LambdaCondition', Condition)
|
LambdaCondition = cg.esphome_ns.class_("LambdaCondition", Condition)
|
||||||
ForCondition = cg.esphome_ns.class_('ForCondition', Condition, cg.Component)
|
ForCondition = cg.esphome_ns.class_("ForCondition", Condition, cg.Component)
|
||||||
|
|
||||||
|
|
||||||
def validate_automation(extra_schema=None, extra_validators=None, single=False):
|
def validate_automation(extra_schema=None, extra_validators=None, single=False):
|
||||||
@@ -83,10 +89,10 @@ def validate_automation(extra_schema=None, extra_validators=None, single=False):
|
|||||||
try:
|
try:
|
||||||
return cv.Schema([schema])(value)
|
return cv.Schema([schema])(value)
|
||||||
except cv.Invalid as err2:
|
except cv.Invalid as err2:
|
||||||
if 'extra keys not allowed' in str(err2) and len(err2.path) == 2:
|
if "extra keys not allowed" in str(err2) and len(err2.path) == 2:
|
||||||
# pylint: disable=raise-missing-from
|
# pylint: disable=raise-missing-from
|
||||||
raise err
|
raise err
|
||||||
if 'Unable to find action' in str(err):
|
if "Unable to find action" in str(err):
|
||||||
raise err2
|
raise err2
|
||||||
raise cv.MultipleInvalid([err, err2])
|
raise cv.MultipleInvalid([err, err2])
|
||||||
elif isinstance(value, dict):
|
elif isinstance(value, dict):
|
||||||
@@ -110,47 +116,59 @@ def validate_automation(extra_schema=None, extra_validators=None, single=False):
|
|||||||
return validator
|
return validator
|
||||||
|
|
||||||
|
|
||||||
AUTOMATION_SCHEMA = cv.Schema({
|
AUTOMATION_SCHEMA = cv.Schema(
|
||||||
cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(Trigger),
|
{
|
||||||
cv.GenerateID(CONF_AUTOMATION_ID): cv.declare_id(Automation),
|
cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(Trigger),
|
||||||
cv.Required(CONF_THEN): validate_action_list,
|
cv.GenerateID(CONF_AUTOMATION_ID): cv.declare_id(Automation),
|
||||||
})
|
cv.Required(CONF_THEN): validate_action_list,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
AndCondition = cg.esphome_ns.class_('AndCondition', Condition)
|
AndCondition = cg.esphome_ns.class_("AndCondition", Condition)
|
||||||
OrCondition = cg.esphome_ns.class_('OrCondition', Condition)
|
OrCondition = cg.esphome_ns.class_("OrCondition", Condition)
|
||||||
NotCondition = cg.esphome_ns.class_('NotCondition', Condition)
|
NotCondition = cg.esphome_ns.class_("NotCondition", Condition)
|
||||||
|
|
||||||
|
|
||||||
@register_condition('and', AndCondition, validate_condition_list)
|
@register_condition("and", AndCondition, validate_condition_list)
|
||||||
def and_condition_to_code(config, condition_id, template_arg, args):
|
def and_condition_to_code(config, condition_id, template_arg, args):
|
||||||
conditions = yield build_condition_list(config, template_arg, args)
|
conditions = yield build_condition_list(config, template_arg, args)
|
||||||
yield cg.new_Pvariable(condition_id, template_arg, conditions)
|
yield cg.new_Pvariable(condition_id, template_arg, conditions)
|
||||||
|
|
||||||
|
|
||||||
@register_condition('or', OrCondition, validate_condition_list)
|
@register_condition("or", OrCondition, validate_condition_list)
|
||||||
def or_condition_to_code(config, condition_id, template_arg, args):
|
def or_condition_to_code(config, condition_id, template_arg, args):
|
||||||
conditions = yield build_condition_list(config, template_arg, args)
|
conditions = yield build_condition_list(config, template_arg, args)
|
||||||
yield cg.new_Pvariable(condition_id, template_arg, conditions)
|
yield cg.new_Pvariable(condition_id, template_arg, conditions)
|
||||||
|
|
||||||
|
|
||||||
@register_condition('not', NotCondition, validate_potentially_and_condition)
|
@register_condition("not", NotCondition, validate_potentially_and_condition)
|
||||||
def not_condition_to_code(config, condition_id, template_arg, args):
|
def not_condition_to_code(config, condition_id, template_arg, args):
|
||||||
condition = yield build_condition(config, template_arg, args)
|
condition = yield build_condition(config, template_arg, args)
|
||||||
yield cg.new_Pvariable(condition_id, template_arg, condition)
|
yield cg.new_Pvariable(condition_id, template_arg, condition)
|
||||||
|
|
||||||
|
|
||||||
@register_condition('lambda', LambdaCondition, cv.lambda_)
|
@register_condition("lambda", LambdaCondition, cv.lambda_)
|
||||||
def lambda_condition_to_code(config, condition_id, template_arg, args):
|
def lambda_condition_to_code(config, condition_id, template_arg, args):
|
||||||
lambda_ = yield cg.process_lambda(config, args, return_type=bool)
|
lambda_ = yield cg.process_lambda(config, args, return_type=bool)
|
||||||
yield cg.new_Pvariable(condition_id, template_arg, lambda_)
|
yield cg.new_Pvariable(condition_id, template_arg, lambda_)
|
||||||
|
|
||||||
|
|
||||||
@register_condition('for', ForCondition, cv.Schema({
|
@register_condition(
|
||||||
cv.Required(CONF_TIME): cv.templatable(cv.positive_time_period_milliseconds),
|
"for",
|
||||||
cv.Required(CONF_CONDITION): validate_potentially_and_condition,
|
ForCondition,
|
||||||
}).extend(cv.COMPONENT_SCHEMA))
|
cv.Schema(
|
||||||
|
{
|
||||||
|
cv.Required(CONF_TIME): cv.templatable(
|
||||||
|
cv.positive_time_period_milliseconds
|
||||||
|
),
|
||||||
|
cv.Required(CONF_CONDITION): validate_potentially_and_condition,
|
||||||
|
}
|
||||||
|
).extend(cv.COMPONENT_SCHEMA),
|
||||||
|
)
|
||||||
def for_condition_to_code(config, condition_id, template_arg, args):
|
def for_condition_to_code(config, condition_id, template_arg, args):
|
||||||
condition = yield build_condition(config[CONF_CONDITION], cg.TemplateArguments(), [])
|
condition = yield build_condition(
|
||||||
|
config[CONF_CONDITION], cg.TemplateArguments(), []
|
||||||
|
)
|
||||||
var = cg.new_Pvariable(condition_id, template_arg, condition)
|
var = cg.new_Pvariable(condition_id, template_arg, condition)
|
||||||
yield cg.register_component(var, config)
|
yield cg.register_component(var, config)
|
||||||
templ = yield cg.templatable(config[CONF_TIME], args, cg.uint32)
|
templ = yield cg.templatable(config[CONF_TIME], args, cg.uint32)
|
||||||
@@ -158,7 +176,9 @@ def for_condition_to_code(config, condition_id, template_arg, args):
|
|||||||
yield var
|
yield var
|
||||||
|
|
||||||
|
|
||||||
@register_action('delay', DelayAction, cv.templatable(cv.positive_time_period_milliseconds))
|
@register_action(
|
||||||
|
"delay", DelayAction, cv.templatable(cv.positive_time_period_milliseconds)
|
||||||
|
)
|
||||||
def delay_action_to_code(config, action_id, template_arg, args):
|
def delay_action_to_code(config, action_id, template_arg, args):
|
||||||
var = cg.new_Pvariable(action_id, template_arg)
|
var = cg.new_Pvariable(action_id, template_arg)
|
||||||
yield cg.register_component(var, {})
|
yield cg.register_component(var, {})
|
||||||
@@ -167,11 +187,18 @@ def delay_action_to_code(config, action_id, template_arg, args):
|
|||||||
yield var
|
yield var
|
||||||
|
|
||||||
|
|
||||||
@register_action('if', IfAction, cv.All({
|
@register_action(
|
||||||
cv.Required(CONF_CONDITION): validate_potentially_and_condition,
|
"if",
|
||||||
cv.Optional(CONF_THEN): validate_action_list,
|
IfAction,
|
||||||
cv.Optional(CONF_ELSE): validate_action_list,
|
cv.All(
|
||||||
}, cv.has_at_least_one_key(CONF_THEN, CONF_ELSE)))
|
{
|
||||||
|
cv.Required(CONF_CONDITION): validate_potentially_and_condition,
|
||||||
|
cv.Optional(CONF_THEN): validate_action_list,
|
||||||
|
cv.Optional(CONF_ELSE): validate_action_list,
|
||||||
|
},
|
||||||
|
cv.has_at_least_one_key(CONF_THEN, CONF_ELSE),
|
||||||
|
),
|
||||||
|
)
|
||||||
def if_action_to_code(config, action_id, template_arg, args):
|
def if_action_to_code(config, action_id, template_arg, args):
|
||||||
conditions = yield build_condition(config[CONF_CONDITION], template_arg, args)
|
conditions = yield build_condition(config[CONF_CONDITION], template_arg, args)
|
||||||
var = cg.new_Pvariable(action_id, template_arg, conditions)
|
var = cg.new_Pvariable(action_id, template_arg, conditions)
|
||||||
@@ -184,10 +211,16 @@ def if_action_to_code(config, action_id, template_arg, args):
|
|||||||
yield var
|
yield var
|
||||||
|
|
||||||
|
|
||||||
@register_action('while', WhileAction, cv.Schema({
|
@register_action(
|
||||||
cv.Required(CONF_CONDITION): validate_potentially_and_condition,
|
"while",
|
||||||
cv.Required(CONF_THEN): validate_action_list,
|
WhileAction,
|
||||||
}))
|
cv.Schema(
|
||||||
|
{
|
||||||
|
cv.Required(CONF_CONDITION): validate_potentially_and_condition,
|
||||||
|
cv.Required(CONF_THEN): validate_action_list,
|
||||||
|
}
|
||||||
|
),
|
||||||
|
)
|
||||||
def while_action_to_code(config, action_id, template_arg, args):
|
def while_action_to_code(config, action_id, template_arg, args):
|
||||||
conditions = yield build_condition(config[CONF_CONDITION], template_arg, args)
|
conditions = yield build_condition(config[CONF_CONDITION], template_arg, args)
|
||||||
var = cg.new_Pvariable(action_id, template_arg, conditions)
|
var = cg.new_Pvariable(action_id, template_arg, conditions)
|
||||||
@@ -197,15 +230,17 @@ def while_action_to_code(config, action_id, template_arg, args):
|
|||||||
|
|
||||||
|
|
||||||
def validate_wait_until(value):
|
def validate_wait_until(value):
|
||||||
schema = cv.Schema({
|
schema = cv.Schema(
|
||||||
cv.Required(CONF_CONDITION): validate_potentially_and_condition,
|
{
|
||||||
})
|
cv.Required(CONF_CONDITION): validate_potentially_and_condition,
|
||||||
|
}
|
||||||
|
)
|
||||||
if isinstance(value, dict) and CONF_CONDITION in value:
|
if isinstance(value, dict) and CONF_CONDITION in value:
|
||||||
return schema(value)
|
return schema(value)
|
||||||
return validate_wait_until({CONF_CONDITION: value})
|
return validate_wait_until({CONF_CONDITION: value})
|
||||||
|
|
||||||
|
|
||||||
@register_action('wait_until', WaitUntilAction, validate_wait_until)
|
@register_action("wait_until", WaitUntilAction, validate_wait_until)
|
||||||
def wait_until_action_to_code(config, action_id, template_arg, args):
|
def wait_until_action_to_code(config, action_id, template_arg, args):
|
||||||
conditions = yield build_condition(config[CONF_CONDITION], template_arg, args)
|
conditions = yield build_condition(config[CONF_CONDITION], template_arg, args)
|
||||||
var = cg.new_Pvariable(action_id, template_arg, conditions)
|
var = cg.new_Pvariable(action_id, template_arg, conditions)
|
||||||
@@ -213,15 +248,21 @@ def wait_until_action_to_code(config, action_id, template_arg, args):
|
|||||||
yield var
|
yield var
|
||||||
|
|
||||||
|
|
||||||
@register_action('lambda', LambdaAction, cv.lambda_)
|
@register_action("lambda", LambdaAction, cv.lambda_)
|
||||||
def lambda_action_to_code(config, action_id, template_arg, args):
|
def lambda_action_to_code(config, action_id, template_arg, args):
|
||||||
lambda_ = yield cg.process_lambda(config, args, return_type=cg.void)
|
lambda_ = yield cg.process_lambda(config, args, return_type=cg.void)
|
||||||
yield cg.new_Pvariable(action_id, template_arg, lambda_)
|
yield cg.new_Pvariable(action_id, template_arg, lambda_)
|
||||||
|
|
||||||
|
|
||||||
@register_action('component.update', UpdateComponentAction, maybe_simple_id({
|
@register_action(
|
||||||
cv.Required(CONF_ID): cv.use_id(cg.PollingComponent),
|
"component.update",
|
||||||
}))
|
UpdateComponentAction,
|
||||||
|
maybe_simple_id(
|
||||||
|
{
|
||||||
|
cv.Required(CONF_ID): cv.use_id(cg.PollingComponent),
|
||||||
|
}
|
||||||
|
),
|
||||||
|
)
|
||||||
def component_update_action_to_code(config, action_id, template_arg, args):
|
def component_update_action_to_code(config, action_id, template_arg, args):
|
||||||
comp = yield cg.get_variable(config[CONF_ID])
|
comp = yield cg.get_variable(config[CONF_ID])
|
||||||
yield cg.new_Pvariable(action_id, template_arg, comp)
|
yield cg.new_Pvariable(action_id, template_arg, comp)
|
||||||
@@ -229,7 +270,9 @@ def component_update_action_to_code(config, action_id, template_arg, args):
|
|||||||
|
|
||||||
@coroutine
|
@coroutine
|
||||||
def build_action(full_config, template_arg, args):
|
def build_action(full_config, template_arg, args):
|
||||||
registry_entry, config = cg.extract_registry_entry_config(ACTION_REGISTRY, full_config)
|
registry_entry, config = cg.extract_registry_entry_config(
|
||||||
|
ACTION_REGISTRY, full_config
|
||||||
|
)
|
||||||
action_id = full_config[CONF_TYPE_ID]
|
action_id = full_config[CONF_TYPE_ID]
|
||||||
builder = registry_entry.coroutine_fun
|
builder = registry_entry.coroutine_fun
|
||||||
yield builder(config, action_id, template_arg, args)
|
yield builder(config, action_id, template_arg, args)
|
||||||
@@ -246,7 +289,9 @@ def build_action_list(config, templ, arg_type):
|
|||||||
|
|
||||||
@coroutine
|
@coroutine
|
||||||
def build_condition(full_config, template_arg, args):
|
def build_condition(full_config, template_arg, args):
|
||||||
registry_entry, config = cg.extract_registry_entry_config(CONDITION_REGISTRY, full_config)
|
registry_entry, config = cg.extract_registry_entry_config(
|
||||||
|
CONDITION_REGISTRY, full_config
|
||||||
|
)
|
||||||
action_id = full_config[CONF_TYPE_ID]
|
action_id = full_config[CONF_TYPE_ID]
|
||||||
builder = registry_entry.coroutine_fun
|
builder = registry_entry.coroutine_fun
|
||||||
yield builder(config, action_id, template_arg, args)
|
yield builder(config, action_id, template_arg, args)
|
||||||
|
|||||||
+65
-13
@@ -9,18 +9,70 @@
|
|||||||
|
|
||||||
# pylint: disable=unused-import
|
# pylint: disable=unused-import
|
||||||
from esphome.cpp_generator import ( # noqa
|
from esphome.cpp_generator import ( # noqa
|
||||||
Expression, RawExpression, RawStatement, TemplateArguments,
|
Expression,
|
||||||
StructInitializer, ArrayInitializer, safe_exp, Statement, LineComment,
|
RawExpression,
|
||||||
progmem_array, statement, variable, Pvariable, new_Pvariable,
|
RawStatement,
|
||||||
add, add_global, add_library, add_build_flag, add_define,
|
TemplateArguments,
|
||||||
get_variable, get_variable_with_full_id, process_lambda, is_template, templatable, MockObj,
|
StructInitializer,
|
||||||
MockObjClass)
|
ArrayInitializer,
|
||||||
|
safe_exp,
|
||||||
|
Statement,
|
||||||
|
LineComment,
|
||||||
|
progmem_array,
|
||||||
|
statement,
|
||||||
|
variable,
|
||||||
|
Pvariable,
|
||||||
|
new_Pvariable,
|
||||||
|
add,
|
||||||
|
add_global,
|
||||||
|
add_library,
|
||||||
|
add_build_flag,
|
||||||
|
add_define,
|
||||||
|
get_variable,
|
||||||
|
get_variable_with_full_id,
|
||||||
|
process_lambda,
|
||||||
|
is_template,
|
||||||
|
templatable,
|
||||||
|
MockObj,
|
||||||
|
MockObjClass,
|
||||||
|
)
|
||||||
from esphome.cpp_helpers import ( # noqa
|
from esphome.cpp_helpers import ( # noqa
|
||||||
gpio_pin_expression, register_component, build_registry_entry,
|
gpio_pin_expression,
|
||||||
build_registry_list, extract_registry_entry_config, register_parented)
|
register_component,
|
||||||
|
build_registry_entry,
|
||||||
|
build_registry_list,
|
||||||
|
extract_registry_entry_config,
|
||||||
|
register_parented,
|
||||||
|
)
|
||||||
from esphome.cpp_types import ( # noqa
|
from esphome.cpp_types import ( # noqa
|
||||||
global_ns, void, nullptr, float_, double, bool_, int_, std_ns, std_string,
|
global_ns,
|
||||||
std_vector, uint8, uint16, uint32, int32, const_char_ptr, NAN,
|
void,
|
||||||
esphome_ns, App, Nameable, Component, ComponentPtr,
|
nullptr,
|
||||||
PollingComponent, Application, optional, arduino_json_ns, JsonObject,
|
float_,
|
||||||
JsonObjectRef, JsonObjectConstRef, Controller, GPIOPin)
|
double,
|
||||||
|
bool_,
|
||||||
|
int_,
|
||||||
|
std_ns,
|
||||||
|
std_string,
|
||||||
|
std_vector,
|
||||||
|
uint8,
|
||||||
|
uint16,
|
||||||
|
uint32,
|
||||||
|
int32,
|
||||||
|
const_char_ptr,
|
||||||
|
NAN,
|
||||||
|
esphome_ns,
|
||||||
|
App,
|
||||||
|
Nameable,
|
||||||
|
Component,
|
||||||
|
ComponentPtr,
|
||||||
|
PollingComponent,
|
||||||
|
Application,
|
||||||
|
optional,
|
||||||
|
arduino_json_ns,
|
||||||
|
JsonObject,
|
||||||
|
JsonObjectRef,
|
||||||
|
JsonObjectConstRef,
|
||||||
|
Controller,
|
||||||
|
GPIOPin,
|
||||||
|
)
|
||||||
|
|||||||
@@ -5,15 +5,17 @@ import esphome.codegen as cg
|
|||||||
from esphome.const import CONF_DIR_PIN, CONF_ID, CONF_SLEEP_PIN, CONF_STEP_PIN
|
from esphome.const import CONF_DIR_PIN, CONF_ID, CONF_SLEEP_PIN, CONF_STEP_PIN
|
||||||
|
|
||||||
|
|
||||||
a4988_ns = cg.esphome_ns.namespace('a4988')
|
a4988_ns = cg.esphome_ns.namespace("a4988")
|
||||||
A4988 = a4988_ns.class_('A4988', stepper.Stepper, cg.Component)
|
A4988 = a4988_ns.class_("A4988", stepper.Stepper, cg.Component)
|
||||||
|
|
||||||
CONFIG_SCHEMA = stepper.STEPPER_SCHEMA.extend({
|
CONFIG_SCHEMA = stepper.STEPPER_SCHEMA.extend(
|
||||||
cv.Required(CONF_ID): cv.declare_id(A4988),
|
{
|
||||||
cv.Required(CONF_STEP_PIN): pins.gpio_output_pin_schema,
|
cv.Required(CONF_ID): cv.declare_id(A4988),
|
||||||
cv.Required(CONF_DIR_PIN): pins.gpio_output_pin_schema,
|
cv.Required(CONF_STEP_PIN): pins.gpio_output_pin_schema,
|
||||||
cv.Optional(CONF_SLEEP_PIN): pins.gpio_output_pin_schema,
|
cv.Required(CONF_DIR_PIN): pins.gpio_output_pin_schema,
|
||||||
}).extend(cv.COMPONENT_SCHEMA)
|
cv.Optional(CONF_SLEEP_PIN): pins.gpio_output_pin_schema,
|
||||||
|
}
|
||||||
|
).extend(cv.COMPONENT_SCHEMA)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
@@ -4,28 +4,32 @@ from esphome import pins
|
|||||||
from esphome.components import output
|
from esphome.components import output
|
||||||
from esphome.const import CONF_ID, CONF_MIN_POWER, CONF_METHOD
|
from esphome.const import CONF_ID, CONF_MIN_POWER, CONF_METHOD
|
||||||
|
|
||||||
CODEOWNERS = ['@glmnet']
|
CODEOWNERS = ["@glmnet"]
|
||||||
|
|
||||||
ac_dimmer_ns = cg.esphome_ns.namespace('ac_dimmer')
|
ac_dimmer_ns = cg.esphome_ns.namespace("ac_dimmer")
|
||||||
AcDimmer = ac_dimmer_ns.class_('AcDimmer', output.FloatOutput, cg.Component)
|
AcDimmer = ac_dimmer_ns.class_("AcDimmer", output.FloatOutput, cg.Component)
|
||||||
|
|
||||||
DimMethod = ac_dimmer_ns.enum('DimMethod')
|
DimMethod = ac_dimmer_ns.enum("DimMethod")
|
||||||
DIM_METHODS = {
|
DIM_METHODS = {
|
||||||
'LEADING_PULSE': DimMethod.DIM_METHOD_LEADING_PULSE,
|
"LEADING_PULSE": DimMethod.DIM_METHOD_LEADING_PULSE,
|
||||||
'LEADING': DimMethod.DIM_METHOD_LEADING,
|
"LEADING": DimMethod.DIM_METHOD_LEADING,
|
||||||
'TRAILING': DimMethod.DIM_METHOD_TRAILING,
|
"TRAILING": DimMethod.DIM_METHOD_TRAILING,
|
||||||
}
|
}
|
||||||
|
|
||||||
CONF_GATE_PIN = 'gate_pin'
|
CONF_GATE_PIN = "gate_pin"
|
||||||
CONF_ZERO_CROSS_PIN = 'zero_cross_pin'
|
CONF_ZERO_CROSS_PIN = "zero_cross_pin"
|
||||||
CONF_INIT_WITH_HALF_CYCLE = 'init_with_half_cycle'
|
CONF_INIT_WITH_HALF_CYCLE = "init_with_half_cycle"
|
||||||
CONFIG_SCHEMA = output.FLOAT_OUTPUT_SCHEMA.extend({
|
CONFIG_SCHEMA = output.FLOAT_OUTPUT_SCHEMA.extend(
|
||||||
cv.Required(CONF_ID): cv.declare_id(AcDimmer),
|
{
|
||||||
cv.Required(CONF_GATE_PIN): pins.internal_gpio_output_pin_schema,
|
cv.Required(CONF_ID): cv.declare_id(AcDimmer),
|
||||||
cv.Required(CONF_ZERO_CROSS_PIN): pins.internal_gpio_input_pin_schema,
|
cv.Required(CONF_GATE_PIN): pins.internal_gpio_output_pin_schema,
|
||||||
cv.Optional(CONF_INIT_WITH_HALF_CYCLE, default=True): cv.boolean,
|
cv.Required(CONF_ZERO_CROSS_PIN): pins.internal_gpio_input_pin_schema,
|
||||||
cv.Optional(CONF_METHOD, default='leading pulse'): cv.enum(DIM_METHODS, upper=True, space='_'),
|
cv.Optional(CONF_INIT_WITH_HALF_CYCLE, default=True): cv.boolean,
|
||||||
}).extend(cv.COMPONENT_SCHEMA)
|
cv.Optional(CONF_METHOD, default="leading pulse"): cv.enum(
|
||||||
|
DIM_METHODS, upper=True, space="_"
|
||||||
|
),
|
||||||
|
}
|
||||||
|
).extend(cv.COMPONENT_SCHEMA)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
@@ -5,18 +5,22 @@ from esphome.components.light.types import AddressableLightEffect
|
|||||||
from esphome.components.light.effects import register_addressable_effect
|
from esphome.components.light.effects import register_addressable_effect
|
||||||
from esphome.const import CONF_NAME, CONF_UART_ID
|
from esphome.const import CONF_NAME, CONF_UART_ID
|
||||||
|
|
||||||
DEPENDENCIES = ['uart']
|
DEPENDENCIES = ["uart"]
|
||||||
|
|
||||||
adalight_ns = cg.esphome_ns.namespace('adalight')
|
adalight_ns = cg.esphome_ns.namespace("adalight")
|
||||||
AdalightLightEffect = adalight_ns.class_(
|
AdalightLightEffect = adalight_ns.class_(
|
||||||
'AdalightLightEffect', uart.UARTDevice, AddressableLightEffect)
|
"AdalightLightEffect", uart.UARTDevice, AddressableLightEffect
|
||||||
|
)
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.Schema({})
|
CONFIG_SCHEMA = cv.Schema({})
|
||||||
|
|
||||||
|
|
||||||
@register_addressable_effect('adalight', AdalightLightEffect, "Adalight", {
|
@register_addressable_effect(
|
||||||
cv.GenerateID(CONF_UART_ID): cv.use_id(uart.UARTComponent)
|
"adalight",
|
||||||
})
|
AdalightLightEffect,
|
||||||
|
"Adalight",
|
||||||
|
{cv.GenerateID(CONF_UART_ID): cv.use_id(uart.UARTComponent)},
|
||||||
|
)
|
||||||
def adalight_light_effect_to_code(config, effect_id):
|
def adalight_light_effect_to_code(config, effect_id):
|
||||||
effect = cg.new_Pvariable(effect_id, config[CONF_NAME])
|
effect = cg.new_Pvariable(effect_id, config[CONF_NAME])
|
||||||
yield uart.register_uart_device(effect, config)
|
yield uart.register_uart_device(effect, config)
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
CODEOWNERS = ['@esphome/core']
|
CODEOWNERS = ["@esphome/core"]
|
||||||
|
|||||||
@@ -2,37 +2,51 @@ import esphome.codegen as cg
|
|||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome import pins
|
from esphome import pins
|
||||||
from esphome.components import sensor, voltage_sampler
|
from esphome.components import sensor, voltage_sampler
|
||||||
from esphome.const import CONF_ATTENUATION, CONF_ID, CONF_PIN, DEVICE_CLASS_VOLTAGE, ICON_EMPTY, \
|
from esphome.const import (
|
||||||
UNIT_VOLT
|
CONF_ATTENUATION,
|
||||||
|
CONF_ID,
|
||||||
|
CONF_PIN,
|
||||||
|
DEVICE_CLASS_VOLTAGE,
|
||||||
|
ICON_EMPTY,
|
||||||
|
UNIT_VOLT,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
AUTO_LOAD = ['voltage_sampler']
|
AUTO_LOAD = ["voltage_sampler"]
|
||||||
|
|
||||||
ATTENUATION_MODES = {
|
ATTENUATION_MODES = {
|
||||||
'0db': cg.global_ns.ADC_0db,
|
"0db": cg.global_ns.ADC_0db,
|
||||||
'2.5db': cg.global_ns.ADC_2_5db,
|
"2.5db": cg.global_ns.ADC_2_5db,
|
||||||
'6db': cg.global_ns.ADC_6db,
|
"6db": cg.global_ns.ADC_6db,
|
||||||
'11db': cg.global_ns.ADC_11db,
|
"11db": cg.global_ns.ADC_11db,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def validate_adc_pin(value):
|
def validate_adc_pin(value):
|
||||||
vcc = str(value).upper()
|
vcc = str(value).upper()
|
||||||
if vcc == 'VCC':
|
if vcc == "VCC":
|
||||||
return cv.only_on_esp8266(vcc)
|
return cv.only_on_esp8266(vcc)
|
||||||
return pins.analog_pin(value)
|
return pins.analog_pin(value)
|
||||||
|
|
||||||
|
|
||||||
adc_ns = cg.esphome_ns.namespace('adc')
|
adc_ns = cg.esphome_ns.namespace("adc")
|
||||||
ADCSensor = adc_ns.class_('ADCSensor', sensor.Sensor, cg.PollingComponent,
|
ADCSensor = adc_ns.class_(
|
||||||
voltage_sampler.VoltageSampler)
|
"ADCSensor", sensor.Sensor, cg.PollingComponent, voltage_sampler.VoltageSampler
|
||||||
|
)
|
||||||
|
|
||||||
CONFIG_SCHEMA = sensor.sensor_schema(UNIT_VOLT, ICON_EMPTY, 2, DEVICE_CLASS_VOLTAGE).extend({
|
CONFIG_SCHEMA = (
|
||||||
cv.GenerateID(): cv.declare_id(ADCSensor),
|
sensor.sensor_schema(UNIT_VOLT, ICON_EMPTY, 2, DEVICE_CLASS_VOLTAGE)
|
||||||
cv.Required(CONF_PIN): validate_adc_pin,
|
.extend(
|
||||||
cv.SplitDefault(CONF_ATTENUATION, esp32='0db'):
|
{
|
||||||
cv.All(cv.only_on_esp32, cv.enum(ATTENUATION_MODES, lower=True)),
|
cv.GenerateID(): cv.declare_id(ADCSensor),
|
||||||
}).extend(cv.polling_component_schema('60s'))
|
cv.Required(CONF_PIN): validate_adc_pin,
|
||||||
|
cv.SplitDefault(CONF_ATTENUATION, esp32="0db"): cv.All(
|
||||||
|
cv.only_on_esp32, cv.enum(ATTENUATION_MODES, lower=True)
|
||||||
|
),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.extend(cv.polling_component_schema("60s"))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
@@ -40,8 +54,8 @@ def to_code(config):
|
|||||||
yield cg.register_component(var, config)
|
yield cg.register_component(var, config)
|
||||||
yield sensor.register_sensor(var, config)
|
yield sensor.register_sensor(var, config)
|
||||||
|
|
||||||
if config[CONF_PIN] == 'VCC':
|
if config[CONF_PIN] == "VCC":
|
||||||
cg.add_define('USE_ADC_SENSOR_VCC')
|
cg.add_define("USE_ADC_SENSOR_VCC")
|
||||||
else:
|
else:
|
||||||
cg.add(var.set_pin(config[CONF_PIN]))
|
cg.add(var.set_pin(config[CONF_PIN]))
|
||||||
|
|
||||||
|
|||||||
@@ -2,33 +2,54 @@ import esphome.codegen as cg
|
|||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.components import sensor, i2c
|
from esphome.components import sensor, i2c
|
||||||
from esphome import pins
|
from esphome import pins
|
||||||
from esphome.const import CONF_ID, CONF_VOLTAGE, DEVICE_CLASS_CURRENT, DEVICE_CLASS_POWER, \
|
from esphome.const import (
|
||||||
DEVICE_CLASS_VOLTAGE, ICON_EMPTY, UNIT_VOLT, UNIT_AMPERE, UNIT_WATT
|
CONF_ID,
|
||||||
|
CONF_VOLTAGE,
|
||||||
|
DEVICE_CLASS_CURRENT,
|
||||||
|
DEVICE_CLASS_POWER,
|
||||||
|
DEVICE_CLASS_VOLTAGE,
|
||||||
|
ICON_EMPTY,
|
||||||
|
UNIT_VOLT,
|
||||||
|
UNIT_AMPERE,
|
||||||
|
UNIT_WATT,
|
||||||
|
)
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ["i2c"]
|
||||||
|
|
||||||
ade7953_ns = cg.esphome_ns.namespace('ade7953')
|
ade7953_ns = cg.esphome_ns.namespace("ade7953")
|
||||||
ADE7953 = ade7953_ns.class_('ADE7953', cg.PollingComponent, i2c.I2CDevice)
|
ADE7953 = ade7953_ns.class_("ADE7953", cg.PollingComponent, i2c.I2CDevice)
|
||||||
|
|
||||||
CONF_IRQ_PIN = 'irq_pin'
|
CONF_IRQ_PIN = "irq_pin"
|
||||||
CONF_CURRENT_A = 'current_a'
|
CONF_CURRENT_A = "current_a"
|
||||||
CONF_CURRENT_B = 'current_b'
|
CONF_CURRENT_B = "current_b"
|
||||||
CONF_ACTIVE_POWER_A = 'active_power_a'
|
CONF_ACTIVE_POWER_A = "active_power_a"
|
||||||
CONF_ACTIVE_POWER_B = 'active_power_b'
|
CONF_ACTIVE_POWER_B = "active_power_b"
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.Schema({
|
CONFIG_SCHEMA = (
|
||||||
cv.GenerateID(): cv.declare_id(ADE7953),
|
cv.Schema(
|
||||||
cv.Optional(CONF_IRQ_PIN): pins.input_pin,
|
{
|
||||||
cv.Optional(CONF_VOLTAGE): sensor.sensor_schema(UNIT_VOLT, ICON_EMPTY, 1, DEVICE_CLASS_VOLTAGE),
|
cv.GenerateID(): cv.declare_id(ADE7953),
|
||||||
cv.Optional(CONF_CURRENT_A): sensor.sensor_schema(UNIT_AMPERE, ICON_EMPTY, 2,
|
cv.Optional(CONF_IRQ_PIN): pins.input_pin,
|
||||||
DEVICE_CLASS_CURRENT),
|
cv.Optional(CONF_VOLTAGE): sensor.sensor_schema(
|
||||||
cv.Optional(CONF_CURRENT_B): sensor.sensor_schema(UNIT_AMPERE, ICON_EMPTY, 2,
|
UNIT_VOLT, ICON_EMPTY, 1, DEVICE_CLASS_VOLTAGE
|
||||||
DEVICE_CLASS_CURRENT),
|
),
|
||||||
cv.Optional(CONF_ACTIVE_POWER_A): sensor.sensor_schema(UNIT_WATT, ICON_EMPTY, 1,
|
cv.Optional(CONF_CURRENT_A): sensor.sensor_schema(
|
||||||
DEVICE_CLASS_POWER),
|
UNIT_AMPERE, ICON_EMPTY, 2, DEVICE_CLASS_CURRENT
|
||||||
cv.Optional(CONF_ACTIVE_POWER_B): sensor.sensor_schema(UNIT_WATT, ICON_EMPTY, 1,
|
),
|
||||||
DEVICE_CLASS_POWER),
|
cv.Optional(CONF_CURRENT_B): sensor.sensor_schema(
|
||||||
}).extend(cv.polling_component_schema('60s')).extend(i2c.i2c_device_schema(0x38))
|
UNIT_AMPERE, ICON_EMPTY, 2, DEVICE_CLASS_CURRENT
|
||||||
|
),
|
||||||
|
cv.Optional(CONF_ACTIVE_POWER_A): sensor.sensor_schema(
|
||||||
|
UNIT_WATT, ICON_EMPTY, 1, DEVICE_CLASS_POWER
|
||||||
|
),
|
||||||
|
cv.Optional(CONF_ACTIVE_POWER_B): sensor.sensor_schema(
|
||||||
|
UNIT_WATT, ICON_EMPTY, 1, DEVICE_CLASS_POWER
|
||||||
|
),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.extend(cv.polling_component_schema("60s"))
|
||||||
|
.extend(i2c.i2c_device_schema(0x38))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
@@ -39,10 +60,15 @@ def to_code(config):
|
|||||||
if CONF_IRQ_PIN in config:
|
if CONF_IRQ_PIN in config:
|
||||||
cg.add(var.set_irq_pin(config[CONF_IRQ_PIN]))
|
cg.add(var.set_irq_pin(config[CONF_IRQ_PIN]))
|
||||||
|
|
||||||
for key in [CONF_VOLTAGE, CONF_CURRENT_A, CONF_CURRENT_B, CONF_ACTIVE_POWER_A,
|
for key in [
|
||||||
CONF_ACTIVE_POWER_B]:
|
CONF_VOLTAGE,
|
||||||
|
CONF_CURRENT_A,
|
||||||
|
CONF_CURRENT_B,
|
||||||
|
CONF_ACTIVE_POWER_A,
|
||||||
|
CONF_ACTIVE_POWER_B,
|
||||||
|
]:
|
||||||
if key not in config:
|
if key not in config:
|
||||||
continue
|
continue
|
||||||
conf = config[key]
|
conf = config[key]
|
||||||
sens = yield sensor.new_sensor(conf)
|
sens = yield sensor.new_sensor(conf)
|
||||||
cg.add(getattr(var, f'set_{key}_sensor')(sens))
|
cg.add(getattr(var, f"set_{key}_sensor")(sens))
|
||||||
|
|||||||
@@ -3,18 +3,24 @@ import esphome.config_validation as cv
|
|||||||
from esphome.components import i2c
|
from esphome.components import i2c
|
||||||
from esphome.const import CONF_ID
|
from esphome.const import CONF_ID
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ["i2c"]
|
||||||
AUTO_LOAD = ['sensor', 'voltage_sampler']
|
AUTO_LOAD = ["sensor", "voltage_sampler"]
|
||||||
MULTI_CONF = True
|
MULTI_CONF = True
|
||||||
|
|
||||||
ads1115_ns = cg.esphome_ns.namespace('ads1115')
|
ads1115_ns = cg.esphome_ns.namespace("ads1115")
|
||||||
ADS1115Component = ads1115_ns.class_('ADS1115Component', cg.Component, i2c.I2CDevice)
|
ADS1115Component = ads1115_ns.class_("ADS1115Component", cg.Component, i2c.I2CDevice)
|
||||||
|
|
||||||
CONF_CONTINUOUS_MODE = 'continuous_mode'
|
CONF_CONTINUOUS_MODE = "continuous_mode"
|
||||||
CONFIG_SCHEMA = cv.Schema({
|
CONFIG_SCHEMA = (
|
||||||
cv.GenerateID(): cv.declare_id(ADS1115Component),
|
cv.Schema(
|
||||||
cv.Optional(CONF_CONTINUOUS_MODE, default=False): cv.boolean,
|
{
|
||||||
}).extend(cv.COMPONENT_SCHEMA).extend(i2c.i2c_device_schema(None))
|
cv.GenerateID(): cv.declare_id(ADS1115Component),
|
||||||
|
cv.Optional(CONF_CONTINUOUS_MODE, default=False): cv.boolean,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.extend(cv.COMPONENT_SCHEMA)
|
||||||
|
.extend(i2c.i2c_device_schema(None))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
@@ -1,54 +1,67 @@
|
|||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.components import sensor, voltage_sampler
|
from esphome.components import sensor, voltage_sampler
|
||||||
from esphome.const import CONF_GAIN, CONF_MULTIPLEXER, DEVICE_CLASS_VOLTAGE, ICON_EMPTY, \
|
from esphome.const import (
|
||||||
UNIT_VOLT, CONF_ID
|
CONF_GAIN,
|
||||||
|
CONF_MULTIPLEXER,
|
||||||
|
DEVICE_CLASS_VOLTAGE,
|
||||||
|
ICON_EMPTY,
|
||||||
|
UNIT_VOLT,
|
||||||
|
CONF_ID,
|
||||||
|
)
|
||||||
from . import ads1115_ns, ADS1115Component
|
from . import ads1115_ns, ADS1115Component
|
||||||
|
|
||||||
DEPENDENCIES = ['ads1115']
|
DEPENDENCIES = ["ads1115"]
|
||||||
|
|
||||||
ADS1115Multiplexer = ads1115_ns.enum('ADS1115Multiplexer')
|
ADS1115Multiplexer = ads1115_ns.enum("ADS1115Multiplexer")
|
||||||
MUX = {
|
MUX = {
|
||||||
'A0_A1': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P0_N1,
|
"A0_A1": ADS1115Multiplexer.ADS1115_MULTIPLEXER_P0_N1,
|
||||||
'A0_A3': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P0_N3,
|
"A0_A3": ADS1115Multiplexer.ADS1115_MULTIPLEXER_P0_N3,
|
||||||
'A1_A3': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P1_N3,
|
"A1_A3": ADS1115Multiplexer.ADS1115_MULTIPLEXER_P1_N3,
|
||||||
'A2_A3': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P2_N3,
|
"A2_A3": ADS1115Multiplexer.ADS1115_MULTIPLEXER_P2_N3,
|
||||||
'A0_GND': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P0_NG,
|
"A0_GND": ADS1115Multiplexer.ADS1115_MULTIPLEXER_P0_NG,
|
||||||
'A1_GND': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P1_NG,
|
"A1_GND": ADS1115Multiplexer.ADS1115_MULTIPLEXER_P1_NG,
|
||||||
'A2_GND': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P2_NG,
|
"A2_GND": ADS1115Multiplexer.ADS1115_MULTIPLEXER_P2_NG,
|
||||||
'A3_GND': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P3_NG,
|
"A3_GND": ADS1115Multiplexer.ADS1115_MULTIPLEXER_P3_NG,
|
||||||
}
|
}
|
||||||
|
|
||||||
ADS1115Gain = ads1115_ns.enum('ADS1115Gain')
|
ADS1115Gain = ads1115_ns.enum("ADS1115Gain")
|
||||||
GAIN = {
|
GAIN = {
|
||||||
'6.144': ADS1115Gain.ADS1115_GAIN_6P144,
|
"6.144": ADS1115Gain.ADS1115_GAIN_6P144,
|
||||||
'4.096': ADS1115Gain.ADS1115_GAIN_4P096,
|
"4.096": ADS1115Gain.ADS1115_GAIN_4P096,
|
||||||
'2.048': ADS1115Gain.ADS1115_GAIN_2P048,
|
"2.048": ADS1115Gain.ADS1115_GAIN_2P048,
|
||||||
'1.024': ADS1115Gain.ADS1115_GAIN_1P024,
|
"1.024": ADS1115Gain.ADS1115_GAIN_1P024,
|
||||||
'0.512': ADS1115Gain.ADS1115_GAIN_0P512,
|
"0.512": ADS1115Gain.ADS1115_GAIN_0P512,
|
||||||
'0.256': ADS1115Gain.ADS1115_GAIN_0P256,
|
"0.256": ADS1115Gain.ADS1115_GAIN_0P256,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def validate_gain(value):
|
def validate_gain(value):
|
||||||
if isinstance(value, float):
|
if isinstance(value, float):
|
||||||
value = f'{value:0.03f}'
|
value = f"{value:0.03f}"
|
||||||
elif not isinstance(value, str):
|
elif not isinstance(value, str):
|
||||||
raise cv.Invalid(f'invalid gain "{value}"')
|
raise cv.Invalid(f'invalid gain "{value}"')
|
||||||
|
|
||||||
return cv.enum(GAIN)(value)
|
return cv.enum(GAIN)(value)
|
||||||
|
|
||||||
|
|
||||||
ADS1115Sensor = ads1115_ns.class_('ADS1115Sensor', sensor.Sensor, cg.PollingComponent,
|
ADS1115Sensor = ads1115_ns.class_(
|
||||||
voltage_sampler.VoltageSampler)
|
"ADS1115Sensor", sensor.Sensor, cg.PollingComponent, voltage_sampler.VoltageSampler
|
||||||
|
)
|
||||||
|
|
||||||
CONF_ADS1115_ID = 'ads1115_id'
|
CONF_ADS1115_ID = "ads1115_id"
|
||||||
CONFIG_SCHEMA = sensor.sensor_schema(UNIT_VOLT, ICON_EMPTY, 3, DEVICE_CLASS_VOLTAGE).extend({
|
CONFIG_SCHEMA = (
|
||||||
cv.GenerateID(): cv.declare_id(ADS1115Sensor),
|
sensor.sensor_schema(UNIT_VOLT, ICON_EMPTY, 3, DEVICE_CLASS_VOLTAGE)
|
||||||
cv.GenerateID(CONF_ADS1115_ID): cv.use_id(ADS1115Component),
|
.extend(
|
||||||
cv.Required(CONF_MULTIPLEXER): cv.enum(MUX, upper=True, space='_'),
|
{
|
||||||
cv.Required(CONF_GAIN): validate_gain,
|
cv.GenerateID(): cv.declare_id(ADS1115Sensor),
|
||||||
}).extend(cv.polling_component_schema('60s'))
|
cv.GenerateID(CONF_ADS1115_ID): cv.use_id(ADS1115Component),
|
||||||
|
cv.Required(CONF_MULTIPLEXER): cv.enum(MUX, upper=True, space="_"),
|
||||||
|
cv.Required(CONF_GAIN): validate_gain,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.extend(cv.polling_component_schema("60s"))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
@@ -1,21 +1,37 @@
|
|||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.components import i2c, sensor
|
from esphome.components import i2c, sensor
|
||||||
from esphome.const import CONF_HUMIDITY, CONF_ID, CONF_TEMPERATURE, DEVICE_CLASS_HUMIDITY, \
|
from esphome.const import (
|
||||||
DEVICE_CLASS_TEMPERATURE, ICON_EMPTY, UNIT_CELSIUS, UNIT_PERCENT
|
CONF_HUMIDITY,
|
||||||
|
CONF_ID,
|
||||||
|
CONF_TEMPERATURE,
|
||||||
|
DEVICE_CLASS_HUMIDITY,
|
||||||
|
DEVICE_CLASS_TEMPERATURE,
|
||||||
|
ICON_EMPTY,
|
||||||
|
UNIT_CELSIUS,
|
||||||
|
UNIT_PERCENT,
|
||||||
|
)
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ["i2c"]
|
||||||
|
|
||||||
aht10_ns = cg.esphome_ns.namespace('aht10')
|
aht10_ns = cg.esphome_ns.namespace("aht10")
|
||||||
AHT10Component = aht10_ns.class_('AHT10Component', cg.PollingComponent, i2c.I2CDevice)
|
AHT10Component = aht10_ns.class_("AHT10Component", cg.PollingComponent, i2c.I2CDevice)
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.Schema({
|
CONFIG_SCHEMA = (
|
||||||
cv.GenerateID(): cv.declare_id(AHT10Component),
|
cv.Schema(
|
||||||
cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema(UNIT_CELSIUS, ICON_EMPTY, 2,
|
{
|
||||||
DEVICE_CLASS_TEMPERATURE),
|
cv.GenerateID(): cv.declare_id(AHT10Component),
|
||||||
cv.Optional(CONF_HUMIDITY): sensor.sensor_schema(UNIT_PERCENT, ICON_EMPTY, 2,
|
cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema(
|
||||||
DEVICE_CLASS_HUMIDITY),
|
UNIT_CELSIUS, ICON_EMPTY, 2, DEVICE_CLASS_TEMPERATURE
|
||||||
}).extend(cv.polling_component_schema('60s')).extend(i2c.i2c_device_schema(0x38))
|
),
|
||||||
|
cv.Optional(CONF_HUMIDITY): sensor.sensor_schema(
|
||||||
|
UNIT_PERCENT, ICON_EMPTY, 2, DEVICE_CLASS_HUMIDITY
|
||||||
|
),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.extend(cv.polling_component_schema("60s"))
|
||||||
|
.extend(i2c.i2c_device_schema(0x38))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
@@ -1,21 +1,39 @@
|
|||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.components import i2c, sensor
|
from esphome.components import i2c, sensor
|
||||||
from esphome.const import CONF_HUMIDITY, CONF_ID, CONF_TEMPERATURE, DEVICE_CLASS_HUMIDITY, \
|
from esphome.const import (
|
||||||
DEVICE_CLASS_TEMPERATURE, UNIT_CELSIUS, ICON_EMPTY, UNIT_PERCENT
|
CONF_HUMIDITY,
|
||||||
|
CONF_ID,
|
||||||
|
CONF_TEMPERATURE,
|
||||||
|
DEVICE_CLASS_HUMIDITY,
|
||||||
|
DEVICE_CLASS_TEMPERATURE,
|
||||||
|
UNIT_CELSIUS,
|
||||||
|
ICON_EMPTY,
|
||||||
|
UNIT_PERCENT,
|
||||||
|
)
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ["i2c"]
|
||||||
|
|
||||||
am2320_ns = cg.esphome_ns.namespace('am2320')
|
am2320_ns = cg.esphome_ns.namespace("am2320")
|
||||||
AM2320Component = am2320_ns.class_('AM2320Component', cg.PollingComponent, i2c.I2CDevice)
|
AM2320Component = am2320_ns.class_(
|
||||||
|
"AM2320Component", cg.PollingComponent, i2c.I2CDevice
|
||||||
|
)
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.Schema({
|
CONFIG_SCHEMA = (
|
||||||
cv.GenerateID(): cv.declare_id(AM2320Component),
|
cv.Schema(
|
||||||
cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema(UNIT_CELSIUS, ICON_EMPTY, 1,
|
{
|
||||||
DEVICE_CLASS_TEMPERATURE),
|
cv.GenerateID(): cv.declare_id(AM2320Component),
|
||||||
cv.Optional(CONF_HUMIDITY): sensor.sensor_schema(UNIT_PERCENT, ICON_EMPTY, 1,
|
cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema(
|
||||||
DEVICE_CLASS_HUMIDITY),
|
UNIT_CELSIUS, ICON_EMPTY, 1, DEVICE_CLASS_TEMPERATURE
|
||||||
}).extend(cv.polling_component_schema('60s')).extend(i2c.i2c_device_schema(0x5C))
|
),
|
||||||
|
cv.Optional(CONF_HUMIDITY): sensor.sensor_schema(
|
||||||
|
UNIT_PERCENT, ICON_EMPTY, 1, DEVICE_CLASS_HUMIDITY
|
||||||
|
),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.extend(cv.polling_component_schema("60s"))
|
||||||
|
.extend(i2c.i2c_device_schema(0x5C))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
@@ -10,24 +10,28 @@ from esphome.core import CORE, HexInt
|
|||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
DEPENDENCIES = ['display']
|
DEPENDENCIES = ["display"]
|
||||||
MULTI_CONF = True
|
MULTI_CONF = True
|
||||||
|
|
||||||
Animation_ = display.display_ns.class_('Animation')
|
Animation_ = display.display_ns.class_("Animation")
|
||||||
|
|
||||||
CONF_RAW_DATA_ID = 'raw_data_id'
|
CONF_RAW_DATA_ID = "raw_data_id"
|
||||||
|
|
||||||
ANIMATION_SCHEMA = cv.Schema({
|
ANIMATION_SCHEMA = cv.Schema(
|
||||||
cv.Required(CONF_ID): cv.declare_id(Animation_),
|
{
|
||||||
cv.Required(CONF_FILE): cv.file_,
|
cv.Required(CONF_ID): cv.declare_id(Animation_),
|
||||||
cv.Optional(CONF_RESIZE): cv.dimensions,
|
cv.Required(CONF_FILE): cv.file_,
|
||||||
cv.Optional(CONF_TYPE, default='BINARY'): cv.enum(espImage.IMAGE_TYPE, upper=True),
|
cv.Optional(CONF_RESIZE): cv.dimensions,
|
||||||
cv.GenerateID(CONF_RAW_DATA_ID): cv.declare_id(cg.uint8),
|
cv.Optional(CONF_TYPE, default="BINARY"): cv.enum(
|
||||||
})
|
espImage.IMAGE_TYPE, upper=True
|
||||||
|
),
|
||||||
|
cv.GenerateID(CONF_RAW_DATA_ID): cv.declare_id(cg.uint8),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.All(font.validate_pillow_installed, ANIMATION_SCHEMA)
|
CONFIG_SCHEMA = cv.All(font.validate_pillow_installed, ANIMATION_SCHEMA)
|
||||||
|
|
||||||
CODEOWNERS = ['@syndlex']
|
CODEOWNERS = ["@syndlex"]
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
@@ -46,26 +50,28 @@ def to_code(config):
|
|||||||
width, height = image.size
|
width, height = image.size
|
||||||
else:
|
else:
|
||||||
if width > 500 or height > 500:
|
if width > 500 or height > 500:
|
||||||
_LOGGER.warning("The image you requested is very big. Please consider using"
|
_LOGGER.warning(
|
||||||
" the resize parameter.")
|
"The image you requested is very big. Please consider using"
|
||||||
|
" the resize parameter."
|
||||||
|
)
|
||||||
|
|
||||||
if config[CONF_TYPE] == 'GRAYSCALE':
|
if config[CONF_TYPE] == "GRAYSCALE":
|
||||||
data = [0 for _ in range(height * width * frames)]
|
data = [0 for _ in range(height * width * frames)]
|
||||||
pos = 0
|
pos = 0
|
||||||
for frameIndex in range(frames):
|
for frameIndex in range(frames):
|
||||||
image.seek(frameIndex)
|
image.seek(frameIndex)
|
||||||
frame = image.convert('L', dither=Image.NONE)
|
frame = image.convert("L", dither=Image.NONE)
|
||||||
pixels = list(frame.getdata())
|
pixels = list(frame.getdata())
|
||||||
for pix in pixels:
|
for pix in pixels:
|
||||||
data[pos] = pix
|
data[pos] = pix
|
||||||
pos += 1
|
pos += 1
|
||||||
|
|
||||||
elif config[CONF_TYPE] == 'RGB24':
|
elif config[CONF_TYPE] == "RGB24":
|
||||||
data = [0 for _ in range(height * width * 3 * frames)]
|
data = [0 for _ in range(height * width * 3 * frames)]
|
||||||
pos = 0
|
pos = 0
|
||||||
for frameIndex in range(frames):
|
for frameIndex in range(frames):
|
||||||
image.seek(frameIndex)
|
image.seek(frameIndex)
|
||||||
frame = image.convert('RGB')
|
frame = image.convert("RGB")
|
||||||
pixels = list(frame.getdata())
|
pixels = list(frame.getdata())
|
||||||
for pix in pixels:
|
for pix in pixels:
|
||||||
data[pos] = pix[0]
|
data[pos] = pix[0]
|
||||||
@@ -75,12 +81,12 @@ def to_code(config):
|
|||||||
data[pos] = pix[2]
|
data[pos] = pix[2]
|
||||||
pos += 1
|
pos += 1
|
||||||
|
|
||||||
elif config[CONF_TYPE] == 'BINARY':
|
elif config[CONF_TYPE] == "BINARY":
|
||||||
width8 = ((width + 7) // 8) * 8
|
width8 = ((width + 7) // 8) * 8
|
||||||
data = [0 for _ in range((height * width8 // 8) * frames)]
|
data = [0 for _ in range((height * width8 // 8) * frames)]
|
||||||
for frameIndex in range(frames):
|
for frameIndex in range(frames):
|
||||||
image.seek(frameIndex)
|
image.seek(frameIndex)
|
||||||
frame = image.convert('1', dither=Image.NONE)
|
frame = image.convert("1", dither=Image.NONE)
|
||||||
for y in range(height):
|
for y in range(height):
|
||||||
for x in range(width):
|
for x in range(width):
|
||||||
if frame.getpixel((x, y)):
|
if frame.getpixel((x, y)):
|
||||||
@@ -90,5 +96,11 @@ def to_code(config):
|
|||||||
|
|
||||||
rhs = [HexInt(x) for x in data]
|
rhs = [HexInt(x) for x in data]
|
||||||
prog_arr = cg.progmem_array(config[CONF_RAW_DATA_ID], rhs)
|
prog_arr = cg.progmem_array(config[CONF_RAW_DATA_ID], rhs)
|
||||||
cg.new_Pvariable(config[CONF_ID], prog_arr, width, height, frames,
|
cg.new_Pvariable(
|
||||||
espImage.IMAGE_TYPE[config[CONF_TYPE]])
|
config[CONF_ID],
|
||||||
|
prog_arr,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
frames,
|
||||||
|
espImage.IMAGE_TYPE[config[CONF_TYPE]],
|
||||||
|
)
|
||||||
|
|||||||
@@ -3,18 +3,24 @@ import esphome.config_validation as cv
|
|||||||
from esphome.components import i2c
|
from esphome.components import i2c
|
||||||
from esphome.const import CONF_ID
|
from esphome.const import CONF_ID
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ["i2c"]
|
||||||
AUTO_LOAD = ['sensor', 'binary_sensor']
|
AUTO_LOAD = ["sensor", "binary_sensor"]
|
||||||
MULTI_CONF = True
|
MULTI_CONF = True
|
||||||
|
|
||||||
CONF_APDS9960_ID = 'apds9960_id'
|
CONF_APDS9960_ID = "apds9960_id"
|
||||||
|
|
||||||
apds9960_nds = cg.esphome_ns.namespace('apds9960')
|
apds9960_nds = cg.esphome_ns.namespace("apds9960")
|
||||||
APDS9960 = apds9960_nds.class_('APDS9960', cg.PollingComponent, i2c.I2CDevice)
|
APDS9960 = apds9960_nds.class_("APDS9960", cg.PollingComponent, i2c.I2CDevice)
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.Schema({
|
CONFIG_SCHEMA = (
|
||||||
cv.GenerateID(): cv.declare_id(APDS9960),
|
cv.Schema(
|
||||||
}).extend(cv.polling_component_schema('60s')).extend(i2c.i2c_device_schema(0x39))
|
{
|
||||||
|
cv.GenerateID(): cv.declare_id(APDS9960),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.extend(cv.polling_component_schema("60s"))
|
||||||
|
.extend(i2c.i2c_device_schema(0x39))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
@@ -4,20 +4,24 @@ from esphome.components import binary_sensor
|
|||||||
from esphome.const import CONF_DIRECTION, CONF_DEVICE_CLASS, DEVICE_CLASS_MOVING
|
from esphome.const import CONF_DIRECTION, CONF_DEVICE_CLASS, DEVICE_CLASS_MOVING
|
||||||
from . import APDS9960, CONF_APDS9960_ID
|
from . import APDS9960, CONF_APDS9960_ID
|
||||||
|
|
||||||
DEPENDENCIES = ['apds9960']
|
DEPENDENCIES = ["apds9960"]
|
||||||
|
|
||||||
DIRECTIONS = {
|
DIRECTIONS = {
|
||||||
'UP': 'set_up_direction',
|
"UP": "set_up_direction",
|
||||||
'DOWN': 'set_down_direction',
|
"DOWN": "set_down_direction",
|
||||||
'LEFT': 'set_left_direction',
|
"LEFT": "set_left_direction",
|
||||||
'RIGHT': 'set_right_direction',
|
"RIGHT": "set_right_direction",
|
||||||
}
|
}
|
||||||
|
|
||||||
CONFIG_SCHEMA = binary_sensor.BINARY_SENSOR_SCHEMA.extend({
|
CONFIG_SCHEMA = binary_sensor.BINARY_SENSOR_SCHEMA.extend(
|
||||||
cv.Required(CONF_DIRECTION): cv.one_of(*DIRECTIONS, upper=True),
|
{
|
||||||
cv.GenerateID(CONF_APDS9960_ID): cv.use_id(APDS9960),
|
cv.Required(CONF_DIRECTION): cv.one_of(*DIRECTIONS, upper=True),
|
||||||
cv.Optional(CONF_DEVICE_CLASS, default=DEVICE_CLASS_MOVING): binary_sensor.device_class,
|
cv.GenerateID(CONF_APDS9960_ID): cv.use_id(APDS9960),
|
||||||
})
|
cv.Optional(
|
||||||
|
CONF_DEVICE_CLASS, default=DEVICE_CLASS_MOVING
|
||||||
|
): binary_sensor.device_class,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
@@ -4,20 +4,24 @@ from esphome.components import sensor
|
|||||||
from esphome.const import CONF_TYPE, DEVICE_CLASS_EMPTY, UNIT_PERCENT, ICON_LIGHTBULB
|
from esphome.const import CONF_TYPE, DEVICE_CLASS_EMPTY, UNIT_PERCENT, ICON_LIGHTBULB
|
||||||
from . import APDS9960, CONF_APDS9960_ID
|
from . import APDS9960, CONF_APDS9960_ID
|
||||||
|
|
||||||
DEPENDENCIES = ['apds9960']
|
DEPENDENCIES = ["apds9960"]
|
||||||
|
|
||||||
TYPES = {
|
TYPES = {
|
||||||
'CLEAR': 'set_clear_channel',
|
"CLEAR": "set_clear_channel",
|
||||||
'RED': 'set_red_channel',
|
"RED": "set_red_channel",
|
||||||
'GREEN': 'set_green_channel',
|
"GREEN": "set_green_channel",
|
||||||
'BLUE': 'set_blue_channel',
|
"BLUE": "set_blue_channel",
|
||||||
'PROXIMITY': 'set_proximity',
|
"PROXIMITY": "set_proximity",
|
||||||
}
|
}
|
||||||
|
|
||||||
CONFIG_SCHEMA = sensor.sensor_schema(UNIT_PERCENT, ICON_LIGHTBULB, 1, DEVICE_CLASS_EMPTY).extend({
|
CONFIG_SCHEMA = sensor.sensor_schema(
|
||||||
cv.Required(CONF_TYPE): cv.one_of(*TYPES, upper=True),
|
UNIT_PERCENT, ICON_LIGHTBULB, 1, DEVICE_CLASS_EMPTY
|
||||||
cv.GenerateID(CONF_APDS9960_ID): cv.use_id(APDS9960),
|
).extend(
|
||||||
})
|
{
|
||||||
|
cv.Required(CONF_TYPE): cv.one_of(*TYPES, upper=True),
|
||||||
|
cv.GenerateID(CONF_APDS9960_ID): cv.use_id(APDS9960),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
@@ -2,46 +2,69 @@ import esphome.codegen as cg
|
|||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome import automation
|
from esphome import automation
|
||||||
from esphome.automation import Condition
|
from esphome.automation import Condition
|
||||||
from esphome.const import CONF_DATA, CONF_DATA_TEMPLATE, CONF_ID, CONF_PASSWORD, CONF_PORT, \
|
from esphome.const import (
|
||||||
CONF_REBOOT_TIMEOUT, CONF_SERVICE, CONF_VARIABLES, CONF_SERVICES, CONF_TRIGGER_ID, CONF_EVENT, \
|
CONF_DATA,
|
||||||
CONF_TAG
|
CONF_DATA_TEMPLATE,
|
||||||
|
CONF_ID,
|
||||||
|
CONF_PASSWORD,
|
||||||
|
CONF_PORT,
|
||||||
|
CONF_REBOOT_TIMEOUT,
|
||||||
|
CONF_SERVICE,
|
||||||
|
CONF_VARIABLES,
|
||||||
|
CONF_SERVICES,
|
||||||
|
CONF_TRIGGER_ID,
|
||||||
|
CONF_EVENT,
|
||||||
|
CONF_TAG,
|
||||||
|
)
|
||||||
from esphome.core import coroutine_with_priority
|
from esphome.core import coroutine_with_priority
|
||||||
|
|
||||||
DEPENDENCIES = ['network']
|
DEPENDENCIES = ["network"]
|
||||||
AUTO_LOAD = ['async_tcp']
|
AUTO_LOAD = ["async_tcp"]
|
||||||
CODEOWNERS = ['@OttoWinter']
|
CODEOWNERS = ["@OttoWinter"]
|
||||||
|
|
||||||
api_ns = cg.esphome_ns.namespace('api')
|
api_ns = cg.esphome_ns.namespace("api")
|
||||||
APIServer = api_ns.class_('APIServer', cg.Component, cg.Controller)
|
APIServer = api_ns.class_("APIServer", cg.Component, cg.Controller)
|
||||||
HomeAssistantServiceCallAction = api_ns.class_('HomeAssistantServiceCallAction', automation.Action)
|
HomeAssistantServiceCallAction = api_ns.class_(
|
||||||
APIConnectedCondition = api_ns.class_('APIConnectedCondition', Condition)
|
"HomeAssistantServiceCallAction", automation.Action
|
||||||
|
)
|
||||||
|
APIConnectedCondition = api_ns.class_("APIConnectedCondition", Condition)
|
||||||
|
|
||||||
UserServiceTrigger = api_ns.class_('UserServiceTrigger', automation.Trigger)
|
UserServiceTrigger = api_ns.class_("UserServiceTrigger", automation.Trigger)
|
||||||
ListEntitiesServicesArgument = api_ns.class_('ListEntitiesServicesArgument')
|
ListEntitiesServicesArgument = api_ns.class_("ListEntitiesServicesArgument")
|
||||||
SERVICE_ARG_NATIVE_TYPES = {
|
SERVICE_ARG_NATIVE_TYPES = {
|
||||||
'bool': bool,
|
"bool": bool,
|
||||||
'int': cg.int32,
|
"int": cg.int32,
|
||||||
'float': float,
|
"float": float,
|
||||||
'string': cg.std_string,
|
"string": cg.std_string,
|
||||||
'bool[]': cg.std_vector.template(bool),
|
"bool[]": cg.std_vector.template(bool),
|
||||||
'int[]': cg.std_vector.template(cg.int32),
|
"int[]": cg.std_vector.template(cg.int32),
|
||||||
'float[]': cg.std_vector.template(float),
|
"float[]": cg.std_vector.template(float),
|
||||||
'string[]': cg.std_vector.template(cg.std_string),
|
"string[]": cg.std_vector.template(cg.std_string),
|
||||||
}
|
}
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.Schema({
|
CONFIG_SCHEMA = cv.Schema(
|
||||||
cv.GenerateID(): cv.declare_id(APIServer),
|
{
|
||||||
cv.Optional(CONF_PORT, default=6053): cv.port,
|
cv.GenerateID(): cv.declare_id(APIServer),
|
||||||
cv.Optional(CONF_PASSWORD, default=''): cv.string_strict,
|
cv.Optional(CONF_PORT, default=6053): cv.port,
|
||||||
cv.Optional(CONF_REBOOT_TIMEOUT, default='15min'): cv.positive_time_period_milliseconds,
|
cv.Optional(CONF_PASSWORD, default=""): cv.string_strict,
|
||||||
cv.Optional(CONF_SERVICES): automation.validate_automation({
|
cv.Optional(
|
||||||
cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(UserServiceTrigger),
|
CONF_REBOOT_TIMEOUT, default="15min"
|
||||||
cv.Required(CONF_SERVICE): cv.valid_name,
|
): cv.positive_time_period_milliseconds,
|
||||||
cv.Optional(CONF_VARIABLES, default={}): cv.Schema({
|
cv.Optional(CONF_SERVICES): automation.validate_automation(
|
||||||
cv.validate_id_name: cv.one_of(*SERVICE_ARG_NATIVE_TYPES, lower=True),
|
{
|
||||||
}),
|
cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(UserServiceTrigger),
|
||||||
}),
|
cv.Required(CONF_SERVICE): cv.valid_name,
|
||||||
}).extend(cv.COMPONENT_SCHEMA)
|
cv.Optional(CONF_VARIABLES, default={}): cv.Schema(
|
||||||
|
{
|
||||||
|
cv.validate_id_name: cv.one_of(
|
||||||
|
*SERVICE_ARG_NATIVE_TYPES, lower=True
|
||||||
|
),
|
||||||
|
}
|
||||||
|
),
|
||||||
|
}
|
||||||
|
),
|
||||||
|
}
|
||||||
|
).extend(cv.COMPONENT_SCHEMA)
|
||||||
|
|
||||||
|
|
||||||
@coroutine_with_priority(40.0)
|
@coroutine_with_priority(40.0)
|
||||||
@@ -63,28 +86,36 @@ def to_code(config):
|
|||||||
func_args.append((native, name))
|
func_args.append((native, name))
|
||||||
service_arg_names.append(name)
|
service_arg_names.append(name)
|
||||||
templ = cg.TemplateArguments(*template_args)
|
templ = cg.TemplateArguments(*template_args)
|
||||||
trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], templ,
|
trigger = cg.new_Pvariable(
|
||||||
conf[CONF_SERVICE], service_arg_names)
|
conf[CONF_TRIGGER_ID], templ, conf[CONF_SERVICE], service_arg_names
|
||||||
|
)
|
||||||
cg.add(var.register_user_service(trigger))
|
cg.add(var.register_user_service(trigger))
|
||||||
yield automation.build_automation(trigger, func_args, conf)
|
yield automation.build_automation(trigger, func_args, conf)
|
||||||
|
|
||||||
cg.add_define('USE_API')
|
cg.add_define("USE_API")
|
||||||
cg.add_global(api_ns.using)
|
cg.add_global(api_ns.using)
|
||||||
|
|
||||||
|
|
||||||
KEY_VALUE_SCHEMA = cv.Schema({cv.string: cv.templatable(cv.string_strict)})
|
KEY_VALUE_SCHEMA = cv.Schema({cv.string: cv.templatable(cv.string_strict)})
|
||||||
|
|
||||||
HOMEASSISTANT_SERVICE_ACTION_SCHEMA = cv.Schema({
|
HOMEASSISTANT_SERVICE_ACTION_SCHEMA = cv.Schema(
|
||||||
cv.GenerateID(): cv.use_id(APIServer),
|
{
|
||||||
cv.Required(CONF_SERVICE): cv.templatable(cv.string),
|
cv.GenerateID(): cv.use_id(APIServer),
|
||||||
cv.Optional(CONF_DATA, default={}): KEY_VALUE_SCHEMA,
|
cv.Required(CONF_SERVICE): cv.templatable(cv.string),
|
||||||
cv.Optional(CONF_DATA_TEMPLATE, default={}): KEY_VALUE_SCHEMA,
|
cv.Optional(CONF_DATA, default={}): KEY_VALUE_SCHEMA,
|
||||||
cv.Optional(CONF_VARIABLES, default={}): cv.Schema({cv.string: cv.returning_lambda}),
|
cv.Optional(CONF_DATA_TEMPLATE, default={}): KEY_VALUE_SCHEMA,
|
||||||
})
|
cv.Optional(CONF_VARIABLES, default={}): cv.Schema(
|
||||||
|
{cv.string: cv.returning_lambda}
|
||||||
|
),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@automation.register_action('homeassistant.service', HomeAssistantServiceCallAction,
|
@automation.register_action(
|
||||||
HOMEASSISTANT_SERVICE_ACTION_SCHEMA)
|
"homeassistant.service",
|
||||||
|
HomeAssistantServiceCallAction,
|
||||||
|
HOMEASSISTANT_SERVICE_ACTION_SCHEMA,
|
||||||
|
)
|
||||||
def homeassistant_service_to_code(config, action_id, template_arg, args):
|
def homeassistant_service_to_code(config, action_id, template_arg, args):
|
||||||
serv = yield cg.get_variable(config[CONF_ID])
|
serv = yield cg.get_variable(config[CONF_ID])
|
||||||
var = cg.new_Pvariable(action_id, template_arg, serv, False)
|
var = cg.new_Pvariable(action_id, template_arg, serv, False)
|
||||||
@@ -104,23 +135,30 @@ def homeassistant_service_to_code(config, action_id, template_arg, args):
|
|||||||
|
|
||||||
def validate_homeassistant_event(value):
|
def validate_homeassistant_event(value):
|
||||||
value = cv.string(value)
|
value = cv.string(value)
|
||||||
if not value.startswith('esphome.'):
|
if not value.startswith("esphome."):
|
||||||
raise cv.Invalid("ESPHome can only generate Home Assistant events that begin with "
|
raise cv.Invalid(
|
||||||
"esphome. For example 'esphome.xyz'")
|
"ESPHome can only generate Home Assistant events that begin with "
|
||||||
|
"esphome. For example 'esphome.xyz'"
|
||||||
|
)
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
HOMEASSISTANT_EVENT_ACTION_SCHEMA = cv.Schema({
|
HOMEASSISTANT_EVENT_ACTION_SCHEMA = cv.Schema(
|
||||||
cv.GenerateID(): cv.use_id(APIServer),
|
{
|
||||||
cv.Required(CONF_EVENT): validate_homeassistant_event,
|
cv.GenerateID(): cv.use_id(APIServer),
|
||||||
cv.Optional(CONF_DATA, default={}): KEY_VALUE_SCHEMA,
|
cv.Required(CONF_EVENT): validate_homeassistant_event,
|
||||||
cv.Optional(CONF_DATA_TEMPLATE, default={}): KEY_VALUE_SCHEMA,
|
cv.Optional(CONF_DATA, default={}): KEY_VALUE_SCHEMA,
|
||||||
cv.Optional(CONF_VARIABLES, default={}): KEY_VALUE_SCHEMA,
|
cv.Optional(CONF_DATA_TEMPLATE, default={}): KEY_VALUE_SCHEMA,
|
||||||
})
|
cv.Optional(CONF_VARIABLES, default={}): KEY_VALUE_SCHEMA,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@automation.register_action('homeassistant.event', HomeAssistantServiceCallAction,
|
@automation.register_action(
|
||||||
HOMEASSISTANT_EVENT_ACTION_SCHEMA)
|
"homeassistant.event",
|
||||||
|
HomeAssistantServiceCallAction,
|
||||||
|
HOMEASSISTANT_EVENT_ACTION_SCHEMA,
|
||||||
|
)
|
||||||
def homeassistant_event_to_code(config, action_id, template_arg, args):
|
def homeassistant_event_to_code(config, action_id, template_arg, args):
|
||||||
serv = yield cg.get_variable(config[CONF_ID])
|
serv = yield cg.get_variable(config[CONF_ID])
|
||||||
var = cg.new_Pvariable(action_id, template_arg, serv, True)
|
var = cg.new_Pvariable(action_id, template_arg, serv, True)
|
||||||
@@ -138,23 +176,29 @@ def homeassistant_event_to_code(config, action_id, template_arg, args):
|
|||||||
yield var
|
yield var
|
||||||
|
|
||||||
|
|
||||||
HOMEASSISTANT_TAG_SCANNED_ACTION_SCHEMA = cv.maybe_simple_value({
|
HOMEASSISTANT_TAG_SCANNED_ACTION_SCHEMA = cv.maybe_simple_value(
|
||||||
cv.GenerateID(): cv.use_id(APIServer),
|
{
|
||||||
cv.Required(CONF_TAG): cv.templatable(cv.string_strict),
|
cv.GenerateID(): cv.use_id(APIServer),
|
||||||
}, key=CONF_TAG)
|
cv.Required(CONF_TAG): cv.templatable(cv.string_strict),
|
||||||
|
},
|
||||||
|
key=CONF_TAG,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@automation.register_action('homeassistant.tag_scanned', HomeAssistantServiceCallAction,
|
@automation.register_action(
|
||||||
HOMEASSISTANT_TAG_SCANNED_ACTION_SCHEMA)
|
"homeassistant.tag_scanned",
|
||||||
|
HomeAssistantServiceCallAction,
|
||||||
|
HOMEASSISTANT_TAG_SCANNED_ACTION_SCHEMA,
|
||||||
|
)
|
||||||
def homeassistant_tag_scanned_to_code(config, action_id, template_arg, args):
|
def homeassistant_tag_scanned_to_code(config, action_id, template_arg, args):
|
||||||
serv = yield cg.get_variable(config[CONF_ID])
|
serv = yield cg.get_variable(config[CONF_ID])
|
||||||
var = cg.new_Pvariable(action_id, template_arg, serv, True)
|
var = cg.new_Pvariable(action_id, template_arg, serv, True)
|
||||||
cg.add(var.set_service('esphome.tag_scanned'))
|
cg.add(var.set_service("esphome.tag_scanned"))
|
||||||
templ = yield cg.templatable(config[CONF_TAG], args, cg.std_string)
|
templ = yield cg.templatable(config[CONF_TAG], args, cg.std_string)
|
||||||
cg.add(var.add_data('tag_id', templ))
|
cg.add(var.add_data("tag_id", templ))
|
||||||
yield var
|
yield var
|
||||||
|
|
||||||
|
|
||||||
@automation.register_condition('api.connected', APIConnectedCondition, {})
|
@automation.register_condition("api.connected", APIConnectedCondition, {})
|
||||||
def api_connected_to_code(config, condition_id, template_arg, args):
|
def api_connected_to_code(config, condition_id, template_arg, args):
|
||||||
yield cg.new_Pvariable(condition_id, template_arg)
|
yield cg.new_Pvariable(condition_id, template_arg)
|
||||||
|
|||||||
@@ -1,33 +1,43 @@
|
|||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome import pins
|
from esphome import pins
|
||||||
from esphome.const import CONF_INDOOR, CONF_WATCHDOG_THRESHOLD, \
|
from esphome.const import (
|
||||||
CONF_NOISE_LEVEL, CONF_SPIKE_REJECTION, CONF_LIGHTNING_THRESHOLD, \
|
CONF_INDOOR,
|
||||||
CONF_MASK_DISTURBER, CONF_DIV_RATIO, CONF_CAPACITANCE
|
CONF_WATCHDOG_THRESHOLD,
|
||||||
|
CONF_NOISE_LEVEL,
|
||||||
|
CONF_SPIKE_REJECTION,
|
||||||
|
CONF_LIGHTNING_THRESHOLD,
|
||||||
|
CONF_MASK_DISTURBER,
|
||||||
|
CONF_DIV_RATIO,
|
||||||
|
CONF_CAPACITANCE,
|
||||||
|
)
|
||||||
from esphome.core import coroutine
|
from esphome.core import coroutine
|
||||||
|
|
||||||
AUTO_LOAD = ['sensor', 'binary_sensor']
|
AUTO_LOAD = ["sensor", "binary_sensor"]
|
||||||
MULTI_CONF = True
|
MULTI_CONF = True
|
||||||
|
|
||||||
CONF_AS3935_ID = 'as3935_id'
|
CONF_AS3935_ID = "as3935_id"
|
||||||
|
|
||||||
as3935_ns = cg.esphome_ns.namespace('as3935')
|
as3935_ns = cg.esphome_ns.namespace("as3935")
|
||||||
AS3935 = as3935_ns.class_('AS3935Component', cg.Component)
|
AS3935 = as3935_ns.class_("AS3935Component", cg.Component)
|
||||||
|
|
||||||
CONF_IRQ_PIN = 'irq_pin'
|
CONF_IRQ_PIN = "irq_pin"
|
||||||
AS3935_SCHEMA = cv.Schema({
|
AS3935_SCHEMA = cv.Schema(
|
||||||
cv.GenerateID(): cv.declare_id(AS3935),
|
{
|
||||||
cv.Required(CONF_IRQ_PIN): pins.gpio_input_pin_schema,
|
cv.GenerateID(): cv.declare_id(AS3935),
|
||||||
|
cv.Required(CONF_IRQ_PIN): pins.gpio_input_pin_schema,
|
||||||
cv.Optional(CONF_INDOOR, default=True): cv.boolean,
|
cv.Optional(CONF_INDOOR, default=True): cv.boolean,
|
||||||
cv.Optional(CONF_NOISE_LEVEL, default=2): cv.int_range(min=1, max=7),
|
cv.Optional(CONF_NOISE_LEVEL, default=2): cv.int_range(min=1, max=7),
|
||||||
cv.Optional(CONF_WATCHDOG_THRESHOLD, default=2): cv.int_range(min=1, max=10),
|
cv.Optional(CONF_WATCHDOG_THRESHOLD, default=2): cv.int_range(min=1, max=10),
|
||||||
cv.Optional(CONF_SPIKE_REJECTION, default=2): cv.int_range(min=1, max=11),
|
cv.Optional(CONF_SPIKE_REJECTION, default=2): cv.int_range(min=1, max=11),
|
||||||
cv.Optional(CONF_LIGHTNING_THRESHOLD, default=1): cv.one_of(1, 5, 9, 16, int=True),
|
cv.Optional(CONF_LIGHTNING_THRESHOLD, default=1): cv.one_of(
|
||||||
cv.Optional(CONF_MASK_DISTURBER, default=False): cv.boolean,
|
1, 5, 9, 16, int=True
|
||||||
cv.Optional(CONF_DIV_RATIO, default=0): cv.one_of(0, 16, 32, 64, 128, int=True),
|
),
|
||||||
cv.Optional(CONF_CAPACITANCE, default=0): cv.int_range(min=0, max=15),
|
cv.Optional(CONF_MASK_DISTURBER, default=False): cv.boolean,
|
||||||
})
|
cv.Optional(CONF_DIV_RATIO, default=0): cv.one_of(0, 16, 32, 64, 128, int=True),
|
||||||
|
cv.Optional(CONF_CAPACITANCE, default=0): cv.int_range(min=0, max=15),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@coroutine
|
@coroutine
|
||||||
|
|||||||
@@ -3,11 +3,13 @@ import esphome.config_validation as cv
|
|||||||
from esphome.components import binary_sensor
|
from esphome.components import binary_sensor
|
||||||
from . import AS3935, CONF_AS3935_ID
|
from . import AS3935, CONF_AS3935_ID
|
||||||
|
|
||||||
DEPENDENCIES = ['as3935']
|
DEPENDENCIES = ["as3935"]
|
||||||
|
|
||||||
CONFIG_SCHEMA = binary_sensor.BINARY_SENSOR_SCHEMA.extend({
|
CONFIG_SCHEMA = binary_sensor.BINARY_SENSOR_SCHEMA.extend(
|
||||||
cv.GenerateID(CONF_AS3935_ID): cv.use_id(AS3935),
|
{
|
||||||
})
|
cv.GenerateID(CONF_AS3935_ID): cv.use_id(AS3935),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
@@ -1,19 +1,30 @@
|
|||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.components import sensor
|
from esphome.components import sensor
|
||||||
from esphome.const import CONF_DISTANCE, CONF_LIGHTNING_ENERGY, DEVICE_CLASS_EMPTY, \
|
from esphome.const import (
|
||||||
UNIT_KILOMETER, UNIT_EMPTY, ICON_SIGNAL_DISTANCE_VARIANT, ICON_FLASH
|
CONF_DISTANCE,
|
||||||
|
CONF_LIGHTNING_ENERGY,
|
||||||
|
DEVICE_CLASS_EMPTY,
|
||||||
|
UNIT_KILOMETER,
|
||||||
|
UNIT_EMPTY,
|
||||||
|
ICON_SIGNAL_DISTANCE_VARIANT,
|
||||||
|
ICON_FLASH,
|
||||||
|
)
|
||||||
from . import AS3935, CONF_AS3935_ID
|
from . import AS3935, CONF_AS3935_ID
|
||||||
|
|
||||||
DEPENDENCIES = ['as3935']
|
DEPENDENCIES = ["as3935"]
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.Schema({
|
CONFIG_SCHEMA = cv.Schema(
|
||||||
cv.GenerateID(CONF_AS3935_ID): cv.use_id(AS3935),
|
{
|
||||||
cv.Optional(CONF_DISTANCE):
|
cv.GenerateID(CONF_AS3935_ID): cv.use_id(AS3935),
|
||||||
sensor.sensor_schema(UNIT_KILOMETER, ICON_SIGNAL_DISTANCE_VARIANT, 1, DEVICE_CLASS_EMPTY),
|
cv.Optional(CONF_DISTANCE): sensor.sensor_schema(
|
||||||
cv.Optional(CONF_LIGHTNING_ENERGY):
|
UNIT_KILOMETER, ICON_SIGNAL_DISTANCE_VARIANT, 1, DEVICE_CLASS_EMPTY
|
||||||
sensor.sensor_schema(UNIT_EMPTY, ICON_FLASH, 1, DEVICE_CLASS_EMPTY),
|
),
|
||||||
}).extend(cv.COMPONENT_SCHEMA)
|
cv.Optional(CONF_LIGHTNING_ENERGY): sensor.sensor_schema(
|
||||||
|
UNIT_EMPTY, ICON_FLASH, 1, DEVICE_CLASS_EMPTY
|
||||||
|
),
|
||||||
|
}
|
||||||
|
).extend(cv.COMPONENT_SCHEMA)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
@@ -3,15 +3,21 @@ import esphome.config_validation as cv
|
|||||||
from esphome.components import as3935, i2c
|
from esphome.components import as3935, i2c
|
||||||
from esphome.const import CONF_ID
|
from esphome.const import CONF_ID
|
||||||
|
|
||||||
AUTO_LOAD = ['as3935']
|
AUTO_LOAD = ["as3935"]
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ["i2c"]
|
||||||
|
|
||||||
as3935_i2c_ns = cg.esphome_ns.namespace('as3935_i2c')
|
as3935_i2c_ns = cg.esphome_ns.namespace("as3935_i2c")
|
||||||
I2CAS3935 = as3935_i2c_ns.class_('I2CAS3935Component', as3935.AS3935, i2c.I2CDevice)
|
I2CAS3935 = as3935_i2c_ns.class_("I2CAS3935Component", as3935.AS3935, i2c.I2CDevice)
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.All(as3935.AS3935_SCHEMA.extend({
|
CONFIG_SCHEMA = cv.All(
|
||||||
cv.GenerateID(): cv.declare_id(I2CAS3935),
|
as3935.AS3935_SCHEMA.extend(
|
||||||
}).extend(cv.COMPONENT_SCHEMA).extend(i2c.i2c_device_schema(0x03)))
|
{
|
||||||
|
cv.GenerateID(): cv.declare_id(I2CAS3935),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.extend(cv.COMPONENT_SCHEMA)
|
||||||
|
.extend(i2c.i2c_device_schema(0x03))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
@@ -3,15 +3,21 @@ import esphome.config_validation as cv
|
|||||||
from esphome.components import as3935, spi
|
from esphome.components import as3935, spi
|
||||||
from esphome.const import CONF_ID
|
from esphome.const import CONF_ID
|
||||||
|
|
||||||
AUTO_LOAD = ['as3935']
|
AUTO_LOAD = ["as3935"]
|
||||||
DEPENDENCIES = ['spi']
|
DEPENDENCIES = ["spi"]
|
||||||
|
|
||||||
as3935_spi_ns = cg.esphome_ns.namespace('as3935_spi')
|
as3935_spi_ns = cg.esphome_ns.namespace("as3935_spi")
|
||||||
SPIAS3935 = as3935_spi_ns.class_('SPIAS3935Component', as3935.AS3935, spi.SPIDevice)
|
SPIAS3935 = as3935_spi_ns.class_("SPIAS3935Component", as3935.AS3935, spi.SPIDevice)
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.All(as3935.AS3935_SCHEMA.extend({
|
CONFIG_SCHEMA = cv.All(
|
||||||
cv.GenerateID(): cv.declare_id(SPIAS3935),
|
as3935.AS3935_SCHEMA.extend(
|
||||||
}).extend(cv.COMPONENT_SCHEMA).extend(spi.spi_device_schema(cs_pin_required=True)))
|
{
|
||||||
|
cv.GenerateID(): cv.declare_id(SPIAS3935),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.extend(cv.COMPONENT_SCHEMA)
|
||||||
|
.extend(spi.spi_device_schema(cs_pin_required=True))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
@@ -2,14 +2,14 @@
|
|||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
from esphome.core import CORE, coroutine_with_priority
|
from esphome.core import CORE, coroutine_with_priority
|
||||||
|
|
||||||
CODEOWNERS = ['@OttoWinter']
|
CODEOWNERS = ["@OttoWinter"]
|
||||||
|
|
||||||
|
|
||||||
@coroutine_with_priority(200.0)
|
@coroutine_with_priority(200.0)
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
if CORE.is_esp32:
|
if CORE.is_esp32:
|
||||||
# https://github.com/OttoWinter/AsyncTCP/blob/master/library.json
|
# https://github.com/OttoWinter/AsyncTCP/blob/master/library.json
|
||||||
cg.add_library('AsyncTCP-esphome', '1.1.1')
|
cg.add_library("AsyncTCP-esphome", "1.1.1")
|
||||||
elif CORE.is_esp8266:
|
elif CORE.is_esp8266:
|
||||||
# https://github.com/OttoWinter/ESPAsyncTCP
|
# https://github.com/OttoWinter/ESPAsyncTCP
|
||||||
cg.add_library('ESPAsyncTCP-esphome', '1.2.3')
|
cg.add_library("ESPAsyncTCP-esphome", "1.2.3")
|
||||||
|
|||||||
@@ -1,32 +1,54 @@
|
|||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.components import sensor, esp32_ble_tracker
|
from esphome.components import sensor, esp32_ble_tracker
|
||||||
from esphome.const import CONF_BATTERY_LEVEL, CONF_BATTERY_VOLTAGE, CONF_MAC_ADDRESS, \
|
from esphome.const import (
|
||||||
CONF_HUMIDITY, CONF_TEMPERATURE, CONF_ID, DEVICE_CLASS_BATTERY, DEVICE_CLASS_HUMIDITY, \
|
CONF_BATTERY_LEVEL,
|
||||||
DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_VOLTAGE, ICON_EMPTY, UNIT_CELSIUS, UNIT_PERCENT, \
|
CONF_BATTERY_VOLTAGE,
|
||||||
UNIT_VOLT
|
CONF_MAC_ADDRESS,
|
||||||
|
CONF_HUMIDITY,
|
||||||
|
CONF_TEMPERATURE,
|
||||||
|
CONF_ID,
|
||||||
|
DEVICE_CLASS_BATTERY,
|
||||||
|
DEVICE_CLASS_HUMIDITY,
|
||||||
|
DEVICE_CLASS_TEMPERATURE,
|
||||||
|
DEVICE_CLASS_VOLTAGE,
|
||||||
|
ICON_EMPTY,
|
||||||
|
UNIT_CELSIUS,
|
||||||
|
UNIT_PERCENT,
|
||||||
|
UNIT_VOLT,
|
||||||
|
)
|
||||||
|
|
||||||
CODEOWNERS = ['@ahpohl']
|
CODEOWNERS = ["@ahpohl"]
|
||||||
|
|
||||||
DEPENDENCIES = ['esp32_ble_tracker']
|
DEPENDENCIES = ["esp32_ble_tracker"]
|
||||||
|
|
||||||
atc_mithermometer_ns = cg.esphome_ns.namespace('atc_mithermometer')
|
atc_mithermometer_ns = cg.esphome_ns.namespace("atc_mithermometer")
|
||||||
ATCMiThermometer = atc_mithermometer_ns.class_('ATCMiThermometer',
|
ATCMiThermometer = atc_mithermometer_ns.class_(
|
||||||
esp32_ble_tracker.ESPBTDeviceListener,
|
"ATCMiThermometer", esp32_ble_tracker.ESPBTDeviceListener, cg.Component
|
||||||
cg.Component)
|
)
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.Schema({
|
CONFIG_SCHEMA = (
|
||||||
cv.GenerateID(): cv.declare_id(ATCMiThermometer),
|
cv.Schema(
|
||||||
cv.Required(CONF_MAC_ADDRESS): cv.mac_address,
|
{
|
||||||
cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema(UNIT_CELSIUS, ICON_EMPTY, 1,
|
cv.GenerateID(): cv.declare_id(ATCMiThermometer),
|
||||||
DEVICE_CLASS_TEMPERATURE),
|
cv.Required(CONF_MAC_ADDRESS): cv.mac_address,
|
||||||
cv.Optional(CONF_HUMIDITY): sensor.sensor_schema(UNIT_PERCENT, ICON_EMPTY, 0,
|
cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema(
|
||||||
DEVICE_CLASS_HUMIDITY),
|
UNIT_CELSIUS, ICON_EMPTY, 1, DEVICE_CLASS_TEMPERATURE
|
||||||
cv.Optional(CONF_BATTERY_LEVEL): sensor.sensor_schema(UNIT_PERCENT, ICON_EMPTY, 0,
|
),
|
||||||
DEVICE_CLASS_BATTERY),
|
cv.Optional(CONF_HUMIDITY): sensor.sensor_schema(
|
||||||
cv.Optional(CONF_BATTERY_VOLTAGE): sensor.sensor_schema(UNIT_VOLT, ICON_EMPTY, 3,
|
UNIT_PERCENT, ICON_EMPTY, 0, DEVICE_CLASS_HUMIDITY
|
||||||
DEVICE_CLASS_VOLTAGE),
|
),
|
||||||
}).extend(esp32_ble_tracker.ESP_BLE_DEVICE_SCHEMA).extend(cv.COMPONENT_SCHEMA)
|
cv.Optional(CONF_BATTERY_LEVEL): sensor.sensor_schema(
|
||||||
|
UNIT_PERCENT, ICON_EMPTY, 0, DEVICE_CLASS_BATTERY
|
||||||
|
),
|
||||||
|
cv.Optional(CONF_BATTERY_VOLTAGE): sensor.sensor_schema(
|
||||||
|
UNIT_VOLT, ICON_EMPTY, 3, DEVICE_CLASS_VOLTAGE
|
||||||
|
),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.extend(esp32_ble_tracker.ESP_BLE_DEVICE_SCHEMA)
|
||||||
|
.extend(cv.COMPONENT_SCHEMA)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
@@ -1,66 +1,106 @@
|
|||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.components import sensor, spi
|
from esphome.components import sensor, spi
|
||||||
from esphome.const import \
|
from esphome.const import (
|
||||||
CONF_ID, CONF_VOLTAGE, CONF_CURRENT, CONF_POWER, CONF_POWER_FACTOR, CONF_FREQUENCY, \
|
CONF_ID,
|
||||||
DEVICE_CLASS_CURRENT, DEVICE_CLASS_EMPTY, DEVICE_CLASS_POWER, DEVICE_CLASS_POWER_FACTOR, \
|
CONF_VOLTAGE,
|
||||||
DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_VOLTAGE, ICON_EMPTY, ICON_LIGHTBULB, ICON_CURRENT_AC, \
|
CONF_CURRENT,
|
||||||
UNIT_HERTZ, UNIT_VOLT, UNIT_AMPERE, UNIT_WATT, UNIT_EMPTY, UNIT_CELSIUS, UNIT_VOLT_AMPS_REACTIVE
|
CONF_POWER,
|
||||||
|
CONF_POWER_FACTOR,
|
||||||
|
CONF_FREQUENCY,
|
||||||
|
DEVICE_CLASS_CURRENT,
|
||||||
|
DEVICE_CLASS_EMPTY,
|
||||||
|
DEVICE_CLASS_POWER,
|
||||||
|
DEVICE_CLASS_POWER_FACTOR,
|
||||||
|
DEVICE_CLASS_TEMPERATURE,
|
||||||
|
DEVICE_CLASS_VOLTAGE,
|
||||||
|
ICON_EMPTY,
|
||||||
|
ICON_LIGHTBULB,
|
||||||
|
ICON_CURRENT_AC,
|
||||||
|
UNIT_HERTZ,
|
||||||
|
UNIT_VOLT,
|
||||||
|
UNIT_AMPERE,
|
||||||
|
UNIT_WATT,
|
||||||
|
UNIT_EMPTY,
|
||||||
|
UNIT_CELSIUS,
|
||||||
|
UNIT_VOLT_AMPS_REACTIVE,
|
||||||
|
)
|
||||||
|
|
||||||
CONF_PHASE_A = 'phase_a'
|
CONF_PHASE_A = "phase_a"
|
||||||
CONF_PHASE_B = 'phase_b'
|
CONF_PHASE_B = "phase_b"
|
||||||
CONF_PHASE_C = 'phase_c'
|
CONF_PHASE_C = "phase_c"
|
||||||
|
|
||||||
CONF_REACTIVE_POWER = 'reactive_power'
|
CONF_REACTIVE_POWER = "reactive_power"
|
||||||
CONF_LINE_FREQUENCY = 'line_frequency'
|
CONF_LINE_FREQUENCY = "line_frequency"
|
||||||
CONF_CHIP_TEMPERATURE = 'chip_temperature'
|
CONF_CHIP_TEMPERATURE = "chip_temperature"
|
||||||
CONF_GAIN_PGA = 'gain_pga'
|
CONF_GAIN_PGA = "gain_pga"
|
||||||
CONF_CURRENT_PHASES = 'current_phases'
|
CONF_CURRENT_PHASES = "current_phases"
|
||||||
CONF_GAIN_VOLTAGE = 'gain_voltage'
|
CONF_GAIN_VOLTAGE = "gain_voltage"
|
||||||
CONF_GAIN_CT = 'gain_ct'
|
CONF_GAIN_CT = "gain_ct"
|
||||||
LINE_FREQS = {
|
LINE_FREQS = {
|
||||||
'50HZ': 50,
|
"50HZ": 50,
|
||||||
'60HZ': 60,
|
"60HZ": 60,
|
||||||
}
|
}
|
||||||
CURRENT_PHASES = {
|
CURRENT_PHASES = {
|
||||||
'2': 2,
|
"2": 2,
|
||||||
'3': 3,
|
"3": 3,
|
||||||
}
|
}
|
||||||
PGA_GAINS = {
|
PGA_GAINS = {
|
||||||
'1X': 0x0,
|
"1X": 0x0,
|
||||||
'2X': 0x15,
|
"2X": 0x15,
|
||||||
'4X': 0x2A,
|
"4X": 0x2A,
|
||||||
}
|
}
|
||||||
|
|
||||||
atm90e32_ns = cg.esphome_ns.namespace('atm90e32')
|
atm90e32_ns = cg.esphome_ns.namespace("atm90e32")
|
||||||
ATM90E32Component = atm90e32_ns.class_('ATM90E32Component', cg.PollingComponent, spi.SPIDevice)
|
ATM90E32Component = atm90e32_ns.class_(
|
||||||
|
"ATM90E32Component", cg.PollingComponent, spi.SPIDevice
|
||||||
|
)
|
||||||
|
|
||||||
ATM90E32_PHASE_SCHEMA = cv.Schema({
|
ATM90E32_PHASE_SCHEMA = cv.Schema(
|
||||||
cv.Optional(CONF_VOLTAGE): sensor.sensor_schema(UNIT_VOLT, ICON_EMPTY, 2, DEVICE_CLASS_VOLTAGE),
|
{
|
||||||
cv.Optional(CONF_CURRENT): sensor.sensor_schema(UNIT_AMPERE, ICON_EMPTY, 2,
|
cv.Optional(CONF_VOLTAGE): sensor.sensor_schema(
|
||||||
DEVICE_CLASS_CURRENT),
|
UNIT_VOLT, ICON_EMPTY, 2, DEVICE_CLASS_VOLTAGE
|
||||||
cv.Optional(CONF_POWER): sensor.sensor_schema(UNIT_WATT, ICON_EMPTY, 2, DEVICE_CLASS_POWER),
|
),
|
||||||
cv.Optional(CONF_REACTIVE_POWER): sensor.sensor_schema(UNIT_VOLT_AMPS_REACTIVE,
|
cv.Optional(CONF_CURRENT): sensor.sensor_schema(
|
||||||
ICON_LIGHTBULB, 2, DEVICE_CLASS_EMPTY),
|
UNIT_AMPERE, ICON_EMPTY, 2, DEVICE_CLASS_CURRENT
|
||||||
cv.Optional(CONF_POWER_FACTOR): sensor.sensor_schema(UNIT_EMPTY, ICON_EMPTY, 2,
|
),
|
||||||
DEVICE_CLASS_POWER_FACTOR),
|
cv.Optional(CONF_POWER): sensor.sensor_schema(
|
||||||
cv.Optional(CONF_GAIN_VOLTAGE, default=7305): cv.uint16_t,
|
UNIT_WATT, ICON_EMPTY, 2, DEVICE_CLASS_POWER
|
||||||
cv.Optional(CONF_GAIN_CT, default=27961): cv.uint16_t,
|
),
|
||||||
})
|
cv.Optional(CONF_REACTIVE_POWER): sensor.sensor_schema(
|
||||||
|
UNIT_VOLT_AMPS_REACTIVE, ICON_LIGHTBULB, 2, DEVICE_CLASS_EMPTY
|
||||||
|
),
|
||||||
|
cv.Optional(CONF_POWER_FACTOR): sensor.sensor_schema(
|
||||||
|
UNIT_EMPTY, ICON_EMPTY, 2, DEVICE_CLASS_POWER_FACTOR
|
||||||
|
),
|
||||||
|
cv.Optional(CONF_GAIN_VOLTAGE, default=7305): cv.uint16_t,
|
||||||
|
cv.Optional(CONF_GAIN_CT, default=27961): cv.uint16_t,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.Schema({
|
CONFIG_SCHEMA = (
|
||||||
cv.GenerateID(): cv.declare_id(ATM90E32Component),
|
cv.Schema(
|
||||||
cv.Optional(CONF_PHASE_A): ATM90E32_PHASE_SCHEMA,
|
{
|
||||||
cv.Optional(CONF_PHASE_B): ATM90E32_PHASE_SCHEMA,
|
cv.GenerateID(): cv.declare_id(ATM90E32Component),
|
||||||
cv.Optional(CONF_PHASE_C): ATM90E32_PHASE_SCHEMA,
|
cv.Optional(CONF_PHASE_A): ATM90E32_PHASE_SCHEMA,
|
||||||
cv.Optional(CONF_FREQUENCY): sensor.sensor_schema(UNIT_HERTZ, ICON_CURRENT_AC, 1,
|
cv.Optional(CONF_PHASE_B): ATM90E32_PHASE_SCHEMA,
|
||||||
DEVICE_CLASS_EMPTY),
|
cv.Optional(CONF_PHASE_C): ATM90E32_PHASE_SCHEMA,
|
||||||
cv.Optional(CONF_CHIP_TEMPERATURE): sensor.sensor_schema(UNIT_CELSIUS, ICON_EMPTY, 1,
|
cv.Optional(CONF_FREQUENCY): sensor.sensor_schema(
|
||||||
DEVICE_CLASS_TEMPERATURE),
|
UNIT_HERTZ, ICON_CURRENT_AC, 1, DEVICE_CLASS_EMPTY
|
||||||
cv.Required(CONF_LINE_FREQUENCY): cv.enum(LINE_FREQS, upper=True),
|
),
|
||||||
cv.Optional(CONF_CURRENT_PHASES, default='3'): cv.enum(CURRENT_PHASES, upper=True),
|
cv.Optional(CONF_CHIP_TEMPERATURE): sensor.sensor_schema(
|
||||||
cv.Optional(CONF_GAIN_PGA, default='2X'): cv.enum(PGA_GAINS, upper=True),
|
UNIT_CELSIUS, ICON_EMPTY, 1, DEVICE_CLASS_TEMPERATURE
|
||||||
}).extend(cv.polling_component_schema('60s')).extend(spi.spi_device_schema())
|
),
|
||||||
|
cv.Required(CONF_LINE_FREQUENCY): cv.enum(LINE_FREQS, upper=True),
|
||||||
|
cv.Optional(CONF_CURRENT_PHASES, default="3"): cv.enum(
|
||||||
|
CURRENT_PHASES, upper=True
|
||||||
|
),
|
||||||
|
cv.Optional(CONF_GAIN_PGA, default="2X"): cv.enum(PGA_GAINS, upper=True),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.extend(cv.polling_component_schema("60s"))
|
||||||
|
.extend(spi.spi_device_schema())
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
CODEOWNERS = ['@OttoWinter']
|
CODEOWNERS = ["@OttoWinter"]
|
||||||
|
|||||||
@@ -2,27 +2,41 @@ import esphome.codegen as cg
|
|||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome import automation
|
from esphome import automation
|
||||||
from esphome.components import climate, sensor
|
from esphome.components import climate, sensor
|
||||||
from esphome.const import CONF_AWAY_CONFIG, CONF_COOL_ACTION, \
|
from esphome.const import (
|
||||||
CONF_DEFAULT_TARGET_TEMPERATURE_HIGH, CONF_DEFAULT_TARGET_TEMPERATURE_LOW, CONF_HEAT_ACTION, \
|
CONF_AWAY_CONFIG,
|
||||||
CONF_ID, CONF_IDLE_ACTION, CONF_SENSOR
|
CONF_COOL_ACTION,
|
||||||
|
CONF_DEFAULT_TARGET_TEMPERATURE_HIGH,
|
||||||
|
CONF_DEFAULT_TARGET_TEMPERATURE_LOW,
|
||||||
|
CONF_HEAT_ACTION,
|
||||||
|
CONF_ID,
|
||||||
|
CONF_IDLE_ACTION,
|
||||||
|
CONF_SENSOR,
|
||||||
|
)
|
||||||
|
|
||||||
bang_bang_ns = cg.esphome_ns.namespace('bang_bang')
|
bang_bang_ns = cg.esphome_ns.namespace("bang_bang")
|
||||||
BangBangClimate = bang_bang_ns.class_('BangBangClimate', climate.Climate, cg.Component)
|
BangBangClimate = bang_bang_ns.class_("BangBangClimate", climate.Climate, cg.Component)
|
||||||
BangBangClimateTargetTempConfig = bang_bang_ns.struct('BangBangClimateTargetTempConfig')
|
BangBangClimateTargetTempConfig = bang_bang_ns.struct("BangBangClimateTargetTempConfig")
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.All(climate.CLIMATE_SCHEMA.extend({
|
CONFIG_SCHEMA = cv.All(
|
||||||
cv.GenerateID(): cv.declare_id(BangBangClimate),
|
climate.CLIMATE_SCHEMA.extend(
|
||||||
cv.Required(CONF_SENSOR): cv.use_id(sensor.Sensor),
|
{
|
||||||
cv.Required(CONF_DEFAULT_TARGET_TEMPERATURE_LOW): cv.temperature,
|
cv.GenerateID(): cv.declare_id(BangBangClimate),
|
||||||
cv.Required(CONF_DEFAULT_TARGET_TEMPERATURE_HIGH): cv.temperature,
|
cv.Required(CONF_SENSOR): cv.use_id(sensor.Sensor),
|
||||||
cv.Required(CONF_IDLE_ACTION): automation.validate_automation(single=True),
|
cv.Required(CONF_DEFAULT_TARGET_TEMPERATURE_LOW): cv.temperature,
|
||||||
cv.Optional(CONF_COOL_ACTION): automation.validate_automation(single=True),
|
cv.Required(CONF_DEFAULT_TARGET_TEMPERATURE_HIGH): cv.temperature,
|
||||||
cv.Optional(CONF_HEAT_ACTION): automation.validate_automation(single=True),
|
cv.Required(CONF_IDLE_ACTION): automation.validate_automation(single=True),
|
||||||
cv.Optional(CONF_AWAY_CONFIG): cv.Schema({
|
cv.Optional(CONF_COOL_ACTION): automation.validate_automation(single=True),
|
||||||
cv.Required(CONF_DEFAULT_TARGET_TEMPERATURE_LOW): cv.temperature,
|
cv.Optional(CONF_HEAT_ACTION): automation.validate_automation(single=True),
|
||||||
cv.Required(CONF_DEFAULT_TARGET_TEMPERATURE_HIGH): cv.temperature,
|
cv.Optional(CONF_AWAY_CONFIG): cv.Schema(
|
||||||
}),
|
{
|
||||||
}).extend(cv.COMPONENT_SCHEMA), cv.has_at_least_one_key(CONF_COOL_ACTION, CONF_HEAT_ACTION))
|
cv.Required(CONF_DEFAULT_TARGET_TEMPERATURE_LOW): cv.temperature,
|
||||||
|
cv.Required(CONF_DEFAULT_TARGET_TEMPERATURE_HIGH): cv.temperature,
|
||||||
|
}
|
||||||
|
),
|
||||||
|
}
|
||||||
|
).extend(cv.COMPONENT_SCHEMA),
|
||||||
|
cv.has_at_least_one_key(CONF_COOL_ACTION, CONF_HEAT_ACTION),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
@@ -35,23 +49,29 @@ def to_code(config):
|
|||||||
|
|
||||||
normal_config = BangBangClimateTargetTempConfig(
|
normal_config = BangBangClimateTargetTempConfig(
|
||||||
config[CONF_DEFAULT_TARGET_TEMPERATURE_LOW],
|
config[CONF_DEFAULT_TARGET_TEMPERATURE_LOW],
|
||||||
config[CONF_DEFAULT_TARGET_TEMPERATURE_HIGH]
|
config[CONF_DEFAULT_TARGET_TEMPERATURE_HIGH],
|
||||||
)
|
)
|
||||||
cg.add(var.set_normal_config(normal_config))
|
cg.add(var.set_normal_config(normal_config))
|
||||||
|
|
||||||
yield automation.build_automation(var.get_idle_trigger(), [], config[CONF_IDLE_ACTION])
|
yield automation.build_automation(
|
||||||
|
var.get_idle_trigger(), [], config[CONF_IDLE_ACTION]
|
||||||
|
)
|
||||||
|
|
||||||
if CONF_COOL_ACTION in config:
|
if CONF_COOL_ACTION in config:
|
||||||
yield automation.build_automation(var.get_cool_trigger(), [], config[CONF_COOL_ACTION])
|
yield automation.build_automation(
|
||||||
|
var.get_cool_trigger(), [], config[CONF_COOL_ACTION]
|
||||||
|
)
|
||||||
cg.add(var.set_supports_cool(True))
|
cg.add(var.set_supports_cool(True))
|
||||||
if CONF_HEAT_ACTION in config:
|
if CONF_HEAT_ACTION in config:
|
||||||
yield automation.build_automation(var.get_heat_trigger(), [], config[CONF_HEAT_ACTION])
|
yield automation.build_automation(
|
||||||
|
var.get_heat_trigger(), [], config[CONF_HEAT_ACTION]
|
||||||
|
)
|
||||||
cg.add(var.set_supports_heat(True))
|
cg.add(var.set_supports_heat(True))
|
||||||
|
|
||||||
if CONF_AWAY_CONFIG in config:
|
if CONF_AWAY_CONFIG in config:
|
||||||
away = config[CONF_AWAY_CONFIG]
|
away = config[CONF_AWAY_CONFIG]
|
||||||
away_config = BangBangClimateTargetTempConfig(
|
away_config = BangBangClimateTargetTempConfig(
|
||||||
away[CONF_DEFAULT_TARGET_TEMPERATURE_LOW],
|
away[CONF_DEFAULT_TARGET_TEMPERATURE_LOW],
|
||||||
away[CONF_DEFAULT_TARGET_TEMPERATURE_HIGH]
|
away[CONF_DEFAULT_TARGET_TEMPERATURE_HIGH],
|
||||||
)
|
)
|
||||||
cg.add(var.set_away_config(away_config))
|
cg.add(var.set_away_config(away_config))
|
||||||
|
|||||||
@@ -1,26 +1,45 @@
|
|||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.components import i2c, sensor
|
from esphome.components import i2c, sensor
|
||||||
from esphome.const import CONF_ID, CONF_RESOLUTION, DEVICE_CLASS_ILLUMINANCE, ICON_EMPTY, UNIT_LUX
|
from esphome.const import (
|
||||||
|
CONF_ID,
|
||||||
|
CONF_RESOLUTION,
|
||||||
|
DEVICE_CLASS_ILLUMINANCE,
|
||||||
|
ICON_EMPTY,
|
||||||
|
UNIT_LUX,
|
||||||
|
)
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ["i2c"]
|
||||||
|
|
||||||
bh1750_ns = cg.esphome_ns.namespace('bh1750')
|
bh1750_ns = cg.esphome_ns.namespace("bh1750")
|
||||||
BH1750Resolution = bh1750_ns.enum('BH1750Resolution')
|
BH1750Resolution = bh1750_ns.enum("BH1750Resolution")
|
||||||
BH1750_RESOLUTIONS = {
|
BH1750_RESOLUTIONS = {
|
||||||
4.0: BH1750Resolution.BH1750_RESOLUTION_4P0_LX,
|
4.0: BH1750Resolution.BH1750_RESOLUTION_4P0_LX,
|
||||||
1.0: BH1750Resolution.BH1750_RESOLUTION_1P0_LX,
|
1.0: BH1750Resolution.BH1750_RESOLUTION_1P0_LX,
|
||||||
0.5: BH1750Resolution.BH1750_RESOLUTION_0P5_LX,
|
0.5: BH1750Resolution.BH1750_RESOLUTION_0P5_LX,
|
||||||
}
|
}
|
||||||
|
|
||||||
BH1750Sensor = bh1750_ns.class_('BH1750Sensor', sensor.Sensor, cg.PollingComponent, i2c.I2CDevice)
|
BH1750Sensor = bh1750_ns.class_(
|
||||||
|
"BH1750Sensor", sensor.Sensor, cg.PollingComponent, i2c.I2CDevice
|
||||||
|
)
|
||||||
|
|
||||||
CONF_MEASUREMENT_TIME = 'measurement_time'
|
CONF_MEASUREMENT_TIME = "measurement_time"
|
||||||
CONFIG_SCHEMA = sensor.sensor_schema(UNIT_LUX, ICON_EMPTY, 1, DEVICE_CLASS_ILLUMINANCE).extend({
|
CONFIG_SCHEMA = (
|
||||||
cv.GenerateID(): cv.declare_id(BH1750Sensor),
|
sensor.sensor_schema(UNIT_LUX, ICON_EMPTY, 1, DEVICE_CLASS_ILLUMINANCE)
|
||||||
cv.Optional(CONF_RESOLUTION, default=0.5): cv.enum(BH1750_RESOLUTIONS, float=True),
|
.extend(
|
||||||
cv.Optional(CONF_MEASUREMENT_TIME, default=69): cv.int_range(min=31, max=254),
|
{
|
||||||
}).extend(cv.polling_component_schema('60s')).extend(i2c.i2c_device_schema(0x23))
|
cv.GenerateID(): cv.declare_id(BH1750Sensor),
|
||||||
|
cv.Optional(CONF_RESOLUTION, default=0.5): cv.enum(
|
||||||
|
BH1750_RESOLUTIONS, float=True
|
||||||
|
),
|
||||||
|
cv.Optional(CONF_MEASUREMENT_TIME, default=69): cv.int_range(
|
||||||
|
min=31, max=254
|
||||||
|
),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.extend(cv.polling_component_schema("60s"))
|
||||||
|
.extend(i2c.i2c_device_schema(0x23))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
|
|
||||||
binary_ns = cg.esphome_ns.namespace('binary')
|
binary_ns = cg.esphome_ns.namespace("binary")
|
||||||
|
|||||||
@@ -1,18 +1,24 @@
|
|||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.components import fan, output
|
from esphome.components import fan, output
|
||||||
from esphome.const import CONF_DIRECTION_OUTPUT, CONF_OSCILLATION_OUTPUT, \
|
from esphome.const import (
|
||||||
CONF_OUTPUT, CONF_OUTPUT_ID
|
CONF_DIRECTION_OUTPUT,
|
||||||
|
CONF_OSCILLATION_OUTPUT,
|
||||||
|
CONF_OUTPUT,
|
||||||
|
CONF_OUTPUT_ID,
|
||||||
|
)
|
||||||
from .. import binary_ns
|
from .. import binary_ns
|
||||||
|
|
||||||
BinaryFan = binary_ns.class_('BinaryFan', cg.Component)
|
BinaryFan = binary_ns.class_("BinaryFan", cg.Component)
|
||||||
|
|
||||||
CONFIG_SCHEMA = fan.FAN_SCHEMA.extend({
|
CONFIG_SCHEMA = fan.FAN_SCHEMA.extend(
|
||||||
cv.GenerateID(CONF_OUTPUT_ID): cv.declare_id(BinaryFan),
|
{
|
||||||
cv.Required(CONF_OUTPUT): cv.use_id(output.BinaryOutput),
|
cv.GenerateID(CONF_OUTPUT_ID): cv.declare_id(BinaryFan),
|
||||||
cv.Optional(CONF_DIRECTION_OUTPUT): cv.use_id(output.BinaryOutput),
|
cv.Required(CONF_OUTPUT): cv.use_id(output.BinaryOutput),
|
||||||
cv.Optional(CONF_OSCILLATION_OUTPUT): cv.use_id(output.BinaryOutput),
|
cv.Optional(CONF_DIRECTION_OUTPUT): cv.use_id(output.BinaryOutput),
|
||||||
}).extend(cv.COMPONENT_SCHEMA)
|
cv.Optional(CONF_OSCILLATION_OUTPUT): cv.use_id(output.BinaryOutput),
|
||||||
|
}
|
||||||
|
).extend(cv.COMPONENT_SCHEMA)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
@@ -4,12 +4,14 @@ from esphome.components import light, output
|
|||||||
from esphome.const import CONF_OUTPUT_ID, CONF_OUTPUT
|
from esphome.const import CONF_OUTPUT_ID, CONF_OUTPUT
|
||||||
from .. import binary_ns
|
from .. import binary_ns
|
||||||
|
|
||||||
BinaryLightOutput = binary_ns.class_('BinaryLightOutput', light.LightOutput)
|
BinaryLightOutput = binary_ns.class_("BinaryLightOutput", light.LightOutput)
|
||||||
|
|
||||||
CONFIG_SCHEMA = light.BINARY_LIGHT_SCHEMA.extend({
|
CONFIG_SCHEMA = light.BINARY_LIGHT_SCHEMA.extend(
|
||||||
cv.GenerateID(CONF_OUTPUT_ID): cv.declare_id(BinaryLightOutput),
|
{
|
||||||
cv.Required(CONF_OUTPUT): cv.use_id(output.BinaryOutput),
|
cv.GenerateID(CONF_OUTPUT_ID): cv.declare_id(BinaryLightOutput),
|
||||||
})
|
cv.Required(CONF_OUTPUT): cv.use_id(output.BinaryOutput),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -2,14 +2,25 @@ import esphome.codegen as cg
|
|||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
|
|
||||||
from esphome.components import sensor, binary_sensor
|
from esphome.components import sensor, binary_sensor
|
||||||
from esphome.const import CONF_ID, CONF_CHANNELS, CONF_VALUE, CONF_TYPE, DEVICE_CLASS_EMPTY, \
|
from esphome.const import (
|
||||||
UNIT_EMPTY, ICON_CHECK_CIRCLE_OUTLINE, CONF_BINARY_SENSOR, CONF_GROUP
|
CONF_ID,
|
||||||
|
CONF_CHANNELS,
|
||||||
|
CONF_VALUE,
|
||||||
|
CONF_TYPE,
|
||||||
|
DEVICE_CLASS_EMPTY,
|
||||||
|
UNIT_EMPTY,
|
||||||
|
ICON_CHECK_CIRCLE_OUTLINE,
|
||||||
|
CONF_BINARY_SENSOR,
|
||||||
|
CONF_GROUP,
|
||||||
|
)
|
||||||
|
|
||||||
DEPENDENCIES = ['binary_sensor']
|
DEPENDENCIES = ["binary_sensor"]
|
||||||
|
|
||||||
binary_sensor_map_ns = cg.esphome_ns.namespace('binary_sensor_map')
|
binary_sensor_map_ns = cg.esphome_ns.namespace("binary_sensor_map")
|
||||||
BinarySensorMap = binary_sensor_map_ns.class_('BinarySensorMap', cg.Component, sensor.Sensor)
|
BinarySensorMap = binary_sensor_map_ns.class_(
|
||||||
SensorMapType = binary_sensor_map_ns.enum('SensorMapType')
|
"BinarySensorMap", cg.Component, sensor.Sensor
|
||||||
|
)
|
||||||
|
SensorMapType = binary_sensor_map_ns.enum("SensorMapType")
|
||||||
|
|
||||||
SENSOR_MAP_TYPES = {
|
SENSOR_MAP_TYPES = {
|
||||||
CONF_GROUP: SensorMapType.BINARY_SENSOR_MAP_TYPE_GROUP,
|
CONF_GROUP: SensorMapType.BINARY_SENSOR_MAP_TYPE_GROUP,
|
||||||
@@ -20,14 +31,21 @@ entry = {
|
|||||||
cv.Required(CONF_VALUE): cv.float_,
|
cv.Required(CONF_VALUE): cv.float_,
|
||||||
}
|
}
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.typed_schema({
|
CONFIG_SCHEMA = cv.typed_schema(
|
||||||
CONF_GROUP: sensor.sensor_schema(
|
{
|
||||||
UNIT_EMPTY, ICON_CHECK_CIRCLE_OUTLINE, 0, DEVICE_CLASS_EMPTY
|
CONF_GROUP: sensor.sensor_schema(
|
||||||
).extend({
|
UNIT_EMPTY, ICON_CHECK_CIRCLE_OUTLINE, 0, DEVICE_CLASS_EMPTY
|
||||||
cv.GenerateID(): cv.declare_id(BinarySensorMap),
|
).extend(
|
||||||
cv.Required(CONF_CHANNELS): cv.All(cv.ensure_list(entry), cv.Length(min=1)),
|
{
|
||||||
}),
|
cv.GenerateID(): cv.declare_id(BinarySensorMap),
|
||||||
}, lower=True)
|
cv.Required(CONF_CHANNELS): cv.All(
|
||||||
|
cv.ensure_list(entry), cv.Length(min=1)
|
||||||
|
),
|
||||||
|
}
|
||||||
|
),
|
||||||
|
},
|
||||||
|
lower=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
@@ -3,18 +3,28 @@ import esphome.config_validation as cv
|
|||||||
from esphome.components import binary_sensor, esp32_ble_tracker
|
from esphome.components import binary_sensor, esp32_ble_tracker
|
||||||
from esphome.const import CONF_MAC_ADDRESS, CONF_SERVICE_UUID, CONF_ID
|
from esphome.const import CONF_MAC_ADDRESS, CONF_SERVICE_UUID, CONF_ID
|
||||||
|
|
||||||
DEPENDENCIES = ['esp32_ble_tracker']
|
DEPENDENCIES = ["esp32_ble_tracker"]
|
||||||
|
|
||||||
ble_presence_ns = cg.esphome_ns.namespace('ble_presence')
|
ble_presence_ns = cg.esphome_ns.namespace("ble_presence")
|
||||||
BLEPresenceDevice = ble_presence_ns.class_('BLEPresenceDevice', binary_sensor.BinarySensor,
|
BLEPresenceDevice = ble_presence_ns.class_(
|
||||||
cg.Component, esp32_ble_tracker.ESPBTDeviceListener)
|
"BLEPresenceDevice",
|
||||||
|
binary_sensor.BinarySensor,
|
||||||
|
cg.Component,
|
||||||
|
esp32_ble_tracker.ESPBTDeviceListener,
|
||||||
|
)
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.All(binary_sensor.BINARY_SENSOR_SCHEMA.extend({
|
CONFIG_SCHEMA = cv.All(
|
||||||
cv.GenerateID(): cv.declare_id(BLEPresenceDevice),
|
binary_sensor.BINARY_SENSOR_SCHEMA.extend(
|
||||||
cv.Optional(CONF_MAC_ADDRESS): cv.mac_address,
|
{
|
||||||
cv.Optional(CONF_SERVICE_UUID): esp32_ble_tracker.bt_uuid,
|
cv.GenerateID(): cv.declare_id(BLEPresenceDevice),
|
||||||
}).extend(esp32_ble_tracker.ESP_BLE_DEVICE_SCHEMA).extend(
|
cv.Optional(CONF_MAC_ADDRESS): cv.mac_address,
|
||||||
cv.COMPONENT_SCHEMA), cv.has_exactly_one_key(CONF_MAC_ADDRESS, CONF_SERVICE_UUID))
|
cv.Optional(CONF_SERVICE_UUID): esp32_ble_tracker.bt_uuid,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.extend(esp32_ble_tracker.ESP_BLE_DEVICE_SCHEMA)
|
||||||
|
.extend(cv.COMPONENT_SCHEMA),
|
||||||
|
cv.has_exactly_one_key(CONF_MAC_ADDRESS, CONF_SERVICE_UUID),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
@@ -28,9 +38,17 @@ def to_code(config):
|
|||||||
|
|
||||||
if CONF_SERVICE_UUID in config:
|
if CONF_SERVICE_UUID in config:
|
||||||
if len(config[CONF_SERVICE_UUID]) == len(esp32_ble_tracker.bt_uuid16_format):
|
if len(config[CONF_SERVICE_UUID]) == len(esp32_ble_tracker.bt_uuid16_format):
|
||||||
cg.add(var.set_service_uuid16(esp32_ble_tracker.as_hex(config[CONF_SERVICE_UUID])))
|
cg.add(
|
||||||
|
var.set_service_uuid16(
|
||||||
|
esp32_ble_tracker.as_hex(config[CONF_SERVICE_UUID])
|
||||||
|
)
|
||||||
|
)
|
||||||
elif len(config[CONF_SERVICE_UUID]) == len(esp32_ble_tracker.bt_uuid32_format):
|
elif len(config[CONF_SERVICE_UUID]) == len(esp32_ble_tracker.bt_uuid32_format):
|
||||||
cg.add(var.set_service_uuid32(esp32_ble_tracker.as_hex(config[CONF_SERVICE_UUID])))
|
cg.add(
|
||||||
|
var.set_service_uuid32(
|
||||||
|
esp32_ble_tracker.as_hex(config[CONF_SERVICE_UUID])
|
||||||
|
)
|
||||||
|
)
|
||||||
elif len(config[CONF_SERVICE_UUID]) == len(esp32_ble_tracker.bt_uuid128_format):
|
elif len(config[CONF_SERVICE_UUID]) == len(esp32_ble_tracker.bt_uuid128_format):
|
||||||
uuid128 = esp32_ble_tracker.as_hex_array(config[CONF_SERVICE_UUID])
|
uuid128 = esp32_ble_tracker.as_hex_array(config[CONF_SERVICE_UUID])
|
||||||
cg.add(var.set_service_uuid128(uuid128))
|
cg.add(var.set_service_uuid128(uuid128))
|
||||||
|
|||||||
@@ -1,23 +1,35 @@
|
|||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.components import sensor, esp32_ble_tracker
|
from esphome.components import sensor, esp32_ble_tracker
|
||||||
from esphome.const import CONF_SERVICE_UUID, CONF_MAC_ADDRESS, CONF_ID, \
|
from esphome.const import (
|
||||||
DEVICE_CLASS_SIGNAL_STRENGTH, UNIT_DECIBEL, ICON_EMPTY
|
CONF_SERVICE_UUID,
|
||||||
|
CONF_MAC_ADDRESS,
|
||||||
|
CONF_ID,
|
||||||
|
DEVICE_CLASS_SIGNAL_STRENGTH,
|
||||||
|
UNIT_DECIBEL,
|
||||||
|
ICON_EMPTY,
|
||||||
|
)
|
||||||
|
|
||||||
DEPENDENCIES = ['esp32_ble_tracker']
|
DEPENDENCIES = ["esp32_ble_tracker"]
|
||||||
|
|
||||||
ble_rssi_ns = cg.esphome_ns.namespace('ble_rssi')
|
ble_rssi_ns = cg.esphome_ns.namespace("ble_rssi")
|
||||||
BLERSSISensor = ble_rssi_ns.class_('BLERSSISensor', sensor.Sensor, cg.Component,
|
BLERSSISensor = ble_rssi_ns.class_(
|
||||||
esp32_ble_tracker.ESPBTDeviceListener)
|
"BLERSSISensor", sensor.Sensor, cg.Component, esp32_ble_tracker.ESPBTDeviceListener
|
||||||
|
)
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.All(
|
CONFIG_SCHEMA = cv.All(
|
||||||
sensor.sensor_schema(UNIT_DECIBEL, ICON_EMPTY, 0, DEVICE_CLASS_SIGNAL_STRENGTH).extend({
|
sensor.sensor_schema(UNIT_DECIBEL, ICON_EMPTY, 0, DEVICE_CLASS_SIGNAL_STRENGTH)
|
||||||
cv.GenerateID(): cv.declare_id(BLERSSISensor),
|
.extend(
|
||||||
cv.Optional(CONF_MAC_ADDRESS): cv.mac_address,
|
{
|
||||||
cv.Optional(CONF_SERVICE_UUID): esp32_ble_tracker.bt_uuid,
|
cv.GenerateID(): cv.declare_id(BLERSSISensor),
|
||||||
}).extend(
|
cv.Optional(CONF_MAC_ADDRESS): cv.mac_address,
|
||||||
esp32_ble_tracker.ESP_BLE_DEVICE_SCHEMA
|
cv.Optional(CONF_SERVICE_UUID): esp32_ble_tracker.bt_uuid,
|
||||||
).extend(cv.COMPONENT_SCHEMA), cv.has_exactly_one_key(CONF_MAC_ADDRESS, CONF_SERVICE_UUID))
|
}
|
||||||
|
)
|
||||||
|
.extend(esp32_ble_tracker.ESP_BLE_DEVICE_SCHEMA)
|
||||||
|
.extend(cv.COMPONENT_SCHEMA),
|
||||||
|
cv.has_exactly_one_key(CONF_MAC_ADDRESS, CONF_SERVICE_UUID),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
@@ -31,9 +43,17 @@ def to_code(config):
|
|||||||
|
|
||||||
if CONF_SERVICE_UUID in config:
|
if CONF_SERVICE_UUID in config:
|
||||||
if len(config[CONF_SERVICE_UUID]) == len(esp32_ble_tracker.bt_uuid16_format):
|
if len(config[CONF_SERVICE_UUID]) == len(esp32_ble_tracker.bt_uuid16_format):
|
||||||
cg.add(var.set_service_uuid16(esp32_ble_tracker.as_hex(config[CONF_SERVICE_UUID])))
|
cg.add(
|
||||||
|
var.set_service_uuid16(
|
||||||
|
esp32_ble_tracker.as_hex(config[CONF_SERVICE_UUID])
|
||||||
|
)
|
||||||
|
)
|
||||||
elif len(config[CONF_SERVICE_UUID]) == len(esp32_ble_tracker.bt_uuid32_format):
|
elif len(config[CONF_SERVICE_UUID]) == len(esp32_ble_tracker.bt_uuid32_format):
|
||||||
cg.add(var.set_service_uuid32(esp32_ble_tracker.as_hex(config[CONF_SERVICE_UUID])))
|
cg.add(
|
||||||
|
var.set_service_uuid32(
|
||||||
|
esp32_ble_tracker.as_hex(config[CONF_SERVICE_UUID])
|
||||||
|
)
|
||||||
|
)
|
||||||
elif len(config[CONF_SERVICE_UUID]) == len(esp32_ble_tracker.bt_uuid128_format):
|
elif len(config[CONF_SERVICE_UUID]) == len(esp32_ble_tracker.bt_uuid128_format):
|
||||||
uuid128 = esp32_ble_tracker.as_hex_array(config[CONF_SERVICE_UUID])
|
uuid128 = esp32_ble_tracker.as_hex_array(config[CONF_SERVICE_UUID])
|
||||||
cg.add(var.set_service_uuid128(uuid128))
|
cg.add(var.set_service_uuid128(uuid128))
|
||||||
|
|||||||
@@ -3,16 +3,25 @@ import esphome.config_validation as cv
|
|||||||
from esphome.components import text_sensor, esp32_ble_tracker
|
from esphome.components import text_sensor, esp32_ble_tracker
|
||||||
from esphome.const import CONF_ID
|
from esphome.const import CONF_ID
|
||||||
|
|
||||||
DEPENDENCIES = ['esp32_ble_tracker']
|
DEPENDENCIES = ["esp32_ble_tracker"]
|
||||||
|
|
||||||
ble_scanner_ns = cg.esphome_ns.namespace('ble_scanner')
|
ble_scanner_ns = cg.esphome_ns.namespace("ble_scanner")
|
||||||
BLEScanner = ble_scanner_ns.class_('BLEScanner', text_sensor.TextSensor, cg.Component,
|
BLEScanner = ble_scanner_ns.class_(
|
||||||
esp32_ble_tracker.ESPBTDeviceListener)
|
"BLEScanner",
|
||||||
|
text_sensor.TextSensor,
|
||||||
|
cg.Component,
|
||||||
|
esp32_ble_tracker.ESPBTDeviceListener,
|
||||||
|
)
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.All(text_sensor.TEXT_SENSOR_SCHEMA.extend({
|
CONFIG_SCHEMA = cv.All(
|
||||||
cv.GenerateID(): cv.declare_id(BLEScanner),
|
text_sensor.TEXT_SENSOR_SCHEMA.extend(
|
||||||
}).extend(esp32_ble_tracker.ESP_BLE_DEVICE_SCHEMA).extend(
|
{
|
||||||
cv.COMPONENT_SCHEMA))
|
cv.GenerateID(): cv.declare_id(BLEScanner),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.extend(esp32_ble_tracker.ESP_BLE_DEVICE_SCHEMA)
|
||||||
|
.extend(cv.COMPONENT_SCHEMA)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
@@ -1,53 +1,87 @@
|
|||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.components import i2c, sensor
|
from esphome.components import i2c, sensor
|
||||||
from esphome.const import CONF_HUMIDITY, CONF_ID, CONF_IIR_FILTER, CONF_OVERSAMPLING, \
|
from esphome.const import (
|
||||||
CONF_PRESSURE, CONF_TEMPERATURE, DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_PRESSURE, \
|
CONF_HUMIDITY,
|
||||||
DEVICE_CLASS_TEMPERATURE, ICON_EMPTY, UNIT_CELSIUS, UNIT_HECTOPASCAL, UNIT_PERCENT
|
CONF_ID,
|
||||||
|
CONF_IIR_FILTER,
|
||||||
|
CONF_OVERSAMPLING,
|
||||||
|
CONF_PRESSURE,
|
||||||
|
CONF_TEMPERATURE,
|
||||||
|
DEVICE_CLASS_HUMIDITY,
|
||||||
|
DEVICE_CLASS_PRESSURE,
|
||||||
|
DEVICE_CLASS_TEMPERATURE,
|
||||||
|
ICON_EMPTY,
|
||||||
|
UNIT_CELSIUS,
|
||||||
|
UNIT_HECTOPASCAL,
|
||||||
|
UNIT_PERCENT,
|
||||||
|
)
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ["i2c"]
|
||||||
|
|
||||||
bme280_ns = cg.esphome_ns.namespace('bme280')
|
bme280_ns = cg.esphome_ns.namespace("bme280")
|
||||||
BME280Oversampling = bme280_ns.enum('BME280Oversampling')
|
BME280Oversampling = bme280_ns.enum("BME280Oversampling")
|
||||||
OVERSAMPLING_OPTIONS = {
|
OVERSAMPLING_OPTIONS = {
|
||||||
'NONE': BME280Oversampling.BME280_OVERSAMPLING_NONE,
|
"NONE": BME280Oversampling.BME280_OVERSAMPLING_NONE,
|
||||||
'1X': BME280Oversampling.BME280_OVERSAMPLING_1X,
|
"1X": BME280Oversampling.BME280_OVERSAMPLING_1X,
|
||||||
'2X': BME280Oversampling.BME280_OVERSAMPLING_2X,
|
"2X": BME280Oversampling.BME280_OVERSAMPLING_2X,
|
||||||
'4X': BME280Oversampling.BME280_OVERSAMPLING_4X,
|
"4X": BME280Oversampling.BME280_OVERSAMPLING_4X,
|
||||||
'8X': BME280Oversampling.BME280_OVERSAMPLING_8X,
|
"8X": BME280Oversampling.BME280_OVERSAMPLING_8X,
|
||||||
'16X': BME280Oversampling.BME280_OVERSAMPLING_16X,
|
"16X": BME280Oversampling.BME280_OVERSAMPLING_16X,
|
||||||
}
|
}
|
||||||
|
|
||||||
BME280IIRFilter = bme280_ns.enum('BME280IIRFilter')
|
BME280IIRFilter = bme280_ns.enum("BME280IIRFilter")
|
||||||
IIR_FILTER_OPTIONS = {
|
IIR_FILTER_OPTIONS = {
|
||||||
'OFF': BME280IIRFilter.BME280_IIR_FILTER_OFF,
|
"OFF": BME280IIRFilter.BME280_IIR_FILTER_OFF,
|
||||||
'2X': BME280IIRFilter.BME280_IIR_FILTER_2X,
|
"2X": BME280IIRFilter.BME280_IIR_FILTER_2X,
|
||||||
'4X': BME280IIRFilter.BME280_IIR_FILTER_4X,
|
"4X": BME280IIRFilter.BME280_IIR_FILTER_4X,
|
||||||
'8X': BME280IIRFilter.BME280_IIR_FILTER_8X,
|
"8X": BME280IIRFilter.BME280_IIR_FILTER_8X,
|
||||||
'16X': BME280IIRFilter.BME280_IIR_FILTER_16X,
|
"16X": BME280IIRFilter.BME280_IIR_FILTER_16X,
|
||||||
}
|
}
|
||||||
|
|
||||||
BME280Component = bme280_ns.class_('BME280Component', cg.PollingComponent, i2c.I2CDevice)
|
BME280Component = bme280_ns.class_(
|
||||||
|
"BME280Component", cg.PollingComponent, i2c.I2CDevice
|
||||||
|
)
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.Schema({
|
CONFIG_SCHEMA = (
|
||||||
cv.GenerateID(): cv.declare_id(BME280Component),
|
cv.Schema(
|
||||||
cv.Optional(CONF_TEMPERATURE):
|
{
|
||||||
sensor.sensor_schema(UNIT_CELSIUS, ICON_EMPTY, 1, DEVICE_CLASS_TEMPERATURE).extend({
|
cv.GenerateID(): cv.declare_id(BME280Component),
|
||||||
cv.Optional(CONF_OVERSAMPLING, default='16X'):
|
cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema(
|
||||||
cv.enum(OVERSAMPLING_OPTIONS, upper=True),
|
UNIT_CELSIUS, ICON_EMPTY, 1, DEVICE_CLASS_TEMPERATURE
|
||||||
}),
|
).extend(
|
||||||
cv.Optional(CONF_PRESSURE):
|
{
|
||||||
sensor.sensor_schema(UNIT_HECTOPASCAL, ICON_EMPTY, 1, DEVICE_CLASS_PRESSURE).extend({
|
cv.Optional(CONF_OVERSAMPLING, default="16X"): cv.enum(
|
||||||
cv.Optional(CONF_OVERSAMPLING, default='16X'):
|
OVERSAMPLING_OPTIONS, upper=True
|
||||||
cv.enum(OVERSAMPLING_OPTIONS, upper=True),
|
),
|
||||||
}),
|
}
|
||||||
cv.Optional(CONF_HUMIDITY):
|
),
|
||||||
sensor.sensor_schema(UNIT_PERCENT, ICON_EMPTY, 1, DEVICE_CLASS_HUMIDITY).extend({
|
cv.Optional(CONF_PRESSURE): sensor.sensor_schema(
|
||||||
cv.Optional(CONF_OVERSAMPLING, default='16X'):
|
UNIT_HECTOPASCAL, ICON_EMPTY, 1, DEVICE_CLASS_PRESSURE
|
||||||
cv.enum(OVERSAMPLING_OPTIONS, upper=True),
|
).extend(
|
||||||
}),
|
{
|
||||||
cv.Optional(CONF_IIR_FILTER, default='OFF'): cv.enum(IIR_FILTER_OPTIONS, upper=True),
|
cv.Optional(CONF_OVERSAMPLING, default="16X"): cv.enum(
|
||||||
}).extend(cv.polling_component_schema('60s')).extend(i2c.i2c_device_schema(0x77))
|
OVERSAMPLING_OPTIONS, upper=True
|
||||||
|
),
|
||||||
|
}
|
||||||
|
),
|
||||||
|
cv.Optional(CONF_HUMIDITY): sensor.sensor_schema(
|
||||||
|
UNIT_PERCENT, ICON_EMPTY, 1, DEVICE_CLASS_HUMIDITY
|
||||||
|
).extend(
|
||||||
|
{
|
||||||
|
cv.Optional(CONF_OVERSAMPLING, default="16X"): cv.enum(
|
||||||
|
OVERSAMPLING_OPTIONS, upper=True
|
||||||
|
),
|
||||||
|
}
|
||||||
|
),
|
||||||
|
cv.Optional(CONF_IIR_FILTER, default="OFF"): cv.enum(
|
||||||
|
IIR_FILTER_OPTIONS, upper=True
|
||||||
|
),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.extend(cv.polling_component_schema("60s"))
|
||||||
|
.extend(i2c.i2c_device_schema(0x77))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
@@ -2,65 +2,116 @@ import esphome.codegen as cg
|
|||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome import core
|
from esphome import core
|
||||||
from esphome.components import i2c, sensor
|
from esphome.components import i2c, sensor
|
||||||
from esphome.const import CONF_DURATION, CONF_GAS_RESISTANCE, CONF_HEATER, \
|
from esphome.const import (
|
||||||
CONF_HUMIDITY, CONF_ID, CONF_IIR_FILTER, CONF_OVERSAMPLING, CONF_PRESSURE, \
|
CONF_DURATION,
|
||||||
CONF_TEMPERATURE, DEVICE_CLASS_EMPTY, DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_PRESSURE, \
|
CONF_GAS_RESISTANCE,
|
||||||
DEVICE_CLASS_TEMPERATURE, UNIT_OHM, ICON_GAS_CYLINDER, UNIT_CELSIUS, ICON_EMPTY, \
|
CONF_HEATER,
|
||||||
UNIT_HECTOPASCAL, UNIT_PERCENT
|
CONF_HUMIDITY,
|
||||||
|
CONF_ID,
|
||||||
|
CONF_IIR_FILTER,
|
||||||
|
CONF_OVERSAMPLING,
|
||||||
|
CONF_PRESSURE,
|
||||||
|
CONF_TEMPERATURE,
|
||||||
|
DEVICE_CLASS_EMPTY,
|
||||||
|
DEVICE_CLASS_HUMIDITY,
|
||||||
|
DEVICE_CLASS_PRESSURE,
|
||||||
|
DEVICE_CLASS_TEMPERATURE,
|
||||||
|
UNIT_OHM,
|
||||||
|
ICON_GAS_CYLINDER,
|
||||||
|
UNIT_CELSIUS,
|
||||||
|
ICON_EMPTY,
|
||||||
|
UNIT_HECTOPASCAL,
|
||||||
|
UNIT_PERCENT,
|
||||||
|
)
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ["i2c"]
|
||||||
|
|
||||||
bme680_ns = cg.esphome_ns.namespace('bme680')
|
bme680_ns = cg.esphome_ns.namespace("bme680")
|
||||||
BME680Oversampling = bme680_ns.enum('BME680Oversampling')
|
BME680Oversampling = bme680_ns.enum("BME680Oversampling")
|
||||||
OVERSAMPLING_OPTIONS = {
|
OVERSAMPLING_OPTIONS = {
|
||||||
'NONE': BME680Oversampling.BME680_OVERSAMPLING_NONE,
|
"NONE": BME680Oversampling.BME680_OVERSAMPLING_NONE,
|
||||||
'1X': BME680Oversampling.BME680_OVERSAMPLING_1X,
|
"1X": BME680Oversampling.BME680_OVERSAMPLING_1X,
|
||||||
'2X': BME680Oversampling.BME680_OVERSAMPLING_2X,
|
"2X": BME680Oversampling.BME680_OVERSAMPLING_2X,
|
||||||
'4X': BME680Oversampling.BME680_OVERSAMPLING_4X,
|
"4X": BME680Oversampling.BME680_OVERSAMPLING_4X,
|
||||||
'8X': BME680Oversampling.BME680_OVERSAMPLING_8X,
|
"8X": BME680Oversampling.BME680_OVERSAMPLING_8X,
|
||||||
'16X': BME680Oversampling.BME680_OVERSAMPLING_16X,
|
"16X": BME680Oversampling.BME680_OVERSAMPLING_16X,
|
||||||
}
|
}
|
||||||
|
|
||||||
BME680IIRFilter = bme680_ns.enum('BME680IIRFilter')
|
BME680IIRFilter = bme680_ns.enum("BME680IIRFilter")
|
||||||
IIR_FILTER_OPTIONS = {
|
IIR_FILTER_OPTIONS = {
|
||||||
'OFF': BME680IIRFilter.BME680_IIR_FILTER_OFF,
|
"OFF": BME680IIRFilter.BME680_IIR_FILTER_OFF,
|
||||||
'1X': BME680IIRFilter.BME680_IIR_FILTER_1X,
|
"1X": BME680IIRFilter.BME680_IIR_FILTER_1X,
|
||||||
'3X': BME680IIRFilter.BME680_IIR_FILTER_3X,
|
"3X": BME680IIRFilter.BME680_IIR_FILTER_3X,
|
||||||
'7X': BME680IIRFilter.BME680_IIR_FILTER_7X,
|
"7X": BME680IIRFilter.BME680_IIR_FILTER_7X,
|
||||||
'15X': BME680IIRFilter.BME680_IIR_FILTER_15X,
|
"15X": BME680IIRFilter.BME680_IIR_FILTER_15X,
|
||||||
'31X': BME680IIRFilter.BME680_IIR_FILTER_31X,
|
"31X": BME680IIRFilter.BME680_IIR_FILTER_31X,
|
||||||
'63X': BME680IIRFilter.BME680_IIR_FILTER_63X,
|
"63X": BME680IIRFilter.BME680_IIR_FILTER_63X,
|
||||||
'127X': BME680IIRFilter.BME680_IIR_FILTER_127X,
|
"127X": BME680IIRFilter.BME680_IIR_FILTER_127X,
|
||||||
}
|
}
|
||||||
|
|
||||||
BME680Component = bme680_ns.class_('BME680Component', cg.PollingComponent, i2c.I2CDevice)
|
BME680Component = bme680_ns.class_(
|
||||||
|
"BME680Component", cg.PollingComponent, i2c.I2CDevice
|
||||||
|
)
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.Schema({
|
CONFIG_SCHEMA = (
|
||||||
cv.GenerateID(): cv.declare_id(BME680Component),
|
cv.Schema(
|
||||||
cv.Optional(CONF_TEMPERATURE):
|
{
|
||||||
sensor.sensor_schema(UNIT_CELSIUS, ICON_EMPTY, 1, DEVICE_CLASS_TEMPERATURE).extend({
|
cv.GenerateID(): cv.declare_id(BME680Component),
|
||||||
cv.Optional(CONF_OVERSAMPLING, default='16X'):
|
cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema(
|
||||||
cv.enum(OVERSAMPLING_OPTIONS, upper=True),
|
UNIT_CELSIUS, ICON_EMPTY, 1, DEVICE_CLASS_TEMPERATURE
|
||||||
}),
|
).extend(
|
||||||
cv.Optional(CONF_PRESSURE):
|
{
|
||||||
sensor.sensor_schema(UNIT_HECTOPASCAL, ICON_EMPTY, 1, DEVICE_CLASS_PRESSURE).extend({
|
cv.Optional(CONF_OVERSAMPLING, default="16X"): cv.enum(
|
||||||
cv.Optional(CONF_OVERSAMPLING, default='16X'):
|
OVERSAMPLING_OPTIONS, upper=True
|
||||||
cv.enum(OVERSAMPLING_OPTIONS, upper=True),
|
),
|
||||||
}),
|
}
|
||||||
cv.Optional(CONF_HUMIDITY):
|
),
|
||||||
sensor.sensor_schema(UNIT_PERCENT, ICON_EMPTY, 1, DEVICE_CLASS_HUMIDITY).extend({
|
cv.Optional(CONF_PRESSURE): sensor.sensor_schema(
|
||||||
cv.Optional(CONF_OVERSAMPLING, default='16X'):
|
UNIT_HECTOPASCAL, ICON_EMPTY, 1, DEVICE_CLASS_PRESSURE
|
||||||
cv.enum(OVERSAMPLING_OPTIONS, upper=True),
|
).extend(
|
||||||
}),
|
{
|
||||||
cv.Optional(CONF_GAS_RESISTANCE):
|
cv.Optional(CONF_OVERSAMPLING, default="16X"): cv.enum(
|
||||||
sensor.sensor_schema(UNIT_OHM, ICON_GAS_CYLINDER, 1, DEVICE_CLASS_EMPTY),
|
OVERSAMPLING_OPTIONS, upper=True
|
||||||
cv.Optional(CONF_IIR_FILTER, default='OFF'): cv.enum(IIR_FILTER_OPTIONS, upper=True),
|
),
|
||||||
cv.Optional(CONF_HEATER): cv.Any(None, cv.All(cv.Schema({
|
}
|
||||||
cv.Optional(CONF_TEMPERATURE, default=320): cv.int_range(min=200, max=400),
|
),
|
||||||
cv.Optional(CONF_DURATION, default='150ms'): cv.All(
|
cv.Optional(CONF_HUMIDITY): sensor.sensor_schema(
|
||||||
cv.positive_time_period_milliseconds, cv.Range(max=core.TimePeriod(milliseconds=4032)))
|
UNIT_PERCENT, ICON_EMPTY, 1, DEVICE_CLASS_HUMIDITY
|
||||||
}), cv.has_at_least_one_key(CONF_TEMPERATURE, CONF_DURATION))),
|
).extend(
|
||||||
}).extend(cv.polling_component_schema('60s')).extend(i2c.i2c_device_schema(0x76))
|
{
|
||||||
|
cv.Optional(CONF_OVERSAMPLING, default="16X"): cv.enum(
|
||||||
|
OVERSAMPLING_OPTIONS, upper=True
|
||||||
|
),
|
||||||
|
}
|
||||||
|
),
|
||||||
|
cv.Optional(CONF_GAS_RESISTANCE): sensor.sensor_schema(
|
||||||
|
UNIT_OHM, ICON_GAS_CYLINDER, 1, DEVICE_CLASS_EMPTY
|
||||||
|
),
|
||||||
|
cv.Optional(CONF_IIR_FILTER, default="OFF"): cv.enum(
|
||||||
|
IIR_FILTER_OPTIONS, upper=True
|
||||||
|
),
|
||||||
|
cv.Optional(CONF_HEATER): cv.Any(
|
||||||
|
None,
|
||||||
|
cv.All(
|
||||||
|
cv.Schema(
|
||||||
|
{
|
||||||
|
cv.Optional(CONF_TEMPERATURE, default=320): cv.int_range(
|
||||||
|
min=200, max=400
|
||||||
|
),
|
||||||
|
cv.Optional(CONF_DURATION, default="150ms"): cv.All(
|
||||||
|
cv.positive_time_period_milliseconds,
|
||||||
|
cv.Range(max=core.TimePeriod(milliseconds=4032)),
|
||||||
|
),
|
||||||
|
}
|
||||||
|
),
|
||||||
|
cv.has_at_least_one_key(CONF_TEMPERATURE, CONF_DURATION),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.extend(cv.polling_component_schema("60s"))
|
||||||
|
.extend(i2c.i2c_device_schema(0x76))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
@@ -1,21 +1,39 @@
|
|||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.components import i2c, sensor
|
from esphome.components import i2c, sensor
|
||||||
from esphome.const import CONF_ID, CONF_PRESSURE, CONF_TEMPERATURE, DEVICE_CLASS_PRESSURE, \
|
from esphome.const import (
|
||||||
DEVICE_CLASS_TEMPERATURE, UNIT_CELSIUS, ICON_EMPTY, UNIT_HECTOPASCAL
|
CONF_ID,
|
||||||
|
CONF_PRESSURE,
|
||||||
|
CONF_TEMPERATURE,
|
||||||
|
DEVICE_CLASS_PRESSURE,
|
||||||
|
DEVICE_CLASS_TEMPERATURE,
|
||||||
|
UNIT_CELSIUS,
|
||||||
|
ICON_EMPTY,
|
||||||
|
UNIT_HECTOPASCAL,
|
||||||
|
)
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ["i2c"]
|
||||||
|
|
||||||
bmp085_ns = cg.esphome_ns.namespace('bmp085')
|
bmp085_ns = cg.esphome_ns.namespace("bmp085")
|
||||||
BMP085Component = bmp085_ns.class_('BMP085Component', cg.PollingComponent, i2c.I2CDevice)
|
BMP085Component = bmp085_ns.class_(
|
||||||
|
"BMP085Component", cg.PollingComponent, i2c.I2CDevice
|
||||||
|
)
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.Schema({
|
CONFIG_SCHEMA = (
|
||||||
cv.GenerateID(): cv.declare_id(BMP085Component),
|
cv.Schema(
|
||||||
cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema(UNIT_CELSIUS, ICON_EMPTY, 1,
|
{
|
||||||
DEVICE_CLASS_TEMPERATURE),
|
cv.GenerateID(): cv.declare_id(BMP085Component),
|
||||||
cv.Optional(CONF_PRESSURE): sensor.sensor_schema(UNIT_HECTOPASCAL, ICON_EMPTY, 1,
|
cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema(
|
||||||
DEVICE_CLASS_PRESSURE),
|
UNIT_CELSIUS, ICON_EMPTY, 1, DEVICE_CLASS_TEMPERATURE
|
||||||
}).extend(cv.polling_component_schema('60s')).extend(i2c.i2c_device_schema(0x77))
|
),
|
||||||
|
cv.Optional(CONF_PRESSURE): sensor.sensor_schema(
|
||||||
|
UNIT_HECTOPASCAL, ICON_EMPTY, 1, DEVICE_CLASS_PRESSURE
|
||||||
|
),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.extend(cv.polling_component_schema("60s"))
|
||||||
|
.extend(i2c.i2c_device_schema(0x77))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
@@ -1,48 +1,75 @@
|
|||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.components import i2c, sensor
|
from esphome.components import i2c, sensor
|
||||||
from esphome.const import CONF_ID, CONF_PRESSURE, CONF_TEMPERATURE, DEVICE_CLASS_PRESSURE, \
|
from esphome.const import (
|
||||||
DEVICE_CLASS_TEMPERATURE, UNIT_CELSIUS, ICON_EMPTY, UNIT_HECTOPASCAL, CONF_IIR_FILTER, \
|
CONF_ID,
|
||||||
CONF_OVERSAMPLING
|
CONF_PRESSURE,
|
||||||
|
CONF_TEMPERATURE,
|
||||||
|
DEVICE_CLASS_PRESSURE,
|
||||||
|
DEVICE_CLASS_TEMPERATURE,
|
||||||
|
UNIT_CELSIUS,
|
||||||
|
ICON_EMPTY,
|
||||||
|
UNIT_HECTOPASCAL,
|
||||||
|
CONF_IIR_FILTER,
|
||||||
|
CONF_OVERSAMPLING,
|
||||||
|
)
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ["i2c"]
|
||||||
|
|
||||||
bmp280_ns = cg.esphome_ns.namespace('bmp280')
|
bmp280_ns = cg.esphome_ns.namespace("bmp280")
|
||||||
BMP280Oversampling = bmp280_ns.enum('BMP280Oversampling')
|
BMP280Oversampling = bmp280_ns.enum("BMP280Oversampling")
|
||||||
OVERSAMPLING_OPTIONS = {
|
OVERSAMPLING_OPTIONS = {
|
||||||
'NONE': BMP280Oversampling.BMP280_OVERSAMPLING_NONE,
|
"NONE": BMP280Oversampling.BMP280_OVERSAMPLING_NONE,
|
||||||
'1X': BMP280Oversampling.BMP280_OVERSAMPLING_1X,
|
"1X": BMP280Oversampling.BMP280_OVERSAMPLING_1X,
|
||||||
'2X': BMP280Oversampling.BMP280_OVERSAMPLING_2X,
|
"2X": BMP280Oversampling.BMP280_OVERSAMPLING_2X,
|
||||||
'4X': BMP280Oversampling.BMP280_OVERSAMPLING_4X,
|
"4X": BMP280Oversampling.BMP280_OVERSAMPLING_4X,
|
||||||
'8X': BMP280Oversampling.BMP280_OVERSAMPLING_8X,
|
"8X": BMP280Oversampling.BMP280_OVERSAMPLING_8X,
|
||||||
'16X': BMP280Oversampling.BMP280_OVERSAMPLING_16X,
|
"16X": BMP280Oversampling.BMP280_OVERSAMPLING_16X,
|
||||||
}
|
}
|
||||||
|
|
||||||
BMP280IIRFilter = bmp280_ns.enum('BMP280IIRFilter')
|
BMP280IIRFilter = bmp280_ns.enum("BMP280IIRFilter")
|
||||||
IIR_FILTER_OPTIONS = {
|
IIR_FILTER_OPTIONS = {
|
||||||
'OFF': BMP280IIRFilter.BMP280_IIR_FILTER_OFF,
|
"OFF": BMP280IIRFilter.BMP280_IIR_FILTER_OFF,
|
||||||
'2X': BMP280IIRFilter.BMP280_IIR_FILTER_2X,
|
"2X": BMP280IIRFilter.BMP280_IIR_FILTER_2X,
|
||||||
'4X': BMP280IIRFilter.BMP280_IIR_FILTER_4X,
|
"4X": BMP280IIRFilter.BMP280_IIR_FILTER_4X,
|
||||||
'8X': BMP280IIRFilter.BMP280_IIR_FILTER_8X,
|
"8X": BMP280IIRFilter.BMP280_IIR_FILTER_8X,
|
||||||
'16X': BMP280IIRFilter.BMP280_IIR_FILTER_16X,
|
"16X": BMP280IIRFilter.BMP280_IIR_FILTER_16X,
|
||||||
}
|
}
|
||||||
|
|
||||||
BMP280Component = bmp280_ns.class_('BMP280Component', cg.PollingComponent, i2c.I2CDevice)
|
BMP280Component = bmp280_ns.class_(
|
||||||
|
"BMP280Component", cg.PollingComponent, i2c.I2CDevice
|
||||||
|
)
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.Schema({
|
CONFIG_SCHEMA = (
|
||||||
cv.GenerateID(): cv.declare_id(BMP280Component),
|
cv.Schema(
|
||||||
cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema(
|
{
|
||||||
UNIT_CELSIUS, ICON_EMPTY, 1, DEVICE_CLASS_TEMPERATURE
|
cv.GenerateID(): cv.declare_id(BMP280Component),
|
||||||
).extend({
|
cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema(
|
||||||
cv.Optional(CONF_OVERSAMPLING, default='16X'): cv.enum(OVERSAMPLING_OPTIONS, upper=True),
|
UNIT_CELSIUS, ICON_EMPTY, 1, DEVICE_CLASS_TEMPERATURE
|
||||||
}),
|
).extend(
|
||||||
cv.Optional(CONF_PRESSURE): sensor.sensor_schema(
|
{
|
||||||
UNIT_HECTOPASCAL, ICON_EMPTY, 1, DEVICE_CLASS_PRESSURE
|
cv.Optional(CONF_OVERSAMPLING, default="16X"): cv.enum(
|
||||||
).extend({
|
OVERSAMPLING_OPTIONS, upper=True
|
||||||
cv.Optional(CONF_OVERSAMPLING, default='16X'): cv.enum(OVERSAMPLING_OPTIONS, upper=True),
|
),
|
||||||
}),
|
}
|
||||||
cv.Optional(CONF_IIR_FILTER, default='OFF'): cv.enum(IIR_FILTER_OPTIONS, upper=True),
|
),
|
||||||
}).extend(cv.polling_component_schema('60s')).extend(i2c.i2c_device_schema(0x77))
|
cv.Optional(CONF_PRESSURE): sensor.sensor_schema(
|
||||||
|
UNIT_HECTOPASCAL, ICON_EMPTY, 1, DEVICE_CLASS_PRESSURE
|
||||||
|
).extend(
|
||||||
|
{
|
||||||
|
cv.Optional(CONF_OVERSAMPLING, default="16X"): cv.enum(
|
||||||
|
OVERSAMPLING_OPTIONS, upper=True
|
||||||
|
),
|
||||||
|
}
|
||||||
|
),
|
||||||
|
cv.Optional(CONF_IIR_FILTER, default="OFF"): cv.enum(
|
||||||
|
IIR_FILTER_OPTIONS, upper=True
|
||||||
|
),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.extend(cv.polling_component_schema("60s"))
|
||||||
|
.extend(i2c.i2c_device_schema(0x77))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
@@ -4,68 +4,76 @@ from esphome import automation
|
|||||||
from esphome.core import CORE, coroutine
|
from esphome.core import CORE, coroutine
|
||||||
from esphome.const import CONF_ID, CONF_TRIGGER_ID, CONF_DATA
|
from esphome.const import CONF_ID, CONF_TRIGGER_ID, CONF_DATA
|
||||||
|
|
||||||
CODEOWNERS = ['@mvturnho', '@danielschramm']
|
CODEOWNERS = ["@mvturnho", "@danielschramm"]
|
||||||
IS_PLATFORM_COMPONENT = True
|
IS_PLATFORM_COMPONENT = True
|
||||||
|
|
||||||
CONF_CAN_ID = 'can_id'
|
CONF_CAN_ID = "can_id"
|
||||||
CONF_USE_EXTENDED_ID = 'use_extended_id'
|
CONF_USE_EXTENDED_ID = "use_extended_id"
|
||||||
CONF_CANBUS_ID = 'canbus_id'
|
CONF_CANBUS_ID = "canbus_id"
|
||||||
CONF_BIT_RATE = 'bit_rate'
|
CONF_BIT_RATE = "bit_rate"
|
||||||
CONF_ON_FRAME = 'on_frame'
|
CONF_ON_FRAME = "on_frame"
|
||||||
CONF_CANBUS_SEND = 'canbus.send'
|
CONF_CANBUS_SEND = "canbus.send"
|
||||||
|
|
||||||
|
|
||||||
def validate_id(id_value, id_ext):
|
def validate_id(id_value, id_ext):
|
||||||
if not id_ext:
|
if not id_ext:
|
||||||
if id_value > 0x7ff:
|
if id_value > 0x7FF:
|
||||||
raise cv.Invalid("Standard IDs must be 11 Bit (0x000-0x7ff / 0-2047)")
|
raise cv.Invalid("Standard IDs must be 11 Bit (0x000-0x7ff / 0-2047)")
|
||||||
|
|
||||||
|
|
||||||
def validate_raw_data(value):
|
def validate_raw_data(value):
|
||||||
if isinstance(value, str):
|
if isinstance(value, str):
|
||||||
return value.encode('utf-8')
|
return value.encode("utf-8")
|
||||||
if isinstance(value, list):
|
if isinstance(value, list):
|
||||||
return cv.Schema([cv.hex_uint8_t])(value)
|
return cv.Schema([cv.hex_uint8_t])(value)
|
||||||
raise cv.Invalid("data must either be a string wrapped in quotes or a list of bytes")
|
raise cv.Invalid(
|
||||||
|
"data must either be a string wrapped in quotes or a list of bytes"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
canbus_ns = cg.esphome_ns.namespace('canbus')
|
canbus_ns = cg.esphome_ns.namespace("canbus")
|
||||||
CanbusComponent = canbus_ns.class_('CanbusComponent', cg.Component)
|
CanbusComponent = canbus_ns.class_("CanbusComponent", cg.Component)
|
||||||
CanbusTrigger = canbus_ns.class_('CanbusTrigger',
|
CanbusTrigger = canbus_ns.class_(
|
||||||
automation.Trigger.template(cg.std_vector.template(cg.uint8)),
|
"CanbusTrigger",
|
||||||
cg.Component)
|
automation.Trigger.template(cg.std_vector.template(cg.uint8)),
|
||||||
CanSpeed = canbus_ns.enum('CAN_SPEED')
|
cg.Component,
|
||||||
|
)
|
||||||
|
CanSpeed = canbus_ns.enum("CAN_SPEED")
|
||||||
|
|
||||||
CAN_SPEEDS = {
|
CAN_SPEEDS = {
|
||||||
'5KBPS': CanSpeed.CAN_5KBPS,
|
"5KBPS": CanSpeed.CAN_5KBPS,
|
||||||
'10KBPS': CanSpeed.CAN_10KBPS,
|
"10KBPS": CanSpeed.CAN_10KBPS,
|
||||||
'20KBPS': CanSpeed.CAN_20KBPS,
|
"20KBPS": CanSpeed.CAN_20KBPS,
|
||||||
'31K25BPS': CanSpeed.CAN_31K25BPS,
|
"31K25BPS": CanSpeed.CAN_31K25BPS,
|
||||||
'33KBPS': CanSpeed.CAN_33KBPS,
|
"33KBPS": CanSpeed.CAN_33KBPS,
|
||||||
'40KBPS': CanSpeed.CAN_40KBPS,
|
"40KBPS": CanSpeed.CAN_40KBPS,
|
||||||
'50KBPS': CanSpeed.CAN_50KBPS,
|
"50KBPS": CanSpeed.CAN_50KBPS,
|
||||||
'80KBPS': CanSpeed.CAN_80KBPS,
|
"80KBPS": CanSpeed.CAN_80KBPS,
|
||||||
'83K3BPS': CanSpeed.CAN_83K3BPS,
|
"83K3BPS": CanSpeed.CAN_83K3BPS,
|
||||||
'95KBPS': CanSpeed.CAN_95KBPS,
|
"95KBPS": CanSpeed.CAN_95KBPS,
|
||||||
'100KBPS': CanSpeed.CAN_100KBPS,
|
"100KBPS": CanSpeed.CAN_100KBPS,
|
||||||
'125KBPS': CanSpeed.CAN_125KBPS,
|
"125KBPS": CanSpeed.CAN_125KBPS,
|
||||||
'200KBPS': CanSpeed.CAN_200KBPS,
|
"200KBPS": CanSpeed.CAN_200KBPS,
|
||||||
'250KBPS': CanSpeed.CAN_250KBPS,
|
"250KBPS": CanSpeed.CAN_250KBPS,
|
||||||
'500KBPS': CanSpeed.CAN_500KBPS,
|
"500KBPS": CanSpeed.CAN_500KBPS,
|
||||||
'1000KBPS': CanSpeed.CAN_1000KBPS,
|
"1000KBPS": CanSpeed.CAN_1000KBPS,
|
||||||
}
|
}
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.Schema({
|
CONFIG_SCHEMA = cv.Schema(
|
||||||
cv.GenerateID(): cv.declare_id(CanbusComponent),
|
{
|
||||||
cv.Required(CONF_CAN_ID): cv.int_range(min=0, max=0x1fffffff),
|
cv.GenerateID(): cv.declare_id(CanbusComponent),
|
||||||
cv.Optional(CONF_BIT_RATE, default='125KBPS'): cv.enum(CAN_SPEEDS, upper=True),
|
cv.Required(CONF_CAN_ID): cv.int_range(min=0, max=0x1FFFFFFF),
|
||||||
cv.Optional(CONF_USE_EXTENDED_ID, default=False): cv.boolean,
|
cv.Optional(CONF_BIT_RATE, default="125KBPS"): cv.enum(CAN_SPEEDS, upper=True),
|
||||||
cv.Optional(CONF_ON_FRAME): automation.validate_automation({
|
|
||||||
cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(CanbusTrigger),
|
|
||||||
cv.GenerateID(CONF_CAN_ID): cv.int_range(min=0, max=0x1fffffff),
|
|
||||||
cv.Optional(CONF_USE_EXTENDED_ID, default=False): cv.boolean,
|
cv.Optional(CONF_USE_EXTENDED_ID, default=False): cv.boolean,
|
||||||
}),
|
cv.Optional(CONF_ON_FRAME): automation.validate_automation(
|
||||||
}).extend(cv.COMPONENT_SCHEMA)
|
{
|
||||||
|
cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(CanbusTrigger),
|
||||||
|
cv.GenerateID(CONF_CAN_ID): cv.int_range(min=0, max=0x1FFFFFFF),
|
||||||
|
cv.Optional(CONF_USE_EXTENDED_ID, default=False): cv.boolean,
|
||||||
|
}
|
||||||
|
),
|
||||||
|
}
|
||||||
|
).extend(cv.COMPONENT_SCHEMA)
|
||||||
|
|
||||||
|
|
||||||
@coroutine
|
@coroutine
|
||||||
@@ -82,7 +90,9 @@ def setup_canbus_core_(var, config):
|
|||||||
validate_id(can_id, ext_id)
|
validate_id(can_id, ext_id)
|
||||||
trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var, can_id, ext_id)
|
trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var, can_id, ext_id)
|
||||||
yield cg.register_component(trigger, conf)
|
yield cg.register_component(trigger, conf)
|
||||||
yield automation.build_automation(trigger, [(cg.std_vector.template(cg.uint8), 'x')], conf)
|
yield automation.build_automation(
|
||||||
|
trigger, [(cg.std_vector.template(cg.uint8), "x")], conf
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@coroutine
|
@coroutine
|
||||||
@@ -93,14 +103,19 @@ def register_canbus(var, config):
|
|||||||
|
|
||||||
|
|
||||||
# Actions
|
# Actions
|
||||||
@automation.register_action(CONF_CANBUS_SEND,
|
@automation.register_action(
|
||||||
canbus_ns.class_('CanbusSendAction', automation.Action),
|
CONF_CANBUS_SEND,
|
||||||
cv.maybe_simple_value({
|
canbus_ns.class_("CanbusSendAction", automation.Action),
|
||||||
cv.GenerateID(CONF_CANBUS_ID): cv.use_id(CanbusComponent),
|
cv.maybe_simple_value(
|
||||||
cv.Optional(CONF_CAN_ID): cv.int_range(min=0, max=0x1fffffff),
|
{
|
||||||
cv.Optional(CONF_USE_EXTENDED_ID, default=False): cv.boolean,
|
cv.GenerateID(CONF_CANBUS_ID): cv.use_id(CanbusComponent),
|
||||||
cv.Required(CONF_DATA): cv.templatable(validate_raw_data),
|
cv.Optional(CONF_CAN_ID): cv.int_range(min=0, max=0x1FFFFFFF),
|
||||||
}, key=CONF_DATA))
|
cv.Optional(CONF_USE_EXTENDED_ID, default=False): cv.boolean,
|
||||||
|
cv.Required(CONF_DATA): cv.templatable(validate_raw_data),
|
||||||
|
},
|
||||||
|
key=CONF_DATA,
|
||||||
|
),
|
||||||
|
)
|
||||||
def canbus_action_to_code(config, action_id, template_arg, args):
|
def canbus_action_to_code(config, action_id, template_arg, args):
|
||||||
validate_id(config[CONF_CAN_ID], config[CONF_USE_EXTENDED_ID])
|
validate_id(config[CONF_CAN_ID], config[CONF_USE_EXTENDED_ID])
|
||||||
var = cg.new_Pvariable(action_id, template_arg)
|
var = cg.new_Pvariable(action_id, template_arg)
|
||||||
@@ -110,7 +125,9 @@ def canbus_action_to_code(config, action_id, template_arg, args):
|
|||||||
can_id = yield cg.templatable(config[CONF_CAN_ID], args, cg.uint32)
|
can_id = yield cg.templatable(config[CONF_CAN_ID], args, cg.uint32)
|
||||||
cg.add(var.set_can_id(can_id))
|
cg.add(var.set_can_id(can_id))
|
||||||
|
|
||||||
use_extended_id = yield cg.templatable(config[CONF_USE_EXTENDED_ID], args, cg.uint32)
|
use_extended_id = yield cg.templatable(
|
||||||
|
config[CONF_USE_EXTENDED_ID], args, cg.uint32
|
||||||
|
)
|
||||||
cg.add(var.set_use_extended_id(use_extended_id))
|
cg.add(var.set_use_extended_id(use_extended_id))
|
||||||
|
|
||||||
data = config[CONF_DATA]
|
data = config[CONF_DATA]
|
||||||
|
|||||||
@@ -5,17 +5,21 @@ from esphome.components.web_server_base import CONF_WEB_SERVER_BASE_ID
|
|||||||
from esphome.const import CONF_ID
|
from esphome.const import CONF_ID
|
||||||
from esphome.core import coroutine_with_priority
|
from esphome.core import coroutine_with_priority
|
||||||
|
|
||||||
AUTO_LOAD = ['web_server_base']
|
AUTO_LOAD = ["web_server_base"]
|
||||||
DEPENDENCIES = ['wifi']
|
DEPENDENCIES = ["wifi"]
|
||||||
CODEOWNERS = ['@OttoWinter']
|
CODEOWNERS = ["@OttoWinter"]
|
||||||
|
|
||||||
captive_portal_ns = cg.esphome_ns.namespace('captive_portal')
|
captive_portal_ns = cg.esphome_ns.namespace("captive_portal")
|
||||||
CaptivePortal = captive_portal_ns.class_('CaptivePortal', cg.Component)
|
CaptivePortal = captive_portal_ns.class_("CaptivePortal", cg.Component)
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.Schema({
|
CONFIG_SCHEMA = cv.Schema(
|
||||||
cv.GenerateID(): cv.declare_id(CaptivePortal),
|
{
|
||||||
cv.GenerateID(CONF_WEB_SERVER_BASE_ID): cv.use_id(web_server_base.WebServerBase),
|
cv.GenerateID(): cv.declare_id(CaptivePortal),
|
||||||
}).extend(cv.COMPONENT_SCHEMA)
|
cv.GenerateID(CONF_WEB_SERVER_BASE_ID): cv.use_id(
|
||||||
|
web_server_base.WebServerBase
|
||||||
|
),
|
||||||
|
}
|
||||||
|
).extend(cv.COMPONENT_SCHEMA)
|
||||||
|
|
||||||
|
|
||||||
@coroutine_with_priority(64.0)
|
@coroutine_with_priority(64.0)
|
||||||
@@ -24,4 +28,4 @@ def to_code(config):
|
|||||||
|
|
||||||
var = cg.new_Pvariable(config[CONF_ID], paren)
|
var = cg.new_Pvariable(config[CONF_ID], paren)
|
||||||
yield cg.register_component(var, config)
|
yield cg.register_component(var, config)
|
||||||
cg.add_define('USE_CAPTIVE_PORTAL')
|
cg.add_define("USE_CAPTIVE_PORTAL")
|
||||||
|
|||||||
@@ -1,28 +1,46 @@
|
|||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.components import i2c, sensor
|
from esphome.components import i2c, sensor
|
||||||
from esphome.const import CONF_ID, DEVICE_CLASS_EMPTY, ICON_RADIATOR, UNIT_PARTS_PER_MILLION, \
|
from esphome.const import (
|
||||||
UNIT_PARTS_PER_BILLION, CONF_TEMPERATURE, CONF_TVOC, CONF_HUMIDITY, ICON_MOLECULE_CO2
|
CONF_ID,
|
||||||
|
DEVICE_CLASS_EMPTY,
|
||||||
|
ICON_RADIATOR,
|
||||||
|
UNIT_PARTS_PER_MILLION,
|
||||||
|
UNIT_PARTS_PER_BILLION,
|
||||||
|
CONF_TEMPERATURE,
|
||||||
|
CONF_TVOC,
|
||||||
|
CONF_HUMIDITY,
|
||||||
|
ICON_MOLECULE_CO2,
|
||||||
|
)
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ["i2c"]
|
||||||
|
|
||||||
ccs811_ns = cg.esphome_ns.namespace('ccs811')
|
ccs811_ns = cg.esphome_ns.namespace("ccs811")
|
||||||
CCS811Component = ccs811_ns.class_('CCS811Component', cg.PollingComponent, i2c.I2CDevice)
|
CCS811Component = ccs811_ns.class_(
|
||||||
|
"CCS811Component", cg.PollingComponent, i2c.I2CDevice
|
||||||
|
)
|
||||||
|
|
||||||
CONF_ECO2 = 'eco2'
|
CONF_ECO2 = "eco2"
|
||||||
CONF_BASELINE = 'baseline'
|
CONF_BASELINE = "baseline"
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.Schema({
|
CONFIG_SCHEMA = (
|
||||||
cv.GenerateID(): cv.declare_id(CCS811Component),
|
cv.Schema(
|
||||||
cv.Required(CONF_ECO2): sensor.sensor_schema(UNIT_PARTS_PER_MILLION, ICON_MOLECULE_CO2,
|
{
|
||||||
0, DEVICE_CLASS_EMPTY),
|
cv.GenerateID(): cv.declare_id(CCS811Component),
|
||||||
cv.Required(CONF_TVOC): sensor.sensor_schema(UNIT_PARTS_PER_BILLION, ICON_RADIATOR,
|
cv.Required(CONF_ECO2): sensor.sensor_schema(
|
||||||
0, DEVICE_CLASS_EMPTY),
|
UNIT_PARTS_PER_MILLION, ICON_MOLECULE_CO2, 0, DEVICE_CLASS_EMPTY
|
||||||
|
),
|
||||||
cv.Optional(CONF_BASELINE): cv.hex_uint16_t,
|
cv.Required(CONF_TVOC): sensor.sensor_schema(
|
||||||
cv.Optional(CONF_TEMPERATURE): cv.use_id(sensor.Sensor),
|
UNIT_PARTS_PER_BILLION, ICON_RADIATOR, 0, DEVICE_CLASS_EMPTY
|
||||||
cv.Optional(CONF_HUMIDITY): cv.use_id(sensor.Sensor),
|
),
|
||||||
}).extend(cv.polling_component_schema('60s')).extend(i2c.i2c_device_schema(0x5A))
|
cv.Optional(CONF_BASELINE): cv.hex_uint16_t,
|
||||||
|
cv.Optional(CONF_TEMPERATURE): cv.use_id(sensor.Sensor),
|
||||||
|
cv.Optional(CONF_HUMIDITY): cv.use_id(sensor.Sensor),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.extend(cv.polling_component_schema("60s"))
|
||||||
|
.extend(i2c.i2c_device_schema(0x5A))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
@@ -2,70 +2,87 @@ import esphome.codegen as cg
|
|||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome import automation
|
from esphome import automation
|
||||||
from esphome.components import mqtt
|
from esphome.components import mqtt
|
||||||
from esphome.const import CONF_AWAY, CONF_ID, CONF_INTERNAL, CONF_MAX_TEMPERATURE, \
|
from esphome.const import (
|
||||||
CONF_MIN_TEMPERATURE, CONF_MODE, CONF_TARGET_TEMPERATURE, \
|
CONF_AWAY,
|
||||||
CONF_TARGET_TEMPERATURE_HIGH, CONF_TARGET_TEMPERATURE_LOW, CONF_TEMPERATURE_STEP, CONF_VISUAL, \
|
CONF_ID,
|
||||||
CONF_MQTT_ID, CONF_NAME, CONF_FAN_MODE, CONF_SWING_MODE
|
CONF_INTERNAL,
|
||||||
|
CONF_MAX_TEMPERATURE,
|
||||||
|
CONF_MIN_TEMPERATURE,
|
||||||
|
CONF_MODE,
|
||||||
|
CONF_TARGET_TEMPERATURE,
|
||||||
|
CONF_TARGET_TEMPERATURE_HIGH,
|
||||||
|
CONF_TARGET_TEMPERATURE_LOW,
|
||||||
|
CONF_TEMPERATURE_STEP,
|
||||||
|
CONF_VISUAL,
|
||||||
|
CONF_MQTT_ID,
|
||||||
|
CONF_NAME,
|
||||||
|
CONF_FAN_MODE,
|
||||||
|
CONF_SWING_MODE,
|
||||||
|
)
|
||||||
from esphome.core import CORE, coroutine, coroutine_with_priority
|
from esphome.core import CORE, coroutine, coroutine_with_priority
|
||||||
|
|
||||||
IS_PLATFORM_COMPONENT = True
|
IS_PLATFORM_COMPONENT = True
|
||||||
|
|
||||||
CODEOWNERS = ['@esphome/core']
|
CODEOWNERS = ["@esphome/core"]
|
||||||
climate_ns = cg.esphome_ns.namespace('climate')
|
climate_ns = cg.esphome_ns.namespace("climate")
|
||||||
|
|
||||||
Climate = climate_ns.class_('Climate', cg.Nameable)
|
Climate = climate_ns.class_("Climate", cg.Nameable)
|
||||||
ClimateCall = climate_ns.class_('ClimateCall')
|
ClimateCall = climate_ns.class_("ClimateCall")
|
||||||
ClimateTraits = climate_ns.class_('ClimateTraits')
|
ClimateTraits = climate_ns.class_("ClimateTraits")
|
||||||
|
|
||||||
ClimateMode = climate_ns.enum('ClimateMode')
|
ClimateMode = climate_ns.enum("ClimateMode")
|
||||||
CLIMATE_MODES = {
|
CLIMATE_MODES = {
|
||||||
'OFF': ClimateMode.CLIMATE_MODE_OFF,
|
"OFF": ClimateMode.CLIMATE_MODE_OFF,
|
||||||
'AUTO': ClimateMode.CLIMATE_MODE_AUTO,
|
"AUTO": ClimateMode.CLIMATE_MODE_AUTO,
|
||||||
'COOL': ClimateMode.CLIMATE_MODE_COOL,
|
"COOL": ClimateMode.CLIMATE_MODE_COOL,
|
||||||
'HEAT': ClimateMode.CLIMATE_MODE_HEAT,
|
"HEAT": ClimateMode.CLIMATE_MODE_HEAT,
|
||||||
'DRY': ClimateMode.CLIMATE_MODE_DRY,
|
"DRY": ClimateMode.CLIMATE_MODE_DRY,
|
||||||
'FAN_ONLY': ClimateMode.CLIMATE_MODE_FAN_ONLY,
|
"FAN_ONLY": ClimateMode.CLIMATE_MODE_FAN_ONLY,
|
||||||
}
|
}
|
||||||
validate_climate_mode = cv.enum(CLIMATE_MODES, upper=True)
|
validate_climate_mode = cv.enum(CLIMATE_MODES, upper=True)
|
||||||
|
|
||||||
ClimateFanMode = climate_ns.enum('ClimateFanMode')
|
ClimateFanMode = climate_ns.enum("ClimateFanMode")
|
||||||
CLIMATE_FAN_MODES = {
|
CLIMATE_FAN_MODES = {
|
||||||
'ON': ClimateFanMode.CLIMATE_FAN_ON,
|
"ON": ClimateFanMode.CLIMATE_FAN_ON,
|
||||||
'OFF': ClimateFanMode.CLIMATE_FAN_OFF,
|
"OFF": ClimateFanMode.CLIMATE_FAN_OFF,
|
||||||
'AUTO': ClimateFanMode.CLIMATE_FAN_AUTO,
|
"AUTO": ClimateFanMode.CLIMATE_FAN_AUTO,
|
||||||
'LOW': ClimateFanMode.CLIMATE_FAN_LOW,
|
"LOW": ClimateFanMode.CLIMATE_FAN_LOW,
|
||||||
'MEDIUM': ClimateFanMode.CLIMATE_FAN_MEDIUM,
|
"MEDIUM": ClimateFanMode.CLIMATE_FAN_MEDIUM,
|
||||||
'HIGH': ClimateFanMode.CLIMATE_FAN_HIGH,
|
"HIGH": ClimateFanMode.CLIMATE_FAN_HIGH,
|
||||||
'MIDDLE': ClimateFanMode.CLIMATE_FAN_MIDDLE,
|
"MIDDLE": ClimateFanMode.CLIMATE_FAN_MIDDLE,
|
||||||
'FOCUS': ClimateFanMode.CLIMATE_FAN_FOCUS,
|
"FOCUS": ClimateFanMode.CLIMATE_FAN_FOCUS,
|
||||||
'DIFFUSE': ClimateFanMode.CLIMATE_FAN_DIFFUSE,
|
"DIFFUSE": ClimateFanMode.CLIMATE_FAN_DIFFUSE,
|
||||||
}
|
}
|
||||||
|
|
||||||
validate_climate_fan_mode = cv.enum(CLIMATE_FAN_MODES, upper=True)
|
validate_climate_fan_mode = cv.enum(CLIMATE_FAN_MODES, upper=True)
|
||||||
|
|
||||||
ClimateSwingMode = climate_ns.enum('ClimateSwingMode')
|
ClimateSwingMode = climate_ns.enum("ClimateSwingMode")
|
||||||
CLIMATE_SWING_MODES = {
|
CLIMATE_SWING_MODES = {
|
||||||
'OFF': ClimateSwingMode.CLIMATE_SWING_OFF,
|
"OFF": ClimateSwingMode.CLIMATE_SWING_OFF,
|
||||||
'BOTH': ClimateSwingMode.CLIMATE_SWING_BOTH,
|
"BOTH": ClimateSwingMode.CLIMATE_SWING_BOTH,
|
||||||
'VERTICAL': ClimateSwingMode.CLIMATE_SWING_VERTICAL,
|
"VERTICAL": ClimateSwingMode.CLIMATE_SWING_VERTICAL,
|
||||||
'HORIZONTAL': ClimateSwingMode.CLIMATE_SWING_HORIZONTAL,
|
"HORIZONTAL": ClimateSwingMode.CLIMATE_SWING_HORIZONTAL,
|
||||||
}
|
}
|
||||||
|
|
||||||
validate_climate_swing_mode = cv.enum(CLIMATE_SWING_MODES, upper=True)
|
validate_climate_swing_mode = cv.enum(CLIMATE_SWING_MODES, upper=True)
|
||||||
|
|
||||||
# Actions
|
# Actions
|
||||||
ControlAction = climate_ns.class_('ControlAction', automation.Action)
|
ControlAction = climate_ns.class_("ControlAction", automation.Action)
|
||||||
|
|
||||||
CLIMATE_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend({
|
CLIMATE_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend(
|
||||||
cv.GenerateID(): cv.declare_id(Climate),
|
{
|
||||||
cv.OnlyWith(CONF_MQTT_ID, 'mqtt'): cv.declare_id(mqtt.MQTTClimateComponent),
|
cv.GenerateID(): cv.declare_id(Climate),
|
||||||
cv.Optional(CONF_VISUAL, default={}): cv.Schema({
|
cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTClimateComponent),
|
||||||
cv.Optional(CONF_MIN_TEMPERATURE): cv.temperature,
|
cv.Optional(CONF_VISUAL, default={}): cv.Schema(
|
||||||
cv.Optional(CONF_MAX_TEMPERATURE): cv.temperature,
|
{
|
||||||
cv.Optional(CONF_TEMPERATURE_STEP): cv.temperature,
|
cv.Optional(CONF_MIN_TEMPERATURE): cv.temperature,
|
||||||
}),
|
cv.Optional(CONF_MAX_TEMPERATURE): cv.temperature,
|
||||||
# TODO: MQTT topic options
|
cv.Optional(CONF_TEMPERATURE_STEP): cv.temperature,
|
||||||
})
|
}
|
||||||
|
),
|
||||||
|
# TODO: MQTT topic options
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@coroutine
|
@coroutine
|
||||||
@@ -94,19 +111,23 @@ def register_climate(var, config):
|
|||||||
yield setup_climate_core_(var, config)
|
yield setup_climate_core_(var, config)
|
||||||
|
|
||||||
|
|
||||||
CLIMATE_CONTROL_ACTION_SCHEMA = cv.Schema({
|
CLIMATE_CONTROL_ACTION_SCHEMA = cv.Schema(
|
||||||
cv.Required(CONF_ID): cv.use_id(Climate),
|
{
|
||||||
cv.Optional(CONF_MODE): cv.templatable(validate_climate_mode),
|
cv.Required(CONF_ID): cv.use_id(Climate),
|
||||||
cv.Optional(CONF_TARGET_TEMPERATURE): cv.templatable(cv.temperature),
|
cv.Optional(CONF_MODE): cv.templatable(validate_climate_mode),
|
||||||
cv.Optional(CONF_TARGET_TEMPERATURE_LOW): cv.templatable(cv.temperature),
|
cv.Optional(CONF_TARGET_TEMPERATURE): cv.templatable(cv.temperature),
|
||||||
cv.Optional(CONF_TARGET_TEMPERATURE_HIGH): cv.templatable(cv.temperature),
|
cv.Optional(CONF_TARGET_TEMPERATURE_LOW): cv.templatable(cv.temperature),
|
||||||
cv.Optional(CONF_AWAY): cv.templatable(cv.boolean),
|
cv.Optional(CONF_TARGET_TEMPERATURE_HIGH): cv.templatable(cv.temperature),
|
||||||
cv.Optional(CONF_FAN_MODE): cv.templatable(validate_climate_fan_mode),
|
cv.Optional(CONF_AWAY): cv.templatable(cv.boolean),
|
||||||
cv.Optional(CONF_SWING_MODE): cv.templatable(validate_climate_swing_mode),
|
cv.Optional(CONF_FAN_MODE): cv.templatable(validate_climate_fan_mode),
|
||||||
})
|
cv.Optional(CONF_SWING_MODE): cv.templatable(validate_climate_swing_mode),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@automation.register_action('climate.control', ControlAction, CLIMATE_CONTROL_ACTION_SCHEMA)
|
@automation.register_action(
|
||||||
|
"climate.control", ControlAction, CLIMATE_CONTROL_ACTION_SCHEMA
|
||||||
|
)
|
||||||
def climate_control_to_code(config, action_id, template_arg, args):
|
def climate_control_to_code(config, action_id, template_arg, args):
|
||||||
paren = yield cg.get_variable(config[CONF_ID])
|
paren = yield cg.get_variable(config[CONF_ID])
|
||||||
var = cg.new_Pvariable(action_id, template_arg, paren)
|
var = cg.new_Pvariable(action_id, template_arg, paren)
|
||||||
@@ -117,10 +138,14 @@ def climate_control_to_code(config, action_id, template_arg, args):
|
|||||||
template_ = yield cg.templatable(config[CONF_TARGET_TEMPERATURE], args, float)
|
template_ = yield cg.templatable(config[CONF_TARGET_TEMPERATURE], args, float)
|
||||||
cg.add(var.set_target_temperature(template_))
|
cg.add(var.set_target_temperature(template_))
|
||||||
if CONF_TARGET_TEMPERATURE_LOW in config:
|
if CONF_TARGET_TEMPERATURE_LOW in config:
|
||||||
template_ = yield cg.templatable(config[CONF_TARGET_TEMPERATURE_LOW], args, float)
|
template_ = yield cg.templatable(
|
||||||
|
config[CONF_TARGET_TEMPERATURE_LOW], args, float
|
||||||
|
)
|
||||||
cg.add(var.set_target_temperature_low(template_))
|
cg.add(var.set_target_temperature_low(template_))
|
||||||
if CONF_TARGET_TEMPERATURE_HIGH in config:
|
if CONF_TARGET_TEMPERATURE_HIGH in config:
|
||||||
template_ = yield cg.templatable(config[CONF_TARGET_TEMPERATURE_HIGH], args, float)
|
template_ = yield cg.templatable(
|
||||||
|
config[CONF_TARGET_TEMPERATURE_HIGH], args, float
|
||||||
|
)
|
||||||
cg.add(var.set_target_temperature_high(template_))
|
cg.add(var.set_target_temperature_high(template_))
|
||||||
if CONF_AWAY in config:
|
if CONF_AWAY in config:
|
||||||
template_ = yield cg.templatable(config[CONF_AWAY], args, bool)
|
template_ = yield cg.templatable(config[CONF_AWAY], args, bool)
|
||||||
@@ -129,12 +154,14 @@ def climate_control_to_code(config, action_id, template_arg, args):
|
|||||||
template_ = yield cg.templatable(config[CONF_FAN_MODE], args, ClimateFanMode)
|
template_ = yield cg.templatable(config[CONF_FAN_MODE], args, ClimateFanMode)
|
||||||
cg.add(var.set_fan_mode(template_))
|
cg.add(var.set_fan_mode(template_))
|
||||||
if CONF_SWING_MODE in config:
|
if CONF_SWING_MODE in config:
|
||||||
template_ = yield cg.templatable(config[CONF_SWING_MODE], args, ClimateSwingMode)
|
template_ = yield cg.templatable(
|
||||||
|
config[CONF_SWING_MODE], args, ClimateSwingMode
|
||||||
|
)
|
||||||
cg.add(var.set_swing_mode(template_))
|
cg.add(var.set_swing_mode(template_))
|
||||||
yield var
|
yield var
|
||||||
|
|
||||||
|
|
||||||
@coroutine_with_priority(100.0)
|
@coroutine_with_priority(100.0)
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
cg.add_define('USE_CLIMATE')
|
cg.add_define("USE_CLIMATE")
|
||||||
cg.add_global(climate_ns.using)
|
cg.add_global(climate_ns.using)
|
||||||
|
|||||||
@@ -1,27 +1,42 @@
|
|||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.components import climate, remote_transmitter, remote_receiver, sensor, remote_base
|
from esphome.components import (
|
||||||
|
climate,
|
||||||
|
remote_transmitter,
|
||||||
|
remote_receiver,
|
||||||
|
sensor,
|
||||||
|
remote_base,
|
||||||
|
)
|
||||||
from esphome.components.remote_base import CONF_RECEIVER_ID, CONF_TRANSMITTER_ID
|
from esphome.components.remote_base import CONF_RECEIVER_ID, CONF_TRANSMITTER_ID
|
||||||
from esphome.const import CONF_SUPPORTS_COOL, CONF_SUPPORTS_HEAT, CONF_SENSOR
|
from esphome.const import CONF_SUPPORTS_COOL, CONF_SUPPORTS_HEAT, CONF_SENSOR
|
||||||
from esphome.core import coroutine
|
from esphome.core import coroutine
|
||||||
|
|
||||||
AUTO_LOAD = ['sensor', 'remote_base']
|
AUTO_LOAD = ["sensor", "remote_base"]
|
||||||
CODEOWNERS = ['@glmnet']
|
CODEOWNERS = ["@glmnet"]
|
||||||
|
|
||||||
climate_ir_ns = cg.esphome_ns.namespace('climate_ir')
|
climate_ir_ns = cg.esphome_ns.namespace("climate_ir")
|
||||||
ClimateIR = climate_ir_ns.class_('ClimateIR', climate.Climate, cg.Component,
|
ClimateIR = climate_ir_ns.class_(
|
||||||
remote_base.RemoteReceiverListener)
|
"ClimateIR", climate.Climate, cg.Component, remote_base.RemoteReceiverListener
|
||||||
|
)
|
||||||
|
|
||||||
CLIMATE_IR_SCHEMA = climate.CLIMATE_SCHEMA.extend({
|
CLIMATE_IR_SCHEMA = climate.CLIMATE_SCHEMA.extend(
|
||||||
cv.GenerateID(CONF_TRANSMITTER_ID): cv.use_id(remote_transmitter.RemoteTransmitterComponent),
|
{
|
||||||
cv.Optional(CONF_SUPPORTS_COOL, default=True): cv.boolean,
|
cv.GenerateID(CONF_TRANSMITTER_ID): cv.use_id(
|
||||||
cv.Optional(CONF_SUPPORTS_HEAT, default=True): cv.boolean,
|
remote_transmitter.RemoteTransmitterComponent
|
||||||
cv.Optional(CONF_SENSOR): cv.use_id(sensor.Sensor),
|
),
|
||||||
}).extend(cv.COMPONENT_SCHEMA)
|
cv.Optional(CONF_SUPPORTS_COOL, default=True): cv.boolean,
|
||||||
|
cv.Optional(CONF_SUPPORTS_HEAT, default=True): cv.boolean,
|
||||||
|
cv.Optional(CONF_SENSOR): cv.use_id(sensor.Sensor),
|
||||||
|
}
|
||||||
|
).extend(cv.COMPONENT_SCHEMA)
|
||||||
|
|
||||||
CLIMATE_IR_WITH_RECEIVER_SCHEMA = CLIMATE_IR_SCHEMA.extend({
|
CLIMATE_IR_WITH_RECEIVER_SCHEMA = CLIMATE_IR_SCHEMA.extend(
|
||||||
cv.Optional(CONF_RECEIVER_ID): cv.use_id(remote_receiver.RemoteReceiverComponent),
|
{
|
||||||
})
|
cv.Optional(CONF_RECEIVER_ID): cv.use_id(
|
||||||
|
remote_receiver.RemoteReceiverComponent
|
||||||
|
),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@coroutine
|
@coroutine
|
||||||
|
|||||||
@@ -3,25 +3,37 @@ import esphome.config_validation as cv
|
|||||||
from esphome.components import climate_ir
|
from esphome.components import climate_ir
|
||||||
from esphome.const import CONF_ID
|
from esphome.const import CONF_ID
|
||||||
|
|
||||||
AUTO_LOAD = ['climate_ir']
|
AUTO_LOAD = ["climate_ir"]
|
||||||
|
|
||||||
climate_ir_lg_ns = cg.esphome_ns.namespace('climate_ir_lg')
|
climate_ir_lg_ns = cg.esphome_ns.namespace("climate_ir_lg")
|
||||||
LgIrClimate = climate_ir_lg_ns.class_('LgIrClimate', climate_ir.ClimateIR)
|
LgIrClimate = climate_ir_lg_ns.class_("LgIrClimate", climate_ir.ClimateIR)
|
||||||
|
|
||||||
CONF_HEADER_HIGH = 'header_high'
|
CONF_HEADER_HIGH = "header_high"
|
||||||
CONF_HEADER_LOW = 'header_low'
|
CONF_HEADER_LOW = "header_low"
|
||||||
CONF_BIT_HIGH = 'bit_high'
|
CONF_BIT_HIGH = "bit_high"
|
||||||
CONF_BIT_ONE_LOW = 'bit_one_low'
|
CONF_BIT_ONE_LOW = "bit_one_low"
|
||||||
CONF_BIT_ZERO_LOW = 'bit_zero_low'
|
CONF_BIT_ZERO_LOW = "bit_zero_low"
|
||||||
|
|
||||||
CONFIG_SCHEMA = climate_ir.CLIMATE_IR_WITH_RECEIVER_SCHEMA.extend({
|
CONFIG_SCHEMA = climate_ir.CLIMATE_IR_WITH_RECEIVER_SCHEMA.extend(
|
||||||
cv.GenerateID(): cv.declare_id(LgIrClimate),
|
{
|
||||||
cv.Optional(CONF_HEADER_HIGH, default='8000us'): cv.positive_time_period_microseconds,
|
cv.GenerateID(): cv.declare_id(LgIrClimate),
|
||||||
cv.Optional(CONF_HEADER_LOW, default='4000us'): cv.positive_time_period_microseconds,
|
cv.Optional(
|
||||||
cv.Optional(CONF_BIT_HIGH, default='600us'): cv.positive_time_period_microseconds,
|
CONF_HEADER_HIGH, default="8000us"
|
||||||
cv.Optional(CONF_BIT_ONE_LOW, default='1600us'): cv.positive_time_period_microseconds,
|
): cv.positive_time_period_microseconds,
|
||||||
cv.Optional(CONF_BIT_ZERO_LOW, default='550us'): cv.positive_time_period_microseconds,
|
cv.Optional(
|
||||||
})
|
CONF_HEADER_LOW, default="4000us"
|
||||||
|
): cv.positive_time_period_microseconds,
|
||||||
|
cv.Optional(
|
||||||
|
CONF_BIT_HIGH, default="600us"
|
||||||
|
): cv.positive_time_period_microseconds,
|
||||||
|
cv.Optional(
|
||||||
|
CONF_BIT_ONE_LOW, default="1600us"
|
||||||
|
): cv.positive_time_period_microseconds,
|
||||||
|
cv.Optional(
|
||||||
|
CONF_BIT_ZERO_LOW, default="550us"
|
||||||
|
): cv.positive_time_period_microseconds,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user