diff --git a/sonoff/xdrv_16_tuyadimmer.ino b/sonoff/xdrv_16_tuyadimmer.ino index 9f1b7289b..e09b15a39 100644 --- a/sonoff/xdrv_16_tuyadimmer.ino +++ b/sonoff/xdrv_16_tuyadimmer.ino @@ -62,7 +62,8 @@ int tuya_byte_counter = 0; // Index in serial receive buffer * Internal Functions \*********************************************************************************************/ -void TuyaSendCmd(uint8_t cmd, uint8_t payload[] = nullptr, uint16_t payload_len = 0){ +void TuyaSendCmd(uint8_t cmd, uint8_t payload[] = nullptr, uint16_t payload_len = 0) +{ uint8_t checksum = (0xFF + cmd + (payload_len >> 8) + (payload_len & 0xFF)); TuyaSerial->write(0x55); // Tuya header 55AA TuyaSerial->write(0xAA); @@ -70,7 +71,7 @@ void TuyaSendCmd(uint8_t cmd, uint8_t payload[] = nullptr, uint16_t payload_len TuyaSerial->write(cmd); // Tuya command TuyaSerial->write(payload_len >> 8); // following data length (Hi) TuyaSerial->write(payload_len & 0xFF); // following data length (Lo) - snprintf_P(log_data, sizeof(log_data), PSTR("TYA: TX Packet: \"55aa00%02x%02x%02x"), cmd, payload_len >> 8, payload_len & 0xFF); + snprintf_P(log_data, sizeof(log_data), PSTR("TYA: Send \"55aa00%02x%02x%02x"), cmd, payload_len >> 8, payload_len & 0xFF); for (uint32_t i = 0; i < payload_len; ++i) { TuyaSerial->write(payload[i]); checksum += payload[i]; @@ -82,12 +83,13 @@ void TuyaSendCmd(uint8_t cmd, uint8_t payload[] = nullptr, uint16_t payload_len AddLog(LOG_LEVEL_DEBUG); } -void TuyaSendState(uint8_t id, uint8_t type, uint8_t* value){ +void TuyaSendState(uint8_t id, uint8_t type, uint8_t* value) +{ uint16_t payload_len = 4; uint8_t payload_buffer[8]; payload_buffer[0] = id; payload_buffer[1] = type; - switch(type){ + switch (type) { case TUYA_TYPE_BOOL: payload_len += 1; payload_buffer[2] = 0x00; @@ -108,12 +110,14 @@ void TuyaSendState(uint8_t id, uint8_t type, uint8_t* value){ TuyaSendCmd(TUYA_CMD_SET_DP, payload_buffer, payload_len); } -void TuyaSendBool(uint8_t id, bool value){ - TuyaSendState(id, TUYA_TYPE_BOOL, (uint8_t*)&value); +void TuyaSendBool(uint8_t id, bool value) +{ + TuyaSendState(id, TUYA_TYPE_BOOL, (uint8_t*)&value); } -void TuyaSendValue(uint8_t id, uint32_t value){ - TuyaSendState(id, TUYA_TYPE_VALUE, (uint8_t*)(&value)); +void TuyaSendValue(uint8_t id, uint32_t value) +{ + TuyaSendState(id, TUYA_TYPE_VALUE, (uint8_t*)(&value)); } bool TuyaSetPower(void) @@ -139,32 +143,27 @@ bool TuyaSetChannels(void) void LightSerialDuty(uint8_t duty) { if (duty > 0 && !tuya_ignore_dim && TuyaSerial) { - if (duty < 25) { - duty = 25; // dimming acts odd below 25(10%) - this mirrors the threshold set on the faceplate itself + if (duty < 25) { duty = 25; } // dimming acts odd below 25(10%) - this mirrors the threshold set on the faceplate itself + + if (Settings.flag3.tuya_show_dimmer == 0) { + + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TYA: Send dim value=%d (id=%d)"), duty, Settings.param[P_TUYA_DIMMER_ID]); + + TuyaSendValue(Settings.param[P_TUYA_DIMMER_ID], duty); } - - - if(Settings.flag3.tuya_show_dimmer == 0) - { - AddLog_P2(LOG_LEVEL_DEBUG, PSTR( "TYA: Send Serial Packet Dim Value=%d (id=%d)"), duty, Settings.param[P_TUYA_DIMMER_ID]); - TuyaSendValue(Settings.param[P_TUYA_DIMMER_ID], duty); - } - } else { tuya_ignore_dim = false; // reset flag - if(Settings.flag3.tuya_show_dimmer == 0) - { - AddLog_P2(LOG_LEVEL_DEBUG, PSTR( "TYA: Send Dim Level skipped due to 0 or already set. Value=%d"), duty); + if (Settings.flag3.tuya_show_dimmer == 0) { + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TYA: Send dim skipped value=%d"), duty); // due to 0 or already set } - } } -void TuyaRequestState(void){ - if(TuyaSerial) { - +void TuyaRequestState(void) +{ + if (TuyaSerial) { // Get current status of MCU - AddLog_P(LOG_LEVEL_DEBUG, PSTR("TYA: Request MCU state")); + AddLog_P(LOG_LEVEL_DEBUG, PSTR("TYA: Read MCU state")); TuyaSendCmd(TUYA_CMD_QUERY_STATE); } @@ -183,11 +182,11 @@ void TuyaPacketProcess(void) { char scmnd[20]; - switch(tuya_buffer[3]) { + switch (tuya_buffer[3]) { case TUYA_CMD_HEARTBEAT: AddLog_P(LOG_LEVEL_DEBUG, PSTR("TYA: Heartbeat")); - if(tuya_buffer[6] == 0){ + if (tuya_buffer[6] == 0) { AddLog_P(LOG_LEVEL_DEBUG, PSTR("TYA: Detected MCU restart")); tuya_wifi_state = -2; } @@ -196,33 +195,28 @@ void TuyaPacketProcess(void) case TUYA_CMD_STATE: if (tuya_buffer[5] == 5) { // on/off packet - /*if((power || Settings.light_dimmer > 0) && (power != tuya_buffer[10])) { + /*if ((power || Settings.light_dimmer > 0) && (power != tuya_buffer[10])) { ExecuteCommandPower(1, tuya_buffer[10], SRC_SWITCH); // send SRC_SWITCH? to use as flag to prevent loop from inbound states from faceplate interaction }*/ - AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TYA: RX Device-%d --> MCU State: %s Current State:%s"),tuya_buffer[6],tuya_buffer[10]?"On":"Off",bitRead(power, tuya_buffer[6]-1)?"On":"Off"); - if((power || Settings.light_dimmer > 0) && (tuya_buffer[10] != bitRead(power, tuya_buffer[6]-1))) - { - ExecuteCommandPower(tuya_buffer[6], tuya_buffer[10], SRC_SWITCH); // send SRC_SWITCH? to use as flag to prevent loop from inbound states from faceplate interaction - } + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TYA: RX Device-%d --> MCU State: %s Current State:%s"),tuya_buffer[6],tuya_buffer[10]?"On":"Off",bitRead(power, tuya_buffer[6]-1)?"On":"Off"); + if ((power || Settings.light_dimmer > 0) && (tuya_buffer[10] != bitRead(power, tuya_buffer[6]-1))) { + ExecuteCommandPower(tuya_buffer[6], tuya_buffer[10], SRC_SWITCH); // send SRC_SWITCH? to use as flag to prevent loop from inbound states from faceplate interaction + } } else if (tuya_buffer[5] == 8) { // dim packet AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TYA: RX Dim State=%d"), tuya_buffer[13]); - if(Settings.flag3.tuya_show_dimmer == 0) // - { + if (Settings.flag3.tuya_show_dimmer == 0) { if (!Settings.param[P_TUYA_DIMMER_ID]) { AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TYA: Autoconfiguring Dimmer ID %d"), tuya_buffer[6]); Settings.param[P_TUYA_DIMMER_ID] = tuya_buffer[6]; } tuya_new_dim = round(tuya_buffer[13] * (100. / 255.)); - if((power || Settings.flag3.tuya_apply_o20) && (tuya_new_dim > 0) && (abs(tuya_new_dim - Settings.light_dimmer) > 1)) { + if ((power || Settings.flag3.tuya_apply_o20) && (tuya_new_dim > 0) && (abs(tuya_new_dim - Settings.light_dimmer) > 1)) { + tuya_ignore_dim = true; snprintf_P(scmnd, sizeof(scmnd), PSTR(D_CMND_DIMMER " %d"), tuya_new_dim ); - - AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TYA: Send CMND_DIMMER_STR=%s"), scmnd ); - - tuya_ignore_dim = true; ExecuteCommand(scmnd, SRC_SWITCH); } } @@ -252,11 +246,11 @@ void TuyaPacketProcess(void) if (Settings.my_gp.io[i] == GPIO_LED1) led1_set = true; else if (Settings.my_gp.io[i] == GPIO_KEY1) key1_set = true; } - if(!Settings.my_gp.io[led1_gpio] && !led1_set){ + if (!Settings.my_gp.io[led1_gpio] && !led1_set) { Settings.my_gp.io[led1_gpio] = GPIO_LED1; restart_flag = 2; } - if(!Settings.my_gp.io[key1_gpio] && !key1_set){ + if (!Settings.my_gp.io[key1_gpio] && !key1_set) { Settings.my_gp.io[key1_gpio] = GPIO_KEY1; restart_flag = 2; } @@ -317,7 +311,7 @@ void TuyaSerialInput(void) tuya_buffer[tuya_byte_counter++] = serial_in_byte; tuya_cmd_checksum += serial_in_byte; } - else if (tuya_cmd_status == 1 && serial_in_byte == 0xAA){ // Only packtes with header 0x55AA are valid + else if (tuya_cmd_status == 1 && serial_in_byte == 0xAA) { // Only packtes with header 0x55AA are valid tuya_cmd_status = 2; tuya_byte_counter = 0; @@ -325,15 +319,15 @@ void TuyaSerialInput(void) tuya_buffer[tuya_byte_counter++] = 0xAA; tuya_cmd_checksum = 0xFF; } - else if (tuya_cmd_status == 2){ - if(tuya_byte_counter == 5){ // Get length of data + else if (tuya_cmd_status == 2) { + if (tuya_byte_counter == 5) { // Get length of data tuya_cmd_status = 3; tuya_data_len = serial_in_byte; } tuya_cmd_checksum += serial_in_byte; tuya_buffer[tuya_byte_counter++] = serial_in_byte; } - else if ((tuya_cmd_status == 3) && (tuya_byte_counter == (6 + tuya_data_len)) && (tuya_cmd_checksum == serial_in_byte)){ // Compare checksum and process packet + else if ((tuya_cmd_status == 3) && (tuya_byte_counter == (6 + tuya_data_len)) && (tuya_cmd_checksum == serial_in_byte)) { // Compare checksum and process packet tuya_buffer[tuya_byte_counter++] = serial_in_byte; snprintf_P(log_data, sizeof(log_data), PSTR("TYA: RX Packet: \"")); @@ -349,7 +343,7 @@ void TuyaSerialInput(void) tuya_cmd_checksum = 0; tuya_data_len = 0; } // read additional packets from TUYA - else if(tuya_byte_counter < TUYA_BUFFER_SIZE -1) { // add char to string if it still fits + else if (tuya_byte_counter < TUYA_BUFFER_SIZE -1) { // add char to string if it still fits tuya_buffer[tuya_byte_counter++] = serial_in_byte; tuya_cmd_checksum += serial_in_byte; } else { @@ -361,7 +355,6 @@ void TuyaSerialInput(void) } } - bool TuyaButtonPressed(void) { if (!XdrvMailbox.index && ((PRESSED == XdrvMailbox.payload) && (NOT_PRESSED == lastbutton[XdrvMailbox.index]))) { @@ -372,27 +365,27 @@ bool TuyaButtonPressed(void) return false; // Don't serve other buttons } -void TuyaSetWifiLed(void){ - uint8_t wifi_state = 0x02; - switch(WifiState()){ - case WIFI_SMARTCONFIG: - wifi_state = 0x00; - break; - case WIFI_MANAGER: - case WIFI_WPSCONFIG: - wifi_state = 0x01; - break; - case WIFI_RESTART: - wifi_state = 0x03; - break; - } +void TuyaSetWifiLed(void) +{ + uint8_t wifi_state = 0x02; + switch(WifiState()){ + case WIFI_SMARTCONFIG: + wifi_state = 0x00; + break; + case WIFI_MANAGER: + case WIFI_WPSCONFIG: + wifi_state = 0x01; + break; + case WIFI_RESTART: + wifi_state = 0x03; + break; + } - AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TYA: Set WiFi LED to state %d (%d)"), wifi_state, WifiState()); + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TYA: Set WiFi LED %d (%d)"), wifi_state, WifiState()); - TuyaSendCmd(TUYA_CMD_WIFI_STATE, &wifi_state, 1); + TuyaSendCmd(TUYA_CMD_WIFI_STATE, &wifi_state, 1); } - /*********************************************************************************************\ * Interface \*********************************************************************************************/ @@ -419,11 +412,11 @@ bool Xdrv16(uint8_t function) result = TuyaButtonPressed(); break; case FUNC_EVERY_SECOND: - if(TuyaSerial && tuya_wifi_state!=WifiState()) { TuyaSetWifiLed(); } + if (TuyaSerial && tuya_wifi_state != WifiState()) { TuyaSetWifiLed(); } tuya_heartbeat_timer++; if (tuya_heartbeat_timer > 10) { - tuya_heartbeat_timer = 0; - TuyaSendCmd(TUYA_CMD_HEARTBEAT); + tuya_heartbeat_timer = 0; + TuyaSendCmd(TUYA_CMD_HEARTBEAT); } break; case FUNC_SET_CHANNELS: diff --git a/sonoff/xdrv_19_ps16dz_dimmer.ino b/sonoff/xdrv_19_ps16dz_dimmer.ino index 3b240a12f..928534926 100644 --- a/sonoff/xdrv_19_ps16dz_dimmer.ino +++ b/sonoff/xdrv_19_ps16dz_dimmer.ino @@ -58,7 +58,7 @@ bool ps16dz_switch = false; void PS16DZSerialSendTxBuffer(void) { - AddLog_P2(LOG_LEVEL_DEBUG, PSTR("PSZ: Send serial command: %s"), ps16dz_tx_buffer); + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("PSZ: Send %s"), ps16dz_tx_buffer); PS16DZSerial->print(ps16dz_tx_buffer); PS16DZSerial->write(0x1B); @@ -73,16 +73,16 @@ void PS16DZSerialSendOkCommand(void) // Send a serial update command to the LED controller // For dimmer types: -// AT+UPDATE="sequence":"1554682835320","switch":"on":"bright":100 +// AT+UPDATE="sequence":"1554682835320","switch":"on","bright":100 // For color types: -// AT+UPDATE="sequence":"1554682835320","switch":"on":,"bright":100,"mode":1,"colorR":255,"colorG":46,"colorB":101,"light_types":1 +// AT+UPDATE="sequence":"1554682835320","switch":"on","bright":100,"mode":1,"colorR":255,"colorG":46,"colorB":101,"light_types":1 void PS16DZSerialSendUpdateCommand(void) { uint8_t light_state_dimmer = light_state.getDimmer(); // Dimming acts odd below 10% - this mirrors the threshold set on the faceplate itself light_state_dimmer = (light_state_dimmer < 10) ? 10 : light_state_dimmer; - snprintf_P(ps16dz_tx_buffer, PS16DZ_BUFFER_SIZE, PSTR( "AT+UPDATE=\"sequence\":\"%d%03d\",\"switch\":\"%s\",\"bright\":%d"), + snprintf_P(ps16dz_tx_buffer, PS16DZ_BUFFER_SIZE, PSTR("AT+UPDATE=\"sequence\":\"%d%03d\",\"switch\":\"%s\",\"bright\":%d"), LocalTime(), millis()%1000, power?"on":"off", light_state_dimmer); if (ps16dz_supports_color) { @@ -166,7 +166,7 @@ void PS16DZSerialInput(void) } else { ps16dz_rx_buffer[ps16dz_byte_counter++] = 0x00; - AddLog_P2(LOG_LEVEL_DEBUG, PSTR("PSZ: command received: %s"), ps16dz_rx_buffer); + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("PSZ: Received %s"), ps16dz_rx_buffer); if (!strncmp(ps16dz_rx_buffer+3, "UPDATE", 6)) { char *end_str; @@ -185,17 +185,12 @@ void PS16DZSerialInput(void) char* token3 = strtok_r(nullptr, ":", &end_token); if (!strncmp(token2, "\"switch\"", 8)) { - ps16dz_switch = !strncmp(token3, "\"on\"", 4) ? true : false; - AddLog_P2(LOG_LEVEL_DEBUG, PSTR("PSZ: switch received: %d"), ps16dz_switch); + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("PSZ: Switch %d"), ps16dz_switch); is_switch_change = (ps16dz_switch != power); - if (is_switch_change) { - -// AddLog_P2(LOG_LEVEL_DEBUG, PSTR("PSZ: Send CMND_POWER=%d"), ps16dz_switch ); - ExecuteCommandPower(1, ps16dz_switch, SRC_SWITCH); // send SRC_SWITCH? to use as flag to prevent loop from inbound states from faceplate interaction } } @@ -203,7 +198,6 @@ void PS16DZSerialInput(void) char color_channel_name = token2[6]; int color_index; - switch(color_channel_name) { case 'R': color_index = 0; @@ -213,60 +207,51 @@ void PS16DZSerialInput(void) case 'B': color_index = 2; break; } - int color_value = atoi(token3); ps16dz_color[color_index] = color_value; color_updated[color_index] = true; bool all_color_channels_updated = color_updated[0] && color_updated[1] && color_updated[2]; - if (all_color_channels_updated) { - AddLog_P2(LOG_LEVEL_DEBUG, PSTR("PSZ: color received: R:%d, G:%d, B:%d"), ps16dz_color[0], ps16dz_color[1], ps16dz_color[2]); + + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("PSZ: Color R:%d, G:%d, B:%d"), ps16dz_color[0], ps16dz_color[1], ps16dz_color[2]); is_color_change = (memcmp(ps16dz_color, Settings.light_color, 3) != 0); } if (power && is_color_change) { snprintf_P(scmnd, sizeof(scmnd), PSTR(D_CMND_COLOR "2 %02x%02x%02x"), ps16dz_color[0], ps16dz_color[1], ps16dz_color[2]); - -// AddLog_P2(LOG_LEVEL_DEBUG, PSTR("PSZ: Send CMND_COLOR_STR=%s"), scmnd ); - ExecuteCommand(scmnd, SRC_SWITCH); } } else if (!strncmp(token2, "\"bright\"", 8)) { - ps16dz_dimmer = atoi(token3); - AddLog_P2(LOG_LEVEL_DEBUG, PSTR("PSZ: brightness received: %d"), ps16dz_dimmer); + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("PSZ: Brightness %d"), ps16dz_dimmer); is_brightness_change = ps16dz_dimmer != Settings.light_dimmer; - if (power && (ps16dz_dimmer > 0) && is_brightness_change) { snprintf_P(scmnd, sizeof(scmnd), PSTR(D_CMND_DIMMER " %d"), ps16dz_dimmer); - -// AddLog_P2(LOG_LEVEL_DEBUG, PSTR("PSZ: Send CMND_DIMMER_STR=%s"), scmnd); - ExecuteCommand(scmnd, SRC_SWITCH); } } else if (!strncmp(token2, "\"sequence\"", 10)) { - AddLog_P2(LOG_LEVEL_DEBUG, PSTR("PSZ: sequence received: %s"), token3); + + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("PSZ: Sequence %s"), token3); + } token = strtok_r(nullptr, ",", &end_str); } if (!is_color_change && !is_brightness_change) { - AddLog_P2(LOG_LEVEL_DEBUG, PSTR("PSZ: Update received")); + + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("PSZ: Update")); PS16DZSerialSendOkCommand(); } } else if (!strncmp(ps16dz_rx_buffer+3, "SETTING", 7)) { -// AddLog_P(LOG_LEVEL_DEBUG, PSTR("PSZ: Reset")); - if (!Settings.flag.button_restrict) { - char scmnd[20]; snprintf_P(scmnd, sizeof(scmnd), PSTR(D_CMND_WIFICONFIG " 2")); ExecuteCommand(scmnd, SRC_BUTTON); }