Лето уже здесь, каждый раз, когда вы уходите в дом с жаркой улицы, например, едете домой со следующей смены или идете поиграть с друзьями, а затем возвращаетесь домой. Всем очень жарко. Первое, что нужно сделать, это включить кондиционер.
Как включить кондиционер? Я могу придумать следующие способы:
Помимо двух вышеперечисленных методов, есть ли еще какие-нибудь методы?
Я думаю, что есть. Как я могу автоматически определить, когда я нахожусь в 400 метрах от дома в фоновом режиме, и заранее включить кондиционер? Таким образом, вам не придется беспокоиться о том, забыли ли вы включить его на своем мобильном телефоне или не забыли включить кондиционер, пока не вернетесь домой.
Во-первых, нам нужно решить проблему взаимодействия между несколькими устройствами.
Нацелен на Миджиа. В основном есть эти 3 способа
автоматизация–>Новый–>приезжать–>Расположение–>选取想要选取的Расположение(比如 西二旗地铁站)–>текущая дата–>Опубликовано вiCloudвнутри папки–Сохранить, например.a.txtв файле
Вы можете выбрать точность в текущем местоположении.
На этом первый шаг завершен, и местоположение сообщается.
Авторизоваться Сначала войдите под своей учетной записью и паролем
import requests
import json
from hashlib import md5
import random
def login(sid: str, user: str, pwd: str) -> dict:
msgUrl = "https://account.xiaomi.com/pass/serviceLogin?sid=" + sid + "&_json=true"
loginUrl = "https://account.xiaomi.com/pass/serviceLoginAuth2"
tempStr = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
deviceId = ''
for i in range(16):
deviceId += tempStr[random.randint(0, len(tempStr) - 1)]
authorize = {}
userAgent = 'APP/com.xiaomi.mihome APPV/6.0.103 iosPassportSDK/3.9.0 iOS/14.4 miHSTS'
request = requests.session()
request.cookies = requests.cookies.RequestsCookieJar()
request.headers['User-Agent'] = userAgent
request.headers['Accept'] = '*/*'
request.headers['Accept-Language'] = 'zh-tw'
request.headers['Cookie'] = 'deviceId=' + deviceId + '; sdkVersion=3.4.1'
msg = request.get(msgUrl)
result = json.loads(msg.text[11:])
body = {}
body['qs'] = result['qs']
body['sid'] = result['sid']
body['_sign'] = result['_sign']
body['callback'] = result['callback']
body['user'] = user
pwd = md5(pwd.encode()).hexdigest().upper()
pwd += '0' * (32 - len(pwd))
body['hash'] = pwd
body['_json'] = 'true'
msg = request.post(loginUrl, data=body)
result = json.loads(msg.text[11:])
if result['code'] != 0:
authorize['code'] = result['code']
authorize['message'] = result['desc']
return authorize
msg = request.get(result['location'])
for item in msg.headers['Set-Cookie'].split(', '):
item = item.split('; ')[0]
item = item.split('=', maxsplit=1)
authorize[item[0]] = item[1]
authorize['code'] = 0
authorize['sid'] = sid
authorize['userId'] = result['userId']
authorize['securityToken'] = result['ssecurity']
authorize['deviceId'] = deviceId
authorize['message'] = 'успех'
return authorize
def read_mem(src):
F = open(src, 'r', encoding='utf-8')
content = F.read()
F.close()
return json.loads(content)
def login_config():
config = read_mem('config.json')
config_user = config['user']
config_pwd = config['password']
authorize = login("xiaomiio", config_user, config_pwd)
print(authorize['message'])
if authorize['code'] == 0:
with open("./json/authorize.json", "w", encoding='utf-8') as f:
f.write(json.dumps(authorize, indent=4, ensure_ascii=False))
if __name__ == '__main__':
config = read_mem('config.json')
config_user = config['user']
config_pwd = config['password']
authorize = login("xiaomiio", config_user, config_pwd)
print(authorize['message'])
if authorize['code'] == 0:
with open("./json/authorize.json", "w", encoding='utf-8') as f:
f.write(json.dumps(authorize, indent=4, ensure_ascii=False))
Затем получите список устройств
def post_data(uri: str, data: dict, authorize: dict) -> None:
data = str(data).replace("'", '"').replace('True', 'true').replace('False', 'false')
try:
serviceToken = authorize['serviceToken']
securityToken = authorize['securityToken']
except KeyError:
print('serviceToken not found, Unauthorized')
return
tempStr = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
nonce = ''
for i in range(16):
nonce += tempStr[random.randint(0, len(tempStr) - 1)]
signedNonce = generateSignedNonce(securityToken, nonce)
signature = generateSignature(uri, signedNonce, nonce, data)
body = {'_nonce': nonce, 'data': data, 'signature': signature}
userAgent = 'APP/com.xiaomi.mihome APPV/6.0.103 iosPassportSDK/3.9.0 iOS/14.4 miHSTS'
request = requests.session()
request.cookies = requests.cookies.RequestsCookieJar()
request.headers['User-Agent'] = userAgent
request.headers['x-xiaomi-protocal-flag-cli'] = 'PROTOCAL-HTTP2'
request.headers['Cookie'] = 'PassportDeviceId=' + authorize['deviceId'] + ';userId=' + str(
authorize['userId']) + ';serviceToken=' + serviceToken + ';'
msg = request.post('https://api.io.mi.com/app' + uri, data=body)
return msg.text
def get_devices(save: bool) -> dict:
"""
Получить список устройств
:param save:
:return:
"""
authorize = json.load(open('./json/authorize.json', 'r', encoding='utf-8'))
data = {"getVirtualModel": False, "getHuamiDevices": 0}
msg = post_data('/home/device_list', data, authorize)
devs = json.loads(msg)
if save:
with open('./json/devices.json', 'w', encoding='utf-8') as f:
f.write(json.dumps(devs, indent=4, ensure_ascii=False))
return devs
Затем получите код сцены
def get_scenes(save: bool, room_idx=0) -> dict:
"""
Получить список сцен
:param save:
:param roomIdx:
:return:
"""
authorize = json.load(open('./json/authorize.json', 'r', encoding='utf-8'))
if os.path.exists('./json/rooms.json'):
rooms = json.load(open('./json/rooms.json', 'r', encoding='utf-8'))
else:
rooms = get_rooms(save)
try:
homeId = rooms['result']['homelist'][room_idx]['id']
except IndexError:
print('Номер комнаты вне диапазона')
return
data = {"home_id": homeId}
msg = post_data('/appgateway/miot/appsceneservice/AppSceneService/GetSceneList', data, authorize)
scenes = json.loads(msg)
if save:
with open('./json/scenes.json', 'w', encoding='utf-8') as f:
f.write(json.dumps(scenes, indent=4, ensure_ascii=False))
return scenes
запустить код сцены
def run_scene(name: str) -> int:
"""
бегать场景 :param name:
:return:
"""
global scene_id
authorize = json.load(open('./json/authorize.json', 'r', encoding='utf-8'))
if os.path.exists('./json/scenes.json'):
scenes = json.load(open('./json/scenes.json', 'r', encoding='utf-8'))
else:
scenes = get_scenes(True)
scenesList = scenes['result']['scene_info_list']
for scene in scenesList:
if scene['name'] == name:
scene_id = scene['scene_id']
break
try:
data = {"scene_id": scene_id, "trigger_key": "user.click"}
except NameError:
print("Название сцены не существует")
return -1
msg = post_data('/appgateway/miot/appsceneservice/AppSceneService/RunScene', data, authorize)
msg = json.loads(msg)
if msg['result']:
return 0
else:
print(msg)
return -1
Таким образом, вы можете отслеживать и управлять API некоторыми файлами на вашем домашнем компьютере, чтобы завершить эту задачу.
Когда я в свободное от работы время. Если бы я был всего в нескольких сотнях метров от дома. И определяет текущую погоду, и если подходит для включения кондиционера, то он автоматически включит кондиционер.
Инженеры должны научиться использовать существующие инструменты, чтобы максимизировать лень.