Merge branch 'master' into ve.direct
This commit is contained in:
commit
865c9cdac5
15
README.md
15
README.md
@ -19,6 +19,7 @@ It was the goal to replace the original Hoymiles DTU (Telemetry Gateway) with th
|
||||
## Features for end users
|
||||
* Read live data from inverter
|
||||
* Show inverters internal event log
|
||||
* Show inverter information like firmware version, firmware build date, hardware revision and hardware version
|
||||
* Uses ESP32 microcontroller and NRF24L01+
|
||||
* Multi-Inverter support
|
||||
* MQTT support (with TLS)
|
||||
@ -58,6 +59,7 @@ This can be achieved by editing the 'platformio.ini' file and add/change one or
|
||||
```
|
||||
|
||||
## Flashing and starting up
|
||||
### with Visual Studio Code
|
||||
* Install [Visual Studio Code](https://code.visualstudio.com/download)
|
||||
* In Visual Studio Code, install the [PlatformIO Extension](https://marketplace.visualstudio.com/items?itemName=platformio.platformio-ide)
|
||||
* Clone this repository (you really have to clone it, don't just download the ZIP file. During the build process the git hash gets embedded into the firmware. If you download the ZIP file a build error will occur)
|
||||
@ -66,6 +68,17 @@ This can be achieved by editing the 'platformio.ini' file and add/change one or
|
||||
* upload_port
|
||||
* monitor_port
|
||||
* Select the arrow button in the status bar (PlatformIO: Upload) to compile and upload the firmware. During the compilation, all required libraries are downloaded automatically.
|
||||
### on the commandline with PlatformIO Core
|
||||
* Install [PlatformIO Core](https://platformio.org/install/cli)
|
||||
* Clone this repository (you really have to clone it, don't just download the ZIP file. During the build process the git hash gets embedded into the firmware. If you download the ZIP file a build error will occur)
|
||||
* Adjust the COM port in the file "platformio.ini". It occurs twice:
|
||||
* upload_port
|
||||
* monitor_port
|
||||
* build: `platformio run -e generic`
|
||||
* upload to esp module: `platformio run -e generic -t upload`
|
||||
* other options:
|
||||
* clean the sources: `platformio run -e generic -t clean`
|
||||
* erase flash: `platformio run -e generic -t erase`
|
||||
|
||||
## First configuration
|
||||
* After the initial flashing of the microcontroller, an Access Point called "OpenDTU-*" is opened. The default password is "openDTU42".
|
||||
@ -80,10 +93,12 @@ This can be achieved by editing the 'platformio.ini' file and add/change one or
|
||||
* Building the WebApp
|
||||
* The WebApp can be build using yarn
|
||||
```
|
||||
$ cd webapp
|
||||
$ yarn install
|
||||
$ yarn build
|
||||
```
|
||||
* The updated output is placed in the 'webapp_dist' directory
|
||||
* It is only necessary to build the webapp when you made changes to it
|
||||
|
||||
* Building the microcontroller firmware
|
||||
* Visual Studio Code with the PlatformIO Extension is required for building
|
||||
|
||||
@ -16,7 +16,10 @@ if missing_pkgs:
|
||||
from dulwich import porcelain
|
||||
|
||||
def get_firmware_specifier_build_flag():
|
||||
build_version = porcelain.describe('.') # '.' refers to the repository root dir
|
||||
try:
|
||||
build_version = porcelain.describe('.') # '.' refers to the repository root dir
|
||||
except:
|
||||
build_version = "g0000000"
|
||||
build_flag = "-D AUTO_GIT_HASH=\\\"" + build_version + "\\\""
|
||||
print ("Firmware Revision: " + build_version)
|
||||
return (build_flag)
|
||||
|
||||
@ -49,7 +49,7 @@ void HoymilesClass::loop()
|
||||
|
||||
std::shared_ptr<InverterAbstract> HoymilesClass::addInverter(const char* name, uint64_t serial)
|
||||
{
|
||||
std::shared_ptr<InverterAbstract> i;
|
||||
std::shared_ptr<InverterAbstract> i = nullptr;
|
||||
if (HM_4CH::isValidSerial(serial)) {
|
||||
i = std::make_shared<HM_4CH>(serial);
|
||||
} else if (HM_2CH::isValidSerial(serial)) {
|
||||
|
||||
@ -13,7 +13,7 @@ default_envs = generic
|
||||
|
||||
[env]
|
||||
framework = arduino
|
||||
platform = espressif32@>4
|
||||
platform = espressif32@>=5
|
||||
|
||||
build_flags =
|
||||
-D=${PIOENV}
|
||||
@ -23,7 +23,7 @@ lib_deps =
|
||||
https://github.com/me-no-dev/ESPAsyncWebServer.git
|
||||
bblanchon/ArduinoJson @ ^6.19.4
|
||||
https://github.com/bertmelis/espMqttClient.git
|
||||
nrf24/RF24 @ ^1.4.2
|
||||
nrf24/RF24 @ ^1.4.5
|
||||
|
||||
extra_scripts =
|
||||
pre:auto_firmware_version.py
|
||||
@ -39,6 +39,7 @@ board = esp32dev
|
||||
monitor_port = COM4
|
||||
upload_port = COM4
|
||||
|
||||
|
||||
[env:olimex_esp32_poe]
|
||||
; https://www.olimex.com/Products/IoT/ESP32/ESP32-POE/open-source-hardware
|
||||
|
||||
@ -55,17 +56,17 @@ build_flags = ${env.build_flags}
|
||||
monitor_port = COM3
|
||||
upload_port = COM3
|
||||
|
||||
|
||||
[env:d1 mini esp32]
|
||||
build_flags =
|
||||
${env.build_flags}
|
||||
-DHOYMILES_PIN_MISO=19
|
||||
-DHOYMILES_PIN_MOSI=23
|
||||
-DHOYMILES_PIN_SCLK=18
|
||||
-DHOYMILES_PIN_IRQ=16
|
||||
-DHOYMILES_PIN_CE=17
|
||||
-DHOYMILES_PIN_CS=5
|
||||
-DVICTRON_PIN_TX=21
|
||||
-DVICTRON_PIN_RX=22
|
||||
board = wemos_d1_mini32
|
||||
build_flags =
|
||||
${env.build_flags}
|
||||
-DHOYMILES_PIN_MISO=19
|
||||
-DHOYMILES_PIN_MOSI=23
|
||||
-DHOYMILES_PIN_SCLK=18
|
||||
-DHOYMILES_PIN_IRQ=16
|
||||
-DHOYMILES_PIN_CE=17
|
||||
-DHOYMILES_PIN_CS=5
|
||||
|
||||
monitor_port = /dev/cu.usbserial-01E68DD0
|
||||
upload_port = /dev/cu.usbserial-01E68DD0
|
||||
|
||||
@ -141,8 +141,10 @@ void WebApiInverterClass::onInverterAdd(AsyncWebServerRequest* request)
|
||||
|
||||
auto inv = Hoymiles.addInverter(inverter->Name, inverter->Serial);
|
||||
|
||||
for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) {
|
||||
inv->Statistics()->setChannelMaxPower(c, inverter->MaxChannelPower[c]);
|
||||
if (inv != nullptr) {
|
||||
for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) {
|
||||
inv->Statistics()->setChannelMaxPower(c, inverter->MaxChannelPower[c]);
|
||||
}
|
||||
}
|
||||
|
||||
MqttHassPublishing.forceUpdate();
|
||||
@ -243,14 +245,18 @@ void WebApiInverterClass::onInverterEdit(AsyncWebServerRequest* request)
|
||||
|
||||
std::shared_ptr<InverterAbstract> inv = Hoymiles.getInverterByPos(root[F("id")].as<uint64_t>());
|
||||
|
||||
if (inv->serial() != inverter.Serial) {
|
||||
if (inv != nullptr && inv->serial() != inverter.Serial) {
|
||||
// Serial was changed
|
||||
Hoymiles.removeInverterByPos(root[F("id")].as<uint64_t>());
|
||||
inv = Hoymiles.addInverter(inverter.Name, inverter.Serial);
|
||||
} else if (inv == nullptr) {
|
||||
inv = Hoymiles.addInverter(inverter.Name, inverter.Serial);
|
||||
}
|
||||
|
||||
for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) {
|
||||
inv->Statistics()->setChannelMaxPower(c, inverter.MaxChannelPower[c]);
|
||||
if (inv != nullptr) {
|
||||
for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) {
|
||||
inv->Statistics()->setChannelMaxPower(c, inverter.MaxChannelPower[c]);
|
||||
}
|
||||
}
|
||||
|
||||
MqttHassPublishing.forceUpdate();
|
||||
|
||||
17
src/main.cpp
17
src/main.cpp
@ -83,19 +83,32 @@ void setup()
|
||||
Serial.print(F("Initialize Hoymiles interface... "));
|
||||
CONFIG_T& config = Configuration.get();
|
||||
Hoymiles.init();
|
||||
|
||||
Serial.println(F(" Setting radio PA level... "));
|
||||
Hoymiles.getRadio()->setPALevel((rf24_pa_dbm_e)config.Dtu_PaLevel);
|
||||
|
||||
Serial.println(F(" Setting DTU serial... "));
|
||||
Hoymiles.getRadio()->setDtuSerial(config.Dtu_Serial);
|
||||
|
||||
Serial.println(F(" Setting poll interval... "));
|
||||
Hoymiles.setPollInterval(config.Dtu_PollInterval);
|
||||
|
||||
for (uint8_t i = 0; i < INV_MAX_COUNT; i++) {
|
||||
if (config.Inverter[i].Serial > 0) {
|
||||
Serial.print(F(" Adding inverter: "));
|
||||
Serial.print(config.Inverter[i].Serial, HEX);
|
||||
Serial.print(F(" - "));
|
||||
Serial.print(config.Inverter[i].Name);
|
||||
auto inv = Hoymiles.addInverter(
|
||||
config.Inverter[i].Name,
|
||||
config.Inverter[i].Serial);
|
||||
|
||||
for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) {
|
||||
inv->Statistics()->setChannelMaxPower(c, config.Inverter[i].MaxChannelPower[c]);
|
||||
if (inv != nullptr) {
|
||||
for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) {
|
||||
inv->Statistics()->setChannelMaxPower(c, config.Inverter[i].MaxChannelPower[c]);
|
||||
}
|
||||
}
|
||||
Serial.println(F(" done"));
|
||||
}
|
||||
}
|
||||
Serial.println(F("done"));
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
"lint": "vue-cli-service lint"
|
||||
},
|
||||
"dependencies": {
|
||||
"@popperjs/core": "^2.11.5",
|
||||
"@popperjs/core": "^2.11.6",
|
||||
"bootstrap": "^5.2.0",
|
||||
"bootstrap-icons-vue": "^1.8.1",
|
||||
"core-js": "^3.24.1",
|
||||
@ -21,16 +21,16 @@
|
||||
"@babel/core": "^7.18.10",
|
||||
"@babel/eslint-parser": "^7.18.9",
|
||||
"@types/bootstrap": "^5.2.1",
|
||||
"@types/node": "^18.6.4",
|
||||
"@types/node": "^18.7.4",
|
||||
"@types/spark-md5": "^3.0.2",
|
||||
"@typescript-eslint/parser": "^5.32.0",
|
||||
"@typescript-eslint/parser": "^5.33.0",
|
||||
"@vue/cli-plugin-babel": "~5.0.8",
|
||||
"@vue/cli-plugin-eslint": "~5.0.8",
|
||||
"@vue/cli-plugin-router": "^5.0.6",
|
||||
"@vue/cli-plugin-typescript": "^5.0.8",
|
||||
"@vue/cli-service": "~5.0.8",
|
||||
"@vue/eslint-config-typescript": "^11.0.0",
|
||||
"eslint": "^8.21.0",
|
||||
"eslint": "^8.22.0",
|
||||
"eslint-plugin-vue": "^9.3.0",
|
||||
"typescript": "^4.7.4",
|
||||
"vue-cli-plugin-compression": "~1.2.0"
|
||||
|
||||
@ -1164,7 +1164,12 @@
|
||||
resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1"
|
||||
integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==
|
||||
|
||||
"@popperjs/core@^2.11.5", "@popperjs/core@^2.9.2":
|
||||
"@popperjs/core@^2.11.6":
|
||||
version "2.11.6"
|
||||
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45"
|
||||
integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==
|
||||
|
||||
"@popperjs/core@^2.9.2":
|
||||
version "2.11.5"
|
||||
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.5.tgz#db5a11bf66bdab39569719555b0f76e138d7bd64"
|
||||
integrity sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==
|
||||
@ -1318,11 +1323,16 @@
|
||||
resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c"
|
||||
integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==
|
||||
|
||||
"@types/node@*", "@types/node@^18.6.4":
|
||||
"@types/node@*":
|
||||
version "18.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.6.4.tgz#fd26723a8a3f8f46729812a7f9b4fc2d1608ed39"
|
||||
integrity sha512-I4BD3L+6AWiUobfxZ49DlU43gtI+FTHSv9pE2Zekg6KjMpre4ByusaljW3vYSLJrvQ1ck1hUaeVu8HVlY3vzHg==
|
||||
|
||||
"@types/node@^18.7.4":
|
||||
version "18.7.4"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.4.tgz#95baa50846ae112a7376869d49fec23b2506c69d"
|
||||
integrity sha512-RzRcw8c0B8LzryWOR4Wj7YOTFXvdYKwvrb6xQQyuDfnlTxwYXGCV5RZ/TEbq5L5kn+w3rliHAUyRcG1RtbmTFg==
|
||||
|
||||
"@types/normalize-package-data@^2.4.0":
|
||||
version "2.4.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301"
|
||||
@ -1402,7 +1412,7 @@
|
||||
semver "^7.3.7"
|
||||
tsutils "^3.21.0"
|
||||
|
||||
"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.32.0":
|
||||
"@typescript-eslint/parser@^5.0.0":
|
||||
version "5.32.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.32.0.tgz#1de243443bc6186fb153b9e395b842e46877ca5d"
|
||||
integrity sha512-IxRtsehdGV9GFQ35IGm5oKKR2OGcazUoiNBxhRV160iF9FoyuXxjY+rIqs1gfnd+4eL98OjeGnMpE7RF/NBb3A==
|
||||
@ -1412,6 +1422,16 @@
|
||||
"@typescript-eslint/typescript-estree" "5.32.0"
|
||||
debug "^4.3.4"
|
||||
|
||||
"@typescript-eslint/parser@^5.33.0":
|
||||
version "5.33.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.33.0.tgz#26ec3235b74f0667414613727cb98f9b69dc5383"
|
||||
integrity sha512-cgM5cJrWmrDV2KpvlcSkelTBASAs1mgqq+IUGKJvFxWrapHpaRy5EXPQz9YaKF3nZ8KY18ILTiVpUtbIac86/w==
|
||||
dependencies:
|
||||
"@typescript-eslint/scope-manager" "5.33.0"
|
||||
"@typescript-eslint/types" "5.33.0"
|
||||
"@typescript-eslint/typescript-estree" "5.33.0"
|
||||
debug "^4.3.4"
|
||||
|
||||
"@typescript-eslint/scope-manager@5.29.0":
|
||||
version "5.29.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.29.0.tgz#2a6a32e3416cb133e9af8dcf54bf077a916aeed3"
|
||||
@ -1428,6 +1448,14 @@
|
||||
"@typescript-eslint/types" "5.32.0"
|
||||
"@typescript-eslint/visitor-keys" "5.32.0"
|
||||
|
||||
"@typescript-eslint/scope-manager@5.33.0":
|
||||
version "5.33.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.33.0.tgz#509d7fa540a2c58f66bdcfcf278a3fa79002e18d"
|
||||
integrity sha512-/Jta8yMNpXYpRDl8EwF/M8It2A9sFJTubDo0ATZefGXmOqlaBffEw0ZbkbQ7TNDK6q55NPHFshGBPAZvZkE8Pw==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "5.33.0"
|
||||
"@typescript-eslint/visitor-keys" "5.33.0"
|
||||
|
||||
"@typescript-eslint/type-utils@5.29.0":
|
||||
version "5.29.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.29.0.tgz#241918001d164044020b37d26d5b9f4e37cc3d5d"
|
||||
@ -1447,6 +1475,11 @@
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.32.0.tgz#484273021eeeae87ddb288f39586ef5efeb6dcd8"
|
||||
integrity sha512-EBUKs68DOcT/EjGfzywp+f8wG9Zw6gj6BjWu7KV/IYllqKJFPlZlLSYw/PTvVyiRw50t6wVbgv4p9uE2h6sZrQ==
|
||||
|
||||
"@typescript-eslint/types@5.33.0":
|
||||
version "5.33.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.33.0.tgz#d41c584831805554b063791338b0220b613a275b"
|
||||
integrity sha512-nIMt96JngB4MYFYXpZ/3ZNU4GWPNdBbcB5w2rDOCpXOVUkhtNlG2mmm8uXhubhidRZdwMaMBap7Uk8SZMU/ppw==
|
||||
|
||||
"@typescript-eslint/typescript-estree@5.29.0":
|
||||
version "5.29.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.29.0.tgz#e83d19aa7fd2e74616aab2f25dfbe4de4f0b5577"
|
||||
@ -1473,6 +1506,19 @@
|
||||
semver "^7.3.7"
|
||||
tsutils "^3.21.0"
|
||||
|
||||
"@typescript-eslint/typescript-estree@5.33.0":
|
||||
version "5.33.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.0.tgz#02d9c9ade6f4897c09e3508c27de53ad6bfa54cf"
|
||||
integrity sha512-tqq3MRLlggkJKJUrzM6wltk8NckKyyorCSGMq4eVkyL5sDYzJJcMgZATqmF8fLdsWrW7OjjIZ1m9v81vKcaqwQ==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "5.33.0"
|
||||
"@typescript-eslint/visitor-keys" "5.33.0"
|
||||
debug "^4.3.4"
|
||||
globby "^11.1.0"
|
||||
is-glob "^4.0.3"
|
||||
semver "^7.3.7"
|
||||
tsutils "^3.21.0"
|
||||
|
||||
"@typescript-eslint/utils@5.29.0":
|
||||
version "5.29.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.29.0.tgz#775046effd5019667bd086bcf326acbe32cd0082"
|
||||
@ -1501,6 +1547,14 @@
|
||||
"@typescript-eslint/types" "5.32.0"
|
||||
eslint-visitor-keys "^3.3.0"
|
||||
|
||||
"@typescript-eslint/visitor-keys@5.33.0":
|
||||
version "5.33.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.0.tgz#fbcbb074e460c11046e067bc3384b5d66b555484"
|
||||
integrity sha512-/XsqCzD4t+Y9p5wd9HZiptuGKBlaZO5showwqODii5C0nZawxWLF+Q6k5wYHBrQv96h6GYKyqqMHCSTqta8Kiw==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "5.33.0"
|
||||
eslint-visitor-keys "^3.3.0"
|
||||
|
||||
"@vue/babel-helper-vue-jsx-merge-props@^1.2.1":
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz#31624a7a505fb14da1d58023725a4c5f270e6a81"
|
||||
@ -3235,10 +3289,10 @@ eslint-webpack-plugin@^3.1.0:
|
||||
normalize-path "^3.0.0"
|
||||
schema-utils "^3.1.1"
|
||||
|
||||
eslint@^8.21.0:
|
||||
version "8.21.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.21.0.tgz#1940a68d7e0573cef6f50037addee295ff9be9ef"
|
||||
integrity sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==
|
||||
eslint@^8.22.0:
|
||||
version "8.22.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.22.0.tgz#78fcb044196dfa7eef30a9d65944f6f980402c48"
|
||||
integrity sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==
|
||||
dependencies:
|
||||
"@eslint/eslintrc" "^1.3.0"
|
||||
"@humanwhocodes/config-array" "^0.10.4"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user