From df53f34b51e38a2d07d7096190c902617681e73d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20B=C3=B6hm?= Date: Mon, 19 Aug 2024 20:44:59 +0200 Subject: [PATCH 01/26] Feature: SPIPortManager allows simultaneous use of CMT2300 and Huawei charger * backport SPIPortManager from @skippermeister * adapt to support ESP32 and ESP32-S3 and ESP32-C3 * use logic to work with SPI numbering as in the official documentation: start with SPI0 and go up to SPI3 * increase Huawei CAN controller stack size to 2000 * increase startup delay for USB_CDC enabled builds to be able to catch bootlogs over USB --- include/SPIPortManager.h | 55 ++++++++++++++++++++++++++ lib/CMT2300a/cmt2300a_hal.c | 4 +- lib/CMT2300a/cmt2300a_hal.h | 3 +- lib/CMT2300a/cmt2300wrapper.cpp | 5 ++- lib/CMT2300a/cmt2300wrapper.h | 4 +- lib/CMT2300a/cmt_spi3.c | 16 +++----- lib/CMT2300a/cmt_spi3.h | 3 +- lib/Hoymiles/src/Hoymiles.cpp | 4 +- lib/Hoymiles/src/Hoymiles.h | 5 ++- lib/Hoymiles/src/HoymilesRadio_CMT.cpp | 4 +- lib/Hoymiles/src/HoymilesRadio_CMT.h | 3 +- src/Huawei_can.cpp | 9 ++++- src/InverterSettings.cpp | 41 +++++++++---------- src/SPIPortManager.cpp | 46 +++++++++++++++++++++ src/main.cpp | 5 ++- 15 files changed, 156 insertions(+), 51 deletions(-) create mode 100644 include/SPIPortManager.h create mode 100644 src/SPIPortManager.cpp diff --git a/include/SPIPortManager.h b/include/SPIPortManager.h new file mode 100644 index 00000000..d3d58896 --- /dev/null +++ b/include/SPIPortManager.h @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include +#include +#include +#include + +/** + * SPI# to SPI ID and SPI_HOST mapping + * + * ESP32 + * | SPI # | SPI ID | SPI_HOST | + * | 2 | 2 | 1 | + * | 3 | 3 | 2 | + * + * ESP32-S3 + * | SPI # | SPI ID | SPI_HOST | + * | 2 | 0 | 1 | + * | 3 | 1 | 2 | + * + * ESP32-C3 + * | SPI # | SPI ID | SPI_HOST | + * | 2 | 0 | 1 | + * + */ + +class SPIPortManagerClass { +public: + void init(); + + std::optional allocatePort(std::string const& owner); + void freePort(std::string const& owner); + spi_host_device_t SPIhostNum(uint8_t spi_num); + +private: + // the amount of SPIs available on supported ESP32 chips + #if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S3 + static size_t constexpr _num_controllers = 4; + #else + static size_t constexpr _num_controllers = 3; + #endif + + #if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32S3 + static int8_t constexpr _offset_spi_num = -2; // FSPI=0, HSPI=1 + static int8_t constexpr _offset_spi_host = 1; // SPI1_HOST=0 but not usable, SPI2_HOST=1 and SPI3_HOST=2, first usable is SPI2_HOST + #else + static int8_t constexpr _offset_spi_num = 0; // HSPI=2, VSPI=3 + static int8_t constexpr _offset_spi_host = -1; // SPI1_HOST=0 but not usable, SPI2_HOST=1 and SPI3_HOST=2, first usable is SPI2_HOST + #endif + + std::array _ports = { "" }; +}; + +extern SPIPortManagerClass SPIPortManager; diff --git a/lib/CMT2300a/cmt2300a_hal.c b/lib/CMT2300a/cmt2300a_hal.c index 7b07d499..73f6cab7 100644 --- a/lib/CMT2300a/cmt2300a_hal.c +++ b/lib/CMT2300a/cmt2300a_hal.c @@ -26,9 +26,9 @@ * @name CMT2300A_InitSpi * @desc Initializes the CMT2300A SPI interface. * *********************************************************/ -void CMT2300A_InitSpi(const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const uint32_t spi_speed) +void CMT2300A_InitSpi(const spi_host_device_t spi_host, const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const uint32_t spi_speed) { - cmt_spi3_init(pin_sdio, pin_clk, pin_cs, pin_fcs, spi_speed); + cmt_spi3_init(spi_host, pin_sdio, pin_clk, pin_cs, pin_fcs, spi_speed); } /*! ******************************************************** diff --git a/lib/CMT2300a/cmt2300a_hal.h b/lib/CMT2300a/cmt2300a_hal.h index a465b149..150e10f0 100644 --- a/lib/CMT2300a/cmt2300a_hal.h +++ b/lib/CMT2300a/cmt2300a_hal.h @@ -23,6 +23,7 @@ #include #include +#include #ifdef __cplusplus extern "C" { @@ -36,7 +37,7 @@ extern "C" { #define CMT2300A_GetTickCount() millis() /* ************************************************************************ */ -void CMT2300A_InitSpi(const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const uint32_t spi_speed); +void CMT2300A_InitSpi(const spi_host_device_t spi_host, const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const uint32_t spi_speed); uint8_t CMT2300A_ReadReg(const uint8_t addr); void CMT2300A_WriteReg(const uint8_t addr, const uint8_t dat); diff --git a/lib/CMT2300a/cmt2300wrapper.cpp b/lib/CMT2300a/cmt2300wrapper.cpp index 016ef56f..f04bdeea 100644 --- a/lib/CMT2300a/cmt2300wrapper.cpp +++ b/lib/CMT2300a/cmt2300wrapper.cpp @@ -7,8 +7,9 @@ #include "cmt2300a_params_860.h" #include "cmt2300a_params_900.h" -CMT2300A::CMT2300A(const uint8_t pin_sdio, const uint8_t pin_clk, const uint8_t pin_cs, const uint8_t pin_fcs, const uint32_t spi_speed) +CMT2300A::CMT2300A(const spi_host_device_t spi_host, const uint8_t pin_sdio, const uint8_t pin_clk, const uint8_t pin_cs, const uint8_t pin_fcs, const uint32_t spi_speed) { + _spi_host = spi_host; _pin_sdio = pin_sdio; _pin_clk = pin_clk; _pin_cs = pin_cs; @@ -266,7 +267,7 @@ void CMT2300A::flush_rx(void) bool CMT2300A::_init_pins() { - CMT2300A_InitSpi(_pin_sdio, _pin_clk, _pin_cs, _pin_fcs, _spi_speed); + CMT2300A_InitSpi(_spi_host, _pin_sdio, _pin_clk, _pin_cs, _pin_fcs, _spi_speed); return true; // assuming pins are connected properly } diff --git a/lib/CMT2300a/cmt2300wrapper.h b/lib/CMT2300a/cmt2300wrapper.h index d1639fe9..b818d972 100644 --- a/lib/CMT2300a/cmt2300wrapper.h +++ b/lib/CMT2300a/cmt2300wrapper.h @@ -2,6 +2,7 @@ #pragma once #include +#include #define CMT2300A_ONE_STEP_SIZE 2500 // frequency channel step size for fast frequency hopping operation: One step size is 2.5 kHz. #define FH_OFFSET 100 // value * CMT2300A_ONE_STEP_SIZE = channel frequency offset @@ -18,7 +19,7 @@ enum FrequencyBand_t { class CMT2300A { public: - CMT2300A(const uint8_t pin_sdio, const uint8_t pin_clk, const uint8_t pin_cs, const uint8_t pin_fcs, const uint32_t _spi_speed = CMT_SPI_SPEED); + CMT2300A(const spi_host_device_t spi_host, const uint8_t pin_sdio, const uint8_t pin_clk, const uint8_t pin_cs, const uint8_t pin_fcs, const uint32_t _spi_speed = CMT_SPI_SPEED); bool begin(void); @@ -128,6 +129,7 @@ private: */ bool _init_radio(); + spi_host_device_t _spi_host; int8_t _pin_sdio; int8_t _pin_clk; int8_t _pin_cs; diff --git a/lib/CMT2300a/cmt_spi3.c b/lib/CMT2300a/cmt_spi3.c index 59aad36f..7263f4d1 100644 --- a/lib/CMT2300a/cmt_spi3.c +++ b/lib/CMT2300a/cmt_spi3.c @@ -1,6 +1,5 @@ #include "cmt_spi3.h" #include -#include #include // for esp_rom_gpio_connect_out_signal SemaphoreHandle_t paramLock = NULL; @@ -9,14 +8,9 @@ SemaphoreHandle_t paramLock = NULL; } while (xSemaphoreTake(paramLock, portMAX_DELAY) != pdPASS) #define SPI_PARAM_UNLOCK() xSemaphoreGive(paramLock) -// for ESP32 this is the so-called HSPI -// for ESP32-S2/S3/C3 this nomenclature does not really exist anymore, -// it is simply the first externally usable hardware SPI master controller -#define SPI_CMT SPI2_HOST - spi_device_handle_t spi_reg, spi_fifo; -void cmt_spi3_init(const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const uint32_t spi_speed) +void cmt_spi3_init(const spi_host_device_t spi_host, const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const uint32_t spi_speed) { paramLock = xSemaphoreCreateMutex(); @@ -43,8 +37,8 @@ void cmt_spi3_init(const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin .post_cb = NULL, }; - ESP_ERROR_CHECK(spi_bus_initialize(SPI_CMT, &buscfg, SPI_DMA_DISABLED)); - ESP_ERROR_CHECK(spi_bus_add_device(SPI_CMT, &devcfg, &spi_reg)); + ESP_ERROR_CHECK(spi_bus_initialize(spi_host, &buscfg, SPI_DMA_DISABLED)); + ESP_ERROR_CHECK(spi_bus_add_device(spi_host, &devcfg, &spi_reg)); // FiFo spi_device_interface_config_t devcfg2 = { @@ -61,9 +55,9 @@ void cmt_spi3_init(const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin .pre_cb = NULL, .post_cb = NULL, }; - ESP_ERROR_CHECK(spi_bus_add_device(SPI_CMT, &devcfg2, &spi_fifo)); + ESP_ERROR_CHECK(spi_bus_add_device(spi_host, &devcfg2, &spi_fifo)); - esp_rom_gpio_connect_out_signal(pin_sdio, spi_periph_signal[SPI_CMT].spid_out, true, false); + esp_rom_gpio_connect_out_signal(pin_sdio, spi_periph_signal[spi_host].spid_out, true, false); delay(100); } diff --git a/lib/CMT2300a/cmt_spi3.h b/lib/CMT2300a/cmt_spi3.h index 6d3a67b6..5cce47db 100644 --- a/lib/CMT2300a/cmt_spi3.h +++ b/lib/CMT2300a/cmt_spi3.h @@ -2,8 +2,9 @@ #define __CMT_SPI3_H #include +#include -void cmt_spi3_init(const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const uint32_t spi_speed); +void cmt_spi3_init(const spi_host_device_t spi_host, const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const uint32_t spi_speed); void cmt_spi3_write(const uint8_t addr, const uint8_t dat); uint8_t cmt_spi3_read(const uint8_t addr); diff --git a/lib/Hoymiles/src/Hoymiles.cpp b/lib/Hoymiles/src/Hoymiles.cpp index 67fe497c..fe7e3ee2 100644 --- a/lib/Hoymiles/src/Hoymiles.cpp +++ b/lib/Hoymiles/src/Hoymiles.cpp @@ -31,9 +31,9 @@ void HoymilesClass::initNRF(SPIClass* initialisedSpiBus, const uint8_t pinCE, co _radioNrf->init(initialisedSpiBus, pinCE, pinIRQ); } -void HoymilesClass::initCMT(const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const int8_t pin_gpio2, const int8_t pin_gpio3) +void HoymilesClass::initCMT(const spi_host_device_t spi_host, const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const int8_t pin_gpio2, const int8_t pin_gpio3) { - _radioCmt->init(pin_sdio, pin_clk, pin_cs, pin_fcs, pin_gpio2, pin_gpio3); + _radioCmt->init(spi_host, pin_sdio, pin_clk, pin_cs, pin_fcs, pin_gpio2, pin_gpio3); } void HoymilesClass::loop() diff --git a/lib/Hoymiles/src/Hoymiles.h b/lib/Hoymiles/src/Hoymiles.h index 86a7d6ca..9c578f3a 100644 --- a/lib/Hoymiles/src/Hoymiles.h +++ b/lib/Hoymiles/src/Hoymiles.h @@ -9,6 +9,7 @@ #include #include #include +#include #define HOY_SYSTEM_CONFIG_PARA_POLL_INTERVAL (2 * 60 * 1000) // 2 minutes #define HOY_SYSTEM_CONFIG_PARA_POLL_MIN_DURATION (4 * 60 * 1000) // at least 4 minutes between sending limit command and read request. Otherwise eventlog entry @@ -17,7 +18,7 @@ class HoymilesClass { public: void init(); void initNRF(SPIClass* initialisedSpiBus, const uint8_t pinCE, const uint8_t pinIRQ); - void initCMT(const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const int8_t pin_gpio2, const int8_t pin_gpio3); + void initCMT(const spi_host_device_t spi_host, const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const int8_t pin_gpio2, const int8_t pin_gpio3); void loop(); void setMessageOutput(Print* output); @@ -54,4 +55,4 @@ private: Print* _messageOutput = &Serial; }; -extern HoymilesClass Hoymiles; \ No newline at end of file +extern HoymilesClass Hoymiles; diff --git a/lib/Hoymiles/src/HoymilesRadio_CMT.cpp b/lib/Hoymiles/src/HoymilesRadio_CMT.cpp index 035e52f4..1a203cb4 100644 --- a/lib/Hoymiles/src/HoymilesRadio_CMT.cpp +++ b/lib/Hoymiles/src/HoymilesRadio_CMT.cpp @@ -83,11 +83,11 @@ bool HoymilesRadio_CMT::cmtSwitchDtuFreq(const uint32_t to_frequency) return true; } -void HoymilesRadio_CMT::init(const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const int8_t pin_gpio2, const int8_t pin_gpio3) +void HoymilesRadio_CMT::init(const spi_host_device_t spi_host, const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const int8_t pin_gpio2, const int8_t pin_gpio3) { _dtuSerial.u64 = 0; - _radio.reset(new CMT2300A(pin_sdio, pin_clk, pin_cs, pin_fcs)); + _radio.reset(new CMT2300A(spi_host, pin_sdio, pin_clk, pin_cs, pin_fcs)); _radio->begin(); diff --git a/lib/Hoymiles/src/HoymilesRadio_CMT.h b/lib/Hoymiles/src/HoymilesRadio_CMT.h index 770617fe..b6e54430 100644 --- a/lib/Hoymiles/src/HoymilesRadio_CMT.h +++ b/lib/Hoymiles/src/HoymilesRadio_CMT.h @@ -9,6 +9,7 @@ #include #include #include +#include // number of fragments hold in buffer #define FRAGMENT_BUFFER_SIZE 30 @@ -41,7 +42,7 @@ struct CountryFrequencyList_t { class HoymilesRadio_CMT : public HoymilesRadio { public: - void init(const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const int8_t pin_gpio2, const int8_t pin_gpio3); + void init(const spi_host_device_t spi_host, const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const int8_t pin_gpio2, const int8_t pin_gpio3); void loop(); void setPALevel(const int8_t paLevel); void setInverterTargetFrequency(const uint32_t frequency); diff --git a/src/Huawei_can.cpp b/src/Huawei_can.cpp index aef57a19..e4446a32 100644 --- a/src/Huawei_can.cpp +++ b/src/Huawei_can.cpp @@ -9,6 +9,7 @@ #include "PowerLimiter.h" #include "Configuration.h" #include "Battery.h" +#include "SPIPortManager.h" #include #include @@ -35,7 +36,11 @@ void HuaweiCanCommunicationTask(void* parameter) { bool HuaweiCanCommClass::init(uint8_t huawei_miso, uint8_t huawei_mosi, uint8_t huawei_clk, uint8_t huawei_irq, uint8_t huawei_cs, uint32_t frequency) { - SPI = new SPIClass(HSPI); + + auto oSPInum = SPIPortManager.allocatePort("Huawei CAN"); + if (!oSPInum) { return false; } + + SPI = new SPIClass(*oSPInum); SPI->begin(huawei_clk, huawei_miso, huawei_mosi, huawei_cs); pinMode(huawei_cs, OUTPUT); digitalWrite(huawei_cs, HIGH); @@ -231,7 +236,7 @@ void HuaweiCanClass::updateSettings(uint8_t huawei_miso, uint8_t huawei_mosi, ui _mode = HUAWEI_MODE_AUTO_INT; } - xTaskCreate(HuaweiCanCommunicationTask,"HUAWEI_CAN_0",1000,NULL,0,&_HuaweiCanCommunicationTaskHdl); + xTaskCreate(HuaweiCanCommunicationTask,"HUAWEI_CAN_0",2000,NULL,0,&_HuaweiCanCommunicationTaskHdl); MessageOutput.println("[HuaweiCanClass::init] MCP2515 Initialized Successfully!"); _initialized = true; diff --git a/src/InverterSettings.cpp b/src/InverterSettings.cpp index 3be1927c..ffe4d845 100644 --- a/src/InverterSettings.cpp +++ b/src/InverterSettings.cpp @@ -7,22 +7,9 @@ #include "MessageOutput.h" #include "PinMapping.h" #include "SunPosition.h" +#include "SPIPortManager.h" #include -// the NRF shall use the second externally usable HW SPI controller -// for ESP32 that is the so-called VSPI, for ESP32-S2/S3 it is now called implicitly -// HSPI, as it has shifted places for these chip generations -// for all generations, this is equivalent to SPI3_HOST in the lower level driver -// For ESP32-C2, the only externally usable HW SPI controller is SPI2, its signal names -// being prefixed with FSPI. -#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 -#define SPI_NRF HSPI -#elif CONFIG_IDF_TARGET_ESP32C3 -#define SPI_NRF FSPI -#else -#define SPI_NRF VSPI -#endif - InverterSettingsClass InverterSettings; InverterSettingsClass::InverterSettingsClass() @@ -37,24 +24,32 @@ void InverterSettingsClass::init(Scheduler& scheduler) const PinMapping_t& pin = PinMapping.get(); // Initialize inverter communication - MessageOutput.print("Initialize Hoymiles interface... "); + MessageOutput.println("Initialize Hoymiles interface... "); Hoymiles.setMessageOutput(&MessageOutput); Hoymiles.init(); if (PinMapping.isValidNrf24Config() || PinMapping.isValidCmt2300Config()) { if (PinMapping.isValidNrf24Config()) { - SPIClass* spiClass = new SPIClass(SPI_NRF); - spiClass->begin(pin.nrf24_clk, pin.nrf24_miso, pin.nrf24_mosi, pin.nrf24_cs); - Hoymiles.initNRF(spiClass, pin.nrf24_en, pin.nrf24_irq); + auto oSPInum = SPIPortManager.allocatePort("NRF24"); + + if (oSPInum) { + SPIClass* spiClass = new SPIClass(*oSPInum); + spiClass->begin(pin.nrf24_clk, pin.nrf24_miso, pin.nrf24_mosi, pin.nrf24_cs); + Hoymiles.initNRF(spiClass, pin.nrf24_en, pin.nrf24_irq); + } } if (PinMapping.isValidCmt2300Config()) { - Hoymiles.initCMT(pin.cmt_sdio, pin.cmt_clk, pin.cmt_cs, pin.cmt_fcs, pin.cmt_gpio2, pin.cmt_gpio3); - MessageOutput.println(" Setting country mode... "); - Hoymiles.getRadioCmt()->setCountryMode(static_cast(config.Dtu.Cmt.CountryMode)); - MessageOutput.println(" Setting CMT target frequency... "); - Hoymiles.getRadioCmt()->setInverterTargetFrequency(config.Dtu.Cmt.Frequency); + auto oSPInum = SPIPortManager.allocatePort("CMT2300A"); + + if (oSPInum) { + Hoymiles.initCMT(SPIPortManager.SPIhostNum(*oSPInum), pin.cmt_sdio, pin.cmt_clk, pin.cmt_cs, pin.cmt_fcs, pin.cmt_gpio2, pin.cmt_gpio3); + MessageOutput.println(" Setting country mode... "); + Hoymiles.getRadioCmt()->setCountryMode(static_cast(config.Dtu.Cmt.CountryMode)); + MessageOutput.println(" Setting CMT target frequency... "); + Hoymiles.getRadioCmt()->setInverterTargetFrequency(config.Dtu.Cmt.Frequency); + } } MessageOutput.println(" Setting radio PA level... "); diff --git a/src/SPIPortManager.cpp b/src/SPIPortManager.cpp new file mode 100644 index 00000000..8b64c423 --- /dev/null +++ b/src/SPIPortManager.cpp @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +#include "SPIPortManager.h" +#include "MessageOutput.h" + +SPIPortManagerClass SPIPortManager; +static constexpr char TAG[] = "[SPIPortManager]"; + +void SPIPortManagerClass::init() { + MessageOutput.printf("%s SPI0 and SPI1 reserved by 'Flash and PSRAM'\r\n", TAG); + _ports[0] = "Flash"; + _ports[1] = "PSRAM"; +} + +std::optional SPIPortManagerClass::allocatePort(std::string const& owner) +{ + for (size_t i = 0; i < _ports.size(); ++i) { + if (_ports[i] != "") { + MessageOutput.printf("%s SPI%d already in use by '%s'\r\n", TAG, i, _ports[i].c_str()); + continue; + } + + _ports[i] = owner; + + MessageOutput.printf("%s SPI%d now in use by '%s'\r\n", TAG, i, owner.c_str()); + + return i + _offset_spi_num; + } + + MessageOutput.printf("%s Cannot assign another SPI port to '%s'\r\n", TAG, owner.c_str()); + return std::nullopt; +} + +void SPIPortManagerClass::freePort(std::string const& owner) +{ + for (size_t i = 0; i < _ports.size(); ++i) { + if (_ports[i] != owner) { continue; } + + MessageOutput.printf("%s Freeing SPI%d, owner was '%s'\r\n", TAG, i + _offset_spi_num, owner.c_str()); + _ports[i] = ""; + } +} + +spi_host_device_t SPIPortManagerClass::SPIhostNum(uint8_t spi_num) +{ + return (spi_host_device_t)(spi_num + _offset_spi_host); +} diff --git a/src/main.cpp b/src/main.cpp index 7489a27d..5743f428 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -9,6 +9,7 @@ #include "Led_Single.h" #include "MessageOutput.h" #include "SerialPortManager.h" +#include "SPIPortManager.h" #include "VictronMppt.h" #include "Battery.h" #include "Huawei_can.h" @@ -47,7 +48,7 @@ void setup() Serial.begin(SERIAL_BAUDRATE); #if ARDUINO_USB_CDC_ON_BOOT Serial.setTxTimeoutMs(0); - delay(100); + delay(200); #else while (!Serial) yield(); @@ -97,7 +98,9 @@ void setup() const auto& pin = PinMapping.get(); MessageOutput.println("done"); + // Initialize PortManagers SerialPortManager.init(); + SPIPortManager.init(); // Initialize WiFi MessageOutput.print("Initialize Network... "); From e7d454ff0bfcb70b4576ed2fb9270041171e5cbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20B=C3=B6hm?= Date: Mon, 19 Aug 2024 20:49:37 +0200 Subject: [PATCH 02/26] Feature: support 'use battery at night' without VE.Direct previously, we needed VE.Direct enabled to know the solar charge controller output, which solely decided when it was "nighttime". since this is now determined by the wall clock, we can offer this feature to users without a Victron charge controller connected using VE.Direct. --- src/PowerLimiter.cpp | 3 +-- src/WebApi_powerlimiter.cpp | 2 +- webapp/src/views/PowerLimiterAdminView.vue | 19 ++++++++++++------- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/PowerLimiter.cpp b/src/PowerLimiter.cpp index 1c471a3d..93f027b0 100644 --- a/src/PowerLimiter.cpp +++ b/src/PowerLimiter.cpp @@ -251,8 +251,7 @@ void PowerLimiterClass::loop() if (isStartThresholdReached()) { return true; } - if (config.PowerLimiter.SolarPassThroughEnabled && - config.PowerLimiter.BatteryAlwaysUseAtNight && + if (config.PowerLimiter.BatteryAlwaysUseAtNight && !isDayPeriod && !_batteryDischargeEnabled) { _nighttimeDischarging = true; diff --git a/src/WebApi_powerlimiter.cpp b/src/WebApi_powerlimiter.cpp index b28380d3..adea6105 100644 --- a/src/WebApi_powerlimiter.cpp +++ b/src/WebApi_powerlimiter.cpp @@ -153,13 +153,13 @@ void WebApiPowerLimiterClass::onAdminPost(AsyncWebServerRequest* request) if (config.Vedirect.Enabled) { config.PowerLimiter.SolarPassThroughEnabled = root["solar_passthrough_enabled"].as(); config.PowerLimiter.SolarPassThroughLosses = root["solar_passthrough_losses"].as(); - config.PowerLimiter.BatteryAlwaysUseAtNight= root["battery_always_use_at_night"].as(); config.PowerLimiter.FullSolarPassThroughStartVoltage = static_cast(root["full_solar_passthrough_start_voltage"].as() * 100) / 100.0; config.PowerLimiter.FullSolarPassThroughStopVoltage = static_cast(root["full_solar_passthrough_stop_voltage"].as() * 100) / 100.0; } config.PowerLimiter.IsInverterBehindPowerMeter = root["is_inverter_behind_powermeter"].as(); config.PowerLimiter.IsInverterSolarPowered = root["is_inverter_solar_powered"].as(); + config.PowerLimiter.BatteryAlwaysUseAtNight = root["battery_always_use_at_night"].as(); config.PowerLimiter.UseOverscalingToCompensateShading = root["use_overscaling_to_compensate_shading"].as(); config.PowerLimiter.InverterId = root["inverter_serial"].as(); config.PowerLimiter.InverterChannelId = root["inverter_channel_id"].as(); diff --git a/webapp/src/views/PowerLimiterAdminView.vue b/webapp/src/views/PowerLimiterAdminView.vue index c87d8ffe..96f51ed4 100644 --- a/webapp/src/views/PowerLimiterAdminView.vue +++ b/webapp/src/views/PowerLimiterAdminView.vue @@ -105,6 +105,14 @@ wide /> + +
- - Date: Tue, 20 Aug 2024 23:44:27 +0200 Subject: [PATCH 03/26] fix: update mqtt subscriptions when topic changed (#1156) * update mqtt subscriptions when topic was changed * DPL/Huawei: manage MQTT subscriptions in map --------- Co-authored-by: Bernhard Kirchen --- include/MqttHandleHuawei.h | 16 ++++++++++++++ include/MqttHandlePowerLimiter.h | 21 +++++++++++++++++++ src/MqttHandleHuawei.cpp | 33 ++++++++++++++++++++--------- src/MqttHandlePowerLimiter.cpp | 36 ++++++++++++++++++++------------ src/WebApi_mqtt.cpp | 15 +++++++++++++ 5 files changed, 98 insertions(+), 23 deletions(-) diff --git a/include/MqttHandleHuawei.h b/include/MqttHandleHuawei.h index f7f6f4c2..c83fdd31 100644 --- a/include/MqttHandleHuawei.h +++ b/include/MqttHandleHuawei.h @@ -8,11 +8,18 @@ #include #include #include +#include +#include class MqttHandleHuaweiClass { public: void init(Scheduler& scheduler); + void forceUpdate(); + + void subscribeTopics(); + void unsubscribeTopics(); + private: void loop(); @@ -24,6 +31,15 @@ private: Mode }; + static constexpr frozen::string _cmdtopic = "huawei/cmd/"; + static constexpr frozen::map _subscriptions = { + { "limit_online_voltage", Topic::LimitOnlineVoltage }, + { "limit_online_current", Topic::LimitOnlineCurrent }, + { "limit_offline_voltage", Topic::LimitOfflineVoltage }, + { "limit_offline_current", Topic::LimitOfflineCurrent }, + { "mode", Topic::Mode }, + }; + void onMqttMessage(Topic t, const espMqttClientTypes::MessageProperties& properties, const char* topic, const uint8_t* payload, size_t len, diff --git a/include/MqttHandlePowerLimiter.h b/include/MqttHandlePowerLimiter.h index 12f2a714..fb449cba 100644 --- a/include/MqttHandlePowerLimiter.h +++ b/include/MqttHandlePowerLimiter.h @@ -7,11 +7,18 @@ #include #include #include +#include +#include class MqttHandlePowerLimiterClass { public: void init(Scheduler& scheduler); + void forceUpdate(); + + void subscribeTopics(); + void unsubscribeTopics(); + private: void loop(); @@ -28,6 +35,20 @@ private: TargetPowerConsumption }; + static constexpr frozen::string _cmdtopic = "powerlimiter/cmd/"; + static constexpr frozen::map _subscriptions = { + { "threshold/soc/start", MqttPowerLimiterCommand::BatterySoCStartThreshold }, + { "threshold/soc/stop", MqttPowerLimiterCommand::BatterySoCStopThreshold }, + { "threshold/soc/full_solar_passthrough", MqttPowerLimiterCommand::FullSolarPassthroughSoC }, + { "threshold/voltage/start", MqttPowerLimiterCommand::VoltageStartThreshold }, + { "threshold/voltage/stop", MqttPowerLimiterCommand::VoltageStopThreshold }, + { "threshold/voltage/full_solar_passthrough_start", MqttPowerLimiterCommand::FullSolarPassThroughStartVoltage }, + { "threshold/voltage/full_solar_passthrough_stop", MqttPowerLimiterCommand::FullSolarPassThroughStopVoltage }, + { "mode", MqttPowerLimiterCommand::Mode }, + { "upper_power_limit", MqttPowerLimiterCommand::UpperPowerLimit }, + { "target_power_consumption", MqttPowerLimiterCommand::TargetPowerConsumption }, + }; + void onMqttCmd(MqttPowerLimiterCommand command, const espMqttClientTypes::MessageProperties& properties, const char* topic, const uint8_t* payload, size_t len, size_t index, size_t total); Task _loopTask; diff --git a/src/MqttHandleHuawei.cpp b/src/MqttHandleHuawei.cpp index 2afab15d..f376458a 100644 --- a/src/MqttHandleHuawei.cpp +++ b/src/MqttHandleHuawei.cpp @@ -6,7 +6,6 @@ #include "MessageOutput.h" #include "MqttSettings.h" #include "Huawei_can.h" -// #include "Failsafe.h" #include "WebApi_Huawei.h" #include @@ -19,10 +18,22 @@ void MqttHandleHuaweiClass::init(Scheduler& scheduler) _loopTask.setIterations(TASK_FOREVER); _loopTask.enable(); + subscribeTopics(); + + _lastPublish = millis(); +} + +void MqttHandleHuaweiClass::forceUpdate() +{ + _lastPublish = 0; +} + +void MqttHandleHuaweiClass::subscribeTopics() +{ String const& prefix = MqttSettings.getPrefix(); auto subscribe = [&prefix, this](char const* subTopic, Topic t) { - String fullTopic(prefix + "huawei/cmd/" + subTopic); + String fullTopic(prefix + _cmdtopic.data() + subTopic); MqttSettings.subscribe(fullTopic.c_str(), 0, std::bind(&MqttHandleHuaweiClass::onMqttMessage, this, t, std::placeholders::_1, std::placeholders::_2, @@ -30,16 +41,18 @@ void MqttHandleHuaweiClass::init(Scheduler& scheduler) std::placeholders::_5, std::placeholders::_6)); }; - subscribe("limit_online_voltage", Topic::LimitOnlineVoltage); - subscribe("limit_online_current", Topic::LimitOnlineCurrent); - subscribe("limit_offline_voltage", Topic::LimitOfflineVoltage); - subscribe("limit_offline_current", Topic::LimitOfflineCurrent); - subscribe("mode", Topic::Mode); - - _lastPublish = millis(); - + for (auto const& s : _subscriptions) { + subscribe(s.first.data(), s.second); + } } +void MqttHandleHuaweiClass::unsubscribeTopics() +{ + String const prefix = MqttSettings.getPrefix() + _cmdtopic.data(); + for (auto const& s : _subscriptions) { + MqttSettings.unsubscribe(prefix + s.first.data()); + } +} void MqttHandleHuaweiClass::loop() { diff --git a/src/MqttHandlePowerLimiter.cpp b/src/MqttHandlePowerLimiter.cpp index f01a9b14..744320ed 100644 --- a/src/MqttHandlePowerLimiter.cpp +++ b/src/MqttHandlePowerLimiter.cpp @@ -25,10 +25,22 @@ void MqttHandlePowerLimiterClass::init(Scheduler& scheduler) using std::placeholders::_5; using std::placeholders::_6; + subscribeTopics(); + + _lastPublish = millis(); +} + +void MqttHandlePowerLimiterClass::forceUpdate() +{ + _lastPublish = 0; +} + +void MqttHandlePowerLimiterClass::subscribeTopics() +{ String const& prefix = MqttSettings.getPrefix(); auto subscribe = [&prefix, this](char const* subTopic, MqttPowerLimiterCommand command) { - String fullTopic(prefix + "powerlimiter/cmd/" + subTopic); + String fullTopic(prefix + _cmdtopic.data() + subTopic); MqttSettings.subscribe(fullTopic.c_str(), 0, std::bind(&MqttHandlePowerLimiterClass::onMqttCmd, this, command, std::placeholders::_1, std::placeholders::_2, @@ -36,20 +48,18 @@ void MqttHandlePowerLimiterClass::init(Scheduler& scheduler) std::placeholders::_5, std::placeholders::_6)); }; - subscribe("threshold/soc/start", MqttPowerLimiterCommand::BatterySoCStartThreshold); - subscribe("threshold/soc/stop", MqttPowerLimiterCommand::BatterySoCStopThreshold); - subscribe("threshold/soc/full_solar_passthrough", MqttPowerLimiterCommand::FullSolarPassthroughSoC); - subscribe("threshold/voltage/start", MqttPowerLimiterCommand::VoltageStartThreshold); - subscribe("threshold/voltage/stop", MqttPowerLimiterCommand::VoltageStopThreshold); - subscribe("threshold/voltage/full_solar_passthrough_start", MqttPowerLimiterCommand::FullSolarPassThroughStartVoltage); - subscribe("threshold/voltage/full_solar_passthrough_stop", MqttPowerLimiterCommand::FullSolarPassThroughStopVoltage); - subscribe("mode", MqttPowerLimiterCommand::Mode); - subscribe("upper_power_limit", MqttPowerLimiterCommand::UpperPowerLimit); - subscribe("target_power_consumption", MqttPowerLimiterCommand::TargetPowerConsumption); - - _lastPublish = millis(); + for (auto const& s : _subscriptions) { + subscribe(s.first.data(), s.second); + } } +void MqttHandlePowerLimiterClass::unsubscribeTopics() +{ + String const prefix = MqttSettings.getPrefix() + _cmdtopic.data(); + for (auto const& s : _subscriptions) { + MqttSettings.unsubscribe(prefix + s.first.data()); + } +} void MqttHandlePowerLimiterClass::loop() { diff --git a/src/WebApi_mqtt.cpp b/src/WebApi_mqtt.cpp index 4f76256d..601cc55c 100644 --- a/src/WebApi_mqtt.cpp +++ b/src/WebApi_mqtt.cpp @@ -4,8 +4,12 @@ */ #include "WebApi_mqtt.h" #include "Configuration.h" +#include "MqttHandleBatteryHass.h" #include "MqttHandleHass.h" +#include "MqttHandlePowerLimiterHass.h" #include "MqttHandleInverter.h" +#include "MqttHandleHuawei.h" +#include "MqttHandlePowerLimiter.h" #include "MqttHandleVedirectHass.h" #include "MqttHandleVedirect.h" #include "MqttSettings.h" @@ -307,8 +311,13 @@ void WebApiMqttClass::onMqttAdminPost(AsyncWebServerRequest* request) // Check if base topic was changed if (strcmp(config.Mqtt.Topic, root["mqtt_topic"].as().c_str())) { MqttHandleInverter.unsubscribeTopics(); + MqttHandleHuawei.unsubscribeTopics(); + MqttHandlePowerLimiter.unsubscribeTopics(); + strlcpy(config.Mqtt.Topic, root["mqtt_topic"].as().c_str(), sizeof(config.Mqtt.Topic)); MqttHandleInverter.subscribeTopics(); + MqttHandleHuawei.subscribeTopics(); + MqttHandlePowerLimiter.subscribeTopics(); } WebApi.writeConfig(retMsg); @@ -316,8 +325,14 @@ void WebApiMqttClass::onMqttAdminPost(AsyncWebServerRequest* request) WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__); MqttSettings.performReconnect(); + + MqttHandleBatteryHass.forceUpdate(); MqttHandleHass.forceUpdate(); + MqttHandlePowerLimiterHass.forceUpdate(); MqttHandleVedirectHass.forceUpdate(); + + MqttHandleHuawei.forceUpdate(); + MqttHandlePowerLimiter.forceUpdate(); MqttHandleVedirect.forceUpdate(); } From b115f946cda304e64c8a5e16cc085ef3152fd830 Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Fri, 23 Aug 2024 16:24:01 +0200 Subject: [PATCH 04/26] Fix: update info: compare to respective branch official release builds are built from branch master, as the respective tags point to commits in branch master (only). to check whether or not a new version is available, we should check branch master for new commits. checking against HEAD does not work as expected, at least in the OpenDTU-OnBattery repo, since its default branch is "development", not "master". usually, there should be no commits on master in between releases, so we will now only show "update available" if a new release was made. this is not foolproof, but should work as long as we keep "master" clean. for builds from other branches, the comparison is perfomed against the respective branch. if a user installed a binary built by github actions based on a development branch, the user will see "update available" if new commits were added to the development branch since. for other branches, also pull request builds, the test for updates will fail as the branch name shown in the system info is not actually a branch name, e.g., "helgeerbe/OpenDTU-OnBattery/pr1183-202408212043". --- webapp/src/views/SystemInfoView.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/webapp/src/views/SystemInfoView.vue b/webapp/src/views/SystemInfoView.vue index 5b4e060c..5dd0ca1e 100644 --- a/webapp/src/views/SystemInfoView.vue +++ b/webapp/src/views/SystemInfoView.vue @@ -79,7 +79,8 @@ export default defineComponent({ const fetchUrl = 'https://api.github.com/repos/helgeerbe/OpenDTU-OnBattery/compare/' + this.systemDataList.git_hash + - '...HEAD'; + '...' + + this.systemDataList.git_branch; fetch(fetchUrl) .then((response) => { From 190e1eb0f95b57460c83db4c7b58e531e66a04ad Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Fri, 23 Aug 2024 17:07:00 +0200 Subject: [PATCH 05/26] adjust update badge color: having an update available is no danger --- webapp/src/views/SystemInfoView.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/src/views/SystemInfoView.vue b/webapp/src/views/SystemInfoView.vue index 5dd0ca1e..d25f9804 100644 --- a/webapp/src/views/SystemInfoView.vue +++ b/webapp/src/views/SystemInfoView.vue @@ -92,7 +92,7 @@ export default defineComponent({ .then((data) => { if (data.total_commits > 0) { this.systemDataList.update_text = this.$t('systeminfo.VersionNew'); - this.systemDataList.update_status = 'text-bg-danger'; + this.systemDataList.update_status = 'text-bg-warning'; this.systemDataList.update_url = data.html_url; } else { this.systemDataList.update_text = this.$t('systeminfo.VersionOk'); From dcc8313c8c57506b97e6be4447c4d8354bf6f6ed Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Fri, 23 Aug 2024 17:15:35 +0200 Subject: [PATCH 06/26] webapp "About" view: link to opendtu-onbattery.net --- webapp/src/locales/de.json | 2 +- webapp/src/locales/en.json | 2 +- webapp/src/locales/fr.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/webapp/src/locales/de.json b/webapp/src/locales/de.json index 7771a0c2..735f3c97 100644 --- a/webapp/src/locales/de.json +++ b/webapp/src/locales/de.json @@ -778,7 +778,7 @@ "about": { "AboutOpendtu": "Über OpenDTU-OnBattery", "Documentation": "Dokumentation", - "DocumentationBody": "Die Firmware- und Hardware-Dokumentation des Basis-Projektes ist hier zu finden: https://www.opendtu.solar
Zusätzliche Informationen, insbesondere zu OpenDTU-OnBattery-spezifischen Funktionen, gibt es im Wiki auf Github.", + "DocumentationBody": "Die maßgebliche Firmware- und Hardware-Dokumentation ist erreichbar unter https://opendtu-onbattery.net.", "ProjectOrigin": "Projekt Ursprung", "ProjectOriginBody1": "OpenDTU-OnBattery ist eine Erweiterung von OpenDTU. Das Basis-Projekt OpenDTU wurde aus dieser Diskussion (mikrocontroller.net) heraus gestartet.", "ProjectOriginBody2": "Das Hoymiles-Protokoll wurde durch die freiwilligen Bemühungen vieler Teilnehmer entschlüsselt. OpenDTU wurde unter anderem auf der Grundlage dieser Arbeit entwickelt. Das Projekt ist unter einer Open-Source-Lizenz lizenziert (GNU General Public License version 2).", diff --git a/webapp/src/locales/en.json b/webapp/src/locales/en.json index 0be700f0..b94ad01b 100644 --- a/webapp/src/locales/en.json +++ b/webapp/src/locales/en.json @@ -781,7 +781,7 @@ "about": { "AboutOpendtu": "About OpenDTU-OnBattery", "Documentation": "Documentation", - "DocumentationBody": "The firmware and hardware documentation of the upstream project can be found here: https://www.opendtu.solar
Additional information, especially regarding OpenDTU-OnBattery-specific features, can be accessed at the Github Wiki.", + "DocumentationBody": "The canonical firmware and hardware documentation is accessible at https://opendtu-onbattery.net.", "ProjectOrigin": "Project Origin", "ProjectOriginBody1": "OpenDTU-OnBattery is a fork of OpenDTU. The upstream project OpenDTU was started from this discussion. (Mikrocontroller.net)", "ProjectOriginBody2": "The Hoymiles protocol was decrypted through the voluntary efforts of many participants. OpenDTU, among others, was developed based on this work. The project is licensed under an Open Source License (GNU General Public License version 2).", diff --git a/webapp/src/locales/fr.json b/webapp/src/locales/fr.json index 316d19d6..852dc833 100644 --- a/webapp/src/locales/fr.json +++ b/webapp/src/locales/fr.json @@ -754,7 +754,7 @@ "about": { "AboutOpendtu": "À propos d'OpenDTU-OnBattery", "Documentation": "Documentation", - "DocumentationBody": "The firmware and hardware documentation of the upstream project can be found here: https://www.opendtu.solar
Additional information, especially regarding OpenDTU-OnBattery-specific features, can be accessed at the Github Wiki.", + "DocumentationBody": "La documentation canonique sur les microprogrammes et le matériel est accessible à l'adresse https://opendtu-onbattery.net.", "ProjectOrigin": "Origine du projet", "ProjectOriginBody1": "Ce projet a été démarré suite à cette discussion (Mikrocontroller.net).", "ProjectOriginBody2": "Le protocole Hoymiles a été décrypté grâce aux efforts volontaires de nombreux participants. OpenDTU, entre autres, a été développé sur la base de ce travail. Le projet est sous licence Open Source (GNU General Public License version 2).", From 821bc2756242f63131bd482dfeaaedd1576541be Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Sat, 24 Aug 2024 21:06:44 +0200 Subject: [PATCH 07/26] Fix: VE.Direct data is invalid if no controller has valid data the original implementation of the isDataValid() method worked by returning false if any of the charge controllers had invalid data. if no charge controllers were configured, this function then also needed to also return false. the logic was changed in 415c767d such that if at least one charge controller had valid data, the function would return true. this would have required to adjust the default return statement as well, but it was not. if the user enabled VE.Diret and configured at least one charge controller in the pin mapping, but this controller never delivered any data, the function would now errorneously return true, because the container is not empty. however, if no controller has valid data, this now means we exit the loop and then the return value must be false, which is also desired if the container is empty. --- src/VictronMppt.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/VictronMppt.cpp b/src/VictronMppt.cpp index 4e084974..a994e20d 100644 --- a/src/VictronMppt.cpp +++ b/src/VictronMppt.cpp @@ -87,7 +87,7 @@ bool VictronMpptClass::isDataValid() const if (upController->isDataValid()) { return true; } } - return !_controllers.empty(); + return false; } bool VictronMpptClass::isDataValid(size_t idx) const From 2127b0b0802c485740189b579ab88487dfd7ab01 Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Sat, 24 Aug 2024 21:12:25 +0200 Subject: [PATCH 08/26] Fix: SMA HomeManager PowerMeter must announce new values the SMA power meter implementation did not announce that it received a new datum, such that the power meter data age was never reset. this made the power meter values outdated and hence invalid, even though new values were received and processed. --- src/PowerMeterUdpSmaHomeManager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/PowerMeterUdpSmaHomeManager.cpp b/src/PowerMeterUdpSmaHomeManager.cpp index 2baa9c43..330d9737 100644 --- a/src/PowerMeterUdpSmaHomeManager.cpp +++ b/src/PowerMeterUdpSmaHomeManager.cpp @@ -139,6 +139,7 @@ uint8_t* PowerMeterUdpSmaHomeManager::decodeGroup(uint8_t* offset, uint16_t grou Soutput(kanal, index, art, tarif, "Leistung L2", _powerMeterL2, timestamp); Soutput(kanal, index, art, tarif, "Leistung L3", _powerMeterL3, timestamp); count = 0; + gotUpdate(); } continue; From b5785d032e90cdc1ec04c8744e2f349abe73d307 Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Sat, 24 Aug 2024 21:26:35 +0200 Subject: [PATCH 09/26] print SMA HomeManager timestamp as unsigned number --- src/PowerMeterUdpSmaHomeManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PowerMeterUdpSmaHomeManager.cpp b/src/PowerMeterUdpSmaHomeManager.cpp index 330d9737..d68275c2 100644 --- a/src/PowerMeterUdpSmaHomeManager.cpp +++ b/src/PowerMeterUdpSmaHomeManager.cpp @@ -18,7 +18,7 @@ void PowerMeterUdpSmaHomeManager::Soutput(int kanal, int index, int art, int tar { if (!_verboseLogging) { return; } - MessageOutput.printf("[PowerMeterUdpSmaHomeManager] %s = %.1f (timestamp %d)\r\n", + MessageOutput.printf("[PowerMeterUdpSmaHomeManager] %s = %.1f (timestamp %u)\r\n", name, value, timestamp); } From 63612e92767ba9a7b88f918808e7f178b22c9db6 Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Wed, 21 Aug 2024 21:16:16 +0200 Subject: [PATCH 10/26] Fix: restart TCP connection if HTTP server sends Connection:close we previously performed a whole new GET request when doing digest authentication. it seemed beneficial to reuse the TCP connection to perform the second GET request, which includes the authentication tokens. however, if the server sends "Connection: close" we must not requse the TCP connection for another HTTP request. this broke authentication against Shelly devices (at least those with original firmware). now we explicitly set "Connection: keep-alive" in our request, and reuse the TCP connection only if te server replies with "Connection: keep-alive" as well. --- include/HttpGetter.h | 12 +++++++++++- src/HttpGetter.cpp | 21 ++++++++++++++++++--- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/include/HttpGetter.h b/include/HttpGetter.h index 11ece109..41b354f4 100644 --- a/include/HttpGetter.h +++ b/include/HttpGetter.h @@ -9,7 +9,17 @@ #include #include -using up_http_client_t = std::unique_ptr; +class HttpGetterClient : public HTTPClient { +public: + void restartTCP() { + // keeps the NetworkClient, and closes the TCP connections (as we + // effectively do not support keep-alive with HTTP 1.0). + HTTPClient::disconnect(true); + HTTPClient::connect(); + } +}; + +using up_http_client_t = std::unique_ptr; using sp_wifi_client_t = std::shared_ptr; class HttpRequestResult { diff --git a/src/HttpGetter.cpp b/src/HttpGetter.cpp index 8b2e158e..1bd1d9b3 100644 --- a/src/HttpGetter.cpp +++ b/src/HttpGetter.cpp @@ -100,7 +100,7 @@ HttpRequestResult HttpGetter::performGetRequest() } } - auto upTmpHttpClient = std::make_unique(); + auto upTmpHttpClient = std::make_unique(); // use HTTP1.0 to avoid problems with chunked transfer encoding when the // stream is later used to read the server's response. @@ -135,8 +135,13 @@ HttpRequestResult HttpGetter::performGetRequest() break; } case Auth_t::Digest: { - const char *headers[1] = {"WWW-Authenticate"}; - upTmpHttpClient->collectHeaders(headers, 1); + // send "Connection: keep-alive" (despite using HTTP/1.0, where + // "Connection: close" is the default) so there is a chance to + // reuse the TCP connection when performing the second GET request. + upTmpHttpClient->setReuse(true); + + const char *headers[2] = {"WWW-Authenticate", "Connection"}; + upTmpHttpClient->collectHeaders(headers, 2); break; } } @@ -152,6 +157,16 @@ HttpRequestResult HttpGetter::performGetRequest() String authReq = upTmpHttpClient->header("WWW-Authenticate"); String authorization = getAuthDigest(authReq, 1); upTmpHttpClient->addHeader("Authorization", authorization); + + // use a new TCP connection if the server sent "Connection: close". + bool restart = true; + if (upTmpHttpClient->hasHeader("Connection")) { + String connection = upTmpHttpClient->header("Connection"); + connection.toLowerCase(); + restart = connection.indexOf("keep-alive") == -1; + } + if (restart) { upTmpHttpClient->restartTCP(); } + httpCode = upTmpHttpClient->GET(); } From fd3b65f4bd19852a0b265f753d032e711a7eae44 Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Wed, 21 Aug 2024 21:21:11 +0200 Subject: [PATCH 11/26] Feature: HttpGetter: support MD5 digest authentication the MD5 scheme should still be widely deployed, even though it is deprecated. it is also still the default if not specific algorithm is requested by the server. --- include/HttpGetter.h | 2 +- src/HttpGetter.cpp | 74 ++++++++++++++++++++++++++++++++------------ 2 files changed, 56 insertions(+), 20 deletions(-) diff --git a/include/HttpGetter.h b/include/HttpGetter.h index 41b354f4..d1690a93 100644 --- a/include/HttpGetter.h +++ b/include/HttpGetter.h @@ -69,7 +69,7 @@ public: char const* getErrorText() const { return _errBuffer; } private: - String getAuthDigest(String const& authReq, unsigned int counter); + std::pair getAuthDigest(String const& authReq, unsigned int counter); HttpRequestConfig const& _config; template diff --git a/src/HttpGetter.cpp b/src/HttpGetter.cpp index 1bd1d9b3..226b8bbe 100644 --- a/src/HttpGetter.cpp +++ b/src/HttpGetter.cpp @@ -2,6 +2,7 @@ #include "HttpGetter.h" #include #include "mbedtls/sha256.h" +#include "mbedtls/md5.h" #include #include @@ -155,8 +156,12 @@ HttpRequestResult HttpGetter::performGetRequest() return { false }; } String authReq = upTmpHttpClient->header("WWW-Authenticate"); - String authorization = getAuthDigest(authReq, 1); - upTmpHttpClient->addHeader("Authorization", authorization); + auto authorization = getAuthDigest(authReq, 1); + if (!authorization.first) { + logError("Digest Error: %s", authorization.second.c_str()); + return { false }; + } + upTmpHttpClient->addHeader("Authorization", authorization.second); // use a new TCP connection if the server sent "Connection: close". bool restart = true; @@ -183,6 +188,29 @@ HttpRequestResult HttpGetter::performGetRequest() return { true, std::move(upTmpHttpClient), _spWiFiClient }; } +template +static String bin2hex(uint8_t* hash) { + size_t constexpr kOutLen = binLen * 2 + 1; + char res[kOutLen]; + for (int i = 0; i < binLen; i++) { + snprintf(res + (i*2), sizeof(res) - (i*2), "%02x", hash[i]); + } + return res; +} + +static String md5(const String& data) { + uint8_t hash[16]; + + mbedtls_md5_context ctx; + mbedtls_md5_init(&ctx); + mbedtls_md5_starts_ret(&ctx); + mbedtls_md5_update_ret(&ctx, reinterpret_cast(data.c_str()), data.length()); + mbedtls_md5_finish_ret(&ctx, hash); + mbedtls_md5_free(&ctx); + + return bin2hex(hash); +} + static String sha256(const String& data) { uint8_t hash[32]; @@ -193,12 +221,7 @@ static String sha256(const String& data) { mbedtls_sha256_finish(&ctx, hash); mbedtls_sha256_free(&ctx); - char res[sizeof(hash) * 2 + 1]; - for (int i = 0; i < sizeof(hash); i++) { - snprintf(res + (i*2), sizeof(res) - (i*2), "%02x", hash[i]); - } - - return res; + return bin2hex(hash); } static String extractParam(String const& authReq, String const& param, char delimiter) { @@ -219,7 +242,22 @@ static String getcNonce(int len) { return s; } -String HttpGetter::getAuthDigest(String const& authReq, unsigned int counter) { +static std::pair getAlgo(String const& authReq) { + // the algorithm is NOT enclosed in double quotes, so we can't use extractParam + auto paramBegin = authReq.indexOf("algorithm="); + if (paramBegin == -1) { return { true, "MD5" }; } // default as per RFC2617 + auto valueBegin = paramBegin + 10; + + String algo = authReq.substring(valueBegin, valueBegin + 3); + if (algo == "MD5") { return { true, algo }; } + + algo = authReq.substring(valueBegin, valueBegin + 7); + if (algo == "SHA-256") { return { true, algo }; } + + return { false, "unsupported digest algorithm" }; +} + +std::pair HttpGetter::getAuthDigest(String const& authReq, unsigned int counter) { // extracting required parameters for RFC 2617 Digest String realm = extractParam(authReq, "realm=\"", '"'); String nonce = extractParam(authReq, "nonce=\"", '"'); @@ -228,21 +266,19 @@ String HttpGetter::getAuthDigest(String const& authReq, unsigned int counter) { char nc[9]; snprintf(nc, sizeof(nc), "%08x", counter); - // sha256 of the user:realm:password - String ha1 = sha256(String(_config.Username) + ":" + realm + ":" + _config.Password); + auto algo = getAlgo(authReq); + if (!algo.first) { return { false, algo.second }; } - // sha256 of method:uri - String ha2 = sha256("GET:" + _uri); - - // sha256 of h1:nonce:nc:cNonce:auth:h2 - String response = sha256(ha1 + ":" + nonce + ":" + String(nc) + + auto hash = (algo.second == "SHA-256") ? &sha256 : &md5; + String ha1 = hash(String(_config.Username) + ":" + realm + ":" + _config.Password); + String ha2 = hash("GET:" + _uri); + String response = hash(ha1 + ":" + nonce + ":" + String(nc) + ":" + cNonce + ":" + "auth" + ":" + ha2); - // Final authorization String - return String("Digest username=\"") + _config.Username + + return { true, String("Digest username=\"") + _config.Username + "\", realm=\"" + realm + "\", nonce=\"" + nonce + "\", uri=\"" + _uri + "\", cnonce=\"" + cNonce + "\", nc=" + nc + - ", qop=auth, response=\"" + response + "\", algorithm=SHA-256"; + ", qop=auth, response=\"" + response + "\", algorithm=" + algo.second }; } void HttpGetter::addHeader(char const* key, char const* value) From 1cbf18d4a70d6cdcd9c1c189fe615fbf5de13a39 Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Wed, 21 Aug 2024 22:01:10 +0200 Subject: [PATCH 12/26] Feature: HttpGetter: cache digest challenge this allows us to add a valid Authorization header to each but the first GET request, saving us from performing two GET requests every time we want to perform the GET request. we still need a new client nonce and we need to increase the nonce counter, so we also need to calculate a whole new response, as we cannot just reuse the previous Authorization header (that would be a replay attack). --- include/HttpGetter.h | 5 ++++- src/HttpGetter.cpp | 36 ++++++++++++++++++++++++++++-------- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/include/HttpGetter.h b/include/HttpGetter.h index d1690a93..e6103ba9 100644 --- a/include/HttpGetter.h +++ b/include/HttpGetter.h @@ -69,7 +69,7 @@ public: char const* getErrorText() const { return _errBuffer; } private: - std::pair getAuthDigest(String const& authReq, unsigned int counter); + std::pair getAuthDigest(); HttpRequestConfig const& _config; template @@ -81,6 +81,9 @@ private: String _uri; uint16_t _port; + String _wwwAuthenticate = ""; + unsigned _nonceCounter = 0; + sp_wifi_client_t _spWiFiClient; // reused for multiple HTTP requests std::vector> _additionalHeaders; diff --git a/src/HttpGetter.cpp b/src/HttpGetter.cpp index 226b8bbe..664c35dd 100644 --- a/src/HttpGetter.cpp +++ b/src/HttpGetter.cpp @@ -143,6 +143,16 @@ HttpRequestResult HttpGetter::performGetRequest() const char *headers[2] = {"WWW-Authenticate", "Connection"}; upTmpHttpClient->collectHeaders(headers, 2); + + // try with new auth response based on previous WWW-Authenticate + // header, which allows us to retrieve the resource without a + // second GET request. if the server decides that we reused the + // previous challenge too often, it will respond with HTTP401 and + // a new challenge, which we handle as if we had no challenge yet. + auto authorization = getAuthDigest(); + if (authorization.first) { + upTmpHttpClient->addHeader("Authorization", authorization.second); + } break; } } @@ -150,13 +160,21 @@ HttpRequestResult HttpGetter::performGetRequest() int httpCode = upTmpHttpClient->GET(); if (httpCode == HTTP_CODE_UNAUTHORIZED && _config.AuthType == Auth_t::Digest) { + _wwwAuthenticate = ""; + if (!upTmpHttpClient->hasHeader("WWW-Authenticate")) { logError("Cannot perform digest authentication as server did " "not send a WWW-Authenticate header"); return { false }; } - String authReq = upTmpHttpClient->header("WWW-Authenticate"); - auto authorization = getAuthDigest(authReq, 1); + + _wwwAuthenticate = upTmpHttpClient->header("WWW-Authenticate"); + + // using a new WWW-Authenticate challenge means + // we never used the server's nonce in a response + _nonceCounter = 0; + + auto authorization = getAuthDigest(); if (!authorization.first) { logError("Digest Error: %s", authorization.second.c_str()); return { false }; @@ -257,16 +275,18 @@ static std::pair getAlgo(String const& authReq) { return { false, "unsupported digest algorithm" }; } -std::pair HttpGetter::getAuthDigest(String const& authReq, unsigned int counter) { +std::pair HttpGetter::getAuthDigest() { + if (_wwwAuthenticate.isEmpty()) { return { false, "no digest challenge yet" }; } + // extracting required parameters for RFC 2617 Digest - String realm = extractParam(authReq, "realm=\"", '"'); - String nonce = extractParam(authReq, "nonce=\"", '"'); - String cNonce = getcNonce(8); + String realm = extractParam(_wwwAuthenticate, "realm=\"", '"'); + String nonce = extractParam(_wwwAuthenticate, "nonce=\"", '"'); + String cNonce = getcNonce(8); // client nonce char nc[9]; - snprintf(nc, sizeof(nc), "%08x", counter); + snprintf(nc, sizeof(nc), "%08x", ++_nonceCounter); - auto algo = getAlgo(authReq); + auto algo = getAlgo(_wwwAuthenticate); if (!algo.first) { return { false, algo.second }; } auto hash = (algo.second == "SHA-256") ? &sha256 : &md5; From fff0576150cdbe9bbd756af2fb7c43ff6ecb0251 Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Wed, 21 Aug 2024 22:42:10 +0200 Subject: [PATCH 13/26] Fix: initialize HTTP(S)+JSON power meter values --- include/PowerMeterHttpJson.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/PowerMeterHttpJson.h b/include/PowerMeterHttpJson.h index a6c97a4c..2a9e1dd2 100644 --- a/include/PowerMeterHttpJson.h +++ b/include/PowerMeterHttpJson.h @@ -42,7 +42,7 @@ private: uint32_t _lastPoll = 0; mutable std::mutex _valueMutex; - power_values_t _powerValues; + power_values_t _powerValues = {}; std::array, POWERMETER_HTTP_JSON_MAX_VALUES> _httpGetters; From 119bd3a41e35657a671cdf8ac90b3b296fc78198 Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Wed, 28 Aug 2024 15:10:07 +0200 Subject: [PATCH 14/26] Fix: Increase Huawei CAN task stack size the stack size was already increased by Andreas Boehm in df53f34b51 in the context of #1144 (SPI port manager). this change aligns the stack size to a power of two and adds comments. the commit also serves to place this change more prominently as a fix in the changelogs. --- src/Huawei_can.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Huawei_can.cpp b/src/Huawei_can.cpp index e4446a32..adab23f0 100644 --- a/src/Huawei_can.cpp +++ b/src/Huawei_can.cpp @@ -236,7 +236,8 @@ void HuaweiCanClass::updateSettings(uint8_t huawei_miso, uint8_t huawei_mosi, ui _mode = HUAWEI_MODE_AUTO_INT; } - xTaskCreate(HuaweiCanCommunicationTask,"HUAWEI_CAN_0",2000,NULL,0,&_HuaweiCanCommunicationTaskHdl); + xTaskCreate(HuaweiCanCommunicationTask, "HUAWEI_CAN_0", 2048/*stack size*/, + NULL/*params*/, 0/*prio*/, &_HuaweiCanCommunicationTaskHdl); MessageOutput.println("[HuaweiCanClass::init] MCP2515 Initialized Successfully!"); _initialized = true; From 9ebbc58930400270e8ebe4da42d3de8289ec47fb Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Tue, 27 Aug 2024 21:16:48 +0200 Subject: [PATCH 15/26] Fix: Pylontech/Pytes CAN driver: user interrupts at level 2 we are running out of level 1 interrupts on ESP32-S3 boards. for that reason, until this prooves to be another sort of problem, we allocate the TWAI's interrupt for the battery CAN implementation at level 2. --- src/BatteryCanReceiver.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/BatteryCanReceiver.cpp b/src/BatteryCanReceiver.cpp index aca563bb..90ea7b33 100644 --- a/src/BatteryCanReceiver.cpp +++ b/src/BatteryCanReceiver.cpp @@ -26,6 +26,15 @@ bool BatteryCanReceiver::init(bool verboseLogging, char const* providerName) auto rx = static_cast(pin.battery_rx); twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT(tx, rx, TWAI_MODE_NORMAL); + // interrupts at level 1 are in high demand, at least on ESP32-S3 boards, + // but only a limited amount can be allocated. failing to allocate an + // interrupt in the TWAI driver will cause a bootloop. we therefore + // register the TWAI driver's interrupt at level 2. level 2 interrupts + // should be available -- we don't really know. we would love to have the + // esp_intr_dump() function, but that's not available yet in our version + // of the underlying esp-idf. + g_config.intr_flags = ESP_INTR_FLAG_LEVEL2; + // Initialize configuration structures using macro initializers twai_timing_config_t t_config = TWAI_TIMING_CONFIG_500KBITS(); twai_filter_config_t f_config = TWAI_FILTER_CONFIG_ACCEPT_ALL(); From babb24ab1fdfc95afdee9b729b27645e5d24ead9 Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Sun, 1 Sep 2024 22:04:38 +0200 Subject: [PATCH 16/26] Fix: reasonable full solar-passthrough default values value 100 is not accepted by the webapp as inputs for full solar-passthrough start and stop volages. 66V is the documented value to be used if one wants to disable full solar-passthrough (while keeping (non-full) solar-passthrough). --- include/defaults.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/defaults.h b/include/defaults.h index e348ae63..d92b8645 100644 --- a/include/defaults.h +++ b/include/defaults.h @@ -144,8 +144,8 @@ #define POWERLIMITER_VOLTAGE_LOAD_CORRECTION_FACTOR 0.001 #define POWERLIMITER_RESTART_HOUR -1 #define POWERLIMITER_FULL_SOLAR_PASSTHROUGH_SOC 100 -#define POWERLIMITER_FULL_SOLAR_PASSTHROUGH_START_VOLTAGE 100.0 -#define POWERLIMITER_FULL_SOLAR_PASSTHROUGH_STOP_VOLTAGE 100.0 +#define POWERLIMITER_FULL_SOLAR_PASSTHROUGH_START_VOLTAGE 66.0 +#define POWERLIMITER_FULL_SOLAR_PASSTHROUGH_STOP_VOLTAGE 66.0 #define BATTERY_ENABLED false #define BATTERY_PROVIDER 0 // Pylontech CAN receiver From 5ad63e6c44cdb3a027640e20789ad0b6d6d4ddd7 Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Sun, 1 Sep 2024 22:08:12 +0200 Subject: [PATCH 17/26] Fix: DPL settings: do not reset solar_passthrough_enabled we must not reset the configuration switch value in this context. this leads to solar passthrough being disabled once the DPL is disabled. when re-enabling the DPL, solar passthrough is suddenly off, even though the user configured it to be on. the configuration switch can stay on. the DPL will still sanity-check whether or not solar-passthrough can be used (checks if VE.Direct is enabled) or it is irrelevant since the DPL is disabled. --- webapp/src/views/PowerLimiterAdminView.vue | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/webapp/src/views/PowerLimiterAdminView.vue b/webapp/src/views/PowerLimiterAdminView.vue index 96f51ed4..05b7bdd9 100644 --- a/webapp/src/views/PowerLimiterAdminView.vue +++ b/webapp/src/views/PowerLimiterAdminView.vue @@ -501,11 +501,7 @@ export default defineComponent({ canUseSolarPassthrough() { const cfg = this.powerLimiterConfigList; const meta = this.powerLimiterMetaData; - const canUse = this.isEnabled() && meta.charge_controller_enabled && !cfg.is_inverter_solar_powered; - if (!canUse) { - cfg.solar_passthrough_enabled = false; - } - return canUse; + return this.isEnabled() && meta.charge_controller_enabled && !cfg.is_inverter_solar_powered; }, canUseSoCThresholds() { const cfg = this.powerLimiterConfigList; From a87f9fa2cd070e2c30a4c48569eccb8235dc0817 Mon Sep 17 00:00:00 2001 From: ranma Date: Mon, 2 Sep 2024 11:08:21 +0200 Subject: [PATCH 18/26] Fix: Allow higher-resolution SoC in live view header (#1197) Commit accc70dea0e4ead2f842f added the battery SoC to the live view header. But due to getSoC() returning an int, the precision was limited. This changes getSoC() to return float so when a source with higher precision is available, the respective precision is shown. --- include/BatteryStats.h | 2 +- src/PowerLimiter.cpp | 2 +- src/PylontechCanReceiver.cpp | 2 +- src/PytesCanReceiver.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/BatteryStats.h b/include/BatteryStats.h index 94da35d7..c3b0c631 100644 --- a/include/BatteryStats.h +++ b/include/BatteryStats.h @@ -18,7 +18,7 @@ class BatteryStats { uint32_t getAgeSeconds() const { return (millis() - _lastUpdate) / 1000; } bool updateAvailable(uint32_t since) const; - uint8_t getSoC() const { return _soc; } + float getSoC() const { return _soc; } uint32_t getSoCAgeSeconds() const { return (millis() - _lastUpdateSoC) / 1000; } uint8_t getSoCPrecision() const { return _socPrecision; } diff --git a/src/PowerLimiter.cpp b/src/PowerLimiter.cpp index 93f027b0..c4f5382e 100644 --- a/src/PowerLimiter.cpp +++ b/src/PowerLimiter.cpp @@ -266,7 +266,7 @@ void PowerLimiterClass::loop() _batteryDischargeEnabled = getBatteryPower(); if (_verboseLogging && !config.PowerLimiter.IsInverterSolarPowered) { - MessageOutput.printf("[DPL::loop] battery interface %s, SoC: %d %%, StartTH: %d %%, StopTH: %d %%, SoC age: %d s, ignore: %s\r\n", + MessageOutput.printf("[DPL::loop] battery interface %s, SoC: %f %%, StartTH: %d %%, StopTH: %d %%, SoC age: %d s, ignore: %s\r\n", (config.Battery.Enabled?"enabled":"disabled"), Battery.getStats()->getSoC(), config.PowerLimiter.BatterySocStartThreshold, diff --git a/src/PylontechCanReceiver.cpp b/src/PylontechCanReceiver.cpp index 517a6a23..d835c2f2 100644 --- a/src/PylontechCanReceiver.cpp +++ b/src/PylontechCanReceiver.cpp @@ -31,7 +31,7 @@ void PylontechCanReceiver::onMessage(twai_message_t rx_message) _stats->_stateOfHealth = this->readUnsignedInt16(rx_message.data + 2); if (_verboseLogging) { - MessageOutput.printf("[Pylontech] soc: %d soh: %d\r\n", + MessageOutput.printf("[Pylontech] soc: %f soh: %d\r\n", _stats->getSoC(), _stats->_stateOfHealth); } break; diff --git a/src/PytesCanReceiver.cpp b/src/PytesCanReceiver.cpp index 81c7c85c..3e877cef 100644 --- a/src/PytesCanReceiver.cpp +++ b/src/PytesCanReceiver.cpp @@ -32,7 +32,7 @@ void PytesCanReceiver::onMessage(twai_message_t rx_message) _stats->_stateOfHealth = this->readUnsignedInt16(rx_message.data + 2); if (_verboseLogging) { - MessageOutput.printf("[Pytes] soc: %d soh: %d\r\n", + MessageOutput.printf("[Pytes] soc: %f soh: %d\r\n", _stats->getSoC(), _stats->_stateOfHealth); } break; From cec4003f6e12c842889650fa669611ee1925933b Mon Sep 17 00:00:00 2001 From: spcqike <50098985+spcqike@users.noreply.github.com> Date: Thu, 5 Sep 2024 23:02:42 +0200 Subject: [PATCH 19/26] Implement webapp autocompile (#1193) add pre-script to check if webapp was compiled or sources changed and auto compile. --------- Co-authored-by: Bernhard Kirchen --- .gitignore | 1 + pio-scripts/compile_webapp.py | 65 ++++++++++++++++++++++++++++++++++ platformio.ini | 1 + webapp_dist/favicon.ico | Bin 3262 -> 0 bytes webapp_dist/favicon.png | Bin 4590 -> 0 bytes webapp_dist/index.html.gz | Bin 392 -> 0 bytes webapp_dist/js/app.js.gz | Bin 209034 -> 0 bytes webapp_dist/site.webmanifest | 13 ------- webapp_dist/zones.json.gz | Bin 4050 -> 0 bytes 9 files changed, 67 insertions(+), 13 deletions(-) create mode 100644 pio-scripts/compile_webapp.py delete mode 100644 webapp_dist/favicon.ico delete mode 100644 webapp_dist/favicon.png delete mode 100644 webapp_dist/index.html.gz delete mode 100644 webapp_dist/js/app.js.gz delete mode 100644 webapp_dist/site.webmanifest delete mode 100644 webapp_dist/zones.json.gz diff --git a/.gitignore b/.gitignore index c29e72f4..516579db 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,5 @@ platformio-device-monitor*.log logs/device-monitor*.log platformio_override.ini +webapp_dist/ .DS_Store diff --git a/pio-scripts/compile_webapp.py b/pio-scripts/compile_webapp.py new file mode 100644 index 00000000..ace042bf --- /dev/null +++ b/pio-scripts/compile_webapp.py @@ -0,0 +1,65 @@ +import os +import hashlib +import pickle +import subprocess + +def check_files(directories, filepaths, hash_file): + old_file_hashes = {} + file_hashes = {} + + for directory in directories: + for root, dirs, filenames in os.walk(directory): + for file in filenames: + filepaths.append(os.path.join(root, file)) + + for file_path in filepaths: + with open(file_path, 'rb') as f: + file_data = f.read() + file_hashes[file_path] = hashlib.md5(file_data).hexdigest() + + if os.path.exists(hash_file): + with open(hash_file, 'rb') as f: + old_file_hashes = pickle.load(f) + + update = False + for file_path, file_hash in file_hashes.items(): + if file_path not in old_file_hashes or old_file_hashes[file_path] != file_hash: + update = True + break + + if not update: + print("webapp artifacts should be up-to-date") + return + + print("compiling webapp (hang on, this can take a while and there might be little output)...") + + try: + # if these commands fail, an exception will prevent us from + # persisting the current hashes => commands will be executed again + subprocess.run(["yarn", "--cwd", "webapp", "install", "--frozen-lockfile"], + check=True) + + subprocess.run(["yarn", "--cwd", "webapp", "build"], check=True) + + except FileNotFoundError: + raise Exception("it seems 'yarn' is not installed/available on your system") + + with open(hash_file, 'wb') as f: + pickle.dump(file_hashes, f) + +def main(): + if os.getenv('GITHUB_ACTIONS') == 'true': + print("INFO: not testing for up-to-date webapp artifacts when running as Github action") + return 0 + + print("INFO: testing for up-to-date webapp artifacts") + + directories = ["webapp/src/", "webapp/public/"] + files = ["webapp/index.html", "webapp/tsconfig.config.json", + "webapp/tsconfig.json", "webapp/vite.config.ts", + "webapp/yarn.lock"] + hash_file = "webapp_dist/.hashes.pkl" + + check_files(directories, files, hash_file) + +main() diff --git a/platformio.ini b/platformio.ini index f9435984..b7917a10 100644 --- a/platformio.ini +++ b/platformio.ini @@ -50,6 +50,7 @@ lib_deps = plerup/EspSoftwareSerial @ ^8.2.0 extra_scripts = + pre:pio-scripts/compile_webapp.py pre:pio-scripts/auto_firmware_version.py pre:pio-scripts/patch_apply.py post:pio-scripts/create_factory_bin.py diff --git a/webapp_dist/favicon.ico b/webapp_dist/favicon.ico deleted file mode 100644 index 68e73986d02c2f1d050d2b1dea052a0d6953411d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3262 zcmeHHyG{c!5OhRAb2T#3NkpQdit_jX_!mBel7qh zPN$P55-)a5QYdBl zZ6I{Ar8YcEE`ZrNvtU7_P@)ueUa0N`NTKV%64XYc5y>)A?@27Ah6I9ro)#~a&D);U zEE%A^46Ip;Gqc^5?IYy^-96QHY*rQHTNN+oW}mNBob1l++pXDVWwu7?V}|lA)`NWkdO1;Z diff --git a/webapp_dist/favicon.png b/webapp_dist/favicon.png deleted file mode 100644 index 278aac84f197d64e420e057aa7ba62c94c82e512..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4590 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 diff --git a/webapp_dist/site.webmanifest b/webapp_dist/site.webmanifest deleted file mode 100644 index 3be24609..00000000 --- a/webapp_dist/site.webmanifest +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "OpenDTU", - "short_name": "OpenDTU", - "display": "standalone", - "orientation": "portrait", - "icons": [ - { - "src": "/favicon.png", - "sizes": "144x144", - "type": "image/png" - } - ] -} \ No newline at end of file diff --git a/webapp_dist/zones.json.gz b/webapp_dist/zones.json.gz deleted file mode 100644 index 02f82db6883e99531e3b43289b7801354e337a73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4050 zcmV;@4=wN?iwFP!000026O~(AQ{%d_e&0W1z0S&zguuY6RjGo&a0y|uiGiAVNp)gj z3)@mgw!)ZQ=f9tpWIMK_5b?q=>TX^7`n6>K_n*JcUIbmj!P$cPufYEL=dY`Y*Zu47 z4Pm(yU>Wv(n$FJ_uu#OyGp}=4r^W##B1OvR((ClW%k}a)Hno@ahceJXaF&_5?C6d z4K1p;gMg>Dak>y>mv7ziglwzlP6G3-Ysdwj?j93TLYPet_Y^6)jew3CEkmAV z+bjK$fE(m8;Fjz#<>(8Yd%m{mX$E}mSuN!Wy5ibXbOxwXB%`(j_)M7}auPMPo{%D` zf*QY`dA;uSg%19{4*uTP-q&t}li?u+1ZqoXOUA1Hs_ zH`RnNpTFY{{xrfS{c*Ma(_A(YXGM|wY4$d2lya|n0rKvU*e+I=EGhtJGA zZZe1k261ZHC~w!;-8Iw>2Y&`4de`JL18c)PR?yqha%aoTh5M z$;|sU`7kg?kSqlC1A>RnT_slNg+l4bx~~zQN!rvt!qU2gbcaw*7$a8oAuX}maTMau zfES7#eZ1|EqT_`+(X`Dl;;3T`)1{S&StZlvQMzeRB!z|DHY2Hy$}Kj%0EP)D!YaOQ z0F#RRmRc7xggNd;=k6^sVQV6s40u5@!D&|L^YUX}o=|4=(mu$gpK!KO%*Sh9QXv^x z5v#W%h{J5P#;_6={eQ>GIKL;cT`h_VG1-whuVPr1o~`zO_TeV4xSxfvFf;Xsef-%Q z76|yD)2l#mONghRSVD!(+>;`5Qva1e{NdZQeZH6< zaLo80rxZ~NOt1l9I<2@bG9?){oJDWoF6NOqo{wmje`Fev92T#_|e~zSc!m2^G2dWfU06Pvjr1hFox zXlv?|9VSMyAP_tGvSP+|T!78G_fXt+?VsnKyv=`d$I5q4SLjd7jn}lsF6O#d*FGUs zCB8+=!ubV6h^i5?%NRl@XKKieh%(CO<&<&|1nCCCK~&1z{E9UY5oMxYbO8b_S zi-dqtkxAxO<)#Su5$w{1-3zB7Cyf5FM6
45B*{N=Wmf{FZPK3f5`^-}tRW&T9s zkXsYjR1(F2O@IxxPbI?+;Y`6XdmH?KtL7-Zb~OG2u!yqx4U0+UCP0?-#oix1kbp8< zHhUl`k7eeT6V=_qIl|K=w-%ropa#T_23HZO>BJfh`YA4Qe9#}LTWRxKTZ+$hixJqA zuCBeNAY;4t%$6KGvqhdt<{O6Iu=nqmZnuhs&9!v{ZO&*Gxu*A7hR`0vRJHcGZHw9b zmWNFF#Qn@W{O7QHzi+-V&9c-!)ty{Yu#>!yC$K}zfIC}up1skRY>v&SF!Z*AcqG6j z1Bh2P_whm*6Q@#yoa)A;XoL0#t4Cj@X%O}!8Be9`%nf#VD#)$3j8Dq3rHRh{Yd(iG zBOw>nB}#)x8KWx_I7QV@h-79er-QrwQ~>iWVkXi*K+-A}ms#p(<>HrGMDsPPhcCdC!S_JGIGbmj)@>mLlDk_oPb#5gzbM-OR2hn zC#THPeYIA0JOAq@jqXcyihWx23U zb`C-4gKyc`IfTL#=xs_=Of?vG2DM=pM5TT!7d8}u?MQ5+5GrKWd=_n&gzko$reQ=P zi+0b|r4==VlVRtiB8)IU6pnN{?3~udIbA@UmNsb$@t7wD3Zc3VG0u*#UR2}@gi7gB zrWVy)gyvzby}t_@Q_C(c^#FNuQJtlKTq>$!AH$;b(1Eh}plmAuWQZR?ZA5Qmv*i7CCDO zF&YC2Y$apfJ z606rw)eRJarfADqr@5*#pbdZ^qh|2`qP2xZ`~S_~^Oy@CESq?sIryPPXa-RTF|}G} zruw`Hm~WYIM!1fF=GJEDra`FlRMQ7$=t;2Rf>_*XCWy~S#N)iwYil1KATryY(*u>_ znXQI-3rwP^EnRv9OI2B^RPY|w1I7z!vI?cexE_ykmE~_6=k<7E^^nIHFek&tP>lmW z3Yq+-mPH=ZtaD#LojPVyv?ofms}Rd_Pcis(y@4z(Q4LqieKvB(Pc&DF<&Kp$j_ca^ zNieY>hGoSKcw5Uqi6HAznU$8+U7o^8XYagvy5HBtl``ijX=$l_tjjum5vua)4x{gZZ0>qoS0V>yN(l6yQF7n=qDxN20@vJzm`2s<~rxv}V z*#8jYCfoTne=B>eLmhUww=#pZ=5I<*NW9=uu+J%CN<^me_}O!n3oF_z$2^)l zOm~?r573Efu2hVC=~~8mjd-a>yLuQ?O|Qvq*iiw!CV$_I_lE`#mE-+}zn7zj4PP!t z2aQX}Jl*5B&5-*33npwXb zK5o{oa`;=bG?l|A%@SA+pEm1JF}$T-K?r-J%dj>6I8yHW=#4fb-l#po)Xi&H!fDZqR#1UR#+Fh#J{s+T1-3yHpQ+y`F^{&Nxs0(4S$ zS{*B^L3wW60y3J$um*PtnWiL8o%yl50QC{hCytEBU}Yp6mq-zH66Zr>bBY4y-K(`D zJ3szlA$(#5?BR_ORHxQc?p(4};GxESMHfPS?h%|U{dwURn9R)Y`UHII#w+T8dK=&r|PTNl1jAL%5@{@P~k|WPU|cz80UuxY*{7W43Tq+nxMF5`_%{*Vz$`3hKLa#~HXYBUTF` zVeT59P*!#uEt^j`1N{``wlq(d{LNyjA8G77$rShRoRy~B54b2k8FUg*Uo$%=;RhOk zyBZ(N3%JwFx>W~jWlEdA9cK|=y}F-~ztB&p zZ^{nAs zsMKYHdv1H8F{APm;N^+O0WXqy+b5m@5!;*V(!U@OWZ}-eLLI+{IdR|XFDVTA{CEZP zb)EXV2P_HV&5dn?O=V@U({{UibAW! zsYr4e#pV`r&y!*)an5A`l-1rpt4^zAK}%$z#`>z=Qdb7O{y&2wwLbo*nEXHuRVx%% z3Y!^;lJY4zbmzxr^Z-;jBMY}alt)kFM3ihPHPzC#53h3}%$ zSK8_;E0SdJV*WhOM!td=R#5$2O3_SjsL6ts$1K|9iYCE_7*kGhC%%0q Date: Mon, 9 Sep 2024 21:46:47 +0200 Subject: [PATCH 20/26] Fix: sanitize battery manufacturer name string (#1235) If the string contains control characters for some reason, the browser will reject the json with the error `bad control character in string literal`. This adds a setManufacturer function that validates the string is ASCII and will cut off the string at the first non-ascii character. Pylontech: `PYLON` (50 59 4C 4F 4E 20 20 20) Pytes: `PYTES` (50 59 54 45 53) Deye: `DY001` (44 59 30 30 31 03 E8 03) See https://github.com/helgeerbe/OpenDTU-OnBattery/discussions/1226#discussioncomment-10566898 --- include/BatteryStats.h | 6 +++--- src/BatteryStats.cpp | 21 +++++++++++++++++---- src/PylontechCanReceiver.cpp | 2 +- src/PytesCanReceiver.cpp | 2 +- 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/include/BatteryStats.h b/include/BatteryStats.h index c3b0c631..32c4af5a 100644 --- a/include/BatteryStats.h +++ b/include/BatteryStats.h @@ -67,13 +67,15 @@ class BatteryStats { _lastUpdateCurrent = _lastUpdate = timestamp; } - String _manufacturer = "unknown"; + void setManufacturer(const String& m); + String _hwversion = ""; String _fwversion = ""; String _serial = ""; uint32_t _lastUpdate = 0; private: + String _manufacturer = "unknown"; uint32_t _lastMqttPublish = 0; float _soc = 0; uint8_t _socPrecision = 0; // decimal places @@ -98,7 +100,6 @@ class PylontechBatteryStats : public BatteryStats { float getChargeCurrentLimitation() const { return _chargeCurrentLimitation; } ; private: - void setManufacturer(String&& m) { _manufacturer = std::move(m); } void setLastUpdate(uint32_t ts) { _lastUpdate = ts; } float _chargeVoltage; @@ -137,7 +138,6 @@ class PytesBatteryStats : public BatteryStats { float getChargeCurrentLimitation() const { return _chargeCurrentLimit; } ; private: - void setManufacturer(String&& m) { _manufacturer = std::move(m); } void setLastUpdate(uint32_t ts) { _lastUpdate = ts; } void updateSerial() { if (!_serialPart1.isEmpty() && !_serialPart2.isEmpty()) { diff --git a/src/BatteryStats.cpp b/src/BatteryStats.cpp index 9f32931b..e4fe305a 100644 --- a/src/BatteryStats.cpp +++ b/src/BatteryStats.cpp @@ -54,6 +54,19 @@ static void addLiveViewAlarm(JsonVariant& root, std::string const& name, root["issues"][name] = 2; } +void BatteryStats::setManufacturer(const String& m) +{ + String sanitized(m); + for (int i = 0; i < sanitized.length(); i++) { + char c = sanitized[i]; + if (c < 0x20 || c >= 0x80) { + sanitized.remove(i); // Truncate string + break; + } + } + _manufacturer = std::move(sanitized); +} + bool BatteryStats::updateAvailable(uint32_t since) const { if (_lastUpdate == 0) { return false; } // no data at all processed yet @@ -475,7 +488,7 @@ void JkBmsBatteryStats::updateFrom(JkBms::DataPointContainer const& dp) { using Label = JkBms::DataPointLabel; - _manufacturer = "JKBMS"; + setManufacturer("JKBMS"); auto oProductId = dp.get(); if (oProductId.has_value()) { // the first twelve chars are expected to be the "User Private Data" @@ -483,10 +496,10 @@ void JkBmsBatteryStats::updateFrom(JkBms::DataPointContainer const& dp) // name, which can be changed at will using the smartphone app. so // there is not always a "JK" in this string. if there is, we still cut // the string there to avoid possible regressions. - _manufacturer = oProductId->substr(12).c_str(); + setManufacturer(String(oProductId->substr(12).c_str())); auto pos = oProductId->rfind("JK"); if (pos != std::string::npos) { - _manufacturer = oProductId->substr(pos).c_str(); + setManufacturer(String(oProductId->substr(pos).c_str())); } } @@ -558,7 +571,7 @@ void VictronSmartShuntStats::updateFrom(VeDirectShuntController::data_t const& s _timeToGo = shuntData.TTG / 60; _chargedEnergy = static_cast(shuntData.H18) / 100; _dischargedEnergy = static_cast(shuntData.H17) / 100; - _manufacturer = String("Victron ") + shuntData.getPidAsString().data(); + setManufacturer(String("Victron ") + shuntData.getPidAsString().data()); _temperature = shuntData.T; _tempPresent = shuntData.tempPresent; _midpointVoltage = static_cast(shuntData.VM) / 1000; diff --git a/src/PylontechCanReceiver.cpp b/src/PylontechCanReceiver.cpp index d835c2f2..d1e7d94c 100644 --- a/src/PylontechCanReceiver.cpp +++ b/src/PylontechCanReceiver.cpp @@ -106,7 +106,7 @@ void PylontechCanReceiver::onMessage(twai_message_t rx_message) MessageOutput.printf("[Pylontech] Manufacturer: %s\r\n", manufacturer.c_str()); } - _stats->setManufacturer(std::move(manufacturer)); + _stats->setManufacturer(manufacturer); break; } diff --git a/src/PytesCanReceiver.cpp b/src/PytesCanReceiver.cpp index 3e877cef..e4b22e51 100644 --- a/src/PytesCanReceiver.cpp +++ b/src/PytesCanReceiver.cpp @@ -127,7 +127,7 @@ void PytesCanReceiver::onMessage(twai_message_t rx_message) MessageOutput.printf("[Pytes] Manufacturer: %s\r\n", manufacturer.c_str()); } - _stats->setManufacturer(std::move(manufacturer)); + _stats->setManufacturer(manufacturer); break; } From cdd6f4cf1b9c08dfd871630ab201e10e21335030 Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Mon, 9 Sep 2024 21:53:51 +0200 Subject: [PATCH 21/26] webapp: pylontech battery provider can also read DEYE --- webapp/src/locales/de.json | 2 +- webapp/src/locales/en.json | 2 +- webapp/src/locales/fr.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/webapp/src/locales/de.json b/webapp/src/locales/de.json index 735f3c97..d82bdcac 100644 --- a/webapp/src/locales/de.json +++ b/webapp/src/locales/de.json @@ -667,7 +667,7 @@ "EnableBattery": "Aktiviere Schnittstelle", "VerboseLogging": "@:base.VerboseLogging", "Provider": "Datenanbieter", - "ProviderPylontechCan": "Pylontech per CAN-Bus", + "ProviderPylontechCan": "Pylontech oder DEYE per CAN-Bus", "ProviderJkBmsSerial": "Jikong (JK) BMS per serieller Verbindung", "ProviderMqtt": "Batteriewerte aus MQTT Broker", "ProviderVictron": "Victron SmartShunt per VE.Direct Schnittstelle", diff --git a/webapp/src/locales/en.json b/webapp/src/locales/en.json index b94ad01b..40cfd5de 100644 --- a/webapp/src/locales/en.json +++ b/webapp/src/locales/en.json @@ -669,7 +669,7 @@ "EnableBattery": "Enable Interface", "VerboseLogging": "@:base.VerboseLogging", "Provider": "Data Provider", - "ProviderPylontechCan": "Pylontech using CAN bus", + "ProviderPylontechCan": "Pylontech or DEYE using CAN bus", "ProviderJkBmsSerial": "Jikong (JK) BMS using serial connection", "ProviderMqtt": "Battery data from MQTT broker", "ProviderVictron": "Victron SmartShunt using VE.Direct interface", diff --git a/webapp/src/locales/fr.json b/webapp/src/locales/fr.json index 852dc833..32cc7442 100644 --- a/webapp/src/locales/fr.json +++ b/webapp/src/locales/fr.json @@ -594,7 +594,7 @@ "EnableBattery": "Enable Interface", "VerboseLogging": "@:base.VerboseLogging", "Provider": "Data Provider", - "ProviderPylontechCan": "Pylontech using CAN bus", + "ProviderPylontechCan": "Pylontech or DEYE using CAN bus", "ProviderJkBmsSerial": "Jikong (JK) BMS using serial connection", "ProviderMqtt": "Battery data from MQTT broker", "ProviderVictron": "Victron SmartShunt using VE.Direct interface", From 5ea8fbecf999f2f51a5a14509e43fb101a7d69b5 Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Mon, 9 Sep 2024 22:28:06 +0200 Subject: [PATCH 22/26] WebApi_dtu: remove trailing whitespace probably added during conflict resolving. these removed whitespace are not part of the upstream. --- src/WebApi_dtu.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/WebApi_dtu.cpp b/src/WebApi_dtu.cpp index 8e587f85..0c038c22 100644 --- a/src/WebApi_dtu.cpp +++ b/src/WebApi_dtu.cpp @@ -91,11 +91,11 @@ void WebApiDtuClass::onDtuAdminPost(AsyncWebServerRequest* request) auto& retMsg = response->getRoot(); - if (!(root.containsKey("serial") + if (!(root.containsKey("serial") && root.containsKey("pollinterval") - && root.containsKey("verbose_logging") - && root.containsKey("nrf_palevel") - && root.containsKey("cmt_palevel") + && root.containsKey("verbose_logging") + && root.containsKey("nrf_palevel") + && root.containsKey("cmt_palevel") && root.containsKey("cmt_frequency") && root.containsKey("cmt_country"))) { retMsg["message"] = "Values are missing!"; From ffb30de4d22333c006d1a2131419df574302cdbc Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Tue, 10 Sep 2024 14:24:35 +0200 Subject: [PATCH 23/26] Revert "webapp: pylontech battery provider can also read DEYE" This reverts commit cdd6f4cf1b9c08dfd871630ab201e10e21335030. See #1244. --- webapp/src/locales/de.json | 2 +- webapp/src/locales/en.json | 2 +- webapp/src/locales/fr.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/webapp/src/locales/de.json b/webapp/src/locales/de.json index d82bdcac..735f3c97 100644 --- a/webapp/src/locales/de.json +++ b/webapp/src/locales/de.json @@ -667,7 +667,7 @@ "EnableBattery": "Aktiviere Schnittstelle", "VerboseLogging": "@:base.VerboseLogging", "Provider": "Datenanbieter", - "ProviderPylontechCan": "Pylontech oder DEYE per CAN-Bus", + "ProviderPylontechCan": "Pylontech per CAN-Bus", "ProviderJkBmsSerial": "Jikong (JK) BMS per serieller Verbindung", "ProviderMqtt": "Batteriewerte aus MQTT Broker", "ProviderVictron": "Victron SmartShunt per VE.Direct Schnittstelle", diff --git a/webapp/src/locales/en.json b/webapp/src/locales/en.json index 40cfd5de..b94ad01b 100644 --- a/webapp/src/locales/en.json +++ b/webapp/src/locales/en.json @@ -669,7 +669,7 @@ "EnableBattery": "Enable Interface", "VerboseLogging": "@:base.VerboseLogging", "Provider": "Data Provider", - "ProviderPylontechCan": "Pylontech or DEYE using CAN bus", + "ProviderPylontechCan": "Pylontech using CAN bus", "ProviderJkBmsSerial": "Jikong (JK) BMS using serial connection", "ProviderMqtt": "Battery data from MQTT broker", "ProviderVictron": "Victron SmartShunt using VE.Direct interface", diff --git a/webapp/src/locales/fr.json b/webapp/src/locales/fr.json index 32cc7442..852dc833 100644 --- a/webapp/src/locales/fr.json +++ b/webapp/src/locales/fr.json @@ -594,7 +594,7 @@ "EnableBattery": "Enable Interface", "VerboseLogging": "@:base.VerboseLogging", "Provider": "Data Provider", - "ProviderPylontechCan": "Pylontech or DEYE using CAN bus", + "ProviderPylontechCan": "Pylontech using CAN bus", "ProviderJkBmsSerial": "Jikong (JK) BMS using serial connection", "ProviderMqtt": "Battery data from MQTT broker", "ProviderVictron": "Victron SmartShunt using VE.Direct interface", From 9067acdab768b5581c28dd4288c595693c8d1dab Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Tue, 10 Sep 2024 14:33:39 +0200 Subject: [PATCH 24/26] fix: typo in german web app locale closes #1223. --- webapp/src/locales/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/src/locales/de.json b/webapp/src/locales/de.json index 735f3c97..38495940 100644 --- a/webapp/src/locales/de.json +++ b/webapp/src/locales/de.json @@ -635,7 +635,7 @@ "TargetPowerConsumptionHint": "Angestrebter erlaubter Stromverbrauch aus dem Netz. Wert darf negativ sein.", "TargetPowerConsumptionHysteresis": "Hysterese", "TargetPowerConsumptionHysteresisHint": "Neu berechnetes Limit nur dann an den Inverter senden, wenn es vom zurückgemeldeten Limit um mindestens diesen Betrag abweicht.", - "LowerPowerLimit": "Minmales Leistungslimit", + "LowerPowerLimit": "Minimales Leistungslimit", "LowerPowerLimitHint": "Dieser Wert muss so gewählt werden, dass ein stabiler Betrieb mit diesem Limit möglich ist. Falls der Wechselrichter nur mit einem kleineren Limit betrieben werden könnte, wird er stattdessen in Standby versetzt.", "BaseLoadLimit": "Grundlast", "BaseLoadLimitHint": "Relevant beim Betrieb ohne oder beim Ausfall des Stromzählers. Solange es die sonstigen Bedinungen zulassen (insb. Batterieladung) wird dieses Limit am Wechselrichter eingestellt.", From f8595865ea29e49f1ee96fb26ca2c612d6bd07d9 Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Wed, 11 Sep 2024 21:34:59 +0200 Subject: [PATCH 25/26] webapp autocompile: try yarnpkg --- pio-scripts/compile_webapp.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/pio-scripts/compile_webapp.py b/pio-scripts/compile_webapp.py index ace042bf..0ae54e76 100644 --- a/pio-scripts/compile_webapp.py +++ b/pio-scripts/compile_webapp.py @@ -28,21 +28,27 @@ def check_files(directories, filepaths, hash_file): break if not update: - print("webapp artifacts should be up-to-date") + print("INFO: webapp artifacts should be up-to-date") return - print("compiling webapp (hang on, this can take a while and there might be little output)...") + print("INFO: compiling webapp (hang on, this can take a while and there might be little output)...") + yarn = "yarn" try: - # if these commands fail, an exception will prevent us from - # persisting the current hashes => commands will be executed again - subprocess.run(["yarn", "--cwd", "webapp", "install", "--frozen-lockfile"], - check=True) - - subprocess.run(["yarn", "--cwd", "webapp", "build"], check=True) - + subprocess.check_output([yarn, "--version"]) except FileNotFoundError: - raise Exception("it seems 'yarn' is not installed/available on your system") + yarn = "yarnpkg" + try: + subprocess.check_output([yarn, "--version"]) + except FileNotFoundError: + raise Exception("it seems neither 'yarn' nor 'yarnpkg' is installed/available on your system") + + # if these commands fail, an exception will prevent us from + # persisting the current hashes => commands will be executed again + subprocess.run([yarn, "--cwd", "webapp", "install", "--frozen-lockfile"], + check=True) + + subprocess.run([yarn, "--cwd", "webapp", "build"], check=True) with open(hash_file, 'wb') as f: pickle.dump(file_hashes, f) From 1fe8d3f513fbcef950b4b21677c93eb3db1b5759 Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Sun, 18 Aug 2024 13:32:25 +0200 Subject: [PATCH 26/26] disable "based on OpenDTU" badge disabled as uploading the changed gist failed repeatedly. maybe the token in secrets.GIST_SECRET has expired? need help from repo owner @helgeerbe to fix this. --- .github/workflows/build.yml | 21 ++++++++++++--------- README.md | 3 +++ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0a1eaa78..7ad0a0f9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -139,15 +139,18 @@ jobs: run: | echo "OPEN_DTU_CORE_RELEASE=$(git for-each-ref --sort=creatordate --format '%(refname) %(creatordate)' refs/tags | grep 'refs/tags/v' | tail -1 | sed 's#.*/##' | sed 's/ .*//')" >> $GITHUB_ENV - - name: Create openDTU-core-release-Badge - uses: schneegans/dynamic-badges-action@v1.6.0 - with: - auth: ${{ secrets.GIST_SECRET }} - gistID: 68b47cc8c8994d04ab3a4fa9d8aee5e6 - filename: openDTUcoreRelease.json - label: based on original OpenDTU - message: ${{ env.OPEN_DTU_CORE_RELEASE }} - color: lightblue +# disabled as uploading the changed gist failed repeatedly. +# maybe the token in secrets.GIST_SECRET has expired? +# need help from repo owner @helgeerbe to fix this. +# - name: Create openDTU-core-release-Badge +# uses: schneegans/dynamic-badges-action@v1.6.0 +# with: +# auth: ${{ secrets.GIST_SECRET }} +# gistID: 68b47cc8c8994d04ab3a4fa9d8aee5e6 +# filename: openDTUcoreRelease.json +# label: based on original OpenDTU +# message: ${{ env.OPEN_DTU_CORE_RELEASE }} +# color: lightblue - name: Build Changelog id: github_release diff --git a/README.md b/README.md index d354549b..02aa0d67 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,10 @@ This is a fork of [OpenDTU](https://github.com/tbnobody/OpenDTU). + [![OpenDTU-OnBattery Build](https://github.com/helgeerbe/OpenDTU-OnBattery/actions/workflows/build.yml/badge.svg)](https://github.com/helgeerbe/OpenDTU-OnBattery/actions/workflows/build.yml) [![cpplint](https://github.com/helgeerbe/OpenDTU-OnBattery/actions/workflows/cpplint.yml/badge.svg)](https://github.com/helgeerbe/OpenDTU-OnBattery/actions/workflows/cpplint.yml)