From cd9cc976e76b77cd47b4acbd79b01687d72678d9 Mon Sep 17 00:00:00 2001 From: lumapu Date: Wed, 3 Jan 2024 00:14:10 +0100 Subject: [PATCH] 0.8.42 * add LED to display whether it's night time or not. Can be reused as output to control battery system #1308 --- src/CHANGES.md | 3 +++ src/app.cpp | 32 ++++++++++++++++++-------------- src/config/config.h | 3 +++ src/config/settings.h | 18 ++++++++++-------- src/defines.h | 2 +- src/web/RestApi.h | 5 +++-- src/web/html/setup.html | 2 +- src/web/web.h | 23 ++++++++++++----------- 8 files changed, 51 insertions(+), 37 deletions(-) diff --git a/src/CHANGES.md b/src/CHANGES.md index 43e58613..1539fd5c 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -1,5 +1,8 @@ # Development Changes +## 0.8.42 - 2024-01-02 +* add LED to display whether it's night time or not. Can be reused as output to control battery system #1308 + ## 0.8.41 - 2024-01-02 * fix display timeout (OLED) to 60s * change offs to signed value diff --git a/src/app.cpp b/src/app.cpp index cd13050b..6bce1709 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -456,14 +456,11 @@ void app::mqttSubRxCb(JsonObject obj) { //----------------------------------------------------------------------------- void app::setupLed(void) { uint8_t led_off = (mConfig->led.high_active) ? 0 : 255; - - if (mConfig->led.led0 != DEF_PIN_OFF) { - pinMode(mConfig->led.led0, OUTPUT); - analogWrite(mConfig->led.led0, led_off); - } - if (mConfig->led.led1 != DEF_PIN_OFF) { - pinMode(mConfig->led.led1, OUTPUT); - analogWrite(mConfig->led.led1, led_off); + for(uint8_t i = 0; i < 3; i ++) { + if (mConfig->led.led[i] != DEF_PIN_OFF) { + pinMode(mConfig->led.led[i], OUTPUT); + analogWrite(mConfig->led.led[i], led_off); + } } } @@ -472,27 +469,34 @@ void app::updateLed(void) { uint8_t led_off = (mConfig->led.high_active) ? 0 : 255; uint8_t led_on = (mConfig->led.high_active) ? (mConfig->led.luminance) : (255-mConfig->led.luminance); - if (mConfig->led.led0 != DEF_PIN_OFF) { + if (mConfig->led.led[0] != DEF_PIN_OFF) { Inverter<> *iv; for (uint8_t id = 0; id < mSys.getNumInverters(); id++) { iv = mSys.getInverterByPos(id); if (NULL != iv) { if (iv->isProducing()) { // turn on when at least one inverter is producing - analogWrite(mConfig->led.led0, led_on); + analogWrite(mConfig->led.led[0], led_on); break; } else if(iv->config->enabled) - analogWrite(mConfig->led.led0, led_off); + analogWrite(mConfig->led.led[0], led_off); } } } - if (mConfig->led.led1 != DEF_PIN_OFF) { + if (mConfig->led.led[1] != DEF_PIN_OFF) { if (getMqttIsConnected()) { - analogWrite(mConfig->led.led1, led_on); + analogWrite(mConfig->led.led[1], led_on); } else { - analogWrite(mConfig->led.led1, led_off); + analogWrite(mConfig->led.led[1], led_off); } } + + if (mConfig->led.led[2] != DEF_PIN_OFF) { + if((mTimestamp > (mSunset + mConfig->sun.offsetSecEvening)) || (mTimestamp < (mSunrise + mConfig->sun.offsetSecMorning))) + analogWrite(mConfig->led.led[2], led_on); + else + analogWrite(mConfig->led.led[2], led_off); + } } diff --git a/src/config/config.h b/src/config/config.h index 2cb9bcd3..fb05a1cc 100644 --- a/src/config/config.h +++ b/src/config/config.h @@ -142,6 +142,9 @@ #ifndef DEF_LED1 #define DEF_LED1 DEF_PIN_OFF #endif +#ifndef DEF_LED2 + #define DEF_LED2 DEF_PIN_OFF +#endif #ifdef LED_ACTIVE_HIGH #define LED_HIGH_ACTIVE true #else diff --git a/src/config/settings.h b/src/config/settings.h index 5cecd46a..476f9fbf 100644 --- a/src/config/settings.h +++ b/src/config/settings.h @@ -118,8 +118,7 @@ typedef struct { } cfgSerial_t; typedef struct { - uint8_t led0; // first LED pin - uint8_t led1; // second LED pin + uint8_t led[3]; // LED pins bool high_active; // determines if LEDs are high or low active uint8_t luminance; // luminance of LED } cfgLed_t; @@ -453,8 +452,9 @@ class settings { mCfg.inst.iv[i].add2Total = true; } - mCfg.led.led0 = DEF_LED0; - mCfg.led.led1 = DEF_LED1; + mCfg.led.led[0] = DEF_LED0; + mCfg.led.led[1] = DEF_LED1; + mCfg.led.led[2] = DEF_LED2; mCfg.led.high_active = LED_HIGH_ACTIVE; mCfg.led.luminance = 255; @@ -677,13 +677,15 @@ class settings { void jsonLed(JsonObject obj, bool set = false) { if(set) { - obj[F("0")] = mCfg.led.led0; - obj[F("1")] = mCfg.led.led1; + obj[F("0")] = mCfg.led.led[0]; + obj[F("1")] = mCfg.led.led[1]; + obj[F("2")] = mCfg.led.led[2]; obj[F("act_high")] = mCfg.led.high_active; obj[F("lum")] = mCfg.led.luminance; } else { - getVal(obj, F("0"), &mCfg.led.led0); - getVal(obj, F("1"), &mCfg.led.led1); + getVal(obj, F("0"), &mCfg.led.led[0]); + getVal(obj, F("1"), &mCfg.led.led[1]); + getVal(obj, F("2"), &mCfg.led.led[2]); getVal(obj, F("act_high"), &mCfg.led.high_active); getVal(obj, F("lum"), &mCfg.led.luminance); } diff --git a/src/defines.h b/src/defines.h index 9ee93c17..56bdf5e6 100644 --- a/src/defines.h +++ b/src/defines.h @@ -13,7 +13,7 @@ //------------------------------------- #define VERSION_MAJOR 0 #define VERSION_MINOR 8 -#define VERSION_PATCH 41 +#define VERSION_PATCH 42 //------------------------------------- typedef struct { diff --git a/src/web/RestApi.h b/src/web/RestApi.h index c920a8e3..7541e095 100644 --- a/src/web/RestApi.h +++ b/src/web/RestApi.h @@ -611,8 +611,9 @@ class RestApi { obj[F("sclk")] = mConfig->nrf.pinSclk; obj[F("mosi")] = mConfig->nrf.pinMosi; obj[F("miso")] = mConfig->nrf.pinMiso; - obj[F("led0")] = mConfig->led.led0; - obj[F("led1")] = mConfig->led.led1; + obj[F("led0")] = mConfig->led.led[0]; + obj[F("led1")] = mConfig->led.led[1]; + obj[F("led2")] = mConfig->led.led[2]; obj[F("led_high_active")] = mConfig->led.high_active; obj[F("led_lum")] = mConfig->led.luminance; } diff --git a/src/web/html/setup.html b/src/web/html/setup.html index aa52ac33..a103cf15 100644 --- a/src/web/html/setup.html +++ b/src/web/html/setup.html @@ -909,7 +909,7 @@ if ("ESP32-S3" == system.chip_model) pinList = esp32s3pins; else if("ESP32-C3" == system["chip_model"]) pinList = esp32c3pins; /*ENDIF_ESP32*/ - pins = [['led0', 'pinLed0', 'At least one inverter is producing'], ['led1', 'pinLed1', 'MqTT connected']]; + pins = [['led0', 'pinLed0', 'At least one inverter is producing'], ['led1', 'pinLed1', 'MqTT connected'], ['led2', 'pinLed2', 'Night time']]; for(p of pins) { e.append( ml("div", {class: "row mb-3"}, [ diff --git a/src/web/web.h b/src/web/web.h index 3ed0353d..3df40839 100644 --- a/src/web/web.h +++ b/src/web/web.h @@ -39,7 +39,7 @@ #define WEB_SERIAL_BUF_SIZE 2048 -const char* const pinArgNames[] = {"pinCs", "pinCe", "pinIrq", "pinSclk", "pinMosi", "pinMiso", "pinLed0", "pinLed1", "pinLedHighActive", "pinLedLum", "pinCmtSclk", "pinSdio", "pinCsb", "pinFcsb", "pinGpio3"}; +const char* const pinArgNames[] = {"pinCs", "pinCe", "pinIrq", "pinSclk", "pinMosi", "pinMiso", "pinLed0", "pinLed1", "pinLed2", "pinLedHighActive", "pinLedLum", "pinCmtSclk", "pinSdio", "pinCsb", "pinFcsb", "pinGpio3"}; template class Web { @@ -506,7 +506,7 @@ class Web { // pinout uint8_t pin; - for (uint8_t i = 0; i < 15; i++) { + for (uint8_t i = 0; i < 16; i++) { pin = request->arg(String(pinArgNames[i])).toInt(); switch(i) { case 0: mConfig->nrf.pinCs = ((pin != 0xff) ? pin : DEF_NRF_CS_PIN); break; @@ -515,15 +515,16 @@ class Web { case 3: mConfig->nrf.pinSclk = ((pin != 0xff) ? pin : DEF_NRF_SCLK_PIN); break; case 4: mConfig->nrf.pinMosi = ((pin != 0xff) ? pin : DEF_NRF_MOSI_PIN); break; case 5: mConfig->nrf.pinMiso = ((pin != 0xff) ? pin : DEF_NRF_MISO_PIN); break; - case 6: mConfig->led.led0 = pin; break; - case 7: mConfig->led.led1 = pin; break; - case 8: mConfig->led.high_active = pin; break; // this is not really a pin but a polarity, but handling it close to here makes sense - case 9: mConfig->led.luminance = pin; break; // this is not really a pin but a polarity, but handling it close to here makes sense - case 10: mConfig->cmt.pinSclk = pin; break; - case 11: mConfig->cmt.pinSdio = pin; break; - case 12: mConfig->cmt.pinCsb = pin; break; - case 13: mConfig->cmt.pinFcsb = pin; break; - case 14: mConfig->cmt.pinIrq = pin; break; + case 6: mConfig->led.led[0] = pin; break; + case 7: mConfig->led.led[1] = pin; break; + case 8: mConfig->led.led[2] = pin; break; + case 9: mConfig->led.high_active = pin; break; // this is not really a pin but a polarity, but handling it close to here makes sense + case 10: mConfig->led.luminance = pin; break; // this is not really a pin but a polarity, but handling it close to here makes sense + case 11: mConfig->cmt.pinSclk = pin; break; + case 12: mConfig->cmt.pinSdio = pin; break; + case 13: mConfig->cmt.pinCsb = pin; break; + case 14: mConfig->cmt.pinFcsb = pin; break; + case 15: mConfig->cmt.pinIrq = pin; break; } }