Adds [tool.ruff] and [tool.ty] config to pyproject.toml with a curated ruff rule set (E, F, W, I, UP, B, C4, SIM, RUF, ASYNC, LOG, G, PIE, RET, PERF, N), pins ruff/ty in requirements-dev.txt, reformats the whole tree with `ruff format`, and fixes the pre-existing lint and type-check debt those tools surfaced so both run clean. Production-code type fixes include: HA's ConfigFlowResult vs. the generic FlowResult in config_flow.py, narrowing BoundEntity.desc to its platform-specific subclass (SelectDesc/NumberDesc/SensorDesc/etc.) via cast() instead of an unchecked annotation, converting HA device_class strings to their proper enum types, a resolve_registry callback typed as `object` instead of `DeviceRegistry | None`, and a couple of other narrow correctness fixes (CA key type validation, an index-out-of-bounds false positive from an empty-tuple fallback, a bool/dict argument swap). Test-file fixes are mechanical: narrowing SamsungEntityDescription to the correct subclass via isinstance()/cast() before accessing subclass-only fields, and asserting Optional write_fn/unit_fn fields are set before calling them.
143 lines
7.9 KiB
Python
143 lines
7.9 KiB
Python
"""Hrefs deliberately not modeled as capabilities.
|
|
|
|
Every entry here is either irrelevant plumbing (network/account/OTA
|
|
housekeeping that will never be home-automation-relevant) or a duplicate of
|
|
state we already expose through a friendlier href. Declaring them here,
|
|
rather than leaving them unregistered, keeps discover()'s unknown-resource
|
|
reporting limited to genuine coverage gaps.
|
|
|
|
Capability defaults entities=() and discover() treats any href that
|
|
resolves to a capability at all as matched, even one with no entities, so
|
|
this list uses the same declaration shape as a real capability with no
|
|
extra machinery. Fold into by_type registries (per-family gap detection)
|
|
and into the global ALL list (unknown-device-type fallback).
|
|
|
|
Deliberately exact hrefs only, no href_prefix/pattern capabilities: the
|
|
unknown-device-type fallback path (coordinator's `discover(resources,
|
|
CAPABILITIES)` call) doesn't pass pattern_caps, so a prefix-based entry
|
|
here would silently do nothing on that path. Enumerate each known href
|
|
instead; it's a short, stable list.
|
|
|
|
This list is maintainer-curated only; there is no per-installation
|
|
override. Grow it as real /device/0 dumps surface more universal noise —
|
|
do not add a href here on a guess. If a href's relevance is unclear, leave
|
|
it unbound so it surfaces as a gap for a human to look at.
|
|
"""
|
|
|
|
from ..capability import Capability
|
|
|
|
IGNORED: list[Capability] = [
|
|
# Device serial/model is read directly by the coordinator for HA device
|
|
# identity, not modeled as an entity capability.
|
|
Capability(href="/information/vs/0"),
|
|
# Bixby voice assistant: feature negotiation, account provisioning
|
|
# (Samsung account email, access tokens), terms-of-service state, and
|
|
# enable/disable status.
|
|
Capability(href="/voice/feature/vs/0"),
|
|
Capability(href="/voice/provisioning/vs/0"),
|
|
Capability(href="/bixby/vs/0"),
|
|
Capability(href="/bixby/status/vs/0"),
|
|
Capability(href="/bixbyuservalidate/vs/0"),
|
|
Capability(href="/bixbyterms/vs/0"),
|
|
# Network/WiFi housekeeping — MAC addresses, supported auth/crypto
|
|
# types, no controllable or observable appliance state.
|
|
Capability(href="/wirelessinfo/vs/0"),
|
|
Capability(href="/connectionconfig/vs/0"),
|
|
# Static or internal-protocol metadata, not entity-worthy.
|
|
Capability(href="/quickcontrol/info/vs/0"),
|
|
Capability(href="/realtimenotiforclient/vs/0"),
|
|
Capability(href="/file/information/vs/0"),
|
|
Capability(href="/configuration/vs/0"), # region/countryCode
|
|
Capability(href="/setting/vs/0"), # supported/selected UI language
|
|
Capability(href="/timezone/vs/0"), # redundant with HA's own timezone
|
|
Capability(href="/wm/setinfo/vs/0"), # model/manufacturing metadata
|
|
# Resource-monitoring poll-interval config (a bare minPeriod in
|
|
# milliseconds, issue #165's TP1X_REF_21K fridge) -- internal transport
|
|
# plumbing, not appliance state.
|
|
Capability(href="/rm/control/vs/0"),
|
|
# Demand Response Load Control — utility-company grid signals; requires
|
|
# cloud registration with a utility program we don't support locally.
|
|
Capability(href="/drlc/vs/0"),
|
|
# Redundant with capabilities already declared elsewhere.
|
|
# /speakersound/vs/0 duplicates /settings/sound/volume/vs/0 (laundry.SOUND_VOLUME).
|
|
Capability(href="/speakersound/vs/0"),
|
|
# /wm/editcourse/vs/0 has no entities of its own -- x.com.samsung.da.
|
|
# editCourseList is read directly out of the resource snapshot by
|
|
# dishwasher.CYCLE_OPTIONS's and washer.WASHER_COURSE's cycle select
|
|
# (options=_cycle_options) to build that device's actual supported
|
|
# course list, rather than exposing this href's raw byte string
|
|
# through its own entity.
|
|
Capability(href="/wm/editcourse/vs/0"),
|
|
# Bixby audio feedback (chime + volume played when Bixby starts/stops
|
|
# listening) — only meaningful with Bixby enabled, which this
|
|
# integration has no local path to configure or use.
|
|
Capability(href="/sec/networkaudio/audio/vs/0"),
|
|
# Static Bespoke-product-line flag, not appliance state.
|
|
Capability(href="/bespoke/vs/0"),
|
|
# Empty resource on every dump seen so far — nothing to expose.
|
|
Capability(href="/defrost/prediction/vs/0"),
|
|
# Seasonal defrost schedule (start/period/end per season). Automating
|
|
# this cleanly would need a multi-field schedule editor; the practical
|
|
# on/off control is fridge.DEFROST_DELAY.
|
|
Capability(href="/defrost/reservation/vs/0"),
|
|
# Warranty/service-plan enrollment status — every field reads "Unknown"
|
|
# on hardware not enrolled in a Samsung Care+ style program.
|
|
Capability(href="/dginformation/vs/0"),
|
|
# OCF-native vacation-mode flag (fridge). Only one value ('RVACATION_OFF')
|
|
# has ever been seen in `modes` (issue #7's dump) -- no real choice to
|
|
# expose yet. Revisit if a device surfaces it toggled on.
|
|
Capability(href="/mode/0"),
|
|
# Opaque integer with no supportedModes/options list to interpret it
|
|
# against — meaning unclear from the raw resource alone.
|
|
Capability(href="/runningmode/vs/0"),
|
|
# Demand-response energy planner — same utility-program dependency as
|
|
# /drlc/vs/0 above; every dump seen so far is inert (plan: 'none').
|
|
Capability(href="/energy/planner/vs/0"),
|
|
# Temperature-unit display preference, redundant with HA's own units.
|
|
Capability(href="/wm/submode/vs/0"),
|
|
# Read-only re-encoding of the course already exposed by
|
|
# washer.WASHER_COURSE at /course/vs/0 (x.com.samsung.da.st.washerMode
|
|
# is literally "Table_02_Course_<same hex code>").
|
|
Capability(href="/st/washercourse/vs/0"),
|
|
# Dryer counterpart of the above: re-encoding of the course already
|
|
# exposed by dryer.DRYER_COURSE at /course/vs/0
|
|
# (x.com.samsung.da.st.dryerMode is "Table_03_Course_<same hex code>").
|
|
Capability(href="/st/dryercourse/vs/0"),
|
|
# AirDresser counterpart of the above (issue #157): read only for its
|
|
# courseTable id (air_dresser.AIR_DRESSER_COURSE's table_href), no
|
|
# entity of its own -- same "no entity, just the table id" role as
|
|
# /st/washercourse/vs/0 and /st/dryercourse/vs/0.
|
|
Capability(href="/st/airdressercourse/vs/0"),
|
|
# Empty on every washer dump seen so far.
|
|
Capability(href="/wm/welcomemsg/vs/0"),
|
|
# User-saved custom course slots (F1-FA). No controllable/observable
|
|
# state without a multi-slot editor; revisit if that becomes valuable.
|
|
Capability(href="/wm/personalcourse/vs/0"),
|
|
# OCF-native energy resource is empty ({}) on washer hardware seen so
|
|
# far, unlike /power/0, /kidslock/0, /remotectrl/0 which do carry real
|
|
# data -- common.ENERGY_METER on /energy/consumption/vs/0 is the only
|
|
# real source for this control.
|
|
Capability(href="/energy/consumption/0"),
|
|
# Empty ({}) on every washer dump seen so far -- nothing to expose.
|
|
Capability(href="/cycleinterface/vs/0"),
|
|
# OCF-native duplicate of /drlc/vs/0 above -- same utility-program
|
|
# dependency this integration doesn't support locally.
|
|
Capability(href="/drlc/0"),
|
|
# OCF-native duplicate of /operational/state/vs/0, which is already
|
|
# modeled by operational.OPERATIONAL_STATE (a richer, write-capable
|
|
# capability with start/pause/stop buttons and a delay-start control)
|
|
# used by washer, dishwasher, dryer, and oven. This generic href only
|
|
# carries read-only overlapping data (current job state, remaining
|
|
# time, progress percentage) with no write path -- not worth building a
|
|
# parallel write-capable capability around an unverified generic OCF
|
|
# write contract.
|
|
Capability(href="/operational/state/0"),
|
|
# Cooktop guided-cooking/recipe status (issue #86, TP1X_DA-KS-COOKTOP
|
|
# family): sequenceNumber, operationBurnerNumber, a stageInfo block, and
|
|
# a textData.menu string -- every field empty/zero on the only dump
|
|
# seen so far (device idle, no guided-cooking program active). Same
|
|
# "don't guess" treatment as the microwave family's /recipe/cook/vs/0.
|
|
# Revisit if a dump with an active recipe surfaces.
|
|
Capability(href="/cooktop/recipe/status/vs/0"),
|
|
]
|