diff --git a/custom_components/mikrotik_router/mikrotik_controller.py b/custom_components/mikrotik_router/mikrotik_controller.py index c87bbbf..99c5d80 100644 --- a/custom_components/mikrotik_router/mikrotik_controller.py +++ b/custom_components/mikrotik_router/mikrotik_controller.py @@ -1,11 +1,12 @@ """Mikrotik Controller for Mikrotik Router.""" -import re import asyncio -import logging import ipaddress +import logging +import re +import pytz -from datetime import timedelta +from datetime import datetime, timedelta from ipaddress import ip_address, IPv4Network from mac_vendor_lookup import AsyncMacLookup @@ -61,6 +62,8 @@ from .mikrotikapi import MikrotikAPI _LOGGER = logging.getLogger(__name__) +DEFAULT_TIME_ZONE = None + def is_valid_ip(address): try: @@ -70,6 +73,21 @@ def is_valid_ip(address): return False +def utc_from_timestamp(timestamp: float) -> datetime: + """Return a UTC time from a timestamp.""" + return pytz.utc.localize(datetime.utcfromtimestamp(timestamp)) + + +def as_local(dattim: datetime) -> datetime: + """Convert a UTC datetime object to local time zone.""" + if dattim.tzinfo == DEFAULT_TIME_ZONE: + return dattim + if dattim.tzinfo is None: + dattim = pytz.utc.localize(dattim) + + return dattim.astimezone(DEFAULT_TIME_ZONE) + + # --------------------------- # MikrotikControllerData # --------------------------- @@ -1215,17 +1233,34 @@ class MikrotikControllerData: ) tmp_uptime = 0 - tmp = re.split(r"(\d+)[h]", self.data["resource"]["uptime_str"]) + tmp = re.split(r"(\d+)[s]", self.data["resource"]["uptime_str"]) if len(tmp) > 1: tmp_uptime += int(tmp[1]) + tmp = re.split(r"(\d+)[m]", self.data["resource"]["uptime_str"]) + if len(tmp) > 1: + tmp_uptime += int(tmp[1]) * 60 + tmp = re.split(r"(\d+)[h]", self.data["resource"]["uptime_str"]) + if len(tmp) > 1: + tmp_uptime += int(tmp[1]) * 3600 tmp = re.split(r"(\d+)[d]", self.data["resource"]["uptime_str"]) if len(tmp) > 1: - tmp_uptime += int(tmp[1]) * 24 + tmp_uptime += int(tmp[1]) * 86400 tmp = re.split(r"(\d+)[w]", self.data["resource"]["uptime_str"]) if len(tmp) > 1: - tmp_uptime += int(tmp[1]) * 24 * 7 + tmp_uptime += int(tmp[1]) * 604800 - self.data["resource"]["uptime"] = tmp_uptime + now = datetime.now().replace(microsecond=0) + uptime_tm = datetime.timestamp(now - timedelta(seconds=tmp_uptime)) + update_uptime = False; + if self.data["resource"]["uptime"] is None or self.data["resource"]["uptime"] == 0: + update_uptime = True; + else: + uptime_old = datetime.timestamp(datetime.fromisoformat(self.data["resource"]["uptime"])) + if uptime_tm > uptime_old: + update_uptime = True; + + if update_uptime: + self.data["resource"]["uptime"] = str(as_local(utc_from_timestamp(uptime_tm)).isoformat()) if self.data["resource"]["total-memory"] > 0: self.data["resource"]["memory-usage"] = round( diff --git a/custom_components/mikrotik_router/sensor.py b/custom_components/mikrotik_router/sensor.py index 92944be..ba96901 100644 --- a/custom_components/mikrotik_router/sensor.py +++ b/custom_components/mikrotik_router/sensor.py @@ -8,6 +8,7 @@ from homeassistant.const import ( ATTR_ATTRIBUTION, ATTR_DEVICE_CLASS, DEVICE_CLASS_TEMPERATURE, + DEVICE_CLASS_TIMESTAMP, DEVICE_CLASS_POWER, TEMP_CELSIUS, ) @@ -107,10 +108,10 @@ SENSOR_TYPES = { ATTR_ATTR: "fan2-speed", }, "system_uptime": { - ATTR_DEVICE_CLASS: None, - ATTR_ICON: "mdi:clock-outline", + ATTR_DEVICE_CLASS: DEVICE_CLASS_TIMESTAMP, + ATTR_ICON: None, ATTR_LABEL: "Uptime", - ATTR_UNIT: "h", + ATTR_UNIT: None, ATTR_GROUP: "System", ATTR_PATH: "resource", ATTR_ATTR: "uptime",