make inverter and channel selectable
This commit is contained in:
parent
73fe3bfb96
commit
56151b0d12
@ -106,6 +106,8 @@ struct CONFIG_T {
|
|||||||
char PowerLimiter_MqttTopicPowerMeter2[MQTT_MAX_TOPIC_STRLEN + 1];
|
char PowerLimiter_MqttTopicPowerMeter2[MQTT_MAX_TOPIC_STRLEN + 1];
|
||||||
char PowerLimiter_MqttTopicPowerMeter3[MQTT_MAX_TOPIC_STRLEN + 1];
|
char PowerLimiter_MqttTopicPowerMeter3[MQTT_MAX_TOPIC_STRLEN + 1];
|
||||||
bool PowerLimiter_IsInverterBehindPowerMeter;
|
bool PowerLimiter_IsInverterBehindPowerMeter;
|
||||||
|
uint8_t PowerLimiter_InverterId;
|
||||||
|
uint8_t PowerLimiter_InverterChannelId;
|
||||||
uint32_t PowerLimiter_LowerPowerLimit;
|
uint32_t PowerLimiter_LowerPowerLimit;
|
||||||
uint32_t PowerLimiter_UpperPowerLimit;
|
uint32_t PowerLimiter_UpperPowerLimit;
|
||||||
uint32_t PowerLimiter_BatterySocStartThreshold;
|
uint32_t PowerLimiter_BatterySocStartThreshold;
|
||||||
|
|||||||
@ -96,6 +96,8 @@
|
|||||||
#define POWERLIMITER_SOLAR_PASSTROUGH_ENABLED true
|
#define POWERLIMITER_SOLAR_PASSTROUGH_ENABLED true
|
||||||
#define POWERLIMITER_INTERVAL 10
|
#define POWERLIMITER_INTERVAL 10
|
||||||
#define POWERLIMITER_IS_INVERTER_BEHIND_POWER_METER true
|
#define POWERLIMITER_IS_INVERTER_BEHIND_POWER_METER true
|
||||||
|
#define POWERLIMITER_INVERTER_ID 0
|
||||||
|
#define POWERLIMITER_INVERTER_CHANNEL_ID 0
|
||||||
#define POWERLIMITER_LOWER_POWER_LIMIT 10
|
#define POWERLIMITER_LOWER_POWER_LIMIT 10
|
||||||
#define POWERLIMITER_UPPER_POWER_LIMIT 800
|
#define POWERLIMITER_UPPER_POWER_LIMIT 800
|
||||||
#define POWERLIMITER_BATTERY_SOC_START_THRESHOLD 80
|
#define POWERLIMITER_BATTERY_SOC_START_THRESHOLD 80
|
||||||
|
|||||||
@ -123,6 +123,8 @@ bool ConfigurationClass::write()
|
|||||||
powerlimiter["mqtt_topic_powermeter_2"] = config.PowerLimiter_MqttTopicPowerMeter2;
|
powerlimiter["mqtt_topic_powermeter_2"] = config.PowerLimiter_MqttTopicPowerMeter2;
|
||||||
powerlimiter["mqtt_topic_powermeter_3"] = config.PowerLimiter_MqttTopicPowerMeter3;
|
powerlimiter["mqtt_topic_powermeter_3"] = config.PowerLimiter_MqttTopicPowerMeter3;
|
||||||
powerlimiter["is_inverter_behind_powermeter"] = config.PowerLimiter_IsInverterBehindPowerMeter;
|
powerlimiter["is_inverter_behind_powermeter"] = config.PowerLimiter_IsInverterBehindPowerMeter;
|
||||||
|
powerlimiter["inverter_id"] = config.PowerLimiter_InverterId;
|
||||||
|
powerlimiter["inverter_channel_id"] = config.PowerLimiter_InverterChannelId;
|
||||||
powerlimiter["lower_power_limit"] = config.PowerLimiter_LowerPowerLimit;
|
powerlimiter["lower_power_limit"] = config.PowerLimiter_LowerPowerLimit;
|
||||||
powerlimiter["upper_power_limit"] = config.PowerLimiter_UpperPowerLimit;
|
powerlimiter["upper_power_limit"] = config.PowerLimiter_UpperPowerLimit;
|
||||||
powerlimiter["battery_soc_start_threshold"] = config.PowerLimiter_BatterySocStartThreshold;
|
powerlimiter["battery_soc_start_threshold"] = config.PowerLimiter_BatterySocStartThreshold;
|
||||||
@ -284,6 +286,8 @@ bool ConfigurationClass::read()
|
|||||||
strlcpy(config.PowerLimiter_MqttTopicPowerMeter2, powerlimiter["mqtt_topic_powermeter_2"] | "", sizeof(config.PowerLimiter_MqttTopicPowerMeter2));
|
strlcpy(config.PowerLimiter_MqttTopicPowerMeter2, powerlimiter["mqtt_topic_powermeter_2"] | "", sizeof(config.PowerLimiter_MqttTopicPowerMeter2));
|
||||||
strlcpy(config.PowerLimiter_MqttTopicPowerMeter3, powerlimiter["mqtt_topic_powermeter_3"] | "", sizeof(config.PowerLimiter_MqttTopicPowerMeter3));
|
strlcpy(config.PowerLimiter_MqttTopicPowerMeter3, powerlimiter["mqtt_topic_powermeter_3"] | "", sizeof(config.PowerLimiter_MqttTopicPowerMeter3));
|
||||||
config.PowerLimiter_IsInverterBehindPowerMeter = powerlimiter["is_inverter_behind_powermeter"] | POWERLIMITER_IS_INVERTER_BEHIND_POWER_METER;
|
config.PowerLimiter_IsInverterBehindPowerMeter = powerlimiter["is_inverter_behind_powermeter"] | POWERLIMITER_IS_INVERTER_BEHIND_POWER_METER;
|
||||||
|
config.PowerLimiter_InverterId = powerlimiter["inverter_id"] | POWERLIMITER_INVERTER_ID;
|
||||||
|
config.PowerLimiter_InverterChannelId = powerlimiter["inverter_channel_id"] | POWERLIMITER_INVERTER_CHANNEL_ID;
|
||||||
config.PowerLimiter_LowerPowerLimit = powerlimiter["lower_power_limit"] | POWERLIMITER_LOWER_POWER_LIMIT;
|
config.PowerLimiter_LowerPowerLimit = powerlimiter["lower_power_limit"] | POWERLIMITER_LOWER_POWER_LIMIT;
|
||||||
config.PowerLimiter_UpperPowerLimit = powerlimiter["upper_power_limit"] | POWERLIMITER_UPPER_POWER_LIMIT;
|
config.PowerLimiter_UpperPowerLimit = powerlimiter["upper_power_limit"] | POWERLIMITER_UPPER_POWER_LIMIT;
|
||||||
config.PowerLimiter_BatterySocStartThreshold = powerlimiter["battery_soc_start_threshold"] | POWERLIMITER_BATTERY_SOC_START_THRESHOLD;
|
config.PowerLimiter_BatterySocStartThreshold = powerlimiter["battery_soc_start_threshold"] | POWERLIMITER_BATTERY_SOC_START_THRESHOLD;
|
||||||
|
|||||||
@ -78,13 +78,13 @@ void PowerLimiterClass::loop()
|
|||||||
|
|
||||||
_lastLoop = millis();
|
_lastLoop = millis();
|
||||||
|
|
||||||
std::shared_ptr<InverterAbstract> inverter = Hoymiles.getInverterByPos(1); // TODO(helgeerbe) make Inverter selectable
|
std::shared_ptr<InverterAbstract> inverter = Hoymiles.getInverterByPos(config.PowerLimiter_InverterId);
|
||||||
|
|
||||||
if (inverter == nullptr || !inverter->isReachable()) {
|
if (inverter == nullptr || !inverter->isReachable()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
float dcVoltage = inverter->Statistics()->getChannelFieldValue(TYPE_DC, CH0, FLD_UDC); // TODO(helgeerbe) make channel selectable
|
float dcVoltage = inverter->Statistics()->getChannelFieldValue(TYPE_DC, (ChannelNum_t) config.PowerLimiter_InverterChannelId, FLD_UDC);
|
||||||
|
|
||||||
if ((millis() - inverter->Statistics()->getLastUpdate()) > 10000) {
|
if ((millis() - inverter->Statistics()->getLastUpdate()) > 10000) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -40,6 +40,8 @@ void WebApiPowerLimiterClass::onStatus(AsyncWebServerRequest* request)
|
|||||||
root[F("mqtt_topic_powermeter_2")] = config.PowerLimiter_MqttTopicPowerMeter2;
|
root[F("mqtt_topic_powermeter_2")] = config.PowerLimiter_MqttTopicPowerMeter2;
|
||||||
root[F("mqtt_topic_powermeter_3")] = config.PowerLimiter_MqttTopicPowerMeter3;
|
root[F("mqtt_topic_powermeter_3")] = config.PowerLimiter_MqttTopicPowerMeter3;
|
||||||
root[F("is_inverter_behind_powermeter")] = config.PowerLimiter_IsInverterBehindPowerMeter;
|
root[F("is_inverter_behind_powermeter")] = config.PowerLimiter_IsInverterBehindPowerMeter;
|
||||||
|
root[F("inverter_id")] = config.PowerLimiter_InverterId;
|
||||||
|
root[F("inverter_channel_id")] = config.PowerLimiter_InverterChannelId;
|
||||||
root[F("lower_power_limit")] = config.PowerLimiter_LowerPowerLimit;
|
root[F("lower_power_limit")] = config.PowerLimiter_LowerPowerLimit;
|
||||||
root[F("upper_power_limit")] = config.PowerLimiter_UpperPowerLimit;
|
root[F("upper_power_limit")] = config.PowerLimiter_UpperPowerLimit;
|
||||||
root[F("battery_soc_start_threshold")] = config.PowerLimiter_BatterySocStartThreshold;
|
root[F("battery_soc_start_threshold")] = config.PowerLimiter_BatterySocStartThreshold;
|
||||||
@ -97,7 +99,10 @@ void WebApiPowerLimiterClass::onAdminPost(AsyncWebServerRequest* request)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(root.containsKey("enabled") && root.containsKey("lower_power_limit"))) {
|
if (!(root.containsKey("enabled")
|
||||||
|
&& root.containsKey("lower_power_limit")
|
||||||
|
&& root.containsKey("inverter_id")
|
||||||
|
&& root.containsKey("inverter_channel_id"))) {
|
||||||
retMsg[F("message")] = F("Values are missing!");
|
retMsg[F("message")] = F("Values are missing!");
|
||||||
response->setLength();
|
response->setLength();
|
||||||
request->send(response);
|
request->send(response);
|
||||||
@ -111,6 +116,8 @@ void WebApiPowerLimiterClass::onAdminPost(AsyncWebServerRequest* request)
|
|||||||
strlcpy(config.PowerLimiter_MqttTopicPowerMeter2, root[F("mqtt_topic_powermeter_2")].as<String>().c_str(), sizeof(config.PowerLimiter_MqttTopicPowerMeter2));
|
strlcpy(config.PowerLimiter_MqttTopicPowerMeter2, root[F("mqtt_topic_powermeter_2")].as<String>().c_str(), sizeof(config.PowerLimiter_MqttTopicPowerMeter2));
|
||||||
strlcpy(config.PowerLimiter_MqttTopicPowerMeter3, root[F("mqtt_topic_powermeter_3")].as<String>().c_str(), sizeof(config.PowerLimiter_MqttTopicPowerMeter3));
|
strlcpy(config.PowerLimiter_MqttTopicPowerMeter3, root[F("mqtt_topic_powermeter_3")].as<String>().c_str(), sizeof(config.PowerLimiter_MqttTopicPowerMeter3));
|
||||||
config.PowerLimiter_IsInverterBehindPowerMeter = root[F("is_inverter_behind_powermeter")].as<bool>();
|
config.PowerLimiter_IsInverterBehindPowerMeter = root[F("is_inverter_behind_powermeter")].as<bool>();
|
||||||
|
config.PowerLimiter_InverterId = root[F("inverter_id")].as<uint8_t>();
|
||||||
|
config.PowerLimiter_InverterChannelId = root[F("inverter_channel_id")].as<uint8_t>();
|
||||||
config.PowerLimiter_LowerPowerLimit = root[F("lower_power_limit")].as<uint32_t>();
|
config.PowerLimiter_LowerPowerLimit = root[F("lower_power_limit")].as<uint32_t>();
|
||||||
config.PowerLimiter_UpperPowerLimit = root[F("upper_power_limit")].as<uint32_t>();
|
config.PowerLimiter_UpperPowerLimit = root[F("upper_power_limit")].as<uint32_t>();
|
||||||
config.PowerLimiter_BatterySocStartThreshold = root[F("battery_soc_start_threshold")].as<float>();
|
config.PowerLimiter_BatterySocStartThreshold = root[F("battery_soc_start_threshold")].as<float>();
|
||||||
|
|||||||
@ -443,6 +443,12 @@
|
|||||||
"UpdatesOnly": "Nur Änderungen senden:",
|
"UpdatesOnly": "Nur Änderungen senden:",
|
||||||
"Save": "@:dtuadmin.Save"
|
"Save": "@:dtuadmin.Save"
|
||||||
},
|
},
|
||||||
|
"powerlimiteradmin": {
|
||||||
|
"InverterId": "Wechselrichter ID",
|
||||||
|
"InverterIdHint": "Wähle den Wechselrichter an dem die Batterie hängt.",
|
||||||
|
"InverterChannelId": "Kanal ID",
|
||||||
|
"InverterChannelIdHint": "Wähle den Kanal an dem die Batterie hängt."
|
||||||
|
},
|
||||||
"batteryadmin": {
|
"batteryadmin": {
|
||||||
"BatterySettings": "Batterie Einstellungen",
|
"BatterySettings": "Batterie Einstellungen",
|
||||||
"BatteryConfiguration": "Batterie Konfiguration",
|
"BatteryConfiguration": "Batterie Konfiguration",
|
||||||
|
|||||||
@ -450,6 +450,10 @@
|
|||||||
"Enable": "Enable",
|
"Enable": "Enable",
|
||||||
"EnableSolarPasstrough": "Enable Solar Passtrough",
|
"EnableSolarPasstrough": "Enable Solar Passtrough",
|
||||||
"SolarpasstroughInfo": "When the sun is shining, this setting enables the sychronization of the inverter limit with the current solar power of the Victron MPPT charger. This optimizes battery degradation and loses.",
|
"SolarpasstroughInfo": "When the sun is shining, this setting enables the sychronization of the inverter limit with the current solar power of the Victron MPPT charger. This optimizes battery degradation and loses.",
|
||||||
|
"InverterId": "Inverter ID",
|
||||||
|
"InverterIdHint": "Select proper inverter ID where battery is connected to.",
|
||||||
|
"InverterChannelId": "Channel ID",
|
||||||
|
"InverterChannelIdHint": "Select proper channel where battery is connected to.",
|
||||||
"LowerPowerLimit": "Lower power limit / continuous feed",
|
"LowerPowerLimit": "Lower power limit / continuous feed",
|
||||||
"UpperPowerLimit": "Upper power limit",
|
"UpperPowerLimit": "Upper power limit",
|
||||||
"PowerMeters": "Power meters - MQTT",
|
"PowerMeters": "Power meters - MQTT",
|
||||||
|
|||||||
@ -5,6 +5,8 @@ export interface PowerLimiterConfig {
|
|||||||
mqtt_topic_powermeter_2: string;
|
mqtt_topic_powermeter_2: string;
|
||||||
mqtt_topic_powermeter_3: string;
|
mqtt_topic_powermeter_3: string;
|
||||||
is_inverter_behind_powermeter: boolean;
|
is_inverter_behind_powermeter: boolean;
|
||||||
|
inverterId: number;
|
||||||
|
inverterChannelId: number;
|
||||||
lower_power_limit: number;
|
lower_power_limit: number;
|
||||||
upper_power_limit: number;
|
upper_power_limit: number;
|
||||||
battery_soc_start_threshold: number;
|
battery_soc_start_threshold: number;
|
||||||
|
|||||||
@ -5,172 +5,182 @@
|
|||||||
</BootstrapAlert>
|
</BootstrapAlert>
|
||||||
|
|
||||||
<form @submit="savePowerLimiterConfig">
|
<form @submit="savePowerLimiterConfig">
|
||||||
<div class="card">
|
<CardElement :text="$t('powerlimiteradmin.General')" textVariant="text-bg-primary">
|
||||||
<div class="card-header text-bg-primary">{{ $t('powerlimiteradmin.General') }}</div>
|
<InputElement :label="$t('powerlimiteradmin.Enable')"
|
||||||
<div class="card-body">
|
v-model="powerLimiterConfigList.enabled"
|
||||||
|
type="checkbox" wide/>
|
||||||
<div class="row mb-3">
|
|
||||||
<label class="col-sm-2 form-check-label" for="inputPowerlimiter">{{ $t('powerlimiteradmin.Enable') }}</label>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<div class="form-check form-switch">
|
|
||||||
<input class="form-check-input" type="checkbox" id="inputPowerlimiter"
|
|
||||||
v-model="powerLimiterConfigList.enabled" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row mb-3">
|
|
||||||
<label class="col-sm-2 form-check-label" for="solarPasstroughEnabled">{{ $t('powerlimiteradmin.EnableSolarPasstrough') }}</label>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<div class="form-check form-switch">
|
|
||||||
<input class="form-check-input" type="checkbox" id="solarPasstroughEnabled"
|
|
||||||
v-model="powerLimiterConfigList.solar_passtrough_enabled" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="alert alert-secondary" role="alert" v-html="$t('powerlimiteradmin.SolarpasstroughInfo')"></div>
|
|
||||||
|
|
||||||
<div class="row mb-3">
|
|
||||||
<label for="inputLowerPowerLimit" class="col-sm-2 col-form-label">{{ $t('powerlimiteradmin.LowerPowerLimit') }}:</label>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<div class="input-group">
|
|
||||||
<input type="number" class="form-control" id="inputLowerPowerLimit"
|
|
||||||
placeholder="50" min="10" v-model="powerLimiterConfigList.lower_power_limit"
|
|
||||||
aria-describedby="lowerPowerLimitDescription" />
|
|
||||||
<span class="input-group-text" id="lowerPowerLimitDescription">W</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row mb-3">
|
|
||||||
<label for="inputUpperPowerLimit" class="col-sm-2 col-form-label">{{ $t('powerlimiteradmin.UpperPowerLimit') }}:</label>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<div class="input-group">
|
|
||||||
<input type="number" class="form-control" id="inputUpperPowerLimit"
|
|
||||||
placeholder="800" v-model="powerLimiterConfigList.upper_power_limit"
|
|
||||||
aria-describedby="upperPowerLimitDescription" />
|
|
||||||
<span class="input-group-text" id="upperPowerLimitDescription">W</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card mt-5">
|
|
||||||
<div class="card-header text-bg-primary">{{ $t('powerlimiteradmin.PowerMeters') }}</div>
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="row mb-3">
|
|
||||||
<label for="inputMqttTopicPowerMeter1" class="col-sm-2 col-form-label">{{ $t('powerlimiteradmin.MqttTopicPowerMeter1') }}:</label>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<div class="input-group">
|
|
||||||
<input type="text" class="form-control" id="inputMqttTopicPowerMeter1"
|
|
||||||
placeholder="shellies/shellyem3/emeter/0/power" v-model="powerLimiterConfigList.mqtt_topic_powermeter_1" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row mb-3">
|
<InputElement v-show="powerLimiterConfigList.enabled"
|
||||||
<label for="inputMqttTopicPowerMeter2" class="col-sm-2 col-form-label">{{ $t('powerlimiteradmin.MqttTopicPowerMeter2') }}:</label>
|
:label="$t('powerlimiteradmin.EnableSolarPasstrough')"
|
||||||
<div class="col-sm-10">
|
v-model="powerLimiterConfigList.solar_passtrough_enabled"
|
||||||
<div class="input-group">
|
type="checkbox" wide/>
|
||||||
<input type="text" class="form-control" id="inputMqttTopicPowerMeter2"
|
|
||||||
placeholder="shellies/shellyem3/emeter/1/power" v-model="powerLimiterConfigList.mqtt_topic_powermeter_2" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row mb-3">
|
<div class="alert alert-secondary" v-show="powerLimiterConfigList.enabled" role="alert" v-html="$t('powerlimiteradmin.SolarpasstroughInfo')"></div>
|
||||||
<label for="inputMqttTopicPowerMeter3" class="col-sm-2 col-form-label">{{ $t('powerlimiteradmin.MqttTopicPowerMeter3') }}:</label>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<div class="input-group">
|
|
||||||
<input type="text" class="form-control" id="inputMqttTopicPowerMeter3"
|
|
||||||
placeholder="shellies/shellyem3/emeter/2/power" v-model="powerLimiterConfigList.mqtt_topic_powermeter_3" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row mb-3">
|
<div class="row mb-3">
|
||||||
<label class="col-sm-2 form-check-label" for="inputRetain">{{ $t('powerlimiteradmin.InverterIsBehindPowerMeter') }}</label>
|
<label for="inputTimezone" class="col-sm-2 col-form-label">
|
||||||
<div class="col-sm-10">
|
{{ $t('powerlimiteradmin.InverterId') }}
|
||||||
<div class="form-check form-switch">
|
<BIconInfoCircle v-tooltip :title="$t('powerlimiteradmin.InverterIdHint')" />
|
||||||
<input class="form-check-input" type="checkbox" id="inputIsInverterBehindPowerMeter"
|
</label>
|
||||||
v-model="powerLimiterConfigList.is_inverter_behind_powermeter" />
|
<div class="col-sm-10">
|
||||||
</div>
|
<select class="form-select" v-model="powerLimiterConfigList.inverterId">
|
||||||
|
<option v-for="inverter in inverterList" :key="inverter.key" :value="inverter.key">
|
||||||
|
{{ inverter.value }}
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row mb-3">
|
||||||
|
<label for="inputTimezone" class="col-sm-2 col-form-label">
|
||||||
|
{{ $t('powerlimiteradmin.InverterChannelId') }}
|
||||||
|
<BIconInfoCircle v-tooltip :title="$t('powerlimiteradmin.InverterChannelIdHint')" />
|
||||||
|
</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<select class="form-select" v-model="powerLimiterConfigList.inverterChannelId">
|
||||||
|
<option v-for="inverterChannel in inverterChannelList" :key="inverterChannel.key" :value="inverterChannel.key">
|
||||||
|
{{ inverterChannel.value }}
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row mb-3" v-show="powerLimiterConfigList.enabled">
|
||||||
|
<label for="inputLowerPowerLimit" class="col-sm-2 col-form-label">{{ $t('powerlimiteradmin.LowerPowerLimit') }}:</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="number" class="form-control" id="inputLowerPowerLimit"
|
||||||
|
placeholder="50" min="10" v-model="powerLimiterConfigList.lower_power_limit"
|
||||||
|
aria-describedby="lowerPowerLimitDescription" />
|
||||||
|
<span class="input-group-text" id="lowerPowerLimitDescription">W</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card mt-5">
|
<div class="row mb-3" v-show="powerLimiterConfigList.enabled">
|
||||||
<div class="card-header text-bg-primary">{{ $t('powerlimiteradmin.Battery') }}</div>
|
<label for="inputUpperPowerLimit" class="col-sm-2 col-form-label">{{ $t('powerlimiteradmin.UpperPowerLimit') }}:</label>
|
||||||
<div class="card-body">
|
<div class="col-sm-10">
|
||||||
|
<div class="input-group">
|
||||||
<div class="row mb-3">
|
<input type="number" class="form-control" id="inputUpperPowerLimit"
|
||||||
<label for="batterySocStartThreshold" class="col-sm-2 col-form-label">{{ $t('powerlimiteradmin.BatterySocStartThreshold') }}:</label>
|
placeholder="800" v-model="powerLimiterConfigList.upper_power_limit"
|
||||||
<div class="col-sm-10">
|
aria-describedby="upperPowerLimitDescription" />
|
||||||
<div class="input-group">
|
<span class="input-group-text" id="upperPowerLimitDescription">W</span>
|
||||||
<input type="number" class="form-control" id="batterySocStartThreshold"
|
|
||||||
placeholder="80" v-model="powerLimiterConfigList.battery_soc_start_threshold"
|
|
||||||
aria-describedby="batterySocStartThresholdDescription" min="0" max="100" />
|
|
||||||
<span class="input-group-text" id="batterySocStartThresholdDescription">%</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row mb-3">
|
|
||||||
<label for="batterySocStopThreshold" class="col-sm-2 col-form-label">{{ $t('powerlimiteradmin.BatterySocStopThreshold') }}</label>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<div class="input-group">
|
|
||||||
<input type="number" class="form-control" id="batterySocStopThreshold"
|
|
||||||
placeholder="20" v-model="powerLimiterConfigList.battery_soc_stop_threshold"
|
|
||||||
aria-describedby="batterySocStopThresholdDescription" min="0" max="100" />
|
|
||||||
<span class="input-group-text" id="batterySocStopThresholdDescription">%</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="alert alert-secondary" role="alert" v-html="$t('powerlimiteradmin.BatterySocInfo')"></div>
|
|
||||||
|
|
||||||
<div class="row mb-3">
|
|
||||||
<label for="inputVoltageStartThreshold" class="col-sm-2 col-form-label">{{ $t('powerlimiteradmin.VoltageStartThreshold') }}:</label>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<div class="input-group">
|
|
||||||
<input type="number" step="0.01" class="form-control" id="inputVoltageStartThreshold"
|
|
||||||
placeholder="50" v-model="powerLimiterConfigList.voltage_start_threshold"
|
|
||||||
aria-describedby="voltageStartThresholdDescription" />
|
|
||||||
<span class="input-group-text" id="voltageStartThresholdDescription">V</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row mb-3">
|
|
||||||
<label for="inputVoltageStopThreshold" class="col-sm-2 col-form-label">{{ $t('powerlimiteradmin.VoltageStopThreshold') }}:</label>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<div class="input-group">
|
|
||||||
<input type="number" step="0.01" class="form-control" id="inputVoltageStopThreshold"
|
|
||||||
placeholder="49" v-model="powerLimiterConfigList.voltage_stop_threshold"
|
|
||||||
aria-describedby="voltageStopThresholdDescription" />
|
|
||||||
<span class="input-group-text" id="voltageStopThresholdDescription">V</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row mb-3">
|
|
||||||
<label for="inputVoltageLoadCorrectionFactor" class="col-sm-2 col-form-label">{{ $t('powerlimiteradmin.VoltageLoadCorrectionFactor') }}:</label>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<div class="input-group">
|
|
||||||
<input type="number" step="0.0001" class="form-control" id="inputVoltageLoadCorrectionFactor"
|
|
||||||
placeholder="49" v-model="powerLimiterConfigList.voltage_load_correction_factor"
|
|
||||||
aria-describedby="voltageLoadCorrectionFactorDescription" />
|
|
||||||
<span class="input-group-text" id="voltageLoadCorrectionFactorDescription">V</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="alert alert-secondary" role="alert" v-html="$t('powerlimiteradmin.VoltageLoadCorrectionInfo')"></div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</CardElement>
|
||||||
|
|
||||||
|
<CardElement :text="$t('powerlimiteradmin.PowerMeters')" textVariant="text-bg-primary" add-space
|
||||||
|
v-show="powerLimiterConfigList.enabled"
|
||||||
|
>
|
||||||
|
<div class="row mb-3">
|
||||||
|
<label for="inputMqttTopicPowerMeter1" class="col-sm-2 col-form-label">{{ $t('powerlimiteradmin.MqttTopicPowerMeter1') }}:</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="text" class="form-control" id="inputMqttTopicPowerMeter1"
|
||||||
|
placeholder="shellies/shellyem3/emeter/0/power" v-model="powerLimiterConfigList.mqtt_topic_powermeter_1" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row mb-3">
|
||||||
|
<label for="inputMqttTopicPowerMeter2" class="col-sm-2 col-form-label">{{ $t('powerlimiteradmin.MqttTopicPowerMeter2') }}:</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="text" class="form-control" id="inputMqttTopicPowerMeter2"
|
||||||
|
placeholder="shellies/shellyem3/emeter/1/power" v-model="powerLimiterConfigList.mqtt_topic_powermeter_2" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row mb-3">
|
||||||
|
<label for="inputMqttTopicPowerMeter3" class="col-sm-2 col-form-label">{{ $t('powerlimiteradmin.MqttTopicPowerMeter3') }}:</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="text" class="form-control" id="inputMqttTopicPowerMeter3"
|
||||||
|
placeholder="shellies/shellyem3/emeter/2/power" v-model="powerLimiterConfigList.mqtt_topic_powermeter_3" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row mb-3">
|
||||||
|
<label class="col-sm-2 form-check-label" for="inputRetain">{{ $t('powerlimiteradmin.InverterIsBehindPowerMeter') }}</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<div class="form-check form-switch">
|
||||||
|
<input class="form-check-input" type="checkbox" id="inputIsInverterBehindPowerMeter"
|
||||||
|
v-model="powerLimiterConfigList.is_inverter_behind_powermeter" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</CardElement>
|
||||||
|
|
||||||
|
<CardElement :text="$t('powerlimiteradmin.Battery')" textVariant="text-bg-primary" add-space
|
||||||
|
v-show="powerLimiterConfigList.enabled"
|
||||||
|
>
|
||||||
|
<div class="row mb-3">
|
||||||
|
<label for="batterySocStartThreshold" class="col-sm-2 col-form-label">{{ $t('powerlimiteradmin.BatterySocStartThreshold') }}:</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="number" class="form-control" id="batterySocStartThreshold"
|
||||||
|
placeholder="80" v-model="powerLimiterConfigList.battery_soc_start_threshold"
|
||||||
|
aria-describedby="batterySocStartThresholdDescription" min="0" max="100" />
|
||||||
|
<span class="input-group-text" id="batterySocStartThresholdDescription">%</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row mb-3">
|
||||||
|
<label for="batterySocStopThreshold" class="col-sm-2 col-form-label">{{ $t('powerlimiteradmin.BatterySocStopThreshold') }}</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="number" class="form-control" id="batterySocStopThreshold"
|
||||||
|
placeholder="20" v-model="powerLimiterConfigList.battery_soc_stop_threshold"
|
||||||
|
aria-describedby="batterySocStopThresholdDescription" min="0" max="100" />
|
||||||
|
<span class="input-group-text" id="batterySocStopThresholdDescription">%</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="alert alert-secondary" role="alert" v-html="$t('powerlimiteradmin.BatterySocInfo')"></div>
|
||||||
|
|
||||||
|
<div class="row mb-3">
|
||||||
|
<label for="inputVoltageStartThreshold" class="col-sm-2 col-form-label">{{ $t('powerlimiteradmin.VoltageStartThreshold') }}:</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="number" step="0.01" class="form-control" id="inputVoltageStartThreshold"
|
||||||
|
placeholder="50" v-model="powerLimiterConfigList.voltage_start_threshold"
|
||||||
|
aria-describedby="voltageStartThresholdDescription" />
|
||||||
|
<span class="input-group-text" id="voltageStartThresholdDescription">V</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row mb-3">
|
||||||
|
<label for="inputVoltageStopThreshold" class="col-sm-2 col-form-label">{{ $t('powerlimiteradmin.VoltageStopThreshold') }}:</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="number" step="0.01" class="form-control" id="inputVoltageStopThreshold"
|
||||||
|
placeholder="49" v-model="powerLimiterConfigList.voltage_stop_threshold"
|
||||||
|
aria-describedby="voltageStopThresholdDescription" />
|
||||||
|
<span class="input-group-text" id="voltageStopThresholdDescription">V</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row mb-3">
|
||||||
|
<label for="inputVoltageLoadCorrectionFactor" class="col-sm-2 col-form-label">{{ $t('powerlimiteradmin.VoltageLoadCorrectionFactor') }}:</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="number" step="0.0001" class="form-control" id="inputVoltageLoadCorrectionFactor"
|
||||||
|
placeholder="49" v-model="powerLimiterConfigList.voltage_load_correction_factor"
|
||||||
|
aria-describedby="voltageLoadCorrectionFactorDescription" />
|
||||||
|
<span class="input-group-text" id="voltageLoadCorrectionFactorDescription">V</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="alert alert-secondary" role="alert" v-html="$t('powerlimiteradmin.VoltageLoadCorrectionInfo')"></div>
|
||||||
|
</CardElement>
|
||||||
|
|
||||||
<button type="submit" class="btn btn-primary mb-3">{{ $t('powerlimiteradmin.Save') }}</button>
|
<button type="submit" class="btn btn-primary mb-3">{{ $t('powerlimiteradmin.Save') }}</button>
|
||||||
</form>
|
</form>
|
||||||
@ -182,17 +192,42 @@ import { defineComponent } from 'vue';
|
|||||||
import BasePage from '@/components/BasePage.vue';
|
import BasePage from '@/components/BasePage.vue';
|
||||||
import BootstrapAlert from "@/components/BootstrapAlert.vue";
|
import BootstrapAlert from "@/components/BootstrapAlert.vue";
|
||||||
import { handleResponse, authHeader } from '@/utils/authentication';
|
import { handleResponse, authHeader } from '@/utils/authentication';
|
||||||
|
import CardElement from '@/components/CardElement.vue';
|
||||||
|
import InputElement from '@/components/InputElement.vue';
|
||||||
|
import { BIconInfoCircle } from 'bootstrap-icons-vue';
|
||||||
import type { PowerLimiterConfig } from "@/types/PowerLimiterConfig";
|
import type { PowerLimiterConfig } from "@/types/PowerLimiterConfig";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
BasePage,
|
BasePage,
|
||||||
BootstrapAlert,
|
BootstrapAlert,
|
||||||
|
CardElement,
|
||||||
|
InputElement,
|
||||||
|
BIconInfoCircle,
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
dataLoading: true,
|
dataLoading: true,
|
||||||
powerLimiterConfigList: {} as PowerLimiterConfig,
|
powerLimiterConfigList: {} as PowerLimiterConfig,
|
||||||
|
inverterList: [
|
||||||
|
{ key: 0, value: "ID 00" },
|
||||||
|
{ key: 1, value: "ID 01" },
|
||||||
|
{ key: 2, value: "ID 02" },
|
||||||
|
{ key: 3, value: "ID 03" },
|
||||||
|
{ key: 4, value: "ID 04" },
|
||||||
|
{ key: 5, value: "ID 05" },
|
||||||
|
{ key: 6, value: "ID 06" },
|
||||||
|
{ key: 7, value: "ID 07" },
|
||||||
|
{ key: 8, value: "ID 08" },
|
||||||
|
{ key: 9, value: "ID 09" },
|
||||||
|
{ key: 10, value: "ID 10" },
|
||||||
|
],
|
||||||
|
inverterChannelList: [
|
||||||
|
{ key: 0, value: "CH 0" },
|
||||||
|
{ key: 1, value: "CH 1" },
|
||||||
|
{ key: 2, value: "CH 2" },
|
||||||
|
{ key: 3, value: "CH 3" },
|
||||||
|
],
|
||||||
alertMessage: "",
|
alertMessage: "",
|
||||||
alertType: "info",
|
alertType: "info",
|
||||||
showAlert: false,
|
showAlert: false,
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user