#if defined(ESP32)
#include <WiFiMulti.h>
WiFiMulti wifiMulti;
#define DEVICE "ESP32"
#elif defined(ESP8266)
#include <ESP8266WiFiMulti.h>
//ESP8266WiFiMulti wifiMulti;
#define DEVICE "ESP32"
#endif
#include <InfluxDbClient.h>
#include <InfluxDbCloud.h>
#include "PubSubClient.h"
#include <WiFi.h>
// WiFi AP SSID
#define WIFI_SSID "Wokwi-GUEST"
// WiFi password
#define WIFI_PASSWORD ""
#define INFLUXDB_URL "http://10.10.0.2:8086"
//#define INFLUXDB_URL "http://127.0.0.1:8086"
#define INFLUXDB_TOKEN "admin_token"
//#define INFLUXDB_TOKEN "7qYKM5eOTlCqNutCXtKNcsReNZokpvt-EMe4pfFMqO7_KwOmQMu_eORhtrtJIOkgArKlgflBz4DB35d9dcJ1PA=="
#define INFLUXDB_ORG "pser_umu"
//#define INFLUXDB_ORG "d67ed7c92fb91850"
#define INFLUXDB_BUCKET "pser_umu_bucket"
#define INFLUX_DB_NAME "db0"
// Time zone info
#define TZ_INFO "CET-1CEST,M3.5.0,M10.5.0/3"
const char * user = "Pserwokwi!";
const char * passwd = "Pserwokwi!";
const char * mqttBroker = "mqtt-dashboard.com";
const char * topic = "testtopic/sensoresMON";
int port = 1883;
WiFiClient wifiClient;
PubSubClient pubSubClient(wifiClient);
// Declare InfluxDB client instance with preconfigured InfluxCloud certificate
InfluxDBClient client(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN/*, InfluxDbCloud2CACert*/);
//InfluxDBClient client(INFLUXDB_URL, INFLUX_DB_NAME);
// Declare Data point
Point sensor("sensores");
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
/*TODO Procesar JSON
{temp:20.1,luz:10.3}
*/
char * tempValue = new char[10];
char * luzValue = new char[10];
char * msg = (char*)payload;
procesarJson(msg, tempValue, luzValue);
Serial.println(tempValue);
Serial.println(luzValue);
sensor.clearFields();
//TODO cambiar por temperatura / luz
sensor.addField("temperatura", tempValue);
sensor.addField("luminosidad", luzValue);
//Check WiFi connection and reconnect if needed
if (wifiMulti.run() != WL_CONNECTED) {
Serial.println("Wifi connection lost");
setupWifi();
}
Serial.print("Writing to InfluxDB: ");
Serial.println(client.pointToLineProtocol(sensor));
// Write point
if (!client.writePoint(sensor)) {
Serial.print("InfluxDB write failed: ");
Serial.println(client.getLastErrorMessage());
}
}
void setupWifi(){
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Not connected. Retrying in 500ms");
}
Serial.println("Connected");
}
void setup() {
Serial.begin(9600);
setupWifi();
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
reconnect();
// Accurate time is necessary for certificate validation and writing in batches
// We use the NTP servers in your area as provided by: https://www.pool.ntp.org/zone/
// Syncing progress and the time will be printed to Serial.
//timeSync(TZ_INFO, "es.pool.ntp.org", "es.pool.ntp.org");
//timeSync(TZ_INFO, "pool.ntp.org", "time.nis.gov");
client.setInsecure();
//Check server connection
if (client.validateConnection()) {
Serial.print("Connected to InfluxDB: ");
Serial.println(client.getServerUrl());
} else {
Serial.print("InfluxDB connection failed: ");
Serial.println(client.getLastErrorMessage());
}
//Tags fijos del DataPoint
sensor.addTag("device", DEVICE);
sensor.addTag("SSID", WiFi.SSID());
}
void loop() {
delay(1000);
if(!pubSubClient.connected()){
reconnect();
}
pubSubClient.loop();
delay(100);
//sensor.clearFields();
}
void reconnect(){
//Conexion a broker MQTT
pubSubClient.setServer(mqttBroker, port);
pubSubClient.setCallback(callback);
String idCliente = "esp32-client-PSERAdaptadorInflux";
while(!pubSubClient.connected()){
Serial.println("Trying to connect to HiveMQ Broker");
//idCliente = idCliente + String(WiFi.macAddress());
if(pubSubClient.connect(idCliente.c_str(), NULL, NULL)){
Serial.println("Connected to HiveMQ Broker");
}
else{
Serial.println("Failed to connect to HiveMQ Broker. Retrying in 3s");
Serial.println(pubSubClient.state());
delay(3000);
}
}
if(pubSubClient.subscribe(topic)){
Serial.println("Subscribed successfully");
}
else{
Serial.println("Subscribing failed");
}
}
void procesarJson(char * msgJson, char * temp, char * luz){
int i = 0;
while(msgJson[i] != ':'){
i++;
}
i++;
int j = 0;
while(msgJson[i] != ','){ //Valor temp
temp[j] = msgJson[i];
i++;
j++;
}
temp[j] = '\0';
while(msgJson[i] != ':'){
i++;
}
i++;
j=0;
while(msgJson[i] != '}'){
luz[j] = msgJson[i];
i++;
j++;
}
luz[j] = '\0';
}