diff --git a/lighthub/item.cpp b/lighthub/item.cpp index c8c497d..e2443fe 100644 --- a/lighthub/item.cpp +++ b/lighthub/item.cpp @@ -47,28 +47,29 @@ const char DECREASE_P[] PROGMEM = "DECREASE"; const char TRUE_P[] PROGMEM = "true"; const char FALSE_P[] PROGMEM = "false"; +const char HEAT_P[] PROGMEM = "HEAT"; +const char COOL_P[] PROGMEM = "COOL"; +const char AUTO_P[] PROGMEM = "AUTO"; + const char SET_P[] PROGMEM = "set"; const char CMD_P[] PROGMEM = "cmd"; -const char TEMP_P[] PROGMEM = "temp"; const char MODE_P[] PROGMEM = "mode"; +/* +const char TEMP_P[] PROGMEM = "temp"; const char SETPOINT_P[] PROGMEM = "setpoint"; const char POWER_P[] PROGMEM = "power"; const char VOL_P[] PROGMEM = "vol"; const char HEAT_P[] PROGMEM = "heat"; +*/ const char HSV_P[] PROGMEM = "hsv"; const char RGB_P[] PROGMEM = "rgb"; const char RPM_P[] PROGMEM = "rpm"; +const char STATE_P[] PROGMEM = "state"; short modbusBusy = 0; extern aJsonObject *pollingItem; - - -//int modbusSet(int addr, uint16_t _reg, int _mask, uint16_t value); - extern PubSubClient mqttClient; extern int8_t ethernetIdleCount; -//extern char outprefix[]; -//const char outprefix[] PROGMEM = OUTTOPIC; static unsigned long lastctrl = 0; static aJsonObject *lastobj = NULL; @@ -77,18 +78,21 @@ int txt2cmd(char *payload) { int cmd = -1; // Check for command - if (strcmp_P(payload, ON_P) == 0) cmd = CMD_ON; + if (*payload == '-' || (*payload >= '0' && *payload <= '9')) cmd = CMD_NUM; + else if (strcmp_P(payload, ON_P) == 0) cmd = CMD_ON; else if (strcmp_P(payload, OFF_P) == 0) cmd = CMD_OFF; else if (strcmp_P(payload, REST_P) == 0) cmd = CMD_RESTORE; else if (strcmp_P(payload, TOGGLE_P) == 0) cmd = CMD_TOGGLE; else if (strcmp_P(payload, HALT_P) == 0) cmd = CMD_HALT; else if (strcmp_P(payload, XON_P) == 0) cmd = CMD_XON; else if (strcmp_P(payload, XOFF_P) == 0) cmd = CMD_XOFF; + else if (strcmp_P(payload, HEAT_P) == 0) cmd = CMD_HEAT; + else if (strcmp_P(payload, COOL_P) == 0) cmd = CMD_COOL; + else if (strcmp_P(payload, AUTO_P) == 0) cmd = CMD_AUTO; else if (strcmp_P(payload, TRUE_P) == 0) cmd = CMD_ON; else if (strcmp_P(payload, FALSE_P) == 0) cmd = CMD_OFF; else if (strcmp_P(payload, INCREASE_P) == 0) cmd = CMD_UP; else if (strcmp_P(payload, DECREASE_P) == 0) cmd = CMD_DN; - else if (*payload == '-' || (*payload >= '0' && *payload <= '9')) cmd = CMD_NUM; //0 else if (*payload == '{') cmd = CMD_JSON; else if (*payload == '#') cmd = CMD_RGB; else if (strncmp_P(payload, HSV_P, strlen (HSV_P)) == 0) cmd = CMD_HSV; @@ -103,14 +107,15 @@ int txt2subItem(char *payload) { // Check for command if (strcmp_P(payload, SET_P) == 0) cmd = S_SET; else if (strcmp_P(payload, CMD_P) == 0) cmd = S_CMD; - else if (strcmp_P(payload, TEMP_P) == 0) cmd = S_TEMP; else if (strcmp_P(payload, MODE_P) == 0) cmd = S_MODE; - else if (strcmp_P(payload, SETPOINT_P) == 0) cmd = S_SETPOINT; - else if (strcmp_P(payload, POWER_P) == 0) cmd = S_POWER; - else if (strcmp_P(payload, VOL_P) == 0) cmd = S_VOL; - else if (strcmp_P(payload, HEAT_P) == 0) cmd = S_HEAT; else if (strcmp_P(payload, HSV_P) == 0) cmd = S_HSV; else if (strcmp_P(payload, RGB_P) == 0) cmd = S_RGB; + /* UnUsed now + else if (strcmp_P(payload, SETPOINT_P) == 0) cmd = S_SETPOINT; + else if (strcmp_P(payload, TEMP_P) == 0) cmd = S_TEMP; + else if (strcmp_P(payload, POWER_P) == 0) cmd = S_POWER; + else if (strcmp_P(payload, VOL_P) == 0) cmd = S_VOL; + else if (strcmp_P(payload, HEAT_P) == 0) cmd = S_HEAT; */ return cmd; } @@ -135,11 +140,13 @@ void Item::Parse() { switch (itemType) { +#ifndef SPILED_DISABLE case CH_SPILED: driver = new out_SPILed (this); // debugSerial<name << F(" T:") << itemType << F(" =") << getArg() << endl; } @@ -292,12 +299,14 @@ void Item::copyPar (aJsonObject *itemV) } */ +/* #if defined(ARDUINO_ARCH_ESP32) void analogWrite(int pin, int val) { //TBD } #endif +*/ /* boolean Item::getEnableCMD(int delta) { @@ -312,7 +321,6 @@ int Item::Ctrl(char * payload, boolean send, char * subItem){ if (!payload) return 0; char* suffix = NULL; -//int subItemN = 0; int suffixCode = 0; int setCommand = CMD_SET; //default SET behavior now - not turn on channels @@ -337,9 +345,6 @@ else suffix = NULL; // myhome/dev/item/subItem } - - -//if (suffixCode==S_SET) isSet = true; } else { //suffixCode=S_SET; /// no subItem - To be removed - old compatmode @@ -385,16 +390,6 @@ debugSerial<0) return 1; // Parameters are stored, no further action required break; @@ -539,6 +538,9 @@ int Item::Ctrl(short cmd, short n, int *Parameters, boolean send, int suffixCode if (itemType != CH_GROUP) return -3; } case CMD_ON: + case CMD_COOL: + case CMD_AUTO: + case CMD_HEAT: if (itemType==CH_RGBW && getCmd() == CMD_ON /*&& getEnableCMD(500) */) { debugSerial<0) return 1; { short params = 0; @@ -589,7 +590,7 @@ int Item::Ctrl(short cmd, short n, int *Parameters, boolean send, int suffixCode Par[1] = st.s; Par[2] = st.v; params = 3; - SendStatus(SEND_COMMAND | SEND_PARAMETERS | SEND_DEFFERED); // Send restored triplet. In any cases + SendStatus(SEND_COMMAND | SEND_PARAMETERS); // Send restored triplet. In any cases break; case CH_VCTEMP: @@ -599,7 +600,7 @@ int Item::Ctrl(short cmd, short n, int *Parameters, boolean send, int suffixCode case CH_VC: Par[0] = st.aslong; params = 1; - SendStatus(SEND_COMMAND | SEND_PARAMETERS | SEND_DEFFERED); // Send restored parameter, even if send=false - no problem, loop will be supressed at next hop + SendStatus(SEND_COMMAND | SEND_PARAMETERS); // Send restored parameter, even if send=false - no problem, loop will be supressed at next hop break; case CH_THERMO: Par[0] = st.aslong; @@ -636,13 +637,13 @@ int Item::Ctrl(short cmd, short n, int *Parameters, boolean send, int suffixCode Par[0] = 100; params = 1; setVal(100); - if (send) SendStatus(SEND_COMMAND); + if (send) SendStatus(SEND_COMMAND | SEND_DEFFERED); break; default: Par[0] = 100; params = 1; setVal(100); - SendStatus(SEND_COMMAND | SEND_PARAMETERS); + SendStatus(SEND_COMMAND | SEND_PARAMETERS | SEND_DEFFERED); } } // default handler for (short i = 0; i < params; i++) { @@ -771,12 +772,10 @@ int Item::Ctrl(short cmd, short n, int *Parameters, boolean send, int suffixCode case CH_GROUP://Group { - //aJsonObject *groupArr= aJson.getArrayItem(itemArr, 1); if (itemArg->type == aJson_Array) { aJsonObject *i = itemArg->child; while (i) { Item it(i->valuestring); -// it.copyPar(itemVal); it.Ctrl(cmd, n, Par, send,suffixCode,subItem); //// was true i = i->next; } //while @@ -868,6 +867,9 @@ int Item::isActive() { switch (cmd) { case CMD_ON: case CMD_XON: + case CMD_AUTO: + case CMD_HEAT: + case CMD_COOL: //debugSerial<<" active"); return 1; case CMD_OFF: @@ -909,7 +911,7 @@ int Item::isActive() { case CH_DIMMER: //Everywhere, in flat VAL case CH_MODBUS: - case CH_THERMO: + // case CH_THERMO: case CH_VC: case CH_VCTEMP: case CH_PWM: @@ -1358,12 +1360,10 @@ int Item::SendStatus(int sendFlags) { return -1; } else { - + sendFlags |= getFlag(SEND_COMMAND | SEND_PARAMETERS); //if some delayed status is pending char addrstr[48]; char valstr[16] = ""; char cmdstr[8] = ""; - // bool isParam = false; - // bool isCommand = false; if (sendFlags & SEND_PARAMETERS) { @@ -1377,15 +1377,9 @@ int Item::SendStatus(int sendFlags) { case CH_RGB: snprintf(valstr, sizeof(valstr), "%d,%d,%d", st.h,st.s,st.v); break; -/* - case CH_VCTEMP: - case CH_PWM: - case CH_DIMMER: //Everywhere, in flat VAL - case CH_MODBUS: - case CH_VC: - case CH_THERMO: - snprintf(valstr, sizeof(valstr), "%d", st.aslong); - break; */ +// case CH_GROUP: +// sendFlags &= ~SEND_PARAMETERS; // Not send params for Group +// break; default: snprintf(valstr, sizeof(valstr), "%d", st.aslong); }//itemtype @@ -1396,18 +1390,18 @@ int Item::SendStatus(int sendFlags) { switch (chancmd) { case CMD_ON: case CMD_XON: - strcpy(cmdstr, "ON"); -// isCommand = true; + case CMD_AUTO: + case CMD_HEAT: + case CMD_COOL: + strcpy_P(cmdstr, ON_P); break; case CMD_OFF: case CMD_HALT: - strcpy(cmdstr, "OFF"); -// isCommand = true; + strcpy_P(cmdstr, OFF_P); break; - // TODO send Par case 0: case CMD_SET: - sendFlags &= ~SEND_COMMAND; + sendFlags &= ~SEND_COMMAND; // Not send command for parametrized req break; default: debugSerial<")<")<")<")<name, sizeof(addrstr)); strncat(addrstr, "/", sizeof(addrstr)); @@ -1460,8 +1480,15 @@ int Item::SendStatus(int sendFlags) { debugSerial<")< nextPollingCheck) { while (pollingItem && !done) { if (pollingItem->type == aJson_Array) { @@ -1762,7 +1763,7 @@ void pollingLoop(void) { } //while }//if } -#endif +//#endif bool isThermostatWithMinArraySize(aJsonObject *item, int minimalArraySize) { return (item->type == aJson_Array) && (aJson.getArrayItem(item, I_TYPE)->valueint == CH_THERMO) && @@ -1770,8 +1771,15 @@ bool isThermostatWithMinArraySize(aJsonObject *item, int minimalArraySize) { } bool thermoDisabledOrDisconnected(aJsonObject *thermoExtensionArray, int thermoStateCommand) { - return thermoStateCommand == CMD_OFF || thermoStateCommand == CMD_HALT || - aJson.getArrayItem(thermoExtensionArray, IET_ATTEMPTS)->valueint == 0; + if (aJson.getArrayItem(thermoExtensionArray, IET_ATTEMPTS)->valueint == 0) return true; + switch (thermoStateCommand) { + case CMD_ON: + case CMD_XON: + case CMD_AUTO: + case CMD_HEAT: + return false; + default: return true; + } }