Fix pin reuse error with pin expanders (#5973)

Co-authored-by: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com>
This commit is contained in:
Jesse Hills 2023-12-20 19:42:27 +09:00
parent ab25e32509
commit 6a9e85438f
No known key found for this signature in database
GPG key ID: BEAAE804EFD8E83A
3 changed files with 11 additions and 15 deletions

View file

@ -1,7 +1,7 @@
import operator import operator
from functools import reduce from functools import reduce
import esphome.config_validation as cv import esphome.config_validation as cv
from esphome.core import CORE, ID from esphome.core import CORE
from esphome.const import ( from esphome.const import (
CONF_INPUT, CONF_INPUT,
@ -25,15 +25,16 @@ class PinRegistry(dict):
def reset(self): def reset(self):
self.pins_used = {} self.pins_used = {}
def get_count(self, key, number): def get_count(self, key, id, number):
""" """
Get the number of places a given pin is used. Get the number of places a given pin is used.
:param key: The ID of the defining component :param key: The key of the registered pin schema.
:param id: The ID of the defining component
:param number: The pin number :param number: The pin number
:return: The number of places the pin is used. :return: The number of places the pin is used.
""" """
pin_key = (key, number) pin_key = (key, id, number)
return self.pins_used[pin_key] if pin_key in self.pins_used else 0 return len(self.pins_used[pin_key]) if pin_key in self.pins_used else 0
def register(self, name, schema, final_validate=None): def register(self, name, schema, final_validate=None):
""" """
@ -65,9 +66,10 @@ class PinRegistry(dict):
result = self[key][1](conf) result = self[key][1](conf)
if CONF_NUMBER in result: if CONF_NUMBER in result:
# key maps to the pin schema # key maps to the pin schema
if isinstance(key, ID): if key != CORE.target_platform:
key = key.id pin_key = (key, conf[key], result[CONF_NUMBER])
pin_key = (key, result[CONF_NUMBER]) else:
pin_key = (key, key, result[CONF_NUMBER])
if pin_key not in self.pins_used: if pin_key not in self.pins_used:
self.pins_used[pin_key] = [] self.pins_used[pin_key] = []
# client_id identifies the instance of the providing component # client_id identifies the instance of the providing component
@ -101,7 +103,7 @@ class PinRegistry(dict):
Run the final validation for all pins, and check for reuse Run the final validation for all pins, and check for reuse
:param fconf: The full config :param fconf: The full config
""" """
for (key, _), pin_list in self.pins_used.items(): for (key, _, _), pin_list in self.pins_used.items():
count = len(pin_list) # number of places same pin used. count = len(pin_list) # number of places same pin used.
final_val_fun = self[key][2] # final validation function final_val_fun = self[key][2] # final validation function
for pin_path, client_id, pin_config in pin_list: for pin_path, client_id, pin_config in pin_list:

View file

@ -1667,7 +1667,6 @@ binary_sensor:
mcp23xxx: mcp23s08_hub mcp23xxx: mcp23s08_hub
# Use pin number 1 # Use pin number 1
number: 1 number: 1
allow_other_uses: true
# One of INPUT or INPUT_PULLUP # One of INPUT or INPUT_PULLUP
mode: INPUT_PULLUP mode: INPUT_PULLUP
inverted: false inverted: false
@ -2149,7 +2148,6 @@ output:
pin: pin:
mcp23xxx: mcp23017_hub mcp23xxx: mcp23017_hub
number: 0 number: 0
allow_other_uses: true
mode: OUTPUT mode: OUTPUT
inverted: false inverted: false
- platform: gpio - platform: gpio
@ -2157,7 +2155,6 @@ output:
pin: pin:
mcp23xxx: mcp23008_hub mcp23xxx: mcp23008_hub
number: 0 number: 0
allow_other_uses: true
mode: OUTPUT mode: OUTPUT
inverted: false inverted: false
- platform: gpio - platform: gpio
@ -2597,7 +2594,6 @@ switch:
mcp23xxx: mcp23s08_hub mcp23xxx: mcp23s08_hub
# Use pin number 0 # Use pin number 0
number: 0 number: 0
allow_other_uses: true
mode: OUTPUT mode: OUTPUT
inverted: false inverted: false
- platform: gpio - platform: gpio

View file

@ -401,7 +401,6 @@ switch:
pin: pin:
mcp23xxx: mcp23017_hub mcp23xxx: mcp23017_hub
number: 0 number: 0
allow_other_uses: true
mode: OUTPUT mode: OUTPUT
interlock: &interlock [gpio_switch1, gpio_switch2, gpio_switch3] interlock: &interlock [gpio_switch1, gpio_switch2, gpio_switch3]
- platform: gpio - platform: gpio
@ -409,7 +408,6 @@ switch:
pin: pin:
mcp23xxx: mcp23008_hub mcp23xxx: mcp23008_hub
number: 0 number: 0
allow_other_uses: true
mode: OUTPUT mode: OUTPUT
interlock: *interlock interlock: *interlock
- platform: gpio - platform: gpio