Skip to content

Commit

Permalink
v0.7.4
Browse files Browse the repository at this point in the history
  • Loading branch information
gvigroux committed Jan 11, 2025
1 parent 30486e8 commit 002165c
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 34 deletions.
1 change: 1 addition & 0 deletions custom_components/freebox_home/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,5 +71,6 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry):
if unload_ok:
router = hass.data[DOMAIN].pop(entry.unique_id)
await router.close()
await router.remove_config(hass, entry.data[CONF_HOST])

return unload_ok
74 changes: 47 additions & 27 deletions custom_components/freebox_home/alarm_control_panel.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,14 +55,15 @@ def __init__(self, hass, router: FreeboxRouter, node: Dict[str, any]) -> None:
self._command_timeout3 = self.get_command_id(node['type']['endpoints'], "slot", "timeout3") # Durée de la sirène
self._command_state = self.get_command_id(node['type']['endpoints'], "signal", "state" )

self.set_state("idle")
#self.set_state("idle")
self._freebox_alarm_state = "idle"
self._unsub_watcher = None
self._supported_features = AlarmControlPanelEntityFeature.ARM_AWAY
self.update_parameters(node)

@property
def state(self) -> str:
return self._state
#@property
#def state(self) -> str:
# return self._state

@property
def supported_features(self) -> int:
Expand Down Expand Up @@ -90,19 +91,18 @@ async def async_alarm_arm_night(self, code=None) -> None:
time.sleep(1)
self._unsub_watcher = async_track_time_interval(self.hass, self.sync_update_during_arming, timedelta(seconds=1))


async def sync_update_during_arming(self, now: Optional[datetime] = None) -> None:
self.set_state(await self.get_home_endpoint_value( self._command_state))
#self.set_state(await self.get_home_endpoint_value( self._command_state))
self._freebox_alarm_state = await self.get_home_endpoint_value( self._command_state)
self.async_write_ha_state()

async def async_update(self):
"""Get the state & name and update it."""
state = await self.get_home_endpoint_value( self._command_state)
if( state == "idle" and self._unsub_watcher != None):
self._freebox_alarm_state = await self.get_home_endpoint_value( self._command_state)
if( self._freebox_alarm_state == "idle" and self._unsub_watcher != None):
self._unsub_watcher()
self.update_parameters(self._router.nodes[self._id])


def update_parameters(self, node):
#Update name
self._name = node["label"].strip()
Expand All @@ -120,7 +120,6 @@ def update_parameters(self, node):
else:
self._supported_features = AlarmControlPanelEntityFeature.ARM_AWAY


# Parse all endpoints values
for endpoint in filter(lambda x:(x["ep_type"] == "signal"), node['show_endpoints']):
if( endpoint["name"] == "pin" ):
Expand All @@ -138,21 +137,42 @@ def update_parameters(self, node):
elif( endpoint["name"] == "battery" ):
self._battery = endpoint["value"]

def set_state(self, state):
if( state == "alarm1_arming"):
self._state = AlarmControlPanelState.ARMING
elif( state == "alarm2_arming"):
self._state = SAlarmControlPanelState.ARMING
elif( state == "alarm1_armed"):
self._state = AlarmControlPanelState.ARMED_AWAY
elif( state == "alarm2_armed"):
self._state = AlarmControlPanelState.ARMED_NIGHT
elif( state == "alarm1_alert_timer"):
self._state = AlarmControlPanelState.TRIGGERED
elif( state == "alarm2_alert_timer"):
self._state = AlarmControlPanelState.TRIGGERED
elif( state == "alert"):
self._state = AlarmControlPanelState.TRIGGERED
else:
self._state = AlarmControlPanelState.DISARMED
# def set_state(self, state):
# if( state == "alarm1_arming"):
# self._state = AlarmControlPanelState.ARMING
# elif( state == "alarm2_arming"):
# self._state = SAlarmControlPanelState.ARMING
# elif( state == "alarm1_armed"):
# self._state = AlarmControlPanelState.ARMED_AWAY
# elif( state == "alarm2_armed"):
# self._state = AlarmControlPanelState.ARMED_NIGHT
# elif( state == "alarm1_alert_timer"):
# self._state = AlarmControlPanelState.TRIGGERED
# elif( state == "alarm2_alert_timer"):
# self._state = AlarmControlPanelState.TRIGGERED
# elif( state == "alert"):
# self._state = AlarmControlPanelState.TRIGGERED
# else:
# self._state = AlarmControlPanelState.DISARMED


@property
def alarm_state(self) -> AlarmControlPanelState | None:
"""Return the state of the alarm."""

if( self._freebox_alarm_state == "alarm1_arming"):
return AlarmControlPanelState.ARMING
elif( self._freebox_alarm_state == "alarm2_arming"):
return SAlarmControlPanelState.ARMING
elif( self._freebox_alarm_state == "alarm1_armed"):
return AlarmControlPanelState.ARMED_AWAY
elif( self._freebox_alarm_state == "alarm2_armed"):
return AlarmControlPanelState.ARMED_NIGHT
elif( self._freebox_alarm_state == "alarm1_alert_timer"):
return AlarmControlPanelState.TRIGGERED
elif( self._freebox_alarm_state == "alarm2_alert_timer"):
returnAlarmControlPanelState.TRIGGERED
elif( self._freebox_alarm_state == "alert"):
return AlarmControlPanelState.TRIGGERED
return AlarmControlPanelState.DISARMED

7 changes: 5 additions & 2 deletions custom_components/freebox_home/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from homeassistant.data_entry_flow import AbortFlow

from .const import DOMAIN
from .router import get_api
from .router import get_api, remove_config

_LOGGER = logging.getLogger(__name__)

Expand Down Expand Up @@ -90,7 +90,10 @@ async def async_step_link(self, user_input=None):
'''

except AuthorizationError as error:
_LOGGER.error(error)
# Config file may be wrong, I will delete IT.
_LOGGER.error("AuthorizationError: %s", error)
await remove_config(self.hass, self._host)
_LOGGER.error("The current configuration file is invalid. It has been deleted. Please retry")
errors["base"] = "register_failed"

except HttpRequestError:
Expand Down
2 changes: 1 addition & 1 deletion custom_components/freebox_home/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@
"after_dependencies": ["zeroconf"],
"zeroconf": ["_fbx-api._tcp.local."],
"codeowners": ["gvigroux"],
"version": "0.7.3"
"version": "0.7.4"
}
28 changes: 24 additions & 4 deletions custom_components/freebox_home/router.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""Represent the Freebox router and its devices and sensors."""
from datetime import datetime, timedelta
import logging
import os
from pathlib import Path
from typing import Any, Dict, Optional

Expand Down Expand Up @@ -79,11 +80,30 @@ async def close(self) -> None:
self._api = None


#async def get_api(hass, host: str) -> Freepybox:
# """Get the Freebox API."""
# #freebox_path = Path(hass.helpers.storage.Store(STORAGE_VERSION, STORAGE_KEY).path)
# freebox_path = Path(Store(hass, STORAGE_VERSION, STORAGE_KEY).path)
# freebox_path.mkdir(exist_ok=True)
#
# token_file = Path(f"{freebox_path}/{slugify(host)}.conf")
# return Freepybox(APP_DESC, token_file, API_VERSION)


async def get_api(hass, host: str) -> Freepybox:
"""Get the Freebox API."""
#freebox_path = Path(hass.helpers.storage.Store(STORAGE_VERSION, STORAGE_KEY).path)
freebox_path = Path(Store(hass, STORAGE_VERSION, STORAGE_KEY).path)
freebox_path.mkdir(exist_ok=True)
freebox_path = Store(hass, STORAGE_VERSION, STORAGE_KEY).path

if not os.path.exists(freebox_path):
await hass.async_add_executor_job(os.makedirs, freebox_path)

token_file = Path(f"{freebox_path}/{slugify(host)}.conf")

return Freepybox(APP_DESC, token_file, api_version="latest")


async def remove_config(hass, host: str):
freebox_path = Store(hass, STORAGE_VERSION, STORAGE_KEY).path
token_file = Path(f"{freebox_path}/{slugify(host)}.conf")
return Freepybox(APP_DESC, token_file, API_VERSION)
os.remove(token_file)

0 comments on commit 002165c

Please sign in to comment.