diff --git a/README.md b/README.md index 78e1ed941..15a8fd607 100644 --- a/README.md +++ b/README.md @@ -30,11 +30,15 @@ OpenBeken features: - Automatic reconnect when WiFi network goes out - and much more +# Wiki + +For more Information refer to the [WIKI](https://github.com/openshwprojects/OpenBK7231T_App/wiki/Wiki-Home) + # Building OpenBeken supports online builds for all platforms (BK7231T, BK7231N, XR809, BL602, W800), but if you want to compile it yourself, see [BUILDING.md](https://github.com/openshwprojects/OpenBK7231T_App/blob/main/BUILDING.md) -# flashing for BK7231T +# Flashing for BK7231T ## UART (Windows only) diff --git a/src/cmnds/cmd_newLEDDriver.c b/src/cmnds/cmd_newLEDDriver.c index 0f0294e6b..d2728bd19 100644 --- a/src/cmnds/cmd_newLEDDriver.c +++ b/src/cmnds/cmd_newLEDDriver.c @@ -71,6 +71,30 @@ float led_temperature_min = HASS_TEMPERATURE_MIN; float led_temperature_max = HASS_TEMPERATURE_MAX; float led_temperature_current = 0; + +int isCWMode() { + int pwmCount; + + pwmCount = PIN_CountPinsWithRole(IOR_PWM); + + if(pwmCount == 2) + return 1; + return 0; +} + +int shouldSendRGB() { + int pwmCount; + + pwmCount = PIN_CountPinsWithRole(IOR_PWM); + + // single colors and CW don't send rgb + if(pwmCount <= 2) + return 0; + + return 1; +} + + void apply_smart_light() { int i; int firstChannelIndex; @@ -86,42 +110,73 @@ void apply_smart_light() { firstChannelIndex = 1; } - for(i = 0; i < 5; i++) { - float raw, final; - - raw = baseColors[i]; + if(isCWMode() && CFG_HasFlag(OBK_FLAG_LED_ALTERNATE_CW_MODE)) { + int value_brightness = 0; + int value_cold_or_warm = 0; + for(i = 0; i < 5; i++) { + finalColors[i] = 0; + finalRGBCW[i] = 0; + } if(g_lightEnableAll) { - final = raw * g_brightness; - } else { - final = 0; + value_cold_or_warm = LED_GetTemperature0to1Range() * 100.0f; + value_brightness = g_brightness * 100.0f; + for(i = 3; i < 5; i++) { + finalColors[i] = baseColors[i] * g_brightness; + finalRGBCW[i] = baseColors[i] * g_brightness; + } } - if(g_lightMode == Light_Temperature) { - // skip channels 0, 1, 2 - // (RGB) - if(i < 3) - { + CHANNEL_Set(firstChannelIndex, value_cold_or_warm, CHANNEL_SET_FLAG_SKIP_MQTT); + CHANNEL_Set(firstChannelIndex+1, value_brightness, CHANNEL_SET_FLAG_SKIP_MQTT); + } else { + for(i = 0; i < 5; i++) { + float raw, final; + + raw = baseColors[i]; + + if(g_lightEnableAll) { + final = raw * g_brightness; + } else { final = 0; } - } else if(g_lightMode == Light_RGB) { - // skip channels 3, 4 - if(i >= 3) - { - final = 0; + if(g_lightMode == Light_Temperature) { + // skip channels 0, 1, 2 + // (RGB) + if(i < 3) + { + final = 0; + } + } else if(g_lightMode == Light_RGB) { + // skip channels 3, 4 + if(i >= 3) + { + final = 0; + } + } else { + } - } else { + finalColors[i] = final; + finalRGBCW[i] = final; + channelToUse = firstChannelIndex + i; + + // log printf with %f crashes N platform? + //ADDLOG_INFO(LOG_FEATURE_CMD, "apply_smart_light: ch %i raw is %f, bright %f, final %f, enableAll is %i", + // channelToUse,raw,g_brightness,final,g_lightEnableAll); + + if(isCWMode()) { + // in CW mode, we have only set two channels + // We don't have RGB channels + // so, do simple mapping + if(i == 4) { + CHANNEL_Set(firstChannelIndex+0, final * g_cfg_colorScaleToChannel, CHANNEL_SET_FLAG_SKIP_MQTT); + } else if(i == 5) { + CHANNEL_Set(firstChannelIndex+1, final * g_cfg_colorScaleToChannel, CHANNEL_SET_FLAG_SKIP_MQTT); + } + } else { + CHANNEL_Set(channelToUse, final * g_cfg_colorScaleToChannel, CHANNEL_SET_FLAG_SKIP_MQTT); + } } - finalColors[i] = final; - finalRGBCW[i] = final; - - channelToUse = firstChannelIndex + i; - - // log printf with %f crashes N platform? - //ADDLOG_INFO(LOG_FEATURE_CMD, "apply_smart_light: ch %i raw is %f, bright %f, final %f, enableAll is %i", - // channelToUse,raw,g_brightness,final,g_lightEnableAll); - - CHANNEL_Set(channelToUse, final * g_cfg_colorScaleToChannel, CHANNEL_SET_FLAG_SKIP_MQTT); } #ifndef OBK_DISABLE_ALL_DRIVERS if(DRV_IsRunning("SM2135")) { @@ -136,6 +191,10 @@ static OBK_Publish_Result sendColorChange() { char s[16]; byte c[3]; + if(shouldSendRGB()==0) { + return OBK_PUBLISH_WAS_NOT_REQUIRED; + } + c[0] = (byte)(baseColors[0]); c[1] = (byte)(baseColors[1]); c[2] = (byte)(baseColors[2]); @@ -157,6 +216,10 @@ static void sendFinalColor() { char s[16]; byte c[3]; + if(shouldSendRGB()==0) { + return OBK_PUBLISH_WAS_NOT_REQUIRED; + } + c[0] = (byte)(finalColors[0]); c[1] = (byte)(finalColors[1]); c[2] = (byte)(finalColors[2]); @@ -191,18 +254,25 @@ OBK_Publish_Result LED_SendCurrentLightMode() { } return OBK_PUBLISH_WAS_NOT_REQUIRED; } -void LED_SetTemperature(int tmpInteger, bool bApply) { +float LED_GetTemperature0to1Range() { float f; - - led_temperature_current = tmpInteger; - f = (tmpInteger - led_temperature_min); + f = (led_temperature_current - led_temperature_min); f = f / (led_temperature_max - led_temperature_min); if(f<0) f = 0; if(f>1) f =1; + return f; +} +void LED_SetTemperature(int tmpInteger, bool bApply) { + float f; + + led_temperature_current = tmpInteger; + + f = LED_GetTemperature0to1Range(); + baseColors[3] = (255.0f) * (1-f); baseColors[4] = (255.0f) * f; @@ -283,11 +353,14 @@ void LED_SetDimmer(int iVal) { apply_smart_light(); LED_SendDimmerChange(); - if(CFG_HasFlag(OBK_FLAG_MQTT_BROADCASTLEDPARAMSTOGETHER)) { - sendColorChange(); - } - if(CFG_HasFlag(OBK_FLAG_MQTT_BROADCASTLEDFINALCOLOR)) { - sendFinalColor(); + + if(shouldSendRGB()) { + if(CFG_HasFlag(OBK_FLAG_MQTT_BROADCASTLEDPARAMSTOGETHER)) { + sendColorChange(); + } + if(CFG_HasFlag(OBK_FLAG_MQTT_BROADCASTLEDFINALCOLOR)) { + sendFinalColor(); + } } } diff --git a/src/cmnds/cmd_public.h b/src/cmnds/cmd_public.h index 0660df986..661d1b82c 100644 --- a/src/cmnds/cmd_public.h +++ b/src/cmnds/cmd_public.h @@ -88,6 +88,7 @@ float LED_GetDimmer(); int LED_IsRunningDriver(); float LED_GetTemperature(); void LED_SetTemperature(int tmpInteger, bool bApply); +float LED_GetTemperature0to1Range(); void LED_SetDimmer(int iVal); int LED_SetBaseColor(const void *context, const char *cmd, const char *args, int bAll); void LED_SetEnableAll(int bEnable); diff --git a/src/driver/drv_ntp.c b/src/driver/drv_ntp.c index f8ce961ca..aeb3fa719 100644 --- a/src/driver/drv_ntp.c +++ b/src/driver/drv_ntp.c @@ -3,6 +3,7 @@ // https://www.elektroda.pl/rtvforum/topic3712112.html #include "../new_common.h" +#include "../new_cfg.h" // Commands register, execution API and cmd tokenizer #include "../cmnds/cmd_public.h" @@ -67,9 +68,33 @@ int NTP_SetTimeZoneOfs(const void *context, const char *cmd, const char *args, i addLogAdv(LOG_INFO, LOG_FEATURE_NTP,"NTP offset set, wait for next ntp packet to apply changes\n"); return 1; } + +//Set custom NTP server +int NTP_SetServer(const void *context, const char *cmd, const char *args, int cmdFlags) { + Tokenizer_TokenizeString(args); + if(Tokenizer_GetArgsCount() < 1) { + addLogAdv(LOG_INFO, LOG_FEATURE_NTP,"Argument missing e.g. ntp_setServer ipAddress\n"); + return 0; + } + char *newValue = Tokenizer_GetArg(0); + CFG_SetNTPServer(newValue); + addLogAdv(LOG_INFO, LOG_FEATURE_NTP, "NTP server set to %s\n", newValue); + return 1; +} + +//Display settings used by the NTP driver +int NTP_Info(const void *context, const char *cmd, const char *args, int cmdFlags) { + addLogAdv(LOG_INFO, LOG_FEATURE_NTP, "Server=%s, Time offset=%d\n", CFG_GetNTPServer(), g_timeOffsetHours); + return 1; +} + void NTP_Init() { CMD_RegisterCommand("ntp_timeZoneOfs","",NTP_SetTimeZoneOfs, "Sets the time zone offset in hours", NULL); + CMD_RegisterCommand("ntp_setServer", "", NTP_SetServer, "Sets the NTP server", NULL); + CMD_RegisterCommand("ntp_info", "", NTP_Info, "Display NTP related settings", NULL); + + addLogAdv(LOG_INFO, LOG_FEATURE_NTP, "NTP driver initialized with server=%s, offset=%d\n", CFG_GetNTPServer(), g_timeOffsetHours); } unsigned int NTP_GetCurrentTime() { @@ -122,7 +147,7 @@ void NTP_SendRequest(bool bBlocking) { memset((char *) &g_address, 0, sizeof(g_address)); g_address.sin_family = AF_INET; - g_address.sin_addr.s_addr = inet_addr("217.147.223.78"); // this is address of host which I want to send the socket + g_address.sin_addr.s_addr = inet_addr(CFG_GetNTPServer()); // this is address of host which I want to send the socket g_address.sin_port = htons(123); diff --git a/src/httpserver/http_fns.c b/src/httpserver/http_fns.c index 4ace514b3..325e6d836 100644 --- a/src/httpserver/http_fns.c +++ b/src/httpserver/http_fns.c @@ -45,7 +45,8 @@ template_t g_templates [] = { { Setup_Device_Empty, "Empty"}, // BK7231N devices { Setup_Device_BK7231N_CB2S_QiachipSmartSwitch, "[BK7231N][CB2S] QiaChip Smart Switch"}, - {Setup_Device_BK7231N_KS_602_TOUCH, "[BK7231N] KS 602 Touch Switch US"}, + { Setup_Device_BK7231N_KS_602_TOUCH, "[BK7231N] KS 602 Touch Switch US"}, + { Setup_Device_Aubess_Mini_Smart_Switch_16A, "[BK7231N] Aubess Mini Smart Switch 16A"}, // BK7231T devices { Setup_Device_BK7231T_WB2S_QiachipSmartSwitch, "[BK7231T][WB2S] QiaChip Smart Switch"}, { Setup_Device_TuyaWL_SW01_16A, "WL SW01 16A"}, @@ -1664,6 +1665,7 @@ const char *g_obk_flagNames[] = { "[CMD] Enable TCP console command server (for Putty, etc)", "[BTN] Instant touch reaction instead of waiting for release (aka SetOption 13)", "[MQTT] [Debug] Always set Retain flag to all published values", + "[LED] Alternate CW light mode (first PWM for warm/cold slider, second for brightness)", "error", "error", }; diff --git a/src/new_builtin_devices.c b/src/new_builtin_devices.c index b66dd4e8d..90e0869a3 100644 --- a/src/new_builtin_devices.c +++ b/src/new_builtin_devices.c @@ -805,5 +805,31 @@ void Setup_Device_Enbrighten_WFD4103(){ PIN_SetPinRoleForPinIndex(26, IOR_Button); PIN_SetPinChannelForPinIndex(26, 1); + CFG_Save_SetupTimer(); +} + +// Aubess Mini Smart Switch 16A +void Setup_Device_Aubess_Mini_Smart_Switch_16A() { + + // pins are: + // led - led_n = P6 + // embedded button - btn = P8 + // switch - btn = P14 + // relay - rel = P15 + + CFG_ClearPins(); + // Led + PIN_SetPinRoleForPinIndex(6, IOR_LED_n); + PIN_SetPinChannelForPinIndex(6, 1); + // Embedded Button + PIN_SetPinRoleForPinIndex(8, IOR_Button); + PIN_SetPinChannelForPinIndex(8, 1); + // Switch + PIN_SetPinRoleForPinIndex(14, IOR_Button); + PIN_SetPinChannelForPinIndex(14, 1); + // Relay + PIN_SetPinRoleForPinIndex(15, IOR_Relay); + PIN_SetPinChannelForPinIndex(15, 1); + CFG_Save_SetupTimer(); } \ No newline at end of file diff --git a/src/new_cfg.c b/src/new_cfg.c index b76066f3b..1fbfac55a 100644 --- a/src/new_cfg.c +++ b/src/new_cfg.c @@ -137,6 +137,8 @@ void CFG_SetDefaultConfig() { sprintf(g_cfg.longDeviceName,DEVICENAME_PREFIX_FULL"_%02X%02X%02X%02X",mac[2],mac[3],mac[4],mac[5]); sprintf(g_cfg.shortDeviceName,DEVICENAME_PREFIX_SHORT"%02X%02X%02X%02X",mac[2],mac[3],mac[4],mac[5]); + strcpy(g_cfg.ntpServer, "217.147.223.78"); //bart.nexellent.net + g_cfg_pendingChanges++; } @@ -446,6 +448,16 @@ void PIN_SetPinChannel2ForPinIndex(int index, int ch) { // } // } //} + +const char *CFG_GetNTPServer() { + return g_cfg.ntpServer; +} +void CFG_SetNTPServer(const char *s) { + if(strcpy_safe_checkForChanges(g_cfg.ntpServer, s,sizeof(g_cfg.ntpServer))) { + g_cfg_pendingChanges++; + } +} + void CFG_InitAndLoad() { byte chkSum; diff --git a/src/new_cfg.h b/src/new_cfg.h index 4edfc3b55..62ca3ced2 100644 --- a/src/new_cfg.h +++ b/src/new_cfg.h @@ -61,7 +61,8 @@ int CFG_DeviceGroups_GetRecvFlags(); void CFG_SetFlag(int flag, bool bValue); bool CFG_HasFlag(int flag); int CFG_GetFlags(); - +const char* CFG_GetNTPServer(); +void CFG_SetNTPServer(const char *s); #endif diff --git a/src/new_pins.h b/src/new_pins.h index 670e14b48..88e3e0763 100644 --- a/src/new_pins.h +++ b/src/new_pins.h @@ -102,8 +102,9 @@ typedef struct pinsState_s { #define OBK_FLAG_CMD_ENABLETCPRAWPUTTYSERVER 5 #define OBK_FLAG_BTN_INSTANTTOUCH 6 #define OBK_FLAG_MQTT_ALWAYSSETRETAIN 7 +#define OBK_FLAG_LED_ALTERNATE_CW_MODE 8 -#define OBK_TOTAL_FLAGS 7 +#define OBK_TOTAL_FLAGS 9 // // Main config structure (less than 2KB) @@ -145,7 +146,8 @@ typedef struct mainConfig_s { int dgr_sendFlags; int dgr_recvFlags; char dgr_name[16]; - byte unusedSectorA[104]; + char ntpServer[32]; + byte unusedSectorA[72]; byte unusedSectorB[128]; byte unusedSectorC[55]; byte timeRequiredToMarkBootSuccessfull; @@ -241,6 +243,6 @@ void Setup_Device_13A_Socket_CB2S(); void Setup_Device_Deta_Smart_Double_Power_Point_6922HA_Series2(); void Setup_Device_BK7231N_KS_602_TOUCH(); void Setup_Device_Enbrighten_WFD4103(); - +void Setup_Device_Aubess_Mini_Smart_Switch_16A(); #endif