Drop /information/vs/0 version entities per review
mbillow's follow-up review: exposing read-only Software/Firmware (and
Outdoor/Touch IC) version strings is "data for the sake of exposing it" --
no user control, just clutter, and every other registry leaves
/information/vs/0 in the global ignore as identity plumbing. Conforming to
that stance rather than expanding the entity surface for no user story.
- by_type/airconditioner.py: revert to *ignored.IGNORED (no _IGNORED_LESS_INFO
filter); drop airconditioner.INFO from the registry.
- capabilities/airconditioner.py: remove the INFO capability, the _info_version
/_info_items_of_type /_has_info_version helpers, and HREF_INFORMATION.
- translations/{en,nl}.json: drop software_version, firmware_version,
firmware_version_2/3, outdoor_unit_version, touch_ic_version.
- tests: drop the six INFO tests; golden regenerated for 8 AC + dehumidifier.
625 tests pass.
This commit is contained in:
1 parent
b18500dec3
commit
1bbecfa5c3
15 files changed
+2
-232
No files matched your search
-3
@@ -16,12 +16,9 @@
|
||||
"energy_kwh",
|
||||
"energy_saved_kwh",
|
||||
"fine_dust",
|
||||
"firmware_version",
|
||||
"humidity",
|
||||
"odor",
|
||||
"outdoor_unit_version",
|
||||
"power_watts",
|
||||
"software_version",
|
||||
"super_fine_dust",
|
||||
"tropical_night_mode"
|
||||
]
|
||||
|
||||
@@ -12,12 +12,9 @@
|
||||
"energy_kwh",
|
||||
"energy_saved_kwh",
|
||||
"firmware_update",
|
||||
"firmware_version",
|
||||
"firmware_version_2",
|
||||
"humidity",
|
||||
"mute_once",
|
||||
"power_watts",
|
||||
"software_version",
|
||||
"tropical_night_mode"
|
||||
]
|
||||
}
|
||||
@@ -13,12 +13,9 @@
|
||||
"energy_kwh",
|
||||
"energy_saved_kwh",
|
||||
"firmware_update",
|
||||
"firmware_version",
|
||||
"humidity",
|
||||
"mute_once",
|
||||
"outdoor_unit_version",
|
||||
"power_watts",
|
||||
"software_version",
|
||||
"tropical_night_mode"
|
||||
]
|
||||
}
|
||||
@@ -16,15 +16,11 @@
|
||||
"energy_saved_kwh",
|
||||
"fine_dust",
|
||||
"firmware_update",
|
||||
"firmware_version",
|
||||
"firmware_version_2",
|
||||
"firmware_version_3",
|
||||
"humidity",
|
||||
"mute_once",
|
||||
"selfcheck_error",
|
||||
"selfcheck_result",
|
||||
"selfcheck_status",
|
||||
"software_version",
|
||||
"super_fine_dust",
|
||||
"tropical_night_mode"
|
||||
]
|
||||
|
||||
@@ -16,14 +16,10 @@
|
||||
"energy_kwh",
|
||||
"energy_saved_kwh",
|
||||
"firmware_update",
|
||||
"firmware_version",
|
||||
"firmware_version_2",
|
||||
"firmware_version_3",
|
||||
"mute_once",
|
||||
"selfcheck_error",
|
||||
"selfcheck_result",
|
||||
"selfcheck_status",
|
||||
"software_version",
|
||||
"tropical_night_mode"
|
||||
]
|
||||
}
|
||||
@@ -12,12 +12,9 @@
|
||||
"energy_kwh",
|
||||
"energy_saved_kwh",
|
||||
"firmware_update",
|
||||
"firmware_version",
|
||||
"firmware_version_2",
|
||||
"humidity",
|
||||
"mute_once",
|
||||
"power_watts",
|
||||
"software_version",
|
||||
"tropical_night_mode"
|
||||
]
|
||||
}
|
||||
@@ -11,11 +11,9 @@
|
||||
"display_light",
|
||||
"energy_kwh",
|
||||
"firmware_update",
|
||||
"firmware_version",
|
||||
"humidity",
|
||||
"mute_once",
|
||||
"power_watts",
|
||||
"software_version",
|
||||
"tropical_night_mode"
|
||||
]
|
||||
}
|
||||
@@ -15,12 +15,9 @@
|
||||
"dust",
|
||||
"energy_kwh",
|
||||
"fine_dust",
|
||||
"firmware_version",
|
||||
"humidity",
|
||||
"odor",
|
||||
"outdoor_unit_version",
|
||||
"power_watts",
|
||||
"software_version",
|
||||
"super_fine_dust",
|
||||
"tropical_night_mode"
|
||||
]
|
||||
|
||||
@@ -13,9 +13,6 @@
|
||||
"energy_kwh",
|
||||
"energy_saved_kwh",
|
||||
"firmware_update",
|
||||
"firmware_version",
|
||||
"firmware_version_2",
|
||||
"firmware_version_3",
|
||||
"humidity",
|
||||
"mute_once",
|
||||
"overload_protection_active",
|
||||
@@ -23,7 +20,6 @@
|
||||
"selfcheck_error",
|
||||
"selfcheck_result",
|
||||
"selfcheck_status",
|
||||
"software_version",
|
||||
"tropical_night_mode"
|
||||
]
|
||||
}
|
||||
+1
-5
@@ -12,15 +12,11 @@
|
||||
"energy_kwh",
|
||||
"energy_saved_kwh",
|
||||
"firmware_update",
|
||||
"firmware_version",
|
||||
"humidity",
|
||||
"mute_once",
|
||||
"outdoor_unit_version",
|
||||
"power_watts",
|
||||
"selfcheck_error",
|
||||
"selfcheck_result",
|
||||
"selfcheck_status",
|
||||
"software_version",
|
||||
"touch_ic_version"
|
||||
"selfcheck_status"
|
||||
]
|
||||
}
|
||||
@@ -634,90 +634,3 @@ def test_sensor_item_value_picks_first_value():
|
||||
assert airconditioner._sensor_item_value(items, 'Odor') is None
|
||||
assert airconditioner._sensor_item_value(items, 'Missing') is None
|
||||
assert airconditioner._sensor_item_value(None, 'Dust') is None
|
||||
|
||||
|
||||
def test_software_and_firmware_version_from_info_items():
|
||||
"""/information/vs/0 items[] carry Software/Firmware version strings
|
||||
(the href is otherwise identity plumbing; the AC registry drops the global
|
||||
ignore so INFO is the sole cap on it). Each version item is a distinct
|
||||
MCU; they're exposed per-item rather than collapsed to one 'first wins'."""
|
||||
reg, resources = _ac_windfree()
|
||||
state = flatten(
|
||||
discover(resources, reg.capabilities, reg.pattern_capabilities), resources)
|
||||
assert state['software_version'] == '02181A230313'
|
||||
assert state['firmware_version'] == '20082000,FFFFFFFF'
|
||||
assert state['outdoor_unit_version'] == '20091600,10000400'
|
||||
# windfree has a single Firmware item -> no _2/_3 entities.
|
||||
assert 'firmware_version_2' not in state
|
||||
assert 'touch_ic_version' not in state
|
||||
|
||||
|
||||
def test_info_version_exposes_each_firmware_mcu():
|
||||
"""tp1x_da_ac_rac_01011 reports three Firmware items (separate MCUs) --
|
||||
each surfaces as its own diagnostic, not collapsed to the first."""
|
||||
reg, resources = _ac_tp1x()
|
||||
state = flatten(
|
||||
discover(resources, reg.capabilities, reg.pattern_capabilities), resources)
|
||||
assert state['software_version'] == '02762A260401'
|
||||
assert state['firmware_version'] == '02756C25082500,FFFFFFFFFFFFFF'
|
||||
assert state['firmware_version_2'] == '02669A24092600,02636A10001200'
|
||||
assert state['firmware_version_3'] == '02672A10001000,FFFFFFFFFFFFFF'
|
||||
|
||||
|
||||
def test_info_version_skips_item_with_no_number():
|
||||
"""tp2x_rac_20k's second Firmware item carries no x.com.samsung.da.number
|
||||
-- exists_fn suppresses firmware_version_2 rather than binding a
|
||||
permanently-unknown entity."""
|
||||
reg, resources = _resolve('airconditioner_tp2x_rac_20k')
|
||||
state = flatten(
|
||||
discover(resources, reg.capabilities, reg.pattern_capabilities), resources)
|
||||
assert state['firmware_version'] == '102296A23012700'
|
||||
assert 'firmware_version_2' not in state
|
||||
|
||||
|
||||
def test_info_version_touch_ic_on_window_ac():
|
||||
"""window_ac additionally reports a Touch IC version item."""
|
||||
resources = _load_device('airconditioner_window_ac')
|
||||
info = resources['/information/vs/0']
|
||||
reg = for_device_by_model(
|
||||
info['x.com.samsung.da.modelNum'], info['x.com.samsung.da.description'])
|
||||
state = flatten(
|
||||
discover(resources, reg.capabilities, reg.pattern_capabilities), resources)
|
||||
assert state['software_version'] == '02545A260601'
|
||||
assert state['firmware_version'] == '02543A24061800,FFFFFFFFFFFFFF'
|
||||
assert state['outdoor_unit_version'] == '02580A10000100,FFFFFFFFFFFFFF'
|
||||
assert state['touch_ic_version'] == '02553A23031600,FFFFFFFFFFFFFF'
|
||||
|
||||
|
||||
def test_info_version_per_ordinal():
|
||||
"""_info_version returns the ordinal-th item of a type; None when absent
|
||||
or (via exists_fn) when that item carries no number."""
|
||||
items = [
|
||||
{'x.com.samsung.da.type': 'Software', 'x.com.samsung.da.number': 'SW1'},
|
||||
{'x.com.samsung.da.type': 'Firmware', 'x.com.samsung.da.number': 'FW1'},
|
||||
{'x.com.samsung.da.type': 'Firmware', 'x.com.samsung.da.number': 'FW2'},
|
||||
{'x.com.samsung.da.type': 'Firmware'}, # no number
|
||||
]
|
||||
assert airconditioner._info_version(items, 'Software', 0) == 'SW1'
|
||||
assert airconditioner._info_version(items, 'Firmware', 0) == 'FW1'
|
||||
assert airconditioner._info_version(items, 'Firmware', 1) == 'FW2'
|
||||
assert airconditioner._info_version(items, 'Firmware', 2) is None # no number
|
||||
assert airconditioner._info_version(items, 'Firmware', 3) is None # no such ordinal
|
||||
assert airconditioner._info_version(items, 'Outdoor', 0) is None
|
||||
assert airconditioner._info_version(None, 'Software', 0) is None
|
||||
assert airconditioner._has_info_version('Firmware', 0)( # exists_fn
|
||||
{'x.com.samsung.da.items': items}, {}) is True
|
||||
assert airconditioner._has_info_version('Firmware', 2)( # item w/o number
|
||||
{'x.com.samsung.da.items': items}, {}) is False
|
||||
|
||||
|
||||
def test_info_drops_global_ignore_on_information_href():
|
||||
"""The AC registry drops /information/vs/0 from ignored.IGNORED so INFO is
|
||||
the sole capability on the href (no no-entity coverage cap duplicates)."""
|
||||
reg, _ = _ac()
|
||||
caps = reg.capabilities.get('/information/vs/0')
|
||||
assert caps, '/information/vs/0'
|
||||
# INFO is the only cap on the href, and it carries real entities.
|
||||
assert len(caps) == 1
|
||||
assert caps[0] is airconditioner.INFO
|
||||
assert airconditioner.INFO.entities != ()
|
||||
Reference in new issue
Block a user