mirror of
https://github.com/esphome/esphome.git
synced 2025-04-16 07:40:29 +01:00
MCP23017 support.
This commit is contained in:
parent
6c1dc0f2b3
commit
5263c13bb2
26
esphomeyaml/components/mcp23017.py
Normal file
26
esphomeyaml/components/mcp23017.py
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import voluptuous as vol
|
||||||
|
|
||||||
|
import esphomeyaml.config_validation as cv
|
||||||
|
from esphomeyaml.const import CONF_ADDRESS, CONF_ID, CONF_MCP23017
|
||||||
|
from esphomeyaml.helpers import App, Pvariable, esphomelib_ns
|
||||||
|
|
||||||
|
DEPENDENCIES = ['i2c']
|
||||||
|
|
||||||
|
io_ns = esphomelib_ns.namespace('io')
|
||||||
|
MCP23017Component = io_ns.MCP23017Component
|
||||||
|
|
||||||
|
MCP23017_SCHEMA = vol.Schema({
|
||||||
|
vol.Required(CONF_ID): cv.declare_variable_id(MCP23017Component),
|
||||||
|
vol.Optional(CONF_ADDRESS, default=0x20): cv.i2c_address,
|
||||||
|
})
|
||||||
|
|
||||||
|
CONFIG_SCHEMA = vol.All(cv.ensure_list, [MCP23017_SCHEMA])
|
||||||
|
|
||||||
|
|
||||||
|
def to_code(config):
|
||||||
|
for conf in config:
|
||||||
|
rhs = App.make_mcp23017_component(conf[CONF_ADDRESS])
|
||||||
|
Pvariable(conf[CONF_ID], rhs)
|
||||||
|
|
||||||
|
|
||||||
|
BUILD_FLAGS = '-DUSE_MCP23017'
|
@ -194,6 +194,7 @@ CONF_JS_URL = 'js_url'
|
|||||||
CONF_SSL_FINGERPRINTS = 'ssl_fingerprints'
|
CONF_SSL_FINGERPRINTS = 'ssl_fingerprints'
|
||||||
CONF_PCF8574 = 'pcf8574'
|
CONF_PCF8574 = 'pcf8574'
|
||||||
CONF_PCF8575 = 'pcf8575'
|
CONF_PCF8575 = 'pcf8575'
|
||||||
|
CONF_MCP23017 = 'mcp23017'
|
||||||
CONF_SCAN = 'scan'
|
CONF_SCAN = 'scan'
|
||||||
CONF_KEEPALIVE = 'keepalive'
|
CONF_KEEPALIVE = 'keepalive'
|
||||||
CONF_INTEGRATION_TIME = 'integration_time'
|
CONF_INTEGRATION_TIME = 'integration_time'
|
||||||
|
@ -10,7 +10,7 @@ from esphomeyaml import core
|
|||||||
from esphomeyaml.const import CONF_AVAILABILITY, CONF_COMMAND_TOPIC, CONF_DISCOVERY, \
|
from esphomeyaml.const import CONF_AVAILABILITY, CONF_COMMAND_TOPIC, CONF_DISCOVERY, \
|
||||||
CONF_INVERTED, \
|
CONF_INVERTED, \
|
||||||
CONF_MODE, CONF_NUMBER, CONF_PAYLOAD_AVAILABLE, CONF_PAYLOAD_NOT_AVAILABLE, CONF_PCF8574, \
|
CONF_MODE, CONF_NUMBER, CONF_PAYLOAD_AVAILABLE, CONF_PAYLOAD_NOT_AVAILABLE, CONF_PCF8574, \
|
||||||
CONF_RETAIN, CONF_STATE_TOPIC, CONF_TOPIC
|
CONF_MCP23017, CONF_RETAIN, CONF_STATE_TOPIC, CONF_TOPIC
|
||||||
from esphomeyaml.core import ESPHomeYAMLError, HexInt, Lambda, TimePeriodMicroseconds, \
|
from esphomeyaml.core import ESPHomeYAMLError, HexInt, Lambda, TimePeriodMicroseconds, \
|
||||||
TimePeriodMilliseconds, TimePeriodSeconds
|
TimePeriodMilliseconds, TimePeriodSeconds
|
||||||
|
|
||||||
@ -585,15 +585,21 @@ def generic_gpio_pin_expression_(conf, mock_obj, default_mode):
|
|||||||
return
|
return
|
||||||
number = conf[CONF_NUMBER]
|
number = conf[CONF_NUMBER]
|
||||||
inverted = conf.get(CONF_INVERTED)
|
inverted = conf.get(CONF_INVERTED)
|
||||||
if CONF_PCF8574 in conf:
|
if any (mux in conf for mux in [CONF_PCF8574, CONF_MCP23017]):
|
||||||
hub = None
|
hub = None
|
||||||
for hub in get_variable(conf[CONF_PCF8574]):
|
for hub in get_variable(conf[mux]):
|
||||||
yield None
|
yield None
|
||||||
if default_mode == u'INPUT':
|
if default_mode == u'INPUT':
|
||||||
mode = conf.get(CONF_MODE, u'INPUT')
|
mode = conf.get(CONF_MODE, u'INPUT')
|
||||||
yield hub.make_input_pin(number,
|
if mux == CONF_PCF8574:
|
||||||
|
yield hub.make_input_pin(number,
|
||||||
RawExpression('PCF8574_' + mode),
|
RawExpression('PCF8574_' + mode),
|
||||||
inverted)
|
inverted)
|
||||||
|
elif mux == CONF_MCP23017:
|
||||||
|
yield hub.make_input_pin(number,
|
||||||
|
RawExpression('MCP23017_' + mode),
|
||||||
|
inverted)
|
||||||
|
|
||||||
return
|
return
|
||||||
elif default_mode == u'OUTPUT':
|
elif default_mode == u'OUTPUT':
|
||||||
yield hub.make_output_pin(number, inverted)
|
yield hub.make_output_pin(number, inverted)
|
||||||
|
@ -5,8 +5,9 @@ import voluptuous as vol
|
|||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml import core
|
from esphomeyaml import core
|
||||||
from esphomeyaml.components import pcf8574
|
from esphomeyaml.components import pcf8574
|
||||||
|
from esphomeyaml.components import mcp23017
|
||||||
from esphomeyaml.const import CONF_INVERTED, CONF_MODE, CONF_NUMBER, CONF_PCF8574, \
|
from esphomeyaml.const import CONF_INVERTED, CONF_MODE, CONF_NUMBER, CONF_PCF8574, \
|
||||||
ESP_PLATFORM_ESP32, ESP_PLATFORM_ESP8266
|
CONF_MCP23017, ESP_PLATFORM_ESP32, ESP_PLATFORM_ESP8266
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -296,6 +297,16 @@ PCF8574_INPUT_PIN_SCHEMA = PCF8574_OUTPUT_PIN_SCHEMA.extend({
|
|||||||
vol.Optional(CONF_MODE): vol.All(vol.Upper, cv.one_of("INPUT", "INPUT_PULLUP")),
|
vol.Optional(CONF_MODE): vol.All(vol.Upper, cv.one_of("INPUT", "INPUT_PULLUP")),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
MCP23017_OUTPUT_PIN_SCHEMA = vol.Schema({
|
||||||
|
vol.Required(CONF_MCP23017): cv.use_variable_id(mcp23017.MCP23017Component),
|
||||||
|
vol.Required(CONF_NUMBER): vol.Coerce(int),
|
||||||
|
vol.Optional(CONF_MODE): vol.All(vol.Upper, cv.one_of("OUTPUT")),
|
||||||
|
vol.Optional(CONF_INVERTED, default=False): cv.boolean,
|
||||||
|
})
|
||||||
|
|
||||||
|
MCP23017_INPUT_PIN_SCHEMA = MCP23017_OUTPUT_PIN_SCHEMA.extend({
|
||||||
|
vol.Optional(CONF_MODE): vol.All(vol.Upper, cv.one_of("INPUT", "INPUT_PULLUP")),
|
||||||
|
})
|
||||||
|
|
||||||
def internal_gpio_output_pin_schema(value):
|
def internal_gpio_output_pin_schema(value):
|
||||||
if isinstance(value, dict):
|
if isinstance(value, dict):
|
||||||
@ -307,6 +318,8 @@ def gpio_output_pin_schema(value):
|
|||||||
if isinstance(value, dict):
|
if isinstance(value, dict):
|
||||||
if CONF_PCF8574 in value:
|
if CONF_PCF8574 in value:
|
||||||
return PCF8574_OUTPUT_PIN_SCHEMA(value)
|
return PCF8574_OUTPUT_PIN_SCHEMA(value)
|
||||||
|
if CONF_MCP23017 in value:
|
||||||
|
return MCP23017_OUTPUT_PIN_SCHEMA(value)
|
||||||
return GPIO_FULL_OUTPUT_PIN_SCHEMA(value)
|
return GPIO_FULL_OUTPUT_PIN_SCHEMA(value)
|
||||||
return shorthand_output_pin(value)
|
return shorthand_output_pin(value)
|
||||||
|
|
||||||
@ -321,5 +334,7 @@ def gpio_input_pin_schema(value):
|
|||||||
if isinstance(value, dict):
|
if isinstance(value, dict):
|
||||||
if CONF_PCF8574 in value:
|
if CONF_PCF8574 in value:
|
||||||
return PCF8574_INPUT_PIN_SCHEMA(value)
|
return PCF8574_INPUT_PIN_SCHEMA(value)
|
||||||
|
if CONF_MCP23017 in value:
|
||||||
|
return MCP23017_INPUT_PIN_SCHEMA(value)
|
||||||
return GPIO_FULL_INPUT_PIN_SCHEMA(value)
|
return GPIO_FULL_INPUT_PIN_SCHEMA(value)
|
||||||
return shorthand_input_pin(value)
|
return shorthand_input_pin(value)
|
||||||
|
@ -510,6 +510,13 @@ binary_sensor:
|
|||||||
number: 1
|
number: 1
|
||||||
mode: INPUT
|
mode: INPUT
|
||||||
inverted: True
|
inverted: True
|
||||||
|
- platform: gpio
|
||||||
|
name: "MCP binary sensor"
|
||||||
|
pin:
|
||||||
|
mcp23017: mcp23017_hub
|
||||||
|
number: 2
|
||||||
|
mode: INPUT
|
||||||
|
inverted: False
|
||||||
|
|
||||||
pca9685:
|
pca9685:
|
||||||
frequency: 500
|
frequency: 500
|
||||||
@ -559,6 +566,15 @@ output:
|
|||||||
number: 0
|
number: 0
|
||||||
mode: OUTPUT
|
mode: OUTPUT
|
||||||
inverted: False
|
inverted: False
|
||||||
|
- platform: gpio
|
||||||
|
id: id20
|
||||||
|
pin:
|
||||||
|
mcp23017: mcp23017_hub
|
||||||
|
number: 0
|
||||||
|
mode: OUTPUT
|
||||||
|
inverted: False
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
light:
|
light:
|
||||||
- platform: binary
|
- platform: binary
|
||||||
@ -901,3 +917,7 @@ pcf8574:
|
|||||||
- id: 'pcf8574_hub'
|
- id: 'pcf8574_hub'
|
||||||
address: 0x21
|
address: 0x21
|
||||||
pcf8575: False
|
pcf8575: False
|
||||||
|
|
||||||
|
mcp23017:
|
||||||
|
- id: 'mcp23017_hub'
|
||||||
|
address: 0x20
|
||||||
|
Loading…
x
Reference in New Issue
Block a user