Notifikace na mobil

Odpovědět
Pablo74
Příspěvky: 108
Registrován: 03 lis 2019, 17:00

Notifikace na mobil

Příspěvek od Pablo74 » 11 led 2025, 16:07

Služba Pushover.net umožňuje posílat vlastní notifikace na mobil a to za jednorázovou cenu USD 5 (jednou, ne měsíčně!).

Po registraci dostanete identifikaci USER ID a pak si založíte novou "aplikaci" (není to skutečná aplikace, ale něco jako název pro vlastní konkrétní službu) a v ní dostanete TOKEN.

Podstatou je, že s využitím API můžeme poslat vlastní notifikaci přes obyčejný http request s vyplněnými hodnotami.

Mám v plánu toho využít s ESP32 připojeným na wifi a PIR čidlem.

Pro začátek, pokud by někdo chtěl, tady je odkaz na flems.io, malá webová aplikace, kde je nejprve nutné na řádku 72 vložit TOKEN a na řádku 73 vložit USER ID, pak si to můžete vyzkoušet.

Důležité upozornění: flems.io nic neukládá, celý obsah ukázkové aplikace je vlastně zapsán v URL adrese; při jakékoli změně ve zdrojáku si musíte uložit novou URL, jinak o změnu přijdete.

Pablo74
Příspěvky: 108
Registrován: 03 lis 2019, 17:00

Re: Notifikace na mobil

Příspěvek od Pablo74 » 15 led 2025, 17:57

Dávám sem funkční řešení pro odeslání notifikace z jednočipu ESP32 s PIR čidlem.

Kód: Vybrat vše

#include <U8g2lib.h>
#include <WiFi.h>
#include <HTTPClient.h>

// Nastavení WiFi
const char* ssid = "WIFI-SSID";
const char* password = "WIFI-PASSWORD";

// Nastavení Pushover
const char* pushoverToken = "TOKEN";
const char* pushoverUser = "USER_ID";
const String pushoverApi = "https://api.pushover.net/1/messages.json";

// Inicializace displeje pro ESP32 přes I2C
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);

// Piny
const int pirAM312 = 15;
const int LED = 16;

// Proměnné
int stateAM312;
bool lastMotionState = false;
unsigned long lastNotificationTime = 0;
const unsigned long notificationDelay = 30000;  // 30 sekund
int detectionCount = 0;  // Počítadlo detekcí

// Funkce pro URL encoding
String urlEncode(String str) {
  String encodedString = "";
  char c;
  char code0;
  char code1;
  for (int i = 0; i < str.length(); i++) {
    c = str.charAt(i);
    if (c == ' ') {
      encodedString += '+';
    } else if (isalnum(c)) {
      encodedString += c;
    } else {
      code1 = (c & 0xf) + '0';
      if ((c & 0xf) > 9) {
        code1 = (c & 0xf) - 10 + 'A';
      }
      c = (c >> 4) & 0xf;
      code0 = c + '0';
      if (c > 9) {
        code0 = c - 10 + 'A';
      }
      encodedString += '%';
      encodedString += code0;
      encodedString += code1;
    }
  }
  return encodedString;
}

void setup() {
  Serial.begin(115200);
  pinMode(pirAM312, INPUT);
  pinMode(LED, OUTPUT);
  
  // Inicializace displeje
  u8g2.begin();
  u8g2.enableUTF8Print();
  u8g2.setFont(u8g2_font_helvR18_tf);
  
  // Připojení k WiFi
  connectToWifi();
}

void connectToWifi() {
  u8g2.clearBuffer();
  u8g2.setCursor(0, 33);
  u8g2.print("Prřipojuji...");
  u8g2.sendBuffer();
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  u8g2.clearBuffer();
  u8g2.setCursor(0, 33);
  u8g2.print("Pripojeno!");
  u8g2.sendBuffer();
  delay(2000);
}

void sendPushoverNotification() {
  if (WiFi.status() != WL_CONNECTED) {
    connectToWifi();
    return;
  }

  HTTPClient http;
  http.begin(pushoverApi);
  http.addHeader("Content-Type", "application/x-www-form-urlencoded");
  
  // Vytvoření zprávy s počtem detekcí
  String notificationMessage = "Byl detekován pohyb! (Detekce č. " + String(detectionCount) + ") " + String(millis());
  
  String message = "token=" + String(pushoverToken) +
                  "&user=" + String(pushoverUser) +
                  "&title=" + urlEncode("Detekce pohybu") +
                  "&message=" + urlEncode(notificationMessage);
                  
  int httpResponseCode = http.POST(message);
  
  if (httpResponseCode > 0) {
    String response = http.getString();
    Serial.println("Notifikace odeslána: " + response);
  } else {
    Serial.println("Chyba při odesílání: " + String(httpResponseCode));
  }
  
  http.end();
}

void loop() {
  stateAM312 = digitalRead(pirAM312);
  unsigned long currentTime = millis();
  
  // Aktualizace displeje
  u8g2.clearBuffer();
  
  if (stateAM312 == HIGH) {
    // Zobrazení stavu a počtu detekcí na displeji
    u8g2.setCursor(0, 39);
    u8g2.print("pohyb: ANO");
    u8g2.setCursor(0, 63);
    u8g2.print("#" + String(detectionCount));
    digitalWrite(LED, HIGH);
    
    // Pokud je detekován pohyb a uplynul minimální čas od poslední notifikace
    if ((!lastMotionState) && (currentTime - lastNotificationTime >= notificationDelay)) {
      detectionCount++;  // Zvýšíme počítadlo před odesláním
      sendPushoverNotification();
      lastNotificationTime = currentTime;
    }
    lastMotionState = true;
  } else {
    u8g2.setCursor(0, 39);
    u8g2.print("pohyb: NE");
    digitalWrite(LED, LOW);
    lastMotionState = false;
  }
  
  u8g2.sendBuffer();
  delay(2000);
}
Stačí si doplnit do zdrojáku přihlašovací údaje do wifi sítě a pak TOKEN a USER_ID ze služby Pushover. K jednočipu mám připojen displej (lze vynechat) a LED diodu (lze vynechat) a PIR čidlo.
Při zaznamenání pohybu PIR čidlem pošle ESP32 notifikaci na mobil.

Je to prográmek pro ověření funkčnosti, jednočip se neuspává, takže tento příklad není vhodný pro bateriové napájení.

Funguje mi to :-)

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host