api: make relay outputs hardware-profile aware

This commit is contained in:
2026-06-09 15:13:57 -06:00
parent f2966518da
commit c166b38730
10 changed files with 183 additions and 37 deletions
+40 -2
View File
@@ -134,7 +134,19 @@ def test_status_fixture_matches_dashboard_contract_shape():
"online",
"temperature_f",
])
assert_keys(payload["relays"][0], ["id", "name", "pin", "enabled", "state"])
assert payload["hardware_profile"] == "generic_esp32_2ch_relay"
assert payload["output_count"] == 2
assert_keys(payload["relays"][0], [
"id",
"name",
"role",
"hardware_channel",
"hardware_profile",
"pin",
"enabled",
"available",
"state",
])
assert_keys(payload["network"], [
"wifi_enabled",
"uart_connected",
@@ -161,12 +173,25 @@ def test_config_fixture_matches_current_config_response_shape():
assert_keys(payload, [
"device_name",
"hardware_profile",
"output_count",
"relays",
"bms",
"temperature_sensor_count",
"temperature_sensors",
])
assert_keys(payload["relays"][0], ["id", "name", "pin", "enabled"])
assert payload["hardware_profile"] == "generic_esp32_2ch_relay"
assert payload["output_count"] == 2
assert_keys(payload["relays"][0], [
"id",
"name",
"role",
"hardware_channel",
"hardware_profile",
"pin",
"enabled",
"available",
])
assert_keys(payload["bms"], ["enabled", "name", "address", "address_type"])
assert_keys(payload["temperature_sensors"][0], [
"id",
@@ -211,6 +236,19 @@ def test_relay_set_contract_fixtures_and_firmware_errors():
assert '"unknown_relay"' in source
def test_relay_api_is_output_count_agnostic():
source = firmware_source()
assert 'doc["hardware_profile"] = HARDWARE_PROFILE;' in source
assert 'doc["output_count"] = MAX_RELAYS;' in source
assert 'for (int i = 0; i < MAX_RELAYS; i++)' in source
assert 'relay["hardware_channel"] = appConfig.relays[i].hardwareChannel;' in source
assert 'relay["available"] = appConfig.relays[i].available;' in source
assert 'relays.state[index] = enabled;' in source
assert 'relays.relay1' not in source
assert 'relays.relay2' not in source
def test_temp_scan_assign_clear_contract_fixtures():
scan = load_fixture("temp_scan_response.json")
assign_request = load_fixture("temp_assign_request.json")