diff --git a/custom_components/mikrotik_router/mikrotik_controller.py b/custom_components/mikrotik_router/mikrotik_controller.py index c3bd1d5..f871a2c 100644 --- a/custom_components/mikrotik_router/mikrotik_controller.py +++ b/custom_components/mikrotik_router/mikrotik_controller.py @@ -136,6 +136,7 @@ class MikrotikControllerData: "client_traffic": {}, "environment": {}, "ups": {}, + "gps": {}, } self.notified_flags = [] @@ -175,6 +176,7 @@ class MikrotikControllerData: self.support_wifiwave2 = False self.support_ppp = False self.support_ups = False + self.support_gps = False self.major_fw_version = 0 @@ -453,6 +455,9 @@ class MikrotikControllerData: if "ups" in packages and packages["ups"]["enabled"]: self.support_ups = True + if "gps" in packages and packages["gps"]["enabled"]: + self.support_gps = True + # --------------------------- # async_get_host_hass # --------------------------- @@ -665,6 +670,9 @@ class MikrotikControllerData: if self.api.connected() and self.support_ups: await self.hass.async_add_executor_job(self.get_ups) + if self.api.connected() and self.support_gps: + await self.hass.async_add_executor_job(self.get_gps) + async_dispatcher_send(self.hass, self.signal_update) self.lock.release() @@ -1551,7 +1559,7 @@ class MikrotikControllerData: ), vals=[ {"name": "on-line", "type": "bool"}, - {"name": "runtime-left", "default": "unknown"}, + {"name": "runtime-left", "default": 0}, {"name": "battery-charge", "default": 0}, {"name": "battery-voltage", "default": 0.0}, {"name": "line-voltage", "default": 0}, @@ -1560,6 +1568,33 @@ class MikrotikControllerData: ], ) + # --------------------------- + # get_gps + # --------------------------- + def get_gps(self): + """Get GPS data from Mikrotik""" + self.data["gps"] = parse_api( + data=self.data["gps"], + source=self.api.query( + "/system/gps", + command="monitor", + args={"once": True}, + ), + vals=[ + {"name": "valid", "type": "bool"}, + {"name": "latitude", "default": "unknown"}, + {"name": "longitude", "default": "unknown"}, + {"name": "altitude", "default": "unknown"}, + {"name": "speed", "default": "unknown"}, + {"name": "destination-bearing", "default": "unknown"}, + {"name": "true-bearing", "default": "unknown"}, + {"name": "magnetic-bearing", "default": "unknown"}, + {"name": "satellites", "default": 0}, + {"name": "fix-quality", "default": 0}, + {"name": "horizontal-dilution", "default": "unknown"}, + ], + ) + # --------------------------- # get_script # --------------------------- diff --git a/custom_components/mikrotik_router/sensor_types.py b/custom_components/mikrotik_router/sensor_types.py index 1a6f98f..f4dad8f 100644 --- a/custom_components/mikrotik_router/sensor_types.py +++ b/custom_components/mikrotik_router/sensor_types.py @@ -71,6 +71,19 @@ DEVICE_ATTRIBUTES_CLIENT_TRAFFIC = [ "authorized", "bypassed", ] +DEVICE_ATTRIBUTES_GPS = [ + "valid", + "latitude", + "longitude", + "altitude", + "speed", + "destination-bearing", + "true-bearing", + "magnetic-bearing", + "satellites", + "fix-quality", + "horizontal-dilution", +] @dataclass @@ -301,6 +314,38 @@ SENSOR_TYPES = { data_uid="", data_reference="", ), + "system_gps-latitude": MikrotikSensorEntityDescription( + key="system_gps-latitude", + name="latitude", + icon="mdi:latitude", + native_unit_of_measurement=None, + device_class=None, + state_class=None, + entity_category=EntityCategory.DIAGNOSTIC, + ha_group="System", + data_path="gps", + data_attribute="latitude", + data_name="", + data_uid="", + data_reference="", + data_attributes_list=DEVICE_ATTRIBUTES_GPS, + ), + "system_gps-longitude": MikrotikSensorEntityDescription( + key="system_gps-longitude", + name="longitude", + icon="mdi:longitude", + native_unit_of_measurement=None, + device_class=None, + state_class=None, + entity_category=EntityCategory.DIAGNOSTIC, + ha_group="System", + data_path="gps", + data_attribute="longitude", + data_name="", + data_uid="", + data_reference="", + data_attributes_list=DEVICE_ATTRIBUTES_GPS, + ), "traffic_tx": MikrotikSensorEntityDescription( key="traffic_tx", name="TX",