DomoEsp_v1/DomoEsp_v01/MqttVarManager.h

125 lines
2.9 KiB
C++

/*#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif*/
#ifndef MqttvarManagerDef
#define MqttvarManagerDef 1
#include "MqttDefines.h"
#define MAXTOPICVAR 24//maximo de caracteres de los topic de las variables
#define MAXTVARARRAY 64//maximo de variables que puede contener el amqttvarArray
class PubSubClient;
//array de topic
class MqttTopicAttay
{
public:
char str[1024];//topic de mqtt asociado
int ind[32];
int nst;
int n;
MqttTopicAttay();
char* Get(int i);
int Get(char *topic);
int Add(char *topic);
};
union MQTTvalor
{
float f;
byte i;
};
class MqttVar
{
public:
enum TipoFlags//indica el tipo de sensor
{
OUT_VAR=0x01,//variable de salida (acepta set)
IN_VAR=0x02,//variable de entrada (publica get)
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)
VOLATILE_VAR=0x20 //marca variable que una vez revisada se cambia internamente su valor (usado en desencadenadores para variables de accion)
};
public:
//generales---------------------------------------------------------------------
byte flags;
MQTTvalor val;//valor de la variable (tiene que ser union porque puede ser double)
byte topic;//topic de mqtt asociado
MqttVar();
};
//array de variables--------------------------------------------------------------
class MqttVarArray
{
public:
MqttVar data[64];//array de variables
int n;
MqttVarArray();
MqttVar* Get(int i);
MqttVar* GetVar(int itopic);
int Add(MqttVar* var);
};
class MqttOnVarChangeListenner;
//manager de variables------------------------------------------------------
class MqttVarManager
{
MqttVarArray _v;
MqttTopicAttay _t;
MqttOnVarChangeListenner* onChangeListener[2];
int nListenner;
public:
MqttVarArray* vars;//variables mqtt
MqttTopicAttay* topics;
PubSubClient* client_qqtt;//cliente mqtt
unsigned long tiempo_var;
unsigned long incre_tvar;
MqttVarManager();
void config(MqttVarArray *vArray=NULL, MqttTopicAttay* t=NULL);
void SetTimeRefres(int seg);
void inicia(PubSubClient *client_qqtt);//inicia variables si hace falta
void Suscribe();//subscribe variables a mqtt
void OnMqtt(char* topic, char* payload);//entra trama mqtt devuelve indice a sensor cambiado
void loop();//publica datos variables
//funciones auxiliares----------------------------
void AddListenner(MqttOnVarChangeListenner *pOnChangeListener);
MqttVar* Get(int i);
int AddVar(byte flags, char*topic);
int AddInternalVarFloat( char*topic);
int AddInternalVarInt( char*topic);
void PublicaVars();
void PublicaVar(int ivar);
void OnChange(int ivar);
void ResetVolatileVar();
void InvierteVar(int ivar);
void SetVal(int ivar,MQTTvalor val);
};
/*
*/
#endif