From cfd34aa02cb18e46f86daf6d1bae0fb59fee4d0d Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 4 Feb 2023 17:48:53 +0100 Subject: [PATCH] Fix Shelly Pro 4PM issues - Fix random ADE7935 measurements - Fix relay 1 toggle on restart - Add Shelly Pro 4PM display.ini --- .../displaydesc/ST7735S_Pro4PM_display.ini | 35 +++++++++++++++++++ .../tasmota_xdrv_driver/xdrv_13_display.ino | 19 +++++++--- .../xdrv_88_esp32_shelly_pro_v2.ino | 3 +- .../tasmota_xnrg_energy/xnrg_07_ade7953.ino | 21 +++++++---- 4 files changed, 66 insertions(+), 12 deletions(-) create mode 100644 tasmota/displaydesc/ST7735S_Pro4PM_display.ini diff --git a/tasmota/displaydesc/ST7735S_Pro4PM_display.ini b/tasmota/displaydesc/ST7735S_Pro4PM_display.ini new file mode 100644 index 000000000..46cb6a804 --- /dev/null +++ b/tasmota/displaydesc/ST7735S_Pro4PM_display.ini @@ -0,0 +1,35 @@ +:H,PRO_4PM,160,128,16,SPI,3,0,15,13,2,12,*,*,20 +:S,2,1,1,0,20,20 +:I +01,80 +11,80 +B1,3,01,2C,2D +B2,3,01,2C,2D +B3,6,01,2C,2D,01,2C,2D +B4,1,07 +C0,3,A2,04,84 +C1,1,C5 +C2,2,0A,00 +C3,2,8A,2A +C4,2,8A,EE +C5,1,0E +20,0 +36,1,C8 +3A,1,05 +2A,4,00,02,00,7F +2B,4,00,01,00,7F +E0,10,02,1C,07,12,37,32,29,2D,29,25,2B,39,00,01,03,10 +E1,10,03,1D,07,06,2E,2C,29,2D,2E,2E,37,3F,00,00,02,10 +13,80 +29,80 +:o,28 +:O,29 +:A,2A,2B,2C,16 +:R,36 +:0,68,00,00,00 +:1,CC,1A,01,01 +:2,A8,01,1A,02 +:3,08,1A,01,03 +:i,21,20 +:B,60,1 +# \ No newline at end of file diff --git a/tasmota/tasmota_xdrv_driver/xdrv_13_display.ino b/tasmota/tasmota_xdrv_driver/xdrv_13_display.ino index 05bc7db16..b956ac6cc 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_13_display.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_13_display.ino @@ -1838,14 +1838,21 @@ void DisplayLocalSensor(void) * Public \*********************************************************************************************/ -void DisplayInitDriver(void) -{ +void DisplayInitDriver(void) { + uint8_t devices_present = TasmotaGlobal.devices_present; // Save devices_present + TasmotaGlobal.devices_present++; + if (!PinUsed(GPIO_BACKLIGHT)) { + if (TasmotaGlobal.light_type && (4 == Settings->display_model)) { + TasmotaGlobal.devices_present--; // Assume PWM channel is used for backlight + } + } + disp_device = TasmotaGlobal.devices_present; // Set display device + XdspCall(FUNC_DISPLAY_INIT_DRIVER); // AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "Display model %d"), Settings->display_model); if (Settings->display_model) { -// ApplyDisplayDimmer(); // Not allowed here. Way too early in initi sequence. IE power state has not even been set at this point in time #ifdef USE_MULTI_DISPLAY Set_display(0); @@ -1874,6 +1881,7 @@ void DisplayInitDriver(void) for (uint8_t count = 0; count < NUM_GRAPHS; count++) { graph[count] = 0; } #endif +/* TasmotaGlobal.devices_present++; if (!PinUsed(GPIO_BACKLIGHT)) { if (TasmotaGlobal.light_type && (4 == Settings->display_model)) { @@ -1881,12 +1889,16 @@ void DisplayInitDriver(void) } } disp_device = TasmotaGlobal.devices_present; +*/ #ifndef USE_DISPLAY_MODES1TO5 Settings->display_mode = 0; #else DisplayLogBufferInit(); #endif // USE_DISPLAY_MODES1TO5 + } else { + TasmotaGlobal.devices_present = devices_present; // Restore devices_present + disp_device = 0; } } @@ -2009,7 +2021,6 @@ void ApplyDisplayDimmer(void) { // still call Berry virtual display in case it is not managed entirely by renderer Xdsp18(FUNC_DISPLAY_DIM); #endif // USE_BERRY - } else { XdspCall(FUNC_DISPLAY_DIM); } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_88_esp32_shelly_pro_v2.ino b/tasmota/tasmota_xdrv_driver/xdrv_88_esp32_shelly_pro_v2.ino index 89de679c3..a5f4e63f9 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_88_esp32_shelly_pro_v2.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_88_esp32_shelly_pro_v2.ino @@ -27,8 +27,7 @@ * {"NAME":"Shelly Pro 1PM","GPIO":[9568,1,9472,1,768,0,0,0,672,704,736,0,0,0,5600,6214,0,0,0,5568,0,0,0,0,0,0,0,0,3459,0,0,32,4736,0,160,0],"FLAG":0,"BASE":1,"CMND":"AdcParam1 2,5600,4700,3350"} * {"NAME":"Shelly Pro 2","GPIO":[0,1,0,1,768,0,0,0,672,704,736,0,0,0,5600,6214,0,0,0,5568,0,0,0,0,0,0,0,0,0,0,0,32,4736,4737,160,161],"FLAG":0,"BASE":1,"CMND":"AdcParam1 2,5600,4700,3350;AdcParam2 2,5600,4700,3350"} * {"NAME":"Shelly Pro 2PM","GPIO":[9568,1,9472,1,768,0,0,0,672,704,736,9569,0,0,5600,6214,0,0,0,5568,0,0,0,0,0,0,0,0,3460,0,0,32,4736,4737,160,161],"FLAG":0,"BASE":1,"CMND":"AdcParam1 2,5600,4700,3350;AdcParam2 2,5600,4700,3350"} - * {"NAME":"Shelly Pro 4PM","GPIO":[769,1,1,1,9568,0,0,0,1,705,9569,737,768,0,5600,0,0,0,0,5568,0,0,0,0,0,0,0,6214,736,704,3461,0,4736,1,0,672],"FLAG":0,"BASE":1,"CMND":"AdcParam1 2,5600,4700,3350"} - * {"NAME":"Shelly Pro 4PM No display","GPIO":[1,1,1,1,9568,0,0,0,1,1,9569,1,768,0,5600,0,0,0,0,5568,0,0,0,0,0,0,0,6214,736,704,3461,0,4736,1,0,672],"FLAG":0,"BASE":1,"CMND":"AdcParam1 2,5600,4700,3350"} + * {"NAME":"Shelly Pro 4PM","GPIO":[0,6210,0,6214,9568,0,0,0,0,0,9569,0,768,0,5600,0,0,0,0,5568,0,0,0,0,0,0,0,0,736,704,3461,0,4736,0,0,672],"FLAG":0,"BASE":1,"CMND":"AdcParam1 2,5600,4700,3350"} * * Shelly Pro 1/2 uses SPI to control one 74HC595 for relays/leds and one ADE7953 (1PM) or two ADE7953 (2PM) for energy monitoring * Shelly Pro 4 uses an SPI to control one MCP23S17 for buttons/switches/relays/leds and two ADE7953 for energy monitoring and a second SPI for the display diff --git a/tasmota/tasmota_xnrg_energy/xnrg_07_ade7953.ino b/tasmota/tasmota_xnrg_energy/xnrg_07_ade7953.ino index 0eda31567..dc088a947 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_07_ade7953.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_07_ade7953.ino @@ -32,7 +32,7 @@ * {"NAME":"Shelly Plus 2PM PCB v0.1.9","GPIO":[320,0,0,0,32,192,0,0,225,224,0,0,0,0,193,0,0,0,0,0,0,608,640,3458,0,0,0,0,0,9472,0,4736,0,0,0,0],"FLAG":0,"BASE":1,"CMND":"AdcParam1 2,10000,10000,3350"} * {"NAME":"Shelly Pro 1PM","GPIO":[9568,1,9472,1,768,0,0,0,672,704,736,0,0,0,5600,6214,0,0,0,5568,0,0,0,0,0,0,0,0,3459,0,0,32,4736,0,160,0],"FLAG":0,"BASE":1,"CMND":"AdcParam1 2,5600,4700,3350"} * {"NAME":"Shelly Pro 2PM","GPIO":[9568,1,9472,1,768,0,0,0,672,704,736,9569,0,0,5600,6214,0,0,0,5568,0,0,0,0,0,0,0,0,3460,0,0,32,4736,4737,160,161],"FLAG":0,"BASE":1,"CMND":"AdcParam1 2,5600,4700,3350;AdcParam2 2,5600,4700,3350"} - * {"NAME":"Shelly Pro 4PM No display","GPIO":[1,1,1,1,9568,0,0,0,1,1,9569,1,768,0,5600,0,0,0,0,5568,0,0,0,0,0,0,0,6214,736,704,3461,0,4736,1,0,672],"FLAG":0,"BASE":1,"CMND":"AdcParam1 2,5600,4700,3350"} + * {"NAME":"Shelly Pro 4PM","GPIO":[0,6210,0,6214,9568,0,0,0,0,0,9569,0,768,0,5600,0,0,0,0,5568,0,0,0,0,0,0,0,0,736,704,3461,0,4736,0,0,672],"FLAG":0,"BASE":1,"CMND":"AdcParam1 2,5600,4700,3350"} * * Based on datasheet from https://www.analog.com/en/products/ade7953.html * @@ -241,6 +241,7 @@ struct Ade7953 { SPISettings spi_settings; int8_t pin_cs[ADE7953_MAX_CHANNEL / 2]; #endif // USE_ESP32_SPI + bool use_spi; } Ade7953; /*********************************************************************************************/ @@ -283,7 +284,7 @@ void Ade7953Write(uint16_t reg, uint32_t val) { // AddLog(LOG_LEVEL_DEBUG, PSTR("DBG: Write %08X"), val); #ifdef USE_ESP32_SPI - if (Ade7953.pin_cs[0] >= 0) { + if (Ade7953.use_spi) { Ade7953SpiEnable(); SPI.transfer16(reg); SPI.transfer(0x00); // Write @@ -313,7 +314,7 @@ int32_t Ade7953Read(uint16_t reg) { int size = Ade7953RegSize(reg); if (size) { #ifdef USE_ESP32_SPI - if (Ade7953.pin_cs[0] >= 0) { + if (Ade7953.use_spi) { Ade7953SpiEnable(); SPI.transfer16(reg); SPI.transfer(0x80); // Read @@ -450,7 +451,7 @@ void Ade7953GetData(void) { int32_t reg[ADE7953_MAX_CHANNEL][ADE7953_REGISTERS]; #ifdef USE_ESP32_SPI - if (Ade7953.pin_cs[0] >= 0) { + if (Ade7953.use_spi) { uint32_t channel = 0; for (uint32_t chip = 0; chip < ADE7953_MAX_CHANNEL / 2; chip++) { if (Ade7953.pin_cs[chip] < 0) { continue; } @@ -705,6 +706,7 @@ void Ade7953DrvInit(void) { Ade7953.model = ADE7953_SHELLY_PRO_1PM; } Ade7953.cs_index = 0; + Ade7953.use_spi = true; SPI.begin(Pin(GPIO_SPI_CLK), Pin(GPIO_SPI_MISO), Pin(GPIO_SPI_MOSI), -1); Ade7953.spi_settings = SPISettings(1000000, MSBFIRST, SPI_MODE0); // Set up SPI at 1MHz, MSB first, Capture at rising edge AddLog(LOG_LEVEL_INFO, PSTR("SPI: ADE7953 found")); @@ -820,8 +822,15 @@ bool Xnrg07(uint32_t function) { bool result = false; switch (function) { - case FUNC_ENERGY_EVERY_SECOND: - Ade7953EnergyEverySecond(); + case FUNC_ENERGY_EVERY_SECOND: // Use energy interrupt timer (fails on SPI) + if (!Ade7953.use_spi) { // No SPI + Ade7953EnergyEverySecond(); + } + break; + case FUNC_EVERY_SECOND: // Use loop timer (without interrupt) + if (Ade7953.use_spi) { // SPI + Ade7953EnergyEverySecond(); + } break; case FUNC_COMMAND: result = Ade7953Command();