Version inicial

main
Gerardo 2024-09-26 09:59:48 +02:00
commit f1070e030c
18 changed files with 1352 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/.vs/*

View File

@ -0,0 +1,8 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
"version": "0.2.0",
"configurations": [
]
}

View File

@ -0,0 +1,40 @@
#ifndef DomoEspConfigDef
#define DomoEspConfigDef 1
#include <Arduino.h>
#include "defines.h"
class DomoEspConfig
{
public:
char ssidWifi[24];//nombre wifi al que conectar
char keyWifi[32];//key wifi a conectar
char ideEsp[32];//identificador unico por esp
char hostMQTT[16];
int portMQTT;
int velocidadPortSerie;
int refresTimeVars;//tiempo de refresco en segundos de las variables
int refresTimeSens;//tiempo de refresco en segundos de los sensores
DomoEspConfig()
{
velocidadPortSerie=115200;
strcpy(ssidWifi,"Idhun");//nombre wifi
strcpy(keyWifi,"Ardileorca1234.");//key wifi
strcpy(ideEsp,"Esp8266_noName");//idenitificador del esp (sera único)
strcpy(hostMQTT,"192.168.2.50");//servidor mqttBroker
portMQTT=1883;//puerto del servidor mqtt Broker
refresTimeVars=30;//tiempo de refresco en segundos de las variables
refresTimeSens=5;//tiempo de refresco en segundos de los sensores
}
virtual void inicia(ISensorManager* man)
{
}
};
#endif

View File

@ -0,0 +1,11 @@
#include "DomoEspSensorManager.h"
#include "configuracionActual.h"
DomoEspManager manager;
void setup() {
manager.inicia(&ConfiguracionActual);
}
void loop() {
manager.loop();
}

View File

@ -0,0 +1,155 @@
#include "DomoEspConfig.h"
#include "DomoEspSensorManager.h"
DomoEspManager::DomoEspManager()
{
clienteMqtt.setClient(espClient);
n=0;
tiempo=0;
suscrito=false;
tiempo_sens=0;
SetTimeRefres(15);
}
void DomoEspManager::SetTimeRefres(int seg)
{
incre_tsens=seg*1000;
}
void DomoEspManager::inicia(DomoEspConfig* cnf)
{
conf=cnf;
#ifdef DEBUG_PS
Serial.begin(conf->velocidadPortSerie);
delay(100);
Serial.println("");
Serial.println("Iniciando");
#endif
#ifdef DEBUG_PS
Serial.println("Inicia Wifi");
#endif
wifi.inicia(&espClient, conf->ssidWifi, conf->keyWifi, conf->ideEsp);
#ifdef DEBUG_PS
Serial.println("Inicia Mqtt");
#endif
mqtt.inicia(&clienteMqtt,conf->ideEsp, conf->hostMQTT, conf->portMQTT, this);
#ifdef DEBUG_PS
Serial.println("Configura Sensores");
#endif
conf->inicia(this);
//pasar funcion de configuracion de añadir sensores
for(int i=0; i<n; i++)
{
sensores[i]->inicia();
}
}
void DomoEspManager::loop()
{
if(!wifi.loop())
{
suscrito=false;
return;
}
if(!mqtt.loop())
{
suscrito=false;
return;
}
if(!suscrito)
{
for(int i=0; i<n; i++)
{
sensores[i]->SubscribeMqtt(this);
}
suscrito=true;
}
int tiempoAux=0;
if(MqttUtiles::pasa_incre(&tiempo_sens, incre_tsens))
{
tiempo=(tiempo+1)%2;
tiempoAux=tiempo+1;
#ifdef DEBUG_PS
Serial.print("Procesa Tiempo: ");
Serial.print(tiempoAux);
Serial.println("------------ ");
#endif
}
for(int i=0; i<n; i++)
{
sensores[i]->procesa(this, tiempoAux);
}
#ifdef DEBUG_PS
if(tiempoAux>0)
Serial.println("----------------------------- ");
#endif
}
void DomoEspManager::OnMqtt(char* topic, char* payload)
{
char buf[MAXTOPICVAR];
strcpy(buf, topic);
int nt=strlen(buf);
if(nt<4)
{
#ifdef DEBUG_PS
Serial.print("se descarta por topic corto:");
Serial.println(buf);
#endif
return;
}
int tipo=Topic::NO_RECONOCIDO;
if(!strcmp("/get", &buf[nt-4]))
tipo=Topic::GET;
else if(!strcmp("/set", &buf[nt-4]))
tipo=Topic::SET;
else if(!strcmp("/pul", &buf[nt-4]))
tipo=Topic::PUL;
if(tipo!=Topic::NO_RECONOCIDO)
buf[nt-4]=0;
#ifdef DEBUG_PS
Serial.print("OnMqtt ");
Serial.print(topic);
Serial.print(" -> ");
Serial.println(payload);
#endif
for(int i=0; i<n; i++)
{
sensores[i]->OnMqtt(this, buf, payload, tipo);
}
}
void DomoEspManager::SubscribeMqtt(PubSubClient *client_mqtt)
{
for(int i=0; i<n; i++)
{
sensores[i]->SubscribeMqtt(this);
}
}
void DomoEspManager::MqttSend(char* topic, char* payload)
{
clienteMqtt.publish(topic, payload);
}
void DomoEspManager::MqttSubs(char* topic)
{
clienteMqtt.subscribe(topic);
}
void DomoEspManager::Add(DomoEspSensorReceiver* sensor)
{
if(n<MAXSENS)
{
sensores[n]=sensor;
n++;
}
}

View File

@ -0,0 +1,51 @@
#ifndef DomoEspManagerDef
#define DomoEspManagerDef 1
#include <PubSubClient.h>
#include <ESP8266WiFi.h>
#include "utiles.h"
class DomoEspConfig;
class IDomoEspLisener
{
public:
void inicia();
void loop();
virtual void OnMqtt(char* topic, char* payload);
virtual bool SubscribeMqtt(char *topic);
};
class DomoEspManager: public MqttReceiver, public IMqttManager, public ISensorManager
{
WifiManager wifi;
DomoEspConfig* conf;
WiFiClient espClient;
PubSubClient clienteMqtt;
MqttManager mqtt;
DomoEspSensorReceiver* sensores[MAXSENS];
int n;
int tiempo;
bool suscrito;
unsigned long tiempo_sens;
unsigned long incre_tsens;
public:
DomoEspManager();
//funcion inicial
void SetTimeRefres(int seg);
void inicia(DomoEspConfig* cnf);
void loop();
//funciones auxiliares
virtual void OnMqtt(char* topic, char* payload);
virtual void SubscribeMqtt(PubSubClient *client_mqtt);
virtual void MqttSend(char* topic, char* payload);
virtual void MqttSubs(char* topic);
virtual void Add(DomoEspSensorReceiver* sensor);
};
#endif

View File

@ -0,0 +1,120 @@
#ifndef MecanismoPulsoDef
#define MecanismoPulsoDef 1
#include "defines.h"
//sensor activador envia a topicOut el valor val_send si los activadores cumplen umbral
class Cactivador
{
public:
Cactivador(){}
DomoEspSensorReceiver *sen;
float umbral;
char operacion;//< > = val oper umbral
};
#define MAX_ACTIVADORES 5
class MecanismoPulso: public DomoEspSensorReceiver
{
float val;
char topicOut[MAXTOPICVAR];
char valSend[3];
Cactivador activador[MAX_ACTIVADORES];
public:
char id[10];
MecanismoPulso()
{
strcpy(id, "Meca");
topic[0]=0;
for(int i=0; i<MAX_ACTIVADORES; i++)
{
activador[i].sen=0;
}
}
void set(char* topic_id, char* topic_id_out, int valdef)
{
val=valdef;
strcpy(topic, topic_id);
strcpy(topicOut, topic_id_out);
}
void AddActivador(DomoEspSensorReceiver *sen, char oper, float umbral)
{
for(int i=0; i<MAX_ACTIVADORES; i++)
{
if(!activador[i].sen)
{
activador[i].sen=sen;
activador[i].operacion=oper;
activador[i].umbral=umbral;
}
}
}
void setValSend(char* _valSend)
{
strcpy(valSend, _valSend);
}
virtual float getVal()
{
return val;
}
virtual void SubscribeMqtt(IMqttManager* man){
//char buffer_t[MAXTOPICVAR];
sprintf(buffer_t, "%s/get",topic);
man->MqttSubs(buffer_t);
sprintf(buffer_t, "%s/pul",topic);
man->MqttSubs(buffer_t);
}
virtual void OnMqtt(IMqttManager * man, char* _topic, char* payload, int tipo)
{
if(strcmp(_topic, topic))
return;
if(tipo==Topic::GET)
{
float val_act=atof(payload);
if (val_act!=val)
{
val=val_act;
ejecuta(man);
}
}
else if(tipo==Topic::PUL)
{
ejecuta(man);
}
}
private:
void ejecuta(IMqttManager * man)
{
if(valida())
{
#ifdef DEBUG_PS
Serial.print("Ejecuta id: ");
Serial.println(id);
#endif
strcpy(buffer_p, valSend);
sprintf(buffer_t, "%s/set",topicOut);
man->MqttSend(buffer_t, buffer_p);
}
}
bool valida()
{
for(int i=0; i<MAX_ACTIVADORES; i++)
{
if(activador[i].sen && !opera(i))
return false;
}
return true;
}
bool opera( int i)
{
if(activador[i].operacion=='>')
return activador[i].sen->getVal()>activador[i].umbral;
if(activador[i].operacion=='<')
return activador[i].sen->getVal()<activador[i].umbral;
if(activador[i].operacion=='=')
return activador[i].sen->getVal()==activador[i].umbral;
return false;
}
};
#endif

57
DomoEspSensor/SensorAin.h Normal file
View File

@ -0,0 +1,57 @@
#ifndef SensorAinDef
#define SensorAinDef 1
#include "utiles.h"
class SensorAin: public DomoEspSensorReceiver
{
float val;
bool negado;
uint8_t pin;
float dif;
unsigned long t;
unsigned long incre;
public:
virtual float getVal()
{
return val;
}
SensorAin(){}
void set(uint8_t _pin, char* topic_id, bool _negado, float _dif)
{
t=0;
incre=1000;
dif=_dif;
negado=_negado;
pin=_pin;
val=0;
strcpy(topic, topic_id);
}
virtual void procesa(IMqttManager * man, int tiempo)
{
//mirar para configurar por interrupcion
if((dif!=0 && MqttUtiles::pasa_incre(&t, incre)) || tiempo==2)
{
float val_act;
if(negado)
val_act =100.*((float)(1024- analogRead(pin)))/1024;
else
val_act =100.*((float)(analogRead(pin)))/1024;
if(dif<=abs(val_act-val) || tiempo==2)
{
val=val_act;
#ifdef DEBUG_PS
Serial.print("Sensor Analog log ");
Serial.println(val);
#endif
//loguea------------
dtostrf(val,3, 2, buffer_p);
sprintf(buffer_t, "%s/get",topic);
man->MqttSend(buffer_t, buffer_p);
}
}
}
};
#endif

66
DomoEspSensor/SensorDHT.h Normal file
View File

@ -0,0 +1,66 @@
#ifndef SensorDHTDef
#define SensorDHTDef 1
#include "defines.h"
#include <SimpleDHT.h>
class SensorDHT: public DomoEspSensorReceiver
{
SimpleDHT22 dht;
uint8_t pin;
float t,h;
public:
virtual float getVal()
{
return t;
}
SensorDHT()
{
pin=0;
t=h=0;
topic[0]=0;
}
void set(uint8_t _pin, char* topic_id)
{
pin=_pin;
t=h=0;
strcpy(topic, topic_id);
}
virtual void procesa(IMqttManager * man, int tiempo)
{
if(tiempo==0)
return;
#ifdef DEBUG_PS
Serial.println("ProcesaDHT");
#endif
for(int i=0; i<4; i++)
{
if (dht.read2(pin, &t, &h, NULL) != SimpleDHTErrSuccess)
{
delay(20);
continue;
}
break;
}
if(tiempo==2)
{
#ifdef DEBUG_PS
Serial.println("LogDHT");
#endif
//loguea------------
//char buffer_t[MAXTOPICVAR];
//char buffer_p[MAXTOPICVAR];
//temperatura-----------------
dtostrf(t,3, 2, buffer_p);
sprintf(buffer_t, "%s/t/get",topic);
man->MqttSend(buffer_t, buffer_p);
//humedad-----------------
dtostrf(h,3, 2, buffer_p);
sprintf(buffer_t, "%s/h/get",topic);
man->MqttSend(buffer_t, buffer_p);
}
}
};
#endif

47
DomoEspSensor/SensorDin.h Normal file
View File

@ -0,0 +1,47 @@
#ifndef SensorDinDef
#define SensorDinDef 1
#include "defines.h"
class SensorDin: public DomoEspSensorReceiver
{
bool val;
uint8_t pin;
public:
virtual float getVal()
{
return (float)val;
}
SensorDin(){}
void set(uint8_t _pin, char* topic_id)
{
pin=_pin;
val=0;
strcpy(topic, topic_id);
}
virtual void procesa(IMqttManager * man, int tiempo)
{
//mirar para configurar por interrupcion
int val_ac=digitalRead(pin);
if(tiempo==2 || val_ac!=val)
{
val=val_ac;
//loguea------------
//char buffer_t[MAXTOPICVAR];
//char buffer_p[MAXTOPICVAR];
sprintf(buffer_p, "%d", (int)val);
sprintf(buffer_t, "%s/get",topic);
man->MqttSend(buffer_t, buffer_p);
}
}
virtual void inicia()
{
pinMode(pin, INPUT);
val=digitalRead(pin);
}
};
#endif

View File

@ -0,0 +1,78 @@
#ifndef SensorDoutDef
#define SensorDoutDef 1
#include "defines.h"
class SensorDout: public DomoEspSensorReceiver
{
bool val;
uint8_t pin;
public:
virtual float getVal()
{
return (float)val;
}
SensorDout()
{
pin=0;
val=0;
topic[0]=0;
}
void set(uint8_t _pin, char* topic_id, bool valdef)
{
pin=_pin;
val=valdef;
strcpy(topic, topic_id);
}
virtual void procesa(IMqttManager * man, int tiempo)
{
if(tiempo==2)
{
#ifdef DEBUG_PS
Serial.print("LogDout ");
Serial.println(val);
#endif
//loguea------------
//char buffer_t[MAXTOPICVAR];
//char buffer_p[MAXTOPICVAR];
sprintf(buffer_p, "%d", (int)val);
sprintf(buffer_t, "%s/get",topic);
man->MqttSend(buffer_t, buffer_p);
}
}
virtual void inicia()
{
pinMode(pin, OUTPUT);
digitalWrite(pin, val);
}
virtual void SubscribeMqtt(IMqttManager* man){
//char buffer_t[MAXTOPICVAR];
sprintf(buffer_t, "%s/set",topic);
man->MqttSubs(buffer_t);
}
virtual void OnMqtt(IMqttManager * man, char* _topic, char* payload, int tipo)
{
if(tipo!=Topic::SET)
return;
if(!strcmp(_topic, topic))
{
if(payload[0]=='X')
val=!val;
else
val=(atoi(payload)==1);
//cambia estado relle
digitalWrite(pin, val);
//loguea------------
//char buffer_t[MAXTOPICVAR];
//char buffer_p[MAXTOPICVAR];
sprintf(buffer_p, "%d", (int)val);
sprintf(buffer_t, "%s/get",topic);
man->MqttSend(buffer_t, buffer_p);
}
};
};
#endif

View File

@ -0,0 +1,51 @@
#ifndef SensorPulsanteDef
#define SensorPulsanteDef 1
#include "defines.h"
//sensor que avisa del cambio cuando deja de ser el valor por defecto
class SensorPulsante: public DomoEspSensorReceiver
{
bool val;
bool valDef;
uint8_t pin;
public:
virtual float getVal()
{
return (float)val;
}
SensorPulsante()
{}
void set(uint8_t _pin, char* topic_id, bool _valDef)
{
pin=_pin;
valDef=_valDef;
val=valDef;
strcpy(topic, topic_id);
}
virtual void procesa(IMqttManager * man, int tiempo)
{
//mirar para configurar por interrupcion
int val_ac=digitalRead(pin);
if(val_ac!=val && val_ac!=valDef)
{
#ifdef DEBUG_PS
Serial.println("SensorPulsante log ");
#endif
//loguea------------
sprintf(buffer_p, "%d", (int)val_ac);
sprintf(buffer_t, "%s/pul",topic);
man->MqttSend(buffer_t, buffer_p);
delay(100);
}
val=val_ac;
}
virtual void inicia()
{
pinMode(pin, INPUT);
val=digitalRead(pin);
}
};
#endif

41
DomoEspSensor/SensorRF.h Normal file
View File

@ -0,0 +1,41 @@
#ifndef SensorRFDef
#define SensorRFDef 1
#include "defines.h"
//sensor Replica, sensor interno que se setea con get y no se publica
class SensorRF: public DomoEspSensorReceiver
{
float val;
public:
SensorRF()
{
val=0;
topic[0]=0;
}
void set(char* topic_id, float valdef)
{
val=valdef;
strcpy(topic, topic_id);
}
virtual float getVal()
{
return (float)val;
}
virtual void SubscribeMqtt(IMqttManager* man){
//char buffer_t[MAXTOPICVAR];
sprintf(buffer_t, "%s/get",topic);
man->MqttSubs(buffer_t);
}
virtual void OnMqtt(IMqttManager * man, char* _topic, char* payload, int tipo)
{
if(tipo!=Topic::GET)
return;
if(!strcmp(_topic, topic))
{
val=atof(payload);
}
}
};
#endif

64
DomoEspSensor/SensorVD.h Normal file
View File

@ -0,0 +1,64 @@
#ifndef SensorVDDef
#define SensorVDDef 1
#include "defines.h"
//sensor virtual
class SensorVD: public DomoEspSensorReceiver
{
bool val;
public:
SensorVD()
{
val=0;
topic[0]=0;
}
void set(char* topic_id, bool valdef)
{
val=valdef;
strcpy(topic, topic_id);
}
virtual float getVal()
{
return (float)val;
}
virtual void procesa(IMqttManager * man, int tiempo)
{
if(tiempo==2)
{
#ifdef DEBUG_PS
Serial.print("LogSV ");
Serial.println(val);
#endif
//loguea------------
//char buffer_t[MAXTOPICVAR];
//char buffer_p[MAXTOPICVAR];
sprintf(buffer_p, "%d", (int)val);
sprintf(buffer_t, "%s/get",topic);
man->MqttSend(buffer_t, buffer_p);
}
}
virtual void SubscribeMqtt(IMqttManager* man){
//char buffer_t[MAXTOPICVAR];
sprintf(buffer_t, "%s/set",topic);
man->MqttSubs(buffer_t);
}
virtual void OnMqtt(IMqttManager * man, char* _topic, char* payload, int tipo)
{
if(tipo!=Topic::SET)
return;
if(!strcmp(_topic, topic))
{
if(payload[0]=='X')
val=!val;
else
val=(atoi(payload)==1);
sprintf(buffer_p, "%d", (int)val);
sprintf(buffer_t, "%s/get",topic);
man->MqttSend(buffer_t, buffer_p);
}
}
};
#endif

227
DomoEspSensor/Utiles.cpp Normal file
View File

@ -0,0 +1,227 @@
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <PubSubClient.h>
#include <SPI.h>
#include "Utiles.h"
//**************************************************************************************************************************************************
bool MqttUtiles::pasa_incre( unsigned long *tt, unsigned long incre)
{
unsigned long t=millis();
if(t<*tt)
{
*tt=t;
return true;
}
if((*tt+incre)>=t)
return false;
*tt=t;
return true;
}
bool MqttUtiles::pasa_incre( volatile unsigned long *tt, unsigned long incre)
{
unsigned long t=millis();
if(t<*tt)
{
*tt=t;
return true;
}
if((*tt+incre)>=t)
return false;
*tt=t;
return true;
}
void MqttUtiles::resetFunc()
{
ESP.wdtEnable(1);
while(1){};
}
//**************************************************************************************************************************************************
WifiManager::WifiManager()
{
}
void WifiManager::inicia( WiFiClient *espclient,char *ssid, char* key, char *idArdu)
{
espClient= espclient;
strcpy(nred, ssid);
strcpy(pass, key);
strcpy(idArduino,idArdu);
conecta();
//return WiFi.status() == WL_CONNECTED;
}
bool WifiManager::conecta()
{
#ifdef DEBUG_PS
Serial.println("Conectando wifi");
Serial.println(nred);
Serial.println(pass);
#endif
WiFi.mode(WIFI_STA);
WiFi.begin(nred, pass);
for(int i=0; i<100 && WiFi.status() != WL_CONNECTED; i++)
{
delay(500);
#ifdef DEBUG_PS
Serial.print(".");
#endif
}
#ifdef DEBUG_PS
Serial.println("");
if(WiFi.status() == WL_CONNECTED)
Serial.println("Wifi Conectado");
else
{
Serial.println("No se pudo conectar");
}
#endif
if(WiFi.status() != WL_CONNECTED)
return false;
//ota----------------------------------
// Port defaults to 8266
// ArduinoOTA.setPort(8266);
// Hostname defaults to esp8266-[ChipID]
ArduinoOTA.setHostname(idArduino);
// No authentication by default
// ArduinoOTA.setPassword("admin");
// Password can be set with it's md5 value as well
// MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
// ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");
ArduinoOTA.onStart([]() {
String type;
if (ArduinoOTA.getCommand() == U_FLASH) {
type = "sketch";
} else { // U_FS
type = "filesystem";
}
#ifdef DEBUG_PS
// NOTE: if updating FS this would be the place to unmount FS using FS.end()
Serial.println("Start updating " + type);
#endif
});
ArduinoOTA.onEnd([]() {
Serial.println("\nEnd");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
#ifdef DEBUG_PS
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
#endif
});
ArduinoOTA.onError([](ota_error_t error) {
#ifdef DEBUG_PS
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) {
Serial.println("Auth Failed");
} else if (error == OTA_BEGIN_ERROR) {
Serial.println("Begin Failed");
} else if (error == OTA_CONNECT_ERROR) {
Serial.println("Connect Failed");
} else if (error == OTA_RECEIVE_ERROR) {
Serial.println("Receive Failed");
} else if (error == OTA_END_ERROR) {
Serial.println("End Failed");
}
#endif
});
ArduinoOTA.begin();
#ifdef DEBUG_PS
Serial.println("Ready");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
#endif
return true;
}
bool WifiManager::loop()
{
if((WiFi.status() == WL_CONNECTED))
{
ArduinoOTA.handle();
return true;
}
#ifdef DEBUG_PS
Serial.println("Fallo de conexion, se reinicia arduino");
#endif
ESP.reset();
return false;
}
//**************************************************************************************************************************************************
MqttManager::MqttManager()
{
}
void MqttManager::inicia(PubSubClient *mqttClient,char *ideEsp, char *host, int port, MqttReceiver* classReceiver)
{
strcpy(idEsp,ideEsp);
Mqttlistener=classReceiver;
client_mqtt=mqttClient;
client_mqtt->setServer(host, port);
client_mqtt->setCallback(MqttManager::OnMqtt);
}
bool MqttManager::loop()
{
if(client_mqtt->loop())
return true;
#ifdef DEBUG_PS
if(WiFi.status() == WL_CONNECTED)
Serial.println("Conectando a broker");
#endif
if(client_mqtt->connect(idEsp))
{
#ifdef DEBUG_PS
if(WiFi.status() == WL_CONNECTED)
Serial.println("Conectado a broker");
#endif
subscribe_mqtt();
return true;
}
#ifdef DEBUG_PS
Serial.println("Fallo de conexion, se reinicia arduino");
#endif
ESP.reset();
return false;
}
void MqttManager::subscribe_mqtt()
{
if(Mqttlistener==NULL)
return;
Mqttlistener->SubscribeMqtt(client_mqtt);
}
//auxiliar------------------
void MqttManager::OnMqtt(char* topic, byte* payload, unsigned int length)
{
if(Mqttlistener==NULL)
return;
int i;
char buf[MAXTOPICVAR];
i= MAXTOPICVAR-1;
if(i>length)
i=length;
memcpy(buf, payload, i);
buf[i]=0;
Mqttlistener->OnMqtt(topic, buf);
}
//**************************************************************************************************************************************************

66
DomoEspSensor/Utiles.h Normal file
View File

@ -0,0 +1,66 @@
#ifndef UtilesDef
#define UtilesDef 1
#include "defines.h"
class PubSubClient;
class WiFiClient;
class MqttUtiles
{
public:
static bool pasa_incre( unsigned long *tt, unsigned long incre);
static bool pasa_incre( volatile unsigned long *tt, unsigned long incre);
static void resetFunc();
};
class MqttOnVarChangeListenner
{
public:
virtual void OnVarChange(int ivar)=0;
};
class WifiManager
{
public:
char nred[32];
char pass[32];
char idArduino[32];
WiFiClient *espClient;
WifiManager();
bool conecta();
void inicia( WiFiClient *espClient, char *ssid, char* key, char *idArduino);
bool loop();
};
static MqttReceiver* Mqttlistener;
class MqttManager
{
public:
private:
char idEsp[32];
public:
PubSubClient *client_mqtt;
MqttReceiver *mqttlisener;
MqttManager();
/*
WiFiClient espClient;//conexion a wifi
PubSubClient client_qqtt(espClient);//para conexion con mqtt
*/
void inicia(PubSubClient *mqttClient,char *ideEsp, char *host, int port, MqttReceiver* classReceiver);
bool loop();
//void desconecta();
//auxiliar------------------
static void OnMqtt(char* topic, uint8_t * payload, unsigned int length);
void subscribe_mqtt();
};
#endif

View File

@ -0,0 +1,175 @@
#ifndef DomoConfActualDef
#define DomoConfActualDef 1
#include "DomoEspConfig.h"
#include "SensorDout.h"
#include "SensorDHT.h"
#include "SensorDin.h"
#include "SensorPulsante.h"
#include "SensorAin.h"
#include "SensorVD.h"
#include "SensorRF.h"
#include "MecanismoPulso.h"
//----------------------------------------------------------------------------------------------------------------------------------------------
class AutomatismoPulsador//automatismo para encender luz con interruptor o pulsador
{
MecanismoPulso pulsador;//cambia estado con pulsador
public:
AutomatismoPulsador(){}
void inicia(ISensorManager* man, DomoEspSensorReceiver* tp_pul, DomoEspSensorReceiver* tpOut, DomoEspSensorReceiver* bloqueo=NULL )
{
inicia(man, tp_pul->topic, tpOut->topic, bloqueo);
}
void inicia(ISensorManager* man, char* tp_pul, char* tpOut, DomoEspSensorReceiver* bloqueo=NULL )
{
pulsador.set(tp_pul, tpOut, 0);
pulsador.setValSend("X");
if(bloqueo)
{
pulsador.AddActivador(bloqueo,'>',0);
}
man->Add(&pulsador);
}
};
class AutomatismoPresencia//automatismo para encender luz con presencia
{
MecanismoPulso presenciaOn;
MecanismoPulso presenciaOff;
MecanismoPulso nivelLuzOff;
float fnivelLuz;
public:
AutomatismoPresencia()
{
fnivelLuz=50;
strcpy(presenciaOn.id, "PresOn");
strcpy(presenciaOff.id, "PresOff");
strcpy(nivelLuzOff.id, "luzOff");
}
void inicia(ISensorManager* man, DomoEspSensorReceiver* presencia, DomoEspSensorReceiver* nivelluz, DomoEspSensorReceiver* out, DomoEspSensorReceiver* bloqueo=NULL )
{
presenciaOn.set(presencia->topic, out->topic, 0);
presenciaOn.setValSend("1");
presenciaOn.AddActivador(nivelluz,'<',fnivelLuz);//nivel de luz bajo
presenciaOn.AddActivador(out,'<',1);//out apagada
presenciaOn.AddActivador(presencia,'>',0);//presencia
if(bloqueo)
{
presenciaOn.AddActivador(bloqueo,'>',0);
}
presenciaOff.set(presencia->topic, out->topic, 0);
presenciaOff.setValSend("0");
presenciaOff.AddActivador(out,'>',0);//out encendido
presenciaOff.AddActivador(presencia,'<',1);//no presencia
if(bloqueo)
{
presenciaOff.AddActivador(bloqueo,'>',0);
}
nivelLuzOff.set(nivelluz->topic, out->topic, 0);
nivelLuzOff.setValSend("0");
nivelLuzOff.AddActivador(out,'>',0);//out encendido
nivelLuzOff.AddActivador(nivelluz,'>',fnivelLuz);//no luz
if(bloqueo)
{
nivelLuzOff.AddActivador(bloqueo,'>',0);
}
man->Add(&presenciaOn);
man->Add(&nivelLuzOff);
man->Add(&presenciaOff);
}
};
//configuraciones-----------------------------------------------------
class Automatismos: public DomoEspConfig
{
SensorRF presencia;
SensorRF nivelLuz;
SensorRF out;
SensorVD bloqueo;
//AutomatismoPulsador pulsadorSalon;
AutomatismoPresencia Apresen;
public:
Automatismos()
{
strcpy(ssidWifi,"IdhunAux");//nombre wifi
strcpy(ideEsp,"Esp8266_auto");//idenitificador del esp (sera único)
//pulsador sin activadores
presencia.set("casa/pruebas/inter",0);
nivelLuz.set("casa/pruebas/ana",0);
out.set("casa/pruebas/luz",0);
bloqueo.set("casa/pruebas/auto", true);
}
virtual void inicia(ISensorManager* man)
{
man->Add(&presencia);
man->Add(&nivelLuz);
man->Add(&out);
man->Add(&bloqueo);
Apresen.inicia(man,&presencia,&nivelLuz,&out,&bloqueo);
//pulsadorSalon.inicia(man,"casa/pruebas/pul", "casa/pruebas/luz");
}
};
class ConfActual: public DomoEspConfig
{
SensorDout luz;
SensorDHT dht;
SensorPulsante pul;
SensorDin interup;
SensorAin analog;
SensorVD sv;
public:
ConfActual()
{
strcpy(ssidWifi,"IdhunAux");//nombre wifi
strcpy(ideEsp,"Esp8266_pruebas");//idenitificador del esp (sera único)
luz.set(D1, "casa/pruebas/luz",0);
dht.set(D0, "casa/pruebas/dht");
pul.set(D2,"casa/pruebas/pul",1);
interup.set(D3,"casa/pruebas/inter");
analog.set(0,"casa/pruebas/ana",0, 1);
//analog.set(0,"casa/pruebas/ana",0, 0);*/
sv.set("casa/pruebas/vir",0);
}
virtual void inicia(ISensorManager* man)
{
man->Add(&luz);
man->Add(&dht);
man->Add(&pul);
man->Add(&interup);
man->Add(&analog);
man->Add(&sv);
}
};
Automatismos ConfiguracionActual;
#endif

94
DomoEspSensor/defines.h Normal file
View File

@ -0,0 +1,94 @@
#ifndef DefinesDef
#define DefinesDef 1
#define DEBUG_PS 1
#define CON_WOL 0
#define CON_LCD 0
#define MAXTOPICVAR 32//maximo de caracteres de los topic de las variables
//vars--------------------
#define MAXSTR 2024//maximo de caracteres para str
//sens--------------------
#define MAXSENS 16
#define MAXINTERRUP 8
#ifndef DO
#define D0 16
#endif
#ifndef D1
#define D1 5
#endif
#ifndef D2
#define D2 4
#endif
#ifndef D3
#define D3 0
#endif
#ifndef D4
#define D4 2
#endif
#ifndef D5
#define D5 14
#endif
#ifndef D6
#define D6 12
#endif
#ifndef D7
#define D7 13
#endif
#ifndef D8
#define D8 15
#endif
class Topic
{
public:
enum TipoTopic//indica el tipo de sensor
{
NO_RECONOCIDO=0,//TIPO TOPIC NO RECONOCIDO
GET,//TIPO GET
SET,//TIPO SET
PUL//TIPO PULSANTE (HA SUCEDIDO ALGO)
};
};
class PubSubClient;
//clases
class MqttReceiver
{
public:
virtual void OnMqtt(char* topic, char* payload)=0;
virtual void SubscribeMqtt(PubSubClient *client_mqtt){}
};
class IMqttManager
{
public:
virtual void MqttSend(char* topic, char* payload)=0;
virtual void MqttSubs(char* topic)=0;
};
static char buffer_t[MAXTOPICVAR];
static char buffer_p[MAXTOPICVAR];
class DomoEspSensorReceiver
{
public:
char topic[MAXTOPICVAR];
virtual void OnMqtt(IMqttManager * man, char* topic, char* payload, int tipo){};
virtual void SubscribeMqtt(IMqttManager* man){};
virtual void procesa(IMqttManager * man, int tiempo){};
virtual void inicia(){};
virtual float getVal()=0;
};
class ISensorManager
{
public:
virtual void Add(DomoEspSensorReceiver* sensor)=0;
};
#endif