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",
"username": "Username",
"password": "Password",
"ssl": "Use SSL"
"ssl": "Use SSL",
"unit_of_measurement": "Unit of measurement"
}
}
},
@ -31,7 +32,8 @@
"device_tracker": {
"data": {
"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_HOST,
CONF_PORT,
CONF_UNIT_OF_MEASUREMENT,
CONF_USERNAME,
CONF_PASSWORD,
CONF_SSL,
@ -16,6 +17,7 @@ from .mikrotik_controller import MikrotikControllerData
from .const import (
DOMAIN,
DATA_CLIENT,
DEFAULT_TRAFFIC_TYPE,
)
_LOGGER = logging.getLogger(__name__)
@ -42,8 +44,12 @@ async def async_setup_entry(hass, config_entry):
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)
mikrotik_controller = MikrotikControllerData(hass, config_entry, name, host, port, username, password, use_ssl, traffic_type)
await mikrotik_controller.hwinfo_update()
await mikrotik_controller.async_update()

View file

@ -12,6 +12,7 @@ from homeassistant.const import (
CONF_NAME,
CONF_HOST,
CONF_PORT,
CONF_UNIT_OF_MEASUREMENT,
CONF_USERNAME,
CONF_PASSWORD,
CONF_SSL,
@ -23,6 +24,8 @@ from .const import (
DEFAULT_TRACK_ARP,
CONF_SCAN_INTERVAL,
DEFAULT_SCAN_INTERVAL,
DEFAULT_TRAFFIC_TYPE,
TRAFFIC_TYPES,
)
from .mikrotikapi import MikrotikAPI
@ -109,6 +112,7 @@ class MikrotikControllerConfigFlow(ConfigFlow, domain=DOMAIN):
vol.Required(CONF_HOST, default=host): str,
vol.Required(CONF_USERNAME, default=username): 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_NAME, default=name): str,
vol.Optional(CONF_SSL, default=use_ssl): bool,
@ -154,6 +158,12 @@ class MikrotikControllerOptionsFlowHandler(OptionsFlow):
CONF_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL
),
): 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"
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_LOGIN_METHOD = "plain"
DEFAULT_TRAFFIC_TYPE = "mbps"
TRAFFIC_TYPES = ["bps", "kbps", "mbps"]

View file

@ -11,7 +11,9 @@ from .const import (
CONF_TRACK_ARP,
DEFAULT_TRACK_ARP,
CONF_SCAN_INTERVAL,
CONF_UNIT_OF_MEASUREMENT,
DEFAULT_SCAN_INTERVAL,
DEFAULT_TRAFFIC_TYPE,
)
from .mikrotikapi import MikrotikAPI
@ -26,11 +28,12 @@ _LOGGER = logging.getLogger(__name__)
# ---------------------------
class MikrotikControllerData():
"""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."""
self.name = name
self.hass = hass
self.config_entry = config_entry
self.traffic_type = traffic_type
self.data = {'routerboard': {},
'resource': {},
@ -80,6 +83,14 @@ class MikrotikControllerData():
scan_interval = self.config_entry.options.get(CONF_SCAN_INTERVAL, DEFAULT_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
# ---------------------------
@ -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']:
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'] / 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'] / 1000)
self.data['interface'][uid]['tx-bits-per-second'] / traffic_div)
# ---------------------------
# get_interface_client

View file

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

View file

@ -11,7 +11,8 @@
"port": "Port",
"username": "Username",
"password": "Password",
"ssl": "Use SSL"
"ssl": "Use SSL",
"unit_of_measurement": "Unit of measurement"
}
}
},
@ -31,7 +32,8 @@
"device_tracker": {
"data": {
"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"
}
}
}