Espruino:Примеры/Автоматизация дома с помощью Raspberry Pi, MQTT и Espruino
Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.
Автоматизация дома с помощью 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);
}
См.также
Внешние ссылки