From b04a0a5b26b7ccc1a1c4e7197631c0404d8f22c3 Mon Sep 17 00:00:00 2001 From: tomaae <23486452+tomaae@users.noreply.github.com> Date: Wed, 15 Dec 2021 23:07:11 +0100 Subject: [PATCH] Added status, rate, duplex and negotiation status to ethernet ports #146 --- .../mikrotik_router/binary_sensor.py | 36 +++++++-- .../mikrotik_router/mikrotik_controller.py | 75 +++++++++++-------- custom_components/mikrotik_router/switch.py | 35 +++++++-- 3 files changed, 105 insertions(+), 41 deletions(-) diff --git a/custom_components/mikrotik_router/binary_sensor.py b/custom_components/mikrotik_router/binary_sensor.py index 8f1fb47..221d8d7 100644 --- a/custom_components/mikrotik_router/binary_sensor.py +++ b/custom_components/mikrotik_router/binary_sensor.py @@ -60,6 +60,25 @@ DEVICE_ATTRIBUTES_IFACE = [ "actual-mtu", "type", "name", +] + +DEVICE_ATTRIBUTES_IFACE_ETHER = [ + "running", + "enabled", + "comment", + "client-ip-address", + "client-mac-address", + "port-mac-address", + "last-link-down-time", + "last-link-up-time", + "link-downs", + "actual-mtu", + "type", + "name", + "status", + "auto-negotiation", + "rate", + "full-duplex", "default-name", "poe-out", ] @@ -476,12 +495,19 @@ class MikrotikControllerPortBinarySensor(MikrotikControllerBinarySensor): def extra_state_attributes(self) -> Dict[str, Any]: """Return the state attributes.""" attributes = self._attrs - for variable in DEVICE_ATTRIBUTES_IFACE: - if variable in self._data: - attributes[format_attribute(variable)] = self._data[variable] - if "sfp-shutdown-temperature" in self._data: - for variable in DEVICE_ATTRIBUTES_IFACE_SFP: + if self._data["type"] == "ether": + for variable in DEVICE_ATTRIBUTES_IFACE_ETHER: + if variable in self._data: + attributes[format_attribute(variable)] = self._data[variable] + + if "sfp-shutdown-temperature" in self._data: + for variable in DEVICE_ATTRIBUTES_IFACE_SFP: + if variable in self._data: + attributes[format_attribute(variable)] = self._data[variable] + + else: + for variable in self._sid_data["sid_attr"]: if variable in self._data: attributes[format_attribute(variable)] = self._data[variable] diff --git a/custom_components/mikrotik_router/mikrotik_controller.py b/custom_components/mikrotik_router/mikrotik_controller.py index 9df232d..6da9bdd 100644 --- a/custom_components/mikrotik_router/mikrotik_controller.py +++ b/custom_components/mikrotik_router/mikrotik_controller.py @@ -698,37 +698,50 @@ class MikrotikControllerData: "port-mac-address" ] = f"{vals['port-mac-address']}-{vals['name']}" - if ( - "sfp-shutdown-temperature" in vals - and vals["sfp-shutdown-temperature"] != "" - ): - self.data["interface"] = parse_api( - data=self.data["interface"], - source=self.api.get_sfp(vals[".id"]), - key_search="name", - vals=[ - {"name": "status", "default": "unknown"}, - {"name": "auto-negotiation", "default": "unknown"}, - {"name": "advertising", "default": "unknown"}, - {"name": "link-partner-advertising", "default": "unknown"}, - {"name": "sfp-temperature", "default": "unknown"}, - {"name": "sfp-supply-voltage", "default": "unknown"}, - {"name": "sfp-module-present", "default": "unknown"}, - {"name": "sfp-tx-bias-current", "default": "unknown"}, - {"name": "sfp-tx-power", "default": "unknown"}, - {"name": "sfp-rx-power", "default": "unknown"}, - {"name": "sfp-rx-loss", "default": "unknown"}, - {"name": "sfp-tx-fault", "default": "unknown"}, - {"name": "sfp-type", "default": "unknown"}, - {"name": "sfp-connector-type", "default": "unknown"}, - {"name": "sfp-vendor-name", "default": "unknown"}, - {"name": "sfp-vendor-part-number", "default": "unknown"}, - {"name": "sfp-vendor-revision", "default": "unknown"}, - {"name": "sfp-vendor-serial", "default": "unknown"}, - {"name": "sfp-manufacturing-date", "default": "unknown"}, - {"name": "eeprom-checksum", "default": "unknown"}, - ], - ) + if self.data["interface"][uid]["type"] == "ether": + if ( + "sfp-shutdown-temperature" in vals + and vals["sfp-shutdown-temperature"] != "" + ): + self.data["interface"] = parse_api( + data=self.data["interface"], + source=self.api.get_sfp(vals[".id"]), + key_search="name", + vals=[ + {"name": "status", "default": "unknown"}, + {"name": "auto-negotiation", "default": "unknown"}, + {"name": "advertising", "default": "unknown"}, + {"name": "link-partner-advertising", "default": "unknown"}, + {"name": "sfp-temperature", "default": "unknown"}, + {"name": "sfp-supply-voltage", "default": "unknown"}, + {"name": "sfp-module-present", "default": "unknown"}, + {"name": "sfp-tx-bias-current", "default": "unknown"}, + {"name": "sfp-tx-power", "default": "unknown"}, + {"name": "sfp-rx-power", "default": "unknown"}, + {"name": "sfp-rx-loss", "default": "unknown"}, + {"name": "sfp-tx-fault", "default": "unknown"}, + {"name": "sfp-type", "default": "unknown"}, + {"name": "sfp-connector-type", "default": "unknown"}, + {"name": "sfp-vendor-name", "default": "unknown"}, + {"name": "sfp-vendor-part-number", "default": "unknown"}, + {"name": "sfp-vendor-revision", "default": "unknown"}, + {"name": "sfp-vendor-serial", "default": "unknown"}, + {"name": "sfp-manufacturing-date", "default": "unknown"}, + {"name": "eeprom-checksum", "default": "unknown"}, + ], + ) + else: + self.data["interface"] = parse_api( + data=self.data["interface"], + source=self.api.get_sfp(vals[".id"]), + key_search="name", + vals=[ + {"name": "status", "default": "unknown"}, + {"name": "rate", "default": "unknown"}, + {"name": "full-duplex", "default": "unknown"}, + {"name": "auto-negotiation", "default": "unknown"}, + ], + ) # --------------------------- # get_interface_traffic diff --git a/custom_components/mikrotik_router/switch.py b/custom_components/mikrotik_router/switch.py index 42bc94a..194ba30 100644 --- a/custom_components/mikrotik_router/switch.py +++ b/custom_components/mikrotik_router/switch.py @@ -27,6 +27,25 @@ DEVICE_ATTRIBUTES_IFACE = [ "actual-mtu", "type", "name", +] + +DEVICE_ATTRIBUTES_IFACE_ETHER = [ + "running", + "enabled", + "comment", + "client-ip-address", + "client-mac-address", + "port-mac-address", + "last-link-down-time", + "last-link-up-time", + "link-downs", + "actual-mtu", + "type", + "name", + "status", + "auto-negotiation", + "rate", + "full-duplex", "default-name", "poe-out", ] @@ -379,12 +398,18 @@ class MikrotikControllerPortSwitch(MikrotikControllerSwitch): """Return the state attributes.""" attributes = self._attrs - for variable in self._sid_data["sid_attr"]: - if variable in self._data: - attributes[format_attribute(variable)] = self._data[variable] + if self._data["type"] == "ether": + for variable in DEVICE_ATTRIBUTES_IFACE_ETHER: + if variable in self._data: + attributes[format_attribute(variable)] = self._data[variable] - if "sfp-shutdown-temperature" in self._data: - for variable in DEVICE_ATTRIBUTES_IFACE_SFP: + if "sfp-shutdown-temperature" in self._data: + for variable in DEVICE_ATTRIBUTES_IFACE_SFP: + if variable in self._data: + attributes[format_attribute(variable)] = self._data[variable] + + else: + for variable in self._sid_data["sid_attr"]: if variable in self._data: attributes[format_attribute(variable)] = self._data[variable]