Merge remote-tracking branch 'tbnobody/OpenDTU/master' into development
This commit is contained in:
commit
a529c91254
11
README.md
11
README.md
@ -155,6 +155,16 @@ Firmware version seems to play not a significant role and cannot be read from th
|
||||
* Build with [Vue.js](https://vuejs.org)
|
||||
* Source is written in TypeScript
|
||||
|
||||
## Breaking changes
|
||||
Generated using: `git log --date=short --pretty=format:"* %h%x09%ad%x09%s" | grep BREAKING`
|
||||
```
|
||||
* 3b7aef6 2023-02-13 BREAKING CHANGE: Web API!
|
||||
* d4c838a 2023-02-06 BREAKING CHANGE: Prometheus API!
|
||||
* daf847e 2022-11-14 BREAKING CHANGE: Removed deprecated config parsing method
|
||||
* 69b675b 2022-11-01 BREAKING CHANGE: Structure WebAPI /api/livedata/status changed
|
||||
* 27ed4e3 2022-10-31 BREAKING: Change power factor from percent value to value between 0 and 1
|
||||
```
|
||||
|
||||
## Hardware you need
|
||||
|
||||
### ESP32 board
|
||||
@ -310,6 +320,7 @@ A documentation of the Web API can be found here: [Web-API Documentation](docs/W
|
||||
* <https://www.printables.com/model/293003-sol-opendtu-esp32-nrf24l01-case>
|
||||
* <https://www.thingiverse.com/thing:5661780>
|
||||
* <https://www.thingiverse.com/thing:5632374>
|
||||
* <https://www.thingiverse.com/thing:5852233>
|
||||
|
||||
|
||||
## Building
|
||||
|
||||
@ -51,6 +51,7 @@ serial will be replaced with the serial number of the inverter.
|
||||
| Topic | R / W | Description | Value / Unit |
|
||||
| --------------------------------------- | ----- | ---------------------------------------------------- | -------------------------- |
|
||||
| [serial]/[1-4]/current | R | DC current of specific input in ampere | Ampere (A) |
|
||||
| [serial]/[1-4]/name | R | Name of the DC input channel as configured in web GUI| |
|
||||
| [serial]/[1-4]/irradiation | R | Ratio DC Power over set maximum power (in web GUI) | % |
|
||||
| [serial]/[1-4]/power | R | DC power of specific input in watt | Watt (W) |
|
||||
| [serial]/[1-4]/voltage | R | DC voltage of specific input in volt | Volt (V) |
|
||||
|
||||
590
docs/Web-API.md
590
docs/Web-API.md
@ -56,7 +56,7 @@ You can "talk" to the OpenDTU with a command line tool like `curl`. The output i
|
||||
|
||||
```
|
||||
~$ curl http://192.168.10.10/api/livedata/status
|
||||
{"inverters":[{"serial":"11418186xxxx","name":"HM600","data_age":4,"reachable":true,"producing":true,"limit_relative":100,"limit_absolute":600,"0":{"Power":{"v":70.69999695,"u":"W","d":1},"Voltage":{"v":233,"u":"V","d":1},"Current":{"v":0.300000012,"u":"A","d":2},"Power DC":{"v":74,"u":"W","d":2},"YieldDay":{"v":23,"u":"Wh","d":2},"YieldTotal":{"v":150.5050049,"u":"kWh","d":2},"Frequency":{"v":50.02000046,"u":"Hz","d":2},"Temperature":{"v":8.300000191,"u":"°C","d":1},"PowerFactor":{"v":1,"u":"","d":3},"ReactivePower":{"v":0.100000001,"u":"var","d":1},"Efficiency":{"v":95.54053497,"u":"%","d":2}},"1":{"Power":{"v":0,"u":"W","d":1},"Voltage":{"v":1,"u":"V","d":1},"Current":{"v":0.02,"u":"A","d":2},"YieldDay":{"v":0,"u":"Wh","d":0},"YieldTotal":{"v":49.0320015,"u":"kWh","d":3},"Irradiation":{"v":0,"u":"%","d":2}},"2":{"Power":{"v":74,"u":"W","d":1},"Voltage":{"v":42.40000153,"u":"V","d":1},"Current":{"v":1.74000001,"u":"A","d":2},"YieldDay":{"v":23,"u":"Wh","d":0},"YieldTotal":{"v":101.4729996,"u":"kWh","d":3},"Irradiation":{"v":18.04878044,"u":"%","d":2}},"events":3},{"serial":"11418180xxxx","name":"HM800","data_age":11,"reachable":true,"producing":true,"limit_relative":100,"limit_absolute":800,"0":{"Power":{"v":70.09999847,"u":"W","d":1},"Voltage":{"v":233.1000061,"u":"V","d":1},"Current":{"v":0.300000012,"u":"A","d":2},"Power DC":{"v":73.59999847,"u":"W","d":2},"YieldDay":{"v":48,"u":"Wh","d":2},"YieldTotal":{"v":48.5399971,"u":"kWh","d":2},"Frequency":{"v":50.02000046,"u":"Hz","d":2},"Temperature":{"v":11.39999962,"u":"°C","d":1},"PowerFactor":{"v":1,"u":"","d":3},"ReactivePower":{"v":0.100000001,"u":"var","d":1},"Efficiency":{"v":95.24456024,"u":"%","d":2}},"1":{"Power":{"v":36.5,"u":"W","d":1},"Voltage":{"v":39.09999847,"u":"V","d":1},"Current":{"v":0.930000007,"u":"A","d":2},"YieldDay":{"v":31,"u":"Wh","d":0},"YieldTotal":{"v":4.301000118,"u":"kWh","d":3},"Irradiation":{"v":8.902439117,"u":"%","d":2}},"2":{"Power":{"v":37.09999847,"u":"W","d":1},"Voltage":{"v":40.79999924,"u":"V","d":1},"Current":{"v":0.910000026,"u":"A","d":2},"YieldDay":{"v":17,"u":"Wh","d":0},"YieldTotal":{"v":44.23899841,"u":"kWh","d":3},"Irradiation":{"v":9.048780441,"u":"%","d":2}},"events":1}],"total":{"Power":{"v":140.7999878,"u":"W","d":1},"YieldDay":{"v":71,"u":"Wh","d":0},"YieldTotal":{"v":199.0449982,"u":"kWh","d":2}}}
|
||||
{"inverters":[{"serial":"11617160xxxx","name":"Meine Solaranlage","data_age":6983,"reachable":false,"producing":false,"limit_relative":0,"limit_absolute":-1,"AC":{"0":{"Power":{"v":0,"u":"W","d":1},"Voltage":{"v":0,"u":"V","d":1},"Current":{"v":0,"u":"A","d":2},"Power DC":{"v":0,"u":"W","d":1},"YieldDay":{"v":0,"u":"Wh","d":0},"YieldTotal":{"v":0,"u":"kWh","d":3},"Frequency":{"v":0,"u":"Hz","d":2},"PowerFactor":{"v":0,"u":"","d":3},"ReactivePower":{"v":0,"u":"var","d":1},"Efficiency":{"v":0,"u":"%","d":3}}},"DC":{"0":{"name":{"u":""},"Power":{"v":0,"u":"W","d":1},"Voltage":{"v":0,"u":"V","d":1},"Current":{"v":0,"u":"A","d":2},"YieldDay":{"v":0,"u":"Wh","d":0},"YieldTotal":{"v":0,"u":"kWh","d":3},"Irradiation":{"v":0,"u":"%","d":3}},"1":{"name":{"u":""},"Power":{"v":0,"u":"W","d":1},"Voltage":{"v":0,"u":"V","d":1},"Current":{"v":0,"u":"A","d":2},"YieldDay":{"v":0,"u":"Wh","d":0},"YieldTotal":{"v":0,"u":"kWh","d":3},"Irradiation":{"v":0,"u":"%","d":3}},"2":{"name":{"u":""},"Power":{"v":0,"u":"W","d":1},"Voltage":{"v":0,"u":"V","d":1},"Current":{"v":0,"u":"A","d":2},"YieldDay":{"v":0,"u":"Wh","d":0},"YieldTotal":{"v":0,"u":"kWh","d":3},"Irradiation":{"v":0,"u":"%","d":3}},"3":{"name":{"u":""},"Power":{"v":0,"u":"W","d":1},"Voltage":{"v":0,"u":"V","d":1},"Current":{"v":0,"u":"A","d":2},"YieldDay":{"v":0,"u":"Wh","d":0},"YieldTotal":{"v":0,"u":"kWh","d":3}}},"INV":{"0":{"Temperature":{"v":0,"u":"°C","d":1}}},"events":0},{"serial":"11417160xxxx","name":"test","data_age":6983,"reachable":false,"producing":false,"limit_relative":0,"limit_absolute":-1,"AC":{"0":{"Power":{"v":0,"u":"W","d":1},"Voltage":{"v":0,"u":"V","d":1},"Current":{"v":0,"u":"A","d":2},"Power DC":{"v":0,"u":"W","d":1},"YieldDay":{"v":0,"u":"Wh","d":0},"YieldTotal":{"v":0,"u":"kWh","d":3},"Frequency":{"v":0,"u":"Hz","d":2},"PowerFactor":{"v":0,"u":"","d":3},"ReactivePower":{"v":0,"u":"var","d":1},"Efficiency":{"v":0,"u":"%","d":3}}},"DC":{"0":{"name":{"u":"test 1"},"Power":{"v":0,"u":"W","d":1},"Voltage":{"v":0,"u":"V","d":1},"Current":{"v":0,"u":"A","d":2},"YieldDay":{"v":0,"u":"Wh","d":0},"YieldTotal":{"v":0,"u":"kWh","d":3},"Irradiation":{"v":0,"u":"%","d":3}},"1":{"name":{"u":"test 2"},"Power":{"v":0,"u":"W","d":1},"Voltage":{"v":0,"u":"V","d":1},"Current":{"v":0,"u":"A","d":2},"YieldDay":{"v":0,"u":"Wh","d":0},"YieldTotal":{"v":0,"u":"kWh","d":3},"Irradiation":{"v":0,"u":"%","d":3}}},"INV":{"0":{"Temperature":{"v":0,"u":"°C","d":1}}},"events":0}],"total":{"Power":{"v":0,"u":"W","d":1},"YieldDay":{"v":0,"u":"Wh","d":0},"YieldTotal":{"v":0,"u":"kWh","d":2}},"hints":{"time_sync":false,"radio_problem":false,"default_password":false}}
|
||||
```
|
||||
|
||||
|
||||
@ -67,284 +67,382 @@ To enhance readability (and filter information) use the JSON command line proces
|
||||
{
|
||||
"inverters": [
|
||||
{
|
||||
"serial": "11418186xxxx",
|
||||
"name": "HM600",
|
||||
"data_age": 4,
|
||||
"reachable": true,
|
||||
"producing": true,
|
||||
"limit_relative": 100,
|
||||
"limit_absolute": 600,
|
||||
"0": {
|
||||
"Power": {
|
||||
"v": 70.69999695,
|
||||
"u": "W",
|
||||
"d": 1
|
||||
},
|
||||
"Voltage": {
|
||||
"v": 233,
|
||||
"u": "V",
|
||||
"d": 1
|
||||
},
|
||||
"Current": {
|
||||
"v": 0.300000012,
|
||||
"u": "A",
|
||||
"d": 2
|
||||
},
|
||||
"Power DC": {
|
||||
"v": 74,
|
||||
"u": "W",
|
||||
"d": 2
|
||||
},
|
||||
"YieldDay": {
|
||||
"v": 23,
|
||||
"u": "Wh",
|
||||
"d": 2
|
||||
},
|
||||
"YieldTotal": {
|
||||
"v": 150.5050049,
|
||||
"u": "kWh",
|
||||
"d": 2
|
||||
},
|
||||
"Frequency": {
|
||||
"v": 50.02000046,
|
||||
"u": "Hz",
|
||||
"d": 2
|
||||
},
|
||||
"Temperature": {
|
||||
"v": 8.300000191,
|
||||
"u": "°C",
|
||||
"d": 1
|
||||
},
|
||||
"PowerFactor": {
|
||||
"v": 1,
|
||||
"u": "",
|
||||
"d": 3
|
||||
},
|
||||
"ReactivePower": {
|
||||
"v": 0.100000001,
|
||||
"u": "var",
|
||||
"d": 1
|
||||
},
|
||||
"Efficiency": {
|
||||
"v": 95.54053497,
|
||||
"u": "%",
|
||||
"d": 2
|
||||
"serial": "116171603546",
|
||||
"name": "Meine Solaranlage",
|
||||
"data_age": 7038,
|
||||
"reachable": false,
|
||||
"producing": false,
|
||||
"limit_relative": 0,
|
||||
"limit_absolute": -1,
|
||||
"AC": {
|
||||
"0": {
|
||||
"Power": {
|
||||
"v": 0,
|
||||
"u": "W",
|
||||
"d": 1
|
||||
},
|
||||
"Voltage": {
|
||||
"v": 0,
|
||||
"u": "V",
|
||||
"d": 1
|
||||
},
|
||||
"Current": {
|
||||
"v": 0,
|
||||
"u": "A",
|
||||
"d": 2
|
||||
},
|
||||
"Power DC": {
|
||||
"v": 0,
|
||||
"u": "W",
|
||||
"d": 1
|
||||
},
|
||||
"YieldDay": {
|
||||
"v": 0,
|
||||
"u": "Wh",
|
||||
"d": 0
|
||||
},
|
||||
"YieldTotal": {
|
||||
"v": 0,
|
||||
"u": "kWh",
|
||||
"d": 3
|
||||
},
|
||||
"Frequency": {
|
||||
"v": 0,
|
||||
"u": "Hz",
|
||||
"d": 2
|
||||
},
|
||||
"PowerFactor": {
|
||||
"v": 0,
|
||||
"u": "",
|
||||
"d": 3
|
||||
},
|
||||
"ReactivePower": {
|
||||
"v": 0,
|
||||
"u": "var",
|
||||
"d": 1
|
||||
},
|
||||
"Efficiency": {
|
||||
"v": 0,
|
||||
"u": "%",
|
||||
"d": 3
|
||||
}
|
||||
}
|
||||
},
|
||||
"1": {
|
||||
"Power": {
|
||||
"v": 0,
|
||||
"u": "W",
|
||||
"d": 1
|
||||
"DC": {
|
||||
"0": {
|
||||
"name": {
|
||||
"u": ""
|
||||
},
|
||||
"Power": {
|
||||
"v": 0,
|
||||
"u": "W",
|
||||
"d": 1
|
||||
},
|
||||
"Voltage": {
|
||||
"v": 0,
|
||||
"u": "V",
|
||||
"d": 1
|
||||
},
|
||||
"Current": {
|
||||
"v": 0,
|
||||
"u": "A",
|
||||
"d": 2
|
||||
},
|
||||
"YieldDay": {
|
||||
"v": 0,
|
||||
"u": "Wh",
|
||||
"d": 0
|
||||
},
|
||||
"YieldTotal": {
|
||||
"v": 0,
|
||||
"u": "kWh",
|
||||
"d": 3
|
||||
},
|
||||
"Irradiation": {
|
||||
"v": 0,
|
||||
"u": "%",
|
||||
"d": 3
|
||||
}
|
||||
},
|
||||
"Voltage": {
|
||||
"v": 1,
|
||||
"u": "V",
|
||||
"d": 1
|
||||
"1": {
|
||||
"name": {
|
||||
"u": ""
|
||||
},
|
||||
"Power": {
|
||||
"v": 0,
|
||||
"u": "W",
|
||||
"d": 1
|
||||
},
|
||||
"Voltage": {
|
||||
"v": 0,
|
||||
"u": "V",
|
||||
"d": 1
|
||||
},
|
||||
"Current": {
|
||||
"v": 0,
|
||||
"u": "A",
|
||||
"d": 2
|
||||
},
|
||||
"YieldDay": {
|
||||
"v": 0,
|
||||
"u": "Wh",
|
||||
"d": 0
|
||||
},
|
||||
"YieldTotal": {
|
||||
"v": 0,
|
||||
"u": "kWh",
|
||||
"d": 3
|
||||
},
|
||||
"Irradiation": {
|
||||
"v": 0,
|
||||
"u": "%",
|
||||
"d": 3
|
||||
}
|
||||
},
|
||||
"Current": {
|
||||
"v": 0.02,
|
||||
"u": "A",
|
||||
"d": 2
|
||||
"2": {
|
||||
"name": {
|
||||
"u": ""
|
||||
},
|
||||
"Power": {
|
||||
"v": 0,
|
||||
"u": "W",
|
||||
"d": 1
|
||||
},
|
||||
"Voltage": {
|
||||
"v": 0,
|
||||
"u": "V",
|
||||
"d": 1
|
||||
},
|
||||
"Current": {
|
||||
"v": 0,
|
||||
"u": "A",
|
||||
"d": 2
|
||||
},
|
||||
"YieldDay": {
|
||||
"v": 0,
|
||||
"u": "Wh",
|
||||
"d": 0
|
||||
},
|
||||
"YieldTotal": {
|
||||
"v": 0,
|
||||
"u": "kWh",
|
||||
"d": 3
|
||||
},
|
||||
"Irradiation": {
|
||||
"v": 0,
|
||||
"u": "%",
|
||||
"d": 3
|
||||
}
|
||||
},
|
||||
"YieldDay": {
|
||||
"v": 0,
|
||||
"u": "Wh",
|
||||
"d": 0
|
||||
},
|
||||
"YieldTotal": {
|
||||
"v": 49.0320015,
|
||||
"u": "kWh",
|
||||
"d": 3
|
||||
},
|
||||
"Irradiation": {
|
||||
"v": 0,
|
||||
"u": "%",
|
||||
"d": 2
|
||||
"3": {
|
||||
"name": {
|
||||
"u": ""
|
||||
},
|
||||
"Power": {
|
||||
"v": 0,
|
||||
"u": "W",
|
||||
"d": 1
|
||||
},
|
||||
"Voltage": {
|
||||
"v": 0,
|
||||
"u": "V",
|
||||
"d": 1
|
||||
},
|
||||
"Current": {
|
||||
"v": 0,
|
||||
"u": "A",
|
||||
"d": 2
|
||||
},
|
||||
"YieldDay": {
|
||||
"v": 0,
|
||||
"u": "Wh",
|
||||
"d": 0
|
||||
},
|
||||
"YieldTotal": {
|
||||
"v": 0,
|
||||
"u": "kWh",
|
||||
"d": 3
|
||||
}
|
||||
}
|
||||
},
|
||||
"2": {
|
||||
"Power": {
|
||||
"v": 74,
|
||||
"u": "W",
|
||||
"d": 1
|
||||
},
|
||||
"Voltage": {
|
||||
"v": 42.40000153,
|
||||
"u": "V",
|
||||
"d": 1
|
||||
},
|
||||
"Current": {
|
||||
"v": 1.74000001,
|
||||
"u": "A",
|
||||
"d": 2
|
||||
},
|
||||
"YieldDay": {
|
||||
"v": 23,
|
||||
"u": "Wh",
|
||||
"d": 0
|
||||
},
|
||||
"YieldTotal": {
|
||||
"v": 101.4729996,
|
||||
"u": "kWh",
|
||||
"d": 3
|
||||
},
|
||||
"Irradiation": {
|
||||
"v": 18.04878044,
|
||||
"u": "%",
|
||||
"d": 2
|
||||
"INV": {
|
||||
"0": {
|
||||
"Temperature": {
|
||||
"v": 0,
|
||||
"u": "°C",
|
||||
"d": 1
|
||||
}
|
||||
}
|
||||
},
|
||||
"events": 3
|
||||
"events": 0
|
||||
},
|
||||
{
|
||||
"serial": "11418180xxxx",
|
||||
"name": "HM800",
|
||||
"data_age": 11,
|
||||
"reachable": true,
|
||||
"producing": true,
|
||||
"limit_relative": 100,
|
||||
"limit_absolute": 800,
|
||||
"0": {
|
||||
"Power": {
|
||||
"v": 70.09999847,
|
||||
"u": "W",
|
||||
"d": 1
|
||||
},
|
||||
"Voltage": {
|
||||
"v": 233.1000061,
|
||||
"u": "V",
|
||||
"d": 1
|
||||
},
|
||||
"Current": {
|
||||
"v": 0.300000012,
|
||||
"u": "A",
|
||||
"d": 2
|
||||
},
|
||||
"Power DC": {
|
||||
"v": 73.59999847,
|
||||
"u": "W",
|
||||
"d": 2
|
||||
},
|
||||
"YieldDay": {
|
||||
"v": 48,
|
||||
"u": "Wh",
|
||||
"d": 2
|
||||
},
|
||||
"YieldTotal": {
|
||||
"v": 48.5399971,
|
||||
"u": "kWh",
|
||||
"d": 2
|
||||
},
|
||||
"Frequency": {
|
||||
"v": 50.02000046,
|
||||
"u": "Hz",
|
||||
"d": 2
|
||||
},
|
||||
"Temperature": {
|
||||
"v": 11.39999962,
|
||||
"u": "°C",
|
||||
"d": 1
|
||||
},
|
||||
"PowerFactor": {
|
||||
"v": 1,
|
||||
"u": "",
|
||||
"d": 3
|
||||
},
|
||||
"ReactivePower": {
|
||||
"v": 0.100000001,
|
||||
"u": "var",
|
||||
"d": 1
|
||||
},
|
||||
"Efficiency": {
|
||||
"v": 95.24456024,
|
||||
"u": "%",
|
||||
"d": 2
|
||||
"serial": "114171603548",
|
||||
"name": "test",
|
||||
"data_age": 7038,
|
||||
"reachable": false,
|
||||
"producing": false,
|
||||
"limit_relative": 0,
|
||||
"limit_absolute": -1,
|
||||
"AC": {
|
||||
"0": {
|
||||
"Power": {
|
||||
"v": 0,
|
||||
"u": "W",
|
||||
"d": 1
|
||||
},
|
||||
"Voltage": {
|
||||
"v": 0,
|
||||
"u": "V",
|
||||
"d": 1
|
||||
},
|
||||
"Current": {
|
||||
"v": 0,
|
||||
"u": "A",
|
||||
"d": 2
|
||||
},
|
||||
"Power DC": {
|
||||
"v": 0,
|
||||
"u": "W",
|
||||
"d": 1
|
||||
},
|
||||
"YieldDay": {
|
||||
"v": 0,
|
||||
"u": "Wh",
|
||||
"d": 0
|
||||
},
|
||||
"YieldTotal": {
|
||||
"v": 0,
|
||||
"u": "kWh",
|
||||
"d": 3
|
||||
},
|
||||
"Frequency": {
|
||||
"v": 0,
|
||||
"u": "Hz",
|
||||
"d": 2
|
||||
},
|
||||
"PowerFactor": {
|
||||
"v": 0,
|
||||
"u": "",
|
||||
"d": 3
|
||||
},
|
||||
"ReactivePower": {
|
||||
"v": 0,
|
||||
"u": "var",
|
||||
"d": 1
|
||||
},
|
||||
"Efficiency": {
|
||||
"v": 0,
|
||||
"u": "%",
|
||||
"d": 3
|
||||
}
|
||||
}
|
||||
},
|
||||
"1": {
|
||||
"Power": {
|
||||
"v": 36.5,
|
||||
"u": "W",
|
||||
"d": 1
|
||||
"DC": {
|
||||
"0": {
|
||||
"name": {
|
||||
"u": "test 1"
|
||||
},
|
||||
"Power": {
|
||||
"v": 0,
|
||||
"u": "W",
|
||||
"d": 1
|
||||
},
|
||||
"Voltage": {
|
||||
"v": 0,
|
||||
"u": "V",
|
||||
"d": 1
|
||||
},
|
||||
"Current": {
|
||||
"v": 0,
|
||||
"u": "A",
|
||||
"d": 2
|
||||
},
|
||||
"YieldDay": {
|
||||
"v": 0,
|
||||
"u": "Wh",
|
||||
"d": 0
|
||||
},
|
||||
"YieldTotal": {
|
||||
"v": 0,
|
||||
"u": "kWh",
|
||||
"d": 3
|
||||
},
|
||||
"Irradiation": {
|
||||
"v": 0,
|
||||
"u": "%",
|
||||
"d": 3
|
||||
}
|
||||
},
|
||||
"Voltage": {
|
||||
"v": 39.09999847,
|
||||
"u": "V",
|
||||
"d": 1
|
||||
},
|
||||
"Current": {
|
||||
"v": 0.930000007,
|
||||
"u": "A",
|
||||
"d": 2
|
||||
},
|
||||
"YieldDay": {
|
||||
"v": 31,
|
||||
"u": "Wh",
|
||||
"d": 0
|
||||
},
|
||||
"YieldTotal": {
|
||||
"v": 4.301000118,
|
||||
"u": "kWh",
|
||||
"d": 3
|
||||
},
|
||||
"Irradiation": {
|
||||
"v": 8.902439117,
|
||||
"u": "%",
|
||||
"d": 2
|
||||
"1": {
|
||||
"name": {
|
||||
"u": "test 2"
|
||||
},
|
||||
"Power": {
|
||||
"v": 0,
|
||||
"u": "W",
|
||||
"d": 1
|
||||
},
|
||||
"Voltage": {
|
||||
"v": 0,
|
||||
"u": "V",
|
||||
"d": 1
|
||||
},
|
||||
"Current": {
|
||||
"v": 0,
|
||||
"u": "A",
|
||||
"d": 2
|
||||
},
|
||||
"YieldDay": {
|
||||
"v": 0,
|
||||
"u": "Wh",
|
||||
"d": 0
|
||||
},
|
||||
"YieldTotal": {
|
||||
"v": 0,
|
||||
"u": "kWh",
|
||||
"d": 3
|
||||
},
|
||||
"Irradiation": {
|
||||
"v": 0,
|
||||
"u": "%",
|
||||
"d": 3
|
||||
}
|
||||
}
|
||||
},
|
||||
"2": {
|
||||
"Power": {
|
||||
"v": 37.09999847,
|
||||
"u": "W",
|
||||
"d": 1
|
||||
},
|
||||
"Voltage": {
|
||||
"v": 40.79999924,
|
||||
"u": "V",
|
||||
"d": 1
|
||||
},
|
||||
"Current": {
|
||||
"v": 0.910000026,
|
||||
"u": "A",
|
||||
"d": 2
|
||||
},
|
||||
"YieldDay": {
|
||||
"v": 17,
|
||||
"u": "Wh",
|
||||
"d": 0
|
||||
},
|
||||
"YieldTotal": {
|
||||
"v": 44.23899841,
|
||||
"u": "kWh",
|
||||
"d": 3
|
||||
},
|
||||
"Irradiation": {
|
||||
"v": 9.048780441,
|
||||
"u": "%",
|
||||
"d": 2
|
||||
"INV": {
|
||||
"0": {
|
||||
"Temperature": {
|
||||
"v": 0,
|
||||
"u": "°C",
|
||||
"d": 1
|
||||
}
|
||||
}
|
||||
},
|
||||
"events": 1
|
||||
"events": 0
|
||||
}
|
||||
],
|
||||
"total": {
|
||||
"Power": {
|
||||
"v": 140.7999878,
|
||||
"v": 0,
|
||||
"u": "W",
|
||||
"d": 1
|
||||
},
|
||||
"YieldDay": {
|
||||
"v": 71,
|
||||
"v": 0,
|
||||
"u": "Wh",
|
||||
"d": 0
|
||||
},
|
||||
"YieldTotal": {
|
||||
"v": 199.0449982,
|
||||
"v": 0,
|
||||
"u": "kWh",
|
||||
"d": 2
|
||||
}
|
||||
},
|
||||
"hints": {
|
||||
"time_sync": false,
|
||||
"radio_problem": false,
|
||||
"default_password": false
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@ -25,7 +25,7 @@ enum {
|
||||
const char* const stateClasses[] = { 0, "measurement", "total_increasing" };
|
||||
|
||||
typedef struct {
|
||||
uint8_t fieldId; // field id
|
||||
FieldId_t fieldId; // field id
|
||||
uint8_t deviceClsId; // device class
|
||||
uint8_t stateClsId; // state class
|
||||
} byteAssign_fieldDeviceClass_t;
|
||||
@ -57,7 +57,7 @@ public:
|
||||
|
||||
private:
|
||||
void publish(const String& subtopic, const String& payload);
|
||||
void publishField(std::shared_ptr<InverterAbstract> inv, uint8_t channel, byteAssign_fieldDeviceClass_t fieldType, bool clear = false);
|
||||
void publishField(std::shared_ptr<InverterAbstract> inv, ChannelType_t type, ChannelNum_t channel, byteAssign_fieldDeviceClass_t fieldType, bool clear = false);
|
||||
void publishInverterButton(std::shared_ptr<InverterAbstract> inv, const char* caption, const char* icon, const char* category, const char* deviceClass, const char* subTopic, const char* payload);
|
||||
void publishInverterNumber(std::shared_ptr<InverterAbstract> inv, const char* caption, const char* icon, const char* category, const char* commandTopic, const char* stateTopic, const char* unitOfMeasure, int16_t min = 1, int16_t max = 100);
|
||||
void publishInverterBinarySensor(std::shared_ptr<InverterAbstract> inv, const char* caption, const char* subTopic, const char* payload_on, const char* payload_off);
|
||||
|
||||
@ -10,16 +10,16 @@ public:
|
||||
void init();
|
||||
void loop();
|
||||
|
||||
static String getTopic(std::shared_ptr<InverterAbstract> inv, uint8_t channel, uint8_t fieldId);
|
||||
static String getTopic(std::shared_ptr<InverterAbstract> inv, ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId);
|
||||
|
||||
private:
|
||||
void publishField(std::shared_ptr<InverterAbstract> inv, uint8_t channel, uint8_t fieldId);
|
||||
void publishField(std::shared_ptr<InverterAbstract> inv, ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId);
|
||||
void onMqttMessage(const espMqttClientTypes::MessageProperties& properties, const char* topic, const uint8_t* payload, size_t len, size_t index, size_t total);
|
||||
|
||||
uint32_t _lastPublishStats[INV_MAX_COUNT];
|
||||
uint32_t _lastPublish;
|
||||
|
||||
uint8_t _publishFields[14] = {
|
||||
FieldId_t _publishFields[14] = {
|
||||
FLD_UDC,
|
||||
FLD_IDC,
|
||||
FLD_PDC,
|
||||
|
||||
@ -12,7 +12,7 @@ public:
|
||||
private:
|
||||
void onPrometheusMetricsGet(AsyncWebServerRequest* request);
|
||||
|
||||
void addField(AsyncResponseStream* stream, String& serial, uint8_t idx, std::shared_ptr<InverterAbstract> inv, uint8_t channel, uint8_t fieldId, const char* channelName = NULL);
|
||||
void addField(AsyncResponseStream* stream, String& serial, uint8_t idx, std::shared_ptr<InverterAbstract> inv, ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId, const char* channelName = NULL);
|
||||
|
||||
AsyncWebServer* _server;
|
||||
};
|
||||
@ -13,7 +13,7 @@ public:
|
||||
|
||||
private:
|
||||
void generateJsonResponse(JsonVariant& root);
|
||||
void addField(JsonObject& root, uint8_t idx, std::shared_ptr<InverterAbstract> inv, uint8_t channel, uint8_t fieldId, String topic = "");
|
||||
void addField(JsonObject& root, uint8_t idx, std::shared_ptr<InverterAbstract> inv, ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId, String topic = "");
|
||||
void addTotalField(JsonObject& root, String name, float value, String unit, uint8_t digits);
|
||||
void onLivedataStatus(AsyncWebServerRequest* request);
|
||||
void onWebsocketEvent(AsyncWebSocket* server, AsyncWebSocketClient* client, AwsEventType type, void* arg, uint8_t* data, size_t len);
|
||||
|
||||
@ -32,12 +32,7 @@ String HM_1CH::typeName()
|
||||
return F("HM-300, HM-350, HM-400");
|
||||
}
|
||||
|
||||
const byteAssign_t* HM_1CH::getByteAssignment()
|
||||
const std::list<byteAssign_t>* HM_1CH::getByteAssignment()
|
||||
{
|
||||
return byteAssignment;
|
||||
}
|
||||
|
||||
uint8_t HM_1CH::getAssignmentCount()
|
||||
{
|
||||
return sizeof(byteAssignment) / sizeof(byteAssign_t);
|
||||
return &byteAssignment;
|
||||
}
|
||||
@ -2,35 +2,37 @@
|
||||
#pragma once
|
||||
|
||||
#include "HM_Abstract.h"
|
||||
#include <list>
|
||||
|
||||
class HM_1CH : public HM_Abstract {
|
||||
public:
|
||||
explicit HM_1CH(uint64_t serial);
|
||||
static bool isValidSerial(uint64_t serial);
|
||||
String typeName();
|
||||
const byteAssign_t* getByteAssignment();
|
||||
uint8_t getAssignmentCount();
|
||||
const std::list<byteAssign_t>* getByteAssignment();
|
||||
|
||||
private:
|
||||
const byteAssign_t byteAssignment[18] = {
|
||||
{ CH1, FLD_UDC, UNIT_V, 2, 2, 10, false, 1 },
|
||||
{ CH1, FLD_IDC, UNIT_A, 4, 2, 100, false, 2 },
|
||||
{ CH1, FLD_PDC, UNIT_W, 6, 2, 10, false, 1 },
|
||||
{ CH1, FLD_YD, UNIT_WH, 12, 2, 1, false, 0 },
|
||||
{ CH1, FLD_YT, UNIT_KWH, 8, 4, 1000, false, 3 },
|
||||
{ CH1, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH1, CMD_CALC, false, 3 },
|
||||
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 },
|
||||
|
||||
{ CH0, FLD_UAC, UNIT_V, 14, 2, 10, false, 1 },
|
||||
{ CH0, FLD_IAC, UNIT_A, 22, 2, 100, false, 2 },
|
||||
{ CH0, FLD_PAC, UNIT_W, 18, 2, 10, false, 1 },
|
||||
{ CH0, FLD_PRA, UNIT_VA, 20, 2, 10, false, 1 },
|
||||
{ CH0, FLD_F, UNIT_HZ, 16, 2, 100, false, 2 },
|
||||
{ CH0, FLD_PF, UNIT_NONE, 24, 2, 1000, false, 3 },
|
||||
{ CH0, FLD_T, UNIT_C, 26, 2, 10, true, 1 },
|
||||
{ CH0, FLD_EVT_LOG, UNIT_NONE, 28, 2, 1, false, 0 },
|
||||
{ CH0, FLD_YD, UNIT_WH, CALC_YD_CH0, 0, CMD_CALC, false, 0 },
|
||||
{ CH0, FLD_YT, UNIT_KWH, CALC_YT_CH0, 0, CMD_CALC, false, 3 },
|
||||
{ CH0, FLD_PDC, UNIT_W, CALC_PDC_CH0, 0, CMD_CALC, false, 1 },
|
||||
{ CH0, FLD_EFF, UNIT_PCT, CALC_EFF_CH0, 0, 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 }
|
||||
};
|
||||
};
|
||||
@ -33,12 +33,7 @@ String HM_2CH::typeName()
|
||||
return F("HM-600, HM-700, HM-800");
|
||||
}
|
||||
|
||||
const byteAssign_t* HM_2CH::getByteAssignment()
|
||||
const std::list<byteAssign_t>* HM_2CH::getByteAssignment()
|
||||
{
|
||||
return byteAssignment;
|
||||
}
|
||||
|
||||
uint8_t HM_2CH::getAssignmentCount()
|
||||
{
|
||||
return sizeof(byteAssignment) / sizeof(byteAssign_t);
|
||||
return &byteAssignment;
|
||||
}
|
||||
@ -8,36 +8,37 @@ public:
|
||||
explicit HM_2CH(uint64_t serial);
|
||||
static bool isValidSerial(uint64_t serial);
|
||||
String typeName();
|
||||
const byteAssign_t* getByteAssignment();
|
||||
uint8_t getAssignmentCount();
|
||||
const std::list<byteAssign_t>* getByteAssignment();
|
||||
|
||||
private:
|
||||
const byteAssign_t byteAssignment[24] = {
|
||||
{ CH1, FLD_UDC, UNIT_V, 2, 2, 10, false, 1 },
|
||||
{ CH1, FLD_IDC, UNIT_A, 4, 2, 100, false, 2 },
|
||||
{ CH1, FLD_PDC, UNIT_W, 6, 2, 10, false, 1 },
|
||||
{ CH1, FLD_YD, UNIT_WH, 22, 2, 1, false, 0 },
|
||||
{ CH1, FLD_YT, UNIT_KWH, 14, 4, 1000, false, 3 },
|
||||
{ CH1, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH1, CMD_CALC, false, 3 },
|
||||
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 },
|
||||
|
||||
{ CH2, FLD_UDC, UNIT_V, 8, 2, 10, false, 1 },
|
||||
{ CH2, FLD_IDC, UNIT_A, 10, 2, 100, false, 2 },
|
||||
{ CH2, FLD_PDC, UNIT_W, 12, 2, 10, false, 1 },
|
||||
{ CH2, FLD_YD, UNIT_WH, 24, 2, 1, false, 0 },
|
||||
{ CH2, FLD_YT, UNIT_KWH, 18, 4, 1000, false, 3 },
|
||||
{ CH2, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH2, 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 },
|
||||
|
||||
{ CH0, FLD_UAC, UNIT_V, 26, 2, 10, false, 1 },
|
||||
{ CH0, FLD_IAC, UNIT_A, 34, 2, 100, false, 2 },
|
||||
{ CH0, FLD_PAC, UNIT_W, 30, 2, 10, false, 1 },
|
||||
{ CH0, FLD_PRA, UNIT_VA, 32, 2, 10, false, 1 },
|
||||
{ CH0, FLD_F, UNIT_HZ, 28, 2, 100, false, 2 },
|
||||
{ CH0, FLD_PF, UNIT_NONE, 36, 2, 1000, false, 3 },
|
||||
{ CH0, FLD_T, UNIT_C, 38, 2, 10, true, 1 },
|
||||
{ CH0, FLD_EVT_LOG, UNIT_NONE, 40, 2, 1, false, 0 },
|
||||
{ CH0, FLD_YD, UNIT_WH, CALC_YD_CH0, 0, CMD_CALC, false, 0 },
|
||||
{ CH0, FLD_YT, UNIT_KWH, CALC_YT_CH0, 0, CMD_CALC, false, 3 },
|
||||
{ CH0, FLD_PDC, UNIT_W, CALC_PDC_CH0, 0, CMD_CALC, false, 1 },
|
||||
{ CH0, FLD_EFF, UNIT_PCT, CALC_EFF_CH0, 0, 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 }
|
||||
};
|
||||
};
|
||||
@ -32,12 +32,7 @@ String HM_4CH::typeName()
|
||||
return F("HM-1000, HM-1200, HM-1500");
|
||||
}
|
||||
|
||||
const byteAssign_t* HM_4CH::getByteAssignment()
|
||||
const std::list<byteAssign_t>* HM_4CH::getByteAssignment()
|
||||
{
|
||||
return byteAssignment;
|
||||
}
|
||||
|
||||
uint8_t HM_4CH::getAssignmentCount()
|
||||
{
|
||||
return sizeof(byteAssignment) / sizeof(byteAssign_t);
|
||||
return &byteAssignment;
|
||||
}
|
||||
@ -8,50 +8,51 @@ public:
|
||||
explicit HM_4CH(uint64_t serial);
|
||||
static bool isValidSerial(uint64_t serial);
|
||||
String typeName();
|
||||
const byteAssign_t* getByteAssignment();
|
||||
uint8_t getAssignmentCount();
|
||||
const std::list<byteAssign_t>* getByteAssignment();
|
||||
|
||||
private:
|
||||
const byteAssign_t byteAssignment[36] = {
|
||||
{ CH1, FLD_UDC, UNIT_V, 2, 2, 10, false, 1 },
|
||||
{ CH1, FLD_IDC, UNIT_A, 4, 2, 100, false, 2 },
|
||||
{ CH1, FLD_PDC, UNIT_W, 8, 2, 10, false, 1 },
|
||||
{ CH1, FLD_YD, UNIT_WH, 20, 2, 1, false, 0 },
|
||||
{ CH1, FLD_YT, UNIT_KWH, 12, 4, 1000, false, 3 },
|
||||
{ CH1, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH1, CMD_CALC, false, 3 },
|
||||
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 },
|
||||
|
||||
{ CH2, FLD_UDC, UNIT_V, CALC_UDC_CH, CH1, CMD_CALC, false, 1 },
|
||||
{ CH2, FLD_IDC, UNIT_A, 6, 2, 100, false, 2 },
|
||||
{ CH2, FLD_PDC, UNIT_W, 10, 2, 10, false, 1 },
|
||||
{ CH2, FLD_YD, UNIT_WH, 22, 2, 1, false, 0 },
|
||||
{ CH2, FLD_YT, UNIT_KWH, 16, 4, 1000, false, 3 },
|
||||
{ CH2, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH2, 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 },
|
||||
|
||||
{ CH3, FLD_UDC, UNIT_V, 24, 2, 10, false, 1 },
|
||||
{ CH3, FLD_IDC, UNIT_A, 26, 2, 100, false, 2 },
|
||||
{ CH3, FLD_PDC, UNIT_W, 30, 2, 10, false, 1 },
|
||||
{ CH3, FLD_YD, UNIT_WH, 42, 2, 1, false, 0 },
|
||||
{ CH3, FLD_YT, UNIT_KWH, 34, 4, 1000, false, 3 },
|
||||
{ CH3, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH3, 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 },
|
||||
|
||||
{ CH4, FLD_UDC, UNIT_V, CALC_UDC_CH, CH3, CMD_CALC, false, 1 },
|
||||
{ CH4, FLD_IDC, UNIT_A, 28, 2, 100, false, 2 },
|
||||
{ CH4, FLD_PDC, UNIT_W, 32, 2, 10, false, 1 },
|
||||
{ CH4, FLD_YD, UNIT_WH, 44, 2, 1, false, 0 },
|
||||
{ CH4, FLD_YT, UNIT_KWH, 38, 4, 1000, false, 3 },
|
||||
{ CH4, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH4, 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 },
|
||||
|
||||
{ CH0, FLD_UAC, UNIT_V, 46, 2, 10, false, 1 },
|
||||
{ CH0, FLD_IAC, UNIT_A, 54, 2, 100, false, 2 },
|
||||
{ CH0, FLD_PAC, UNIT_W, 50, 2, 10, false, 1 },
|
||||
{ CH0, FLD_PRA, UNIT_VA, 52, 2, 10, false, 1 },
|
||||
{ CH0, FLD_F, UNIT_HZ, 48, 2, 100, false, 2 },
|
||||
{ CH0, FLD_PF, UNIT_NONE, 56, 2, 1000, false, 3 },
|
||||
{ CH0, FLD_T, UNIT_C, 58, 2, 10, true, 1 },
|
||||
{ CH0, FLD_EVT_LOG, UNIT_NONE, 60, 2, 1, false, 0 },
|
||||
{ CH0, FLD_YD, UNIT_WH, CALC_YD_CH0, 0, CMD_CALC, false, 0 },
|
||||
{ CH0, FLD_YT, UNIT_KWH, CALC_YT_CH0, 0, CMD_CALC, false, 3 },
|
||||
{ CH0, FLD_PDC, UNIT_W, CALC_PDC_CH0, 0, CMD_CALC, false, 1 },
|
||||
{ CH0, FLD_EFF, UNIT_PCT, CALC_EFF_CH0, 0, 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 }
|
||||
};
|
||||
};
|
||||
@ -40,14 +40,14 @@ bool HM_Abstract::sendAlarmLogRequest(HoymilesRadio* radio, bool force)
|
||||
}
|
||||
|
||||
if (!force) {
|
||||
if (Statistics()->hasChannelFieldValue(CH0, FLD_EVT_LOG)) {
|
||||
if ((uint8_t)Statistics()->getChannelFieldValue(CH0, FLD_EVT_LOG) == _lastAlarmLogCnt) {
|
||||
if (Statistics()->hasChannelFieldValue(TYPE_INV, CH0, FLD_EVT_LOG)) {
|
||||
if ((uint8_t)Statistics()->getChannelFieldValue(TYPE_INV, CH0, FLD_EVT_LOG) == _lastAlarmLogCnt) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_lastAlarmLogCnt = (uint8_t)Statistics()->getChannelFieldValue(CH0, FLD_EVT_LOG);
|
||||
_lastAlarmLogCnt = (uint8_t)Statistics()->getChannelFieldValue(TYPE_INV, CH0, FLD_EVT_LOG);
|
||||
|
||||
time_t now;
|
||||
time(&now);
|
||||
|
||||
@ -30,7 +30,7 @@ void InverterAbstract::init()
|
||||
// Not possible in constructor --> virtual function
|
||||
// Not possible in verifyAllFragments --> Because no data if nothing is ever received
|
||||
// It has to be executed because otherwise the getChannelCount method in stats always returns 0
|
||||
_statisticsParser.get()->setByteAssignment(getByteAssignment(), getAssignmentCount());
|
||||
_statisticsParser.get()->setByteAssignment(getByteAssignment());
|
||||
}
|
||||
|
||||
uint64_t InverterAbstract::serial()
|
||||
@ -60,11 +60,14 @@ const char* InverterAbstract::name()
|
||||
|
||||
bool InverterAbstract::isProducing()
|
||||
{
|
||||
if (!Statistics()->hasChannelFieldValue(CH0, FLD_PAC)) {
|
||||
return false;
|
||||
float totalAc = 0;
|
||||
for (auto& c : Statistics()->getChannelsByType(TYPE_AC)) {
|
||||
if (Statistics()->hasChannelFieldValue(TYPE_AC, c, FLD_PAC)) {
|
||||
totalAc += Statistics()->getChannelFieldValue(TYPE_AC, c, FLD_PAC);
|
||||
}
|
||||
}
|
||||
|
||||
return Statistics()->getChannelFieldValue(CH0, FLD_PAC) > 0;
|
||||
return totalAc > 0;
|
||||
}
|
||||
|
||||
bool InverterAbstract::isReachable()
|
||||
|
||||
@ -11,6 +11,7 @@
|
||||
#include "types.h"
|
||||
#include <Arduino.h>
|
||||
#include <cstdint>
|
||||
#include <list>
|
||||
|
||||
#define MAX_NAME_LENGTH 32
|
||||
|
||||
@ -38,8 +39,7 @@ public:
|
||||
void setName(const char* name);
|
||||
const char* name();
|
||||
virtual String typeName() = 0;
|
||||
virtual const byteAssign_t* getByteAssignment() = 0;
|
||||
virtual uint8_t getAssignmentCount() = 0;
|
||||
virtual const std::list<byteAssign_t>* getByteAssignment() = 0;
|
||||
|
||||
bool isProducing();
|
||||
bool isReachable();
|
||||
|
||||
@ -28,10 +28,9 @@ const calcFunc_t calcFunctions[] = {
|
||||
{ CALC_IRR_CH, &calcIrradiation }
|
||||
};
|
||||
|
||||
void StatisticsParser::setByteAssignment(const byteAssign_t* byteAssignment, const uint8_t count)
|
||||
void StatisticsParser::setByteAssignment(const std::list<byteAssign_t>* byteAssignment)
|
||||
{
|
||||
_byteAssignment = byteAssignment;
|
||||
_byteAssignmentCount = count;
|
||||
}
|
||||
|
||||
void StatisticsParser::clearBuffer()
|
||||
@ -50,31 +49,26 @@ void StatisticsParser::appendFragment(uint8_t offset, uint8_t* payload, uint8_t
|
||||
_statisticLength += len;
|
||||
}
|
||||
|
||||
uint8_t StatisticsParser::getAssignIdxByChannelField(uint8_t channel, uint8_t fieldId)
|
||||
const byteAssign_t* StatisticsParser::getAssignmentByChannelField(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId)
|
||||
{
|
||||
const byteAssign_t* b = _byteAssignment;
|
||||
|
||||
uint8_t pos;
|
||||
for (pos = 0; pos < _byteAssignmentCount; pos++) {
|
||||
if (b[pos].ch == channel && b[pos].fieldId == fieldId) {
|
||||
return pos;
|
||||
for (auto const& i : *_byteAssignment) {
|
||||
if (i.type == type && i.ch == channel && i.fieldId == fieldId) {
|
||||
return &i;
|
||||
}
|
||||
}
|
||||
return 0xff;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
float StatisticsParser::getChannelFieldValue(uint8_t channel, uint8_t fieldId)
|
||||
float StatisticsParser::getChannelFieldValue(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId)
|
||||
{
|
||||
uint8_t pos = getAssignIdxByChannelField(channel, fieldId);
|
||||
if (pos == 0xff) {
|
||||
const byteAssign_t* pos = getAssignmentByChannelField(type, channel, fieldId);
|
||||
if (pos == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const byteAssign_t* b = _byteAssignment;
|
||||
|
||||
uint8_t ptr = b[pos].start;
|
||||
uint8_t end = ptr + b[pos].num;
|
||||
uint16_t div = b[pos].div;
|
||||
uint8_t ptr = pos->start;
|
||||
uint8_t end = ptr + pos->num;
|
||||
uint16_t div = pos->div;
|
||||
|
||||
if (CMD_CALC != div) {
|
||||
// Value is a static value
|
||||
@ -85,9 +79,9 @@ float StatisticsParser::getChannelFieldValue(uint8_t channel, uint8_t fieldId)
|
||||
} while (++ptr != end);
|
||||
|
||||
float result;
|
||||
if (b[pos].isSigned && b[pos].num == 2) {
|
||||
if (pos->isSigned && pos->num == 2) {
|
||||
result = static_cast<float>(static_cast<int16_t>(val));
|
||||
} else if (b[pos].isSigned && b[pos].num == 4) {
|
||||
} else if (pos->isSigned && pos->num == 4) {
|
||||
result = static_cast<float>(static_cast<int32_t>(val));
|
||||
} else {
|
||||
result = static_cast<float>(val);
|
||||
@ -97,62 +91,71 @@ float StatisticsParser::getChannelFieldValue(uint8_t channel, uint8_t fieldId)
|
||||
return result;
|
||||
} else {
|
||||
// Value has to be calculated
|
||||
return calcFunctions[b[pos].start].func(this, b[pos].num);
|
||||
return calcFunctions[pos->start].func(this, pos->num);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool StatisticsParser::hasChannelFieldValue(uint8_t channel, uint8_t fieldId)
|
||||
bool StatisticsParser::hasChannelFieldValue(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId)
|
||||
{
|
||||
uint8_t pos = getAssignIdxByChannelField(channel, fieldId);
|
||||
return pos != 0xff;
|
||||
const byteAssign_t* pos = getAssignmentByChannelField(type, channel, fieldId);
|
||||
return pos != NULL;
|
||||
}
|
||||
|
||||
const char* StatisticsParser::getChannelFieldUnit(uint8_t channel, uint8_t fieldId)
|
||||
const char* StatisticsParser::getChannelFieldUnit(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId)
|
||||
{
|
||||
uint8_t pos = getAssignIdxByChannelField(channel, fieldId);
|
||||
const byteAssign_t* b = _byteAssignment;
|
||||
|
||||
return units[b[pos].unitId];
|
||||
const byteAssign_t* pos = getAssignmentByChannelField(type, channel, fieldId);
|
||||
return units[pos->unitId];
|
||||
}
|
||||
|
||||
const char* StatisticsParser::getChannelFieldName(uint8_t channel, uint8_t fieldId)
|
||||
const char* StatisticsParser::getChannelFieldName(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId)
|
||||
{
|
||||
uint8_t pos = getAssignIdxByChannelField(channel, fieldId);
|
||||
const byteAssign_t* b = _byteAssignment;
|
||||
|
||||
return fields[b[pos].fieldId];
|
||||
const byteAssign_t* pos = getAssignmentByChannelField(type, channel, fieldId);
|
||||
return fields[pos->fieldId];
|
||||
}
|
||||
|
||||
uint8_t StatisticsParser::getChannelFieldDigits(uint8_t channel, uint8_t fieldId)
|
||||
uint8_t StatisticsParser::getChannelFieldDigits(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId)
|
||||
{
|
||||
uint8_t pos = getAssignIdxByChannelField(channel, fieldId);
|
||||
return _byteAssignment[pos].digits;
|
||||
const byteAssign_t* pos = getAssignmentByChannelField(type, channel, fieldId);
|
||||
return pos->digits;
|
||||
}
|
||||
|
||||
uint8_t StatisticsParser::getChannelCount()
|
||||
std::list<ChannelType_t> StatisticsParser::getChannelTypes()
|
||||
{
|
||||
const byteAssign_t* b = _byteAssignment;
|
||||
uint8_t cnt = 0;
|
||||
for (uint8_t pos = 0; pos < _byteAssignmentCount; pos++) {
|
||||
if (b[pos].ch > cnt) {
|
||||
cnt = b[pos].ch;
|
||||
return {
|
||||
TYPE_AC,
|
||||
TYPE_DC,
|
||||
TYPE_INV
|
||||
};
|
||||
}
|
||||
|
||||
const char* StatisticsParser::getChannelTypeName(ChannelType_t type)
|
||||
{
|
||||
return channelsTypes[type];
|
||||
}
|
||||
|
||||
std::list<ChannelNum_t> StatisticsParser::getChannelsByType(ChannelType_t type)
|
||||
{
|
||||
std::list<ChannelNum_t> l;
|
||||
for (auto const& b : *_byteAssignment) {
|
||||
if (b.type == type) {
|
||||
l.push_back(b.ch);
|
||||
}
|
||||
}
|
||||
|
||||
return cnt;
|
||||
l.unique();
|
||||
return l;
|
||||
}
|
||||
|
||||
uint16_t StatisticsParser::getChannelMaxPower(uint8_t channel)
|
||||
uint16_t StatisticsParser::getStringMaxPower(uint8_t channel)
|
||||
{
|
||||
return _chanMaxPower[channel];
|
||||
return _stringMaxPower[channel];
|
||||
}
|
||||
|
||||
void StatisticsParser::setChannelMaxPower(uint8_t channel, uint16_t power)
|
||||
void StatisticsParser::setStringMaxPower(uint8_t channel, uint16_t power)
|
||||
{
|
||||
if (channel < CH4) {
|
||||
_chanMaxPower[channel] = power;
|
||||
if (channel < sizeof(_stringMaxPower) / sizeof(_stringMaxPower[0])) {
|
||||
_stringMaxPower[channel] = power;
|
||||
}
|
||||
}
|
||||
|
||||
@ -174,8 +177,8 @@ uint32_t StatisticsParser::getRxFailureCount()
|
||||
static float calcYieldTotalCh0(StatisticsParser* iv, uint8_t arg0)
|
||||
{
|
||||
float yield = 0;
|
||||
for (uint8_t i = 1; i <= iv->getChannelCount(); i++) {
|
||||
yield += iv->getChannelFieldValue(i, FLD_YT);
|
||||
for (auto& channel : iv->getChannelsByType(TYPE_DC)) {
|
||||
yield += iv->getChannelFieldValue(TYPE_DC, channel, FLD_YT);
|
||||
}
|
||||
return yield;
|
||||
}
|
||||
@ -183,8 +186,8 @@ static float calcYieldTotalCh0(StatisticsParser* iv, uint8_t arg0)
|
||||
static float calcYieldDayCh0(StatisticsParser* iv, uint8_t arg0)
|
||||
{
|
||||
float yield = 0;
|
||||
for (uint8_t i = 1; i <= iv->getChannelCount(); i++) {
|
||||
yield += iv->getChannelFieldValue(i, FLD_YD);
|
||||
for (auto& channel : iv->getChannelsByType(TYPE_DC)) {
|
||||
yield += iv->getChannelFieldValue(TYPE_DC, channel, FLD_YD);
|
||||
}
|
||||
return yield;
|
||||
}
|
||||
@ -192,14 +195,14 @@ static float calcYieldDayCh0(StatisticsParser* iv, uint8_t arg0)
|
||||
// arg0 = channel of source
|
||||
static float calcUdcCh(StatisticsParser* iv, uint8_t arg0)
|
||||
{
|
||||
return iv->getChannelFieldValue(arg0, FLD_UDC);
|
||||
return iv->getChannelFieldValue(TYPE_DC, static_cast<ChannelNum_t>(arg0), FLD_UDC);
|
||||
}
|
||||
|
||||
static float calcPowerDcCh0(StatisticsParser* iv, uint8_t arg0)
|
||||
{
|
||||
float dcPower = 0;
|
||||
for (uint8_t i = 1; i <= iv->getChannelCount(); i++) {
|
||||
dcPower += iv->getChannelFieldValue(i, FLD_PDC);
|
||||
for (auto& channel : iv->getChannelsByType(TYPE_DC)) {
|
||||
dcPower += iv->getChannelFieldValue(TYPE_DC, channel, FLD_PDC);
|
||||
}
|
||||
return dcPower;
|
||||
}
|
||||
@ -207,15 +210,19 @@ static float calcPowerDcCh0(StatisticsParser* iv, uint8_t arg0)
|
||||
// arg0 = channel
|
||||
static float calcEffiencyCh0(StatisticsParser* iv, uint8_t arg0)
|
||||
{
|
||||
float acPower = iv->getChannelFieldValue(CH0, FLD_PAC);
|
||||
float dcPower = 0;
|
||||
for (uint8_t i = 1; i <= iv->getChannelCount(); i++) {
|
||||
dcPower += iv->getChannelFieldValue(i, FLD_PDC);
|
||||
float acPower = 0;
|
||||
for (auto& channel : iv->getChannelsByType(TYPE_AC)) {
|
||||
acPower += iv->getChannelFieldValue(TYPE_AC, channel, FLD_PAC);
|
||||
}
|
||||
|
||||
float dcPower = 0;
|
||||
for (auto& channel : iv->getChannelsByType(TYPE_DC)) {
|
||||
dcPower += iv->getChannelFieldValue(TYPE_DC, channel, FLD_PDC);
|
||||
}
|
||||
|
||||
if (dcPower > 0) {
|
||||
return acPower / dcPower * 100.0f;
|
||||
}
|
||||
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
@ -223,8 +230,8 @@ static float calcEffiencyCh0(StatisticsParser* iv, uint8_t arg0)
|
||||
static float calcIrradiation(StatisticsParser* iv, uint8_t arg0)
|
||||
{
|
||||
if (NULL != iv) {
|
||||
if (iv->getChannelMaxPower(arg0 - 1) > 0)
|
||||
return iv->getChannelFieldValue(arg0, FLD_PDC) / iv->getChannelMaxPower(arg0 - 1) * 100.0f;
|
||||
if (iv->getStringMaxPower(arg0) > 0)
|
||||
return iv->getChannelFieldValue(TYPE_DC, static_cast<ChannelNum_t>(arg0), FLD_PDC) / iv->getStringMaxPower(arg0) * 100.0f;
|
||||
}
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
@ -3,11 +3,12 @@
|
||||
#include "Parser.h"
|
||||
#include <Arduino.h>
|
||||
#include <cstdint>
|
||||
#include <list>
|
||||
|
||||
#define STATISTIC_PACKET_SIZE (4 * 16)
|
||||
|
||||
// units
|
||||
enum {
|
||||
enum UnitId_t {
|
||||
UNIT_V = 0,
|
||||
UNIT_A,
|
||||
UNIT_W,
|
||||
@ -22,7 +23,7 @@ enum {
|
||||
const char* const units[] = { "V", "A", "W", "Wh", "kWh", "Hz", "°C", "%", "var", "" };
|
||||
|
||||
// field types
|
||||
enum {
|
||||
enum FieldId_t {
|
||||
FLD_UDC = 0,
|
||||
FLD_IDC,
|
||||
FLD_PDC,
|
||||
@ -54,7 +55,7 @@ enum {
|
||||
enum { CMD_CALC = 0xffff };
|
||||
|
||||
// CH0 is default channel (freq, ac, temp)
|
||||
enum {
|
||||
enum ChannelNum_t {
|
||||
CH0 = 0,
|
||||
CH1,
|
||||
CH2,
|
||||
@ -62,10 +63,18 @@ enum {
|
||||
CH4
|
||||
};
|
||||
|
||||
enum ChannelType_t {
|
||||
TYPE_AC = 0,
|
||||
TYPE_DC,
|
||||
TYPE_INV
|
||||
};
|
||||
const char* const channelsTypes[] = { "AC", "DC", "INV" };
|
||||
|
||||
typedef struct {
|
||||
uint8_t ch; // channel 0 - 4
|
||||
uint8_t fieldId; // field id
|
||||
uint8_t unitId; // uint id
|
||||
ChannelType_t type;
|
||||
ChannelNum_t ch; // channel 0 - 4
|
||||
FieldId_t fieldId; // field id
|
||||
UnitId_t unitId; // uint id
|
||||
uint8_t start; // pos of first byte in buffer
|
||||
uint8_t num; // number of bytes in buffer
|
||||
uint16_t div; // divisor / calc command
|
||||
@ -78,19 +87,21 @@ public:
|
||||
void clearBuffer();
|
||||
void appendFragment(uint8_t offset, uint8_t* payload, uint8_t len);
|
||||
|
||||
void setByteAssignment(const byteAssign_t* byteAssignment, const uint8_t count);
|
||||
void setByteAssignment(const std::list<byteAssign_t>* byteAssignment);
|
||||
|
||||
uint8_t getAssignIdxByChannelField(uint8_t channel, uint8_t fieldId);
|
||||
float getChannelFieldValue(uint8_t channel, uint8_t fieldId);
|
||||
bool hasChannelFieldValue(uint8_t channel, uint8_t fieldId);
|
||||
const char* getChannelFieldUnit(uint8_t channel, uint8_t fieldId);
|
||||
const char* getChannelFieldName(uint8_t channel, uint8_t fieldId);
|
||||
uint8_t getChannelFieldDigits(uint8_t channel, uint8_t fieldId);
|
||||
const byteAssign_t* getAssignmentByChannelField(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId);
|
||||
float getChannelFieldValue(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId);
|
||||
bool hasChannelFieldValue(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId);
|
||||
const char* getChannelFieldUnit(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId);
|
||||
const char* getChannelFieldName(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId);
|
||||
uint8_t getChannelFieldDigits(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId);
|
||||
|
||||
uint8_t getChannelCount();
|
||||
std::list<ChannelType_t> getChannelTypes();
|
||||
const char* getChannelTypeName(ChannelType_t type);
|
||||
std::list<ChannelNum_t> getChannelsByType(ChannelType_t type);
|
||||
|
||||
uint16_t getChannelMaxPower(uint8_t channel);
|
||||
void setChannelMaxPower(uint8_t channel, uint16_t power);
|
||||
uint16_t getStringMaxPower(uint8_t channel);
|
||||
void setStringMaxPower(uint8_t channel, uint16_t power);
|
||||
|
||||
void resetRxFailureCount();
|
||||
void incrementRxFailureCount();
|
||||
@ -99,10 +110,9 @@ public:
|
||||
private:
|
||||
uint8_t _payloadStatistic[STATISTIC_PACKET_SIZE] = {};
|
||||
uint8_t _statisticLength = 0;
|
||||
uint16_t _chanMaxPower[CH4];
|
||||
uint16_t _stringMaxPower[CH4];
|
||||
|
||||
const byteAssign_t* _byteAssignment;
|
||||
uint8_t _byteAssignmentCount;
|
||||
const std::list<byteAssign_t>* _byteAssignment;
|
||||
|
||||
uint32_t _rxFailureCount = 0;
|
||||
};
|
||||
@ -37,7 +37,8 @@ std::map<DisplayType_t, std::function<U8G2*(uint8_t, uint8_t, uint8_t, uint8_t)>
|
||||
};
|
||||
|
||||
DisplayGraphicClass::DisplayGraphicClass()
|
||||
{}
|
||||
{
|
||||
}
|
||||
|
||||
DisplayGraphicClass::~DisplayGraphicClass()
|
||||
{
|
||||
@ -88,7 +89,7 @@ void DisplayGraphicClass::printText(const char* text, uint8_t line)
|
||||
break;
|
||||
}
|
||||
|
||||
// get the font height, to calculate the textheight
|
||||
// get the font height, to calculate the textheight
|
||||
_dispY += (_display->getMaxCharHeight()) + 1;
|
||||
|
||||
// calculate the starting position of the text
|
||||
@ -126,9 +127,11 @@ void DisplayGraphicClass::loop()
|
||||
isprod++;
|
||||
}
|
||||
|
||||
totalPower += inv->Statistics()->getChannelFieldValue(CH0, FLD_PAC);
|
||||
totalYieldDay += inv->Statistics()->getChannelFieldValue(CH0, FLD_YD);
|
||||
totalYieldTotal += inv->Statistics()->getChannelFieldValue(CH0, FLD_YT);
|
||||
for (auto& c : inv->Statistics()->getChannelsByType(TYPE_AC)) {
|
||||
totalPower += inv->Statistics()->getChannelFieldValue(TYPE_AC, c, FLD_PAC);
|
||||
totalYieldDay += inv->Statistics()->getChannelFieldValue(TYPE_AC, c, FLD_YD);
|
||||
totalYieldTotal += inv->Statistics()->getChannelFieldValue(TYPE_AC, c, FLD_YT);
|
||||
}
|
||||
}
|
||||
|
||||
_display->clearBuffer();
|
||||
|
||||
@ -65,13 +65,15 @@ void MqttHandleHassClass::publishConfig()
|
||||
publishInverterBinarySensor(inv, "Producing", "status/producing", "1", "0");
|
||||
|
||||
// Loop all channels
|
||||
for (uint8_t c = 0; c <= inv->Statistics()->getChannelCount(); c++) {
|
||||
for (uint8_t f = 0; f < DEVICE_CLS_ASSIGN_LIST_LEN; f++) {
|
||||
bool clear = false;
|
||||
if (c > 0 && !config.Mqtt_Hass_IndividualPanels) {
|
||||
clear = true;
|
||||
for (auto& t : inv->Statistics()->getChannelTypes()) {
|
||||
for (auto& c : inv->Statistics()->getChannelsByType(t)) {
|
||||
for (uint8_t f = 0; f < DEVICE_CLS_ASSIGN_LIST_LEN; f++) {
|
||||
bool clear = false;
|
||||
if (t == TYPE_DC && !config.Mqtt_Hass_IndividualPanels) {
|
||||
clear = true;
|
||||
}
|
||||
publishField(inv, t, c, deviceFieldAssignment[f], clear);
|
||||
}
|
||||
publishField(inv, c, deviceFieldAssignment[f], clear);
|
||||
}
|
||||
}
|
||||
|
||||
@ -79,32 +81,40 @@ void MqttHandleHassClass::publishConfig()
|
||||
}
|
||||
}
|
||||
|
||||
void MqttHandleHassClass::publishField(std::shared_ptr<InverterAbstract> inv, uint8_t channel, byteAssign_fieldDeviceClass_t fieldType, bool clear)
|
||||
void MqttHandleHassClass::publishField(std::shared_ptr<InverterAbstract> inv, ChannelType_t type, ChannelNum_t channel, byteAssign_fieldDeviceClass_t fieldType, bool clear)
|
||||
{
|
||||
if (!inv->Statistics()->hasChannelFieldValue(channel, fieldType.fieldId)) {
|
||||
if (!inv->Statistics()->hasChannelFieldValue(type, channel, fieldType.fieldId)) {
|
||||
return;
|
||||
}
|
||||
|
||||
String serial = inv->serialString();
|
||||
|
||||
String fieldName;
|
||||
if (channel == CH0 && fieldType.fieldId == FLD_PDC) {
|
||||
if (type == TYPE_AC && fieldType.fieldId == FLD_PDC) {
|
||||
fieldName = "PowerDC";
|
||||
} else {
|
||||
fieldName = inv->Statistics()->getChannelFieldName(channel, fieldType.fieldId);
|
||||
fieldName = inv->Statistics()->getChannelFieldName(type, channel, fieldType.fieldId);
|
||||
}
|
||||
|
||||
String chanNum;
|
||||
if (type == TYPE_DC) {
|
||||
// TODO(tbnobody)
|
||||
chanNum = static_cast<uint8_t>(channel) + 1;
|
||||
} else {
|
||||
chanNum = channel;
|
||||
}
|
||||
|
||||
String configTopic = "sensor/dtu_" + serial
|
||||
+ "/" + "ch" + String(channel) + "_" + fieldName
|
||||
+ "/" + "ch" + chanNum + "_" + fieldName
|
||||
+ "/config";
|
||||
|
||||
if (!clear) {
|
||||
String stateTopic = MqttSettings.getPrefix() + MqttHandleInverter.getTopic(inv, channel, fieldType.fieldId);
|
||||
String stateTopic = MqttSettings.getPrefix() + MqttHandleInverter.getTopic(inv, type, channel, fieldType.fieldId);
|
||||
const char* devCls = deviceClasses[fieldType.deviceClsId];
|
||||
const char* stateCls = stateClasses[fieldType.stateClsId];
|
||||
|
||||
String name;
|
||||
if (channel == CH0) {
|
||||
if (type != TYPE_DC) {
|
||||
name = String(inv->name()) + " " + fieldName;
|
||||
} else {
|
||||
name = String(inv->name()) + " CH" + String(channel) + " " + fieldName;
|
||||
@ -115,9 +125,9 @@ void MqttHandleHassClass::publishField(std::shared_ptr<InverterAbstract> inv, ui
|
||||
root[F("stat_t")] = stateTopic;
|
||||
root[F("uniq_id")] = serial + "_ch" + String(channel) + "_" + fieldName;
|
||||
|
||||
String unit_of_meausure = inv->Statistics()->getChannelFieldUnit(channel, fieldType.fieldId);
|
||||
if (unit_of_meausure != "") {
|
||||
root[F("unit_of_meas")] = unit_of_meausure;
|
||||
String unit_of_measure = inv->Statistics()->getChannelFieldUnit(type, channel, fieldType.fieldId);
|
||||
if (unit_of_measure != "") {
|
||||
root[F("unit_of_meas")] = unit_of_measure;
|
||||
}
|
||||
|
||||
JsonObject deviceObj = root.createNestedObject("dev");
|
||||
|
||||
@ -96,15 +96,18 @@ void MqttHandleInverterClass::loop()
|
||||
_lastPublishStats[i] = lastUpdate;
|
||||
|
||||
// Loop all channels
|
||||
for (uint8_t c = 0; c <= inv->Statistics()->getChannelCount(); c++) {
|
||||
if (c > 0) {
|
||||
INVERTER_CONFIG_T* inv_cfg = Configuration.getInverterConfig(inv->serial());
|
||||
if (inv_cfg != nullptr) {
|
||||
MqttSettings.publish(inv->serialString() + "/" + String(c) + "/name", inv_cfg->channel[c - 1].Name);
|
||||
for (auto& t : inv->Statistics()->getChannelTypes()) {
|
||||
for (auto& c : inv->Statistics()->getChannelsByType(t)) {
|
||||
if (t == TYPE_DC) {
|
||||
INVERTER_CONFIG_T* inv_cfg = Configuration.getInverterConfig(inv->serial());
|
||||
if (inv_cfg != nullptr) {
|
||||
// TODO(tbnobody)
|
||||
MqttSettings.publish(inv->serialString() + "/" + String(static_cast<uint8_t>(c) + 1) + "/name", inv_cfg->channel[c].Name);
|
||||
}
|
||||
}
|
||||
for (uint8_t f = 0; f < sizeof(_publishFields) / sizeof(FieldId_t); f++) {
|
||||
publishField(inv, t, c, _publishFields[f]);
|
||||
}
|
||||
}
|
||||
for (uint8_t f = 0; f < sizeof(_publishFields); f++) {
|
||||
publishField(inv, c, _publishFields[f]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -116,31 +119,39 @@ void MqttHandleInverterClass::loop()
|
||||
}
|
||||
}
|
||||
|
||||
void MqttHandleInverterClass::publishField(std::shared_ptr<InverterAbstract> inv, uint8_t channel, uint8_t fieldId)
|
||||
void MqttHandleInverterClass::publishField(std::shared_ptr<InverterAbstract> inv, ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId)
|
||||
{
|
||||
String topic = getTopic(inv, channel, fieldId);
|
||||
String topic = getTopic(inv, type, channel, fieldId);
|
||||
if (topic == "") {
|
||||
return;
|
||||
}
|
||||
|
||||
MqttSettings.publish(topic, String(inv->Statistics()->getChannelFieldValue(channel, fieldId)));
|
||||
MqttSettings.publish(topic, String(inv->Statistics()->getChannelFieldValue(type, channel, fieldId)));
|
||||
}
|
||||
|
||||
String MqttHandleInverterClass::getTopic(std::shared_ptr<InverterAbstract> inv, uint8_t channel, uint8_t fieldId)
|
||||
String MqttHandleInverterClass::getTopic(std::shared_ptr<InverterAbstract> inv, ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId)
|
||||
{
|
||||
if (!inv->Statistics()->hasChannelFieldValue(channel, fieldId)) {
|
||||
if (!inv->Statistics()->hasChannelFieldValue(type, channel, fieldId)) {
|
||||
return String("");
|
||||
}
|
||||
|
||||
String chanName;
|
||||
if (channel == 0 && fieldId == FLD_PDC) {
|
||||
if (type == TYPE_AC && fieldId == FLD_PDC) {
|
||||
chanName = "powerdc";
|
||||
} else {
|
||||
chanName = inv->Statistics()->getChannelFieldName(channel, fieldId);
|
||||
chanName = inv->Statistics()->getChannelFieldName(type, channel, fieldId);
|
||||
chanName.toLowerCase();
|
||||
}
|
||||
|
||||
return inv->serialString() + "/" + String(channel) + "/" + chanName;
|
||||
String chanNum;
|
||||
if (type == TYPE_DC) {
|
||||
// TODO(tbnobody)
|
||||
chanNum = static_cast<uint8_t>(channel) + 1;
|
||||
} else {
|
||||
chanNum = channel;
|
||||
}
|
||||
|
||||
return inv->serialString() + "/" + chanNum + "/" + chanName;
|
||||
}
|
||||
|
||||
void MqttHandleInverterClass::onMqttMessage(const espMqttClientTypes::MessageProperties& properties, const char* topic, const uint8_t* payload, size_t len, size_t index, size_t total)
|
||||
|
||||
@ -1,3 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/*
|
||||
* Copyright (C) 2022 - 2023 Thomas Basler and others
|
||||
*/
|
||||
#include "Utils.h"
|
||||
#include <Esp.h>
|
||||
|
||||
|
||||
@ -59,7 +59,7 @@ void WebApiInverterClass::onInverterList(AsyncWebServerRequest* request)
|
||||
max_channels = INV_MAX_CHAN_COUNT;
|
||||
} else {
|
||||
obj[F("type")] = inv->typeName();
|
||||
max_channels = inv->Statistics()->getChannelCount();
|
||||
max_channels = inv->Statistics()->getChannelsByType(TYPE_DC).size();
|
||||
}
|
||||
|
||||
JsonArray channel = obj.createNestedArray("channel");
|
||||
@ -167,7 +167,7 @@ void WebApiInverterClass::onInverterAdd(AsyncWebServerRequest* request)
|
||||
|
||||
if (inv != nullptr) {
|
||||
for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) {
|
||||
inv->Statistics()->setChannelMaxPower(c, inverter->channel[c].MaxChannelPower);
|
||||
inv->Statistics()->setStringMaxPower(c, inverter->channel[c].MaxChannelPower);
|
||||
}
|
||||
}
|
||||
|
||||
@ -296,7 +296,7 @@ void WebApiInverterClass::onInverterEdit(AsyncWebServerRequest* request)
|
||||
|
||||
if (inv != nullptr) {
|
||||
for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) {
|
||||
inv->Statistics()->setChannelMaxPower(c, inverter.channel[c].MaxChannelPower);
|
||||
inv->Statistics()->setStringMaxPower(c, inverter.channel[c].MaxChannelPower);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -63,39 +63,48 @@ void WebApiPrometheusClass::onPrometheusMetricsGet(AsyncWebServerRequest* reques
|
||||
serial.c_str(), i, name, inv->Statistics()->getLastUpdate() / 1000);
|
||||
|
||||
// Loop all channels
|
||||
for (uint8_t c = 0; c <= inv->Statistics()->getChannelCount(); c++) {
|
||||
addField(stream, serial, i, inv, c, FLD_PAC);
|
||||
addField(stream, serial, i, inv, c, FLD_UAC);
|
||||
addField(stream, serial, i, inv, c, FLD_IAC);
|
||||
if (c == 0) {
|
||||
addField(stream, serial, i, inv, c, FLD_PDC, "PowerDC");
|
||||
} else {
|
||||
addField(stream, serial, i, inv, c, FLD_PDC);
|
||||
for (auto& t : inv->Statistics()->getChannelTypes()) {
|
||||
for (auto& c : inv->Statistics()->getChannelsByType(t)) {
|
||||
addField(stream, serial, i, inv, t, c, FLD_PAC);
|
||||
addField(stream, serial, i, inv, t, c, FLD_UAC);
|
||||
addField(stream, serial, i, inv, t, c, FLD_IAC);
|
||||
if (t == TYPE_AC) {
|
||||
addField(stream, serial, i, inv, t, c, FLD_PDC, "PowerDC");
|
||||
} else {
|
||||
addField(stream, serial, i, inv, t, c, FLD_PDC);
|
||||
}
|
||||
addField(stream, serial, i, inv, t, c, FLD_UDC);
|
||||
addField(stream, serial, i, inv, t, c, FLD_IDC);
|
||||
addField(stream, serial, i, inv, t, c, FLD_YD);
|
||||
addField(stream, serial, i, inv, t, c, FLD_YT);
|
||||
addField(stream, serial, i, inv, t, c, FLD_F);
|
||||
addField(stream, serial, i, inv, t, c, FLD_T);
|
||||
addField(stream, serial, i, inv, t, c, FLD_PF);
|
||||
addField(stream, serial, i, inv, t, c, FLD_PRA);
|
||||
addField(stream, serial, i, inv, t, c, FLD_EFF);
|
||||
addField(stream, serial, i, inv, t, c, FLD_IRR);
|
||||
}
|
||||
addField(stream, serial, i, inv, c, FLD_UDC);
|
||||
addField(stream, serial, i, inv, c, FLD_IDC);
|
||||
addField(stream, serial, i, inv, c, FLD_YD);
|
||||
addField(stream, serial, i, inv, c, FLD_YT);
|
||||
addField(stream, serial, i, inv, c, FLD_F);
|
||||
addField(stream, serial, i, inv, c, FLD_T);
|
||||
addField(stream, serial, i, inv, c, FLD_PF);
|
||||
addField(stream, serial, i, inv, c, FLD_PRA);
|
||||
addField(stream, serial, i, inv, c, FLD_EFF);
|
||||
addField(stream, serial, i, inv, c, FLD_IRR);
|
||||
}
|
||||
}
|
||||
stream->addHeader(F("Cache-Control"), F("no-cache"));
|
||||
request->send(stream);
|
||||
}
|
||||
|
||||
void WebApiPrometheusClass::addField(AsyncResponseStream* stream, String& serial, uint8_t idx, std::shared_ptr<InverterAbstract> inv, uint8_t channel, uint8_t fieldId, const char* channelName)
|
||||
void WebApiPrometheusClass::addField(AsyncResponseStream* stream, String& serial, uint8_t idx, std::shared_ptr<InverterAbstract> inv, ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId, const char* channelName)
|
||||
{
|
||||
if (inv->Statistics()->hasChannelFieldValue(channel, fieldId)) {
|
||||
const char* chanName = (channelName == NULL) ? inv->Statistics()->getChannelFieldName(channel, fieldId) : channelName;
|
||||
if (idx == 0 && channel == 0) {
|
||||
stream->printf("# HELP opendtu_%s in %s\n", chanName, inv->Statistics()->getChannelFieldUnit(channel, fieldId));
|
||||
if (inv->Statistics()->hasChannelFieldValue(type, channel, fieldId)) {
|
||||
const char* chanName = (channelName == NULL) ? inv->Statistics()->getChannelFieldName(type, channel, fieldId) : channelName;
|
||||
if (idx == 0 && type == TYPE_AC && channel == 0) {
|
||||
stream->printf("# HELP opendtu_%s in %s\n", chanName, inv->Statistics()->getChannelFieldUnit(type, channel, fieldId));
|
||||
stream->printf("# TYPE opendtu_%s gauge\n", chanName);
|
||||
}
|
||||
stream->printf("opendtu_%s{serial=\"%s\",unit=\"%d\",name=\"%s\",channel=\"%d\"} %f\n", chanName, serial.c_str(), idx, inv->name(), channel, inv->Statistics()->getChannelFieldValue(channel, fieldId));
|
||||
stream->printf("opendtu_%s{serial=\"%s\",unit=\"%d\",name=\"%s\",type=\"%s\",channel=\"%d\"} %f\n",
|
||||
chanName,
|
||||
serial.c_str(),
|
||||
idx,
|
||||
inv->name(),
|
||||
inv->Statistics()->getChannelTypeName(type),
|
||||
channel,
|
||||
inv->Statistics()->getChannelFieldValue(type, channel, fieldId));
|
||||
}
|
||||
}
|
||||
@ -111,36 +111,39 @@ void WebApiWsLiveClass::generateJsonResponse(JsonVariant& root)
|
||||
}
|
||||
|
||||
// Loop all channels
|
||||
for (uint8_t c = 0; c <= inv->Statistics()->getChannelCount(); c++) {
|
||||
if (c > 0) {
|
||||
INVERTER_CONFIG_T* inv_cfg = Configuration.getInverterConfig(inv->serial());
|
||||
if (inv_cfg != nullptr) {
|
||||
invObject[String(c)][F("name")]["u"] = inv_cfg->channel[c - 1].Name;
|
||||
for (auto& t : inv->Statistics()->getChannelTypes()) {
|
||||
JsonObject chanTypeObj = invObject.createNestedObject(inv->Statistics()->getChannelTypeName(t));
|
||||
for (auto& c : inv->Statistics()->getChannelsByType(t)) {
|
||||
if (t == TYPE_DC) {
|
||||
INVERTER_CONFIG_T* inv_cfg = Configuration.getInverterConfig(inv->serial());
|
||||
if (inv_cfg != nullptr) {
|
||||
chanTypeObj[String(static_cast<uint8_t>(c))][F("name")]["u"] = inv_cfg->channel[c].Name;
|
||||
}
|
||||
}
|
||||
addField(chanTypeObj, i, inv, t, c, FLD_PAC);
|
||||
addField(chanTypeObj, i, inv, t, c, FLD_UAC);
|
||||
addField(chanTypeObj, i, inv, t, c, FLD_IAC);
|
||||
if (t == TYPE_AC) {
|
||||
addField(chanTypeObj, i, inv, t, c, FLD_PDC, F("Power DC"));
|
||||
} else {
|
||||
addField(chanTypeObj, i, inv, t, c, FLD_PDC);
|
||||
}
|
||||
addField(chanTypeObj, i, inv, t, c, FLD_UDC);
|
||||
addField(chanTypeObj, i, inv, t, c, FLD_IDC);
|
||||
addField(chanTypeObj, i, inv, t, c, FLD_YD);
|
||||
addField(chanTypeObj, i, inv, t, c, FLD_YT);
|
||||
addField(chanTypeObj, i, inv, t, c, FLD_F);
|
||||
addField(chanTypeObj, i, inv, t, c, FLD_T);
|
||||
addField(chanTypeObj, i, inv, t, c, FLD_PF);
|
||||
addField(chanTypeObj, i, inv, t, c, FLD_PRA);
|
||||
addField(chanTypeObj, i, inv, t, c, FLD_EFF);
|
||||
if (t == TYPE_DC && inv->Statistics()->getStringMaxPower(c) > 0) {
|
||||
addField(chanTypeObj, i, inv, t, c, FLD_IRR);
|
||||
}
|
||||
}
|
||||
addField(invObject, i, inv, c, FLD_PAC);
|
||||
addField(invObject, i, inv, c, FLD_UAC);
|
||||
addField(invObject, i, inv, c, FLD_IAC);
|
||||
if (c == 0) {
|
||||
addField(invObject, i, inv, c, FLD_PDC, F("Power DC"));
|
||||
} else {
|
||||
addField(invObject, i, inv, c, FLD_PDC);
|
||||
}
|
||||
addField(invObject, i, inv, c, FLD_UDC);
|
||||
addField(invObject, i, inv, c, FLD_IDC);
|
||||
addField(invObject, i, inv, c, FLD_YD);
|
||||
addField(invObject, i, inv, c, FLD_YT);
|
||||
addField(invObject, i, inv, c, FLD_F);
|
||||
addField(invObject, i, inv, c, FLD_T);
|
||||
addField(invObject, i, inv, c, FLD_PF);
|
||||
addField(invObject, i, inv, c, FLD_PRA);
|
||||
addField(invObject, i, inv, c, FLD_EFF);
|
||||
if (c > 0 && inv->Statistics()->getChannelMaxPower(c - 1) > 0) {
|
||||
addField(invObject, i, inv, c, FLD_IRR);
|
||||
}
|
||||
}
|
||||
|
||||
if (inv->Statistics()->hasChannelFieldValue(CH0, FLD_EVT_LOG)) {
|
||||
if (inv->Statistics()->hasChannelFieldValue(TYPE_INV, CH0, FLD_EVT_LOG)) {
|
||||
invObject[F("events")] = inv->EventLog()->getEntryCount();
|
||||
} else {
|
||||
invObject[F("events")] = -1;
|
||||
@ -150,9 +153,11 @@ void WebApiWsLiveClass::generateJsonResponse(JsonVariant& root)
|
||||
_newestInverterTimestamp = inv->Statistics()->getLastUpdate();
|
||||
}
|
||||
|
||||
totalPower += inv->Statistics()->getChannelFieldValue(CH0, FLD_PAC);
|
||||
totalYieldDay += inv->Statistics()->getChannelFieldValue(CH0, FLD_YD);
|
||||
totalYieldTotal += inv->Statistics()->getChannelFieldValue(CH0, FLD_YT);
|
||||
for (auto& c : inv->Statistics()->getChannelsByType(TYPE_AC)) {
|
||||
totalPower += inv->Statistics()->getChannelFieldValue(TYPE_AC, c, FLD_PAC);
|
||||
totalYieldDay += inv->Statistics()->getChannelFieldValue(TYPE_AC, c, FLD_YD);
|
||||
totalYieldTotal += inv->Statistics()->getChannelFieldValue(TYPE_AC, c, FLD_YT);
|
||||
}
|
||||
}
|
||||
|
||||
JsonObject totalObj = root.createNestedObject("total");
|
||||
@ -172,18 +177,20 @@ void WebApiWsLiveClass::generateJsonResponse(JsonVariant& root)
|
||||
}
|
||||
}
|
||||
|
||||
void WebApiWsLiveClass::addField(JsonObject& root, uint8_t idx, std::shared_ptr<InverterAbstract> inv, uint8_t channel, uint8_t fieldId, String topic)
|
||||
void WebApiWsLiveClass::addField(JsonObject& root, uint8_t idx, std::shared_ptr<InverterAbstract> inv, ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId, String topic)
|
||||
{
|
||||
if (inv->Statistics()->hasChannelFieldValue(channel, fieldId)) {
|
||||
if (inv->Statistics()->hasChannelFieldValue(type, channel, fieldId)) {
|
||||
String chanName;
|
||||
if (topic == "") {
|
||||
chanName = inv->Statistics()->getChannelFieldName(channel, fieldId);
|
||||
chanName = inv->Statistics()->getChannelFieldName(type, channel, fieldId);
|
||||
} else {
|
||||
chanName = topic;
|
||||
}
|
||||
root[String(channel)][chanName]["v"] = inv->Statistics()->getChannelFieldValue(channel, fieldId);
|
||||
root[String(channel)][chanName]["u"] = inv->Statistics()->getChannelFieldUnit(channel, fieldId);
|
||||
root[String(channel)][chanName]["d"] = inv->Statistics()->getChannelFieldDigits(channel, fieldId);
|
||||
String chanNum;
|
||||
chanNum = channel;
|
||||
root[chanNum][chanName]["v"] = inv->Statistics()->getChannelFieldValue(type, channel, fieldId);
|
||||
root[chanNum][chanName]["u"] = inv->Statistics()->getChannelFieldUnit(type, channel, fieldId);
|
||||
root[chanNum][chanName]["d"] = inv->Statistics()->getChannelFieldDigits(type, channel, fieldId);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -154,7 +154,7 @@ void setup()
|
||||
|
||||
if (inv != nullptr) {
|
||||
for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) {
|
||||
inv->Statistics()->setChannelMaxPower(c, config.Inverter[i].channel[c].MaxChannelPower);
|
||||
inv->Statistics()->setStringMaxPower(c, config.Inverter[i].channel[c].MaxChannelPower);
|
||||
}
|
||||
}
|
||||
MessageOutput.println(F(" done"));
|
||||
|
||||
@ -16,26 +16,26 @@
|
||||
"bootstrap-icons-vue": "^1.8.1",
|
||||
"mitt": "^3.0.0",
|
||||
"spark-md5": "^3.0.2",
|
||||
"vue": "^3.2.45",
|
||||
"vue": "^3.2.47",
|
||||
"vue-i18n": "^9.2.2",
|
||||
"vue-router": "^4.1.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@rushstack/eslint-patch": "^1.2.0",
|
||||
"@types/bootstrap": "^5.2.6",
|
||||
"@types/node": "^18.11.18",
|
||||
"@types/node": "^18.13.0",
|
||||
"@types/spark-md5": "^3.0.2",
|
||||
"@vitejs/plugin-vue": "^4.0.0",
|
||||
"@vue/eslint-config-typescript": "^11.0.2",
|
||||
"@vue/tsconfig": "^0.1.3",
|
||||
"eslint": "^8.33.0",
|
||||
"eslint": "^8.34.0",
|
||||
"eslint-plugin-vue": "^9.9.0",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"sass": "^1.57.1",
|
||||
"typescript": "^4.9.4",
|
||||
"vite": "^4.0.4",
|
||||
"sass": "^1.58.0",
|
||||
"typescript": "^4.9.5",
|
||||
"vite": "^4.1.1",
|
||||
"vite-plugin-compression": "^0.5.1",
|
||||
"vite-plugin-css-injected-by-js": "^2.4.0",
|
||||
"vite-plugin-css-injected-by-js": "^3.0.0",
|
||||
"vue-tsc": "^1.0.24"
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,11 +1,21 @@
|
||||
<template>
|
||||
<div class="card" :class="{ 'border-info': channelNumber == 0 }">
|
||||
<div v-if="channelNumber >= 1" class="card-header">
|
||||
<template v-if="channelData.name.u != ''">{{ channelData.name.u }}</template>
|
||||
<template v-else>{{ $t('inverterchannelinfo.String', { num: channelNumber }) }}</template>
|
||||
<div class="card" :class="{
|
||||
'border-info': channelType == 'AC',
|
||||
'border-secondary': channelType == 'INV'
|
||||
}">
|
||||
<div v-if="channelType == 'INV'" class="card-header text-bg-secondary">
|
||||
{{ $t('inverterchannelinfo.General') }}
|
||||
</div>
|
||||
<div v-if="channelNumber == 0" class="card-header text-bg-info">
|
||||
{{ $t('inverterchannelinfo.Phase', { num: channelNumber + 1 }) }}</div>
|
||||
|
||||
<div v-if="channelType == 'DC'" class="card-header">
|
||||
<template v-if="channelData.name.u != ''">{{ channelData.name.u }}</template>
|
||||
<template v-else>{{ $t('inverterchannelinfo.String', { num: channelNumber + 1 }) }}</template>
|
||||
</div>
|
||||
|
||||
<div v-if="channelType == 'AC'" class="card-header text-bg-info">
|
||||
{{ $t('inverterchannelinfo.Phase', { num: channelNumber + 1 }) }}
|
||||
</div>
|
||||
|
||||
<div class="card-body">
|
||||
<table class="table table-striped table-hover">
|
||||
<thead>
|
||||
@ -21,10 +31,10 @@
|
||||
<th scope="row">{{ $t('inverterchannelproperty.' + key) }}</th>
|
||||
<td style="text-align: right">
|
||||
{{ $n(property.v, 'decimal', {
|
||||
minimumFractionDigits: property.d,
|
||||
maximumFractionDigits: property.d})
|
||||
minimumFractionDigits: property.d,
|
||||
maximumFractionDigits: property.d})
|
||||
}}
|
||||
</td>
|
||||
</td>
|
||||
<td>{{ property.u }}</td>
|
||||
</template>
|
||||
</tr>
|
||||
@ -41,6 +51,7 @@ import { defineComponent, type PropType } from 'vue';
|
||||
export default defineComponent({
|
||||
props: {
|
||||
channelData: { type: Object as PropType<InverterStatistics>, required: true },
|
||||
channelType: { type: String, required: true },
|
||||
channelNumber: { type: Number, required: true },
|
||||
},
|
||||
});
|
||||
|
||||
@ -302,6 +302,7 @@
|
||||
"inverterchannelinfo": {
|
||||
"String": "String {num}",
|
||||
"Phase": "Phase {num}",
|
||||
"General": "Allgemein",
|
||||
"Property": "Eigenschaft",
|
||||
"Value": "Wert",
|
||||
"Unit": "Einheit"
|
||||
|
||||
@ -302,6 +302,7 @@
|
||||
"inverterchannelinfo": {
|
||||
"String": "String {num}",
|
||||
"Phase": "Phase {num}",
|
||||
"General": "General",
|
||||
"Property": "Property",
|
||||
"Value": "Value",
|
||||
"Unit": "Unit"
|
||||
|
||||
@ -302,6 +302,7 @@
|
||||
"inverterchannelinfo": {
|
||||
"String": "Ligne {num}",
|
||||
"Phase": "Phase {num}",
|
||||
"General": "General",
|
||||
"Property": "Propriété",
|
||||
"Value": "Valeur",
|
||||
"Unit": "Unité"
|
||||
|
||||
@ -29,7 +29,9 @@ export interface Inverter {
|
||||
limit_relative: number;
|
||||
limit_absolute: number;
|
||||
events: number;
|
||||
[key: number]: InverterStatistics;
|
||||
AC: InverterStatistics[];
|
||||
DC: InverterStatistics[];
|
||||
INV: InverterStatistics[];
|
||||
}
|
||||
|
||||
export interface Total {
|
||||
|
||||
@ -92,11 +92,12 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row flex-row-reverse flex-wrap-reverse align-items-end g-3">
|
||||
<template v-for="channel in 5" :key="channel">
|
||||
<div v-if="inverter[channel - 1]" :class="`col order-${5 - channel}`">
|
||||
<InverterChannelInfo :channelData="inverter[channel - 1]"
|
||||
:channelNumber="channel - 1" />
|
||||
<div class="row flex-row-reverse flex-wrap-reverse g-3">
|
||||
<template v-for="chanType in [{obj: inverter.INV, name: 'INV'}, {obj: inverter.AC, name: 'AC'}, {obj: inverter.DC, name: 'DC'}].reverse()">
|
||||
<div v-for="channel in Object.keys(chanType.obj).sort().reverse().map(x=>+x)" :key="channel" class="col">
|
||||
<InverterChannelInfo :channelData="chanType.obj[channel]"
|
||||
:channelType="chanType.name"
|
||||
:channelNumber="channel" />
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
|
||||
421
webapp/yarn.lock
421
webapp/yarn.lock
@ -7,115 +7,115 @@
|
||||
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.11.tgz#68bb07ab3d380affa9a3f96728df07969645d2d9"
|
||||
integrity sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==
|
||||
|
||||
"@esbuild/android-arm64@0.16.4":
|
||||
version "0.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.4.tgz#4b31b9e3da2e4c12a8170bd682f713c775f68ab1"
|
||||
integrity sha512-VPuTzXFm/m2fcGfN6CiwZTlLzxrKsWbPkG7ArRFpuxyaHUm/XFHQPD4xNwZT6uUmpIHhnSjcaCmcla8COzmZ5Q==
|
||||
"@esbuild/android-arm64@0.16.17":
|
||||
version "0.16.17"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz#cf91e86df127aa3d141744edafcba0abdc577d23"
|
||||
integrity sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==
|
||||
|
||||
"@esbuild/android-arm@0.16.4":
|
||||
version "0.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.4.tgz#057d3e8b0ee41ff59386c33ba6dcf20f4bedd1f7"
|
||||
integrity sha512-rZzb7r22m20S1S7ufIc6DC6W659yxoOrl7sKP1nCYhuvUlnCFHVSbATG4keGUtV8rDz11sRRDbWkvQZpzPaHiw==
|
||||
"@esbuild/android-arm@0.16.17":
|
||||
version "0.16.17"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.17.tgz#025b6246d3f68b7bbaa97069144fb5fb70f2fff2"
|
||||
integrity sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==
|
||||
|
||||
"@esbuild/android-x64@0.16.4":
|
||||
version "0.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.4.tgz#62ccab8ac1d3e6ef1df3fa2e1974bc2b8528d74a"
|
||||
integrity sha512-MW+B2O++BkcOfMWmuHXB15/l1i7wXhJFqbJhp82IBOais8RBEQv2vQz/jHrDEHaY2X0QY7Wfw86SBL2PbVOr0g==
|
||||
"@esbuild/android-x64@0.16.17":
|
||||
version "0.16.17"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.17.tgz#c820e0fef982f99a85c4b8bfdd582835f04cd96e"
|
||||
integrity sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==
|
||||
|
||||
"@esbuild/darwin-arm64@0.16.4":
|
||||
version "0.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.4.tgz#c19a6489d626c36fc611c85ccd8a3333c1f2a930"
|
||||
integrity sha512-a28X1O//aOfxwJVZVs7ZfM8Tyih2Za4nKJrBwW5Wm4yKsnwBy9aiS/xwpxiiTRttw3EaTg4Srerhcm6z0bu9Wg==
|
||||
"@esbuild/darwin-arm64@0.16.17":
|
||||
version "0.16.17"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz#edef4487af6b21afabba7be5132c26d22379b220"
|
||||
integrity sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==
|
||||
|
||||
"@esbuild/darwin-x64@0.16.4":
|
||||
version "0.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.4.tgz#b726bbc84a1e277f6ec2509d10b8ee03f242b776"
|
||||
integrity sha512-e3doCr6Ecfwd7VzlaQqEPrnbvvPjE9uoTpxG5pyLzr2rI2NMjDHmvY1E5EO81O/e9TUOLLkXA5m6T8lfjK9yAA==
|
||||
"@esbuild/darwin-x64@0.16.17":
|
||||
version "0.16.17"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz#42829168730071c41ef0d028d8319eea0e2904b4"
|
||||
integrity sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==
|
||||
|
||||
"@esbuild/freebsd-arm64@0.16.4":
|
||||
version "0.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.4.tgz#364568e6ca2901297f247de0681c9b14bbe658c8"
|
||||
integrity sha512-Oup3G/QxBgvvqnXWrBed7xxkFNwAwJVHZcklWyQt7YCAL5bfUkaa6FVWnR78rNQiM8MqqLiT6ZTZSdUFuVIg1w==
|
||||
"@esbuild/freebsd-arm64@0.16.17":
|
||||
version "0.16.17"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz#1f4af488bfc7e9ced04207034d398e793b570a27"
|
||||
integrity sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==
|
||||
|
||||
"@esbuild/freebsd-x64@0.16.4":
|
||||
version "0.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.4.tgz#44701ba4a5497ba64eec0a6c9e221d8f46a25e72"
|
||||
integrity sha512-vAP+eYOxlN/Bpo/TZmzEQapNS8W1njECrqkTpNgvXskkkJC2AwOXwZWai/Kc2vEFZUXQttx6UJbj9grqjD/+9Q==
|
||||
"@esbuild/freebsd-x64@0.16.17":
|
||||
version "0.16.17"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz#636306f19e9bc981e06aa1d777302dad8fddaf72"
|
||||
integrity sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==
|
||||
|
||||
"@esbuild/linux-arm64@0.16.4":
|
||||
version "0.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.4.tgz#b58fb418ec9ac714d8dbb38c787ff2441eb1d9db"
|
||||
integrity sha512-2zXoBhv4r5pZiyjBKrOdFP4CXOChxXiYD50LRUU+65DkdS5niPFHbboKZd/c81l0ezpw7AQnHeoCy5hFrzzs4g==
|
||||
"@esbuild/linux-arm64@0.16.17":
|
||||
version "0.16.17"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz#a003f7ff237c501e095d4f3a09e58fc7b25a4aca"
|
||||
integrity sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==
|
||||
|
||||
"@esbuild/linux-arm@0.16.4":
|
||||
version "0.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.4.tgz#b37f15ecddb53eeea466e5960e31a58f33e0e87e"
|
||||
integrity sha512-A47ZmtpIPyERxkSvIv+zLd6kNIOtJH03XA0Hy7jaceRDdQaQVGSDt4mZqpWqJYgDk9rg96aglbF6kCRvPGDSUA==
|
||||
"@esbuild/linux-arm@0.16.17":
|
||||
version "0.16.17"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz#b591e6a59d9c4fe0eeadd4874b157ab78cf5f196"
|
||||
integrity sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==
|
||||
|
||||
"@esbuild/linux-ia32@0.16.4":
|
||||
version "0.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.4.tgz#117e32a9680b5deac184ebee122f8575369fad1b"
|
||||
integrity sha512-uxdSrpe9wFhz4yBwt2kl2TxS/NWEINYBUFIxQtaEVtglm1eECvsj1vEKI0KX2k2wCe17zDdQ3v+jVxfwVfvvjw==
|
||||
"@esbuild/linux-ia32@0.16.17":
|
||||
version "0.16.17"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz#24333a11027ef46a18f57019450a5188918e2a54"
|
||||
integrity sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==
|
||||
|
||||
"@esbuild/linux-loong64@0.16.4":
|
||||
version "0.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.4.tgz#dd504fb83c280752d4b485d9acb3cf391cb7bf5b"
|
||||
integrity sha512-peDrrUuxbZ9Jw+DwLCh/9xmZAk0p0K1iY5d2IcwmnN+B87xw7kujOkig6ZRcZqgrXgeRGurRHn0ENMAjjD5DEg==
|
||||
"@esbuild/linux-loong64@0.16.17":
|
||||
version "0.16.17"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz#d5ad459d41ed42bbd4d005256b31882ec52227d8"
|
||||
integrity sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==
|
||||
|
||||
"@esbuild/linux-mips64el@0.16.4":
|
||||
version "0.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.4.tgz#9ab77e31cf3be1e35572afff94b51df8149d15bd"
|
||||
integrity sha512-sD9EEUoGtVhFjjsauWjflZklTNr57KdQ6xfloO4yH1u7vNQlOfAlhEzbyBKfgbJlW7rwXYBdl5/NcZ+Mg2XhQA==
|
||||
"@esbuild/linux-mips64el@0.16.17":
|
||||
version "0.16.17"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz#4e5967a665c38360b0a8205594377d4dcf9c3726"
|
||||
integrity sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==
|
||||
|
||||
"@esbuild/linux-ppc64@0.16.4":
|
||||
version "0.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.4.tgz#69d56c2a960808bee1c7b9b84a115220ec9ce05c"
|
||||
integrity sha512-X1HSqHUX9D+d0l6/nIh4ZZJ94eQky8d8z6yxAptpZE3FxCWYWvTDd9X9ST84MGZEJx04VYUD/AGgciddwO0b8g==
|
||||
"@esbuild/linux-ppc64@0.16.17":
|
||||
version "0.16.17"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz#206443a02eb568f9fdf0b438fbd47d26e735afc8"
|
||||
integrity sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==
|
||||
|
||||
"@esbuild/linux-riscv64@0.16.4":
|
||||
version "0.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.4.tgz#9fc23583f4a1508a8d352bd376340e42217e8a90"
|
||||
integrity sha512-97ANpzyNp0GTXCt6SRdIx1ngwncpkV/z453ZuxbnBROCJ5p/55UjhbaG23UdHj88fGWLKPFtMoU4CBacz4j9FA==
|
||||
"@esbuild/linux-riscv64@0.16.17":
|
||||
version "0.16.17"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz#c351e433d009bf256e798ad048152c8d76da2fc9"
|
||||
integrity sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==
|
||||
|
||||
"@esbuild/linux-s390x@0.16.4":
|
||||
version "0.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.4.tgz#4cae1f70ac2943f076dd130c3c80d28f57bf75d1"
|
||||
integrity sha512-pUvPQLPmbEeJRPjP0DYTC1vjHyhrnCklQmCGYbipkep+oyfTn7GTBJXoPodR7ZS5upmEyc8lzAkn2o29wD786A==
|
||||
"@esbuild/linux-s390x@0.16.17":
|
||||
version "0.16.17"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz#661f271e5d59615b84b6801d1c2123ad13d9bd87"
|
||||
integrity sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==
|
||||
|
||||
"@esbuild/linux-x64@0.16.4":
|
||||
version "0.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.4.tgz#fdf494de07cda23a2dc4b71ff1e0848e4ee6539c"
|
||||
integrity sha512-N55Q0mJs3Sl8+utPRPBrL6NLYZKBCLLx0bme/+RbjvMforTGGzFvsRl4xLTZMUBFC1poDzBEPTEu5nxizQ9Nlw==
|
||||
"@esbuild/linux-x64@0.16.17":
|
||||
version "0.16.17"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz#e4ba18e8b149a89c982351443a377c723762b85f"
|
||||
integrity sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==
|
||||
|
||||
"@esbuild/netbsd-x64@0.16.4":
|
||||
version "0.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.4.tgz#b59ecb49087119c575c0f64d7e66001d52799e24"
|
||||
integrity sha512-LHSJLit8jCObEQNYkgsDYBh2JrJT53oJO2HVdkSYLa6+zuLJh0lAr06brXIkljrlI+N7NNW1IAXGn/6IZPi3YQ==
|
||||
"@esbuild/netbsd-x64@0.16.17":
|
||||
version "0.16.17"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz#7d4f4041e30c5c07dd24ffa295c73f06038ec775"
|
||||
integrity sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==
|
||||
|
||||
"@esbuild/openbsd-x64@0.16.4":
|
||||
version "0.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.4.tgz#c51e36db875948b7b11d08bafa355605a1aa289c"
|
||||
integrity sha512-nLgdc6tWEhcCFg/WVFaUxHcPK3AP/bh+KEwKtl69Ay5IBqUwKDaq/6Xk0E+fh/FGjnLwqFSsarsbPHeKM8t8Sw==
|
||||
"@esbuild/openbsd-x64@0.16.17":
|
||||
version "0.16.17"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz#970fa7f8470681f3e6b1db0cc421a4af8060ec35"
|
||||
integrity sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==
|
||||
|
||||
"@esbuild/sunos-x64@0.16.4":
|
||||
version "0.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.4.tgz#0b50e941cd44f069e9f2573321aec984244ec228"
|
||||
integrity sha512-08SluG24GjPO3tXKk95/85n9kpyZtXCVwURR2i4myhrOfi3jspClV0xQQ0W0PYWHioJj+LejFMt41q+PG3mlAQ==
|
||||
"@esbuild/sunos-x64@0.16.17":
|
||||
version "0.16.17"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz#abc60e7c4abf8b89fb7a4fe69a1484132238022c"
|
||||
integrity sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==
|
||||
|
||||
"@esbuild/win32-arm64@0.16.4":
|
||||
version "0.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.4.tgz#d1c93b20f17355ab2221cd18e13ae2f1b68013e3"
|
||||
integrity sha512-yYiRDQcqLYQSvNQcBKN7XogbrSvBE45FEQdH8fuXPl7cngzkCvpsG2H9Uey39IjQ6gqqc+Q4VXYHsQcKW0OMjQ==
|
||||
"@esbuild/win32-arm64@0.16.17":
|
||||
version "0.16.17"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz#7b0ff9e8c3265537a7a7b1fd9a24e7bd39fcd87a"
|
||||
integrity sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==
|
||||
|
||||
"@esbuild/win32-ia32@0.16.4":
|
||||
version "0.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.4.tgz#df5910e76660e0acbbdceb8d4ae6bf1efeade6ae"
|
||||
integrity sha512-5rabnGIqexekYkh9zXG5waotq8mrdlRoBqAktjx2W3kb0zsI83mdCwrcAeKYirnUaTGztR5TxXcXmQrEzny83w==
|
||||
"@esbuild/win32-ia32@0.16.17":
|
||||
version "0.16.17"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz#e90fe5267d71a7b7567afdc403dfd198c292eb09"
|
||||
integrity sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==
|
||||
|
||||
"@esbuild/win32-x64@0.16.4":
|
||||
version "0.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.4.tgz#6ec594468610c176933da1387c609558371d37e0"
|
||||
integrity sha512-sN/I8FMPtmtT2Yw+Dly8Ur5vQ5a/RmC8hW7jO9PtPSQUPkowxWpcUZnqOggU7VwyT3Xkj6vcXWd3V/qTXwultQ==
|
||||
"@esbuild/win32-x64@0.16.17":
|
||||
version "0.16.17"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz#c5a1a4bfe1b57f0c3e61b29883525c6da3e5c091"
|
||||
integrity sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==
|
||||
|
||||
"@eslint/eslintrc@^1.4.1":
|
||||
version "1.4.1"
|
||||
@ -237,10 +237,10 @@
|
||||
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
|
||||
integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
|
||||
|
||||
"@types/node@^18.11.18":
|
||||
version "18.11.18"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f"
|
||||
integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==
|
||||
"@types/node@^18.13.0":
|
||||
version "18.13.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.13.0.tgz#0400d1e6ce87e9d3032c19eb6c58205b0d3f7850"
|
||||
integrity sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==
|
||||
|
||||
"@types/spark-md5@^3.0.2":
|
||||
version "3.0.2"
|
||||
@ -420,6 +420,16 @@
|
||||
estree-walker "^2.0.2"
|
||||
source-map "^0.6.1"
|
||||
|
||||
"@vue/compiler-core@3.2.47":
|
||||
version "3.2.47"
|
||||
resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.47.tgz#3e07c684d74897ac9aa5922c520741f3029267f8"
|
||||
integrity sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==
|
||||
dependencies:
|
||||
"@babel/parser" "^7.16.4"
|
||||
"@vue/shared" "3.2.47"
|
||||
estree-walker "^2.0.2"
|
||||
source-map "^0.6.1"
|
||||
|
||||
"@vue/compiler-dom@3.2.45", "@vue/compiler-dom@^3.2.45":
|
||||
version "3.2.45"
|
||||
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz#c43cc15e50da62ecc16a42f2622d25dc5fd97dce"
|
||||
@ -428,7 +438,31 @@
|
||||
"@vue/compiler-core" "3.2.45"
|
||||
"@vue/shared" "3.2.45"
|
||||
|
||||
"@vue/compiler-sfc@3.2.45", "@vue/compiler-sfc@^3.2.45":
|
||||
"@vue/compiler-dom@3.2.47":
|
||||
version "3.2.47"
|
||||
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz#a0b06caf7ef7056939e563dcaa9cbde30794f305"
|
||||
integrity sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==
|
||||
dependencies:
|
||||
"@vue/compiler-core" "3.2.47"
|
||||
"@vue/shared" "3.2.47"
|
||||
|
||||
"@vue/compiler-sfc@3.2.47":
|
||||
version "3.2.47"
|
||||
resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz#1bdc36f6cdc1643f72e2c397eb1a398f5004ad3d"
|
||||
integrity sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==
|
||||
dependencies:
|
||||
"@babel/parser" "^7.16.4"
|
||||
"@vue/compiler-core" "3.2.47"
|
||||
"@vue/compiler-dom" "3.2.47"
|
||||
"@vue/compiler-ssr" "3.2.47"
|
||||
"@vue/reactivity-transform" "3.2.47"
|
||||
"@vue/shared" "3.2.47"
|
||||
estree-walker "^2.0.2"
|
||||
magic-string "^0.25.7"
|
||||
postcss "^8.1.10"
|
||||
source-map "^0.6.1"
|
||||
|
||||
"@vue/compiler-sfc@^3.2.45":
|
||||
version "3.2.45"
|
||||
resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz#7f7989cc04ec9e7c55acd406827a2c4e96872c70"
|
||||
integrity sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==
|
||||
@ -452,6 +486,14 @@
|
||||
"@vue/compiler-dom" "3.2.45"
|
||||
"@vue/shared" "3.2.45"
|
||||
|
||||
"@vue/compiler-ssr@3.2.47":
|
||||
version "3.2.47"
|
||||
resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz#35872c01a273aac4d6070ab9d8da918ab13057ee"
|
||||
integrity sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==
|
||||
dependencies:
|
||||
"@vue/compiler-dom" "3.2.47"
|
||||
"@vue/shared" "3.2.47"
|
||||
|
||||
"@vue/devtools-api@^6.2.1", "@vue/devtools-api@^6.4.5":
|
||||
version "6.4.5"
|
||||
resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.4.5.tgz#d54e844c1adbb1e677c81c665ecef1a2b4bb8380"
|
||||
@ -477,43 +519,66 @@
|
||||
estree-walker "^2.0.2"
|
||||
magic-string "^0.25.7"
|
||||
|
||||
"@vue/reactivity@3.2.45", "@vue/reactivity@^3.2.45":
|
||||
"@vue/reactivity-transform@3.2.47":
|
||||
version "3.2.47"
|
||||
resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz#e45df4d06370f8abf29081a16afd25cffba6d84e"
|
||||
integrity sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==
|
||||
dependencies:
|
||||
"@babel/parser" "^7.16.4"
|
||||
"@vue/compiler-core" "3.2.47"
|
||||
"@vue/shared" "3.2.47"
|
||||
estree-walker "^2.0.2"
|
||||
magic-string "^0.25.7"
|
||||
|
||||
"@vue/reactivity@3.2.47":
|
||||
version "3.2.47"
|
||||
resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.47.tgz#1d6399074eadfc3ed35c727e2fd707d6881140b6"
|
||||
integrity sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==
|
||||
dependencies:
|
||||
"@vue/shared" "3.2.47"
|
||||
|
||||
"@vue/reactivity@^3.2.45":
|
||||
version "3.2.45"
|
||||
resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.45.tgz#412a45b574de601be5a4a5d9a8cbd4dee4662ff0"
|
||||
integrity sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==
|
||||
dependencies:
|
||||
"@vue/shared" "3.2.45"
|
||||
|
||||
"@vue/runtime-core@3.2.45":
|
||||
version "3.2.45"
|
||||
resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.45.tgz#7ad7ef9b2519d41062a30c6fa001ec43ac549c7f"
|
||||
integrity sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==
|
||||
"@vue/runtime-core@3.2.47":
|
||||
version "3.2.47"
|
||||
resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.47.tgz#406ebade3d5551c00fc6409bbc1eeb10f32e121d"
|
||||
integrity sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==
|
||||
dependencies:
|
||||
"@vue/reactivity" "3.2.45"
|
||||
"@vue/shared" "3.2.45"
|
||||
"@vue/reactivity" "3.2.47"
|
||||
"@vue/shared" "3.2.47"
|
||||
|
||||
"@vue/runtime-dom@3.2.45":
|
||||
version "3.2.45"
|
||||
resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz#1a2ef6ee2ad876206fbbe2a884554bba2d0faf59"
|
||||
integrity sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==
|
||||
"@vue/runtime-dom@3.2.47":
|
||||
version "3.2.47"
|
||||
resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz#93e760eeaeab84dedfb7c3eaf3ed58d776299382"
|
||||
integrity sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==
|
||||
dependencies:
|
||||
"@vue/runtime-core" "3.2.45"
|
||||
"@vue/shared" "3.2.45"
|
||||
"@vue/runtime-core" "3.2.47"
|
||||
"@vue/shared" "3.2.47"
|
||||
csstype "^2.6.8"
|
||||
|
||||
"@vue/server-renderer@3.2.45":
|
||||
version "3.2.45"
|
||||
resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.45.tgz#ca9306a0c12b0530a1a250e44f4a0abac6b81f3f"
|
||||
integrity sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==
|
||||
"@vue/server-renderer@3.2.47":
|
||||
version "3.2.47"
|
||||
resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.47.tgz#8aa1d1871fc4eb5a7851aa7f741f8f700e6de3c0"
|
||||
integrity sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==
|
||||
dependencies:
|
||||
"@vue/compiler-ssr" "3.2.45"
|
||||
"@vue/shared" "3.2.45"
|
||||
"@vue/compiler-ssr" "3.2.47"
|
||||
"@vue/shared" "3.2.47"
|
||||
|
||||
"@vue/shared@3.2.45", "@vue/shared@^3.2.45":
|
||||
version "3.2.45"
|
||||
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.45.tgz#a3fffa7489eafff38d984e23d0236e230c818bc2"
|
||||
integrity sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==
|
||||
|
||||
"@vue/shared@3.2.47":
|
||||
version "3.2.47"
|
||||
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.47.tgz#e597ef75086c6e896ff5478a6bfc0a7aa4bbd14c"
|
||||
integrity sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==
|
||||
|
||||
"@vue/tsconfig@^0.1.3":
|
||||
version "0.1.3"
|
||||
resolved "https://registry.yarnpkg.com/@vue/tsconfig/-/tsconfig-0.1.3.tgz#4a61dbd29783d01ddab504276dcf0c2b6988654f"
|
||||
@ -812,33 +877,33 @@ es-to-primitive@^1.2.1:
|
||||
is-date-object "^1.0.1"
|
||||
is-symbol "^1.0.2"
|
||||
|
||||
esbuild@^0.16.3:
|
||||
version "0.16.4"
|
||||
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.4.tgz#06c86298d233386f5e41bcc14d36086daf3f40bd"
|
||||
integrity sha512-qQrPMQpPTWf8jHugLWHoGqZjApyx3OEm76dlTXobHwh/EBbavbRdjXdYi/GWr43GyN0sfpap14GPkb05NH3ROA==
|
||||
esbuild@^0.16.14:
|
||||
version "0.16.17"
|
||||
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.17.tgz#fc2c3914c57ee750635fee71b89f615f25065259"
|
||||
integrity sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==
|
||||
optionalDependencies:
|
||||
"@esbuild/android-arm" "0.16.4"
|
||||
"@esbuild/android-arm64" "0.16.4"
|
||||
"@esbuild/android-x64" "0.16.4"
|
||||
"@esbuild/darwin-arm64" "0.16.4"
|
||||
"@esbuild/darwin-x64" "0.16.4"
|
||||
"@esbuild/freebsd-arm64" "0.16.4"
|
||||
"@esbuild/freebsd-x64" "0.16.4"
|
||||
"@esbuild/linux-arm" "0.16.4"
|
||||
"@esbuild/linux-arm64" "0.16.4"
|
||||
"@esbuild/linux-ia32" "0.16.4"
|
||||
"@esbuild/linux-loong64" "0.16.4"
|
||||
"@esbuild/linux-mips64el" "0.16.4"
|
||||
"@esbuild/linux-ppc64" "0.16.4"
|
||||
"@esbuild/linux-riscv64" "0.16.4"
|
||||
"@esbuild/linux-s390x" "0.16.4"
|
||||
"@esbuild/linux-x64" "0.16.4"
|
||||
"@esbuild/netbsd-x64" "0.16.4"
|
||||
"@esbuild/openbsd-x64" "0.16.4"
|
||||
"@esbuild/sunos-x64" "0.16.4"
|
||||
"@esbuild/win32-arm64" "0.16.4"
|
||||
"@esbuild/win32-ia32" "0.16.4"
|
||||
"@esbuild/win32-x64" "0.16.4"
|
||||
"@esbuild/android-arm" "0.16.17"
|
||||
"@esbuild/android-arm64" "0.16.17"
|
||||
"@esbuild/android-x64" "0.16.17"
|
||||
"@esbuild/darwin-arm64" "0.16.17"
|
||||
"@esbuild/darwin-x64" "0.16.17"
|
||||
"@esbuild/freebsd-arm64" "0.16.17"
|
||||
"@esbuild/freebsd-x64" "0.16.17"
|
||||
"@esbuild/linux-arm" "0.16.17"
|
||||
"@esbuild/linux-arm64" "0.16.17"
|
||||
"@esbuild/linux-ia32" "0.16.17"
|
||||
"@esbuild/linux-loong64" "0.16.17"
|
||||
"@esbuild/linux-mips64el" "0.16.17"
|
||||
"@esbuild/linux-ppc64" "0.16.17"
|
||||
"@esbuild/linux-riscv64" "0.16.17"
|
||||
"@esbuild/linux-s390x" "0.16.17"
|
||||
"@esbuild/linux-x64" "0.16.17"
|
||||
"@esbuild/netbsd-x64" "0.16.17"
|
||||
"@esbuild/openbsd-x64" "0.16.17"
|
||||
"@esbuild/sunos-x64" "0.16.17"
|
||||
"@esbuild/win32-arm64" "0.16.17"
|
||||
"@esbuild/win32-ia32" "0.16.17"
|
||||
"@esbuild/win32-x64" "0.16.17"
|
||||
|
||||
escape-string-regexp@^1.0.5:
|
||||
version "1.0.5"
|
||||
@ -896,10 +961,10 @@ eslint-visitor-keys@^3.3.0:
|
||||
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
|
||||
integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
|
||||
|
||||
eslint@^8.33.0:
|
||||
version "8.33.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.33.0.tgz#02f110f32998cb598c6461f24f4d306e41ca33d7"
|
||||
integrity sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==
|
||||
eslint@^8.34.0:
|
||||
version "8.34.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.34.0.tgz#fe0ab0ef478104c1f9ebc5537e303d25a8fb22d6"
|
||||
integrity sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==
|
||||
dependencies:
|
||||
"@eslint/eslintrc" "^1.4.1"
|
||||
"@humanwhocodes/config-array" "^0.11.8"
|
||||
@ -1720,10 +1785,10 @@ postcss@^8.1.10:
|
||||
picocolors "^1.0.0"
|
||||
source-map-js "^1.0.2"
|
||||
|
||||
postcss@^8.4.20:
|
||||
version "8.4.20"
|
||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.20.tgz#64c52f509644cecad8567e949f4081d98349dc56"
|
||||
integrity sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==
|
||||
postcss@^8.4.21:
|
||||
version "8.4.21"
|
||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4"
|
||||
integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==
|
||||
dependencies:
|
||||
nanoid "^3.3.4"
|
||||
picocolors "^1.0.0"
|
||||
@ -1800,10 +1865,10 @@ rimraf@^3.0.2:
|
||||
dependencies:
|
||||
glob "^7.1.3"
|
||||
|
||||
rollup@^3.7.0:
|
||||
version "3.7.4"
|
||||
resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.7.4.tgz#993c3b30eff1df96f5eafb7c2ef7648960f2fa34"
|
||||
integrity sha512-jN9rx3k5pfg9H9al0r0y1EYKSeiRANZRYX32SuNXAnKzh6cVyf4LZVto1KAuDnbHT03E1CpsgqDKaqQ8FZtgxw==
|
||||
rollup@^3.10.0:
|
||||
version "3.14.0"
|
||||
resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.14.0.tgz#f5925255f3b6e8de1dba3916d7619c7da5708d95"
|
||||
integrity sha512-o23sdgCLcLSe3zIplT9nQ1+r97okuaiR+vmAPZPTDYB7/f3tgWIYNyiQveMsZwshBT0is4eGax/HH83Q7CG+/Q==
|
||||
optionalDependencies:
|
||||
fsevents "~2.3.2"
|
||||
|
||||
@ -1823,10 +1888,10 @@ safe-regex-test@^1.0.0:
|
||||
get-intrinsic "^1.1.3"
|
||||
is-regex "^1.1.4"
|
||||
|
||||
sass@^1.57.1:
|
||||
version "1.57.1"
|
||||
resolved "https://registry.yarnpkg.com/sass/-/sass-1.57.1.tgz#dfafd46eb3ab94817145e8825208ecf7281119b5"
|
||||
integrity sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw==
|
||||
sass@^1.58.0:
|
||||
version "1.58.0"
|
||||
resolved "https://registry.yarnpkg.com/sass/-/sass-1.58.0.tgz#ee8aea3ad5ea5c485c26b3096e2df6087d0bb1cc"
|
||||
integrity sha512-PiMJcP33DdKtZ/1jSjjqVIKihoDc6yWmYr9K/4r3fVVIEDAluD0q7XZiRKrNJcPK3qkLRF/79DND1H5q1LBjgg==
|
||||
dependencies:
|
||||
chokidar ">=3.0.0 <4.0.0"
|
||||
immutable "^4.0.0"
|
||||
@ -2032,10 +2097,10 @@ type-fest@^0.20.2:
|
||||
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
|
||||
integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
|
||||
|
||||
typescript@^4.9.4:
|
||||
version "4.9.4"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78"
|
||||
integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==
|
||||
typescript@^4.9.5:
|
||||
version "4.9.5"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a"
|
||||
integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==
|
||||
|
||||
unbox-primitive@^1.0.2:
|
||||
version "1.0.2"
|
||||
@ -2081,20 +2146,20 @@ vite-plugin-compression@^0.5.1:
|
||||
debug "^4.3.3"
|
||||
fs-extra "^10.0.0"
|
||||
|
||||
vite-plugin-css-injected-by-js@^2.4.0:
|
||||
version "2.4.0"
|
||||
resolved "https://registry.yarnpkg.com/vite-plugin-css-injected-by-js/-/vite-plugin-css-injected-by-js-2.4.0.tgz#32eb77e3ea0c45fbecf1c5f1e65703cccd42ecdb"
|
||||
integrity sha512-fQkJ5baPEasjjJLxHINLjXuPREO61VIDFUeUqleEBghOLfZZe/k/zrxG5b3kFZXu6JtdI11pnwtj3dh3CN9X4Q==
|
||||
vite-plugin-css-injected-by-js@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/vite-plugin-css-injected-by-js/-/vite-plugin-css-injected-by-js-3.0.0.tgz#9a45f628c5225a636281ac14ad90dea1f7aba4e1"
|
||||
integrity sha512-gJxLYkD0rLxGnqBHkFm0bUlYq9VWRT0Fr6lHYD3uRzgW5IGMSdLbNDapXUV57SSlYpvZUrXSlne1Y89BWF1Mgw==
|
||||
|
||||
vite@^4.0.4:
|
||||
version "4.0.4"
|
||||
resolved "https://registry.yarnpkg.com/vite/-/vite-4.0.4.tgz#4612ce0b47bbb233a887a54a4ae0c6e240a0da31"
|
||||
integrity sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==
|
||||
vite@^4.1.1:
|
||||
version "4.1.1"
|
||||
resolved "https://registry.yarnpkg.com/vite/-/vite-4.1.1.tgz#3b18b81a4e85ce3df5cbdbf4c687d93ebf402e6b"
|
||||
integrity sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==
|
||||
dependencies:
|
||||
esbuild "^0.16.3"
|
||||
postcss "^8.4.20"
|
||||
esbuild "^0.16.14"
|
||||
postcss "^8.4.21"
|
||||
resolve "^1.22.1"
|
||||
rollup "^3.7.0"
|
||||
rollup "^3.10.0"
|
||||
optionalDependencies:
|
||||
fsevents "~2.3.2"
|
||||
|
||||
@ -2144,16 +2209,16 @@ vue-tsc@^1.0.24:
|
||||
"@volar/vue-language-core" "1.0.24"
|
||||
"@volar/vue-typescript" "1.0.24"
|
||||
|
||||
vue@^3.2.45:
|
||||
version "3.2.45"
|
||||
resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.45.tgz#94a116784447eb7dbd892167784619fef379b3c8"
|
||||
integrity sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==
|
||||
vue@^3.2.47:
|
||||
version "3.2.47"
|
||||
resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.47.tgz#3eb736cbc606fc87038dbba6a154707c8a34cff0"
|
||||
integrity sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==
|
||||
dependencies:
|
||||
"@vue/compiler-dom" "3.2.45"
|
||||
"@vue/compiler-sfc" "3.2.45"
|
||||
"@vue/runtime-dom" "3.2.45"
|
||||
"@vue/server-renderer" "3.2.45"
|
||||
"@vue/shared" "3.2.45"
|
||||
"@vue/compiler-dom" "3.2.47"
|
||||
"@vue/compiler-sfc" "3.2.47"
|
||||
"@vue/runtime-dom" "3.2.47"
|
||||
"@vue/server-renderer" "3.2.47"
|
||||
"@vue/shared" "3.2.47"
|
||||
|
||||
which-boxed-primitive@^1.0.2:
|
||||
version "1.0.2"
|
||||
|
||||
Binary file not shown.
Loading…
Reference in New Issue
Block a user