Supla Pushover x4 cd

Masz pomysł na funkcjonalność lub koncepcję na rozwój projektu. Opisz wszystko tutaj.
Awatar użytkownika
Zibi
Posty: 197
Rejestracja: śr lip 31, 2019 9:20 am
Lokalizacja: Białogard

śr lut 19, 2020 11:06 am

Powiadomienia działają super. Użyłem do skrzynki pocztowej testuje i działa to tak jak chciałem. Dziękuję piomar2 za poświęcony czas i pomoc.
Awatar użytkownika
Elektryk Szczecin
Posty: 38
Rejestracja: pt sty 03, 2020 11:14 pm

śr lut 19, 2020 11:10 am

Potwierdzam działa poprawnie podziękowania ( piomar2 i elmaya)

https://youtu.be/UXprKtn4EMU
Ostatnio zmieniony śr lut 19, 2020 5:10 pm przez Elektryk Szczecin, łącznie zmieniany 1 raz.
Gucio2607.
Posty: 457
Rejestracja: wt sie 22, 2017 1:56 pm

śr lut 19, 2020 2:58 pm

U mnie też działa bez problemu
Zainstalowane:
11x sonoff basic, 1x sonoff gate, 1x Yunshan, 2x H801, 7x sonoff touch(1,2,3 gang), 1x sonoff 4ch PRO
piomar2
Posty: 268
Rejestracja: pt kwie 26, 2019 5:32 pm
Lokalizacja: Bukowice

wt lut 25, 2020 8:41 am

Rozwiązań z powiadomieniami przybywa. Elmaya (nie musiałem bardzo prosić ;) )napisał program będący kontynuacją viewtopic.php?f=9&t=6024&start=20. Jest to wersja powiadomienia Pushover z dołożonym 1 linkiem bezpośrednim. Przetestowane, działa stabilnie. Ustawianie i połączenia jak w wątku powyżej. Myślę, że może to się przydać np do (info o zakończonym praniu :lol: :lol: :lol: ).
W załączniku bin.

Kod: Zaznacz cały

#include <FS.h>       // ---- esp board manager 2.4.2 --- iwip Variant V2 Lower Memory
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#define SUPLADEVICE_CPP
#include <SuplaDevice.h>
#include <WiFiManager.h>
#include <ArduinoJson.h> //--------- https://github.com/bblanchon/ArduinoJson/tree/v5.13.2 ------
#include <EEPROM.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPUpdateServer.h>
#include <ESP8266TrueRandom.h>
#include "Pushover.h"
extern "C"
{
#include "user_interface.h"
} 

//#define D0 16  //no internal pullup resistor
//#define D1  5
//#define D2  4
//#define D3  0  //must not be pulled low during power on/reset, toggles value during boot
//#define D4  2  //must not be pulled low during power on/reset, toggles value during boot
//#define D5 14
//#define D6 12
//#define D7 13
//#define D8 15  //must not be pulled high during power on/reset

#define Sensor_PIN 12    //D6     
#define relay_pin 16   // D0
int wificonfig_pin = 0; // D3
int led_pin = 2; // D4
int C_W_state = HIGH; 
int last_C_W_state = HIGH;
unsigned long time_last_C_W_change = 0; 
long C_W_delay = 5000;               // ---------------------- config delay 5 seconds ---------------------------
unsigned long wifi_checkDelay = 60000;
unsigned long wifimilis;
char Supla_server[80];
char Location_id[15];
char Location_Pass[34];
char Supla_name[51];
char Supla_status[51];
char D_Link_1[80];
char AppToken[60];                                                   
char UserToken[60];                   
char Alarm[80];
char Melody[25];
String _sound;   
bool shouldSaveConfig = false;
bool initialConfig = false;
bool starting = true;
bool send_push = false;
bool send_link = false;
bool alarm_on = false;
bool state10 = true;
int s;
int customFieldLength = 40;
WiFiManagerParameter custom_field; // global param ( for non blocking w params )
char GUID[SUPLA_GUID_SIZE];
byte uuidNumber[16]; // UUIDs in binary form are 16 bytes long
const char* host = "svr.supla.org";
const int httpsPort = 443;
String url = " ";
WiFiClient client;
ESP8266WebServer httpServer(81);
ESP8266HTTPUpdateServer httpUpdater;
WiFiManager wifiManager;

static const char sust_melodi[] PROGMEM = "<div style='text-align:center; width:100%; padding:0;'><p>select Sound from list:</p><form action='/action_page.php'><select name='customfieldid'><option value='bike'>bike</option><option value='bugle'>bugle</option><option value='cashregister'>cashregister</option><option value='classical'>classical</option><option value='cosmic'>cosmic</option><option value='falling'>falling</option><option value='gamelan'>gamelan</option><option value='incoming'>incoming</option><option value='intermission'>intermission</option><option value='magic'>magic</option><option value='mechanical'>mechanical</option><option value='pianobar'>pianobar</option><option value='siren'>siren</option><option value='spacealarm'>spacealarm</option><option value='tugboat'>tugboat</option><option value='alien'>alien</option><option value='climb'>climb</option><option value='persistent' selected>persistent</option><option value='echo'>echo</option><option value='updown'>updown</option><option value='none'>none</option></select>";

void suplaDigitalWrite(int channelNumber, uint8_t pin, uint8_t val) {  
      if (channelNumber == 0) {   
       if (state10 == false ){
        Serial.print("customWrite:  ");Serial.println(val); 
        alarm_on = val; 
        EEPROM.write(295, val);
        EEPROM.commit();
        digitalWrite(relay_pin,val);           
      }
    }
  return;
}
void saveConfigCallback () {          
  Serial.println("Should save config");
  shouldSaveConfig = true;
}
void ondemandwifiCallback () {
   digitalWrite(led_pin, LOW);
   WiFiManagerParameter custom_Supla_server("server", "supla server", Supla_server, 81,"required");
   WiFiManagerParameter custom_Location_id("ID", "Location id", Location_id, 15);
   WiFiManagerParameter custom_Location_Pass("Password", "Location Pass", Location_Pass, 34); 
   WiFiManagerParameter custom_Supla_name("name", "Supla Device Name", Supla_name, 51,"required");
   WiFiManagerParameter custom_Supla_status("status", "Supla Last State", Supla_status, 51,"readonly");
   WiFiManagerParameter custom_D_Link_1("Linka", "Direct Link", D_Link_1, 80);   
   WiFiManagerParameter custom_AppToken("AppToken", "App Token", AppToken, 60);
   WiFiManagerParameter custom_UserToken("UserToken", "User Token", UserToken, 60);
   WiFiManagerParameter custom_Alarm("Alarm", "Alarm Message", Alarm, 80);

   new (&custom_field) WiFiManagerParameter(sust_melodi); // custom html input

   wifiManager.setBreakAfterConfig(true);
   wifiManager.setSaveConfigCallback(saveConfigCallback);
   wifiManager.setSaveParamsCallback(saveParamCallback);
  
   wifiManager.addParameter(&custom_Supla_server);
   wifiManager.addParameter(&custom_Location_id);
   wifiManager.addParameter(&custom_Location_Pass);
   wifiManager.addParameter(&custom_Supla_name);
   wifiManager.addParameter(&custom_Supla_status);
   wifiManager.addParameter(&custom_D_Link_1);
   wifiManager.addParameter(&custom_AppToken);
   wifiManager.addParameter(&custom_UserToken);
   wifiManager.addParameter(&custom_Alarm);
   wifiManager.addParameter(&custom_field);

   wifiManager.setCustomHeadElement("<style>html{ background-color: #01DF3A;}</style><div class='s'><svg version='1.1' id='l' x='0' y='0' viewBox='0 0 200 200' xml:space='preserve'><path d='M59.3,2.5c18.1,0.6,31.8,8,40.2,23.5c3.1,5.7,4.3,11.9,4.1,18.3c-0.1,3.6-0.7,7.1-1.9,10.6c-0.2,0.7-0.1,1.1,0.6,1.5c12.8,7.7,25.5,15.4,38.3,23c2.9,1.7,5.8,3.4,8.7,5.3c1,0.6,1.6,0.6,2.5-0.1c4.5-3.6,9.8-5.3,15.7-5.4c12.5-0.1,22.9,7.9,25.2,19c1.9,9.2-2.9,19.2-11.8,23.9c-8.4,4.5-16.9,4.5-25.5,0.2c-0.7-0.3-1-0.2-1.5,0.3c-4.8,4.9-9.7,9.8-14.5,14.6c-5.3,5.3-10.6,10.7-15.9,16c-1.8,1.8-3.6,3.7-5.4,5.4c-0.7,0.6-0.6,1,0,1.6c3.6,3.4,5.8,7.5,6.2,12.2c0.7,7.7-2.2,14-8.8,18.5c-12.3,8.6-30.3,3.5-35-10.4c-2.8-8.4,0.6-17.7,8.6-22.8c0.9-0.6,1.1-1,0.8-2c-2-6.2-4.4-12.4-6.6-18.6c-6.3-17.6-12.7-35.1-19-52.7c-0.2-0.7-0.5-1-1.4-0.9c-12.5,0.7-23.6-2.6-33-10.4c-8-6.6-12.9-15-14.2-25c-1.5-11.5,1.7-21.9,9.6-30.7C32.5,8.9,42.2,4.2,53.7,2.7c0.7-0.1,1.5-0.2,2.2-0.2C57,2.4,58.2,2.5,59.3,2.5z M76.5,81c0,0.1,0.1,0.3,0.1,0.6c1.6,6.3,3.2,12.6,4.7,18.9c4.5,17.7,8.9,35.5,13.3,53.2c0.2,0.9,0.6,1.1,1.6,0.9c5.4-1.2,10.7-0.8,15.7,1.6c0.8,0.4,1.2,0.3,1.7-0.4c11.2-12.9,22.5-25.7,33.4-38.7c0.5-0.6,0.4-1,0-1.6c-5.6-7.9-6.1-16.1-1.3-24.5c0.5-0.8,0.3-1.1-0.5-1.6c-9.1-4.7-18.1-9.3-27.2-14c-6.8-3.5-13.5-7-20.3-10.5c-0.7-0.4-1.1-0.3-1.6,0.4c-1.3,1.8-2.7,3.5-4.3,5.1c-4.2,4.2-9.1,7.4-14.7,9.7C76.9,80.3,76.4,80.3,76.5,81z M89,42.6c0.1-2.5-0.4-5.4-1.5-8.1C83,23.1,74.2,16.9,61.7,15.8c-10-0.9-18.6,2.4-25.3,9.7c-8.4,9-9.3,22.4-2.2,32.4c6.8,9.6,19.1,14.2,31.4,11.9C79.2,67.1,89,55.9,89,42.6z M102.1,188.6c0.6,0.1,1.5-0.1,2.4-0.2c9.5-1.4,15.3-10.9,11.6-19.2c-2.6-5.9-9.4-9.6-16.8-8.6c-8.3,1.2-14.1,8.9-12.4,16.6C88.2,183.9,94.4,188.6,102.1,188.6z M167.7,88.5c-1,0-2.1,0.1-3.1,0.3c-9,1.7-14.2,10.6-10.8,18.6c2.9,6.8,11.4,10.3,19,7.8c7.1-2.3,11.1-9.1,9.6-15.9C180.9,93,174.8,88.5,167.7,88.5z'/></svg>");
   wifiManager.setMinimumSignalQuality(8);
   //wifiManager.setShowStaticFields(true); // force show static ip fields
   //wifiManager.setShowDnsFields(true);    // force show dns field always
   wifiManager.setConfigPortalTimeout(300);

   if (!wifiManager.startConfigPortal("Supla_Pir_Push")) { Serial.println("Not connected to WiFi but continuing anyway.");} else { Serial.println("connected...yeey :)");}                
    strcpy(Supla_server, custom_Supla_server.getValue());
    strcpy(Location_id, custom_Location_id.getValue());
    strcpy(Location_Pass, custom_Location_Pass.getValue());
    strcpy(Supla_name, custom_Supla_name.getValue());
    strcpy(D_Link_1, custom_D_Link_1.getValue());   
    strcpy(AppToken, custom_AppToken.getValue());
    strcpy(UserToken, custom_UserToken.getValue());
    strcpy(Alarm, custom_Alarm.getValue());
    if(strcmp(Supla_server, "get_new_guid_and_authkey") == 0){
      Serial.println("new guid & authkey.");
      EEPROM.write(300, 0);
      EEPROM.commit();
      delay(100);
      ESP.reset(); 
    }  
    WiFi.softAPdisconnect(true);   //  close AP
}
String getParam(String name){
  String value;
  if(wifiManager.server->hasArg(name)) {
   value = wifiManager.server->arg(name);
   strcpy(Melody, value.c_str());
         }
  return value;
}
void saveParamCallback(){
  Serial.println("[CALLBACK] saveParamCallback fired");
  Serial.println("PARAM customfieldid = " + getParam("customfieldid"));
}
void status_func(int status, const char *msg) {    //    ------------------------ Status --------------------------
  if (s != status){
    s = status; 
      if (s != 10){
        strcpy(Supla_status, msg); 
  }  }            
}
void guid_authkey(void) {
  if (EEPROM.read(300) != 60){
    int eep_gui = 301;
    ESP8266TrueRandom.uuid(uuidNumber);
    String uuidString = "";
    for (int i = 0; i < 16; i++) {
      int topDigit = uuidNumber[i] >> 4;
      int bottomDigit = uuidNumber[i] & 0x0f;
      uuidString += "0123456789abcdef"[topDigit];
      uuidString += "0123456789abcdef"[bottomDigit];
    }
    int length_uuid = uuidString.length();
    for (int i = 0; i < length_uuid; ++i) {
      EEPROM.put(eep_gui + i, uuidString[i]);
    }
    EEPROM.write(300, 60);
    EEPROM.commit();
    delay(0);
  }
  read_guid();
  Serial.print("GUID : ");Serial.println(read_guid()); 
}
String read_guid(void) {
  String read_eeprom = "";
  int i, ii = 0;
  int eep_star = 301;
  int end_guid = eep_star + SUPLA_GUID_SIZE;
  String temp_read = "0x";
  for (i = eep_star; i < end_guid + 16;  i = i + 1) {
    temp_read += char(EEPROM.read(i));
    read_eeprom += char(EEPROM.read(i));
    if ( (i % 2) == 0) {
      char *_guid = strcpy((char*)malloc(temp_read.length() + 1), temp_read.c_str());
      GUID[ii] = strtoul( _guid, NULL, 16);
      temp_read = "0x";
      ii++;
    }
  }
  return read_eeprom;
}
ICACHE_RAM_ATTR void pir_on(){
  detachInterrupt(Sensor_PIN);
  send_push = true ;
  send_link = true ;
}
void setup() {
  wifi_set_sleep_type(NONE_SLEEP_T);
  Serial.begin(115200);
  delay(10);
  Serial.println(" ");
  Serial.println(" ");
  pinMode(Sensor_PIN, INPUT);
  pinMode(wificonfig_pin, INPUT_PULLUP);
  pinMode(led_pin,OUTPUT);   
  digitalWrite(led_pin, HIGH);
  pinMode(relay_pin,OUTPUT); 

  EEPROM.begin(1024);
  if (EEPROM.read(300) != 60){initialConfig = true;} 
  guid_authkey();
  digitalWrite(relay_pin, EEPROM.read(295));
  
  if (WiFi.SSID()==""){ initialConfig = true;} 

  if (SPIFFS.begin()) {  // ------------------------- wificonfig read -----------------
    Serial.println("mounted file system");
    if (SPIFFS.exists("/config.json")) {
      Serial.println("reading config file");
      File configFile = SPIFFS.open("/config.json", "r");
      if (configFile) {
        Serial.println("opened config file");
        size_t size = configFile.size();
        std::unique_ptr<char[]> buf(new char[size]);
        configFile.readBytes(buf.get(), size);
        DynamicJsonBuffer jsonBuffer;         
        JsonObject& json = jsonBuffer.parseObject(buf.get());
        json.printTo(Serial);   //print config data to serial on startup
        if (json.success()) {Serial.println("\nparsed json");         
          strcpy(Supla_server, json["Supla_server"]);
          strcpy(Location_id, json["Location_id"]);
          strcpy(Location_Pass, json["Location_Pass"]);
          strcpy(Supla_name, json["Supla_name"]);
          strcpy(D_Link_1, json["D_Link_1"]);         
          strcpy(AppToken, json["AppToken"]);         
          strcpy(UserToken, json["UserToken"]);
          strcpy(Alarm, json["Alarm"]);
          strcpy(Melody, json["Melody"]);         
        } else {
          Serial.println("failed to load json config");
          ondemandwifiCallback () ;
        }
        configFile.close();
      }
    }
   } else {
    Serial.println("failed to mount FS");
  }
   url = D_Link_1;
   host = Supla_server;
   wifi_station_set_hostname(Supla_name);   
   WiFi.mode(WIFI_STA); // Force to station mode because if device was switched off while in access point mode it will start up next time in access point mode.

    SuplaDevice.addRelay(relay_pin, false); 
    SuplaDevice.setName(Supla_name);
    SuplaDevice.setStatusFuncImpl(&status_func);    
    SuplaDevice.setDigitalWriteFuncImpl(&suplaDigitalWrite);
    uint8_t mac[WL_MAC_ADDR_LENGTH];
    WiFi.macAddress(mac); 
  
 int LocationID = atoi(Location_id);
  SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    mac,               // Ethernet MAC address
                    Supla_server,      // SUPLA server address
                    LocationID,        // Location ID 
                    Location_Pass);    // Location Password    
   
   attachInterrupt(Sensor_PIN, pir_on, RISING); 
                      
}
void loop() {
  if (initialConfig == true){ondemandwifiCallback();}

  int C_W_read = digitalRead(wificonfig_pin);{  // ---------------------let's read the status of the Gpio to start wificonfig ---------------------
   if (C_W_read != last_C_W_state) {  time_last_C_W_change = millis();}      
    if ((millis() - time_last_C_W_change) > C_W_delay) {     
     if (C_W_read != C_W_state) {     
       C_W_state = C_W_read;       
       if (C_W_state == LOW) {
        ondemandwifiCallback () ;} } }         
     last_C_W_state = C_W_read;            
   }
      
  if (shouldSaveConfig == true) { // ------------------------ wificonfig save --------------
    Serial.println("saving config");
    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();
    json["Supla_server"] = Supla_server;
    json["Location_id"] = Location_id;
    json["Location_Pass"] = Location_Pass;
    json["Supla_name"] = Supla_name;
    json["D_Link_1"] = D_Link_1;    
    json["AppToken"] = AppToken;
    json["UserToken"] = UserToken;
    json["Alarm"] = Alarm;
    json["Melody"] = Melody;
    File configFile = SPIFFS.open("/config.json", "w");
    if (!configFile) {Serial.println("failed to open config file for writing"); }   
    json.prettyPrintTo(Serial);
    json.printTo(configFile);
    configFile.close();
    Serial.println("config saved");    
    shouldSaveConfig = false;
    initialConfig = false; 
    WiFi.mode(WIFI_STA);   
    delay(5000);
    ESP.restart(); 
  }
    
 switch (s) {    //    ------------------------------------------------ Status ------------------------------------
  case 17:      // -----     STATUS_REGISTERED_AND_READY
     if (state10 == true){ 
          if (EEPROM.read(295)> 0){ 
              Serial.print("mem switsh ");Serial.println(EEPROM.read(295));              
              alarm_on = true;
              SuplaDevice.channelValueChanged(0,1);
            }
          state10 = false;   
       }  
    break;     
   case 10:      // --------------------- REGISTER_IN_PROGRESS  ----------------------
     state10 = true;
    break;  
  }
  
  SuplaDevice.iterate();
   delay(25);

   if (WiFi.status() == WL_CONNECTED){
    if (starting){
      httpUpdater.setup(&httpServer, "/update", "admin", "pass");
      httpServer.begin(); 
      starting = false;         
     }
      if  ((send_push)&&(alarm_on))  {
        Serial.println("send Pushover");                                                         
        Pushover_send();
        send_push = false;
        direct_Link();
        send_link = false;
        attachInterrupt(Sensor_PIN, pir_on, RISING); 
       }else if ((send_push)&&(!alarm_on)){
        Serial.println("send is off");
        send_push = false;
        send_link = false;
        attachInterrupt(Sensor_PIN, pir_on, RISING);
       }
     httpServer.handleClient();
   }
}
// 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) {
       WiFi_up();
    }

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;
}
void WiFi_up(){ // conect to wifi
 
  if (millis() > wifimilis)  {
  WiFi.begin();yield();
  Serial.println("CONNECTING WIFI"); 
  }
  wifimilis = (millis() + wifi_checkDelay) ;
}
void Pushover_send() {
  Pushover po = Pushover(AppToken,UserToken);
  po.setDevice("De");
  po.setMessage(Alarm);  
  po.setSound(String(Melody));
  Serial.println(po.send()); //should return 1 on success 
}
void direct_Link() {
  // Use WiFiClientSecure class to create TLS connection
  WiFiClientSecure client;
  Serial.print("connecting to ");
  Serial.println(host);
  if (!client.connect(host, httpsPort)) {
    Serial.println("connection failed");
    return;
  }
  Serial.print("requesting URL: ");
  Serial.println(url);

  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "User-Agent: ESP8266\r\n" +
               "Connection: close\r\n\r\n");

  Serial.println("request sent");
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      Serial.println("headers received");
      break;
    }
  }
  String line = client.readStringUntil('}');
  line = line + "}";
  Serial.println("reply was:");
  Serial.println("==========");
  Serial.println(line);
  Serial.println("==========");
  Serial.println("closing connection");
}
HC-SR501.png
HC-SR501.png (85.85 KiB) Przejrzano 229 razy
Załączniki
pir_Pushover_Progmem_link.zip
(386.36 KiB) Pobrany 13 razy
piomar2
Posty: 268
Rejestracja: pt kwie 26, 2019 5:32 pm
Lokalizacja: Bukowice

śr lut 26, 2020 2:24 pm

Następna wersja powiadomienia Pushover. Tym razem powiadomienie po przekroczeniu temperatury na DS18B20. Wartość temperatury po przekroczeniu której, wysyłane jest powiadomienie pushover oraz link bezpośredni (bez wpisywania linku też można) ustawia się w configu (192.168.4.1). Wartość została zaokrąglona do wielkości całkowitej (nie sprawdzano dla wartości ujemnej, w lodówce nie mam wifi :lol: ...). Nagrywamy do wemosa na 32Mbit. Config - 10 sek przycisk na D3. Po uaktywnieniu układu "Włącznikiem światła" w cloudzie lub przyciskiem na D5 układ czuwa (świeci dioda na D8). Po przekroczeniu ustawionej temperatury powiadomienie z linkiem wysyłane jest 1 raz. Ponowne wysłanie jest możliwe po spadku temperatury poniżej ustawionej i ponowny jej wzrost powyżej. Niżej kod i schemat a w zał. bin. Przyjemnej zabawy, komentarze mile widziane... :P

Kod: Zaznacz cały

//wemos D1 mini
//menadżer płytek 2.4.2
//pierwsze urządzenie w cloudzie "Włącznik światła"
//DS18B20 na D4 - 2


#include <FS.h>  // ---- esp board manager 2.4.2 --- iwip Variant V2 higher Bandwidth
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#define SUPLADEVICE_CPP
#include <SuplaDevice.h>
#include <math.h>
#include <DNSServer.h>
#include <WiFiManager.h> 
#include <ArduinoJson.h> //-- https://github.com/bblanchon/ArduinoJson/tree/v5.13.2 --
#include <EEPROM.h>
#include <ESP8266WebServer.h>
#include <ESPEFC.h>  // modification of ESP8266HTTPUpdateServer that includes erases flash and wifi credentials
#include "Pushover.h"
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
extern "C"
{
#include "user_interface.h"
}

byte a1=0;
byte b=0;
float temp1;
int temp2;

OneWire oneWire(2);// DS18B20
DallasTemperature sensors(&oneWire);

double get_temperature(int channelNumber, double last_val) {

    double t = -275;
      if ( sensors.getDeviceCount() > 0 )
      {
       sensors.requestTemperatures();
     t = sensors.getTempCByIndex(0);
     temp1 = t;
      };

      return t;  
}

#define config_pin 0    // D3  wifi config
#define status_led 2    // D4  status Led 
bool pr_wifi = true;
bool start = true;           
int s;             
unsigned long wifi_checkDelay = 20000;
unsigned long wifimilis;
int C_W_state = HIGH; 
int last_C_W_state = HIGH;
unsigned long time_last_C_W_change = 0; 
long C_W_delay = 10000;  // config delay 10 seconds - opóźnienie konfiguracji 10 sekund
WiFiClient client;
ESP8266WebServer httpServer(81);
ESPEFC httpUpdater;
const char* shost = ".org";
const char* update_path = "/";
char Supla_server[80];
char Location_id[15];
char Location_Pass[34];
char D_Link_1[61];
char T_Link_2[2];

char Supla_name[51];
char update_username[60];
char update_password[60];
byte mac[6];
bool shouldSaveConfig = false;
bool initialConfig = false;
int timeout = 180;          // seconds to run the wifi config

void saveConfigCallback () {  //callback notifying us of the need to save config
  Serial.println("Should save config");
  shouldSaveConfig = true;
}
void ondemandwifiCallback () {
  digitalWrite(status_led, LOW);
  httpServer.stop();
  WiFiManagerParameter custom_Supla_server("server", "supla server", Supla_server, 80);
  WiFiManagerParameter custom_Location_id("ID", "Location id", Location_id, 15);
  WiFiManagerParameter custom_Location_Pass("Password", "Location Pass", Location_Pass, 34);
  WiFiManagerParameter custom_D_Link_1("Linka", "D_Link 1", D_Link_1, 61);
    WiFiManagerParameter custom_T_Link_2("Linkb", "Temp_max_2", T_Link_2, 2);
  
  WiFiManagerParameter custom_Supla_name("name", "Supla Device Name", Supla_name, 51,"required");
  WiFiManagerParameter custom_update_username("userkey", "userkey", update_username, 60,"required");
  WiFiManagerParameter custom_update_password("apitoken", "apitoken", update_password, 60,"required");

  WiFiManager wifiManager;
  wifiManager.setBreakAfterConfig(true);
  wifiManager.setSaveConfigCallback(saveConfigCallback);
  
  wifiManager.addParameter(&custom_Supla_server);
  wifiManager.addParameter(&custom_Location_id);
  wifiManager.addParameter(&custom_Location_Pass);
  wifiManager.addParameter(&custom_D_Link_1);
  wifiManager.addParameter(&custom_T_Link_2);
  wifiManager.addParameter(&custom_Supla_name);
  wifiManager.addParameter(&custom_update_username);
  wifiManager.addParameter(&custom_update_password);

  wifiManager.setCustomHeadElement("<style>html{ background-color: #01DF3E;}</style><div class='s'><svg version='1.1' id='l' x='0' y='0' viewBox='0 0 200 200' xml:space='preserve'><path d='M59.3,2.5c18.1,0.6,31.8,8,40.2,23.5c3.1,5.7,4.3,11.9,4.1,18.3c-0.1,3.6-0.7,7.1-1.9,10.6c-0.2,0.7-0.1,1.1,0.6,1.5c12.8,7.7,25.5,15.4,38.3,23c2.9,1.7,5.8,3.4,8.7,5.3c1,0.6,1.6,0.6,2.5-0.1c4.5-3.6,9.8-5.3,15.7-5.4c12.5-0.1,22.9,7.9,25.2,19c1.9,9.2-2.9,19.2-11.8,23.9c-8.4,4.5-16.9,4.5-25.5,0.2c-0.7-0.3-1-0.2-1.5,0.3c-4.8,4.9-9.7,9.8-14.5,14.6c-5.3,5.3-10.6,10.7-15.9,16c-1.8,1.8-3.6,3.7-5.4,5.4c-0.7,0.6-0.6,1,0,1.6c3.6,3.4,5.8,7.5,6.2,12.2c0.7,7.7-2.2,14-8.8,18.5c-12.3,8.6-30.3,3.5-35-10.4c-2.8-8.4,0.6-17.7,8.6-22.8c0.9-0.6,1.1-1,0.8-2c-2-6.2-4.4-12.4-6.6-18.6c-6.3-17.6-12.7-35.1-19-52.7c-0.2-0.7-0.5-1-1.4-0.9c-12.5,0.7-23.6-2.6-33-10.4c-8-6.6-12.9-15-14.2-25c-1.5-11.5,1.7-21.9,9.6-30.7C32.5,8.9,42.2,4.2,53.7,2.7c0.7-0.1,1.5-0.2,2.2-0.2C57,2.4,58.2,2.5,59.3,2.5z M76.5,81c0,0.1,0.1,0.3,0.1,0.6c1.6,6.3,3.2,12.6,4.7,18.9c4.5,17.7,8.9,35.5,13.3,53.2c0.2,0.9,0.6,1.1,1.6,0.9c5.4-1.2,10.7-0.8,15.7,1.6c0.8,0.4,1.2,0.3,1.7-0.4c11.2-12.9,22.5-25.7,33.4-38.7c0.5-0.6,0.4-1,0-1.6c-5.6-7.9-6.1-16.1-1.3-24.5c0.5-0.8,0.3-1.1-0.5-1.6c-9.1-4.7-18.1-9.3-27.2-14c-6.8-3.5-13.5-7-20.3-10.5c-0.7-0.4-1.1-0.3-1.6,0.4c-1.3,1.8-2.7,3.5-4.3,5.1c-4.2,4.2-9.1,7.4-14.7,9.7C76.9,80.3,76.4,80.3,76.5,81z M89,42.6c0.1-2.5-0.4-5.4-1.5-8.1C83,23.1,74.2,16.9,61.7,15.8c-10-0.9-18.6,2.4-25.3,9.7c-8.4,9-9.3,22.4-2.2,32.4c6.8,9.6,19.1,14.2,31.4,11.9C79.2,67.1,89,55.9,89,42.6z M102.1,188.6c0.6,0.1,1.5-0.1,2.4-0.2c9.5-1.4,15.3-10.9,11.6-19.2c-2.6-5.9-9.4-9.6-16.8-8.6c-8.3,1.2-14.1,8.9-12.4,16.6C88.2,183.9,94.4,188.6,102.1,188.6z M167.7,88.5c-1,0-2.1,0.1-3.1,0.3c-9,1.7-14.2,10.6-10.8,18.6c2.9,6.8,11.4,10.3,19,7.8c7.1-2.3,11.1-9.1,9.6-15.9C180.9,93,174.8,88.5,167.7,88.5z'/></svg>");
  wifiManager.setMinimumSignalQuality(8);
  wifiManager.setConfigPortalTimeout(timeout);

    if (!wifiManager.startConfigPortal("Supla_Push")) {
      Serial.println("Not connected to WiFi but continuing anyway.");
    } else {
      
      Serial.println("connected...yeey :)");  //if you get here you have connected to the WiFi
    }
    //read updated parameters
    strcpy(Supla_server, custom_Supla_server.getValue());
    strcpy(Location_id, custom_Location_id.getValue());
    strcpy(Location_Pass, custom_Location_Pass.getValue());
    strcpy(D_Link_1, custom_D_Link_1.getValue());
     strcpy(T_Link_2, custom_T_Link_2.getValue());
    strcpy(Supla_name, custom_Supla_name.getValue());
    strcpy(update_username, custom_update_username.getValue());
    strcpy(update_password, custom_update_password.getValue());
   
  WiFi.softAPdisconnect(true);   //  close AP
}
     
            

void status_func(int status, const char *msg) {     //    ------------------------ Status --------------------------
 s=status;                                          //    -- to check if we are registered and ready before restore from memory
}
void setup() {  //------- Setup ----------------

  wifi_set_sleep_type(NONE_SLEEP_T);

  Serial.begin(115200);
  delay(200);
  pinMode(status_led,OUTPUT);
  sensors.begin();
  sensors.setResolution(12);//rozdzielczość DS-a
  
  
  EEPROM.write(1,1);
  
  if (WiFi.SSID()==""){
    initialConfig = true;
  } 
  
  WiFi.mode(WIFI_STA); // Force to station mode because if device was switched off while in access point mode it will start up next time in access point mode.

   uint8_t mac[WL_MAC_ADDR_LENGTH];
   WiFi.macAddress(mac);
   char GUID[SUPLA_GUID_SIZE] = {mac[WL_MAC_ADDR_LENGTH - 6], mac[WL_MAC_ADDR_LENGTH - 5], mac[WL_MAC_ADDR_LENGTH - 4], mac[WL_MAC_ADDR_LENGTH - 3],                                
                                 mac[WL_MAC_ADDR_LENGTH - 2], mac[WL_MAC_ADDR_LENGTH - 1], mac[WL_MAC_ADDR_LENGTH - 1], mac[WL_MAC_ADDR_LENGTH - 2], 
                                 mac[WL_MAC_ADDR_LENGTH - 3], mac[WL_MAC_ADDR_LENGTH - 4], mac[WL_MAC_ADDR_LENGTH - 5], mac[WL_MAC_ADDR_LENGTH - 6]};
          
  // ************************************************************
  SuplaDevice.addRelayButton(15, 14, INPUT_TYPE_BTN_MONOSTABLE, 0, SUPLA_BIT_RELAYFUNC_LIGHTSWITCH); 
  SuplaDevice.addDS18B20Thermometer();
// ************************************************************
  if (SPIFFS.begin()) {
    Serial.println("mounted file system");
    if (SPIFFS.exists("/config.json")) {
      Serial.println("reading config file");
      File configFile = SPIFFS.open("/config.json", "r");
      if (configFile) {
        Serial.println("opened config file");
        size_t size = configFile.size();
        std::unique_ptr<char[]> buf(new char[size]);
        configFile.readBytes(buf.get(), size);
        DynamicJsonBuffer jsonBuffer;         
        JsonObject& json = jsonBuffer.parseObject(buf.get());
        json.printTo(Serial);   //print config data to serial on startup
        if (json.success()) {
          Serial.println("\nparsed json");

          strcpy(Supla_server, json["Supla_server"]);
          strcpy(Location_id, json["Location_id"]);
          strcpy(Location_Pass, json["Location_Pass"]);
          strcpy(D_Link_1, json["D_Link_1"]);
           strcpy(T_Link_2, json["T_Link_2"]);
          strcpy(Supla_name, json["Supla_name"]);         
          strcpy(update_username, json["userkey"]);
          strcpy(update_password, json["apitoken"]);
        } else {
          Serial.println("failed to load json config");
          initialConfig = true;
        }
      }
    }
  } else {
    Serial.println("failed to mount FS");
  }
  wifi_station_set_hostname(Supla_name);  

  SuplaDevice.setStatusFuncImpl(&status_func); 
  SuplaDevice.setName(Supla_name);

  int LocationID = atoi(Location_id);
  SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    mac,               // Ethernet MAC address
                    Supla_server,      // SUPLA server address
                    LocationID,        // Location ID 
                    Location_Pass);    // Location Password                           
digitalWrite(status_led, HIGH);

}
//----------------------------------------------------------------
void loop() 
{
   
  if (digitalRead(15)==HIGH){
     
     //--------------T------------------
     temp2 = atoi(T_Link_2);  
     if (temp1<temp2){
    a1=0;
   }
  if (temp1>=temp2 && a1==0){  
    
  Pushover po = Pushover(update_password,update_username); 
  po.setDevice("Device");
  po.setMessage("Przekroczenie TEMP");
  po.setSound("echo");
  po.send();
  direct_Link(1);//--- Link 1 ------------
    a1=1;
      }
   }
  
 //-----------------------------------  
  if (initialConfig){
    ondemandwifiCallback () ;
  }
  if (shouldSaveConfig) {
    Serial.println("saving config");
    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();
    json["Supla_server"] = Supla_server;
    json["Location_id"] = Location_id;
    json["Location_Pass"] = Location_Pass;
    json["D_Link_1"] = D_Link_1;
    json["T_Link_2"] = T_Link_2;
    json["Supla_name"] = Supla_name;
    json["userkey"] = update_username;
    json["apitoken"] = update_password;
    File configFile = SPIFFS.open("/config.json", "w");
    if (!configFile) {
      Serial.println("failed to open config file for writing");
    }
    json.prettyPrintTo(Serial);
    json.printTo(configFile);
    configFile.close();
    Serial.println("config saved");
    shouldSaveConfig = false;
    initialConfig = false; 
    WiFi.mode(WIFI_STA);
    ESP.restart();
    delay(5000); 
  }
  if (WiFi.status() != WL_CONNECTED) { 
    WiFi_up();
  }
     

  int C_W_read = digitalRead(config_pin);{  
   if (C_W_read != last_C_W_state) {            
     time_last_C_W_change = millis();
   }
   if ((millis() - time_last_C_W_change) > C_W_delay) {     
     if (C_W_read != C_W_state) {     
       Serial.println("Triger sate changed");
       C_W_state = C_W_read;       
       if (C_W_state == LOW) {
        ondemandwifiCallback () ;
       }
     }
    }
   last_C_W_state = C_W_read;            
   }
   
   if (WiFi.status() == WL_CONNECTED){
    SuplaDevice.iterate();      
    if (pr_wifi == true){
    Serial.println("");
    Serial.println("CONNECTED");
    Serial.print("local IP: ");
    Serial.println(WiFi.localIP());
    Serial.print("subnetMask: ");
    Serial.println(WiFi.subnetMask());
    Serial.print("gatewayIP: ");
    Serial.println(WiFi.gatewayIP());
     long rssi = WiFi.RSSI();
    Serial.print("Signal Strength (RSSI): ");
    Serial.print(rssi);
    Serial.println(" dBm"); 
     pr_wifi = false;       
     httpUpdater.setup(&httpServer, update_path, update_username, update_password);
     httpServer.begin();
     delay(50);
    }
    if (pr_wifi == false){
     httpServer.handleClient(); 
     yield();
    
    }
   }
   }

// 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) {
    }

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 = &get_temperature;
          cb.get_temperature_and_humidity = NULL;
          cb.get_rgbw_value = NULL;
          cb.set_rgbw_value = NULL;         
          return cb;
}

void WiFi_up(){ // conect to wifi
 
  if (millis() > wifimilis)  {
  WiFi.begin();
  delay(500);
  pr_wifi = true;
  Serial.println("CONNECTING WIFI"); 
  wifimilis = (millis() + wifi_checkDelay) ;
  }
}
void direct_Link(int link_num) {
        shost = Supla_server;
        String url = "";
        
           if (link_num == 1){ url = D_Link_1;}
    
      else{return;}
      
  WiFiClientSecure dclient;
  Serial.print("connecting to ");
  Serial.println(shost);
  if (!dclient.connect(shost, 443)) {
    Serial.println("connection failed ------------------------");
    return;
  }
  Serial.print("requesting URL: ");
  Serial.println(url);
  dclient.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + shost + "\r\n" +
               "User-Agent: ESP8266\r\n" +
               "Connection: close\r\n\r\n");
  Serial.println("request sent");
  while (dclient.connected()) {
    String line = dclient.readStringUntil('\n');
    if (line == "\r") {
      Serial.println("headers received");
      break;
    }
  }
  String line = dclient.readStringUntil('}');
  line = line + "}";
  if (line.indexOf("true") >0) {
  Serial.println("reply was:");Serial.println("==========");  
  Serial.println(line);
  Serial.println("==========");Serial.println("closing connection");
        
  } else {Serial.println("failed --------------------------------");
      
  } 
}
Pushover_1_DS.png
Pushover_1_DS.png (82.42 KiB) Przejrzano 200 razy
Załączniki
Pushover_linki_1_w_T_1.ino.d1_mini.zip
(309.22 KiB) Pobrany 10 razy
Awatar użytkownika
Zibi
Posty: 197
Rejestracja: śr lip 31, 2019 9:20 am
Lokalizacja: Białogard

śr lut 26, 2020 3:18 pm

piomar2 super sprawa przetesowałem rewelacja z tymi powiadomieniami. Zasuwasz tak szybko, że nie nadążam zapisywać softów na kompie :mrgreen: . Brawo !!!!
A czy wrzucisz bez aktywacji? tylko po przekroczeniu temp wysyła powiadomienie.
piomar2
Posty: 268
Rejestracja: pt kwie 26, 2019 5:32 pm
Lokalizacja: Bukowice

śr lut 26, 2020 3:21 pm

Jak sobie życzysz. Na priva
Beku
Posty: 331
Rejestracja: wt lis 06, 2018 1:49 pm

śr lut 26, 2020 3:33 pm

Gdyby was interesował temat powiadomień supli bardziej uniwersalny (wszystkie kanały + dosyć rozbudowane warunki) to zerknijcie tutaj:


https://github.com/lukbek/supla-pushover


Można to odpalić na malinie albo innym komputerze z linuxem.

A tutaj jest wątek na forum:



https://forum.supla.org/viewtopic.php?f=9&t=6188

piomar2
Posty: 268
Rejestracja: pt kwie 26, 2019 5:32 pm
Lokalizacja: Bukowice

śr lut 26, 2020 3:36 pm

Dzięki. Nie mam linuksa ani maliny. Wszystko przede mną. Pozdrawiam
Awatar użytkownika
Elektryk Szczecin
Posty: 38
Rejestracja: pt sty 03, 2020 11:14 pm

śr lut 26, 2020 3:43 pm

Mamy drugiego elmaya PIOMAR 2.
Supla rośnie w siłę.
POZDRAWIAM
ODPOWIEDZ