diff --git a/DomoEsp_v02/.vs/DomoEsp_v02/project-colors.json b/DomoEsp_v02/.vs/DomoEsp_v02/project-colors.json new file mode 100644 index 0000000..a8fda78 --- /dev/null +++ b/DomoEsp_v02/.vs/DomoEsp_v02/project-colors.json @@ -0,0 +1,16 @@ +{ + "Version": 1, + "ProjectMap": { + "a2fe74e1-b743-11d0-ae1a-00a0c90fffc3": { + "ProjectGuid": "a2fe74e1-b743-11d0-ae1a-00a0c90fffc3", + "DisplayName": "Archivos varios", + "ColorIndex": -1 + }, + "c5f80730-f44f-4478-bdae-6634efc2ca88": { + "ProjectGuid": "c5f80730-f44f-4478-bdae-6634efc2ca88", + "DisplayName": "DomoEsp_v02", + "ColorIndex": 0 + } + }, + "NextColorIndex": 1 +} \ No newline at end of file diff --git a/DomoEsp_v02/.vs/DomoEsp_v02/v16/.suo b/DomoEsp_v02/.vs/DomoEsp_v02/v16/.suo new file mode 100644 index 0000000..9b905fb Binary files /dev/null and b/DomoEsp_v02/.vs/DomoEsp_v02/v16/.suo differ diff --git a/DomoEsp_v02/.vs/DomoEsp_v02/v16/Browse.VC.db b/DomoEsp_v02/.vs/DomoEsp_v02/v16/Browse.VC.db new file mode 100644 index 0000000..98fc664 Binary files /dev/null and b/DomoEsp_v02/.vs/DomoEsp_v02/v16/Browse.VC.db differ diff --git a/DomoEsp_v02/.vs/DomoEsp_v02/v17/.suo b/DomoEsp_v02/.vs/DomoEsp_v02/v17/.suo new file mode 100644 index 0000000..76d231c Binary files /dev/null and b/DomoEsp_v02/.vs/DomoEsp_v02/v17/.suo differ diff --git a/DomoEsp_v02/.vs/DomoEsp_v02/v17/Browse.VC.db b/DomoEsp_v02/.vs/DomoEsp_v02/v17/Browse.VC.db new file mode 100644 index 0000000..84655c9 Binary files /dev/null and b/DomoEsp_v02/.vs/DomoEsp_v02/v17/Browse.VC.db differ diff --git a/DomoEsp_v02/.vs/ProjectSettings.json b/DomoEsp_v02/.vs/ProjectSettings.json new file mode 100644 index 0000000..52565e8 --- /dev/null +++ b/DomoEsp_v02/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": "Visual Micro" +} \ No newline at end of file diff --git a/DomoEsp_v02/.vs/VSWorkspaceState.json b/DomoEsp_v02/.vs/VSWorkspaceState.json new file mode 100644 index 0000000..8a2798d --- /dev/null +++ b/DomoEsp_v02/.vs/VSWorkspaceState.json @@ -0,0 +1,7 @@ +{ + "ExpandedNodes": [ + "" + ], + "SelectedNode": "\\MqttVarManager.h", + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/DomoEsp_v02/.vs/slnx.sqlite b/DomoEsp_v02/.vs/slnx.sqlite new file mode 100644 index 0000000..c2c7ee0 Binary files /dev/null and b/DomoEsp_v02/.vs/slnx.sqlite differ diff --git a/DomoEsp_v02/CppProperties.json b/DomoEsp_v02/CppProperties.json new file mode 100644 index 0000000..f183473 --- /dev/null +++ b/DomoEsp_v02/CppProperties.json @@ -0,0 +1,8 @@ +{ + "configurations": [ + { + "name": "Visual Micro", + "intelliSenseMode": "windows-msvc-x86" + } + ] +} \ No newline at end of file diff --git a/DomoEsp_v02/DomoEspManager.cpp b/DomoEsp_v02/DomoEspManager.cpp index d406619..81ad722 100644 --- a/DomoEsp_v02/DomoEspManager.cpp +++ b/DomoEsp_v02/DomoEspManager.cpp @@ -10,7 +10,7 @@ DomoEspManager::DomoEspManager() suscrito=false; } -void DomoEspManager::inicia( LiquidCrystal *lcd, PubSubClient *mqttClient, WiFiClient* espClient, DomoConfig* conf) +void DomoEspManager::inicia(WakeOnLan *pwol, LiquidCrystal *lcd, PubSubClient *mqttClient, WiFiClient* espClient, DomoConfig* conf) { mqttclient=mqttClient; #ifdef DEBUG_PS @@ -27,7 +27,7 @@ void DomoEspManager::inicia( LiquidCrystal *lcd, PubSubClient *mqttClient, WiFiC //pasar funcion de configuracion de añadir sensores - conf->ConfigGen(&sens, &vars, &lcdm, &des); + conf->ConfigGen(&sens, &vars, &lcdm, &wol, &des); #ifdef DEBUG_PS @@ -78,6 +78,7 @@ void DomoEspManager::inicia( LiquidCrystal *lcd, PubSubClient *mqttClient, WiFiC Serial.println("iniciado LCD"); #endif #endif + wol.inicia(pwol); } @@ -102,6 +103,7 @@ void DomoEspManager::loop() #if CON_LCD lcdm.suscribe(mqttclient); #endif + wol.suscribe(mqttclient); suscrito=true; } @@ -120,6 +122,10 @@ void DomoEspManager::OnMqtt(char* topic, char* payload) #if CON_LCD lcdm.OnMqtt(topic, payload); #endif + + #if CON_WOL + wol.OnMqtt(topic, payload); + #endif #ifdef DEBUG_PS Serial.println("OnMqtt fin"); diff --git a/DomoEsp_v02/DomoEspManager.h b/DomoEsp_v02/DomoEspManager.h index 3bf129e..bca0977 100644 --- a/DomoEsp_v02/DomoEspManager.h +++ b/DomoEsp_v02/DomoEspManager.h @@ -16,6 +16,8 @@ #include "MqttSensManager.h" #include "MqttDesencadenadorManager.h" #include "LcdMQTTViewer.h" +#include "MqttWOLManager.h" + #if CON_LCD //configuracion del lcd-------------------------- @@ -30,6 +32,7 @@ class PubSubClient; class WiFiClient; class MqttSensManager; +class WakeOnLan; /* * clase principal */ @@ -66,7 +69,7 @@ class DomoConfig int refresTimeSens;//tiempo de refresco en segundos de los sensores - virtual void ConfigGen(MqttSensManager* sens, MqttVarManager* vars, LcdMQTTViewer *lcd, MqttDesencadenadorManager *des)=0; + virtual void ConfigGen(MqttSensManager* sens, MqttVarManager* vars, LcdMQTTViewer *lcd, MqttWOLManager *wol, MqttDesencadenadorManager *des)=0; }; @@ -93,12 +96,15 @@ class DomoEspManager: public MqttReceiver SonidoBuzzer buzz; LcdMQTTViewer lcdm; + + MqttWOLManager wol; + bool suscrito; //PubSubClient client_qqtt(WifiManager::espClient); DomoEspManager(); //PubSubClient client_qqtt(espClient); - void inicia( LiquidCrystal *lcd,PubSubClient *mqttClient, WiFiClient* espClient, DomoConfig* conf); + void inicia(WakeOnLan* pwol, LiquidCrystal *lcd,PubSubClient *mqttClient, WiFiClient* espClient, DomoConfig* conf); void loop(); //funciones auxiliares diff --git a/DomoEsp_v02/DomoEsp_v02.ino b/DomoEsp_v02/DomoEsp_v02.ino index 3cf8ae9..ba60205 100644 --- a/DomoEsp_v02/DomoEsp_v02.ino +++ b/DomoEsp_v02/DomoEsp_v02.ino @@ -1,5 +1,3 @@ - - /* * Software basico sersor domotica con esp8266 / esp32 nodemcu * Controlado por mqtt @@ -33,6 +31,7 @@ Y PROBAR RF*/ #include #include +WiFiUDP UDP; #include #include #include @@ -40,6 +39,10 @@ Y PROBAR RF*/ #include "DomoEspManager.h" + +#include "MqttWOLManager.h" +#include + #include "config_rf.h" //variables globales---------------------------- @@ -50,13 +53,20 @@ DomoEspManager domoEspManager; WiFiClient EspClient; PubSubClient clienteMqtt(EspClient); LiquidCrystal *plcd=NULL; - #if CON_LCD +#if CON_LCD LiquidCrystal lcd( ConfiguracionActual.lcd.rs, ConfiguracionActual.lcd.en, ConfiguracionActual.lcd.d0,ConfiguracionActual.lcd.d1,ConfiguracionActual.lcd.d2,ConfiguracionActual.lcd.d3); - #endif +#endif + +WakeOnLan* pwol=NULL; +#if CON_WOL + +WakeOnLan WOL(UDP); +//pwol=&WOL; +#endif //funciones principales------------------------ void setup() { @@ -69,7 +79,10 @@ void setup() Serial.println(""); Serial.println("Iniciando"); #endif - domoManager.inicia(plcd,&clienteMqtt,&EspClient,&ConfiguracionActual); + #if CON_WOL + pwol=&WOL; + #endif + domoManager.inicia(pwol,plcd,&clienteMqtt,&EspClient,&ConfiguracionActual); } diff --git a/DomoEsp_v02/DomoEsp_v02.sln b/DomoEsp_v02/DomoEsp_v02.sln new file mode 100644 index 0000000..1e33a11 --- /dev/null +++ b/DomoEsp_v02/DomoEsp_v02.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.32112.339 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DomoEsp_v02", "DomoEsp_v02.vcxproj", "{C5F80730-F44F-4478-BDAE-6634EFC2CA88}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x86 = Debug|x86 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Debug|x86.ActiveCfg = Debug|Win32 + {C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Debug|x86.Build.0 = Debug|Win32 + {C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Release|x86.ActiveCfg = Release|Win32 + {C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {1995B5A1-341C-4B18-B509-04838EC7A212} + EndGlobalSection +EndGlobal diff --git a/DomoEsp_v02/DomoEsp_v02.vcxproj b/DomoEsp_v02/DomoEsp_v02.vcxproj new file mode 100644 index 0000000..a032423 --- /dev/null +++ b/DomoEsp_v02/DomoEsp_v02.vcxproj @@ -0,0 +1,141 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {C5F80730-F44F-4478-BDAE-6634EFC2CA88} + DomoEsp_v02 + DomoEsp_v02 + + + + Application + true + MultiByte + v143 + + + Application + false + true + MultiByte + v143 + + + Application + true + MultiByte + v143 + + + Application + false + true + MultiByte + v143 + + + Application + false + true + MultiByte + v143 + + + + + + + + + + + + + + + + + + + + + C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt + + + + Level3 + Disabled + true + $(ProjectDir)..\DomoEsp_v02;C:\Users\Gerardo\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\3.0.2\libraries\SPI;C:\Users\Gerardo\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\3.0.2\libraries\ESP8266WiFi\src;C:\Users\Gerardo\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\3.0.2\libraries\ESP8266mDNS\src;C:\Users\Gerardo\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\3.0.2\libraries\ArduinoOTA;C:\Program Files (x86)\Arduino\libraries\SimpleDHT-master;C:\Users\Gerardo\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\3.0.2\libraries\Wire;C:\Program Files (x86)\Arduino\libraries\Adafruit-BMP085-Library-master;C:\Program Files (x86)\Arduino\libraries\LiquidCrystal\src;C:\Users\Gerardo\Documents\Arduino\libraries\PubSubClient\src;C:\Users\Gerardo\Documents\Arduino\libraries\WakeOnLan\src;C:\Users\Gerardo\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\3.0.2\libraries\EEPROM;C:\Users\Gerardo\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266;C:\Users\Gerardo\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266\avr;C:\Users\Gerardo\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266\libb64;C:\Users\Gerardo\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266\spiffs;C:\Users\Gerardo\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266\umm_malloc;C:\Users\Gerardo\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\3.0.2\variants\nodemcu;C:\Users\Gerardo\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\3.0.2\tools\sdk\include;C:\Users\Gerardo\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\3.0.2\tools\sdk\lwip2\include;C:\Users\Gerardo\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\3.0.2\tools\sdk\libc\xtensa-lx106-elf\include;C:\Users\Gerardo\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\3.0.4-gcc10.3-1757bed\xtensa-lx106-elf\include\c++\4.8.2;C:\Users\Gerardo\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\3.0.4-gcc10.3-1757bed\xtensa-lx106-elf\include\c++\4.8.2\xtensa-lx106-elf;C:\Users\Gerardo\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\3.0.4-gcc10.3-1757bed\xtensa-lx106-elf\include;C:\Users\Gerardo\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\3.0.4-gcc10.3-1757bed\lib\gcc\xtensa-lx106-elf\4.8.2\include;C:\Users\Gerardo\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\3.0.2\tools\sdk\include;%(AdditionalIncludeDirectories) + $(ProjectDir)__vm\.DomoEsp_v02.vsarduino.h;%(ForcedIncludeFiles) + true + __ESP8266_esp8266__;__ESP8266_ESP8266__;__ets__;ICACHE_FLASH;_GNU_SOURCE;MMU_IRAM_SIZE=0x8000;MMU_ICACHE_SIZE=0x8000;NONOSDK22x_190703=1;F_CPU=80000000L;LWIP_OPEN_SRC;TCP_MSS=536;LWIP_FEATURES=1;LWIP_IPV6=0;ARDUINO=108016;ARDUINO_ESP8266_NODEMCU_ESP12E;ARDUINO_ARCH_ESP8266;LED_BUILTIN=2;FLASHMODE_DIO;ESP8266;__cplusplus=201103L;_VMICRO_INTELLISENSE;%(PreprocessorDefinitions) + + + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + + + VisualMicroDebugger + + + + CppCode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DomoEsp_v02/DomoEsp_v02.vcxproj.filters b/DomoEsp_v02/DomoEsp_v02.vcxproj.filters new file mode 100644 index 0000000..e2bbce9 --- /dev/null +++ b/DomoEsp_v02/DomoEsp_v02.vcxproj.filters @@ -0,0 +1,75 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/DomoEsp_v02/DomoEsp_v02.vcxproj.user b/DomoEsp_v02/DomoEsp_v02.vcxproj.user new file mode 100644 index 0000000..88a5509 --- /dev/null +++ b/DomoEsp_v02/DomoEsp_v02.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/DomoEsp_v02/LcdMQTTViewer.cpp b/DomoEsp_v02/LcdMQTTViewer.cpp index d0e68de..82a1dea 100644 --- a/DomoEsp_v02/LcdMQTTViewer.cpp +++ b/DomoEsp_v02/LcdMQTTViewer.cpp @@ -11,18 +11,29 @@ void LcdMQTTViewer::envia(char* txt, int pos, int line) { - lcd->setCursor(pos, line); + char buf[MAXTOPICVAR]; + int l = strlen(txt); - if (l < nchar) - for (int i = l; i < nchar; i++) - txt[i] = ' '; - txt[nchar] = 0; - lcd->print(txt); + if (l > nchar) + l = nchar; + + + + for (int i = 0; i < nchar; i++) + if (i < l) + buf[i] = txt[i]; + else + buf[i] = ' '; + + buf[nchar] = 0; + lcd->setCursor(pos, line); + lcd->print(buf); } LcdMQTTViewer::LcdMQTTViewer() { - ivarBuzzer=-1; - topic[0]=0; + panActual = 0; + ivarBuzzer=-1; + topic[0]=0; maxpan = 0; tiempo = 0; incre_t = 10 * 1000; @@ -41,7 +52,7 @@ void LcdMQTTViewer::setTimer(int seg) void LcdMQTTViewer::envia(int pan) { char val[16]; - char buf[32]; + char buf[MAXTOPICVAR]; for (int i = 0; i < maxtInfo; i++) { if (LcdConf[i].pan != pan) @@ -69,9 +80,9 @@ void LcdMQTTViewer::inicia(MqttVarManager *v, LiquidCrystal* lcdEx, int digi, in { ivarBuzzer=(byte)ibuz; vars=v; - lcd =lcdEx; - nchar = digi; - lcd->begin(nchar, lines); + lcd =lcdEx; + nchar = digi; + lcd->begin(nchar, lines); nlineslcd=lines; for(int i=0; ival; + MqttVar* v = GetVar(ivar, vars); + return v->val; } -float MqttDesencadenador::GetValue(char*ivar, MqttVarManager *vars) +float MqttDesencadenador::GetValue(char* ivar, MqttVarManager* vars) { - MqttVar *v=GetVar(ivar, vars); - if(v->flags & MqttVar::FLOAT_VAR) - return v->val.f; - return (float)v->val.i; + MqttVar* v = GetVar(ivar, vars); + if (v->flags & MqttVar::FLOAT_VAR) + return v->val.f; + return (float)v->val.i; } -int MqttDesencadenador::GetIvar(char*ivar) +int MqttDesencadenador::GetIvar(char* ivar) { - char buf[16]; - int n=strlen(ivar); - strcpy(buf,ivar); - buf[n-1]=0; - return atoi(buf); + char buf[16]; + int n = strlen(ivar); + strcpy(buf, ivar); + buf[n - 1] = 0; + return atoi(buf); } -MqttVar* MqttDesencadenador::GetVar(char*ivar, MqttVarManager *vars) +MqttVar* MqttDesencadenador::GetVar(char* ivar, MqttVarManager* vars) { - return vars->Get(GetIvar(ivar)); + return vars->Get(GetIvar(ivar)); } -void MqttDesencadenador::ExeEfecto(MqttVarManager *vars, char *oper, char*x, char*y) +void MqttDesencadenador::ExeEfecto(MqttVarManager* vars, char* oper, char* x, char* y) { - #ifdef DEBUG_PS +#ifdef DEBUG_PS - Serial.print("MqttDesencadenador::ExeEfecto: "); - Serial.print(oper); - Serial.print(" x: "); - Serial.print(x); - Serial.print(" y: "); - Serial.println(y); - #endif - - switch(oper[0]) - { - case('!'): - { - vars->InvierteVar(GetIvar(x)); - return; - } - case('='): - { - MqttVar* v=GetVar(x, vars); - MQTTvalor val=GetVarValue(x, vars); - if(v->flags & MqttVar::FLOAT_VAR) - val.f=atof(y); - else - val.i=atoi(y); - vars->SetVal(GetIvar(x),val); - return; - } - } -} -bool MqttDesencadenador::Eval(MqttVarManager *vars, char *oper, char*x, char*y) -{ - #ifdef DEBUG_PS + Serial.print("MqttDesencadenador::ExeEfecto: "); + Serial.print(oper); + Serial.print(" x: "); + Serial.print(x); + Serial.print(" y: "); + Serial.println(y); +#endif - Serial.print("MqttDesencadenador::eval: "); - Serial.print(oper); - Serial.print(" x: "); - Serial.print(x); - Serial.print(" y: "); - Serial.println(y); - #endif - //las variables estaran terminadas en } - float vx,vy; - //pilla valores - int nx=strlen(x); - int ny=strlen(y); - if(x[nx-1]=='}') - vx=GetValue(x, vars); - else - vx=atof(x); - if(ny<=0) - vy=0; - if(y[ny-1]=='}') - vy=GetValue(y, vars); - else - vy=atof(y); - switch(oper[0]) - { - case('!'): - return vx!=1; - case('='): - return vx==vy; - case('<'): - { - if(oper[1]=='=') - return vx<=vy; - return vx'): - if(oper[1]=='=') - return vx>=vy; - return vx>vy; - } - return false; - + switch (oper[0]) + { + case('!'): + { + vars->InvierteVar(GetIvar(x)); + return; + } + case('='): + { + MqttVar* v = GetVar(x, vars); + MQTTvalor val = GetVarValue(x, vars); + if (v->flags & MqttVar::FLOAT_VAR) + val.f = atof(y); + else + val.i = atoi(y); + vars->SetVal(GetIvar(x), val); + return; + } + } } -int MqttDesencadenador::GetElementosOper( char *oper) +bool MqttDesencadenador::Eval(MqttVarManager* vars, char* oper, char* x, char* y) { - if(oper[0]=='!') - return 1; - else - return 2; +#ifdef DEBUG_PS + + Serial.print("MqttDesencadenador::eval: "); + Serial.print(oper); + Serial.print(" x: "); + Serial.print(x); + Serial.print(" y: "); + Serial.println(y); +#endif + //las variables estaran terminadas en } + float vx, vy; + //pilla valores + int nx = strlen(x); + int ny = strlen(y); + if (x[nx - 1] == '}') + vx = GetValue(x, vars); + else + vx = atof(x); + if (ny <= 0) + vy = 0; + else if (y[ny - 1] == '}') + vy = GetValue(y, vars); + else + vy = atof(y); + switch (oper[0]) + { + case('!'): + return vx != 1; + case('='): + return vx == vy; + case('<'): + { + if (oper[1] == '=') + return vx <= vy; + return vx < vy; + } + + case('>'): + if (oper[1] == '=') + return vx >= vy; + return vx > vy; + } + return false; + } -void MqttDesencadenador::procesaOper(MqttExeParam *p) +int MqttDesencadenador::GetElementosOper(char* oper) { - if(expresion[p->i]<='9' && expresion[p->i]>='0'|| expresion[p->i]=='.'|| expresion[p->i]=='{' || expresion[p->i]==' ' ) - { - p->estado=0; - p->toper=true; - p->oper[p->noper]=0; - /* #ifdef DEBUG_PS - Serial.print("encontrado oper: "); - Serial.println( p->oper); - #endif*/ - } - else - { - p->oper[p->noper++]=expresion[p->i]; - p->i++; - } - + if (oper[0] == '!') + return 1; + else + return 2; +} +void MqttDesencadenador::procesaOper(MqttExeParam* p) +{ + if (expresion[p->i] <= '9' && expresion[p->i] >= '0' || expresion[p->i] == '.' || expresion[p->i] == '{' || expresion[p->i] == ' ') + { + p->estado = 0; + p->toper = true; + p->oper[p->noper] = 0; + #ifdef DEBUG_PS + Serial.print("encontrado oper: "); + Serial.println( p->oper); + #endif + } + else + { + p->oper[p->noper++] = expresion[p->i]; + p->i++; + } } -void MqttDesencadenador::procesaVar(MqttExeParam *p) +void MqttDesencadenador::procesaVar(MqttExeParam* p) { - if((expresion[p->i]<='9' && expresion[p->i]>='0')|| expresion[p->i]=='.') - { - if(p->tvar1) - p->var2[p->nvar2++]=expresion[p->i]; - else - p->var1[p->nvar1++]=expresion[p->i]; - p->i++; - + if ((expresion[p->i] <= '9' && expresion[p->i] >= '0') || expresion[p->i] == '.') + { + if (p->tvar1) + p->var2[p->nvar2++] = expresion[p->i]; + else + p->var1[p->nvar1++] = expresion[p->i]; + p->i++; - } - else - { - p->estado=0; - if(expresion[p->i]=='}') - { - if(p->tvar1) - p->var2[p->nvar2++]=expresion[p->i]; - else - p->var1[p->nvar1++]=expresion[p->i]; - p->i++; - } - if(p->tvar1) - { - p->var2[p->nvar2]=0; - p->tvar2=true; - /* #ifdef DEBUG_PS - Serial.print("encontrado var2: "); - Serial.println( p->var2); - #endif*/ - } - else - { - p->var1[p->nvar1]=0; - p->tvar1=true; - /* #ifdef DEBUG_PS - Serial.print("encontrado var1: "); - Serial.println( p->var1); - #endif*/ - } - } + + } + else + { + p->estado = 0; + if (expresion[p->i] == '}') + { + if (p->tvar1) + p->var2[p->nvar2++] = expresion[p->i]; + else + p->var1[p->nvar1++] = expresion[p->i]; + p->i++; + } + if (p->tvar1) + { + p->var2[p->nvar2] = 0; + p->tvar2 = true; + #ifdef DEBUG_PS + Serial.print("encontrado var2: "); + Serial.println( p->var2); + #endif + } + else + { + p->var1[p->nvar1] = 0; + p->tvar1 = true; + #ifdef DEBUG_PS + Serial.print("encontrado var1: "); + Serial.println( p->var1); + #endif + } + } } -bool MqttDesencadenador::Exe(MqttVarManager *vars) +bool MqttDesencadenador::Exe(MqttVarManager* vars) { - #ifdef DEBUG_PS +#ifdef DEBUG_PS - Serial.print("MqttDesencadenador::Exe: "); - Serial.print(expresion); - Serial.print(" activo: "); - Serial.println(activo); - #endif - //por ahora limite de 2 var - MqttExeParam p; - bool res=false; - while(expresion[p.i]!=0 && p.sigue) - { - /* - #ifdef DEBUG_PS - Serial.print("MqttDesencadenador::Exe: "); - Serial.print(expresion[i]); - Serial.print(" estado "); - Serial.println(estado); - #endif - */ - - switch(p.estado) - { - - case(0)://estado selector - { - //distincion de operar - if(p.toper) - { - if(p.oper[0]=='-' && p.oper[1]=='>') - { - - p.tcausa=true; - p.toper=false; - p.noper=0; - - if(!p.res || !activo) - { - activo=!p.res; - /* #ifdef DEBUG_PS + Serial.print("MqttDesencadenador::Exe: "); + Serial.print(expresion); + Serial.print(" activo: "); + Serial.println(activo); +#endif + //por ahora limite de 2 var + MqttExeParam p; + bool res = false; + while (expresion[p.i] != 0 && p.sigue) + { + /* + #ifdef DEBUG_PS + Serial.print("MqttDesencadenador::Exe: "); + Serial.print(expresion[i]); + Serial.print(" estado "); + Serial.println(estado); + #endif + */ - Serial.println("Fin causa sale "); - #endif*/ - p.sigue=false; - break; - } - else - { - activo=false; - res=true; - /*#ifdef DEBUG_PS - activo=false; - Serial.println("Fin causa sigue "); - #endif*/ - } - } - else if(p.oper[0]=='&') - { - /* #ifdef DEBUG_PS + switch (p.estado) + { - Serial.println("operador and "); - #endif*/ - //p.tcausa=true; - p.toper=false; - p.noper=0; - p.esAnd=true; - - } - else if(p.oper[0]=='|') - { - /*#ifdef DEBUG_PS + case(0)://estado selector + { + //distincion de operar + if (p.toper) + { + if (p.oper[0] == '-' && p.oper[1] == '>') + { - Serial.println("operador or "); - #endif*/ - //p.tcausa=true; - p.toper=false; - p.noper=0; - p.esAnd=false; - } - } - if(p.toper && p.tvar1 &&(GetElementosOper(p.oper)==1 || p.tvar2)) - { - - //valida causa - if(!p.tcausa) - { - //valida causa - if(p.esAnd) - p.res= p.res && Eval(vars, p.oper, p.var1, p.var2 ); - else - p.res=p.res || Eval(vars, p.oper, p.var1, p.var2 ); - - /* #ifdef DEBUG_PS - Serial.print("validaCausa res: "); - Serial.print(p.res); - Serial.print(" esAnd: "); - Serial.println(p.esAnd); - #endif*/ - - } - else - { - //ejecuta efecto - ExeEfecto( vars,p.oper, p.var1, p.var2 ); - } - /*#ifdef DEBUG_PS + p.tcausa = true; + p.toper = false; + p.noper = 0; + p.oper[0] = 0; + if (!p.res || !activo) + { + activo = !p.res; + /* #ifdef DEBUG_PS - Serial.println("Fin oper "); - #endif*/ - p.tvar1=p.tvar2=p.toper=false; - p.nvar1=p.nvar2=p.noper=0; - p.var1[0]=0; - p.var2[0]=0; - } - if(expresion[p.i]==' ')//pasa de los espacios - { - p.i++; - break; - } - - //distincion de escalares - if((expresion[p.i]<='9' && expresion[p.i]>='0') || expresion[p.i]=='.' ) - { - p.estado=1; - if(p.tvar1) - p.nvar2=0; - else - p.nvar1=0; - } - else - { - //distincion de variables - if(expresion[p.i]=='{') - { - p.estado=1; - p.i++; - } - else//distincion de operadores - { - p.estado=2; - } - } - } - break; - case(1)://pillando var o escalar - procesaVar(&p); - break; - case(2)://pilla oper - procesaOper(&p); - break; - } - } - #ifdef DEBUG_PS + Serial.println("Fin causa sale "); + #endif*/ + p.sigue = false; + break; + } + else + { + activo = false; + res = true; + /*#ifdef DEBUG_PS + activo=false; + Serial.println("Fin causa sigue "); + #endif*/ + } + } + else if (p.oper[0] == '&') + { + /* #ifdef DEBUG_PS - Serial.println("MqttDesencadenador::Exe fin"); - #endif - return res; + Serial.println("operador and "); + #endif*/ + //p.tcausa=true; + p.toper = false; + p.noper = 0; + p.esAnd = true; + p.oper[0] = 0; + + } + else if (p.oper[0] == '|') + { + /*#ifdef DEBUG_PS + + Serial.println("operador or "); + #endif*/ + //p.tcausa=true; + p.toper = false; + p.noper = 0; + p.esAnd = false; + } + } + if (p.toper && p.tvar1 && (GetElementosOper(p.oper) == 1 || p.tvar2)) + { + + //valida causa + if (!p.tcausa) + { + //valida causa + if (p.esAnd) + p.res = p.res && Eval(vars, p.oper, p.var1, p.var2); + else + p.res = p.res || Eval(vars, p.oper, p.var1, p.var2); + + /* #ifdef DEBUG_PS + Serial.print("validaCausa res: "); + Serial.print(p.res); + Serial.print(" esAnd: "); + Serial.println(p.esAnd); + #endif*/ + + } + else + { + //ejecuta efecto + ExeEfecto(vars, p.oper, p.var1, p.var2); + } + /*#ifdef DEBUG_PS + + Serial.println("Fin oper "); + #endif*/ + p.tvar1 = p.tvar2 = p.toper = false; + p.nvar1 = p.nvar2 = p.noper = 0; + p.var1[0] = 0; + p.var2[0] = 0; + p.oper[0] = 0; + } + if (expresion[p.i] == ' ')//pasa de los espacios + { + p.i++; + break; + } + + //distincion de escalares + if ((expresion[p.i] <= '9' && expresion[p.i] >= '0') || expresion[p.i] == '.') + { + p.estado = 1; + if (p.tvar1) + p.nvar2 = 0; + else + p.nvar1 = 0; + } + else + { + //distincion de variables + if (expresion[p.i] == '{') + { + p.estado = 1; + p.i++; + } + else//distincion de operadores + { + p.estado = 2; + } + } + } + break; + case(1)://pillando var o escalar + procesaVar(&p); + break; + case(2)://pilla oper + procesaOper(&p); + break; + } + } +#ifdef DEBUG_PS + + Serial.println("MqttDesencadenador::Exe fin"); +#endif + return res; } //******************************************************************* MqttDesencadenadorArray::MqttDesencadenadorArray() { - n=0; + n = 0; } MqttDesencadenador* MqttDesencadenadorArray::Get(int i) { - return &(data[i]); + return &(data[i]); } int MqttDesencadenadorArray::Add(MqttDesencadenador* var) { - data[n]=*var; - strcpy( data[n].expresion,var->expresion); - n++; - return n-1; + data[n] = *var; + strcpy(data[n].expresion, var->expresion); + n++; + return n - 1; } //******************************************************************* MqttDesencadenadorManager::MqttDesencadenadorManager() { - revisa=true; + revisa = true; } void MqttDesencadenadorManager::OnVarChange(int ivar) { - revisa=true; - //marca Accion-- + revisa = true; + //marca Accion-- } -void MqttDesencadenadorManager::inicia( MqttVarManager *v) +void MqttDesencadenadorManager::inicia(MqttVarManager* v) { - vars=v; - if(des.n>0) - { - #ifdef DEBUG_PS - Serial.println("MqttDesencadenador::inicia como listenner"); - #endif - vars->AddListenner(this); - } + vars = v; + if (des.n > 0) + { +#ifdef DEBUG_PS + Serial.println("MqttDesencadenador::inicia como listenner"); +#endif + vars->AddListenner(this); + } } void MqttDesencadenadorManager::Suscribe() { - + } int MqttDesencadenadorManager::OnMqtt(char* topic, char* payload) { - return -1; + return -1; } void MqttDesencadenadorManager::loop() { - if(revisa) - { - revisa=false; - RevisaDesencadenadores(); - } + if (revisa) + { + revisa = false; + RevisaDesencadenadores(); + } } void MqttDesencadenadorManager::RevisaDesencadenadores() { - #ifdef DEBUG_PS - Serial.println("MqttDesencadenadorManager::RevisaDesencadenadores"); - #endif - bool revisa=true; - while(revisa) - { - revisa=false; - for(int i=0; iExe(vars)) - revisa=true; - } - //desmarca Var de volatiles - vars->ResetVolatileVar(); - } - - #ifdef DEBUG_PS - Serial.println("RevisaDesencadenadores fin"); - #endif +#ifdef DEBUG_PS + Serial.println("MqttDesencadenadorManager::RevisaDesencadenadores"); +#endif + bool revisa = true; + while (revisa) + { + revisa = false; + for (int i = 0; i < des.n; i++) + { + if (des.Get(i)->Exe(vars)) + revisa = true; + } + //desmarca Var de volatiles + vars->ResetVolatileVar(); + } + +#ifdef DEBUG_PS + Serial.println("RevisaDesencadenadores fin"); +#endif } -void MqttDesencadenadorManager::AddDes(char *expresion) +void MqttDesencadenadorManager::AddDes(char* expresion) { - MqttDesencadenador d; - strcpy(d.expresion, expresion); - des.Add(&d); + MqttDesencadenador d; + strcpy(d.expresion, expresion); + des.Add(&d); } diff --git a/DomoEsp_v02/MqttDesencadenadorManager.h b/DomoEsp_v02/MqttDesencadenadorManager.h index a1d2e11..6f499ca 100644 --- a/DomoEsp_v02/MqttDesencadenadorManager.h +++ b/DomoEsp_v02/MqttDesencadenadorManager.h @@ -45,7 +45,7 @@ struct MqttExeParam class MqttDesencadenador { public: - char expresion[MAXSTRDESEN];//{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(); @@ -53,15 +53,18 @@ class MqttDesencadenador bool Exe(MqttVarManager *vars); //auxiliar---------------- - void procesaVar(MqttExeParam *p); - void procesaOper(MqttExeParam *p); + void procesaVar(MqttExeParam *p);//recoge expresion de variable o float + void procesaOper(MqttExeParam *p);//recoge operador + MQTTvalor GetVarValue(char*ivar, MqttVarManager *vars); int GetIvar(char*ivar); MqttVar* GetVar(char*ivar, MqttVarManager *vars); int GetElementosOper( char *oper); - bool Eval(MqttVarManager *vars, char *oper, char*x, char*y); - void ExeEfecto(MqttVarManager *vars, char *oper, char*x, char*y); + bool Eval(MqttVarManager *vars, char *oper, char*x, char*y);//evalua operador + + void ExeEfecto(MqttVarManager *vars, char *oper, char*x, char*y);//ejecuta efecto + float GetValue(char *ivar, MqttVarManager *vars); }; diff --git a/DomoEsp_v02/MqttSensManager.cpp b/DomoEsp_v02/MqttSensManager.cpp index a4e71f0..a83755c 100644 --- a/DomoEsp_v02/MqttSensManager.cpp +++ b/DomoEsp_v02/MqttSensManager.cpp @@ -248,11 +248,12 @@ void MqttSensManager::procesaSensor(int i) { MqttSensor *s=sens.Get(i); MqttVar *v=vars->Get(s->ivar); + MQTTvalor val; switch((int)s->tipo) { case((int)MqttSensor::SENS_DHT22)://pilla temperatura y humedad { - MqttVar *vh=vars->Get(s->ie.dht.ivarH); + //MqttVar *vh=vars->Get(s->ie.dht.ivarH); float t,h; for(int i=0; i<4; i++) { @@ -261,27 +262,40 @@ void MqttSensManager::procesaSensor(int i) delay(20); continue; } - v->val.f=t; - vh->val.f=h; + val.f = t; + vars->SetVal(s->ivar, val); + //v->val.f=t; + val.f = h; + vars->SetVal(s->ie.dht.ivarH, val); + //vh->val.f=h; break; } break; } case((int)MqttSensor::SENS_BMP180)://pilla temperatura y humedad { - MqttVar *vp=vars->Get(s->ie.bmp.ivarP); - MqttVar *va=vars->Get(s->ie.bmp.ivarA); + //MqttVar *vp=vars->Get(s->ie.bmp.ivarP); + // MqttVar *va=vars->Get(s->ie.bmp.ivarA); + val.f = s->ie.bmp.p->readTemperature(); + vars->SetVal(s->ivar, val); + val.f = s->ie.bmp.p->readPressure(); + vars->SetVal(s->ie.bmp.ivarP, val); + val.f = s->ie.bmp.p->readAltitude(); + vars->SetVal(s->ie.bmp.ivarA, val); + /* v->val.f=s->ie.bmp.p->readTemperature(); vp->val.i=s->ie.bmp.p->readPressure();//pascales; va->val.f=s->ie.bmp.p->readAltitude(); + */ break; } case((int)MqttSensor::SENS_ANALOG_IN)://pilla temperatura y humedad { if(s->flags & MqttSensor::FLAG_NEG) - v->val.f=100.*((float)(1024- analogRead(s->pin)))/1024; + val.f =100.*((float)(1024- analogRead(s->pin)))/1024; else - v->val.f=100.*((float)(analogRead(s->pin)))/1024; + val.f =100.*((float)(analogRead(s->pin)))/1024; + vars->SetVal(s->ivar, val); break; } /* case((int)MqttSensor::SENS_DIGI_IN): diff --git a/DomoEsp_v02/MqttSensManager.h b/DomoEsp_v02/MqttSensManager.h index 21f8415..da3bcea 100644 --- a/DomoEsp_v02/MqttSensManager.h +++ b/DomoEsp_v02/MqttSensManager.h @@ -159,10 +159,10 @@ class MqttSensManager: public MqttOnVarChangeListenner void inicia(); void loop(); - int OnMqtt(char* topic, char* payload);//entra trama mqtt devuelve indice a sensor cambiado + //int OnMqtt(char* topic, char* payload);//entra trama mqtt devuelve indice a sensor cambiado - void AddSensor(MqttSensor* sens); + //void AddSensor(MqttSensor* sens); // //funcion add sensor //tempe y humedad diff --git a/DomoEsp_v02/MqttUtiles.cpp b/DomoEsp_v02/MqttUtiles.cpp index a40e0be..a3e9af0 100644 --- a/DomoEsp_v02/MqttUtiles.cpp +++ b/DomoEsp_v02/MqttUtiles.cpp @@ -210,8 +210,8 @@ void MqttManager::OnMqtt(char* topic, byte* payload, unsigned int length) if(Mqttlistener==NULL) return; int i; - char buf[32]; - i=30; + char buf[MAXTOPICVAR]; + i= MAXTOPICVAR-1; if(i>length) i=length; memcpy(buf, payload, i); diff --git a/DomoEsp_v02/MqttUtiles.h b/DomoEsp_v02/MqttUtiles.h index 9d19927..da0541f 100644 --- a/DomoEsp_v02/MqttUtiles.h +++ b/DomoEsp_v02/MqttUtiles.h @@ -90,7 +90,7 @@ class MqttManager void inicia(PubSubClient *mqttClient,char *ideEsp, char *host, int port, MqttReceiver* classReceiver); bool loop(); - void desconecta(); + //void desconecta(); //auxiliar------------------ static void OnMqtt(char* topic, byte* payload, unsigned int length); diff --git a/DomoEsp_v02/MqttVarManager.cpp b/DomoEsp_v02/MqttVarManager.cpp index d933b21..7ae05af 100644 --- a/DomoEsp_v02/MqttVarManager.cpp +++ b/DomoEsp_v02/MqttVarManager.cpp @@ -35,9 +35,17 @@ int MqttTopicAttay::Add(char *topic) return i; } i=n; + if (n >= MAXVAR) + return-1; n=n+1; ind[i]=nst; nst=nst+strlen(topic)+1; + if (nst > MAXSTR) + { + n--; + return-1; + } + strcpy(Get(i), topic); return i; } @@ -57,9 +65,20 @@ MqttVarArray::MqttVarArray() n=0; } -MqttVar* MqttVarArray:: Get(int i) +MqttVar* MqttVarArray::Get(int i) { - return &(data[i]); + if (i < 0 || i >= n) + { +#ifdef DEBUG_PS + Serial.print("qttVarArray:: Get var no encontrada: "); + Serial.print(i); + Serial.print(" n: "); + Serial.println(i); + +#endif + return NULL; + } + return &(data[i]); } MqttVar* MqttVarArray::GetVar(int itopic) @@ -74,6 +93,15 @@ MqttVar* MqttVarArray::GetVar(int itopic) int MqttVarArray::Add(MqttVar* var) { + if (n >= MAXVAR) + { +#ifdef DEBUG_PS + Serial.print("MqttVarArray::Add max var alcanzado: "); + Serial.println(n); +#endif + return -1; + } + data[n]=*var; n++; return n-1; @@ -88,7 +116,7 @@ MqttVarManager::MqttVarManager() nListenner=0; for (int i=0; in; i++) { v=vars->Get(i); @@ -170,23 +198,21 @@ void MqttVarManager::OnMqtt(char* topic, char* payload) if(v->flags & MqttVar::FLOAT_VAR) { float ff=v->val.f; - v->val.f=atof(payload); - if(ff!=v->val.f) - res=i; + val.f=atof(payload); + } else { int ii=v->val.i; - v->val.i=atoi(payload); - if(ii!=v->val.i) - res=i; + val.i=atoi(payload); } + SetVal(i, val); break;//suponemos solo una variable con el mismo topic } } - if(res>=0) - OnChange(res, isSet); + //if(res>=0) + // OnChange(res, isSet); return; } @@ -203,8 +229,8 @@ void MqttVarManager::loop() void MqttVarManager::PublicaVar(int ivar) { - char buffer_t[32]; - char buffer_p[24]; + char buffer_t[MAXTOPICVAR]; + char buffer_p[MAXTOPICVAR]; MqttVar* v=vars->Get(ivar); if(v->flags & MqttVar::CHANGE_VAR) { @@ -215,7 +241,7 @@ void MqttVarManager::PublicaVar(int ivar) Serial.println(buffer_t); #endif } - else + else//in var { sprintf(buffer_t, "%s/get",topics->Get(v->topic)); @@ -243,9 +269,7 @@ void MqttVarManager::PublicaVars() { v=vars->Get(i); if(v->flags & f) - { PublicaVar(i); - } } } void MqttVarManager::inicia(PubSubClient* client_mqtt) @@ -256,7 +280,7 @@ void MqttVarManager::inicia(PubSubClient* client_mqtt) void MqttVarManager::Suscribe() { //suscribe a mqtt------------ - char buffer_t[32]; + char buffer_t[MAXTOPICVAR]; MqttVar* v; for(int i=0; in; i++) { @@ -355,6 +379,7 @@ void MqttVarManager::ResetVolatileVar() MqttVar* v=vars->Get(i); if(v->flags& MqttVar::VOLATILE_VAR) { + if(v->flags & MqttVar::FLOAT_VAR) v->val.f=0; else @@ -384,13 +409,13 @@ void MqttVarManager::SetVal(int ivar,MQTTvalor val) Serial.println( val.f); #endif MqttVar* v=vars->Get(ivar); + bool cambia = false; + if (v->flags & MqttVar::FLOAT_VAR) + cambia = val.f != v->val.f; + else + cambia = val.i != v->val.i; + v->val=val; - #ifdef DEBUG_PS - - Serial.print("MqttVarManager::SetVal out i: "); - Serial.print( v->val.i); - Serial.print(" f: "); - Serial.println( v->val.f); - #endif - OnChange(ivar, true); + if(cambia) + OnChange(ivar, true); } diff --git a/DomoEsp_v02/MqttVarManager.h b/DomoEsp_v02/MqttVarManager.h index 275e2ba..d6c09c9 100644 --- a/DomoEsp_v02/MqttVarManager.h +++ b/DomoEsp_v02/MqttVarManager.h @@ -37,13 +37,13 @@ class MqttVar enum TipoFlags//indica el tipo de sensor { OUT_VAR=0x01,//variable de salida (acepta set) - IN_VAR=0x02,//variable de entrada (publica get) + IN_VAR=0x02,//variable de entrada (publica get) (publica cada x tiempo) PRIV_VAR=0x04,//variable privada de entrada (acepta get como si fueran set) FLOAT_VAR=0x08,//variable en coma flotante - ACCION_VAR=0x10,//variable de accion (publica en cada cambio) + ACCION_VAR=0x10,//variable de accion (publica en cada cambio onchange si se le llama como publicar) VOLATILE_VAR=0x20, //marca variable que una vez revisada se cambia internamente su valor (usado en desencadenadores para variables de accion) CHANGE_VAR=0x40, //publica con set en lugar de get - + }; public: diff --git a/DomoEsp_v02/MqttWOLManager.cpp b/DomoEsp_v02/MqttWOLManager.cpp new file mode 100644 index 0000000..0dcd190 --- /dev/null +++ b/DomoEsp_v02/MqttWOLManager.cpp @@ -0,0 +1,36 @@ + +#include +#include +#include "MqttWOLManager.h" + +MqttWOLManager::MqttWOLManager() +{ + topic[0]=0; +} +void MqttWOLManager::inicia(WakeOnLan *pwol) +{ + wol=pwol; +} +void MqttWOLManager::loop() +{ + +} +int MqttWOLManager::OnMqtt(char* top, char* payload) +{ + if(strcmp(top,topic)) + return -1; + + wol->sendMagicPacket(payload); // Send Wake On Lan packet with the above MAC address. Default to port 9. + #ifdef DEBUG_PS + Serial.print("Enviado wol a: "); + Serial.println(payload); + #endif + // WOL.sendMagicPacket(MACAddress, 7); // Change the port number + +} +void MqttWOLManager::suscribe(PubSubClient *client_qqtt) +{ + if(!topic[0]) + return; + client_qqtt->subscribe(topic); +} diff --git a/DomoEsp_v02/MqttWOLManager.h b/DomoEsp_v02/MqttWOLManager.h new file mode 100644 index 0000000..8b7c10d --- /dev/null +++ b/DomoEsp_v02/MqttWOLManager.h @@ -0,0 +1,22 @@ + +#ifndef MqttWOLManagerdef +#define MqttWOLManagerdef 1 +#include "MqttDefines.h" +class WakeOnLan; + +class MqttWOLManager +{ + WakeOnLan* wol; + public: + char topic[MAXSTR];//topic para llamada wol + + MqttWOLManager(); + + + void inicia(WakeOnLan* pwol); + void loop();//publica datos variables + int OnMqtt(char* topic, char* payload); + void suscribe(PubSubClient *client_qqtt); + +}; +#endif diff --git a/DomoEsp_v02/__vm/.DomoEsp_v02.vsarduino.h b/DomoEsp_v02/__vm/.DomoEsp_v02.vsarduino.h new file mode 100644 index 0000000..8a6c09d --- /dev/null +++ b/DomoEsp_v02/__vm/.DomoEsp_v02.vsarduino.h @@ -0,0 +1,141 @@ +/* + Editor: https://www.visualmicro.com/ + This file is for intellisense purpose only. + Visual micro (and the arduino ide) ignore this code during compilation. This code is automatically maintained by visualmicro, manual changes to this file will be overwritten + The contents of the _vm sub folder can be deleted prior to publishing a project + All non-arduino files created by visual micro and all visual studio project or solution files can be freely deleted and are not required to compile a sketch (do not delete your own code!). + Note: debugger breakpoints are stored in '.sln' or '.asln' files, knowledge of last uploaded breakpoints is stored in the upload.vmps.xml file. Both files are required to continue a previous debug session without needing to compile and upload again + + Hardware: NodeMCU 1.0 (ESP-12E Module), Platform=esp8266, Package=esp8266 +*/ + +#if defined(_VMICRO_INTELLISENSE) + +#ifndef _VSARDUINO_H_ +#define _VSARDUINO_H_ +#define __ESP8266_esp8266__ +#define __ESP8266_ESP8266__ +#define __ets__ +#define ICACHE_FLASH +#define _GNU_SOURCE +#define MMU_IRAM_SIZE 0x8000 +#define MMU_ICACHE_SIZE 0x8000 +#define NONOSDK22x_190703 1 +#define F_CPU 80000000L +#define LWIP_OPEN_SRC +#define TCP_MSS 536 +#define LWIP_FEATURES 1 +#define LWIP_IPV6 0 +#define ARDUINO 108016 +#define ARDUINO_ESP8266_NODEMCU_ESP12E +#define ARDUINO_ARCH_ESP8266 +#define LED_BUILTIN 2 +#define FLASHMODE_DIO +#define ESP8266 +#define __cplusplus 201103L +#undef __cplusplus +#define __cplusplus 201103L +#define __STDC__ +#define __ARM__ +#define __arm__ +#define __inline__ +#define __asm__(x) +#define __asm__ +#define __extension__ +#define __ATTR_PURE__ +#define __ATTR_CONST__ +#define __volatile__ + + +#define __ASM +#define __INLINE +#define __attribute__(noinline) + +//#define _STD_BEGIN +//#define EMIT +#define WARNING +#define _Lockit +#define __CLR_OR_THIS_CALL +#define C4005 +#define _NEW + +//typedef int uint8_t; +//#define __ARMCC_VERSION 400678 +//#define PROGMEM +//#define string_literal +// +//#define prog_void +//#define PGM_VOID_P int +// + +typedef int _read; +typedef int _seek; +typedef int _write; +typedef int _close; +typedef int __cleanup; + +//#define inline + +#define __builtin_clz +#define __builtin_clzl +#define __builtin_clzll +#define __builtin_labs +#define __builtin_va_list +typedef int __gnuc_va_list; + +#define __ATOMIC_ACQ_REL + +#define __CHAR_BIT__ +#define _EXFUN() + +typedef unsigned char byte; +extern "C" void __cxa_pure_virtual() {;} + + +typedef long __INTPTR_TYPE__ ; +typedef long __UINTPTR_TYPE__ ; +typedef long __SIZE_TYPE__ ; +typedef long __PTRDIFF_TYPE__; + +// Additions needed for v3.0.0 Core - Needs to be conditional on it being this core really!! +#ifndef isnan +#undef _Lockit +#undef __STDC__ +#define __STDC__ 1 +#define __CHAR_BIT__ 1 +extern int isinf(double); +extern int isnan(double); +extern int fpclassify(double); +extern int signbit(double); +extern int isfinite(double); +extern int isnormal(double); +extern int isgreater(double, double); +extern int isgreaterequal(double); +extern int isless(double, double); +extern int islessequal(double, double); +extern int islessgreater(double, double); +extern int isunordered(double, double); +#endif + +#include "new" +#include "Esp.h" + + +#include "arduino.h" +#include + +#include "..\generic\Common.h" +#include "..\generic\pins_arduino.h" + +#undef F +#define F(string_literal) ((const PROGMEM char *)(string_literal)) +#undef PSTR +#define PSTR(string_literal) ((const PROGMEM char *)(string_literal)) +//current vc++ does not understand this syntax so use older arduino example for intellisense +//todo:move to the new clang/gcc project types. +#define interrupts() sei() +#define noInterrupts() cli() + +#include "DomoEsp_v02.ino" +#endif +#endif diff --git a/DomoEsp_v02/__vm/Compile.vmps.xml b/DomoEsp_v02/__vm/Compile.vmps.xml new file mode 100644 index 0000000..6653ba0 --- /dev/null +++ b/DomoEsp_v02/__vm/Compile.vmps.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + 84 #if CON_WOL +85 pwol=&WOL; +86 #endif +87 domoManager.inicia(pwol,plcd,&clienteMqtt,&EspClient,&ConfiguracionActual); +88 +89 } +90 +-->91 void loop() +92 { +93 domoManager.loop(); +94 } + + + + + + + + \ No newline at end of file diff --git a/DomoEsp_v02/__vm/Configuration.Debug.vmps.xml b/DomoEsp_v02/__vm/Configuration.Debug.vmps.xml new file mode 100644 index 0000000..87fc142 --- /dev/null +++ b/DomoEsp_v02/__vm/Configuration.Debug.vmps.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/DomoEsp_v02/config_rf.h b/DomoEsp_v02/config_rf.h index 9a8775f..1e81127 100644 --- a/DomoEsp_v02/config_rf.h +++ b/DomoEsp_v02/config_rf.h @@ -1,7 +1,50 @@ //parametros configurables************************************************* #define DEBUG_PS 1//Descomentar para debug #define CON_LCD 0 +#define CON_WOL 0 //va por 16 + class CocinapRUBDomoConfig: public DomoConfig +{ + public: + CocinapRUBDomoConfig() + { + velocidadPortSerie=115200; + strcpy(ssidWifi,"Idhun");//nombre wifi + strcpy(keyWifi,"Ardileorca1234.");//key wifi + strcpy(ideEsp,"Esp8266_P");//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, MqttWOLManager* wol, MqttDesencadenadorManager *des) + { + sens->AddHDT22(D4, "casa/cocina");//01 + sens->AddDinRetardOff(D5, 60,"casa/p/mov");//2 + int mov=2; + sens->AddAnalogIn(0, "casa/p/luz",true);//3 + int luz=3; + sens->AddDin( D1, "casa/p/inter");//4 + int interr=4; + sens->AddDout(D2, "casa/p/lam", false);//5 + int lam=5; + int lauto= vars->AddVirtualOutVarInt( "casa/p/luzAuto");//variable privada + char st[64]; + + //Efecto Pulsadores + sprintf(st,"{%d}>0 -> !{%d} ",interr,lam);//accion interruptor + des->AddDes(st); + sprintf(st,"{%d}<1 -> !{%d} ",interr,lam);//accion interruptor + des->AddDes(st); + + sprintf(st,"{%d}<1&{%d}>0&{%d}=1 -> {%d}=0 ",mov,lauto,lam,lam);//apaga luz si no hay nadie + des->AddDes(st); + sprintf(st,"{%d}>20&{%d}>0&{%d}>0 -> {%d}=1 ",luz,mov,lauto,lam);//enciende luz si hay presencia y esta oscuro + des->AddDes(st); + + } +}; class ActDomoConfig: public DomoConfig { public: @@ -31,7 +74,7 @@ class ActDomoConfig: public DomoConfig } //configuracion de sensores, variables, lcd--------------------------------- - virtual void ConfigGen(MqttSensManager* sens, MqttVarManager* vars, LcdMQTTViewer *lcd, MqttDesencadenadorManager *des) + virtual void ConfigGen(MqttSensManager* sens, MqttVarManager* vars, LcdMQTTViewer *lcd, MqttWOLManager* wol, MqttDesencadenadorManager *des) { //sensores-------------------------------------------------------- /* @@ -137,7 +180,7 @@ class PulSalonPruebConfig: public DomoConfig } //configuracion de sensores, variables, lcd--------------------------------- - virtual void ConfigGen(MqttSensManager* sens, MqttVarManager* vars, LcdMQTTViewer *lcd, MqttDesencadenadorManager *des) + virtual void ConfigGen(MqttSensManager* sens, MqttVarManager* vars, LcdMQTTViewer *lcd, MqttWOLManager* wol, MqttDesencadenadorManager *des) { //sensores-------------------------------------------------------- @@ -179,7 +222,7 @@ class AutomatismosDomoConfig: public DomoConfig } //configuracion de sensores, variables, lcd--------------------------------- - virtual void ConfigGen(MqttSensManager* sens, MqttVarManager* vars, LcdMQTTViewer *lcd, MqttDesencadenadorManager *des) + virtual void ConfigGen(MqttSensManager* sens, MqttVarManager* vars, LcdMQTTViewer *lcd, MqttWOLManager* wol, MqttDesencadenadorManager *des) { //sensores-------------------------------------------------------- /* @@ -244,72 +287,13 @@ class AutomatismosDomoConfig: public DomoConfig } }; -class PulCocinaConfig: public DomoConfig -{ - public: - PulCocinaConfig() - { - velocidadPortSerie=115200; - strcpy(ssidWifi,"Idhun");//nombre wifi - strcpy(keyWifi,"Ardileorca1234.");//key wifi - - strcpy(ideEsp,"Esp8266_Pulcocina");//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->AddDinRetardOn(D1,5,"casa/p/pul"); - 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: PulSalonConfig() { + //CON LCD Y WOL velocidadPortSerie=115200; strcpy(ssidWifi,"Idhun");//nombre wifi strcpy(keyWifi,"Ardileorca1234.");//key wifi @@ -334,7 +318,7 @@ class PulSalonConfig: public DomoConfig } //configuracion de sensores, variables, lcd--------------------------------- - virtual void ConfigGen(MqttSensManager* sens, MqttVarManager* vars, LcdMQTTViewer *lcd, MqttDesencadenadorManager *des) + virtual void ConfigGen(MqttSensManager* sens, MqttVarManager* vars, LcdMQTTViewer *lcd, MqttWOLManager* wol, MqttDesencadenadorManager *des) { //sensores-------------------------------------------------------- /* @@ -387,7 +371,7 @@ class DespachoDomoConfig: public DomoConfig } //configuracion de sensores, variables, lcd--------------------------------- - virtual void ConfigGen(MqttSensManager* sens, MqttVarManager* vars, LcdMQTTViewer *lcd, MqttDesencadenadorManager *des) + virtual void ConfigGen(MqttSensManager* sens, MqttVarManager* vars, LcdMQTTViewer *lcd,MqttWOLManager* wol, MqttDesencadenadorManager *des) { //sensores-------------------------------------------------------- sens->AddHDT22(D4, "casa/desp"); @@ -410,6 +394,7 @@ class DespachoDomoConfig: public DomoConfig lcd->add(temExt,"T Ext: %s",0,2); lcd->add(hExt,"H Ext: %s",1,2); strcpy(lcd->topic,"casa/desp/msg"); + strcpy(wol->topic,"casa/wol"); } }; class CocinaDomoConfig: public DomoConfig @@ -427,7 +412,7 @@ class CocinaDomoConfig: public DomoConfig refresTimeSens=15;//tiempo de refresco en segundos de los sensores } //configuracion de sensores--------------------------------- - virtual void ConfigGen(MqttSensManager* sens, MqttVarManager* vars, LcdMQTTViewer *lcd, MqttDesencadenadorManager *des) + virtual void ConfigGen(MqttSensManager* sens, MqttVarManager* vars, LcdMQTTViewer *lcd, MqttWOLManager* wol, MqttDesencadenadorManager *des) { sens->AddHDT22(D4, "casa/cocina");//01 sens->AddDinRetardOff(D5, 60,"casa/cocina/mov");//2 @@ -437,17 +422,20 @@ class CocinaDomoConfig: public DomoConfig sens->AddDin( D1, "casa/cocina/inter");//4 sens->AddDout(D2, "casa/cocina/lam", false);//5 int lam=5; - int lauto= vars->AddVirtualOutVarInt( "casa/cocina/luzAuto");//variable privada + int lauto= vars->AddVirtualOutVarInt( "casa/cocina/luzAuto"); char st[64]; //Efecto Pulsadores - sprintf(st,"{%d}>0 -> !{%d} ",4,5);//accion interruptor + + sprintf(st,"{%d}>0 -> !{%d} ",4,lam);//accion interruptor des->AddDes(st); - sprintf(st,"{%d}<1 -> !{%d} ",4,5);//accion interruptor + + sprintf(st,"{%d}<1 -> !{%d} ",4,lam);//accion interruptor des->AddDes(st); + sprintf(st,"{%d}<1&{%d}>0&{%d}=1 -> {%d}=0 ",mov,lauto,lam,lam);//apaga luz si no hay nadie des->AddDes(st); - sprintf(st,"{%d}<20&{%d}>0&{%d}>0&{%d}=0 -> {%d}=1 ",luz,mov,lauto,lam,lam);//enciende luz si hay presencia y esta oscuro + sprintf(st,"{%d}<20&{%d}>0&{%d}>0 -> {%d}=1 ",luz,mov,lauto,lam);//enciende luz si hay presencia y esta oscuro des->AddDes(st); } @@ -467,14 +455,14 @@ class SalonDomoConfig: public DomoConfig refresTimeSens=15;//tiempo de refresco en segundos de los sensores } //configuracion de sensores--------------------------------- - virtual void ConfigGen(MqttSensManager* sens, MqttVarManager* vars, LcdMQTTViewer *lcd, MqttDesencadenadorManager *des) + virtual void ConfigGen(MqttSensManager* sens, MqttVarManager* vars, LcdMQTTViewer *lcd, MqttWOLManager* wol, MqttDesencadenadorManager *des) { sens->AddHDT22(D4, "casa/Salon");//01 sens->AddDinRetardOff(D5, 60,"casa/Salon/mov");//2 sens->AddAnalogIn(0, "casa/Salon/luz",true);//3 //variables---------------------------------------------------- - + //variables para pulsadores--------------------------- int lamb= vars->AddInternalVarInt( "casa/Salon/LAmb"); int lchim= vars->AddInternalVarInt( "casa/Salon/LChime"); int lent= vars->AddInternalVarInt( "casa/Salon/LEnt"); @@ -484,7 +472,14 @@ class SalonDomoConfig: public DomoConfig int pul3= vars->AddInternalVarInt( "casa/Salon/pul3"); int pulIall= vars->AddInternalVarInt( "casa/Salon/intAll"); int pulAll= vars->AddInternalVarInt( "casa/Salon/pulAll"); - +/* + int cociMov= vars->AddInternalVarInt( "casa/cocina/mov"); + int cociLuz= vars->AddInternalVarInt( "casa/cocina/luz"); + int cociLam= vars->AddInternalVarInt( "casa/cocina/lam"); + int cociAuto= vars->AddInternalVarInt("casa/cocina/luzAuto"); + */ + //variables para pulsadores cocina---------------------------- + //desencadenaores---------- char st[64]; //Efecto Interruptor----- @@ -501,7 +496,13 @@ class SalonDomoConfig: public DomoConfig des->AddDes(st); sprintf(st,"{%d}>0 -> !{%d} ",pul3,lent);//terminar en espacios des->AddDes(st); - +/* + //variablaes cocina + sprintf(st,"{%d}<1&{%d}>0&{%d}=1 -> {%d}=0 ",cociMov,cociAuto,cociLam,cociLam);//apaga luz si no hay nadie + des->AddDes(st); + sprintf(st,"{%d}<20&{%d}>0&{%d}>0 -> {%d}=1 ",cociLuz,cociMov,cociAuto,cociLam);//enciende luz si hay presencia y esta oscuro + des->AddDes(st); + */ } }; @@ -520,7 +521,7 @@ class ExteriorDomoConfig: public DomoConfig refresTimeSens=15;//tiempo de refresco en segundos de los sensores } //configuracion de sensores--------------------------------- - virtual void ConfigGen(MqttSensManager* sens, MqttVarManager* vars, LcdMQTTViewer *lcd, MqttDesencadenadorManager *des) + virtual void ConfigGen(MqttSensManager* sens, MqttVarManager* vars, LcdMQTTViewer *lcd, MqttWOLManager* wol, MqttDesencadenadorManager *des) { sens->AddHDT22(D2, "casa/ext"); sens->AddAnalogIn(0, "casa/ext/lluvia",true); @@ -531,4 +532,4 @@ class ExteriorDomoConfig: public DomoConfig //configuracion que se usara-------------------------- -CocinaDomoConfig ConfiguracionActual; +SalonDomoConfig ConfiguracionActual; diff --git a/DomoEsp_v02/sube.bat b/DomoEsp_v02/sube.bat new file mode 100644 index 0000000..0a4e144 --- /dev/null +++ b/DomoEsp_v02/sube.bat @@ -0,0 +1,2 @@ +"c:\Program Files (x86)\Arduino\arduino.exe" --board arduino:avr:nano:cpu=atmega168 --port /dev/ttyACM0 --upload /path/to/sketch/sketch.ino +pause \ No newline at end of file