ESP8266 NodeMCU: отправка уведомлений Pushover (Arduino IDE)

В этом руководстве вы узнаете, как отправлять уведомления с ESP8266 в Pushover. Pushover — это сервис уведомлений, который интегрируется со многими приложениями. Вы можете отправлять push-уведомления на все свои устройства и нескольким пользователям. Вы можете управлять своими уведомлениями с уровнями приоритета, устанавливать тихие часы и настраивать различные звуки в зависимости от уведомления.

ESP8266 NodeMCU отправка уведомлений Pushover Arduino IDE

Новичок в ESP8266? Начните здесь: Начало работы с платой разработки ESP8266 NodeMCU.

Знакомство с Pushover

Логотип Pushover

Pushover — это мобильное и настольное приложение, совместимое с Android и iOS, а также с Windows, MacOS и Linux. Оно позволяет получать уведомления из различных источников и сервисов и интегрируется со многими приложениями.

Вы можете получать уведомления на все свои устройства одновременно или отправлять их группам с несколькими пользователями. Кроме того, вы можете настраивать такие параметры, как уровни приоритета, устанавливать тихие часы и даже разные звуки в зависимости от типа уведомления.

Ценообразование Pushover

У вас есть бесплатный 30-дневный пробный период с момента регистрации, чтобы вы могли поэкспериментировать с приложением. После этого, если вы хотите продолжить использование приложения, это будет единоразовая покупка за 5 долларов США. Каждый пользователь может бесплатно отправлять до 10 000 сообщений в месяц. Узнайте больше о ценах Pushover.

Установка приложения Pushover

Вы можете установить приложение Pushover на свой компьютер, планшет и смартфон. Оно совместимо с Windows, MacOS и Linux, а также с Android и iOS.

Загрузите приложение на свой смартфон и создайте учётную запись, чтобы начать работу.

Создание аккаунта в приложении Pushover

После создания учётной записи у вас будет бесплатный 30-дневный пробный период.

Добро пожаловать в Pushover создание аккаунта

После этого вам нужно будет перейти на свою электронную почту, чтобы подтвердить учётную запись.

Получение API-ключа и User Key Pushover

Для отправки уведомлений в Pushover с ESP8266 нам нужно получить API-ключ и ключ пользователя (получателя).

Для этого шага мы рекомендуем войти в свою учётную запись Pushover через браузер на компьютере. Войдите здесь: https://pushover.net/login.

Вы получите доступ к панели управления Pushover.

Панель управления Pushover user key

В правом верхнем углу находится User Key (ключ пользователя). Сохраните его, потому что он понадобится вам позже.

Вы также можете увидеть все свои устройства и добавить дополнительные устройства, если хотите. Вы можете попробовать отправить уведомление (Push a Notification) в левом верхнем углу, чтобы проверить, работают ли уведомления на вашем устройстве.

Прокрутите страницу вниз, чтобы создать Application/API Token.

Pushover создание токена приложения API

Дайте имя и описание (необязательно) API-токену. Вы также можете добавить иконку. Мы добавили иконку платы ESP8266. Таким образом, когда мы получаем уведомление, оно будет сопровождаться иконкой ESP8266. Наконец, создайте приложение.

Pushover создание приложения ESP8266

Теперь приложение появится на вашей панели управления в разделе Your Applications.

Приложение создано в приложении Pushover

Нажмите на название приложения, чтобы получить его API-токен. В этом меню вы также можете проверить, сколько уведомлений вы отправили с этим API-токеном.

Сохраните API-токен, потому что он понадобится вам позже.

Токен приложения ESP8266 в Pushover

Теперь, когда у вас есть ключ пользователя и API-токен, вы можете начать отправлять уведомления ESP8266 с помощью Pushover.

Уведомления Pushover с ESP8266 — пример скетча

Отправка уведомлений Pushover с ESP8266 очень проста благодаря API. Вы можете прочитать документацию API Pushover. Вам просто нужно отправить HTTPS POST-запрос с ESP8266 с правильными параметрами на конечную точку API: https://api.pushover.net/1/messages.json.

Вы должны передать следующие параметры:

  • token — API-токен вашего приложения

  • user — ваш ключ пользователя или ключ группы пользователей

  • message — содержимое уведомления

Вы также можете передать другие необязательные параметры:

  • attachment — вложение изображения для отправки вместе с сообщением.

  • device — имя устройства, на которое вы хотите получить уведомление.

  • html — установите значение 1, чтобы включить разбор HTML.

  • priority — установите уровень приоритета уведомления: значение -2, -1, 0 (по умолчанию), 1 или 2.

  • sound — имя поддерживаемого звука для замены вашего звука по умолчанию — значения могут быть pushover, bike, bugle, cashregister, classical, cosmic и т.д. (проверьте все доступные варианты звуков). Вы даже можете загрузить собственные звуки в панель управления Pushover.

  • timestamp — временная метка Unix для отображения вместо времени получения запроса нашим API.

  • title — заголовок вашего сообщения, в противном случае используется имя вашего приложения.

  • url — дополнительный URL для отображения вместе с вашим сообщением (документация).

  • url_title — заголовок для URL, указанного в параметре url, в противном случае отображается просто URL.

Для получения дополнительной информации обо всех параметрах, пожалуйста, ознакомьтесь с документацией API Pushover.

Код ниже показывает, как отправить уведомления Pushover с ESP8266 с помощью HTTPS POST-запроса.

Перед загрузкой кода на плату вам нужно вставить свои SSID и пароль, ключ пользователя и API-токен приложения Pushover.

/*
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-pushover-arduino/

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.

  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*/

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecure.h>
#include <ArduinoJson.h>

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

const char* apiToken = "API_TOKEN";
const char* userToken = "USER_TOKEN";

//Pushover API endpoint
const char* pushoverApiEndpoint = "https://api.pushover.net/1/messages.json";

//Pushover root certificate (valid from 11/10/2006 to 15/01/2038)
const char *PUSHOVER_ROOT_CA = "-----BEGIN CERTIFICATE-----\n"
                  "MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh\n"
                  "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n"
                  "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\n"
                  "MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT\n"
                  "MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n"
                  "b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG\n"
                  "9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI\n"
                  "2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx\n"
                  "1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ\n"
                  "q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz\n"
                  "tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ\n"
                  "vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP\n"
                  "BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV\n"
                  "5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY\n"
                  "1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4\n"
                  "NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG\n"
                  "Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91\n"
                  "8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe\n"
                  "pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl\n"
                  "MrY=\n"
                  "-----END CERTIFICATE-----\n";

// Create a list of certificates with the server certificate
X509List cert(PUSHOVER_ROOT_CA);

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");

  // Set time via NTP, as required for x.509 validation
  configTime(3 * 3600, 0, "pool.ntp.org", "time.nist.gov");
  Serial.print("Waiting for NTP time sync: ");
  time_t now = time(nullptr);
  while (now < 8 * 3600 * 2) {
    delay(500);
    Serial.print(".");
    now = time(nullptr);
  }
  Serial.println("");
  struct tm timeinfo;
  gmtime_r(&now, &timeinfo);
  Serial.print("Current time: ");
  Serial.print(asctime(&timeinfo));

  //Make HTTPS POST request to send notification
  if (WiFi.status() == WL_CONNECTED) {
    // Create a JSON object with notification details
    // Check the API parameters: https://pushover.net/api
    StaticJsonDocument<512> notification;
    notification["token"] = apiToken;
    notification["user"] = userToken;
    notification["message"] = "Hello from ESP8266";
    notification["title"] = "ESP8266 Notification";
    notification["url"] = "";
    notification["url_title"] = "";
    notification["html"] = "";
    notification["priority"] = "";
    notification["sound"] = "cosmic";
    notification["timestamp"] = "";

    // Serialize the JSON object to a string
    String jsonStringNotification;
    serializeJson(notification, jsonStringNotification);

    // Create a WiFiClientSecure object
    WiFiClientSecure client;
    // Set the certificate
    client.setTrustAnchors(&cert);

    // Create an HTTPClient object
    HTTPClient http;

    // Specify the target URL
    http.begin(client, pushoverApiEndpoint);

    // Add headers
    http.addHeader("Content-Type", "application/json");

    // Send the POST request with the JSON data
    int httpResponseCode = http.POST(jsonStringNotification);

    // Check the response
    if (httpResponseCode > 0) {
      Serial.printf("HTTP response code: %d\n", httpResponseCode);
      String response = http.getString();
      Serial.println("Response:");
      Serial.println(response);
    } else {
      Serial.printf("HTTP response code: %d\n", httpResponseCode);
    }

    // Close the connection
    http.end();
  }
}

void loop() {

}

Просмотреть исходный код

Как работает код

Продолжайте чтение, чтобы узнать, как работает код, или перейдите к разделу демонстрации.

Подключение библиотек

Вы начинаете с подключения необходимых библиотек. Библиотека ESP8266WiFi для подключения ESP8266 к вашей сети, чтобы он мог подключиться к интернету. Библиотеки ESP8266HTTPClient и WiFiClientSecure будут использоваться для выполнения безопасных HTTP POST-запросов, а мы будем использовать библиотеку ArduinoJSON для создания JSON-строки для отправки всех необходимых параметров в теле HTTP POST-запроса.

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecure.h>
#include <ArduinoJson.h>

Сетевые учётные данные

Вставьте свои сетевые учётные данные в следующие переменные.

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

API-токен и User Token

Вставьте API-токен и токен пользователя в следующие переменные:

const char* apiToken = "API_TOKEN";
const char* userToken = "USER_TOKEN";

Конечная точка API

Затем мы устанавливаем URL конечной точки API, куда мы будем отправлять запросы. Согласно документации, он выглядит следующим образом:

const char* pushoverApiEndpoint = "https://api.pushover.net/1/messages.json";

SSL-сертификат

Для выполнения безопасных HTTPS-запросов нам нужен TLS-сертификат веб-сайта Pushover. Мы используем корневой сертификат. Он действителен до 2038 года. Чтобы узнать, как получить TLS-сертификат веб-сайта, вы можете прочитать это: Получение сертификата сервера с помощью Google Chrome.

const char *PUSHOVER_ROOT_CA = "-----BEGIN CERTIFICATE-----\n"
                  "MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh\n"
                  "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n"
                  "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\n"
                  "MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT\n"
                  "MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n"
                  "b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG\n"
                  "9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI\n"
                  "2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx\n"
                  "1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ\n"
                  "q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz\n"
                  "tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ\n"
                  "vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP\n"
                  "BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV\n"
                  "5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY\n"
                  "1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4\n"
                  "NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG\n"
                  "Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91\n"
                  "8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe\n"
                  "pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl\n"
                  "MrY=\n"
                  "-----END CERTIFICATE-----\n";

Затем вам нужно создать список сертификатов cert (даже если у вас только один сертификат) с сертификатом сервера, который вы хотите использовать:

// Create a list of certificates with the server certificate
X509List cert(PUSHOVER_ROOT_CA);

Подключение к Wi-Fi

В функции setup() начните с подключения ESP8266 к вашей сети:

Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");

Настройка времени

Вам нужно настроить время на ESP8266, что необходимо для проверки сертификата.

// Set time via NTP, as required for x.509 validation
configTime(3 * 3600, 0, "pool.ntp.org", "time.nist.gov");
Serial.print("Waiting for NTP time sync: ");
time_t now = time(nullptr);
while (now < 8 * 3600 * 2) {
  delay(500);
  Serial.print(".");
  now = time(nullptr);
}
Serial.println("");
struct tm timeinfo;
gmtime_r(&now, &timeinfo);
Serial.print("Current time: ");
Serial.print(asctime(&timeinfo));

Настройка параметров уведомления

Убедившись, что мы подключены к Wi-Fi, мы создаём JSON-объект с именем notification с обязательными параметрами и некоторыми необязательными параметрами. Обязательными параметрами являются API-токен, токен пользователя и сообщение.

StaticJsonDocument<512> notification;
notification["token"] = apiToken; //required
notification["user"] = userToken; //required
notification["message"] = "Hello from ESP32"; //required
notification["title"] = "ESP32 Notification"; //optional
notification["url"] = ""; //optional
notification["url_title"] = ""; //optional
notification["html"] = ""; //optional
notification["priority"] = ""; //optional
notification["sound"] = "cosmic"; //optional
notification["timestamp"] = ""; //optional

Как видите, сообщение задаётся в следующей строке:

notification["message"] = "Hello from ESP8266"; //required

Вы можете изменить сообщение на любое, что будет полезно для вашего приложения.

Мы также задаём заголовок сообщения в следующей строке:

notification["title"] = "ESP8266 Notification"; //optional

После получения всех параметров в JSON-объекте мы конвертируем его в строку, чтобы можно было отправить её в теле HTTP POST-запроса.

String jsonStringNotification;
serializeJson(notification, jsonStringNotification);

HTTPS POST-запрос

Теперь мы наконец можем выполнить HTTPS POST-запрос.

Узнайте больше о безопасных HTTPS-запросах с ESP8266: ESP8266 NodeMCU HTTPS Requests (Arduino IDE).

Узнайте больше о HTTP POST-запросах с ESP8266: ESP8266 NodeMCU HTTP POST with Arduino IDE.

Создайте объект WiFiClientSecure с именем client.

WiFiClientSecure client;

Затем вам нужно указать, каким сертификатам может доверять клиент, используя метод setTrustAnchors() и передав в качестве аргумента список сертификатов cert (в данном случае мы добавили только один сертификат).

client.setTrustAnchors(&cert);

Затем создайте экземпляр HTTPClient с именем https.

HTTPClient https;

Инициализируйте клиент https на указанном хосте с помощью метода begin(). В данном случае мы делаем запрос на конечную точку API.

https.begin(client, pushoverApiEndpoint);

Затем добавьте заголовки HTTP POST — нам нужно указать, что мы собираемся отправить данные в виде JSON-строки в теле запроса.

// Add headers
https.addHeader("Content-Type", "application/json");

Наконец, мы можем отправить POST-запрос с JSON-данными.

// Send the POST request with the JSON data
int httpResponseCode = https.POST(jsonStringNotification);

После выполнения запроса мы можем проверить ответ сервера. Это полезно для того, чтобы узнать, был ли запрос успешным или возникли какие-либо проблемы во время запроса или с телом запроса. Чтобы получить ответ сервера, нам просто нужно использовать метод getString() для объекта https.

if (httpResponseCode > 0) {
    Serial.printf("HTTP response code: %d\n", httpResponseCode);
    String response = https.getString();
    Serial.println("Response:");
    Serial.println(response);
} else {
    Serial.printf("HTTP response code: %d\n", httpResponseCode);
}

Наконец, закройте HTTPS-соединение с помощью метода end():

https.end();

Этот пример отправляет уведомление в функции setup(), когда ESP8266 запускается впервые. Поэтому функция loop() пуста. Идея в том, что вы используете этот пример в своём собственном приложении. Например, для отправки уведомления при обнаружении движения, когда показания датчика превышают или не достигают определённого порога, для регулярной отправки показаний датчиков или состояний GPIO, и многих других возможностей в области домашней автоматизации и IoT.

Демонстрация

После ввода SSID, пароля, ключа пользователя и API-ключа вы можете загрузить код на свою плату.

После загрузки откройте монитор порта (Serial Monitor) на скорости 115200 бод. Нажмите кнопку RST на ESP8266, чтобы он начал выполнение кода.

Вы должны получить сообщение об успехе (код ответа: 200) в мониторе порта.

ESP8266 отправка уведомлений Pushover монитор порта

И вы должны получить уведомление на свой смартфон.

Новое уведомление ESP8266 получено в приложении Pushover

Вы можете нажать на сообщение, чтобы открыть его.

Уведомление ESP8266 в приложении Pushover

Настройки Pushover

На вашем устройстве вы можете настроить параметры для ваших уведомлений. Нажмите на иконку (…) в правом верхнем углу.

Вы получите страницу, как показано ниже. Вы можете установить тихие часы и другие настройки, такие как громкость и звук для критических оповещений, добавить пользовательские звуки и многое другое.

Настройки уведомлений Pushover

Заключение

Pushover — это сервис уведомлений, который вы можете использовать для получения уведомлений из различных приложений и сервисов в одном месте. Вы можете управлять своими уведомлениями с точки зрения приоритета, устанавливать тихие часы и даже настраивать разные звуки в зависимости от полученного уведомления.

В этом руководстве вы узнали, как отправлять уведомления ESP8266 в Pushover с помощью API Pushover. Использование приложения Pushover не бесплатно, но у вас есть 30-дневный бесплатный пробный период. Если вы решите, что оно полезно для ваших проектов, вы можете получить доступ к приложению за единоразовую плату всего в 5 долларов.

Если вы используете плату ESP32, у нас есть аналогичное руководство:

Мы надеемся, что это руководство было для вас полезным.

У нас также есть другие статьи и проекты, показывающие, как отправлять уведомления другими способами, такими как электронная почта, WhatsApp и Telegram:

Мы надеемся, что это руководство будет вам полезно.

Узнайте больше об ESP8266 с нашими ресурсами: