3131
3232import aiohttp
3333from defusedxml import ElementTree as etree
34+ from packaging .version import Version , parse
3435
3536
3637class Smile (SmileComm ):
@@ -75,7 +76,7 @@ def __init__(
7576 self ._target_smile : str = NONE
7677 self .gateway_id : str = NONE
7778 self .loc_data : dict [str , ThermoLoc ] = {}
78- self .smile_fw_version : str | None = None
79+ self .smile_fw_version : Version | None = None
7980 self .smile_hostname : str = NONE
8081 self .smile_hw_version : str | None = None
8182 self .smile_legacy = False
@@ -84,10 +85,10 @@ def __init__(
8485 self .smile_model_id : str | None = None
8586 self .smile_name : str = NONE
8687 self .smile_type : str = NONE
87- self .smile_version : str = NONE
88+ self .smile_version : Version | None = None
8889 self .smile_zigbee_mac_address : str | None = None
8990
90- async def connect (self ) -> bool :
91+ async def connect (self ) -> Version | None :
9192 """Connect to Plugwise device and determine its name, type and version."""
9293 result = await self ._request (DOMAIN_OBJECTS )
9394 # Work-around for Stretch fw 2.7.18
@@ -173,7 +174,7 @@ async def connect(self) -> bool:
173174 # Update all endpoints on first connect
174175 await self ._smile_api .full_update_device ()
175176
176- return True
177+ return self . smile_version
177178
178179 async def _smile_detect (self , result : etree , dsmrmain : etree ) -> None :
179180 """Helper-function for connect().
@@ -184,7 +185,7 @@ async def _smile_detect(self, result: etree, dsmrmain: etree) -> None:
184185 if (gateway := result .find ("./gateway" )) is not None :
185186 if (v_model := gateway .find ("vendor_model" )) is not None :
186187 model = v_model .text
187- self .smile_fw_version = gateway .find ("firmware_version" ).text
188+ self .smile_fw_version = parse ( gateway .find ("firmware_version" ).text )
188189 self .smile_hw_version = gateway .find ("hardware_version" ).text
189190 self .smile_hostname = gateway .find ("hostname" ).text
190191 self .smile_mac_address = gateway .find ("mac_address" ).text
@@ -200,7 +201,7 @@ async def _smile_detect(self, result: etree, dsmrmain: etree) -> None:
200201 )
201202 raise UnsupportedDeviceError
202203
203- version_major : str = self .smile_fw_version .split ( "." , 1 )[ 0 ]
204+ version_major = str ( self .smile_fw_version .major )
204205 self ._target_smile = f"{ model } _v{ version_major } "
205206 LOGGER .debug ("Plugwise identified as %s" , self ._target_smile )
206207 if self ._target_smile not in SMILES :
@@ -267,7 +268,7 @@ async def _smile_detect_legacy(
267268 or network is not None
268269 ):
269270 system = await self ._request (SYSTEM )
270- self .smile_fw_version = system .find ("./gateway/firmware" ).text
271+ self .smile_fw_version = parse ( system .find ("./gateway/firmware" ).text )
271272 return_model = system .find ("./gateway/product" ).text
272273 self .smile_hostname = system .find ("./gateway/hostname" ).text
273274 # If wlan0 contains data it's active, so eth0 should be checked last
@@ -278,7 +279,7 @@ async def _smile_detect_legacy(
278279 # P1 legacy:
279280 elif dsmrmain is not None :
280281 status = await self ._request (STATUS )
281- self .smile_fw_version = status .find ("./system/version" ).text
282+ self .smile_fw_version = parse ( status .find ("./system/version" ).text )
282283 return_model = status .find ("./system/product" ).text
283284 self .smile_hostname = status .find ("./network/hostname" ).text
284285 self .smile_mac_address = status .find ("./network/mac_address" ).text
0 commit comments