Add fallback password to config flow
This commit is contained in:
parent
18868a5ffb
commit
96fd1563a0
|
|
@ -41,9 +41,11 @@ from homeassistant.const import (
|
||||||
CONF_MAC,
|
CONF_MAC,
|
||||||
CONF_LOCATION,
|
CONF_LOCATION,
|
||||||
CONF_CLIENT_ID,
|
CONF_CLIENT_ID,
|
||||||
|
CONF_REGION,
|
||||||
|
CONF_TIME_ZONE,
|
||||||
)
|
)
|
||||||
|
|
||||||
from .const import DOMAIN, CONF_VACS, CONF_PHONE_CODE
|
from .const import DOMAIN, CONF_VACS
|
||||||
|
|
||||||
from .tuyawebapi import TuyaAPISession
|
from .tuyawebapi import TuyaAPISession
|
||||||
from .eufywebapi import EufyLogon
|
from .eufywebapi import EufyLogon
|
||||||
|
|
@ -77,8 +79,19 @@ def get_eufy_vacuums(self):
|
||||||
)
|
)
|
||||||
|
|
||||||
device_response = response.json()
|
device_response = response.json()
|
||||||
|
|
||||||
|
response = eufy_session.get_user_settings(
|
||||||
|
user_response["user_info"]["request_host"],
|
||||||
|
user_response["user_info"]["id"],
|
||||||
|
user_response["access_token"],
|
||||||
|
)
|
||||||
|
settings_response = response.json()
|
||||||
|
|
||||||
self[CONF_CLIENT_ID] = user_response["user_info"]["id"]
|
self[CONF_CLIENT_ID] = user_response["user_info"]["id"]
|
||||||
self[CONF_PHONE_CODE] = user_response["user_info"]["phone_code"]
|
self[CONF_REGION] = settings_response["setting"]["home_setting"]["tuya_home"][
|
||||||
|
"tuya_region_code"
|
||||||
|
]
|
||||||
|
self[CONF_TIME_ZONE] = user_response["user_info"]["timezone"]
|
||||||
|
|
||||||
# self[CONF_VACS] = {}
|
# self[CONF_VACS] = {}
|
||||||
items = device_response["items"]
|
items = device_response["items"]
|
||||||
|
|
@ -97,7 +110,7 @@ def get_eufy_vacuums(self):
|
||||||
self[CONF_VACS] = allvacs
|
self[CONF_VACS] = allvacs
|
||||||
|
|
||||||
tuya_client = TuyaAPISession(
|
tuya_client = TuyaAPISession(
|
||||||
username="eh-" + self[CONF_CLIENT_ID], country_code=self[CONF_PHONE_CODE]
|
username="eh-" + self[CONF_CLIENT_ID], region=self[CONF_REGION], timezone=self[CONF_TIME_ZONE]
|
||||||
)
|
)
|
||||||
for home in tuya_client.list_homes():
|
for home in tuya_client.list_homes():
|
||||||
for device in tuya_client.list_devices(home["groupId"]):
|
for device in tuya_client.list_devices(home["groupId"]):
|
||||||
|
|
|
||||||
|
|
@ -2,4 +2,3 @@
|
||||||
|
|
||||||
DOMAIN = "robovac"
|
DOMAIN = "robovac"
|
||||||
CONF_VACS = "vacuums"
|
CONF_VACS = "vacuums"
|
||||||
CONF_PHONE_CODE = "phone_code"
|
|
||||||
|
|
|
||||||
|
|
@ -30,12 +30,16 @@ class EufyLogon:
|
||||||
"password": self.password,
|
"password": self.password,
|
||||||
}
|
}
|
||||||
|
|
||||||
return requests.post(
|
return requests.post(login_url, json=login_auth, headers=eufyheaders)
|
||||||
login_url, json=login_auth, headers=eufyheaders, timeout=1.5
|
|
||||||
)
|
def get_user_settings(self, url, userid, token):
|
||||||
|
setting_url = url + "/v1/user/setting"
|
||||||
|
eufyheaders["token"] = token
|
||||||
|
eufyheaders["id"] = userid
|
||||||
|
return requests.request("GET", setting_url, headers=eufyheaders, timeout=1.5)
|
||||||
|
|
||||||
def get_device_info(self, url, userid, token):
|
def get_device_info(self, url, userid, token):
|
||||||
device_url = url + "/v1/device/list/devices-and-groups"
|
device_url = url + "/v1/device/list/devices-and-groups"
|
||||||
eufyheaders["token"] = token
|
eufyheaders["token"] = token
|
||||||
eufyheaders["id"] = userid
|
eufyheaders["id"] = userid
|
||||||
return requests.request("GET", device_url, headers=eufyheaders, timeout=1.5)
|
return requests.request("GET", device_url, headers=eufyheaders)
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ DEFAULT_TUYA_QUERY_PARAMS = {
|
||||||
"lang": "en",
|
"lang": "en",
|
||||||
"osSystem": "12",
|
"osSystem": "12",
|
||||||
"os": "Android",
|
"os": "Android",
|
||||||
"timeZoneId": "Europe/London",
|
"timeZoneId": "",
|
||||||
"ttid": "android",
|
"ttid": "android",
|
||||||
"et": "0.0.1",
|
"et": "0.0.1",
|
||||||
"sdkVersion": "3.0.8cAnker",
|
"sdkVersion": "3.0.8cAnker",
|
||||||
|
|
@ -86,19 +86,22 @@ DEFAULT_TUYA_QUERY_PARAMS = {
|
||||||
|
|
||||||
|
|
||||||
class TuyaAPISession:
|
class TuyaAPISession:
|
||||||
|
|
||||||
username = None
|
username = None
|
||||||
country_code = None
|
country_code = None
|
||||||
session_id = None
|
session_id = None
|
||||||
|
|
||||||
def __init__(self, username, country_code):
|
def __init__(self, username, region, timezone):
|
||||||
self.session = requests.session()
|
self.session = requests.session()
|
||||||
self.session.headers = DEFAULT_TUYA_HEADERS.copy()
|
self.session.headers = DEFAULT_TUYA_HEADERS.copy()
|
||||||
self.default_query_params = DEFAULT_TUYA_QUERY_PARAMS.copy()
|
self.default_query_params = DEFAULT_TUYA_QUERY_PARAMS.copy()
|
||||||
self.default_query_params["deviceId"] = self.generate_new_device_id()
|
self.default_query_params["deviceId"] = self.generate_new_device_id()
|
||||||
self.username = username
|
self.username = username
|
||||||
self.country_code = country_code
|
self.country_code = self.getCountryCode(region)
|
||||||
self.base_url = TUYA_INITIAL_BASE_URL
|
self.base_url = {
|
||||||
|
"EU": "https://a1.tuyaeu.com",
|
||||||
|
"AY": "https://a1.tuyacn.com",
|
||||||
|
}.get(region, "https://a1.tuyaus.com")
|
||||||
|
DEFAULT_TUYA_QUERY_PARAMS["timeZoneId"] = timezone
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def generate_new_device_id():
|
def generate_new_device_id():
|
||||||
|
|
@ -183,8 +186,7 @@ class TuyaAPISession:
|
||||||
encrypted_uid += encryptor.finalize()
|
encrypted_uid += encryptor.finalize()
|
||||||
return md5(encrypted_uid.hex().upper().encode("utf-8")).hexdigest()
|
return md5(encrypted_uid.hex().upper().encode("utf-8")).hexdigest()
|
||||||
|
|
||||||
def request_session(self, username, country_code):
|
def request_session(self, username, password, country_code):
|
||||||
password = self.determine_password(username)
|
|
||||||
token_response = self.request_token(username, country_code)
|
token_response = self.request_token(username, country_code)
|
||||||
encrypted_password = unpadded_rsa(
|
encrypted_password = unpadded_rsa(
|
||||||
key_exponent=int(token_response["exponent"]),
|
key_exponent=int(token_response["exponent"]),
|
||||||
|
|
@ -200,17 +202,33 @@ class TuyaAPISession:
|
||||||
"options": '{"group": 1}',
|
"options": '{"group": 1}',
|
||||||
"token": token_response["token"],
|
"token": token_response["token"],
|
||||||
}
|
}
|
||||||
session_response = self._request(
|
|
||||||
action="tuya.m.user.uid.password.login.reg",
|
try:
|
||||||
data=data,
|
return self._request(
|
||||||
_requires_session=False,
|
action="tuya.m.user.uid.password.login.reg",
|
||||||
)
|
data=data,
|
||||||
return session_response
|
_requires_session=False,
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
error_password = md5("12345678".encode("utf8")).hexdigest()
|
||||||
|
|
||||||
|
if password != error_password:
|
||||||
|
return self.request_session(username, error_password, country_code)
|
||||||
|
else:
|
||||||
|
raise e
|
||||||
|
|
||||||
def acquire_session(self):
|
def acquire_session(self):
|
||||||
session_response = self.request_session(self.username, self.country_code)
|
password = self.determine_password(self.username)
|
||||||
|
session_response = self.request_session(
|
||||||
|
self.username, password, self.country_code
|
||||||
|
)
|
||||||
self.session_id = self.default_query_params["sid"] = session_response["sid"]
|
self.session_id = self.default_query_params["sid"] = session_response["sid"]
|
||||||
self.base_url = session_response["domain"]["mobileApiUrl"]
|
self.base_url = session_response["domain"]["mobileApiUrl"]
|
||||||
|
self.country_code = (
|
||||||
|
session_response["phoneCode"]
|
||||||
|
if session_response["phoneCode"]
|
||||||
|
else self.getCountryCode(session_response["domain"]["regionCode"])
|
||||||
|
)
|
||||||
|
|
||||||
def list_homes(self):
|
def list_homes(self):
|
||||||
return self._request(action="tuya.m.location.list", version="2.1")
|
return self._request(action="tuya.m.location.list", version="2.1")
|
||||||
|
|
@ -221,3 +239,6 @@ class TuyaAPISession:
|
||||||
version="1.0",
|
version="1.0",
|
||||||
query_params={"gid": home_id},
|
query_params={"gid": home_id},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def getCountryCode(self, region_code):
|
||||||
|
return {"EU": "44", "AY": "86"}.get(region_code, "1")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue