PitAlarmBot

PitAlarmBot, è l'evoluzione del PitAlarm e l'invio dell'allarme tramite Bot Telegram.

 

Il funzionamento di PitAlarmBot riprende le funzionalità del PitAlarm. La novità in questo caso è l'integrazione dell'allarme oltre che sul web anche su Bot Telegram. Le istruzioni e le indicazioni principali sono ricavabili da sito di Rui Santos .

Il codice è stato completamente riscritto per itegrare correttamente le librerie necessarie ed è un adattamento/integrazione dei codici prelevati dalle rispettive librerie relativamente dell'esempio BasicHTTPClient.ino (dalla libreria ESP8266HTTPClient) e dell'esempio EchoBot.ino (dalla libreria UniversalTelegramBot per ESP8266).

ozio_gallery_jgallery

Codice sorgente:


/* 
Ivano          - PitAlarmBot20_08_14 15/08/2020 -- reinserimento HTTP - SOLO PER ESP12D1mini
  PitAlarm  --> Stazione di allarme del PIT
  www.zappoco.altervista.org
*/
#define PitProgramVersion "PitAlarmBot V20_08_14 - by Zappoco"
//----------------------------------------------------------------------------------------
// Weblogger
//----------------------------------------------------------------------------------------
  //#define RV_SG_01
  #define RV_SG_02
  //#define RV_MF_01
  //#define MR_GB_01
//----------------------------------------------------------------------------------------
//  Fine settaggio
//----------------------------------------------------------------------------------------
// --> livello tanica condizionatore
#ifdef RV_SG_02
  #define PitAlarmSubDir_DEF         "RVSG"
  #define PitStation_DEF             "AL02"   //nome della stazione
  #define OnReedSwitch                // utilizza il Contatto reed
  //#define OnReedSwitchOpen          // invia l'allarme se aperto anzichè se chiuso
  #define PitStationAlarm_DEF " Allarme livello H2O tanica condizionatore";
  //#define PitStationAlarm_DEF " apertura frigo.";
  #define OnReset                     // Attiva il reset
  #define FritBoxRouter               // selezionare per usare Usare Fritz Box Rovereto
  // OnWebLogger --> onHttpClient
  #define OnWebLogger
  #define OnTelegramBotSend
  #define OnSerial                    // stampa sulla seriale
  //#define OnDebug                     // accorcia i tempi e invia mail di prova
  //#define OnPiuDebug                  // stampa maggiori dettagli sulla seriale
#endif
#ifdef OnWebLogger
  #include "Arduino.h"           //HTTP
#endif
#include "ESP8266WiFi.h"
#ifdef OnWebLogger
  #include "ESP8266WiFiMulti.h"  //HTTP
  #include "ESP8266HTTPClient.h" //HTTP
  #include "WiFiClient.h"        //HTTP
  ESP8266WiFiMulti WiFiMulti;    //HTTP
#endif
#ifdef OnTelegramBotSend
  #include 
  // ----------------------------
  // Additional Libraries - each one of these will need to be installed.
  // ----------------------------
  #include "UniversalTelegramBot.h"
  #include "ArduinoJson.h"
  // Library used for parsing Json from the API responses
  // Search for "Arduino Json" in the Arduino Library manager
  // https://github.com/bblanchon/ArduinoJson
#endif
#define PitAlarmMyHostUrl_DEF      "http://www.mySite.ext"
#ifdef FritBoxRouter
  #define MySsid     "mySSID"
  #define MyPassword "myPASSWORD"
#endif
// Initialize Wifi connection to the router
char ssid[]     = MySsid;                     // your network SSID (name)
char password[] = MyPassword;                 // your network key
#ifdef OnTelegramBotSend
  // Use @myidbot to find out the chat ID of an individual or a group
  // Also note that you need to click "start" on a bot before it can
  // message you
  #define CHAT_ID "myCHAT_ID"
  // Initialize Telegram BOT
  //#define BOTtoken "XXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"  // your Bot Token (Get from Botfather)
  WiFiClientSecure BOTclient;
  UniversalTelegramBot bot(BOTtoken, BOTclient);
#endif
//----------------------------------------------------------------------------------------
//  Fine impostazioni
//----------------------------------------------------------------------------------------
#ifdef OnDebug     
  #define intTime   60000    // setta a 1 minuto (60000 millisecondi) l'intervallo tra gli allarmi (timedelay)
  #define intReset 5         // setta a 5 le volte per il ritardo reset
#else
  #define intTime  300000    // setta a 5 minuti (300000 millisecondi) l'intervallo tra gli allarmi (timedelay)
  #define intReset 72        // setta a 72 le volte per il ritardo reset  --> 6 ore 
#endif
#if defined(PitAlarmMyHostUrl_DEF)
  String PitAlarmMyHost  =  PitAlarmMyHostUrl_DEF;
#endif
#if defined(PitAlarmSubDir_DEF)
  String PitAlarmSub  = PitAlarmSubDir_DEF;
#else
  String PitAlarmSub  = "dati";
#endif
#if defined(PitStation_DEF)
  String PitSt  = PitStation_DEF;
#else
  String PitSt  = "";
#endif
String PitAlarmDir = "/Z_PitAlarm/";
String Subject = PitProgramVersion;
String Body    = PitAlarmSub + " " + PitSt + PitStationAlarm_DEF;
//----------------------------------------------------------------------------------------
// Variabili controllo allarmi
//----------------------------------------------------------------------------------------
boolean FlagSended  = false;  // Flag di allarme inviato
boolean FlagAllarme = false;  // Flag di allarme rilevato
//----------------------------------------------------------------------------------------
// Variabili temporali
//----------------------------------------------------------------------------------------
unsigned long TimeDelay = intTime;
unsigned long TimeReset = intReset * intTime;
unsigned long TimeStart = 0;             // tempo di partenza 
unsigned long TimeUltima = 0;            // tempo ultima lettura
unsigned long TimeAdesso = 0;            // tempo della lettura
long TimeDelta  = 0;                     // differenza
unsigned long tempo;
// ---------------------------------------------------
// Variabili controllo allarme
// ---------------------------------------------------
int reedPin = 5;
int reedVal ;
void setup() {
  #ifdef OnSerial
    Serial.begin(9600);
  #endif
 #ifdef OnSerial     
    // Serial.println(Arduino);
    Serial.println("");
    Serial.println("");
    Serial.println(PitProgramVersion);
    Serial.println("---------------------------");    
    #ifdef OnPiuDebug
      Serial.print  (" OnReedSwitch       is ");
      #ifdef OnReedSwitch
        Serial.println("on");
      #else
        Serial.println("off");
      #endif
      Serial.print  (" OnReedSwitchOpen   is ");
      #ifdef OnReedSwitchOpen
        Serial.println("on");
      #else
        Serial.println("off");
      #endif
      Serial.print  (" OnDebug            is ");
      #ifdef OnDebug
        Serial.println("on");
      #else
        Serial.println("off");
      #endif
      Serial.print  (" OnPiuDebug         is ");
      #ifdef OnPiuDebug
        Serial.println("on");
      #else
        Serial.println("off");
      #endif
      Serial.println("---------------------------");
    #endif
  #endif 
  Subject = Subject + " - " + PitAlarmSub + " " + PitSt + " --> inizializzato correttamente";
  #ifdef OnTelegramBotSend
    // This is the simplest way of getting this working
    // if you are passing sensitive information, or controlling
    // something important, please either use certStore or at
    // least client.setFingerPrint
    BOTclient.setInsecure();
  #endif
  // Set WiFi to station mode and disconnect from an AP if it was Previously
  // connected
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);
  #ifdef OnSerial
    // Attempt to connect to Wifi network:
    Serial.print("Connecting Wifi: ");
    Serial.println(ssid);
  #endif
  WiFi.begin(ssid, password);    // commentato per linea HTTP
  while (WiFi.status() != WL_CONNECTED) {
    #ifdef OnSerial
      Serial.print(".");
    #endif
    delay(500);
  }
  #ifdef OnSerial
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
  #endif
  PrintAlarmData (Subject);
  FlagSended = false;
  #ifdef OnReedSwitch
    pinMode (reedPin, INPUT);  
  #endif
  TimeStart  = millis();
  TimeAdesso = TimeStart;
  TimeUltima = TimeStart;
}
void loop() {
  #ifdef OnReedSwitch
    #ifdef OnReedSwitchOpen  
      reedVal = !digitalRead(reedPin);
    #else
      reedVal = digitalRead(reedPin);
    #endif
  #endif
  if (reedVal == HIGH) {
    FlagAllarme = true;
  } else {
    FlagAllarme = false;
  }
  if (FlagAllarme ){
    PrintAlarmData (Body);
  }
  #ifdef OnReset
    TimeAdesso = millis();
    TimeDelta = TimeAdesso - TimeStart - TimeReset;
    if (TimeDelta >= 0) {
      ESP.reset();
      #ifdef OnSerial     
        Serial.println("Reset del sistema");
      #endif 
    }
  #endif
}
//--------------------------------------------------------------------------------------------------------------
// Questa funzione stampa i dati
// 
// -->  seriale
// -->  WEB
// -->  TelegramBOT
//--------------------------------------------------------------------------------------------------------------
void PrintAlarmData ( String PitAlarmString_S) {
  TimeAdesso = millis();
  TimeDelta = TimeAdesso - TimeUltima - TimeDelay;
  if (TimeDelta >= 0) {  
    FlagSended = false;  
  }
  String PitAlarmString_W = PitAlarmString_S;
  PitAlarmString_W.replace(" ", "_");
  #ifdef OnSerial     
    Serial.print (PitAlarmString_S);
  #endif
  #ifdef OnTelegramBotSend
    if (!FlagSended ){
      #ifdef OnSerial     
        Serial.print(" : [TBOT] send ok");
      #endif 
      bot.sendMessage(CHAT_ID, PitAlarmString_S, "");
      PitAlarmString_W = PitAlarmString_W + "_[TBOT]_send_ok" ;
      FlagSended = true;  
      TimeUltima = millis();
    } else{
      #ifdef OnSerial     
        Serial.print(" : [TBOT] send no");
      #endif 
    }
  #endif
  String PitAlarmUrl = PitAlarmMyHost + PitAlarmDir + "PIT_write_logs.php?P1=" + PitAlarmSub + "/" + PitSt  + "&dato=" + PitAlarmString_W;
  #ifdef OnSerial     
    #ifdef OnPiuDebug
      Serial.print   ("url: ");
      Serial.println (PitAlarmUrl);
    #endif
  #endif
  #ifdef OnWebLogger
    // wait for WiFi connection
    if ((WiFiMulti.run() == WL_CONNECTED)) {
      WiFiClient httpClient;
      HTTPClient httpServer;
      #ifdef OnSerial
        Serial.print(" : [HTTP] send ");
      #endif
      //if (httpServer.begin(httpClient, "http://www.fdt.altervista.org/Z_PitAlarm/PIT_write_logs.php?P1=RVFL/FL01&dato=FL01_inizializzato_correttamente")) {  // HTTP
      if (httpServer.begin(httpClient, PitAlarmUrl)) {  // HTTP
        #ifdef OnSerial
          Serial.println("ok");
        #endif
        #ifdef OnPiuDebug
          Serial.print("[HTTP] GET...\n");
        #endif
        // start connection and send HTTP header
        int httpCode = httpServer.GET();
        // httpCode will be negative on error
        if (httpCode > 0) {
          // HTTP header has been send and Server response header has been handled
          #ifdef OnPiuDebug
            Serial.printf("[HTTP] GET... code: %d\n", httpCode);
          #endif
          // file found at server
          if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
            String payload = httpServer.getString();
            #ifdef OnPiuDebug
              Serial.println(payload);
            #endif
          }
        } else {
          Serial.printf("[HTTP] GET... failed, error: %s\n", httpServer.errorToString(httpCode).c_str());
        }
        httpServer.end();
      } else {
        Serial.printf("[HTTP} Unable to connect\n");
      }
    }
  #endif  
}

Codice sorgente sul sito:


";
echo "dato  : " . $_GET["dato"] . "
"; echo "-----------------" . "
"; $pitSta = $_GET["P1"]; echo "pitSta : " . $pitSta . "
"; $pitDat = date("Ymd"); echo "pitDat : " . $pitDat . "
"; $pitTim = date("H:i:s"); echo "pitTim : " . $pitTim . "
"; $pitExt = substr ($_GET["P1"] , $pos3 ); $dto = $_GET["dato"]; echo "dto : " . $dto . "
"; if ($debug) { // // dummy file for debug // //$fdmm = str_replace(".txt", ".tmp" , $_GET["P1"]); $fdmm = "tmp/" . $pitSta . $pitDat . ".tmp"; $myfdmm = fopen($fdmm , 'a'); $txt = "-----------------------" . "\r\n"; $txt .= "Parametri passati" . "\r\n"; $txt .= date("d/m/Y") . "," . date("H:i:s") . "\r\n"; $txt .= "-----------------------" . "\r\n\r\n"; $txt .= "P1 = " . $_GET["P1"] . "\r\n"; $txt .= "dato = " . $_GET["dato"] . "\r\n"; $txt .= "Time = " . $_GET["Time"] . "\r\n\r\n"; $txt .= "-----------------------" . "\r\n\r\n"; fwrite($myfdmm, $txt); } // // analisi di dato // /* $dto = $_GET["dato"]; $posCTR = strpos($dto, " "); echo "posCTR : " . $posCTR . "
"; if ($posCTR !== false){ $pitTip = substr ($dto , 0, $posCTR); $dto = substr ($dto , $posCTR+1); } else { $pitTip = "dati"; } echo "pitTip : " . $pitTip . "
"; echo "dto : " . $dto . "
"; */ // if ($debug) { $txt = "P1 = " . $_GET["P1"] . "\r\npos1 = " . $pos1 . "\r\npos2 = " . $pos2 . "\r\npitDir = " . $pitDir . "\r\npitSta = " . $pitSta . "\r\npitDat = " . $pitDat . "\r\npitExt = " . $pitExt . "\r\n"; $txt .= "dato = " . $_GET["dato"] . "\r\ntipodato = " . $pitTip . "\r\npos = " . $pos . "\r\nfdato1 = " . $dato1 . "\r\nfdato2 = " . $dato2 . "\r\nfdato3 = " . $dato3 . "\r\n\r\n"; fwrite($myfdmm, $txt); } // // creazione del file csv // $fgch = $pitSta . "_" . $pitDat . ".csv"; $fgcp = $pitSta . ".txt"; // echo "csv : " . $fgch . "
"; echo "txt : " . $fgcp . "
"; echo "-----------------" . "
"; $myfile = fopen($fgch, 'a'); // $txt = date("d/m/Y") . "," . $pitTim . "," . $dto . "\r" ; // \n"; fwrite($myfile, $txt); fclose($myfile); copy($fgch,$fgcp); ?>

Cosa serve:

  • ESp8266 - ESP-12d1 mini
  • Sensore reed di livello H2O
  • Resistenza da 10kOhm
  • cavetti

Scarica tutto quello che serve: