ESP, Arduino i pushover

Post Reply
User avatar
shimano73
Posts: 677
Joined: Sun Feb 28, 2016 12:27 pm
Location: Orzesze

Sun Nov 19, 2017 5:55 pm

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.

Code: Select all

/**
 * 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.
User avatar
wojtas567
Posts: 1524
Joined: Sun Apr 03, 2016 7:16 pm
Location: Olsztyn

Sun Feb 17, 2019 6:49 pm

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.

Code: Select all

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:

Code: Select all

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

Code: Select all

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.

Code: Select all

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 :)
Attachments
pushover01.rar
(2.28 KiB) Downloaded 36 times
Pozdrawiam
Wojtek
User avatar
maffiu
Posts: 373
Joined: Wed Nov 30, 2016 9:30 pm
Location: Kraków/Skawina

Sun Feb 17, 2019 7:40 pm

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
Last edited by maffiu on Sun Feb 17, 2019 9:11 pm, edited 1 time in total.
PuteR
Posts: 506
Joined: Wed Dec 06, 2017 10:07 am

Sun Feb 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
User avatar
wojtas567
Posts: 1524
Joined: Sun Apr 03, 2016 7:16 pm
Location: Olsztyn

Sun Feb 17, 2019 8:36 pm

PuteR wrote:
Sun Feb 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
PuteR
Posts: 506
Joined: Wed Dec 06, 2017 10:07 am

Sun Feb 17, 2019 8:51 pm

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)
User avatar
wojtas567
Posts: 1524
Joined: Sun Apr 03, 2016 7:16 pm
Location: Olsztyn

Sun Feb 17, 2019 9:17 pm

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
Posts: 2
Joined: Fri Apr 26, 2019 5:32 pm

Thu May 09, 2019 3:01 pm

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
Attachments
pushover_2_2.zip
(1.45 KiB) Downloaded 8 times
Post Reply