diff --git a/README.md b/README.md index 957282ff..2dda1d67 100644 --- a/README.md +++ b/README.md @@ -508,6 +508,7 @@ A documentation of the Web API can be found here: [Web-API Documentation](docs/W * If your problem persists, check the [Issues on Github](https://github.com/tbnobody/OpenDTU/issues). Please inspect not only the open issues, also the closed issues contain useful information. * Another source of information are the [Discussions](https://github.com/tbnobody/OpenDTU/discussions/) * When flashing with VSCode Plattform.IO fails and also with ESPRESSIF tool a demo bin file cannot be flashed to the ESP32 with error message "A fatal error occurred: MD5 of file does not match data in flash!" than un-wire/unconnect ESP32 from the NRF24L01+ board. Try to flash again and rewire afterwards. +* Make sure to connect one inverter only to one DTU (Original, Ahoy, OpenDTU doesn't make a difference). If you query a inverter by multiple DTUs you will get strange peaks in your values. ## Related Projects diff --git a/docs/DeviceProfiles/olimex_esp32_poe.json b/docs/DeviceProfiles/olimex_esp32_poe.json index 001ba7b9..e43dff24 100644 --- a/docs/DeviceProfiles/olimex_esp32_poe.json +++ b/docs/DeviceProfiles/olimex_esp32_poe.json @@ -64,7 +64,7 @@ "clk_mode": 3 }, "display": { - "type": 2, + "type": 3, "data": 33, "clk": 32 } diff --git a/include/MqttHandleInverterTotal.h b/include/MqttHandleInverterTotal.h new file mode 100644 index 00000000..fa4ce4b6 --- /dev/null +++ b/include/MqttHandleInverterTotal.h @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include + +class MqttHandleInverterTotalClass { +public: + void init(); + void loop(); + +private: + TimeoutHelper _lastPublish; +}; + +extern MqttHandleInverterTotalClass MqttHandleInverterTotal; \ No newline at end of file diff --git a/lib/CMT2300a/cmt_spi3.c b/lib/CMT2300a/cmt_spi3.c index 7092b528..59854305 100644 --- a/lib/CMT2300a/cmt_spi3.c +++ b/lib/CMT2300a/cmt_spi3.c @@ -3,10 +3,16 @@ #include #include // for esp_rom_gpio_connect_out_signal +SemaphoreHandle_t paramLock=NULL; +#define SPI_PARAM_LOCK() do {} while (xSemaphoreTake(paramLock, portMAX_DELAY) != pdPASS) +#define SPI_PARAM_UNLOCK() xSemaphoreGive(paramLock) + spi_device_handle_t spi_reg, spi_fifo; void cmt_spi3_init(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int8_t pin_fcs, uint32_t spi_speed) { + paramLock = xSemaphoreCreateMutex(); + spi_bus_config_t buscfg = { .mosi_io_num = pin_sdio, .miso_io_num = -1, // single wire MOSI/MISO @@ -62,7 +68,9 @@ void cmt_spi3_write(uint8_t addr, uint8_t dat) .tx_buffer = &tx_data, .rx_buffer = NULL }; + SPI_PARAM_LOCK(); ESP_ERROR_CHECK(spi_device_polling_transmit(spi_reg, &t)); + SPI_PARAM_UNLOCK(); delayMicroseconds(100); } @@ -76,7 +84,9 @@ uint8_t cmt_spi3_read(uint8_t addr) .tx_buffer = &tx_data, .rx_buffer = &rx_data }; + SPI_PARAM_LOCK(); ESP_ERROR_CHECK(spi_device_polling_transmit(spi_reg, &t)); + SPI_PARAM_UNLOCK(); delayMicroseconds(100); return rx_data; } @@ -92,11 +102,13 @@ void cmt_spi3_write_fifo(const uint8_t* buf, uint16_t len) .rx_buffer = NULL }; + SPI_PARAM_LOCK(); for (uint8_t i = 0; i < len; i++) { tx_data = ~buf[i]; // negate buffer contents ESP_ERROR_CHECK(spi_device_polling_transmit(spi_fifo, &t)); delayMicroseconds(4); // > 4 us } + SPI_PARAM_UNLOCK(); } void cmt_spi3_read_fifo(uint8_t* buf, uint16_t len) @@ -110,9 +122,11 @@ void cmt_spi3_read_fifo(uint8_t* buf, uint16_t len) .rx_buffer = &rx_data }; + SPI_PARAM_LOCK(); for (uint8_t i = 0; i < len; i++) { ESP_ERROR_CHECK(spi_device_polling_transmit(spi_fifo, &t)); delayMicroseconds(4); // > 4 us buf[i] = rx_data; } + SPI_PARAM_UNLOCK(); } diff --git a/lib/Hoymiles/src/HoymilesRadio.cpp b/lib/Hoymiles/src/HoymilesRadio.cpp index 2cb82abb..117d45e9 100644 --- a/lib/Hoymiles/src/HoymilesRadio.cpp +++ b/lib/Hoymiles/src/HoymilesRadio.cpp @@ -66,11 +66,6 @@ bool HoymilesRadio::isInitialized() return _isInitialized; } -bool HoymilesRadio::isConfigured() -{ - return _isConfigured; -} - bool HoymilesRadio::isIdle() { return !_busyFlag; diff --git a/lib/Hoymiles/src/HoymilesRadio.h b/lib/Hoymiles/src/HoymilesRadio.h index 18cef026..056b61c3 100644 --- a/lib/Hoymiles/src/HoymilesRadio.h +++ b/lib/Hoymiles/src/HoymilesRadio.h @@ -13,7 +13,6 @@ public: bool isIdle(); bool isInitialized(); - bool isConfigured(); template T* enqueCommand() @@ -34,6 +33,5 @@ protected: serial_u _dtuSerial; std::queue> _commandQueue; bool _isInitialized = false; - bool _isConfigured = false; bool _busyFlag = false; }; \ No newline at end of file diff --git a/lib/Hoymiles/src/HoymilesRadio_CMT.cpp b/lib/Hoymiles/src/HoymilesRadio_CMT.cpp index 828de066..b083248c 100644 --- a/lib/Hoymiles/src/HoymilesRadio_CMT.cpp +++ b/lib/Hoymiles/src/HoymilesRadio_CMT.cpp @@ -63,7 +63,6 @@ void HoymilesRadio_CMT::init(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int cmtSwitchDtuFreq(_inverterTargetFrequency); // start dtu at work freqency, for fast Rx if inverter is already on and frequency switched - _isConfigured = true; if (!_radio->isChipConnected()) { Hoymiles.getMessageOutput()->println("CMT: Connection error!!"); return; diff --git a/lib/Hoymiles/src/HoymilesRadio_NRF.cpp b/lib/Hoymiles/src/HoymilesRadio_NRF.cpp index d69522b3..88b7dbb6 100644 --- a/lib/Hoymiles/src/HoymilesRadio_NRF.cpp +++ b/lib/Hoymiles/src/HoymilesRadio_NRF.cpp @@ -23,7 +23,6 @@ void HoymilesRadio_NRF::init(SPIClass* initialisedSpiBus, uint8_t pinCE, uint8_t _radio->setAddressWidth(5); _radio->setRetries(0, 0); _radio->maskIRQ(true, true, false); // enable only receiving interrupts - _isConfigured = true; if (!_radio->isChipConnected()) { Hoymiles.getMessageOutput()->println("NRF: Connection error!!"); return; diff --git a/lib/Hoymiles/src/commands/CommandAbstract.h b/lib/Hoymiles/src/commands/CommandAbstract.h index 8029ac87..e6abc686 100644 --- a/lib/Hoymiles/src/commands/CommandAbstract.h +++ b/lib/Hoymiles/src/commands/CommandAbstract.h @@ -57,5 +57,5 @@ protected: uint64_t _routerAddress; private: - void convertSerialToPacketId(uint8_t buffer[], uint64_t serial); + static void convertSerialToPacketId(uint8_t buffer[], uint64_t serial); }; \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/HMS_1CH.cpp b/lib/Hoymiles/src/inverters/HMS_1CH.cpp index 9fe5406c..3ce8002a 100644 --- a/lib/Hoymiles/src/inverters/HMS_1CH.cpp +++ b/lib/Hoymiles/src/inverters/HMS_1CH.cpp @@ -4,6 +4,30 @@ */ #include "HMS_1CH.h" +static const byteAssign_t byteAssignment[] = { + { TYPE_DC, CH0, FLD_UDC, UNIT_V, 2, 2, 10, false, 1 }, + { TYPE_DC, CH0, FLD_IDC, UNIT_A, 4, 2, 100, false, 2 }, + { TYPE_DC, CH0, FLD_PDC, UNIT_W, 6, 2, 10, false, 1 }, + { TYPE_DC, CH0, FLD_YD, UNIT_WH, 12, 2, 1, false, 0 }, + { TYPE_DC, CH0, FLD_YT, UNIT_KWH, 8, 4, 1000, false, 3 }, + { TYPE_DC, CH0, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH0, CMD_CALC, false, 3 }, + + { TYPE_AC, CH0, FLD_UAC, UNIT_V, 14, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_IAC, UNIT_A, 22, 2, 100, false, 2 }, + { TYPE_AC, CH0, FLD_PAC, UNIT_W, 18, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_PRA, UNIT_VA, 20, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_F, UNIT_HZ, 16, 2, 100, false, 2 }, + { TYPE_AC, CH0, FLD_PF, UNIT_NONE, 24, 2, 1000, false, 3 }, + + { TYPE_INV, CH0, FLD_T, UNIT_C, 26, 2, 10, true, 1 }, + { TYPE_INV, CH0, FLD_EVT_LOG, UNIT_NONE, 28, 2, 1, false, 0 }, + + { TYPE_AC, CH0, FLD_YD, UNIT_WH, CALC_YD_CH0, 0, CMD_CALC, false, 0 }, + { TYPE_AC, CH0, FLD_YT, UNIT_KWH, CALC_YT_CH0, 0, CMD_CALC, false, 3 }, + { TYPE_AC, CH0, FLD_PDC, UNIT_W, CALC_PDC_CH0, 0, CMD_CALC, false, 1 }, + { TYPE_AC, CH0, FLD_EFF, UNIT_PCT, CALC_EFF_CH0, 0, CMD_CALC, false, 3 } +}; + HMS_1CH::HMS_1CH(HoymilesRadio* radio, uint64_t serial) : HMS_Abstract(radio, serial) {}; @@ -19,7 +43,12 @@ String HMS_1CH::typeName() return "HMS-300, HMS-350, HMS-400, HMS-450, HMS-500"; } -const std::list* HMS_1CH::getByteAssignment() +const byteAssign_t* HMS_1CH::getByteAssignment() { - return &byteAssignment; + return byteAssignment; +} + +uint8_t HMS_1CH::getByteAssignmentSize() +{ + return sizeof(byteAssignment) / sizeof(byteAssignment[0]); } \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/HMS_1CH.h b/lib/Hoymiles/src/inverters/HMS_1CH.h index 5902e7c1..437f3d33 100644 --- a/lib/Hoymiles/src/inverters/HMS_1CH.h +++ b/lib/Hoymiles/src/inverters/HMS_1CH.h @@ -9,30 +9,6 @@ public: explicit HMS_1CH(HoymilesRadio* radio, uint64_t serial); static bool isValidSerial(uint64_t serial); String typeName(); - const std::list* getByteAssignment(); - -private: - const std::list byteAssignment = { - { TYPE_DC, CH0, FLD_UDC, UNIT_V, 2, 2, 10, false, 1 }, - { TYPE_DC, CH0, FLD_IDC, UNIT_A, 4, 2, 100, false, 2 }, - { TYPE_DC, CH0, FLD_PDC, UNIT_W, 6, 2, 10, false, 1 }, - { TYPE_DC, CH0, FLD_YD, UNIT_WH, 12, 2, 1, false, 0 }, - { TYPE_DC, CH0, FLD_YT, UNIT_KWH, 8, 4, 1000, false, 3 }, - { TYPE_DC, CH0, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH0, CMD_CALC, false, 3 }, - - { TYPE_AC, CH0, FLD_UAC, UNIT_V, 14, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_IAC, UNIT_A, 22, 2, 100, false, 2 }, - { TYPE_AC, CH0, FLD_PAC, UNIT_W, 18, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_PRA, UNIT_VA, 20, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_F, UNIT_HZ, 16, 2, 100, false, 2 }, - { TYPE_AC, CH0, FLD_PF, UNIT_NONE, 24, 2, 1000, false, 3 }, - - { TYPE_INV, CH0, FLD_T, UNIT_C, 26, 2, 10, true, 1 }, - { TYPE_INV, CH0, FLD_EVT_LOG, UNIT_NONE, 28, 2, 1, false, 0 }, - - { TYPE_AC, CH0, FLD_YD, UNIT_WH, CALC_YD_CH0, 0, CMD_CALC, false, 0 }, - { TYPE_AC, CH0, FLD_YT, UNIT_KWH, CALC_YT_CH0, 0, CMD_CALC, false, 3 }, - { TYPE_AC, CH0, FLD_PDC, UNIT_W, CALC_PDC_CH0, 0, CMD_CALC, false, 1 }, - { TYPE_AC, CH0, FLD_EFF, UNIT_PCT, CALC_EFF_CH0, 0, CMD_CALC, false, 3 } - }; + const byteAssign_t* getByteAssignment(); + uint8_t getByteAssignmentSize(); }; \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/HMS_2CH.cpp b/lib/Hoymiles/src/inverters/HMS_2CH.cpp index 2b1ea490..ffd5311f 100644 --- a/lib/Hoymiles/src/inverters/HMS_2CH.cpp +++ b/lib/Hoymiles/src/inverters/HMS_2CH.cpp @@ -4,6 +4,37 @@ */ #include "HMS_2CH.h" +static const byteAssign_t byteAssignment[] = { + { TYPE_DC, CH0, FLD_UDC, UNIT_V, 2, 2, 10, false, 1 }, + { TYPE_DC, CH0, FLD_IDC, UNIT_A, 6, 2, 100, false, 2 }, + { TYPE_DC, CH0, FLD_PDC, UNIT_W, 10, 2, 10, false, 1 }, + { TYPE_DC, CH0, FLD_YT, UNIT_KWH, 14, 4, 1000, false, 3 }, + { TYPE_DC, CH0, FLD_YD, UNIT_WH, 22, 2, 1, false, 0 }, + { TYPE_DC, CH0, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH0, CMD_CALC, false, 3 }, + + { TYPE_DC, CH1, FLD_UDC, UNIT_V, 4, 2, 10, false, 1 }, + { TYPE_DC, CH1, FLD_IDC, UNIT_A, 8, 2, 100, false, 2 }, + { TYPE_DC, CH1, FLD_PDC, UNIT_W, 12, 2, 10, false, 1 }, + { TYPE_DC, CH1, FLD_YT, UNIT_KWH, 18, 4, 1000, false, 3 }, + { TYPE_DC, CH1, FLD_YD, UNIT_WH, 24, 2, 1, false, 0 }, + { TYPE_DC, CH1, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH1, CMD_CALC, false, 3 }, + + { TYPE_AC, CH0, FLD_UAC, UNIT_V, 26, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_IAC, UNIT_A, 34, 2, 100, false, 2 }, + { TYPE_AC, CH0, FLD_PAC, UNIT_W, 30, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_PRA, UNIT_VA, 32, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_F, UNIT_HZ, 28, 2, 100, false, 2 }, + { TYPE_AC, CH0, FLD_PF, UNIT_NONE, 36, 2, 1000, false, 3 }, + + { TYPE_INV, CH0, FLD_T, UNIT_C, 38, 2, 10, true, 1 }, + { TYPE_INV, CH0, FLD_EVT_LOG, UNIT_NONE, 40, 2, 1, false, 0 }, + + { TYPE_AC, CH0, FLD_YD, UNIT_WH, CALC_YD_CH0, 0, CMD_CALC, false, 0 }, + { TYPE_AC, CH0, FLD_YT, UNIT_KWH, CALC_YT_CH0, 0, CMD_CALC, false, 3 }, + { TYPE_AC, CH0, FLD_PDC, UNIT_W, CALC_PDC_CH0, 0, CMD_CALC, false, 1 }, + { TYPE_AC, CH0, FLD_EFF, UNIT_PCT, CALC_EFF_CH0, 0, CMD_CALC, false, 3 } +}; + HMS_2CH::HMS_2CH(HoymilesRadio* radio, uint64_t serial) : HMS_Abstract(radio, serial) {}; @@ -19,7 +50,12 @@ String HMS_2CH::typeName() return "HMS-600, HMS-700, HMS-800, HMS-900, HMS-1000"; } -const std::list* HMS_2CH::getByteAssignment() +const byteAssign_t* HMS_2CH::getByteAssignment() { - return &byteAssignment; + return byteAssignment; +} + +uint8_t HMS_2CH::getByteAssignmentSize() +{ + return sizeof(byteAssignment) / sizeof(byteAssignment[0]); } \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/HMS_2CH.h b/lib/Hoymiles/src/inverters/HMS_2CH.h index d5e76c51..dff704ec 100644 --- a/lib/Hoymiles/src/inverters/HMS_2CH.h +++ b/lib/Hoymiles/src/inverters/HMS_2CH.h @@ -9,37 +9,6 @@ public: explicit HMS_2CH(HoymilesRadio* radio, uint64_t serial); static bool isValidSerial(uint64_t serial); String typeName(); - const std::list* getByteAssignment(); - -private: - const std::list byteAssignment = { - { TYPE_DC, CH0, FLD_UDC, UNIT_V, 2, 2, 10, false, 1 }, - { TYPE_DC, CH0, FLD_IDC, UNIT_A, 6, 2, 100, false, 2 }, - { TYPE_DC, CH0, FLD_PDC, UNIT_W, 10, 2, 10, false, 1 }, - { TYPE_DC, CH0, FLD_YT, UNIT_KWH, 14, 4, 1000, false, 3 }, - { TYPE_DC, CH0, FLD_YD, UNIT_WH, 22, 2, 1, false, 0 }, - { TYPE_DC, CH0, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH0, CMD_CALC, false, 3 }, - - { TYPE_DC, CH1, FLD_UDC, UNIT_V, 4, 2, 10, false, 1 }, - { TYPE_DC, CH1, FLD_IDC, UNIT_A, 8, 2, 100, false, 2 }, - { TYPE_DC, CH1, FLD_PDC, UNIT_W, 12, 2, 10, false, 1 }, - { TYPE_DC, CH1, FLD_YT, UNIT_KWH, 18, 4, 1000, false, 3 }, - { TYPE_DC, CH1, FLD_YD, UNIT_WH, 24, 2, 1, false, 0 }, - { TYPE_DC, CH1, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH1, CMD_CALC, false, 3 }, - - { TYPE_AC, CH0, FLD_UAC, UNIT_V, 26, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_IAC, UNIT_A, 34, 2, 100, false, 2 }, - { TYPE_AC, CH0, FLD_PAC, UNIT_W, 30, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_PRA, UNIT_VA, 32, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_F, UNIT_HZ, 28, 2, 100, false, 2 }, - { TYPE_AC, CH0, FLD_PF, UNIT_NONE, 36, 2, 1000, false, 3 }, - - { TYPE_INV, CH0, FLD_T, UNIT_C, 38, 2, 10, true, 1 }, - { TYPE_INV, CH0, FLD_EVT_LOG, UNIT_NONE, 40, 2, 1, false, 0 }, - - { TYPE_AC, CH0, FLD_YD, UNIT_WH, CALC_YD_CH0, 0, CMD_CALC, false, 0 }, - { TYPE_AC, CH0, FLD_YT, UNIT_KWH, CALC_YT_CH0, 0, CMD_CALC, false, 3 }, - { TYPE_AC, CH0, FLD_PDC, UNIT_W, CALC_PDC_CH0, 0, CMD_CALC, false, 1 }, - { TYPE_AC, CH0, FLD_EFF, UNIT_PCT, CALC_EFF_CH0, 0, CMD_CALC, false, 3 } - }; + const byteAssign_t* getByteAssignment(); + uint8_t getByteAssignmentSize(); }; \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/HMS_4CH.cpp b/lib/Hoymiles/src/inverters/HMS_4CH.cpp index db2df148..c4f22ee5 100644 --- a/lib/Hoymiles/src/inverters/HMS_4CH.cpp +++ b/lib/Hoymiles/src/inverters/HMS_4CH.cpp @@ -4,6 +4,51 @@ */ #include "HMS_4CH.h" +static const byteAssign_t byteAssignment[] = { + { TYPE_DC, CH0, FLD_UDC, UNIT_V, 2, 2, 10, false, 1 }, + { TYPE_DC, CH0, FLD_IDC, UNIT_A, 6, 2, 100, false, 2 }, + { TYPE_DC, CH0, FLD_PDC, UNIT_W, 10, 2, 10, false, 1 }, + { TYPE_DC, CH0, FLD_YD, UNIT_WH, 22, 2, 1, false, 0 }, + { TYPE_DC, CH0, FLD_YT, UNIT_KWH, 14, 4, 1000, false, 3 }, + { TYPE_DC, CH0, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH0, CMD_CALC, false, 3 }, + + { TYPE_DC, CH1, FLD_UDC, UNIT_V, 4, 2, 10, false, 1 }, + { TYPE_DC, CH1, FLD_IDC, UNIT_A, 8, 2, 100, false, 2 }, + { TYPE_DC, CH1, FLD_PDC, UNIT_W, 12, 2, 10, false, 1 }, + { TYPE_DC, CH1, FLD_YD, UNIT_WH, 24, 2, 1, false, 0 }, + { TYPE_DC, CH1, FLD_YT, UNIT_KWH, 18, 4, 1000, false, 3 }, + { TYPE_DC, CH1, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH1, CMD_CALC, false, 3 }, + + { TYPE_DC, CH2, FLD_UDC, UNIT_V, 26, 2, 10, false, 1 }, + { TYPE_DC, CH2, FLD_IDC, UNIT_A, 30, 2, 100, false, 2 }, + { TYPE_DC, CH2, FLD_PDC, UNIT_W, 34, 2, 10, false, 1 }, + { TYPE_DC, CH2, FLD_YD, UNIT_WH, 46, 2, 1, false, 0 }, + { TYPE_DC, CH2, FLD_YT, UNIT_KWH, 38, 4, 1000, false, 3 }, + { TYPE_DC, CH2, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH2, CMD_CALC, false, 3 }, + + { TYPE_DC, CH3, FLD_UDC, UNIT_V, 28, 2, 10, false, 1 }, + { TYPE_DC, CH3, FLD_IDC, UNIT_A, 32, 2, 100, false, 2 }, + { TYPE_DC, CH3, FLD_PDC, UNIT_W, 36, 2, 10, false, 1 }, + { TYPE_DC, CH3, FLD_YD, UNIT_WH, 48, 2, 1, false, 0 }, + { TYPE_DC, CH3, FLD_YT, UNIT_KWH, 42, 4, 1000, false, 3 }, + { TYPE_DC, CH3, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH3, CMD_CALC, false, 3 }, + + { TYPE_AC, CH0, FLD_UAC, UNIT_V, 50, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_IAC, UNIT_A, 58, 2, 100, false, 2 }, + { TYPE_AC, CH0, FLD_PAC, UNIT_W, 54, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_PRA, UNIT_VA, 56, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_F, UNIT_HZ, 52, 2, 100, false, 2 }, + { TYPE_AC, CH0, FLD_PF, UNIT_NONE, 60, 2, 1000, false, 3 }, + + { TYPE_INV, CH0, FLD_T, UNIT_C, 62, 2, 10, true, 1 }, + { TYPE_INV, CH0, FLD_EVT_LOG, UNIT_NONE, 64, 2, 1, false, 0 }, + + { TYPE_AC, CH0, FLD_YD, UNIT_WH, CALC_YD_CH0, 0, CMD_CALC, false, 0 }, + { TYPE_AC, CH0, FLD_YT, UNIT_KWH, CALC_YT_CH0, 0, CMD_CALC, false, 3 }, + { TYPE_AC, CH0, FLD_PDC, UNIT_W, CALC_PDC_CH0, 0, CMD_CALC, false, 1 }, + { TYPE_AC, CH0, FLD_EFF, UNIT_PCT, CALC_EFF_CH0, 0, CMD_CALC, false, 3 } +}; + HMS_4CH::HMS_4CH(HoymilesRadio* radio, uint64_t serial) : HMS_Abstract(radio, serial) {}; @@ -19,7 +64,12 @@ String HMS_4CH::typeName() return "HMS-1600, HMS-1800, HMS-2000"; } -const std::list* HMS_4CH::getByteAssignment() +const byteAssign_t* HMS_4CH::getByteAssignment() { - return &byteAssignment; + return byteAssignment; +} + +uint8_t HMS_4CH::getByteAssignmentSize() +{ + return sizeof(byteAssignment) / sizeof(byteAssignment[0]); } \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/HMS_4CH.h b/lib/Hoymiles/src/inverters/HMS_4CH.h index 090bea59..6a2e2b14 100644 --- a/lib/Hoymiles/src/inverters/HMS_4CH.h +++ b/lib/Hoymiles/src/inverters/HMS_4CH.h @@ -8,51 +8,6 @@ public: explicit HMS_4CH(HoymilesRadio* radio, uint64_t serial); static bool isValidSerial(uint64_t serial); String typeName(); - const std::list* getByteAssignment(); - -private: - const std::list byteAssignment = { - { TYPE_DC, CH0, FLD_UDC, UNIT_V, 2, 2, 10, false, 1 }, - { TYPE_DC, CH0, FLD_IDC, UNIT_A, 6, 2, 100, false, 2 }, - { TYPE_DC, CH0, FLD_PDC, UNIT_W, 10, 2, 10, false, 1 }, - { TYPE_DC, CH0, FLD_YD, UNIT_WH, 22, 2, 1, false, 0 }, - { TYPE_DC, CH0, FLD_YT, UNIT_KWH, 14, 4, 1000, false, 3 }, - { TYPE_DC, CH0, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH0, CMD_CALC, false, 3 }, - - { TYPE_DC, CH1, FLD_UDC, UNIT_V, 4, 2, 10, false, 1 }, - { TYPE_DC, CH1, FLD_IDC, UNIT_A, 8, 2, 100, false, 2 }, - { TYPE_DC, CH1, FLD_PDC, UNIT_W, 12, 2, 10, false, 1 }, - { TYPE_DC, CH1, FLD_YD, UNIT_WH, 24, 2, 1, false, 0 }, - { TYPE_DC, CH1, FLD_YT, UNIT_KWH, 18, 4, 1000, false, 3 }, - { TYPE_DC, CH1, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH1, CMD_CALC, false, 3 }, - - { TYPE_DC, CH2, FLD_UDC, UNIT_V, 26, 2, 10, false, 1 }, - { TYPE_DC, CH2, FLD_IDC, UNIT_A, 30, 2, 100, false, 2 }, - { TYPE_DC, CH2, FLD_PDC, UNIT_W, 34, 2, 10, false, 1 }, - { TYPE_DC, CH2, FLD_YD, UNIT_WH, 46, 2, 1, false, 0 }, - { TYPE_DC, CH2, FLD_YT, UNIT_KWH, 38, 4, 1000, false, 3 }, - { TYPE_DC, CH2, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH2, CMD_CALC, false, 3 }, - - { TYPE_DC, CH3, FLD_UDC, UNIT_V, 28, 2, 10, false, 1 }, - { TYPE_DC, CH3, FLD_IDC, UNIT_A, 32, 2, 100, false, 2 }, - { TYPE_DC, CH3, FLD_PDC, UNIT_W, 36, 2, 10, false, 1 }, - { TYPE_DC, CH3, FLD_YD, UNIT_WH, 48, 2, 1, false, 0 }, - { TYPE_DC, CH3, FLD_YT, UNIT_KWH, 42, 4, 1000, false, 3 }, - { TYPE_DC, CH3, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH3, CMD_CALC, false, 3 }, - - { TYPE_AC, CH0, FLD_UAC, UNIT_V, 50, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_IAC, UNIT_A, 58, 2, 100, false, 2 }, - { TYPE_AC, CH0, FLD_PAC, UNIT_W, 54, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_PRA, UNIT_VA, 56, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_F, UNIT_HZ, 52, 2, 100, false, 2 }, - { TYPE_AC, CH0, FLD_PF, UNIT_NONE, 60, 2, 1000, false, 3 }, - - { TYPE_INV, CH0, FLD_T, UNIT_C, 62, 2, 10, true, 1 }, - { TYPE_INV, CH0, FLD_EVT_LOG, UNIT_NONE, 64, 2, 1, false, 0 }, - - { TYPE_AC, CH0, FLD_YD, UNIT_WH, CALC_YD_CH0, 0, CMD_CALC, false, 0 }, - { TYPE_AC, CH0, FLD_YT, UNIT_KWH, CALC_YT_CH0, 0, CMD_CALC, false, 3 }, - { TYPE_AC, CH0, FLD_PDC, UNIT_W, CALC_PDC_CH0, 0, CMD_CALC, false, 1 }, - { TYPE_AC, CH0, FLD_EFF, UNIT_PCT, CALC_EFF_CH0, 0, CMD_CALC, false, 3 } - }; + const byteAssign_t* getByteAssignment(); + uint8_t getByteAssignmentSize(); }; \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/HMT_6CH.cpp b/lib/Hoymiles/src/inverters/HMT_6CH.cpp index d50963b9..b8721831 100644 --- a/lib/Hoymiles/src/inverters/HMT_6CH.cpp +++ b/lib/Hoymiles/src/inverters/HMT_6CH.cpp @@ -4,6 +4,74 @@ */ #include "HMT_6CH.h" +static const byteAssign_t byteAssignment[] = { + { TYPE_DC, CH0, FLD_UDC, UNIT_V, 2, 2, 10, false, 1 }, + { TYPE_DC, CH0, FLD_IDC, UNIT_A, 4, 2, 100, false, 2 }, + { TYPE_DC, CH0, FLD_PDC, UNIT_W, 8, 2, 10, false, 1 }, + { TYPE_DC, CH0, FLD_YT, UNIT_KWH, 12, 4, 1000, false, 3 }, + { TYPE_DC, CH0, FLD_YD, UNIT_WH, 20, 2, 1, false, 0 }, + { TYPE_DC, CH0, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH0, CMD_CALC, false, 3 }, + + { TYPE_DC, CH1, FLD_UDC, UNIT_V, 2, 2, 10, false, 1 }, + { TYPE_DC, CH1, FLD_IDC, UNIT_A, 6, 2, 100, false, 2 }, + { TYPE_DC, CH1, FLD_PDC, UNIT_W, 10, 2, 10, false, 1 }, + { TYPE_DC, CH1, FLD_YT, UNIT_KWH, 16, 4, 1000, false, 3 }, + { TYPE_DC, CH1, FLD_YD, UNIT_WH, 22, 2, 1, false, 0 }, + { TYPE_DC, CH1, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH1, CMD_CALC, false, 3 }, + + { TYPE_DC, CH2, FLD_UDC, UNIT_V, 24, 2, 10, false, 1 }, + { TYPE_DC, CH2, FLD_IDC, UNIT_A, 26, 2, 100, false, 2 }, + { TYPE_DC, CH2, FLD_PDC, UNIT_W, 30, 2, 10, false, 1 }, + { TYPE_DC, CH2, FLD_YT, UNIT_KWH, 34, 4, 1000, false, 3 }, + { TYPE_DC, CH2, FLD_YD, UNIT_WH, 42, 2, 1, false, 0 }, + { TYPE_DC, CH2, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH2, CMD_CALC, false, 3 }, + + { TYPE_DC, CH3, FLD_UDC, UNIT_V, 24, 2, 10, false, 1 }, + { TYPE_DC, CH3, FLD_IDC, UNIT_A, 28, 2, 100, false, 2 }, + { TYPE_DC, CH3, FLD_PDC, UNIT_W, 32, 2, 10, false, 1 }, + { TYPE_DC, CH3, FLD_YT, UNIT_KWH, 38, 4, 1000, false, 3 }, + { TYPE_DC, CH3, FLD_YD, UNIT_WH, 44, 2, 1, false, 0 }, + { TYPE_DC, CH3, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH3, CMD_CALC, false, 3 }, + + { TYPE_DC, CH4, FLD_UDC, UNIT_V, 46, 2, 10, false, 1 }, + { TYPE_DC, CH4, FLD_IDC, UNIT_A, 48, 2, 100, false, 2 }, + { TYPE_DC, CH4, FLD_PDC, UNIT_W, 52, 2, 10, false, 1 }, + { TYPE_DC, CH4, FLD_YT, UNIT_KWH, 56, 4, 1000, false, 3 }, + { TYPE_DC, CH4, FLD_YD, UNIT_WH, 64, 2, 1, false, 0 }, + { TYPE_DC, CH4, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH4, CMD_CALC, false, 3 }, + + { TYPE_DC, CH5, FLD_UDC, UNIT_V, 46, 2, 10, false, 1 }, + { TYPE_DC, CH5, FLD_IDC, UNIT_A, 50, 2, 100, false, 2 }, + { TYPE_DC, CH5, FLD_PDC, UNIT_W, 54, 2, 10, false, 1 }, + { TYPE_DC, CH5, FLD_YT, UNIT_KWH, 60, 4, 1000, false, 3 }, + { TYPE_DC, CH5, FLD_YD, UNIT_WH, 66, 2, 1, false, 0 }, + { TYPE_DC, CH5, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH5, CMD_CALC, false, 3 }, + + { TYPE_AC, CH0, FLD_UAC, UNIT_V, 74, 2, 10, false, 1 }, // dummy + { TYPE_AC, CH0, FLD_UAC_1N, UNIT_V, 68, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_UAC_2N, UNIT_V, 70, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_UAC_3N, UNIT_V, 72, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_UAC_12, UNIT_V, 74, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_UAC_23, UNIT_V, 76, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_UAC_31, UNIT_V, 78, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_F, UNIT_HZ, 80, 2, 100, false, 2 }, + { TYPE_AC, CH0, FLD_PAC, UNIT_W, 82, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_PRA, UNIT_VA, 84, 2, 10, true, 1 }, + { TYPE_AC, CH0, FLD_IAC, UNIT_A, 86, 2, 100, false, 2 }, // dummy + { TYPE_AC, CH0, FLD_IAC_1, UNIT_A, 86, 2, 100, false, 2 }, + { TYPE_AC, CH0, FLD_IAC_2, UNIT_A, 88, 2, 100, false, 2 }, + { TYPE_AC, CH0, FLD_IAC_3, UNIT_A, 90, 2, 100, false, 2 }, + { TYPE_AC, CH0, FLD_PF, UNIT_NONE, 92, 2, 1000, false, 3 }, + + { TYPE_INV, CH0, FLD_T, UNIT_C, 94, 2, 10, true, 1 }, + { TYPE_INV, CH0, FLD_EVT_LOG, UNIT_NONE, 96, 2, 1, false, 0 }, + + { TYPE_AC, CH0, FLD_YD, UNIT_WH, CALC_YD_CH0, 0, CMD_CALC, false, 0 }, + { TYPE_AC, CH0, FLD_YT, UNIT_KWH, CALC_YT_CH0, 0, CMD_CALC, false, 3 }, + { TYPE_AC, CH0, FLD_PDC, UNIT_W, CALC_PDC_CH0, 0, CMD_CALC, false, 1 }, + { TYPE_AC, CH0, FLD_EFF, UNIT_PCT, CALC_EFF_CH0, 0, CMD_CALC, false, 3 } +}; + HMT_6CH::HMT_6CH(HoymilesRadio* radio, uint64_t serial) : HMT_Abstract(radio, serial) {}; @@ -19,7 +87,12 @@ String HMT_6CH::typeName() return F("HMT-1800, HMT-2250"); } -const std::list* HMT_6CH::getByteAssignment() +const byteAssign_t* HMT_6CH::getByteAssignment() { - return &byteAssignment; -} \ No newline at end of file + return byteAssignment; +} + +uint8_t HMT_6CH::getByteAssignmentSize() +{ + return sizeof(byteAssignment) / sizeof(byteAssignment[0]); +} diff --git a/lib/Hoymiles/src/inverters/HMT_6CH.h b/lib/Hoymiles/src/inverters/HMT_6CH.h index 119d2ec1..ea4be715 100644 --- a/lib/Hoymiles/src/inverters/HMT_6CH.h +++ b/lib/Hoymiles/src/inverters/HMT_6CH.h @@ -8,74 +8,6 @@ public: explicit HMT_6CH(HoymilesRadio* radio, uint64_t serial); static bool isValidSerial(uint64_t serial); String typeName(); - const std::list* getByteAssignment(); - -private: - const std::list byteAssignment = { - { TYPE_DC, CH0, FLD_UDC, UNIT_V, 2, 2, 10, false, 1 }, - { TYPE_DC, CH0, FLD_IDC, UNIT_A, 4, 2, 100, false, 2 }, - { TYPE_DC, CH0, FLD_PDC, UNIT_W, 8, 2, 10, false, 1 }, - { TYPE_DC, CH0, FLD_YT, UNIT_KWH, 12, 4, 1000, false, 3 }, - { TYPE_DC, CH0, FLD_YD, UNIT_WH, 20, 2, 1, false, 0 }, - { TYPE_DC, CH0, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH0, CMD_CALC, false, 3 }, - - { TYPE_DC, CH1, FLD_UDC, UNIT_V, 2, 2, 10, false, 1 }, - { TYPE_DC, CH1, FLD_IDC, UNIT_A, 6, 2, 100, false, 2 }, - { TYPE_DC, CH1, FLD_PDC, UNIT_W, 10, 2, 10, false, 1 }, - { TYPE_DC, CH1, FLD_YT, UNIT_KWH, 16, 4, 1000, false, 3 }, - { TYPE_DC, CH1, FLD_YD, UNIT_WH, 22, 2, 1, false, 0 }, - { TYPE_DC, CH1, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH1, CMD_CALC, false, 3 }, - - { TYPE_DC, CH2, FLD_UDC, UNIT_V, 24, 2, 10, false, 1 }, - { TYPE_DC, CH2, FLD_IDC, UNIT_A, 26, 2, 100, false, 2 }, - { TYPE_DC, CH2, FLD_PDC, UNIT_W, 30, 2, 10, false, 1 }, - { TYPE_DC, CH2, FLD_YT, UNIT_KWH, 34, 4, 1000, false, 3 }, - { TYPE_DC, CH2, FLD_YD, UNIT_WH, 42, 2, 1, false, 0 }, - { TYPE_DC, CH2, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH2, CMD_CALC, false, 3 }, - - { TYPE_DC, CH3, FLD_UDC, UNIT_V, 24, 2, 10, false, 1 }, - { TYPE_DC, CH3, FLD_IDC, UNIT_A, 28, 2, 100, false, 2 }, - { TYPE_DC, CH3, FLD_PDC, UNIT_W, 32, 2, 10, false, 1 }, - { TYPE_DC, CH3, FLD_YT, UNIT_KWH, 38, 4, 1000, false, 3 }, - { TYPE_DC, CH3, FLD_YD, UNIT_WH, 44, 2, 1, false, 0 }, - { TYPE_DC, CH3, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH3, CMD_CALC, false, 3 }, - - { TYPE_DC, CH4, FLD_UDC, UNIT_V, 46, 2, 10, false, 1 }, - { TYPE_DC, CH4, FLD_IDC, UNIT_A, 48, 2, 100, false, 2 }, - { TYPE_DC, CH4, FLD_PDC, UNIT_W, 52, 2, 10, false, 1 }, - { TYPE_DC, CH4, FLD_YT, UNIT_KWH, 56, 4, 1000, false, 3 }, - { TYPE_DC, CH4, FLD_YD, UNIT_WH, 64, 2, 1, false, 0 }, - { TYPE_DC, CH4, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH4, CMD_CALC, false, 3 }, - - { TYPE_DC, CH5, FLD_UDC, UNIT_V, 46, 2, 10, false, 1 }, - { TYPE_DC, CH5, FLD_IDC, UNIT_A, 50, 2, 100, false, 2 }, - { TYPE_DC, CH5, FLD_PDC, UNIT_W, 54, 2, 10, false, 1 }, - { TYPE_DC, CH5, FLD_YT, UNIT_KWH, 60, 4, 1000, false, 3 }, - { TYPE_DC, CH5, FLD_YD, UNIT_WH, 66, 2, 1, false, 0 }, - { TYPE_DC, CH5, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH5, CMD_CALC, false, 3 }, - - { TYPE_AC, CH0, FLD_UAC, UNIT_V, 74, 2, 10, false, 1 }, // dummy - { TYPE_AC, CH0, FLD_UAC_1N, UNIT_V, 68, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_UAC_2N, UNIT_V, 70, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_UAC_3N, UNIT_V, 72, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_UAC_12, UNIT_V, 74, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_UAC_23, UNIT_V, 76, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_UAC_31, UNIT_V, 78, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_F, UNIT_HZ, 80, 2, 100, false, 2 }, - { TYPE_AC, CH0, FLD_PAC, UNIT_W, 82, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_PRA, UNIT_VA, 84, 2, 10, true, 1 }, - { TYPE_AC, CH0, FLD_IAC, UNIT_A, 86, 2, 100, false, 2 }, // dummy - { TYPE_AC, CH0, FLD_IAC_1, UNIT_A, 86, 2, 100, false, 2 }, - { TYPE_AC, CH0, FLD_IAC_2, UNIT_A, 88, 2, 100, false, 2 }, - { TYPE_AC, CH0, FLD_IAC_3, UNIT_A, 90, 2, 100, false, 2 }, - { TYPE_AC, CH0, FLD_PF, UNIT_NONE, 92, 2, 1000, false, 3 }, - - { TYPE_INV, CH0, FLD_T, UNIT_C, 94, 2, 10, true, 1 }, - { TYPE_INV, CH0, FLD_EVT_LOG, UNIT_NONE, 96, 2, 1, false, 0 }, - - { TYPE_AC, CH0, FLD_YD, UNIT_WH, CALC_YD_CH0, 0, CMD_CALC, false, 0 }, - { TYPE_AC, CH0, FLD_YT, UNIT_KWH, CALC_YT_CH0, 0, CMD_CALC, false, 3 }, - { TYPE_AC, CH0, FLD_PDC, UNIT_W, CALC_PDC_CH0, 0, CMD_CALC, false, 1 }, - { TYPE_AC, CH0, FLD_EFF, UNIT_PCT, CALC_EFF_CH0, 0, CMD_CALC, false, 3 } - }; + const byteAssign_t* getByteAssignment(); + uint8_t getByteAssignmentSize(); }; \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/HM_1CH.cpp b/lib/Hoymiles/src/inverters/HM_1CH.cpp index df3a8442..5513aead 100644 --- a/lib/Hoymiles/src/inverters/HM_1CH.cpp +++ b/lib/Hoymiles/src/inverters/HM_1CH.cpp @@ -4,6 +4,30 @@ */ #include "HM_1CH.h" +static const byteAssign_t byteAssignment[] = { + { TYPE_DC, CH0, FLD_UDC, UNIT_V, 2, 2, 10, false, 1 }, + { TYPE_DC, CH0, FLD_IDC, UNIT_A, 4, 2, 100, false, 2 }, + { TYPE_DC, CH0, FLD_PDC, UNIT_W, 6, 2, 10, false, 1 }, + { TYPE_DC, CH0, FLD_YD, UNIT_WH, 12, 2, 1, false, 0 }, + { TYPE_DC, CH0, FLD_YT, UNIT_KWH, 8, 4, 1000, false, 3 }, + { TYPE_DC, CH0, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH0, CMD_CALC, false, 3 }, + + { TYPE_AC, CH0, FLD_UAC, UNIT_V, 14, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_IAC, UNIT_A, 22, 2, 100, false, 2 }, + { TYPE_AC, CH0, FLD_PAC, UNIT_W, 18, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_PRA, UNIT_VA, 20, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_F, UNIT_HZ, 16, 2, 100, false, 2 }, + { TYPE_AC, CH0, FLD_PF, UNIT_NONE, 24, 2, 1000, false, 3 }, + + { TYPE_INV, CH0, FLD_T, UNIT_C, 26, 2, 10, true, 1 }, + { TYPE_INV, CH0, FLD_EVT_LOG, UNIT_NONE, 28, 2, 1, false, 0 }, + + { TYPE_AC, CH0, FLD_YD, UNIT_WH, CALC_YD_CH0, 0, CMD_CALC, false, 0 }, + { TYPE_AC, CH0, FLD_YT, UNIT_KWH, CALC_YT_CH0, 0, CMD_CALC, false, 3 }, + { TYPE_AC, CH0, FLD_PDC, UNIT_W, CALC_PDC_CH0, 0, CMD_CALC, false, 1 }, + { TYPE_AC, CH0, FLD_EFF, UNIT_PCT, CALC_EFF_CH0, 0, CMD_CALC, false, 3 } +}; + HM_1CH::HM_1CH(HoymilesRadio* radio, uint64_t serial) : HM_Abstract(radio, serial) {}; @@ -32,7 +56,12 @@ String HM_1CH::typeName() return "HM-300, HM-350, HM-400"; } -const std::list* HM_1CH::getByteAssignment() +const byteAssign_t* HM_1CH::getByteAssignment() { - return &byteAssignment; + return byteAssignment; +} + +uint8_t HM_1CH::getByteAssignmentSize() +{ + return sizeof(byteAssignment) / sizeof(byteAssignment[0]); } \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/HM_1CH.h b/lib/Hoymiles/src/inverters/HM_1CH.h index 11dcbe24..cb18dcf5 100644 --- a/lib/Hoymiles/src/inverters/HM_1CH.h +++ b/lib/Hoymiles/src/inverters/HM_1CH.h @@ -9,30 +9,6 @@ public: explicit HM_1CH(HoymilesRadio* radio, uint64_t serial); static bool isValidSerial(uint64_t serial); String typeName(); - const std::list* getByteAssignment(); - -private: - const std::list byteAssignment = { - { TYPE_DC, CH0, FLD_UDC, UNIT_V, 2, 2, 10, false, 1 }, - { TYPE_DC, CH0, FLD_IDC, UNIT_A, 4, 2, 100, false, 2 }, - { TYPE_DC, CH0, FLD_PDC, UNIT_W, 6, 2, 10, false, 1 }, - { TYPE_DC, CH0, FLD_YD, UNIT_WH, 12, 2, 1, false, 0 }, - { TYPE_DC, CH0, FLD_YT, UNIT_KWH, 8, 4, 1000, false, 3 }, - { TYPE_DC, CH0, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH0, CMD_CALC, false, 3 }, - - { TYPE_AC, CH0, FLD_UAC, UNIT_V, 14, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_IAC, UNIT_A, 22, 2, 100, false, 2 }, - { TYPE_AC, CH0, FLD_PAC, UNIT_W, 18, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_PRA, UNIT_VA, 20, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_F, UNIT_HZ, 16, 2, 100, false, 2 }, - { TYPE_AC, CH0, FLD_PF, UNIT_NONE, 24, 2, 1000, false, 3 }, - - { TYPE_INV, CH0, FLD_T, UNIT_C, 26, 2, 10, true, 1 }, - { TYPE_INV, CH0, FLD_EVT_LOG, UNIT_NONE, 28, 2, 1, false, 0 }, - - { TYPE_AC, CH0, FLD_YD, UNIT_WH, CALC_YD_CH0, 0, CMD_CALC, false, 0 }, - { TYPE_AC, CH0, FLD_YT, UNIT_KWH, CALC_YT_CH0, 0, CMD_CALC, false, 3 }, - { TYPE_AC, CH0, FLD_PDC, UNIT_W, CALC_PDC_CH0, 0, CMD_CALC, false, 1 }, - { TYPE_AC, CH0, FLD_EFF, UNIT_PCT, CALC_EFF_CH0, 0, CMD_CALC, false, 3 } - }; + const byteAssign_t* getByteAssignment(); + uint8_t getByteAssignmentSize(); }; \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/HM_2CH.cpp b/lib/Hoymiles/src/inverters/HM_2CH.cpp index 87c5f394..e0ba644d 100644 --- a/lib/Hoymiles/src/inverters/HM_2CH.cpp +++ b/lib/Hoymiles/src/inverters/HM_2CH.cpp @@ -5,6 +5,37 @@ */ #include "HM_2CH.h" +static const byteAssign_t byteAssignment[] = { + { TYPE_DC, CH0, FLD_UDC, UNIT_V, 2, 2, 10, false, 1 }, + { TYPE_DC, CH0, FLD_IDC, UNIT_A, 4, 2, 100, false, 2 }, + { TYPE_DC, CH0, FLD_PDC, UNIT_W, 6, 2, 10, false, 1 }, + { TYPE_DC, CH0, FLD_YD, UNIT_WH, 22, 2, 1, false, 0 }, + { TYPE_DC, CH0, FLD_YT, UNIT_KWH, 14, 4, 1000, false, 3 }, + { TYPE_DC, CH0, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH0, CMD_CALC, false, 3 }, + + { TYPE_DC, CH1, FLD_UDC, UNIT_V, 8, 2, 10, false, 1 }, + { TYPE_DC, CH1, FLD_IDC, UNIT_A, 10, 2, 100, false, 2 }, + { TYPE_DC, CH1, FLD_PDC, UNIT_W, 12, 2, 10, false, 1 }, + { TYPE_DC, CH1, FLD_YD, UNIT_WH, 24, 2, 1, false, 0 }, + { TYPE_DC, CH1, FLD_YT, UNIT_KWH, 18, 4, 1000, false, 3 }, + { TYPE_DC, CH1, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH1, CMD_CALC, false, 3 }, + + { TYPE_AC, CH0, FLD_UAC, UNIT_V, 26, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_IAC, UNIT_A, 34, 2, 100, false, 2 }, + { TYPE_AC, CH0, FLD_PAC, UNIT_W, 30, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_PRA, UNIT_VA, 32, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_F, UNIT_HZ, 28, 2, 100, false, 2 }, + { TYPE_AC, CH0, FLD_PF, UNIT_NONE, 36, 2, 1000, false, 3 }, + + { TYPE_INV, CH0, FLD_T, UNIT_C, 38, 2, 10, true, 1 }, + { TYPE_INV, CH0, FLD_EVT_LOG, UNIT_NONE, 40, 2, 1, false, 0 }, + + { TYPE_AC, CH0, FLD_YD, UNIT_WH, CALC_YD_CH0, 0, CMD_CALC, false, 0 }, + { TYPE_AC, CH0, FLD_YT, UNIT_KWH, CALC_YT_CH0, 0, CMD_CALC, false, 3 }, + { TYPE_AC, CH0, FLD_PDC, UNIT_W, CALC_PDC_CH0, 0, CMD_CALC, false, 1 }, + { TYPE_AC, CH0, FLD_EFF, UNIT_PCT, CALC_EFF_CH0, 0, CMD_CALC, false, 3 } +}; + HM_2CH::HM_2CH(HoymilesRadio* radio, uint64_t serial) : HM_Abstract(radio, serial) {}; @@ -33,7 +64,12 @@ String HM_2CH::typeName() return "HM-600, HM-700, HM-800"; } -const std::list* HM_2CH::getByteAssignment() +const byteAssign_t* HM_2CH::getByteAssignment() { - return &byteAssignment; + return byteAssignment; +} + +uint8_t HM_2CH::getByteAssignmentSize() +{ + return sizeof(byteAssignment) / sizeof(byteAssignment[0]); } \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/HM_2CH.h b/lib/Hoymiles/src/inverters/HM_2CH.h index a79a854b..06ac509d 100644 --- a/lib/Hoymiles/src/inverters/HM_2CH.h +++ b/lib/Hoymiles/src/inverters/HM_2CH.h @@ -8,37 +8,6 @@ public: explicit HM_2CH(HoymilesRadio* radio, uint64_t serial); static bool isValidSerial(uint64_t serial); String typeName(); - const std::list* getByteAssignment(); - -private: - const std::list byteAssignment = { - { TYPE_DC, CH0, FLD_UDC, UNIT_V, 2, 2, 10, false, 1 }, - { TYPE_DC, CH0, FLD_IDC, UNIT_A, 4, 2, 100, false, 2 }, - { TYPE_DC, CH0, FLD_PDC, UNIT_W, 6, 2, 10, false, 1 }, - { TYPE_DC, CH0, FLD_YD, UNIT_WH, 22, 2, 1, false, 0 }, - { TYPE_DC, CH0, FLD_YT, UNIT_KWH, 14, 4, 1000, false, 3 }, - { TYPE_DC, CH0, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH0, CMD_CALC, false, 3 }, - - { TYPE_DC, CH1, FLD_UDC, UNIT_V, 8, 2, 10, false, 1 }, - { TYPE_DC, CH1, FLD_IDC, UNIT_A, 10, 2, 100, false, 2 }, - { TYPE_DC, CH1, FLD_PDC, UNIT_W, 12, 2, 10, false, 1 }, - { TYPE_DC, CH1, FLD_YD, UNIT_WH, 24, 2, 1, false, 0 }, - { TYPE_DC, CH1, FLD_YT, UNIT_KWH, 18, 4, 1000, false, 3 }, - { TYPE_DC, CH1, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH1, CMD_CALC, false, 3 }, - - { TYPE_AC, CH0, FLD_UAC, UNIT_V, 26, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_IAC, UNIT_A, 34, 2, 100, false, 2 }, - { TYPE_AC, CH0, FLD_PAC, UNIT_W, 30, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_PRA, UNIT_VA, 32, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_F, UNIT_HZ, 28, 2, 100, false, 2 }, - { TYPE_AC, CH0, FLD_PF, UNIT_NONE, 36, 2, 1000, false, 3 }, - - { TYPE_INV, CH0, FLD_T, UNIT_C, 38, 2, 10, true, 1 }, - { TYPE_INV, CH0, FLD_EVT_LOG, UNIT_NONE, 40, 2, 1, false, 0 }, - - { TYPE_AC, CH0, FLD_YD, UNIT_WH, CALC_YD_CH0, 0, CMD_CALC, false, 0 }, - { TYPE_AC, CH0, FLD_YT, UNIT_KWH, CALC_YT_CH0, 0, CMD_CALC, false, 3 }, - { TYPE_AC, CH0, FLD_PDC, UNIT_W, CALC_PDC_CH0, 0, CMD_CALC, false, 1 }, - { TYPE_AC, CH0, FLD_EFF, UNIT_PCT, CALC_EFF_CH0, 0, CMD_CALC, false, 3 } - }; + const byteAssign_t* getByteAssignment(); + uint8_t getByteAssignmentSize(); }; \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/HM_4CH.cpp b/lib/Hoymiles/src/inverters/HM_4CH.cpp index cc52b482..a8195545 100644 --- a/lib/Hoymiles/src/inverters/HM_4CH.cpp +++ b/lib/Hoymiles/src/inverters/HM_4CH.cpp @@ -4,6 +4,51 @@ */ #include "HM_4CH.h" +static const byteAssign_t byteAssignment[] = { + { TYPE_DC, CH0, FLD_UDC, UNIT_V, 2, 2, 10, false, 1 }, + { TYPE_DC, CH0, FLD_IDC, UNIT_A, 4, 2, 100, false, 2 }, + { TYPE_DC, CH0, FLD_PDC, UNIT_W, 8, 2, 10, false, 1 }, + { TYPE_DC, CH0, FLD_YD, UNIT_WH, 20, 2, 1, false, 0 }, + { TYPE_DC, CH0, FLD_YT, UNIT_KWH, 12, 4, 1000, false, 3 }, + { TYPE_DC, CH0, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH0, CMD_CALC, false, 3 }, + + { TYPE_DC, CH1, FLD_UDC, UNIT_V, CALC_UDC_CH, CH0, CMD_CALC, false, 1 }, + { TYPE_DC, CH1, FLD_IDC, UNIT_A, 6, 2, 100, false, 2 }, + { TYPE_DC, CH1, FLD_PDC, UNIT_W, 10, 2, 10, false, 1 }, + { TYPE_DC, CH1, FLD_YD, UNIT_WH, 22, 2, 1, false, 0 }, + { TYPE_DC, CH1, FLD_YT, UNIT_KWH, 16, 4, 1000, false, 3 }, + { TYPE_DC, CH1, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH1, CMD_CALC, false, 3 }, + + { TYPE_DC, CH2, FLD_UDC, UNIT_V, 24, 2, 10, false, 1 }, + { TYPE_DC, CH2, FLD_IDC, UNIT_A, 26, 2, 100, false, 2 }, + { TYPE_DC, CH2, FLD_PDC, UNIT_W, 30, 2, 10, false, 1 }, + { TYPE_DC, CH2, FLD_YD, UNIT_WH, 42, 2, 1, false, 0 }, + { TYPE_DC, CH2, FLD_YT, UNIT_KWH, 34, 4, 1000, false, 3 }, + { TYPE_DC, CH2, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH2, CMD_CALC, false, 3 }, + + { TYPE_DC, CH3, FLD_UDC, UNIT_V, CALC_UDC_CH, CH2, CMD_CALC, false, 1 }, + { TYPE_DC, CH3, FLD_IDC, UNIT_A, 28, 2, 100, false, 2 }, + { TYPE_DC, CH3, FLD_PDC, UNIT_W, 32, 2, 10, false, 1 }, + { TYPE_DC, CH3, FLD_YD, UNIT_WH, 44, 2, 1, false, 0 }, + { TYPE_DC, CH3, FLD_YT, UNIT_KWH, 38, 4, 1000, false, 3 }, + { TYPE_DC, CH3, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH3, CMD_CALC, false, 3 }, + + { TYPE_AC, CH0, FLD_UAC, UNIT_V, 46, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_IAC, UNIT_A, 54, 2, 100, false, 2 }, + { TYPE_AC, CH0, FLD_PAC, UNIT_W, 50, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_PRA, UNIT_VA, 52, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_F, UNIT_HZ, 48, 2, 100, false, 2 }, + { TYPE_AC, CH0, FLD_PF, UNIT_NONE, 56, 2, 1000, false, 3 }, + + { TYPE_INV, CH0, FLD_T, UNIT_C, 58, 2, 10, true, 1 }, + { TYPE_INV, CH0, FLD_EVT_LOG, UNIT_NONE, 60, 2, 1, false, 0 }, + + { TYPE_AC, CH0, FLD_YD, UNIT_WH, CALC_YD_CH0, 0, CMD_CALC, false, 0 }, + { TYPE_AC, CH0, FLD_YT, UNIT_KWH, CALC_YT_CH0, 0, CMD_CALC, false, 3 }, + { TYPE_AC, CH0, FLD_PDC, UNIT_W, CALC_PDC_CH0, 0, CMD_CALC, false, 1 }, + { TYPE_AC, CH0, FLD_EFF, UNIT_PCT, CALC_EFF_CH0, 0, CMD_CALC, false, 3 } +}; + HM_4CH::HM_4CH(HoymilesRadio* radio, uint64_t serial) : HM_Abstract(radio, serial) {}; @@ -32,7 +77,12 @@ String HM_4CH::typeName() return "HM-1000, HM-1200, HM-1500"; } -const std::list* HM_4CH::getByteAssignment() +const byteAssign_t* HM_4CH::getByteAssignment() { - return &byteAssignment; + return byteAssignment; +} + +uint8_t HM_4CH::getByteAssignmentSize() +{ + return sizeof(byteAssignment) / sizeof(byteAssignment[0]); } \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/HM_4CH.h b/lib/Hoymiles/src/inverters/HM_4CH.h index dc5ea550..44d341ae 100644 --- a/lib/Hoymiles/src/inverters/HM_4CH.h +++ b/lib/Hoymiles/src/inverters/HM_4CH.h @@ -8,51 +8,6 @@ public: explicit HM_4CH(HoymilesRadio* radio, uint64_t serial); static bool isValidSerial(uint64_t serial); String typeName(); - const std::list* getByteAssignment(); - -private: - const std::list byteAssignment = { - { TYPE_DC, CH0, FLD_UDC, UNIT_V, 2, 2, 10, false, 1 }, - { TYPE_DC, CH0, FLD_IDC, UNIT_A, 4, 2, 100, false, 2 }, - { TYPE_DC, CH0, FLD_PDC, UNIT_W, 8, 2, 10, false, 1 }, - { TYPE_DC, CH0, FLD_YD, UNIT_WH, 20, 2, 1, false, 0 }, - { TYPE_DC, CH0, FLD_YT, UNIT_KWH, 12, 4, 1000, false, 3 }, - { TYPE_DC, CH0, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH0, CMD_CALC, false, 3 }, - - { TYPE_DC, CH1, FLD_UDC, UNIT_V, CALC_UDC_CH, CH0, CMD_CALC, false, 1 }, - { TYPE_DC, CH1, FLD_IDC, UNIT_A, 6, 2, 100, false, 2 }, - { TYPE_DC, CH1, FLD_PDC, UNIT_W, 10, 2, 10, false, 1 }, - { TYPE_DC, CH1, FLD_YD, UNIT_WH, 22, 2, 1, false, 0 }, - { TYPE_DC, CH1, FLD_YT, UNIT_KWH, 16, 4, 1000, false, 3 }, - { TYPE_DC, CH1, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH1, CMD_CALC, false, 3 }, - - { TYPE_DC, CH2, FLD_UDC, UNIT_V, 24, 2, 10, false, 1 }, - { TYPE_DC, CH2, FLD_IDC, UNIT_A, 26, 2, 100, false, 2 }, - { TYPE_DC, CH2, FLD_PDC, UNIT_W, 30, 2, 10, false, 1 }, - { TYPE_DC, CH2, FLD_YD, UNIT_WH, 42, 2, 1, false, 0 }, - { TYPE_DC, CH2, FLD_YT, UNIT_KWH, 34, 4, 1000, false, 3 }, - { TYPE_DC, CH2, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH2, CMD_CALC, false, 3 }, - - { TYPE_DC, CH3, FLD_UDC, UNIT_V, CALC_UDC_CH, CH2, CMD_CALC, false, 1 }, - { TYPE_DC, CH3, FLD_IDC, UNIT_A, 28, 2, 100, false, 2 }, - { TYPE_DC, CH3, FLD_PDC, UNIT_W, 32, 2, 10, false, 1 }, - { TYPE_DC, CH3, FLD_YD, UNIT_WH, 44, 2, 1, false, 0 }, - { TYPE_DC, CH3, FLD_YT, UNIT_KWH, 38, 4, 1000, false, 3 }, - { TYPE_DC, CH3, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH3, CMD_CALC, false, 3 }, - - { TYPE_AC, CH0, FLD_UAC, UNIT_V, 46, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_IAC, UNIT_A, 54, 2, 100, false, 2 }, - { TYPE_AC, CH0, FLD_PAC, UNIT_W, 50, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_PRA, UNIT_VA, 52, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_F, UNIT_HZ, 48, 2, 100, false, 2 }, - { TYPE_AC, CH0, FLD_PF, UNIT_NONE, 56, 2, 1000, false, 3 }, - - { TYPE_INV, CH0, FLD_T, UNIT_C, 58, 2, 10, true, 1 }, - { TYPE_INV, CH0, FLD_EVT_LOG, UNIT_NONE, 60, 2, 1, false, 0 }, - - { TYPE_AC, CH0, FLD_YD, UNIT_WH, CALC_YD_CH0, 0, CMD_CALC, false, 0 }, - { TYPE_AC, CH0, FLD_YT, UNIT_KWH, CALC_YT_CH0, 0, CMD_CALC, false, 3 }, - { TYPE_AC, CH0, FLD_PDC, UNIT_W, CALC_PDC_CH0, 0, CMD_CALC, false, 1 }, - { TYPE_AC, CH0, FLD_EFF, UNIT_PCT, CALC_EFF_CH0, 0, CMD_CALC, false, 3 } - }; + const byteAssign_t* getByteAssignment(); + uint8_t getByteAssignmentSize(); }; \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/InverterAbstract.cpp b/lib/Hoymiles/src/inverters/InverterAbstract.cpp index 3833aac6..5830da0a 100644 --- a/lib/Hoymiles/src/inverters/InverterAbstract.cpp +++ b/lib/Hoymiles/src/inverters/InverterAbstract.cpp @@ -31,7 +31,7 @@ void InverterAbstract::init() // Not possible in constructor --> virtual function // Not possible in verifyAllFragments --> Because no data if nothing is ever received // It has to be executed because otherwise the getChannelCount method in stats always returns 0 - _statisticsParser.get()->setByteAssignment(getByteAssignment()); + _statisticsParser.get()->setByteAssignment(getByteAssignment(), getByteAssignmentSize()); } uint64_t InverterAbstract::serial() diff --git a/lib/Hoymiles/src/inverters/InverterAbstract.h b/lib/Hoymiles/src/inverters/InverterAbstract.h index 755414f2..e12211d3 100644 --- a/lib/Hoymiles/src/inverters/InverterAbstract.h +++ b/lib/Hoymiles/src/inverters/InverterAbstract.h @@ -37,7 +37,8 @@ public: void setName(const char* name); const char* name(); virtual String typeName() = 0; - virtual const std::list* getByteAssignment() = 0; + virtual const byteAssign_t* getByteAssignment() = 0; + virtual uint8_t getByteAssignmentSize() = 0; bool isProducing(); bool isReachable(); diff --git a/lib/Hoymiles/src/parser/StatisticsParser.cpp b/lib/Hoymiles/src/parser/StatisticsParser.cpp index 03ea86ad..0575a5fb 100644 --- a/lib/Hoymiles/src/parser/StatisticsParser.cpp +++ b/lib/Hoymiles/src/parser/StatisticsParser.cpp @@ -28,9 +28,10 @@ const calcFunc_t calcFunctions[] = { { CALC_IRR_CH, &calcIrradiation } }; -void StatisticsParser::setByteAssignment(const std::list* byteAssignment) +void StatisticsParser::setByteAssignment(const byteAssign_t* byteAssignment, uint8_t size) { _byteAssignment = byteAssignment; + _byteAssignmentSize = size; } void StatisticsParser::clearBuffer() @@ -51,9 +52,9 @@ void StatisticsParser::appendFragment(uint8_t offset, uint8_t* payload, uint8_t const byteAssign_t* StatisticsParser::getAssignmentByChannelField(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId) { - for (auto const& i : *_byteAssignment) { - if (i.type == type && i.ch == channel && i.fieldId == fieldId) { - return &i; + for (uint8_t i = 0; i < _byteAssignmentSize; i++) { + if (_byteAssignment[i].type == type && _byteAssignment[i].ch == channel && _byteAssignment[i].fieldId == fieldId) { + return &_byteAssignment[i]; } } return NULL; @@ -172,9 +173,9 @@ const char* StatisticsParser::getChannelTypeName(ChannelType_t type) std::list StatisticsParser::getChannelsByType(ChannelType_t type) { std::list l; - for (auto const& b : *_byteAssignment) { - if (b.type == type) { - l.push_back(b.ch); + for (uint8_t i = 0; i < _byteAssignmentSize; i++) { + if (_byteAssignment[i].type == type) { + l.push_back(_byteAssignment[i].ch); } } l.unique(); diff --git a/lib/Hoymiles/src/parser/StatisticsParser.h b/lib/Hoymiles/src/parser/StatisticsParser.h index 1b09395e..f4e51b6a 100644 --- a/lib/Hoymiles/src/parser/StatisticsParser.h +++ b/lib/Hoymiles/src/parser/StatisticsParser.h @@ -107,7 +107,7 @@ public: void clearBuffer(); void appendFragment(uint8_t offset, uint8_t* payload, uint8_t len); - void setByteAssignment(const std::list* byteAssignment); + void setByteAssignment(const byteAssign_t* byteAssignment, uint8_t size); const byteAssign_t* getAssignmentByChannelField(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId); fieldSettings_t* getSettingByChannelField(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId); @@ -137,7 +137,8 @@ private: uint8_t _statisticLength = 0; uint16_t _stringMaxPower[CH_CNT]; - const std::list* _byteAssignment; + const byteAssign_t* _byteAssignment; + uint8_t _byteAssignmentSize; std::list _fieldSettings; uint32_t _rxFailureCount = 0; diff --git a/patches/esp32c3/EspAsyncWebserver.patch b/patches/esp32c3/EspAsyncWebserver.patch new file mode 100644 index 00000000..079c164d --- /dev/null +++ b/patches/esp32c3/EspAsyncWebserver.patch @@ -0,0 +1,13 @@ +diff --git a/.pio/libdeps/$$$env$$$/ESP Async WebServer/src/AsyncWebSocket.cpp b/.pio/libdeps/$$$env$$$/ESP Async WebServer/src/AsyncWebSocket.cpp +index 12be5f8..8505f73 100644 +--- a/.pio/libdeps/$$$env$$$/ESP Async WebServer/src/AsyncWebSocket.cpp ++++ b/.pio/libdeps/$$$env$$$/ESP Async WebServer/src/AsyncWebSocket.cpp +@@ -737,7 +737,7 @@ void AsyncWebSocketClient::binary(const __FlashStringHelper *data, size_t len) + IPAddress AsyncWebSocketClient::remoteIP() const + { + if (!_client) +- return IPAddress(0U); ++ return IPAddress((uint32_t)0); + + return _client->remoteIP(); + } diff --git a/auto_firmware_version.py b/pio-scripts/auto_firmware_version.py similarity index 100% rename from auto_firmware_version.py rename to pio-scripts/auto_firmware_version.py diff --git a/pio-scripts/patch_apply.py b/pio-scripts/patch_apply.py new file mode 100644 index 00000000..17e25584 --- /dev/null +++ b/pio-scripts/patch_apply.py @@ -0,0 +1,78 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# +# Copyright (C) 2023 Thomas Basler and others +# +import os +import subprocess +import re + +Import("env") + +def getPatchPath(env): + return os.path.join(env["PROJECT_DIR"], "patches", env.GetProjectOption('custom_patches')) + +def is_tool(name): + """Check whether `name` is on PATH and marked as executable.""" + + # from whichcraft import which + from shutil import which + + return which(name) is not None + +def replaceInFile(in_file, out_file, text, subs, flags=0): + """ + Function for replacing content for the given file + Taken from https://www.studytonight.com/python-howtos/search-and-replace-a-text-in-a-file-in-python + """ + if os.path.exists(in_file): + with open(in_file, "rb") as infile: + with open(out_file, "wb") as outfile: + #read the file contents + file_contents = infile.read() + text_pattern = re.compile(re.escape(text), flags) + file_contents = text_pattern.sub(subs, file_contents.decode('utf-8')) + outfile.seek(0) + outfile.truncate() + outfile.write(file_contents.encode()) + +def main(): + if (env.GetProjectOption('custom_patches', '') == ''): + print('No custom_patches specified') + return + + if (not is_tool('git')): + print('Git not found. Will not apply custom patches!') + return + + directory = getPatchPath(env) + if (not os.path.isdir(directory)): + print('Patch directory not found: ' + directory) + return + + for file in os.listdir(directory): + if (not file.endswith('.patch')): + continue + + fullPath = os.path.join(directory, file) + preparePath = fullPath + '.prepare' + replaceInFile(fullPath, preparePath, '$$$env$$$', env['PIOENV']) + print('Working on patch: ' + fullPath + '... ', end='') + + # Check if patch was already applied + process = subprocess.run(['git', 'apply', '--reverse', '--check', preparePath], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + if (process.returncode == 0): + print('already applied') + os.remove(preparePath) + continue + + # Apply patch + process = subprocess.run(['git', 'apply', preparePath]) + if (process.returncode == 0): + print('applied') + else: + print('failed') + + os.remove(preparePath) + + +main() \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index 2496d2ee..7aa8c569 100644 --- a/platformio.ini +++ b/platformio.ini @@ -37,7 +37,8 @@ lib_deps = mobizt/FirebaseJson @ ^3.0.6 extra_scripts = - pre:auto_firmware_version.py + pre:pio-scripts/auto_firmware_version.py + pre:pio-scripts/patch_apply.py board_build.partitions = partitions_custom.csv board_build.filesystem = littlefs @@ -71,6 +72,19 @@ build_flags = ${env.build_flags} -DHUAWEI_PIN_POWER=33 +[env:generic_esp32c3] +board = esp32dev +board_build.mcu = esp32c3 +custom_patches = esp32c3 +build_flags = ${env.build_flags} + -DHOYMILES_PIN_MISO=9 + -DHOYMILES_PIN_MOSI=10 + -DHOYMILES_PIN_SCLK=8 + -DHOYMILES_PIN_IRQ=3 + -DHOYMILES_PIN_CE=4 + -DHOYMILES_PIN_CS=5 + + [env:olimex_esp32_poe] ; https://www.olimex.com/Products/IoT/ESP32/ESP32-POE/open-source-hardware board = esp32-poe diff --git a/src/MqttHandleInverterTotal.cpp b/src/MqttHandleInverterTotal.cpp new file mode 100644 index 00000000..6d14576c --- /dev/null +++ b/src/MqttHandleInverterTotal.cpp @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (C) 2023 Thomas Basler and others + */ +#include "MqttHandleInverterTotal.h" +#include "Configuration.h" +#include "MqttSettings.h" +#include + +MqttHandleInverterTotalClass MqttHandleInverterTotal; + +void MqttHandleInverterTotalClass::init() +{ + _lastPublish.set(Configuration.get().Mqtt_PublishInterval * 1000); +} + +void MqttHandleInverterTotalClass::loop() +{ + if (!MqttSettings.getConnected() || !Hoymiles.isAllRadioIdle()) { + return; + } + + if (_lastPublish.occured()) { + float totalAcPower = 0; + float totalDcPower = 0; + float totalDcPowerIrr = 0; + float totalDcPowerIrrInst = 0; + float totalAcYieldDay = 0; + float totalAcYieldTotal = 0; + uint8_t totalAcPowerDigits = 0; + uint8_t totalDcPowerDigits = 0; + uint8_t totalAcYieldDayDigits = 0; + uint8_t totalAcYieldTotalDigits = 0; + bool totalReachable = true; + + for (uint8_t i = 0; i < Hoymiles.getNumInverters(); i++) { + auto inv = Hoymiles.getInverterByPos(i); + if (inv == nullptr || !inv->getEnablePolling()) { + continue; + } + + if (!inv->isReachable()) { + totalReachable = false; + } + + for (auto& c : inv->Statistics()->getChannelsByType(TYPE_AC)) { + totalAcPower += inv->Statistics()->getChannelFieldValue(TYPE_AC, c, FLD_PAC); + totalAcPowerDigits = max(totalAcPowerDigits, inv->Statistics()->getChannelFieldDigits(TYPE_AC, c, FLD_PAC)); + + totalAcYieldDay += inv->Statistics()->getChannelFieldValue(TYPE_AC, c, FLD_YD); + totalAcYieldDayDigits = max(totalAcYieldDayDigits, inv->Statistics()->getChannelFieldDigits(TYPE_AC, c, FLD_YD)); + + totalAcYieldTotal += inv->Statistics()->getChannelFieldValue(TYPE_AC, c, FLD_YT); + totalAcYieldTotalDigits = max(totalAcYieldTotalDigits, inv->Statistics()->getChannelFieldDigits(TYPE_AC, c, FLD_YT)); + } + for (auto& c : inv->Statistics()->getChannelsByType(TYPE_DC)) { + totalDcPower += inv->Statistics()->getChannelFieldValue(TYPE_DC, c, FLD_PDC); + totalDcPowerDigits = max(totalDcPowerDigits, inv->Statistics()->getChannelFieldDigits(TYPE_DC, c, FLD_PDC)); + + if (inv->Statistics()->getStringMaxPower(c) > 0) { + totalDcPowerIrr += inv->Statistics()->getChannelFieldValue(TYPE_DC, c, FLD_PDC); + totalDcPowerIrrInst += inv->Statistics()->getStringMaxPower(c); + } + } + } + + MqttSettings.publish("ac/power", String(totalAcPower, static_cast(totalAcPowerDigits))); + MqttSettings.publish("ac/yieldtotal", String(totalAcYieldDay, static_cast(totalAcYieldDayDigits))); + MqttSettings.publish("ac/yieldday", String(totalAcYieldTotal, static_cast(totalAcYieldTotalDigits))); + MqttSettings.publish("ac/is_valid", String(totalReachable)); + MqttSettings.publish("dc/power", String(totalDcPower, static_cast(totalAcPowerDigits))); + MqttSettings.publish("dc/irradiation", String(totalDcPowerIrrInst > 0 ? totalDcPowerIrr / totalDcPowerIrrInst * 100.0f : 0, 3)); + MqttSettings.publish("dc/is_valid", String(totalReachable)); + + _lastPublish.set(Configuration.get().Mqtt_PublishInterval * 1000); + } +} diff --git a/src/WebApi_eventlog.cpp b/src/WebApi_eventlog.cpp index f912eab0..5c66375c 100644 --- a/src/WebApi_eventlog.cpp +++ b/src/WebApi_eventlog.cpp @@ -38,12 +38,10 @@ void WebApiEventlogClass::onEventlogStatus(AsyncWebServerRequest* request) auto inv = Hoymiles.getInverterBySerial(serial); if (inv != nullptr) { - String serial = inv->serialString(); - uint8_t logEntryCount = inv->EventLog()->getEntryCount(); - root[serial]["count"] = logEntryCount; - JsonArray eventsArray = root[serial].createNestedArray("events"); + root["count"] = logEntryCount; + JsonArray eventsArray = root.createNestedArray("events"); for (uint8_t logEntry = 0; logEntry < logEntryCount; logEntry++) { JsonObject eventsObject = eventsArray.createNestedObject(); diff --git a/src/WebApi_sysstatus.cpp b/src/WebApi_sysstatus.cpp index 58c3820b..58af9079 100644 --- a/src/WebApi_sysstatus.cpp +++ b/src/WebApi_sysstatus.cpp @@ -5,6 +5,7 @@ #include "WebApi_sysstatus.h" #include "Configuration.h" #include "NetworkSettings.h" +#include "PinMapping.h" #include "WebApi.h" #include #include @@ -69,11 +70,11 @@ void WebApiSysstatusClass::onSystemStatus(AsyncWebServerRequest* request) root["uptime"] = esp_timer_get_time() / 1000000; - root["nrf_configured"] = Hoymiles.getRadioNrf()->isConfigured(); + root["nrf_configured"] = PinMapping.isValidNrf24Config(); root["nrf_connected"] = Hoymiles.getRadioNrf()->isConnected(); root["nrf_pvariant"] = Hoymiles.getRadioNrf()->isPVariant(); - root["cmt_configured"] = Hoymiles.getRadioCmt()->isConfigured(); + root["cmt_configured"] = PinMapping.isValidCmt2300Config(); root["cmt_connected"] = Hoymiles.getRadioCmt()->isConnected(); response->setLength(); diff --git a/src/main.cpp b/src/main.cpp index 4d1dad57..33c32907 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -14,6 +14,7 @@ #include "MqttHandleHass.h" #include "MqttHandleVedirectHass.h" #include "MqttHandleInverter.h" +#include "MqttHandleInverterTotal.h" #include "MqttHandleVedirect.h" #include "MqttHandleHuawei.h" #include "MqttSettings.h" @@ -100,6 +101,7 @@ void setup() MqttSettings.init(); MqttHandleDtu.init(); MqttHandleInverter.init(); + MqttHandleInverterTotal.init(); MqttHandleVedirect.init(); MqttHandleHass.init(); MqttHandleVedirectHass.init(); @@ -204,6 +206,8 @@ void loop() yield(); MqttHandleInverter.loop(); yield(); + MqttHandleInverterTotal.loop(); + yield(); MqttHandleVedirect.loop(); yield(); MqttHandleHass.loop(); diff --git a/webapp/package.json b/webapp/package.json index a06f3ba4..88302944 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -23,21 +23,22 @@ "devDependencies": { "@intlify/unplugin-vue-i18n": "^0.10.0", "@rushstack/eslint-patch": "^1.2.0", + "@tsconfig/node18": "^2.0.0", "@types/bootstrap": "^5.2.6", - "@types/node": "^18.15.11", + "@types/node": "^18.16.0", "@types/spark-md5": "^3.0.2", "@vitejs/plugin-vue": "^4.1.0", "@vue/eslint-config-typescript": "^11.0.2", - "@vue/tsconfig": "^0.1.3", - "eslint": "^8.38.0", + "@vue/tsconfig": "^0.3.2", + "eslint": "^8.39.0", "eslint-plugin-vue": "^9.11.0", "npm-run-all": "^4.1.5", "sass": "^1.62.0", - "terser": "^5.16.9", + "terser": "^5.17.1", "typescript": "^5.0.4", - "vite": "^4.2.1", + "vite": "^4.3.1", "vite-plugin-compression": "^0.5.1", "vite-plugin-css-injected-by-js": "^3.1.0", - "vue-tsc": "^1.2.0" + "vue-tsc": "^1.4.4" } } diff --git a/webapp/src/views/HomeView.vue b/webapp/src/views/HomeView.vue index f5128178..e31e3719 100644 --- a/webapp/src/views/HomeView.vue +++ b/webapp/src/views/HomeView.vue @@ -546,7 +546,7 @@ export default defineComponent({ fetch("/api/eventlog/status?inv=" + serial, { headers: authHeader() }) .then((response) => handleResponse(response, this.$emitter, this.$router)) .then((data) => { - this.eventLogList = data[serial]; + this.eventLogList = data; this.eventLogLoading = false; }); diff --git a/webapp/src/views/InverterAdminView.vue b/webapp/src/views/InverterAdminView.vue index 558e5ddd..eb692ba1 100644 --- a/webapp/src/views/InverterAdminView.vue +++ b/webapp/src/views/InverterAdminView.vue @@ -104,7 +104,7 @@ -
+
@@ -128,7 +128,7 @@
Wp* @@ -143,7 +143,7 @@
kWh diff --git a/webapp/tsconfig.config.json b/webapp/tsconfig.config.json index c2d3a309..1fccd77c 100644 --- a/webapp/tsconfig.config.json +++ b/webapp/tsconfig.config.json @@ -1,8 +1,17 @@ { - "extends": "@vue/tsconfig/tsconfig.node.json", - "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"], - "compilerOptions": { - "composite": true, - "types": ["node"] - } -} + "extends": [ + "@tsconfig/node18/tsconfig.json", + "@vue/tsconfig/tsconfig.json" + ], + "include": [ + "vite.config.*", + "vitest.config.*", + "cypress.config.*" + ], + "compilerOptions": { + "composite": true, + "types": [ + "node" + ] + } +} \ No newline at end of file diff --git a/webapp/tsconfig.json b/webapp/tsconfig.json index e39c64d5..45b15b49 100644 --- a/webapp/tsconfig.json +++ b/webapp/tsconfig.json @@ -1,13 +1,19 @@ { - "extends": "@vue/tsconfig/tsconfig.web.json", + "extends": "@vue/tsconfig/tsconfig.dom.json", "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], "compilerOptions": { - "ignoreDeprecations": "5.0", "baseUrl": ".", "paths": { "@/*": ["./src/*"] }, - "lib": ["ES2021", "DOM"] + "lib": ["ES2021", "DOM"], + "moduleResolution": "Node", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true }, "references": [ diff --git a/webapp/yarn.lock b/webapp/yarn.lock index 99dc090e..e7ae7698 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -151,10 +151,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.38.0": - version "8.38.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.38.0.tgz#73a8a0d8aa8a8e6fe270431c5e72ae91b5337892" - integrity sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g== +"@eslint/js@8.39.0": + version "8.39.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.39.0.tgz#58b536bcc843f4cd1e02a7e6171da5c040f4d44b" + integrity sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng== "@humanwhocodes/config-array@^0.11.8": version "0.11.8" @@ -344,6 +344,11 @@ resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== +"@tsconfig/node18@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tsconfig/node18/-/node18-2.0.0.tgz#58b52430d00913dc26c4459fbc7f05396e47886a" + integrity sha512-uI/B0ShkiEwTk036pncXucVlj4y11EW6mycQvCEzC1PkR2TBvdQZ5Wf96dp+XXWAc70FEDfvwTqanoaDpP6rPw== + "@types/bootstrap@^5.2.6": version "5.2.6" resolved "https://registry.yarnpkg.com/@types/bootstrap/-/bootstrap-5.2.6.tgz#e861b3aa1f4a1434da0bf50fbaa372b6f7e64d2f" @@ -361,10 +366,10 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== -"@types/node@^18.15.11": - version "18.15.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f" - integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q== +"@types/node@^18.16.0": + version "18.16.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.0.tgz#4668bc392bb6938637b47e98b1f2ed5426f33316" + integrity sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ== "@types/spark-md5@^3.0.2": version "3.0.2" @@ -490,49 +495,49 @@ resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.1.0.tgz#b6a9d83cd91575f7ee15593f6444397f68751073" integrity sha512-++9JOAFdcXI3lyer9UKUV4rfoQ3T1RN8yDqoCLar86s0xQct5yblxAE+yWgRnU5/0FOlVCpTZpYSBV/bGWrSrQ== -"@volar/language-core@1.3.0-alpha.0": - version "1.3.0-alpha.0" - resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-1.3.0-alpha.0.tgz#4924b4cbc37dbce5f3845c1d2b2811938223a980" - integrity sha512-W3uMzecHPcbwddPu4SJpUcPakRBK/y/BP+U0U6NiPpUX1tONLC4yCawt+QBJqtgJ+sfD6ztf5PyvPL3hQRqfOA== +"@volar/language-core@1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-1.4.1.tgz#66b5758252e35c4e5e71197ca7fa0344d306442c" + integrity sha512-EIY+Swv+TjsWpxOxujjMf1ZXqOjg9MT2VMXZ+1dKva0wD8W0L6EtptFFcCJdBbcKmGMFkr57Qzz9VNMWhs3jXQ== dependencies: - "@volar/source-map" "1.3.0-alpha.0" + "@volar/source-map" "1.4.1" -"@volar/source-map@1.3.0-alpha.0": - version "1.3.0-alpha.0" - resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-1.3.0-alpha.0.tgz#c45d51ecb9759604d29fb80211d2fc9765e5559c" - integrity sha512-jSdizxWFvDTvkPYZnO6ew3sBZUnS0abKCbuopkc0JrIlFbznWC/fPH3iPFIMS8/IIkRxq1Jh9VVG60SmtsdaMQ== +"@volar/source-map@1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-1.4.1.tgz#e3b561775c742508e5e1f28609a4787c98056715" + integrity sha512-bZ46ad72dsbzuOWPUtJjBXkzSQzzSejuR3CT81+GvTEI2E994D8JPXzM3tl98zyCNnjgs4OkRyliImL1dvJ5BA== dependencies: muggle-string "^0.2.2" -"@volar/typescript@1.3.0-alpha.0": - version "1.3.0-alpha.0" - resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-1.3.0-alpha.0.tgz#f79bbc9939016700812b18191c47eb035913c6c3" - integrity sha512-5UItyW2cdH2mBLu4RrECRNJRgtvvzKrSCn2y3v/D61QwIDkGx4aeil6x8RFuUL5TFtV6QvVHXnsOHxNgd+sCow== +"@volar/typescript@1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-1.4.1.tgz#a013419e6f029155e5467443f3ab72815da608b5" + integrity sha512-phTy6p9yG6bgMIKQWEeDOi/aeT0njZsb1a/G1mrEuDsLmAn24Le4gDwSsGNhea6Uhu+3gdpUZn2PmZXa+WG2iQ== dependencies: - "@volar/language-core" "1.3.0-alpha.0" + "@volar/language-core" "1.4.1" -"@volar/vue-language-core@1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@volar/vue-language-core/-/vue-language-core-1.2.0.tgz#a600aa93c6a4e89bf2b525b7e876b39e3afdfb9b" - integrity sha512-w7yEiaITh2WzKe6u8ZdeLKCUz43wdmY/OqAmsB/PGDvvhTcVhCJ6f0W/RprZL1IhqH8wALoWiwEh/Wer7ZviMQ== +"@volar/vue-language-core@1.4.4": + version "1.4.4" + resolved "https://registry.yarnpkg.com/@volar/vue-language-core/-/vue-language-core-1.4.4.tgz#6c1cf289cd1caa0f433a0765d288cf6fbe54dff5" + integrity sha512-c3hL6un+CfoOlusGvpypcodmk9ke/ImrWIUc0GkgI+imoQpUGzgu3tEQWlPs604R7AhxeZwWUi8hQNfax0R/zA== dependencies: - "@volar/language-core" "1.3.0-alpha.0" - "@volar/source-map" "1.3.0-alpha.0" - "@vue/compiler-dom" "^3.2.47" - "@vue/compiler-sfc" "^3.2.47" - "@vue/reactivity" "^3.2.47" - "@vue/shared" "^3.2.47" - minimatch "^6.1.6" + "@volar/language-core" "1.4.1" + "@volar/source-map" "1.4.1" + "@vue/compiler-dom" "^3.2.0" + "@vue/compiler-sfc" "^3.2.0" + "@vue/reactivity" "^3.2.0" + "@vue/shared" "^3.2.0" + minimatch "^9.0.0" muggle-string "^0.2.2" vue-template-compiler "^2.7.14" -"@volar/vue-typescript@1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@volar/vue-typescript/-/vue-typescript-1.2.0.tgz#825dab4624a116d8be21efbf0c4a7bd6dec51d37" - integrity sha512-zjmRi9y3J1EkG+pfuHp8IbHmibihrKK485cfzsHjiuvJMGrpkWvlO5WVEk8oslMxxeGC5XwBFE9AOlvh378EPA== +"@volar/vue-typescript@1.4.4": + version "1.4.4" + resolved "https://registry.yarnpkg.com/@volar/vue-typescript/-/vue-typescript-1.4.4.tgz#6c4a86010fc94965cce554ea1424bc8878ba216c" + integrity sha512-L61Fk15jlJw3QtIddD4cVE5jei5i6zbLJRiaEMYDDnUKB259/qUrdvnMfnZUFVyDwlevzdstjtaUyreeG/0nPQ== dependencies: - "@volar/typescript" "1.3.0-alpha.0" - "@volar/vue-language-core" "1.2.0" + "@volar/typescript" "1.4.1" + "@volar/vue-language-core" "1.4.4" "@vue/compiler-core@3.2.47": version "3.2.47" @@ -544,7 +549,7 @@ estree-walker "^2.0.2" source-map "^0.6.1" -"@vue/compiler-dom@3.2.47", "@vue/compiler-dom@^3.2.47": +"@vue/compiler-dom@3.2.47", "@vue/compiler-dom@^3.2.0": version "3.2.47" resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz#a0b06caf7ef7056939e563dcaa9cbde30794f305" integrity sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ== @@ -552,7 +557,7 @@ "@vue/compiler-core" "3.2.47" "@vue/shared" "3.2.47" -"@vue/compiler-sfc@3.2.47", "@vue/compiler-sfc@^3.2.47": +"@vue/compiler-sfc@3.2.47", "@vue/compiler-sfc@^3.2.0", "@vue/compiler-sfc@^3.2.47": version "3.2.47" resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz#1bdc36f6cdc1643f72e2c397eb1a398f5004ad3d" integrity sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ== @@ -601,7 +606,7 @@ estree-walker "^2.0.2" magic-string "^0.25.7" -"@vue/reactivity@3.2.47", "@vue/reactivity@^3.2.47": +"@vue/reactivity@3.2.47", "@vue/reactivity@^3.2.0": version "3.2.47" resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.47.tgz#1d6399074eadfc3ed35c727e2fd707d6881140b6" integrity sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ== @@ -633,15 +638,15 @@ "@vue/compiler-ssr" "3.2.47" "@vue/shared" "3.2.47" -"@vue/shared@3.2.47", "@vue/shared@^3.2.47": +"@vue/shared@3.2.47", "@vue/shared@^3.2.0": version "3.2.47" resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.47.tgz#e597ef75086c6e896ff5478a6bfc0a7aa4bbd14c" integrity sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ== -"@vue/tsconfig@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@vue/tsconfig/-/tsconfig-0.1.3.tgz#4a61dbd29783d01ddab504276dcf0c2b6988654f" - integrity sha512-kQVsh8yyWPvHpb8gIc9l/HIDiiVUy1amynLNpCy8p+FoCiZXCo6fQos5/097MmnNZc9AtseDsCrfkhqCrJ8Olg== +"@vue/tsconfig@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@vue/tsconfig/-/tsconfig-0.3.2.tgz#612ba0b6aefde5ac1a513545eee7d4ed01c407f5" + integrity sha512-jWzZbGyrZAEbHYGn0kPzJ+MMtIkIxb0+hL5+RghBowyOxMRs9jMdp5XvpXz3wgCzjRZiUucy29042HBe9cxoYA== acorn-jsx@^5.2.0, acorn-jsx@^5.3.2: version "5.3.2" @@ -1035,6 +1040,14 @@ eslint-scope@^7.1.1: esrecurse "^4.3.0" estraverse "^5.2.0" +eslint-scope@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" + integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + eslint-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" @@ -1069,15 +1082,15 @@ eslint-visitor-keys@^3.4.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz#c7f0f956124ce677047ddbc192a68f999454dedc" integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ== -eslint@^8.38.0: - version "8.38.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.38.0.tgz#a62c6f36e548a5574dd35728ac3c6209bd1e2f1a" - integrity sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg== +eslint@^8.39.0: + version "8.39.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.39.0.tgz#7fd20a295ef92d43809e914b70c39fd5a23cf3f1" + integrity sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.4.0" "@eslint/eslintrc" "^2.0.2" - "@eslint/js" "8.38.0" + "@eslint/js" "8.39.0" "@humanwhocodes/config-array" "^0.11.8" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" @@ -1087,7 +1100,7 @@ eslint@^8.38.0: debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.1.1" + eslint-scope "^7.2.0" eslint-visitor-keys "^3.4.0" espree "^9.5.1" esquery "^1.4.2" @@ -1741,10 +1754,10 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimatch@^6.1.6: - version "6.2.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-6.2.0.tgz#2b70fd13294178c69c04dfc05aebdb97a4e79e42" - integrity sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg== +minimatch@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.0.tgz#bfc8e88a1c40ffd40c172ddac3decb8451503b56" + integrity sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w== dependencies: brace-expansion "^2.0.1" @@ -2038,7 +2051,7 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve@^1.10.0, resolve@^1.22.1: +resolve@^1.10.0: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -2059,10 +2072,10 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -rollup@^3.18.0: - version "3.19.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.19.1.tgz#2b3a31ac1ff9f3afab2e523fa687fef5b0ee20fc" - integrity sha512-lAbrdN7neYCg/8WaoWn/ckzCtz+jr70GFfYdlf50OF7387HTg+wiuiqJRFYawwSPpqfqDNYqK7smY/ks2iAudg== +rollup@^3.20.2: + version "3.20.6" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.20.6.tgz#53c0fd73e397269d2ce5f0ec12851457dd53cacd" + integrity sha512-2yEB3nQXp/tBQDN0hJScJQheXdvU2wFhh6ld7K/aiZ1vYcak6N/BKjY1QrU6BvO2JWYS8bEs14FRaxXosxy2zw== optionalDependencies: fsevents "~2.3.2" @@ -2108,6 +2121,13 @@ semver@^7.3.5, semver@^7.3.6, semver@^7.3.7: dependencies: lru-cache "^6.0.0" +semver@^7.3.8: + version "7.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.0.tgz#ed8c5dc8efb6c629c88b23d41dc9bf40c1d96cd0" + integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== + dependencies: + lru-cache "^6.0.0" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -2268,10 +2288,10 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -terser@^5.16.9: - version "5.16.9" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.9.tgz#7a28cb178e330c484369886f2afd623d9847495f" - integrity sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg== +terser@^5.17.1: + version "5.17.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.17.1.tgz#948f10830454761e2eeedc6debe45c532c83fd69" + integrity sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" @@ -2385,15 +2405,14 @@ vite-plugin-css-injected-by-js@^3.1.0: resolved "https://registry.yarnpkg.com/vite-plugin-css-injected-by-js/-/vite-plugin-css-injected-by-js-3.1.0.tgz#d1160c975d40f256692e2465832e6ff18c22b3a3" integrity sha512-qogCmpocZfcbSAYZQjS88ieIY0PzLUm7RkLFWFgAxkXdz3N6roZbSTNTxeIOj5IxFbZWACUPuVBBoo6qCuXDcw== -vite@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.2.1.tgz#6c2eb337b0dfd80a9ded5922163b94949d7fc254" - integrity sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg== +vite@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.3.1.tgz#9badb1377f995632cdcf05f32103414db6fbb95a" + integrity sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg== dependencies: esbuild "^0.17.5" postcss "^8.4.21" - resolve "^1.22.1" - rollup "^3.18.0" + rollup "^3.20.2" optionalDependencies: fsevents "~2.3.2" @@ -2435,13 +2454,14 @@ vue-template-compiler@^2.7.14: de-indent "^1.0.2" he "^1.2.0" -vue-tsc@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-1.2.0.tgz#2b64b960cc96208492541394423ace589a461be6" - integrity sha512-rIlzqdrhyPYyLG9zxsVRa+JEseeS9s8F2BbVVVWRRsTZvJO2BbhLEb2HW3MY+DFma0378tnIqs+vfTzbcQtRFw== +vue-tsc@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-1.4.4.tgz#bf487be671220ed47de62cf47092b622432e1599" + integrity sha512-2XsCjF2mLo6gwOVcOpngwJkP8GzYQjNh20A+Pr2FGdsWzr9jjXJ0k08/DfcslfncsuCrTrnWtb4KEL3gcDtlNA== dependencies: - "@volar/vue-language-core" "1.2.0" - "@volar/vue-typescript" "1.2.0" + "@volar/vue-language-core" "1.4.4" + "@volar/vue-typescript" "1.4.4" + semver "^7.3.8" vue@^3.2.47: version "3.2.47" diff --git a/webapp_dist/js/app.js.gz b/webapp_dist/js/app.js.gz index aa326b2e..204a8ae6 100644 Binary files a/webapp_dist/js/app.js.gz and b/webapp_dist/js/app.js.gz differ