added option to select units of measurement for traffic #10

This commit is contained in:
tomaae 2020-03-16 01:32:13 +01:00
parent 0f7ad23e3c
commit b6e5c10540
7 changed files with 63 additions and 11 deletions

View file

@ -11,7 +11,8 @@
"port": "Port", "port": "Port",
"username": "Username", "username": "Username",
"password": "Password", "password": "Password",
"ssl": "Use SSL" "ssl": "Use SSL",
"unit_of_measurement": "Unit of measurement"
} }
} }
}, },
@ -31,7 +32,8 @@
"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_arp": "Show client MAC and IP on interfaces",
"unit_of_measurement": "Unit of measurement"
} }
} }
} }

View file

@ -6,6 +6,7 @@ from homeassistant.const import (
CONF_NAME, CONF_NAME,
CONF_HOST, CONF_HOST,
CONF_PORT, CONF_PORT,
CONF_UNIT_OF_MEASUREMENT,
CONF_USERNAME, CONF_USERNAME,
CONF_PASSWORD, CONF_PASSWORD,
CONF_SSL, CONF_SSL,
@ -16,6 +17,7 @@ from .mikrotik_controller import MikrotikControllerData
from .const import ( from .const import (
DOMAIN, DOMAIN,
DATA_CLIENT, DATA_CLIENT,
DEFAULT_TRAFFIC_TYPE,
) )
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -42,8 +44,12 @@ async def async_setup_entry(hass, config_entry):
username = config_entry.data[CONF_USERNAME] username = config_entry.data[CONF_USERNAME]
password = config_entry.data[CONF_PASSWORD] password = config_entry.data[CONF_PASSWORD]
use_ssl = config_entry.data[CONF_SSL] 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) 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

@ -12,6 +12,7 @@ from homeassistant.const import (
CONF_NAME, CONF_NAME,
CONF_HOST, CONF_HOST,
CONF_PORT, CONF_PORT,
CONF_UNIT_OF_MEASUREMENT,
CONF_USERNAME, CONF_USERNAME,
CONF_PASSWORD, CONF_PASSWORD,
CONF_SSL, CONF_SSL,
@ -23,6 +24,8 @@ from .const import (
DEFAULT_TRACK_ARP, DEFAULT_TRACK_ARP,
CONF_SCAN_INTERVAL, CONF_SCAN_INTERVAL,
DEFAULT_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL,
DEFAULT_TRAFFIC_TYPE,
TRAFFIC_TYPES,
) )
from .mikrotikapi import MikrotikAPI from .mikrotikapi import MikrotikAPI
@ -109,6 +112,7 @@ class MikrotikControllerConfigFlow(ConfigFlow, domain=DOMAIN):
vol.Required(CONF_HOST, default=host): str, vol.Required(CONF_HOST, default=host): str,
vol.Required(CONF_USERNAME, default=username): str, vol.Required(CONF_USERNAME, default=username): str,
vol.Required(CONF_PASSWORD, default=password): str, vol.Required(CONF_PASSWORD, default=password): str,
vol.Optional(CONF_UNIT_OF_MEASUREMENT, default=DEFAULT_TRAFFIC_TYPE): vol.In(TRAFFIC_TYPES),
vol.Optional(CONF_PORT, default=port): int, vol.Optional(CONF_PORT, default=port): int,
vol.Optional(CONF_NAME, default=name): str, vol.Optional(CONF_NAME, default=name): str,
vol.Optional(CONF_SSL, default=use_ssl): bool, vol.Optional(CONF_SSL, default=use_ssl): bool,
@ -154,6 +158,12 @@ class MikrotikControllerOptionsFlowHandler(OptionsFlow):
CONF_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL CONF_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL
), ),
): int, ): int,
vol.Optional(
CONF_UNIT_OF_MEASUREMENT,
default=self.config_entry.options.get(
CONF_UNIT_OF_MEASUREMENT, DEFAULT_TRAFFIC_TYPE
),
): vol.In(TRAFFIC_TYPES),
} }
), ),
) )

View file

@ -6,9 +6,13 @@ DATA_CLIENT = "client"
ATTRIBUTION = "Data provided by Mikrotik" ATTRIBUTION = "Data provided by Mikrotik"
CONF_SCAN_INTERVAL = "scan_interval" CONF_SCAN_INTERVAL = "scan_interval"
CONF_UNIT_OF_MEASUREMENT = "unit_of_measurement"
DEFAULT_SCAN_INTERVAL = 30 DEFAULT_SCAN_INTERVAL = 30
CONF_TRACK_ARP = "track_arp" CONF_TRACK_ARP = "track_arp"
DEFAULT_TRACK_ARP = True 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 = "mbps"
TRAFFIC_TYPES = ["bps", "kbps", "mbps"]

View file

@ -11,7 +11,9 @@ from .const import (
CONF_TRACK_ARP, CONF_TRACK_ARP,
DEFAULT_TRACK_ARP, DEFAULT_TRACK_ARP,
CONF_SCAN_INTERVAL, CONF_SCAN_INTERVAL,
CONF_UNIT_OF_MEASUREMENT,
DEFAULT_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL,
DEFAULT_TRAFFIC_TYPE,
) )
from .mikrotikapi import MikrotikAPI from .mikrotikapi import MikrotikAPI
@ -26,11 +28,12 @@ _LOGGER = logging.getLogger(__name__)
# --------------------------- # ---------------------------
class MikrotikControllerData(): class MikrotikControllerData():
"""MikrotikController Class""" """MikrotikController Class"""
def __init__(self, hass, config_entry, name, host, port, username, password, use_ssl): def __init__(self, hass, config_entry, name, host, port, username, password, use_ssl, traffic_type):
"""Initialize MikrotikController.""" """Initialize MikrotikController."""
self.name = name self.name = name
self.hass = hass self.hass = hass
self.config_entry = config_entry self.config_entry = config_entry
self.traffic_type = traffic_type
self.data = {'routerboard': {}, self.data = {'routerboard': {},
'resource': {}, 'resource': {},
@ -80,6 +83,14 @@ class MikrotikControllerData():
scan_interval = self.config_entry.options.get(CONF_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL) scan_interval = self.config_entry.options.get(CONF_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL)
return timedelta(seconds=scan_interval) return timedelta(seconds=scan_interval)
# ---------------------------
# option_traffic_type
# ---------------------------
@property
def option_traffic_type(self):
"""Config entry option to not track ARP."""
return self.config_entry.options.get(CONF_UNIT_OF_MEASUREMENT, DEFAULT_TRAFFIC_TYPE)
# --------------------------- # ---------------------------
# signal_update # signal_update
# --------------------------- # ---------------------------
@ -220,11 +231,21 @@ class MikrotikControllerData():
] ]
) )
traffic_type = self.option_traffic_type
if traffic_type == "bps":
traffic_div = 1
elif traffic_type == "kbps":
traffic_div = 1000
elif traffic_type == "mbps":
traffic_div = 1000000
for uid in self.data['interface']: for uid in self.data['interface']:
self.data['interface'][uid]['rx-bits-per-second-attr'] = traffic_type
self.data['interface'][uid]['tx-bits-per-second-attr'] = traffic_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'] / 1000) self.data['interface'][uid]['rx-bits-per-second'] / traffic_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'] / 1000) self.data['interface'][uid]['tx-bits-per-second'] / traffic_div)
# --------------------------- # ---------------------------
# get_interface_client # get_interface_client

View file

@ -22,6 +22,7 @@ _LOGGER = logging.getLogger(__name__)
ATTR_ICON = "icon" ATTR_ICON = "icon"
ATTR_LABEL = "label" ATTR_LABEL = "label"
ATTR_UNIT = "unit" ATTR_UNIT = "unit"
ATTR_UNIT_ATTR = "unit_attr"
ATTR_GROUP = "group" ATTR_GROUP = "group"
ATTR_PATH = "data_path" ATTR_PATH = "data_path"
ATTR_ATTR = "data_attr" ATTR_ATTR = "data_attr"
@ -58,7 +59,8 @@ SENSOR_TYPES = {
ATTR_DEVICE_CLASS: None, ATTR_DEVICE_CLASS: None,
ATTR_ICON: "mdi:upload-network-outline", ATTR_ICON: "mdi:upload-network-outline",
ATTR_LABEL: 'TX', ATTR_LABEL: 'TX',
ATTR_UNIT: "kbps", ATTR_UNIT: "ps",
ATTR_UNIT_ATTR: "tx-bits-per-second-attr",
ATTR_PATH: "interface", ATTR_PATH: "interface",
ATTR_ATTR: "tx-bits-per-second", ATTR_ATTR: "tx-bits-per-second",
}, },
@ -66,7 +68,8 @@ SENSOR_TYPES = {
ATTR_DEVICE_CLASS: None, ATTR_DEVICE_CLASS: None,
ATTR_ICON: "mdi:download-network-outline", ATTR_ICON: "mdi:download-network-outline",
ATTR_LABEL: 'RX', ATTR_LABEL: 'RX',
ATTR_UNIT: "kbps", ATTR_UNIT: "ps",
ATTR_UNIT_ATTR: "rx-bits-per-second-attr",
ATTR_PATH: "interface", ATTR_PATH: "interface",
ATTR_ATTR: "rx-bits-per-second", ATTR_ATTR: "rx-bits-per-second",
}, },
@ -188,7 +191,11 @@ class MikrotikControllerSensor(Entity):
@property @property
def unit_of_measurement(self): def unit_of_measurement(self):
"""Return the unit the value is expressed in.""" """Return the unit the value is expressed in."""
return self._type[ATTR_UNIT] if ATTR_UNIT_ATTR in self._type:
return self._data[SENSOR_TYPES[self._sensor][ATTR_UNIT_ATTR]]
if ATTR_UNIT in self._type:
return self._type[ATTR_UNIT]
@property @property
def available(self) -> bool: def available(self) -> bool:

View file

@ -11,7 +11,8 @@
"port": "Port", "port": "Port",
"username": "Username", "username": "Username",
"password": "Password", "password": "Password",
"ssl": "Use SSL" "ssl": "Use SSL",
"unit_of_measurement": "Unit of measurement"
} }
} }
}, },
@ -31,7 +32,8 @@
"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_arp": "Show client MAC and IP on interfaces",
"unit_of_measurement": "Unit of measurement"
} }
} }
} }