airconditioner: ungate outdoor_temperature from is_legacy_board

The OutdoorTemp_ options token was only surfaced on legacy boards
(is_legacy_board), even though 14 of 17 fixtures carrying the token are
non-legacy. issue #367 confirmed with a 48h field capture (r=0.92
against weather.forecast_home) that the token tracks real outdoor
temperature independent of board generation, and that no non-legacy
board exposes an alternative outdoor-temperature resource.

Split a token-presence-only exists_fn (_has_option_token_any_board) for
this token, leaving _has_option_token's legacy gate untouched for the
other options[] settings that still need it. The -55 offset itself was
only field-validated on Celsius-locale boards, so a second gate
(_reports_celsius, reading the board's own /temperatures/vs/0) keeps
the sensor off the one Fahrenheit-locale fixture on record rather than
guess whether the same offset and unit still apply there. Ships
enabled_default=False since multi-split installs report the same token
on every indoor head, which would otherwise create one duplicate active
sensor per head.

Updates the golden fixtures for the 13 affected Celsius-locale boards
and the artik051_krac test that had asserted outdoor_temperature stays
off newer boards; adds coverage for the Fahrenheit-locale gate.
This commit is contained in:
Marc Billow committed 2026-08-15 21:38:56 +00:00
1 parent 8814fffa4f
commit fe0db8586f
3 files changed
+43 -9

No files matched your search

@@ -22,7 +22,6 @@
"mute_once",
"odor_controller_active",
"odor_controller_progress",
"outdoor_temperature",
"power_watts",
"tropical_night_mode"
]
+16
View File
@@ -654,6 +654,22 @@ def test_lnx_rac_heatpump_no_unbound_hrefs():
assert unbound == []
def test_lnx_rac_heatpump_outdoor_temperature_stays_off_fahrenheit_boards():
"""issue #367's -55 offset was field-validated on Celsius-locale boards
only; this fixture's own /temperatures/vs/0 declares Fahrenheit despite
carrying an OutdoorTemp_ token, so the sensor stays off rather than
apply an unvalidated offset/unit to it (see _reports_celsius)."""
reg, resources = _ac_lnx_rac_heatpump()
temps_item = resources["/temperatures/vs/0"]["x.com.samsung.da.items"][0]
assert temps_item["x.com.samsung.da.unit"] == "Fahrenheit"
options = resources["/mode/vs/0"]["x.com.samsung.da.options"]
assert any(o.startswith("OutdoorTemp_") for o in options)
bound = discover(resources, reg.capabilities, reg.pattern_capabilities)
state = flatten(bound, resources)
assert "outdoor_temperature" not in state
def test_lnx_rac_heatpump_absence_power_saving_state():
reg, resources = _ac_lnx_rac_heatpump()
bound = discover(resources, reg.capabilities, reg.pattern_capabilities)