Espruino:Примеры/Автоматизация дома с помощью Raspberry Pi, MQTT и Espruino

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Автоматизация дома с помощью Raspberry Pi, MQTT и Espruino[1]

Настройка Pi

HOME AUTOMATION with a Raspberry Pi and MQTT, Part 1

  • Во-первых, вам понадобится Raspberry Pi (идеально – Zero W или Pi 3) с SD-картой как минимум на 8 Гб.
  • Скачайте Raspbian Lite отсюда.
  • Установите Raspbian на SD-карту согласно вот этим инструкциям.
  • После этого нам надо будет настроить WiFi на Pi в режиме «headless» (т.е. без монитора, клавиатуры и мыши).
  • Отключите SD-карту, а затем снова подключите – на ней должны появиться новые диски.
  • Откройте диск «boot» и создайте на нём файл «ssh». Он может быть пустым, но важно, чтобы у него вообще не было никакого расширения (вроде «.txt»). Это включит SSH-сервер, чтобы мы могли подключиться к Pi беспроводным путём во время её запуска.
  • Если вы хотите, чтобы Pi подключалась к точке WiFi-доступа, создайте на том же диске файл «wpa_supplicant.conf» и поместите в него код ниже. Но не забудьте задать в нём SSID и пароль своей точки WiFi-доступа.
network={
       ssid="SSID_вашей_сети"
       psk="пароль_вашей_сети»
       key_mgmt=WPA-PSK
    }
  • Если у вас Windows, обязательно воспользуйтесь редактором Notepad++, который позволяет задать окончание строки в стиле Unix, а не Windows.
  • Извлеките SD-карту из ОС, отключите её от своего ПК и подключите к Pi. Затем подключите Pi к телефонному USB-заряднику (если у вас Pi Zero W, то используйте USB-разъём PWR).
  • Подождите несколько минут, пока светодиод не перестанет мигать (иногда вам надо будет заходить в настройки роутера и смотреть там, подключилась ли Pi).
  • Теперь пора установить SSH-клиент. Если у вас Linux или Mac OS, то у вас этот клиент уже есть, но если у вас Windows, то вам надо будет скачать и запустить PuTTY.
  • Теперь подключитесь к raspberrypi (или raspberrypi.local) через SSH при помощи имени пользователя pi. В PuTTY это можно сделать через меню, а на других платформах просто откройте командную строку и напечатайте ssh pi@raspberrypi. Когда у вас попросят пароль, напечатайте raspberry.

Теперь нам надо сделать так, чтобы операционная система заполнила всю SD-карту.

  • Напечатайте sudo raspi-config.
  • При помощи клавиш со стрелочками выберите пункт Advanced Options и нажмите на  ↵ Enter , а затем выберите A1 Expand Filesystem. Здесь вы также можете поменять пароль и заданное по умолчанию имя хоста (в данный момент это raspberrypi), но я это здесь описывать не буду.
  • После этого два раза нажмите на клавишу со стрелкой «Вправо», чтобы выбрать Finish, а потом нажмите  ↵ Enter .
  • Нажмите Yes, чтобы запустить перезагрузку.
  • Теперь подождите минуту и снова подключитесь к raspberrypi при помощи имени пользователя pi.
  • Напечатайте sudo apt-get update, чтобы установить самую последнюю версию пакета.
  • Напечатайте sudo apt-get install mosquitto mosquitto-clients bluetooth bluez libbluetooth-dev libudev-dev и, когда вас попросят установить необходимые пакеты (в частности, для сервера Mosquitto MQTT), нажмите  ↵ Enter .
  • Скопируйте и вставьте команду ниже, чтобы установить самую последнюю версию Node-RED и Node, а также подтвердите установку, когда вас об этом попросят:

bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered) На выполнение этого шага уйдёт примерно полчаса!

  • Теперь напечатайте sudo systemctl start nodered.service, чтобы запустить сервис Node-RED.
  • Напечатайте cd ~/.node-red && npm install node-red-contrib-ui, чтобы установить пользовательский интерфейс Node-RED, благодаря которому мы можем оснастить наш проект красивыми и удобным графиками и панелями управления. Это может занять некоторое время.
  • Напечатайте sudo systemctl stop nodered.service, а затем sudo systemctl start nodered.service, чтобы перезапустить сервис Node-RED с новым интерфейсным модулем, который мы только что установили. Это займёт минуту-две.
  • Напечатайте sudo systemctl enable nodered.service – это нужно для того, чтобы Node-RED запускался при каждой загрузке.
  • Теперь, когда всё это сделано, вы сможете зайти на http://raspberrypi:1880/.
  • Возьмите в секции «input» слева ноду «inject» и перетяните её в рабочую область.
  • Возьмите в секции «output» ноду «mqtt» и разместите её справа от ноды «inject».
  • Подключите эти ноды друг к другу. Для этого кликните на квадратик, находящийся на конце какой-либо из нод, и протяните «нитку» к квадратику, находящемуся на конце другой ноды.
  • Дважды кликните по ноде «mqtt».
  • Откроется новое окно. Найдите в нём поле Topic и впишите там «/hello».
  • В поле Server выберите пункт Add new mqtt-broker и кликните на иконку с карандашом.
  • Напишите в поле Server «localhost», кликните на Add, а затем Done, чтобы закончить редактирование ноды и сохранить внесённые изменения.
  • Кликните на кнопку Deploy справа вверху.
  • Теперь напечатайте mosquitto_sub -v -h raspberrypi -t "/#" в SSH-окне. В результате Pi начнёт прослушивать все MQTT-события («#» – это wildcard-символ).
  • Если кликнуть по кнопке, которая находится слева на ноде «inject» (на ней будет написано «timestamp»), это отправит сообщение.
  • Точно так же вы можете создать MQTT-ноду, которая будет прослушивать канал связи на предмет заданного вами сообщения, или воспользоваться mosquitto_pub -h raspberrypi -t "/hello" -m "message text", чтобы, наоборот, отправить сообщение этой ноде.

Вот и всё!

Взаимодействие с Espruino WiFi

HOME AUTOMATION with Espruino and MQTT, Part 2 - Espruino WiF

var WIFI_NAME = "Espruino";
var WIFI_OPTIONS = { password : "helloworld" };
var MQTT_HOST = "raspberrypi";
var PATH = "/mydevice/";
var mqtt;
var wifi;

function mqttMessage(pub) {
  console.log(
     "MQTT=> ",pub.topic,pub.message);
  if (pub.topic==PATH+"1/set") {
    var v = pub.message!=0;
    digitalWrite(B3, !v);
    mqtt.publish(PATH+"1/status", v?1:0);
  }
  if (pub.topic==PATH+"2/set") {
    var v = pub.message!=0;
    digitalWrite(B4, !v);
    mqtt.publish(PATH+"2/status", v?1:0);
  }
}

function mqttConnect() {
  mqtt = require("MQTT").connect({
    host: MQTT_HOST,
  });
  mqtt.on('connected', function() {
    console.log("MQTT подключен");
    // Подписываемся на wildcard-символ с нашим названием:
    mqtt.subscribe(PATH+"#");
  });
  mqtt.on('publish', mqttMessage);
  mqtt.on('disconnected', function() {
    console.log("MQTT отключен... Переподключение.");
    setTimeout(function() {
      mqtt.connect();
    }, 1000);
  });
}

setInterval(function() {
  if (!mqtt) return;
  mqtt.publish(
    PATH+"cputemp",
    E.getTemperature());
}, 2*60*1000);

setWatch(function() {
  if (!mqtt) return;
  mqtt.publish(
    PATH+"buttonpress",
    1);
}, BTN, {edge:"rising",repeat:true,debounce:50});


function onInit() {
  console.log("Подключение к WiFi");
  wifi = require("EspruinoWiFi");
  wifi.connect(WIFI_NAME, WIFI_OPTIONS,
               function(e) { 
    if (e) {
      console.log("Ошибка подключения: "+e);
      return;
    }
    console.log("Подключились к WiFi");
    wifi.getIP(function(f,ip) {
      console.log("IP: ",ip);
      mqttConnect();
    });
  });
}

Взаимодействие с SonOff

HOME AUTOMATION with Espruino and MQTT, Part 3 - ESP8266 Sonoff

Но если вам не хочется смотреть видео, то вот сразу код:

var WIFI_NAME = "Espruino";
var WIFI_OPTIONS = { password : "helloworld" };
var MQTT_HOST = "raspberrypi";
var PATH = "/mydevice/";
var LED = D13;
var RELAY = D12;
var BTN = D0;
var mqtt;
var wifi;

function setState(v) {
  RELAY.write(v);
  LED.write(!v);
  mqtt.publish(PATH+"status", v?1:0);
}

function mqttMessage(pub) {
  console.log("MQTT=> ",pub.topic,pub.message);

  if (pub.topic == PATH+"set") {
    setState(pub.message!=0);
  }
  if (pub.topic == PATH+"eval") {
    try {
      mqtt.publish(PATH+"response", eval(pub.message));
    } catch(e) {
      mqtt.publish(PATH+"exception", e.toString());
    }
  }
}

function mqttConnect() {
  mqtt = require("MQTT").connect({
    host: MQTT_HOST,
  });
  mqtt.on('connected', function() {
    console.log("MQTT подключен");
    setTimeout(function() {      
      mqtt.subscribe(PATH+"#");
    }, 1000);
  });
  mqtt.on('publish', mqttMessage);
}


function onInit() {
  console.log("Подключение к WiFi");  
  setInterval(function() {
    if (!mqtt) return;
    if (!mqtt.connected) {
      console.log("MQTT отключен... Переподключение.");
      mqtt.connect();
    }
  }, 60*1000);

  wifi = require("Wifi");
  wifi.on('connected',function() {
    console.log("Подключились к WiFi");  
  });
  wifi.on('disconnected',function() {
    console.log("Отключились от WiFi");  
  });
  wifi.setHostname("MYDEVICE");
  wifi.stopAP();
  wifi.connect(WIFI_NAME, WIFI_OPTIONS,
               function(ap){ 
    console.log("Соединение выполнено успешно.");
  });
  // Ждём и подключаемся к MQTT:
  setTimeout(function() {
    console.log("Подключение к MQTT");
    mqttConnect();
  }, 10000);
}

См.также

Внешние ссылки