Two real bugs, both latent (no shipped fixture exercised them), plus a
consistency gap and a couple of correctness/DRY nits flagged by review:
- async_set_fan_mode resolved a fan_mode label against the static
_FAN_TO_DEVICE reverse map before checking whether the resulting code is
actually one of the unit's own supportedModes. A board using non-standard
wind-strength codes while still spelling a standard-looking label in
modesName (e.g. codes "31"-"33" named "Low"/"High"/"Turbo") would silently
write a code ("1"/"3"/"4") the device never advertised. Now validates the
static hit against the unit's own supported codes before trusting it,
falling through to the live modesName scan otherwise.
- air_purifier.WIND_STRENGTH_FAN reused key='fan', the same key as FAN in
the same registry -- BoundEntity's unique_id is built from key alone, not
href, so a board reporting both hrefs would have one fan entity silently
shadow the other. Renamed to 'wind_strength_fan' (translation_key
unchanged). No shipped fixture reports both hrefs today, but the two caps
living in the same registry made this a real latent hazard, the exact one
AIRFLOW_GENERIC's own comment already documents and deliberately avoids.
- microwave.py's cooking_mode select still used a static, union-of-all-
dumps mode list, even though both shipped microwave fixtures already
report x.com.samsung.da.supportedModes on /mode/vs/0 -- the same shape
oven._oven_mode_options was just built to prefer over exactly this kind
of static list (issue #138's follow-up, this same PR's skill update).
ME7500D advertises 4 modes; the select was offering 11. Applied the same
live-first, static-fallback pattern.
- Added the issue #152 fixture the microwave lamp fix was missing (the
SKILL.md step this PR itself added asks for one).
- climate.py's _legacy_airflow rebuilt a 2-key presence dict from
coordinator.resource()'s truthiness, which collapses "href absent" and
"href present with an empty {} rep" to the same falsy value -- while
is_legacy_board (and discover()'s own binding) test key membership, not
truthiness. Simplified to pass last_resources through directly, matching
is_legacy_board's actual contract instead of a cheaper approximation of
it, so the "can never disagree" claim in both docstrings is actually true.
- Hoisted the 'power' payload branch duplicated verbatim across
_airflow_fan_write/_fan_write/_wind_strength_fan_write into one
_power_write helper (registry/capabilities/air_purifier.py).
- Removed two now-unused imports (test_air_dresser_capabilities.py,
test_air_purifier_vtww_fan.py) and replaced a tautological
code-in-_DEVICE_TO_FAN check with one that actually exercises the live
climate entity's fan_modes/fan_mode (test_climate_ac_modes.py).
- Fixed a pre-existing (not from this PR) no-op test on main --
test_registry_reproduces_golden_state_keys_for_induction_cooktop computed
golden/state_keys and never asserted on them.
756 tests pass.
270 lines
6.7 KiB
JSON
270 lines
6.7 KiB
JSON
{
|
|
"device0": [
|
|
{
|
|
"rt": [
|
|
"x.com.samsung.devcol",
|
|
"oic.wk.col"
|
|
],
|
|
"if": [
|
|
"oic.if.baseline",
|
|
"oic.if.ll",
|
|
"oic.if.b"
|
|
]
|
|
},
|
|
{
|
|
"href": "/alarms/vs/0",
|
|
"rep": {
|
|
"rt": [
|
|
"x.com.samsung.da.alarms"
|
|
],
|
|
"if": [
|
|
"oic.if.baseline",
|
|
"oic.if.s"
|
|
],
|
|
"x.com.samsung.da.items": [
|
|
{
|
|
"x.com.samsung.da.id": "0",
|
|
"x.com.samsung.da.description": "Alarm",
|
|
"x.com.samsung.da.alarmType": "Device",
|
|
"x.com.samsung.da.code": "OV_E_OFF",
|
|
"x.com.samsung.da.triggeredTime": "2024-01-01T00:00:00"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"href": "/connected/vs/0",
|
|
"rep": {
|
|
"x.com.samsung.da.connected": "On",
|
|
"rt": [
|
|
"x.com.samsung.da.connected"
|
|
],
|
|
"if": [
|
|
"oic.if.baseline",
|
|
"oic.if.s"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"href": "/doors/vs/0",
|
|
"rep": {
|
|
"x.com.samsung.da.items": [
|
|
{
|
|
"x.com.samsung.da.id": "0",
|
|
"x.com.samsung.da.description": "Door",
|
|
"x.com.samsung.da.openState": "Close"
|
|
}
|
|
],
|
|
"rt": [
|
|
"x.com.samsung.da.doors"
|
|
],
|
|
"if": [
|
|
"oic.if.baseline",
|
|
"oic.if.s"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"href": "/energy/consumption/vs/0",
|
|
"rep": {
|
|
"x.com.samsung.da.instantaneousPower": "-500",
|
|
"x.com.samsung.da.instantaneousPowerUnit": "W",
|
|
"x.com.samsung.da.cumulativePower": "103700",
|
|
"x.com.samsung.da.cumulativeUnit": "Wh"
|
|
}
|
|
},
|
|
{
|
|
"href": "/hood/fanspeed/vs/0",
|
|
"rep": {
|
|
"x.com.samsung.da.hood.fanSpeed": "0",
|
|
"x.com.samsung.da.hood.supportedFanSpeed": [
|
|
"0",
|
|
"1",
|
|
"2",
|
|
"3",
|
|
"4"
|
|
],
|
|
"x.com.samsung.da.hood.settableMaxFanSpeed": "4",
|
|
"x.com.samsung.da.hood.settableMinFanSpeed": "0",
|
|
"rt": [
|
|
"x.com.samsung.da.hood.fanSpeed"
|
|
],
|
|
"if": [
|
|
"oic.if.baseline",
|
|
"oic.if.a"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"href": "/information/vs/0",
|
|
"rep": {
|
|
"x.com.samsung.da.modelNum": "TP1X_DA-KS-MICROWAVE-01051|40475141|50040000011811000A00000000000000",
|
|
"x.com.samsung.da.description": "ME7500D-/AA2",
|
|
"x.com.samsung.da.serialNum": "REDACTED",
|
|
"x.com.samsung.da.otnDUID": "REDACTED",
|
|
"x.com.samsung.da.items": [
|
|
{
|
|
"x.com.samsung.da.id": "0",
|
|
"x.com.samsung.da.description": "Version",
|
|
"x.com.samsung.da.type": "Software",
|
|
"x.com.samsung.da.number": "24111400",
|
|
"x.com.samsung.da.newVersionAvailable": "0"
|
|
},
|
|
{
|
|
"x.com.samsung.da.id": "1",
|
|
"x.com.samsung.da.description": "Version",
|
|
"x.com.samsung.da.type": "Firmware",
|
|
"x.com.samsung.da.number": "04751A23121900",
|
|
"x.com.samsung.da.newVersionAvailable": "0"
|
|
},
|
|
{
|
|
"x.com.samsung.da.id": "2",
|
|
"x.com.samsung.da.description": "Version",
|
|
"x.com.samsung.da.type": "Firmware",
|
|
"x.com.samsung.da.number": "04754B23120800",
|
|
"x.com.samsung.da.newVersionAvailable": "0"
|
|
}
|
|
],
|
|
"x.com.samsung.da.diagProtocolType": "BLE_OCF",
|
|
"x.com.samsung.da.diagLogType": [
|
|
"errCode",
|
|
"dump"
|
|
],
|
|
"x.com.samsung.da.diagDumpType": "file",
|
|
"x.com.samsung.da.diagEndPoint": "SSM",
|
|
"x.com.samsung.da.diagMnid": "0AJT",
|
|
"x.com.samsung.da.diagSetupid": "KM5",
|
|
"x.com.samsung.da.diagMinVersion": "3.0",
|
|
"x.com.samsung.da.diagTsId": "DA01"
|
|
}
|
|
},
|
|
{
|
|
"href": "/kidslock/vs/0",
|
|
"rep": {
|
|
"x.com.samsung.da.kidsLock": "Ready"
|
|
}
|
|
},
|
|
{
|
|
"href": "/mode/vs/0",
|
|
"rep": {
|
|
"x.com.samsung.da.supportedModes": [
|
|
"NoOperation",
|
|
"MicroWave",
|
|
"Autocook",
|
|
"KeepWarm"
|
|
],
|
|
"x.com.samsung.da.modes": [
|
|
"NoOperation"
|
|
],
|
|
"x.com.samsung.da.options": [
|
|
"DeviceType_ME7500D-/AA2",
|
|
"TimeAutoSync_On",
|
|
"weight_LBS",
|
|
"TimeSystem_12",
|
|
"Sound_Off",
|
|
"RemindBeep_Off",
|
|
"FilterRemind_Off",
|
|
"Lamp_High"
|
|
],
|
|
"x.com.samsung.da.defaultMode": "MicroWave",
|
|
"rt": [
|
|
"x.com.samsung.da.mode"
|
|
],
|
|
"if": [
|
|
"oic.if.baseline",
|
|
"oic.if.a"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"href": "/operational/state/vs/0",
|
|
"rep": {
|
|
"x.com.samsung.da.state": "Ready",
|
|
"x.com.samsung.da.operationTime": "00:00:00",
|
|
"x.com.samsung.da.remainingTime": "00:00:00",
|
|
"x.com.samsung.da.progressPercentage": "0",
|
|
"rt": [
|
|
"x.com.samsung.da.operation"
|
|
],
|
|
"if": [
|
|
"oic.if.baseline",
|
|
"oic.if.a"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"href": "/otninformation/vs/0",
|
|
"rep": {
|
|
"x.com.samsung.da.target": "",
|
|
"x.com.samsung.da.newVersionAvailable": "false",
|
|
"flashingProgress": "",
|
|
"otnStatus": "None",
|
|
"otnList": [
|
|
{
|
|
"type": "WIFI",
|
|
"modelId": "AKS-WW-TP1-23-MICROWAVE-OTR",
|
|
"versions": [
|
|
"40241114"
|
|
],
|
|
"visVersion": "241114"
|
|
},
|
|
{
|
|
"type": "Micom",
|
|
"modelId": "074240475141FFFFFFFF",
|
|
"versions": [
|
|
"23121900",
|
|
"FFFFFFFF"
|
|
],
|
|
"visVersion": "231219"
|
|
},
|
|
{
|
|
"type": "Micom",
|
|
"modelId": "074240475442FFFFFFFF",
|
|
"versions": [
|
|
"23120800",
|
|
"FFFFFFFF"
|
|
],
|
|
"visVersion": "231208"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"href": "/oven/vs/0",
|
|
"rep": {
|
|
"x.com.samsung.da.state": "Ready",
|
|
"x.com.samsung.da.recipe": "00000000000000",
|
|
"x.com.samsung.da.powerLevel": "0",
|
|
"rt": [
|
|
"x.com.samsung.da.oven"
|
|
],
|
|
"if": [
|
|
"oic.if.baseline",
|
|
"oic.if.s"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"href": "/quickcontrol/info/vs/0",
|
|
"rep": {
|
|
"supportedVersion": "1.0"
|
|
}
|
|
},
|
|
{
|
|
"href": "/timezone/vs/0",
|
|
"rep": {
|
|
"timezoneid": "America/New_York",
|
|
"offset": "-04:00",
|
|
"DST": "ON"
|
|
}
|
|
},
|
|
{
|
|
"href": "/wirelessinfo/vs/0",
|
|
"rep": {
|
|
"macaddressWiFi": "REDACTED",
|
|
"macaddressBLE": "REDACTED"
|
|
}
|
|
}
|
|
]
|
|
}
|