Skip to content

Commit 9e8f33b

Browse files
committed
Refactor authentication strategy to use server configuration diraectly and update related server handling
1 parent 36d4879 commit 9e8f33b

5 files changed

Lines changed: 33 additions & 25 deletions

File tree

pyoverkiz/auth/factory.py

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,26 +23,21 @@
2323
SessionLoginStrategy,
2424
SomfyAuthStrategy,
2525
)
26-
from pyoverkiz.const import SUPPORTED_SERVERS
2726
from pyoverkiz.enums import APIType, Server
2827
from pyoverkiz.models import ServerConfig
2928

3029

3130
def build_auth_strategy(
32-
server_key: str | Server | None,
31+
*,
3332
server_config: ServerConfig,
3433
credentials: Credentials,
3534
session: ClientSession,
3635
ssl_context: ssl.SSLContext | bool,
3736
) -> Any:
3837
"""Build the correct auth strategy for the given server and credentials."""
39-
# Normalize server key
40-
try:
41-
key = Server(server_key) if server_key else _match_server_key(server_config)
42-
except ValueError:
43-
key = None
38+
server: Server | None = server_config.server
4439

45-
if key == Server.SOMFY_EUROPE:
40+
if server == Server.SOMFY_EUROPE:
4641
return SomfyAuthStrategy(
4742
_ensure_username_password(credentials),
4843
session,
@@ -51,7 +46,7 @@ def build_auth_strategy(
5146
server_config.type,
5247
)
5348

54-
if key in {
49+
if server in {
5550
Server.ATLANTIC_COZYTOUCH,
5651
Server.THERMOR_COZYTOUCH,
5752
Server.SAUTER_COZYTOUCH,
@@ -64,7 +59,7 @@ def build_auth_strategy(
6459
server_config.type,
6560
)
6661

67-
if key == Server.NEXITY:
62+
if server == Server.NEXITY:
6863
return NexityAuthStrategy(
6964
_ensure_username_password(credentials),
7065
session,
@@ -73,7 +68,7 @@ def build_auth_strategy(
7368
server_config.type,
7469
)
7570

76-
if key == Server.REXEL:
71+
if server == Server.REXEL:
7772
return RexelAuthStrategy(
7873
_ensure_rexel(credentials),
7974
session,
@@ -111,15 +106,6 @@ def build_auth_strategy(
111106
)
112107

113108

114-
def _match_server_key(server: ServerConfig) -> Server:
115-
"""Find the `Server` enum corresponding to a `ServerConfig` entry."""
116-
for key, value in SUPPORTED_SERVERS.items():
117-
if server is value or server.endpoint == value.endpoint:
118-
return Server(key)
119-
120-
raise ValueError("Unable to match server to a known Server enum.")
121-
122-
123109
def _ensure_username_password(credentials: Credentials) -> UsernamePasswordCredentials:
124110
"""Validate that credentials are username/password based."""
125111
if not isinstance(credentials, UsernamePasswordCredentials):

pyoverkiz/client.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,9 +172,7 @@ def __init__(
172172
# work with Overkiz self-signed gateway certificates
173173
self._ssl.verify_flags &= ~ssl.VERIFY_X509_STRICT
174174

175-
inferred_server_key = server_key or self._resolve_server_key()
176175
self._auth = build_auth_strategy(
177-
inferred_server_key,
178176
self.server_config,
179177
credentials,
180178
self.session,
@@ -211,6 +209,9 @@ def _normalize_server(server: ServerConfig | Server | str) -> ServerConfig:
211209

212210
def _resolve_server_key(self) -> Server:
213211
"""Infer a `Server` enum for the current server configuration."""
212+
if self.server_config.server:
213+
return self.server_config.server
214+
214215
for key, value in SUPPORTED_SERVERS.items():
215216
if (
216217
self.server_config is value
@@ -243,7 +244,7 @@ async def login(
243244
"""
244245
await self._auth.login()
245246

246-
if self.api_type == APIType.LOCAL:
247+
if self.server_config.type == APIType.LOCAL:
247248
if register_event_listener:
248249
await self.register_event_listener()
249250
else:

pyoverkiz/const.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,96 +42,112 @@
4242

4343
SUPPORTED_SERVERS: dict[str, ServerConfig] = {
4444
Server.ATLANTIC_COZYTOUCH: ServerConfig(
45+
server=Server.ATLANTIC_COZYTOUCH,
4546
name="Atlantic Cozytouch",
4647
endpoint="https://ha110-1.overkiz.com/enduser-mobile-web/enduserAPI/",
4748
manufacturer="Atlantic",
4849
type=APIType.CLOUD,
4950
),
5051
Server.BRANDT: ServerConfig(
52+
server=Server.BRANDT,
5153
name="Brandt Smart Control",
5254
endpoint="https://ha3-1.overkiz.com/enduser-mobile-web/enduserAPI/",
5355
manufacturer="Brandt",
5456
type=APIType.CLOUD,
5557
),
5658
Server.FLEXOM: ServerConfig(
59+
server=Server.FLEXOM,
5760
name="Flexom",
5861
endpoint="https://ha108-1.overkiz.com/enduser-mobile-web/enduserAPI/",
5962
manufacturer="Bouygues",
6063
type=APIType.CLOUD,
6164
),
6265
Server.HEXAOM_HEXACONNECT: ServerConfig(
66+
server=Server.HEXAOM_HEXACONNECT,
6367
name="Hexaom HexaConnect",
6468
endpoint="https://ha5-1.overkiz.com/enduser-mobile-web/enduserAPI/",
6569
manufacturer="Hexaom",
6670
type=APIType.CLOUD,
6771
),
6872
Server.HI_KUMO_ASIA: ServerConfig(
73+
server=Server.HI_KUMO_ASIA,
6974
name="Hitachi Hi Kumo (Asia)",
7075
endpoint="https://ha203-1.overkiz.com/enduser-mobile-web/enduserAPI/",
7176
manufacturer="Hitachi",
7277
type=APIType.CLOUD,
7378
),
7479
Server.HI_KUMO_EUROPE: ServerConfig(
80+
server=Server.HI_KUMO_EUROPE,
7581
name="Hitachi Hi Kumo (Europe)",
7682
endpoint="https://ha117-1.overkiz.com/enduser-mobile-web/enduserAPI/",
7783
manufacturer="Hitachi",
7884
type=APIType.CLOUD,
7985
),
8086
Server.HI_KUMO_OCEANIA: ServerConfig(
87+
server=Server.HI_KUMO_OCEANIA,
8188
name="Hitachi Hi Kumo (Oceania)",
8289
endpoint="https://ha203-1.overkiz.com/enduser-mobile-web/enduserAPI/",
8390
manufacturer="Hitachi",
8491
type=APIType.CLOUD,
8592
),
8693
Server.NEXITY: ServerConfig(
94+
server=Server.NEXITY,
8795
name="Nexity Eugénie",
8896
endpoint="https://ha106-1.overkiz.com/enduser-mobile-web/enduserAPI/",
8997
manufacturer="Nexity",
9098
type=APIType.CLOUD,
9199
),
92100
Server.REXEL: ServerConfig(
101+
server=Server.REXEL,
93102
name="Rexel Energeasy Connect",
94103
endpoint=REXEL_BACKEND_API,
95104
manufacturer="Rexel",
96105
type=APIType.CLOUD,
97106
),
98107
Server.SAUTER_COZYTOUCH: ServerConfig( # duplicate of Atlantic Cozytouch
108+
server=Server.SAUTER_COZYTOUCH,
99109
name="Sauter Cozytouch",
100110
endpoint="https://ha110-1.overkiz.com/enduser-mobile-web/enduserAPI/",
101111
manufacturer="Sauter",
102112
type=APIType.CLOUD,
103113
),
104114
Server.SIMU_LIVEIN2: ServerConfig( # alias of https://tahomalink.com
115+
server=Server.SIMU_LIVEIN2,
105116
name="SIMU (LiveIn2)",
106117
endpoint="https://ha101-1.overkiz.com/enduser-mobile-web/enduserAPI/",
107118
manufacturer="Somfy",
108119
type=APIType.CLOUD,
109120
),
110121
Server.SOMFY_EUROPE: ServerConfig( # alias of https://tahomalink.com
122+
server=Server.SOMFY_EUROPE,
111123
name="Somfy (Europe)",
112124
endpoint="https://ha101-1.overkiz.com/enduser-mobile-web/enduserAPI/",
113125
manufacturer="Somfy",
114126
type=APIType.CLOUD,
115127
),
116128
Server.SOMFY_AMERICA: ServerConfig(
129+
server=Server.SOMFY_AMERICA,
117130
name="Somfy (North America)",
118131
endpoint="https://ha401-1.overkiz.com/enduser-mobile-web/enduserAPI/",
119132
manufacturer="Somfy",
120133
type=APIType.CLOUD,
121134
),
122135
Server.SOMFY_OCEANIA: ServerConfig(
136+
server=Server.SOMFY_OCEANIA,
123137
name="Somfy (Oceania)",
124138
endpoint="https://ha201-1.overkiz.com/enduser-mobile-web/enduserAPI/",
125139
manufacturer="Somfy",
126140
type=APIType.CLOUD,
127141
),
128142
Server.THERMOR_COZYTOUCH: ServerConfig( # duplicate of Atlantic Cozytouch
143+
server=Server.THERMOR_COZYTOUCH,
129144
name="Thermor Cozytouch",
130145
endpoint="https://ha110-1.overkiz.com/enduser-mobile-web/enduserAPI/",
131146
manufacturer="Thermor",
132147
type=APIType.CLOUD,
133148
),
134149
Server.UBIWIZZ: ServerConfig(
150+
server=Server.UBIWIZZ,
135151
name="Ubiwizz",
136152
endpoint="https://ha129-1.overkiz.com/enduser-mobile-web/enduserAPI/",
137153
manufacturer="Decelect",

pyoverkiz/models.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
)
2525
from pyoverkiz.enums.command import OverkizCommand, OverkizCommandParam
2626
from pyoverkiz.enums.protocol import Protocol
27-
from pyoverkiz.enums.server import APIType
27+
from pyoverkiz.enums.server import APIType, Server
2828
from pyoverkiz.obfuscate import obfuscate_email, obfuscate_id, obfuscate_string
2929
from pyoverkiz.types import DATA_TYPE_TO_PYTHON, StateType
3030

@@ -963,6 +963,7 @@ def __init__(
963963
class ServerConfig:
964964
"""Connection target details for an Overkiz-compatible server."""
965965

966+
server: Server | None = None
966967
name: str
967968
endpoint: str
968969
manufacturer: str

pyoverkiz/utils.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import re
66

77
from pyoverkiz.const import LOCAL_API_PATH
8-
from pyoverkiz.enums.server import APIType
8+
from pyoverkiz.enums.server import APIType, Server
99
from pyoverkiz.models import ServerConfig
1010

1111

@@ -15,13 +15,15 @@ def create_local_server_config(
1515
name: str = "Somfy Developer Mode",
1616
manufacturer: str = "Somfy",
1717
type: APIType = APIType.LOCAL,
18+
server: Server | None = Server.SOMFY_DEVELOPER_MODE,
1819
configuration_url: str | None = None,
1920
) -> ServerConfig:
2021
"""Generate server configuration for a local API (Somfy Developer mode)."""
2122
return create_server_config(
2223
name=name,
2324
endpoint=f"https://{host}{LOCAL_API_PATH}",
2425
manufacturer=manufacturer,
26+
server=server,
2527
configuration_url=configuration_url,
2628
type=type,
2729
)
@@ -32,11 +34,13 @@ def create_server_config(
3234
name: str,
3335
endpoint: str,
3436
manufacturer: str,
37+
server: Server | None = None,
3538
type: APIType = APIType.CLOUD,
3639
configuration_url: str | None = None,
3740
) -> ServerConfig:
3841
"""Generate server configuration with the provided endpoint and metadata."""
3942
return ServerConfig(
43+
server=server,
4044
name=name,
4145
endpoint=endpoint,
4246
manufacturer=manufacturer,

0 commit comments

Comments
 (0)