From 0b2a5f1fdeef42fb246256dd37238c054e975e39 Mon Sep 17 00:00:00 2001 From: Gerardo Date: Thu, 26 Sep 2024 23:13:18 +0200 Subject: [PATCH] Estavilizacion de actuadores --- .../{MecanismoPulso.h => Actuador.h} | 65 +++++++---- DomoEspSensor/Automatismos.h | 102 ++++++++++++++++++ DomoEspSensor/DomoEspSensorManager.cpp | 8 +- DomoEspSensor/SensorRF.h | 8 +- DomoEspSensor/configuracionActual.h | 101 ++--------------- DomoEspSensor/defines.h | 8 +- 6 files changed, 175 insertions(+), 117 deletions(-) rename DomoEspSensor/{MecanismoPulso.h => Actuador.h} (67%) create mode 100644 DomoEspSensor/Automatismos.h diff --git a/DomoEspSensor/MecanismoPulso.h b/DomoEspSensor/Actuador.h similarity index 67% rename from DomoEspSensor/MecanismoPulso.h rename to DomoEspSensor/Actuador.h index da3dc46..c98bcb6 100644 --- a/DomoEspSensor/MecanismoPulso.h +++ b/DomoEspSensor/Actuador.h @@ -1,5 +1,5 @@ -#ifndef MecanismoPulsoDef -#define MecanismoPulsoDef 1 +#ifndef ActuadorDef +#define ActuadorDef 1 #include "defines.h" //sensor activador envia a topicOut el valor val_send si los activadores cumplen umbral class Cactivador @@ -9,10 +9,11 @@ class Cactivador DomoEspSensorReceiver *sen; float umbral; char operacion;//< > = val oper umbral + bool onchange; }; -#define MAX_ACTIVADORES 5 -class MecanismoPulso: public DomoEspSensorReceiver + +class Actuador: public DomoEspSensorReceiver { float val; char topicOut[MAXTOPICVAR]; @@ -21,7 +22,7 @@ class MecanismoPulso: public DomoEspSensorReceiver public: char id[10]; - MecanismoPulso() + Actuador() { strcpy(id, "Meca"); topic[0]=0; @@ -36,17 +37,27 @@ class MecanismoPulso: public DomoEspSensorReceiver strcpy(topic, topic_id); strcpy(topicOut, topic_id_out); } - void AddActivador(DomoEspSensorReceiver *sen, char oper, float umbral) + void AddActivador(DomoEspSensorReceiver *sen, char oper, float umbral, bool onchange=false) { - for(int i=0; i=MAX_ACTIVADORES) + { + #ifdef DEBUG_PS + Serial.print(id); + Serial.println("----------------------ERROR NO ENTRAN MAS ACTUADORES---------------- "); + #endif + } } void setValSend(char* _valSend) { @@ -65,23 +76,32 @@ class MecanismoPulso: public DomoEspSensorReceiver } virtual void OnMqtt(IMqttManager * man, char* _topic, char* payload, int tipo) { - if(strcmp(_topic, topic)) + if(!validaTopic(_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); - } + if(tipo==Topic::GET) + { + val=atof(payload); + ejecuta(man); + } + else if(tipo==Topic::PUL) + ejecuta(man); } private: + bool validaTopic(char* _topic) + { + if (!strcmp(_topic, topic)) + return true; + for (int i = 0; i < MAX_ACTIVADORES; i++) + { + if (activador[i].sen && activador[i].onchange) + { + if (!strcmp(activador[i].sen->topic, _topic)) + return true; + } + } + return false; + + } void ejecuta(IMqttManager * man) { if(valida()) @@ -98,10 +118,13 @@ class MecanismoPulso: public DomoEspSensorReceiver } bool valida() { + for(int i=0; itopic, tpOut->topic, bloqueo); + } + void inicia(ISensorManager* man, char* tp_pul, char* tpOut, DomoEspSensorReceiver* bloqueo=NULL ) + { + pulsador.set(tp_pul, tpOut, 0); + pulsador.setValSend("X"); + strcpy(pulsador.id, "pulsa"); + if(bloqueo) + { + pulsador.AddActivador(bloqueo,'>',0); + } + man->Add(&pulsador); + } +}; + +//---------------------------------------------------------------------------------------------------------------------------------------------- + +//automatismo para luz con sensor de presencia y de nivel de luz +class AutomatismoPresencia//automatismo para encender luz con presencia +{ + + Actuador presenciaOn; + Actuador presenciaOff; + Actuador 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, 1);//nivel de luz bajo + presenciaOn.AddActivador(out,'<',1, 0);//out apagada + presenciaOn.AddActivador(presencia,'>',0, 0);//presencia + if(bloqueo) + { + presenciaOn.AddActivador(bloqueo,'>',0); + } + presenciaOff.set(presencia->topic, out->topic, 0); + presenciaOff.setValSend("0"); + presenciaOff.AddActivador(out,'>',0,0);//out encendido + presenciaOff.AddActivador(presencia,'<',1, 0);//no presencia + if(bloqueo) + { + presenciaOff.AddActivador(bloqueo,'>',0); + } + + nivelLuzOff.set(nivelluz->topic, out->topic, 0); + nivelLuzOff.setValSend("0"); + nivelLuzOff.AddActivador(out,'>',0, 0);//out encendido + nivelLuzOff.AddActivador(nivelluz,'>',fnivelLuz, 0);//no luz + if(bloqueo) + { + nivelLuzOff.AddActivador(bloqueo,'>',0); + } + + + man->Add(&presenciaOn); + man->Add(&nivelLuzOff); + man->Add(&presenciaOff); + + + } +}; + + + + +#endif \ No newline at end of file diff --git a/DomoEspSensor/DomoEspSensorManager.cpp b/DomoEspSensor/DomoEspSensorManager.cpp index 4425c20..0f51bc1 100644 --- a/DomoEspSensor/DomoEspSensorManager.cpp +++ b/DomoEspSensor/DomoEspSensorManager.cpp @@ -150,6 +150,12 @@ void DomoEspManager::Add(DomoEspSensorReceiver* sensor) if(n "); + Serial.print(topic); + Serial.print(" -> "); + Serial.println(val); + #endif } } diff --git a/DomoEspSensor/configuracionActual.h b/DomoEspSensor/configuracionActual.h index c37b2dd..fd42bb7 100644 --- a/DomoEspSensor/configuracionActual.h +++ b/DomoEspSensor/configuracionActual.h @@ -1,109 +1,23 @@ #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 "automatismos.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 +class ConfAutomatismos: public DomoEspConfig { SensorRF presencia; SensorRF nivelLuz; SensorRF out; SensorVD bloqueo; - //AutomatismoPulsador pulsadorSalon; + AutomatismoPulsador pulsador; AutomatismoPresencia Apresen; public: - Automatismos() + ConfAutomatismos() { strcpy(ssidWifi,"IdhunAux");//nombre wifi strcpy(ideEsp,"Esp8266_auto");//idenitificador del esp (sera Ășnico) @@ -123,7 +37,8 @@ class Automatismos: public DomoEspConfig man->Add(&nivelLuz); man->Add(&out); man->Add(&bloqueo); - Apresen.inicia(man,&presencia,&nivelLuz,&out,&bloqueo); + Apresen.inicia(man, &presencia, &nivelLuz,&out, &bloqueo); + pulsador.inicia(man,"casa/pruebas/pul", "casa/pruebas/luz"); //pulsadorSalon.inicia(man,"casa/pruebas/pul", "casa/pruebas/luz"); } @@ -170,6 +85,6 @@ class ConfActual: public DomoEspConfig }; -Automatismos ConfiguracionActual; +ConfAutomatismos ConfiguracionActual; #endif \ No newline at end of file diff --git a/DomoEspSensor/defines.h b/DomoEspSensor/defines.h index 6f90b06..30e28f4 100644 --- a/DomoEspSensor/defines.h +++ b/DomoEspSensor/defines.h @@ -11,10 +11,16 @@ #define MAXSTR 2024//maximo de caracteres para str //sens-------------------- -#define MAXSENS 16 +#define MAXSENS 16 //maximo de sensores totales +#define MAX_ACTIVADORES 5//maximo de activadores por actuador + + + + #define MAXINTERRUP 8 + #ifndef DO #define D0 16 #endif