Skip to content

Commit 732b143

Browse files
authored
0.24.0b0 (#701)
* Add OpenVPN client support for stock 388 FW (#685) * Add WireGuard Client support (VPN Fusion, stock 388) (#686) * Add WireGuard Server support (stock 388) (#687) * Optimize sensors fetching code (#688) * Add OpenVPN Server support (stock 388) (#689) * Pass WireGuard server ID on service call (#691) * Create new aiohttp session (#692) * Add secondary WAN support (#696) * Add `dualwan` binary sensor (#697) * Add `WAN Aggregation` sensor (#698) * Fix diagnostics module (#699) * Auto reload on privacy settings change (#700) * Bump asusrouter to `1.1.0b0` * Bump version to `0.24.0b0`
1 parent d542a2a commit 732b143

File tree

6 files changed

+335
-198
lines changed

6 files changed

+335
-198
lines changed

custom_components/asusrouter/bridge.py

Lines changed: 94 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
from asusrouter.modules.client import AsusClient
1414
from asusrouter.modules.data import AsusData
1515
from asusrouter.modules.homeassistant import (
16+
convert_to_ha_data,
1617
convert_to_ha_sensors,
18+
convert_to_ha_sensors_list,
1719
convert_to_ha_state_bool,
1820
)
1921
from asusrouter.modules.identity import AsusDevice
@@ -46,7 +48,6 @@
4648
METHOD,
4749
MODE_SENSORS,
4850
NETWORK,
49-
NETWORK_STAT,
5051
PARENTAL_CONTROL,
5152
PORT_FORWARDING,
5253
PORTS,
@@ -58,13 +59,9 @@
5859
SENSORS_PARENTAL_CONTROL,
5960
SENSORS_PORT_FORWARDING,
6061
SENSORS_RAM,
61-
SENSORS_SYSINFO,
62-
SENSORS_WAN,
6362
STATE,
6463
SYSINFO,
6564
TEMPERATURE,
66-
VPN,
67-
WAN,
6865
WLAN,
6966
)
7067

@@ -188,25 +185,33 @@ async def async_get_available_sensors(self) -> dict[str, dict[str, Any]]:
188185
sensors = {
189186
BOOTTIME: {SENSORS: SENSORS_BOOTTIME, METHOD: self._get_data_boottime},
190187
CPU: {
191-
SENSORS: await self._get_sensors_cpu(),
188+
SENSORS: await self._get_sensors_modern(AsusData.CPU),
192189
METHOD: self._get_data_cpu,
193190
},
194191
FIRMWARE: {
195192
SENSORS: SENSORS_FIRMWARE,
196193
METHOD: self._get_data_firmware,
197194
},
198195
GWLAN: {
199-
SENSORS: await self._get_sensors_gwlan(),
196+
SENSORS: await self._get_sensors_modern(AsusData.GWLAN),
200197
METHOD: self._get_data_gwlan,
201198
},
202199
LED: {
203200
SENSORS: SENSORS_LED,
204201
METHOD: self._get_data_led,
205202
},
206203
NETWORK: {
207-
SENSORS: await self._get_sensors_network(),
204+
SENSORS: await self._get_sensors_modern(AsusData.NETWORK),
208205
METHOD: self._get_data_network,
209206
},
207+
"ovpn_client": {
208+
SENSORS: await self._get_sensors_modern(AsusData.OPENVPN_CLIENT),
209+
METHOD: self._get_data_ovpn_client,
210+
},
211+
"ovpn_server": {
212+
SENSORS: await self._get_sensors_ovpn_server(),
213+
METHOD: self._get_data_ovpn_server,
214+
},
210215
PARENTAL_CONTROL: {
211216
SENSORS: SENSORS_PARENTAL_CONTROL,
212217
METHOD: self._get_data_parental_control,
@@ -221,23 +226,27 @@ async def async_get_available_sensors(self) -> dict[str, dict[str, Any]]:
221226
},
222227
RAM: {SENSORS: SENSORS_RAM, METHOD: self._get_data_ram},
223228
SYSINFO: {
224-
SENSORS: await self._get_sensors_sysinfo(),
229+
SENSORS: await self._get_sensors_modern(AsusData.SYSINFO),
225230
METHOD: self._get_data_sysinfo,
226231
},
227232
TEMPERATURE: {
228-
SENSORS: await self._get_sensors_temperature(),
233+
SENSORS: await self._get_sensors_modern(AsusData.TEMPERATURE),
229234
METHOD: self._get_data_temperature,
230235
},
231-
VPN: {
232-
SENSORS: await self._get_sensors_vpn(),
233-
METHOD: self._get_data_vpn,
234-
},
235-
WAN: {
236-
SENSORS: SENSORS_WAN,
236+
"wan": {
237+
SENSORS: await self._get_sensors_modern(AsusData.WAN),
237238
METHOD: self._get_data_wan,
238239
},
240+
"wireguard_client": {
241+
SENSORS: await self._get_sensors_modern(AsusData.WIREGUARD_CLIENT),
242+
METHOD: self._get_data_wireguard_client,
243+
},
244+
"wireguard_server": {
245+
SENSORS: await self._get_sensors_modern(AsusData.WIREGUARD_SERVER),
246+
METHOD: self._get_data_wireguard_server,
247+
},
239248
WLAN: {
240-
SENSORS: await self._get_sensors_wlan(),
249+
SENSORS: await self._get_sensors_modern(AsusData.WLAN),
241250
METHOD: self._get_data_wlan,
242251
},
243252
}
@@ -265,6 +274,19 @@ async def _get_data(
265274
except AsusRouterError as ex:
266275
raise UpdateFailed(ex) from ex
267276

277+
async def _get_data_modern(
278+
self,
279+
datatype: AsusData,
280+
force: bool = False,
281+
) -> dict[str, Any]:
282+
"""Get data from the device. This is a generic method."""
283+
284+
try:
285+
raw = await self.api.async_get_data(datatype, force=force)
286+
return self._process_data_modern(raw)
287+
except AsusRouterError as ex:
288+
raise UpdateFailed(ex) from ex
289+
268290
# AiMesh nodes
269291
async def async_get_aimesh_nodes(self) -> dict[str, AiMeshDevice]:
270292
"""Get dict of AiMesh nodes."""
@@ -308,6 +330,16 @@ async def _get_data_network(self) -> dict[str, Any]:
308330

309331
return await self._get_data(AsusData.NETWORK)
310332

333+
async def _get_data_ovpn_client(self) -> dict[str, Any]:
334+
"""Get OpenVPN client data from the device."""
335+
336+
return await self._get_data_modern(AsusData.OPENVPN_CLIENT)
337+
338+
async def _get_data_ovpn_server(self) -> dict[str, Any]:
339+
"""Get OpenVPN server data from the device."""
340+
341+
return await self._get_data(AsusData.OPENVPN_SERVER)
342+
311343
async def _get_data_parental_control(self) -> dict[str, dict[str, int]]:
312344
"""Get parental control data from the device."""
313345

@@ -344,15 +376,20 @@ async def _get_data_temperature(self) -> dict[str, Any]:
344376

345377
return await self._get_data(AsusData.TEMPERATURE)
346378

347-
async def _get_data_vpn(self) -> dict[str, Any]:
348-
"""Get VPN data from the device."""
349-
350-
return await self._get_data(AsusData.OPENVPN)
351-
352379
async def _get_data_wan(self) -> dict[str, Any]:
353380
"""Get WAN data from the device."""
354381

355-
return await self._get_data(AsusData.WAN)
382+
return await self._get_data_modern(AsusData.WAN)
383+
384+
async def _get_data_wireguard_client(self) -> dict[str, Any]:
385+
"""Get WireGuard client data from the device."""
386+
387+
return await self._get_data_modern(AsusData.WIREGUARD_CLIENT)
388+
389+
async def _get_data_wireguard_server(self) -> dict[str, Any]:
390+
"""Get WireGuard server data from the device."""
391+
392+
return await self._get_data_modern(AsusData.WIREGUARD_SERVER)
356393

357394
async def _get_data_wlan(self) -> dict[str, Any]:
358395
"""Get WLAN data from the device."""
@@ -368,6 +405,12 @@ def _process_data(raw: dict[str, Any]) -> dict[str, Any]:
368405

369406
return helpers.as_dict(helpers.flatten_dict(raw))
370407

408+
@staticmethod
409+
def _process_data_modern(raw: dict[str, Any]) -> dict[str, Any]:
410+
"""Process `ovpn_client` data."""
411+
412+
return helpers.clean_dict(convert_to_ha_data(raw))
413+
371414
@staticmethod
372415
def _process_data_parental_control(raw: dict[str, Any]) -> dict[str, Any]:
373416
"""Process `parental control` data."""
@@ -456,31 +499,35 @@ async def _get_sensors(
456499
)
457500
return sensors
458501

459-
async def _get_sensors_cpu(self) -> list[str]:
460-
"""Get the available CPU sensors."""
461-
462-
return await self._get_sensors(
463-
AsusData.CPU,
464-
self._process_sensors_cpu,
465-
sensor_type=CPU,
466-
defaults=True,
467-
)
468-
469-
async def _get_sensors_gwlan(self) -> list[str]:
470-
"""Get the available GWLAN sensors."""
502+
async def _get_sensors_modern(self, datatype: AsusData) -> list[str]:
503+
"""Get the available sensors. This is a generic method."""
471504

472-
return await self._get_sensors(
473-
AsusData.GWLAN,
474-
sensor_type=GWLAN,
475-
)
505+
sensors = []
506+
try:
507+
data = await self.api.async_get_data(datatype)
508+
_LOGGER.debug(
509+
"Raw `%s` sensors of type (%s): %s", datatype, type(data), data
510+
)
511+
sensors = convert_to_ha_sensors_list(data)
512+
_LOGGER.debug("Available `%s` sensors: %s", datatype.value, sensors)
513+
except AsusRouterError as ex:
514+
if datatype.value in DEFAULT_SENSORS:
515+
sensors = DEFAULT_SENSORS[datatype.value]
516+
_LOGGER.debug(
517+
"Cannot get available `%s` sensors with exception: %s. \
518+
Will use the following list: {sensors}",
519+
datatype.value,
520+
ex,
521+
)
522+
return sensors
476523

477-
async def _get_sensors_network(self) -> list[str]:
478-
"""Get the available network stat sensors."""
524+
async def _get_sensors_ovpn_server(self) -> list[str]:
525+
"""Get the available OpenVPN server sensors."""
479526

480527
return await self._get_sensors(
481-
AsusData.NETWORK,
482-
self._process_sensors_network,
483-
sensor_type=NETWORK_STAT,
528+
AsusData.OPENVPN_SERVER,
529+
self._process_sensors_ovpn_server,
530+
sensor_type="ovpn_server",
484531
)
485532

486533
async def _get_sensors_ports(self) -> list[str]:
@@ -492,35 +539,6 @@ async def _get_sensors_ports(self) -> list[str]:
492539
sensor_type=PORTS,
493540
)
494541

495-
async def _get_sensors_sysinfo(self) -> list[str]:
496-
"""Get the available sysinfo sensors."""
497-
498-
return await self._get_sensors(
499-
AsusData.SYSINFO,
500-
self._process_sensors_sysinfo,
501-
sensor_type=SYSINFO,
502-
)
503-
504-
async def _get_sensors_temperature(self) -> list[str]:
505-
"""Get the available temperature sensors."""
506-
507-
return await self._get_sensors(AsusData.TEMPERATURE, sensor_type=TEMPERATURE)
508-
509-
async def _get_sensors_vpn(self) -> list[str]:
510-
"""Get the available VPN sensors."""
511-
512-
return await self._get_sensors(
513-
AsusData.OPENVPN, self._process_sensors_vpn, sensor_type=VPN
514-
)
515-
516-
async def _get_sensors_wlan(self) -> list[str]:
517-
"""Get the available WLAN sensors."""
518-
519-
return await self._get_sensors(
520-
AsusData.WLAN,
521-
sensor_type=WLAN,
522-
)
523-
524542
# <- GET SENSORS LIST
525543

526544
# PROCESS SENSORS LIST->
@@ -535,18 +553,6 @@ def _process_sensors(raw: dict[str, Any]) -> list[str]:
535553
flat = helpers.as_dict(helpers.flatten_dict(raw))
536554
return helpers.list_from_dict(flat)
537555

538-
@staticmethod
539-
def _process_sensors_cpu(raw: dict[str, Any]) -> list[str]:
540-
"""Process CPU sensors."""
541-
542-
return convert_to_ha_sensors(raw, AsusData.CPU)
543-
544-
@staticmethod
545-
def _process_sensors_network(raw: dict[str, Any]) -> list[str]:
546-
"""Process network sensors."""
547-
548-
return convert_to_ha_sensors(raw, AsusData.NETWORK)
549-
550556
@staticmethod
551557
def _process_sensors_ports(raw: dict[str, Any]) -> list[str]:
552558
"""Process ports sensors."""
@@ -560,18 +566,9 @@ def _process_sensors_ports(raw: dict[str, Any]) -> list[str]:
560566
return sensors
561567

562568
@staticmethod
563-
def _process_sensors_sysinfo(raw: Optional[dict[str, Any]]) -> list[str]:
564-
"""Process SysInfo sensors."""
565-
566-
if raw is None or not isinstance(raw, dict):
567-
return []
568-
569-
return SENSORS_SYSINFO
570-
571-
@staticmethod
572-
def _process_sensors_vpn(raw: dict[str, Any]) -> list[str]:
573-
"""Process VPN sensors."""
569+
def _process_sensors_ovpn_server(raw: dict[str, Any]) -> list[str]:
570+
"""Process OpenVPN server sensors."""
574571

575-
return convert_to_ha_sensors(raw, AsusData.OPENVPN)
572+
return convert_to_ha_sensors(raw, AsusData.OPENVPN_SERVER)
576573

577574
# <- PROCESS SENSORS LIST

0 commit comments

Comments
 (0)