From 25be8709cf53259abb7fceb3ce7daef1ecf8839a Mon Sep 17 00:00:00 2001 From: Thomas Hargrove Date: Fri, 11 Nov 2022 12:03:28 -0800 Subject: [PATCH 01/21] Shave off the leftmost pixel of the 7 segment font --- .../src/font24_7seg.c | 1352 ++++++++--------- 1 file changed, 676 insertions(+), 676 deletions(-) diff --git a/lib/lib_display/Display_Renderer-gemu-1.0/src/font24_7seg.c b/lib/lib_display/Display_Renderer-gemu-1.0/src/font24_7seg.c index 1844fc6cf..645caa9d4 100644 --- a/lib/lib_display/Display_Renderer-gemu-1.0/src/font24_7seg.c +++ b/lib/lib_display/Display_Renderer-gemu-1.0/src/font24_7seg.c @@ -41,712 +41,712 @@ const uint8_t Font24_Table_7seg [] PROGMEM = { - // @0 ' ' (17 pixels wide) - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // + // @0 ' ' (16 pixels wide) +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // - // @72 '!' (17 pixels wide) - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x03,0x80,0x00, // ### - 0x03,0x80,0x00, // ### - 0x03,0x80,0x00, // ### - 0x03,0x80,0x00, // ### - 0x03,0x80,0x00, // ### - 0x03,0x80,0x00, // ### - 0x03,0x80,0x00, // ### - 0x03,0x80,0x00, // ### - 0x03,0x80,0x00, // ### - 0x01,0x00,0x00, // # - 0x01,0x00,0x00, // # - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x03,0x80,0x00, // ### - 0x03,0x80,0x00, // ### - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // +// @72 '!' (16 pixels wide) +0x00,0x00, // +0x00,0x00, // +0x07,0x00, // ### +0x07,0x00, // ### +0x07,0x00, // ### +0x07,0x00, // ### +0x07,0x00, // ### +0x07,0x00, // ### +0x07,0x00, // ### +0x07,0x00, // ### +0x07,0x00, // ### +0x02,0x00, // # +0x02,0x00, // # +0x00,0x00, // +0x00,0x00, // +0x07,0x00, // ### +0x07,0x00, // ### +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // - // @144 '"' (17 pixels wide) - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x0e,0x70,0x00, // ### ### - 0x0e,0x70,0x00, // ### ### - 0x0e,0x70,0x00, // ### ### - 0x04,0x20,0x00, // # # - 0x04,0x20,0x00, // # # - 0x04,0x20,0x00, // # # - 0x04,0x20,0x00, // # # - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // +// @144 '"' (16 pixels wide) +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x1C,0xE0, // ### ### +0x1C,0xE0, // ### ### +0x1C,0xE0, // ### ### +0x08,0x40, // # # +0x08,0x40, // # # +0x08,0x40, // # # +0x08,0x40, // # # +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // - // @216 '#' (17 pixels wide) - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x06,0x60,0x00, // ## ## - 0x06,0x60,0x00, // ## ## - 0x06,0x60,0x00, // ## ## - 0x06,0x60,0x00, // ## ## - 0x06,0x60,0x00, // ## ## - 0x3f,0xf8,0x00, // ########### - 0x3f,0xf8,0x00, // ########### - 0x06,0x60,0x00, // ## ## - 0x0c,0xc0,0x00, // ## ## - 0x3f,0xf8,0x00, // ########### - 0x3f,0xf8,0x00, // ########### - 0x0c,0xc0,0x00, // ## ## - 0x0c,0xc0,0x00, // ## ## - 0x0c,0xc0,0x00, // ## ## - 0x0c,0xc0,0x00, // ## ## - 0x0c,0xc0,0x00, // ## ## - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // +// @216 '#' (16 pixels wide) +0x00,0x00, // +0x00,0x00, // +0x0C,0xC0, // ## ## +0x0C,0xC0, // ## ## +0x0C,0xC0, // ## ## +0x0C,0xC0, // ## ## +0x0C,0xC0, // ## ## +0x7F,0xF0, // ########### +0x7F,0xF0, // ########### +0x0C,0xC0, // ## ## +0x19,0x80, // ## ## +0x7F,0xF0, // ########### +0x7F,0xF0, // ########### +0x19,0x80, // ## ## +0x19,0x80, // ## ## +0x19,0x80, // ## ## +0x19,0x80, // ## ## +0x19,0x80, // ## ## +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // - // @288 '$' (17 pixels wide) - 0x00,0x00,0x00, // - 0x01,0x80,0x00, // ## - 0x01,0x80,0x00, // ## - 0x07,0xb0,0x00, // #### ## - 0x0f,0xf0,0x00, // ######## - 0x18,0x70,0x00, // ## ### - 0x18,0x70,0x00, // ## ### - 0x1c,0x00,0x00, // ### - 0x0f,0x80,0x00, // ##### - 0x07,0xe0,0x00, // ###### - 0x00,0xf0,0x00, // #### - 0x18,0x30,0x00, // ## ## - 0x1c,0x30,0x00, // ### ## - 0x1c,0x70,0x00, // ### ### - 0x1f,0xe0,0x00, // ######## - 0x1b,0xc0,0x00, // ## #### - 0x01,0x80,0x00, // ## - 0x01,0x80,0x00, // ## - 0x01,0x80,0x00, // ## - 0x01,0x80,0x00, // ## - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // +// @288 '$' (16 pixels wide) +0x00,0x00, // +0x03,0x00, // ## +0x03,0x00, // ## +0x0F,0x60, // #### ## +0x1F,0xE0, // ######## +0x30,0xE0, // ## ### +0x30,0xE0, // ## ### +0x38,0x00, // ### +0x1F,0x00, // ##### +0x0F,0xC0, // ###### +0x01,0xE0, // #### +0x30,0x60, // ## ## +0x38,0x60, // ### ## +0x38,0xE0, // ### ### +0x3F,0xC0, // ######## +0x37,0x80, // ## #### +0x03,0x00, // ## +0x03,0x00, // ## +0x03,0x00, // ## +0x03,0x00, // ## +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // - // @360 '%' (17 pixels wide) - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x07,0x80,0x00, // #### - 0x0f,0xc0,0x00, // ###### - 0x1c,0xe0,0x00, // ### ### - 0x18,0x60,0x00, // ## ## - 0x18,0x60,0x00, // ## ## - 0x1c,0xe0,0x00, // ### ### - 0x0f,0xf8,0x00, // ######### - 0x07,0xe0,0x00, // ###### - 0x1f,0xf0,0x00, // ######### - 0x07,0x38,0x00, // ### ### - 0x06,0x18,0x00, // ## ## - 0x06,0x18,0x00, // ## ## - 0x07,0x38,0x00, // ### ### - 0x03,0xf0,0x00, // ###### - 0x01,0xe0,0x00, // #### - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // +// @360 '%' (16 pixels wide) +0x00,0x00, // +0x00,0x00, // +0x0F,0x00, // #### +0x1F,0x80, // ###### +0x39,0xC0, // ### ### +0x30,0xC0, // ## ## +0x30,0xC0, // ## ## +0x39,0xC0, // ### ### +0x1F,0xF0, // ######### +0x0F,0xC0, // ###### +0x3F,0xE0, // ######### +0x0E,0x70, // ### ### +0x0C,0x30, // ## ## +0x0C,0x30, // ## ## +0x0E,0x70, // ### ### +0x07,0xE0, // ###### +0x03,0xC0, // #### +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // - // @432 '&' (17 pixels wide) - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x03,0xf0,0x00, // ###### - 0x07,0xf0,0x00, // ####### - 0x0c,0x60,0x00, // ## ## - 0x0c,0x00,0x00, // ## - 0x0c,0x00,0x00, // ## - 0x06,0x00,0x00, // ## - 0x07,0x00,0x00, // ### - 0x0f,0x9c,0x00, // ##### ### - 0x1d,0xfc,0x00, // ### ####### - 0x18,0xf0,0x00, // ## #### - 0x18,0x70,0x00, // ## ### - 0x0f,0xfc,0x00, // ########## - 0x07,0xdc,0x00, // ##### ### - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // +// @432 '&' (16 pixels wide) +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x07,0xE0, // ###### +0x0F,0xE0, // ####### +0x18,0xC0, // ## ## +0x18,0x00, // ## +0x18,0x00, // ## +0x0C,0x00, // ## +0x0E,0x00, // ### +0x1F,0x38, // ##### ### +0x3B,0xF8, // ### ####### +0x31,0xE0, // ## #### +0x30,0xE0, // ## ### +0x1F,0xF8, // ########## +0x0F,0xB8, // ##### ### +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // - // @504 ''' (17 pixels wide) - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x03,0x80,0x00, // ### - 0x03,0x80,0x00, // ### - 0x03,0x80,0x00, // ### - 0x01,0x00,0x00, // # - 0x01,0x00,0x00, // # - 0x01,0x00,0x00, // # - 0x01,0x00,0x00, // # - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // +// @504 ''' (16 pixels wide) +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x07,0x00, // ### +0x07,0x00, // ### +0x07,0x00, // ### +0x02,0x00, // # +0x02,0x00, // # +0x02,0x00, // # +0x02,0x00, // # +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // - // @576 '(' (17 pixels wide) - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x18,0x00, // ## - 0x00,0x38,0x00, // ### - 0x00,0x70,0x00, // ### - 0x00,0xf0,0x00, // #### - 0x00,0xe0,0x00, // ### - 0x00,0xe0,0x00, // ### - 0x01,0xc0,0x00, // ### - 0x01,0xc0,0x00, // ### - 0x01,0xc0,0x00, // ### - 0x01,0xc0,0x00, // ### - 0x01,0xc0,0x00, // ### - 0x01,0xc0,0x00, // ### - 0x00,0xe0,0x00, // ### - 0x00,0xe0,0x00, // ### - 0x00,0x70,0x00, // ### - 0x00,0x70,0x00, // ### - 0x00,0x38,0x00, // ### - 0x00,0x18,0x00, // ## - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // +// @576 '(' (16 pixels wide) +0x00,0x00, // +0x00,0x00, // +0x00,0x30, // ## +0x00,0x70, // ### +0x00,0xE0, // ### +0x01,0xE0, // #### +0x01,0xC0, // ### +0x01,0xC0, // ### +0x03,0x80, // ### +0x03,0x80, // ### +0x03,0x80, // ### +0x03,0x80, // ### +0x03,0x80, // ### +0x03,0x80, // ### +0x01,0xC0, // ### +0x01,0xC0, // ### +0x00,0xE0, // ### +0x00,0xE0, // ### +0x00,0x70, // ### +0x00,0x30, // ## +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // - // @648 ')' (17 pixels wide) - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x18,0x00,0x00, // ## - 0x1c,0x00,0x00, // ### - 0x0e,0x00,0x00, // ### - 0x0e,0x00,0x00, // ### - 0x07,0x00,0x00, // ### - 0x07,0x00,0x00, // ### - 0x03,0x80,0x00, // ### - 0x03,0x80,0x00, // ### - 0x03,0x80,0x00, // ### - 0x03,0x80,0x00, // ### - 0x03,0x80,0x00, // ### - 0x03,0x80,0x00, // ### - 0x07,0x00,0x00, // ### - 0x07,0x00,0x00, // ### - 0x0f,0x00,0x00, // #### - 0x0e,0x00,0x00, // ### - 0x1c,0x00,0x00, // ### - 0x18,0x00,0x00, // ## - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // +// @648 ')' (16 pixels wide) +0x00,0x00, // +0x00,0x00, // +0x30,0x00, // ## +0x38,0x00, // ### +0x1C,0x00, // ### +0x1C,0x00, // ### +0x0E,0x00, // ### +0x0E,0x00, // ### +0x07,0x00, // ### +0x07,0x00, // ### +0x07,0x00, // ### +0x07,0x00, // ### +0x07,0x00, // ### +0x07,0x00, // ### +0x0E,0x00, // ### +0x0E,0x00, // ### +0x1E,0x00, // #### +0x1C,0x00, // ### +0x38,0x00, // ### +0x30,0x00, // ## +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // - // @720 '*' (17 pixels wide) - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x01,0x80,0x00, // ## - 0x01,0x80,0x00, // ## - 0x01,0x80,0x00, // ## - 0x1d,0xb8,0x00, // ### ## ### - 0x1f,0xf8,0x00, // ########## - 0x07,0xe0,0x00, // ###### - 0x03,0xc0,0x00, // #### - 0x03,0xc0,0x00, // #### - 0x06,0x60,0x00, // ## ## - 0x06,0x60,0x00, // ## ## - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // +// @720 '*' (16 pixels wide) +0x00,0x00, // +0x00,0x00, // +0x03,0x00, // ## +0x03,0x00, // ## +0x03,0x00, // ## +0x3B,0x70, // ### ## ### +0x3F,0xF0, // ########## +0x0F,0xC0, // ###### +0x07,0x80, // #### +0x07,0x80, // #### +0x0C,0xC0, // ## ## +0x0C,0xC0, // ## ## +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // - // @792 '+' (17 pixels wide) - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x01,0x80,0x00, // ## - 0x01,0x80,0x00, // ## - 0x01,0x80,0x00, // ## - 0x01,0x80,0x00, // ## - 0x01,0x80,0x00, // ## - 0x3f,0xfc,0x00, // ############ - 0x3f,0xfc,0x00, // ############ - 0x01,0x80,0x00, // ## - 0x01,0x80,0x00, // ## - 0x01,0x80,0x00, // ## - 0x01,0x80,0x00, // ## - 0x01,0x80,0x00, // ## - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // +// @792 '+' (16 pixels wide) +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x03,0x00, // ## +0x03,0x00, // ## +0x03,0x00, // ## +0x03,0x00, // ## +0x03,0x00, // ## +0x7F,0xF8, // ############ +0x7F,0xF8, // ############ +0x03,0x00, // ## +0x03,0x00, // ## +0x03,0x00, // ## +0x03,0x00, // ## +0x03,0x00, // ## +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // - // @864 ',' (17 pixels wide) - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0xe0,0x00, // ### - 0x00,0xc0,0x00, // ## - 0x01,0xc0,0x00, // ### - 0x01,0x80,0x00, // ## - 0x01,0x80,0x00, // ## - 0x03,0x00,0x00, // ## - 0x03,0x00,0x00, // ## - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // +// @864 ',' (16 pixels wide) +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x01,0xC0, // ### +0x01,0x80, // ## +0x03,0x80, // ### +0x03,0x00, // ## +0x03,0x00, // ## +0x06,0x00, // ## +0x06,0x00, // ## +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // - // @936 '-' (17 pixels wide) - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x1f,0xf8,0x00, // ########## - 0x1f,0xf8,0x00, // ########## - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // +// @936 '-' (16 pixels wide) +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x3F,0xF0, // ########## +0x3F,0xF0, // ########## +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // - // @1008 '.' (17 pixels wide) - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x03,0xc0,0x00, // #### - 0x03,0xc0,0x00, // #### - 0x03,0xc0,0x00, // #### - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // +// @1008 ' ' (16 pixels wide) +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x07,0x80, // #### +0x07,0x80, // #### +0x07,0x80, // #### +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // - // @1080 '/' (17 pixels wide) - 0x00,0x18,0x00, // ## - 0x00,0x18,0x00, // ## - 0x00,0x38,0x00, // ### - 0x00,0x30,0x00, // ## - 0x00,0x70,0x00, // ### - 0x00,0x60,0x00, // ## - 0x00,0x60,0x00, // ## - 0x00,0xc0,0x00, // ## - 0x00,0xc0,0x00, // ## - 0x01,0x80,0x00, // ## - 0x01,0x80,0x00, // ## - 0x03,0x00,0x00, // ## - 0x03,0x00,0x00, // ## - 0x06,0x00,0x00, // ## - 0x06,0x00,0x00, // ## - 0x0e,0x00,0x00, // ### - 0x0c,0x00,0x00, // ## - 0x1c,0x00,0x00, // ### - 0x18,0x00,0x00, // ## - 0x18,0x00,0x00, // ## - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // +// @1080 '/' (16 pixels wide) +0x00,0x30, // ## +0x00,0x30, // ## +0x00,0x70, // ### +0x00,0x60, // ## +0x00,0xE0, // ### +0x00,0xC0, // ## +0x00,0xC0, // ## +0x01,0x80, // ## +0x01,0x80, // ## +0x03,0x00, // ## +0x03,0x00, // ## +0x06,0x00, // ## +0x06,0x00, // ## +0x0C,0x00, // ## +0x0C,0x00, // ## +0x1C,0x00, // ### +0x18,0x00, // ## +0x38,0x00, // ### +0x30,0x00, // ## +0x30,0x00, // ## +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // - // @0 ' ' (17 pixels wide) - 0x00,0x00,0x00, // - 0x07,0xfc,0x00, // ######### - 0x07,0xfc,0x00, // ######### - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x07,0xfc,0x00, // ######### - 0x07,0xfc,0x00, // ######### - 0x00,0x00,0x00, // +// @0 ' ' (16 pixels wide) +0x00,0x00, // +0x0F,0xF8, // ######### +0x0F,0xF8, // ######### +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x00,0x00, // +0x00,0x00, // +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x0F,0xF8, // ######### +0x0F,0xF8, // ######### +0x00,0x00, // - // @0 ' ' (17 pixels wide) - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // +// @0 ' ' (16 pixels wide) +0x00,0x00, // +0x00,0x00, // +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x00, // +0x00,0x00, // +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x00, // +0x00,0x00, // - // @0 ' ' (17 pixels wide) - 0x00,0x00,0x00, // - 0x07,0xfc,0x00, // ######### - 0x07,0xfc,0x00, // ######### - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x07,0xfc,0x00, // ######### - 0x07,0xfc,0x00, // ######### - 0x18,0x00,0x00, // ## - 0x18,0x00,0x00, // ## - 0x18,0x00,0x00, // ## - 0x18,0x00,0x00, // ## - 0x18,0x00,0x00, // ## - 0x18,0x00,0x00, // ## - 0x18,0x00,0x00, // ## - 0x18,0x00,0x00, // ## - 0x07,0xfc,0x00, // ######### - 0x07,0xfc,0x00, // ######### - 0x00,0x00,0x00, // +// @0 ' ' (16 pixels wide) +0x00,0x00, // +0x0F,0xF8, // ######### +0x0F,0xF8, // ######### +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x0F,0xF8, // ######### +0x0F,0xF8, // ######### +0x30,0x00, // ## +0x30,0x00, // ## +0x30,0x00, // ## +0x30,0x00, // ## +0x30,0x00, // ## +0x30,0x00, // ## +0x30,0x00, // ## +0x30,0x00, // ## +0x0F,0xF8, // ######### +0x0F,0xF8, // ######### +0x00,0x00, // - // @0 ' ' (17 pixels wide) - 0x00,0x00,0x00, // - 0x07,0xfc,0x00, // ######### - 0x07,0xfc,0x00, // ######### - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x07,0xfc,0x00, // ######### - 0x07,0xfc,0x00, // ######### - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x07,0xfc,0x00, // ######### - 0x07,0xfc,0x00, // ######### - 0x00,0x00,0x00, // +// @0 ' ' (16 pixels wide) +0x00,0x00, // +0x0F,0xF8, // ######### +0x0F,0xF8, // ######### +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x0F,0xF8, // ######### +0x0F,0xF8, // ######### +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x0F,0xF8, // ######### +0x0F,0xF8, // ######### +0x00,0x00, // - // @0 ' ' (17 pixels wide) - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x07,0xfc,0x00, // ######### - 0x07,0xfc,0x00, // ######### - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // +// @0 ' ' (16 pixels wide) +0x00,0x00, // +0x00,0x00, // +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x0F,0xF8, // ######### +0x0F,0xF8, // ######### +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x00, // +0x00,0x00, // - // @0 ' ' (17 pixels wide) - 0x00,0x00,0x00, // - 0x07,0xfc,0x00, // ######### - 0x07,0xfc,0x00, // ######### - 0x18,0x00,0x00, // ## - 0x18,0x00,0x00, // ## - 0x18,0x00,0x00, // ## - 0x18,0x00,0x00, // ## - 0x18,0x00,0x00, // ## - 0x18,0x00,0x00, // ## - 0x18,0x00,0x00, // ## - 0x18,0x00,0x00, // ## - 0x07,0xfc,0x00, // ######### - 0x07,0xfc,0x00, // ######### - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x07,0xfc,0x00, // ######### - 0x07,0xfc,0x00, // ######### - 0x00,0x00,0x00, // +// @0 ' ' (16 pixels wide) +0x00,0x00, // +0x0F,0xF8, // ######### +0x0F,0xF8, // ######### +0x30,0x00, // ## +0x30,0x00, // ## +0x30,0x00, // ## +0x30,0x00, // ## +0x30,0x00, // ## +0x30,0x00, // ## +0x30,0x00, // ## +0x30,0x00, // ## +0x0F,0xF8, // ######### +0x0F,0xF8, // ######### +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x0F,0xF8, // ######### +0x0F,0xF8, // ######### +0x00,0x00, // - // @0 ' ' (17 pixels wide) - 0x00,0x00,0x00, // - 0x07,0xfc,0x00, // ######### - 0x07,0xfc,0x00, // ######### - 0x18,0x00,0x00, // ## - 0x18,0x00,0x00, // ## - 0x18,0x00,0x00, // ## - 0x18,0x00,0x00, // ## - 0x18,0x00,0x00, // ## - 0x18,0x00,0x00, // ## - 0x18,0x00,0x00, // ## - 0x18,0x00,0x00, // ## - 0x07,0xfc,0x00, // ######### - 0x07,0xfc,0x00, // ######### - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x0f,0xfc,0x00, // ########## - 0x0f,0xfc,0x00, // ########## - 0x00,0x00,0x00, // +// @0 ' ' (16 pixels wide) +0x00,0x00, // +0x0F,0xF8, // ######### +0x0F,0xF8, // ######### +0x30,0x00, // ## +0x30,0x00, // ## +0x30,0x00, // ## +0x30,0x00, // ## +0x30,0x00, // ## +0x30,0x00, // ## +0x30,0x00, // ## +0x30,0x00, // ## +0x0F,0xF8, // ######### +0x0F,0xF8, // ######### +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x1F,0xF8, // ########## +0x1F,0xF8, // ########## +0x00,0x00, // - // @0 ' ' (17 pixels wide) - 0x00,0x00,0x00, // - 0x0f,0xfc,0x00, // ########## - 0x0f,0xfc,0x00, // ########## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // +// @0 ' ' (16 pixels wide) +0x00,0x00, // +0x1F,0xF8, // ########## +0x1F,0xF8, // ########## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x00, // +0x00,0x00, // +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x00, // +0x00,0x00, // - // @0 ' ' (17 pixels wide) - 0x00,0x00,0x00, // - 0x07,0xfc,0x00, // ######### - 0x07,0xfc,0x00, // ######### - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x07,0xfc,0x00, // ######### - 0x07,0xfc,0x00, // ######### - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x07,0xfc,0x00, // ######### - 0x07,0xfc,0x00, // ######### - 0x00,0x00,0x00, // +// @0 ' ' (16 pixels wide) +0x00,0x00, // +0x0F,0xF8, // ######### +0x0F,0xF8, // ######### +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x0F,0xF8, // ######### +0x0F,0xF8, // ######### +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x0F,0xF8, // ######### +0x0F,0xF8, // ######### +0x00,0x00, // - // @0 ' ' (17 pixels wide) - 0x00,0x00,0x00, // - 0x07,0xfc,0x00, // ######### - 0x07,0xfc,0x00, // ######### - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x18,0x03,0x00, // ## ## - 0x07,0xfc,0x00, // ######### - 0x07,0xfc,0x00, // ######### - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x03,0x00, // ## - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // +// @0 ' ' (16 pixels wide) +0x00,0x00, // +0x0F,0xF8, // ######### +0x0F,0xF8, // ######### +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x30,0x06, // ## ## +0x0F,0xF8, // ######### +0x0F,0xF8, // ######### +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x06, // ## +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // - // @1872 ':' (17 pixels wide) - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0xf0,0x00, // #### - 0x00,0xf0,0x00, // #### - 0x00,0xf0,0x00, // #### - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0xf0,0x00, // #### - 0x00,0xf0,0x00, // #### - 0x00,0xf0,0x00, // #### - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00, // - 0x00,0x00,0x00 // +// @1872 ':' (16 pixels wide) +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x01,0xE0, // #### +0x01,0xE0, // #### +0x01,0xE0, // #### +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x01,0xE0, // #### +0x01,0xE0, // #### +0x01,0xE0, // #### +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00, // +0x00,0x00 // }; sFONT Font24_7seg = { Font24_Table_7seg, - 17, /* Width */ + 16, /* Width */ 24, /* Height */ }; From 066b98fe784948d2225c6800168314a6d6bee01d Mon Sep 17 00:00:00 2001 From: Thomas Hargrove Date: Fri, 11 Nov 2022 12:06:44 -0800 Subject: [PATCH 02/21] re-add tab --- .../src/font24_7seg.c | 1296 ++++++++--------- 1 file changed, 648 insertions(+), 648 deletions(-) diff --git a/lib/lib_display/Display_Renderer-gemu-1.0/src/font24_7seg.c b/lib/lib_display/Display_Renderer-gemu-1.0/src/font24_7seg.c index 645caa9d4..a4d740b09 100644 --- a/lib/lib_display/Display_Renderer-gemu-1.0/src/font24_7seg.c +++ b/lib/lib_display/Display_Renderer-gemu-1.0/src/font24_7seg.c @@ -42,706 +42,706 @@ const uint8_t Font24_Table_7seg [] PROGMEM = { // @0 ' ' (16 pixels wide) -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // // @72 '!' (16 pixels wide) -0x00,0x00, // -0x00,0x00, // -0x07,0x00, // ### -0x07,0x00, // ### -0x07,0x00, // ### -0x07,0x00, // ### -0x07,0x00, // ### -0x07,0x00, // ### -0x07,0x00, // ### -0x07,0x00, // ### -0x07,0x00, // ### -0x02,0x00, // # -0x02,0x00, // # -0x00,0x00, // -0x00,0x00, // -0x07,0x00, // ### -0x07,0x00, // ### -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x07,0x00, // ### + 0x07,0x00, // ### + 0x07,0x00, // ### + 0x07,0x00, // ### + 0x07,0x00, // ### + 0x07,0x00, // ### + 0x07,0x00, // ### + 0x07,0x00, // ### + 0x07,0x00, // ### + 0x02,0x00, // # + 0x02,0x00, // # + 0x00,0x00, // + 0x00,0x00, // + 0x07,0x00, // ### + 0x07,0x00, // ### + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // // @144 '"' (16 pixels wide) -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x1C,0xE0, // ### ### -0x1C,0xE0, // ### ### -0x1C,0xE0, // ### ### -0x08,0x40, // # # -0x08,0x40, // # # -0x08,0x40, // # # -0x08,0x40, // # # -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x1C,0xE0, // ### ### + 0x1C,0xE0, // ### ### + 0x1C,0xE0, // ### ### + 0x08,0x40, // # # + 0x08,0x40, // # # + 0x08,0x40, // # # + 0x08,0x40, // # # + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // // @216 '#' (16 pixels wide) -0x00,0x00, // -0x00,0x00, // -0x0C,0xC0, // ## ## -0x0C,0xC0, // ## ## -0x0C,0xC0, // ## ## -0x0C,0xC0, // ## ## -0x0C,0xC0, // ## ## -0x7F,0xF0, // ########### -0x7F,0xF0, // ########### -0x0C,0xC0, // ## ## -0x19,0x80, // ## ## -0x7F,0xF0, // ########### -0x7F,0xF0, // ########### -0x19,0x80, // ## ## -0x19,0x80, // ## ## -0x19,0x80, // ## ## -0x19,0x80, // ## ## -0x19,0x80, // ## ## -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x0C,0xC0, // ## ## + 0x0C,0xC0, // ## ## + 0x0C,0xC0, // ## ## + 0x0C,0xC0, // ## ## + 0x0C,0xC0, // ## ## + 0x7F,0xF0, // ########### + 0x7F,0xF0, // ########### + 0x0C,0xC0, // ## ## + 0x19,0x80, // ## ## + 0x7F,0xF0, // ########### + 0x7F,0xF0, // ########### + 0x19,0x80, // ## ## + 0x19,0x80, // ## ## + 0x19,0x80, // ## ## + 0x19,0x80, // ## ## + 0x19,0x80, // ## ## + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // // @288 '$' (16 pixels wide) -0x00,0x00, // -0x03,0x00, // ## -0x03,0x00, // ## -0x0F,0x60, // #### ## -0x1F,0xE0, // ######## -0x30,0xE0, // ## ### -0x30,0xE0, // ## ### -0x38,0x00, // ### -0x1F,0x00, // ##### -0x0F,0xC0, // ###### -0x01,0xE0, // #### -0x30,0x60, // ## ## -0x38,0x60, // ### ## -0x38,0xE0, // ### ### -0x3F,0xC0, // ######## -0x37,0x80, // ## #### -0x03,0x00, // ## -0x03,0x00, // ## -0x03,0x00, // ## -0x03,0x00, // ## -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // + 0x00,0x00, // + 0x03,0x00, // ## + 0x03,0x00, // ## + 0x0F,0x60, // #### ## + 0x1F,0xE0, // ######## + 0x30,0xE0, // ## ### + 0x30,0xE0, // ## ### + 0x38,0x00, // ### + 0x1F,0x00, // ##### + 0x0F,0xC0, // ###### + 0x01,0xE0, // #### + 0x30,0x60, // ## ## + 0x38,0x60, // ### ## + 0x38,0xE0, // ### ### + 0x3F,0xC0, // ######## + 0x37,0x80, // ## #### + 0x03,0x00, // ## + 0x03,0x00, // ## + 0x03,0x00, // ## + 0x03,0x00, // ## + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // // @360 '%' (16 pixels wide) -0x00,0x00, // -0x00,0x00, // -0x0F,0x00, // #### -0x1F,0x80, // ###### -0x39,0xC0, // ### ### -0x30,0xC0, // ## ## -0x30,0xC0, // ## ## -0x39,0xC0, // ### ### -0x1F,0xF0, // ######### -0x0F,0xC0, // ###### -0x3F,0xE0, // ######### -0x0E,0x70, // ### ### -0x0C,0x30, // ## ## -0x0C,0x30, // ## ## -0x0E,0x70, // ### ### -0x07,0xE0, // ###### -0x03,0xC0, // #### -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x0F,0x00, // #### + 0x1F,0x80, // ###### + 0x39,0xC0, // ### ### + 0x30,0xC0, // ## ## + 0x30,0xC0, // ## ## + 0x39,0xC0, // ### ### + 0x1F,0xF0, // ######### + 0x0F,0xC0, // ###### + 0x3F,0xE0, // ######### + 0x0E,0x70, // ### ### + 0x0C,0x30, // ## ## + 0x0C,0x30, // ## ## + 0x0E,0x70, // ### ### + 0x07,0xE0, // ###### + 0x03,0xC0, // #### + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // // @432 '&' (16 pixels wide) -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x07,0xE0, // ###### -0x0F,0xE0, // ####### -0x18,0xC0, // ## ## -0x18,0x00, // ## -0x18,0x00, // ## -0x0C,0x00, // ## -0x0E,0x00, // ### -0x1F,0x38, // ##### ### -0x3B,0xF8, // ### ####### -0x31,0xE0, // ## #### -0x30,0xE0, // ## ### -0x1F,0xF8, // ########## -0x0F,0xB8, // ##### ### -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x07,0xE0, // ###### + 0x0F,0xE0, // ####### + 0x18,0xC0, // ## ## + 0x18,0x00, // ## + 0x18,0x00, // ## + 0x0C,0x00, // ## + 0x0E,0x00, // ### + 0x1F,0x38, // ##### ### + 0x3B,0xF8, // ### ####### + 0x31,0xE0, // ## #### + 0x30,0xE0, // ## ### + 0x1F,0xF8, // ########## + 0x0F,0xB8, // ##### ### + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // // @504 ''' (16 pixels wide) -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x07,0x00, // ### -0x07,0x00, // ### -0x07,0x00, // ### -0x02,0x00, // # -0x02,0x00, // # -0x02,0x00, // # -0x02,0x00, // # -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x07,0x00, // ### + 0x07,0x00, // ### + 0x07,0x00, // ### + 0x02,0x00, // # + 0x02,0x00, // # + 0x02,0x00, // # + 0x02,0x00, // # + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // // @576 '(' (16 pixels wide) -0x00,0x00, // -0x00,0x00, // -0x00,0x30, // ## -0x00,0x70, // ### -0x00,0xE0, // ### -0x01,0xE0, // #### -0x01,0xC0, // ### -0x01,0xC0, // ### -0x03,0x80, // ### -0x03,0x80, // ### -0x03,0x80, // ### -0x03,0x80, // ### -0x03,0x80, // ### -0x03,0x80, // ### -0x01,0xC0, // ### -0x01,0xC0, // ### -0x00,0xE0, // ### -0x00,0xE0, // ### -0x00,0x70, // ### -0x00,0x30, // ## -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x30, // ## + 0x00,0x70, // ### + 0x00,0xE0, // ### + 0x01,0xE0, // #### + 0x01,0xC0, // ### + 0x01,0xC0, // ### + 0x03,0x80, // ### + 0x03,0x80, // ### + 0x03,0x80, // ### + 0x03,0x80, // ### + 0x03,0x80, // ### + 0x03,0x80, // ### + 0x01,0xC0, // ### + 0x01,0xC0, // ### + 0x00,0xE0, // ### + 0x00,0xE0, // ### + 0x00,0x70, // ### + 0x00,0x30, // ## + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // // @648 ')' (16 pixels wide) -0x00,0x00, // -0x00,0x00, // -0x30,0x00, // ## -0x38,0x00, // ### -0x1C,0x00, // ### -0x1C,0x00, // ### -0x0E,0x00, // ### -0x0E,0x00, // ### -0x07,0x00, // ### -0x07,0x00, // ### -0x07,0x00, // ### -0x07,0x00, // ### -0x07,0x00, // ### -0x07,0x00, // ### -0x0E,0x00, // ### -0x0E,0x00, // ### -0x1E,0x00, // #### -0x1C,0x00, // ### -0x38,0x00, // ### -0x30,0x00, // ## -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x30,0x00, // ## + 0x38,0x00, // ### + 0x1C,0x00, // ### + 0x1C,0x00, // ### + 0x0E,0x00, // ### + 0x0E,0x00, // ### + 0x07,0x00, // ### + 0x07,0x00, // ### + 0x07,0x00, // ### + 0x07,0x00, // ### + 0x07,0x00, // ### + 0x07,0x00, // ### + 0x0E,0x00, // ### + 0x0E,0x00, // ### + 0x1E,0x00, // #### + 0x1C,0x00, // ### + 0x38,0x00, // ### + 0x30,0x00, // ## + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // // @720 '*' (16 pixels wide) -0x00,0x00, // -0x00,0x00, // -0x03,0x00, // ## -0x03,0x00, // ## -0x03,0x00, // ## -0x3B,0x70, // ### ## ### -0x3F,0xF0, // ########## -0x0F,0xC0, // ###### -0x07,0x80, // #### -0x07,0x80, // #### -0x0C,0xC0, // ## ## -0x0C,0xC0, // ## ## -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x03,0x00, // ## + 0x03,0x00, // ## + 0x03,0x00, // ## + 0x3B,0x70, // ### ## ### + 0x3F,0xF0, // ########## + 0x0F,0xC0, // ###### + 0x07,0x80, // #### + 0x07,0x80, // #### + 0x0C,0xC0, // ## ## + 0x0C,0xC0, // ## ## + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // // @792 '+' (16 pixels wide) -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x03,0x00, // ## -0x03,0x00, // ## -0x03,0x00, // ## -0x03,0x00, // ## -0x03,0x00, // ## -0x7F,0xF8, // ############ -0x7F,0xF8, // ############ -0x03,0x00, // ## -0x03,0x00, // ## -0x03,0x00, // ## -0x03,0x00, // ## -0x03,0x00, // ## -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x03,0x00, // ## + 0x03,0x00, // ## + 0x03,0x00, // ## + 0x03,0x00, // ## + 0x03,0x00, // ## + 0x7F,0xF8, // ############ + 0x7F,0xF8, // ############ + 0x03,0x00, // ## + 0x03,0x00, // ## + 0x03,0x00, // ## + 0x03,0x00, // ## + 0x03,0x00, // ## + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // // @864 ',' (16 pixels wide) -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x01,0xC0, // ### -0x01,0x80, // ## -0x03,0x80, // ### -0x03,0x00, // ## -0x03,0x00, // ## -0x06,0x00, // ## -0x06,0x00, // ## -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x01,0xC0, // ### + 0x01,0x80, // ## + 0x03,0x80, // ### + 0x03,0x00, // ## + 0x03,0x00, // ## + 0x06,0x00, // ## + 0x06,0x00, // ## + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // // @936 '-' (16 pixels wide) -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x3F,0xF0, // ########## -0x3F,0xF0, // ########## -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x3F,0xF0, // ########## + 0x3F,0xF0, // ########## + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // // @1008 ' ' (16 pixels wide) -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x07,0x80, // #### -0x07,0x80, // #### -0x07,0x80, // #### -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x07,0x80, // #### + 0x07,0x80, // #### + 0x07,0x80, // #### + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // // @1080 '/' (16 pixels wide) -0x00,0x30, // ## -0x00,0x30, // ## -0x00,0x70, // ### -0x00,0x60, // ## -0x00,0xE0, // ### -0x00,0xC0, // ## -0x00,0xC0, // ## -0x01,0x80, // ## -0x01,0x80, // ## -0x03,0x00, // ## -0x03,0x00, // ## -0x06,0x00, // ## -0x06,0x00, // ## -0x0C,0x00, // ## -0x0C,0x00, // ## -0x1C,0x00, // ### -0x18,0x00, // ## -0x38,0x00, // ### -0x30,0x00, // ## -0x30,0x00, // ## -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // + 0x00,0x30, // ## + 0x00,0x30, // ## + 0x00,0x70, // ### + 0x00,0x60, // ## + 0x00,0xE0, // ### + 0x00,0xC0, // ## + 0x00,0xC0, // ## + 0x01,0x80, // ## + 0x01,0x80, // ## + 0x03,0x00, // ## + 0x03,0x00, // ## + 0x06,0x00, // ## + 0x06,0x00, // ## + 0x0C,0x00, // ## + 0x0C,0x00, // ## + 0x1C,0x00, // ### + 0x18,0x00, // ## + 0x38,0x00, // ### + 0x30,0x00, // ## + 0x30,0x00, // ## + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // // @0 ' ' (16 pixels wide) -0x00,0x00, // -0x0F,0xF8, // ######### -0x0F,0xF8, // ######### -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x00,0x00, // -0x00,0x00, // -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x0F,0xF8, // ######### -0x0F,0xF8, // ######### -0x00,0x00, // + 0x00,0x00, // + 0x0F,0xF8, // ######### + 0x0F,0xF8, // ######### + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x00,0x00, // + 0x00,0x00, // + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x0F,0xF8, // ######### + 0x0F,0xF8, // ######### + 0x00,0x00, // // @0 ' ' (16 pixels wide) -0x00,0x00, // -0x00,0x00, // -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x00, // -0x00,0x00, // -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x00, // -0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x00, // + 0x00,0x00, // // @0 ' ' (16 pixels wide) -0x00,0x00, // -0x0F,0xF8, // ######### -0x0F,0xF8, // ######### -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x0F,0xF8, // ######### -0x0F,0xF8, // ######### -0x30,0x00, // ## -0x30,0x00, // ## -0x30,0x00, // ## -0x30,0x00, // ## -0x30,0x00, // ## -0x30,0x00, // ## -0x30,0x00, // ## -0x30,0x00, // ## -0x0F,0xF8, // ######### -0x0F,0xF8, // ######### -0x00,0x00, // + 0x00,0x00, // + 0x0F,0xF8, // ######### + 0x0F,0xF8, // ######### + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x0F,0xF8, // ######### + 0x0F,0xF8, // ######### + 0x30,0x00, // ## + 0x30,0x00, // ## + 0x30,0x00, // ## + 0x30,0x00, // ## + 0x30,0x00, // ## + 0x30,0x00, // ## + 0x30,0x00, // ## + 0x30,0x00, // ## + 0x0F,0xF8, // ######### + 0x0F,0xF8, // ######### + 0x00,0x00, // // @0 ' ' (16 pixels wide) -0x00,0x00, // -0x0F,0xF8, // ######### -0x0F,0xF8, // ######### -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x0F,0xF8, // ######### -0x0F,0xF8, // ######### -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x0F,0xF8, // ######### -0x0F,0xF8, // ######### -0x00,0x00, // + 0x00,0x00, // + 0x0F,0xF8, // ######### + 0x0F,0xF8, // ######### + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x0F,0xF8, // ######### + 0x0F,0xF8, // ######### + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x0F,0xF8, // ######### + 0x0F,0xF8, // ######### + 0x00,0x00, // // @0 ' ' (16 pixels wide) -0x00,0x00, // -0x00,0x00, // -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x0F,0xF8, // ######### -0x0F,0xF8, // ######### -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x00, // -0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x0F,0xF8, // ######### + 0x0F,0xF8, // ######### + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x00, // + 0x00,0x00, // // @0 ' ' (16 pixels wide) -0x00,0x00, // -0x0F,0xF8, // ######### -0x0F,0xF8, // ######### -0x30,0x00, // ## -0x30,0x00, // ## -0x30,0x00, // ## -0x30,0x00, // ## -0x30,0x00, // ## -0x30,0x00, // ## -0x30,0x00, // ## -0x30,0x00, // ## -0x0F,0xF8, // ######### -0x0F,0xF8, // ######### -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x0F,0xF8, // ######### -0x0F,0xF8, // ######### -0x00,0x00, // + 0x00,0x00, // + 0x0F,0xF8, // ######### + 0x0F,0xF8, // ######### + 0x30,0x00, // ## + 0x30,0x00, // ## + 0x30,0x00, // ## + 0x30,0x00, // ## + 0x30,0x00, // ## + 0x30,0x00, // ## + 0x30,0x00, // ## + 0x30,0x00, // ## + 0x0F,0xF8, // ######### + 0x0F,0xF8, // ######### + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x0F,0xF8, // ######### + 0x0F,0xF8, // ######### + 0x00,0x00, // // @0 ' ' (16 pixels wide) -0x00,0x00, // -0x0F,0xF8, // ######### -0x0F,0xF8, // ######### -0x30,0x00, // ## -0x30,0x00, // ## -0x30,0x00, // ## -0x30,0x00, // ## -0x30,0x00, // ## -0x30,0x00, // ## -0x30,0x00, // ## -0x30,0x00, // ## -0x0F,0xF8, // ######### -0x0F,0xF8, // ######### -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x1F,0xF8, // ########## -0x1F,0xF8, // ########## -0x00,0x00, // + 0x00,0x00, // + 0x0F,0xF8, // ######### + 0x0F,0xF8, // ######### + 0x30,0x00, // ## + 0x30,0x00, // ## + 0x30,0x00, // ## + 0x30,0x00, // ## + 0x30,0x00, // ## + 0x30,0x00, // ## + 0x30,0x00, // ## + 0x30,0x00, // ## + 0x0F,0xF8, // ######### + 0x0F,0xF8, // ######### + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x1F,0xF8, // ########## + 0x1F,0xF8, // ########## + 0x00,0x00, // // @0 ' ' (16 pixels wide) -0x00,0x00, // -0x1F,0xF8, // ########## -0x1F,0xF8, // ########## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x00, // -0x00,0x00, // -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x00, // -0x00,0x00, // + 0x00,0x00, // + 0x1F,0xF8, // ########## + 0x1F,0xF8, // ########## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x00, // + 0x00,0x00, // // @0 ' ' (16 pixels wide) -0x00,0x00, // -0x0F,0xF8, // ######### -0x0F,0xF8, // ######### -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x0F,0xF8, // ######### -0x0F,0xF8, // ######### -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x0F,0xF8, // ######### -0x0F,0xF8, // ######### -0x00,0x00, // + 0x00,0x00, // + 0x0F,0xF8, // ######### + 0x0F,0xF8, // ######### + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x0F,0xF8, // ######### + 0x0F,0xF8, // ######### + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x0F,0xF8, // ######### + 0x0F,0xF8, // ######### + 0x00,0x00, // // @0 ' ' (16 pixels wide) -0x00,0x00, // -0x0F,0xF8, // ######### -0x0F,0xF8, // ######### -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x30,0x06, // ## ## -0x0F,0xF8, // ######### -0x0F,0xF8, // ######### -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x06, // ## -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // + 0x00,0x00, // + 0x0F,0xF8, // ######### + 0x0F,0xF8, // ######### + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x30,0x06, // ## ## + 0x0F,0xF8, // ######### + 0x0F,0xF8, // ######### + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x06, // ## + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // // @1872 ':' (16 pixels wide) -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x01,0xE0, // #### -0x01,0xE0, // #### -0x01,0xE0, // #### -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x01,0xE0, // #### -0x01,0xE0, // #### -0x01,0xE0, // #### -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00, // -0x00,0x00 // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x01,0xE0, // #### + 0x01,0xE0, // #### + 0x01,0xE0, // #### + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x01,0xE0, // #### + 0x01,0xE0, // #### + 0x01,0xE0, // #### + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00, // + 0x00,0x00 // }; sFONT Font24_7seg = { From 62c3a92ae794286768ebfa5277ed4bb3634eb7c6 Mon Sep 17 00:00:00 2001 From: Cyril Pawelko Date: Mon, 14 Nov 2022 18:42:57 +0100 Subject: [PATCH 03/21] Zigbee plugin to fix Moes-Tuya KCTW1Z Humidity For device Should work with TS0201:_TZ3000_itnrsufe , regarding https://zigbee.blakadder.com/Tuya_KCTW1Z.html --- tasmota/zigbee/Tuya_KCTW1Z.zb | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 tasmota/zigbee/Tuya_KCTW1Z.zb diff --git a/tasmota/zigbee/Tuya_KCTW1Z.zb b/tasmota/zigbee/Tuya_KCTW1Z.zb new file mode 100644 index 000000000..f778cc983 --- /dev/null +++ b/tasmota/zigbee/Tuya_KCTW1Z.zb @@ -0,0 +1,5 @@ +#Z2Tv1 +# Tuya fix humidity by 10 +# https://zigbee.blakadder.com/Tuya_KCTW1Z.html +:TS0201,_TZ3000_ywagc4rj +0405/0000=0405/0000,mul:10 From 20d9975d6f30d78781c865708692c39d71df0cc3 Mon Sep 17 00:00:00 2001 From: Andreas Achtzehn Date: Mon, 14 Nov 2022 20:20:04 +0100 Subject: [PATCH 04/21] Support for I2C device HMC5883L (3-axis magnetic sensor) --- I2CDEVICES.md | 1 + tasmota/my_user_config.h | 1 + .../tasmota_xsns_sensor/xsns_101_hmc5883l.ino | 249 ++++++++++++++++++ 3 files changed, 251 insertions(+) create mode 100644 tasmota/tasmota_xsns_sensor/xsns_101_hmc5883l.ino diff --git a/I2CDEVICES.md b/I2CDEVICES.md index d3b2cd418..3ef236eeb 100644 --- a/I2CDEVICES.md +++ b/I2CDEVICES.md @@ -107,3 +107,4 @@ Index | Define | Driver | Device | Address(es) | Description 70 | USE_LUXV30B | xsns_99 | LUXV30B | 0x4A | DFRobot SEN0390 V30B lux sensor 71 | USE_QMC5883L | xsns_33 | QMC5883L | 0x0D | Magnetic Field Sensor 72 | USE_INA3221 | xsns_100 | INA3221 | 0x40-0x43 | 3-channels Voltage and Current sensor + 73 | USE_HMC5883L | xsns_101 | HMC5883L | 0x1E | 3-channels Magnetic Field Sensor diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index e2803f8d4..23415f8fd 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -691,6 +691,7 @@ // #define USE_HYT // [I2CDriver68] Enable HYTxxx temperature and humidity sensor (I2C address 0x28) (+0k5 code) // #define USE_LUXV30B // [I2CDriver70] Enable RFRobot SEN0390 LuxV30b ambient light sensor (I2C address 0x4A) (+0k5 code) // #define USE_QMC5883L // [I2CDriver71] Enable QMC5883L magnetic induction sensor (I2C address 0x0D) (+0k8 code) +// #define USE_HMC5883L // [I2CDriver73] Enable HMC5883L magnetic induction sensor (I2C address 0x1E) // #define QMC5883L_TEMP_SHIFT 23 // sensor temperature are not calibrated (only relativ measurement) and need an absolute ground value in °C (see datasheet) // #define USE_INA3221 // [I2CDriver72] Enable INA3221 3-channel DC voltage and current sensor (I2C address 0x40-0x44) (+3.2k code) // #define INA3221_ADDRESS1 // allow to change the 1st address to search for INA3221 to 0x41..0x43 diff --git a/tasmota/tasmota_xsns_sensor/xsns_101_hmc5883l.ino b/tasmota/tasmota_xsns_sensor/xsns_101_hmc5883l.ino new file mode 100644 index 000000000..56a311354 --- /dev/null +++ b/tasmota/tasmota_xsns_sensor/xsns_101_hmc5883l.ino @@ -0,0 +1,249 @@ +/* + xsns_101_hmc5883l.ino - HMC5883L 3-Axis Digital Compass sensor support for Tasmota + (inspired by Helge Scheunemann) + Copyright (C) 2022 Andreas Achtzehn + + 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 USE_I2C +#ifdef USE_HMC5883L +/*********************************************************************************************\ + * HMC5883L is 3-Axis Digital Compass sensor + * + * Datasheet: https://cdn-shop.adafruit.com/datasheets/HMC5883L_3-Axis_Digital_Compass_IC.pdf + * I2C Address: 0x1E +\*********************************************************************************************/ + +// Define driver ID +#define XSNS_101 101 +#define XI2C_73 73 // See I2CDEVICES.md + +/* The default I2C address of this chip */ +#define HMC5883L_ADDR 0x1E + +/* Register locations */ +#define HMC5883L_X_LSB 0x04 +#define HMC5883L_X_MSB 0x03 +#define HMC5883L_Y_LSB 0x08 +#define HMC5883L_Y_MSB 0x07 +#define HMC5883L_Z_LSB 0x06 +#define HMC5883L_Z_MSB 0x05 +#define HMC5883L_STATUS 0x09 +#define HMC5883L_CONFIG_A 0x00 +#define HMC5883L_CONFIG_B 0x01 +#define HMC5883L_MODE 0x02 +#define HMC5883L_CHIP_ID_A 0x0A +#define HMC5883L_CHIP_ID_B 0x0B +#define HMC5883L_CHIP_ID_C 0x0C + +/* Bit values for the STATUS register */ +const uint8_t HMC5883L_STATUS_RDY = 0b00000001; +const uint8_t HMC5883L_STATUS_LOCK = 0b00000010; + +/* Modes for the sampling in the MODE register */ +const uint8_t HMC5883L_MODE_CONT = 0b00000000; +const uint8_t HMC5883L_MODE_SINGLE = 0b00000001; +const uint8_t HMC5883L_MODE_IDLE = 0b00000010; + +/* Gain value mask for CONFIG B register */ +const uint8_t HMC5883L_CONFIG_B_GAIN_MASK = 0b11100000; // shift operation, values 0-7 +const uint8_t HMC5883L_CONFIG_B_GAIN_SHIFT = 5; + +/* Averaging value for CONFIG A register: pow(2,N) */ +const uint8_t HMC5883L_CONFIG_A_AVG_MASK = 0b01100000; +const uint8_t HMC5883L_CONFIG_A_AVG_SHIFT = 5; + +/* Data output rate */ +const uint8_t HMC5883L_CONFIG_A_RATE_MASK = 0b00011100; +const uint8_t HMC5883L_CONFIG_A_RATE_SHIFT = 2; + +/* Data measurement mode */ +const uint8_t HMC5883L_CONFIG_A_MMODE_NORM = 0; +const uint8_t HMC5883L_CONFIG_A_MMODE_POSBIAS = 1; +const uint8_t HMC5883L_CONFIG_A_MMODE_NEGBIAS = 2; +const uint8_t HMC5883L_CONFIG_A_MMODE_MASK = 0b00000011; +const uint8_t HMC5883L_CONFIG_A_MMODE_SHIFT = 0; + +/* Data output X register A contains the MSB from the measurement result, +and data output X register B contains the LSB from the measurement result. The value stored in these two registers is a +16-bit value in 2’s complement form, whose range is 0xF800 to 0x07FF. */ + + + + // data field +struct HMC5883L_s { + int16_t MX, MY, MZ; + uint16_t magnitude; + int8_t measurement_mode; + int8_t data_rate; + int8_t average_mode; + int8_t gain; + int8_t mode; +} *HMC5883L = nullptr; + + +// Change configuration registers of the device +bool HMC5883L_SetConfig() { + if ( HMC5883L == nullptr ) { return false; } + + uint8_t cfgA = (( (HMC5883L->measurement_mode) << HMC5883L_CONFIG_A_MMODE_SHIFT ) & HMC5883L_CONFIG_A_MMODE_MASK ) | + (( (HMC5883L->data_rate ) << HMC5883L_CONFIG_A_RATE_SHIFT ) & HMC5883L_CONFIG_A_RATE_MASK ) | + (( (HMC5883L->average_mode ) << HMC5883L_CONFIG_A_AVG_SHIFT ) & HMC5883L_CONFIG_A_AVG_MASK ); + + uint8_t cfgB = (( (HMC5883L->gain ) << HMC5883L_CONFIG_B_GAIN_SHIFT ) & HMC5883L_CONFIG_B_GAIN_MASK ); + + AddLog(LOG_LEVEL_INFO,"HMC5883L: CONFIG A: %#X CONFIG B: %#X MODE: %#X",cfgA, cfgB, HMC5883L->mode); + + if (I2cWrite8(HMC5883L_ADDR, HMC5883L_CONFIG_A, cfgA ) == false) { + AddLog(LOG_LEVEL_INFO,"HMC5883L: Setting CONFIG A failed."); + return false; + } + if (I2cWrite8(HMC5883L_ADDR, HMC5883L_CONFIG_B, cfgB ) == false) { + AddLog(LOG_LEVEL_INFO,"HMC5883L: Setting CONFIG B failed."); + return false; + } + if (HMC5883L->mode == HMC5883L_MODE_CONT) { + if (I2cWrite8(HMC5883L_ADDR, HMC5883L_MODE, HMC5883L_MODE_CONT ) == false) + { AddLog(LOG_LEVEL_INFO,"HMC5883L: Setting continuous mode failed."); + return false; } + } + return true; +} + +// Initialize the device +void HMC5883L_Init() { + if (!I2cSetDevice(HMC5883L_ADDR)) { return; } + + HMC5883L = (HMC5883L_s *)calloc(1, sizeof(struct HMC5883L_s)); + // standard configuration + HMC5883L->gain = 5; + HMC5883L->average_mode = 3; + HMC5883L->data_rate = 2; + HMC5883L->measurement_mode = HMC5883L_CONFIG_A_MMODE_NORM; + HMC5883L->mode = HMC5883L_MODE_SINGLE; + + HMC5883L_SetConfig(); + + I2cSetActiveFound(HMC5883L_ADDR, "HMC5883L"); +} + +//Read the magnetic data +void HMC5883L_ReadData(void) { + if (HMC5883L->mode == HMC5883L_MODE_SINGLE) { + if (I2cWrite8(HMC5883L_ADDR, HMC5883L_MODE, HMC5883L_MODE_SINGLE ) == false) + { return; } + } + + while (!(I2cRead8(HMC5883L_ADDR, HMC5883L_STATUS) & HMC5883L_STATUS_RDY)) { } // Chip not yet ready, next round try again + + HMC5883L->MX = I2cReadS16(HMC5883L_ADDR, HMC5883L_X_MSB); // Select starting with MSB register + HMC5883L->MY = I2cReadS16(HMC5883L_ADDR, HMC5883L_Y_MSB); + HMC5883L->MZ = I2cReadS16(HMC5883L_ADDR, HMC5883L_Z_MSB); + + // calculate magnetic induction magnitude + HMC5883L->magnitude = SqrtInt((HMC5883L->MX * HMC5883L->MX) + (HMC5883L->MY * HMC5883L->MY) + (HMC5883L->MZ * HMC5883L->MZ)); +} + +/*********************************************************************************************\ + * Presentation +\*********************************************************************************************/ + +#ifdef USE_WEBSERVER +const char HTTP_SNS_HMC5883L[] PROGMEM = + "{s}HMC5883L " D_MX "{m}%d " D_UNIT_MICROTESLA "{e}" // {s} = , {m} = , {e} = + "{s}HMC5883L " D_MY "{m}%d " D_UNIT_MICROTESLA "{e}" // {s} = , {m} = , {e} = + "{s}HMC5883L " D_MZ "{m}%d " D_UNIT_MICROTESLA "{e}" // {s} = , {m} = , {e} = + "{s}HMC5883L " D_MAGNETICFLD "{m}%d " D_UNIT_MICROTESLA "{e}"; // {s} = , {m} = , {e} = +#endif + +void HMC5883L_Show(uint8_t json) { + if (json) { + ResponseAppend_P(PSTR(",\"HMC5883L\":{\"" D_JSON_MX "\":%d,\"" D_JSON_MY "\":%d,\"" D_JSON_MZ "\":%d,\"" D_JSON_MAGNETICFLD "\":%u,\""), + HMC5883L->MX, HMC5883L->MY, HMC5883L->MZ, HMC5883L->magnitude); +#ifdef USE_WEBSERVER + } else { + WSContentSend_PD(HTTP_SNS_HMC5883L, HMC5883L->MX, HMC5883L->MY, HMC5883L->MZ, HMC5883L->magnitude); +#endif + } +} + +// Process configuration commands +bool HMC5883L_Command() { + bool commandKnown = false; + char cmd[20]; + char ss2[20]; + + subStr(cmd, XdrvMailbox.data, ",", 1); + int8_t value = atoi(subStr(ss2, XdrvMailbox.data, ",", 2)); + + if (strcmp(cmd,"GAIN")) { + HMC5883L->gain = value; + commandKnown = true; + } + if (strcmp(cmd,"AVG")) { + HMC5883L->average_mode = value; + commandKnown = true; + } + if (strcmp(cmd,"RATE")) { + HMC5883L->data_rate = value; + commandKnown = true; + } + if (strcmp(cmd,"MMODE")) { + HMC5883L->measurement_mode = value; + commandKnown = true; + } + + //AddLog(LOG_LEVEL_INFO,PSTR(D_LOG_I2C "HMC5883L: cmd: (%s) value: %d cmdKnown: %d"), cmd, value,commandKnown); + + if (commandKnown == false) { return false; } + + AddLog(LOG_LEVEL_INFO,PSTR(D_LOG_I2C "HMC5883L: Reconfiguring.")); + + return HMC5883L_SetConfig(); +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xsns101(uint32_t function) { + if (!I2cEnabled(XI2C_73)) { return false; } + + if (FUNC_INIT == function) { + HMC5883L_Init(); + } + else if (HMC5883L != nullptr) { + switch (function) { + case FUNC_COMMAND_SENSOR: + if (XSNS_101 == XdrvMailbox.index) + return HMC5883L_Command(); // Return true on success + break; + case FUNC_JSON_APPEND: + HMC5883L_Show(1); + break; + case FUNC_EVERY_SECOND: + HMC5883L_ReadData(); + break; +#ifdef USE_WEBSERVER + case FUNC_WEB_SENSOR: + HMC5883L_Show(0); + break; +#endif // USE_WEBSERVER + } + } + return true; +} +#endif // USE_HMC5883L +#endif // USE_I2C From 7950800cb22df97e54866303b80ddee55f656420 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Mon, 14 Nov 2022 21:15:38 +0100 Subject: [PATCH 05/21] ESP32 LVGL library from v8.3.2 to v8.3.3 (no functional change) --- CHANGELOG.md | 1 + lib/libesp32_lvgl/lvgl/library.json | 2 +- lib/libesp32_lvgl/lvgl/library.properties | 2 +- lib/libesp32_lvgl/lvgl/lv_conf_template.h | 2 +- lib/libesp32_lvgl/lvgl/lvgl.h | 2 +- 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 665c9659b..739f5543b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ All notable changes to this project will be documented in this file. - ESP32 Framework (Core) from v2.0.5.2 to v2.0.5.3 (#17034) - TuyaMcu rewrite by btsimonh (#17051) - WS2812 sends signal to only ``Pixels`` leds instead of sending to 512 leds (#17055) +- ESP32 LVGL library from v8.3.2 to v8.3.3 (no functional change) ### Fixed - SenseAir S8 module detection (#17033) diff --git a/lib/libesp32_lvgl/lvgl/library.json b/lib/libesp32_lvgl/lvgl/library.json index 58e13fca2..fe8ef4c15 100644 --- a/lib/libesp32_lvgl/lvgl/library.json +++ b/lib/libesp32_lvgl/lvgl/library.json @@ -1,6 +1,6 @@ { "name": "lvgl", - "version": "8.3.2", + "version": "8.3.3", "keywords": "graphics, gui, embedded, tft, lvgl", "description": "Graphics library to create embedded GUI with easy-to-use graphical elements, beautiful visual effects and low memory footprint. It offers anti-aliasing, opacity, and animations using only one frame buffer.", "repository": { diff --git a/lib/libesp32_lvgl/lvgl/library.properties b/lib/libesp32_lvgl/lvgl/library.properties index 2d4880773..816446a93 100644 --- a/lib/libesp32_lvgl/lvgl/library.properties +++ b/lib/libesp32_lvgl/lvgl/library.properties @@ -1,5 +1,5 @@ name=lvgl -version=8.3.2 +version=8.3.3 author=kisvegabor maintainer=kisvegabor,embeddedt,pete-pjb sentence=Full-featured Graphics Library for Embedded Systems diff --git a/lib/libesp32_lvgl/lvgl/lv_conf_template.h b/lib/libesp32_lvgl/lvgl/lv_conf_template.h index 618bf7f92..3d087f0f3 100644 --- a/lib/libesp32_lvgl/lvgl/lv_conf_template.h +++ b/lib/libesp32_lvgl/lvgl/lv_conf_template.h @@ -1,6 +1,6 @@ /** * @file lv_conf.h - * Configuration file for v8.3.2 + * Configuration file for v8.3.3 */ /* diff --git a/lib/libesp32_lvgl/lvgl/lvgl.h b/lib/libesp32_lvgl/lvgl/lvgl.h index 4cd9a8326..c0be411b2 100644 --- a/lib/libesp32_lvgl/lvgl/lvgl.h +++ b/lib/libesp32_lvgl/lvgl/lvgl.h @@ -15,7 +15,7 @@ extern "C" { ***************************/ #define LVGL_VERSION_MAJOR 8 #define LVGL_VERSION_MINOR 3 -#define LVGL_VERSION_PATCH 1 +#define LVGL_VERSION_PATCH 3 #define LVGL_VERSION_INFO "" /********************* From d2d384dc72c02a0d74c485b67787f33cd2e98aae Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Mon, 14 Nov 2022 22:46:08 +0100 Subject: [PATCH 06/21] Zigbee improved Aqara plug support and completed cluster 0x0702 --- CHANGELOG.md | 1 + .../xdrv_23_zigbee_5_0_constants.ino | 1146 +++++++++-------- .../xdrv_23_zigbee_5_1_attributes.ino | 30 +- .../xdrv_23_zigbee_5_2_converters.ino | 33 +- tasmota/zigbee/Aqara_plug.zb | 6 + 5 files changed, 653 insertions(+), 563 deletions(-) create mode 100644 tasmota/zigbee/Aqara_plug.zb diff --git a/CHANGELOG.md b/CHANGELOG.md index 665c9659b..dcde1f5df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ All notable changes to this project will be documented in this file. - ESP32 Framework (Core) from v2.0.5.2 to v2.0.5.3 (#17034) - TuyaMcu rewrite by btsimonh (#17051) - WS2812 sends signal to only ``Pixels`` leds instead of sending to 512 leds (#17055) +- Zigbee improved Aqara plug support and completed cluster 0x0702 ### Fixed - SenseAir S8 module detection (#17033) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_0_constants.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_0_constants.ino index 9320867e2..38e1e7bac 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_0_constants.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_0_constants.ino @@ -287,15 +287,28 @@ const char Z_strings[] PROGMEM = "ConfigStatus" "\x00" "Contact" "\x00" "ControlSequenceOfOperation" "\x00" + "ControlTemperature" "\x00" "Coordinate1" "\x00" "Coordinate2" "\x00" "Coordinate3" "\x00" + "CurrentBlock" "\x00" + "CurrentBlockPeriodConsumptionDelivered" "\x00" "CurrentGroup" "\x00" + "CurrentInletEnergyCarrierDemand" "\x00" + "CurrentInletEnergyCarrierSummation" "\x00" + "CurrentMaxDemandDelivered" "\x00" + "CurrentMaxDemandDeliveredTime" "\x00" + "CurrentMaxDemandReceived" "\x00" + "CurrentMaxDemandReceivedTime" "\x00" + "CurrentOutletEnergyCarrierDemand" "\x00" + "CurrentOutletEnergyCarrierSummation" "\x00" "CurrentPositionLift" "\x00" "CurrentPositionLiftPercentage" "\x00" "CurrentPositionTilt" "\x00" "CurrentPositionTiltPercentage" "\x00" "CurrentScene" "\x00" + "CurrentSummationDelivered" "\x00" + "CurrentSummationReceived" "\x00" "CurrentTemperature" "\x00" "CurrentTemperatureSetPoint" "\x00" "CurrentZoneSensitivityLevel" "\x00" @@ -318,10 +331,14 @@ const char Z_strings[] PROGMEM = "DCVoltageMin" "\x00" "DCVoltageMultiplier" "\x00" "DCVoltageOverload" "\x00" + "DFTSummation" "\x00" + "DailyConsumptionTarget" "\x00" + "DailyFreezeTime" "\x00" "DataQualityID" "\x00" "DateCode" "\x00" "DecelerationTimeLift" "\x00" "DefaultMoveRate" "\x00" + "DefaultUpdatePeriod" "\x00" "DehumidificationCooling" "\x00" "DehumidificationHysteresis" "\x00" "DehumidificationLockout" "\x00" @@ -355,7 +372,6 @@ const char Z_strings[] PROGMEM = "ElectricalMeasurementType" "\x00" "EnergyFormatting" "\x00" "EnergyRemote" "\x00" - "EnergyTotal" "\x00" "EnhancedColorMode" "\x00" "EnhancedCurrentHue" "\x00" "EurotronicErrors" "\x00" @@ -364,10 +380,12 @@ const char Z_strings[] PROGMEM = "FanModeSequence" "\x00" "FastPollTimeout" "\x00" "FastPollTimeoutMax" "\x00" + "FastPollUpdatePeriod" "\x00" "Fire" "\x00" "FlowMaxMeasuredValue" "\x00" "FlowMinMeasuredValue" "\x00" "FlowRate" "\x00" + "FlowRestriction" "\x00" "FlowTolerance" "\x00" "GPHueStop" "\x00" "GPIdentify" "\x00" @@ -455,12 +473,14 @@ const char Z_strings[] PROGMEM = "IlluminanceMinMeasuredValue" "\x00" "IlluminanceTargetLevel" "\x00" "IlluminanceTolerance" "\x00" + "InletTemperature" "\x00" "InstalledClosedLimitLift" "\x00" "InstalledClosedLimitTilt" "\x00" "InstalledOpenLimitLift" "\x00" "InstalledOpenLimitTilt" "\x00" "IntermediateSetpointsLift" "\x00" "IntermediateSetpointsTilt" "\x00" + "IntervalReadReportingPeriod" "\x00" "IntrinsicBallastFactor" "\x00" "LampAlarmMode" "\x00" "LampBurnHours" "\x00" @@ -610,6 +630,7 @@ const char Z_strings[] PROGMEM = "OpenPeriod" "\x00" "OppleMode" "\x00" "OutdoorTemperature" "\x00" + "OutletTemperature" "\x00" "OverTempTotalDwell" "\x00" "PICoolingDemand" "\x00" "PIHeatingDemand" "\x00" @@ -638,6 +659,7 @@ const char Z_strings[] PROGMEM = "PowerOnTimer" "\x00" "PowerSource" "\x00" "PowerThreshold" "\x00" + "PresetReadingTime" "\x00" "Pressure" "\x00" "PressureMaxMeasuredValue" "\x00" "PressureMaxScaledValue" "\x00" @@ -647,6 +669,7 @@ const char Z_strings[] PROGMEM = "PressureScaledTolerance" "\x00" "PressureScaledValue" "\x00" "PressureTolerance" "\x00" + "PreviousBlockPeriodConsumptionDelivered" "\x00" "Primary1Intensity" "\x00" "Primary1X" "\x00" "Primary1Y" "\x00" @@ -668,6 +691,7 @@ const char Z_strings[] PROGMEM = "ProductCode" "\x00" "ProductRevision" "\x00" "ProductURL" "\x00" + "ProfileIntervalPeriod" "\x00" "ProxyTable" "\x00" "QualityMeasure" "\x00" "RGB" "\x00" @@ -712,6 +736,7 @@ const char Z_strings[] PROGMEM = "ReactivePower" "\x00" "ReactivePowerPhB" "\x00" "ReactivePowerPhC" "\x00" + "ReadingSnapShotTime" "\x00" "RecallScene" "\x00" "RelativeHumidity" "\x00" "RelativeHumidityDisplay" "\x00" @@ -753,6 +778,7 @@ const char Z_strings[] PROGMEM = "StartUpOnOff" "\x00" "Status" "\x00" "StoreScene" "\x00" + "SupplyStatus" "\x00" "SwitchActions" "\x00" "SwitchType" "\x00" "SystemMode" "\x00" @@ -797,6 +823,7 @@ const char Z_strings[] PROGMEM = "VelocityLift" "\x00" "ViewGroup" "\x00" "ViewScene" "\x00" + "VolumePerReport" "\x00" "Water" "\x00" "WhitePointX" "\x00" "WhitePointY" "\x00" @@ -1047,551 +1074,578 @@ enum Z_offsets { Zo_ConfigStatus = 3878, Zo_Contact = 3891, Zo_ControlSequenceOfOperation = 3899, - Zo_Coordinate1 = 3926, - Zo_Coordinate2 = 3938, - Zo_Coordinate3 = 3950, - Zo_CurrentGroup = 3962, - Zo_CurrentPositionLift = 3975, - Zo_CurrentPositionLiftPercentage = 3995, - Zo_CurrentPositionTilt = 4025, - Zo_CurrentPositionTiltPercentage = 4045, - Zo_CurrentScene = 4075, - Zo_CurrentTemperature = 4088, - Zo_CurrentTemperatureSetPoint = 4107, - Zo_CurrentZoneSensitivityLevel = 4134, - Zo_CustomerName = 4162, - Zo_DCCurrent = 4175, - Zo_DCCurrentDivisor = 4185, - Zo_DCCurrentMax = 4202, - Zo_DCCurrentMin = 4215, - Zo_DCCurrentMultiplier = 4228, - Zo_DCCurrentOverload = 4248, - Zo_DCOverloadAlarmsMask = 4266, - Zo_DCPower = 4287, - Zo_DCPowerDivisor = 4295, - Zo_DCPowerMax = 4310, - Zo_DCPowerMin = 4321, - Zo_DCPowerMultiplier = 4332, - Zo_DCVoltage = 4350, - Zo_DCVoltageDivisor = 4360, - Zo_DCVoltageMax = 4377, - Zo_DCVoltageMin = 4390, - Zo_DCVoltageMultiplier = 4403, - Zo_DCVoltageOverload = 4423, - Zo_DataQualityID = 4441, - Zo_DateCode = 4455, - Zo_DecelerationTimeLift = 4464, - Zo_DefaultMoveRate = 4485, - Zo_DehumidificationCooling = 4501, - Zo_DehumidificationHysteresis = 4525, - Zo_DehumidificationLockout = 4552, - Zo_DehumidificationMaxCool = 4576, - Zo_DeviceEnabled = 4600, - Zo_DeviceTempAlarmMask = 4614, - Zo_Dimmer = 4634, - Zo_DimmerCurrentFrequency = 4641, - Zo_DimmerDown = 4664, - Zo_DimmerMaxFrequency = 4675, - Zo_DimmerMaxLevel = 4694, - Zo_DimmerMinFrequency = 4709, - Zo_DimmerMinLevel = 4728, - Zo_DimmerMove = 4743, - Zo_DimmerOptions = 4754, - Zo_DimmerRemainingTime = 4768, - Zo_DimmerStartUpLevel = 4788, - Zo_DimmerStep = 4807, - Zo_DimmerStepDown = 4818, - Zo_DimmerStepUp = 4833, - Zo_DimmerStop = 4846, - Zo_DimmerUp = 4857, - Zo_DisableLocalConfig = 4866, - Zo_DoorClosedEvents = 4885, - Zo_DoorOpenEvents = 4902, - Zo_DoorState = 4917, - Zo_DriftCompensation = 4927, - Zo_DstEnd = 4945, - Zo_DstShift = 4952, - Zo_DstStart = 4961, - Zo_ElectricalMeasurementType = 4970, - Zo_EnergyFormatting = 4996, - Zo_EnergyRemote = 5013, - Zo_EnergyTotal = 5026, - Zo_EnhancedColorMode = 5038, - Zo_EnhancedCurrentHue = 5056, - Zo_EurotronicErrors = 5075, - Zo_EurotronicHostFlags = 5092, - Zo_FanMode = 5112, - Zo_FanModeSequence = 5120, - Zo_FastPollTimeout = 5136, - Zo_FastPollTimeoutMax = 5152, - Zo_Fire = 5171, - Zo_FlowMaxMeasuredValue = 5176, - Zo_FlowMinMeasuredValue = 5197, - Zo_FlowRate = 5218, - Zo_FlowTolerance = 5227, - Zo_GPHueStop = 5241, - Zo_GPIdentify = 5251, - Zo_GPLevelStop = 5262, - Zo_GPLockDoor = 5274, - Zo_GPMoveColor = 5285, - Zo_GPMoveDown = 5297, - Zo_GPMoveDownOnOff = 5308, - Zo_GPMoveHueDown = 5324, - Zo_GPMoveHueUp = 5338, - Zo_GPMoveSatDown = 5350, - Zo_GPMoveSatUp = 5364, - Zo_GPMoveUp = 5376, - Zo_GPMoveUpOnOff = 5385, - Zo_GPOff = 5399, - Zo_GPOn = 5405, - Zo_GPPress1of1 = 5410, - Zo_GPPress1of2 = 5422, - Zo_GPPress2of2 = 5434, - Zo_GPRelease = 5446, - Zo_GPRelease1of1 = 5456, - Zo_GPRelease1of2 = 5470, - Zo_GPRelease2of2 = 5484, - Zo_GPSatStop = 5498, - Zo_GPScene0 = 5508, - Zo_GPScene1 = 5517, - Zo_GPScene10 = 5526, - Zo_GPScene11 = 5536, - Zo_GPScene12 = 5546, - Zo_GPScene13 = 5556, - Zo_GPScene14 = 5566, - Zo_GPScene15 = 5576, - Zo_GPScene2 = 5586, - Zo_GPScene3 = 5595, - Zo_GPScene4 = 5604, - Zo_GPScene5 = 5613, - Zo_GPScene6 = 5622, - Zo_GPScene7 = 5631, - Zo_GPScene8 = 5640, - Zo_GPScene9 = 5649, - Zo_GPShortPress1of1 = 5658, - Zo_GPShortPress1of2 = 5675, - Zo_GPShortPress2of2 = 5692, - Zo_GPStepColor = 5709, - Zo_GPStepDown = 5721, - Zo_GPStepDownOnOff = 5732, - Zo_GPStepHueDown = 5748, - Zo_GPStepHueUp = 5762, - Zo_GPStepSatDown = 5774, - Zo_GPStepSatUp = 5788, - Zo_GPStepUp = 5800, - Zo_GPStepUpOnOff = 5809, - Zo_GPToggle = 5823, - Zo_GPUnlockDoor = 5832, - Zo_GenericDeviceClass = 5845, - Zo_GenericDeviceType = 5864, - Zo_GetAllGroups = 5882, - Zo_GetGroup = 5895, - Zo_GetSceneMembership = 5904, - Zo_GlassBreak = 5923, - Zo_GroupNameSupport = 5934, - Zo_HVACSystemTypeConfiguration = 5951, - Zo_HWVersion = 5979, - Zo_HarmonicCurrentMultiplier = 5989, - Zo_HighTempDwellTripPoint = 6015, - Zo_HighTempThreshold = 6038, - Zo_Hue = 6056, - Zo_HueMove = 6060, - Zo_HueSat = 6068, - Zo_HueStep = 6075, - Zo_HueStepDown = 6083, - Zo_HueStepUp = 6095, - Zo_Humidity = 6105, - Zo_HumidityMaxMeasuredValue = 6114, - Zo_HumidityMinMeasuredValue = 6139, - Zo_HumidityTolerance = 6164, - Zo_IASCIEAddress = 6182, - Zo_Identify = 6196, - Zo_IdentifyQuery = 6205, - Zo_IdentifyTime = 6219, - Zo_Illuminance = 6232, - Zo_IlluminanceLevelStatus = 6244, - Zo_IlluminanceLightSensorType = 6267, - Zo_IlluminanceMaxMeasuredValue = 6294, - Zo_IlluminanceMinMeasuredValue = 6322, - Zo_IlluminanceTargetLevel = 6350, - Zo_IlluminanceTolerance = 6373, - Zo_InstalledClosedLimitLift = 6394, - Zo_InstalledClosedLimitTilt = 6419, - Zo_InstalledOpenLimitLift = 6444, - Zo_InstalledOpenLimitTilt = 6467, - Zo_IntermediateSetpointsLift = 6490, - Zo_IntermediateSetpointsTilt = 6516, - Zo_IntrinsicBallastFactor = 6542, - Zo_LampAlarmMode = 6565, - Zo_LampBurnHours = 6579, - Zo_LampBurnHoursTripPoint = 6593, - Zo_LampManufacturer = 6616, - Zo_LampRatedHours = 6633, - Zo_LampType = 6648, - Zo_LastConfiguredBy = 6657, - Zo_LastMessageLQI = 6674, - Zo_LastMessageRSSI = 6689, - Zo_LastSetTime = 6705, - Zo_LegrandHeatingMode = 6717, - Zo_LegrandMode = 6736, - Zo_LegrandOpt1 = 6748, - Zo_LegrandOpt2 = 6760, - Zo_LegrandOpt3 = 6772, - Zo_LidlPower = 6784, - Zo_LineCurrent = 6794, - Zo_LineCurrentPhB = 6806, - Zo_LineCurrentPhC = 6821, - Zo_LinkKey = 6836, - Zo_LocalTemperature = 6844, - Zo_LocalTemperatureCalibration = 6861, - Zo_LocalTime = 6889, - Zo_LocationAge = 6899, - Zo_LocationDescription = 6911, - Zo_LocationMethod = 6931, - Zo_LocationPower = 6946, - Zo_LocationType = 6960, - Zo_LockAlarmMask = 6973, - Zo_LockDefaultConfigurationRegister = 6987, - Zo_LockEnableInsideStatusLED = 7020, - Zo_LockEnableLocalProgramming = 7046, - Zo_LockEnableLogging = 7073, - Zo_LockEnableOneTouchLocking = 7091, - Zo_LockEnablePrivacyModeButton = 7117, - Zo_LockKeypadOperationEventMask = 7145, - Zo_LockKeypadProgrammingEventMask = 7174, - Zo_LockLEDSettings = 7205, - Zo_LockLanguage = 7221, - Zo_LockManualOperationEventMask = 7234, - Zo_LockOperatingMode = 7263, - Zo_LockRFIDOperationEventMask = 7281, - Zo_LockRFIDProgrammingEventMask = 7308, - Zo_LockRFOperationEventMask = 7337, - Zo_LockRFProgrammingEventMask = 7362, - Zo_LockSoundVolume = 7389, - Zo_LockState = 7405, - Zo_LockSupportedOperatingModes = 7415, - Zo_LockType = 7443, - Zo_LongPollInterval = 7452, - Zo_LongPollIntervalMin = 7469, - Zo_LowTempDwellTripPoint = 7489, - Zo_LowTempThreshold = 7511, - Zo_MainsAlarmMask = 7528, - Zo_MainsFrequency = 7543, - Zo_MainsVoltage = 7558, - Zo_MainsVoltageDwellTripPoint = 7571, - Zo_MainsVoltageMaxThreshold = 7598, - Zo_MainsVoltageMinThreshold = 7623, - Zo_Manufacturer = 7648, - Zo_MaxCoolSetpointLimit = 7661, - Zo_MaxHeatSetpointLimit = 7682, - Zo_MaxPINCodeLength = 7703, - Zo_MaxProxyTableEntries = 7720, - Zo_MaxRFIDCodeLength = 7741, - Zo_MaxSearchCounter = 7759, - Zo_MaxSinkTableEntries = 7776, - Zo_MaxTempExperienced = 7796, - Zo_Measured11thHarmonicCurrent = 7815, - Zo_Measured1stHarmonicCurrent = 7843, - Zo_Measured3rdHarmonicCurrent = 7870, - Zo_Measured5thHarmonicCurrent = 7897, - Zo_Measured7thHarmonicCurrent = 7924, - Zo_Measured9thHarmonicCurrent = 7951, - Zo_MeasuredPhase11thHarmonicCurrent = 7978, - Zo_MeasuredPhase1stHarmonicCurrent = 8011, - Zo_MeasuredPhase3rdHarmonicCurrent = 8043, - Zo_MeasuredPhase5thHarmonicCurrent = 8075, - Zo_MeasuredPhase7thHarmonicCurrent = 8107, - Zo_MeasuredPhase9thHarmonicCurrent = 8139, - Zo_MeterTypeID = 8171, - Zo_MinCoolSetpointLimit = 8183, - Zo_MinHeatSetpointLimit = 8204, - Zo_MinPINCodeLength = 8225, - Zo_MinRFIDCodeLength = 8242, - Zo_MinSetpointDeadBand = 8260, - Zo_MinTempExperienced = 8280, - Zo_Mode = 8299, - Zo_Model = 8304, - Zo_ModelId = 8310, - Zo_MotorStepSize = 8318, - Zo_Movement = 8332, - Zo_MullerLightMode = 8341, - Zo_MultiApplicationType = 8357, - Zo_MultiDescription = 8378, - Zo_MultiInApplicationType = 8395, - Zo_MultiInDescription = 8418, - Zo_MultiInNumberOfStates = 8437, - Zo_MultiInOutOfService = 8459, - Zo_MultiInReliability = 8479, - Zo_MultiInStatusFlags = 8498, - Zo_MultiInValue = 8517, - Zo_MultiNumberOfStates = 8530, - Zo_MultiOutApplicationType = 8550, - Zo_MultiOutDescription = 8574, - Zo_MultiOutNumberOfStates = 8594, - Zo_MultiOutOfService = 8617, - Zo_MultiOutOutOfService = 8635, - Zo_MultiOutReliability = 8656, - Zo_MultiOutRelinquishDefault = 8676, - Zo_MultiOutStatusFlags = 8702, - Zo_MultiOutValue = 8722, - Zo_MultiReliability = 8736, - Zo_MultiRelinquishDefault = 8753, - Zo_MultiStatusFlags = 8776, - Zo_MultiValue = 8793, - Zo_MultipleScheduling = 8804, - Zo_NeutralCurrent = 8823, - Zo_NotificationRetryNumber = 8838, - Zo_NotificationRetryTimer = 8862, - Zo_NumberOfDevices = 8885, - Zo_NumberOfHolidaySchedulesSupported = 8901, - Zo_NumberOfLogRecordsSupported = 8935, - Zo_NumberOfPINUsersSupported = 8963, - Zo_NumberOfPrimaries = 8989, - Zo_NumberOfRFIDUsersSupported = 9007, - Zo_NumberOfResets = 9034, - Zo_NumberOfTotalUsersSupported = 9049, - Zo_NumberOfWeekDaySchedulesSupportedPerUser = 9077, - Zo_NumberOfYearDaySchedulesSupportedPerUser = 9118, - Zo_NumberOfZoneSensitivityLevelsSupported = 9159, - Zo_NumberRSSIMeasurements = 9198, - Zo_NumberofActuationsLift = 9221, - Zo_NumberofActuationsTilt = 9244, - Zo_Occupancy = 9267, - Zo_OccupancySensorType = 9277, - Zo_OccupiedCoolingSetpoint = 9297, - Zo_OccupiedHeatingSetpoint = 9321, - Zo_OffTransitionTime = 9345, - Zo_OffWaitTime = 9363, - Zo_OnLevel = 9375, - Zo_OnOff = 9383, - Zo_OnOffTransitionTime = 9389, - Zo_OnTime = 9409, - Zo_OnTransitionTime = 9416, - Zo_OpenPeriod = 9433, - Zo_OppleMode = 9444, - Zo_OutdoorTemperature = 9454, - Zo_OverTempTotalDwell = 9473, - Zo_PICoolingDemand = 9492, - Zo_PIHeatingDemand = 9508, - Zo_PIROccupiedToUnoccupiedDelay = 9524, - Zo_PIRUnoccupiedToOccupiedDelay = 9553, - Zo_PIRUnoccupiedToOccupiedThreshold = 9582, - Zo_POD = 9615, - Zo_Panic = 9619, - Zo_PartNumber = 9625, - Zo_PathLossExponent = 9636, - Zo_PersistentMemoryWrites = 9653, - Zo_PersonalAlarm = 9676, - Zo_PhaseHarmonicCurrentMultiplier = 9690, - Zo_PhysicalClosedLimit = 9721, - Zo_PhysicalClosedLimitLift = 9741, - Zo_PhysicalClosedLimitTilt = 9765, - Zo_PhysicalEnvironment = 9789, - Zo_Power = 9809, - Zo_PowerDivisor = 9815, - Zo_PowerFactor = 9828, - Zo_PowerFactorPhB = 9840, - Zo_PowerFactorPhC = 9855, - Zo_PowerMultiplier = 9870, - Zo_PowerOffEffect = 9886, - Zo_PowerOnRecall = 9901, - Zo_PowerOnTimer = 9915, - Zo_PowerSource = 9928, - Zo_PowerThreshold = 9940, - Zo_Pressure = 9955, - Zo_PressureMaxMeasuredValue = 9964, - Zo_PressureMaxScaledValue = 9989, - Zo_PressureMinMeasuredValue = 10012, - Zo_PressureMinScaledValue = 10037, - Zo_PressureScale = 10060, - Zo_PressureScaledTolerance = 10074, - Zo_PressureScaledValue = 10098, - Zo_PressureTolerance = 10118, - Zo_Primary1Intensity = 10136, - Zo_Primary1X = 10154, - Zo_Primary1Y = 10164, - Zo_Primary2Intensity = 10174, - Zo_Primary2X = 10192, - Zo_Primary2Y = 10202, - Zo_Primary3Intensity = 10212, - Zo_Primary3X = 10230, - Zo_Primary3Y = 10240, - Zo_Primary4Intensity = 10250, - Zo_Primary4X = 10268, - Zo_Primary4Y = 10278, - Zo_Primary5Intensity = 10288, - Zo_Primary5X = 10306, - Zo_Primary5Y = 10316, - Zo_Primary6Intensity = 10326, - Zo_Primary6X = 10344, - Zo_Primary6Y = 10354, - Zo_ProductCode = 10364, - Zo_ProductRevision = 10376, - Zo_ProductURL = 10392, - Zo_ProxyTable = 10403, - Zo_QualityMeasure = 10414, - Zo_RGB = 10429, - Zo_RHDehumidificationSetpoint = 10433, - Zo_RMSCurrent = 10460, - Zo_RMSCurrentMax = 10471, - Zo_RMSCurrentMaxPhB = 10485, - Zo_RMSCurrentMaxPhC = 10502, - Zo_RMSCurrentMin = 10519, - Zo_RMSCurrentMinPhB = 10533, - Zo_RMSCurrentMinPhC = 10550, - Zo_RMSCurrentPhB = 10567, - Zo_RMSCurrentPhC = 10581, - Zo_RMSExtremeOverVoltage = 10595, - Zo_RMSExtremeOverVoltagePeriod = 10617, - Zo_RMSExtremeOverVoltagePeriodPhB = 10645, - Zo_RMSExtremeOverVoltagePeriodPhC = 10676, - Zo_RMSExtremeUnderVoltage = 10707, - Zo_RMSExtremeUnderVoltagePeriod = 10730, - Zo_RMSExtremeUnderVoltagePeriodPhB = 10759, - Zo_RMSExtremeUnderVoltagePeriodPhC = 10791, - Zo_RMSVoltage = 10823, - Zo_RMSVoltageMax = 10834, - Zo_RMSVoltageMaxPhB = 10848, - Zo_RMSVoltageMaxPhC = 10865, - Zo_RMSVoltageMin = 10882, - Zo_RMSVoltageMinPhB = 10896, - Zo_RMSVoltageMinPhC = 10913, - Zo_RMSVoltagePhB = 10930, - Zo_RMSVoltagePhC = 10944, - Zo_RMSVoltageSag = 10958, - Zo_RMSVoltageSagPeriod = 10972, - Zo_RMSVoltageSagPeriodPhB = 10992, - Zo_RMSVoltageSagPeriodPhC = 11015, - Zo_RMSVoltageSwell = 11038, - Zo_RMSVoltageSwellPeriod = 11054, - Zo_RMSVoltageSwellPeriodPhB = 11076, - Zo_RMSVoltageSwellPeriodPhC = 11101, - Zo_ReactiveCurrent = 11126, - Zo_ReactiveCurrentPhB = 11142, - Zo_ReactiveCurrentPhC = 11161, - Zo_ReactivePower = 11180, - Zo_ReactivePowerPhB = 11194, - Zo_ReactivePowerPhC = 11211, - Zo_RecallScene = 11228, - Zo_RelativeHumidity = 11240, - Zo_RelativeHumidityDisplay = 11257, - Zo_RelativeHumidityMode = 11281, - Zo_RemainingTime = 11302, - Zo_RemoteSensing = 11316, - Zo_RemoveAllGroups = 11330, - Zo_RemoveAllScenes = 11346, - Zo_RemoveGroup = 11362, - Zo_RemoveScene = 11374, - Zo_ReportingPeriod = 11386, - Zo_ResetAlarm = 11402, - Zo_ResetAllAlarms = 11413, - Zo_SWBuildID = 11428, - Zo_Sat = 11438, - Zo_SatMove = 11442, - Zo_SatStep = 11450, - Zo_SceneCount = 11458, - Zo_SceneNameSupport = 11469, - Zo_SceneValid = 11486, - Zo_ScheduleMode = 11497, - Zo_SeaPressure = 11510, - Zo_SecurityLevel = 11522, - Zo_ServerActiveFunctionality = 11536, - Zo_ServerFunctionality = 11562, - Zo_SharedSecurityKey = 11582, - Zo_SharedSecurityKeyType = 11600, - Zo_ShortPollInterval = 11622, - Zo_Shutter = 11640, - Zo_ShutterClose = 11648, - Zo_ShutterLift = 11661, - Zo_ShutterOpen = 11673, - Zo_ShutterStop = 11685, - Zo_ShutterTilt = 11697, - Zo_SinkTable = 11709, - Zo_SoftwareRevision = 11719, - Zo_StackVersion = 11736, - Zo_StandardTime = 11749, - Zo_StartUpOnOff = 11762, - Zo_Status = 11775, - Zo_StoreScene = 11782, - Zo_SwitchActions = 11793, - Zo_SwitchType = 11807, - Zo_SystemMode = 11818, - Zo_TRVBoost = 11829, - Zo_TRVChildProtection = 11838, - Zo_TRVMirrorDisplay = 11857, - Zo_TRVMode = 11874, - Zo_TRVWindowOpen = 11882, - Zo_TempTarget = 11896, - Zo_Temperature = 11907, - Zo_TemperatureDisplayMode = 11919, - Zo_TemperatureMaxMeasuredValue = 11942, - Zo_TemperatureMinMeasuredValue = 11970, - Zo_TemperatureTolerance = 11998, - Zo_TerncyDuration = 12019, - Zo_TerncyRotate = 12034, - Zo_ThSetpoint = 12047, - Zo_ThermostatAlarmMask = 12058, - Zo_ThermostatKeypadLockout = 12078, - Zo_ThermostatOccupancy = 12102, - Zo_ThermostatRunningMode = 12122, - Zo_ThermostatScheduleProgrammingVisibility = 12144, - Zo_Time = 12184, - Zo_TimeEpoch = 12189, - Zo_TimeStatus = 12199, - Zo_TimeZone = 12210, - Zo_TotalActivePower = 12219, - Zo_TotalApparentPower = 12236, - Zo_TotalProfileNum = 12255, - Zo_TotalReactivePower = 12271, - Zo_TuyaCalibration = 12290, - Zo_TuyaCalibrationTime = 12306, - Zo_TuyaMCUVersion = 12326, - Zo_TuyaMotorReversal = 12341, - Zo_TuyaMovingState = 12359, - Zo_TuyaQuery = 12375, - Zo_UnoccupiedCoolingSetpoint = 12385, - Zo_UnoccupiedHeatingSetpoint = 12411, - Zo_UtilityName = 12437, - Zo_ValidUntilTime = 12449, - Zo_ValvePosition = 12464, - Zo_VelocityLift = 12478, - Zo_ViewGroup = 12491, - Zo_ViewScene = 12501, - Zo_Water = 12511, - Zo_WhitePointX = 12517, - Zo_WhitePointY = 12529, - Zo_WindowCoveringType = 12541, - Zo_X = 12560, - Zo_Y = 12562, - Zo_ZCLVersion = 12564, - Zo_ZoneID = 12575, - Zo_ZoneState = 12582, - Zo_ZoneStatus = 12592, - Zo_ZoneStatusChange = 12603, - Zo_ZoneType = 12620, - Zo__ = 12629, - Zo_xx = 12631, - Zo_xx000A00 = 12634, - Zo_xx0A = 12643, - Zo_xx0A00 = 12648, - Zo_xx19 = 12655, - Zo_xx190A = 12660, - Zo_xx190A00 = 12667, - Zo_xxxx = 12676, - Zo_xxxx00 = 12681, - Zo_xxxx0A00 = 12688, - Zo_xxxxyy = 12697, - Zo_xxxxyyyy = 12704, - Zo_xxxxyyyy0A00 = 12713, - Zo_xxxxyyzz = 12726, - Zo_xxyy = 12735, - Zo_xxyy0A00 = 12740, - Zo_xxyyyy = 12749, - Zo_xxyyyy000000000000 = 12756, - Zo_xxyyyy0A0000000000 = 12775, - Zo_xxyyyyzz = 12794, - Zo_xxyyyyzzzz = 12803, - Zo_xxyyzzzz = 12814, + Zo_ControlTemperature = 3926, + Zo_Coordinate1 = 3945, + Zo_Coordinate2 = 3957, + Zo_Coordinate3 = 3969, + Zo_CurrentBlock = 3981, + Zo_CurrentBlockPeriodConsumptionDelivered = 3994, + Zo_CurrentGroup = 4033, + Zo_CurrentInletEnergyCarrierDemand = 4046, + Zo_CurrentInletEnergyCarrierSummation = 4078, + Zo_CurrentMaxDemandDelivered = 4113, + Zo_CurrentMaxDemandDeliveredTime = 4139, + Zo_CurrentMaxDemandReceived = 4169, + Zo_CurrentMaxDemandReceivedTime = 4194, + Zo_CurrentOutletEnergyCarrierDemand = 4223, + Zo_CurrentOutletEnergyCarrierSummation = 4256, + Zo_CurrentPositionLift = 4292, + Zo_CurrentPositionLiftPercentage = 4312, + Zo_CurrentPositionTilt = 4342, + Zo_CurrentPositionTiltPercentage = 4362, + Zo_CurrentScene = 4392, + Zo_CurrentSummationDelivered = 4405, + Zo_CurrentSummationReceived = 4431, + Zo_CurrentTemperature = 4456, + Zo_CurrentTemperatureSetPoint = 4475, + Zo_CurrentZoneSensitivityLevel = 4502, + Zo_CustomerName = 4530, + Zo_DCCurrent = 4543, + Zo_DCCurrentDivisor = 4553, + Zo_DCCurrentMax = 4570, + Zo_DCCurrentMin = 4583, + Zo_DCCurrentMultiplier = 4596, + Zo_DCCurrentOverload = 4616, + Zo_DCOverloadAlarmsMask = 4634, + Zo_DCPower = 4655, + Zo_DCPowerDivisor = 4663, + Zo_DCPowerMax = 4678, + Zo_DCPowerMin = 4689, + Zo_DCPowerMultiplier = 4700, + Zo_DCVoltage = 4718, + Zo_DCVoltageDivisor = 4728, + Zo_DCVoltageMax = 4745, + Zo_DCVoltageMin = 4758, + Zo_DCVoltageMultiplier = 4771, + Zo_DCVoltageOverload = 4791, + Zo_DFTSummation = 4809, + Zo_DailyConsumptionTarget = 4822, + Zo_DailyFreezeTime = 4845, + Zo_DataQualityID = 4861, + Zo_DateCode = 4875, + Zo_DecelerationTimeLift = 4884, + Zo_DefaultMoveRate = 4905, + Zo_DefaultUpdatePeriod = 4921, + Zo_DehumidificationCooling = 4941, + Zo_DehumidificationHysteresis = 4965, + Zo_DehumidificationLockout = 4992, + Zo_DehumidificationMaxCool = 5016, + Zo_DeviceEnabled = 5040, + Zo_DeviceTempAlarmMask = 5054, + Zo_Dimmer = 5074, + Zo_DimmerCurrentFrequency = 5081, + Zo_DimmerDown = 5104, + Zo_DimmerMaxFrequency = 5115, + Zo_DimmerMaxLevel = 5134, + Zo_DimmerMinFrequency = 5149, + Zo_DimmerMinLevel = 5168, + Zo_DimmerMove = 5183, + Zo_DimmerOptions = 5194, + Zo_DimmerRemainingTime = 5208, + Zo_DimmerStartUpLevel = 5228, + Zo_DimmerStep = 5247, + Zo_DimmerStepDown = 5258, + Zo_DimmerStepUp = 5273, + Zo_DimmerStop = 5286, + Zo_DimmerUp = 5297, + Zo_DisableLocalConfig = 5306, + Zo_DoorClosedEvents = 5325, + Zo_DoorOpenEvents = 5342, + Zo_DoorState = 5357, + Zo_DriftCompensation = 5367, + Zo_DstEnd = 5385, + Zo_DstShift = 5392, + Zo_DstStart = 5401, + Zo_ElectricalMeasurementType = 5410, + Zo_EnergyFormatting = 5436, + Zo_EnergyRemote = 5453, + Zo_EnhancedColorMode = 5466, + Zo_EnhancedCurrentHue = 5484, + Zo_EurotronicErrors = 5503, + Zo_EurotronicHostFlags = 5520, + Zo_FanMode = 5540, + Zo_FanModeSequence = 5548, + Zo_FastPollTimeout = 5564, + Zo_FastPollTimeoutMax = 5580, + Zo_FastPollUpdatePeriod = 5599, + Zo_Fire = 5620, + Zo_FlowMaxMeasuredValue = 5625, + Zo_FlowMinMeasuredValue = 5646, + Zo_FlowRate = 5667, + Zo_FlowRestriction = 5676, + Zo_FlowTolerance = 5692, + Zo_GPHueStop = 5706, + Zo_GPIdentify = 5716, + Zo_GPLevelStop = 5727, + Zo_GPLockDoor = 5739, + Zo_GPMoveColor = 5750, + Zo_GPMoveDown = 5762, + Zo_GPMoveDownOnOff = 5773, + Zo_GPMoveHueDown = 5789, + Zo_GPMoveHueUp = 5803, + Zo_GPMoveSatDown = 5815, + Zo_GPMoveSatUp = 5829, + Zo_GPMoveUp = 5841, + Zo_GPMoveUpOnOff = 5850, + Zo_GPOff = 5864, + Zo_GPOn = 5870, + Zo_GPPress1of1 = 5875, + Zo_GPPress1of2 = 5887, + Zo_GPPress2of2 = 5899, + Zo_GPRelease = 5911, + Zo_GPRelease1of1 = 5921, + Zo_GPRelease1of2 = 5935, + Zo_GPRelease2of2 = 5949, + Zo_GPSatStop = 5963, + Zo_GPScene0 = 5973, + Zo_GPScene1 = 5982, + Zo_GPScene10 = 5991, + Zo_GPScene11 = 6001, + Zo_GPScene12 = 6011, + Zo_GPScene13 = 6021, + Zo_GPScene14 = 6031, + Zo_GPScene15 = 6041, + Zo_GPScene2 = 6051, + Zo_GPScene3 = 6060, + Zo_GPScene4 = 6069, + Zo_GPScene5 = 6078, + Zo_GPScene6 = 6087, + Zo_GPScene7 = 6096, + Zo_GPScene8 = 6105, + Zo_GPScene9 = 6114, + Zo_GPShortPress1of1 = 6123, + Zo_GPShortPress1of2 = 6140, + Zo_GPShortPress2of2 = 6157, + Zo_GPStepColor = 6174, + Zo_GPStepDown = 6186, + Zo_GPStepDownOnOff = 6197, + Zo_GPStepHueDown = 6213, + Zo_GPStepHueUp = 6227, + Zo_GPStepSatDown = 6239, + Zo_GPStepSatUp = 6253, + Zo_GPStepUp = 6265, + Zo_GPStepUpOnOff = 6274, + Zo_GPToggle = 6288, + Zo_GPUnlockDoor = 6297, + Zo_GenericDeviceClass = 6310, + Zo_GenericDeviceType = 6329, + Zo_GetAllGroups = 6347, + Zo_GetGroup = 6360, + Zo_GetSceneMembership = 6369, + Zo_GlassBreak = 6388, + Zo_GroupNameSupport = 6399, + Zo_HVACSystemTypeConfiguration = 6416, + Zo_HWVersion = 6444, + Zo_HarmonicCurrentMultiplier = 6454, + Zo_HighTempDwellTripPoint = 6480, + Zo_HighTempThreshold = 6503, + Zo_Hue = 6521, + Zo_HueMove = 6525, + Zo_HueSat = 6533, + Zo_HueStep = 6540, + Zo_HueStepDown = 6548, + Zo_HueStepUp = 6560, + Zo_Humidity = 6570, + Zo_HumidityMaxMeasuredValue = 6579, + Zo_HumidityMinMeasuredValue = 6604, + Zo_HumidityTolerance = 6629, + Zo_IASCIEAddress = 6647, + Zo_Identify = 6661, + Zo_IdentifyQuery = 6670, + Zo_IdentifyTime = 6684, + Zo_Illuminance = 6697, + Zo_IlluminanceLevelStatus = 6709, + Zo_IlluminanceLightSensorType = 6732, + Zo_IlluminanceMaxMeasuredValue = 6759, + Zo_IlluminanceMinMeasuredValue = 6787, + Zo_IlluminanceTargetLevel = 6815, + Zo_IlluminanceTolerance = 6838, + Zo_InletTemperature = 6859, + Zo_InstalledClosedLimitLift = 6876, + Zo_InstalledClosedLimitTilt = 6901, + Zo_InstalledOpenLimitLift = 6926, + Zo_InstalledOpenLimitTilt = 6949, + Zo_IntermediateSetpointsLift = 6972, + Zo_IntermediateSetpointsTilt = 6998, + Zo_IntervalReadReportingPeriod = 7024, + Zo_IntrinsicBallastFactor = 7052, + Zo_LampAlarmMode = 7075, + Zo_LampBurnHours = 7089, + Zo_LampBurnHoursTripPoint = 7103, + Zo_LampManufacturer = 7126, + Zo_LampRatedHours = 7143, + Zo_LampType = 7158, + Zo_LastConfiguredBy = 7167, + Zo_LastMessageLQI = 7184, + Zo_LastMessageRSSI = 7199, + Zo_LastSetTime = 7215, + Zo_LegrandHeatingMode = 7227, + Zo_LegrandMode = 7246, + Zo_LegrandOpt1 = 7258, + Zo_LegrandOpt2 = 7270, + Zo_LegrandOpt3 = 7282, + Zo_LidlPower = 7294, + Zo_LineCurrent = 7304, + Zo_LineCurrentPhB = 7316, + Zo_LineCurrentPhC = 7331, + Zo_LinkKey = 7346, + Zo_LocalTemperature = 7354, + Zo_LocalTemperatureCalibration = 7371, + Zo_LocalTime = 7399, + Zo_LocationAge = 7409, + Zo_LocationDescription = 7421, + Zo_LocationMethod = 7441, + Zo_LocationPower = 7456, + Zo_LocationType = 7470, + Zo_LockAlarmMask = 7483, + Zo_LockDefaultConfigurationRegister = 7497, + Zo_LockEnableInsideStatusLED = 7530, + Zo_LockEnableLocalProgramming = 7556, + Zo_LockEnableLogging = 7583, + Zo_LockEnableOneTouchLocking = 7601, + Zo_LockEnablePrivacyModeButton = 7627, + Zo_LockKeypadOperationEventMask = 7655, + Zo_LockKeypadProgrammingEventMask = 7684, + Zo_LockLEDSettings = 7715, + Zo_LockLanguage = 7731, + Zo_LockManualOperationEventMask = 7744, + Zo_LockOperatingMode = 7773, + Zo_LockRFIDOperationEventMask = 7791, + Zo_LockRFIDProgrammingEventMask = 7818, + Zo_LockRFOperationEventMask = 7847, + Zo_LockRFProgrammingEventMask = 7872, + Zo_LockSoundVolume = 7899, + Zo_LockState = 7915, + Zo_LockSupportedOperatingModes = 7925, + Zo_LockType = 7953, + Zo_LongPollInterval = 7962, + Zo_LongPollIntervalMin = 7979, + Zo_LowTempDwellTripPoint = 7999, + Zo_LowTempThreshold = 8021, + Zo_MainsAlarmMask = 8038, + Zo_MainsFrequency = 8053, + Zo_MainsVoltage = 8068, + Zo_MainsVoltageDwellTripPoint = 8081, + Zo_MainsVoltageMaxThreshold = 8108, + Zo_MainsVoltageMinThreshold = 8133, + Zo_Manufacturer = 8158, + Zo_MaxCoolSetpointLimit = 8171, + Zo_MaxHeatSetpointLimit = 8192, + Zo_MaxPINCodeLength = 8213, + Zo_MaxProxyTableEntries = 8230, + Zo_MaxRFIDCodeLength = 8251, + Zo_MaxSearchCounter = 8269, + Zo_MaxSinkTableEntries = 8286, + Zo_MaxTempExperienced = 8306, + Zo_Measured11thHarmonicCurrent = 8325, + Zo_Measured1stHarmonicCurrent = 8353, + Zo_Measured3rdHarmonicCurrent = 8380, + Zo_Measured5thHarmonicCurrent = 8407, + Zo_Measured7thHarmonicCurrent = 8434, + Zo_Measured9thHarmonicCurrent = 8461, + Zo_MeasuredPhase11thHarmonicCurrent = 8488, + Zo_MeasuredPhase1stHarmonicCurrent = 8521, + Zo_MeasuredPhase3rdHarmonicCurrent = 8553, + Zo_MeasuredPhase5thHarmonicCurrent = 8585, + Zo_MeasuredPhase7thHarmonicCurrent = 8617, + Zo_MeasuredPhase9thHarmonicCurrent = 8649, + Zo_MeterTypeID = 8681, + Zo_MinCoolSetpointLimit = 8693, + Zo_MinHeatSetpointLimit = 8714, + Zo_MinPINCodeLength = 8735, + Zo_MinRFIDCodeLength = 8752, + Zo_MinSetpointDeadBand = 8770, + Zo_MinTempExperienced = 8790, + Zo_Mode = 8809, + Zo_Model = 8814, + Zo_ModelId = 8820, + Zo_MotorStepSize = 8828, + Zo_Movement = 8842, + Zo_MullerLightMode = 8851, + Zo_MultiApplicationType = 8867, + Zo_MultiDescription = 8888, + Zo_MultiInApplicationType = 8905, + Zo_MultiInDescription = 8928, + Zo_MultiInNumberOfStates = 8947, + Zo_MultiInOutOfService = 8969, + Zo_MultiInReliability = 8989, + Zo_MultiInStatusFlags = 9008, + Zo_MultiInValue = 9027, + Zo_MultiNumberOfStates = 9040, + Zo_MultiOutApplicationType = 9060, + Zo_MultiOutDescription = 9084, + Zo_MultiOutNumberOfStates = 9104, + Zo_MultiOutOfService = 9127, + Zo_MultiOutOutOfService = 9145, + Zo_MultiOutReliability = 9166, + Zo_MultiOutRelinquishDefault = 9186, + Zo_MultiOutStatusFlags = 9212, + Zo_MultiOutValue = 9232, + Zo_MultiReliability = 9246, + Zo_MultiRelinquishDefault = 9263, + Zo_MultiStatusFlags = 9286, + Zo_MultiValue = 9303, + Zo_MultipleScheduling = 9314, + Zo_NeutralCurrent = 9333, + Zo_NotificationRetryNumber = 9348, + Zo_NotificationRetryTimer = 9372, + Zo_NumberOfDevices = 9395, + Zo_NumberOfHolidaySchedulesSupported = 9411, + Zo_NumberOfLogRecordsSupported = 9445, + Zo_NumberOfPINUsersSupported = 9473, + Zo_NumberOfPrimaries = 9499, + Zo_NumberOfRFIDUsersSupported = 9517, + Zo_NumberOfResets = 9544, + Zo_NumberOfTotalUsersSupported = 9559, + Zo_NumberOfWeekDaySchedulesSupportedPerUser = 9587, + Zo_NumberOfYearDaySchedulesSupportedPerUser = 9628, + Zo_NumberOfZoneSensitivityLevelsSupported = 9669, + Zo_NumberRSSIMeasurements = 9708, + Zo_NumberofActuationsLift = 9731, + Zo_NumberofActuationsTilt = 9754, + Zo_Occupancy = 9777, + Zo_OccupancySensorType = 9787, + Zo_OccupiedCoolingSetpoint = 9807, + Zo_OccupiedHeatingSetpoint = 9831, + Zo_OffTransitionTime = 9855, + Zo_OffWaitTime = 9873, + Zo_OnLevel = 9885, + Zo_OnOff = 9893, + Zo_OnOffTransitionTime = 9899, + Zo_OnTime = 9919, + Zo_OnTransitionTime = 9926, + Zo_OpenPeriod = 9943, + Zo_OppleMode = 9954, + Zo_OutdoorTemperature = 9964, + Zo_OutletTemperature = 9983, + Zo_OverTempTotalDwell = 10001, + Zo_PICoolingDemand = 10020, + Zo_PIHeatingDemand = 10036, + Zo_PIROccupiedToUnoccupiedDelay = 10052, + Zo_PIRUnoccupiedToOccupiedDelay = 10081, + Zo_PIRUnoccupiedToOccupiedThreshold = 10110, + Zo_POD = 10143, + Zo_Panic = 10147, + Zo_PartNumber = 10153, + Zo_PathLossExponent = 10164, + Zo_PersistentMemoryWrites = 10181, + Zo_PersonalAlarm = 10204, + Zo_PhaseHarmonicCurrentMultiplier = 10218, + Zo_PhysicalClosedLimit = 10249, + Zo_PhysicalClosedLimitLift = 10269, + Zo_PhysicalClosedLimitTilt = 10293, + Zo_PhysicalEnvironment = 10317, + Zo_Power = 10337, + Zo_PowerDivisor = 10343, + Zo_PowerFactor = 10356, + Zo_PowerFactorPhB = 10368, + Zo_PowerFactorPhC = 10383, + Zo_PowerMultiplier = 10398, + Zo_PowerOffEffect = 10414, + Zo_PowerOnRecall = 10429, + Zo_PowerOnTimer = 10443, + Zo_PowerSource = 10456, + Zo_PowerThreshold = 10468, + Zo_PresetReadingTime = 10483, + Zo_Pressure = 10501, + Zo_PressureMaxMeasuredValue = 10510, + Zo_PressureMaxScaledValue = 10535, + Zo_PressureMinMeasuredValue = 10558, + Zo_PressureMinScaledValue = 10583, + Zo_PressureScale = 10606, + Zo_PressureScaledTolerance = 10620, + Zo_PressureScaledValue = 10644, + Zo_PressureTolerance = 10664, + Zo_PreviousBlockPeriodConsumptionDelivered = 10682, + Zo_Primary1Intensity = 10722, + Zo_Primary1X = 10740, + Zo_Primary1Y = 10750, + Zo_Primary2Intensity = 10760, + Zo_Primary2X = 10778, + Zo_Primary2Y = 10788, + Zo_Primary3Intensity = 10798, + Zo_Primary3X = 10816, + Zo_Primary3Y = 10826, + Zo_Primary4Intensity = 10836, + Zo_Primary4X = 10854, + Zo_Primary4Y = 10864, + Zo_Primary5Intensity = 10874, + Zo_Primary5X = 10892, + Zo_Primary5Y = 10902, + Zo_Primary6Intensity = 10912, + Zo_Primary6X = 10930, + Zo_Primary6Y = 10940, + Zo_ProductCode = 10950, + Zo_ProductRevision = 10962, + Zo_ProductURL = 10978, + Zo_ProfileIntervalPeriod = 10989, + Zo_ProxyTable = 11011, + Zo_QualityMeasure = 11022, + Zo_RGB = 11037, + Zo_RHDehumidificationSetpoint = 11041, + Zo_RMSCurrent = 11068, + Zo_RMSCurrentMax = 11079, + Zo_RMSCurrentMaxPhB = 11093, + Zo_RMSCurrentMaxPhC = 11110, + Zo_RMSCurrentMin = 11127, + Zo_RMSCurrentMinPhB = 11141, + Zo_RMSCurrentMinPhC = 11158, + Zo_RMSCurrentPhB = 11175, + Zo_RMSCurrentPhC = 11189, + Zo_RMSExtremeOverVoltage = 11203, + Zo_RMSExtremeOverVoltagePeriod = 11225, + Zo_RMSExtremeOverVoltagePeriodPhB = 11253, + Zo_RMSExtremeOverVoltagePeriodPhC = 11284, + Zo_RMSExtremeUnderVoltage = 11315, + Zo_RMSExtremeUnderVoltagePeriod = 11338, + Zo_RMSExtremeUnderVoltagePeriodPhB = 11367, + Zo_RMSExtremeUnderVoltagePeriodPhC = 11399, + Zo_RMSVoltage = 11431, + Zo_RMSVoltageMax = 11442, + Zo_RMSVoltageMaxPhB = 11456, + Zo_RMSVoltageMaxPhC = 11473, + Zo_RMSVoltageMin = 11490, + Zo_RMSVoltageMinPhB = 11504, + Zo_RMSVoltageMinPhC = 11521, + Zo_RMSVoltagePhB = 11538, + Zo_RMSVoltagePhC = 11552, + Zo_RMSVoltageSag = 11566, + Zo_RMSVoltageSagPeriod = 11580, + Zo_RMSVoltageSagPeriodPhB = 11600, + Zo_RMSVoltageSagPeriodPhC = 11623, + Zo_RMSVoltageSwell = 11646, + Zo_RMSVoltageSwellPeriod = 11662, + Zo_RMSVoltageSwellPeriodPhB = 11684, + Zo_RMSVoltageSwellPeriodPhC = 11709, + Zo_ReactiveCurrent = 11734, + Zo_ReactiveCurrentPhB = 11750, + Zo_ReactiveCurrentPhC = 11769, + Zo_ReactivePower = 11788, + Zo_ReactivePowerPhB = 11802, + Zo_ReactivePowerPhC = 11819, + Zo_ReadingSnapShotTime = 11836, + Zo_RecallScene = 11856, + Zo_RelativeHumidity = 11868, + Zo_RelativeHumidityDisplay = 11885, + Zo_RelativeHumidityMode = 11909, + Zo_RemainingTime = 11930, + Zo_RemoteSensing = 11944, + Zo_RemoveAllGroups = 11958, + Zo_RemoveAllScenes = 11974, + Zo_RemoveGroup = 11990, + Zo_RemoveScene = 12002, + Zo_ReportingPeriod = 12014, + Zo_ResetAlarm = 12030, + Zo_ResetAllAlarms = 12041, + Zo_SWBuildID = 12056, + Zo_Sat = 12066, + Zo_SatMove = 12070, + Zo_SatStep = 12078, + Zo_SceneCount = 12086, + Zo_SceneNameSupport = 12097, + Zo_SceneValid = 12114, + Zo_ScheduleMode = 12125, + Zo_SeaPressure = 12138, + Zo_SecurityLevel = 12150, + Zo_ServerActiveFunctionality = 12164, + Zo_ServerFunctionality = 12190, + Zo_SharedSecurityKey = 12210, + Zo_SharedSecurityKeyType = 12228, + Zo_ShortPollInterval = 12250, + Zo_Shutter = 12268, + Zo_ShutterClose = 12276, + Zo_ShutterLift = 12289, + Zo_ShutterOpen = 12301, + Zo_ShutterStop = 12313, + Zo_ShutterTilt = 12325, + Zo_SinkTable = 12337, + Zo_SoftwareRevision = 12347, + Zo_StackVersion = 12364, + Zo_StandardTime = 12377, + Zo_StartUpOnOff = 12390, + Zo_Status = 12403, + Zo_StoreScene = 12410, + Zo_SupplyStatus = 12421, + Zo_SwitchActions = 12434, + Zo_SwitchType = 12448, + Zo_SystemMode = 12459, + Zo_TRVBoost = 12470, + Zo_TRVChildProtection = 12479, + Zo_TRVMirrorDisplay = 12498, + Zo_TRVMode = 12515, + Zo_TRVWindowOpen = 12523, + Zo_TempTarget = 12537, + Zo_Temperature = 12548, + Zo_TemperatureDisplayMode = 12560, + Zo_TemperatureMaxMeasuredValue = 12583, + Zo_TemperatureMinMeasuredValue = 12611, + Zo_TemperatureTolerance = 12639, + Zo_TerncyDuration = 12660, + Zo_TerncyRotate = 12675, + Zo_ThSetpoint = 12688, + Zo_ThermostatAlarmMask = 12699, + Zo_ThermostatKeypadLockout = 12719, + Zo_ThermostatOccupancy = 12743, + Zo_ThermostatRunningMode = 12763, + Zo_ThermostatScheduleProgrammingVisibility = 12785, + Zo_Time = 12825, + Zo_TimeEpoch = 12830, + Zo_TimeStatus = 12840, + Zo_TimeZone = 12851, + Zo_TotalActivePower = 12860, + Zo_TotalApparentPower = 12877, + Zo_TotalProfileNum = 12896, + Zo_TotalReactivePower = 12912, + Zo_TuyaCalibration = 12931, + Zo_TuyaCalibrationTime = 12947, + Zo_TuyaMCUVersion = 12967, + Zo_TuyaMotorReversal = 12982, + Zo_TuyaMovingState = 13000, + Zo_TuyaQuery = 13016, + Zo_UnoccupiedCoolingSetpoint = 13026, + Zo_UnoccupiedHeatingSetpoint = 13052, + Zo_UtilityName = 13078, + Zo_ValidUntilTime = 13090, + Zo_ValvePosition = 13105, + Zo_VelocityLift = 13119, + Zo_ViewGroup = 13132, + Zo_ViewScene = 13142, + Zo_VolumePerReport = 13152, + Zo_Water = 13168, + Zo_WhitePointX = 13174, + Zo_WhitePointY = 13186, + Zo_WindowCoveringType = 13198, + Zo_X = 13217, + Zo_Y = 13219, + Zo_ZCLVersion = 13221, + Zo_ZoneID = 13232, + Zo_ZoneState = 13239, + Zo_ZoneStatus = 13249, + Zo_ZoneStatusChange = 13260, + Zo_ZoneType = 13277, + Zo__ = 13286, + Zo_xx = 13288, + Zo_xx000A00 = 13291, + Zo_xx0A = 13300, + Zo_xx0A00 = 13305, + Zo_xx19 = 13312, + Zo_xx190A = 13317, + Zo_xx190A00 = 13324, + Zo_xxxx = 13333, + Zo_xxxx00 = 13338, + Zo_xxxx0A00 = 13345, + Zo_xxxxyy = 13354, + Zo_xxxxyyyy = 13361, + Zo_xxxxyyyy0A00 = 13370, + Zo_xxxxyyzz = 13383, + Zo_xxyy = 13392, + Zo_xxyy0A00 = 13397, + Zo_xxyyyy = 13406, + Zo_xxyyyy000000000000 = 13413, + Zo_xxyyyy0A0000000000 = 13432, + Zo_xxyyyyzz = 13451, + Zo_xxyyyyzzzz = 13460, + Zo_xxyyzzzz = 13471, }; diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_1_attributes.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_1_attributes.ino index 17be8d13f..5298fa5fb 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_1_attributes.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_1_attributes.ino @@ -1129,7 +1129,35 @@ const Z_AttributeConverter Z_PostProcess[] PROGMEM = { { Zuint8, Cx0500, 0xFFF0 + ZA_GlassBreak, Z_(GlassBreak),Cm1, 0 }, // Metering (Smart Energy) cluster - { Zuint48, Cx0702, 0x0000, Z_(EnergyTotal), Cm1, 0 }, + { Zuint48, Cx0702, 0x0000, Z_(CurrentSummationDelivered),Cm1, 0 }, + { Zuint48, Cx0702, 0x0001, Z_(CurrentSummationReceived),Cm1, 0 }, + { Zuint48, Cx0702, 0x0002, Z_(CurrentMaxDemandDelivered),Cm1, 0 }, + { Zuint48, Cx0702, 0x0003, Z_(CurrentMaxDemandReceived),Cm1, 0 }, + { Zuint48, Cx0702, 0x0004, Z_(DFTSummation), Cm1, 0 }, + { Zuint16, Cx0702, 0x0005, Z_(DailyFreezeTime), Cm1, 0 }, + { Zint8, Cx0702, 0x0006, Z_(PowerFactor), Cm1, 0 }, + { ZUTC, Cx0702, 0x0007, Z_(ReadingSnapShotTime), Cm1, 0 }, + { ZUTC, Cx0702, 0x0008, Z_(CurrentMaxDemandDeliveredTime),Cm1, 0 }, + { ZUTC, Cx0702, 0x0009, Z_(CurrentMaxDemandReceivedTime),Cm1, 0 }, + { Zuint8, Cx0702, 0x000A, Z_(DefaultUpdatePeriod), Cm1, 0 }, + { Zuint8, Cx0702, 0x000B, Z_(FastPollUpdatePeriod), Cm1, 0 }, + { Zuint48, Cx0702, 0x000C, Z_(CurrentBlockPeriodConsumptionDelivered),Cm1, 0 }, + { Zuint24, Cx0702, 0x000D, Z_(DailyConsumptionTarget),Cm1, 0 }, + { Zenum8, Cx0702, 0x000E, Z_(CurrentBlock), Cm1, 0 }, + { Zenum8, Cx0702, 0x000F, Z_(ProfileIntervalPeriod),Cm1, 0 }, + { Zuint16, Cx0702, 0x0010, Z_(IntervalReadReportingPeriod),Cm1, 0 }, + { Zuint16, Cx0702, 0x0011, Z_(PresetReadingTime), Cm1, 0 }, + { Zuint16, Cx0702, 0x0012, Z_(VolumePerReport), Cm1, 0 }, + { Zuint8, Cx0702, 0x0013, Z_(FlowRestriction), Cm1, 0 }, + { Zenum8, Cx0702, 0x0014, Z_(SupplyStatus), Cm1, 0 }, + { Zuint48, Cx0702, 0x0015, Z_(CurrentInletEnergyCarrierSummation),Cm1, 0 }, + { Zuint48, Cx0702, 0x0016, Z_(CurrentOutletEnergyCarrierSummation),Cm1, 0 }, + { Zint24, Cx0702, 0x0017, Z_(InletTemperature), Cm1, 0 }, + { Zint24, Cx0702, 0x0018, Z_(OutletTemperature), Cm1, 0 }, + { Zint24, Cx0702, 0x0019, Z_(ControlTemperature), Cm1, 0 }, + { Zint24, Cx0702, 0x001A, Z_(CurrentInletEnergyCarrierDemand),Cm1, 0 }, + { Zint24, Cx0702, 0x001B, Z_(CurrentOutletEnergyCarrierDemand),Cm1, 0 }, + { Zuint48, Cx0702, 0x001C, Z_(PreviousBlockPeriodConsumptionDelivered),Cm1, 0 }, // Meter Identification cluster { Zstring, Cx0B01, 0x0000, Z_(CompanyName), Cm1, 0 }, diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_2_converters.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_2_converters.ino index 4614011aa..658d508a3 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_2_converters.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_2_converters.ino @@ -717,20 +717,24 @@ void ZCLFrame::applySynonymAttributes(Z_attribute_list& attr_list) { Z_attribute_synonym syn = Z_plugin_matchAttributeSynonym(device.modelId, device.manufacturerId, attr.cluster, attr.attr_id); if (syn.found()) { - attr.setKeyId(syn.new_cluster, syn.new_attribute); - if ((syn.multiplier != 1 && syn.multiplier != 0) || (syn.divider != 1 && syn.divider != 0) || (syn.base != 0)) { - // we need to change the value - float fval = attr.getFloat(); - if (syn.multiplier != 1 && syn.multiplier != 0) { - fval = fval * syn.multiplier; + if (syn.new_attribute == 0xFFFF) { // if attr is 0xFFFF, remove attribute + attr_list.removeAttribute(&attr); + } else { + attr.setKeyId(syn.new_cluster, syn.new_attribute); + if ((syn.multiplier != 1 && syn.multiplier != 0) || (syn.divider != 1 && syn.divider != 0) || (syn.base != 0)) { + // we need to change the value + float fval = attr.getFloat(); + if (syn.multiplier != 1 && syn.multiplier != 0) { + fval = fval * syn.multiplier; + } + if (syn.divider != 1 && syn.divider != 0) { + fval = fval / syn.divider; + } + if (syn.base != 0) { + fval = fval + syn.base; + } + attr.setFloat(fval); } - if (syn.divider != 1 && syn.divider != 0) { - fval = fval / syn.divider; - } - if (syn.base != 0) { - fval = fval + syn.base; - } - attr.setFloat(fval); } } } @@ -1189,9 +1193,6 @@ void ZCLFrame::syntheticAnalogValue(Z_attribute_list &attr_list, class Z_attribu if (modelId.startsWith(F("lumi.sensor_cube"))) { attr.setKeyId(0x000C, 0xFF55); // change to AqaraRotate } - if (modelId.startsWith(F("lumi.plug"))) { - attr.setKeyId(0x0702, 0x0000); // change to EnergyTotal - } if (modelId.startsWith(F("lumi.ctrl"))) { attr.setKeyId(0x0B04, 0x050B); // change to ActivePower } diff --git a/tasmota/zigbee/Aqara_plug.zb b/tasmota/zigbee/Aqara_plug.zb new file mode 100644 index 000000000..a9c2d9720 --- /dev/null +++ b/tasmota/zigbee/Aqara_plug.zb @@ -0,0 +1,6 @@ +#Z2Tv1 +# Aqara Smart Plug EU +# https://zigbee.blakadder.com/Aqara_SP-EUC01.html +:lumi.plug.*,LUMI +0B04/050B=0B04/FFFF # ignore the original ActivePower since it returns always zero +000C/0055=0B04/050B From 4f343fd7b73a823400219cce11f026820d14f5eb Mon Sep 17 00:00:00 2001 From: joba-1 Date: Mon, 14 Nov 2022 23:56:38 +0100 Subject: [PATCH 07/21] add RgxClients for ESP8266 --- .../xdrv_58_range_extender.ino | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_58_range_extender.ino b/tasmota/tasmota_xdrv_driver/xdrv_58_range_extender.ino index 7352861dd..ed806c158 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_58_range_extender.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_58_range_extender.ino @@ -95,10 +95,8 @@ const char kDrvRgxCommands[] PROGMEM = "Rgx|" // Prefix "|" "NAPT" #endif // USE_WIFI_RANGE_EXTENDER_NAPT -#ifdef ESP32 "|" "Clients" -#endif // ESP32 "|" "Address" "|" @@ -111,9 +109,7 @@ void (*const DrvRgxCommand[])(void) PROGMEM = { #ifdef USE_WIFI_RANGE_EXTENDER_NAPT &CmndRgxNAPT, #endif // USE_WIFI_RANGE_EXTENDER_NAPT -#ifdef ESP32 &CmndRgxClients, -#endif // ESP32 &CmndRgxAddresses, &CmndRgxAddresses, }; @@ -172,17 +168,18 @@ void RgxCheckConfig(void) } } -#ifdef ESP32 void CmndRgxClients(void) { + Response_P(PSTR("{\"RgxClients\":{")); + const char *sep = ""; + +#if defined(ESP32) wifi_sta_list_t wifi_sta_list = {0}; tcpip_adapter_sta_list_t adapter_sta_list = {0}; esp_wifi_ap_get_sta_list(&wifi_sta_list); tcpip_adapter_get_sta_list(&wifi_sta_list, &adapter_sta_list); - Response_P(PSTR("{\"RgxClients\":{")); - const char *sep = ""; for (int i=0; ibssid; + ResponseAppend_P(PSTR("%s\"%02X%02X%02X%02X%02X%02X\":{\"" D_CMND_IPADDRESS "\":\"%_I\"}"), + sep, m[0], m[1], m[2], m[3], m[4], m[5], station->ip.addr); + sep = ","; + station = STAILQ_NEXT(station, next); + } + wifi_softap_free_station_info(); +#endif + ResponseAppend_P(PSTR("}}")); } -#endif // ESP32 void CmndRgxState(void) { From e88d1682e9854a78d7bf3f90e3b333a6b0431462 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 15 Nov 2022 10:10:29 +0100 Subject: [PATCH 08/21] Add command ``SwitchMode 16`` Add command ``SwitchMode 16`` sending only MQTT message on inverted switch change (#17028) --- CHANGELOG.md | 3 ++- RELEASENOTES.md | 3 +++ tasmota/include/tasmota.h | 13 +++++++++++-- tasmota/tasmota_support/support_switch.ino | 3 +++ 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e152076a..7440cc613 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file. - Support for Dingtian x595/x165 shift register based relay boards by Barbudor (#17032) - New ``FUNC_NETWORK_UP`` and ``FUNC_NETWORK_DOWN`` events - WS2812 and Light Art-Net DMX control over UDP port 6454 (#17059) +- Command ``SwitchMode 16`` sending only MQTT message on inverted switch change (#17028) ### Breaking Changed @@ -17,7 +18,7 @@ All notable changes to this project will be documented in this file. - ESP32 Framework (Core) from v2.0.5.2 to v2.0.5.3 (#17034) - TuyaMcu rewrite by btsimonh (#17051) - WS2812 sends signal to only ``Pixels`` leds instead of sending to 512 leds (#17055) -- Zigbee improved Aqara plug support and completed cluster 0x0702 +- Zigbee improved Aqara plug support and completed cluster 0x0702 (#17073) - ESP32 LVGL library from v8.3.2 to v8.3.3 (no functional change) ### Fixed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index fdc8a7b16..8bc75e96b 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -110,6 +110,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo ## Changelog v12.2.0.4 ### Added - Command ``SetOption47 1..255`` to delay power on relay state in seconds reducing power surge. ``SO47 1`` delays until network connected. ``SO47 2`` delays until mqtt connected +- Command ``SwitchMode 16`` sending only MQTT message on inverted switch change [#17028](https://github.com/arendst/Tasmota/issues/17028) - Command NeoPool ``NPFiltration 2`` toggle [#16859](https://github.com/arendst/Tasmota/issues/16859) - Support for two phase power calibration using commands ``PowerSet2``, ``VoltageSet2`` and ``CurrentSet2`` - Support for Shelly Pro 1/1PM and 2/2PM [#16773](https://github.com/arendst/Tasmota/issues/16773) @@ -130,12 +131,14 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo ### Changed - ESP32 Framework (Core) from v2.0.5 to v2.0.5.3 +- ESP32 LVGL library from v8.3.2 to v8.3.3 (no functional change) - ESP32 NimBLE library from v1.4.0 to v1.4.1 [#16775](https://github.com/arendst/Tasmota/issues/16775) - DS18x20 ``DS18Alias`` to ``DS18Sens`` [#16833](https://github.com/arendst/Tasmota/issues/16833) - Compiling with reduced boards manifests in favour of Autoconfig [#16848](https://github.com/arendst/Tasmota/issues/16848) - ADE7953 monitoring from instant power to accumulated energy [#16941](https://github.com/arendst/Tasmota/issues/16941) - TuyaMcu rewrite by btsimonh [#17051](https://github.com/arendst/Tasmota/issues/17051) - WS2812 sends signal to only ``Pixels`` leds instead of sending to 512 leds [#17055](https://github.com/arendst/Tasmota/issues/17055) +- Zigbee improved Aqara plug support and completed cluster 0x0702 [#17073](https://github.com/arendst/Tasmota/issues/17073) ### Fixed - Serial bridge default serial configuration from 5N1 to 8N1 regression from v10.1.0.3 diff --git a/tasmota/include/tasmota.h b/tasmota/include/tasmota.h index cc53ee79f..bde60e52f 100644 --- a/tasmota/include/tasmota.h +++ b/tasmota/include/tasmota.h @@ -322,8 +322,17 @@ enum WifiConfigOptions {WIFI_RESTART, EX_WIFI_SMARTCONFIG, WIFI_MANAGER, EX_WIFI enum WifiTestOptions {WIFI_NOT_TESTING, WIFI_TESTING, WIFI_TEST_FINISHED, WIFI_TEST_FINISHED_BAD}; -enum SwitchModeOptions {TOGGLE, FOLLOW, FOLLOW_INV, PUSHBUTTON, PUSHBUTTON_INV, PUSHBUTTONHOLD, PUSHBUTTONHOLD_INV, PUSHBUTTON_TOGGLE, TOGGLEMULTI, - FOLLOWMULTI, FOLLOWMULTI_INV, PUSHHOLDMULTI, PUSHHOLDMULTI_INV, PUSHON, PUSHON_INV, PUSH_IGNORE, MAX_SWITCH_OPTION}; +enum SwitchModeOptions {TOGGLE, + FOLLOW, FOLLOW_INV, + PUSHBUTTON, PUSHBUTTON_INV, + PUSHBUTTONHOLD, PUSHBUTTONHOLD_INV, + PUSHBUTTON_TOGGLE, + TOGGLEMULTI, + FOLLOWMULTI, FOLLOWMULTI_INV, + PUSHHOLDMULTI, PUSHHOLDMULTI_INV, + PUSHON, PUSHON_INV, + PUSH_IGNORE, PUSH_IGNORE_INV, // 15, 16 + MAX_SWITCH_OPTION}; enum LedStateOptions {LED_OFF, LED_POWER, LED_MQTTSUB, LED_POWER_MQTTSUB, LED_MQTTPUB, LED_POWER_MQTTPUB, LED_MQTT, LED_POWER_MQTT, MAX_LED_OPTION}; diff --git a/tasmota/tasmota_support/support_switch.ino b/tasmota/tasmota_support/support_switch.ino index 7a3f01dae..6bf59bbcb 100644 --- a/tasmota/tasmota_support/support_switch.ino +++ b/tasmota/tasmota_support/support_switch.ino @@ -409,6 +409,9 @@ void SwitchHandler(uint32_t mode) { Switch.last_state[i] = button; // Update switch state before publishing MqttPublishSensor(); break; + case PUSH_IGNORE_INV: + MqttPublishSensor(); // Publishing before update + break; } Switch.last_state[i] = button; } From 5f3d504c301466eefccb2521029290ca79036657 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 15 Nov 2022 11:11:32 +0100 Subject: [PATCH 09/21] Add support for HMC5883L Add support for HMC5883L 3-Axis Digital Compass sensor by Andreas Achtzehn (#17069) --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/include/tasmota.h | 20 ++--- tasmota/my_user_config.h | 2 +- tasmota/tasmota_support/support_features.ino | 4 +- .../tasmota_xsns_sensor/xsns_101_hmc5883l.ino | 78 ++++++++++--------- tools/decode-status.py | 2 +- 7 files changed, 58 insertions(+), 50 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7440cc613..2c9543344 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file. - New ``FUNC_NETWORK_UP`` and ``FUNC_NETWORK_DOWN`` events - WS2812 and Light Art-Net DMX control over UDP port 6454 (#17059) - Command ``SwitchMode 16`` sending only MQTT message on inverted switch change (#17028) +- Support for HMC5883L 3-Axis Digital Compass sensor by Andreas Achtzehn (#17069) ### Breaking Changed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 8bc75e96b..06b3968aa 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -120,6 +120,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Support for Plantower PMSx003T AQI models with temperature and humidity [#16971](https://github.com/arendst/Tasmota/issues/16971) - Support for BP1658CJ RGBCW led bulbs like Orein OS0100411267 by Cossid [#17011](https://github.com/arendst/Tasmota/issues/17011) - Support for Dingtian x595 shift register based relay boards by Barbudor [#17032](https://github.com/arendst/Tasmota/issues/17032) +- Support for HMC5883L 3-Axis Digital Compass sensor by Andreas Achtzehn [#17069](https://github.com/arendst/Tasmota/issues/17069) - WS2812 and Light Art-Net DMX control over UDP port 6454 [#17059](https://github.com/arendst/Tasmota/issues/17059) - Berry ``bytes().setbytes()`` method [#16892](https://github.com/arendst/Tasmota/issues/16892) - Berry ``bytes().reverse()`` method [#16977](https://github.com/arendst/Tasmota/issues/16977) diff --git a/tasmota/include/tasmota.h b/tasmota/include/tasmota.h index bde60e52f..d00ee6295 100644 --- a/tasmota/include/tasmota.h +++ b/tasmota/include/tasmota.h @@ -322,16 +322,16 @@ enum WifiConfigOptions {WIFI_RESTART, EX_WIFI_SMARTCONFIG, WIFI_MANAGER, EX_WIFI enum WifiTestOptions {WIFI_NOT_TESTING, WIFI_TESTING, WIFI_TEST_FINISHED, WIFI_TEST_FINISHED_BAD}; -enum SwitchModeOptions {TOGGLE, - FOLLOW, FOLLOW_INV, - PUSHBUTTON, PUSHBUTTON_INV, - PUSHBUTTONHOLD, PUSHBUTTONHOLD_INV, - PUSHBUTTON_TOGGLE, - TOGGLEMULTI, - FOLLOWMULTI, FOLLOWMULTI_INV, - PUSHHOLDMULTI, PUSHHOLDMULTI_INV, - PUSHON, PUSHON_INV, - PUSH_IGNORE, PUSH_IGNORE_INV, // 15, 16 +enum SwitchModeOptions {TOGGLE, // 0 + FOLLOW, FOLLOW_INV, // 1, 2 - Follow switch state + PUSHBUTTON, PUSHBUTTON_INV, // 3, 4 - Pushbutton (default 1, 0 = toggle) + PUSHBUTTONHOLD, PUSHBUTTONHOLD_INV, // 5, 6 - Pushbutton with hold (default 1, 0 = toggle, Hold = hold) + PUSHBUTTON_TOGGLE, // 7 - = 0 + TOGGLEMULTI, // 8 - = 0 with multi toggle + FOLLOWMULTI, FOLLOWMULTI_INV, // 9, 10 - Multi change follow (0 = off, 1 = on, 2x change = hold) + PUSHHOLDMULTI, PUSHHOLDMULTI_INV, // 11, 12 - Pushbutton with dimmer mode + PUSHON, PUSHON_INV, // 13, 14 - Pushon mode (1 = on, switch off using PulseTime) + PUSH_IGNORE, PUSH_IGNORE_INV, // 15, 16 - Send only MQTT message on switch change MAX_SWITCH_OPTION}; enum LedStateOptions {LED_OFF, LED_POWER, LED_MQTTSUB, LED_POWER_MQTTSUB, LED_MQTTPUB, LED_POWER_MQTTPUB, LED_MQTT, LED_POWER_MQTT, MAX_LED_OPTION}; diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 23415f8fd..58e6bb30b 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -691,7 +691,7 @@ // #define USE_HYT // [I2CDriver68] Enable HYTxxx temperature and humidity sensor (I2C address 0x28) (+0k5 code) // #define USE_LUXV30B // [I2CDriver70] Enable RFRobot SEN0390 LuxV30b ambient light sensor (I2C address 0x4A) (+0k5 code) // #define USE_QMC5883L // [I2CDriver71] Enable QMC5883L magnetic induction sensor (I2C address 0x0D) (+0k8 code) -// #define USE_HMC5883L // [I2CDriver73] Enable HMC5883L magnetic induction sensor (I2C address 0x1E) +// #define USE_HMC5883L // [I2CDriver73] Enable HMC5883L magnetic induction sensor (I2C address 0x1E) (+1k3 code) // #define QMC5883L_TEMP_SHIFT 23 // sensor temperature are not calibrated (only relativ measurement) and need an absolute ground value in °C (see datasheet) // #define USE_INA3221 // [I2CDriver72] Enable INA3221 3-channel DC voltage and current sensor (I2C address 0x40-0x44) (+3.2k code) // #define INA3221_ADDRESS1 // allow to change the 1st address to search for INA3221 to 0x41..0x43 diff --git a/tasmota/tasmota_support/support_features.ino b/tasmota/tasmota_support/support_features.ino index f61e15e14..e337b2a90 100644 --- a/tasmota/tasmota_support/support_features.ino +++ b/tasmota/tasmota_support/support_features.ino @@ -852,7 +852,9 @@ void ResponseAppendFeatures(void) #ifdef USE_DINGTIAN_RELAY feature9 |= 0x00000100; // xdrv_90_dingtian_relay.ino #endif -// feature9 |= 0x00000200; +#if defined(USE_I2C) && defined(USE_HMC5883L) + feature9 |= 0x00000200; // xsns_101_hmc5883l.ino +#endif // feature9 |= 0x00000400; // feature9 |= 0x00000800; diff --git a/tasmota/tasmota_xsns_sensor/xsns_101_hmc5883l.ino b/tasmota/tasmota_xsns_sensor/xsns_101_hmc5883l.ino index 56a311354..a800a8998 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_101_hmc5883l.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_101_hmc5883l.ino @@ -1,7 +1,7 @@ /* xsns_101_hmc5883l.ino - HMC5883L 3-Axis Digital Compass sensor support for Tasmota - (inspired by Helge Scheunemann) - Copyright (C) 2022 Andreas Achtzehn + + Copyright (C) 2022 Andreas Achtzehn (inspired by Helge Scheunemann) 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 @@ -27,8 +27,8 @@ \*********************************************************************************************/ // Define driver ID -#define XSNS_101 101 -#define XI2C_73 73 // See I2CDEVICES.md +#define XSNS_101 101 +#define XI2C_73 73 // See I2CDEVICES.md /* The default I2C address of this chip */ #define HMC5883L_ADDR 0x1E @@ -45,8 +45,8 @@ #define HMC5883L_CONFIG_B 0x01 #define HMC5883L_MODE 0x02 #define HMC5883L_CHIP_ID_A 0x0A -#define HMC5883L_CHIP_ID_B 0x0B -#define HMC5883L_CHIP_ID_C 0x0C +#define HMC5883L_CHIP_ID_B 0x0B +#define HMC5883L_CHIP_ID_C 0x0C /* Bit values for the STATUS register */ const uint8_t HMC5883L_STATUS_RDY = 0b00000001; @@ -104,25 +104,26 @@ bool HMC5883L_SetConfig() { uint8_t cfgB = (( (HMC5883L->gain ) << HMC5883L_CONFIG_B_GAIN_SHIFT ) & HMC5883L_CONFIG_B_GAIN_MASK ); - AddLog(LOG_LEVEL_INFO,"HMC5883L: CONFIG A: %#X CONFIG B: %#X MODE: %#X",cfgA, cfgB, HMC5883L->mode); + AddLog(LOG_LEVEL_INFO,"HMC: CONFIG A: %#X CONFIG B: %#X MODE: %#X", cfgA, cfgB, HMC5883L->mode); - if (I2cWrite8(HMC5883L_ADDR, HMC5883L_CONFIG_A, cfgA ) == false) { - AddLog(LOG_LEVEL_INFO,"HMC5883L: Setting CONFIG A failed."); - return false; + if (I2cWrite8(HMC5883L_ADDR, HMC5883L_CONFIG_A, cfgA ) == false) { + AddLog(LOG_LEVEL_INFO,"HMC: Setting CONFIG A failed"); + return false; } - if (I2cWrite8(HMC5883L_ADDR, HMC5883L_CONFIG_B, cfgB ) == false) { - AddLog(LOG_LEVEL_INFO,"HMC5883L: Setting CONFIG B failed."); - return false; + if (I2cWrite8(HMC5883L_ADDR, HMC5883L_CONFIG_B, cfgB ) == false) { + AddLog(LOG_LEVEL_INFO,"HMC: Setting CONFIG B failed"); + return false; } if (HMC5883L->mode == HMC5883L_MODE_CONT) { - if (I2cWrite8(HMC5883L_ADDR, HMC5883L_MODE, HMC5883L_MODE_CONT ) == false) - { AddLog(LOG_LEVEL_INFO,"HMC5883L: Setting continuous mode failed."); - return false; } + if (I2cWrite8(HMC5883L_ADDR, HMC5883L_MODE, HMC5883L_MODE_CONT ) == false) { + AddLog(LOG_LEVEL_INFO,"HMC: Setting continuous mode failed"); + return false; + } } return true; } -// Initialize the device +// Initialize the device void HMC5883L_Init() { if (!I2cSetDevice(HMC5883L_ADDR)) { return; } @@ -142,11 +143,13 @@ void HMC5883L_Init() { //Read the magnetic data void HMC5883L_ReadData(void) { if (HMC5883L->mode == HMC5883L_MODE_SINGLE) { - if (I2cWrite8(HMC5883L_ADDR, HMC5883L_MODE, HMC5883L_MODE_SINGLE ) == false) - { return; } + if (I2cWrite8(HMC5883L_ADDR, HMC5883L_MODE, HMC5883L_MODE_SINGLE ) == false) { return; } + } + + uint32_t timeout = millis() + 20; + while (!(I2cRead8(HMC5883L_ADDR, HMC5883L_STATUS) & HMC5883L_STATUS_RDY)) { + if (millis() > timeout) { return; } // Chip not yet ready, next round try again } - - while (!(I2cRead8(HMC5883L_ADDR, HMC5883L_STATUS) & HMC5883L_STATUS_RDY)) { } // Chip not yet ready, next round try again HMC5883L->MX = I2cReadS16(HMC5883L_ADDR, HMC5883L_X_MSB); // Select starting with MSB register HMC5883L->MY = I2cReadS16(HMC5883L_ADDR, HMC5883L_Y_MSB); @@ -184,32 +187,32 @@ bool HMC5883L_Command() { bool commandKnown = false; char cmd[20]; char ss2[20]; - + subStr(cmd, XdrvMailbox.data, ",", 1); int8_t value = atoi(subStr(ss2, XdrvMailbox.data, ",", 2)); - if (strcmp(cmd,"GAIN")) { + if (strcmp(cmd,"GAIN")) { HMC5883L->gain = value; - commandKnown = true; - } - if (strcmp(cmd,"AVG")) { - HMC5883L->average_mode = value; commandKnown = true; } - if (strcmp(cmd,"RATE")) { - HMC5883L->data_rate = value; + if (strcmp(cmd,"AVG")) { + HMC5883L->average_mode = value; commandKnown = true; } - if (strcmp(cmd,"MMODE")) { - HMC5883L->measurement_mode = value; + if (strcmp(cmd,"RATE")) { + HMC5883L->data_rate = value; commandKnown = true; } - - //AddLog(LOG_LEVEL_INFO,PSTR(D_LOG_I2C "HMC5883L: cmd: (%s) value: %d cmdKnown: %d"), cmd, value,commandKnown); + if (strcmp(cmd,"MMODE")) { + HMC5883L->measurement_mode = value; + commandKnown = true; + } + + //AddLog(LOG_LEVEL_INFO,PSTR(D_LOG_I2C "HMC: cmd: (%s) value: %d cmdKnown: %d"), cmd, value,commandKnown); if (commandKnown == false) { return false; } - - AddLog(LOG_LEVEL_INFO,PSTR(D_LOG_I2C "HMC5883L: Reconfiguring.")); + + AddLog(LOG_LEVEL_INFO,PSTR(D_LOG_I2C "HMC: Reconfiguring.")); return HMC5883L_SetConfig(); } @@ -227,8 +230,9 @@ bool Xsns101(uint32_t function) { else if (HMC5883L != nullptr) { switch (function) { case FUNC_COMMAND_SENSOR: - if (XSNS_101 == XdrvMailbox.index) - return HMC5883L_Command(); // Return true on success + if (XSNS_101 == XdrvMailbox.index) { + return HMC5883L_Command(); // Return true on success + } break; case FUNC_JSON_APPEND: HMC5883L_Show(1); diff --git a/tools/decode-status.py b/tools/decode-status.py index 8a8324025..5780173b3 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -288,7 +288,7 @@ a_features = [[ ],[ "USE_SGP40","USE_LUXV30B","USE_CANSNIFFER","USE_QMC5883L", "USE_MODBUS_ENERGY","USE_SHELLY_PRO","USE_DALI","USE_BP1658CJ", - "USE_DINGTIAN_RELAY","","","", + "USE_DINGTIAN_RELAY","USE_HMC5883L","","", "","","","", "","","","", "","","","", From f7fa09ebbef2728ab7fb3c56b01ce38b4d6eaadc Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Tue, 15 Nov 2022 23:28:34 +0100 Subject: [PATCH 10/21] Berry add ``udp->stop()`` method --- CHANGELOG.md | 1 + lib/libesp32/berry_tasmota/src/be_udp_lib.cpp | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c9543344..6d54b3036 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file. - WS2812 and Light Art-Net DMX control over UDP port 6454 (#17059) - Command ``SwitchMode 16`` sending only MQTT message on inverted switch change (#17028) - Support for HMC5883L 3-Axis Digital Compass sensor by Andreas Achtzehn (#17069) +- Berry add ``udp->stop()`` method ### Breaking Changed diff --git a/lib/libesp32/berry_tasmota/src/be_udp_lib.cpp b/lib/libesp32/berry_tasmota/src/be_udp_lib.cpp index 4186673c5..489be4005 100644 --- a/lib/libesp32/berry_tasmota/src/be_udp_lib.cpp +++ b/lib/libesp32/berry_tasmota/src/be_udp_lib.cpp @@ -37,7 +37,7 @@ extern "C" { return be_call_c_func(vm, (void*) &be_udp_deinit_ntv, "=.p", ""); } - // udp.begin(address:string, port:int) -> nil + // udp.begin(address:string, port:int) -> bool int32_t be_udp_begin_ntv(WiFiUDP *udp, const char *host, int32_t port) { IPAddress addr((uint32_t)0); // if no host or host is "" then we defult to INADDR_ANY (0.0.0.0) @@ -50,6 +50,14 @@ extern "C" { return be_call_c_func(vm, (void*) &be_udp_begin_ntv, "b", ".si"); } + // udp.stop() -> nil + void be_udp_stop_ntv(WiFiUDP *udp) { + udp->stop(); + } + int32_t be_udp_stop(struct bvm *vm) { + return be_call_c_func(vm, (void*) &be_udp_stop_ntv, "b", "."); + } + // udp.begin_multicast(address:string, port:int) -> nil int32_t be_udp_begin_mcast_ntv(WiFiUDP *udp, const char *host, int32_t port) { IPAddress addr((uint32_t)0); @@ -159,6 +167,7 @@ class be_class_udp (scope: global, name: udp) { begin, func(be_udp_begin) begin_multicast, func(be_udp_begin_mcast) read, func(be_udp_read) + stop, func(be_udp_stop) } @const_object_info_end */ From 0849b6e5ef7c0c9864e23dfe4561842dec6f7712 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Wed, 16 Nov 2022 08:33:13 +0100 Subject: [PATCH 11/21] Rename to udp.close() --- CHANGELOG.md | 2 +- lib/libesp32/berry_tasmota/src/be_udp_lib.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d54b3036..dcf38e790 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ All notable changes to this project will be documented in this file. - WS2812 and Light Art-Net DMX control over UDP port 6454 (#17059) - Command ``SwitchMode 16`` sending only MQTT message on inverted switch change (#17028) - Support for HMC5883L 3-Axis Digital Compass sensor by Andreas Achtzehn (#17069) -- Berry add ``udp->stop()`` method +- Berry add ``udp->close()`` method (#17094) ### Breaking Changed diff --git a/lib/libesp32/berry_tasmota/src/be_udp_lib.cpp b/lib/libesp32/berry_tasmota/src/be_udp_lib.cpp index 489be4005..27a97189f 100644 --- a/lib/libesp32/berry_tasmota/src/be_udp_lib.cpp +++ b/lib/libesp32/berry_tasmota/src/be_udp_lib.cpp @@ -167,7 +167,7 @@ class be_class_udp (scope: global, name: udp) { begin, func(be_udp_begin) begin_multicast, func(be_udp_begin_mcast) read, func(be_udp_read) - stop, func(be_udp_stop) + close, func(be_udp_stop) } @const_object_info_end */ From b92d5ab12c80d2ff71c490623f6de7239d39d2a5 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 16 Nov 2022 10:47:55 +0100 Subject: [PATCH 12/21] Fix ArtNet compilation on ESP32 --- .../tasmota_xdrv_driver/xdrv_04_light_artnet.ino | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_04_light_artnet.ino b/tasmota/tasmota_xdrv_driver/xdrv_04_light_artnet.ino index 4ce80f126..a1ea8328d 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_04_light_artnet.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_04_light_artnet.ino @@ -145,9 +145,9 @@ void ArtNetProcessPacket(uint8_t * buf, size_t len) { if (artnet_conf.matrix) { // Ws2812 led strip - size_t pix_size = Ws2812StripGetPixelSize(); + size_t pix_size = Ws2812StripGetPixelSize(); datalen = datalen - (datalen % pix_size); - + if (artnet_conf.alt && (row % 2)) { for (int32_t i = idx, j = idx + datalen - pix_size; i < j; i += pix_size, j -= pix_size) { for (int32_t k = 0; k < pix_size; k++) { @@ -223,9 +223,9 @@ void ArtNetLoop(void) packet_len = ArtNetUdp->parsePacket(); packet_ready = (packet_len > 0); while (packet_ready) { - uint8_t packet_buffer[UDP_BUFFER_SIZE]; // buffer to hold incoming UDP/SSDP packet + uint8_t packet_buffer[WS2812_ARTNET_UDP_BUFFER_SIZE]; // buffer to hold incoming UDP/SSDP packet - packet_len = ArtNetUdp->read(packet_buffer, UDP_BUFFER_SIZE); + packet_len = ArtNetUdp->read(packet_buffer, WS2812_ARTNET_UDP_BUFFER_SIZE); ArtNetUdp->flush(); // Finish reading the current packet #endif // AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("UDP: Packet %*_H (%d)"), 32, packet_buffer, packet_len); @@ -237,7 +237,7 @@ void ArtNetLoop(void) packet_ready = ArtNetUdp->next(); if (!packet_ready) { // if no more incoming packet, still wait for 20 microseconds - delay(1); // delayMicroseconds seems broken, need to + delay(1); // delayMicroseconds seems broken, need to packet_ready = ArtNetUdp->next(); } #else @@ -291,13 +291,13 @@ void CmndArtNetConfig() { ArtNetStop(); } ArtNetLoadSettings(); - + TrimSpace(XdrvMailbox.data); if (strlen(XdrvMailbox.data) > 0) { JsonParser parser(XdrvMailbox.data); JsonParserObject root = parser.getRootObject(); if (!root) { ResponseCmndChar_P(PSTR(D_JSON_INVALID_JSON)); return; } - + artnet_conf.rows = root.getUInt(PSTR("Rows"), artnet_conf.rows); artnet_conf.cols = root.getUInt(PSTR("Cols"), artnet_conf.cols); artnet_conf.offs = root.getUInt(PSTR("Offset"), artnet_conf.offs); From 229c2cce06cf2572039f4fa23f642cc86cf70031 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 16 Nov 2022 10:55:56 +0100 Subject: [PATCH 13/21] Revert Art-Net to ArtNet --- CHANGELOG.md | 8 ++++---- RELEASENOTES.md | 4 ++-- tasmota/my_user_config.h | 2 +- tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dcf38e790..a24b2651d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ All notable changes to this project will be documented in this file. - Support for Plantower PMSx003T AQI models with temperature and humidity (#16971) - Support for Dingtian x595/x165 shift register based relay boards by Barbudor (#17032) - New ``FUNC_NETWORK_UP`` and ``FUNC_NETWORK_DOWN`` events -- WS2812 and Light Art-Net DMX control over UDP port 6454 (#17059) +- WS2812 and Light ArtNet DMX control over UDP port 6454 (#17059) - Command ``SwitchMode 16`` sending only MQTT message on inverted switch change (#17028) - Support for HMC5883L 3-Axis Digital Compass sensor by Andreas Achtzehn (#17069) - Berry add ``udp->close()`` method (#17094) @@ -44,9 +44,9 @@ All notable changes to this project will be documented in this file. - Support for two phase power calibration using commands ``PowerSet2``, ``VoltageSet2`` and ``CurrentSet2`` - Support for NTAG2xx tags read and write on PN532 NFC reader (#16939) - Berry ``bytes().reverse()`` method (#16977) -- ESP32 Support for DMX Art-Net Led matrix animations (#16984) +- ESP32 Support for DMX ArtNet Led matrix animations (#16984) - Command ``SetOption47 1..255`` to delay power on relay state in seconds reducing power surge. ``SO47 1`` delays until network connected. ``SO47 2`` delays until mqtt connected -- ESP32 DMX Art-Net optimization to avoid any object allocation and avoid garbage collector pauses +- ESP32 DMX ArtNet optimization to avoid any object allocation and avoid garbage collector pauses - Berry add ``dyn`` class ### Changed @@ -69,7 +69,7 @@ All notable changes to this project will be documented in this file. - Berry add `bytes().setbytes()` (#16892) - Support for Shelly Pro 1/1PM and 2/2PM (#16773) - Add Zigbee router firmware for Sonoff ZBBridgePro (#16900) -- Prepare for DMX Art-Net support on ESP32 +- Prepare for DMX ArtNet support on ESP32 ### Changed - DS18x20 ``DS18Alias`` to ``DS18Sens`` (#16833) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 06b3968aa..94d13f0d6 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -121,11 +121,11 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Support for BP1658CJ RGBCW led bulbs like Orein OS0100411267 by Cossid [#17011](https://github.com/arendst/Tasmota/issues/17011) - Support for Dingtian x595 shift register based relay boards by Barbudor [#17032](https://github.com/arendst/Tasmota/issues/17032) - Support for HMC5883L 3-Axis Digital Compass sensor by Andreas Achtzehn [#17069](https://github.com/arendst/Tasmota/issues/17069) -- WS2812 and Light Art-Net DMX control over UDP port 6454 [#17059](https://github.com/arendst/Tasmota/issues/17059) +- WS2812 and Light ArtNet DMX control over UDP port 6454 [#17059](https://github.com/arendst/Tasmota/issues/17059) - Berry ``bytes().setbytes()`` method [#16892](https://github.com/arendst/Tasmota/issues/16892) - Berry ``bytes().reverse()`` method [#16977](https://github.com/arendst/Tasmota/issues/16977) - Zigbee router firmware for Sonoff ZBBridgePro [#16900](https://github.com/arendst/Tasmota/issues/16900) -- ESP32 Support for DMX Art-Net Led matrix animations [#16984](https://github.com/arendst/Tasmota/issues/16984) +- ESP32 Support for DMX ArtNet Led matrix animations [#16984](https://github.com/arendst/Tasmota/issues/16984) ### Breaking Changed - Redesign distance sensors VL53LXX, TOF10120, HRXL and DYP to use cm instead of mm [#17021](https://github.com/arendst/Tasmota/issues/17021) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 58e6bb30b..725c55d9b 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -571,7 +571,7 @@ #define USE_DGR_LIGHT_SEQUENCE // Add support for device group light sequencing (requires USE_DEVICE_GROUPS) (+0k2 code) //#define USE_LSC_MCSL // Add support for GPE Multi color smart light as sold by Action in the Netherlands (+1k1 code) -// #define USE_LIGHT_ARTNET // Add support for DMX/Art-Net via UDP on port 6454 (+3.5k code) +// #define USE_LIGHT_ARTNET // Add support for DMX/ArtNet via UDP on port 6454 (+3.5k code) #define USE_LIGHT_ARTNET_MCAST 239,255,25,54 // Multicast address used to listen: 239.255.25.24 // -- Counter input ------------------------------- diff --git a/tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino b/tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino index 9d6e36f15..c0f7ff7e5 100644 --- a/tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino +++ b/tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino @@ -785,7 +785,7 @@ void CmndWidth(void) } /*********************************************************************************************\ - * Internal calls for Art-Net + * Internal calls for ArtNet \*********************************************************************************************/ // check is the Neopixel strip is configured bool Ws2812StripConfigured(void) { From 0b18c60ba244fb7d3bd57b39bbe5eb0e49532750 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Wed, 16 Nov 2022 13:43:36 +0100 Subject: [PATCH 14/21] Zigbee ZbProbe for unknown devices and doc helper --- tasmota/include/i18n.h | 1 + .../xdrv_23_zigbee_A_impl.ino | 61 ++++++++++++++++++- 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/tasmota/include/i18n.h b/tasmota/include/i18n.h index 85445545b..7896e761b 100644 --- a/tasmota/include/i18n.h +++ b/tasmota/include/i18n.h @@ -689,6 +689,7 @@ #define D_CMND_ZIGBEE_LOAD "Load" #define D_CMND_ZIGBEE_LOADDUMP "LoadDump" #define D_CMND_ZIGBEE_UNLOAD "Unload" +#define D_CMND_ZIGBEE_ATTRDUMP "AttrDump" // Commands xdrv_25_A4988_Stepper.ino #define D_CMND_MOTOR "MOTOR" diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino index 4f44a8115..8fb559d34 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino @@ -21,6 +21,8 @@ #define XDRV_23 23 +#define ZIGBEE_DOC // enable special functions used for Zigbee documentation generation - generally not useful + #include "UnishoxStrings.h" const char kZbCommands[] PROGMEM = D_PRFX_ZB "|" // prefix @@ -40,7 +42,10 @@ const char kZbCommands[] PROGMEM = D_PRFX_ZB "|" // prefix D_CMND_ZIGBEE_LIGHT "|" D_CMND_ZIGBEE_OCCUPANCY "|" D_CMND_ZIGBEE_RESTORE "|" D_CMND_ZIGBEE_BIND_STATE "|" D_CMND_ZIGBEE_MAP "|" D_CMND_ZIGBEE_LEAVE "|" D_CMND_ZIGBEE_CONFIG "|" D_CMND_ZIGBEE_DATA "|" D_CMND_ZIGBEE_SCAN "|" D_CMND_ZIGBEE_ENROLL "|" D_CMND_ZIGBEE_CIE "|" - D_CMND_ZIGBEE_LOAD "|" D_CMND_ZIGBEE_UNLOAD "|" D_CMND_ZIGBEE_LOADDUMP + D_CMND_ZIGBEE_LOAD "|" D_CMND_ZIGBEE_UNLOAD "|" D_CMND_ZIGBEE_LOADDUMP "|" +#ifdef ZIGBEE_DOC + D_CMND_ZIGBEE_ATTRDUMP +#endif // ZIGBEE_DOC ; SO_SYNONYMS(kZbSynonyms, @@ -64,6 +69,9 @@ void (* const ZigbeeCommand[])(void) PROGMEM = { &CmndZbConfig, &CmndZbData, &CmndZbScan, &CmndZbenroll, &CmndZbcie, &CmndZbLoad, &CmndZbUnload, &CmndZbLoadDump, +#ifdef ZIGBEE_DOC + &CmndZbAttrDump, +#endif // ZIGBEE_DOC }; /********************************************************************************************/ @@ -1119,8 +1127,16 @@ void CmndZbProbe(void) { // void CmndZbProbeOrPing(boolean probe) { if (zigbee.init_phase) { ResponseCmndChar_P(PSTR(D_ZIGBEE_NOT_STARTED)); return; } - uint16_t shortaddr = zigbee_devices.parseDeviceFromName(XdrvMailbox.data, nullptr, nullptr, XdrvMailbox.payload).shortaddr; - if (BAD_SHORTADDR == shortaddr) { ResponseCmndChar_P(PSTR(D_ZIGBEE_UNKNOWN_DEVICE)); return; } + uint16_t parsed_shortaddr = BAD_SHORTADDR; + uint16_t shortaddr = zigbee_devices.parseDeviceFromName(XdrvMailbox.data, &parsed_shortaddr, nullptr, XdrvMailbox.payload).shortaddr; + if (BAD_SHORTADDR == shortaddr) { + if (BAD_SHORTADDR == parsed_shortaddr) { // second chance if we provided 0x.... address for a device not in the list + ResponseCmndChar_P(PSTR(D_ZIGBEE_UNKNOWN_DEVICE)); + return; + } else { + shortaddr = parsed_shortaddr; + } + } // set a timer for Reachable - 2s default value zigbee_devices.setTimer(shortaddr, 0, Z_CAT_REACHABILITY_TIMEOUT, 0, 0, Z_CAT_REACHABILITY, 0 /* value */, &Z_Unreachable); @@ -1417,6 +1433,45 @@ void CmndZbLoadDump(void) { ResponseCmndDone(); } +#ifdef ZIGBEE_DOC +// Command `ZbAttrDump` +// Dump all the attribute aliases for documentation purpose +// +void CmndZbAttrDump(void) { + // does not require Zigbee to actually run + AddLog(LOG_LEVEL_INFO, PSTR("Alias|Cluster|Attribute|Type")); + AddLog(LOG_LEVEL_INFO, PSTR(":---|:---|:---|:---")); + for (uint32_t i = 0; i < nitems(Z_PostProcess); i++) { + const Z_AttributeConverter *converter = &Z_PostProcess[i]; + if (0 == pgm_read_word(&converter->name_offset)) { continue; } + const char * alias = Z_strings + pgm_read_word(&converter->name_offset); + uint16_t cluster = CxToCluster(pgm_read_byte(&converter->cluster_short)); + uint16_t attrid = pgm_read_word(&converter->attribute); + uint8_t attrtype = pgm_read_byte(&converter->type); + char type_name[16]; + Z_getTypeByNumber(type_name, sizeof(type_name), attrtype); + AddLog(LOG_LEVEL_INFO, PSTR("`%s`|0x%04X|0x%04X|%%%02X - %s"), alias, cluster, attrid, attrtype, type_name); + } + AddLog(LOG_LEVEL_INFO, PSTR("")); + + AddLog(LOG_LEVEL_INFO, PSTR("Alias|Cluster|Command")); + AddLog(LOG_LEVEL_INFO, PSTR(":---|:---|:---")); + for (uint32_t i = 0; i < sizeof(Z_Commands) / sizeof(Z_Commands[0]); i++) { + const Z_CommandConverter *conv = &Z_Commands[i]; + const char * alias = Z_strings + pgm_read_word(&conv->tasmota_cmd_offset); + uint16_t cluster = pgm_read_word(&conv->cluster); + uint8_t direction = pgm_read_byte(&conv->direction); + uint8_t cmd = pgm_read_byte(&conv->cmd); + if (direction & 0x01) { // only coordinator to device + AddLog(LOG_LEVEL_INFO, PSTR("`%s`|0x%04X|0x%02X"), alias, cluster, cmd); + } + } + AddLog(LOG_LEVEL_INFO, PSTR("")); + + ResponseCmndDone(); +} +#endif // ZIGBEE_DOC + // // Command `ZbScan` // Run an energy scan From a26e634408208544a43b3c92dd5e1fb4c8ce9c2e Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Wed, 16 Nov 2022 13:44:06 +0100 Subject: [PATCH 15/21] Doc is off by default --- tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino index 8fb559d34..c0b198523 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino @@ -21,7 +21,7 @@ #define XDRV_23 23 -#define ZIGBEE_DOC // enable special functions used for Zigbee documentation generation - generally not useful +// #define ZIGBEE_DOC // enable special functions used for Zigbee documentation generation - generally not useful #include "UnishoxStrings.h" @@ -1467,7 +1467,7 @@ void CmndZbAttrDump(void) { } } AddLog(LOG_LEVEL_INFO, PSTR("")); - + ResponseCmndDone(); } #endif // ZIGBEE_DOC From 56e06b7fc545f96757d2bd96c8114dc239c4bbf0 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Wed, 16 Nov 2022 13:45:59 +0100 Subject: [PATCH 16/21] Fix command name bug --- tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino index c0b198523..46f3b7023 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino @@ -42,9 +42,9 @@ const char kZbCommands[] PROGMEM = D_PRFX_ZB "|" // prefix D_CMND_ZIGBEE_LIGHT "|" D_CMND_ZIGBEE_OCCUPANCY "|" D_CMND_ZIGBEE_RESTORE "|" D_CMND_ZIGBEE_BIND_STATE "|" D_CMND_ZIGBEE_MAP "|" D_CMND_ZIGBEE_LEAVE "|" D_CMND_ZIGBEE_CONFIG "|" D_CMND_ZIGBEE_DATA "|" D_CMND_ZIGBEE_SCAN "|" D_CMND_ZIGBEE_ENROLL "|" D_CMND_ZIGBEE_CIE "|" - D_CMND_ZIGBEE_LOAD "|" D_CMND_ZIGBEE_UNLOAD "|" D_CMND_ZIGBEE_LOADDUMP "|" + D_CMND_ZIGBEE_LOAD "|" D_CMND_ZIGBEE_UNLOAD "|" D_CMND_ZIGBEE_LOADDUMP #ifdef ZIGBEE_DOC - D_CMND_ZIGBEE_ATTRDUMP + "|" D_CMND_ZIGBEE_ATTRDUMP #endif // ZIGBEE_DOC ; From 99378308f7a0ffc5b3db9dc8c43ac5e053e2ee2f Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 16 Nov 2022 14:26:49 +0100 Subject: [PATCH 17/21] Update changelogs --- CHANGELOG.md | 2 ++ RELEASENOTES.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a24b2651d..c9c253068 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ All notable changes to this project will be documented in this file. - Command ``SwitchMode 16`` sending only MQTT message on inverted switch change (#17028) - Support for HMC5883L 3-Axis Digital Compass sensor by Andreas Achtzehn (#17069) - Berry add ``udp->close()`` method (#17094) +- Command ``RgxClients`` for range extender clients list (#17048) +- Command ``RgxPort [tcp|udp], gateway_port, client_mac, client_port`` for range extender port forwardings (#17092) ### Breaking Changed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 94d13f0d6..72288e298 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -110,6 +110,8 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo ## Changelog v12.2.0.4 ### Added - Command ``SetOption47 1..255`` to delay power on relay state in seconds reducing power surge. ``SO47 1`` delays until network connected. ``SO47 2`` delays until mqtt connected +- Command ``RgxClients`` for range extender clients list [#17048](https://github.com/arendst/Tasmota/issues/17048) +- Command ``RgxPort [tcp|udp], gateway_port, client_mac, client_port`` for range extender port forwardings [#17092](https://github.com/arendst/Tasmota/issues/17092) - Command ``SwitchMode 16`` sending only MQTT message on inverted switch change [#17028](https://github.com/arendst/Tasmota/issues/17028) - Command NeoPool ``NPFiltration 2`` toggle [#16859](https://github.com/arendst/Tasmota/issues/16859) - Support for two phase power calibration using commands ``PowerSet2``, ``VoltageSet2`` and ``CurrentSet2`` From a0e7191d4e653951628767e10bc4bcc2536a608f Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 16 Nov 2022 16:15:31 +0100 Subject: [PATCH 18/21] Add command ArtNet - Fix ArtNetStop --- tasmota/include/i18n.h | 1 + tasmota/tasmota_xdrv_driver/xdrv_04_light.ino | 6 +++--- .../xdrv_04_light_artnet.ino | 17 +++++++++++++++++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/tasmota/include/i18n.h b/tasmota/include/i18n.h index 7896e761b..8c8e3e4b5 100644 --- a/tasmota/include/i18n.h +++ b/tasmota/include/i18n.h @@ -502,6 +502,7 @@ #define D_CMND_PALETTE "Palette" #define D_CMND_PIXELS "Pixels" #define D_CMND_STEPPIXELS "StepPixels" +#define D_CMND_ARTNET "ArtNet" #define D_CMND_ARTNET_START "ArtNetStart" #define D_CMND_ARTNET_STOP "ArtNetStop" #define D_CMND_ARTNET_CONFIG "ArtNetConfig" diff --git a/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino b/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino index e6cafd584..ef457a580 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino @@ -151,7 +151,7 @@ const char kLightCommands[] PROGMEM = "|" // No prefix "|" D_CMND_SEQUENCE_OFFSET #endif // USE_DGR_LIGHT_SEQUENCE #ifdef USE_LIGHT_ARTNET - "|" D_CMND_ARTNET_START "|" D_CMND_ARTNET_STOP "|" D_CMND_ARTNET_CONFIG + "|" D_CMND_ARTNET "|" D_CMND_ARTNET_START "|" D_CMND_ARTNET_STOP "|" D_CMND_ARTNET_CONFIG #endif "|UNDOCA" ; @@ -175,7 +175,7 @@ void (* const LightCommand[])(void) PROGMEM = { &CmndSequenceOffset, #endif // USE_DGR_LIGHT_SEQUENCE #ifdef USE_LIGHT_ARTNET - &CmndArtNetStart, &CmndArtNetStop, &CmndArtNetConfig, + &CmndArtNet, &CmndArtNetStart, &CmndArtNetStop, &CmndArtNetConfig, #endif &CmndUndocA }; @@ -1962,7 +1962,7 @@ void LightAnimate(void) Light.fade_start_10[channel_ct] = Light.fade_end_10[channel_ct]; } } - + Light.fade_running = true; Light.fade_duration = 0; // set the value to zero to force a recompute Light.fade_start = 0; diff --git a/tasmota/tasmota_xdrv_driver/xdrv_04_light_artnet.ino b/tasmota/tasmota_xdrv_driver/xdrv_04_light_artnet.ino index a1ea8328d..8b5218c12 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_04_light_artnet.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_04_light_artnet.ino @@ -413,6 +413,7 @@ void ArtNetStop(void) { void CmndArtNetStop(void) { ArtNetStop(); + Settings->flag6.artnet_autorun = false; // restore default scheme Settings->light_scheme = LS_POWER; // Restore sleep value @@ -421,5 +422,21 @@ void CmndArtNetStop(void) { ResponseCmndDone(); } +void CmndArtNet(void) { + if (0 == XdrvMailbox.payload) { + ArtNetStop(); + Settings->flag6.artnet_autorun = false; // SetOption148 - (Light) start DMX ArtNet at boot, listen to UDP port as soon as network is up +// Settings->light_scheme = LS_POWER; // restore default scheme + TasmotaGlobal.sleep = Settings->sleep; // Restore sleep value + Light.update = true; // Restore old color + } + if (1 == XdrvMailbox.payload) { + if (!ArtNetStart()) { + Settings->flag6.artnet_autorun = false; // SetOption148 - (Light) start DMX ArtNet at boot, listen to UDP port as soon as network is up + } + } + ResponseCmndStateText(artnet_udp_connected & Settings->flag6.artnet_autorun); +} + #endif // USE_LIGHT_ARTNET #endif // USE_LIGHT From f044ccdeec1a9995c4442a69b3cdeb9a2faed4c5 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 16 Nov 2022 16:26:12 +0100 Subject: [PATCH 19/21] Remove commands ArtNetStop and ArtNetStart --- tasmota/include/i18n.h | 2 -- tasmota/tasmota_xdrv_driver/xdrv_04_light.ino | 4 ++-- .../xdrv_04_light_artnet.ino | 23 ------------------- 3 files changed, 2 insertions(+), 27 deletions(-) diff --git a/tasmota/include/i18n.h b/tasmota/include/i18n.h index 8c8e3e4b5..a46c9d1a1 100644 --- a/tasmota/include/i18n.h +++ b/tasmota/include/i18n.h @@ -503,8 +503,6 @@ #define D_CMND_PIXELS "Pixels" #define D_CMND_STEPPIXELS "StepPixels" #define D_CMND_ARTNET "ArtNet" -#define D_CMND_ARTNET_START "ArtNetStart" -#define D_CMND_ARTNET_STOP "ArtNetStop" #define D_CMND_ARTNET_CONFIG "ArtNetConfig" #define D_SO_ARTNET_AUTORUN "ArtNetAutorun" #define D_CMND_RGBWWTABLE "RGBWWTable" diff --git a/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino b/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino index ef457a580..c42281b3d 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino @@ -151,7 +151,7 @@ const char kLightCommands[] PROGMEM = "|" // No prefix "|" D_CMND_SEQUENCE_OFFSET #endif // USE_DGR_LIGHT_SEQUENCE #ifdef USE_LIGHT_ARTNET - "|" D_CMND_ARTNET "|" D_CMND_ARTNET_START "|" D_CMND_ARTNET_STOP "|" D_CMND_ARTNET_CONFIG + "|" D_CMND_ARTNET "|" D_CMND_ARTNET_CONFIG #endif "|UNDOCA" ; @@ -175,7 +175,7 @@ void (* const LightCommand[])(void) PROGMEM = { &CmndSequenceOffset, #endif // USE_DGR_LIGHT_SEQUENCE #ifdef USE_LIGHT_ARTNET - &CmndArtNet, &CmndArtNetStart, &CmndArtNetStop, &CmndArtNetConfig, + &CmndArtNet, &CmndArtNetConfig, #endif &CmndUndocA }; diff --git a/tasmota/tasmota_xdrv_driver/xdrv_04_light_artnet.ino b/tasmota/tasmota_xdrv_driver/xdrv_04_light_artnet.ino index 8b5218c12..701374bd1 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_04_light_artnet.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_04_light_artnet.ino @@ -381,18 +381,6 @@ bool ArtNetStart(void) { return true; } -// -// Command `ArtNetStart` -// Params: XXX -// -void CmndArtNetStart(void) { - if (ArtNetStart()) { - ResponseCmndDone(); - } else { - ResponseCmndError(); - } -} - // Stop the ArtNet UDP flow and disconnect server void ArtNetStop(void) { artnet_udp_connected = false; @@ -411,17 +399,6 @@ void ArtNetStop(void) { } } -void CmndArtNetStop(void) { - ArtNetStop(); - Settings->flag6.artnet_autorun = false; - // restore default scheme - Settings->light_scheme = LS_POWER; - // Restore sleep value - TasmotaGlobal.sleep = Settings->sleep; - // OK - ResponseCmndDone(); -} - void CmndArtNet(void) { if (0 == XdrvMailbox.payload) { ArtNetStop(); From 04b6034909b15dd137a2df317e00b64c0e254b3f Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 16 Nov 2022 16:43:25 +0100 Subject: [PATCH 20/21] action-gh-release@v1.2 fix deprecation warning "Node12" --- .github/workflows/Tasmota_build_master.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index e538a623f..40f3baec2 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -187,7 +187,7 @@ jobs: - name: Display structure of downloaded files run: ls -R ./mv_firmware/ - name: Release - uses: jason2866/action-gh-release@v1.1 + uses: jason2866/action-gh-release@v1.2 #if: startsWith(github.ref, 'refs/tags/') with: tag_name: ${{ github.run_number }} From 5f0b92568ee88e77fd5c0f6b0a5dc6cb1c3769eb Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Wed, 16 Nov 2022 18:41:07 +0100 Subject: [PATCH 21/21] Add ArtNet to Tasmota32 precompiled --- tasmota/include/tasmota_configurations_ESP32.h | 1 + 1 file changed, 1 insertion(+) diff --git a/tasmota/include/tasmota_configurations_ESP32.h b/tasmota/include/tasmota_configurations_ESP32.h index 07f178f44..c9754c710 100644 --- a/tasmota/include/tasmota_configurations_ESP32.h +++ b/tasmota/include/tasmota_configurations_ESP32.h @@ -559,6 +559,7 @@ #undef USE_SHELLY_DIMMER // Disable support for Shelly Dimmer (+3k code) #define USE_LIGHT_PALETTE // Add support for color palette (+0k9 code) +#define USE_LIGHT_ARTNET // Add support for DMX/ArtNet via UDP on port 6454 (+3.5k code) #define USE_DS18x20 // Add support for DS18x20 sensors with id sort, single scan and read retry (+1k3 code)