From 4dc60c29ee07a83031d78ba9216b213c54757519 Mon Sep 17 00:00:00 2001 From: Andre Basche Date: Thu, 11 Jan 2024 01:18:10 +0100 Subject: [PATCH 01/12] Fix crash in loading attributs Andre0512/hon#134 --- pyhon/commands.py | 5 ++++- setup.py | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/pyhon/commands.py b/pyhon/commands.py index d88cbd1..facf419 100644 --- a/pyhon/commands.py +++ b/pyhon/commands.py @@ -89,8 +89,11 @@ class HonCommand: def parameter_value(self) -> Dict[str, Union[str, float]]: return {n: p.value for n, p in self._parameters.items()} - def _load_parameters(self, attributes: Dict[str, Dict[str, Any]]) -> None: + def _load_parameters(self, attributes: Dict[str, Dict[str, Any] | Any]) -> None: for key, items in attributes.items(): + if not isinstance(items, dict): + _LOGGER.info("Loading Attributes - Skipping %s", str(items)) + continue for name, data in items.items(): self._create_parameters(data, name, key) for rule in self._rules: diff --git a/setup.py b/setup.py index 3887039..3f29968 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ with open("README.md", "r", encoding="utf-8") as f: setup( name="pyhOn", - version="0.15.14", + version="0.15.15", author="Andre Basche", description="Control hOn devices with python", long_description=long_description, From 327d4a181484d49ccbef25e470cfc86d2c5d91fa Mon Sep 17 00:00:00 2001 From: Andre Basche Date: Mon, 15 Jan 2024 10:36:18 +0100 Subject: [PATCH 02/12] Update README.md --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 88bc807..18cf8f6 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,14 @@ +# Announcement: I have to take the project down in the next few days +> Dear User, +> +> We are writing to inform you that we have discovered two Home Assistant integration plug-ins developed by you ( https://github.com/Andre0512/hon and https://github.com/Andre0512/pyhOn ) that are in violation of our terms of service. Specifically, the plug-ins are using our services in an unauthorized manner which is causing significant economic harm to our Company. +> We take the protection of our intellectual property very seriously and demand that you immediately cease and desist all illegal activities related to the development and distribution of these plug-ins. We also request that you remove the plug-ins from all stores and code hosting platforms where they are currently available. +> Please be advised that we will take all necessary legal action to protect our interests if you fail to comply with this notice. We reserve the right to pursue all available remedies, including but not limited to monetary damages, injunctive relief, and attorney's fees. +> We strongly urge you to take immediate action to rectify this situation and avoid any further legal action. If you have any questions or concerns, please do not hesitate to contact us. +> +> Haier Europe Security and Governance Department + + **This python package is unofficial and is not related in any way to Haier. It was developed by reversed engineered requests and can stop working at anytime!** # pyhOn From 3acd12f345d4786149ef7857da108fa6cfa69f3c Mon Sep 17 00:00:00 2001 From: Andre Basche Date: Fri, 2 Feb 2024 23:49:49 +0100 Subject: [PATCH 03/12] Update README.md --- README.md | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/README.md b/README.md index 18cf8f6..88bc807 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,3 @@ -# Announcement: I have to take the project down in the next few days -> Dear User, -> -> We are writing to inform you that we have discovered two Home Assistant integration plug-ins developed by you ( https://github.com/Andre0512/hon and https://github.com/Andre0512/pyhOn ) that are in violation of our terms of service. Specifically, the plug-ins are using our services in an unauthorized manner which is causing significant economic harm to our Company. -> We take the protection of our intellectual property very seriously and demand that you immediately cease and desist all illegal activities related to the development and distribution of these plug-ins. We also request that you remove the plug-ins from all stores and code hosting platforms where they are currently available. -> Please be advised that we will take all necessary legal action to protect our interests if you fail to comply with this notice. We reserve the right to pursue all available remedies, including but not limited to monetary damages, injunctive relief, and attorney's fees. -> We strongly urge you to take immediate action to rectify this situation and avoid any further legal action. If you have any questions or concerns, please do not hesitate to contact us. -> -> Haier Europe Security and Governance Department - - **This python package is unofficial and is not related in any way to Haier. It was developed by reversed engineered requests and can stop working at anytime!** # pyhOn From 8a46bd4b53565ee420a443dc93a3f34344107f0f Mon Sep 17 00:00:00 2001 From: Andre Basche Date: Sun, 4 Feb 2024 03:39:06 +0100 Subject: [PATCH 04/12] Fix for float steps #22 --- pyhon/parameter/range.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pyhon/parameter/range.py b/pyhon/parameter/range.py index 6eef53e..76bd2b6 100644 --- a/pyhon/parameter/range.py +++ b/pyhon/parameter/range.py @@ -69,4 +69,11 @@ class HonParameterRange(HonParameter): @property def values(self) -> List[str]: + if isinstance(self.step, float): + result = [] + i = self.min + while i <= self.max: + i += self.step + result.append(str(i)) + return result return [str(i) for i in range(int(self.min), int(self.max) + 1, int(self.step))] From 2a74000ff31af59b0dce635dd34cc423d3967728 Mon Sep 17 00:00:00 2001 From: Andre Basche Date: Sun, 4 Feb 2024 03:42:35 +0100 Subject: [PATCH 05/12] Update requirements --- pyhon/appliance.py | 6 ++---- pyhon/typedefs.py | 3 +-- requirements.txt | 2 +- setup.py | 4 ++-- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/pyhon/appliance.py b/pyhon/appliance.py index 3586f4a..3754aca 100644 --- a/pyhon/appliance.py +++ b/pyhon/appliance.py @@ -72,12 +72,10 @@ class HonAppliance: return self.info[item] @overload - def get(self, item: str, default: None = None) -> Any: - ... + def get(self, item: str, default: None = None) -> Any: ... @overload - def get(self, item: str, default: T) -> T: - ... + def get(self, item: str, default: T) -> T: ... def get(self, item: str, default: Optional[T] = None) -> Any: try: diff --git a/pyhon/typedefs.py b/pyhon/typedefs.py index 51a137b..68ddf73 100644 --- a/pyhon/typedefs.py +++ b/pyhon/typedefs.py @@ -14,8 +14,7 @@ if TYPE_CHECKING: class Callback(Protocol): # pylint: disable=too-few-public-methods def __call__( self, url: str | URL, *args: Any, **kwargs: Any - ) -> aiohttp.client._RequestContextManager: - ... + ) -> aiohttp.client._RequestContextManager: ... Parameter = Union[ diff --git a/requirements.txt b/requirements.txt index bc45835..81e74ff 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -aiohttp>=3.8 +aiohttp>=3.8.6 yarl>=1.8 typing-extensions>=4.8 diff --git a/setup.py b/setup.py index 3f29968..9ae2a1f 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ with open("README.md", "r", encoding="utf-8") as f: setup( name="pyhOn", - version="0.15.15", + version="0.15.16", author="Andre Basche", description="Control hOn devices with python", long_description=long_description, @@ -21,7 +21,7 @@ setup( packages=find_packages(), include_package_data=True, python_requires=">=3.10", - install_requires=["aiohttp>=3.8", "typing-extensions>=4.8", "yarl>=1.8"], + install_requires=["aiohttp>=3.8.6", "typing-extensions>=4.8", "yarl>=1.8"], classifiers=[ "Development Status :: 4 - Beta", "Environment :: Console", From 29c936b045d6042e0cc6dbeb98e67e1620a23f47 Mon Sep 17 00:00:00 2001 From: Andre Basche Date: Sun, 4 Feb 2024 04:21:27 +0100 Subject: [PATCH 06/12] Fix path for #22 --- pyhon/hon.py | 6 ++++-- pyhon/parameter/range.py | 14 ++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pyhon/hon.py b/pyhon/hon.py index d6c73e2..dfd117e 100644 --- a/pyhon/hon.py +++ b/pyhon/hon.py @@ -103,8 +103,10 @@ class Hon: ) await self._create_appliance(appliance, self.api) if ( - test_data := self._test_data_path / "hon-test-data" / "test_data" - ).exists() or (test_data := test_data / "test_data").exists(): + self._test_data_path + and (test_data := self._test_data_path / "hon-test-data" / "test_data").exists() + or (test_data := test_data / "..").exists() + ): api = TestAPI(test_data) for appliance in await api.load_appliances(): await self._create_appliance(appliance, api) diff --git a/pyhon/parameter/range.py b/pyhon/parameter/range.py index 76bd2b6..fa00de0 100644 --- a/pyhon/parameter/range.py +++ b/pyhon/parameter/range.py @@ -69,11 +69,9 @@ class HonParameterRange(HonParameter): @property def values(self) -> List[str]: - if isinstance(self.step, float): - result = [] - i = self.min - while i <= self.max: - i += self.step - result.append(str(i)) - return result - return [str(i) for i in range(int(self.min), int(self.max) + 1, int(self.step))] + result = [] + i = self.min + while i < self.max: + i += self.step + result.append(str(i)) + return result From a5595f47bf4c1bdaba21b9e6b15fedb1e08df15e Mon Sep 17 00:00:00 2001 From: Andre Basche Date: Fri, 9 Feb 2024 20:33:50 +0100 Subject: [PATCH 07/12] Fix another issue with data path --- pyhon/__main__.py | 9 +++------ pyhon/hon.py | 4 +++- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/pyhon/__main__.py b/pyhon/__main__.py index 9e9b25b..28bfcdf 100755 --- a/pyhon/__main__.py +++ b/pyhon/__main__.py @@ -38,9 +38,7 @@ def get_arguments() -> Dict[str, Any]: "translate", help="language (de, en, fr...)", metavar="LANGUAGE" ) translation.add_argument("--json", help="print as json", action="store_true") - parser.add_argument( - "-i", "--import", help="import pyhon data", nargs="?", default=Path().cwd() - ) + parser.add_argument("-i", "--import", help="import pyhon data", nargs="?") return vars(parser.parse_args()) @@ -73,9 +71,8 @@ async def main() -> None: if language := args.get("translate"): await translate(language, json_output=args.get("json", "")) return - async with Hon( - *get_login_data(args), test_data_path=Path(args.get("import", "")) - ) as hon: + test_data_path = Path(path) if (path := args.get("import", "")) else None + async with Hon(*get_login_data(args), test_data_path=test_data_path) as hon: for device in hon.appliances: if args.get("export"): anonymous = args.get("anonymous", False) diff --git a/pyhon/hon.py b/pyhon/hon.py index dfd117e..b8d25e2 100644 --- a/pyhon/hon.py +++ b/pyhon/hon.py @@ -104,7 +104,9 @@ class Hon: await self._create_appliance(appliance, self.api) if ( self._test_data_path - and (test_data := self._test_data_path / "hon-test-data" / "test_data").exists() + and ( + test_data := self._test_data_path / "hon-test-data" / "test_data" + ).exists() or (test_data := test_data / "..").exists() ): api = TestAPI(test_data) From df27729c2ecfeaead052847be1353428d6e8de3f Mon Sep 17 00:00:00 2001 From: Andre Basche Date: Fri, 9 Feb 2024 20:37:53 +0100 Subject: [PATCH 08/12] Change mobile id --- pyhon/connection/api.py | 4 +++- pyhon/connection/device.py | 5 ++--- pyhon/connection/handler/hon.py | 8 ++++++-- pyhon/const.py | 9 +++++---- pyhon/hon.py | 2 ++ 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/pyhon/connection/api.py b/pyhon/connection/api.py index 2cb7dfe..07bc528 100644 --- a/pyhon/connection/api.py +++ b/pyhon/connection/api.py @@ -24,12 +24,14 @@ class HonAPI: email: str = "", password: str = "", anonymous: bool = False, + mobile_id: str = "", session: Optional[ClientSession] = None, ) -> None: super().__init__() self._email: str = email self._password: str = password self._anonymous: bool = anonymous + self._mobile_id: str = mobile_id self._hon_handler: Optional[HonConnectionHandler] = None self._hon_anonymous_handler: Optional[HonAnonymousConnectionHandler] = None self._session: Optional[ClientSession] = session @@ -69,7 +71,7 @@ class HonAPI: ).create() if not self._anonymous: self._hon_handler = await HonConnectionHandler( - self._email, self._password, self._session + self._email, self._password, self._session, mobile_id=self._mobile_id ).create() return self diff --git a/pyhon/connection/device.py b/pyhon/connection/device.py index 730ef72..0923aae 100644 --- a/pyhon/connection/device.py +++ b/pyhon/connection/device.py @@ -1,16 +1,15 @@ -import secrets from typing import Dict from pyhon import const class HonDevice: - def __init__(self) -> None: + def __init__(self, mobile_id: str = "") -> None: self._app_version: str = const.APP_VERSION self._os_version: int = const.OS_VERSION self._os: str = const.OS self._device_model: str = const.DEVICE_MODEL - self._mobile_id: str = secrets.token_hex(8) + self._mobile_id: str = mobile_id or const.MOBILE_ID @property def app_version(self) -> str: diff --git a/pyhon/connection/handler/hon.py b/pyhon/connection/handler/hon.py index 8fbeca9..997fb5b 100644 --- a/pyhon/connection/handler/hon.py +++ b/pyhon/connection/handler/hon.py @@ -19,10 +19,14 @@ _LOGGER = logging.getLogger(__name__) class HonConnectionHandler(ConnectionHandler): def __init__( - self, email: str, password: str, session: Optional[aiohttp.ClientSession] = None + self, + email: str, + password: str, + mobile_id: str = "", + session: Optional[aiohttp.ClientSession] = None, ) -> None: super().__init__(session=session) - self._device: HonDevice = HonDevice() + self._device: HonDevice = HonDevice(mobile_id) self._email: str = email self._password: str = password if not self._email: diff --git a/pyhon/const.py b/pyhon/const.py index 8ea749f..0bc1a02 100644 --- a/pyhon/const.py +++ b/pyhon/const.py @@ -6,8 +6,9 @@ CLIENT_ID = ( "3MVG9QDx8IX8nP5T2Ha8ofvlmjLZl5L_gvfbT9." "HJvpHGKoAS_dcMN8LYpTSYeVFCraUnV.2Ag1Ki7m4znVO6" ) -APP_VERSION = "2.4.7" -OS_VERSION = 31 +APP_VERSION = "2.6.5" +OS_VERSION = 999 OS = "android" -DEVICE_MODEL = "exynos9820" -USER_AGENT = "Chrome/110.0.5481.153" +DEVICE_MODEL = "pyhOn" +USER_AGENT = "Chrome/999.999.999.999" +MOBILE_ID = "pyhOn" diff --git a/pyhon/hon.py b/pyhon/hon.py index b8d25e2..c52d6eb 100644 --- a/pyhon/hon.py +++ b/pyhon/hon.py @@ -21,6 +21,7 @@ class Hon: email: Optional[str] = "", password: Optional[str] = "", session: Optional[ClientSession] = None, + mobile_id: str = "", test_data_path: Optional[Path] = None, ): self._email: Optional[str] = email @@ -29,6 +30,7 @@ class Hon: self._appliances: List[HonAppliance] = [] self._api: Optional[HonAPI] = None self._test_data_path: Path = test_data_path or Path().cwd() + self._mobile_id: str = mobile_id async def __aenter__(self) -> Self: return await self.create() From 767cbe35de35954e355ae97ba0dcce6ad97b1953 Mon Sep 17 00:00:00 2001 From: Andre Basche Date: Sat, 10 Feb 2024 00:59:14 +0100 Subject: [PATCH 09/12] Set refresh token --- pyhon/connection/api.py | 7 ++++++- pyhon/connection/auth.py | 2 ++ pyhon/connection/handler/hon.py | 10 +++++++++- pyhon/hon.py | 8 +++++++- 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/pyhon/connection/api.py b/pyhon/connection/api.py index 07bc528..1e17e4c 100644 --- a/pyhon/connection/api.py +++ b/pyhon/connection/api.py @@ -25,6 +25,7 @@ class HonAPI: password: str = "", anonymous: bool = False, mobile_id: str = "", + refresh_token: str = "", session: Optional[ClientSession] = None, ) -> None: super().__init__() @@ -32,6 +33,7 @@ class HonAPI: self._password: str = password self._anonymous: bool = anonymous self._mobile_id: str = mobile_id + self._refresh_token: str = refresh_token self._hon_handler: Optional[HonConnectionHandler] = None self._hon_anonymous_handler: Optional[HonAnonymousConnectionHandler] = None self._session: Optional[ClientSession] = session @@ -71,7 +73,10 @@ class HonAPI: ).create() if not self._anonymous: self._hon_handler = await HonConnectionHandler( - self._email, self._password, self._session, mobile_id=self._mobile_id + self._email, + self._password, + self._session, + mobile_id=self._mobile_id, ).create() return self diff --git a/pyhon/connection/auth.py b/pyhon/connection/auth.py index cf75410..5012bbf 100644 --- a/pyhon/connection/auth.py +++ b/pyhon/connection/auth.py @@ -48,6 +48,7 @@ class HonAuth: email: str, password: str, device: HonDevice, + refresh_token: str = "", ) -> None: self._session = session self._request = HonAuthConnectionHandler(session) @@ -57,6 +58,7 @@ class HonAuth: self._device = device self._expires: datetime = datetime.utcnow() self._auth = HonAuthData() + self._auth.refresh_token = refresh_token @property def cognito_token(self) -> str: diff --git a/pyhon/connection/handler/hon.py b/pyhon/connection/handler/hon.py index 997fb5b..b7d808e 100644 --- a/pyhon/connection/handler/hon.py +++ b/pyhon/connection/handler/hon.py @@ -23,12 +23,14 @@ class HonConnectionHandler(ConnectionHandler): email: str, password: str, mobile_id: str = "", + refresh_token: str = "", session: Optional[aiohttp.ClientSession] = None, ) -> None: super().__init__(session=session) self._device: HonDevice = HonDevice(mobile_id) self._email: str = email self._password: str = password + self._refresh_token: str = refresh_token if not self._email: raise HonAuthenticationError("An email address must be specified") if not self._password: @@ -47,7 +49,13 @@ class HonConnectionHandler(ConnectionHandler): async def create(self) -> Self: await super().create() - self._auth = HonAuth(self.session, self._email, self._password, self._device) + self._auth = HonAuth( + self.session, + self._email, + self._password, + self._device, + refresh_token=self._refresh_token, + ) return self async def _check_headers(self, headers: Dict[str, str]) -> Dict[str, str]: diff --git a/pyhon/hon.py b/pyhon/hon.py index c52d6eb..7f53fb4 100644 --- a/pyhon/hon.py +++ b/pyhon/hon.py @@ -22,6 +22,7 @@ class Hon: password: Optional[str] = "", session: Optional[ClientSession] = None, mobile_id: str = "", + refresh_token: str = "", test_data_path: Optional[Path] = None, ): self._email: Optional[str] = email @@ -31,6 +32,7 @@ class Hon: self._api: Optional[HonAPI] = None self._test_data_path: Path = test_data_path or Path().cwd() self._mobile_id: str = mobile_id + self._refresh_token: str = refresh_token async def __aenter__(self) -> Self: return await self.create() @@ -63,7 +65,11 @@ class Hon: async def create(self) -> Self: self._api = await HonAPI( - self.email, self.password, session=self._session + self.email, + self.password, + session=self._session, + mobile_id=self._mobile_id, + refresh_token=self._refresh_token, ).create() await self.setup() return self From c4e8038652bce57cf01535bf15a0661232ce4c64 Mon Sep 17 00:00:00 2001 From: Andre Basche Date: Sun, 11 Feb 2024 02:02:47 +0100 Subject: [PATCH 10/12] Fix problems with refresh token --- pyhon/command_loader.py | 2 +- pyhon/connection/api.py | 2 +- pyhon/connection/auth.py | 8 ++++---- pyhon/connection/handler/hon.py | 5 +++-- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/pyhon/command_loader.py b/pyhon/command_loader.py index 94b0277..fd615ec 100644 --- a/pyhon/command_loader.py +++ b/pyhon/command_loader.py @@ -109,7 +109,7 @@ class HonCommandLoader: categories: Optional[Dict[str, "HonCommand"]] = None, category_name: str = "", ) -> Optional[HonCommand]: - """Try to crate HonCommand object""" + """Try to create HonCommand object""" if not isinstance(data, dict): self._additional_data[command_name] = data return None diff --git a/pyhon/connection/api.py b/pyhon/connection/api.py index 1e17e4c..30a9cd2 100644 --- a/pyhon/connection/api.py +++ b/pyhon/connection/api.py @@ -75,7 +75,7 @@ class HonAPI: self._hon_handler = await HonConnectionHandler( self._email, self._password, - self._session, + session=self._session, mobile_id=self._mobile_id, ).create() return self diff --git a/pyhon/connection/auth.py b/pyhon/connection/auth.py index 5012bbf..c6f7c4f 100644 --- a/pyhon/connection/auth.py +++ b/pyhon/connection/auth.py @@ -48,7 +48,6 @@ class HonAuth: email: str, password: str, device: HonDevice, - refresh_token: str = "", ) -> None: self._session = session self._request = HonAuthConnectionHandler(session) @@ -58,7 +57,6 @@ class HonAuth: self._device = device self._expires: datetime = datetime.utcnow() self._auth = HonAuthData() - self._auth.refresh_token = refresh_token @property def cognito_token(self) -> str: @@ -201,7 +199,7 @@ class HonAuth: if access_token := re.findall("access_token=(.*?)&", text): self._auth.access_token = access_token[0] if refresh_token := re.findall("refresh_token=(.*?)&", text): - self._auth.refresh_token = refresh_token[0] + self._auth.refresh_token = parse.unquote(refresh_token[0]) if id_token := re.findall("id_token=(.*?)&", text): self._auth.id_token = id_token[0] return bool(access_token and refresh_token and id_token) @@ -266,7 +264,9 @@ class HonAuth: except exceptions.HonNoAuthenticationNeeded: return - async def refresh(self) -> bool: + async def refresh(self, refresh_token="") -> bool: + if refresh_token: + self._auth.refresh_token = refresh_token params = { "client_id": const.CLIENT_ID, "refresh_token": self._auth.refresh_token, diff --git a/pyhon/connection/handler/hon.py b/pyhon/connection/handler/hon.py index b7d808e..988c8f4 100644 --- a/pyhon/connection/handler/hon.py +++ b/pyhon/connection/handler/hon.py @@ -22,9 +22,9 @@ class HonConnectionHandler(ConnectionHandler): self, email: str, password: str, + session: Optional[aiohttp.ClientSession] = None, mobile_id: str = "", refresh_token: str = "", - session: Optional[aiohttp.ClientSession] = None, ) -> None: super().__init__(session=session) self._device: HonDevice = HonDevice(mobile_id) @@ -54,11 +54,12 @@ class HonConnectionHandler(ConnectionHandler): self._email, self._password, self._device, - refresh_token=self._refresh_token, ) return self async def _check_headers(self, headers: Dict[str, str]) -> Dict[str, str]: + if self._refresh_token: + await self.auth.refresh(self._refresh_token) if not (self.auth.cognito_token and self.auth.id_token): await self.auth.authenticate() headers["cognito-token"] = self.auth.cognito_token From e225a850bcfbc62b9b4dd5106399258f1e9f484f Mon Sep 17 00:00:00 2001 From: Andre Basche Date: Sun, 11 Feb 2024 05:10:54 +0100 Subject: [PATCH 11/12] Fix checks --- .pylintrc | 2 +- pyhon/connection/auth.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.pylintrc b/.pylintrc index 5071b8a..c73587e 100644 --- a/.pylintrc +++ b/.pylintrc @@ -4,6 +4,6 @@ disable=missing-docstring [FORMAT] -max-args=6 +max-args=7 max-attributes=8 max-line-length=88 diff --git a/pyhon/connection/auth.py b/pyhon/connection/auth.py index c6f7c4f..2096010 100644 --- a/pyhon/connection/auth.py +++ b/pyhon/connection/auth.py @@ -264,7 +264,7 @@ class HonAuth: except exceptions.HonNoAuthenticationNeeded: return - async def refresh(self, refresh_token="") -> bool: + async def refresh(self, refresh_token: str = "") -> bool: if refresh_token: self._auth.refresh_token = refresh_token params = { From 6162cd3f981a512b1b1c0dd86120edf587a54bf0 Mon Sep 17 00:00:00 2001 From: Andre Basche Date: Sun, 11 Feb 2024 05:11:11 +0100 Subject: [PATCH 12/12] Bump version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 9ae2a1f..dd638c3 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ with open("README.md", "r", encoding="utf-8") as f: setup( name="pyhOn", - version="0.15.16", + version="0.16.0", author="Andre Basche", description="Control hOn devices with python", long_description=long_description,