Generate DTU ID dynamicly based on ESP chipID

This commit is contained in:
Thomas Basler 2022-10-20 21:00:26 +02:00
parent e8bb28d160
commit 359d513cfd
3 changed files with 41 additions and 3 deletions

View File

@ -6,4 +6,5 @@
class Utils {
public:
static uint32_t getChipId();
static uint64_t generateDtuSerial();
};

View File

@ -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;
}

View File

@ -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 <Arduino.h>
#include <LittleFS.h>
@ -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... "));