Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"description":"Imported from devices.esphome.io — see linked docs for community notes.","docs_url":"https://devices.esphome.io/devices/KinCony-KC868-Uair/","esphome":{"board":"esp32dev","framework":"arduino","platform":"esp32","variant":"esp32"},"featured_bundles":[{"component_ids":["bus_a","light_esp32_rmt_led_strip_1","light_esp32_rmt_led_strip_2","sensor_dallas_temp_1","sensor_sht3xd_1"],"id":"all_recommended","name":"KinCony KC868-Uair (full setup)"}],"featured_components":[{"component_id":"i2c","fields":{"id":{"locked":true,"value":"bus_a"},"scan":{"value":true},"scl":{"locked":true,"value":16},"sda":{"locked":true,"value":4}},"id":"bus_a","locked_pins":{"scl":16,"sda":4}},{"component_id":"light.esp32_rmt_led_strip","fields":{"chipset":{"value":"ws2812"},"id":{"value":"light_esp32_rmt_led_strip_1"},"name":{"value":"Uair-Bottom-LED"},"num_leds":{"value":4},"pin":{"locked":true,"value":32},"rgb_order":{"value":"GRB"}},"id":"light_esp32_rmt_led_strip_1","locked_pins":{"pin":32}},{"component_id":"light.esp32_rmt_led_strip","fields":{"chipset":{"value":"ws2812"},"id":{"value":"light_esp32_rmt_led_strip_2"},"name":{"value":"Uair-VVertical-LED"},"num_leds":{"value":1},"pin":{"locked":true,"value":33},"rgb_order":{"value":"RGB"}},"id":"light_esp32_rmt_led_strip_2","locked_pins":{"pin":33}},{"component_id":"sensor.dallas_temp","fields":{"address":{"value":13835058055363433768},"id":{"value":"sensor_dallas_temp_1"},"name":{"value":"internal Temperature"}},"id":"sensor_dallas_temp_1"},{"component_id":"sensor.sht3xd","fields":{"address":{"value":68},"id":{"value":"sensor_sht3xd_1"},"update_interval":{"value":"15s"}},"id":"sensor_sht3xd_1","requires":["bus_a"]}],"full_config":true,"hardware":{"connectivity":["wifi","bluetooth"]},"id":"kincony_kc868_uair","images":["https://raw.githubusercontent.com/esphome/devices.esphome.io/main/src/docs/devices/KinCony-KC868-Uair/kc868-uair.jpg"],"manufacturer":"","name":"KinCony KC868-Uair","pins":[{"available":false,"gpio":4,"label":"GPIO4","occupied_by":"bus_a"},{"available":false,"gpio":16,"label":"GPIO16","occupied_by":"bus_a"},{"available":false,"gpio":32,"label":"GPIO32","occupied_by":"Uair-Bottom-LED"},{"available":false,"gpio":33,"label":"GPIO33","occupied_by":"Uair-VVertical-LED"}]}
{"description":"Imported from devices.esphome.io — see linked docs for community notes.","docs_url":"https://devices.esphome.io/devices/KinCony-KC868-Uair/","esphome":{"board":"esp32dev","framework":"arduino","platform":"esp32","variant":"esp32"},"featured_bundles":[{"component_ids":["one_wire_bus","bus_a","light_esp32_rmt_led_strip_1","light_esp32_rmt_led_strip_2","sensor_dallas_temp_1","sensor_sht3xd_1"],"id":"all_recommended","name":"KinCony KC868-Uair (full setup)"}],"featured_components":[{"component_id":"one_wire.gpio","fields":{"pin":{"locked":true,"value":27}},"id":"one_wire_bus","locked_pins":{"pin":27}},{"component_id":"i2c","fields":{"id":{"locked":true,"value":"bus_a"},"scan":{"value":true},"scl":{"locked":true,"value":16},"sda":{"locked":true,"value":4}},"id":"bus_a","locked_pins":{"scl":16,"sda":4}},{"component_id":"light.esp32_rmt_led_strip","fields":{"chipset":{"value":"ws2812"},"id":{"value":"light_esp32_rmt_led_strip_1"},"name":{"value":"Uair-Bottom-LED"},"num_leds":{"value":4},"pin":{"locked":true,"value":32},"rgb_order":{"value":"GRB"}},"id":"light_esp32_rmt_led_strip_1","locked_pins":{"pin":32}},{"component_id":"light.esp32_rmt_led_strip","fields":{"chipset":{"value":"ws2812"},"id":{"value":"light_esp32_rmt_led_strip_2"},"name":{"value":"Uair-VVertical-LED"},"num_leds":{"value":1},"pin":{"locked":true,"value":33},"rgb_order":{"value":"RGB"}},"id":"light_esp32_rmt_led_strip_2","locked_pins":{"pin":33}},{"component_id":"sensor.dallas_temp","fields":{"address":{"value":13835058055363433768},"id":{"value":"sensor_dallas_temp_1"},"name":{"value":"internal Temperature"}},"id":"sensor_dallas_temp_1","requires":["one_wire_bus"]},{"component_id":"sensor.sht3xd","fields":{"address":{"value":68},"id":{"value":"sensor_sht3xd_1"},"update_interval":{"value":"15s"}},"id":"sensor_sht3xd_1","requires":["bus_a"]}],"full_config":true,"hardware":{"connectivity":["wifi","bluetooth"]},"id":"kincony_kc868_uair","images":["https://raw.githubusercontent.com/esphome/devices.esphome.io/main/src/docs/devices/KinCony-KC868-Uair/kc868-uair.jpg"],"manufacturer":"","name":"KinCony KC868-Uair","pins":[{"available":false,"gpio":4,"label":"GPIO4","occupied_by":"bus_a"},{"available":false,"gpio":16,"label":"GPIO16","occupied_by":"bus_a"},{"available":false,"gpio":27,"label":"GPIO27","occupied_by":"one_wire.gpio"},{"available":false,"gpio":32,"label":"GPIO32","occupied_by":"Uair-Bottom-LED"},{"available":false,"gpio":33,"label":"GPIO33","occupied_by":"Uair-VVertical-LED"}]}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ pins:
- gpio: 4
available: false
occupied_by: bus_a
- gpio: 5
available: false
occupied_by: one_wire.gpio
- gpio: 16
available: false
occupied_by: bus_a
Expand All @@ -45,6 +48,12 @@ pins:
occupied_by: aio--AI-17
docs_url: https://devices.esphome.io/devices/KinCony-KC868-AIO/
featured_components:
- id: one_wire_bus
component_id: one_wire.gpio
fields:
pin:
value: 5
locked: true
- id: cd74hc4067_1
component_id: cd74hc4067
fields:
Expand Down Expand Up @@ -1252,6 +1261,8 @@ featured_components:
address: 17008162028057714984
id: sensor_dallas_temp_1
name: aio--ds18b20
requires:
- one_wire_bus
- id: adc36
component_id: sensor.adc
fields:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ pins:
- gpio: 16
available: false
occupied_by: bus_a
- gpio: 27
available: false
occupied_by: one_wire.gpio
- gpio: 32
available: false
occupied_by: Uair-Bottom-LED
Expand All @@ -27,6 +30,12 @@ pins:
occupied_by: Uair-VVertical-LED
docs_url: https://devices.esphome.io/devices/KinCony-KC868-Uair/
featured_components:
- id: one_wire_bus
component_id: one_wire.gpio
fields:
pin:
value: 27
locked: true
- id: bus_a
component_id: i2c
fields:
Expand Down Expand Up @@ -68,6 +77,8 @@ featured_components:
address: 13835058055363433768
id: sensor_dallas_temp_1
name: internal Temperature
requires:
- one_wire_bus
- id: sensor_sht3xd_1
component_id: sensor.sht3xd
fields:
Expand Down

Large diffs are not rendered by default.

18 changes: 16 additions & 2 deletions script/sync_esphome_devices.py
Original file line number Diff line number Diff line change
Expand Up @@ -1585,6 +1585,20 @@ def _unique_local_id(base: str, used: set[str], fallback: str) -> str:
return f"{candidate}_{counter}"


def _block_platform(bus_domain: str, block: dict[str, Any]) -> str | None:
"""
Return the platform of a platform-style bus block, or ``None`` when unresolvable.

Infers ``gpio`` for a bare ``one_wire: - pin: X`` block: older
devices.esphome.io configs omit the now-required ``platform: gpio``, and gpio
is the only pin-driven one_wire platform (ds2484 is i2c-bridged, no raw pin).
"""
Comment thread
bdraco marked this conversation as resolved.
platform = block.get("platform")
if not platform and bus_domain == "one_wire" and "pin" in block:
platform = "gpio"
return platform if isinstance(platform, str) and platform else None


def _materialize_bus(
bus_domain: str,
instance_id: str | None,
Expand Down Expand Up @@ -1618,8 +1632,8 @@ def _materialize_bus(
if component is not None:
component_id = bus_domain
else:
platform = block.get("platform")
if not isinstance(platform, str) or not platform:
platform = _block_platform(bus_domain, block)
if platform is None:
return None, "", {}
component_id = f"{bus_domain}.{platform}"
component = components_index.get(component_id)
Expand Down
8 changes: 3 additions & 5 deletions script/validate_definitions.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,11 +65,9 @@
# fix in script/sync_esphome_devices.py.
_UNSATISFIED_BUS_ALLOW_LIST = frozenset(
{
("kincony_ag8", "uart"), # switch.uart: source has no top-level uart: block
("kincony_kc868_aio", "one_wire"), # dallas_temp: one_wire: block omits platform:
("kincony_kc868_e8t", "uart"), # sensor.bl0939: source has no top-level uart: block
("kincony_kc868_uair", "one_wire"), # dallas_temp: one_wire: block omits platform:
("kincony_mb", "i2c"), # sensor.ina226: source has no top-level i2c: block
("kincony_ag8", "uart"), # 2 id-less switch.uart consumers; bus ref not recovered
("kincony_kc868_e8t", "uart"), # 2 id-less bl0939 consumers; bus ref not recovered
("kincony_mb", "i2c"), # 16 id-less ina226 consumers; bus ref not recovered
}
)

Expand Down
15 changes: 15 additions & 0 deletions tests/test_sync_esphome_devices_bus_dep.py
Original file line number Diff line number Diff line change
Expand Up @@ -375,6 +375,21 @@ def test_lifts_platform_style_one_wire_without_id() -> None:
assert set(occ) == {4}


def test_infers_gpio_platform_for_platform_less_one_wire() -> None:
"""A ``one_wire: - pin: X`` block with no platform lifts as one_wire.gpio."""
featured = [_dallas()]
config = {
"one_wire": [{"pin": "GPIO4"}], # no platform: key (older source syntax)
"sensor": [{"platform": "dallas_temp", "id": "sensor_dallas_temp_1"}],
}
extra, occ = _extract_bus_deps(config, featured, _COMPONENTS)
assert len(extra) == 1
assert extra[0]["component_id"] == "one_wire.gpio"
assert extra[0]["fields"]["pin"] == {"value": 4, "locked": True}
assert featured[0]["requires"] == ["one_wire_bus"]
assert set(occ) == {4}


def test_two_consumers_share_one_platform_bus() -> None:
"""Two dallas_temp sensors on one one_wire bus lift a single entry; both gain requires."""
featured = [_dallas("d1"), _dallas("d2")]
Expand Down
Loading