ESP, Arduino i pushover

Awatar użytkownika
shimano73
Posty: 1950
Rejestracja: ndz lut 28, 2016 12:27 pm
Lokalizacja: Orzesze
Kontakt:

Witam , ja jako szczęśliwy posiadacz iphona chciałem powiadomienia ze swoich esp. Znalazłem w sieci opis działania na podstawie aplikacji pushover i układów pod arduino . Nie było specjalnie problemów aby do wrzucić do supli, działa ale niestety pojawił się problem. W chwili gdy występuje zdarzenie np otwarcie bramy, esp resetuje połączenie z suplą , niestety nie wiem dlaczego , tu moja wiedza się kończy.
Będę wdzięczny jeśli ktoś ma większą wiedzę w tej kwestii.

Kod: Zaznacz cały

/**
 * Supla.org NodeMCU WiFi minimal example
 * Author: Programistyk - Kamil Kaminski <kamil@programistyk.pl>
 * 
 * This example shows how to configure SuplaDevice for building for NodeMCU within Arduino IDE
 */


#include <srpc.h>
#include <log.h>
#include <eh.h>
#include <proto.h>
#include <IEEE754tools.h>
// We define our own ethernet layer
#define SUPLADEVICE_CPP
#include <SuplaDevice.h>
#include <lck.h>

#include <WiFiClient.h>
#include <ESP8266WiFiType.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiScan.h>
#include <ESP8266WiFiMulti.h>
#include <WiFiServer.h>
#include <ESP8266WiFiGeneric.h>
#include <WiFiClientSecure.h>
#include <ESP8266WiFiAP.h>
#include <ESP8266WiFiSTA.h>
#include <WiFiUdp.h>

WiFiClient client;

// Setup Supla connection
const char* ssid     = "xxxx";
const char* password = "xxxx";

// Pushover settings
char pushoversite[] = "api.pushover.net";

char apitoken[] = "your30characterapitokenhere12";
char userkey [] = "your30characteruserkeyhere123";

int length;
byte  pamiec;

void setup() {
  Serial.begin(115200);
  delay(10);

  // Replace the falowing GUID
  char GUID[SUPLA_GUID_SIZE] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0D,0x00,0x000,x00,0x00,0x00,0x00};
  // with GUID that you can retrieve from https://www.supla.org/arduino/get-guid

  // Ethernet MAC address
  uint8_t mac[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

  /*
   * Having your device already registered at cloud.supla.org,
   * you want to change CHANNEL sequence or remove any of them,
   * then you must also remove the device itself from cloud.supla.org.
   * Otherwise you will get "Channel conflict!" error.
   */
    
  // CHANNEL0 - RELAY
  SuplaDevice.addRelay(4, true);           // 44 - Pin number where the relay is connected      
                                      // Call SuplaDevice.addRelay(44, true) with an extra "true" parameter 
                                      // to enable "port value inversion"
                                      // where HIGH == LOW, and LOW == HIGH   

  // CHANNEL1 - RELAY
  SuplaDevice.addRelay(5, true);           // 45 - Pin number where the relay is connected   

 SuplaDevice.addSensorNO(2);

 
  SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    mac,               // Ethernet MAC address
                    "svr1.supla.org",  // SUPLA server address
                    0,                 // Location ID 
                    "");               // Location Password

}

void loop() {
  SuplaDevice.iterate();
  if ((digitalRead(2)==LOW) and (pamiec==0)) {
    pushover("Brama wjazdowa otwarta");  
    Serial.println("Brama wjazdowa - otwarta");
    pamiec=1;
  }
  if (digitalRead(2)==HIGH) pamiec=0;
}


// --------------


// Pushover settings





byte pushover(char *pushovermessage)
{
 String message = pushovermessage;

 length = 81 + message.length();

 if(client.connect(pushoversite,80))
 {
   client.println("POST /1/messages.json HTTP/1.1");
   client.println("Host: api.pushover.net");
   client.println("Connection: close\r\nContent-Type: application/x-www-form-urlencoded");
   client.print("Content-Length: ");
   client.print(length);
   client.println("\r\n");;
   client.print("token=");
   client.print(apitoken);
   client.print("&user=");
   client.print(userkey);
   client.print("&message=");
   client.print(message);
   while(client.connected())  
   {
     while(client.available())
     {
       char ch = client.read();
       Serial.write(ch);
     }
   }
  // client.stop();
 }  
}


// -----------------


// Supla.org ethernet layer
    int supla_arduino_tcp_read(void *buf, int count) {
        _supla_int_t size = client.available();
       
        if ( size > 0 ) {
            if ( size > count ) size = count;
            return client.read((uint8_t *)buf, size);
        };
    
        return -1;
    };
    
    int supla_arduino_tcp_write(void *buf, int count) {
        return client.write((const uint8_t *)buf, count);
    };
    
    bool supla_arduino_svr_connect(const char *server, int port) {
          return client.connect(server, 2015);
    }
    
    bool supla_arduino_svr_connected(void) {
          return client.connected();
    }
    
    void supla_arduino_svr_disconnect(void) {
         client.stop();
    }
    
    void supla_arduino_eth_setup(uint8_t mac[6], IPAddress *ip) {

       // Serial.println("WiFi init");
        WiFi.begin(ssid, password);

        while (WiFi.status() != WL_CONNECTED) {
            delay(500);
        //    Serial.print(".");
        }

        //Serial.print("\nlocalIP: ");
        //Serial.println(WiFi.localIP());
        //Serial.print("subnetMask: ");
        //Serial.println(WiFi.subnetMask());
        //Serial.print("gatewayIP: ");
        //Serial.println(WiFi.gatewayIP());
    }

SuplaDeviceCallbacks supla_arduino_get_callbacks(void) {
          SuplaDeviceCallbacks cb;
          
          cb.tcp_read = &supla_arduino_tcp_read;
          cb.tcp_write = &supla_arduino_tcp_write;
          cb.eth_setup = &supla_arduino_eth_setup;
          cb.svr_connected = &supla_arduino_svr_connected;
          cb.svr_connect = &supla_arduino_svr_connect;
          cb.svr_disconnect = &supla_arduino_svr_disconnect;
          cb.get_temperature = NULL;
          cb.get_temperature_and_humidity = NULL;
          cb.get_rgbw_value = NULL;
          cb.set_rgbw_value = NULL;
          
          return cb;
}


A oto co wychodzi z terminala :
Not connected
Register in progress
Registered and ready.
HTTP/1.1 200 OK
Server: nginx
Date: Sun, 19 Nov 2017 17:52:45 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, OPTIONS
Access-Control-Allow-Headers: X-Requested-With, X-Prototype-Version, Origin, Accept, Content-Type, X-CSRF-Token, X-Pushover-App
Access-Control-Max-Age: 1728000
X-Limit-App-Limit: 7500
X-Limit-App-Remaining: 7484
X-Limit-App-Reset: 1512108000
ETag: W/"85115b670bbe1ca3be7bb01f337ddc70"
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: 8f08bea2-c7d7-4c16-9d31-ab0083508213
X-Runtime: 0.021830
X-Frame-Options: DENY

3d
{"status":1,"request":"8f08bea2-c7d7-4c16-9d31-ab0083508213"}
0

Brama wjazdowa - otwarta
Not connected
Register in progress
Registered and ready.
W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie

Wezmę udział w Supla Offline Party 2024 :)
Awatar użytkownika
wojtas567
Posty: 2209
Rejestracja: ndz kwie 03, 2016 7:16 pm
Lokalizacja: Olsztyn

Odświeżę stary temat :)

Po utworzeniu konta na tej stronie https://pushover.net i dodaniu swojego telefonu do konta mamy potrzebne dwa ciągi znaków: pierwszy u góry z prawej strony - Your User Key, drugi na samym dole strony w Your Applications -> API Token/Key.
Mając to możemy przejść dalej.

W załączonym pliku znajduje się kod który należy dołączyć do już istniejącego własnego.
W kodzie są dwa powiadomienia
  • pierwszy dotyczy wybranego GPIO - należy wpisać nr z którego chcemy mieć powiadomienia - tu GPIO4.

Kod: Zaznacz cały

int buttonSensor = digitalRead(4);
  • drugie powiadomienie jest cykliczne z informacją z czujnika DHT, jak ktoś chce z DS to należy tam zamienić odpowiednio wpis. Częstotliwość wysyłania tego powiadomienia jest ustawiona co 2 godziny - można to oczywiście zmienić.
W tych liniach należy wpisać te ciągi znaów które uzyskaliśmy ze strony:

Kod: Zaznacz cały

String Token      = "tu należy wpisać: API Token/Key ";        // API token aplkacji
String User       = "a tu: Your User Key";                     // klucz użytkownika
a w tej nazwę swojego "Your Devices" ze strony

Kod: Zaznacz cały

String Device     = "SONY"; 

Jeżeli ktoś che zmienić sobie dźwięk jak poniżej na inny niż domyślny to należy w tej linii zamienić "tugboat" na inny z listy po prawej.

Kod: Zaznacz cały

String Sound      = "tugboat"; 
Testowałem gotowe dostępne które znalazłem w sieci przykłady do pushover-a ale nie chciały współpracować dobrze z SUPLĄ dlatego stworzyłem to rozwiązanie z połączeniem się z plikiem pushover.php który znajduje się gdzieś na serwerze, nie jest może idealne ale na dzień dzisiejszy najstabilniejsze.
Jeżeli ktoś nie ma możliwości wystawienia tego pliku na zewnątrz to może korzystać z mojego. Mam nadzieję , że serwer to wytrzyma :).

Zapraszam do testowania i ewentualnych modyfikacji :)
Załączniki
pushover01.rar
(2.28 KiB) Pobrany 226 razy
Pozdrawiam
Wojtek
Awatar użytkownika
maffiu
Posty: 500
Rejestracja: śr lis 30, 2016 9:30 pm
Lokalizacja: Kraków/Skawina

Przy okazji powiadomień ...
Dla ios jest aplikacja shortcuts trochę jak automate da się w niej wykonać skróty do odczytu z linków bezpośrednich, skrot można uruchomić nawet przy pomocy Siri, udało mi się zrobić odczyt z linku bezpośredniego w formie alertu i opcja druga z odczytem na głos, można tez uruchomić skrót do wykonania sceny ale jako ze poruszam się po niej po omacku nie udało mi się uruchomić cyklicznego powiadomienia np co godzinę może jakaś mądrzejsza głowa będzie chciała rzucić na to okiem
Ostatnio zmieniony ndz lut 17, 2019 9:11 pm przez maffiu, łącznie zmieniany 1 raz.
Awatar użytkownika
PuteR
Posty: 1421
Rejestracja: śr gru 06, 2017 10:07 am

wojtas567 czy dobrze rozumiem żeby skorzystać z tych powiadomień trzeba by dokonać zmian w kodzie softu dla danego modułu?? Jesli korzystam raczej z gotowych plików bin to te powiadomienia nie będą dla mnie :D
Awatar użytkownika
wojtas567
Posty: 2209
Rejestracja: ndz kwie 03, 2016 7:16 pm
Lokalizacja: Olsztyn

PuteR pisze: ndz lut 17, 2019 8:30 pm wojtas567 czy dobrze rozumiem żeby skorzystać z tych powiadomień trzeba by dokonać zmian w kodzie softu dla danego modułu?? Jesli korzystam raczej z gotowych plików bin to te powiadomienia nie będą dla mnie :D
Na dzień dzisiejszy niestety nie, za jakiś czas przygotuję wersję kompletną ale to jeszcze trochę muszę uporządkować trochę inne tematy :D
Pozdrawiam
Wojtek
Awatar użytkownika
PuteR
Posty: 1421
Rejestracja: śr gru 06, 2017 10:07 am

Ok, w takim razie może całkiem przypadkiem masz kod napisany pod sonoffa 4ch pro który ewentualnie mógłbym sobie zmodyfikować (a przynajmniej pokombinować) i wgrać przez arduino :D (o ile to w ogóle możliwe :P)
Awatar użytkownika
wojtas567
Posty: 2209
Rejestracja: ndz kwie 03, 2016 7:16 pm
Lokalizacja: Olsztyn

Sonoff-a 4ch nie miałem okazji mieć w ręku a co za tym idzie softu też nie przygotowywałem pod te urządzenia.
Pozdrawiam
Wojtek
piomar2
Posty: 369
Rejestracja: pt kwie 26, 2019 5:32 pm
Lokalizacja: Bukowice

Witam!
Jestem z SUPLĄ około 2 tyg. Bardzo fajna zabawa. Zainteresowałem się powiadomieniem na Pushover. Testuję sprawę drugi dzień i coś się udaje zrobić. Nie łączę tego z suplą w jednym układzie, bo wydaje mi się, że skomasowanie różnych powiadomień w osobnym WEMOS-ie mini ma sens (ja wyzwalam wej wemosa z arduino mega, który jest jednym z moich elementów supli w domu.) Dołączam działający kod z arduino (1.8.3). Trochę przegrzebałem Wasze kody . Co o tym sądzicie?. To pierwszy mój tekst na forum., liczę na tolerancje.

Pozdrawiam piomar2
Załączniki
pushover_2_2.zip
(1.45 KiB) Pobrany 263 razy
adamkody
Posty: 29
Rejestracja: wt lis 14, 2017 10:33 am

Witam, korzystając z kodu pushover_2_2.ino stworzyłem dla własnej potrzeby wyzwalanie dwu powiadomień indywidualnych Custom Sounds. W kodzie zastąpiłem dzwięki "siren" i "tugboat" własnymi wgranymi w aplikacji z przypisaną nazwą "dzwiek1" i "dzwiek2" dl=7. Dzwięk pierwszy to głośna syrena alarmowa, drugi to wygenerowane powiadomienie głosowe ‘’ alarm załączony” oba dzwięki w formacie MP3, dzwięk powiadomienia utworzony za pomocą https://notevibes.com/cabinet.php . W telefonie ustawione zawsze używaj defaltowych dźwięków.
Wszystko działa bardzo dobrze można do woli wstawiać własne dzwięki i powiadomienia głosowe. Mam jednak problem i liczę na pomoc kolegów. Powiadomienia są wyzwalane impulsem, ja potrzebuje aby to był stan niski (wyzwalanie stanem niskim przechodzącym w wysoki po określonym czasie tzn. wyłącznik bistabilny) obecnie przy połączeniu na dłużej wejścia wyzwalany jest ciąg powiadomień do czasu jego zwolnienia. Oczywiście mogę to rozwiązać stosując jakąś elektronikę np. wyzwalanie jednego impulsu za pomocą NE555. Moja prośba do kolegów o wprowadzenie zmian tak aby wejścia były „bistabilne” + zewnętrzny pull up, resztę zrobie już sam.
ODPOWIEDZ

Wróć do „Pomoc”