Add support for MCP230xx

Add support for MCP230xx for general purpose input expansion and command Sensor29 (#3188)
This commit is contained in:
Theo Arends 2018-07-17 11:05:31 +02:00
parent 9af188ac74
commit f10b92a995
21 changed files with 42 additions and 44 deletions

View File

@ -1,4 +1,5 @@
/* 6.1.1b
* Add support for MCP230xx for general purpose input expansion and command Sensor29 (#3188)
* Fix command Scale buffer overflow (#3236)
* Fix rules once regression from v6.1.0 (#3198, #3226)
* Add default Wifi Configuration tool as define WIFI_CONFIG_NO_SSID in user_config.h if no SSID is configured (#3224)

View File

@ -227,6 +227,7 @@
#define D_CONFIRM_RESTART "Подтвърдете рестартирането"
#define D_CONFIGURE_MODULE "Конфигурация на модула"
#define D_CONFIGURE_MCP230XX "Конфигурация на MCP230xx"
#define D_CONFIGURE_WIFI "Конфигурация на WiFi"
#define D_CONFIGURE_MQTT "Конфигурация на MQTT"
#define D_CONFIGURE_DOMOTICZ "Конфигурация на Domoticz"

View File

@ -227,6 +227,7 @@
#define D_CONFIRM_RESTART "Potvrzení restartu"
#define D_CONFIGURE_MODULE "Nastavení modulu"
#define D_CONFIGURE_MCP230XX "Nastavení MCP230xx"
#define D_CONFIGURE_WIFI "Nastavení WiFi"
#define D_CONFIGURE_MQTT "Nastavení MQTT"
#define D_CONFIGURE_DOMOTICZ "Nastavení Domoticz"

View File

@ -227,6 +227,7 @@
#define D_CONFIRM_RESTART "Wirklich neustarten?"
#define D_CONFIGURE_MODULE "Gerät konfigurieren"
#define D_CONFIGURE_MCP230XX "MCP230xx konfigurieren"
#define D_CONFIGURE_WIFI "WLAN konfigurieren"
#define D_CONFIGURE_MQTT "MQTT konfigurieren"
#define D_CONFIGURE_DOMOTICZ "Domoticz konfigurieren"

View File

@ -227,6 +227,7 @@
#define D_CONFIRM_RESTART "Επιβεβαίωση Επανεκκίνησης"
#define D_CONFIGURE_MODULE "Ρύθμιση Module"
#define D_CONFIGURE_MCP230XX "Ρύθμιση MCP230xx"
#define D_CONFIGURE_WIFI "Ρύθμιση WiFi"
#define D_CONFIGURE_MQTT "Ρύθμιση MQTT"
#define D_CONFIGURE_DOMOTICZ "Ρύθμιση Domoticz"

View File

@ -166,7 +166,6 @@
#define D_VOLTAGE "Voltage"
#define D_WARMLIGHT "Warm"
#define D_WEB_SERVER "Web Server"
#define D_CONFIGURE_MCP230XX "Configure MCP230xx"
// sonoff.ino
#define D_WARNING_MINIMAL_VERSION "WARNING This version does not support persistent settings"
@ -228,6 +227,7 @@
#define D_CONFIRM_RESTART "Confirm Restart"
#define D_CONFIGURE_MODULE "Configure Module"
#define D_CONFIGURE_MCP230XX "Configure MCP230xx"
#define D_CONFIGURE_WIFI "Configure WiFi"
#define D_CONFIGURE_MQTT "Configure MQTT"
#define D_CONFIGURE_DOMOTICZ "Configure Domoticz"

View File

@ -227,6 +227,7 @@
#define D_CONFIRM_RESTART "Confirmar Reinicio"
#define D_CONFIGURE_MODULE "Configuración del Módulo"
#define D_CONFIGURE_MCP230XX "Configuración MCP230xx"
#define D_CONFIGURE_WIFI "Configuración WiFi"
#define D_CONFIGURE_MQTT "Configuración MQTT"
#define D_CONFIGURE_DOMOTICZ "Configuración Domoticz"

View File

@ -227,6 +227,7 @@
#define D_CONFIRM_RESTART "Confirmer redémarrage"
#define D_CONFIGURE_MODULE "Configuration du Module"
#define D_CONFIGURE_MCP230XX "Configuration MCP230xx"
#define D_CONFIGURE_WIFI "Configuration WiFi"
#define D_CONFIGURE_MQTT "Configuration MQTT"
#define D_CONFIGURE_DOMOTICZ "Configuration Domoticz"

View File

@ -227,6 +227,7 @@
#define D_CONFIRM_RESTART "Újraindítás megerősítése"
#define D_CONFIGURE_MODULE "Eszköz konfiguráció"
#define D_CONFIGURE_MCP230XX "MCP230xx konfiguráció"
#define D_CONFIGURE_WIFI "WiFi konfiguráció"
#define D_CONFIGURE_MQTT "MQTT konfiguráció"
#define D_CONFIGURE_DOMOTICZ "Domoticz konfiguráció"

View File

@ -227,6 +227,7 @@
#define D_CONFIRM_RESTART "Conferma Riavvio"
#define D_CONFIGURE_MODULE "Configurazione Modulo"
#define D_CONFIGURE_MCP230XX "Configurazione MCP230xx"
#define D_CONFIGURE_WIFI "Configurazione WiFi"
#define D_CONFIGURE_MQTT "Configurazione MQTT"
#define D_CONFIGURE_DOMOTICZ "Configurazione Domoticz"

View File

@ -227,6 +227,7 @@
#define D_CONFIRM_RESTART "Bevestig herstart"
#define D_CONFIGURE_MODULE "Configureer Module"
#define D_CONFIGURE_MCP230XX "Configureer MCP230xx"
#define D_CONFIGURE_WIFI "Configureer WiFi"
#define D_CONFIGURE_MQTT "Configureer MQTT"
#define D_CONFIGURE_DOMOTICZ "Configureer Domoticz"

View File

@ -227,6 +227,7 @@
#define D_CONFIRM_RESTART "Potwierdź restart"
#define D_CONFIGURE_MODULE "Konfiguruj moduł"
#define D_CONFIGURE_MCP230XX "Konfiguruj MCP230xx"
#define D_CONFIGURE_WIFI "Konfiguruj WiFi"
#define D_CONFIGURE_MQTT "Konfiguruj MQTT"
#define D_CONFIGURE_DOMOTICZ "Konfiguruj Domoticz"

View File

@ -227,6 +227,7 @@
#define D_CONFIRM_RESTART "Confirmar o reinicio"
#define D_CONFIGURE_MODULE "Configurar Módulo"
#define D_CONFIGURE_MCP230XX "Configurar MCP230xx"
#define D_CONFIGURE_WIFI "Configurar WiFi"
#define D_CONFIGURE_MQTT "Configurar MQTT"
#define D_CONFIGURE_DOMOTICZ "Configurar Domoticz"

View File

@ -227,6 +227,7 @@
#define D_CONFIRM_RESTART "Confirmar o reinicio"
#define D_CONFIGURE_MODULE "Configurar Módulo"
#define D_CONFIGURE_MCP230XX "Configurar MCP230xx"
#define D_CONFIGURE_WIFI "Configurar WiFi"
#define D_CONFIGURE_MQTT "Configurar MQTT"
#define D_CONFIGURE_DOMOTICZ "Configurar Domoticz"

View File

@ -227,6 +227,7 @@
#define D_CONFIRM_RESTART "Подтвердить перезагрузку"
#define D_CONFIGURE_MODULE "Конфигурация Модуля"
#define D_CONFIGURE_MCP230XX "Конфигурация MCP230xx"
#define D_CONFIGURE_WIFI "Конфигурация WiFi"
#define D_CONFIGURE_MQTT "Конфигурация MQTT"
#define D_CONFIGURE_DOMOTICZ "Конфигурация Domoticz"

View File

@ -227,6 +227,7 @@
#define D_CONFIRM_RESTART "Підтвердити перезавантаження"
#define D_CONFIGURE_MODULE "Конфігурація модуля"
#define D_CONFIGURE_MCP230XX "Конфігурація MCP230xx"
#define D_CONFIGURE_WIFI "Конфігурація WiFi"
#define D_CONFIGURE_MQTT "Конфігурація MQTT"
#define D_CONFIGURE_DOMOTICZ "Конфігурація Domoticz"

View File

@ -227,6 +227,7 @@
#define D_CONFIRM_RESTART "确认重启"
#define D_CONFIGURE_MODULE "模块设置"
#define D_CONFIGURE_MCP230XX "MCP230xx设置"
#define D_CONFIGURE_WIFI "WiFi设置"
#define D_CONFIGURE_MQTT "MQTT设置"
#define D_CONFIGURE_DOMOTICZ "Domoticz设置"

View File

@ -227,6 +227,7 @@
#define D_CONFIRM_RESTART "確認重啟"
#define D_CONFIGURE_MODULE "模塊設置"
#define D_CONFIGURE_MCP230XX "MCP230xx設置"
#define D_CONFIGURE_WIFI "WiFi設置"
#define D_CONFIGURE_MQTT "MQTT設置"
#define D_CONFIGURE_DOMOTICZ "Domoticz設置"

View File

@ -287,12 +287,9 @@
// #define USE_MGS // Add I2C code for Xadow and Grove Mutichannel Gas sensor using library Multichannel_Gas_Sensor (+10k code)
#define MGS_SENSOR_ADDR 0x04 // Default Mutichannel Gas sensor i2c address
// #define USE_APDS9960 // Add I2C code for APDS9960 Proximity Sensor. Disables SHT and VEML6070 (+4k7 code)
// If only USE_MCP230xx then device can be configured using sensor29 command
// #define USE_MCP230xx // Add I2C code for MCP23008/MCP23017 for GP INPUT ONLY (+2260 bytes)
// #define USE_MCP230xx_displaymain // Display pin status on Tasmota main page (+188 bytes)
// #define USE_MCP230xx_webconfig // Enable web config button and form to Tasmota web interface (+2444)
// #define USE_MCP230xx // Add I2C code for MCP23008/MCP23017 for GP INPUT ONLY providing command Sensor29 for configuration (+2k2 code)
// #define USE_MCP230xx_displaymain // Display pin status on Tasmota main page (+0k2 code)
// #define USE_MCP230xx_webconfig // Enable web config button and form to Tasmota web interface (+2k1 code)
#endif // USE_I2C
// -- SPI sensors ---------------------------------

View File

@ -190,6 +190,10 @@ const char HTTP_BTN_RSTRT[] PROGMEM =
"<br/><form action='rb' method='get' onsubmit='return confirm(\"" D_CONFIRM_RESTART "\");'><button class='button bred'>" D_RESTART "</button></form>";
const char HTTP_BTN_MENU_MODULE[] PROGMEM =
"<br/><form action='md' method='get'><button>" D_CONFIGURE_MODULE "</button></form>";
#if defined(USE_I2C) && defined(USE_MCP230xx) && defined(USE_MCP230xx_webconfig)
const char HTTP_BTN_MCP230XX[] PROGMEM =
"<br/><form action='mc' method='get'><button>" D_CONFIGURE_MCP230XX "</button></form>";
#endif // USE_I2C and USE_MCP230xx and USE_MCP230xx_webconfig
#if defined(USE_TIMERS) && defined(USE_TIMERS_WEB)
const char HTTP_BTN_MENU_TIMER[] PROGMEM =
"<br/><form action='tm' method='get'><button>" D_CONFIGURE_TIMER "</button></form>";
@ -202,14 +206,6 @@ const char HTTP_BTN_MENU_MQTT[] PROGMEM =
"<br/><form action='dm' method='get'><button>" D_CONFIGURE_DOMOTICZ "</button></form>"
#endif // USE_DOMOTICZ
"";
#ifdef USE_I2C
#ifdef USE_MCP230xx
#ifdef USE_MCP230xx_webconfig
const char HTTP_BTN_MCP230XX[] PROGMEM =
"<br/><form action='mcp230xx' method='get'><button>" D_CONFIGURE_MCP230XX "</button></form>";
#endif // USE_MCP230xx_webconfig
#endif // USE_MCP230xx
#endif // USE_I2C
const char HTTP_BTN_MENU4[] PROGMEM =
#ifdef USE_KNX
"<br/><form action='kn' method='get'><button>" D_CONFIGURE_KNX "</button></form>"
@ -384,16 +380,12 @@ void StartWebserver(int type, IPAddress ipweb)
WebServer->on("/u2", HTTP_OPTIONS, HandlePreflightRequest);
WebServer->on("/cm", HandleHttpCommand);
WebServer->on("/rb", HandleRestart);
#ifdef USE_I2C
#ifdef USE_MCP230xx
#ifdef USE_MCP230xx_webconfig
WebServer->on("/mcp230xx", handleMCP230xx);
#endif // USE_MCP230xx_webconfig
#endif // USE_MCP230xx
#endif // USE_I2C
#ifndef BE_MINIMAL
WebServer->on("/cn", HandleConfiguration);
WebServer->on("/md", HandleModuleConfiguration);
#if defined(USE_I2C) && defined(USE_MCP230xx) && defined(USE_MCP230xx_webconfig)
WebServer->on("/mc", HandleMCP230xxConfiguration);
#endif // USE_I2C and USE_MCP230xx and USE_MCP230xx_webconfig
#if defined(USE_TIMERS) && defined(USE_TIMERS_WEB)
WebServer->on("/tm", HandleTimerConfiguration);
#endif // USE_TIMERS and USE_TIMERS_WEB
@ -701,6 +693,11 @@ void HandleConfiguration()
page.replace(F("{v}"), FPSTR(S_CONFIGURATION));
page += FPSTR(HTTP_HEAD_STYLE);
page += FPSTR(HTTP_BTN_MENU_MODULE);
#if defined(USE_I2C) && defined(USE_MCP230xx) && defined(USE_MCP230xx_webconfig)
if (MCP230xx_Type()) { // Configuration button will only show if MCP23008/MCP23017 was detected on I2C
page += FPSTR(HTTP_BTN_MCP230XX);
}
#endif // USE_I2C and USE_MCP230xx and USE_MCP230xx_webconfig
#if defined(USE_TIMERS) && defined(USE_TIMERS_WEB)
#ifdef USE_RULES
page += FPSTR(HTTP_BTN_MENU_TIMER);
@ -710,15 +707,6 @@ void HandleConfiguration()
#endif // USE_TIMERS and USE_TIMERS_WEB
page += FPSTR(HTTP_BTN_MENU_WIFI);
if (Settings.flag.mqtt_enabled) { page += FPSTR(HTTP_BTN_MENU_MQTT); }
#ifdef USE_I2C
#ifdef USE_MCP230xx
#ifdef USE_MCP230xx_webconfig
if (MCP230xx_Type()) { // Configuration button will only show if MCP23008/MCP23017 was detected on I2C
page += FPSTR(HTTP_BTN_MCP230XX);
}
#endif // USE_MCP230xx_webconfig
#endif // USE_MCP230xx
#endif // USE_I2C
page += FPSTR(HTTP_BTN_MENU4);
page += FPSTR(HTTP_BTN_MAIN);
ShowPage(page);
@ -1148,15 +1136,11 @@ void HandleSaveSettings()
}
AddLog(LOG_LEVEL_INFO);
break;
#ifdef USE_I2C
#ifdef USE_MCP230xx
#ifdef USE_MCP230xx_webconfig
case 8: // MCP230xx_SaveSettings
#if defined(USE_I2C) && defined(USE_MCP230xx) && defined(USE_MCP230xx_webconfig)
case 8:
MCP230xx_SaveSettings();
break;
#endif // USE_MCP230xx_webconfig
#endif // USE_MCP230xx
#endif // USE_I2C
#endif // USE_I2C and USE_MCP230xx and USE_MCP230xx_webconfig
case 6:
WebGetArg("g99", tmp, sizeof(tmp));
byte new_module = (!strlen(tmp)) ? MODULE : atoi(tmp);

View File

@ -85,7 +85,7 @@ const char HTTP_FORM_I2C_MCP230XX[] PROGMEM =
"<td nowrap><input type=checkbox name=epu{b1 value=1{b2></input></td>"
"</tr>";
void handleMCP230xx()
void HandleMCP230xxConfiguration()
{
if (HttpUser()) {
return;
@ -348,7 +348,7 @@ void MCP230xx_Show(boolean json)
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"MCP23017\":{\"D0\":%i,\"D1\":%i,\"D2\":%i,\"D3\":%i,\"D4\":%i,\"D5\":%i,\"D6\":%i,\"D7\":%i,\"D8\":%i,\"D9\":%i,\"D10\":%i,\"D11\":%i,\"D12\":%i,\"D13\":%i,\"D14\":%i,\"D15\":%i}"),
mqtt_data, (gpio1>>0)&1,(gpio1>>1)&1,(gpio1>>2)&1,(gpio1>>3)&1,(gpio1>>4)&1,(gpio1>>5)&1,(gpio1>>6)&1,(gpio1>>7)&1,(gpio2>>0)&1,(gpio2>>1)&1,(gpio2>>2)&1,(gpio2>>3)&1,(gpio2>>4)&1,(gpio2>>5)&1,(gpio2>>6)&1,(gpio2>>7)&1);
}
#ifdef USE_WEBSERVER
#ifdef USE_MCP230xx_displaymain
} else {
@ -358,13 +358,13 @@ void MCP230xx_Show(boolean json)
gpio2=MCP230xx_readGPIO(1);
}
uint16_t gpio = (gpio2 << 8) + gpio1;
for (uint8_t pin = 0; pin < mcp280xx_pincount; pin++) {
if (Settings.mcp230xx_config[pin].enable) {
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_MCP230xx_GPIO, mqtt_data, pin, (gpio>>pin)&1);
}
}
#endif // USE_MCP230xx_displaymain
#endif // USE_MCP230xx_displaymain
#endif // USE_WEBSERVER
}
}
@ -450,13 +450,13 @@ boolean Xsns29(byte function)
if (XSNS_29 == XdrvMailbox.index) {
result = MCP230xx_Command();
}
break;
break;
#ifdef USE_WEBSERVER
#ifdef USE_MCP230xx_displaymain
case FUNC_WEB_APPEND:
MCP230xx_Show(0);
break;
#endif // USE_MCP230xx_displaymain
#endif // USE_MCP230xx_displaymain
#endif // USE_WEBSERVER
}
}