python-aidot 0.2.3__tar.gz → 0.2.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: python-aidot
3
- Version: 0.2.3
3
+ Version: 0.2.5
4
4
  Summary: aidot control wifi lights
5
5
  Home-page: https://github.com/Aidot-Development-Team/python-aidot
6
6
  Author: aidotdev2024
@@ -0,0 +1,166 @@
1
+ """The aidot integration."""
2
+
3
+ import logging
4
+ from typing import Any, Optional
5
+ from aiohttp import ClientResponseError, ClientSession
6
+ import base64
7
+ import aiohttp
8
+ from cryptography.hazmat.backends import default_backend
9
+ from cryptography.hazmat.primitives import serialization
10
+ from cryptography.hazmat.primitives.asymmetric import padding
11
+
12
+ from .login_const import APP_ID, PUBLIC_KEY_PEM, BASE_URL
13
+ from .const import (
14
+ SUPPORTED_COUNTRYS,
15
+ DEFAULT_COUNTRY_NAME,
16
+ CONF_PRODUCT_ID,
17
+ CONF_ID,
18
+ CONF_PRODUCT,
19
+ CONF_ACCESS_TOKEN,
20
+ CONF_REFRESH_TOKEN,
21
+ CONF_TERMINAL,
22
+ CONF_APP_ID,
23
+ )
24
+ from .exceptions import AidotAuthFailed
25
+
26
+ _LOGGER = logging.getLogger(__name__)
27
+
28
+
29
+ def rsa_password_encrypt(message: str):
30
+ """Get password rsa encrypt."""
31
+ public_key = serialization.load_pem_public_key(
32
+ PUBLIC_KEY_PEM, backend=default_backend()
33
+ )
34
+
35
+ encrypted = public_key.encrypt(
36
+ message.encode("utf-8"),
37
+ padding.PKCS1v15(),
38
+ )
39
+
40
+ encrypted_base64 = base64.b64encode(encrypted).decode("utf-8")
41
+ return encrypted_base64
42
+
43
+
44
+ class AidotClient:
45
+ _base_url: str = BASE_URL
46
+ _region: str = "us"
47
+ session: Optional[ClientSession] = None
48
+ username: str = ""
49
+ password: str = ""
50
+ country_name: str = DEFAULT_COUNTRY_NAME
51
+ login_info: dict[str, Any] = {}
52
+
53
+ def __init__(
54
+ self,
55
+ country_name: str | None = None,
56
+ username: str | None = None,
57
+ password: str | None = None,
58
+ token: dict | None = None,
59
+ ) -> None:
60
+ self.country_name = country_name
61
+ self.username = username
62
+ self.password = password
63
+ self.login_info = token
64
+ for item in SUPPORTED_COUNTRYS:
65
+ if item["name"] == self.country_name:
66
+ self._region = item["region"].lower()
67
+ self._base_url = f"https://prod-{self._region}-api.arnoo.com/v17"
68
+ break
69
+
70
+ def get_identifier(self) -> str:
71
+ return f"{self.username}-{self.password}-{self._region}"
72
+
73
+ async def async_post_login(self):
74
+ """Login the user input allows us to connect."""
75
+ url = f"{self._base_url}/users/loginWithFreeVerification"
76
+ headers = {CONF_APP_ID: APP_ID, CONF_TERMINAL: "app"}
77
+ data = {
78
+ "countryKey": "region:UnitedStates",
79
+ "username": self.username,
80
+ "password": rsa_password_encrypt(self.password),
81
+ "terminalId": "gvz3gjae10l4zii00t7y0",
82
+ "webVersion": "0.5.0",
83
+ "area": "Asia/Shanghai",
84
+ "UTC": "UTC+8",
85
+ }
86
+
87
+ try:
88
+ async with self.session.post(url, headers=headers, json=data) as response:
89
+ response.raise_for_status()
90
+ self.login_info = await response.json()
91
+ return self.login_info
92
+ except aiohttp.ClientError as e:
93
+ _LOGGER.info("async_post_login ClientError {e}")
94
+ return None
95
+
96
+ async def async_refresh_token(self):
97
+ url = f"{self._base_url}/users/refreshToken"
98
+ headers = {CONF_APP_ID: APP_ID, CONF_TERMINAL: "app"}
99
+ data = {
100
+ CONF_REFRESH_TOKEN: self.login_info[CONF_REFRESH_TOKEN],
101
+ }
102
+
103
+ try:
104
+ async with self.session.post(url, headers=headers, json=data) as response:
105
+ response.raise_for_status()
106
+ data = await response.json()
107
+ self.login_info[CONF_ACCESS_TOKEN] = data[CONF_ACCESS_TOKEN]
108
+ return data
109
+ except aiohttp.ClientError as e:
110
+ _LOGGER.info("async_post_login ClientError {e}")
111
+ return None
112
+
113
+ async def async_session_get(self, params: str, headers: str | None = None):
114
+ url = f"{self._base_url}{params}"
115
+ token = self.login_info[CONF_ACCESS_TOKEN]
116
+ if token is None:
117
+ raise AidotAuthFailed()
118
+ if headers is None:
119
+ headers = {
120
+ CONF_TERMINAL: "app",
121
+ "Token": token,
122
+ CONF_APP_ID: APP_ID,
123
+ }
124
+ try:
125
+ async with self.session.get(url, headers=headers) as response:
126
+ response.raise_for_status()
127
+ response_data = await response.json()
128
+ return response_data
129
+ except aiohttp.ClientError as e:
130
+ _LOGGER.info("async_get_products ClientError {e}")
131
+ return None
132
+
133
+ async def async_get_products(self, product_ids: str):
134
+ """Get device list."""
135
+ params = f"/products/{product_ids}"
136
+ return await self.async_session_get(params)
137
+
138
+ async def async_get_devices(self, house_id: str):
139
+ """Get device list."""
140
+ params = f"/devices?houseId={house_id}"
141
+ return await self.async_session_get(params)
142
+
143
+ async def async_get_houses(self, token: str):
144
+ """Get house list."""
145
+ params = "/houses"
146
+ return await self.async_session_get(params)
147
+
148
+ async def async_get_all_device(self):
149
+ # get houses
150
+ houses = await self.async_get_houses()
151
+ final_device_list: list[dict[str, Any]] = []
152
+ for house in houses:
153
+ # get device_list
154
+ device_list = await self.async_get_devices(house[CONF_ID])
155
+ if device_list:
156
+ final_device_list.extend(device_list)
157
+
158
+ # get product_list
159
+ productIds = ",".join([item[CONF_PRODUCT_ID] for item in device_list])
160
+ product_list = await self.async_get_products(productIds)
161
+
162
+ for product in product_list:
163
+ for device in final_device_list:
164
+ if device[CONF_PRODUCT_ID] == product[CONF_ID]:
165
+ device[CONF_PRODUCT] = product
166
+ return final_device_list
@@ -163,11 +163,14 @@ SUPPORTED_COUNTRYS = [
163
163
 
164
164
  SUPPORTED_COUNTRY_NAMES = [item["name"] for item in SUPPORTED_COUNTRYS]
165
165
  DEFAULT_COUNTRY_NAME = "United States"
166
+ CONF_APP_ID = "Appid"
167
+ CONF_TERMINAL = "Terminal"
166
168
  CONF_LOGIN_RESPONSE = "login_response"
167
169
  CONF_SELECTED_HOUSE = "selected_house"
168
170
  CONF_DEVICE_LIST = "device_list"
169
171
  CONF_PRODUCT_LIST = "product_list"
170
172
  CONF_ACCESS_TOKEN = "accessToken"
173
+ CONF_REFRESH_TOKEN = "refreshToken"
171
174
  CONF_ID = "id"
172
175
  CONF_NAME = "name"
173
176
  CONF_PRODUCT_ID = "productId"
@@ -0,0 +1,18 @@
1
+ """aidot Exceptions."""
2
+ class AidotError(Exception):
3
+ """Aidot api exception."""
4
+
5
+ class InvalidURL(AidotError):
6
+ """Invalid url exception."""
7
+
8
+ class HTTPError(AidotError):
9
+ """Invalid host exception."""
10
+
11
+ class InvalidHost(AidotError):
12
+ """Invalid host exception."""
13
+
14
+ class AidotAuthTokenExpired(AidotError):
15
+ """Authentication failed because token is invalid or expired."""
16
+
17
+ class AidotAuthVerificationCode(AidotError):
18
+ """Authentication failed because MFA verification code is required."""
@@ -0,0 +1,14 @@
1
+ """Constants for the aidot integration."""
2
+
3
+
4
+ APP_ID = "1383974540041977857"
5
+ BASE_URL = "https://prod-us-api.arnoo.com/v17"
6
+
7
+ PUBLIC_KEY_PEM = b"""
8
+ -----BEGIN PUBLIC KEY-----
9
+ MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCtQAnPCi8ksPnS1Du6z96PsKfN
10
+ p2Gp/f/bHwlrAdplbX3p7/TnGpnbJGkLq8uRxf6cw+vOthTsZjkPCF7CatRvRnTj
11
+ c9fcy7yE0oXa5TloYyXD6GkxgftBbN/movkJJGQCc7gFavuYoAdTRBOyQoXBtm0m
12
+ kXMSjXOldI/290b9BQIDAQAB
13
+ -----END PUBLIC KEY-----
14
+ """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: python-aidot
3
- Version: 0.2.3
3
+ Version: 0.2.5
4
4
  Summary: aidot control wifi lights
5
5
  Home-page: https://github.com/Aidot-Development-Team/python-aidot
6
6
  Author: aidotdev2024
@@ -4,8 +4,10 @@ setup.cfg
4
4
  setup.py
5
5
  aidot/__init__.py
6
6
  aidot/aes_utils.py
7
+ aidot/client.py
7
8
  aidot/const.py
8
9
  aidot/discover.py
10
+ aidot/exceptions.py
9
11
  aidot/lan.py
10
12
  aidot/login_const.py
11
13
  aidot/login_control.py
@@ -5,7 +5,7 @@ with open("README.md", "r") as fh:
5
5
 
6
6
  setuptools.setup(
7
7
  name="python-aidot",
8
- version="0.2.3",
8
+ version="0.2.5",
9
9
  author="aidotdev2024",
10
10
  url='https://github.com/Aidot-Development-Team/python-aidot',
11
11
  description="aidot control wifi lights",
@@ -1,197 +0,0 @@
1
- """Constants for the aidot integration."""
2
-
3
-
4
- APP_ID = "1383974540041977857"
5
- BASE_URL = "https://prod-us-api.arnoo.com/v17"
6
-
7
- PUBLIC_KEY_PEM = b"""
8
- -----BEGIN PUBLIC KEY-----
9
- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCtQAnPCi8ksPnS1Du6z96PsKfN
10
- p2Gp/f/bHwlrAdplbX3p7/TnGpnbJGkLq8uRxf6cw+vOthTsZjkPCF7CatRvRnTj
11
- c9fcy7yE0oXa5TloYyXD6GkxgftBbN/movkJJGQCc7gFavuYoAdTRBOyQoXBtm0m
12
- kXMSjXOldI/290b9BQIDAQAB
13
- -----END PUBLIC KEY-----
14
- """
15
-
16
-
17
- SUPPORTED_COUNTRYS = [
18
- {"_id": "1-0", "id": "AL", "name": "Albania", "ext": "", "region": "EU"},
19
- {
20
- "_id": "1-1",
21
- "id": "AG",
22
- "name": "Antigua and Barbuda",
23
- "ext": "",
24
- "region": "US",
25
- },
26
- {"_id": "1-2", "id": "AR", "name": "Argentina", "ext": "", "region": "US"},
27
- {"_id": "1-3", "id": "AT", "name": "Austria", "ext": "", "region": "EU"},
28
- {"_id": "1-4", "id": "AI", "name": "Anguilla", "ext": "", "region": "US"},
29
- {"_id": "1-5", "id": "AF", "name": "Afghanistan", "ext": "", "region": "JP"},
30
- {"_id": "1-6", "id": "AM", "name": "Armenia", "ext": "", "region": "JP"},
31
- {"_id": "1-7", "id": "AZ", "name": "Azerbaijan", "ext": "", "region": "JP"},
32
- {"_id": "1-8", "id": "AU", "name": "Australia", "ext": "", "region": "JP"},
33
- {"_id": "2-0", "id": "BO", "name": "Bolivia", "ext": "", "region": "US"},
34
- {"_id": "2-1", "id": "BR", "name": "Brazil", "ext": "", "region": "US"},
35
- {"_id": "2-2", "id": "BG", "name": "Bulgaria", "ext": "", "region": "EU"},
36
- {"_id": "2-3", "id": "BS", "name": "Bahamas", "ext": "", "region": "US"},
37
- {"_id": "2-4", "id": "BE", "name": "Belgium", "ext": "", "region": "EU"},
38
- {"_id": "2-5", "id": "BZ", "name": "Belize", "ext": "", "region": "US"},
39
- {"_id": "2-6", "id": "BB", "name": "Barbados", "ext": "", "region": "US"},
40
- {"_id": "2-7", "id": "BM", "name": "Bermuda", "ext": "", "region": "US"},
41
- {"_id": "2-8", "id": "BN", "name": "Brunei", "ext": "", "region": "JP"},
42
- {"_id": "2-9", "id": "BH", "name": "Bahrain", "ext": "", "region": "JP"},
43
- {"_id": "2-10", "id": "BD", "name": "Bangladesh", "ext": "", "region": "JP"},
44
- {"_id": "2-11", "id": "BT", "name": "Bhutan", "ext": "", "region": "JP"},
45
- {"_id": "3-0", "id": "CA", "name": "Canada", "ext": "", "region": "US"},
46
- {"_id": "3-1", "id": "CL", "name": "Chile", "ext": "", "region": "US"},
47
- {"_id": "3-2", "id": "CO", "name": "Colombia", "ext": "", "region": "US"},
48
- {"_id": "3-3", "id": "CR", "name": "Costa Rica", "ext": "", "region": "US"},
49
- {"_id": "3-4", "id": "CU", "name": "Cuba", "ext": "", "region": "US"},
50
- {"_id": "3-5", "id": "CZ", "name": "Czech Republic", "ext": "", "region": "EU"},
51
- {"_id": "3-6", "id": "HR", "name": "Croatia", "ext": "", "region": "EU"},
52
- {"_id": "3-7", "id": "KY", "name": "Cayman Islands", "ext": "", "region": "US"},
53
- {"_id": "3-8", "id": "KH", "name": "Cambodia", "ext": "", "region": "JP"},
54
- {"_id": "3-9", "id": "CY", "name": "Cyprus", "ext": "", "region": "JP"},
55
- {"_id": "4-0", "id": "DK", "name": "Denmark", "ext": "", "region": "EU"},
56
- {"_id": "4-1", "id": "DO", "name": "Dominican Republic", "ext": "", "region": "US"},
57
- {"_id": "5-0", "id": "EC", "name": "Ecuador", "ext": "", "region": "US"},
58
- {"_id": "5-1", "id": "SV", "name": "El Salvador", "ext": "", "region": "US"},
59
- {"_id": "5-2", "id": "EE", "name": "Estonia", "ext": "", "region": "EU"},
60
- {"_id": "6-0", "id": "FI", "name": "Finland", "ext": "", "region": "EU"},
61
- {"_id": "6-1", "id": "FR", "name": "France", "ext": "", "region": "EU"},
62
- {"_id": "6-2", "id": "GF", "name": "French Guiana", "ext": "", "region": "US"},
63
- {"_id": "7-0", "id": "GR", "name": "Greece", "ext": "", "region": "EU"},
64
- {"_id": "7-1", "id": "GT", "name": "Guatemala", "ext": "", "region": "US"},
65
- {"_id": "7-2", "id": "GY", "name": "Guyana", "ext": "", "region": "US"},
66
- {"_id": "7-3", "id": "DE", "name": "Germany", "ext": "", "region": "EU"},
67
- {"_id": "7-4", "id": "GD", "name": "Grenada", "ext": "", "region": "US"},
68
- {"_id": "7-5", "id": "GE", "name": "Georgia", "ext": "", "region": "JP"},
69
- {"_id": "8-0", "id": "HT", "name": "Haiti", "ext": "", "region": "US"},
70
- {"_id": "8-1", "id": "HN", "name": "Honduras", "ext": "", "region": "US"},
71
- {"_id": "8-2", "id": "HU", "name": "Hungary", "ext": "", "region": "EU"},
72
- {"_id": "9-0", "id": "IS", "name": "Iceland", "ext": "", "region": "EU"},
73
- {"_id": "9-1", "id": "IE", "name": "Ireland", "ext": "", "region": "EU"},
74
- {"_id": "9-2", "id": "IT", "name": "Italy", "ext": "", "region": "EU"},
75
- {"_id": "9-3", "id": "IN", "name": "India", "ext": "", "region": "JP"},
76
- {"_id": "9-4", "id": "ID", "name": "Indonesia", "ext": "", "region": "JP"},
77
- {"_id": "9-5", "id": "IR", "name": "Iran", "ext": "", "region": "JP"},
78
- {"_id": "9-6", "id": "IQ", "name": "Iraq", "ext": "", "region": "JP"},
79
- {"_id": "9-7", "id": "IL", "name": "Israel", "ext": "", "region": "EU"},
80
- {"_id": "10-0", "id": "JM", "name": "Jamaica", "ext": "", "region": "US"},
81
- {"_id": "10-1", "id": "JP", "name": "Japan", "ext": "", "region": "JP"},
82
- {"_id": "10-2", "id": "JO", "name": "Jordan", "ext": "", "region": "JP"},
83
- {"_id": "11-0", "id": "KZ", "name": "Kazakhstan", "ext": "", "region": "JP"},
84
- {"_id": "11-1", "id": "KR", "name": "Korea", "ext": "", "region": "JP"},
85
- {"_id": "11-2", "id": "KW", "name": "Kuwait", "ext": "", "region": "JP"},
86
- {"_id": "11-3", "id": "KG", "name": "Kyrgyzstan", "ext": "", "region": "JP"},
87
- {"_id": "12-0", "id": "LV", "name": "Latvia", "ext": "", "region": "EU"},
88
- {"_id": "12-1", "id": "LT", "name": "Lithuania", "ext": "", "region": "EU"},
89
- {"_id": "12-2", "id": "LU", "name": "Luxembourg", "ext": "", "region": "EU"},
90
- {"_id": "12-3", "id": "LI", "name": "Liechtenstein", "ext": "", "region": "EU"},
91
- {"_id": "12-4", "id": "LA", "name": "Laos", "ext": "", "region": "JP"},
92
- {"_id": "12-5", "id": "LB", "name": "Lebanon", "ext": "", "region": "JP"},
93
- {"_id": "13-0", "id": "MT", "name": "Malta", "ext": "", "region": "EU"},
94
- {"_id": "13-1", "id": "MX", "name": "Mexico", "ext": "", "region": "US"},
95
- {"_id": "13-2", "id": "MD", "name": "Moldova", "ext": "", "region": "EU"},
96
- {"_id": "13-3", "id": "MC", "name": "Monaco", "ext": "", "region": "EU"},
97
- {"_id": "13-4", "id": "MS", "name": "Montserrat", "ext": "", "region": "US"},
98
- {"_id": "13-5", "id": "ME", "name": "Montenegro", "ext": "", "region": "EU"},
99
- {"_id": "13-6", "id": "MY", "name": "Malaysia", "ext": "", "region": "JP"},
100
- {"_id": "13-7", "id": "MV", "name": "Maldives", "ext": "", "region": "JP"},
101
- {"_id": "13-8", "id": "MN", "name": "Mongolia", "ext": "", "region": "JP"},
102
- {"_id": "13-9", "id": "MM", "name": "Myanmar", "ext": "", "region": "JP"},
103
- {"_id": "14-0", "id": "NL", "name": "Netherlands", "ext": "", "region": "EU"},
104
- {"_id": "14-1", "id": "NI", "name": "Nicaragua", "ext": "", "region": "US"},
105
- {"_id": "14-2", "id": "NO", "name": "Norway", "ext": "", "region": "EU"},
106
- {"_id": "14-3", "id": "MK", "name": "North Macedonia", "ext": "", "region": "EU"},
107
- {"_id": "14-4", "id": "NZ", "name": "New Zealand", "ext": "", "region": "JP"},
108
- {"_id": "14-5", "id": "NP", "name": "Nepal", "ext": "", "region": "JP"},
109
- {"_id": "14-6", "id": "KP", "name": "North Korea", "ext": "", "region": "JP"},
110
- {"_id": "15-0", "id": "OM", "name": "Oman", "ext": "", "region": "JP"},
111
- {"_id": "16-0", "id": "PA", "name": "Panama", "ext": "", "region": "US"},
112
- {"_id": "16-1", "id": "PY", "name": "Paraguay", "ext": "", "region": "US"},
113
- {"_id": "16-2", "id": "PE", "name": "Peru", "ext": "", "region": "US"},
114
- {"_id": "16-3", "id": "PT", "name": "Portugal", "ext": "", "region": "EU"},
115
- {"_id": "16-4", "id": "PK", "name": "Pakistan", "ext": "", "region": "JP"},
116
- {"_id": "16-5", "id": "PS", "name": "Palestine", "ext": "", "region": "JP"},
117
- {"_id": "16-6", "id": "PH", "name": "Philippines", "ext": "", "region": "JP"},
118
- {"_id": "17-0", "id": "QA", "name": "Qatar", "ext": "", "region": "JP"},
119
- {"_id": "18-0", "id": "RO", "name": "Romania", "ext": "", "region": "EU"},
120
- {"_id": "18-1", "id": "RU", "name": "Russia", "ext": "", "region": "EU"},
121
- {"_id": "19-0", "id": "SM", "name": "San Marino", "ext": "", "region": "EU"},
122
- {"_id": "19-1", "id": "SI", "name": "Slovenia", "ext": "", "region": "EU"},
123
- {"_id": "19-2", "id": "ES", "name": "Spain", "ext": "", "region": "EU"},
124
- {"_id": "19-3", "id": "LC", "name": "St.Lucia", "ext": "", "region": "US"},
125
- {"_id": "19-4", "id": "SR", "name": "Suriname", "ext": "", "region": "US"},
126
- {"_id": "19-5", "id": "SE", "name": "Sweden", "ext": "", "region": "EU"},
127
- {"_id": "19-6", "id": "SK", "name": "Slovakia", "ext": "", "region": "EU"},
128
- {"_id": "19-7", "id": "RS/ME", "name": "Serbia", "ext": "", "region": "EU"},
129
- {
130
- "_id": "19-8",
131
- "id": "KN",
132
- "name": "St.Kitts and Nevis",
133
- "ext": "",
134
- "region": "US",
135
- },
136
- {
137
- "_id": "19-9",
138
- "id": "VC",
139
- "name": "St.Vincent and the Grenadines",
140
- "ext": "",
141
- "region": "US",
142
- },
143
- {"_id": "19-10", "id": "SA", "name": "Saudi Arabia", "ext": "", "region": "JP"},
144
- {"_id": "19-11", "id": "SG", "name": "Singapore", "ext": "", "region": "JP"},
145
- {"_id": "19-12", "id": "LK", "name": "Sri Lanka", "ext": "", "region": "JP"},
146
- {"_id": "19-13", "id": "SY", "name": "Syria", "ext": "", "region": "JP"},
147
- {"_id": "19-14", "id": "CH", "name": "Switzerland", "ext": "", "region": "EU"},
148
- {
149
- "_id": "20-0",
150
- "id": "TT",
151
- "name": "Trinidad and Tobago",
152
- "ext": "",
153
- "region": "US",
154
- },
155
- {"_id": "20-1", "id": "TC", "name": "Turks & Caicos", "ext": "", "region": "US"},
156
- {"_id": "20-2", "id": "TJ", "name": "Tajikistan", "ext": "", "region": "JP"},
157
- {"_id": "20-3", "id": "TH", "name": "Thailand", "ext": "", "region": "JP"},
158
- {"_id": "20-4", "id": "TG", "name": "Togo", "ext": "", "region": "JP"},
159
- {"_id": "20-5", "id": "TR", "name": "Turkey", "ext": "", "region": "EU"},
160
- {"_id": "20-6", "id": "TM", "name": "Turkmenistan", "ext": "", "region": "JP"},
161
- {"_id": "21-0", "id": "UA", "name": "Ukraine", "ext": "", "region": "EU"},
162
- {"_id": "21-1", "id": "GB", "name": "United Kingdom", "ext": "", "region": "EU"},
163
- {"_id": "21-2", "id": "US", "name": "United States", "ext": "", "region": "US"},
164
- {"_id": "21-3", "id": "UY", "name": "Uruguay", "ext": "", "region": "US"},
165
- {
166
- "_id": "21-4",
167
- "id": "AE",
168
- "name": "United Arab Emirates",
169
- "ext": "",
170
- "region": "JP",
171
- },
172
- {"_id": "21-5", "id": "UZ", "name": "Uzbekistan", "ext": "", "region": "JP"},
173
- {"_id": "22-0", "id": "VE", "name": "Venezuela", "ext": "", "region": "US"},
174
- {"_id": "22-1", "id": "VG", "name": "Virgin Islands", "ext": "", "region": "US"},
175
- {"_id": "22-2", "id": "VN", "name": "Vietnam", "ext": "", "region": "JP"},
176
- {"_id": "23-0", "id": "YE", "name": "Yemen", "ext": "", "region": "JP"},
177
- ]
178
-
179
- SUPPORTED_COUNTRY_NAMES = [item["name"] for item in SUPPORTED_COUNTRYS]
180
- DEFAULT_COUNTRY_NAME = "United States"
181
- CONF_LOGIN_RESPONSE = "login_response"
182
- CONF_SELECTED_HOUSE = "selected_house"
183
- CONF_DEVICE_LIST = "device_list"
184
- CONF_PRODUCT_LIST = "product_list"
185
- CONF_ACCESS_TOKEN = "accessToken"
186
- CONF_ID = "id"
187
- CONF_NAME = "name"
188
- CONF_PRODUCT_ID = "productId"
189
- CONF_PRODUCT = "product"
190
- CONF_IS_DEFAULT = "isDefault"
191
- CONF_TYPE = "type"
192
- CONF_MODEL_ID = "modelId"
193
- CONF_MAC = "mac"
194
- CONF_AES_KEY = "aesKey"
195
- CONF_MODEL_ID = "modelId"
196
- CONF_HARDWARE_VERSION = "hardwareVersion"
197
- CONF_SERVICE_MODULES = "serviceModules"
File without changes
File without changes
File without changes
File without changes