Недавно я начал интересоваться идеей Умного Дома.
Думаю, было бы очень удобно управлять освещением из собственных приложений.
Уметь устанавливать время включения/выключения света или описывать любой сценарий управления электроприборами.
Я обратил внимание на систему Ноолит .
Он позволяет беспроводным образом управлять электроприборами.
В своей серии он имеет разные силовые агрегаты и разные типы панелей управления.
В комплект продуктов Noolite входит адаптер PC118.
Он позволяет управлять силовыми агрегатами серии через USB. Noolite предоставляет подробную и доступную документацию к устройству.
Нашей целью было написать приложение, позволяющее через этот адаптер взаимодействовать с системой управления освещением.
Что ты хотел сделать?
Мы попытались реализовать сценарий «плавного старта» — постепенное увеличение яркости света, это могло бы, например, способствовать комфортному утреннему пробуждению.В статье Управление освещением через браузер подробно описывает, как работает наше веб-приложение.
Исходный код приложения доступен по адресу Google-код .
В данной статье описана часть системы, отвечающая за взаимодействие с USB-адаптером.
А именно идентифицирует устройство, отправляет команды, а также приводит пример кода, реализующий сценарий «мягкого запуска».
Большую часть времени я занимаюсь разработкой на .
NET, поэтому примеры кода будут на C#.
Принципы работы с USB на .
NET USB-устройства сегодня очень распространены.
К сожалению, в .
NET нет встроенного USB-компонента.
Работать с USB можно с помощью класса FileStream. Существуют сторонние библиотеки (в том числе с открытым исходным кодом), которые предоставляют удобные оболочки над FileStream. Мы пользовались библиотекой HidLibrary .
Адаптер PC118 подключается через USB и может использоваться в качестве HID-устройство .
Чтобы идентифицировать устройство и получить к нему доступ, необходимо указать два его идентификатора — Vendor ID (VID) и Product ID (PID).
Эти значения можно найти из документация к устройству.
Класс HidDevices из библиотеки HidLibrary имеет статический метод Enumerate. Этот метод возвращает список найденных HID-устройств с возможностью фильтрации списка по PID и VID. Выбираем нужное устройство (я взял первое из отфильтрованного списка) и устанавливаем с ним соединение, вызывая метод OpenDevice.
Устройство готово к использованию.var device = HidDevices.Enumerate(VENDOR_ID, PRODUCT_ID).
FirstOrDefault(); if (device != null) { device.OpenDevice(); }
Теперь мы можем отправлять ему команды.
Работа с адаптером
Команда устройства представляет собой массив байтов.
var data = new byte[] { .
};
Их значения должны быть установлены в соответствии с параметрами отправляемой команды: тип команды (например, включение/выключение/установка уровня яркости), канал (адаптер РС118 может отправлять команды на 8 каналов, пронумерованных от 0 до 7) , значение уровня яркости (если выбрана команда настройки яркости).
Подробно это описано в документации.
Наше приложение использует несколько команд: — включить нагрузку (Вкл.
) — отключить нагрузку (Выкл.
) — переключатель состояния нагрузки (Switch) — установка яркости (SetLevel).
Чтобы отправить команду устройству, нужно вызвать метод WriteFeatureData и передать ему сгенерированный массив: device.WriteFeatureData(data);
В документации есть примечание: «В зависимости от используемой библиотеки может потребоваться отправить первый байт со значением 0, прежде чем отправлять 8 байт».
В ходе экспериментов выяснилось, что это именно наш случай.
Для корректной отправки команды нужно добавить в начало массива дополнительный нулевой байт (отправлять в адаптер массивы по 9 байт, а не по 8, как написано в инструкции).
Судя по всему, это особенность библиотеки HidLibrary. Также оказалось, что между отправкой команд необходимо делать паузу в 200 мс, иначе адаптер выполнит только первую команду.
Продолжительность задержки определялась экспериментально.
Что случилось
После того, как мы научились отправлять команды адаптеру, все было завернуто в класс, реализующий интерфейс IDisposable, и были описаны перечисления для типов команд. Вы можете загрузить скомпилированную DLL и использовать ее для управления освещением из своих собственных .NET-приложений.
Например, код для плавного включения света может выглядеть так: using (var adapter = new Pc118Adapter())
{
Теги: #noolite #ноотехника #Умный дом #управление освещением #usb #.
NET #занимаюсь пиаром
-
3D-Блокчейн. Доказательство В Лицо (Pof)
19 Oct, 24 -
«Союз-5» На Пути К Созданию
19 Oct, 24 -
Ошибка В Формуле Проверки Условия Делоне.
19 Oct, 24