From 371e405eed0c5018d5ed20d6e2a4f6017bb2dadf Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Thu, 30 Mar 2023 20:46:27 +0200 Subject: [PATCH] Added configuration of CMT modules frequency to webapp --- include/Configuration.h | 1 + include/WebApi_errors.h | 1 + include/defaults.h | 1 + src/Configuration.cpp | 2 ++ src/InverterSettings.cpp | 3 +++ src/WebApi_dtu.cpp | 17 +++++++++++++++-- webapp/src/locales/de.json | 4 ++++ webapp/src/locales/en.json | 4 ++++ webapp/src/locales/fr.json | 4 ++++ webapp/src/types/DtuConfig.ts | 1 + webapp/src/views/DtuAdminView.vue | 7 +++++++ 11 files changed, 43 insertions(+), 2 deletions(-) diff --git a/include/Configuration.h b/include/Configuration.h index 3b43198..6e98b34 100644 --- a/include/Configuration.h +++ b/include/Configuration.h @@ -84,6 +84,7 @@ struct CONFIG_T { uint32_t Dtu_PollInterval; uint8_t Dtu_NrfPaLevel; int8_t Dtu_CmtPaLevel; + uint32_t Dtu_CmtFrequency; bool Mqtt_Hass_Enabled; bool Mqtt_Hass_Retain; diff --git a/include/WebApi_errors.h b/include/WebApi_errors.h index 9a53759..e4ec788 100644 --- a/include/WebApi_errors.h +++ b/include/WebApi_errors.h @@ -13,6 +13,7 @@ enum WebApiError { DtuSerialZero, DtuPollZero, DtuInvalidPowerLevel, + DtuInvalidCmtFrequency, ConfigBase = 3000, ConfigNotDeleted, diff --git a/include/defaults.h b/include/defaults.h index c325081..70ab2a3 100644 --- a/include/defaults.h +++ b/include/defaults.h @@ -78,6 +78,7 @@ #define DTU_POLL_INTERVAL 5 #define DTU_NRF_PA_LEVEL 0 #define DTU_CMT_PA_LEVEL 0 +#define DTU_CMT_FREQUENCY 865000 #define MQTT_HASS_ENABLED false #define MQTT_HASS_EXPIRE true diff --git a/src/Configuration.cpp b/src/Configuration.cpp index 1427d2e..21df4f5 100644 --- a/src/Configuration.cpp +++ b/src/Configuration.cpp @@ -81,6 +81,7 @@ bool ConfigurationClass::write() dtu["poll_interval"] = config.Dtu_PollInterval; dtu["nrf_pa_level"] = config.Dtu_NrfPaLevel; dtu["cmt_pa_level"] = config.Dtu_CmtPaLevel; + dtu["cmt_frequency"] = config.Dtu_CmtFrequency; JsonObject security = doc.createNestedObject("security"); security["password"] = config.Security_Password; @@ -222,6 +223,7 @@ bool ConfigurationClass::read() config.Dtu_PollInterval = dtu["poll_interval"] | DTU_POLL_INTERVAL; config.Dtu_NrfPaLevel = dtu["nrf_pa_level"] | DTU_NRF_PA_LEVEL; config.Dtu_CmtPaLevel = dtu["cmt_pa_level"] | DTU_CMT_PA_LEVEL; + config.Dtu_CmtFrequency = dtu["cmt_frequency"] | DTU_CMT_FREQUENCY; JsonObject security = doc["security"]; strlcpy(config.Security_Password, security["password"] | ACCESS_POINT_PASSWORD, sizeof(config.Security_Password)); diff --git a/src/InverterSettings.cpp b/src/InverterSettings.cpp index 835e7bc..a11fb7e 100644 --- a/src/InverterSettings.cpp +++ b/src/InverterSettings.cpp @@ -44,6 +44,9 @@ void InverterSettingsClass::init() Hoymiles.getRadioNrf()->setDtuSerial(config.Dtu_Serial); Hoymiles.getRadioCmt()->setDtuSerial(config.Dtu_Serial); + MessageOutput.println(" Setting CMT target frequency... "); + Hoymiles.getRadioCmt()->setInverterTargetFrequency(config.Dtu_CmtFrequency); + MessageOutput.println(" Setting poll interval... "); Hoymiles.setPollInterval(config.Dtu_PollInterval); diff --git a/src/WebApi_dtu.cpp b/src/WebApi_dtu.cpp index 05cede7..c89fb78 100644 --- a/src/WebApi_dtu.cpp +++ b/src/WebApi_dtu.cpp @@ -44,6 +44,7 @@ void WebApiDtuClass::onDtuAdminGet(AsyncWebServerRequest* request) root["nrf_palevel"] = config.Dtu_NrfPaLevel; root["cmt_enabled"] = Hoymiles.getRadioCmt()->isInitialized(); root["cmt_palevel"] = config.Dtu_CmtPaLevel; + root["cmt_frequency"] = config.Dtu_CmtFrequency; response->setLength(); request->send(response); @@ -88,7 +89,7 @@ void WebApiDtuClass::onDtuAdminPost(AsyncWebServerRequest* request) return; } - if (!(root.containsKey("serial") && root.containsKey("pollinterval") && root.containsKey("nrf_palevel") && root.containsKey("cmt_palevel"))) { + if (!(root.containsKey("serial") && root.containsKey("pollinterval") && root.containsKey("nrf_palevel") && root.containsKey("cmt_palevel") && root.containsKey("cmt_frequency"))) { retMsg["message"] = "Values are missing!"; retMsg["code"] = WebApiError::GenericValueMissing; response->setLength(); @@ -121,13 +122,23 @@ void WebApiDtuClass::onDtuAdminPost(AsyncWebServerRequest* request) } if (root["cmt_palevel"].as() < -10 || root["cmt_palevel"].as() > 20) { - retMsg["message"] = F("Invalid power level setting!"); + retMsg["message"] = "Invalid power level setting!"; retMsg["code"] = WebApiError::DtuInvalidPowerLevel; response->setLength(); request->send(response); return; } + if (root["cmt_frequency"].as() < 860000 || root["cmt_frequency"].as() > 923000 || root["cmt_frequency"].as() % 250 > 0) { + retMsg["message"] = "Invalid CMT frequency setting!"; + retMsg["code"] = WebApiError::DtuInvalidCmtFrequency; + retMsg["param"]["min"] = 860000; + retMsg["param"]["max"] = 923000; + response->setLength(); + request->send(response); + return; + } + CONFIG_T& config = Configuration.get(); // Interpret the string as a hex value and convert it to uint64_t @@ -135,6 +146,7 @@ void WebApiDtuClass::onDtuAdminPost(AsyncWebServerRequest* request) config.Dtu_PollInterval = root["pollinterval"].as(); config.Dtu_NrfPaLevel = root["nrf_palevel"].as(); config.Dtu_CmtPaLevel = root["cmt_palevel"].as(); + config.Dtu_CmtFrequency = root["cmt_frequency"].as(); Configuration.write(); retMsg["type"] = "success"; @@ -148,5 +160,6 @@ void WebApiDtuClass::onDtuAdminPost(AsyncWebServerRequest* request) Hoymiles.getRadioCmt()->setPALevel(config.Dtu_CmtPaLevel); Hoymiles.getRadioNrf()->setDtuSerial(config.Dtu_Serial); Hoymiles.getRadioCmt()->setDtuSerial(config.Dtu_Serial); + Hoymiles.getRadioCmt()->setInverterTargetFrequency(config.Dtu_CmtFrequency); Hoymiles.setPollInterval(config.Dtu_PollInterval); } \ No newline at end of file diff --git a/webapp/src/locales/de.json b/webapp/src/locales/de.json index d5412f6..b23e874 100644 --- a/webapp/src/locales/de.json +++ b/webapp/src/locales/de.json @@ -40,6 +40,7 @@ "2001": "Die Seriennummer darf nicht 0 sein!", "2002": "Das Abfraginterval muss größer als 0 sein!", "2003": "Ungültige Sendeleistung angegeben!", + "2004": "Die Frequenz muss zwischen {min} und {max} kHz liegen und ein vielfaches von 250kHz betragen!", "3001": "Nichts gelöscht!", "3002": "Konfiguration zurückgesetzt. Starte jetzt neu...", "4001": "@:apiresponse.2001", @@ -326,6 +327,9 @@ "CmtPaLevel": "CMT2300A Sendeleistung:", "NrfPaLevelHint": "Verwendet für HM-Wechselrichter. Stellen Sie sicher, dass Ihre Stromversorgung stabil genug ist, bevor Sie die Sendeleistung erhöhen.", "CmtPaLevelHint": "Verwendet für HMS/HMT-Wechselrichter. Stellen Sie sicher, dass Ihre Stromversorgung stabil genug ist, bevor Sie die Sendeleistung erhöhen.", + "CmtFrequency": "CMT2300A Frequenz:", + "CmtFrequencyHint": "Stelle sicher, dass du nur Frequenzen verwendet werden welche im entsprechenden Land erlaubt sind!", + "khz": "kHz", "Save": "Speichern", "Min": "Minimum ({db} dBm)", "Low": "Niedrig ({db} dBm)", diff --git a/webapp/src/locales/en.json b/webapp/src/locales/en.json index a6c6c9d..0821269 100644 --- a/webapp/src/locales/en.json +++ b/webapp/src/locales/en.json @@ -40,6 +40,7 @@ "2001": "Serial cannot be zero!", "2002": "Poll interval must be greater zero!", "2003": "Invalid power level setting!", + "2004": "The frequency must be set between {min} and {max} kHz and must be a multiple of 250kHz!", "3001": "Not deleted anything!", "3002": "Configuration resettet. Rebooting now...", "4001": "@:apiresponse.2001", @@ -326,6 +327,9 @@ "CmtPaLevel": "CMT2300A Transmitting power:", "NrfPaLevelHint": "Used for HM-Inverters. Make sure your power supply is stable enough before increasing the transmit power.", "CmtPaLevelHint": "Used for HMS/HMT-Inverters. Make sure your power supply is stable enough before increasing the transmit power.", + "CmtFrequency": "CMT2300A Frequency:", + "CmtFrequencyHint": "Make sure to only use frequencies that are allowed in the respective country!", + "khz": "kHz", "Save": "Save", "Min": "Minimum ({db} dBm)", "Low": "Low ({db} dBm)", diff --git a/webapp/src/locales/fr.json b/webapp/src/locales/fr.json index 42d6cf1..c03fbd2 100644 --- a/webapp/src/locales/fr.json +++ b/webapp/src/locales/fr.json @@ -40,6 +40,7 @@ "2001": "Le numéro de série ne peut pas être nul !", "2002": "L'intervalle de sondage doit être supérieur à zéro !", "2003": "Réglage du niveau de puissance invalide !", + "2004": "The frequency must be set between {min} and {max} kHz and must be a multiple of 250kHz!", "3001": "Rien n'a été supprimé !", "3002": "Configuration réinitialisée. Redémarrage maintenant...", "4001": "@:apiresponse.2001", @@ -326,6 +327,9 @@ "CmtPaLevel": "CMT2300A Niveau de puissance d'émission", "NrfPaLevelHint": "Used for HM-Inverters. Assurez-vous que votre alimentation est suffisamment stable avant d'augmenter la puissance d'émission.", "CmtPaLevelHint": "Used for HMS/HMT-Inverters. Assurez-vous que votre alimentation est suffisamment stable avant d'augmenter la puissance d'émission.", + "CmtFrequency": "CMT2300A Frequency:", + "CmtFrequencyHint": "Stelle sicher, dass du nur Frequenzen verwendet werden welche im entsprechenden Land erlaubt sind!", + "khz": "kHz", "Save": "Sauvegarder", "Min": "Minimum ({db} dBm)", "Low": "Bas ({db} dBm)", diff --git a/webapp/src/types/DtuConfig.ts b/webapp/src/types/DtuConfig.ts index e6cc6b4..0354788 100644 --- a/webapp/src/types/DtuConfig.ts +++ b/webapp/src/types/DtuConfig.ts @@ -5,4 +5,5 @@ export interface DtuConfig { nrf_palevel: number; cmt_enabled: boolean; cmt_palevel: number; + cmt_frequency: number; } \ No newline at end of file diff --git a/webapp/src/views/DtuAdminView.vue b/webapp/src/views/DtuAdminView.vue index 07c2e1f..0e098d5 100644 --- a/webapp/src/views/DtuAdminView.vue +++ b/webapp/src/views/DtuAdminView.vue @@ -43,6 +43,13 @@ + +