Статьи

Автоматизация LIFX Lights с помощью LightBlue Bean и IFTTT

LightBlue Bean — это небольшой энергосберегающий микроконтроллер Bluetooth Arduino со встроенным 3-осевым акселерометром и датчиком температуры. Это довольно интересный способ добавить подключение к объектам через соединение Bluetooth вместо Wi-Fi. Он имеет цифровые и аналоговые контакты, как типичный Arduino, так что вы можете расширить возможности, добавив новые элементы в настройку.

Для добавления новых элементов требуется небольшая пайка. В этой статье я хотел получить демо-версию без припоя, за которой может следить любой, у кого есть LightBlue Bean, поэтому мы сосредоточимся на встроенном акселерометре. Несколько месяцев назад я собрал здесь демонстрацию IFTTT в SitePoint, которая автоматически выключает мой индикатор LIFX, когда я переключаю Jawbone UP24 в спящий режим . Это приятное прикосновение, но мне все еще нужно выключить смартфон, чтобы включать свет каждую ночь. Я бы предпочел что-то более автоматическое и решил попробовать несколько технологических экспериментов, чтобы включить свет удобным способом. В этой статье я расскажу о первом из моих прототипов — я буду использовать LightBlue Bean, чтобы определять движение моей двери и включать или выключать свет в зависимости от того, открыта или закрыта моя дверь.

Для тех, кто является поклонником LightBlue Bean, есть новая версия LightBlue Bean на Kickstarter, которая называется LightBlue Bean + и выглядит довольно аккуратно! Он имеет аккумуляторную батарею, разъемы без пайки и множество других полезных функций. Осталось всего несколько дней, чтобы внести свой залог!

Как это будет работать

Наше демо будет работать так:

  1. Прикрепите LightBlue Bean к двери, которую мы хотим отслеживать.
  2. Загрузите эскиз Arduino, который отслеживает изменения акселерометра (дверь качается в одну или другую сторону) и отправляет сообщение через виртуальный серийный номер Bean Loader.
  3. Настройте Node-сервер, следящий за поступающими последовательными сообщениями.
  4. Задайте ответы на эти сообщения на сервере Node, чтобы отправить HTTP-запрос на канал Maker IFTTT, чтобы он включил свет.
  5. Установите для LightBlue Bean режим Virtual Serial.
  6. Запустите Node-сервер и закройте дверь, чтобы увидеть, как включается свет!

В дальнейшем на нашем Node-сервере могут быть включены дополнительные правила, чтобы гарантировать, что код будет выполняться только в определенное время дня (чтобы избежать включения света, когда это действительно не нужно). Или еще лучше — добавьте фоторезистор, чтобы автоматически определять, нужен ли свет!

Настройка вашего LightBlue Bean

Если вы совсем новичок в использовании LightBlue Bean, на вашем компьютере с Windows 8.1 или Mac должно быть установлено самое последнее программное обеспечение Arduino и программное обеспечение Bean Loader (очевидно, что программное обеспечение Bean Loader не работает на старых компьютерах с Windows). Руководства по подключению вашего LightBlue Bean к вашему Mac или ПК довольно подробны на сайте LightBlue Bean:

Это демо было настроено на Mac OSX, но теоретически должно работать и на Windows.

Шаги, описанные в этой статье, предполагают, что вы знакомы с основами размещения эскиза на компоненте LightBlue. Если нет, сначала пройдите по ссылке «Начало работы» для вашей ОС выше.

Наш Arduino Sketch код

Весь код доступен на GitHub для вас, чтобы использовать и адаптировать для любых целей, которые вы выберете!

Наш эскиз Arduino содержит большую часть мозгов за дверью и выглядит следующим образом:

int minXVal = 0; int maxXVal = 0; int minYVal = 0; int maxYVal = 0; int minZVal = 0; int maxZVal = 0; int movement = 15; bool ready = false; void setup() { Serial.begin(); } void loop() { AccelerationReading acceleration = Bean.getAcceleration(); if (!ready) { for (int i = 0; i maxXVal) { maxXVal = acceleration.xAxis; } else if (acceleration.xAxis maxYVal) { maxYVal = acceleration.yAxis; } else if (acceleration.yAxis maxZVal) { maxZVal = acceleration.zAxis; } else if (acceleration.zAxis maxZVal + movement) { String stringToPrint = "OPEN"; Serial.println(stringToPrint); } } Bean.sleep(1000); } 

Наш Эскиз Код объяснил

Для начала вы увидите диапазон переменных, называемых minXVal , maxXVal , minYVal , maxYVal , minZVal и maxZVal . Они отслеживают начальные показания акселерометра нашего LightBlue Bean. В моем демонстрационном коде мы действительно используем только значения z, однако я оставил здесь другие, так как вам может понадобиться использовать их значения для ваших собственных реализаций (например, если вы помещаете Бин в другую ориентацию на дверь или имеете другой вид двери, как раздвижная дверь). Акселерометр отслеживает силу тяжести на каждой стороне Боба. Мы хотим знать только об изменениях в этих силах, поэтому нам нужно знать диапазон сил, действующих на Бин первоначально, когда он стоит на нашей открытой двери. Здесь мы храним эти значения:

 int minXVal = 0; int maxXVal = 0; int minYVal = 0; int maxYVal = 0; int minZVal = 0; int maxZVal = 0; 

Затем мы устанавливаем переменную с именем movement которая является уровнем движения, которое мы примем перед запуском действия. Вам нужно будет отрегулировать это в соответствии с вашей ситуацией (ваша дверь может двигаться намного тоньше, когда она открыта, чем моя). В примере кода мы допускаем перемещение примерно от -15 до +15 от наших минимальных и максимальных значений, прежде чем что-либо запускать:

 int movement = 15; 

Нам понадобится время, чтобы выполнить начальный тест минимальных и максимальных значений, поэтому мы используем переменную ready чтобы сообщить нашему циклу, готовы ли мы начать наблюдать за движениями дверей в пределах нашего минимального и максимального диапазонов:

 bool ready = false; 

В нашей функции setup() Arduino мы устанавливаем запуск последовательного соединения, когда Arduino готов:

 void setup() { Serial.begin(); } 

В нашем цикле мы выполняем все наши наблюдения наших значений акселерометра от Бина. Все это будет читаться через переменную acceleration мы установили в начале функции loop() :

 void loop() { AccelerationReading acceleration = Bean.getAcceleration(); // Our accelerometer tests } 

Наши первые показания акселерометра будут такими, чтобы реализовать наши минимальные и максимальные значения. Они запускаются, когда ready изначально ложно. Начальные показания берутся 100 раз, каждые 10 миллисекунд, которые должны быть готовы с минимальными и максимальными значениями примерно за секунду. После того, как он прошел этот цикл, мы установили ready к истине, чтобы он мог перейти к следующей фазе. Мы прыгаем вперед, хотя сначала рассмотрим, что в этом цикле.

 if (!ready) { for (int i = 0; i Within each 10 millisecond reading, we read in each axis' accelerometer value via acceleration.xAxis , acceleration.yAxis and acceleration.zAxis . We compare each to the current max and min values we have stored for each axis and if it is greater than or less than the respective value, we update it to the new minimum or maximum: [code language="c"] if (acceleration.xAxis > maxXVal) { maxXVal = acceleration.xAxis; } else if (acceleration.xAxis The next phase is the one in which we watch for movement that occurs outside of the min/max values that is greater than our movement variable. 

Для движения двери мне нужно было только проверить значения z, так как это была ось, которая больше всего менялась, когда моя дверь открывалась и закрывалась. Если они были меньше минимального значения покоя, то моя дверь закрывалась, а если они превышали максимальное значение покоя, то дверь открывалась. Это может отличаться для вас, если ваш боб LightBlue по-разному размещен на вашей двери. Экспериментируйте и смотрите, что работает для вас!

Для каждого мы отправляем «OPEN» или «CLOSED» через программный последовательный порт через Serial.println(stringToPrint) . [code language = "c"] еще { if (ускорение.zAxis maxZVal + движение) { String stringToPrint = "OPEN"; Serial.println (stringToPrint); } }

Прикрепление вашего боба

Перед тем, как поместить этот код на свой Бин, прикрепите свой Боб LightBlue к своей двери по своему усмотрению. Я использовал Blu Tack как временную вещь, но Боб казался достаточно легким, чтобы прекрасно с ним держаться. Для моего примера кода я прикрепил свой компонент LightBlue следующим образом:

Моя светло-голубая фасоль прикреплена к моей двери

Настройка LIFX и IFTTT

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

Я предполагаю, что читатели знают основы IFTTT для этой статьи. Если нет, прочитайте мою предыдущую статью о подключении лампочек LIFX к IoT с помощью IFTTT .

Два рецепта, которые мы создадим, будут иметь канал Maker в качестве канала запуска и имена событий «bean_door_closed» (включает наши источники света) и «bean_door_opened» (выключает наши источники света). Канал действия будет LIFX с действием «Включить свет» или «Выключить свет». Они должны выглядеть следующим образом:

Правила IFTTT для наших ламп LIFX

Наш код Node Server объяснил

Код для Node-сервера выглядит так:

 var port = process.env.PORT || 5000, SerialPort = require("serialport").SerialPort, serialPort = new SerialPort("/dev/cu.LightBlue-Bean", { baudrate: 57600 }), request = require('request'); serialPort.on("open", function () { console.log("Connected to LightBlue Bean serial port"); serialPort.on("data", function(data) { console.log("Data: " + data); data = data + ""; if (data == "CLOSED") { request.post({ url: "http://maker.ifttt.com/trigger/bean_door_closed/with/key/YOURKEYHERE" }, function(error, response, body) { console.log(body); if (error) console.log("Error was ", error); }); } else if (data == "OPEN") { request.post({ url: "http://maker.ifttt.com/trigger/bean_door_open/with/key/YOURKEYHERE" }, function(error, response, body) { console.log(body); if (error) console.log("Error was ", error); }); } }); }); 

Запуск сервера настраивает возможности нашего последовательного порта через модуль node-serialport , устанавливая его для просмотра на скорости 57600 бод. Мы также определяем наш модуль запроса, который будет выполнять HTTP-вызовы IFTTT.

 var SerialPort = require("serialport").SerialPort, serialPort = new SerialPort("/dev/cu.LightBlue-Bean", { baudrate: 57600 }), request = require('request'); 

Затем мы открываем соединение с нашим последовательным портом и начинаем наблюдать за последовательным портом любых сообщений. Он регистрирует все полученные сообщения (мы должны увидеть список журналов «Данные: ОТКРЫТЫ» и «Данные: ЗАКРЫТЫ», когда дверь открывается и закрывается).

 serialPort.on("open", function () { console.log("Connected to LightBlue Bean serial port"); serialPort.on("data", function(data) { console.log("Data: " + data); data = data + ""; // Responding to "OPEN" and "CLOSED" } } 

Если данные, которые мы получаем, это строка "CLOSED" , мы делаем HTTP-запрос на http://maker.ifttt.com/trigger/bean_door_closed/with/key/YOURKEYHERE (заменяя YOURKEYHERE ключом, который IFTTT предоставляет вам на канале Maker страница ). В случае успеха мы записываем ответ от IFTTT, который должен выглядеть примерно так: "Congratulations! You've fired the bean_door_closed event" .

Мы делаем то же самое для "OPEN" просто переключая действие внутри URL с bean_door_closed на bean_door_open .

 if (data == "CLOSED") { request.post({ url: "http://maker.ifttt.com/trigger/bean_door_closed/with/key/YOURKEYHERE" }, function(error, response, body) { console.log(body); if (error) console.log("Error was ", error); }); } else if (data == "OPEN") { // Same pattern! } 

Работает все

Если вы еще этого не сделали, прикрепите Боб к вашей двери, как описано ранее, а затем запрограммируйте Боб LightBlue с помощью эскиза.

Затем щелкните правой кнопкой мыши на вашем Bean-компоненте в Bean Loader и выберите «Use for Virtual Serial». Это устанавливает виртуальный последовательный порт для любых сообщений от вашего компонента LightBlue.

Настройка LightBlue Bean для передачи последовательных сообщений

Установите все зависимости для вашего Node-сервера, выполнив обычную команду:

 npm install 

Затем запустите ваш сервер:

 node index.js 

(Если любая из вышеперечисленных команд выглядит для вас бессмысленно, я бы посоветовал немного прочитать об Node, прежде чем пытаться это сделать!)

Откройте и закройте эту дверь! Вы должны увидеть журналы, показывающие звонки на ваш сервер IFTTT в зависимости от того, как распахнулась дверь Я обнаружил, что для корректной работы понадобилось немного отрегулировать чувствительность к movement , поэтому вам, возможно, придется немного его отрегулировать.

Если вы поместили Боб LightBlue на другую сторону двери, я думаю, что вам может потребоваться переключить выходы «ЗАКРЫТО» и «ОТКРЫТО» на эскизе Arduino, так как Бин направлен в противоположную сторону.

Вывод

Вот как использовать LightBlue Bean, IFTTT, LIFX и Node, чтобы волшебным образом выключать и включать свет в зависимости от того, распахивается дверь или закрывается! Вы можете адаптировать этот код, чтобы вместо этого обнаруживать, если объект поднят или перемещен (представьте, что отправляете твит на свою учетную запись каждый раз, когда кто-то пытается открыть ящик или ящик). Боб LightBlue достаточно мал, чтобы его можно было убрать с дороги, и его легко прикрепить к вещам!

Если вы используете этот код для создания гениальной системы безопасности, чтобы защитить своих любящих сахар коллег от того, чтобы они взяли ваши сладости (или что-то столь же важное, как ваш ноутбук!), Или любое другое интересное использование, о котором я не думал — пожалуйста, оставьте отметьте в комментариях или свяжитесь со мной в Твиттере ( @thatpatrickguy ), я хотел бы услышать о том, что вы создали!

Я также собираю набор кураторских ссылок, касающихся разработки на LightBlue Bean, на моем новом сопровождающем сайте DevDiner.com . Так что, если вы найдете ссылки на эту тему в Интернете, которые вы найдете очень полезными, пожалуйста, свяжитесь со мной, чтобы я мог добавить их в руководство!