From e1dde4e1377b15269d165d99cdc4989c34cbb749 Mon Sep 17 00:00:00 2001 From: Gerardo Date: Mon, 24 Jan 2022 21:17:05 +0100 Subject: [PATCH] Publicar solo cuando entran set no get. Modificacion configuraciones varias --- DomoEsp_v02/MqttDefines.h | 7 +- DomoEsp_v02/MqttDesencadenadorManager.cpp | 16 +-- DomoEsp_v02/MqttDesencadenadorManager.h | 4 +- DomoEsp_v02/MqttSensManager.cpp | 4 +- DomoEsp_v02/MqttUtiles.cpp | 28 +++-- DomoEsp_v02/MqttVarManager.cpp | 34 ++++-- DomoEsp_v02/MqttVarManager.h | 2 +- DomoEsp_v02/config_rf.h | 127 +++++++++++++++++++--- 8 files changed, 171 insertions(+), 51 deletions(-) diff --git a/DomoEsp_v02/MqttDefines.h b/DomoEsp_v02/MqttDefines.h index 9f85eaa..5c7a962 100644 --- a/DomoEsp_v02/MqttDefines.h +++ b/DomoEsp_v02/MqttDefines.h @@ -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 { diff --git a/DomoEsp_v02/MqttDesencadenadorManager.cpp b/DomoEsp_v02/MqttDesencadenadorManager.cpp index 5724c27..4824d31 100644 --- a/DomoEsp_v02/MqttDesencadenadorManager.cpp +++ b/DomoEsp_v02/MqttDesencadenadorManager.cpp @@ -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!{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; diff --git a/DomoEsp_v02/MqttSensManager.cpp b/DomoEsp_v02/MqttSensManager.cpp index d5c0c9a..668fb7f 100644 --- a/DomoEsp_v02/MqttSensManager.cpp +++ b/DomoEsp_v02/MqttSensManager.cpp @@ -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; diff --git a/DomoEsp_v02/MqttUtiles.cpp b/DomoEsp_v02/MqttUtiles.cpp index c92a3a0..1e8f25d 100644 --- a/DomoEsp_v02/MqttUtiles.cpp +++ b/DomoEsp_v02/MqttUtiles.cpp @@ -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() diff --git a/DomoEsp_v02/MqttVarManager.cpp b/DomoEsp_v02/MqttVarManager.cpp index f6890fd..13020e0 100644 --- a/DomoEsp_v02/MqttVarManager.cpp +++ b/DomoEsp_v02/MqttVarManager.cpp @@ -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,18 +315,22 @@ 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; ival.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); } diff --git a/DomoEsp_v02/MqttVarManager.h b/DomoEsp_v02/MqttVarManager.h index ee9c8e9..6049f35 100644 --- a/DomoEsp_v02/MqttVarManager.h +++ b/DomoEsp_v02/MqttVarManager.h @@ -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); diff --git a/DomoEsp_v02/config_rf.h b/DomoEsp_v02/config_rf.h index edd0249..6e64e00 100644 --- a/DomoEsp_v02/config_rf.h +++ b/DomoEsp_v02/config_rf.h @@ -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;