Add fallback password to config flow

This commit is contained in:
Luke Bonaccorsi 2023-08-14 17:43:40 +01:00
parent 18868a5ffb
commit 96fd1563a0
4 changed files with 59 additions and 22 deletions

View File

@ -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"]):

View File

@ -2,4 +2,3 @@
DOMAIN = "robovac" DOMAIN = "robovac"
CONF_VACS = "vacuums" CONF_VACS = "vacuums"
CONF_PHONE_CODE = "phone_code"

View File

@ -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)

View File

@ -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")