Клиенты домашней wi-fi сети

Идея такая - в УДЯ добавить датчик, который будет реагировать на появление опр. клиента в сети вай-фай, например, я, жена, ребёнок…
дальше уже сценарии в УДЯ в зависимости от датчика отрабатывают (это я сделаю сам)

требуется помощь в реализации (за вознаграждение)

для связи лучше всего телеграмм @Rd19m10

arpmqtt.js (2,5 КБ)
Надеюсь, поможет.
Прошу прощения за стиль кода, я не программист.

Ещё в подкаталог static нужно положить перечень маков телефонных аппаратов, пример можно взять во вложении
phonelist.txt (70 байтов)

Ссылки не открываются …
И почему бы код не положить прямо сюда?

var a = 1

да, у меня тоже не скачивается файл

Тут сложности в том, что обрабатывает запросы в сети не контроллер, а маршрутизатор
И если контроллер не обращается к вашим устройствам, то в таблице arp контроллера они просто так не появятся.
Пинговать - тоже может быть не вариант (устройство может не отвечать)

В целом же, реализовать можно (нужно продумать детали).

Добрый день, прошу уточнить причину выбора УДЯ?
А не более гибкий Home Assistant?

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);

И пример static/phonelist.txt:

20:37:a5:bf:56:e3;Nick
88:a4:79:19:08:22;Alice
a4:f6:e8:6f:f5:b5;Helen

А в Home Assistant разве есть управление голосом?

Да. Интеграция настраивается например с Яндекс так: Интеграция Алисы в Wiren Board с помощью Home Assistant — Wiren Board
Ну и остальными “помошниками” - тоже примерно аналогично. В том числе есть реализации “локального” распознавания голоса.

Понимаю, что флуд в данной теме.
Но, получается что всё равно используется умный дом Яндекса.
В этом случае непонятно зачем нужно промежуточное звено в виде Home Assistant.
Особенно учитывая, что Home Assistant реализует только связку с УДЯ, а для полноценного голосового управления нужна связка УДЯ + навыка яндекс.диалогов.

вы можете помочь вне с настройками? к сожалению, я не настолько погружен в разработку на ВБ.

как здесь личные сообщения отправлять?

К сожалению, не смогу помочь. Ограничен во времени, поэтому не беру подработок.
Работающий скрипт (у меня дома он работает) на node.js я уже дал. Возможно, сможете самостоятельно организовать передачу значения топика “arpmqtt/phonefound” в умный дом Яндекса через ПО, которое используете для интеграции Wirenboard и УДЯ.
Там совсем не сложно разобраться.
Либо, возможно, кто-то другой с этого форума сможет помочь.

Я же готов ответить на конкретные технические вопросы, но не сделать “под ключ”.

HA тут выступает как “универсальный хаб” Это система с самым большим, пожалуй, количеством готовых из коробки интеграций всего со всем.

“диалоги” - что имеете в виду?

О навыках Алисы | Документация (yandex.ru)
УДЯ реализует логику стандартных устройств умного дома (выключатели, термостаты и т.д.), также позволяет запустить исполнение сценария, привязанного к этим элементам. Но не позволяет, например, произнести произвольный текст. Для этого приходится пользовать навыки Алисы, вызывая их через сценарии, привязанные к объектам УДЯ.
Не знаю, понятно ли написал.

Нет, давно есть: https://dzen.ru/a/YDEh0XVu6zHwix5N

Да, понятно. Но я навыков не использую, обычный компонент интеграции в HA, который разрабатывается, кстати, самим Яндексом.

Добрый день, удалось ли решить вопрос?