diff --git a/include/Utils.h b/include/Utils.h index b4387b8..dbcea81 100644 --- a/include/Utils.h +++ b/include/Utils.h @@ -6,4 +6,5 @@ class Utils { public: static uint32_t getChipId(); + static uint64_t generateDtuSerial(); }; diff --git a/src/Utils.cpp b/src/Utils.cpp index 17769b7..7fd090d 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -8,4 +8,27 @@ uint32_t Utils::getChipId() chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i; } return chipId; +} + +uint64_t Utils::generateDtuSerial() +{ + uint32_t chipId = getChipId(); + uint64_t dtuId = 0; + + // Product category (char 1-4): 1 = Micro Inverter, 999 = Dummy + dtuId |= 0x199900000000; + + // Year of production (char 5): 1 equals 2015 so hard code 8 = 2022 + dtuId |= 0x80000000; + + // Week of production (char 6-7): Range is 1-52 s hard code 1 = week 1 + dtuId |= 0x0100000; + + // Running Number (char 8-12): Derived from the ESP chip id + for (uint8_t i = 0; i < 5; i++) { + dtuId |= (chipId % 10) << (i * 4); + chipId /= 10; + } + + return dtuId; } \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 0aa72ea..6004b44 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7,9 +7,10 @@ #include "MqttHassPublishing.h" #include "MqttPublishing.h" #include "MqttSettings.h" -#include "NtpSettings.h" -#include "WebApi.h" #include "NetworkSettings.h" +#include "NtpSettings.h" +#include "Utils.h" +#include "WebApi.h" #include "defaults.h" #include #include @@ -76,9 +77,22 @@ void setup() WebApi.init(); Serial.println(F("done")); + // Check for default DTU serial + Serial.print(F("Check for default DTU serial... ")); + CONFIG_T& config = Configuration.get(); + if (config.Dtu_Serial == DTU_SERIAL) { + Serial.print(F("generate serial based on ESP chip id: ")); + uint64_t dtuId = Utils::generateDtuSerial(); + Serial.printf("%0x%08x... ", + ((uint32_t)((dtuId >> 32) & 0xFFFFFFFF)), + ((uint32_t)(dtuId & 0xFFFFFFFF))); + config.Dtu_Serial = dtuId; + Configuration.write(); + } + Serial.println(F("done")); + // Initialize inverter communication Serial.print(F("Initialize Hoymiles interface... ")); - const CONFIG_T& config = Configuration.get(); Hoymiles.init(); Serial.println(F(" Setting radio PA level... "));