The local mode, offered by the menu that picks the mode
Modbus TCP has been a working control path since the server learned to dial the charger, and the Charging page has asked for the address it needs — but the Control mode selector never listed it. The mode could be reached only by writing it through the API, which is to say not at all. Both selectors now offer it, and both stop offering what it does not use: the OCPP provisioning card and its "Use this one" button are gated on the modes where the charger dials us, and Modbus gets a line saying where its address is asked for instead. On the phone that gate is more than tidiness — the field is a DropdownButtonFormField, so a mode saved from the web left it holding a value none of its items matched. Strings added in en/da/pl for both apps. The mode hint no longer says control happens "over OCPP", because it no longer always does. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
1aedc0ddc7
commit
f025dc100f
@@ -321,13 +321,15 @@
|
||||
"country": "Land",
|
||||
"countryHint": "Landekode på to bogstaver for din Anker-konto (f.eks. DE, GB, US).",
|
||||
"controlMode": "Styringstilstand",
|
||||
"controlModeHint": "Hvordan DriverVault styrer laderen over OCPP.",
|
||||
"controlModeHint": "Hvordan DriverVault styrer laderen.",
|
||||
"controlOff": "Fra (kun overvågning)",
|
||||
"controlOwn": "Eget CSMS (fuld styring)",
|
||||
"controlProxy": "Proxy-CSMS (videresendelse + styring)",
|
||||
"controlModbus": "Modbus TCP (lokalt netværk)",
|
||||
"controlTitle": "Laderstyring (OCPP)",
|
||||
"controlOwnHint": "Laderen forbinder direkte til DriverVault som sit centralsystem. Peg laderens OCPP-backend på endepunktet nedenfor.",
|
||||
"controlProxyHint": "DriverVault videresender til Ankers sky og kan indsætte kommandoer. Peg laderens OCPP-backend på endepunktet nedenfor.",
|
||||
"controlModbusHint": "DriverVault kontakter selv laderen på dit lokale netværk, så der er ingen adresse at pege laderen mod her. Slå Modbus TCP til i Anker-appen, og indtast den adresse, den viser, ved siden af laderens betjening på Opladning-siden.",
|
||||
"controlProvisionSteps": "I Anker-appen (eller laderens OCPP-indstillinger) sættes OCPP-backend-URL'en til endepunktet og autorisationsnøglen til tokenet ovenfor.",
|
||||
"chargerSerial": "Laderens serienummer",
|
||||
"controlCheck": "Tjek status",
|
||||
|
||||
@@ -201,13 +201,15 @@
|
||||
"country": "Country",
|
||||
"countryHint": "Two-letter country code of your Anker account (e.g. DE, GB, US).",
|
||||
"controlMode": "Control mode",
|
||||
"controlModeHint": "How DriverVault controls the charger over OCPP.",
|
||||
"controlModeHint": "How DriverVault controls the charger.",
|
||||
"controlOff": "Off (monitoring only)",
|
||||
"controlOwn": "Own CSMS (full control)",
|
||||
"controlProxy": "Proxy CSMS (relay + control)",
|
||||
"controlModbus": "Modbus TCP (local network)",
|
||||
"controlTitle": "Charger control (OCPP)",
|
||||
"controlOwnHint": "The charger connects directly to DriverVault as its Central System. Point the charger's OCPP backend at the endpoint below.",
|
||||
"controlProxyHint": "DriverVault relays to Anker's cloud and can inject commands. Point the charger's OCPP backend at the endpoint below.",
|
||||
"controlModbusHint": "DriverVault dials the charger on your local network, so there is nothing to point at an endpoint here. Enable Modbus TCP in the Anker app, then enter the address it shows beside the charger's controls on the Charging page.",
|
||||
"controlProvisionSteps": "In the Anker app (or the charger's OCPP settings), set the OCPP backend URL to the endpoint and the authorization key to the token above.",
|
||||
"chargerSerial": "Charger serial",
|
||||
"controlCheck": "Check status",
|
||||
|
||||
@@ -325,13 +325,15 @@
|
||||
"country": "Kraj",
|
||||
"countryHint": "Dwuliterowy kod kraju Twojego konta Anker (np. DE, GB, US).",
|
||||
"controlMode": "Tryb sterowania",
|
||||
"controlModeHint": "Sposób, w jaki DriverVault steruje ładowarką przez OCPP.",
|
||||
"controlModeHint": "Sposób, w jaki DriverVault steruje ładowarką.",
|
||||
"controlOff": "Wyłączone (tylko monitorowanie)",
|
||||
"controlOwn": "Własny CSMS (pełne sterowanie)",
|
||||
"controlProxy": "CSMS pośredniczący (przekazywanie + sterowanie)",
|
||||
"controlModbus": "Modbus TCP (sieć lokalna)",
|
||||
"controlTitle": "Sterowanie ładowarką (OCPP)",
|
||||
"controlOwnHint": "Ładowarka łączy się bezpośrednio z DriverVault jako swoim systemem centralnym. Ustaw backend OCPP ładowarki na poniższy adres.",
|
||||
"controlProxyHint": "DriverVault przekazuje ruch do chmury Anker i może wysyłać własne polecenia. Ustaw backend OCPP ładowarki na poniższy adres.",
|
||||
"controlModbusHint": "DriverVault sam łączy się z ładowarką w sieci lokalnej, więc nie ma tu adresu, który trzeba jej podać. Włącz Modbus TCP w aplikacji Anker, a potem wpisz pokazany adres obok sterowania ładowarką na stronie Ładowanie.",
|
||||
"controlProvisionSteps": "W aplikacji Anker (lub w ustawieniach OCPP ładowarki) ustaw adres backendu OCPP na powyższy endpoint, a klucz autoryzacji na powyższy token.",
|
||||
"chargerSerial": "Numer seryjny ładowarki",
|
||||
"controlCheck": "Sprawdź status",
|
||||
|
||||
@@ -992,7 +992,7 @@ class IntegrationView {
|
||||
final String orgId; // "" when the user has no organization
|
||||
final bool canEditOrg; // the caller is an org admin
|
||||
final bool isSuperadmin; // manages the shared layer elsewhere (read-only here)
|
||||
final String controlMode; // Anker only: effective OCPP mode (off|own|proxy)
|
||||
final String controlMode; // Anker only: effective control mode (off|own|proxy|modbus)
|
||||
final Map<String, IntegrationScope> scopes; // "user" and optionally "org"
|
||||
|
||||
const IntegrationView({
|
||||
@@ -1049,7 +1049,7 @@ class AnkerControl {
|
||||
final bool hasToken; // a per-charger token has been generated
|
||||
final String tokenHint; // last chars of the token, for display
|
||||
final bool connected; // the charger is connected to the control backend
|
||||
final String controlMode; // off | own | proxy
|
||||
final String controlMode; // off | own | proxy | modbus
|
||||
final String connectorStatus; // OCPP connector status, e.g. "Charging"
|
||||
final int meterWh; // last meter reading in watt-hours
|
||||
|
||||
|
||||
@@ -1588,6 +1588,7 @@ class _IntegrationsTab extends StatelessWidget {
|
||||
("off", "settings.integrations.controlOff"),
|
||||
("own", "settings.integrations.controlOwn"),
|
||||
("proxy", "settings.integrations.controlProxy"),
|
||||
("modbus", "settings.integrations.controlModbus"),
|
||||
],
|
||||
),
|
||||
],
|
||||
@@ -2008,13 +2009,23 @@ class _IntegrationCardState extends State<_IntegrationCard> {
|
||||
),
|
||||
),
|
||||
|
||||
// The chargers on the account. With a control mode active the list lives
|
||||
// inside the provisioning card below, where picking one fills the serial.
|
||||
if (_c.anker && view.enabled && view.controlMode == "off")
|
||||
// The chargers on the account. In an OCPP mode the list lives inside the
|
||||
// provisioning card below, where picking one fills the serial; Modbus has
|
||||
// no such card, so there it stays out here.
|
||||
if (_c.anker && view.enabled && (view.controlMode == "off" || view.controlMode == "modbus"))
|
||||
const Padding(padding: EdgeInsets.only(top: 16), child: _AnkerChargers()),
|
||||
|
||||
// OCPP control provisioning (Anker only, when a control mode is active).
|
||||
if (_c.anker && view.controlMode != "off")
|
||||
// Modbus is reached rather than provisioned: what it needs is the
|
||||
// charger's own address, which is asked for beside the controls.
|
||||
if (_c.anker && view.enabled && view.controlMode == "modbus")
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(top: 16),
|
||||
child: Text(t("settings.integrations.controlModbusHint"),
|
||||
style: TextStyle(fontSize: 12, color: muted)),
|
||||
),
|
||||
|
||||
// OCPP control provisioning (Anker only, in the modes the charger dials).
|
||||
if (_c.anker && (view.controlMode == "own" || view.controlMode == "proxy"))
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(top: 16),
|
||||
child: _AnkerControlProvision(controlMode: view.controlMode),
|
||||
|
||||
@@ -325,13 +325,15 @@
|
||||
"country": "Land",
|
||||
"countryHint": "Landekode på to bogstaver for din Anker-konto (f.eks. DE, GB, US).",
|
||||
"controlMode": "Styringstilstand",
|
||||
"controlModeHint": "Hvordan DriverVault styrer laderen over OCPP.",
|
||||
"controlModeHint": "Hvordan DriverVault styrer laderen.",
|
||||
"controlOff": "Fra (kun overvågning)",
|
||||
"controlOwn": "Eget CSMS (fuld styring)",
|
||||
"controlProxy": "Proxy-CSMS (videresendelse + styring)",
|
||||
"controlModbus": "Modbus TCP (lokalt netværk)",
|
||||
"controlTitle": "Laderstyring (OCPP)",
|
||||
"controlOwnHint": "Laderen forbinder direkte til DriverVault som sit centralsystem. Peg laderens OCPP-backend på endepunktet nedenfor.",
|
||||
"controlProxyHint": "DriverVault videresender til Ankers sky og kan indsætte kommandoer. Peg laderens OCPP-backend på endepunktet nedenfor.",
|
||||
"controlModbusHint": "DriverVault kontakter selv laderen på dit lokale netværk, så der er ingen adresse at pege laderen mod her. Slå Modbus TCP til i Anker-appen, og indtast den adresse, den viser, ved siden af laderens betjening på Opladning-siden.",
|
||||
"controlProvisionSteps": "I Anker-appen (eller laderens OCPP-indstillinger) sættes OCPP-backend-URL'en til endepunktet og autorisationsnøglen til tokenet ovenfor.",
|
||||
"chargerSerial": "Laderens serienummer",
|
||||
"controlCheck": "Tjek status",
|
||||
|
||||
@@ -324,13 +324,15 @@
|
||||
"country": "Country",
|
||||
"countryHint": "Two-letter country code of your Anker account (e.g. DE, GB, US).",
|
||||
"controlMode": "Control mode",
|
||||
"controlModeHint": "How DriverVault controls the charger over OCPP.",
|
||||
"controlModeHint": "How DriverVault controls the charger.",
|
||||
"controlOff": "Off (monitoring only)",
|
||||
"controlOwn": "Own CSMS (full control)",
|
||||
"controlProxy": "Proxy CSMS (relay + control)",
|
||||
"controlModbus": "Modbus TCP (local network)",
|
||||
"controlTitle": "Charger control (OCPP)",
|
||||
"controlOwnHint": "The charger connects directly to DriverVault as its Central System. Point the charger's OCPP backend at the endpoint below.",
|
||||
"controlProxyHint": "DriverVault relays to Anker's cloud and can inject commands. Point the charger's OCPP backend at the endpoint below.",
|
||||
"controlModbusHint": "DriverVault dials the charger on your local network, so there is nothing to point at an endpoint here. Enable Modbus TCP in the Anker app, then enter the address it shows beside the charger's controls on the Charging page.",
|
||||
"controlProvisionSteps": "In the Anker app (or the charger's OCPP settings), set the OCPP backend URL to the endpoint and the authorization key to the token above.",
|
||||
"chargerSerial": "Charger serial",
|
||||
"controlCheck": "Check status",
|
||||
|
||||
@@ -329,13 +329,15 @@
|
||||
"country": "Kraj",
|
||||
"countryHint": "Dwuliterowy kod kraju Twojego konta Anker (np. DE, GB, US).",
|
||||
"controlMode": "Tryb sterowania",
|
||||
"controlModeHint": "Sposób, w jaki DriverVault steruje ładowarką przez OCPP.",
|
||||
"controlModeHint": "Sposób, w jaki DriverVault steruje ładowarką.",
|
||||
"controlOff": "Wyłączone (tylko monitorowanie)",
|
||||
"controlOwn": "Własny CSMS (pełne sterowanie)",
|
||||
"controlProxy": "CSMS pośredniczący (przekazywanie + sterowanie)",
|
||||
"controlModbus": "Modbus TCP (sieć lokalna)",
|
||||
"controlTitle": "Sterowanie ładowarką (OCPP)",
|
||||
"controlOwnHint": "Ładowarka łączy się bezpośrednio z DriverVault jako swoim systemem centralnym. Ustaw backend OCPP ładowarki na poniższy adres.",
|
||||
"controlProxyHint": "DriverVault przekazuje ruch do chmury Anker i może wysyłać własne polecenia. Ustaw backend OCPP ładowarki na poniższy adres.",
|
||||
"controlModbusHint": "DriverVault sam łączy się z ładowarką w sieci lokalnej, więc nie ma tu adresu, który trzeba jej podać. Włącz Modbus TCP w aplikacji Anker, a potem wpisz pokazany adres obok sterowania ładowarką na stronie Ładowanie.",
|
||||
"controlProvisionSteps": "W aplikacji Anker (lub w ustawieniach OCPP ładowarki) ustaw adres backendu OCPP na powyższy endpoint, a klucz autoryzacji na powyższy token.",
|
||||
"chargerSerial": "Numer seryjny ładowarki",
|
||||
"controlCheck": "Sprawdź status",
|
||||
|
||||
@@ -507,6 +507,12 @@ function fillAnkerForm() {
|
||||
|
||||
// Effective OCPP control mode (off | own | proxy) — gates the control panel.
|
||||
const ankerControlMode = computed(() => anker.value?.controlMode || "off");
|
||||
// Only the OCPP modes are provisioned here. Modbus has no token and no endpoint
|
||||
// to hand the charger — the one thing it needs is the charger's own address,
|
||||
// which is asked for beside the controls on the Charging page.
|
||||
const ankerControlIsOcpp = computed(
|
||||
() => ankerControlMode.value === "own" || ankerControlMode.value === "proxy",
|
||||
);
|
||||
|
||||
// --- Anker Solix OCPP control (per-charger provisioning + connection status) ---
|
||||
const ankerCtlSerial = ref("");
|
||||
@@ -1501,6 +1507,7 @@ onBeforeUnmount(() => {
|
||||
<option value="off">{{ t("settings.integrations.controlOff") }}</option>
|
||||
<option value="own">{{ t("settings.integrations.controlOwn") }}</option>
|
||||
<option value="proxy">{{ t("settings.integrations.controlProxy") }}</option>
|
||||
<option value="modbus">{{ t("settings.integrations.controlModbus") }}</option>
|
||||
</select>
|
||||
<p v-if="ankerField('controlMode').locked" class="mt-1 text-xs text-muted">{{ ankerSourceLabel('controlMode') }}</p>
|
||||
<p v-else class="mt-1 text-xs text-muted">{{ t("settings.integrations.controlModeHint") }}</p>
|
||||
@@ -1569,7 +1576,7 @@ onBeforeUnmount(() => {
|
||||
{{ ankerStateLabel(c.statusDesc) }}
|
||||
</span>
|
||||
<button
|
||||
v-if="ankerControlMode !== 'off'"
|
||||
v-if="ankerControlIsOcpp"
|
||||
class="dh-btn dh-btn-ghost"
|
||||
@click="useAnkerCharger(c.sn)"
|
||||
>
|
||||
@@ -1584,8 +1591,17 @@ onBeforeUnmount(() => {
|
||||
<p v-if="ankerChargersError" class="mt-2 text-sm text-danger">{{ ankerChargersError }}</p>
|
||||
</div>
|
||||
|
||||
<!-- OCPP control provisioning (only when a control mode is active) -->
|
||||
<div v-if="ankerControlMode !== 'off'" class="mt-5 rounded-control border border-subtle bg-sunken/40 p-4">
|
||||
<!-- Modbus is reached rather than provisioned, so this card gives
|
||||
the address it wants instead of an endpoint to point it at. -->
|
||||
<p
|
||||
v-if="ankerControlMode === 'modbus'"
|
||||
class="mt-5 rounded-control border border-subtle bg-sunken/40 p-4 text-xs text-muted"
|
||||
>
|
||||
{{ t("settings.integrations.controlModbusHint") }}
|
||||
</p>
|
||||
|
||||
<!-- OCPP control provisioning (only in the modes the charger dials) -->
|
||||
<div v-if="ankerControlIsOcpp" class="mt-5 rounded-control border border-subtle bg-sunken/40 p-4">
|
||||
<p class="text-sm font-semibold text-strong">{{ t("settings.integrations.controlTitle") }}</p>
|
||||
<p class="mt-0.5 text-xs text-muted">
|
||||
{{ ankerControlMode === 'own' ? t("settings.integrations.controlOwnHint") : t("settings.integrations.controlProxyHint") }}
|
||||
|
||||
Reference in New Issue
Block a user