Merge remote-tracking branch 'tbnobody/OpenDTU/master' into development
This commit is contained in:
commit
37b5edb010
@ -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.
|
* 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/)
|
* 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.
|
* 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
|
## Related Projects
|
||||||
|
|
||||||
|
|||||||
@ -64,7 +64,7 @@
|
|||||||
"clk_mode": 3
|
"clk_mode": 3
|
||||||
},
|
},
|
||||||
"display": {
|
"display": {
|
||||||
"type": 2,
|
"type": 3,
|
||||||
"data": 33,
|
"data": 33,
|
||||||
"clk": 32
|
"clk": 32
|
||||||
}
|
}
|
||||||
|
|||||||
15
include/MqttHandleInverterTotal.h
Normal file
15
include/MqttHandleInverterTotal.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <TimeoutHelper.h>
|
||||||
|
|
||||||
|
class MqttHandleInverterTotalClass {
|
||||||
|
public:
|
||||||
|
void init();
|
||||||
|
void loop();
|
||||||
|
|
||||||
|
private:
|
||||||
|
TimeoutHelper _lastPublish;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern MqttHandleInverterTotalClass MqttHandleInverterTotal;
|
||||||
@ -3,10 +3,16 @@
|
|||||||
#include <driver/spi_master.h>
|
#include <driver/spi_master.h>
|
||||||
#include <esp_rom_gpio.h> // for esp_rom_gpio_connect_out_signal
|
#include <esp_rom_gpio.h> // 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;
|
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)
|
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 = {
|
spi_bus_config_t buscfg = {
|
||||||
.mosi_io_num = pin_sdio,
|
.mosi_io_num = pin_sdio,
|
||||||
.miso_io_num = -1, // single wire MOSI/MISO
|
.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,
|
.tx_buffer = &tx_data,
|
||||||
.rx_buffer = NULL
|
.rx_buffer = NULL
|
||||||
};
|
};
|
||||||
|
SPI_PARAM_LOCK();
|
||||||
ESP_ERROR_CHECK(spi_device_polling_transmit(spi_reg, &t));
|
ESP_ERROR_CHECK(spi_device_polling_transmit(spi_reg, &t));
|
||||||
|
SPI_PARAM_UNLOCK();
|
||||||
delayMicroseconds(100);
|
delayMicroseconds(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,7 +84,9 @@ uint8_t cmt_spi3_read(uint8_t addr)
|
|||||||
.tx_buffer = &tx_data,
|
.tx_buffer = &tx_data,
|
||||||
.rx_buffer = &rx_data
|
.rx_buffer = &rx_data
|
||||||
};
|
};
|
||||||
|
SPI_PARAM_LOCK();
|
||||||
ESP_ERROR_CHECK(spi_device_polling_transmit(spi_reg, &t));
|
ESP_ERROR_CHECK(spi_device_polling_transmit(spi_reg, &t));
|
||||||
|
SPI_PARAM_UNLOCK();
|
||||||
delayMicroseconds(100);
|
delayMicroseconds(100);
|
||||||
return rx_data;
|
return rx_data;
|
||||||
}
|
}
|
||||||
@ -92,11 +102,13 @@ void cmt_spi3_write_fifo(const uint8_t* buf, uint16_t len)
|
|||||||
.rx_buffer = NULL
|
.rx_buffer = NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
SPI_PARAM_LOCK();
|
||||||
for (uint8_t i = 0; i < len; i++) {
|
for (uint8_t i = 0; i < len; i++) {
|
||||||
tx_data = ~buf[i]; // negate buffer contents
|
tx_data = ~buf[i]; // negate buffer contents
|
||||||
ESP_ERROR_CHECK(spi_device_polling_transmit(spi_fifo, &t));
|
ESP_ERROR_CHECK(spi_device_polling_transmit(spi_fifo, &t));
|
||||||
delayMicroseconds(4); // > 4 us
|
delayMicroseconds(4); // > 4 us
|
||||||
}
|
}
|
||||||
|
SPI_PARAM_UNLOCK();
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmt_spi3_read_fifo(uint8_t* buf, uint16_t len)
|
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
|
.rx_buffer = &rx_data
|
||||||
};
|
};
|
||||||
|
|
||||||
|
SPI_PARAM_LOCK();
|
||||||
for (uint8_t i = 0; i < len; i++) {
|
for (uint8_t i = 0; i < len; i++) {
|
||||||
ESP_ERROR_CHECK(spi_device_polling_transmit(spi_fifo, &t));
|
ESP_ERROR_CHECK(spi_device_polling_transmit(spi_fifo, &t));
|
||||||
delayMicroseconds(4); // > 4 us
|
delayMicroseconds(4); // > 4 us
|
||||||
buf[i] = rx_data;
|
buf[i] = rx_data;
|
||||||
}
|
}
|
||||||
|
SPI_PARAM_UNLOCK();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -66,11 +66,6 @@ bool HoymilesRadio::isInitialized()
|
|||||||
return _isInitialized;
|
return _isInitialized;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HoymilesRadio::isConfigured()
|
|
||||||
{
|
|
||||||
return _isConfigured;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HoymilesRadio::isIdle()
|
bool HoymilesRadio::isIdle()
|
||||||
{
|
{
|
||||||
return !_busyFlag;
|
return !_busyFlag;
|
||||||
|
|||||||
@ -13,7 +13,6 @@ public:
|
|||||||
|
|
||||||
bool isIdle();
|
bool isIdle();
|
||||||
bool isInitialized();
|
bool isInitialized();
|
||||||
bool isConfigured();
|
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T* enqueCommand()
|
T* enqueCommand()
|
||||||
@ -34,6 +33,5 @@ protected:
|
|||||||
serial_u _dtuSerial;
|
serial_u _dtuSerial;
|
||||||
std::queue<std::shared_ptr<CommandAbstract>> _commandQueue;
|
std::queue<std::shared_ptr<CommandAbstract>> _commandQueue;
|
||||||
bool _isInitialized = false;
|
bool _isInitialized = false;
|
||||||
bool _isConfigured = false;
|
|
||||||
bool _busyFlag = false;
|
bool _busyFlag = false;
|
||||||
};
|
};
|
||||||
@ -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
|
cmtSwitchDtuFreq(_inverterTargetFrequency); // start dtu at work freqency, for fast Rx if inverter is already on and frequency switched
|
||||||
|
|
||||||
_isConfigured = true;
|
|
||||||
if (!_radio->isChipConnected()) {
|
if (!_radio->isChipConnected()) {
|
||||||
Hoymiles.getMessageOutput()->println("CMT: Connection error!!");
|
Hoymiles.getMessageOutput()->println("CMT: Connection error!!");
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -23,7 +23,6 @@ void HoymilesRadio_NRF::init(SPIClass* initialisedSpiBus, uint8_t pinCE, uint8_t
|
|||||||
_radio->setAddressWidth(5);
|
_radio->setAddressWidth(5);
|
||||||
_radio->setRetries(0, 0);
|
_radio->setRetries(0, 0);
|
||||||
_radio->maskIRQ(true, true, false); // enable only receiving interrupts
|
_radio->maskIRQ(true, true, false); // enable only receiving interrupts
|
||||||
_isConfigured = true;
|
|
||||||
if (!_radio->isChipConnected()) {
|
if (!_radio->isChipConnected()) {
|
||||||
Hoymiles.getMessageOutput()->println("NRF: Connection error!!");
|
Hoymiles.getMessageOutput()->println("NRF: Connection error!!");
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -57,5 +57,5 @@ protected:
|
|||||||
uint64_t _routerAddress;
|
uint64_t _routerAddress;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void convertSerialToPacketId(uint8_t buffer[], uint64_t serial);
|
static void convertSerialToPacketId(uint8_t buffer[], uint64_t serial);
|
||||||
};
|
};
|
||||||
@ -4,6 +4,30 @@
|
|||||||
*/
|
*/
|
||||||
#include "HMS_1CH.h"
|
#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_1CH::HMS_1CH(HoymilesRadio* radio, uint64_t serial)
|
||||||
: HMS_Abstract(radio, serial) {};
|
: HMS_Abstract(radio, serial) {};
|
||||||
|
|
||||||
@ -19,7 +43,12 @@ String HMS_1CH::typeName()
|
|||||||
return "HMS-300, HMS-350, HMS-400, HMS-450, HMS-500";
|
return "HMS-300, HMS-350, HMS-400, HMS-450, HMS-500";
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::list<byteAssign_t>* HMS_1CH::getByteAssignment()
|
const byteAssign_t* HMS_1CH::getByteAssignment()
|
||||||
{
|
{
|
||||||
return &byteAssignment;
|
return byteAssignment;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t HMS_1CH::getByteAssignmentSize()
|
||||||
|
{
|
||||||
|
return sizeof(byteAssignment) / sizeof(byteAssignment[0]);
|
||||||
}
|
}
|
||||||
@ -9,30 +9,6 @@ public:
|
|||||||
explicit HMS_1CH(HoymilesRadio* radio, uint64_t serial);
|
explicit HMS_1CH(HoymilesRadio* radio, uint64_t serial);
|
||||||
static bool isValidSerial(uint64_t serial);
|
static bool isValidSerial(uint64_t serial);
|
||||||
String typeName();
|
String typeName();
|
||||||
const std::list<byteAssign_t>* getByteAssignment();
|
const byteAssign_t* getByteAssignment();
|
||||||
|
uint8_t getByteAssignmentSize();
|
||||||
private:
|
|
||||||
const std::list<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 }
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
@ -4,6 +4,37 @@
|
|||||||
*/
|
*/
|
||||||
#include "HMS_2CH.h"
|
#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_2CH::HMS_2CH(HoymilesRadio* radio, uint64_t serial)
|
||||||
: HMS_Abstract(radio, serial) {};
|
: HMS_Abstract(radio, serial) {};
|
||||||
|
|
||||||
@ -19,7 +50,12 @@ String HMS_2CH::typeName()
|
|||||||
return "HMS-600, HMS-700, HMS-800, HMS-900, HMS-1000";
|
return "HMS-600, HMS-700, HMS-800, HMS-900, HMS-1000";
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::list<byteAssign_t>* HMS_2CH::getByteAssignment()
|
const byteAssign_t* HMS_2CH::getByteAssignment()
|
||||||
{
|
{
|
||||||
return &byteAssignment;
|
return byteAssignment;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t HMS_2CH::getByteAssignmentSize()
|
||||||
|
{
|
||||||
|
return sizeof(byteAssignment) / sizeof(byteAssignment[0]);
|
||||||
}
|
}
|
||||||
@ -9,37 +9,6 @@ public:
|
|||||||
explicit HMS_2CH(HoymilesRadio* radio, uint64_t serial);
|
explicit HMS_2CH(HoymilesRadio* radio, uint64_t serial);
|
||||||
static bool isValidSerial(uint64_t serial);
|
static bool isValidSerial(uint64_t serial);
|
||||||
String typeName();
|
String typeName();
|
||||||
const std::list<byteAssign_t>* getByteAssignment();
|
const byteAssign_t* getByteAssignment();
|
||||||
|
uint8_t getByteAssignmentSize();
|
||||||
private:
|
|
||||||
const std::list<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 }
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
@ -4,6 +4,51 @@
|
|||||||
*/
|
*/
|
||||||
#include "HMS_4CH.h"
|
#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_4CH::HMS_4CH(HoymilesRadio* radio, uint64_t serial)
|
||||||
: HMS_Abstract(radio, serial) {};
|
: HMS_Abstract(radio, serial) {};
|
||||||
|
|
||||||
@ -19,7 +64,12 @@ String HMS_4CH::typeName()
|
|||||||
return "HMS-1600, HMS-1800, HMS-2000";
|
return "HMS-1600, HMS-1800, HMS-2000";
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::list<byteAssign_t>* HMS_4CH::getByteAssignment()
|
const byteAssign_t* HMS_4CH::getByteAssignment()
|
||||||
{
|
{
|
||||||
return &byteAssignment;
|
return byteAssignment;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t HMS_4CH::getByteAssignmentSize()
|
||||||
|
{
|
||||||
|
return sizeof(byteAssignment) / sizeof(byteAssignment[0]);
|
||||||
}
|
}
|
||||||
@ -8,51 +8,6 @@ public:
|
|||||||
explicit HMS_4CH(HoymilesRadio* radio, uint64_t serial);
|
explicit HMS_4CH(HoymilesRadio* radio, uint64_t serial);
|
||||||
static bool isValidSerial(uint64_t serial);
|
static bool isValidSerial(uint64_t serial);
|
||||||
String typeName();
|
String typeName();
|
||||||
const std::list<byteAssign_t>* getByteAssignment();
|
const byteAssign_t* getByteAssignment();
|
||||||
|
uint8_t getByteAssignmentSize();
|
||||||
private:
|
|
||||||
const std::list<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 }
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
@ -4,6 +4,74 @@
|
|||||||
*/
|
*/
|
||||||
#include "HMT_6CH.h"
|
#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_6CH::HMT_6CH(HoymilesRadio* radio, uint64_t serial)
|
||||||
: HMT_Abstract(radio, serial) {};
|
: HMT_Abstract(radio, serial) {};
|
||||||
|
|
||||||
@ -19,7 +87,12 @@ String HMT_6CH::typeName()
|
|||||||
return F("HMT-1800, HMT-2250");
|
return F("HMT-1800, HMT-2250");
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::list<byteAssign_t>* HMT_6CH::getByteAssignment()
|
const byteAssign_t* HMT_6CH::getByteAssignment()
|
||||||
{
|
{
|
||||||
return &byteAssignment;
|
return byteAssignment;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t HMT_6CH::getByteAssignmentSize()
|
||||||
|
{
|
||||||
|
return sizeof(byteAssignment) / sizeof(byteAssignment[0]);
|
||||||
}
|
}
|
||||||
@ -8,74 +8,6 @@ public:
|
|||||||
explicit HMT_6CH(HoymilesRadio* radio, uint64_t serial);
|
explicit HMT_6CH(HoymilesRadio* radio, uint64_t serial);
|
||||||
static bool isValidSerial(uint64_t serial);
|
static bool isValidSerial(uint64_t serial);
|
||||||
String typeName();
|
String typeName();
|
||||||
const std::list<byteAssign_t>* getByteAssignment();
|
const byteAssign_t* getByteAssignment();
|
||||||
|
uint8_t getByteAssignmentSize();
|
||||||
private:
|
|
||||||
const std::list<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 }
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
@ -4,6 +4,30 @@
|
|||||||
*/
|
*/
|
||||||
#include "HM_1CH.h"
|
#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_1CH::HM_1CH(HoymilesRadio* radio, uint64_t serial)
|
||||||
: HM_Abstract(radio, serial) {};
|
: HM_Abstract(radio, serial) {};
|
||||||
|
|
||||||
@ -32,7 +56,12 @@ String HM_1CH::typeName()
|
|||||||
return "HM-300, HM-350, HM-400";
|
return "HM-300, HM-350, HM-400";
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::list<byteAssign_t>* HM_1CH::getByteAssignment()
|
const byteAssign_t* HM_1CH::getByteAssignment()
|
||||||
{
|
{
|
||||||
return &byteAssignment;
|
return byteAssignment;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t HM_1CH::getByteAssignmentSize()
|
||||||
|
{
|
||||||
|
return sizeof(byteAssignment) / sizeof(byteAssignment[0]);
|
||||||
}
|
}
|
||||||
@ -9,30 +9,6 @@ public:
|
|||||||
explicit HM_1CH(HoymilesRadio* radio, uint64_t serial);
|
explicit HM_1CH(HoymilesRadio* radio, uint64_t serial);
|
||||||
static bool isValidSerial(uint64_t serial);
|
static bool isValidSerial(uint64_t serial);
|
||||||
String typeName();
|
String typeName();
|
||||||
const std::list<byteAssign_t>* getByteAssignment();
|
const byteAssign_t* getByteAssignment();
|
||||||
|
uint8_t getByteAssignmentSize();
|
||||||
private:
|
|
||||||
const std::list<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 }
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
@ -5,6 +5,37 @@
|
|||||||
*/
|
*/
|
||||||
#include "HM_2CH.h"
|
#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_2CH::HM_2CH(HoymilesRadio* radio, uint64_t serial)
|
||||||
: HM_Abstract(radio, serial) {};
|
: HM_Abstract(radio, serial) {};
|
||||||
|
|
||||||
@ -33,7 +64,12 @@ String HM_2CH::typeName()
|
|||||||
return "HM-600, HM-700, HM-800";
|
return "HM-600, HM-700, HM-800";
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::list<byteAssign_t>* HM_2CH::getByteAssignment()
|
const byteAssign_t* HM_2CH::getByteAssignment()
|
||||||
{
|
{
|
||||||
return &byteAssignment;
|
return byteAssignment;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t HM_2CH::getByteAssignmentSize()
|
||||||
|
{
|
||||||
|
return sizeof(byteAssignment) / sizeof(byteAssignment[0]);
|
||||||
}
|
}
|
||||||
@ -8,37 +8,6 @@ public:
|
|||||||
explicit HM_2CH(HoymilesRadio* radio, uint64_t serial);
|
explicit HM_2CH(HoymilesRadio* radio, uint64_t serial);
|
||||||
static bool isValidSerial(uint64_t serial);
|
static bool isValidSerial(uint64_t serial);
|
||||||
String typeName();
|
String typeName();
|
||||||
const std::list<byteAssign_t>* getByteAssignment();
|
const byteAssign_t* getByteAssignment();
|
||||||
|
uint8_t getByteAssignmentSize();
|
||||||
private:
|
|
||||||
const std::list<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 }
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
@ -4,6 +4,51 @@
|
|||||||
*/
|
*/
|
||||||
#include "HM_4CH.h"
|
#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_4CH::HM_4CH(HoymilesRadio* radio, uint64_t serial)
|
||||||
: HM_Abstract(radio, serial) {};
|
: HM_Abstract(radio, serial) {};
|
||||||
|
|
||||||
@ -32,7 +77,12 @@ String HM_4CH::typeName()
|
|||||||
return "HM-1000, HM-1200, HM-1500";
|
return "HM-1000, HM-1200, HM-1500";
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::list<byteAssign_t>* HM_4CH::getByteAssignment()
|
const byteAssign_t* HM_4CH::getByteAssignment()
|
||||||
{
|
{
|
||||||
return &byteAssignment;
|
return byteAssignment;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t HM_4CH::getByteAssignmentSize()
|
||||||
|
{
|
||||||
|
return sizeof(byteAssignment) / sizeof(byteAssignment[0]);
|
||||||
}
|
}
|
||||||
@ -8,51 +8,6 @@ public:
|
|||||||
explicit HM_4CH(HoymilesRadio* radio, uint64_t serial);
|
explicit HM_4CH(HoymilesRadio* radio, uint64_t serial);
|
||||||
static bool isValidSerial(uint64_t serial);
|
static bool isValidSerial(uint64_t serial);
|
||||||
String typeName();
|
String typeName();
|
||||||
const std::list<byteAssign_t>* getByteAssignment();
|
const byteAssign_t* getByteAssignment();
|
||||||
|
uint8_t getByteAssignmentSize();
|
||||||
private:
|
|
||||||
const std::list<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 }
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
@ -31,7 +31,7 @@ void InverterAbstract::init()
|
|||||||
// Not possible in constructor --> virtual function
|
// Not possible in constructor --> virtual function
|
||||||
// Not possible in verifyAllFragments --> Because no data if nothing is ever received
|
// 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
|
// 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()
|
uint64_t InverterAbstract::serial()
|
||||||
|
|||||||
@ -37,7 +37,8 @@ public:
|
|||||||
void setName(const char* name);
|
void setName(const char* name);
|
||||||
const char* name();
|
const char* name();
|
||||||
virtual String typeName() = 0;
|
virtual String typeName() = 0;
|
||||||
virtual const std::list<byteAssign_t>* getByteAssignment() = 0;
|
virtual const byteAssign_t* getByteAssignment() = 0;
|
||||||
|
virtual uint8_t getByteAssignmentSize() = 0;
|
||||||
|
|
||||||
bool isProducing();
|
bool isProducing();
|
||||||
bool isReachable();
|
bool isReachable();
|
||||||
|
|||||||
@ -28,9 +28,10 @@ const calcFunc_t calcFunctions[] = {
|
|||||||
{ CALC_IRR_CH, &calcIrradiation }
|
{ CALC_IRR_CH, &calcIrradiation }
|
||||||
};
|
};
|
||||||
|
|
||||||
void StatisticsParser::setByteAssignment(const std::list<byteAssign_t>* byteAssignment)
|
void StatisticsParser::setByteAssignment(const byteAssign_t* byteAssignment, uint8_t size)
|
||||||
{
|
{
|
||||||
_byteAssignment = byteAssignment;
|
_byteAssignment = byteAssignment;
|
||||||
|
_byteAssignmentSize = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
void StatisticsParser::clearBuffer()
|
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)
|
const byteAssign_t* StatisticsParser::getAssignmentByChannelField(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId)
|
||||||
{
|
{
|
||||||
for (auto const& i : *_byteAssignment) {
|
for (uint8_t i = 0; i < _byteAssignmentSize; i++) {
|
||||||
if (i.type == type && i.ch == channel && i.fieldId == fieldId) {
|
if (_byteAssignment[i].type == type && _byteAssignment[i].ch == channel && _byteAssignment[i].fieldId == fieldId) {
|
||||||
return &i;
|
return &_byteAssignment[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -172,9 +173,9 @@ const char* StatisticsParser::getChannelTypeName(ChannelType_t type)
|
|||||||
std::list<ChannelNum_t> StatisticsParser::getChannelsByType(ChannelType_t type)
|
std::list<ChannelNum_t> StatisticsParser::getChannelsByType(ChannelType_t type)
|
||||||
{
|
{
|
||||||
std::list<ChannelNum_t> l;
|
std::list<ChannelNum_t> l;
|
||||||
for (auto const& b : *_byteAssignment) {
|
for (uint8_t i = 0; i < _byteAssignmentSize; i++) {
|
||||||
if (b.type == type) {
|
if (_byteAssignment[i].type == type) {
|
||||||
l.push_back(b.ch);
|
l.push_back(_byteAssignment[i].ch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
l.unique();
|
l.unique();
|
||||||
|
|||||||
@ -107,7 +107,7 @@ public:
|
|||||||
void clearBuffer();
|
void clearBuffer();
|
||||||
void appendFragment(uint8_t offset, uint8_t* payload, uint8_t len);
|
void appendFragment(uint8_t offset, uint8_t* payload, uint8_t len);
|
||||||
|
|
||||||
void setByteAssignment(const std::list<byteAssign_t>* byteAssignment);
|
void setByteAssignment(const byteAssign_t* byteAssignment, uint8_t size);
|
||||||
|
|
||||||
const byteAssign_t* getAssignmentByChannelField(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId);
|
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);
|
fieldSettings_t* getSettingByChannelField(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId);
|
||||||
@ -137,7 +137,8 @@ private:
|
|||||||
uint8_t _statisticLength = 0;
|
uint8_t _statisticLength = 0;
|
||||||
uint16_t _stringMaxPower[CH_CNT];
|
uint16_t _stringMaxPower[CH_CNT];
|
||||||
|
|
||||||
const std::list<byteAssign_t>* _byteAssignment;
|
const byteAssign_t* _byteAssignment;
|
||||||
|
uint8_t _byteAssignmentSize;
|
||||||
std::list<fieldSettings_t> _fieldSettings;
|
std::list<fieldSettings_t> _fieldSettings;
|
||||||
|
|
||||||
uint32_t _rxFailureCount = 0;
|
uint32_t _rxFailureCount = 0;
|
||||||
|
|||||||
13
patches/esp32c3/EspAsyncWebserver.patch
Normal file
13
patches/esp32c3/EspAsyncWebserver.patch
Normal file
@ -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();
|
||||||
|
}
|
||||||
78
pio-scripts/patch_apply.py
Normal file
78
pio-scripts/patch_apply.py
Normal file
@ -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()
|
||||||
@ -37,7 +37,8 @@ lib_deps =
|
|||||||
mobizt/FirebaseJson @ ^3.0.6
|
mobizt/FirebaseJson @ ^3.0.6
|
||||||
|
|
||||||
extra_scripts =
|
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.partitions = partitions_custom.csv
|
||||||
board_build.filesystem = littlefs
|
board_build.filesystem = littlefs
|
||||||
@ -71,6 +72,19 @@ build_flags = ${env.build_flags}
|
|||||||
-DHUAWEI_PIN_POWER=33
|
-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]
|
[env:olimex_esp32_poe]
|
||||||
; https://www.olimex.com/Products/IoT/ESP32/ESP32-POE/open-source-hardware
|
; https://www.olimex.com/Products/IoT/ESP32/ESP32-POE/open-source-hardware
|
||||||
board = esp32-poe
|
board = esp32-poe
|
||||||
|
|||||||
77
src/MqttHandleInverterTotal.cpp
Normal file
77
src/MqttHandleInverterTotal.cpp
Normal file
@ -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 <Hoymiles.h>
|
||||||
|
|
||||||
|
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<uint8_t>(totalAcPowerDigits, inv->Statistics()->getChannelFieldDigits(TYPE_AC, c, FLD_PAC));
|
||||||
|
|
||||||
|
totalAcYieldDay += inv->Statistics()->getChannelFieldValue(TYPE_AC, c, FLD_YD);
|
||||||
|
totalAcYieldDayDigits = max<uint8_t>(totalAcYieldDayDigits, inv->Statistics()->getChannelFieldDigits(TYPE_AC, c, FLD_YD));
|
||||||
|
|
||||||
|
totalAcYieldTotal += inv->Statistics()->getChannelFieldValue(TYPE_AC, c, FLD_YT);
|
||||||
|
totalAcYieldTotalDigits = max<uint8_t>(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<uint8_t>(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<unsigned int>(totalAcPowerDigits)));
|
||||||
|
MqttSettings.publish("ac/yieldtotal", String(totalAcYieldDay, static_cast<unsigned int>(totalAcYieldDayDigits)));
|
||||||
|
MqttSettings.publish("ac/yieldday", String(totalAcYieldTotal, static_cast<unsigned int>(totalAcYieldTotalDigits)));
|
||||||
|
MqttSettings.publish("ac/is_valid", String(totalReachable));
|
||||||
|
MqttSettings.publish("dc/power", String(totalDcPower, static_cast<unsigned int>(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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -38,12 +38,10 @@ void WebApiEventlogClass::onEventlogStatus(AsyncWebServerRequest* request)
|
|||||||
auto inv = Hoymiles.getInverterBySerial(serial);
|
auto inv = Hoymiles.getInverterBySerial(serial);
|
||||||
|
|
||||||
if (inv != nullptr) {
|
if (inv != nullptr) {
|
||||||
String serial = inv->serialString();
|
|
||||||
|
|
||||||
uint8_t logEntryCount = inv->EventLog()->getEntryCount();
|
uint8_t logEntryCount = inv->EventLog()->getEntryCount();
|
||||||
|
|
||||||
root[serial]["count"] = logEntryCount;
|
root["count"] = logEntryCount;
|
||||||
JsonArray eventsArray = root[serial].createNestedArray("events");
|
JsonArray eventsArray = root.createNestedArray("events");
|
||||||
|
|
||||||
for (uint8_t logEntry = 0; logEntry < logEntryCount; logEntry++) {
|
for (uint8_t logEntry = 0; logEntry < logEntryCount; logEntry++) {
|
||||||
JsonObject eventsObject = eventsArray.createNestedObject();
|
JsonObject eventsObject = eventsArray.createNestedObject();
|
||||||
|
|||||||
@ -5,6 +5,7 @@
|
|||||||
#include "WebApi_sysstatus.h"
|
#include "WebApi_sysstatus.h"
|
||||||
#include "Configuration.h"
|
#include "Configuration.h"
|
||||||
#include "NetworkSettings.h"
|
#include "NetworkSettings.h"
|
||||||
|
#include "PinMapping.h"
|
||||||
#include "WebApi.h"
|
#include "WebApi.h"
|
||||||
#include <AsyncJson.h>
|
#include <AsyncJson.h>
|
||||||
#include <Hoymiles.h>
|
#include <Hoymiles.h>
|
||||||
@ -69,11 +70,11 @@ void WebApiSysstatusClass::onSystemStatus(AsyncWebServerRequest* request)
|
|||||||
|
|
||||||
root["uptime"] = esp_timer_get_time() / 1000000;
|
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_connected"] = Hoymiles.getRadioNrf()->isConnected();
|
||||||
root["nrf_pvariant"] = Hoymiles.getRadioNrf()->isPVariant();
|
root["nrf_pvariant"] = Hoymiles.getRadioNrf()->isPVariant();
|
||||||
|
|
||||||
root["cmt_configured"] = Hoymiles.getRadioCmt()->isConfigured();
|
root["cmt_configured"] = PinMapping.isValidCmt2300Config();
|
||||||
root["cmt_connected"] = Hoymiles.getRadioCmt()->isConnected();
|
root["cmt_connected"] = Hoymiles.getRadioCmt()->isConnected();
|
||||||
|
|
||||||
response->setLength();
|
response->setLength();
|
||||||
|
|||||||
@ -14,6 +14,7 @@
|
|||||||
#include "MqttHandleHass.h"
|
#include "MqttHandleHass.h"
|
||||||
#include "MqttHandleVedirectHass.h"
|
#include "MqttHandleVedirectHass.h"
|
||||||
#include "MqttHandleInverter.h"
|
#include "MqttHandleInverter.h"
|
||||||
|
#include "MqttHandleInverterTotal.h"
|
||||||
#include "MqttHandleVedirect.h"
|
#include "MqttHandleVedirect.h"
|
||||||
#include "MqttHandleHuawei.h"
|
#include "MqttHandleHuawei.h"
|
||||||
#include "MqttSettings.h"
|
#include "MqttSettings.h"
|
||||||
@ -100,6 +101,7 @@ void setup()
|
|||||||
MqttSettings.init();
|
MqttSettings.init();
|
||||||
MqttHandleDtu.init();
|
MqttHandleDtu.init();
|
||||||
MqttHandleInverter.init();
|
MqttHandleInverter.init();
|
||||||
|
MqttHandleInverterTotal.init();
|
||||||
MqttHandleVedirect.init();
|
MqttHandleVedirect.init();
|
||||||
MqttHandleHass.init();
|
MqttHandleHass.init();
|
||||||
MqttHandleVedirectHass.init();
|
MqttHandleVedirectHass.init();
|
||||||
@ -204,6 +206,8 @@ void loop()
|
|||||||
yield();
|
yield();
|
||||||
MqttHandleInverter.loop();
|
MqttHandleInverter.loop();
|
||||||
yield();
|
yield();
|
||||||
|
MqttHandleInverterTotal.loop();
|
||||||
|
yield();
|
||||||
MqttHandleVedirect.loop();
|
MqttHandleVedirect.loop();
|
||||||
yield();
|
yield();
|
||||||
MqttHandleHass.loop();
|
MqttHandleHass.loop();
|
||||||
|
|||||||
@ -23,21 +23,22 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@intlify/unplugin-vue-i18n": "^0.10.0",
|
"@intlify/unplugin-vue-i18n": "^0.10.0",
|
||||||
"@rushstack/eslint-patch": "^1.2.0",
|
"@rushstack/eslint-patch": "^1.2.0",
|
||||||
|
"@tsconfig/node18": "^2.0.0",
|
||||||
"@types/bootstrap": "^5.2.6",
|
"@types/bootstrap": "^5.2.6",
|
||||||
"@types/node": "^18.15.11",
|
"@types/node": "^18.16.0",
|
||||||
"@types/spark-md5": "^3.0.2",
|
"@types/spark-md5": "^3.0.2",
|
||||||
"@vitejs/plugin-vue": "^4.1.0",
|
"@vitejs/plugin-vue": "^4.1.0",
|
||||||
"@vue/eslint-config-typescript": "^11.0.2",
|
"@vue/eslint-config-typescript": "^11.0.2",
|
||||||
"@vue/tsconfig": "^0.1.3",
|
"@vue/tsconfig": "^0.3.2",
|
||||||
"eslint": "^8.38.0",
|
"eslint": "^8.39.0",
|
||||||
"eslint-plugin-vue": "^9.11.0",
|
"eslint-plugin-vue": "^9.11.0",
|
||||||
"npm-run-all": "^4.1.5",
|
"npm-run-all": "^4.1.5",
|
||||||
"sass": "^1.62.0",
|
"sass": "^1.62.0",
|
||||||
"terser": "^5.16.9",
|
"terser": "^5.17.1",
|
||||||
"typescript": "^5.0.4",
|
"typescript": "^5.0.4",
|
||||||
"vite": "^4.2.1",
|
"vite": "^4.3.1",
|
||||||
"vite-plugin-compression": "^0.5.1",
|
"vite-plugin-compression": "^0.5.1",
|
||||||
"vite-plugin-css-injected-by-js": "^3.1.0",
|
"vite-plugin-css-injected-by-js": "^3.1.0",
|
||||||
"vue-tsc": "^1.2.0"
|
"vue-tsc": "^1.4.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -546,7 +546,7 @@ export default defineComponent({
|
|||||||
fetch("/api/eventlog/status?inv=" + serial, { headers: authHeader() })
|
fetch("/api/eventlog/status?inv=" + serial, { headers: authHeader() })
|
||||||
.then((response) => handleResponse(response, this.$emitter, this.$router))
|
.then((response) => handleResponse(response, this.$emitter, this.$router))
|
||||||
.then((data) => {
|
.then((data) => {
|
||||||
this.eventLogList = data[serial];
|
this.eventLogList = data;
|
||||||
this.eventLogLoading = false;
|
this.eventLogLoading = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -104,7 +104,7 @@
|
|||||||
</CardElement>
|
</CardElement>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-for="(max, index) in selectedInverterData.channel" :key="`${index}`">
|
<div v-for="(ch, index) in selectedInverterData.channel" :key="`${index}`">
|
||||||
<div class="row g-2">
|
<div class="row g-2">
|
||||||
<div class="col-md">
|
<div class="col-md">
|
||||||
<label :for="`inverter-name_${index}`" class="col-form-label">
|
<label :for="`inverter-name_${index}`" class="col-form-label">
|
||||||
@ -114,7 +114,7 @@
|
|||||||
<div class="d-flex mb-2">
|
<div class="d-flex mb-2">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input type="text" class="form-control" :id="`inverter-name_${index}`"
|
<input type="text" class="form-control" :id="`inverter-name_${index}`"
|
||||||
maxlength="31" v-model="selectedInverterData.channel[index].name" />
|
maxlength="31" v-model="ch.name" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -128,7 +128,7 @@
|
|||||||
<div class="d-flex mb-2">
|
<div class="d-flex mb-2">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input type="number" class="form-control" :id="`inverter-max_${index}`"
|
<input type="number" class="form-control" :id="`inverter-max_${index}`"
|
||||||
min="0" v-model="selectedInverterData.channel[index].max_power"
|
min="0" v-model="ch.max_power"
|
||||||
:aria-describedby="`inverter-maxDescription_${index} inverter-customizer`" />
|
:aria-describedby="`inverter-maxDescription_${index} inverter-customizer`" />
|
||||||
<span class="input-group-text"
|
<span class="input-group-text"
|
||||||
:id="`inverter-maxDescription_${index}`">W<sub>p</sub><sup>*</sup></span>
|
:id="`inverter-maxDescription_${index}`">W<sub>p</sub><sup>*</sup></span>
|
||||||
@ -143,7 +143,7 @@
|
|||||||
<div class="d-flex mb-2">
|
<div class="d-flex mb-2">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input type="number" class="form-control" :id="`inverter-ytoffset_${index}`"
|
<input type="number" class="form-control" :id="`inverter-ytoffset_${index}`"
|
||||||
min="0" v-model="selectedInverterData.channel[index].yield_total_offset"
|
min="0" v-model="ch.yield_total_offset"
|
||||||
:aria-describedby="`inverter-ytoffsetDescription_${index} inverter-customizer`" />
|
:aria-describedby="`inverter-ytoffsetDescription_${index} inverter-customizer`" />
|
||||||
<span class="input-group-text"
|
<span class="input-group-text"
|
||||||
:id="`inverter-ytoffsetDescription_${index}`">kWh</span>
|
:id="`inverter-ytoffsetDescription_${index}`">kWh</span>
|
||||||
|
|||||||
@ -1,8 +1,17 @@
|
|||||||
{
|
{
|
||||||
"extends": "@vue/tsconfig/tsconfig.node.json",
|
"extends": [
|
||||||
"include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
|
"@tsconfig/node18/tsconfig.json",
|
||||||
|
"@vue/tsconfig/tsconfig.json"
|
||||||
|
],
|
||||||
|
"include": [
|
||||||
|
"vite.config.*",
|
||||||
|
"vitest.config.*",
|
||||||
|
"cypress.config.*"
|
||||||
|
],
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"composite": true,
|
"composite": true,
|
||||||
"types": ["node"]
|
"types": [
|
||||||
|
"node"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,13 +1,19 @@
|
|||||||
{
|
{
|
||||||
"extends": "@vue/tsconfig/tsconfig.web.json",
|
"extends": "@vue/tsconfig/tsconfig.dom.json",
|
||||||
"include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
|
"include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"ignoreDeprecations": "5.0",
|
|
||||||
"baseUrl": ".",
|
"baseUrl": ".",
|
||||||
"paths": {
|
"paths": {
|
||||||
"@/*": ["./src/*"]
|
"@/*": ["./src/*"]
|
||||||
},
|
},
|
||||||
"lib": ["ES2021", "DOM"]
|
"lib": ["ES2021", "DOM"],
|
||||||
|
"moduleResolution": "Node",
|
||||||
|
|
||||||
|
/* Linting */
|
||||||
|
"strict": true,
|
||||||
|
"noUnusedLocals": true,
|
||||||
|
"noUnusedParameters": true,
|
||||||
|
"noFallthroughCasesInSwitch": true
|
||||||
},
|
},
|
||||||
|
|
||||||
"references": [
|
"references": [
|
||||||
|
|||||||
176
webapp/yarn.lock
176
webapp/yarn.lock
@ -151,10 +151,10 @@
|
|||||||
minimatch "^3.1.2"
|
minimatch "^3.1.2"
|
||||||
strip-json-comments "^3.1.1"
|
strip-json-comments "^3.1.1"
|
||||||
|
|
||||||
"@eslint/js@8.38.0":
|
"@eslint/js@8.39.0":
|
||||||
version "8.38.0"
|
version "8.39.0"
|
||||||
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.38.0.tgz#73a8a0d8aa8a8e6fe270431c5e72ae91b5337892"
|
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.39.0.tgz#58b536bcc843f4cd1e02a7e6171da5c040f4d44b"
|
||||||
integrity sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==
|
integrity sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==
|
||||||
|
|
||||||
"@humanwhocodes/config-array@^0.11.8":
|
"@humanwhocodes/config-array@^0.11.8":
|
||||||
version "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"
|
resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728"
|
||||||
integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==
|
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":
|
"@types/bootstrap@^5.2.6":
|
||||||
version "5.2.6"
|
version "5.2.6"
|
||||||
resolved "https://registry.yarnpkg.com/@types/bootstrap/-/bootstrap-5.2.6.tgz#e861b3aa1f4a1434da0bf50fbaa372b6f7e64d2f"
|
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"
|
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
|
||||||
integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
|
integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
|
||||||
|
|
||||||
"@types/node@^18.15.11":
|
"@types/node@^18.16.0":
|
||||||
version "18.15.11"
|
version "18.16.0"
|
||||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f"
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.0.tgz#4668bc392bb6938637b47e98b1f2ed5426f33316"
|
||||||
integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==
|
integrity sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ==
|
||||||
|
|
||||||
"@types/spark-md5@^3.0.2":
|
"@types/spark-md5@^3.0.2":
|
||||||
version "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"
|
resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.1.0.tgz#b6a9d83cd91575f7ee15593f6444397f68751073"
|
||||||
integrity sha512-++9JOAFdcXI3lyer9UKUV4rfoQ3T1RN8yDqoCLar86s0xQct5yblxAE+yWgRnU5/0FOlVCpTZpYSBV/bGWrSrQ==
|
integrity sha512-++9JOAFdcXI3lyer9UKUV4rfoQ3T1RN8yDqoCLar86s0xQct5yblxAE+yWgRnU5/0FOlVCpTZpYSBV/bGWrSrQ==
|
||||||
|
|
||||||
"@volar/language-core@1.3.0-alpha.0":
|
"@volar/language-core@1.4.1":
|
||||||
version "1.3.0-alpha.0"
|
version "1.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-1.3.0-alpha.0.tgz#4924b4cbc37dbce5f3845c1d2b2811938223a980"
|
resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-1.4.1.tgz#66b5758252e35c4e5e71197ca7fa0344d306442c"
|
||||||
integrity sha512-W3uMzecHPcbwddPu4SJpUcPakRBK/y/BP+U0U6NiPpUX1tONLC4yCawt+QBJqtgJ+sfD6ztf5PyvPL3hQRqfOA==
|
integrity sha512-EIY+Swv+TjsWpxOxujjMf1ZXqOjg9MT2VMXZ+1dKva0wD8W0L6EtptFFcCJdBbcKmGMFkr57Qzz9VNMWhs3jXQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@volar/source-map" "1.3.0-alpha.0"
|
"@volar/source-map" "1.4.1"
|
||||||
|
|
||||||
"@volar/source-map@1.3.0-alpha.0":
|
"@volar/source-map@1.4.1":
|
||||||
version "1.3.0-alpha.0"
|
version "1.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-1.3.0-alpha.0.tgz#c45d51ecb9759604d29fb80211d2fc9765e5559c"
|
resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-1.4.1.tgz#e3b561775c742508e5e1f28609a4787c98056715"
|
||||||
integrity sha512-jSdizxWFvDTvkPYZnO6ew3sBZUnS0abKCbuopkc0JrIlFbznWC/fPH3iPFIMS8/IIkRxq1Jh9VVG60SmtsdaMQ==
|
integrity sha512-bZ46ad72dsbzuOWPUtJjBXkzSQzzSejuR3CT81+GvTEI2E994D8JPXzM3tl98zyCNnjgs4OkRyliImL1dvJ5BA==
|
||||||
dependencies:
|
dependencies:
|
||||||
muggle-string "^0.2.2"
|
muggle-string "^0.2.2"
|
||||||
|
|
||||||
"@volar/typescript@1.3.0-alpha.0":
|
"@volar/typescript@1.4.1":
|
||||||
version "1.3.0-alpha.0"
|
version "1.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-1.3.0-alpha.0.tgz#f79bbc9939016700812b18191c47eb035913c6c3"
|
resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-1.4.1.tgz#a013419e6f029155e5467443f3ab72815da608b5"
|
||||||
integrity sha512-5UItyW2cdH2mBLu4RrECRNJRgtvvzKrSCn2y3v/D61QwIDkGx4aeil6x8RFuUL5TFtV6QvVHXnsOHxNgd+sCow==
|
integrity sha512-phTy6p9yG6bgMIKQWEeDOi/aeT0njZsb1a/G1mrEuDsLmAn24Le4gDwSsGNhea6Uhu+3gdpUZn2PmZXa+WG2iQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@volar/language-core" "1.3.0-alpha.0"
|
"@volar/language-core" "1.4.1"
|
||||||
|
|
||||||
"@volar/vue-language-core@1.2.0":
|
"@volar/vue-language-core@1.4.4":
|
||||||
version "1.2.0"
|
version "1.4.4"
|
||||||
resolved "https://registry.yarnpkg.com/@volar/vue-language-core/-/vue-language-core-1.2.0.tgz#a600aa93c6a4e89bf2b525b7e876b39e3afdfb9b"
|
resolved "https://registry.yarnpkg.com/@volar/vue-language-core/-/vue-language-core-1.4.4.tgz#6c1cf289cd1caa0f433a0765d288cf6fbe54dff5"
|
||||||
integrity sha512-w7yEiaITh2WzKe6u8ZdeLKCUz43wdmY/OqAmsB/PGDvvhTcVhCJ6f0W/RprZL1IhqH8wALoWiwEh/Wer7ZviMQ==
|
integrity sha512-c3hL6un+CfoOlusGvpypcodmk9ke/ImrWIUc0GkgI+imoQpUGzgu3tEQWlPs604R7AhxeZwWUi8hQNfax0R/zA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@volar/language-core" "1.3.0-alpha.0"
|
"@volar/language-core" "1.4.1"
|
||||||
"@volar/source-map" "1.3.0-alpha.0"
|
"@volar/source-map" "1.4.1"
|
||||||
"@vue/compiler-dom" "^3.2.47"
|
"@vue/compiler-dom" "^3.2.0"
|
||||||
"@vue/compiler-sfc" "^3.2.47"
|
"@vue/compiler-sfc" "^3.2.0"
|
||||||
"@vue/reactivity" "^3.2.47"
|
"@vue/reactivity" "^3.2.0"
|
||||||
"@vue/shared" "^3.2.47"
|
"@vue/shared" "^3.2.0"
|
||||||
minimatch "^6.1.6"
|
minimatch "^9.0.0"
|
||||||
muggle-string "^0.2.2"
|
muggle-string "^0.2.2"
|
||||||
vue-template-compiler "^2.7.14"
|
vue-template-compiler "^2.7.14"
|
||||||
|
|
||||||
"@volar/vue-typescript@1.2.0":
|
"@volar/vue-typescript@1.4.4":
|
||||||
version "1.2.0"
|
version "1.4.4"
|
||||||
resolved "https://registry.yarnpkg.com/@volar/vue-typescript/-/vue-typescript-1.2.0.tgz#825dab4624a116d8be21efbf0c4a7bd6dec51d37"
|
resolved "https://registry.yarnpkg.com/@volar/vue-typescript/-/vue-typescript-1.4.4.tgz#6c4a86010fc94965cce554ea1424bc8878ba216c"
|
||||||
integrity sha512-zjmRi9y3J1EkG+pfuHp8IbHmibihrKK485cfzsHjiuvJMGrpkWvlO5WVEk8oslMxxeGC5XwBFE9AOlvh378EPA==
|
integrity sha512-L61Fk15jlJw3QtIddD4cVE5jei5i6zbLJRiaEMYDDnUKB259/qUrdvnMfnZUFVyDwlevzdstjtaUyreeG/0nPQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@volar/typescript" "1.3.0-alpha.0"
|
"@volar/typescript" "1.4.1"
|
||||||
"@volar/vue-language-core" "1.2.0"
|
"@volar/vue-language-core" "1.4.4"
|
||||||
|
|
||||||
"@vue/compiler-core@3.2.47":
|
"@vue/compiler-core@3.2.47":
|
||||||
version "3.2.47"
|
version "3.2.47"
|
||||||
@ -544,7 +549,7 @@
|
|||||||
estree-walker "^2.0.2"
|
estree-walker "^2.0.2"
|
||||||
source-map "^0.6.1"
|
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"
|
version "3.2.47"
|
||||||
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz#a0b06caf7ef7056939e563dcaa9cbde30794f305"
|
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz#a0b06caf7ef7056939e563dcaa9cbde30794f305"
|
||||||
integrity sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==
|
integrity sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==
|
||||||
@ -552,7 +557,7 @@
|
|||||||
"@vue/compiler-core" "3.2.47"
|
"@vue/compiler-core" "3.2.47"
|
||||||
"@vue/shared" "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"
|
version "3.2.47"
|
||||||
resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz#1bdc36f6cdc1643f72e2c397eb1a398f5004ad3d"
|
resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz#1bdc36f6cdc1643f72e2c397eb1a398f5004ad3d"
|
||||||
integrity sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==
|
integrity sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==
|
||||||
@ -601,7 +606,7 @@
|
|||||||
estree-walker "^2.0.2"
|
estree-walker "^2.0.2"
|
||||||
magic-string "^0.25.7"
|
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"
|
version "3.2.47"
|
||||||
resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.47.tgz#1d6399074eadfc3ed35c727e2fd707d6881140b6"
|
resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.47.tgz#1d6399074eadfc3ed35c727e2fd707d6881140b6"
|
||||||
integrity sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==
|
integrity sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==
|
||||||
@ -633,15 +638,15 @@
|
|||||||
"@vue/compiler-ssr" "3.2.47"
|
"@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.47", "@vue/shared@^3.2.0":
|
||||||
version "3.2.47"
|
version "3.2.47"
|
||||||
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.47.tgz#e597ef75086c6e896ff5478a6bfc0a7aa4bbd14c"
|
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.47.tgz#e597ef75086c6e896ff5478a6bfc0a7aa4bbd14c"
|
||||||
integrity sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==
|
integrity sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==
|
||||||
|
|
||||||
"@vue/tsconfig@^0.1.3":
|
"@vue/tsconfig@^0.3.2":
|
||||||
version "0.1.3"
|
version "0.3.2"
|
||||||
resolved "https://registry.yarnpkg.com/@vue/tsconfig/-/tsconfig-0.1.3.tgz#4a61dbd29783d01ddab504276dcf0c2b6988654f"
|
resolved "https://registry.yarnpkg.com/@vue/tsconfig/-/tsconfig-0.3.2.tgz#612ba0b6aefde5ac1a513545eee7d4ed01c407f5"
|
||||||
integrity sha512-kQVsh8yyWPvHpb8gIc9l/HIDiiVUy1amynLNpCy8p+FoCiZXCo6fQos5/097MmnNZc9AtseDsCrfkhqCrJ8Olg==
|
integrity sha512-jWzZbGyrZAEbHYGn0kPzJ+MMtIkIxb0+hL5+RghBowyOxMRs9jMdp5XvpXz3wgCzjRZiUucy29042HBe9cxoYA==
|
||||||
|
|
||||||
acorn-jsx@^5.2.0, acorn-jsx@^5.3.2:
|
acorn-jsx@^5.2.0, acorn-jsx@^5.3.2:
|
||||||
version "5.3.2"
|
version "5.3.2"
|
||||||
@ -1035,6 +1040,14 @@ eslint-scope@^7.1.1:
|
|||||||
esrecurse "^4.3.0"
|
esrecurse "^4.3.0"
|
||||||
estraverse "^5.2.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:
|
eslint-utils@^2.1.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
|
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"
|
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz#c7f0f956124ce677047ddbc192a68f999454dedc"
|
||||||
integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==
|
integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==
|
||||||
|
|
||||||
eslint@^8.38.0:
|
eslint@^8.39.0:
|
||||||
version "8.38.0"
|
version "8.39.0"
|
||||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.38.0.tgz#a62c6f36e548a5574dd35728ac3c6209bd1e2f1a"
|
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.39.0.tgz#7fd20a295ef92d43809e914b70c39fd5a23cf3f1"
|
||||||
integrity sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==
|
integrity sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@eslint-community/eslint-utils" "^4.2.0"
|
"@eslint-community/eslint-utils" "^4.2.0"
|
||||||
"@eslint-community/regexpp" "^4.4.0"
|
"@eslint-community/regexpp" "^4.4.0"
|
||||||
"@eslint/eslintrc" "^2.0.2"
|
"@eslint/eslintrc" "^2.0.2"
|
||||||
"@eslint/js" "8.38.0"
|
"@eslint/js" "8.39.0"
|
||||||
"@humanwhocodes/config-array" "^0.11.8"
|
"@humanwhocodes/config-array" "^0.11.8"
|
||||||
"@humanwhocodes/module-importer" "^1.0.1"
|
"@humanwhocodes/module-importer" "^1.0.1"
|
||||||
"@nodelib/fs.walk" "^1.2.8"
|
"@nodelib/fs.walk" "^1.2.8"
|
||||||
@ -1087,7 +1100,7 @@ eslint@^8.38.0:
|
|||||||
debug "^4.3.2"
|
debug "^4.3.2"
|
||||||
doctrine "^3.0.0"
|
doctrine "^3.0.0"
|
||||||
escape-string-regexp "^4.0.0"
|
escape-string-regexp "^4.0.0"
|
||||||
eslint-scope "^7.1.1"
|
eslint-scope "^7.2.0"
|
||||||
eslint-visitor-keys "^3.4.0"
|
eslint-visitor-keys "^3.4.0"
|
||||||
espree "^9.5.1"
|
espree "^9.5.1"
|
||||||
esquery "^1.4.2"
|
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:
|
dependencies:
|
||||||
brace-expansion "^1.1.7"
|
brace-expansion "^1.1.7"
|
||||||
|
|
||||||
minimatch@^6.1.6:
|
minimatch@^9.0.0:
|
||||||
version "6.2.0"
|
version "9.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-6.2.0.tgz#2b70fd13294178c69c04dfc05aebdb97a4e79e42"
|
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.0.tgz#bfc8e88a1c40ffd40c172ddac3decb8451503b56"
|
||||||
integrity sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==
|
integrity sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==
|
||||||
dependencies:
|
dependencies:
|
||||||
brace-expansion "^2.0.1"
|
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"
|
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
|
||||||
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
|
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
|
||||||
|
|
||||||
resolve@^1.10.0, resolve@^1.22.1:
|
resolve@^1.10.0:
|
||||||
version "1.22.1"
|
version "1.22.1"
|
||||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
|
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
|
||||||
integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
|
integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
|
||||||
@ -2059,10 +2072,10 @@ rimraf@^3.0.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
glob "^7.1.3"
|
glob "^7.1.3"
|
||||||
|
|
||||||
rollup@^3.18.0:
|
rollup@^3.20.2:
|
||||||
version "3.19.1"
|
version "3.20.6"
|
||||||
resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.19.1.tgz#2b3a31ac1ff9f3afab2e523fa687fef5b0ee20fc"
|
resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.20.6.tgz#53c0fd73e397269d2ce5f0ec12851457dd53cacd"
|
||||||
integrity sha512-lAbrdN7neYCg/8WaoWn/ckzCtz+jr70GFfYdlf50OF7387HTg+wiuiqJRFYawwSPpqfqDNYqK7smY/ks2iAudg==
|
integrity sha512-2yEB3nQXp/tBQDN0hJScJQheXdvU2wFhh6ld7K/aiZ1vYcak6N/BKjY1QrU6BvO2JWYS8bEs14FRaxXosxy2zw==
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
fsevents "~2.3.2"
|
fsevents "~2.3.2"
|
||||||
|
|
||||||
@ -2108,6 +2121,13 @@ semver@^7.3.5, semver@^7.3.6, semver@^7.3.7:
|
|||||||
dependencies:
|
dependencies:
|
||||||
lru-cache "^6.0.0"
|
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:
|
shebang-command@^1.2.0:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
|
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"
|
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
|
||||||
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
|
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
|
||||||
|
|
||||||
terser@^5.16.9:
|
terser@^5.17.1:
|
||||||
version "5.16.9"
|
version "5.17.1"
|
||||||
resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.9.tgz#7a28cb178e330c484369886f2afd623d9847495f"
|
resolved "https://registry.yarnpkg.com/terser/-/terser-5.17.1.tgz#948f10830454761e2eeedc6debe45c532c83fd69"
|
||||||
integrity sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg==
|
integrity sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@jridgewell/source-map" "^0.3.2"
|
"@jridgewell/source-map" "^0.3.2"
|
||||||
acorn "^8.5.0"
|
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"
|
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==
|
integrity sha512-qogCmpocZfcbSAYZQjS88ieIY0PzLUm7RkLFWFgAxkXdz3N6roZbSTNTxeIOj5IxFbZWACUPuVBBoo6qCuXDcw==
|
||||||
|
|
||||||
vite@^4.2.1:
|
vite@^4.3.1:
|
||||||
version "4.2.1"
|
version "4.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/vite/-/vite-4.2.1.tgz#6c2eb337b0dfd80a9ded5922163b94949d7fc254"
|
resolved "https://registry.yarnpkg.com/vite/-/vite-4.3.1.tgz#9badb1377f995632cdcf05f32103414db6fbb95a"
|
||||||
integrity sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==
|
integrity sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg==
|
||||||
dependencies:
|
dependencies:
|
||||||
esbuild "^0.17.5"
|
esbuild "^0.17.5"
|
||||||
postcss "^8.4.21"
|
postcss "^8.4.21"
|
||||||
resolve "^1.22.1"
|
rollup "^3.20.2"
|
||||||
rollup "^3.18.0"
|
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
fsevents "~2.3.2"
|
fsevents "~2.3.2"
|
||||||
|
|
||||||
@ -2435,13 +2454,14 @@ vue-template-compiler@^2.7.14:
|
|||||||
de-indent "^1.0.2"
|
de-indent "^1.0.2"
|
||||||
he "^1.2.0"
|
he "^1.2.0"
|
||||||
|
|
||||||
vue-tsc@^1.2.0:
|
vue-tsc@^1.4.4:
|
||||||
version "1.2.0"
|
version "1.4.4"
|
||||||
resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-1.2.0.tgz#2b64b960cc96208492541394423ace589a461be6"
|
resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-1.4.4.tgz#bf487be671220ed47de62cf47092b622432e1599"
|
||||||
integrity sha512-rIlzqdrhyPYyLG9zxsVRa+JEseeS9s8F2BbVVVWRRsTZvJO2BbhLEb2HW3MY+DFma0378tnIqs+vfTzbcQtRFw==
|
integrity sha512-2XsCjF2mLo6gwOVcOpngwJkP8GzYQjNh20A+Pr2FGdsWzr9jjXJ0k08/DfcslfncsuCrTrnWtb4KEL3gcDtlNA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@volar/vue-language-core" "1.2.0"
|
"@volar/vue-language-core" "1.4.4"
|
||||||
"@volar/vue-typescript" "1.2.0"
|
"@volar/vue-typescript" "1.4.4"
|
||||||
|
semver "^7.3.8"
|
||||||
|
|
||||||
vue@^3.2.47:
|
vue@^3.2.47:
|
||||||
version "3.2.47"
|
version "3.2.47"
|
||||||
|
|||||||
Binary file not shown.
Loading…
Reference in New Issue
Block a user