From ef7cac33700929fcc4ccc6024bbdf8f92ec04502 Mon Sep 17 00:00:00 2001 From: Marco Gosselink Date: Fri, 20 Oct 2023 07:21:33 +0200 Subject: [PATCH] Added firmware information and service get_info --- custom_components/davis_vantage/__init__.py | 22 ++++++++++++++++-- .../davis_vantage/assets/dark_icon.png | Bin .../davis_vantage/assets/dark_icon@2x.png | Bin .../davis_vantage/assets/dark_logo.png | Bin .../davis_vantage/assets/icon.png | Bin .../davis_vantage/assets/icon@2x.png | Bin .../davis_vantage/assets/logo.png | Bin custom_components/davis_vantage/client.py | 21 +++++++++++++++++ custom_components/davis_vantage/const.py | 3 ++- custom_components/davis_vantage/services.yaml | 4 +++- 10 files changed, 46 insertions(+), 4 deletions(-) mode change 100644 => 100755 custom_components/davis_vantage/assets/dark_icon.png mode change 100644 => 100755 custom_components/davis_vantage/assets/dark_icon@2x.png mode change 100644 => 100755 custom_components/davis_vantage/assets/dark_logo.png mode change 100644 => 100755 custom_components/davis_vantage/assets/icon.png mode change 100644 => 100755 custom_components/davis_vantage/assets/icon@2x.png mode change 100644 => 100755 custom_components/davis_vantage/assets/logo.png mode change 100644 => 100755 custom_components/davis_vantage/services.yaml diff --git a/custom_components/davis_vantage/__init__.py b/custom_components/davis_vantage/__init__.py index f0bd65b..4b8c5f7 100755 --- a/custom_components/davis_vantage/__init__.py +++ b/custom_components/davis_vantage/__init__.py @@ -17,7 +17,8 @@ MANUFACTURER, SERVICE_SET_DAVIS_TIME, SERVICE_GET_DAVIS_TIME, - SERVICE_GET_RAW_DATA + SERVICE_GET_RAW_DATA, + SERVICE_GET_INFO ) from .coordinator import DavisVantageDataUpdateCoordinator from .utils import convert_to_iso_datetime @@ -47,12 +48,16 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: hass.data[DOMAIN]['interval'] = entry.data.get("interval", 30) client = DavisVantageClient(hass, protocol, link, rain_collector, windrose8) + info = await client.async_get_info() + firmware_version = info.get('version', None) if info is not None else None device_info = DeviceInfo( identifiers={(DOMAIN, entry.entry_id)}, manufacturer=MANUFACTURER, name=NAME, - model=VERSION + model=VERSION, + sw_version=firmware_version, + hw_version=None ) hass.data[DOMAIN][entry.entry_id] = coordinator = DavisVantageDataUpdateCoordinator( @@ -81,6 +86,15 @@ async def get_raw_data(call: ServiceCall) -> dict[str, Any]: raw_data = client.get_raw_data() json_data = safe_serialize(raw_data) return json.loads(json_data) + + async def get_info(call: ServiceCall) -> dict[str, Any]: + info = await client.async_get_info() + if info is not None: + return info + else: + return { + "error": "Couldn't get firmware information from Davis weather station" + } hass.services.async_register( DOMAIN, SERVICE_SET_DAVIS_TIME, set_davis_time @@ -93,6 +107,10 @@ async def get_raw_data(call: ServiceCall) -> dict[str, Any]: DOMAIN, SERVICE_GET_RAW_DATA, get_raw_data, supports_response=SupportsResponse.ONLY ) + hass.services.async_register( + DOMAIN, SERVICE_GET_INFO, get_info, supports_response=SupportsResponse.ONLY + ) + def safe_serialize(obj: Any): default = lambda o: f"<>" # type: ignore return json.dumps(obj, default=default) # type: ignore diff --git a/custom_components/davis_vantage/assets/dark_icon.png b/custom_components/davis_vantage/assets/dark_icon.png old mode 100644 new mode 100755 diff --git a/custom_components/davis_vantage/assets/dark_icon@2x.png b/custom_components/davis_vantage/assets/dark_icon@2x.png old mode 100644 new mode 100755 diff --git a/custom_components/davis_vantage/assets/dark_logo.png b/custom_components/davis_vantage/assets/dark_logo.png old mode 100644 new mode 100755 diff --git a/custom_components/davis_vantage/assets/icon.png b/custom_components/davis_vantage/assets/icon.png old mode 100644 new mode 100755 diff --git a/custom_components/davis_vantage/assets/icon@2x.png b/custom_components/davis_vantage/assets/icon@2x.png old mode 100644 new mode 100755 diff --git a/custom_components/davis_vantage/assets/logo.png b/custom_components/davis_vantage/assets/logo.png old mode 100644 new mode 100755 diff --git a/custom_components/davis_vantage/client.py b/custom_components/davis_vantage/client.py index 2681aa3..99331dd 100755 --- a/custom_components/davis_vantage/client.py +++ b/custom_components/davis_vantage/client.py @@ -149,6 +149,27 @@ async def async_set_davis_time(self) -> None: except Exception as e: _LOGGER.error("Couldn't set davis time: %s", e) + def get_info(self) -> dict[str, Any] | None: + try: + self._vantagepro2.link.open() + firmware_version = self._vantagepro2.firmware_version # type: ignore + firmware_date = self._vantagepro2.firmware_date # type: ignore + diagnostics = self._vantagepro2.diagnostics # type: ignore + except Exception as e: + raise e + finally: + self._vantagepro2.link.close() + return { "version": firmware_version, "date": firmware_date, "diagnostics": diagnostics } + + async def async_get_info(self) -> dict[str, Any] | None: + info = None + try: + loop = asyncio.get_event_loop() + info = await loop.run_in_executor(None, self.get_info) + except Exception as e: + _LOGGER.error("Couldn't get firmware info: %s", e) + return info + def add_additional_info(self, data: dict[str, Any]) -> None: if data['TempOut'] is not None: if data['HumOut'] is not None: diff --git a/custom_components/davis_vantage/const.py b/custom_components/davis_vantage/const.py index 664153a..5df3673 100755 --- a/custom_components/davis_vantage/const.py +++ b/custom_components/davis_vantage/const.py @@ -4,7 +4,7 @@ DOMAIN = "davis_vantage" MANUFACTURER = "Davis" MODEL = "Vantage Pro2/Vue" -VERSION = "1.0.10" +VERSION = "1.0.11" DEFAULT_SYNC_INTERVAL = 30 # seconds DEFAULT_NAME = NAME @@ -18,3 +18,4 @@ SERVICE_SET_DAVIS_TIME = 'set_davis_time' SERVICE_GET_DAVIS_TIME = 'get_davis_time' SERVICE_GET_RAW_DATA = 'get_raw_data' +SERVICE_GET_INFO = 'get_info' diff --git a/custom_components/davis_vantage/services.yaml b/custom_components/davis_vantage/services.yaml old mode 100644 new mode 100755 index a8f0fac..890f2d0 --- a/custom_components/davis_vantage/services.yaml +++ b/custom_components/davis_vantage/services.yaml @@ -3,4 +3,6 @@ set_davis_time: get_davis_time: description: Get the time of the Davis weather station get_raw_data: - description: Get the raw, unprocessed data from the last fetch \ No newline at end of file + description: Get the raw, unprocessed data from the last fetch +get_firmware_info: + description: Get the firmware version and date information \ No newline at end of file