diff --git a/custom_components/mikrotik_router/.translations/en.json b/custom_components/mikrotik_router/.translations/en.json index d0d68fc..ec26cf2 100644 --- a/custom_components/mikrotik_router/.translations/en.json +++ b/custom_components/mikrotik_router/.translations/en.json @@ -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" } } } diff --git a/custom_components/mikrotik_router/__init__.py b/custom_components/mikrotik_router/__init__.py index a174658..76209f0 100644 --- a/custom_components/mikrotik_router/__init__.py +++ b/custom_components/mikrotik_router/__init__.py @@ -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() diff --git a/custom_components/mikrotik_router/config_flow.py b/custom_components/mikrotik_router/config_flow.py index 61c7002..a30f207 100644 --- a/custom_components/mikrotik_router/config_flow.py +++ b/custom_components/mikrotik_router/config_flow.py @@ -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), } ), ) diff --git a/custom_components/mikrotik_router/const.py b/custom_components/mikrotik_router/const.py index 0e78767..0c80769 100644 --- a/custom_components/mikrotik_router/const.py +++ b/custom_components/mikrotik_router/const.py @@ -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"] diff --git a/custom_components/mikrotik_router/mikrotik_controller.py b/custom_components/mikrotik_router/mikrotik_controller.py index 036b62d..9cba89c 100644 --- a/custom_components/mikrotik_router/mikrotik_controller.py +++ b/custom_components/mikrotik_router/mikrotik_controller.py @@ -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 diff --git a/custom_components/mikrotik_router/sensor.py b/custom_components/mikrotik_router/sensor.py index a83fff6..bb36cd5 100644 --- a/custom_components/mikrotik_router/sensor.py +++ b/custom_components/mikrotik_router/sensor.py @@ -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,7 +191,11 @@ class MikrotikControllerSensor(Entity): @property def unit_of_measurement(self): """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 def available(self) -> bool: diff --git a/custom_components/mikrotik_router/strings.json b/custom_components/mikrotik_router/strings.json index d0d68fc..ec26cf2 100644 --- a/custom_components/mikrotik_router/strings.json +++ b/custom_components/mikrotik_router/strings.json @@ -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" } } }