Знакомые, которым я показывал свои наработки — “обзывали” их системой умного дома. Лично мне, такое название не по душе, так как “ум” понятие достаточно сложное и, на мой взгляд, не каждому человеку присущее. Да и говорить о каком-либо уме в компьютерах – рановато. Я предпочитаю термины – автоматика и автоматизация. Упрощённо, электронный мир моей квартиры изображён на следующем рисунке:
Где функции среди устройств распределены следующим образом:
1) Сервер — маломощный компьютер, с большим объёмом дискового пространства, источником бесперебойного питания и достаточно шумной системой охлаждения. Спрятан где-то в шкафу и не мешает спать.
2) Десктоп — тихий не игровой компьютер с аудио системой для просмотра фильмов, прослушивания музыки и сёрфинга.
3) Некоторое количество иных вычислительных средств: смартфон, планшет, ноутбук жены и мой ноутбук.
На мой взгляд весьма распространённый перечень “постояльцев” для любой современной семьи. Очень часто десктоп используется как медиа плеер, но включать/выключать и управлять процессом сидя возле него — не комфортно: хочется переключать композицию не вставая с дивана; по окончанию фильма хочется перевернуться на другой бок и уснуть а не вставать и выключать десктоп и усилитель. В конце концов, хочется, чтобы компьютер поиграл немного музыку перед сном и выключился, а затем сам включился утром вместо будильника. Безусловно, вокруг нас множество всевозможных плееров, которые так или иначе выполняют такие функции, но компьютер, почему-то, так не умеет (пульт от AVerMedia — не впечатлил, а с переходом на x64 и вовсе перестал работать).
Итак, я хочу автоматизировать следующие функции своего десктопа:
1) Включение/выключение;
2) Управление медиа плеером (вперёд/назад, тише/громче, старт/стоп)
3) Включение/выключение стерео усилителя;
4) выполнять всё вышеописанное по расписанию.
Для начала достаточно. Проанализируем, что и где мы можем сделать.
1) Компьютер
Выключит компьютер весьма просто — вызвать API функцию Windows (SetSuspendState из библиотеки Powrprof.dll).
Включить немного сложнее, но задача становится намного проще, если компьютер не выключать, а переводить в спящий режим. Теперь разбудить его может либо активность USB устройств (при соответствующей настройке) либо же — при помощи технологии Wake-on-Lan (о том что это такое можно прочитать тут). Учитывая, что у меня есть всегда доступный сервер, то он без проблем мог бы послать команду пробуждения десктопу.
2) Аудио плеер
Практически к любому современному плееру имеется описание его API. Я пользуюсь AIMP`ом. Описание его API имеется на сайте разработчика, а готовый код для C# можно найти в гугле. Управлять громкостью системы позволяет библиотека (NAudio) которая, к слову, умеет много чего полезного и может быть взята за основу альтернативного аудио плеера.
3) Усилитель
Тут дела обстоят несколько сложнее. Лично мой усилитель достаточно немолод (Электроника Д1-012-Стерео, 1982 год выпуска) и ничего о спящих режимах не знает. Включается и выключается механической кнопкой. Одно дело оставить без присмотра спящим компьютер (дело привычное) и совсем другое — усилитель с таким сроком выдержки. В интернете можно найти множество возможных решений данной проблемы на любой цвет и вкус. Мне по душе технология 1-Wire, с которой уже доводилось сталкиваться ранее. Получить базовые представление о технологии можно тут.
После изготовления несложного оборудования, схему устройств можно перерисовать следующим образом:
(Работу с температурными датчиками я тут не рассматриваю и отобразил их для наглядности и демонстрации функциональных возможностей, равно как и наличие более одной управляемой розетки. Теоретически, максимальное количество одновременно подключенных устройств ограничено, но величина, в масштабах однокомнатной квартиры, столь велика, что беспокоится об этом не стоит)
Для начала нам нужно собрать переходник коммуникационного порта компьютера в шину 1-Wire. Так как я использовал COM порт, то собирал сперва преобразователь RS232 -> UART ( по этой схеме)
А затем собственно адаптер — по следующей (так как в электронике я не особо, то за помощью в выборе и консультациям по схемам обращался к специалисту):
К сожалению, фотографий как получилось нет, ибо запрятал это дело в трудно разбираемый корпус (и использовал много изоленты, знаю что моветон, но уж больно хотелось поскорее увидеть всё в работе).
Для управления розеткой — воспользуемся схемой. И вообще, по этому адресу можно найти много полезной информации.
Вот так выглядит розетка в моём исполнении:
Плата с подключением к шине 1-Wire (сверху) и вынесенным(снизу) симистором:
Розетка и симистор:
Теперь в наших руках имеется всё необходимое «оборудование» и можно переходить к программированию.
Типовой путь управления я определил следующим образом: планшет -> сервер -> компьютер. Так как здесь три устройства, то нам понадобится три модуля, по одному на каждое устройство.
На сервере нам потребуется обслуживать запросы веб интерфейса (это наиболее простое решение, покрывающее довольно широкий перечень портативных, и не только, устройств), управлять розеткой и передавать команды клиенту. Что касается шины 1-Wire, то я решил не изобретать велосипед а воспользоваться уже готовыми драйверами и обёрткой для .Net.
Драйвера
Обёртка для .Net
ВНИМАНИЕ! в ранних версиях присутствует ошибка по работе с термодатчиком по схеме с внешним питанием, не знаю исправлена ли она сейчас, но имейте ввиду — если будет нужен данный функционал — потребуется немного модифицировать исходники.
Способов организовать взаимодействие между двумя компьютерами/процессами — великое множество. Я выбрал технологию .Net Remoting, которая хотя и устарела, но полностью подходит для наших целей. С её помощью происходит общение веб формы с сервером и сервера с клиентом.
Поначалу я хотел описать либо мой тестовый проект, либо абстрактный простейший пример, но потом решил, что описание получается достаточно громоздким, а нагрузки смысловой не несёт, поэтому приведу только скриншоты оконных интерфейсов, которыми пользуюсь для отладки всей схемы и обкатки поступающих идей.
Серверная форма.
Сердце системы, сбор данных о температуре от внешних (1-Wire) и внутренних (материнской платы, при помощи проекта openhardwaremonitor) датчиков.
Поддержка всей инфраструктуры и контроль состояния ADSL модема через telnet (мой не умеет восстанавливать соединение, приходится помогать передёргивать затвор):
Клиент.
Отображает поступающие команды от сервера и позволяет инициировать некоторые из них:
Веб форма.
Примитивная, громоздкая, но на планшете смотрится неплохо и работает 😉
Перспективы
Я уверен, что каждый, присмотревшись к своему окружению, может предложить 5-10 идей по автоматизации своего повседневного быта. И вовсе необязательно сразу браться за изучение схемы управления газовым котлом (если он есть), для первых экспериментов вполне сойдут освещение в квартире и вентиляция в ванной комнате и кухне.
Синтез и распознавание речи
У компании Microsoft в свободном доступе есть платформа синтеза и распознания человеческой речи. Скачать движок и модули синтеза и распознавания можно тут:
Runtime;
Runtime Languages.
Стоит отметить, что и само распознавание и синтез сделаны весьма неплохо. Это безусловно не то что мы видим в фантастических фильмах, но это то, что работает и может быть использовано на практике уже сегодня.
При тестировании распознавания голоса столкнулся с тем неудобством, что нужно тянуться к микрофону, а если я дотянулся до него, то и всё остальное смогу сделать. Но попробовать было весьма забавно. Для «обращения» к компьютеру использовал кодовую фразу, после которой он начинал «слушать» команду (некоторое время после первой команды, следующие воспринимались без предварительной фразы), но оказалось, что произносить кодовую фразу каждый раз, когда что-то нужно от компьютера – чертовски не удобно. А сегодня увидел ролик про очки от Google и понял – что лучшего на сегодняшний день пока просто нет и нужно немного подождать с речевым управлением.
Зато синтезатор речи гармонично вписался в утренний будильник и сообщает текущее время. Далее планирую “научить” его сообщать прогноз погоды и курсы валют.
Безопасность
И последнее, но не по значимости — не стоит забывать об элементарных правилах безопасности. В моём случае, веб сайт недоступен из внешнего мира и беспокоится о злоумышленниках не стоит, но если вы планируете открыть доступ для внешнего мира — будьте бдительны, ибо рассчитывать на то, что вас окружают исключительно добрые и сознательные люди — весьма наивно. Одно время мой модем держал открытым стандартный порт для RDP подключений и оказалось, что “внешний мир” постоянно осуществлял перебор всевозможных логинов и паролей для подключения. О том что будет, если какой-нибудь малолетний (или не очень) хакер проникнет в ваш файл сервер, лучше не знать на личном опыте.
Удачи в экспериментах!
ссылка на оригинал статьи http://habrahabr.ru/post/179835/
Добавить комментарий