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).
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