Espruino:Примеры/Автоматизация дома с помощью Raspberry Pi, MQTT и Espruino: различия между версиями
Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Myagkij (обсуждение | вклад) (Новая страница: «{{Espruino/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} =<ref>[ www.espruino.com - ]</ref>= <syntaxhighlig...») |
Нет описания правки |
||
(не показаны 3 промежуточные версии 2 участников) | |||
Строка 3: | Строка 3: | ||
{{Myagkij-редактор}} | {{Myagkij-редактор}} | ||
=<ref>[ www.espruino.com - ]</ref>= | =Автоматизация дома с помощью Raspberry Pi, MQTT и Espruino<ref>[https://www.espruino.com/Home+Automation www.espruino.com - Home Automation with Raspberry Pi, MQTT, and Espruino]</ref>= | ||
== Настройка Pi == | |||
[https://www.youtube.com/watch?v=yXvgVgxXjbM HOME AUTOMATION with a Raspberry Pi and MQTT, Part 1] | |||
* Во-первых, вам понадобится [[Raspberry Pi]] (идеально – [https://www.raspberrypi.org/products/raspberry-pi-zero-w/ Zero W] или [https://www.raspberrypi.org/products/raspberry-pi-3-model-b/ Pi 3]) с SD-картой как минимум на 8 Гб. | |||
* Скачайте [[Raspbian Lite]] [https://www.raspberrypi.org/software/operating-systems/ отсюда]. | |||
* Установите [[Raspbian]] на SD-карту согласно [https://www.raspberrypi.org/documentation/installation/installing-images/README.md вот этим инструкциям]. | |||
* После этого нам надо будет настроить WiFi на Pi в режиме «headless» (т.е. без монитора, клавиатуры и мыши). | |||
* Отключите SD-карту, а затем снова подключите – на ней должны появиться новые диски. | |||
* Откройте диск ''«boot»'' и создайте на нём файл ''«ssh»''. Он может быть пустым, но важно, чтобы у него вообще не было никакого расширения (вроде ''«.txt»''). Это включит [[SSH-сервер]], чтобы мы могли подключиться к [[Pi]] беспроводным путём во время её запуска. | |||
* Если вы хотите, чтобы [[Pi]] подключалась к точке [[WiFi-доступ]]а, создайте на том же диске файл ''«wpa_supplicant.conf»'' и поместите в него код ниже. Но не забудьте задать в нём [[SSID]] и пароль своей точки [[WiFi-доступ]]а. | |||
<syntaxhighlight lang="javascript"> | |||
network={ | |||
ssid="SSID_вашей_сети" | |||
psk="пароль_вашей_сети» | |||
key_mgmt=WPA-PSK | |||
} | |||
</syntaxhighlight> | |||
* Если у вас [[Windows]], обязательно воспользуйтесь редактором [https://notepad-plus-plus.org/ Notepad++], который позволяет задать окончание строки в стиле [[Unix]], а не [[Windows]]. | |||
* Извлеките SD-карту из [[ОС]], отключите её от своего [[ПК]] и подключите к [[Pi]]. Затем подключите [[Pi]] к телефонному USB-заряднику (если у вас [[Pi Zero W]], то используйте USB-разъём [[PWR]]). | |||
* Подождите несколько минут, пока [[светодиод]] не перестанет мигать (иногда вам надо будет заходить в настройки роутера и смотреть там, подключилась ли Pi). | |||
* Теперь пора установить [[SSH-клиент]]. Если у вас [[Linux]] или [[Mac OS]], то у вас этот клиент уже есть, но если у вас [[Windows]], то вам надо будет [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html скачать и запустить 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]] == | |||
[https://www.youtube.com/watch?v=G-9esF5u8gs HOME AUTOMATION with Espruino and MQTT, Part 2 - Espruino WiF] | |||
<syntaxhighlight lang="javascript"> | |||
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(); | |||
}); | |||
}); | |||
} | |||
</syntaxhighlight> | |||
== Взаимодействие с SonOff == | |||
[https://www.youtube.com/watch?v=-BYHwGIMKXw HOME AUTOMATION with Espruino and MQTT, Part 3 - ESP8266 Sonoff] | |||
Но если вам не хочется смотреть видео, то вот сразу код: | |||
<syntaxhighlight lang="javascript"> | |||
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); | |||
} | |||
</syntaxhighlight> | </syntaxhighlight> | ||
=См.также= | =См.также= | ||
=Внешние ссылки= | =Внешние ссылки= | ||
Строка 19: | Строка 230: | ||
<references /> | <references /> | ||
{{Навигационная таблица/Espruino | {{Навигационная таблица/Портал/Espruino}} | ||
Текущая версия от 15:05, 20 мая 2023
Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.
Автоматизация дома с помощью 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);
}
См.также
Внешние ссылки