Часть 4: Объединяй и властвуй (с)

Логическое продолжение Части 1, 2,3. Итак, научился принимать данные от zigbee устройств на стик Zigbee2Mqtt и на Алису. Да вот беда, одновременно и там и там данные от одного устройства штатными средствами не получить. А только на Алису завязывать все устройства бы не хотелось, так как:

  • сценарии ограничены только поддерживаемым Алисой оборудованием. Например мои WiFi реле Sonoff DIY 3 которые я использую на батареях Алисой естественно не поддерживаются .
  • Нет интернета — нет «умного» дома

Потому и возникла задача перебросить некоторые устройства которые есть на стике на Алису. Например датчик температуры. И в принципе штатное решение есть от самого Яндекса. Правда они выбрали весьма трудоёмкое для этого способа решение: необходимо создать виртуальное устройство, написать для него API и подключить в качестве стороннего навыка «Умный дом». Т.е. схема взаимодействия вырисовывается такая:

Т.е. что нужно сделать по шагам:

  1. Создать навык-приложение для «Умного дома»
  2. Сделать API «виртуального устройства» по документации Яндекса
  3. Подключить виртуальное устройство в навык
  4. Добавить навык в Яндекс Алису

Создание навыка

Для этого переходим по ссылке https://dialogs.yandex.ru/developer/smart-home и создаём новый навык.

Важно! Тип доступа сделать приватным, тогда модерация будет «мгновенной», ну и собственно навык не будет доступен никому кроме вас.

После заполнения основных данных, далее необходимо создать приложение https://oauth.yandex.ru/ с типом платформы WEB:

Так вы получите необходимые для дальнейшей настройки навыка ClientID и Client secret, которые необходимо будет прописать в навыке на странице «Связка аккаунтов»:

Кроме того необходимо прописать эндпоинты которые будут отвечать за авторизацию навыка на вашем сервере, обновление и получение токенов.

API виртуального устройства

Ну собственно на стороне сервера необходимо создать эндпоинты, которые сначала авторизуют навык, а затем отдадут данные «виртуального устройства». Например датчика температуры. Далее накидаю рабочие куски кода-шаблоны, которые пойдут как основа для «допила».

auth.php:

$redirect_uri = $_GET["redirect_uri"];
$state = $_GET["state"];
$client_id = $_GET["client_id"];
header("Location: ".$redirect_uri."?code=1234&state=$state&client_id=$client_id");

token.php:

$code=$_POST["code"];
$client_secret=$_POST["client_secret"];
$grant_type=$_POST["grant_type"];
$client_id=$_POST["client_id"];
$redirect_uri=$_POST["redirect_uri"];

$json='{
    "access_token": "ACCESS_TOKEN",
    "token_type": "bearer",
    "expires_in": 2592000,
    "refresh_token": "REFRESH_TOKEN",
    "scope": "read",
    "uid": 100101,
    "info": {
      "name": "donpadlo",
      "email": "info@mail.ru"
    }
  }';

 header('Content-Type: application/json');
 echo $json;

refresh.php:

$json='{
    "access_token": "ACCESS_TOKEN",
    "refresh_token": "'.$_GET['refresh_token'].'",
    "token_type": "bearer",
    "expires_in": 2592000 
  }';

header('Content-Type: application/json');
 echo $json;

Всё что выше — это авторизация навыка. После чего он полезет на Redirect URI  указанный в приложении, где будет ожидать ответа в формате json на два вида возможных запроса REQUEST_URI:

  • /v1.0/user/devices — получить список поддерживаемых устройств
  • /v1.0/user/devices/query — получить обновления данных

Данные для отдачи (температура, влажность) берем из очереди mqtt. В самом простом случае, шаблон устройства может выглядеть как-то так:

index.php

if ($_SERVER["REQUEST_URI"]=="/v1.0/user/devices"){
    $json='{
        "request_id": "'.$_SERVER["HTTP_X_REQUEST_ID"].'",
        "payload": {
          "user_id": "gribov_pi",
          "devices": [{
            "id": "abc-123",
            "name": "Розовая комната",
            "description": "Измеряет температуру и влажность",
            "room": "спальня",
            "type": "devices.types.sensor.climate",
            "custom_data": {
              "foo": 1,
              "bar": "two",
              "baz": false,
              "qux": [1, "two", false],
              "quux": {
                "quuz": {
                  "corge": []
                }
              }
            },
            "capabilities": [],      
            "properties": '.get_properties().',
            "device_info": {
              "manufacturer": "Грибовы.рф",
              "model": "Датчик температуры",
              "hw_version": "1.0",
              "sw_version": "1.0"
            }
          }]
        }}';
};
if ($_SERVER["REQUEST_URI"]=="/v1.0/user/devices/query"){
  $json='{
    "request_id": "'.$_SERVER["HTTP_X_REQUEST_ID"].'",
    "payload": {
      "devices": [{
        "id": "abc-123",
        "capabilities": [],
        "properties": '.get_properties().'
      }]
    }
  }';  
};
header('Content-Type: application/json');
echo $json;
die();


function get_properties(){
  return '[
    {
      "type": "devices.properties.float",
      "retrievable": true,
      "reportable": true,
      "parameters": {
        "instance": "temperature",
        "unit": "unit.temperature.celsius"
      },
      "state": {
        "instance": "temperature",
        "value": 30
      },
      "last_updated": "2025-12-29 12:12:12"
    },
    {
      "type": "devices.properties.float",
      "retrievable": true,
      "reportable": true,
      "parameters": {
        "instance": "humidity",
        "unit": "unit.percent"
      },
      "state": {
        "instance": "humidity",
        "value": 70
      },
      "last_updated": "2025-12-29 12:12:12"
    }
  ]';  
};

Подключение виртуального устройства к Алисе

Переходим в раздел «Тестирование» и подключаем вышесозданый навык:

Как видим виртуальное устройство отображается, данные в нём обновляются, и его можно штатно использовать для создания различных сценариев в Алисе:

Raspberry PI — меняем пин для 1-wire

По умолчанию, Raspberry Pi работает с 1-wire на gpio-4, однако можно руками указать какой именно пин использовать для поиска устройств. Или несколько пинов сразу. Для этого нужно открыть файл /boot/firmware/connfig.txt и указать руками нужный пин:

    dtoverlay=w1-gpio,gpiopin=24

Соответственно для того чтобы поиск шел на нескольких пинов:

  dtoverlay=w1-gpio,gpiopin=24
  dtoverlay=w1-gpio,gpiopin=4
  dtoverlay=w1-gpio,gpiopin=17

После перезагрузки устройства появятся в /sys/bus/w1/devices

raspberry pi 1-wire

RGB лента + Raspberry Pi

На днях собрал себе очередную игрушку на raspberry pi для загородного дома. А именно по датчику движения в коридоре будет включаться RGB лента, цель которой дать освещение достаточное для «дойти до выключателя». Не, я конечно натыкал и «проходных» выключателей аж 3 штуки, но всё равно иной раз приходиться идти до них, нащупывать их в темноте, попутно спотыкаясь о валяющуюся на полу пилу, циркуляру и электрокосу 😉 Пока правда собрал «на коленке», для проверки работы ленты. Получилось примерно так:

https://www.youtube.com/watch?v=qSEB7YS0lw8

Лента самая китайская на контроллере WS2812b, 5V , 60 диодов на метр, 5 метров (1300р). Блок питания S-100W-5 (1000р).

Схема подключения:

Результат выложил на Гитхаб: https://github.com/donpadlo/rgb_led_effect




Подключение ws2812B-16 к Raspberry PI 3

Схема подключения:

Установим необходимые библиотеки:

Помигаем светодиодами:

 




Сервер Minecraft, добро пожаловать ;)

Поднял для детеныша сервер Minecraft. Ничего особенного там нет, просто можно побегать, построить.

Вход: 176.107.213.49:25565




1 2