Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion homeassistant/components/asuswrt/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
MAX_RETRY_TIME = 900

SECRET_GROUP = "Password or SSH Key"
SENSOR_TYPES = ["upload_speed", "download_speed", "download", "upload"]
SENSOR_TYPES = ["devices", "upload_speed", "download_speed", "download", "upload"]

CONFIG_SCHEMA = vol.Schema(
{
Expand Down
21 changes: 20 additions & 1 deletion homeassistant/components/asuswrt/sensor.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
"""Asuswrt status sensors."""
import logging

from aioasuswrt.asuswrt import AsusWrt

from homeassistant.const import DATA_GIGABYTES, DATA_RATE_MEGABITS_PER_SECOND
from homeassistant.helpers.entity import Entity

Expand All @@ -18,6 +20,8 @@ async def async_setup_platform(hass, config, add_entities, discovery_info=None):

devices = []

if "devices" in discovery_info:
devices.append(AsuswrtDevicesSensor(api))
if "download" in discovery_info:
devices.append(AsuswrtTotalRXSensor(api))
if "upload" in discovery_info:
Expand All @@ -35,10 +39,12 @@ class AsuswrtSensor(Entity):

_name = "generic"

def __init__(self, api):
def __init__(self, api: AsusWrt):
"""Initialize the sensor."""
self._api = api
self._state = None
self._attributes = None
self._devices = None
self._rates = None
self._speed = None

Expand All @@ -54,10 +60,23 @@ def state(self):

async def async_update(self):
"""Fetch status from asuswrt."""
self._devices = await self._api.async_get_connected_devices()
self._rates = await self._api.async_get_bytes_total()
self._speed = await self._api.async_get_current_transfer_rates()


class AsuswrtDevicesSensor(AsuswrtSensor):
"""Representation of a asuswrt download speed sensor."""

_name = "Asuswrt Devices Connected"

async def async_update(self):
"""Fetch new state data for the sensor."""
await super().async_update()
if self._devices:
self._state = len(self._devices)


class AsuswrtRXSensor(AsuswrtSensor):
"""Representation of a asuswrt download speed sensor."""

Expand Down
59 changes: 52 additions & 7 deletions tests/components/asuswrt/test_sensor.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
"""The tests for the ASUSWRT sensor platform."""
"""The tests for the AsusWrt sensor platform."""
from collections import namedtuple
from datetime import datetime, timedelta
from unittest.mock import patch
Comment thread
timmo001 marked this conversation as resolved.
Outdated

# import homeassistant.components.sensor as sensor
from homeassistant.components import sensor
from homeassistant.components.asuswrt import (
CONF_DNSMASQ,
CONF_INTERFACE,
Expand All @@ -13,9 +15,12 @@
DOMAIN,
)
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME
from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component
import homeassistant.util.dt as dt_util
from homeassistant.util.dt import utcnow

from tests.common import mock_coro_func
from tests.common import async_fire_time_changed, mock_coro_func
Comment thread
timmo001 marked this conversation as resolved.
Outdated

VALID_CONFIG_ROUTER_SSH = {
DOMAIN: {
Expand All @@ -27,16 +32,56 @@
CONF_PROTOCOL: "ssh",
CONF_USERNAME: "fake_user",
CONF_PASSWORD: "fake_pass",
CONF_SENSORS: "upload",
CONF_SENSORS: [
"devices",
"download_speed",
"download",
"upload_speed",
"upload",
],
}
}

Device = namedtuple("Device", ["mac", "ip", "name"])
Comment thread
MartinHjelmare marked this conversation as resolved.
Outdated

async def test_default_sensor_setup(hass):
MOCK_DEVICES = {
"a1:b1:c1:d1:e1:f1": Device("a1:b1:c1:d1:e1:f1", "192.168.1.2", "Test"),
"a2:b2:c2:d2:e2:f2": Device("a2:b2:c2:d2:e2:f2", "192.168.1.3", "TestTwo"),
"a3:b3:c3:d3:e3:f3": Device("a3:b3:c3:d3:e3:f3", "192.168.1.4", "TestThree"),
}
MOCK_BYTES_TOTAL = [60000000000, 50000000000]
MOCK_CURRENT_TRANSFER_RATES = [20000000, 10000000]


async def test_sensors(hass: HomeAssistant):
"""Test creating an AsusWRT sensor."""
with patch("homeassistant.components.asuswrt.AsusWrt") as AsusWrt:
AsusWrt().connection.async_connect = mock_coro_func()
AsusWrt().async_get_connected_devices = mock_coro_func(MOCK_DEVICES)
AsusWrt().async_get_bytes_total = mock_coro_func(MOCK_BYTES_TOTAL)
AsusWrt().async_get_current_transfer_rates = mock_coro_func(
MOCK_CURRENT_TRANSFER_RATES
)
Comment thread
timmo001 marked this conversation as resolved.

result = await async_setup_component(hass, DOMAIN, VALID_CONFIG_ROUTER_SSH)
assert result
assert await async_setup_component(hass, DOMAIN, VALID_CONFIG_ROUTER_SSH)
await hass.async_block_till_done()
assert hass.data[DATA_ASUSWRT] is not None

now = datetime(2020, 1, 1, 1, tzinfo=dt_util.UTC)
with patch(("homeassistant.helpers.event.dt_util.utcnow"), return_value=now):
Comment thread
timmo001 marked this conversation as resolved.
Outdated
async_fire_time_changed(hass, utcnow() + timedelta(seconds=30))
await hass.async_block_till_done()

assert (
hass.states.get(f"{sensor.DOMAIN}.asuswrt_devices_connected").state
== "3"
)
assert (
hass.states.get(f"{sensor.DOMAIN}.asuswrt_download_speed").state
== "160.0"
)
assert hass.states.get(f"{sensor.DOMAIN}.asuswrt_download").state == "60.0"
assert (
hass.states.get(f"{sensor.DOMAIN}.asuswrt_upload_speed").state == "80.0"
)
assert hass.states.get(f"{sensor.DOMAIN}.asuswrt_upload").state == "50.0"