Skip to content

Commit 923c139

Browse files
Fix Freebox Home alarm & improve platform tests (home-assistant#103475)
* Fix Freebox Home alarm * Add trigger feature test & fix * FreeboxCallSensor: Add test for missing coverage of new call * Use generator Co-authored-by: Martin Hjelmare <[email protected]> * Add test for arm_home feature (questions about the check) * Stay focus on alam tests * can_arm_home ==> if _command_arm_home * Use one liner for supported_features * Add idle state * Fix rebase --------- Co-authored-by: Martin Hjelmare <[email protected]>
1 parent 6d7df5a commit 923c139

File tree

12 files changed

+177
-142
lines changed

12 files changed

+177
-142
lines changed
Lines changed: 18 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
"""Support for Freebox alarms."""
2-
import logging
32
from typing import Any
43

54
from homeassistant.components.alarm_control_panel import (
@@ -9,7 +8,7 @@
98
from homeassistant.config_entries import ConfigEntry
109
from homeassistant.const import (
1110
STATE_ALARM_ARMED_AWAY,
12-
STATE_ALARM_ARMED_NIGHT,
11+
STATE_ALARM_ARMED_HOME,
1312
STATE_ALARM_ARMING,
1413
STATE_ALARM_DISARMED,
1514
STATE_ALARM_TRIGGERED,
@@ -25,16 +24,14 @@
2524
"alarm1_arming": STATE_ALARM_ARMING,
2625
"alarm2_arming": STATE_ALARM_ARMING,
2726
"alarm1_armed": STATE_ALARM_ARMED_AWAY,
28-
"alarm2_armed": STATE_ALARM_ARMED_NIGHT,
27+
"alarm2_armed": STATE_ALARM_ARMED_HOME,
2928
"alarm1_alert_timer": STATE_ALARM_TRIGGERED,
3029
"alarm2_alert_timer": STATE_ALARM_TRIGGERED,
3130
"alert": STATE_ALARM_TRIGGERED,
31+
"idle": STATE_ALARM_DISARMED,
3232
}
3333

3434

35-
_LOGGER = logging.getLogger(__name__)
36-
37-
3835
async def async_setup_entry(
3936
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
4037
) -> None:
@@ -76,63 +73,33 @@ def __init__(
7673
self._command_state = self.get_command_id(
7774
node["type"]["endpoints"], "signal", "state"
7875
)
79-
self._set_features(self._router.home_devices[self._id])
76+
77+
self._attr_supported_features = (
78+
AlarmControlPanelEntityFeature.ARM_AWAY
79+
| (AlarmControlPanelEntityFeature.ARM_HOME if self._command_arm_home else 0)
80+
| AlarmControlPanelEntityFeature.TRIGGER
81+
)
8082

8183
async def async_alarm_disarm(self, code: str | None = None) -> None:
8284
"""Send disarm command."""
83-
if await self.set_home_endpoint_value(self._command_disarm):
84-
self._set_state(STATE_ALARM_DISARMED)
85+
await self.set_home_endpoint_value(self._command_disarm)
8586

8687
async def async_alarm_arm_away(self, code: str | None = None) -> None:
8788
"""Send arm away command."""
88-
if await self.set_home_endpoint_value(self._command_arm_away):
89-
self._set_state(STATE_ALARM_ARMING)
89+
await self.set_home_endpoint_value(self._command_arm_away)
9090

9191
async def async_alarm_arm_home(self, code: str | None = None) -> None:
9292
"""Send arm home command."""
93-
if await self.set_home_endpoint_value(self._command_arm_home):
94-
self._set_state(STATE_ALARM_ARMING)
93+
await self.set_home_endpoint_value(self._command_arm_home)
9594

9695
async def async_alarm_trigger(self, code: str | None = None) -> None:
9796
"""Send alarm trigger command."""
98-
if await self.set_home_endpoint_value(self._command_trigger):
99-
self._set_state(STATE_ALARM_TRIGGERED)
97+
await self.set_home_endpoint_value(self._command_trigger)
10098

101-
async def async_update_signal(self):
102-
"""Update signal."""
103-
state = await self.get_home_endpoint_value(self._command_state)
99+
async def async_update(self) -> None:
100+
"""Update state."""
101+
state: str | None = await self.get_home_endpoint_value(self._command_state)
104102
if state:
105-
self._set_state(state)
106-
107-
def _set_features(self, node: dict[str, Any]) -> None:
108-
"""Add alarm features."""
109-
# Search if the arm home feature is present => has an "alarm2" endpoint
110-
can_arm_home = False
111-
for nodeid, local_node in self._router.home_devices.items():
112-
if nodeid == local_node["id"]:
113-
alarm2 = next(
114-
filter(
115-
lambda x: (x["name"] == "alarm2" and x["ep_type"] == "signal"),
116-
local_node["show_endpoints"],
117-
),
118-
None,
119-
)
120-
if alarm2:
121-
can_arm_home = alarm2["value"]
122-
break
123-
124-
if can_arm_home:
125-
self._attr_supported_features = (
126-
AlarmControlPanelEntityFeature.ARM_AWAY
127-
| AlarmControlPanelEntityFeature.ARM_HOME
128-
)
129-
103+
self._attr_state = FREEBOX_TO_STATUS.get(state)
130104
else:
131-
self._attr_supported_features = AlarmControlPanelEntityFeature.ARM_AWAY
132-
133-
def _set_state(self, state: str) -> None:
134-
"""Update state."""
135-
self._attr_state = FREEBOX_TO_STATUS.get(state)
136-
if not self._attr_state:
137-
self._attr_state = STATE_ALARM_DISARMED
138-
self.async_write_ha_state()
105+
self._attr_state = None

homeassistant/components/freebox/home_base.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,13 +131,14 @@ def remove_signal_update(self, dispacher: Any):
131131
def get_value(self, ep_type: str, name: str):
132132
"""Get the value."""
133133
node = next(
134-
filter(
135-
lambda x: (x["name"] == name and x["ep_type"] == ep_type),
136-
self._node["show_endpoints"],
134+
(
135+
endpoint
136+
for endpoint in self._node["show_endpoints"]
137+
if endpoint["name"] == name and endpoint["ep_type"] == ep_type
137138
),
138139
None,
139140
)
140-
if not node:
141+
if node is None:
141142
_LOGGER.warning(
142143
"The Freebox Home device has no node value for: %s/%s", ep_type, name
143144
)

tests/components/freebox/conftest.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@
1212
DATA_CALL_GET_CALLS_LOG,
1313
DATA_CONNECTION_GET_STATUS,
1414
DATA_HOME_GET_NODES,
15-
DATA_HOME_PIR_GET_VALUES,
15+
DATA_HOME_PIR_GET_VALUE,
16+
DATA_HOME_SET_VALUE,
1617
DATA_LAN_GET_HOSTS_LIST,
1718
DATA_LAN_GET_HOSTS_LIST_MODE_BRIDGE,
1819
DATA_STORAGE_GET_DISKS,
1920
DATA_STORAGE_GET_RAIDS,
2021
DATA_SYSTEM_GET_CONFIG,
21-
WIFI_GET_GLOBAL_CONFIG,
22+
DATA_WIFI_GET_GLOBAL_CONFIG,
2223
)
2324

2425
from tests.common import MockConfigEntry
@@ -84,11 +85,16 @@ def mock_router(mock_device_registry_devices):
8485
return_value=DATA_CONNECTION_GET_STATUS
8586
)
8687
# switch
87-
instance.wifi.get_global_config = AsyncMock(return_value=WIFI_GET_GLOBAL_CONFIG)
88+
instance.wifi.get_global_config = AsyncMock(
89+
return_value=DATA_WIFI_GET_GLOBAL_CONFIG
90+
)
8891
# home devices
8992
instance.home.get_home_nodes = AsyncMock(return_value=DATA_HOME_GET_NODES)
9093
instance.home.get_home_endpoint_value = AsyncMock(
91-
return_value=DATA_HOME_PIR_GET_VALUES
94+
return_value=DATA_HOME_PIR_GET_VALUE
95+
)
96+
instance.home.set_home_endpoint_value = AsyncMock(
97+
return_value=DATA_HOME_SET_VALUE
9298
)
9399
instance.close = AsyncMock()
94100
yield service_mock

tests/components/freebox/const.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
DATA_STORAGE_GET_RAIDS = load_json_array_fixture("freebox/storage_get_raids.json")
2222

2323
# switch
24-
WIFI_GET_GLOBAL_CONFIG = load_json_object_fixture("freebox/wifi_get_global_config.json")
24+
DATA_WIFI_GET_GLOBAL_CONFIG = load_json_object_fixture(
25+
"freebox/wifi_get_global_config.json"
26+
)
2527

2628
# device_tracker
2729
DATA_LAN_GET_HOSTS_LIST = load_json_array_fixture("freebox/lan_get_hosts_list.json")
@@ -35,10 +37,14 @@
3537

3638
# Home
3739
# PIR node id 26, endpoint id 6
38-
DATA_HOME_PIR_GET_VALUES = load_json_object_fixture("freebox/home_pir_get_values.json")
40+
DATA_HOME_PIR_GET_VALUE = load_json_object_fixture("freebox/home_pir_get_value.json")
3941

4042
# Home
4143
# ALARM node id 7, endpoint id 11
42-
DATA_HOME_ALARM_GET_VALUES = load_json_object_fixture(
43-
"freebox/home_alarm_get_values.json"
44+
DATA_HOME_ALARM_GET_VALUE = load_json_object_fixture(
45+
"freebox/home_alarm_get_value.json"
4446
)
47+
48+
# Home
49+
# Set a node value with success
50+
DATA_HOME_SET_VALUE = load_json_object_fixture("freebox/home_set_value.json")
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"refresh": 2000,
3-
"value": "alarm2_armed",
3+
"value": "alarm1_armed",
44
"value_type": "string"
55
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"success": true
3+
}

0 commit comments

Comments
 (0)