diff --git a/sonoff/xsns_29_mcp230xx.ino b/sonoff/xsns_29_mcp230xx.ino index 39da4bcf7..3e1ce5269 100644 --- a/sonoff/xsns_29_mcp230xx.ino +++ b/sonoff/xsns_29_mcp230xx.ino @@ -58,7 +58,7 @@ uint8_t mcp230xx_addresses[] = { MCP230xx_ADDRESS1, MCP230xx_ADDRESS2, MCP230xx_ uint8_t mcp230xx_pincount = 0; uint8_t mcp230xx_int_en = 0; -const char MCP230XX_SENSOR_RESPONSE[] PROGMEM = "{\"Sensor29_D%i\":{\"MODE\":%i,\"PULL-UP\":\"%s\",\"STATE\":\"%s\"}}"; +const char MCP230XX_SENSOR_RESPONSE[] PROGMEM = "{\"Sensor29_D%i\":{\"MODE\":%i,\"PULL-UP\":\"%s\",\"INT_MODE\":\"%s\",\"STATE\":\"%s\"}}"; #ifdef USE_MCP230xx_OUTPUT const char MCP230XX_CMND_RESPONSE[] PROGMEM = "{\"S29cmnd_D%i\":{\"COMMAND\":\"%s\",\"STATE\":\"%s\"}}"; @@ -87,6 +87,26 @@ if (pinmod == 6) { } } +const char* IntModeTxt(uint8_t intmo) { + switch (intmo) { + case 0: + return "ALL"; + break; + case 1: + return "EVENT"; + break; + case 2: + return "TELE"; + break; + case 3: + return "DISABLED"; + break; + default: + return "UNKNOWN"; + break; + } +} + uint8_t MCP230xx_readGPIO(uint8_t port) { return I2cRead8(mcp230xx_address, MCP230xx_GPIO + port); } @@ -273,7 +293,7 @@ void MCP230xx_SetOutPin(uint8_t pin,uint8_t pinstate) { uint8_t pinmo = Settings.mcp230xx_config[pin].pinmode; uint8_t interlock = Settings.flag.interlock; int pinadd = (pin % 2)+1-(3*(pin % 2)); //check if pin is odd or even and convert to 1 (if even) or -1 (if odd) - char cmnd[7], stt[4]; + char cmnd[7], stt[7]; if (pin > 7) port=1; portpins = MCP230xx_readGPIO(port); if (interlock && pinmo == Settings.mcp230xx_config[pin+pinadd].pinmode) { @@ -315,9 +335,13 @@ void MCP230xx_Reset(uint8_t pinmode) { Settings.mcp230xx_config[pinx].b7=0; } MCP230xx_ApplySettings(); - char pulluptxt[4]; + char pulluptxt[7]; + char intmodetxt[9]; sprintf(pulluptxt,ConvertNumTxt(pullup)); - snprintf_P(mqtt_data, sizeof(mqtt_data), MCP230XX_SENSOR_RESPONSE,99,pinmode,pulluptxt,""); + uint8_t intmode = 3; + if (pinmode > 1 && pinmode < 5) intmode=0; + sprintf(intmodetxt,IntModeTxt(intmode)); + snprintf_P(mqtt_data, sizeof(mqtt_data), MCP230XX_SENSOR_RESPONSE,99,pinmode,pulluptxt,intmodetxt,""); } bool MCP230xx_Command(void) { @@ -344,15 +368,17 @@ bool MCP230xx_Command(void) { uint8_t port = 0; if (pin > 7) port = 1; uint8_t portdata = MCP230xx_readGPIO(port); - char pulluptxtr[4],pinstatustxtr[4]; + char pulluptxtr[7],pinstatustxtr[7]; + char intmodetxt[9]; + sprintf(intmodetxt,IntModeTxt(Settings.mcp230xx_config[pin].int_report_mode)); sprintf(pulluptxtr,ConvertNumTxt(Settings.mcp230xx_config[pin].pullup)); #ifdef USE_MCP230xx_OUTPUT uint8_t pinmod = Settings.mcp230xx_config[pin].pinmode; sprintf(pinstatustxtr,ConvertNumTxt(portdata>>(pin-(port*8))&1,pinmod)); - snprintf_P(mqtt_data, sizeof(mqtt_data), MCP230XX_SENSOR_RESPONSE,pin,pinmod,pulluptxtr,pinstatustxtr); + snprintf_P(mqtt_data, sizeof(mqtt_data), MCP230XX_SENSOR_RESPONSE,pin,pinmod,pulluptxtr,intmodetxt,pinstatustxtr); #else // not USE_MCP230xx_OUTPUT sprintf(pinstatustxtr,ConvertNumTxt(portdata>>(pin-(port*8))&1)); - snprintf_P(mqtt_data, sizeof(mqtt_data), MCP230XX_SENSOR_RESPONSE,pin,Settings.mcp230xx_config[pin].pinmode,pulluptxtr,pinstatustxtr); + snprintf_P(mqtt_data, sizeof(mqtt_data), MCP230XX_SENSOR_RESPONSE,pin,Settings.mcp230xx_config[pin].pinmode,pulluptxtr,intmodetxt,pinstatustxtr); #endif //USE_MCP230xx_OUTPUT return serviced; } @@ -377,8 +403,12 @@ bool MCP230xx_Command(void) { _b = data.indexOf(",", _a + 1); if (_a < XdrvMailbox.data_len) { if (_b < XdrvMailbox.data_len) { + // Lets see if we have a 4th parameter for interrupt mode + uint8_t _c = data.indexOf(",", _b + 1); + if (_c > XdrvMailbox.data_len) _c=XdrvMailbox.data_len; pinmode = data.substring(_a+1, _b).toInt(); - pullup = data.substring(_b+1, XdrvMailbox.data_len).toInt(); + pullup = data.substring(_b+1, _c).toInt(); + uint8_t intmode = data.substring(_c+1, XdrvMailbox.data_len).toInt(); #ifdef USE_MCP230xx_OUTPUT if ((pin < mcp230xx_pincount) && (pinmode < 7) && (pullup < 2)) { #else // not USE_MCP230xx_OUTPUT @@ -386,18 +416,27 @@ bool MCP230xx_Command(void) { #endif // USE_MCP230xx_OUTPUT Settings.mcp230xx_config[pin].pinmode=pinmode; Settings.mcp230xx_config[pin].pullup=pullup; + if (pinmode > 1 && pinmode < 5) { + if (intmode >= 0 && intmode <= 2) { + Settings.mcp230xx_config[pin].int_report_mode=intmode; + } + } else { + Settings.mcp230xx_config[pin].int_report_mode=3; // Int mode not valid for pinmodes other than 2 through 4 + } MCP230xx_ApplySettings(); uint8_t port = 0; if (pin > 7) port = 1; uint8_t portdata = MCP230xx_readGPIO(port); - char pulluptxtc[4], pinstatustxtc[4]; + char pulluptxtc[7], pinstatustxtc[7]; + char intmodetxt[9]; sprintf(pulluptxtc,ConvertNumTxt(pullup)); + sprintf(intmodetxt,IntModeTxt(Settings.mcp230xx_config[pin].int_report_mode)); #ifdef USE_MCP230xx_OUTPUT sprintf(pinstatustxtc,ConvertNumTxt(portdata>>(pin-(port*8))&1,Settings.mcp230xx_config[pin].pinmode)); #else // not USE_MCP230xx_OUTPUT sprintf(pinstatustxtc,ConvertNumTxt(portdata>>(pin-(port*8))&1)); #endif // USE_MCP230xx_OUTPUT - snprintf_P(mqtt_data, sizeof(mqtt_data), MCP230XX_SENSOR_RESPONSE,pin,pinmode,pulluptxtc,pinstatustxtc); + snprintf_P(mqtt_data, sizeof(mqtt_data), MCP230XX_SENSOR_RESPONSE,pin,pinmode,pulluptxtc,intmodetxt,pinstatustxtc); } else { serviced = false; } @@ -423,7 +462,7 @@ void MCP230xx_UpdateWebData(void) { uint16_t gpio = (gpio2 << 8) + gpio1; for (uint8_t pin = 0; pin < mcp230xx_pincount; pin++) { if (Settings.mcp230xx_config[pin].pinmode >= 5) { - char stt[4]; + char stt[7]; sprintf(stt,ConvertNumTxt((gpio>>pin)&1,Settings.mcp230xx_config[pin].pinmode)); snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_MCP230xx_OUTPUT, mqtt_data, pin, stt); } @@ -447,7 +486,7 @@ void MCP230xx_OutputTelemetry(void) { if (Settings.mcp230xx_config[pinx].pinmode >= 5) outputcount++; } if (outputcount) { - char stt[4]; + char stt[7]; snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_TIME "\":\"%s\",\"MCP230_OUT\": {"), GetDateAndTime(DT_LOCAL).c_str()); for (uint8_t pinx = 0;pinx < mcp230xx_pincount;pinx++) { if (Settings.mcp230xx_config[pinx].pinmode >= 5) {