refactored config flow #26

This commit is contained in:
tomaae 2020-04-08 20:31:47 +02:00
parent 8eb4e2a2c0
commit 2d88ed8aaf
8 changed files with 131 additions and 142 deletions

View file

@ -32,7 +32,7 @@
"device_tracker": { "device_tracker": {
"data": { "data": {
"scan_interval": "Scan interval (requires HA restart)", "scan_interval": "Scan interval (requires HA restart)",
"track_arp": "Show client MAC and IP on interfaces", "track_iface_clients": "Show client MAC and IP on interfaces",
"unit_of_measurement": "Unit of measurement" "unit_of_measurement": "Unit of measurement"
} }
} }

View file

@ -32,7 +32,7 @@
"device_tracker": { "device_tracker": {
"data": { "data": {
"scan_interval": "Период сканирования (требуется перезагрузка HA)", "scan_interval": "Период сканирования (требуется перезагрузка HA)",
"track_arp": "Показывать в интерфейсе MAC и IP клиентов", "track_iface_clients": "Показывать в интерфейсе MAC и IP клиентов",
"unit_of_measurement": "Единицы измерения" "unit_of_measurement": "Единицы измерения"
} }
} }

View file

@ -32,7 +32,7 @@
"device_tracker": { "device_tracker": {
"data": { "data": {
"scan_interval": "Interval skenovania (vyžaduje sa reštart HA)", "scan_interval": "Interval skenovania (vyžaduje sa reštart HA)",
"track_arp": "Zobraziť klientske MAC a IP na rozhraniach", "track_iface_clients": "Zobraziť klientske MAC a IP na rozhraniach",
"unit_of_measurement": "Merná jednotka" "unit_of_measurement": "Merná jednotka"
} }
} }

View file

@ -2,21 +2,11 @@
import logging import logging
from homeassistant.const import (
CONF_NAME,
CONF_HOST,
CONF_PORT,
CONF_UNIT_OF_MEASUREMENT,
CONF_USERNAME,
CONF_PASSWORD,
CONF_SSL,
)
from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.exceptions import ConfigEntryNotReady
from .const import ( from .const import (
DOMAIN, DOMAIN,
DATA_CLIENT, DATA_CLIENT,
DEFAULT_TRAFFIC_TYPE,
) )
from .mikrotik_controller import MikrotikControllerData from .mikrotik_controller import MikrotikControllerData
@ -38,21 +28,7 @@ async def async_setup(hass, _config):
# --------------------------- # ---------------------------
async def async_setup_entry(hass, config_entry): async def async_setup_entry(hass, config_entry):
"""Set up Mikrotik Router as config entry.""" """Set up Mikrotik Router as config entry."""
name = config_entry.data[CONF_NAME] mikrotik_controller = MikrotikControllerData(hass, config_entry)
host = config_entry.data[CONF_HOST]
port = config_entry.data[CONF_PORT]
username = config_entry.data[CONF_USERNAME]
password = config_entry.data[CONF_PASSWORD]
use_ssl = config_entry.data[CONF_SSL]
if CONF_UNIT_OF_MEASUREMENT in config_entry.data:
traffic_type = config_entry.data[CONF_UNIT_OF_MEASUREMENT]
else:
traffic_type = DEFAULT_TRAFFIC_TYPE
mikrotik_controller = MikrotikControllerData(
hass, config_entry, name, host, port, username, password, use_ssl,
traffic_type
)
await mikrotik_controller.hwinfo_update() await mikrotik_controller.hwinfo_update()
await mikrotik_controller.async_update() await mikrotik_controller.async_update()

View file

@ -21,12 +21,18 @@ from homeassistant.core import callback
from .const import ( from .const import (
DOMAIN, DOMAIN,
CONF_TRACK_ARP, CONF_TRACK_IFACE_CLIENTS,
DEFAULT_TRACK_ARP, DEFAULT_TRACK_IFACE_CLIENTS,
CONF_SCAN_INTERVAL, CONF_SCAN_INTERVAL,
DEFAULT_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL,
DEFAULT_TRAFFIC_TYPE, LIST_UNIT_OF_MEASUREMENT,
TRAFFIC_TYPES, DEFAULT_UNIT_OF_MEASUREMENT,
DEFAULT_HOST,
DEFAULT_USERNAME,
DEFAULT_PASSWORD,
DEFAULT_PORT,
DEFAULT_NAME,
DEFAULT_SSL,
) )
from .mikrotikapi import MikrotikAPI from .mikrotikapi import MikrotikAPI
@ -77,11 +83,11 @@ class MikrotikControllerConfigFlow(ConfigFlow, domain=DOMAIN):
# Test connection # Test connection
api = MikrotikAPI( api = MikrotikAPI(
host=user_input["host"], host=user_input[CONF_HOST],
username=user_input["username"], username=user_input[CONF_USERNAME],
password=user_input["password"], password=user_input[CONF_PASSWORD],
port=user_input["port"], port=user_input[CONF_PORT],
use_ssl=user_input["ssl"] use_ssl=user_input[CONF_SSL]
) )
if not api.connect(): if not api.connect():
errors[CONF_HOST] = api.error errors[CONF_HOST] = api.error
@ -89,48 +95,42 @@ class MikrotikControllerConfigFlow(ConfigFlow, domain=DOMAIN):
# Save instance # Save instance
if not errors: if not errors:
return self.async_create_entry( return self.async_create_entry(
title=user_input[CONF_NAME], data=user_input title=user_input[CONF_NAME],
data=user_input
) )
return self._show_config_form( return self._show_config_form(
host=user_input["host"], user_input=user_input,
username=user_input["username"],
password=user_input["password"],
port=user_input["port"],
name=user_input["name"],
use_ssl=user_input["ssl"],
errors=errors, errors=errors,
) )
return self._show_config_form(errors=errors) return self._show_config_form(
user_input={
CONF_NAME: DEFAULT_NAME,
CONF_HOST: DEFAULT_HOST,
CONF_USERNAME: DEFAULT_USERNAME,
CONF_PASSWORD: DEFAULT_PASSWORD,
CONF_PORT: DEFAULT_PORT,
CONF_SSL: DEFAULT_SSL,
},
errors=errors
)
# --------------------------- # ---------------------------
# _show_config_form # _show_config_form
# --------------------------- # ---------------------------
def _show_config_form( def _show_config_form(self, user_input, errors=None):
self,
host="10.0.0.1",
username="admin",
password="admin",
port=0,
name="Mikrotik",
use_ssl=False,
errors=None,
):
"""Show the configuration form to edit data.""" """Show the configuration form to edit data."""
return self.async_show_form( return self.async_show_form(
step_id="user", step_id="user",
data_schema=vol.Schema( data_schema=vol.Schema(
{ {
vol.Required(CONF_HOST, default=host): str, vol.Required(CONF_NAME, default=user_input[CONF_NAME]): str,
vol.Required(CONF_USERNAME, default=username): str, vol.Required(CONF_HOST, default=user_input[CONF_HOST]): str,
vol.Required(CONF_PASSWORD, default=password): str, vol.Required(CONF_USERNAME, default=user_input[CONF_USERNAME]): str,
vol.Optional( vol.Required(CONF_PASSWORD, default=user_input[CONF_PASSWORD]): str,
CONF_UNIT_OF_MEASUREMENT, default=DEFAULT_TRAFFIC_TYPE vol.Optional(CONF_PORT, default=user_input[CONF_PORT]): int,
): vol.In(TRAFFIC_TYPES), vol.Optional(CONF_SSL, default=user_input[CONF_SSL]): bool,
vol.Optional(CONF_PORT, default=port): int,
vol.Optional(CONF_NAME, default=name): str,
vol.Optional(CONF_SSL, default=use_ssl): bool,
} }
), ),
errors=errors, errors=errors,
@ -163,9 +163,9 @@ class MikrotikControllerOptionsFlowHandler(OptionsFlow):
data_schema=vol.Schema( data_schema=vol.Schema(
{ {
vol.Optional( vol.Optional(
CONF_TRACK_ARP, CONF_TRACK_IFACE_CLIENTS,
default=self.config_entry.options.get( default=self.config_entry.options.get(
CONF_TRACK_ARP, DEFAULT_TRACK_ARP CONF_TRACK_IFACE_CLIENTS, DEFAULT_TRACK_IFACE_CLIENTS
), ),
): bool, ): bool,
vol.Optional( vol.Optional(
@ -177,9 +177,9 @@ class MikrotikControllerOptionsFlowHandler(OptionsFlow):
vol.Optional( vol.Optional(
CONF_UNIT_OF_MEASUREMENT, CONF_UNIT_OF_MEASUREMENT,
default=self.config_entry.options.get( default=self.config_entry.options.get(
CONF_UNIT_OF_MEASUREMENT, DEFAULT_TRAFFIC_TYPE CONF_UNIT_OF_MEASUREMENT, DEFAULT_UNIT_OF_MEASUREMENT
), ),
): vol.In(TRAFFIC_TYPES), ): vol.In(LIST_UNIT_OF_MEASUREMENT),
} }
), ),
) )

View file

@ -5,14 +5,22 @@ DEFAULT_NAME = "Mikrotik Router"
DATA_CLIENT = "client" DATA_CLIENT = "client"
ATTRIBUTION = "Data provided by Mikrotik" ATTRIBUTION = "Data provided by Mikrotik"
CONF_SCAN_INTERVAL = "scan_interval"
CONF_UNIT_OF_MEASUREMENT = "unit_of_measurement"
DEFAULT_SCAN_INTERVAL = 30
CONF_TRACK_ARP = "track_arp"
DEFAULT_TRACK_ARP = True
DEFAULT_ENCODING = "ISO-8859-1" DEFAULT_ENCODING = "ISO-8859-1"
DEFAULT_LOGIN_METHOD = "plain" DEFAULT_LOGIN_METHOD = "plain"
DEFAULT_TRAFFIC_TYPE = "Kbps" DEFAULT_HOST = "10.0.0.1"
TRAFFIC_TYPES = ["bps", "Kbps", "Mbps", "B/s", "KB/s", "MB/s"] DEFAULT_USERNAME = "admin"
DEFAULT_PASSWORD = "admin"
DEFAULT_PORT = 0
DEFAULT_NAME = "Mikrotik"
DEFAULT_SSL = False
LIST_UNIT_OF_MEASUREMENT = ["bps", "Kbps", "Mbps", "B/s", "KB/s", "MB/s"]
CONF_TRACK_IFACE_CLIENTS = "track_iface_clients"
CONF_SCAN_INTERVAL = "scan_interval"
DEFAULT_TRACK_IFACE_CLIENTS = True
DEFAULT_SCAN_INTERVAL = 30
DEFAULT_UNIT_OF_MEASUREMENT = "Kbps"

View file

@ -10,14 +10,23 @@ from homeassistant.helpers.dispatcher import async_dispatcher_send
from homeassistant.helpers.event import async_track_time_interval from homeassistant.helpers.event import async_track_time_interval
from homeassistant.util.dt import utcnow from homeassistant.util.dt import utcnow
from homeassistant.const import (
CONF_NAME,
CONF_HOST,
CONF_PORT,
CONF_UNIT_OF_MEASUREMENT,
CONF_USERNAME,
CONF_PASSWORD,
CONF_SSL,
)
from .const import ( from .const import (
DOMAIN, DOMAIN,
CONF_TRACK_ARP, CONF_TRACK_IFACE_CLIENTS,
DEFAULT_TRACK_ARP, DEFAULT_TRACK_IFACE_CLIENTS,
CONF_SCAN_INTERVAL, CONF_SCAN_INTERVAL,
CONF_UNIT_OF_MEASUREMENT,
DEFAULT_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL,
DEFAULT_TRAFFIC_TYPE, DEFAULT_UNIT_OF_MEASUREMENT,
) )
from .exceptions import ApiEntryNotFound from .exceptions import ApiEntryNotFound
from .helper import from_entry, parse_api from .helper import from_entry, parse_api
@ -32,24 +41,12 @@ _LOGGER = logging.getLogger(__name__)
class MikrotikControllerData: class MikrotikControllerData:
"""MikrotikController Class""" """MikrotikController Class"""
def __init__( def __init__(self, hass, config_entry):
self,
hass,
config_entry,
name,
host,
port,
username,
password,
use_ssl,
traffic_type,
):
"""Initialize MikrotikController.""" """Initialize MikrotikController."""
self.name = name
self.hass = hass self.hass = hass
self.host = host
self.config_entry = config_entry self.config_entry = config_entry
self.traffic_type = traffic_type self.name = config_entry.data[CONF_NAME]
self.host = config_entry.data[CONF_HOST]
self.data = { self.data = {
"routerboard": {}, "routerboard": {},
@ -72,7 +69,13 @@ class MikrotikControllerData:
self.listeners = [] self.listeners = []
self.lock = asyncio.Lock() self.lock = asyncio.Lock()
self.api = MikrotikAPI(host, username, password, port, use_ssl) self.api = MikrotikAPI(
config_entry.data[CONF_HOST],
config_entry.data[CONF_USERNAME],
config_entry.data[CONF_PASSWORD],
config_entry.data[CONF_PORT],
config_entry.data[CONF_SSL]
)
self.nat_removed = {} self.nat_removed = {}
@ -83,22 +86,25 @@ class MikrotikControllerData:
self.hass, self.force_fwupdate_check, timedelta(hours=1) self.hass, self.force_fwupdate_check, timedelta(hours=1)
) )
def _get_traffic_type_and_div(self): # ---------------------------
traffic_type = self.option_traffic_type # _get_unit_of_measurement
if traffic_type == "Kbps": # ---------------------------
traffic_div = 0.001 def _get_unit_of_measurement(self):
elif traffic_type == "Mbps": uom_type = self.option_unit_of_measurement
traffic_div = 0.000001 if uom_type == "Kbps":
elif traffic_type == "B/s": uom_div = 0.001
traffic_div = 0.125 elif uom_type == "Mbps":
elif traffic_type == "KB/s": uom_div = 0.000001
traffic_div = 0.000125 elif uom_type == "B/s":
elif traffic_type == "MB/s": uom_div = 0.125
traffic_div = 0.000000125 elif uom_type == "KB/s":
uom_div = 0.000125
elif uom_type == "MB/s":
uom_div = 0.000000125
else: else:
traffic_type = "bps" uom_type = "bps"
traffic_div = 1 uom_div = 1
return traffic_type, traffic_div return uom_type, uom_div
# --------------------------- # ---------------------------
# force_update # force_update
@ -117,12 +123,12 @@ class MikrotikControllerData:
await self.async_fwupdate_check() await self.async_fwupdate_check()
# --------------------------- # ---------------------------
# option_track_arp # option_track_iface_clients
# --------------------------- # ---------------------------
@property @property
def option_track_arp(self): def option_track_iface_clients(self):
"""Config entry option to not track ARP.""" """Config entry option to not track ARP."""
return self.config_entry.options.get(CONF_TRACK_ARP, DEFAULT_TRACK_ARP) return self.config_entry.options.get(CONF_TRACK_IFACE_CLIENTS, DEFAULT_TRACK_IFACE_CLIENTS)
# --------------------------- # ---------------------------
# option_scan_interval # option_scan_interval
@ -136,13 +142,13 @@ class MikrotikControllerData:
return timedelta(seconds=scan_interval) return timedelta(seconds=scan_interval)
# --------------------------- # ---------------------------
# option_traffic_type # option_unit_of_measurement
# --------------------------- # ---------------------------
@property @property
def option_traffic_type(self): def option_unit_of_measurement(self):
"""Config entry option to not track ARP.""" """Config entry option to not track ARP."""
return self.config_entry.options.get( return self.config_entry.options.get(
CONF_UNIT_OF_MEASUREMENT, DEFAULT_TRAFFIC_TYPE CONF_UNIT_OF_MEASUREMENT, DEFAULT_UNIT_OF_MEASUREMENT
) )
# --------------------------- # ---------------------------
@ -298,18 +304,18 @@ class MikrotikControllerData:
], ],
) )
traffic_type, traffic_div = self._get_traffic_type_and_div() uom_type, uom_div = self._get_unit_of_measurement()
for uid in self.data["interface"]: for uid in self.data["interface"]:
self.data["interface"][uid][ self.data["interface"][uid][
"rx-bits-per-second-attr"] = traffic_type "rx-bits-per-second-attr"] = uom_type
self.data["interface"][uid][ self.data["interface"][uid][
"tx-bits-per-second-attr"] = traffic_type "tx-bits-per-second-attr"] = uom_type
self.data["interface"][uid]["rx-bits-per-second"] = round( self.data["interface"][uid]["rx-bits-per-second"] = round(
self.data["interface"][uid]["rx-bits-per-second"] * traffic_div self.data["interface"][uid]["rx-bits-per-second"] * uom_div
) )
self.data["interface"][uid]["tx-bits-per-second"] = round( self.data["interface"][uid]["tx-bits-per-second"] = round(
self.data["interface"][uid]["tx-bits-per-second"] * traffic_div self.data["interface"][uid]["tx-bits-per-second"] * uom_div
) )
# --------------------------- # ---------------------------
@ -320,7 +326,7 @@ class MikrotikControllerData:
self.data["arp_tmp"] = {} self.data["arp_tmp"] = {}
# Remove data if disabled # Remove data if disabled
if not self.option_track_arp: if not self.option_track_iface_clients:
for uid in self.data["interface"]: for uid in self.data["interface"]:
self.data["interface"][uid]["client-ip-address"] = "disabled" self.data["interface"][uid]["client-ip-address"] = "disabled"
self.data["interface"][uid]["client-mac-address"] = "disabled" self.data["interface"][uid]["client-mac-address"] = "disabled"
@ -635,37 +641,37 @@ class MikrotikControllerData:
] ]
) )
traffic_type, traffic_div = self._get_traffic_type_and_div() uom_type, uom_div = self._get_unit_of_measurement()
for uid in self.data["queue"]: for uid in self.data["queue"]:
upload_max_limit_bps, download_max_limit_bps = [int(x) for x in upload_max_limit_bps, download_max_limit_bps = [int(x) for x in
self.data["queue"][uid]["max-limit"].split('/')] self.data["queue"][uid]["max-limit"].split('/')]
self.data["queue"][uid]["upload-max-limit"] = \ self.data["queue"][uid]["upload-max-limit"] = \
f"{round(upload_max_limit_bps * traffic_div)} {traffic_type}" f"{round(upload_max_limit_bps * uom_div)} {uom_type}"
self.data["queue"][uid]["download-max-limit"] = \ self.data["queue"][uid]["download-max-limit"] = \
f"{round(download_max_limit_bps * traffic_div)} {traffic_type}" f"{round(download_max_limit_bps * uom_div)} {uom_type}"
upload_limit_at_bps, download_limit_at_bps = [int(x) for x in upload_limit_at_bps, download_limit_at_bps = [int(x) for x in
self.data["queue"][uid]["limit-at"].split('/')] self.data["queue"][uid]["limit-at"].split('/')]
self.data["queue"][uid]["upload-limit-at"] = \ self.data["queue"][uid]["upload-limit-at"] = \
f"{round(upload_limit_at_bps * traffic_div)} {traffic_type}" f"{round(upload_limit_at_bps * uom_div)} {uom_type}"
self.data["queue"][uid]["download-limit-at"] = \ self.data["queue"][uid]["download-limit-at"] = \
f"{round(download_limit_at_bps * traffic_div)} {traffic_type}" f"{round(download_limit_at_bps * uom_div)} {uom_type}"
upload_burst_limit_bps, download_burst_limit_bps = [int(x) for x in upload_burst_limit_bps, download_burst_limit_bps = [int(x) for x in
self.data["queue"][uid]["burst-limit"].split('/')] self.data["queue"][uid]["burst-limit"].split('/')]
self.data["queue"][uid]["upload-burst-limit"] = \ self.data["queue"][uid]["upload-burst-limit"] = \
f"{round(upload_burst_limit_bps * traffic_div)} {traffic_type}" f"{round(upload_burst_limit_bps * uom_div)} {uom_type}"
self.data["queue"][uid]["download-burst-limit"] = \ self.data["queue"][uid]["download-burst-limit"] = \
f"{round(download_burst_limit_bps * traffic_div)} {traffic_type}" f"{round(download_burst_limit_bps * uom_div)} {uom_type}"
upload_burst_threshold_bps,\ upload_burst_threshold_bps,\
download_burst_threshold_bps = [int(x) for x in self.data["queue"][uid]["burst-threshold"].split('/')] download_burst_threshold_bps = [int(x) for x in self.data["queue"][uid]["burst-threshold"].split('/')]
self.data["queue"][uid]["upload-burst-threshold"] = \ self.data["queue"][uid]["upload-burst-threshold"] = \
f"{round(upload_burst_threshold_bps * traffic_div)} {traffic_type}" f"{round(upload_burst_threshold_bps * uom_div)} {uom_type}"
self.data["queue"][uid]["download-burst-threshold"] = \ self.data["queue"][uid]["download-burst-threshold"] = \
f"{round(download_burst_threshold_bps * traffic_div)} {traffic_type}" f"{round(download_burst_threshold_bps * uom_div)} {uom_type}"
upload_burst_time, download_burst_time = self.data["queue"][uid]["burst-time"].split('/') upload_burst_time, download_burst_time = self.data["queue"][uid]["burst-time"].split('/')
self.data["queue"][uid]["upload-burst-time"] = upload_burst_time self.data["queue"][uid]["upload-burst-time"] = upload_burst_time
@ -857,7 +863,7 @@ class MikrotikControllerData:
"""Get Accounting data from Mikrotik""" """Get Accounting data from Mikrotik"""
# Check if accounting and account-local-traffic is enabled # Check if accounting and account-local-traffic is enabled
accounting_enabled, local_traffic_enabled = self.api.is_accounting_and_local_traffic_enabled() accounting_enabled, local_traffic_enabled = self.api.is_accounting_and_local_traffic_enabled()
traffic_type, traffic_div = self._get_traffic_type_and_div() uom_type, uom_div = self._get_unit_of_measurement()
# Build missing hosts from main hosts dict # Build missing hosts from main hosts dict
for uid, vals in self.data["host"].items(): for uid, vals in self.data["host"].items():
@ -866,7 +872,7 @@ class MikrotikControllerData:
'address': vals['address'], 'address': vals['address'],
'mac-address': vals['mac-address'], 'mac-address': vals['mac-address'],
'host-name': vals['host-name'], 'host-name': vals['host-name'],
'tx-rx-attr': traffic_type, 'tx-rx-attr': uom_type,
'available': False, 'available': False,
'local_accounting': False 'local_accounting': False
} }
@ -928,7 +934,7 @@ class MikrotikControllerData:
_LOGGER.warning(f"Address {addr} not found in accounting data, skipping update") _LOGGER.warning(f"Address {addr} not found in accounting data, skipping update")
continue continue
self.data['accounting'][uid]['tx-rx-attr'] = traffic_type self.data['accounting'][uid]['tx-rx-attr'] = uom_type
self.data['accounting'][uid]['available'] = accounting_enabled self.data['accounting'][uid]['available'] = accounting_enabled
self.data['accounting'][uid]['local_accounting'] = local_traffic_enabled self.data['accounting'][uid]['local_accounting'] = local_traffic_enabled
@ -937,11 +943,11 @@ class MikrotikControllerData:
continue continue
self.data['accounting'][uid]['wan-tx'] = round( self.data['accounting'][uid]['wan-tx'] = round(
tmp_accounting_values[addr]['wan-tx'] / time_diff * traffic_div, 2) \ tmp_accounting_values[addr]['wan-tx'] / time_diff * uom_div, 2) \
if tmp_accounting_values[addr]['wan-tx'] else 0.0 if tmp_accounting_values[addr]['wan-tx'] else 0.0
self.data['accounting'][uid]['wan-rx'] = round( self.data['accounting'][uid]['wan-rx'] = round(
tmp_accounting_values[addr]['wan-rx'] / time_diff * traffic_div, 2) \ tmp_accounting_values[addr]['wan-rx'] / time_diff * uom_div, 2) \
if tmp_accounting_values[addr]['wan-rx'] else 0.0 if tmp_accounting_values[addr]['wan-rx'] else 0.0
if not local_traffic_enabled: if not local_traffic_enabled:
@ -949,9 +955,9 @@ class MikrotikControllerData:
continue continue
self.data['accounting'][uid]['lan-tx'] = round( self.data['accounting'][uid]['lan-tx'] = round(
tmp_accounting_values[addr]['lan-tx'] / time_diff * traffic_div, 2) \ tmp_accounting_values[addr]['lan-tx'] / time_diff * uom_div, 2) \
if tmp_accounting_values[addr]['lan-tx'] else 0.0 if tmp_accounting_values[addr]['lan-tx'] else 0.0
self.data['accounting'][uid]['lan-rx'] = round( self.data['accounting'][uid]['lan-rx'] = round(
tmp_accounting_values[addr]['lan-rx'] / time_diff * traffic_div, 2) \ tmp_accounting_values[addr]['lan-rx'] / time_diff * uom_div, 2) \
if tmp_accounting_values[addr]['lan-rx'] else 0.0 if tmp_accounting_values[addr]['lan-rx'] else 0.0

View file

@ -11,8 +11,7 @@
"port": "Port", "port": "Port",
"username": "Username", "username": "Username",
"password": "Password", "password": "Password",
"ssl": "Use SSL", "ssl": "Use SSL"
"unit_of_measurement": "Unit of measurement"
} }
} }
}, },
@ -32,7 +31,7 @@
"device_tracker": { "device_tracker": {
"data": { "data": {
"scan_interval": "Scan interval (requires HA restart)", "scan_interval": "Scan interval (requires HA restart)",
"track_arp": "Show client MAC and IP on interfaces", "track_iface_clients": "Show client MAC and IP on interfaces",
"unit_of_measurement": "Unit of measurement" "unit_of_measurement": "Unit of measurement"
} }
} }