cogito/ESP_STM32F4_OTA/firmware/esp32/Sblocco_NodeRED.ino

359 lines
8.6 KiB
C++

#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <HardwareSerial.h>
#include "protocol.h"
//#include "wifi_login.h"
#include "device_login.h"
#include "server_url.h"
#include <WiFiManager.h>
#define NR_TIMEOUT 30
#define WF_TIMEOUT 1
#define RXD2 16
#define TXD2 17
#define COM_BAUD 115200
HardwareSerial comSerial(1);
// Variabili globali
bool treatmentRunning = true;
uint8_t RXData;
int incomingByte;
uint8_t prev_wfConn = WL_NO_SHIELD;
uint8_t wfConn = WL_NO_SHIELD;
uint8_t prev_nrConn = 0;
uint8_t nrConn = 0;
unsigned long time1,time2;
int getRemainingTime(void);
int sendConsumedTime(uint32_t timeConsumed, const char* treatment);
bool isEnabled = false;
int timeRem = 0;
int sec_counter=0;
void setup() {
Serial.begin(115200);
comSerial.begin(COM_BAUD, SERIAL_8N1, RXD2, TXD2);
comSerial.begin(115200);
Serial.println("start");
time1=millis();
time2=millis();
WiFi.begin();
// delay (1000);
// prev_wConn = WiFi.status();
// Connessione al Wi-Fi
// Serial.print("Connessione a Wi-Fi");
/*
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
// Serial.print(".");
}
*/
// Serial.println("\nConnesso al Wi-Fi!");
/*
if (getWifiConn()==0){
Serial.println ("CONNESSO AL WIFI");
if(checkNodeRedConnection()){
Serial.println ("SERVER ONLINE");
Serial.print("TEMPO RIMANENTE: ");
int j = getRemainingTime();
Serial.println(j);
if(isEnabled){
Serial.println("UTENTE ABILITATO");
}
else{
Serial.println("UTENTE NON ABILITATO");
}
}
else{
Serial.println ("SERVER OFFLINE");
}
}
else{
Serial.println ("NON CONNESSO AL WIFI");
}
*/
}
void loop() {
time1=millis();
if(time1-time2>= 1000){
sec_counter++;
// Serial.print(".");
time2=time1;
wfConn = WiFi.status();
if(wfConn != WL_CONNECTED){
sec_counter=0;
}
if ((wfConn != prev_wfConn)){//&&((wfConn == WL_CONNECTED)||(prev_wfConn == WL_CONNECTED))){
prev_wfConn=wfConn;
if (wfConn != WL_CONNECTED){
Serial.println("connessione livello 0");
PCmd_refreshCONN(0);
}
else{
sec_counter = NR_TIMEOUT;
}
}
}
if (sec_counter >= NR_TIMEOUT){
sec_counter=0;
// Serial.print("+");
HTTPClient http;
http.begin(serverURL_getConnection);
nrConn = http.GET();
if(nrConn != prev_nrConn){
prev_nrConn = nrConn;
if (nrConn == 200) {
Serial.println("connessione livello 2");
PCmd_refreshCONN(2);
} else {
Serial.println("connessione livello 1");
PCmd_refreshCONN(1);
}
}
http.end();
}
if (comSerial.available() > 0) {
incomingByte = comSerial.read();
RXData=(uint8_t)incomingByte;
checkComData();
}
}
int getRemainingTime() {
// Controlla se siamo connessi al Wi-Fi
HTTPClient http;
http.begin(serverURL_getRemaining); // Inizializza la connessione all'endpoint
http.addHeader("Content-Type", "application/json"); // Aggiunge l'header per JSON
// Costruiamo il body JSON con le credenziali
StaticJsonDocument<200> jsonDoc;
jsonDoc["username"] = username;
jsonDoc["password"] = devicePassword;
String requestBody;
serializeJson(jsonDoc, requestBody);
int httpResponseCode = http.POST(requestBody);
if (httpResponseCode > 0) {
String response = http.getString();
StaticJsonDocument<200> responseDoc;
DeserializationError error = deserializeJson(responseDoc, response);
if (!error) {
const char* status = responseDoc["status"];
if (status && String(status) == "success") {
timeRem = responseDoc["time_remaining"];
Serial.print("TEMPO RIMANENTE: ");
Serial.println(timeRem);
http.end();
isEnabled = responseDoc["enabled"] | false;
Serial.println("UTENTE ABILITATO");
return 0;
} else {
Serial.println("UTENTE NON ABILITATO");
}
} else {
Serial.println("Errore di parsing JSON nella risposta.");
}
} else {
Serial.println("system error");
}
http.end();
return -1;
}
int getWifiConn(){
if (WiFi.status() != WL_CONNECTED) {
Serial.println ("NON CONNESSO AL WIFI");
// Serial.println("WiFi not connected!!!");
return -1;
}
Serial.println ("CONNESSO AL WIFI");
// Serial.println("WiFi connected!!!");
return 0;
}
int sendConsumedTime(uint32_t timeConsumed, const char* treatment) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
// Inizializza la connessione all'endpoint Node-RED
http.begin(serverURL_setConsumedTime);
http.setTimeout(5000);
http.addHeader("Content-Type", "application/json");
// Costruisci il payload JSON
StaticJsonDocument<200> jsonDoc;
jsonDoc["username"] = username;
jsonDoc["password"] = devicePassword;
jsonDoc["time_consumed"] = timeConsumed;
jsonDoc["treatment"] = treatment;
String jsonData;
serializeJson(jsonDoc, jsonData);
// Invia la richiesta POST
int httpResponseCode = http.POST(jsonData);
if (httpResponseCode > 0) {
String response = http.getString();
if(httpResponseCode==200){
//send ackconn
Serial.println("Sending ACK");
http.end();
return 0;
}
// Serial.println("Response: " + response);
} else {
http.end();
return -1;
// Serial.print("Error on sending POST: ");
// Serial.println(http.errorToString(httpResponseCode));
}
} else {
// Serial.println("WiFi not connected");
}
}
int checkNodeRedConnection() {
// Verifica prima di tutto la connessione WiFi
if (WiFi.status() != WL_CONNECTED) {
// Serial.println("WiFi non connesso.");
return -1; // Errore WiFi
}
HTTPClient http;
http.begin(serverURL_getConnection);
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
// Leggiamo la risposta solo se vogliamo ispezionarla
// String response = http.getString();
// Serial.print("Risposta dal server: ");
// Serial.println(response);
if (httpResponseCode == 200) {
Serial.println ("SERVER ONLINE");
// Serial.println("Connessione OK a Node-RED!");
http.end();
return 1; // Connessione riuscita
}
} else {
Serial.println ("SERVER OFFLINE");
// Serial.print("Errore di connessione HTTP: ");
// Serial.println(httpResponseCode);
}
http.end();
return 0; // Errore generico
}
WiFiManager wm; // global wm instance
WiFiManagerParameter custom_field; // global param ( for non blocking w params )
void setWiFi(){
// test custom html(radio)
const char* custom_radio_str = "<br/><label for='customfieldid'>Custom Field Label</label><input type='radio' name='customfieldid' value='1' checked> One<br><input type='radio' name='customfieldid' value='2'> Two<br><input type='radio' name='customfieldid' value='3'> Three";
new (&custom_field) WiFiManagerParameter(custom_radio_str); // custom html input
wm.addParameter(&custom_field);
wm.setSaveParamsCallback(saveParamCallback);
std::vector<const char *> menu = {"wifi","info","param","sep","restart","exit"};
wm.setMenu(menu);
// set dark theme
wm.setClass("invert");
wm.setConnectTimeout(60); // how long to try to connect for before continuing
wm.setConfigPortalTimeout(10); // auto close configportal after n seconds
bool res;
// res = wm.autoConnect(); // auto generated AP name from chipid
// res = wm.autoConnect("AutoConnectAP"); // anonymous ap
res = wm.autoConnect("AutoConnectAP","password"); // password protected ap
if(!res) {
Serial.println("Failed to connect or hit timeout");
// ESP.restart();
}
else {
//if you get here you have connected to the WiFi
Serial.println("connected...yeey :)");
}
// check for button press
Serial.println("Erasing Config, restarting");
// wm.resetSettings();
// ESP.restart();
// start portal w delay
Serial.println("Starting config portal");
wm.setConfigPortalTimeout(120);
if (!wm.startConfigPortal("OnDemandAP","password")) {
Serial.println("failed to connect or hit timeout");
delay(3000);
// ESP.restart();
} else {
//if you get here you have connected to the WiFi
Serial.println("connected...yeey :)");
}
}
String getParam(String name){
//read parameter from server, for customhmtl input
String value;
if(wm.server->hasArg(name)) {
value = wm.server->arg(name);
}
return value;
}
void saveParamCallback(){
Serial.println("[CALLBACK] saveParamCallback fired");
Serial.println("PARAM customfieldid = " + getParam("customfieldid"));
}