mirror of
https://github.com/esphome/esphome.git
synced 2024-11-25 00:18:11 +01:00
Clean up time API (#221)
This commit is contained in:
parent
3ec931ffa4
commit
a9e799cb06
2 changed files with 56 additions and 30 deletions
|
@ -8,7 +8,7 @@ import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml import automation
|
from esphomeyaml import automation
|
||||||
from esphomeyaml.const import CONF_CRON, CONF_DAYS_OF_MONTH, CONF_DAYS_OF_WEEK, CONF_HOURS, \
|
from esphomeyaml.const import CONF_CRON, CONF_DAYS_OF_MONTH, CONF_DAYS_OF_WEEK, CONF_HOURS, \
|
||||||
CONF_MINUTES, CONF_MONTHS, CONF_ON_TIME, CONF_SECONDS, CONF_TIMEZONE, CONF_TRIGGER_ID
|
CONF_MINUTES, CONF_MONTHS, CONF_ON_TIME, CONF_SECONDS, CONF_TIMEZONE, CONF_TRIGGER_ID
|
||||||
from esphomeyaml.helpers import App, NoArg, Pvariable, add, add_job, esphomelib_ns
|
from esphomeyaml.helpers import App, NoArg, Pvariable, add, add_job, esphomelib_ns, ArrayInitializer
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -47,18 +47,8 @@ def _tz_dst_str(dt):
|
||||||
_tz_timedelta(td))
|
_tz_timedelta(td))
|
||||||
|
|
||||||
|
|
||||||
def detect_tz():
|
def convert_tz(pytz_obj):
|
||||||
try:
|
tz = pytz_obj
|
||||||
import tzlocal
|
|
||||||
import pytz
|
|
||||||
except ImportError:
|
|
||||||
raise vol.Invalid("No timezone specified and 'tzlocal' not installed. To automatically "
|
|
||||||
"detect the timezone please install tzlocal (pip2 install tzlocal)")
|
|
||||||
try:
|
|
||||||
tz = tzlocal.get_localzone()
|
|
||||||
except pytz.exceptions.UnknownTimeZoneError:
|
|
||||||
_LOGGER.warning("Could not auto-detect timezone. Using UTC...")
|
|
||||||
return 'UTC'
|
|
||||||
|
|
||||||
def _dst(dt, is_dst):
|
def _dst(dt, is_dst):
|
||||||
try:
|
try:
|
||||||
|
@ -107,18 +97,34 @@ def detect_tz():
|
||||||
tzbase = '{}{}'.format(norm_tzname, _tz_timedelta(-1 * norm_utcoffset))
|
tzbase = '{}{}'.format(norm_tzname, _tz_timedelta(-1 * norm_utcoffset))
|
||||||
if dst_begins is None:
|
if dst_begins is None:
|
||||||
# No DST in this timezone
|
# No DST in this timezone
|
||||||
_LOGGER.info("Auto-detected timezone '%s' with UTC offset %s",
|
_LOGGER.info("Detected timezone '%s' with UTC offset %s",
|
||||||
norm_tzname, _tz_timedelta(norm_utcoffset))
|
norm_tzname, _tz_timedelta(norm_utcoffset))
|
||||||
return tzbase
|
return tzbase
|
||||||
tzext = '{}{},{},{}'.format(dst_tzname, _tz_timedelta(-1 * dst_utcoffset),
|
tzext = '{}{},{},{}'.format(dst_tzname, _tz_timedelta(-1 * dst_utcoffset),
|
||||||
_tz_dst_str(dst_begins), _tz_dst_str(dst_ends))
|
_tz_dst_str(dst_begins), _tz_dst_str(dst_ends))
|
||||||
_LOGGER.info("Auto-detected timezone '%s' with UTC offset %s and daylight savings time from "
|
_LOGGER.info("Detected timezone '%s' with UTC offset %s and daylight savings time from "
|
||||||
"%s to %s",
|
"%s to %s",
|
||||||
norm_tzname, _tz_timedelta(norm_utcoffset), dst_begins.strftime("%x %X"),
|
norm_tzname, _tz_timedelta(norm_utcoffset), dst_begins.strftime("%x %X"),
|
||||||
dst_ends.strftime("%x %X"))
|
dst_ends.strftime("%x %X"))
|
||||||
return tzbase + tzext
|
return tzbase + tzext
|
||||||
|
|
||||||
|
|
||||||
|
def detect_tz():
|
||||||
|
try:
|
||||||
|
import tzlocal
|
||||||
|
import pytz
|
||||||
|
except ImportError:
|
||||||
|
raise vol.Invalid("No timezone specified and 'tzlocal' not installed. To automatically "
|
||||||
|
"detect the timezone please install tzlocal (pip2 install tzlocal)")
|
||||||
|
try:
|
||||||
|
tz = tzlocal.get_localzone()
|
||||||
|
except pytz.exceptions.UnknownTimeZoneError:
|
||||||
|
_LOGGER.warning("Could not auto-detect timezone. Using UTC...")
|
||||||
|
return 'UTC'
|
||||||
|
|
||||||
|
return convert_tz(tz)
|
||||||
|
|
||||||
|
|
||||||
def _parse_cron_int(value, special_mapping, message):
|
def _parse_cron_int(value, special_mapping, message):
|
||||||
special_mapping = special_mapping or {}
|
special_mapping = special_mapping or {}
|
||||||
if isinstance(value, (str, unicode)) and value in special_mapping:
|
if isinstance(value, (str, unicode)) and value in special_mapping:
|
||||||
|
@ -233,8 +239,19 @@ def validate_cron_keys(value):
|
||||||
return cv.has_at_least_one_key(*CRON_KEYS)(value)
|
return cv.has_at_least_one_key(*CRON_KEYS)(value)
|
||||||
|
|
||||||
|
|
||||||
|
def validate_tz(value):
|
||||||
|
value = cv.string_strict(value)
|
||||||
|
|
||||||
|
try:
|
||||||
|
import pytz
|
||||||
|
|
||||||
|
return convert_tz(pytz.timezone(value))
|
||||||
|
except Exception: # pylint: disable=broad-except
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
TIME_PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
TIME_PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||||
vol.Optional(CONF_TIMEZONE, default=detect_tz): cv.string,
|
vol.Optional(CONF_TIMEZONE, default=detect_tz): validate_tz,
|
||||||
vol.Optional(CONF_ON_TIME): automation.validate_automation({
|
vol.Optional(CONF_ON_TIME): automation.validate_automation({
|
||||||
cv.GenerateID(CONF_TRIGGER_ID): cv.declare_variable_id(CronTrigger),
|
cv.GenerateID(CONF_TRIGGER_ID): cv.declare_variable_id(CronTrigger),
|
||||||
vol.Optional(CONF_SECONDS): validate_cron_seconds,
|
vol.Optional(CONF_SECONDS): validate_cron_seconds,
|
||||||
|
@ -254,18 +271,25 @@ def setup_time_core_(time_var, config):
|
||||||
for conf in config.get(CONF_ON_TIME, []):
|
for conf in config.get(CONF_ON_TIME, []):
|
||||||
rhs = App.register_component(time_var.Pmake_cron_trigger())
|
rhs = App.register_component(time_var.Pmake_cron_trigger())
|
||||||
trigger = Pvariable(conf[CONF_TRIGGER_ID], rhs)
|
trigger = Pvariable(conf[CONF_TRIGGER_ID], rhs)
|
||||||
for second in conf.get(CONF_SECONDS, [x for x in range(0, 61)]):
|
|
||||||
add(trigger.add_second(second))
|
seconds = conf.get(CONF_SECONDS, [x for x in range(0, 61)])
|
||||||
for minute in conf.get(CONF_MINUTES, [x for x in range(0, 60)]):
|
add(trigger.add_seconds(ArrayInitializer(*seconds, multiline=False)))
|
||||||
add(trigger.add_minute(minute))
|
|
||||||
for hour in conf.get(CONF_HOURS, [x for x in range(0, 24)]):
|
minutes = conf.get(CONF_MINUTES, [x for x in range(0, 60)])
|
||||||
add(trigger.add_hour(hour))
|
add(trigger.add_minutes(ArrayInitializer(*minutes, multiline=False)))
|
||||||
for day_of_month in conf.get(CONF_DAYS_OF_MONTH, [x for x in range(1, 32)]):
|
|
||||||
add(trigger.add_day_of_month(day_of_month))
|
hours = conf.get(CONF_HOURS, [x for x in range(0, 24)])
|
||||||
for month in conf.get(CONF_MONTHS, [x for x in range(1, 13)]):
|
add(trigger.add_hours(ArrayInitializer(*hours, multiline=False)))
|
||||||
add(trigger.add_month(month))
|
|
||||||
for day_of_week in conf.get(CONF_DAYS_OF_WEEK, [x for x in range(1, 8)]):
|
days_of_month = conf.get(CONF_DAYS_OF_MONTH, [x for x in range(1, 32)])
|
||||||
add(trigger.add_day_of_week(day_of_week))
|
add(trigger.add_days_of_month(ArrayInitializer(*days_of_month, multiline=False)))
|
||||||
|
|
||||||
|
months = conf.get(CONF_MONTHS, [x for x in range(1, 13)])
|
||||||
|
add(trigger.add_months(ArrayInitializer(*months, multiline=False)))
|
||||||
|
|
||||||
|
days_of_week = conf.get(CONF_DAYS_OF_WEEK, [x for x in range(1, 8)])
|
||||||
|
add(trigger.add_days_of_week(ArrayInitializer(*days_of_week, multiline=False)))
|
||||||
|
|
||||||
automation.build_automation(trigger, NoArg, conf)
|
automation.build_automation(trigger, NoArg, conf)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ import voluptuous as vol
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import time as time_
|
from esphomeyaml.components import time as time_
|
||||||
from esphomeyaml.const import CONF_ID, CONF_LAMBDA, CONF_SERVERS
|
from esphomeyaml.const import CONF_ID, CONF_LAMBDA, CONF_SERVERS
|
||||||
from esphomeyaml.helpers import App, Pvariable
|
from esphomeyaml.helpers import App, Pvariable, add
|
||||||
|
|
||||||
SNTPComponent = time_.time_ns.SNTPComponent
|
SNTPComponent = time_.time_ns.SNTPComponent
|
||||||
|
|
||||||
|
@ -15,8 +15,10 @@ PLATFORM_SCHEMA = time_.TIME_PLATFORM_SCHEMA.extend({
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
rhs = App.make_sntp_component(*config.get(CONF_SERVERS, []))
|
rhs = App.make_sntp_component()
|
||||||
sntp = Pvariable(config[CONF_ID], rhs)
|
sntp = Pvariable(config[CONF_ID], rhs)
|
||||||
|
if CONF_SERVERS in config:
|
||||||
|
add(sntp.set_servers(*config[CONF_SERVERS]))
|
||||||
|
|
||||||
time_.setup_time(sntp, config)
|
time_.setup_time(sntp, config)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue