Как использовать Mijia для автоматического включения кондиционера, когда вы вернетесь домой
Как использовать Mijia для автоматического включения кондиционера, когда вы вернетесь домой

Лето уже здесь, каждый раз, когда вы уходите в дом с жаркой улицы, например, едете домой со следующей смены или идете поиграть с друзьями, а затем возвращаетесь домой. Всем очень жарко. Первое, что нужно сделать, это включить кондиционер.

Необходимость автоматического включения кондиционера

Как включить кондиционер? Я могу придумать следующие способы:

  1. Только пришел домой, позвони одноклассник Сяоай 打开空调
    1. Преимущества: Нет траты электроэнергии?
    2. Недостатки: В жаркую погоду хочется немедленно остыть. Поэтому я обычно сначала просто включаю температуру 17 градусов, затем жду, пока не почувствую холод, а затем медленно регулирую ее.
  2. Когда я собираюсь вернуться домой,Вручную управлять кондиционером на Mijia,Открыть удаленно
    1. Достоинства: Не могу назвать никаких преимуществ.
    2. недостаток: Я почти не помню, да, почти

Помимо двух вышеперечисленных методов, есть ли еще какие-нибудь методы?

Используйте обнаружение расстояния в реальном времени, чтобы включить кондиционер.

Я думаю, что есть. Как я могу автоматически определить, когда я нахожусь в 400 метрах от дома в фоновом режиме, и заранее включить кондиционер? Таким образом, вам не придется беспокоиться о том, забыли ли вы включить его на своем мобильном телефоне или не забыли включить кондиционер, пока не вернетесь домой.

Во-первых, нам нужно решить проблему взаимодействия между несколькими устройствами.

Нацелен на Миджиа. В основном есть эти 3 способа

  1. Голосовое управление, этим нужно управлять дома
  2. Операция приложения, такую ​​операцию необходимо выполнить как минимум в За кулисами.
  3. операция API,Не так ли открывается инженер?
Сначала используйте сочетания клавиш Apple

автоматизация–>Новый–>приезжать–>Расположение–>选取想要选取的Расположение(比如 西二旗地铁站)–>текущая дата–>Опубликовано вiCloudвнутри папки–Сохранить, например.a.txtв файле

Вы можете выбрать точность в текущем местоположении.

На этом первый шаг завершен, и местоположение сообщается.

Шаг 2. Доступ к API Mijia

Авторизоваться Сначала войдите под своей учетной записью и паролем

Язык кода:javascript
копировать
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))

Затем получите список устройств

Язык кода:javascript
копировать
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

В Mijia я добавил несколько таких сцен.

Затем получите код сцены

Язык кода:javascript
копировать
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

запустить код сцены

Язык кода:javascript
копировать
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 некоторыми файлами на вашем домашнем компьютере, чтобы завершить эту задачу.

конечный эффект

Когда я в свободное от работы время. Если бы я был всего в нескольких сотнях метров от дома. И определяет текущую погоду, и если подходит для включения кондиционера, то он автоматически включит кондиционер.

некоторые другие мысли

  • Есть ли другие способы для некоторых людей, не имеющих навыков программирования?
    • Я думаю, что есть. Вы также можете использовать сочетания клавиш. При выполнении условий xxx вы можете выполнять некоторые командные операции в приложении Mijia. Но я придумал этот момент только тогда, когда только думал написать этот пункт.
  • Есть ли другой способ завершить операцию, кроме Mijia API? Операция Сяоай
    • Пошел немного изучить,На GitHub также есть эта библиотека с открытым исходным кодом.,адрес,Это также можно сделать в облаке,Однако существует проблема с безопасностью учетной записи. Не забудьте сохранить пароль своей учетной записи.
  • Команды быстрого доступа Apple — это то, чем я раньше редко пользовался, если хочу узнать, где сегодня находятся некоторые люди в этом месте. Или разоблачать ложь. Это действительно интересно. Используйте с осторожностью!

Инженеры должны научиться использовать существующие инструменты, чтобы максимизировать лень.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose