Publicar solo cuando entran set no get.

Modificacion configuraciones varias
master
Gerardo 2022-01-24 21:17:05 +01:00
parent 8fe41ffcac
commit e1dde4e137
8 changed files with 171 additions and 51 deletions

View File

@ -3,17 +3,20 @@
#define MqttDefinesDef 1
//generales
#define DEBUG_PS 1
#define CON_LCD 0
#define CON_LCD 1
#define MAXTOPICVAR 32//maximo de caracteres de los topic de las variables
//vars--------------------
#define MAXVAR 12//maximo de variables totales
#define MAXVAR 24//maximo de variables totales
#define MAXSTR 1024//maximo de caracteres para str
//sens--------------------
#define MAXSENS 8
#define MAXINTERRUP 8
//desencadenadores--------
#define MAXSTRDESEN 64
#define MAXDESEN 24
//class-------------------
class MqttOnVarChangeListenner
{

View File

@ -4,7 +4,7 @@
MqttDesencadenador::MqttDesencadenador()
{
activo=true;
activo=true;
}
MQTTvalor MqttDesencadenador::GetVarValue(char*ivar, MqttVarManager *vars)
{
@ -16,7 +16,7 @@ float MqttDesencadenador::GetValue(char*ivar, MqttVarManager *vars)
MqttVar *v=GetVar(ivar, vars);
if(v->flags & MqttVar::FLOAT_VAR)
return v->val.f;
return 1.*v->val.i;
return (float)v->val.i;
}
int MqttDesencadenador::GetIvar(char*ivar)
@ -314,7 +314,6 @@ void MqttDesencadenador::Exe(MqttVarManager *vars)
//distincion de variables
if(expresion[p.i]=='{')
{
p.estado=1;
p.i++;
}
@ -323,7 +322,6 @@ void MqttDesencadenador::Exe(MqttVarManager *vars)
p.estado=2;
}
}
}
break;
case(1)://pillando var o escalar
@ -375,10 +373,9 @@ void MqttDesencadenadorManager::inicia( MqttVarManager *v)
vars=v;
if(des.n>0)
{
#ifdef DEBUG_PS
Serial.println("MqttDesencadenador::inicia como listenner");
#endif
#ifdef DEBUG_PS
Serial.println("MqttDesencadenador::inicia como listenner");
#endif
vars->AddListenner(this);
}
}
@ -404,8 +401,7 @@ void MqttDesencadenadorManager::loop()
void MqttDesencadenadorManager::RevisaDesencadenadores()
{
#ifdef DEBUG_PS
Serial.println("MqttDesencadenadorManager::RevisaDesencadenadores");
Serial.println("MqttDesencadenadorManager::RevisaDesencadenadores");
#endif
for(int i=0; i<des.n; i++)
{

View File

@ -45,7 +45,7 @@ struct MqttExeParam
class MqttDesencadenador
{
public:
char expresion[64];//{1}=1->!{2}
char expresion[MAXSTRDESEN];//{1}=1->!{2}
bool activo;//se desactivan automaticamente cuando se cumple la condicion y se vuelve activar cuando deja de cumplirse
MqttDesencadenador();
@ -68,7 +68,7 @@ class MqttDesencadenador
class MqttDesencadenadorArray
{
public:
MqttDesencadenador data[16];
MqttDesencadenador data[MAXDESEN];
int n;

View File

@ -335,7 +335,7 @@ void MqttSensManager::procesaInterrupciones()
if(val!=v->val.i)
{
v->val.i=val;
vars->OnChange(s->ivar);
vars->OnChange(s->ivar, true);
}
break;
}
@ -345,7 +345,7 @@ void MqttSensManager::procesaInterrupciones()
if(val!=v->val.i)
{
v->val.i=val;
vars->OnChange(s->ivar);
vars->OnChange(s->ivar, true);
}
//v->val.i=val;

View File

@ -47,19 +47,13 @@ void WifiManager::inicia( WiFiClient *espclient,char *ssid, char* key)
espClient= espclient;
strcpy(nred, ssid);
strcpy(pass, key);
}
bool WifiManager::loop()
{
if((WiFi.status() == WL_CONNECTED))
{
return true;
}
#ifdef DEBUG_PS
#ifdef DEBUG_PS
Serial.println("Conectando wifi");
Serial.println(nred);
Serial.println(pass);
#endif
WiFi.mode(WIFI_STA);
WiFi.begin(nred, pass);
@ -77,7 +71,23 @@ bool WifiManager::loop()
else
Serial.println("No se pudo conectar");
#endif
return WiFi.status() == WL_CONNECTED;
//return WiFi.status() == WL_CONNECTED;
}
bool WifiManager::loop()
{
if((WiFi.status() == WL_CONNECTED))
{
return true;
}
#ifdef DEBUG_PS
Serial.println("Reset esp");
#endif
ESP.reset();
return false;
}
//**************************************************************************************************************************************************
MqttManager::MqttManager()

View File

@ -186,7 +186,7 @@ void MqttVarManager::OnMqtt(char* topic, char* payload)
}
if(res>=0)
OnChange(res);
OnChange(res, isSet);
return;
}
@ -207,9 +207,23 @@ void MqttVarManager::PublicaVar(int ivar)
char buffer_p[24];
MqttVar* v=vars->Get(ivar);
if(v->flags & MqttVar::CHANGE_VAR)
{
sprintf(buffer_t, "%s/set",topics->Get(v->topic));
#ifdef DEBUG_PS
Serial.print("Publica /set var: ");
Serial.println(buffer_t);
#endif
}
else
{
sprintf(buffer_t, "%s/get",topics->Get(v->topic));
#ifdef DEBUG_PS
Serial.print("Publica get var: ");
Serial.println(buffer_t);
#endif
}
//Publica valor
if(v->flags & MqttVar::FLOAT_VAR)
dtostrf(v->val.f,3, 2, buffer_p);
@ -301,19 +315,23 @@ int MqttVarManager::GetId(char* topic)
return -1;
}
void MqttVarManager::OnChange(int ivar)
void MqttVarManager::OnChange(int ivar, bool publica)
{
#ifdef DEBUG_PS
Serial.println("MqttVarManager::OnChange");
#endif
MqttVar* v=vars->Get(ivar);
byte f= MqttVar::ACCION_VAR;
if(v->flags & f)
if(publica)
{
PublicaVar(ivar);
MqttVar* v=vars->Get(ivar);
byte f= MqttVar::ACCION_VAR;
if(v->flags & f)
{
PublicaVar(ivar);
}
}
for (int i=0; i<nListenner; i++)
{
if(onChangeListener[i]==NULL)
@ -350,7 +368,7 @@ void MqttVarManager::InvierteVar(int ivar)
}
else
v->val.i=1-v->val.i;
OnChange(ivar);
OnChange(ivar, true);
}
void MqttVarManager::SetVal(int ivar,MQTTvalor val)
{
@ -370,5 +388,5 @@ void MqttVarManager::SetVal(int ivar,MQTTvalor val)
Serial.print(" f: ");
Serial.println( v->val.f);
#endif
OnChange(ivar);
OnChange(ivar, true);
}

View File

@ -112,7 +112,7 @@ class MqttVarManager
int AddInternalVarInt( char*topic);
void PublicaVars();
void PublicaVar(int ivar);
void OnChange(int ivar);
void OnChange(int ivar, bool publica);
void ResetVolatileVar();
void InvierteVar(int ivar);

View File

@ -1,11 +1,11 @@
//parametros configurables*************************************************
#define DEBUG_PS 1//Descomentar para debug
#define CON_LCD 0
class ActualDomoConfig: public DomoConfig
#define CON_LCD 1
//va por 16
class AutomatismosDomoConfig: public DomoConfig
{
public:
ActualDomoConfig()
AutomatismosDomoConfig()
{
velocidadPortSerie=115200;
strcpy(ssidWifi,"Idhun");//nombre wifi
@ -57,10 +57,12 @@ class ActualDomoConfig: public DomoConfig
int lamb= vars->AddInternalVarInt( "casa/Salon/LAmb");
int lchim= vars->AddInternalVarInt( "casa/Salon/LChime");
int lent= vars->AddInternalVarInt( "casa/Salon/LEnt");
int pul1= vars->AddInternalVarInt( "casa/Salon/pul1");
int pul2= vars->AddInternalVarInt( "casa/Salon/pul2");
int pul3= vars->AddInternalVarInt( "casa/Salon/pul3");
int pul4= vars->AddInternalVarInt( "casa/Salon/pul4");
int pulIall= vars->AddInternalVarInt( "casa/Salon/intAll");
int pulAll= vars->AddInternalVarInt( "casa/Salon/pulAll");
//lcd---------------------------------------------------------
//lcd->add(0,"T des: %s",0,0);
@ -77,19 +79,83 @@ class ActualDomoConfig: public DomoConfig
lcd->add(-1,"bueno pa goza",1,1);*/
//desencadenaores----------
char st[64];
sprintf(st,"{%d}>0 -> {%d}=1 & {%d}=1 & {%d}=1 ",pul1,lamb,lchim, lent);//terminar en espacios
//Efecto Interruptor-----
sprintf(st,"{%d}>0 -> {%d}=1 & {%d}=1 & {%d}=1 ",pulIall,lamb,lchim, lent);//terminar en espacios
des->AddDes(st);
sprintf(st,"{%d}<1 -> {%d}=0 & {%d}=0 & {%d}=0 ",pul1,lamb,lchim, lent);//terminar en espacios
sprintf(st,"{%d}<1 -> {%d}=0 & {%d}=0 & {%d}=0 ",pulIall,lamb,lchim, lent);//terminar en espacios
des->AddDes(st);
sprintf(st,"{%d}>0 -> !{%d} ",pul2,lamb);//terminar en espacios
//Efecto Pulsadores
sprintf(st,"{%d}>0 -> !{%d} ",pulAll,pulIall);//terminar en espacios
des->AddDes(st);
sprintf(st,"{%d}>0 -> !{%d} ",pul3,lchim);//terminar en espacios
sprintf(st,"{%d}>0 -> !{%d} ",pul1,lamb);//terminar en espacios
des->AddDes(st);
sprintf(st,"{%d}>0 -> !{%d} ",pul4,lent);//terminar en espacios
sprintf(st,"{%d}>0 -> !{%d} ",pul2,lchim);//terminar en espacios
des->AddDes(st);
sprintf(st,"{%d}>0 -> !{%d} ",pul3,lent);//terminar en espacios
des->AddDes(st);
}
};
class PulCocinaConfig: public DomoConfig
{
public:
PulCocinaConfig()
{
velocidadPortSerie=115200;
strcpy(ssidWifi,"Idhun");//nombre wifi
strcpy(keyWifi,"Ardileorca1234.");//key wifi
strcpy(ideEsp,"Esp8266_014");//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=15;//tiempo de refresco en segundos de los sensores
//config lcd--------------------
lcd.colum=16;//columnas lcd
lcd.lines=2;//lineas
//pines lcd
lcd.rs=0;
lcd.en=0;//eneable
lcd.d0=0;
lcd.d1=0;
lcd.d2=0;
lcd.d3=0;
}
//configuracion de sensores, variables, lcd---------------------------------
virtual void ConfigGen(MqttSensManager* sens, MqttVarManager* vars, LcdMQTTViewer *lcd, MqttDesencadenadorManager *des)
{
//sensores--------------------------------------------------------
/*
sens->AddHDT22(int pin, char* topic);
//tempe y presion varometrica
sens->AddBMP180(int sda,int scl, char* topic);
//entradas digitales
sens->AddDin(int pin, char* topic);//añade variable digital que se actualiza de manera instantanea (interruptores sensor presencia ..)
sens->AddDinAccion(int pin, char* topic);//añade variable que solo publica en el cambio (pulsadores, ...)
//salida digital
sens->AddDout(int pin, char* topic, bool defautlValor);//variable que solo publica en el cambio (pulsadores, ...)
Sensor analogico
sens->AddAnalogIn(int pin, char* topic, bool ValNegado);//nivel de luz, nivel de lluvia ...
*/
sens->AddDout(D5, "casa/coci/lam", false);
sens->AddDinAccion( D1, "casa/coci/inter");
//sens->AddDinAccion( D2, "casa/Salon/pul2");
//sens->AddDinAccion( D5, "casa/Salon/pul3");
//sens->AddDinAccion( D6, "casa/Salon/pulAll");
char st[64];
//Efecto Pulsadores
sprintf(st,"{%d}>0 -> !{%d} ",1,0);//terminar en espacios
des->AddDes(st);
sprintf(st,"{%d}<1 -> !{%d} ",1,0);//terminar en espacios
des->AddDes(st);
}
};
class PulSalonConfig: public DomoConfig
{
public:
@ -135,12 +201,12 @@ class PulSalonConfig: public DomoConfig
sens->AddAnalogIn(int pin, char* topic, bool ValNegado);//nivel de luz, nivel de lluvia ...
*/
//sens->AddHDT22(D4, "casa/desp");
sens->AddDout(D1, "casa/Salon/LEnt", true);
/*sens->AddDout(D7, "casa/Salon/LEnt", true);
// sens->AddDout(D1, "casa/Salon/LEnt", true);
sens->AddDout(D7, "casa/Salon/LEnt", false);
sens->AddDinAccion( D1, "casa/Salon/pul1");
sens->AddDinAccion( D2, "casa/Salon/pul2");
sens->AddDinAccion( D5, "casa/Salon/pul3");
sens->AddDinAccion( D6, "casa/Salon/pul4");*/
sens->AddDinAccion( D6, "casa/Salon/pulAll");
}
};
class DespachoDomoConfig: public DomoConfig
@ -179,13 +245,16 @@ class DespachoDomoConfig: public DomoConfig
sens->AddAnalogIn(0, "casa/desp/luz",true);
//variables----------------------------------------------------
int temCoci= vars->AddInternalVarFloat( "casa/cocina/t");//variable privada
int temDesp= vars->AddInternalVarFloat( "casa/cocina/h");//variable privada
int hcocina= vars->AddInternalVarFloat( "casa/cocina/h");//variable privada
int temExt= vars->AddInternalVarFloat( "casa/ext/t");//variable privada
int hExt= vars->AddInternalVarFloat( "casa/ext/h");//variable privada
//lcd---------------------------------------------------------
lcd->add(0,"T des: %s",0,0);
lcd->add(1,"H des: %s",1,0);
lcd->add(temCoci,"T coci: %s",0,1);
lcd->add(temDesp,"H coci: %s",1,1);
lcd->add(hcocina,"H coci: %s",1,1);
lcd->add(temExt,"T Ext: %s",0,2);
lcd->add(hExt,"H Ext: %s",1,2);
}
};
class CocinaDomoConfig: public DomoConfig
@ -211,6 +280,30 @@ class CocinaDomoConfig: public DomoConfig
}
};
class ExteriorDomoConfig: public DomoConfig
{
public:
ExteriorDomoConfig()
{
velocidadPortSerie=115200;
strcpy(ssidWifi,"Idhun");//nombre wifi
strcpy(keyWifi,"Ardileorca1234.");//key wifi
strcpy(ideEsp,"Esp8266_015");//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=15;//tiempo de refresco en segundos de los sensores
}
//configuracion de sensores---------------------------------
virtual void ConfigGen(MqttSensManager* sens, MqttVarManager* vars, LcdMQTTViewer *lcd, MqttDesencadenadorManager *des)
{
sens->AddHDT22(D2, "casa/ext");
sens->AddAnalogIn(0, "casa/ext/lluvia",true);
}
};
//configuracion que se usara--------------------------
ActualDomoConfig ConfiguracionActual;
DespachoDomoConfig ConfiguracionActual;