From 05c45f7ad735b290c98c3d00d5e48eb82c366a65 Mon Sep 17 00:00:00 2001 From: Johannes Morgenroth Date: Sat, 16 May 2020 18:05:23 +0200 Subject: [PATCH 01/15] Remove flush() call after read of KNX packets The flush() call after read() causes empty packets being sent as response for all UDP packets received on that port. --- lib/esp-knx-ip-0.5.2/esp-knx-ip.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/esp-knx-ip-0.5.2/esp-knx-ip.cpp b/lib/esp-knx-ip-0.5.2/esp-knx-ip.cpp index 5917e62f3..96f4e1c73 100644 --- a/lib/esp-knx-ip-0.5.2/esp-knx-ip.cpp +++ b/lib/esp-knx-ip-0.5.2/esp-knx-ip.cpp @@ -536,7 +536,6 @@ void ESPKNXIP::__loop_knx() uint8_t buf[read]; udp.read(buf, read); - udp.flush(); DEBUG_PRINT(F("Got packet:")); From 21656fdd81bc177a02f81eb58fe8e9945f6aecd0 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Mon, 18 May 2020 10:19:13 +0200 Subject: [PATCH 02/15] ra8876 esp32 --- lib/Xlatb_RA8876-gemu-1.0/RA8876.cpp | 52 ++++++++++++++++++++++++---- lib/Xlatb_RA8876-gemu-1.0/RA8876.h | 1 + tasmota/xdsp_10_RA8876.ino | 17 +++++++-- 3 files changed, 61 insertions(+), 9 deletions(-) diff --git a/lib/Xlatb_RA8876-gemu-1.0/RA8876.cpp b/lib/Xlatb_RA8876-gemu-1.0/RA8876.cpp index 850b2bb8a..1d9a893e4 100644 --- a/lib/Xlatb_RA8876-gemu-1.0/RA8876.cpp +++ b/lib/Xlatb_RA8876-gemu-1.0/RA8876.cpp @@ -66,13 +66,14 @@ RA8876::RA8876(int8_t cs,int8_t mosi,int8_t miso,int8_t sclk,int8_t bp) : Render //#define RA8876_CS_LOW digitalWrite(m_csPin, LOW) //#define RA8876_CS_HIGH digitalWrite(m_csPin, HIGH) -#ifdef ESP8266 +#ifndef ESP32 #define RA8876_CS_LOW GPOC=(1<= 0x21) || (c <= 0x7F))) diff --git a/lib/Xlatb_RA8876-gemu-1.0/RA8876.h b/lib/Xlatb_RA8876-gemu-1.0/RA8876.h index b27698027..5bf8b404f 100644 --- a/lib/Xlatb_RA8876-gemu-1.0/RA8876.h +++ b/lib/Xlatb_RA8876-gemu-1.0/RA8876.h @@ -23,6 +23,7 @@ #include #include +#undef SPRINT #define SPRINT(A) {char str[32];sprintf(str,"val: %d ",A);Serial.println((char*)str);} diff --git a/tasmota/xdsp_10_RA8876.ino b/tasmota/xdsp_10_RA8876.ino index 9c86ff2d7..6a44708cb 100644 --- a/tasmota/xdsp_10_RA8876.ino +++ b/tasmota/xdsp_10_RA8876.ino @@ -71,11 +71,24 @@ void RA8876_InitDriver() fg_color = RA8876_WHITE; bg_color = RA8876_BLACK; +#ifdef ESP32 +#define HW_SPI_MOSI 23 +#define HW_SPI_MISO 19 +#define HW_SPI_CLK 18 +#else +#undef HW_SPI_MOSI +#define HW_SPI_MOSI 13 +#undef HW_SPI_MISO +#define HW_SPI_MISO 12 +#undef HW_SPI_CLK +#define HW_SPI_CLK 14 +#endif + // init renderer, must use hardware spi - if (PinUsed(GPIO_SSPI_CS) && (Pin(GPIO_SSPI_MOSI)==13) && (Pin(GPIO_SSPI_MISO)==12) && (Pin(GPIO_SSPI_SCLK)==14)) { + if (PinUsed(GPIO_SSPI_CS) && (Pin(GPIO_SSPI_MOSI)==HW_SPI_MOSI) && (Pin(GPIO_SSPI_MISO)==HW_SPI_MISO) && (Pin(GPIO_SSPI_SCLK)==HW_SPI_CLK)) { ra8876 = new RA8876(Pin(GPIO_SSPI_CS),Pin(GPIO_SSPI_MOSI),Pin(GPIO_SSPI_MISO),Pin(GPIO_SSPI_SCLK),Pin(GPIO_BACKLIGHT)); } else { - if (PinUsed(GPIO_SPI_CS) && (Pin(GPIO_SPI_MOSI)==13) && (Pin(GPIO_SPI_MISO)==12) && (Pin(GPIO_SPI_CLK)==14)) { + if (PinUsed(GPIO_SPI_CS) && (Pin(GPIO_SPI_MOSI)==HW_SPI_MOSI) && (Pin(GPIO_SPI_MISO)==HW_SPI_MISO) && (Pin(GPIO_SPI_CLK)==HW_SPI_CLK)) { ra8876 = new RA8876(Pin(GPIO_SPI_CS),Pin(GPIO_SPI_MOSI),Pin(GPIO_SPI_MISO),Pin(GPIO_SPI_CLK),Pin(GPIO_BACKLIGHT)); } else { return; From 88627a5a41a99e2ec53ec66942b93e27e01f6277 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Mon, 18 May 2020 10:25:18 +0200 Subject: [PATCH 03/15] support for jpeg pictures on color lcds --- tasmota/support_jpeg.ino | 157 ++++++++++++++++++++++++++++++++++++ tasmota/xdrv_13_display.ino | 122 +++++++++++++++++++++------- 2 files changed, 249 insertions(+), 30 deletions(-) create mode 100644 tasmota/support_jpeg.ino diff --git a/tasmota/support_jpeg.ino b/tasmota/support_jpeg.ino new file mode 100644 index 000000000..7e811cd76 --- /dev/null +++ b/tasmota/support_jpeg.ino @@ -0,0 +1,157 @@ +/* + jpeg_utils.c - Version header file for Tasmota + + Copyright (C) 2020 Theo Arends + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + + +#ifdef ESP32 +#ifdef JPEG_PICTS + +#include "img_converters.h" +#include "esp_jpg_decode.h" + +void rgb888_to_565(uint8_t *in, uint16_t *out, uint32_t len) { +uint8_t red, grn, blu; +uint16_t b , g, r; + + for (uint32_t cnt=0; cnt> 3) & 0x1f; + g = ((grn >> 2) & 0x3f) << 5; + r = ((red >> 3) & 0x1f) << 11; + *out++ = (r | g | b); + } +} + +typedef struct { + uint16_t width; + uint16_t height; + uint16_t data_offset; + const uint8_t *input; + uint8_t *output; +} rgb_jpg_decoder; + +//input buffer +static uint32_t _jpg_read(void * arg, size_t index, uint8_t *buf, size_t len) +{ + rgb_jpg_decoder * jpeg = (rgb_jpg_decoder *)arg; + if(buf) { + memcpy(buf, jpeg->input + index, len); + } + return len; +} + +//output buffer and image width +static bool _rgb_write(void * arg, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint8_t *data) +{ + rgb_jpg_decoder * jpeg = (rgb_jpg_decoder *)arg; + if(!data){ + if(x == 0 && y == 0){ + //write start + jpeg->width = w; + jpeg->height = h; + //if output is null, this is BMP + if(!jpeg->output){ + jpeg->output = (uint8_t *)malloc((w*h*3)+jpeg->data_offset); + if(!jpeg->output){ + return false; + } + } + } else { + //write end + } + return true; + } + + size_t jw = jpeg->width*3; + size_t t = y * jw; + size_t b = t + (h * jw); + size_t l = x * 3; + uint8_t *out = jpeg->output+jpeg->data_offset; + uint8_t *o = out; + size_t iy, ix; + + w = w * 3; + + for(iy=t; iy= data_size) return false; //Check to protect against segmentation faults + if(data[i] != 0xFF) return false; //Check that we are truly at the start of another block + if(data[i+1] == 0xC0) { //0xFFC0 is the "Start of frame" marker which contains the file size + //The structure of the 0xFFC0 block is quite simple [0xFFC0][ushort length][uchar precision][ushort x][ushort y] + *height = data[i+5]*256 + data[i+6]; + *width = data[i+7]*256 + data[i+8]; + return true; + } + else + { + i+=2; //Skip the block marker + block_length = data[i] * 256 + data[i+1]; //Go to the next block + } + } + return false; //If this point is reached then no size was found + }else{ return false; } //Not a valid JFIF string + + }else{ return false; } //Not a valid SOI header +} + +#endif // JPEG_PICTS +#endif //ESP32 diff --git a/tasmota/xdrv_13_display.ino b/tasmota/xdrv_13_display.ino index e490d0bd1..2d0ef4f0f 100644 --- a/tasmota/xdrv_13_display.ino +++ b/tasmota/xdrv_13_display.ino @@ -1500,47 +1500,109 @@ void CmndDisplayRows(void) /*********************************************************************************************\ * optional drivers \*********************************************************************************************/ +#ifdef ESP32 +#ifdef JPEG_PICTS +#include "img_converters.h" +#include "esp_jpg_decode.h" +bool jpg2rgb888(const uint8_t *src, size_t src_len, uint8_t * out, jpg_scale_t scale); +char get_jpeg_size(unsigned char* data, unsigned int data_size, unsigned short *width, unsigned short *height); +void rgb888_to_565(uint8_t *in, uint16_t *out, uint32_t len); +#endif +#endif + #if defined(USE_SCRIPT_FATFS) && defined(USE_SCRIPT) +#define XBUFF_LEN 128 void Draw_RGB_Bitmap(char *file,uint16_t xp, uint16_t yp) { if (!renderer) return; - - //if (!strstr(file,".RGB")) return; File fp; - fp=SD.open(file,FILE_READ); - if (!fp) return; - uint16_t xsize; - fp.read((uint8_t*)&xsize,2); - uint16_t ysize; - fp.read((uint8_t*)&ysize,2); + char *ending = strrchr(file,'.'); + if (!ending) return; + ending++; + char estr[8]; + memset(estr,0,sizeof(estr)); + for (uint32_t cnt=0; cntsetAddrWindow(xp,yp,xp+xsize,yp+ysize); - for(int16_t j=0; j=2) renderer->pushColors(rgb,len/2,true); + uint16_t xdiv=xsize/XBUFF_LEN; + renderer->setAddrWindow(xp,yp,xp+xsize,yp+ysize); + for(int16_t j=0; j=2) renderer->pushColors(rgb,len/2,true); + } + OsWatchLoop(); } - OsWatchLoop(); - } - renderer->setAddrWindow(0,0,0,0); + renderer->setAddrWindow(0,0,0,0); #else - for(int16_t j=0; jwritePixel(xp+i,yp,rgb); + for(int16_t j=0; jwritePixel(xp+i,yp,rgb); + } + delay(0); + OsWatchLoop(); + yp++; } - delay(0); - OsWatchLoop(); - yp++; - } #endif - fp.close(); + fp.close(); + } else if (!strcmp(estr,"jpg")) { + // jpeg files on ESP32 with more memory +#ifdef ESP32 +#ifdef JPEG_PICTS + if (psramFound()) { + fp=SD.open(file,FILE_READ); + if (!fp) return; + uint32_t size = fp.size(); + uint8_t *mem = (uint8_t *)heap_caps_malloc(size+4, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + if (mem) { + uint8_t res=fp.read(mem, size); + if (res) { + uint16_t xsize; + uint16_t ysize; + if (mem[0]==0xff && mem[1]==0xd8) { + get_jpeg_size(mem, size, &xsize, &ysize); + Serial.printf(" x,y %d - %d\n",xsize, ysize ); + if (xsize && ysize) { + uint8_t *out_buf = (uint8_t *)heap_caps_malloc((xsize*ysize*3)+4, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + if (out_buf) { + uint8_t *ob=out_buf; + jpg2rgb888(mem, size, out_buf, (jpg_scale_t)JPG_SCALE_NONE); + uint16_t pixels=xsize*ysize/XBUFF_LEN; + renderer->setAddrWindow(xp,yp,xp+xsize,yp+ysize); + for(int32_t j=0; jpushColors(rbuff,XBUFF_LEN,true); + OsWatchLoop(); + } + renderer->setAddrWindow(0,0,0,0); + free(out_buf); + } + } + } + } + free(mem); + } + fp.close(); + } +#endif // JPEG_PICTS +#endif // ESP32 + } } #endif From e043788de86766eab2cf721f0e5c87364fc012ff Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Mon, 18 May 2020 10:29:32 +0200 Subject: [PATCH 04/15] scripter support for google charts in WEBUI --- tasmota/xdrv_10_scripter.ino | 138 ++++++++++++++++++++++++++++++++++- 1 file changed, 134 insertions(+), 4 deletions(-) diff --git a/tasmota/xdrv_10_scripter.ino b/tasmota/xdrv_10_scripter.ino index 624237ab6..f0608fcfb 100755 --- a/tasmota/xdrv_10_scripter.ino +++ b/tasmota/xdrv_10_scripter.ino @@ -3592,6 +3592,11 @@ const char HTTP_FORM_SDC_HREF[] PROGMEM = uint8_t reject(char *name) { + char *lcp = strrchr(name,'/'); + if (lcp) { + name=lcp+1; + } + while (*name=='/') name++; if (*name=='_') return 1; if (*name=='.') return 1; @@ -4863,6 +4868,17 @@ const char SCRIPT_MSG_TEXTINP[] PROGMEM = const char SCRIPT_MSG_NUMINP[] PROGMEM = "
"; +const char SCRIPT_MSG_GTABLE[] PROGMEM = + "" + "" + ""; + +const char SCRIPT_MSG_GTE1[] PROGMEM = "'%s'"; + void ScriptGetVarname(char *nbuf,char *sp, uint32_t blen) { uint32_t cnt; @@ -4882,6 +4898,7 @@ void ScriptWebShow(char mc) { char tmp[128]; uint8_t optflg=0; char *lp=glob_script_mem.section_ptr+2; + uint8_t chartindex=1; while (lp) { while (*lp==SCRIPT_EOL) { lp++; @@ -5062,7 +5079,6 @@ void ScriptWebShow(char mc) { dtostrfd(max,4,maxstr); dtostrfd(step,4,stepstr); WSContentSend_PD(SCRIPT_MSG_NUMINP,label,minstr,maxstr,stepstr,vstr,vname); - } else { Replace_Cmd_Vars(lin,0,tmp,sizeof(tmp)); if (optflg) { @@ -5073,8 +5089,123 @@ void ScriptWebShow(char mc) { } } else { if (*lin==mc) { - Replace_Cmd_Vars(lin+1,0,tmp,sizeof(tmp)); - WSContentSend_PD(PSTR("%s"),tmp); + lin++; + if (!strncmp(lin,"tb(",3)) { + // get google table + struct T_INDEX ind; + uint8_t vtype; + char *lp=lin+3; + uint8 entries=0; + #define MAX_GARRAY 4 + float *arrays[MAX_GARRAY]; + uint8_t anum=0; + while (anum> 2 %d\n",(uint32_t)*fa); + if (fa && len>=entries) { + if (!entries) {entries = len;} + // add array to list + arrays[anum]=fa; + anum++; + } + } + } else { + lp=lp1; + break; + } + } + } + //Serial.printf("arrays %d\n",anum); + //Serial.printf("entries %d\n",entries); + + WSContentSend_PD(SCRIPT_MSG_GTABLE); + // we know how many arrays and the number of entries + // we need to fetch the labels now + WSContentSend_PD("["); + for (uint32_t cnt=0; cnt Date: Mon, 18 May 2020 14:12:44 +0200 Subject: [PATCH 05/15] Prep release 8.3.1 --- RELEASENOTES.md | 1 + TEMPLATES.md | 30 ++++++++++++++++++++++++------ tasmota/CHANGELOG.md | 1 + 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index dbbe42f3a..b2b110300 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -54,6 +54,7 @@ The following binary downloads have been compiled with ESP8266/Arduino library c ### Version 8.3.0.2 +- Change Hass discovery from using Template or Module name to new Device name (#8462) - Change KNX pow function to approximative pow saving 5k of code space - Change Mutichannel Gas sensor pow function to approximative pow saving 5k of code space - Change Quick Power Cycle detection from 4 to 7 power interrupts (#4066) diff --git a/TEMPLATES.md b/TEMPLATES.md index 25482b2c3..84937c5bd 100644 --- a/TEMPLATES.md +++ b/TEMPLATES.md @@ -56,6 +56,7 @@ ledscom.de 4.5W 430lm {"NAME":"GX53","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FL Lohas ZN070 720lm {"NAME":"Lohas ZN070","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":18} Lumiman A19 7.5W 800lm {"NAME":"Lumiman LM520","GPIO":[0,0,0,0,0,37,0,0,38,0,0,0,0],"FLAG":0,"BASE":18} Luminea ZX-2831 {"NAME":"Luminea CCT","GPIO":[0,0,0,0,140,37,0,0,38,142,141,0,0],"FLAG":0,"BASE":18} +LVWIT A60 6.5W 806lm Filament {"NAME":"LVWIT-E27-WiFi-6.5","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":18} Merkury MI-BW905-999W 700lm {"NAME":"MI-BW905-999W","GPIO":[0,0,0,0,0,37,0,0,38,0,0,0,0],"FLAG":0,"BASE":18} Mimoodz 1050lm {"NAME":"ID Components","GPIO":[0,0,0,0,21,22,0,0,23,24,25,26,27],"FLAG":0,"BASE":18} Mirabella Genio 9W 800lm {"NAME":"GenioBulbCCT","GPIO":[0,0,0,0,0,37,0,0,0,38,0,0,0],"FLAG":0,"BASE":18} @@ -156,6 +157,7 @@ Nedis G125 Filament {"NAME":"WIFILF10GDG125","GPIO":[0,0,0,0,0,0,0,0,0,0,37 Nedis PAR16 330lm {"NAME":"Nedis WIFILW31","GPIO":[0,0,0,0,0,37,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} Sealight Vintage Edison A19 {"NAME":"SealightEdison","GPIO":[0,0,0,0,0,37,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} TCP Smart 810lm Filament {"NAME":"TCP Filament","GPIO":[0,0,0,0,0,0,0,0,0,0,46,0,0],"FLAG":0,"BASE":18} +Xiaomi Philips MUE4088RT {"NAME":"Xiaomi Philips","GPIO":[0,0,0,0,0,0,0,0,0,0,0,37,0],"FLAG":0,"BASE":18} ``` ## Dimmer @@ -171,6 +173,7 @@ Eva Logik WF31 {"NAME":"WF31 Dimmer","GPIO":[255,107,255,108,255,255,0 EX-Store 2 Kanal RS232 V4 {"NAME":"EXS Dimmer","GPIO":[0,148,0,149,0,0,0,0,0,183,0,0,0],"FLAG":0,"BASE":72} Feit Electric DIM/WIFI {"NAME":"Generic","GPIO":[255,107,255,108,255,255,0,0,255,0,255,0,255],"FLAG":0,"BASE":54} Gosund SW2 {"NAME":"Gosund Dimmer","GPIO":[255,148,255,149,17,0,255,255,56,158,37,255,255],"FLAG":0,"BASE":18} +iSwitch Touch Switch {"NAME":"iSwitchOZ Dimmer","GPIO":[0,0,0,0,0,0,0,0,0,0,54,0,0],"FLAG":0,"BASE":54} Martin Jerry MJ-SD01 {"NAME":"MJ-SD02","GPIO":[19,18,0,59,158,58,0,0,57,37,56,122,29],"FLAG":0,"BASE":73} Moes DS01-1 {"NAME":"MOES DS01","GPIO":[255,255,255,255,255,255,0,0,255,108,255,107,255],"FLAG":0,"BASE":54} Moes MS-105-1 v2 {"NAME":"MS-105","GPIO":[0,107,0,108,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} @@ -235,6 +238,7 @@ Arilux SL-LC 09 {"NAME":"Arilux LC09","GPIO":[0,0,0,0,106,37,0,0,39,0,3 DD001-MINI(G)-IR-V08 {"NAME":"WIFI-RGB","GPIO":[0,0,0,0,37,0,0,0,38,0,39,0,0],"FLAG":0,"BASE":18} Electrodragon ESP LED Strip Board, Mosfet Drive {"NAME":"LEDBoard RGBW","GPIO":[0,0,0,0,0,0,0,0,39,38,40,37,52],"FLAG":0,"BASE":18} H801 {"NAME":"H801","GPIO":[0,52,0,0,41,57,0,0,39,38,40,37,0],"FLAG":0,"BASE":20} +Jinvoo SM-WA104 RGB {"NAME":"Jinvoo LED Controller","GPIO":[0,0,0,0,29,39,0,0,37,17,38,0,30],"FLAG":0,"BASE":18} LEDEnet {"NAME":"LEDEnet","GPIO":[0,255,56,255,147,41,0,0,38,39,37,40,0],"FLAG":0,"BASE":34} Luminea ZX-2844 {"NAME":"Luminea ZX-284","GPIO":[40,0,0,0,0,39,0,0,38,17,37,0,0],"FLAG":0,"BASE":18} Luminea ZX-2844-675 {"NAME":"ZX-2844-675","GPIO":[17,0,0,0,38,40,0,0,37,0,39,0,0],"FLAG":0,"BASE":18} @@ -263,6 +267,7 @@ Briloner 2256-150 RGB {"NAME":"Briloner2256-1","GPIO":[51,0,0,0,37,0,0,0,38,0 Cocoon Smart {"NAME":"Cocoon Smart","GPIO":[17,0,0,0,37,0,0,0,38,0,39,0,0],"FLAG":0,"BASE":18} HitLights L1012V-MC1 {"NAME":"HitLights RBG","GPIO":[17,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18} Hykker 3m RGB {"NAME":"HYKKER Strip","GPIO":[0,0,0,0,0,37,0,0,39,17,38,0,0],"FLAG":0,"BASE":18} +INDARUN RGB String Lights {"NAME":"STAR301","GPIO":[0,0,0,0,51,37,0,0,38,39,0,0,0],"FLAG":0,"BASE":34} LE LampUX 16.4ft RGB {"NAME":"LampUX","GPIO":[0,18,17,0,0,38,0,0,39,51,0,37,0],"FLAG":0,"BASE":18} LE LampUX 2m RGB TV Backlight {"NAME":"LE 904102","GPIO":[0,17,18,0,0,38,0,0,39,19,0,37,0],"FLAG":0,"BASE":18} LE LampUX 5m RGB {"NAME":"LampUX","GPIO":[17,0,0,0,0,38,0,0,39,0,0,37,0],"FLAG":0,"BASE":18} @@ -287,6 +292,7 @@ Arlec Smart 15W Security Floodlight {"NAME":"ArlecFlood","GPIO":[0,0,0,0,0,0,0, Arlec Smart 40W 4000lm LED Batten {"NAME":"Arlec Batten","GPIO":[0,0,0,0,0,37,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} Arlec Smart Portable Floodlight 10.5W {"NAME":"Arlec GLD301HA","GPIO":[0,0,0,0,0,37,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} BlitzWolf BW-LT20 {"NAME":"BW-LT20","GPIO":[0,0,0,0,0,37,0,0,0,38,0,0,0],"FLAG":15,"BASE":18} +Brilex Nightstand Lamp {"NAME":"Smart Table La","GPIO":[0,0,18,0,37,157,0,0,38,17,39,0,40],"FLAG":0,"BASE":18} Brilliant CORDIA Colour Temperature Changing LED Flush Ceiling Light {"NAME":"Brilliant Oyst","GPIO":[0,0,0,0,0,37,0,0,38,0,0,0,0],"FLAG":0,"BASE":18} BrilliantSmart 20695 Downlight CCT {"NAME":"SmartCCTDwnLgt","GPIO":[0,0,0,0,0,37,0,0,0,38,0,0,0],"FLAG":0,"BASE":48} BrilliantSmart Prism LED RGBCCT Downlight {"NAME":"Prism","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18} @@ -299,6 +305,7 @@ Deta DET902HA 10W 940lm RGB+CCT {"NAME":"Deta DownLight","GPIO":[0,0,0,0,38,37, electriQ MOODL Ambiance Lamp {"NAME":"ElectriQ MOODL","GPIO":[0,201,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} Fcmila 48W RGBCCT Ceiling Lamp {"NAME":"XDD-48W","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18} Feit Electric 6in. RGBW Recessed Downlight {"NAME":"Feit LEDR6/RGB","GPIO":[0,0,0,0,37,40,0,0,38,50,39,0,0],"FLAG":0,"BASE":48} +Globe 5W 4" Recessed RGBCCT {"NAME":"GlobeRGBWW","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18} Hyperikon 14W 1000lm 6" Downlight {"NAME":"HyperikonDL6","GPIO":[0,0,0,0,38,37,0,0,41,39,40,0,0],"FLAG":0,"BASE":18} iHomma 6W RGBCCT Downlight {"NAME":"iHomma RGBWW","GPIO":[0,0,0,0,41,40,0,0,37,38,39,0,0],"FLAG":0,"BASE":18} iHomma Downlight {"NAME":"iHommaLEDDownl","GPIO":[0,0,0,0,0,40,0,0,37,38,39,0,0],"FLAG":0,"BASE":18} @@ -307,6 +314,7 @@ LE lampUX 15W RGBCCT Ceiling {"NAME":"LE lampUX 15W","GPIO":[0,0,0,0,37,40,0,0, Lohas ZN026CL10 RGBCCT {"NAME":"Lohas LED Lamp","GPIO":[0,0,0,0,38,37,0,0,40,39,41,0,0],"FLAG":0,"BASE":18} Lumary 18W RGBCCT Recessed Panel {"NAME":"LumaryDLghtRGB","GPIO":[0,0,0,0,38,37,0,0,41,39,40,0,0],"FLAG":0,"BASE":18} Mi LED Desk Lamp MJTD01YL {"NAME":"Mi Desk Lamp","GPIO":[0,0,17,0,37,38,0,0,150,151,0,0,0],"FLAG":0,"BASE":66} +MiraBella Genio 6 Pack 30mm Stainless Steel Deck Kit {"NAME":"Genio RGB Deck Lights","GPIO":[0,0,0,0,37,0,0,0,38,0,39,0,0],"FLAG":0,"BASE":18} Mirabella Genio I002741 {"NAME":"GenioDLightRGB","GPIO":[0,0,0,0,38,37,0,0,41,39,40,0,0],"FLAG":0,"BASE":18} Mirabella Genio I002742 {"NAME":"GenioDLightCCT","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":48} Mirabella Genio I002798 Warm White Filament Festoon {"NAME":"GenioFestoon","GPIO":[0,0,0,0,0,0,0,0,0,0,37,0,0],"FLAG":0,"BASE":18} @@ -492,7 +500,7 @@ DILISENS SP201 {"NAME":"Dilisens SP201","GPIO":[0,0,131,0,133,132,52,2 Dunnes Stores {"NAME":"SmartLifePlug","GPIO":[0,0,0,17,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18} DWFeng AWP02L-N {"NAME":"AWP02L-N","GPIO":[255,255,56,255,255,255,0,0,255,17,255,21,255],"FLAG":0,"BASE":18} DWFeng BSD01 {"NAME":"DWFeng BSD01","GPIO":[255,255,255,255,255,255,255,255,21,17,56,255,255],"FLAG":15,"BASE":18} -ECO Plugs CT-065W {"NAME":"ECO/CT-065W","GPIO":[255,255,255,255,255,255,0,0,255,17,255,21,255],"FLAG":0,"BASE":18} +ECO Plugs CT-065W {"NAME":"ECO/CT-065W","GPIO":[0,0,0,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":18} eco4life DPS1101S {"NAME":"Eco4Life Plug","GPIO":[0,0,0,0,52,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18} ednet 84334 {"NAME":"84334","GPIO":[0,0,0,0,56,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18} eFamilyCloud ASDFEE174 {"NAME":"eFamily Plug","GPIO":[0,0,0,0,52,21,0,0,0,17,0,0,0],"FLAG":0,"BASE":18} @@ -515,6 +523,7 @@ Foval SM-PW701E {"NAME":"SM-PW701E","GPIO":[0,0,0,0,56,0,0,0,21,17,0,0, FrankEver FLHS-ZN04 {"NAME":"Israel plug","GPIO":[57,0,56,131,0,134,0,0,0,17,132,21,0],"FLAG":0,"BASE":45} GDTech W-US001 {"NAME":"GDTech W-US001","GPIO":[255,17,255,255,255,255,0,0,255,56,21,255,255],"FLAG":1,"BASE":18} GDTech W-US003 {"NAME":"W-US003","GPIO":[0,17,255,255,255,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18} +Geekbes YM-WS-1 {"NAME":"Office Test Pl","GPIO":[255,255,255,255,255,255,255,255,158,17,12,21,255],"FLAG":15,"BASE":18} Geeni Spot {"NAME":"Geeni Spot","GPIO":[0,0,0,0,52,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18} Geeni Spot Glo {"NAME":"Geeni Glo","GPIO":[0,0,0,0,56,0,0,0,21,17,22,0,0],"FLAG":0,"BASE":18} Geeni Switch {"NAME":"Geeni Switch","GPIO":[0,0,0,0,52,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18} @@ -538,7 +547,7 @@ Gosund WP5 {"NAME":"Gosund-WP5","GPIO":[255,255,255,255,17,255,0,0 Gosund WP6 {"NAME":"Gosund WP6","GPIO":[0,0,0,17,0,0,0,0,56,57,21,0,0],"FLAG":0,"BASE":18} Grefic TE101 {"NAME":"Grefic TE101","GPIO":[0,0,0,0,56,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":1} Gyman SM-PW701U {"NAME":"Gyman","GPIO":[255,255,157,255,56,255,0,0,21,17,255,255,255],"FLAG":0,"BASE":18} -Hama 16 A {"NAME":"Hama Plug","GPIO":[0,0,0,17,134,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":52} +Hama 16A 3680W {"NAME":"Hama Plug","GPIO":[0,0,0,17,134,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":52} Hauppauge 01647 {"NAME":"SL-1642","GPIO":[0,0,0,0,52,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":18} HiHome WPP-10S1 {"NAME":"HIhome WPP-10S","GPIO":[56,0,158,255,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":49} HiHome WPP-10S2 {"NAME":"HiHome WPP-10S","GPIO":[17,0,0,0,134,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":49} @@ -695,6 +704,7 @@ Teckin SP25 {"NAME":"Teckin SP25","GPIO":[56,255,255,255,255,255,0, Teckin SP27 {"NAME":"Teckin SP27","GPIO":[56,255,255,255,255,255,0,0,255,17,255,21,255],"FLAG":0,"BASE":18} Tflag NX-SM100 {"NAME":"NX-SM100","GPIO":[56,0,0,0,0,134,0,0,21,17,132,57,131],"FLAG":0,"BASE":18} TikLok TL650 {"NAME":"TikLok Mini","GPIO":[0,0,0,0,57,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":18} +Timethinker C338 {"NAME":"C338","GPIO":[17,0,255,0,0,0,0,0,21,52,255,0,0],"FLAG":0,"BASE":1} Timethinker TK04 {"NAME":"TimethinkerEU","GPIO":[255,255,255,255,17,255,0,0,255,52,21,255,0],"FLAG":0,"BASE":18} TimeThinker WS2 {"NAME":"TimeThinkerWS2","GPIO":[0,0,0,0,17,0,0,0,0,52,21,0,0],"FLAG":0,"BASE":18} TomaxUSA HKWL-SO07W {"NAME":"HKWL-SO07W","GPIO":[17,255,255,255,255,255,0,0,255,255,21,255,56],"FLAG":0,"BASE":18} @@ -756,14 +766,14 @@ ZSP-001 {"NAME":"ZSP-001","GPIO":[17,255,255,255,133,132,0,0,13 ## Power Strip ``` -A0F0 ZLD-44EU-W {"NAME":"AOFO-4AC-4USB","GPIO":[0,56,0,17,22,21,0,0,23,24,25,0,0],"FLAG":1,"BASE":18} +A0F0 ZLD-44EU-W {"NAME":"AOFO-4AC-4USB","GPIO":[0,56,0,17,22,21,0,0,23,24,33,0,0],"FLAG":1,"BASE":18} Acenx 3AC+3USB {"NAME":"ACENX 3-Outlet","GPIO":[56,55,54,53,0,21,0,0,23,24,22,0,17],"FLAG":0,"BASE":18} Annhome 3AC + 2USB {"NAME":"1200W WiFi SPS","GPIO":[32,0,0,0,57,52,0,0,21,17,22,23,33],"FLAG":0,"BASE":18} AOFO 3AC+4USB {"NAME":"AOFO","GPIO":[0,56,0,17,22,21,0,0,0,23,24,0,0],"FLAG":1,"BASE":18} AOFO 4AC+4USB {"NAME":"AOFO4AC4USB","GPIO":[0,56,0,17,22,21,0,0,23,24,25,0,0],"FLAG":0,"BASE":18} AOFO 4AC+4USB Tuya {"NAME":"AOFO-4AC-4USB","GPIO":[255,255,255,255,255,255,0,0,255,255,255,255,255],"FLAG":1,"BASE":54} AOFO 4AC+4USB UK {"NAME":"AOFO4AC4USB-UK","GPIO":[0,56,0,17,23,24,0,0,22,21,33,0,0],"FLAG":0,"BASE":18} -Arlec Smart 3 Outlet Power Cube {"NAME":"Arlec Cube","GPIO":[0,17,0,0,0,0,0,0,0,52,21,0,0],"FLAG":0,"BASE":18} +Arlec Smart 3 Outlet Power Cube {"NAME":"Arlec Cube","GPIO":[0,17,0,0,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18} Arlec Smart PB88UHA {"NAME":"Arlec PB88UHA","GPIO":[0,56,0,17,22,21,0,0,24,23,0,0,0],"FLAG":15,"BASE":18} Arlec Smart PB89HA {"NAME":"Arlec PB89HA","GPIO":[0,56,0,17,22,21,0,0,24,23,0,0,0],"FLAG":0,"BASE":18} Bauhn ASPBU-1019 {"NAME":"Bauhn 3AC+3USB","GPIO":[0,157,0,0,22,21,0,0,0,23,17,0,0],"FLAG":0,"BASE":18} @@ -865,6 +875,7 @@ BNeta IO-WIFI60-E27P 800lm {"NAME":"OM60/RGBW","GPIO":[0,0,0,0,140,37,0,0,38,14 Bomcosy 600lm {"NAME":"Generic","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":1,"BASE":18} Calex 429002 Reflector 350lm {"NAME":"Calex RGBW","GPIO":[0,0,0,0,0,0,0,0,181,0,180,0,0],"FLAG":0,"BASE":18} Calex 429004 A60 806lm {"NAME":"Calex E27 RGB ","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18} +Calex 429008 B35 5W 470lm {"NAME":"Calex E14 RGBW","GPIO":[0,0,0,0,0,0,0,0,181,0,180,0,0],"FLAG":0,"BASE":18} Cleverio 51395 806lm {"NAME":"CleverioE27RGB","GPIO":[0,0,0,0,140,37,0,0,38,142,141,0,0],"FLAG":0,"BASE":18} CMARS 4W Reflector {"NAME":"RGBWW GU10","GPIO":[0,0,0,0,40,41,0,0,38,39,37,0,0],"FLAG":15,"BASE":18} Dogain 320lm {"NAME":"DOGAIN","GPIO":[0,0,0,0,40,41,0,0,38,39,37,0,0],"FLAG":0,"BASE":18} @@ -889,6 +900,7 @@ Kogan 10W 1050lm {"NAME":"Kogan RGB+CCT","GPIO":[255,255,255,0,37,40,255 Kohree 600lm {"NAME":"Kohree VHP560","GPIO":[0,0,0,0,37,41,0,0,38,40,39,0,0],"FLAG":0,"BASE":18} LE lampUX 8.5W 806lm {"NAME":"lampUX","GPIO":[0,0,0,0,141,140,0,0,38,142,37,0,0],"FLAG":15,"BASE":18} LE lampUX A19 850lm {"NAME":"LE RGBWW 60W","GPIO":[0,0,0,0,140,37,0,0,38,142,141,0,0],"FLAG":1,"BASE":18} +LE lampUX A19 9W 806lm {"NAME":"lampUX","GPIO":[0,0,0,0,141,140,0,0,38,142,37,0,0],"FLAG":15,"BASE":18} Ledmundo 6W 600lm {"NAME":"LEDMUNDO 6W","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18} Legelite 5W Candle {"NAME":"Legelite E12","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18} Legelite A60 7W {"NAME":"Legelite A60 7","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18} @@ -949,7 +961,7 @@ AWOW A60 9W 800lm {"NAME":"AWOW 9W RGBW","GPIO":[0,0,0,0,37,40,0,0,38,0,3 Axtee AI-003 A19 700lm {"NAME":"Axtee E26 7W","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":20} Bawoo EUWL122130 925lm {"NAME":"Bawoo","GPIO":[0,0,0,0,140,37,0,0,0,142,141,0,0],"FLAG":0,"BASE":18} BlitzWolf BW-LT21 900lm {"NAME":"BlitzWolf LT21","GPIO":[0,0,0,0,41,39,0,0,38,0,37,40,0],"FLAG":0,"BASE":18} -BNeta IO-WIFI-GU10 380lm {"NAME":"BNeta","GPIO":[0,0,0,0,140,37,0,0,38,142,141,0,0],"FLAG":0,"BASE":18} +BNeta IO-WIFI-GU10 380lm {"NAME":"BNeta","GPIO":[0,0,0,0,141,140,0,0,37,142,0,0,0],"FLAG":0,"BASE":18} BriHome 6,5W 500lm {"NAME":"BRI E27 6,5W","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":20} Brilliant HK17653S72 350lm {"NAME":"HK17653S72","GPIO":[0,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18} BrilliantSmart 20698 9W 800lm {"NAME":"Brilliant20698","GPIO":[0,0,0,0,141,140,0,0,37,142,0,0,0],"FLAG":0,"BASE":18} @@ -961,7 +973,6 @@ BrizLabs Candle 4,5W 350lm {"NAME":"BrizLabs RGBW","GPIO":[0,0,0,0,37,40,0,0,38 Brizlabs EBE-LZW10 350Lm {"NAME":"Brizlabs E14","GPIO":[0,0,0,0,141,140,0,0,37,142,0,0,0],"FLAG":15,"BASE":18} BrizLabs EBE-SHW03 380lm {"NAME":"BrizLabs","GPIO":[0,0,0,0,140,37,0,0,0,142,141,0,0],"FLAG":0,"BASE":18} BTZ1 {"NAME":"WifiBulb","GPIO":[0,0,0,0,0,37,0,0,39,40,38,0,0],"FLAG":0,"BASE":18} -Calex 429008 B35 5W 470lm {"NAME":"Calex E14 RGBW","GPIO":[0,0,0,0,0,0,0,0,181,0,180,0,0],"FLAG":0,"BASE":18} Cleverio 51398 370lm {"NAME":"CleverioGU10","GPIO":[0,0,0,0,140,37,0,0,38,142,141,0,0],"FLAG":0,"BASE":18} Cocoon DY180363-B 800lm {"NAME":"Cocoon RGBW","GPIO":[0,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18} Connex Connect A60 6W 470lm {"NAME":"Connex RGBW Bu","GPIO":[0,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18} @@ -982,6 +993,7 @@ Gosund WB3 8W 800lm {"NAME":"Gosund WB3","GPIO":[0,0,0,0,40,0,0,0,37,38,39, Hama 10W 1050lm {"NAME":"Hama Bulb RGBW","GPIO":[0,0,0,0,140,37,0,0,0,142,141,0,0],"FLAG":0,"BASE":18} Hama 10W 806lm {"NAME":"Hama Smart WiF","GPIO":[0,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18} Hama 4.5W {"NAME":"hama E14 RGB","GPIO":[0,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18} +Hiiten A19 7W 650lm {"NAME":"Hiiten Bulb","GPIO":[37,0,0,0,140,38,0,0,0,142,141,0,0],"FLAG":0,"BASE":18} Hykker SL-0492 810lm {"NAME":"Hykker RBGW 9W","GPIO":[0,0,0,0,0,40,0,0,37,0,39,38,0],"FLAG":0,"BASE":18} Kainsy 600lm {"NAME":"KAINSY","GPIO":[17,0,0,0,143,144,0,0,0,0,0,0,0],"FLAG":0,"BASE":27} Koaanw 650lm {"NAME":"KOAANW Bulb","GPIO":[0,0,0,0,143,144,0,0,0,0,0,0,0],"FLAG":0,"BASE":27} @@ -1068,6 +1080,7 @@ Zilotek A19 800lm {"NAME":"Zilotek RGBW","GPIO":[0,0,0,0,140,37,0,0,38,14 ``` 1 Channel Inching/Self-Locking {"NAME":"1 Channel","GPIO":[17,0,0,0,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":12} BlitzWolf BW-SS1 {"NAME":"BW-SS1","GPIO":[255,255,255,255,157,21,0,0,255,17,255,255,0],"FLAG":0,"BASE":18} +BlitzWolf BW-SS5 2 Gang {"NAME":"BlitzWolf SS5 2 Gang","GPIO":[0,0,0,0,160,0,0,0,43,42,21,22,0],"FLAG":0,"BASE":18} BlitzWolf SS4 Two Gang {"NAME":"BlitzWolf SS4","GPIO":[0,0,0,0,56,21,0,0,22,17,0,0,0],"FLAG":0,"BASE":18} Canwing CW-001 {"NAME":"Canwing CW-001","GPIO":[17,255,0,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":1} Century Aoke Smart Switch {"NAME":"CenturyAoke","GPIO":[0,255,0,255,21,0,0,0,17,56,255,0,0],"FLAG":0,"BASE":18} @@ -1163,6 +1176,8 @@ BlitzWolf BW-SS3 2 Gang {"NAME":"BW-SS3-2G-EU","GPIO":[157,255,255,255,22,18,25 BlitzWolf BW-SS3 3 Gang {"NAME":"BlitzWolf SS3","GPIO":[158,0,0,10,22,11,0,0,9,21,0,23,0],"FLAG":0,"BASE":18} CD303 3 Gang Touch {"NAME":"Touch Switch 3","GPIO":[54,57,255,19,23,18,255,255,17,21,255,22,52],"FLAG":15,"BASE":18} Connect Smart 2 Gang Wall {"NAME":"CSH-SWTCH2","GPIO":[0,0,52,0,0,18,0,0,22,21,0,0,17],"FLAG":0,"BASE":18} +Deta 3 Gang {"NAME":"DETA 3G Switch","GPIO":[157,0,0,92,91,21,0,0,23,0,22,0,90],"FLAG":0,"BASE":18} +Deta 4 Gang {"NAME":"Deta 4G Switch","GPIO":[157,0,0,17,18,24,0,0,21,19,22,23,20],"FLAG":0,"BASE":18} Deta 6911HA {"NAME":"Deta 1G Switch","GPIO":[0,0,0,0,157,0,0,0,0,21,0,0,90],"FLAG":0,"BASE":18} Deta 6912HA {"NAME":"DETA 2G Switch","GPIO":[0,0,0,0,157,0,0,0,91,21,22,0,90],"FLAG":0,"BASE":18} Digoo DG-S811 3 Gang {"NAME":"DIGOO Switch","GPIO":[0,0,0,0,19,18,0,0,22,21,23,0,17],"FLAG":0,"BASE":18} @@ -1175,6 +1190,7 @@ Enjowi WF-SK301 {"NAME":"Tuya 3 Channel","GPIO":[0,0,0,0,23,18,0,0,17,2 Etekcity ESWL01 {"NAME":"EtekCityESWL01","GPIO":[0,255,0,255,52,53,0,0,0,21,122,0,0],"FLAG":1,"BASE":18} Etekcity ESWL03 3-way {"NAME":"Etekcity 3Way","GPIO":[0,0,0,0,23,29,0,0,82,22,10,0,0],"FLAG":0,"BASE":18} Eva Logik WF30 3-Way {"NAME":"WF30 Switch","GPIO":[0,0,0,0,18,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":18} +Freecube AWS01F {"NAME":"Freecube","GPIO":[0,0,0,17,21,0,0,0,0,0,22,0,0],"FLAG":0,"BASE":18} Geeni TAP 3-Way {"NAME":"Geeni 3-Way","GPIO":[157,0,0,0,0,0,0,0,17,21,0,0,0],"FLAG":0,"BASE":18} Girier EK01 RF433Mhz 1 Gang {"NAME":"Girier EK01","GPIO":[157,0,0,0,21,0,0,0,0,0,0,0,17],"FLAG":0,"BASE":18} Girier EK02 RF433Mhz 2 Gang {"NAME":"Girier EK02","GPIO":[157,0,0,0,0,17,0,0,18,21,22,0,0],"FLAG":0,"BASE":18} @@ -1207,6 +1223,7 @@ LerLink X801A-L No Neutral {"NAME":"LerLink X801-L","GPIO":[0,0,0,0,17,0,0,0,21 Lerlink X802A 2 Gang {"NAME":"Lerlink X802A","GPIO":[0,0,0,18,17,0,0,0,21,23,22,0,0],"FLAG":15,"BASE":18} LerLink X802A-L No Neutral {"NAME":"LerLink X802-L","GPIO":[0,0,0,18,17,0,0,0,21,158,22,0,0],"FLAG":15,"BASE":18} Lightstory WT02S {"NAME":"WT02S","GPIO":[0,0,0,0,57,56,0,0,21,17,0,0,0],"FLAG":0,"BASE":50} +Lonsonho 3 Gang {"NAME":"Lonsonho X803A","GPIO":[0,0,0,18,17,19,0,0,21,29,22,23,0],"FLAG":0,"BASE":18} Lonsonho SK3-01 {"NAME":"Tuya 1 Channel","GPIO":[0,0,0,0,0,17,0,0,0,0,0,21,52],"FLAG":0,"BASE":18} Lonsonho SK3-02 {"NAME":"Tuya 2 Channel","GPIO":[0,0,0,0,22,0,0,0,17,21,18,0,52],"FLAG":0,"BASE":18} Lonsonho SK3-03 {"NAME":"Tuya 3-ch v2","GPIO":[157,58,0,18,22,19,0,0,17,21,57,23,56],"FLAG":0,"BASE":18} @@ -1269,6 +1286,7 @@ Sonoff T1 US 3 Gang {"NAME":"Sonoff T1 3CH","GPIO":[17,255,255,255,23,22,18 Sonoff Touch {"NAME":"Sonoff Touch","GPIO":[17,255,0,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":10} Sonoff Touch {"NAME":"Sonoff Touch","GPIO":[17,255,0,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":10} Sonoff TX T3 3 Gang {"NAME":"TX T3EU3C","GPIO":[17,255,0,255,23,22,18,19,21,158,0,0,0],"FLAG":0,"BASE":30} +SPC Hera {"NAME":"SPC HERA","GPIO":[157,0,0,17,21,0,0,0,0,0,52,0,0],"FLAG":0,"BASE":18} SRL 3-4WW 4 Gang {"NAME":"SRL 4WW Switch","GPIO":[0,0,0,19,23,18,0,0,17,21,24,22,20],"FLAG":0,"BASE":18} SS118-01K1 {"NAME":"SS118-01K1","GPIO":[255,255,255,17,21,255,0,0,255,255,56,255,255],"FLAG":0,"BASE":18} SS86-AI 3-Gang {"NAME":"SS86-AI 3 Gang","GPIO":[157,0,58,18,22,19,0,0,17,21,57,23,56],"FLAG":0,"BASE":18} diff --git a/tasmota/CHANGELOG.md b/tasmota/CHANGELOG.md index f8fd969bc..a2638dffa 100644 --- a/tasmota/CHANGELOG.md +++ b/tasmota/CHANGELOG.md @@ -2,6 +2,7 @@ ### 8.3.0.2 20200517 +- Change Hass discovery from using template name to new Device name (#8462) - Add command ``DeviceName`` defaults to FriendlyName1 and replaces FriendlyName1 in GUI ### 8.3.0.1 20200514 From 6ab98e5e169c8844e123f368bbedc95a26b0a7c6 Mon Sep 17 00:00:00 2001 From: Adrian Scillato <35405447+ascillato@users.noreply.github.com> Date: Mon, 18 May 2020 09:45:17 -0300 Subject: [PATCH 06/15] Update Spanish Translation --- tasmota/language/es_ES.h | 52 ++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index 40b98f766..de021791e 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v8.1.0.1 + * Updated until v8.3.0.2 \*********************************************************************/ #define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -79,7 +79,7 @@ #define D_DATA "Datos" #define D_DARKLIGHT "Oscuro" #define D_DEBUG "Debug" -#define D_DEWPOINT "Dew point" +#define D_DEWPOINT "Punto de Rocío" #define D_DISABLED "Deshabilitado" #define D_DISTANCE "Distancia" #define D_DNS_SERVER "Servidor DNS" @@ -98,8 +98,8 @@ #define D_FILE "Archivo" #define D_FLOW_RATE "Caudal" #define D_FREE_MEMORY "Memoria Libre" -#define D_PSR_MAX_MEMORY "PS-RAM Memory" -#define D_PSR_FREE_MEMORY "PS-RAM free Memory" +#define D_PSR_MAX_MEMORY "Memoria PS-RAM" +#define D_PSR_FREE_MEMORY "Memoria PS-RAM libre" #define D_FREQUENCY "Frecuencia" #define D_GAS "Gas" #define D_GATEWAY "Gateway" @@ -140,7 +140,7 @@ #define D_PROGRAM_SIZE "Tamaño Programa" #define D_PROJECT "Proyecto" #define D_RAIN "Lluvia" -#define D_RANGE "Range" +#define D_RANGE "Rango" #define D_RECEIVED "Recibido" #define D_RESTART "Reiniciar" #define D_RESTARTING "Reiniciando" @@ -302,7 +302,7 @@ #define D_OTHER_PARAMETERS "Otros parámetros" #define D_TEMPLATE "Plantilla" #define D_ACTIVATE "Activar" -#define D_DEVICE_NAME "Device Name" +#define D_DEVICE_NAME "Nombre de Dispositivo" #define D_WEB_ADMIN_PASSWORD "Clave Administrador Web" #define D_MQTT_ENABLE "Habilitar MQTT" #define D_FRIENDLY_NAME "Nombre Amigable" @@ -780,27 +780,27 @@ #define D_SCRIPT_UPLOAD_FILES "Cargar Archivos" //xsns_67_as3935.ino -#define D_AS3935_GAIN "gain:" -#define D_AS3935_ENERGY "energy:" -#define D_AS3935_DISTANCE "distance:" -#define D_AS3935_DISTURBER "disturber:" +#define D_AS3935_GAIN "Ganancia:" +#define D_AS3935_ENERGY "Energía:" +#define D_AS3935_DISTANCE "Distancia:" +#define D_AS3935_DISTURBER "Perturbancia:" #define D_AS3935_VRMS "µVrms:" -#define D_AS3935_APRX "aprx.:" -#define D_AS3935_AWAY "away" -#define D_AS3935_LIGHT "lightning" -#define D_AS3935_OUT "lightning out of range" -#define D_AS3935_NOT "distance not determined" -#define D_AS3935_ABOVE "lightning overhead" -#define D_AS3935_NOISE "noise detected" -#define D_AS3935_DISTDET "disturber detected" -#define D_AS3935_INTNOEV "Interrupt with no Event!" -#define D_AS3935_NOMESS "listening..." -#define D_AS3935_ON "On" -#define D_AS3935_OFF "Off" -#define D_AS3935_INDOORS "Indoors" -#define D_AS3935_OUTDOORS "Outdoors" -#define D_AS3935_CAL_FAIL "calibration failed" -#define D_AS3935_CAL_OK "calibration set to:" +#define D_AS3935_APRX "aprox.:" +#define D_AS3935_AWAY "lejos" +#define D_AS3935_LIGHT "Relámpagos" +#define D_AS3935_OUT "Relámpagos fuera de rango" +#define D_AS3935_NOT "Distancia no determinada" +#define D_AS3935_ABOVE "Relámpagos cercanos" +#define D_AS3935_NOISE "Ruido detectado" +#define D_AS3935_DISTDET "Perturbancia detectada" +#define D_AS3935_INTNOEV "Interrupción sin evento!" +#define D_AS3935_NOMESS "Escuchando..." +#define D_AS3935_ON "Encendido" +#define D_AS3935_OFF "Apagado" +#define D_AS3935_INDOORS "Dentro de casa" +#define D_AS3935_OUTDOORS "Al aire libre" +#define D_AS3935_CAL_FAIL "Falló calibración" +#define D_AS3935_CAL_OK "Calibración a:" //xsns_68_opentherm.ino #define D_SENSOR_BOILER_OT_RX "OpenTherm RX" From 769f69d049bad50c92bb755503ac2cc0d5d34915 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Mon, 18 May 2020 15:02:27 +0200 Subject: [PATCH 07/15] remove debug print --- tasmota/xdrv_13_display.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/xdrv_13_display.ino b/tasmota/xdrv_13_display.ino index 2d0ef4f0f..d2466d051 100644 --- a/tasmota/xdrv_13_display.ino +++ b/tasmota/xdrv_13_display.ino @@ -1575,7 +1575,7 @@ void Draw_RGB_Bitmap(char *file,uint16_t xp, uint16_t yp) { uint16_t ysize; if (mem[0]==0xff && mem[1]==0xd8) { get_jpeg_size(mem, size, &xsize, &ysize); - Serial.printf(" x,y %d - %d\n",xsize, ysize ); + //Serial.printf(" x,y %d - %d\n",xsize, ysize ); if (xsize && ysize) { uint8_t *out_buf = (uint8_t *)heap_caps_malloc((xsize*ysize*3)+4, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); if (out_buf) { From 6c99b89788029525a8ec37721cc5b599fc896882 Mon Sep 17 00:00:00 2001 From: bovirus <1262554+bovirus@users.noreply.github.com> Date: Mon, 18 May 2020 16:17:22 +0200 Subject: [PATCH 08/15] Italian language update --- tasmota/language/it_IT.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 5fa0d51dd..09dcc266b 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -97,9 +97,9 @@ #define D_FALSE "Falso" #define D_FILE "File" #define D_FLOW_RATE "Flusso dati" -#define D_FREE_MEMORY "Memoria Libera" -#define D_PSR_MAX_MEMORY "PS-RAM Memory" -#define D_PSR_FREE_MEMORY "PS-RAM free Memory" +#define D_FREE_MEMORY "Memoria libera" +#define D_PSR_MAX_MEMORY "PS-RAM - Memoria" +#define D_PSR_FREE_MEMORY "PS-RAM - Memoria libera" #define D_FREQUENCY "Frequenza" #define D_GAS "Gas" #define D_GATEWAY "Gateway" @@ -302,7 +302,7 @@ #define D_OTHER_PARAMETERS "Altri parametri" #define D_TEMPLATE "Modello" #define D_ACTIVATE "Attiva" -#define D_DEVICE_NAME "Device Name" +#define D_DEVICE_NAME "Nome dispositivo" #define D_WEB_ADMIN_PASSWORD "Password amministratore web" #define D_MQTT_ENABLE "Abilita MQTT" #define D_FRIENDLY_NAME "Nome amichevole" From d8d9e334f6bd6383ef327545a8defb85bc9d464b Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 18 May 2020 17:02:24 +0200 Subject: [PATCH 09/15] Add ValidTemplate function --- tasmota/support.ino | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tasmota/support.ino b/tasmota/support.ino index db4c9c26e..271ad81fe 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -1132,6 +1132,16 @@ bool ValidModule(uint32_t index) return ValidTemplateModule(index); } +bool ValidTemplate(const char *search) { + char template_name[strlen(SettingsText(SET_TEMPLATE_NAME)) +1]; + char search_name[strlen(search) +1]; + + LowerCase(template_name, SettingsText(SET_TEMPLATE_NAME)); + LowerCase(search_name, search); + + return (strstr(template_name, search_name) != nullptr); +} + String AnyModuleName(uint32_t index) { if (USER_MODULE == index) { From ebbdb28e4897eb420d92d85dad05584c70e78c3b Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 18 May 2020 17:06:11 +0200 Subject: [PATCH 10/15] Bump version to 8.3.1.1 --- RELEASENOTES.md | 9 +-------- tasmota/CHANGELOG.md | 8 ++++++++ tasmota/tasmota_version.h | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index b2b110300..c55146eaa 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -52,11 +52,4 @@ The following binary downloads have been compiled with ESP8266/Arduino library c ## Changelog -### Version 8.3.0.2 - -- Change Hass discovery from using Template or Module name to new Device name (#8462) -- Change KNX pow function to approximative pow saving 5k of code space -- Change Mutichannel Gas sensor pow function to approximative pow saving 5k of code space -- Change Quick Power Cycle detection from 4 to 7 power interrupts (#4066) -- Fix default state of ``SetOption73 0`` for button decoupling and send multi-press and hold MQTT messages -- Add command ``DeviceName`` defaults to FriendlyName1 and replaces FriendlyName1 in GUI +### Version 8.3.1.1 diff --git a/tasmota/CHANGELOG.md b/tasmota/CHANGELOG.md index a2638dffa..d24578cc3 100644 --- a/tasmota/CHANGELOG.md +++ b/tasmota/CHANGELOG.md @@ -1,5 +1,13 @@ ## Unreleased (development) +### 8.3.1.1 20200518 + +## Released + +### 8.3.1 20200518 + +- Release Fred + ### 8.3.0.2 20200517 - Change Hass discovery from using template name to new Device name (#8462) diff --git a/tasmota/tasmota_version.h b/tasmota/tasmota_version.h index d9f248e55..af18e431f 100644 --- a/tasmota/tasmota_version.h +++ b/tasmota/tasmota_version.h @@ -20,7 +20,7 @@ #ifndef _TASMOTA_VERSION_H_ #define _TASMOTA_VERSION_H_ -const uint32_t VERSION = 0x08030002; +const uint32_t VERSION = 0x08030101; // Lowest compatible version const uint32_t VERSION_COMPATIBLE = 0x07010006; From 016258e3636280c59aa8f27d68a4297324845280 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Mon, 18 May 2020 20:06:47 +0200 Subject: [PATCH 11/15] Prepare compile flags for Arduino patches in flight --- platformio.ini | 3 +++ 1 file changed, 3 insertions(+) diff --git a/platformio.ini b/platformio.ini index 8a22cf67e..c9eb6d5f4 100755 --- a/platformio.ini +++ b/platformio.ini @@ -111,6 +111,9 @@ build_flags = ${esp_defaults.build_flags} -lstdc++ ; the following removes the 4-bytes alignment for PSTR(), waiting for a cleaner flag from Arduino Core -DPSTR\(s\)=\(__extension__\(\{static\ const\ char\ __c\[\]\ __attribute__\(\(__aligned__\(1\)\)\)\ __attribute__\(\(section\(\ \"\\\\\".irom0.pstr.\"\ __FILE__\ \".\"\ __STRINGIZE\(__LINE__\)\ \".\"\ \ __STRINGIZE\(__COUNTER__\)\ \"\\\\\"\,\ \\\\\"aSM\\\\\"\,\ \@progbits\,\ 1\ \#\"\)\)\)\ =\ \(s\)\;\ \&__c\[0\]\;\}\)\) + -DPSTR_ALIGN=1 + ; restrict to minimal mime-types + -DMIMETYPE_MINIMAL [irremoteesp_full] build_flags = -DUSE_IR_REMOTE_FULL From e1fbf640379c902588486c1427e8825b9ace14a3 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 19 May 2020 11:15:31 +0200 Subject: [PATCH 12/15] Add command ``Rule0`` Add command ``Rule0`` to change global rule parameters --- RELEASENOTES.md | 2 ++ tasmota/CHANGELOG.md | 2 ++ tasmota/support_command.ino | 4 ++-- tasmota/xdrv_10_rules.ino | 20 ++++++++++++++++++++ tasmota/xdrv_99_debug.ino | 5 +++-- 5 files changed, 29 insertions(+), 4 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index c55146eaa..71041b5da 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -53,3 +53,5 @@ The following binary downloads have been compiled with ESP8266/Arduino library c ## Changelog ### Version 8.3.1.1 + +- Add command ``Rule0`` to change global rule parameters diff --git a/tasmota/CHANGELOG.md b/tasmota/CHANGELOG.md index d24578cc3..e9ec2176d 100644 --- a/tasmota/CHANGELOG.md +++ b/tasmota/CHANGELOG.md @@ -2,6 +2,8 @@ ### 8.3.1.1 20200518 +- Add command ``Rule0`` to change global rule parameters + ## Released ### 8.3.1 20200518 diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino index dbcd5a954..f262b5fcb 100644 --- a/tasmota/support_command.ino +++ b/tasmota/support_command.ino @@ -1040,7 +1040,7 @@ void CmndModules(void) uint32_t j = i ? midx +1 : 0; if ((ResponseAppend_P(PSTR("\"%d\":\"%s\""), j, AnyModuleName(midx).c_str()) > (LOGSZ - TOPSZ)) || (i == sizeof(kModuleNiceList))) { ResponseJsonEndEnd(); - MqttPublishPrefixTopic_P(RESULT_OR_STAT, UpperCase(XdrvMailbox.command, XdrvMailbox.command)); + MqttPublishPrefixTopic_P(RESULT_OR_STAT, XdrvMailbox.command); jsflg = false; lines++; } @@ -1149,7 +1149,7 @@ void CmndGpios(void) char stemp1[TOPSZ]; if ((ResponseAppend_P(PSTR("\"%d\":\"%s\""), ridx, GetTextIndexed(stemp1, sizeof(stemp1), midx, kSensorNames)) > (LOGSZ - TOPSZ)) || (i == ARRAY_SIZE(kGpioNiceList) -1)) { ResponseJsonEndEnd(); - MqttPublishPrefixTopic_P(RESULT_OR_STAT, UpperCase(XdrvMailbox.command, XdrvMailbox.command)); + MqttPublishPrefixTopic_P(RESULT_OR_STAT, XdrvMailbox.command); jsflg = false; lines++; } diff --git a/tasmota/xdrv_10_rules.ino b/tasmota/xdrv_10_rules.ino index ddb4de39d..d23f3e122 100644 --- a/tasmota/xdrv_10_rules.ino +++ b/tasmota/xdrv_10_rules.ino @@ -1954,6 +1954,26 @@ void RulesPreprocessCommand(char *pCommands) void CmndRule(void) { + if (0 == XdrvMailbox.index) { + char data = '\0'; + if (XdrvMailbox.data_len > 0) { // Allow show all if 0 + if (!((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 10))) { + if ('"' == XdrvMailbox.data[0]) { + data = '"'; // Save data as XdrvMailbox.data is destroyed + } else { + XdrvMailbox.data_len = 0; // Discard any additional text + } + } + } + for (uint32_t i = 1; i <= MAX_RULE_SETS; i++) { + XdrvMailbox.index = i; + XdrvMailbox.data[0] = data; // Only 0 or " + CmndRule(); + MqttPublishPrefixTopic_P(RESULT_OR_STAT, XdrvMailbox.command); + } + mqtt_data[0] = '\0'; // Disable further processing + return; + } uint8_t index = XdrvMailbox.index; if ((index > 0) && (index <= MAX_RULE_SETS)) { // if ((XdrvMailbox.data_len > 0) && (XdrvMailbox.data_len < sizeof(Settings.rules[index -1]))) { // TODO postpone size calculation diff --git a/tasmota/xdrv_99_debug.ino b/tasmota/xdrv_99_debug.ino index 672ff17d3..08f451c30 100644 --- a/tasmota/xdrv_99_debug.ino +++ b/tasmota/xdrv_99_debug.ino @@ -45,7 +45,6 @@ #define D_CMND_CFGDUMP "CfgDump" #define D_CMND_CFGPEEK "CfgPeek" #define D_CMND_CFGPOKE "CfgPoke" -#define D_CMND_CFGSHOW "CfgShow" #define D_CMND_CFGXOR "CfgXor" #define D_CMND_CPUCHECK "CpuChk" #define D_CMND_EXCEPTION "Exception" @@ -459,7 +458,9 @@ void CmndCfgXor(void) if (XdrvMailbox.data_len > 0) { Web.config_xor_on_set = XdrvMailbox.payload; } - ResponseCmndNumber(Web.config_xor_on_set); + char temp[10]; + snprintf_P(temp, sizeof(temp), PSTR("0x%02X"), Web.config_xor_on_set); + ResponseCmndChar(temp); } #endif // USE_WEBSERVER From d61345e79f9ef01eab12ecc66082ebc9322e0c58 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 19 May 2020 11:31:24 +0200 Subject: [PATCH 13/15] Add TEMPLATES.md generation tool --- tools/templates/templates.py | 98 ++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 tools/templates/templates.py diff --git a/tools/templates/templates.py b/tools/templates/templates.py new file mode 100644 index 000000000..c1d696cbc --- /dev/null +++ b/tools/templates/templates.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python3 + +""" + templates.py - template beautify TEMPLATES.md for Tasmota + + Copyright (C) 2020 Theo Arends + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Requirements: + - Python + - pip pycurl certifi + +Instructions: + Execute command to produce file TEMPLATE.md as found in the Tasmota root folder + +Usage: + python templates.py + +""" + +import io +import pycurl +import certifi +from io import BytesIO +from io import StringIO +from datetime import datetime + +column = 27 # Start position of {"NAME":... in line + +def main(): + print ("\n*** templates.py v20200514 by Theo Arends ***") + + # Download from template website + buffer = BytesIO() + url = "https://templates.blakadder.com/list.json" + c = pycurl.Curl() + c.setopt(c.URL, url) + c.setopt(c.WRITEDATA, buffer) + c.setopt(c.CAINFO, certifi.where()) + c.perform() + c.close() + body = buffer.getvalue() + fin = StringIO(body.decode('UTF-8')) + + now = datetime.now() + month = now.strftime('%B') + year = now.strftime('%Y') + + # Write to root/TEMPLATES.md + fout = open("..\..\TEMPLATES.md","w+") + + fout.write("\"Logo\"\n") + fout.write("\n") + fout.write("# Templates\n") + fout.write("\n") + fout.write("Find below the available templates as of " + month + " " + year + ". More template information can be found in the [Tasmota Device Templates Repository](http://blakadder.github.io/templates)\n") + + not_first = 0 + fline = fin.readlines() + for line in fline: + if line.strip(): + if line.startswith("##"): + if not_first: + fout.write('```\n') + fout.write('\n') + fout.write(line) + fout.write('```\n') + not_first = 1 + elif line.startswith("#"): + noop = 0 + else: + pos1 = line.find("{") + if pos1 < column: + a = column + 2 - pos1 + lout = line[0:pos1 - 4] + " "*a + line[pos1:len(line)] + else: + lout = line[0:pos1 - 4] + " " + line[pos1:len(line)] + fout.write(lout) + + fout.write('```\n') + + fout.close() + fin.close() + +if __name__ == "__main__": + main() From cd7f7195634fb1f7fdc4590bbf7311d9c8dd55d0 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 19 May 2020 15:52:10 +0200 Subject: [PATCH 14/15] Add more functionality to ``Switchmode`` 11 and 12 (#8450) Add more functionality to ``Switchmode`` 11 and 12 (#8450) --- RELEASENOTES.md | 1 + tasmota/CHANGELOG.md | 1 + tasmota/support_switch.ino | 47 +++++++++++++------------------------ tasmota/support_tasmota.ino | 6 ++++- tasmota/tasmota.h | 2 +- 5 files changed, 24 insertions(+), 33 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 71041b5da..75c484388 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -55,3 +55,4 @@ The following binary downloads have been compiled with ESP8266/Arduino library c ### Version 8.3.1.1 - Add command ``Rule0`` to change global rule parameters +- Add more functionality to ``Switchmode`` 11 and 12 (#8450) diff --git a/tasmota/CHANGELOG.md b/tasmota/CHANGELOG.md index e9ec2176d..1f343928e 100644 --- a/tasmota/CHANGELOG.md +++ b/tasmota/CHANGELOG.md @@ -3,6 +3,7 @@ ### 8.3.1.1 20200518 - Add command ``Rule0`` to change global rule parameters +- Add more functionality to ``Switchmode`` 11 and 12 (#8450) ## Released diff --git a/tasmota/support_switch.ino b/tasmota/support_switch.ino index 64837c74c..46b642e5b 100644 --- a/tasmota/support_switch.ino +++ b/tasmota/support_switch.ino @@ -154,8 +154,15 @@ void SwitchHandler(uint8_t mode) if (Switch.hold_timer[i]) { Switch.hold_timer[i]--; + if (Switch.hold_timer[i] == loops_per_second * Settings.param[P_HOLD_TIME] / 25) { + if ((Settings.switchmode[i] == PUSHHOLDMULTI) & (NOT_PRESSED == Switch.last_state[i])) { + SendKey(KEY_SWITCH, i +1, POWER_INCREMENT); // Execute command via MQTT + } + if ((Settings.switchmode[i] == PUSHHOLDMULTI_INV) & (PRESSED == Switch.last_state[i])) { + SendKey(KEY_SWITCH, i +1, POWER_INCREMENT); // Execute command via MQTT + } + } if (0 == Switch.hold_timer[i]) { - switch (Settings.switchmode[i]) { case TOGGLEMULTI: switchflag = POWER_TOGGLE; // Toggle after hold @@ -202,51 +209,33 @@ void SwitchHandler(uint8_t mode) switchflag = ~button &1; // Follow inverted wall switch state break; case PUSHBUTTON: -// if ((PRESSED == button) && (NOT_PRESSED == Switch.last_state[i])) { if (PRESSED == button) { switchflag = POWER_TOGGLE; // Toggle with pushbutton to Gnd } break; case PUSHBUTTON_INV: -// if ((NOT_PRESSED == button) && (PRESSED == Switch.last_state[i])) { if (NOT_PRESSED == button) { switchflag = POWER_TOGGLE; // Toggle with releasing pushbutton from Gnd } break; case PUSHBUTTONHOLD: -// if ((PRESSED == button) && (NOT_PRESSED == Switch.last_state[i])) { if (PRESSED == button) { Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 10; // Start timer on button press } -// if ((NOT_PRESSED == button) && (PRESSED == Switch.last_state[i]) && (Switch.hold_timer[i])) { if ((NOT_PRESSED == button) && (Switch.hold_timer[i])) { Switch.hold_timer[i] = 0; // Button released and hold timer not expired : stop timer... switchflag = POWER_TOGGLE; // ...and Toggle } break; case PUSHBUTTONHOLD_INV: -// if ((NOT_PRESSED == button) && (PRESSED == Switch.last_state[i])) { if (NOT_PRESSED == button) { Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 10; // Start timer on button press... } -// if ((PRESSED == button) && (NOT_PRESSED == Switch.last_state[i]) && (Switch.hold_timer[i])) { if ((PRESSED == button) && (Switch.hold_timer[i])) { Switch.hold_timer[i] = 0; // Button released and hold timer not expired : stop timer. switchflag = POWER_TOGGLE; // ...and Toggle } break; -/* - // Reverted Fix switchmode 6 according to issue 7778 (#7831) - case PUSHBUTTONHOLD_INV: - if ((PRESSED == button) && (NOT_PRESSED == Switch.last_state[i])) { - Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 10; // Start timer on button press... - switchflag = POWER_TOGGLE; // ...and Toggle - } - if ((NOT_PRESSED == button) && (PRESSED == Switch.last_state[i])) { - Switch.hold_timer[i] = 0; // Button released : stop timer. - } - break; -*/ case TOGGLEMULTI: case FOLLOWMULTI: case FOLLOWMULTI_INV: @@ -258,36 +247,32 @@ void SwitchHandler(uint8_t mode) } break; case PUSHHOLDMULTI: -// if ((NOT_PRESSED == button) && (PRESSED == Switch.last_state[i])) { if (NOT_PRESSED == button) { if (Switch.hold_timer[i] != 0) { SendKey(KEY_SWITCH, i +1, POWER_INV); // Execute command via MQTT } - Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 10; - } -// if ((PRESSED == button) && (NOT_PRESSED == Switch.last_state[i])) { - if (PRESSED == button) { + } else { if (Switch.hold_timer[i] > loops_per_second * Settings.param[P_HOLD_TIME] / 25) { switchflag = POWER_TOGGLE; // Toggle with pushbutton + } else { + SendKey(KEY_SWITCH, i +1, POWER_RELEASE); // Execute command via MQTT } - Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 10; } + Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 10; break; case PUSHHOLDMULTI_INV: -// if ((PRESSED == button) && (NOT_PRESSED == Switch.last_state[i])) { if (PRESSED == button) { if (Switch.hold_timer[i] != 0) { SendKey(KEY_SWITCH, i +1, POWER_INV); // Execute command via MQTT } - Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 10; - } -// if ((NOT_PRESSED == button) && (PRESSED == Switch.last_state[i])) { - if (NOT_PRESSED == button) { + } else { if (Switch.hold_timer[i] > loops_per_second * Settings.param[P_HOLD_TIME] / 25) { switchflag = POWER_TOGGLE; // Toggle with pushbutton + } else { + SendKey(KEY_SWITCH, i +1, POWER_RELEASE); // Execute command via MQTT } - Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 10; } + Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 10; break; case PUSHON: if (PRESSED == button) { diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index b1cc56a68..90df92a37 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -423,6 +423,10 @@ bool SendKey(uint32_t key, uint32_t device, uint32_t state) // state 1 = POWER_ON = on // state 2 = POWER_TOGGLE = toggle // state 3 = POWER_HOLD = hold +// state 4 = POWER_INCREMENT = button still pressed +// state 5 = POWER_INV = button released +// state 6 = POWER_CLEAR = button released +// state 7 = POWER_RELEASE = button released // state 9 = CLEAR_RETAIN = clear retain flag char stopic[TOPSZ]; @@ -1232,7 +1236,7 @@ void SerialInput(void) } else if ((serial_in_byte_counter == INPUT_BUFFER_SIZE) #ifdef ESP8266 - || Serial.hasOverrun() // Default ESP8266 Serial buffer size is 256. Tasmota increases to INPUT_BUFFER_SIZE + || Serial.hasOverrun() #endif ) { serial_buffer_overrun = true; diff --git a/tasmota/tasmota.h b/tasmota/tasmota.h index 0376f3429..7434ff28e 100644 --- a/tasmota/tasmota.h +++ b/tasmota/tasmota.h @@ -232,7 +232,7 @@ enum TopicOptions { CMND, STAT, TELE, nu1, RESULT_OR_CMND, RESULT_OR_STAT, RESUL enum ExecuteCommandPowerOptions { POWER_OFF, POWER_ON, POWER_TOGGLE, POWER_BLINK, POWER_BLINK_STOP, POWER_OFF_NO_STATE = 8, POWER_ON_NO_STATE, POWER_TOGGLE_NO_STATE, POWER_SHOW_STATE = 16 }; -enum SendKeyPowerOptions { POWER_HOLD = 3, POWER_INCREMENT = 4, POWER_INV = 5, POWER_CLEAR = 6, CLEAR_RETAIN = 9 }; +enum SendKeyPowerOptions { POWER_HOLD = 3, POWER_INCREMENT = 4, POWER_INV = 5, POWER_CLEAR = 6, POWER_RELEASE = 7, CLEAR_RETAIN = 9 }; enum SendKeyOptions { KEY_BUTTON, KEY_SWITCH }; enum SendKeyMultiClick { SINGLE = 10, DOUBLE = 11, TRIPLE = 12, QUAD = 13, PENTA = 14}; From 5921055e2f56601a9b246cd8675b245ab77dd588 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Tue, 19 May 2020 16:44:01 +0200 Subject: [PATCH 15/15] scripter update script compression option more google charts (histogram, tables, gauges) smal bug fixes --- tasmota/xdrv_10_scripter.ino | 103 +++++++++++++++++++++++++++++------ 1 file changed, 87 insertions(+), 16 deletions(-) diff --git a/tasmota/xdrv_10_scripter.ino b/tasmota/xdrv_10_scripter.ino index f0608fcfb..8c2dcbc4f 100755 --- a/tasmota/xdrv_10_scripter.ino +++ b/tasmota/xdrv_10_scripter.ino @@ -66,8 +66,9 @@ keywords if then else endif, or, and are better readable for beginners (others m uint32_t EncodeLightId(uint8_t relay_id); uint32_t DecodeLightId(uint32_t hue_id); -#if defined(ESP32) && defined(ESP32_SCRIPT_SIZE) && !defined(USE_24C256) && !defined(USE_SCRIPT_FATFS) +#include +#if defined(ESP32) && defined(ESP32_SCRIPT_SIZE) && !defined(USE_24C256) && !defined(USE_SCRIPT_FATFS) #include "FS.h" #include "SPIFFS.h" @@ -3035,7 +3036,7 @@ int16_t Run_Scripter(const char *type, int8_t tlen, char *js) { uint8_t index=glob_script_mem.type[ind.index].index; if ((vtype&STYPE)==0) { // numeric result - if (glob_script_mem.type[index].bits.is_filter) { + if (glob_script_mem.type[ind.index].bits.is_filter) { uint8_t len=0; float *fa=Get_MFAddr(index,&len); //Serial.printf(">> 2 %d\n",(uint32_t)*fa); @@ -3965,6 +3966,25 @@ void ScriptSaveSettings(void) { glob_script_mem.script_mem_size=0; } + +#ifndef UNISHOXRSIZE +#define UNISHOXRSIZE 2560 +#endif +#ifdef USE_RULES_COMPRESSION +#ifndef USE_24C256 +#ifndef USE_SCRIPT_FATFS +#ifndef ESP32_SCRIPT_SIZE + uint32_t len_compressed = unishox_compress(glob_script_mem.script_ram, strlen(glob_script_mem.script_ram), Settings.rules[0], UNISHOXRSIZE); + if (len_compressed > 0) { + AddLog_P2(LOG_LEVEL_INFO,PSTR("compressed to %d"),len_compressed * 100 / strlen(glob_script_mem.script_ram)); + } else { + AddLog_P2(LOG_LEVEL_INFO, PSTR("script compress error: %d"), len_compressed); + } +#endif +#endif +#endif +#endif // USE_RULES_COMPRESSION + if (bitRead(Settings.rule_enabled, 0)) { int16_t res=Init_Scripter(); if (res) { @@ -4871,14 +4891,31 @@ const char SCRIPT_MSG_NUMINP[] PROGMEM = const char SCRIPT_MSG_GTABLE[] PROGMEM = "" "" - "" + "" + ""; + + +const char SCRIPT_MSG_GTABLEa[] PROGMEM = + ""; -const char SCRIPT_MSG_GTE1[] PROGMEM = "'%s'"; +const char SCRIPT_MSG_GOPT1[] PROGMEM = +"title:'%s',isStacked:false"; +const char SCRIPT_MSG_GOPT2[] PROGMEM = +"showRowNumber:true,sort:'disable',allowHtml:true,width:'100%%',height:'100%%',cssClassNames:cssc"; + +const char SCRIPT_MSG_GTE1[] PROGMEM = "'%s'"; void ScriptGetVarname(char *nbuf,char *sp, uint32_t blen) { uint32_t cnt; @@ -4897,8 +4934,9 @@ void ScriptWebShow(char mc) { char line[128]; char tmp[128]; uint8_t optflg=0; - char *lp=glob_script_mem.section_ptr+2; uint8_t chartindex=1; + uint8_t google_libs=0; + char *lp=glob_script_mem.section_ptr+2; while (lp) { while (*lp==SCRIPT_EOL) { lp++; @@ -4928,7 +4966,6 @@ void ScriptWebShow(char mc) { optflg=0; } - // check for input elements if (!strncmp(lin,"sl(",3)) { // insert slider sl(min max var left mid right) @@ -5108,8 +5145,8 @@ void ScriptWebShow(char mc) { uint8_t index=glob_script_mem.type[ind.index].index; if ((vtype&STYPE)==0) { // numeric result - //Serial.printf("numeric\n"); - if (glob_script_mem.type[index].bits.is_filter) { + //Serial.printf("numeric %d - %d \n",ind.index,index); + if (glob_script_mem.type[ind.index].bits.is_filter) { //Serial.printf("numeric array\n"); uint8_t len=0; float *fa=Get_MFAddr(index,&len); @@ -5130,7 +5167,13 @@ void ScriptWebShow(char mc) { //Serial.printf("arrays %d\n",anum); //Serial.printf("entries %d\n",entries); - WSContentSend_PD(SCRIPT_MSG_GTABLE); + if (!google_libs) { + WSContentSend_PD(SCRIPT_MSG_GTABLE); + google_libs=1; + } + + WSContentSend_PD(SCRIPT_MSG_GTABLEa); + // we know how many arrays and the number of entries // we need to fetch the labels now WSContentSend_PD("["); @@ -5180,27 +5223,40 @@ void ScriptWebShow(char mc) { lp=GetStringResult(lp,OPER_EQU,header,0); SCRIPT_SKIP_SPACES + char options[128]; + snprintf_P(options,sizeof(options),SCRIPT_MSG_GOPT1,header); + const char *type; if (*lp!=')') { switch (*lp) { case 'l': - type="LineChart"; + type=PSTR("LineChart"); break; case 'b': - type="BarChart"; + type=PSTR("BarChart"); break; case 'p': - type="PieChart"; + type=PSTR("PieChart"); break; + case 'g': + type=PSTR("Gauge"); + break; + case 't': + type=PSTR("Table"); + snprintf_P(options,sizeof(options),SCRIPT_MSG_GOPT2); + break; + case 'h': + type=PSTR("Histogram"); + break; default: - type="ColumnChart"; + type=PSTR("ColumnChart"); break; } } else { - type="ColumnChart"; + type=PSTR("ColumnChart"); } - WSContentSend_PD(SCRIPT_MSG_GTABLEb,header,type,chartindex); + WSContentSend_PD(SCRIPT_MSG_GTABLEb,options,type,chartindex); chartindex++; } else { Replace_Cmd_Vars(lin,0,tmp,sizeof(tmp)); @@ -5363,6 +5419,7 @@ uint32_t scripter_create_task(uint32_t num, uint32_t time, uint32_t core) { * Interface \*********************************************************************************************/ + bool Xdrv10(uint8_t function) { bool result = false; @@ -5377,6 +5434,19 @@ bool Xdrv10(uint8_t function) glob_script_mem.script_pram=(uint8_t*)Settings.script_pram[0]; glob_script_mem.script_pram_size=PMEM_SIZE; +#ifdef USE_RULES_COMPRESSION +#ifndef USE_24C256 +#ifndef USE_SCRIPT_FATFS +#ifndef ESP32_SCRIPT_SIZE + glob_script_mem.script_ram=(char*)calloc(UNISHOXRSIZE+8,1); + if (!glob_script_mem.script_ram) { break; } + unishox_decompress(Settings.rules[0], strlen(Settings.rules[0]), glob_script_mem.script_ram, UNISHOXRSIZE); + glob_script_mem.script_size=UNISHOXRSIZE; +#endif +#endif +#endif +#endif // USE_RULES_COMPRESSION + #ifdef USE_BUTTON_EVENT for (uint32_t cnt=0;cnt