1
0
mirror of https://github.com/esphome/esphome.git synced 2025-03-15 15:18:16 +00:00

Add time trigger at

This commit is contained in:
Otto Winter 2019-03-30 11:46:40 +01:00
parent 1f7e1daa73
commit c941e52cab
No known key found for this signature in database
GPG Key ID: DB66C0BE6013F97E
3 changed files with 48 additions and 2 deletions

View File

@ -7,7 +7,8 @@ import voluptuous as vol
from esphome import automation from esphome import automation
import esphome.config_validation as cv import esphome.config_validation as cv
from esphome.const import CONF_CRON, CONF_DAYS_OF_MONTH, CONF_DAYS_OF_WEEK, CONF_HOURS, \ from esphome.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, CONF_AT, \
CONF_SECOND, CONF_HOUR, CONF_MINUTE
from esphome.core import CORE from esphome.core import CORE
from esphome.cpp_generator import Pvariable, add from esphome.cpp_generator import Pvariable, add
from esphome.cpp_types import App, Component, Trigger, esphome_ns from esphome.cpp_types import App, Component, Trigger, esphome_ns
@ -232,15 +233,37 @@ def validate_cron_raw(value):
} }
def validate_time_at(value):
value = cv.time_of_day(value)
return {
CONF_HOURS: [value[CONF_HOUR]],
CONF_MINUTES: [value[CONF_MINUTE]],
CONF_SECONDS: [value[CONF_SECOND]],
CONF_DAYS_OF_MONTH: validate_cron_days_of_month('*'),
CONF_MONTHS: validate_cron_months('*'),
CONF_DAYS_OF_WEEK: validate_cron_days_of_week('*'),
}
def validate_cron_keys(value): def validate_cron_keys(value):
if CONF_CRON in value: if CONF_CRON in value:
for key in value.keys(): for key in value.keys():
if key in CRON_KEYS: if key in CRON_KEYS:
raise vol.Invalid("Cannot use option {} when cron: is specified.".format(key)) raise vol.Invalid("Cannot use option {} when cron: is specified.".format(key))
if CONF_AT in value:
raise vol.Invalid("Cannot use option at with cron!")
cron_ = value[CONF_CRON] cron_ = value[CONF_CRON]
value = {x: value[x] for x in value if x != CONF_CRON} value = {x: value[x] for x in value if x != CONF_CRON}
value.update(cron_) value.update(cron_)
return value return value
elif CONF_AT in value:
for key in value.keys():
if key in CRON_KEYS:
raise vol.Invalid("Cannot use option {} when at: is specified.".format(key))
at_ = value[CONF_AT]
value = {x: value[x] for x in value if x != CONF_AT}
value.update(at_)
return value
return cv.has_at_least_one_key(*CRON_KEYS)(value) return cv.has_at_least_one_key(*CRON_KEYS)(value)
@ -266,6 +289,7 @@ TIME_PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Optional(CONF_MONTHS): validate_cron_months, vol.Optional(CONF_MONTHS): validate_cron_months,
vol.Optional(CONF_DAYS_OF_WEEK): validate_cron_days_of_week, vol.Optional(CONF_DAYS_OF_WEEK): validate_cron_days_of_week,
vol.Optional(CONF_CRON): validate_cron_raw, vol.Optional(CONF_CRON): validate_cron_raw,
vol.Optional(CONF_AT): validate_time_at,
}, validate_cron_keys), }, validate_cron_keys),
}) })

View File

@ -2,6 +2,7 @@
"""Helpers for config validation using voluptuous.""" """Helpers for config validation using voluptuous."""
from __future__ import print_function from __future__ import print_function
from datetime import datetime
import logging import logging
import os import os
import re import re
@ -13,7 +14,7 @@ from esphome import core
from esphome.const import CONF_AVAILABILITY, CONF_COMMAND_TOPIC, CONF_DISCOVERY, CONF_ID, \ from esphome.const import CONF_AVAILABILITY, CONF_COMMAND_TOPIC, CONF_DISCOVERY, CONF_ID, \
CONF_INTERNAL, CONF_NAME, CONF_PAYLOAD_AVAILABLE, CONF_PAYLOAD_NOT_AVAILABLE, CONF_PLATFORM, \ CONF_INTERNAL, CONF_NAME, CONF_PAYLOAD_AVAILABLE, CONF_PAYLOAD_NOT_AVAILABLE, CONF_PLATFORM, \
CONF_RETAIN, CONF_SETUP_PRIORITY, CONF_STATE_TOPIC, CONF_TOPIC, ESP_PLATFORM_ESP32, \ CONF_RETAIN, CONF_SETUP_PRIORITY, CONF_STATE_TOPIC, CONF_TOPIC, ESP_PLATFORM_ESP32, \
ESP_PLATFORM_ESP8266 ESP_PLATFORM_ESP8266, CONF_HOURS, CONF_HOUR, CONF_MINUTE, CONF_SECOND
from esphome.core import CORE, HexInt, IPAddress, Lambda, TimePeriod, TimePeriodMicroseconds, \ from esphome.core import CORE, HexInt, IPAddress, Lambda, TimePeriod, TimePeriodMicroseconds, \
TimePeriodMilliseconds, TimePeriodSeconds, TimePeriodMinutes TimePeriodMilliseconds, TimePeriodSeconds, TimePeriodMinutes
from esphome.py_compat import integer_types, string_types, text_type from esphome.py_compat import integer_types, string_types, text_type
@ -391,6 +392,23 @@ positive_not_null_time_period = vol.All(time_period,
vol.Range(min=TimePeriod(), min_included=False)) vol.Range(min=TimePeriod(), min_included=False))
def time_of_day(value):
value = string(value)
try:
date = datetime.strptime(value, '%H:%M:%S')
except ValueError as err:
try:
date = datetime.strptime(value, '%H:%M:%S %p')
except ValueError:
raise vol.Invalid("Invalid time of day: {}".format(err))
return {
CONF_HOUR: date.hour,
CONF_MINUTE: date.minute,
CONF_SECOND: date.second,
}
def mac_address(value): def mac_address(value):
value = string_strict(value) value = string_strict(value)
parts = value.split(':') parts = value.split(':')

View File

@ -352,8 +352,11 @@ CONF_HIDDEN = 'hidden'
CONF_ON_LOOP = 'on_loop' CONF_ON_LOOP = 'on_loop'
CONF_ON_TIME = 'on_time' CONF_ON_TIME = 'on_time'
CONF_SECONDS = 'seconds' CONF_SECONDS = 'seconds'
CONF_SECOND = 'second'
CONF_MINUTES = 'minutes' CONF_MINUTES = 'minutes'
CONF_MINUTE = 'minute'
CONF_HOURS = 'hours' CONF_HOURS = 'hours'
CONF_HOUR = 'hour'
CONF_DAYS_OF_MONTH = 'days_of_month' CONF_DAYS_OF_MONTH = 'days_of_month'
CONF_MONTHS = 'months' CONF_MONTHS = 'months'
CONF_DAYS_OF_WEEK = 'days_of_week' CONF_DAYS_OF_WEEK = 'days_of_week'
@ -380,6 +383,7 @@ CONF_DIR_PIN = 'dir_pin'
CONF_SLEEP_PIN = 'sleep_pin' CONF_SLEEP_PIN = 'sleep_pin'
CONF_SEND_FIRST_AT = 'send_first_at' CONF_SEND_FIRST_AT = 'send_first_at'
CONF_TIME_ID = 'time_id' CONF_TIME_ID = 'time_id'
CONF_AT = 'at'
CONF_RESTORE_STATE = 'restore_state' CONF_RESTORE_STATE = 'restore_state'
CONF_TIMING = 'timing' CONF_TIMING = 'timing'
CONF_INVALID_COOLDOWN = 'invalid_cooldown' CONF_INVALID_COOLDOWN = 'invalid_cooldown'