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

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
(Новая страница: «{{Espruino/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} =<ref>[ www.espruino.com - ]</ref>= <syntaxhighlig...»)
 
Нет описания правки
Строка 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 ==


[Видео]
* Во-первых, вам понадобится [[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-доступ]]а.
network={
      ssid="SSID_вашей_сети"
      psk="пароль_вашей_сети»
      key_mgmt=WPA-PSK
    }
* Если у вас [[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]] ==
[Видео]
<syntaxhighlight lang="javascript" enclose="div">
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 ==
[Видео]
Но если вам не хочется смотреть видео, то вот сразу код:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript" enclose="div">
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>



Версия от 18:23, 13 июля 2021

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


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

Настройка Pi

[Видео]

  • Во-первых, вам понадобится 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

[Видео]

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

[Видео]

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

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);
}

См.также

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