mirror of
https://github.com/esphome/esphome.git
synced 2024-11-29 10:14:13 +01:00
Add display page abstraction (#435)
This commit is contained in:
parent
7a450ed41c
commit
f311a1bb30
6 changed files with 98 additions and 13 deletions
|
@ -1,11 +1,13 @@
|
||||||
# coding=utf-8
|
# coding=utf-8
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
|
from esphome import core
|
||||||
|
from esphome.automation import ACTION_REGISTRY, maybe_simple_id
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.const import CONF_LAMBDA, CONF_ROTATION, CONF_UPDATE_INTERVAL
|
from esphome.const import CONF_LAMBDA, CONF_ROTATION, CONF_UPDATE_INTERVAL, CONF_PAGES, CONF_ID
|
||||||
from esphome.core import CORE
|
from esphome.core import CORE
|
||||||
from esphome.cpp_generator import add
|
from esphome.cpp_generator import add, process_lambda, Pvariable, templatable, get_variable
|
||||||
from esphome.cpp_types import esphome_ns
|
from esphome.cpp_types import esphome_ns, void, Action
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({
|
||||||
|
|
||||||
|
@ -13,7 +15,12 @@ PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({
|
||||||
|
|
||||||
display_ns = esphome_ns.namespace('display')
|
display_ns = esphome_ns.namespace('display')
|
||||||
DisplayBuffer = display_ns.class_('DisplayBuffer')
|
DisplayBuffer = display_ns.class_('DisplayBuffer')
|
||||||
|
DisplayPage = display_ns.class_('DisplayPage')
|
||||||
|
DisplayPagePtr = DisplayPage.operator('ptr')
|
||||||
DisplayBufferRef = DisplayBuffer.operator('ref')
|
DisplayBufferRef = DisplayBuffer.operator('ref')
|
||||||
|
DisplayPageShowAction = display_ns.class_('DisplayPageShowAction', Action)
|
||||||
|
DisplayPageShowNextAction = display_ns.class_('DisplayPageShowNextAction', Action)
|
||||||
|
DisplayPageShowPrevAction = display_ns.class_('DisplayPageShowPrevAction', Action)
|
||||||
|
|
||||||
DISPLAY_ROTATIONS = {
|
DISPLAY_ROTATIONS = {
|
||||||
0: display_ns.DISPLAY_ROTATION_0_DEGREES,
|
0: display_ns.DISPLAY_ROTATION_0_DEGREES,
|
||||||
|
@ -41,6 +48,10 @@ BASIC_DISPLAY_PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||||
|
|
||||||
FULL_DISPLAY_PLATFORM_SCHEMA = BASIC_DISPLAY_PLATFORM_SCHEMA.extend({
|
FULL_DISPLAY_PLATFORM_SCHEMA = BASIC_DISPLAY_PLATFORM_SCHEMA.extend({
|
||||||
vol.Optional(CONF_ROTATION): validate_rotation,
|
vol.Optional(CONF_ROTATION): validate_rotation,
|
||||||
|
vol.Optional(CONF_PAGES): vol.All(cv.ensure_list({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(DisplayPage),
|
||||||
|
vol.Required(CONF_LAMBDA): cv.lambda_,
|
||||||
|
}), vol.Length(min=1)),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@ -49,6 +60,64 @@ def setup_display_core_(display_var, config):
|
||||||
add(display_var.set_update_interval(config[CONF_UPDATE_INTERVAL]))
|
add(display_var.set_update_interval(config[CONF_UPDATE_INTERVAL]))
|
||||||
if CONF_ROTATION in config:
|
if CONF_ROTATION in config:
|
||||||
add(display_var.set_rotation(DISPLAY_ROTATIONS[config[CONF_ROTATION]]))
|
add(display_var.set_rotation(DISPLAY_ROTATIONS[config[CONF_ROTATION]]))
|
||||||
|
if CONF_PAGES in config:
|
||||||
|
pages = []
|
||||||
|
for conf in config[CONF_PAGES]:
|
||||||
|
for lambda_ in process_lambda(conf[CONF_LAMBDA], [(DisplayBufferRef, 'it')],
|
||||||
|
return_type=void):
|
||||||
|
yield
|
||||||
|
var = Pvariable(conf[CONF_ID], DisplayPage.new(lambda_))
|
||||||
|
pages.append(var)
|
||||||
|
add(display_var.set_pages(pages))
|
||||||
|
|
||||||
|
|
||||||
|
CONF_DISPLAY_PAGE_SHOW = 'display.page.show'
|
||||||
|
DISPLAY_PAGE_SHOW_ACTION_SCHEMA = maybe_simple_id({
|
||||||
|
vol.Required(CONF_ID): cv.templatable(cv.use_variable_id(DisplayPage)),
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@ACTION_REGISTRY.register(CONF_DISPLAY_PAGE_SHOW, DISPLAY_PAGE_SHOW_ACTION_SCHEMA)
|
||||||
|
def display_page_show_to_code(config, action_id, arg_type, template_arg):
|
||||||
|
type = DisplayPageShowAction.template(arg_type)
|
||||||
|
action = Pvariable(action_id, type.new(), type=type)
|
||||||
|
if isinstance(config[CONF_ID], core.Lambda):
|
||||||
|
for template_ in templatable(config[CONF_ID], arg_type, DisplayPagePtr):
|
||||||
|
yield None
|
||||||
|
add(action.set_page(template_))
|
||||||
|
else:
|
||||||
|
for var in get_variable(config[CONF_ID]):
|
||||||
|
yield None
|
||||||
|
add(action.set_page(var))
|
||||||
|
yield action
|
||||||
|
|
||||||
|
|
||||||
|
CONF_DISPLAY_PAGE_SHOW_NEXT = 'display.page.show_next'
|
||||||
|
DISPLAY_PAGE_SHOW_NEXT_ACTION_SCHEMA = maybe_simple_id({
|
||||||
|
vol.Required(CONF_ID): cv.templatable(cv.use_variable_id(DisplayBuffer)),
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@ACTION_REGISTRY.register(CONF_DISPLAY_PAGE_SHOW_NEXT, DISPLAY_PAGE_SHOW_NEXT_ACTION_SCHEMA)
|
||||||
|
def display_page_show_next_to_code(config, action_id, arg_type, template_arg):
|
||||||
|
for var in get_variable(config[CONF_ID]):
|
||||||
|
yield None
|
||||||
|
type = DisplayPageShowNextAction.template(arg_type)
|
||||||
|
yield Pvariable(action_id, type.new(var), type=type)
|
||||||
|
|
||||||
|
|
||||||
|
CONF_DISPLAY_PAGE_SHOW_PREVIOUS = 'display.page.show_previous'
|
||||||
|
DISPLAY_PAGE_SHOW_PREVIOUS_ACTION_SCHEMA = maybe_simple_id({
|
||||||
|
vol.Required(CONF_ID): cv.templatable(cv.use_variable_id(DisplayBuffer)),
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@ACTION_REGISTRY.register(CONF_DISPLAY_PAGE_SHOW_PREVIOUS, DISPLAY_PAGE_SHOW_PREVIOUS_ACTION_SCHEMA)
|
||||||
|
def display_page_show_previous_to_code(config, action_id, arg_type, template_arg):
|
||||||
|
for var in get_variable(config[CONF_ID]):
|
||||||
|
yield None
|
||||||
|
type = DisplayPageShowPrevAction.template(arg_type)
|
||||||
|
yield Pvariable(action_id, type.new(var), type=type)
|
||||||
|
|
||||||
|
|
||||||
def setup_display(display_var, config):
|
def setup_display(display_var, config):
|
||||||
|
|
|
@ -5,7 +5,7 @@ from esphome.components import display
|
||||||
from esphome.components.display import ssd1306_spi
|
from esphome.components.display import ssd1306_spi
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.const import CONF_ADDRESS, CONF_EXTERNAL_VCC, CONF_ID, CONF_LAMBDA, CONF_MODEL, \
|
from esphome.const import CONF_ADDRESS, CONF_EXTERNAL_VCC, CONF_ID, CONF_LAMBDA, CONF_MODEL, \
|
||||||
CONF_RESET_PIN
|
CONF_PAGES, CONF_RESET_PIN
|
||||||
from esphome.cpp_generator import Pvariable, add, process_lambda
|
from esphome.cpp_generator import Pvariable, add, process_lambda
|
||||||
from esphome.cpp_helpers import gpio_output_pin_expression, setup_component
|
from esphome.cpp_helpers import gpio_output_pin_expression, setup_component
|
||||||
from esphome.cpp_types import App, void
|
from esphome.cpp_types import App, void
|
||||||
|
@ -14,13 +14,13 @@ DEPENDENCIES = ['i2c']
|
||||||
|
|
||||||
I2CSSD1306 = display.display_ns.class_('I2CSSD1306', ssd1306_spi.SSD1306)
|
I2CSSD1306 = display.display_ns.class_('I2CSSD1306', ssd1306_spi.SSD1306)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = display.FULL_DISPLAY_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = vol.All(display.FULL_DISPLAY_PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(): cv.declare_variable_id(I2CSSD1306),
|
cv.GenerateID(): cv.declare_variable_id(I2CSSD1306),
|
||||||
vol.Required(CONF_MODEL): ssd1306_spi.SSD1306_MODEL,
|
vol.Required(CONF_MODEL): ssd1306_spi.SSD1306_MODEL,
|
||||||
vol.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema,
|
vol.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema,
|
||||||
vol.Optional(CONF_EXTERNAL_VCC): cv.boolean,
|
vol.Optional(CONF_EXTERNAL_VCC): cv.boolean,
|
||||||
vol.Optional(CONF_ADDRESS): cv.i2c_address,
|
vol.Optional(CONF_ADDRESS): cv.i2c_address,
|
||||||
}).extend(cv.COMPONENT_SCHEMA.schema)
|
}).extend(cv.COMPONENT_SCHEMA.schema), cv.has_at_most_one_key(CONF_PAGES, CONF_LAMBDA))
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|
|
@ -5,7 +5,7 @@ from esphome.components import display, spi
|
||||||
from esphome.components.spi import SPIComponent
|
from esphome.components.spi import SPIComponent
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.const import CONF_CS_PIN, CONF_DC_PIN, CONF_EXTERNAL_VCC, CONF_ID, CONF_LAMBDA, \
|
from esphome.const import CONF_CS_PIN, CONF_DC_PIN, CONF_EXTERNAL_VCC, CONF_ID, CONF_LAMBDA, \
|
||||||
CONF_MODEL, CONF_RESET_PIN, CONF_SPI_ID
|
CONF_MODEL, CONF_RESET_PIN, CONF_SPI_ID, CONF_PAGES
|
||||||
from esphome.cpp_generator import Pvariable, add, get_variable, process_lambda
|
from esphome.cpp_generator import Pvariable, add, get_variable, process_lambda
|
||||||
from esphome.cpp_helpers import gpio_output_pin_expression, setup_component
|
from esphome.cpp_helpers import gpio_output_pin_expression, setup_component
|
||||||
from esphome.cpp_types import App, PollingComponent, void
|
from esphome.cpp_types import App, PollingComponent, void
|
||||||
|
@ -29,7 +29,7 @@ MODELS = {
|
||||||
|
|
||||||
SSD1306_MODEL = cv.one_of(*MODELS, upper=True, space="_")
|
SSD1306_MODEL = cv.one_of(*MODELS, upper=True, space="_")
|
||||||
|
|
||||||
PLATFORM_SCHEMA = display.FULL_DISPLAY_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = vol.All(display.FULL_DISPLAY_PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(): cv.declare_variable_id(SPISSD1306),
|
cv.GenerateID(): cv.declare_variable_id(SPISSD1306),
|
||||||
cv.GenerateID(CONF_SPI_ID): cv.use_variable_id(SPIComponent),
|
cv.GenerateID(CONF_SPI_ID): cv.use_variable_id(SPIComponent),
|
||||||
vol.Required(CONF_CS_PIN): pins.gpio_output_pin_schema,
|
vol.Required(CONF_CS_PIN): pins.gpio_output_pin_schema,
|
||||||
|
@ -37,7 +37,7 @@ PLATFORM_SCHEMA = display.FULL_DISPLAY_PLATFORM_SCHEMA.extend({
|
||||||
vol.Required(CONF_MODEL): SSD1306_MODEL,
|
vol.Required(CONF_MODEL): SSD1306_MODEL,
|
||||||
vol.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema,
|
vol.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema,
|
||||||
vol.Optional(CONF_EXTERNAL_VCC): cv.boolean,
|
vol.Optional(CONF_EXTERNAL_VCC): cv.boolean,
|
||||||
}).extend(cv.COMPONENT_SCHEMA.schema)
|
}).extend(cv.COMPONENT_SCHEMA.schema), cv.has_at_most_one_key(CONF_PAGES, CONF_LAMBDA))
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|
|
@ -5,7 +5,7 @@ from esphome.components import display, spi
|
||||||
from esphome.components.spi import SPIComponent
|
from esphome.components.spi import SPIComponent
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.const import CONF_BUSY_PIN, CONF_CS_PIN, CONF_DC_PIN, CONF_FULL_UPDATE_EVERY, \
|
from esphome.const import CONF_BUSY_PIN, CONF_CS_PIN, CONF_DC_PIN, CONF_FULL_UPDATE_EVERY, \
|
||||||
CONF_ID, CONF_LAMBDA, CONF_MODEL, CONF_RESET_PIN, CONF_SPI_ID
|
CONF_ID, CONF_LAMBDA, CONF_MODEL, CONF_PAGES, CONF_RESET_PIN, CONF_SPI_ID
|
||||||
from esphome.cpp_generator import Pvariable, add, get_variable, process_lambda
|
from esphome.cpp_generator import Pvariable, add, get_variable, process_lambda
|
||||||
from esphome.cpp_helpers import gpio_input_pin_expression, gpio_output_pin_expression, \
|
from esphome.cpp_helpers import gpio_input_pin_expression, gpio_output_pin_expression, \
|
||||||
setup_component
|
setup_component
|
||||||
|
@ -48,7 +48,8 @@ PLATFORM_SCHEMA = vol.All(display.FULL_DISPLAY_PLATFORM_SCHEMA.extend({
|
||||||
vol.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema,
|
vol.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema,
|
||||||
vol.Optional(CONF_BUSY_PIN): pins.gpio_input_pin_schema,
|
vol.Optional(CONF_BUSY_PIN): pins.gpio_input_pin_schema,
|
||||||
vol.Optional(CONF_FULL_UPDATE_EVERY): cv.uint32_t,
|
vol.Optional(CONF_FULL_UPDATE_EVERY): cv.uint32_t,
|
||||||
}).extend(cv.COMPONENT_SCHEMA.schema), validate_full_update_every_only_type_a)
|
}).extend(cv.COMPONENT_SCHEMA.schema), validate_full_update_every_only_type_a,
|
||||||
|
cv.has_at_most_one_key(CONF_PAGES, CONF_LAMBDA))
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
|
|
@ -336,6 +336,7 @@ CONF_CHANGE_MODE_EVERY = 'change_mode_every'
|
||||||
CONF_PAGE_ID = 'page_id'
|
CONF_PAGE_ID = 'page_id'
|
||||||
CONF_COMPONENT_ID = 'component_id'
|
CONF_COMPONENT_ID = 'component_id'
|
||||||
CONF_COLD_WHITE = 'cold_white'
|
CONF_COLD_WHITE = 'cold_white'
|
||||||
|
CONF_PAGES = 'pages'
|
||||||
CONF_WARM_WHITE = 'warm_white'
|
CONF_WARM_WHITE = 'warm_white'
|
||||||
CONF_COLD_WHITE_COLOR_TEMPERATURE = 'cold_white_color_temperature'
|
CONF_COLD_WHITE_COLOR_TEMPERATURE = 'cold_white_color_temperature'
|
||||||
CONF_WARM_WHITE_COLOR_TEMPERATURE = 'warm_white_color_temperature'
|
CONF_WARM_WHITE_COLOR_TEMPERATURE = 'warm_white_color_temperature'
|
||||||
|
|
|
@ -1007,6 +1007,14 @@ fan:
|
||||||
medium: 0.75
|
medium: 0.75
|
||||||
high: 1.0
|
high: 1.0
|
||||||
|
|
||||||
|
interval:
|
||||||
|
- interval: 10s
|
||||||
|
then:
|
||||||
|
- display.page.show: !lambda |-
|
||||||
|
if (true) return id(page1); else return id(page2);
|
||||||
|
- display.page.show_next: display
|
||||||
|
- display.page.show_previous: display
|
||||||
|
|
||||||
display:
|
display:
|
||||||
- platform: lcd_gpio
|
- platform: lcd_gpio
|
||||||
dimensions: 18x4
|
dimensions: 18x4
|
||||||
|
@ -1037,8 +1045,14 @@ display:
|
||||||
model: "SSD1306 128x64"
|
model: "SSD1306 128x64"
|
||||||
reset_pin: GPIO23
|
reset_pin: GPIO23
|
||||||
address: 0x3C
|
address: 0x3C
|
||||||
|
id: display
|
||||||
|
pages:
|
||||||
|
- id: page1
|
||||||
lambda: |-
|
lambda: |-
|
||||||
it.rectangle(0, 0, it.get_width(), it.get_height());
|
it.rectangle(0, 0, it.get_width(), it.get_height());
|
||||||
|
- id: page2
|
||||||
|
lambda: |-
|
||||||
|
// Nothing
|
||||||
- platform: ssd1306_spi
|
- platform: ssd1306_spi
|
||||||
model: "SSD1306 128x64"
|
model: "SSD1306 128x64"
|
||||||
cs_pin: GPIO23
|
cs_pin: GPIO23
|
||||||
|
|
Loading…
Reference in a new issue