Ослабьте свой IoT

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

А если серьезно, разве не было бы круто включить умный свет, просто приглушив свет? Думал, будет круто, поэтому попробовал. Вот что я узнал.

Создание умного света

Сначала я собирался развить старые навыки электротехники, которые у меня когда-то были (и которые я забыл за годы работы кодовой обезьяной). Я быстро отказался от этой идеи, осознав, что на самом деле создать умный свет сложно, и вернулся к своему удобному миру кода.

Я занимаюсь исследованием данных и искусственным интеллектом днем, поэтому я предпочитаю Python. Конечно, было бы здорово включить свет, но сделать верный print("Light On") было для меня достаточно близко. Итак, я пошел, строя своего нового воображаемого друга Lightbulb.

Во-первых, я загрузил свою виртуальную среду: virtualenv venv и закодировал «прошивку» моей световой системы, которая скоро станет разумной:

К сожалению, эта лампочка не слишком привлекательная для удовлетворения моей потребности в друге. По крайней мере, он всегда включен!

Первый шаг к общению с моим новым другом - подключить мою прошивку к облаку. Вот где мне нужно было подключить мою вещь (мою лампочку) к Интернету: войдите в IoT! Я рассматривал несколько платформ - ThingsSpeak, ThingsBoard и Iotery.

Я остановился на Iotery.io, потому что это был мой самый быстрый путь к глубоким философским разговорам о достоинствах нити накала и диодов (и это было бесплатно для моего простого приложения). У него также есть несколько пакетов SDK для Python, которые обертывают его REST API, что облегчает мне жизнь.

Итак, я пошел, создав свою команду Iotery:

После создания своей команды мне было предложено создать новый тип устройства - лампочку:

Сразу после этого я создал экземпляр типа устройства с лампочкой в ​​пункте меню Devices (моя настоящая лампочка). Я назвал его Фред:

Я беспокоюсь о безопасности Фреда, поэтому сначала попробовал использовать KEYED схему аутентификации Iotery, которая показалась мне более безопасной. Но тогда мне пришлось бы реализовать асимметричные сертификаты X.509 в прошивке Фреда (RSA). Я решил, что Фред будет в безопасности, просто используя Basic режим безопасности Iotery: комбинацию серийного номера, ключа и секрета. К счастью, все REST API Iotery зашифрованы при передаче с помощью TLS (HTTPS), поэтому Фред должен быть в безопасности.

Я также сделал Фреда устройством для подключения к облаку на панели устройства Iotery. Если бы Фред был настоящей лампочкой, это бы означало, что он мог бы говорить по IP (HTTP).

Пришло время кодировать прошивку, чтобы подключиться к облаку и по-настоящему стать Фредом! Чтобы облегчить себе жизнь, я установил встроенный Iotery Python SDK:

pip install iotery_embedded_python_sdk

Фреду также нужно было, в конечном итоге, дать мне возможность ослабить свое состояние, поэтому ему нужно сообщить свое основное состояние (включено / выключено), поэтому я создал тип данных на панели инструментов Iotery:

Изучив документацию по встроенному SDK Iotery и REST API для публикации данных Iotery, я подключил прошивку (Фред), чтобы сообщить о своем состоянии в Iotery:

Я запустил файл (выполнив EXPORT IOTERY_TEAM_ID=my-team-id), проверил приборную панель Iotery и увидел, что Фред сообщает данные!

Мое творение было почти завершено [вставить злой смех]! Но мне нужно было сказать Фреду (и, в конце концов, расслабить его), чтобы он включился и выключился!

Я вернулся к панели управления Iotery и создал Тип команды:

Еще я создал другую команду typeTURN_LIGHT_OFF.

Мне нужно, чтобы Фред ответил на экземпляр команды (экземпляр типа команды), чтобы включить или выключить. Оказывается, Фред может получать невыполненные команды от Iotery каждый раз, когда он публикует данные (в ответе postData).

Прочитав о конструкциях Iotery, я также узнал, что Iotery рассматривает встроенное устройство (в нашем случае Фред) как источник правды, поэтому Фред должен сообщить Iotery, как только он выполнит команду.

Итак, я использовал встроенный SDK для обработки команд:

Мне нужно было убедиться, что они работают, поэтому я использовал страницу устройства (вкладка «Команды») для выполнения созданных мной типов команд:

Потрясающий! Еще ближе к появлению нового друга, который скрасит мой день!

В этот момент я чувствовал себя довольно успешным. Но, увы, я все еще не мог поговорить с Фредом через Slack. Требовалась дополнительная работа…

Прочитав еще немного, я обнаружил Iotery Webhooks. Webhooks позволил бы мне создать свой собственный веб-сервер RESTful (Iotery называет это системой с добавленной стоимостью), где я мог бы использовать Slack API, чтобы наконец пообщаться с Фредом!

Создание моего веб-сервера (система добавленной стоимости)

Узнав, что я могу установить веб-перехватчик в Iotery, чтобы отправлять своему веб-серверу данные каждый раз, когда Фред отправлял данные в Iotery, я приступил к работе над созданием с помощью веб-перехватчика на панели управления Iotery:

Мне нужно было разработать свой веб-сервер локально, поэтому я решил использовать ngrok. Когда я его запустил (ngrok http 7500), ngrok дал мне URL https: //f38a4488.ngrok.i o, который направил весь трафик на мой локальный сервер по адресу http: // localhost: 7500.

Идеально! Теперь мне просто нужно написать веб-сервер для обработки всех запросов, поступающих на http: // localhost: 7500 / light-status.

Сохраняя свою тему Python, я решил использовать Flask для моего веб-сервера RESTful. Я создал еще одну папку и новый virtualenv, установил Flask (pip install flask) и начал кодировать свой веб-сервер:

Каждый раз, когда Фред отправляет данные, мой веб-сервер (VAS) печатал «Фред опубликовал данные!».

Теперь мне просто нужно, чтобы Фред смог ослабить меня своим статусом! Я направился в Slack API.

Настройка входящего веб-перехватчика Slack

Сначала я создал Рабочее пространство Slack (fred-talk.slack.com). Я зашел на страницу администрирования рабочего пространства (https://mobility-dev.slack.com/apps/manage) и создал новый App под названием Fred Talk.

Подобно Webhooks от Iotery, Slack позволил мне создать новый входящий webhook в моем приложении Fred Talk:

После активации входящего веб-перехватчика я попросил Slack создать новый URL-адрес веб-перехватчика, который я могу POST на своем веб-сервере, когда Фред сообщает данные.

Я использовал запросы (pip install requests), чтобы сделать HTTP POST для API Slack webhook.

Я наконец-то смог осуществить свою давнюю мечту поговорить (в одну сторону) с Фредом, моим новым другом-лампочкой, на Slack !!

Хорошо! Фред может высказывать свое мнение !! Я был почти у цели - мне просто нужно было дать расслабиться Фреду.

Я решил, что самый быстрый способ действий - использовать команду Slack с косой чертой и создать новую команду, чтобы каждый раз, когда я хотел поговорить с Фредом (и сказать ему, чтобы он включился), все, что мне нужно было ввести, это /light-er-up-fred. Я использовал панель управления Slack для создания новой команды с косой чертой:

и направил веб-перехватчик на мой веб-сервер (VAS). Я создал еще одну команду с косой чертой, чтобы выключить Фреда, под названием /cut-it-out-fred.

Все, что мне нужно было сделать, это создать в моем VAS обработчик маршрута для обработки Webhooks Slack, один для включения Фреда, а другой - для выключения Фреда. Для этого я использовал API-интерфейс диспетчера учетных записей Iotery, установив Python SDK (pip install iotery_python_server_sdk) и создав его экземпляр с помощью ключа API моей команды Iotery:

Бум! Мы можем ослабить Фреда, набрав /light-er-up-fred или /cut-it-out-fred в канале Slack и попросив его включить и выключить! Моя мечта наконец сбылась! Моя жизнь стала немного ярче.