Скачайте на телефон приложение Mi Home и зарегистрируйте аккаунт, подключите устройство туда. После этого в приложения Яндекс или Алиса добавляете новое устройство, прокручиваете экран в низ, там список поддерживаемых платформ. Выбираете Xiaomi — привязать к яндексу. Все готово. После этого все новые устройства Xiaomi автоматически будут подключены к Алисе.
- Можно ли подключить телевизор Сяоми к Алисе
- Какие умные устройства можно подключить к Алисе
- Как включить Алису на Ксиоми
- Какой хаб Xiaomi работает с Алисой
- Какой телевизор совместим с Алисой
- Как подключить любое устройство к Алисе
- Какую технику поддерживает Алиса
- Что поддерживает Алису
- Какие устройства поддерживает Яндекс станция 2
- Какие устройства можно подключить к Яндекс станции
- Что лучше Google или Алиса
- Можно ли установить Алису вместо Сири
- Как поменять ассистента на Алису на Xiaomi
- Какие Колонки совместимы с Алисой
- Можно ли пользоваться Алисой с телефона
- Как подключить андроид телевизор к Алисе
- Как подключить смартфон к Алисе
- Как подключить умную технику к Алисе
- Какой умный дом работает с Алисой
- Сколько стоит сделать умный дом с Алисой
- Сколько устройств можно подключить к станции Алиса
- Как сделать Алису вместо гугл
- Как включить Алису голосом на андроид
- Как включить Гугл Ассистент на Ксиоми
- Что продаёт XiaoMi
- Как добавить телевизор к Алисе
- Какие чайники поддерживает Алиса
- Как Алиса управляет светом
- Сколько стоит Алиса голосовой помощник
- Как отключить Алису на Редми
- Как позвать Алису в телефоне
- Как подключить андроид ТВ к Алисе
- Можно ли телевизор Xiaomi подключить к Mi Home
Можно ли подключить телевизор Сяоми к Алисе
На вашем смартфоне должно находиться приложение «Яндекс с Алисой», а также приложение Mi Home с добавленными элементами умного дома. После этого вы запускаете приложение «Яндекс с Алисой» и нажимаете на иконку с 4 квадратиками в нижней части экрана. После чего в появившемся меню нажимаете на пункт «Устройства».
Умный Дом и погода в доме // Яндекс (Алиса) и Xiaomi (Mi home) любят друг-друга
Какие умные устройства можно подключить к Алисе
Рассмотрим лучшие устройства с Алисой в 2022 году:
- Лучшие устройства, работающие с Алисой
- «Яндекс Станция»
- Xiaomi Mi Robot Vacuum Cleaner Mop.
- Hyundai H-LED40FS5001.
- Модуль с Яндекс.ТВ
- Устройства для умного дома с Алисой
- Центр управления умным домом Aqara Hub E1.
- Умная лампа Яндекса
Как включить Алису на Ксиоми
Тапните по значку пользователя в правом нижнем углу и зайдите в настройки. 4. Пролистайте страницу до раздела «Алиса». Перейдите во вкладку «Голосовая активация» и передвиньте ползунок в рабочее состояние.
Какой хаб Xiaomi работает с Алисой
Шлюз Xiaomi Gateway 2 поддерживает экосистему умного дома от Яндекса, управлять подключёнными к хабу устройствами возможно с помощью голосового помощника Алиса.
Какой телевизор совместим с Алисой
С помощью голосовых команд владельцы моделей Smart TV 2018 и 2019 годов линеек QLED, LS, серий 7100 и выше смогут включать и выключать телевизор, переключать каналы, регулировать уровень звука и переводить устройство в беззвучный режим.
Как подключить любое устройство к Алисе
Процесс подключения достаточно простой, но крайне неинтуитивный:
- Устанавливаем приложение Яндекс.
- Открываем боковое меню и выбираем пункт Устройства.
- В новом разделе Умный дом нажимаем + для добавления устройств.
- Выбираем соответствующий плагин (в нашем случае это Xiaomi).
- После установки потребуется авторизация.
Какую технику поддерживает Алиса
Совместимых с «Алисой» бытовых приборов сторонних производителей уже сегодня достаточно много. Среди них есть чайники, кофеварки и другая кухонная техника, увлажнители воздуха, вентиляторы, кондиционеры, а также роботы-пылесосы и даже стиральные машины. Всем этим можно управлять, подавая голосовые команды «Алисе».
Что поддерживает Алису
Помимо собственных устройств, умный дом Яндекса поддерживает компоненты от Philips, Redmond, Rubetek, Samsung, Xiaomi и других производителей.
Какие устройства поддерживает Яндекс станция 2
Станция 2 поддерживает протокол Zigbee 3.0 и следующие типы устройств:
- Беспроводная кнопка
- Выключатель
- Датчик вибрации
- Датчик движения и освещения
- Датчик открытия двери
- Датчик протечки
- Датчик температуры и влажности
- Реле
Какие устройства можно подключить к Яндекс станции
Умные устройства совместимые с яндекс станцией:
- Реле для умного дома
- Пульты ДУ
- Розетки, выключатели и рамки
- Лампочки
- Комплекты умного дома
- Контроллеры для светодиодов
- Шлюзы умного дома
- ТВ-приставки и медиаплееры
Что лучше Google или Алиса
С точки зрения возможностей, Алиса действительно уступает Google, но это вопрос времени. А вот с точки зрения самой речи, Алиса на порядок лучше, и скорее всего такое лидерство у неё будет ещё долго. Даже если опустить язык, Алиса разговаривает куда более естественно, чем любой другой ассистент в мире.
Можно ли установить Алису вместо Сири
С Айфона или Айпада перейдите по ссылке для загрузки быстрой команды «Алиса». Нажмите кнопку «Добавить», чтобы команда оказалась на вашем устройстве. Запустите Сири привычным для вас способом. В моей ситуации — путем нажатия и удержания кнопки блокировки и скажите: «Алиса».
Как поменять ассистента на Алису на Xiaomi
Кликните на три точки в правом верхнем углу и выберите пункт «Приложения по умолчанию». Далее найдите пункт «Голосовой помощник». Выберите первый пункт. И установите Яндекс в качестве голосового помощника по умолчанию.
Какие Колонки совместимы с Алисой
- 1Яндекс.Станция
- 2Яндекс.Станция Мини
- 3LG Xboom AI ThinQ WK7Y.
- 4ELARI SmartBeat.
- 5Prestigio Smartmate Маяк Edition.
- 65 умных колонок с Алисой
Можно ли пользоваться Алисой с телефона
На Телефоне предустановлены два голосовых помощника — Алиса и Google Ассистент. Изначально основным помощником выбран Ассистент — он откроется, если вы нажмете кнопку («Домой») на смартфоне. Чтобы сделать Алису помощником по умолчанию: Откройте приложение Настройки и выберите пункт Приложения и уведомления.
Как подключить андроид телевизор к Алисе
Подключить Станцию к телевизору:
- Соедините колонку и телевизор кабелем HDMI из комплекта поставки.
- Включите телевизор и в качестве источника выберите нужный вход HDMI. Используйте пульт от телевизора. Обычно это кнопка с надписью source или input. Алиса сделает все остальное.
Как подключить смартфон к Алисе
Подключить Скажите: «Алиса, включи Bluetooth». Запустите поиск устройств Bluetooth на вашем девайсе. В списке выберите Станцию и включите музыку.
Как подключить умную технику к Алисе
1. Войдите в экран управления SkyCenter нажатием на строку в списке в приложении Ready for Sky. 2. Нажмите на «Подключить устройство», далее нажмите на «Найти устройство в сети», выберите устройство и синхронизируй- те его с центром умного дома, следуя подсказкам на экране.
Какой умный дом работает с Алисой
Умный дом Яндекса дает возможность управлять различными устройствами и домашней техникой с помощью голоса. Ее голосовой помощник Алиса отличается быстрым и качественным распознаванием голоса и на сегодняшний день распознает команды на русском языке немного лучше своих конкурентов Siri и Google Assistant.
Сколько стоит сделать умный дом с Алисой
999. 1 399 р. Рассрочкаот 42 р./мес.
Сколько устройств можно подключить к станции Алиса
Таким образом, при наличии колонки, смартфона, компьютера и ТВ-приставки получится 4 устройства.
Как сделать Алису вместо гугл
Но вы можете заменить Гугл Ассистент на Алису, выполнив несколько простых шагов:
- Откройте настройки телефона.
- Перейдите в раздел «Приложения», а затем — «Приложения по умолчанию» (этот пункт может скрываться в контекстном меню, вызываемом нажатием на три точки).
- Откройте вкладку «Голосовой помощник» и выберите Яндекс.
Как включить Алису голосом на андроид
Откройте настройки Лончера. Листайте список настроек вниз, пока на экране не отобразится группа Алиса и поиск, затем выберите пункт Алиса. Включите опцию Голосовая активация.
Как включить Гугл Ассистент на Ксиоми
Как вызвать Google Ассистента с помощью голосовой команды:
- На телефоне или планшете Android перейдите в настройки Ассистента или откройте приложение «Google Ассистент» и скажите «Настройки Ассистента».
- В разделе «Популярные настройки» выберите Voice Match.
- Включите команду Окей, Google.
Что продаёт XiaoMi
小米集团, пиньинь Xiǎomǐ Jítuán, палл. Сяоми́ Цзитуа́нь; стилизировано как XiaoMi) — китайская корпорация, основанная Лэй Цзюнем в 2010 году. В 2021 году стала лидером по объёму производства смартфонов. Также производит бытовую технику, планшеты, смарт-часы, ПО, электросамокаты, электровелосипеды и многое другое.
Как добавить телевизор к Алисе
Как настроить голосовое управление:
- Запустите приложение Яндекс и перейдите в раздел Устройства.
- Нажмите «+», выберите Другое устройство и подключите гаджет к системе умного дома (если не сделали этого ранее).
- Когда пульт добавлен в приложение, открываем его страницу и нажимаем Добавить устройство.
Какие чайники поддерживает Алиса
Какие бытовые устройства Polaris совместимы с Алисой?:
- Чайники: PWK 1725CGLD IQ Home, PWK 1775CGLD IQ Home, PWK 1755CAD IQ Home.
- Роботы-пылесосы: PVCR 3200 IQ Home Aqua, PVCR 3300 IQ Home Aqua.
- Мультиварки: PMC 0521 IQ Home, PMC 0526 IQ Home, PMC 0528 Wi-FI IQ Home.
- Увлажнитель воздуха PUH 9105 IQ Home.
Как Алиса управляет светом
Откройте приложение Дом с Алисой. Убедитесь, что вы используете аккаунт, к которому привязана Лампочка. Нажмите на нужную Лампочку и управляйте освещением: включите или выключите Лампочку, измените яркость или цвет.
Сколько стоит Алиса голосовой помощник
Как отключить Алису на Редми
Чтобы отключить эту функцию, нам необходимо перейти в «Настройки» — «Расширенные настройки» либо «Дополнительно». Находим подраздел «Функции кнопок и жестов» — «Запуск Google Ассистента». Отключаем его.
Как позвать Алису в телефоне
Скажите «Открой Яндекс» или «Открой приложение Яндекс». Откроется приложение «Яндекс» (в него встроена Алиса). Скажите «Слушай, Алиса» или «Привет, Алиса». Активируется голосовой помощник Алиса.
Как подключить андроид ТВ к Алисе
Самый простой — и один из лучших — вариант, если ваш телевизор «из коробки» поддерживает прямую работу с Алисой. Тогда достаточно зарегистрировать устройство в родном приложении и связать его учётную запись с аккаунтом Яндекс через раздел «Устройства» в приложении Яндекс.
Можно ли телевизор Xiaomi подключить к Mi Home
Выберите пункт «Ранее настроенные устройства», далее — пункт Mi Home. После чего в вашем доме появятся все доступные устройства для управления через гугл-аккаунт. Каждому устройству можно дать уникальное имя, через которое и будет происходить управление. Осталось ввести на телевизоре Сяоми тот же гугл-аккаунт.
- Москва
- Городская клиническая больница №50 Спасокукоцкого на Тимирязевской в Москве
Источник: registratury.ru
Датчики
В УДЯ можно передавать цифровые и бинарные датчики, есть несколько способов сделать это:
Один датчик — одно устройство¶
При выборе поддерживаемых объектов в доменах sensor и binary_sensor в УДЯ будут созданы несколько независимых устройств:
Сборка несколько датчиков в одно устройство¶
В первом способе одно физическое устройство (датчик температуры/влажности) передавалась в УДЯ как несколько независимых устройств, и это в большинстве случаев неудобно.
Есть способ лучше! Мы можем объединить несколько независмых объектов в одно устройство через YAML конфигурацию.
В качестве примера возьмём этот же датчик температуры/влажности:
Он содержит несколько объектов, нам нужно выяснить их entity_id . В нашем примере это будут:
- Температура: sensor.room_temperature
- Влажность: sensor.room_humidity
- Уровень заряда: sensor.room_meteo_battery_level
Так же для примера добавим ещё несколько датчиков из других физических устройств:
- Уровень CO2: sensor.room_co2_level
- Освещённость: sensor.room_illumination_lux
В Home Assistant нет объекта, на который мы могли бы добавить эти сенсоры. Поэтому в качестве объекта, из которого будут создано устройство в УДЯ, нужно выбрать любой существующий объект, возьмём для этих целей температуру ( sensor.room_temperature ).
yandex_smart_home: entity_config: sensor.room_temperature: name: Погода в комнате properties: — type: temperature entity: sensor.room_temperature — type: humidity entity: sensor.room_humidity — type: co2_level entity: sensor.room_co2_level — type: illumination entity: sensor.room_illumination_lux — type: battery_level entity: sensor.room_meteo_battery_level
Датчики, заданные в properties , обладают большим приоритетом над обнаруженными автоматически. По этой причине мы вручную добавили датчик temperature вверх списка. Если этого не сделать — он будет в конце (как автоматически обнаруженный для sensor.room_temperature ).
Порядок датчиков в properties влияет на порядок отображения в УДЯ
В одном устройстве недопустимо использовать несколько датчиков с одним type
Значение type не всегда совпадает с device_class объекта. Возможные значения type : цифровые датчики, бинарные датчики
В объектах для передачи в УДЯ нужно выбрать только sensor.room_temperature .
Добавление датчиков к устройству¶
Некоторые устройства (термостат) уже содержат в своих атрибутах датчики, которые будет подхвачены автоматически. А некоторые, например, увлажнитель — наоборот, все датчики выносят в отдельные объекты.
В качестве примера используем увлажнитель Xiaomi, он состоит из объектов:
- Непосредственно увлажнитель: humidifier.air_humidifier
- Температура: sensor.air_humidifier_temperature
- Влажность: sensor.air_humidifier_humidity
- Уровень воды: sensor.air_humidifier_water_level
И дополнительно добавим к нему:
- Потребляемый ток: switch.humidifer_socket , значение в атрибуте current_consumption
yandex_smart_home: entity_config: humidifier.air_humidifier: properties: — type: water_level entity: sensor.air_humidifier_water_level — type: temperature entity: sensor.air_humidifier_temperature — type: humidity entity: sensor.air_humidifier_humidity — type: power entity: switch.humidifer_socket attribute: current_consumption
Порядок датчиков в properties влияет на порядок отображения в УДЯ
В одном устройстве недопустимо использовать несколько датчиков с одним type
Значение type не всегда совпадает с device_class объекта. Возможные значения type : цифровые датчики, бинарные датчики
В объектах для передачи в УДЯ нужно выбрать только humidifier.air_humidifier .
Параметры датчиков¶
Раздел properties в entity_config является списком датчиков. Каждый датчик имеет один или несколько параметров:
type | Нет | Тип датчика. Возможные значения: цифровые датчики, бинарные датчики (кроме button ) |
entity | Объект, для которого задаются properties |
ID объекта, в котором содержится значение датчика (для цифровых — число, для бинарных — on/off ) |
attribute | Нет | Атрибут, в котором содержится значение датчика. Заполняется только если значение хранится не в состоянии объекта |
unit_of_measurement | Из атрибута объекта unit_of_measurement | Единица измерения, в которой в HA находятся значения датчика (для конвертации значений) |
Конвертация значений¶
Компонент автоматически конвертирует значения сенсоров из одних единиц измерения в другие на основании атрибута/параметра unit_of_measurement .
Атрибут содержит единицу измерения, в которой находится значение датчика в Home Assistant.
Если у объекта атрибут отсутствует (или неверный), его можно задать через параметр unit_of_measurement в properties .
Возможные значения unit_of_measurement смотрите в списке поддерживаемых датчиков
yandex_smart_home: entity_config: humidifier.bedroom: properties: — type: tvoc attribute: total_volatile_organic_compounds unit_of_measurement: ppb # для автоматической конвертации из миллиардных долей в мкг/м³
Выбор класса бинарного датчика¶
Некоторые интеграции создают бинарные датчики с пустым или неверным атрибутом device_class . Такие датчики автоматически обнаружены не будут.
Вы можете самостоятельно задать атрибут device_class через параметр объекта Отображать как в Настройки → Устройства и объекты → Объекты
Особенности бинарных датчиков в УДЯ¶
В УДЯ не передаётся текущее состояние бинарного датчика, а передаются только события/изменения его состояния.
Из этого следует несколько особенностей:
- Для отображения «статуса» в УДЯ датчик должен поменять своё состояние в Home Assistant (например открыть дверь или нажать кнопку)
- Алиса не будет произносить в каком состоянии сейчас находится датчик
Перезагрузка Home Assistant приводит к отображению «прочерков» у бинарных датчиков в списке устройств в приложении Дом с Алисой. Это известная проблема на стороне УДЯ.
Источник: docs.yaha-cloud.ru
Опять про BLE, температуру и датчики Xiaomi
Не так давно, удалось мне обзавестись известными датчиками температуры и влажности от Xiaomi. Эти датчики заслуженно приобрели широкую известность, так как при своей достаточно низкой цене, достаточно удобны в использовании, а также умеют передавать свои показания по протоколу BLE в тот же Mi Home. К тому же весь Интернет завален вариантами подключения этих сенсоров к Home Assistant, MajorDoMo и другим системам.
Но мне этого показалось мало и захотелось все сделать по-своему (не спрашивайте меня зачем и почему, просто захотелось). А именно, захотелось прочитать данные с датчиков, которые развешены по всему дому и как-нибудь интересно с ними поработать. Потому я покопался в своих электронных закромах и нашел там модуль ESP32.
Быстрое гугление показало: ESP32 — это то, что мне нужно. Он умеет Bluetooth и WiFi, программируется из Arduino IDE и позволит мне получить показания с датчика и отправить их по WiFi куда нужно (хоть на домашний сервер, хоть в облако). К тому же, очень быстро нашелся простой и понятный туториал, который как раз решал мою задачу. Но как выяснилось, не все так просто.
Первые проблемы
Как часто бывает с примерами из Интернета, код не заработал. А ведь так хотелось… Очевидно, что нужно разбираться с этим дальше.
Не смотря на то, что у меня в закромах лежат всякие ESP32, по основному роду деятельности я прикладной разработчик. Ковыряюсь с железками (как и многие, я полагаю) только в качестве хобби. Потому достаточно быстро пришло понимание того, что без закапывания в детали дальше продвинуться не получится. Потому пришлось изучить код, немного спецификацию BLE и понять как это устроено. По результатам разбирательств пришло некоторое понимание того, как оно работает, ну и сразу же захотелось этим с кем-нибудь поделиться.
Как оно работает
Обычно устройства BLE умеют работать в 2-х режимах. Назовем их широковещательный (discover mode) и подключенный (connection mode). В широковещательном режиме устройство может рассылать пакеты, позволяющие другим Bluetooth устройствам обнаружить его и установить соединение при необходимости. При дальнейшем установлении соединения устройства могут обмениваться данными и командами.
Некоторые устройства упаковывают какие-то данные о себе прямо в широковещательные пакеты. Это некоторым образом упрощает взамодействие с устройством, а также в числе прочих средств позволяет экономить энергию.
Сенсор Xiaomi умеет работать в двух режимах, и в Интернетах можно найти примеры работы как с широковещательными пакетами так и в режиме соединения. В найденном ранее руководстве используется вариант подслушивания широковещательных пакетов. Достаточно просто чтобы можно было быстро разобраться. Осталось только выяснить, что же не так.
Так что все-таки сломалось?
Код примера работает достаточно просто. При старте устройства инициализируется процесс сканирования устройств и устанавливается класс, функции которого будут вызываться при получении пакетов от устройств (advertising пакеты).
void initBluetooth() < BLEDevice::init(«»); pBLEScan = BLEDevice::getScan(); //create new scan pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster pBLEScan->setInterval(0x50); pBLEScan->setWindow(0x30); >
Пакеты от устройств обрабатываются в этой функции:
void onResult(BLEAdvertisedDevice advertisedDevice) < if (advertisedDevice.haveName() advertisedDevice.haveServiceData() !advertisedDevice.getName().compare(«MJ_HT_V1»)) < std::string strServiceData = advertisedDevice.getServiceData(); uint8_t cServiceData[100]; char charServiceData[100]; strServiceData.copy((char *)cServiceData, strServiceData.length(), 0); Serial.printf(«nnAdvertised Device: %sn», advertisedDevice.toString().c_str()); for (int i=0;istd::stringstream ss; ss ; switch (cServiceData[11]) < case 0x04: sprintf(charValue, «%02X%02X», cServiceData[15], cServiceData[14]); value = strtol(charValue, 0, 16); if(METRIC) < current_temperature = (float)value/10; >else < current_temperature = CelciusToFahrenheit((float)value/10); >displayTemperature(); break; case 0x06: sprintf(charValue, «%02X%02X», cServiceData[15], cServiceData[14]); value = strtol(charValue, 0, 16); current_humidity = (float)value/10; displayHumidity(); Serial.printf(«HUMIDITY_EVENT: %s, %dn», charValue, value); break; case 0x0A: sprintf(charValue, «%02X», cServiceData[14]); value = strtol(charValue, 0, 16); Serial.printf(«BATTERY_EVENT: %s, %dn», charValue, value); break; case 0x0D: sprintf(charValue, «%02X%02X», cServiceData[15], cServiceData[14]); value = strtol(charValue, 0, 16); if(METRIC) < current_temperature = (float)value/10; >else < current_temperature = CelciusToFahrenheit((float)value/10); >displayTemperature(); Serial.printf(«TEMPERATURE_EVENT: %s, %dn», charValue, value); sprintf(charValue, «%02X%02X», cServiceData[17], cServiceData[16]); value2 = strtol(charValue, 0, 16); current_humidity = (float)value2/10; displayHumidity(); Serial.printf(«HUMIDITY_EVENT: %s, %dn», charValue, value2); break; > > >
Очевидно, проблема где-то здесь.
Основное действие в этом коде происходит в конструкции switch, где проверяется значение 11го байта в service data массиве. Проблема только в том, что в моем случае массив данных был меньше 11 байт. Осталось выяснить почему.
Каждый advertising пакет помимо информации о возможности соединения с устройством может содержать пакет данных (payload). Этот пакет содержит расширенные данные об устройстве, также данные о сервисах, которые поддерживает устройство. В одном пакете может быть информация о нескольких сервисах. Типичный payload моих устройств выглядит так (это отдельные байты в шестнадцатиричной системе счисления):
020106121695fe5020aa01ab9f0231342d580a10014309094d4a5f48545f563105030f180a180916ffffc8b33f8a48db
Информация здесь кодируется достаточно просто. Первый байт (в примере 0x02) задает размер блока в байтах. За ним следует байт, который указыает назначение блока (подробно о типах блоков здесь). Затем следуют данные в зависимости от типа блока.
Ну и дальше все повторяется (опять появляется длина блока) пока не закончится пакет данных.
Нас больше всего интересют блоки с типом 0x16, которые отвеают за service data, т.е. за данные, описывающие отдельные функции устройства. В нашем примере таких блоков 2:
121695fe5020aa01ab9f0231342d580a100143 0916ffffc8b33f8a48db
Если присмотреться поближе, то можно заметить, что 11й байт в первом блоке очень похож, на тот, что ожидает наш switch (0x0A). А второй блок как раз похож на тот, слишком короткий блок, на который мы ссылались в начале. Похоже здесь и порылась собака. Похоже, что наш код ожидает видеть первый блок, а получает второй.
Почему так вышло?
Может у нас какие-то не такие устройства, а может у автора кода другие, но факт остается фактом, у нас оно так не работает. Самое время посмотреть в исходники библиотеки ESP32 для Arduino. Не будем вдаваться в подробности, но по этому коду видно, что getServiceData должен иметь параметр с индексом блока данных, который найден в пакете.
Т.е. в библиотеке предусмотрена возможность того, что payload может содержать несколько блоков service data. Однако, не все так просто. Оказывается, что эта ветка изменений на момент написания этой заметки еще не опубликована (текущая версия релиза 1.0.4). И просто так скачав в Arduino IDE все необходимое для ESP32 через Boards Manager будет получена более старая версия библиотеки.
И как раз в этой версии функция getServiceData() всегда возвращает последний блок service data. Это не очень приятно, но всегда можно использовать последнюю версию библиотеки. Главное, что мы смогли понять в чем была проблема.
Финальный код
С новой библиотекой решить проблему можно будет очень просто. Но не очень хочется создавать зависимость от новой версии библиотеки. Мы можем добавить простой код, который сделает то, что нужно нам нужно и так. Для этого нам нужен код, который в payload найдет нужный нам блок service data (в примере ниже функция findServiceData).
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks < uint8_t* findServiceData(uint8_t* data, size_t length, uint8_t* foundBlockLength) < // пэйлоад у состоит из блоков [байт длины][тип блока][данные] // нам нужен блок с типом 0x16, следом за которым будет 0x95 0xfe // поэтому считываем длину, проверяем следующий байт и если что пропускаем // вернуть надо указатель на нужный блок и длину блока uint8_t* rightBorder = data + length; while (data < rightBorder) < uint8_t blockLength = *data; if (blockLength < 5) < // нам точно такие блоки не нужны data += (blockLength+1); continue; >uint8_t blockType = *(data+1); uint16_t serviceType = *(uint16_t*)(data + 2); if (blockType == 0x16 serviceType == 0xfe95) < // мы нашли что искали *foundBlockLength = blockLength-3; // вычитаем длину типа сервиса return data+4; // пропускаем длину и тип сервиса >data += (blockLength+1); > return nullptr; > void onResult(BLEAdvertisedDevice advertisedDevice) < if (!advertisedDevice.haveName() || advertisedDevice.getName().compare(«MJ_HT_V1»)) return; // нас интересуют только устройства, которые транслируют нужное нам имя uint8_t* payload = advertisedDevice.getPayload(); size_t payloadLength = advertisedDevice.getPayloadLength(); Serial.printf(«nnAdvertised Device: %sn», advertisedDevice.toString().c_str()); printBuffer(payload, payloadLength); uint8_t serviceDataLength=0; uint8_t* serviceData = findServiceData(payload, payloadLength, if (serviceData == nullptr) < return; // нам этот пакет больше не интересен >Serial.printf(«Found service data len: %dn», serviceDataLength); printBuffer(serviceData, serviceDataLength); // 11й байт в пакете означает тип события // 0x0D — температура и влажность // 0x0A — батарейка // 0x06 — влажность // 0x04 — температура switch (serviceData[11]) < case 0x0D: < float temp = *(uint16_t*)(serviceData + 11 + 3) / 10.0; float humidity = *(uint16_t*)(serviceData + 11 + 5) / 10.0; Serial.printf(«Temp: %f Humidity: %fn», temp, humidity); >break; case 0x04: < float temp = *(uint16_t*)(serviceData + 11 + 3) / 10.0; Serial.printf(«Temp: %fn», temp); >break; case 0x06: < float humidity = *(uint16_t*)(serviceData + 11 + 3) / 10.0; Serial.printf(«Humidity: %fn», humidity); >break; case 0x0A: < int battery = *(serviceData + 11 + 3); Serial.printf(«Battery: %dn», battery); >break; default: break; > > >;
Вывод
Вся проделанная работа в очередной раз показыает, что не всегда код из Интернета хорошо работает. Будь-то пример для ESP32 или кусок кода со StackOverflow, крайне желательно все же понимать как оно работает. Всегда могут появиться не самые стандартные случаи, которые заставят код развалиться. Хорошо, когда это происходит в хобби-проектах, но, очевидно, никому не хотелось бы наталкиваться на подобные случаи в боевом коде. Давайте будем осторожны с использованием чужого кода, ну или по крайней мере попытаемся в нем разбираться.
Как-то длинновато получилось, но надеюсь, что кому-то это будет полезно. Со своей же стороны, надеюсь, что этому эксперименту будет продолжение, и данные температуры все же будут отправлены дальше.
Полный код примера можно скачать здесь.
UPD: Продолжение экспериментов тут
Источник: habr.com