Идея такая - в УДЯ добавить датчик, который будет реагировать на появление опр. клиента в сети вай-фай, например, я, жена, ребёнок…
дальше уже сценарии в УДЯ в зависимости от датчика отрабатывают (это я сделаю сам)
Тут сложности в том, что обрабатывает запросы в сети не контроллер, а маршрутизатор
И если контроллер не обращается к вашим устройствам, то в таблице arp контроллера они просто так не появятся.
Пинговать - тоже может быть не вариант (устройство может не отвечать)
В целом же, реализовать можно (нужно продумать детали).
const express = require("express");
const fs = require('fs');
const path = require('path');
const mqtt = require('mqtt');
const myname = 'arpmqtt';
var arp = require('node-arp');
const network='192.168.10.'; // Сеть, где искать клиентов
const timeout=61000; // Таймаут в милисекундах, после которого пользователь считается покинувшим сеть
const mqttserver='mqtt://192.168.10.141'; // Адрес MQTT-сервера
var mqttready=false;
const app = express();
const mqttclient = mqtt.connect(mqttserver,{clientId:"arpmqtt"});
var successfulStartup = false;
function hexToString(str)
{
const buf = Buffer.from(str, 'hex');
return buf.toString('binary');
}
function thetime()
{
x=process.hrtime();
return x[0] * 1000 + x[1] / 1000000;
}
const zeroPad = (num, places) => String(num).padStart(places, '0');
var numphones=0;
var phones = {};
var phoneowners = {};
var phoneinnet = {};
// Загружаем перечеь телефонных аппаратов
fs.readFile(__dirname + "/static/phonelist.txt",'utf8', (err, data) => { if (err) throw err;
ar=data.toString().split("\n");
ar.forEach(ss=>{
args=ss.split(";");
phones[numphones]=args[0].toLowerCase();
phoneowners[numphones]=args[1];
phoneinnet[numphones]=0;
numphones++;
});
successfulStartup=true;
});
// Подключаемся к MQTT серверу
mqttclient.on('connect', () => {
console.log(`Is client connected: ${mqttclient.connected}`);
if (mqttclient.connected === true) {
mqttclient.subscribe(myname+'/#');
mqttready=true;
}});
// Ищем клиентов в сети
function ScanARP()
{
if (!successfulStartup) return; // Если пока не загружен список телефонных аппаратов, то делать нечего
var ip,i;
// Данная функция отмечает телефон, как присутствующий в сети
function obertka(ip)
{
this.ip=ip;
this.procmac=function(err, mac)
{
if (!err&&mac) {
if (mac.toString().length==17)
{
for (let j=0;j<numphones;j++)
if (phones[j]==mac) phoneinnet[j]=thetime();
}
}
}
}
// Перебираем все IP-адреса в подсети, где ожидаем нахождения телефонных аппаратов
for (i=1;i<255;i++)
{
ip=network+i;
// Отправляем запрос MAC адреса, если он найдётся то будет вызвана функция obertka
const bobj=new obertka(ip);
arp.getMAC(ip,(err,mac)=>{bobj.procmac.bind(ip)(err,mac)});
}
}
var lastphonefound=0;
// Эта функция по уже заполненному перечню клиентов в сети возвращает в MQTT статус наличия телефонов в сети
function ProvideState()
{
if (!successfulStartup) return; // Если пока не загружен список телефонных аппаратов, то делать нечего
var i;
var phonefound=0;
var timelimit=thetime()-timeout;
for (i=0;i<numphones;i++)
{
if (phoneinnet[i]>timelimit) phonefound=1;
}
if (lastphonefound!=phonefound)
{
mqttclient.publish(myname,'{"phonefound":"'+(phonefound?'ON':'OFF')+'"}');
lastphonefound=phonefound;
}
}
console.log('MQTT ARP started');
setInterval(ScanARP,timeout/2);
setTimeout(()=>{setInterval(ProvideState,timeout/2)},timeout/4);
Понимаю, что флуд в данной теме.
Но, получается что всё равно используется умный дом Яндекса.
В этом случае непонятно зачем нужно промежуточное звено в виде Home Assistant.
Особенно учитывая, что Home Assistant реализует только связку с УДЯ, а для полноценного голосового управления нужна связка УДЯ + навыка яндекс.диалогов.
К сожалению, не смогу помочь. Ограничен во времени, поэтому не беру подработок.
Работающий скрипт (у меня дома он работает) на node.js я уже дал. Возможно, сможете самостоятельно организовать передачу значения топика “arpmqtt/phonefound” в умный дом Яндекса через ПО, которое используете для интеграции Wirenboard и УДЯ.
Там совсем не сложно разобраться.
Либо, возможно, кто-то другой с этого форума сможет помочь.
Я же готов ответить на конкретные технические вопросы, но не сделать “под ключ”.
О навыках Алисы | Документация (yandex.ru)
УДЯ реализует логику стандартных устройств умного дома (выключатели, термостаты и т.д.), также позволяет запустить исполнение сценария, привязанного к этим элементам. Но не позволяет, например, произнести произвольный текст. Для этого приходится пользовать навыки Алисы, вызывая их через сценарии, привязанные к объектам УДЯ.
Не знаю, понятно ли написал.