TapHome

go-e Gemini flex Wallbox

Packet Parser → HTTP
Submitted by
Last updated: 08. 2026
go-e Gemini flex Wallbox

The go-e Gemini flex is an Austrian-made EV wallbox available in 11 kW (16 A) and 22 kW (32 A) variants, with a newer Gemini flex 2.0 model featuring integrated 4G LTE. TapHome communicates with the charger over its local HTTP API v2 on Wi-Fi — no cloud connection is required. The API must be explicitly enabled in the go-e app before TapHome can connect.

The template provides charger status monitoring, charging current, mode and force-state control, phase switching, per-phase voltage and current readings, an energy meter, and write-only inputs for external PV and grid power data to enable surplus charging.

Configuration

Enabling the HTTP API

The local HTTP API v2 is disabled by default. To enable it:

  1. Connect to the go-e Charger via the go-e app (available for iOS and Android)
  2. Navigate to Settings > Connection > API Settings
  3. Enable “Allow access to local HTTP API vX”

Once enabled, the charger responds to HTTP requests on port 80. No authentication is required — access is controlled solely by this toggle.

Network setup

The go-e Gemini flex connects via Wi-Fi (802.11b/g/n, 2.4 GHz only). There is no wired Ethernet port. During TapHome template import, enter the charger’s IP address.

The go-e Charger does not support mDNS discovery. To prevent connectivity issues after a DHCP renewal, configure a static IP address or a DHCP reservation on your router for the charger’s MAC address.

The charger can operate in hotspot mode (direct connection) or join an existing Wi-Fi network. For TapHome integration, the charger must be on the same network as the TapHome CCU.

Device capabilities

Charger status

The Charger Status device reports the current connection and charging state as a read-only multi-value indicator. The API key car returns one of five states: Failure (0), Available (1), Charging (2), Preparing (3), or Finished (4). This allows TapHome automations to trigger based on whether a vehicle is connected, actively charging, or has completed a session.

Charging current and mode control

Two controllable devices manage how the charger operates:

  • Charging Current — selects the requested charging current from six discrete values: 6, 8, 10, 12, 14, and 16 A. The template maps these to switch positions 0–5 using the formula amp/2 - 3 for reading and (position + 3) × 2 for writing. Values are sent to the charger via api/set?amp={value}.

  • Charging Mode — selects the charging logic: Basic (default continuous charging), Eco (price-optimized via Awattar tariff), or Daily trip (automatic stop after reaching a target). The API uses values 3, 4, and 5 respectively; the template maps these to positions 0, 1, and 2.

The Charging Current selector maps only six values (6–16 A in 2 A steps). The 22 kW variant of the Gemini flex supports up to 32 A, but values above 16 A are not covered by this template. To use higher currents, the amp API key can be set directly outside the template.

Force state

The Force State device overrides the charger’s own decision about whether to charge. The API key frc accepts Neutral (0 — the charger decides), Stopped (1 — charging blocked) and Charge (2 — charging forced on). The value is written via api/set?frc={value} and read back from the status response, which is why this template revision adds frc to the api/status filter.

The selector also lists positions 3–9 with numeric placeholder labels inherited from the template. The go-e API defines no meaning for them — use Neutral, Stopped and Charge only.

Phase switching

The Phase Switching device controls how many phases the charger uses: Automatic (0), 1-Phase (1), or 3-Phase (2). The go-e Charger supports switching phases even during an active charging session. In Automatic mode, the charger selects the optimal phase configuration based on available power.

Energy monitoring

The template reads per-phase voltage and current from the charger’s nrg energy array, which contains 16 values updated every poll cycle:

DeviceSourceUnit
L1 Voltagenrg[0]V
L2 Voltagenrg[1]V
L3 Voltagenrg[2]V
L1 Currentnrg[4]A
L2 Currentnrg[5]A
L3 Currentnrg[6]A

The Wallbox Electric Meter device reports total delivered energy from the eto key (Wh) and instantaneous demand from nrg[11] divided by 1000. It replaces the former Current Consumption device. All energy values are read-only.

The template reads the phase currents from nrg[4], nrg[5] and nrg[6], and the meter demand from nrg[11]. The go-e API documentation places the phase currents at indices 5, 6 and 7, neutral power at index 11 and total power at index 12 — the previous template revision used exactly those. Check the readings against the charger before relying on them for billing or automations.

PV surplus charging inputs

Two write-only devices allow TapHome to feed external energy data into the charger for surplus charging calculations:

  • Power to Grid — sends the current grid export/import power (in kW, converted to W by multiplying by 1000) via api/set?ids={"pGrid":value}
  • PV Power — sends the current photovoltaic production (in kW, converted to W by multiplying by 1000) via api/set?ids={"pPv":value}

These devices do not read data from the charger. The go-e Charger itself does not measure grid or PV power — it relies on external sources to provide this information. In a typical TapHome setup, values from a separate energy meter or solar inverter (also integrated into TapHome) are forwarded to the charger via these write-only devices, enabling the Eco charging mode to optimize for self-consumption.

To use PV surplus charging, set the Charging Mode to Eco, then use TapHome automations to periodically write current grid power and PV production values to the Power to Grid and PV Power devices. The charger will adjust its charging current automatically based on the available surplus.

Additional capabilities

The go-e Charger API v2 exposes additional data not currently mapped in the template: per-phase power (W) and power factor, neutral voltage, total power (nrg[12]), per-session energy (wh), error state codes, cable current limit, temperature sensors, grid frequency, energy limit settings, and minimum/maximum ampere configuration. These can be added in a future template update.

Troubleshooting

Device not responding
  1. Verify the charger is connected to Wi-Fi and has a valid IP address — check the go-e app under Settings > Connection
  2. Confirm the HTTP API is enabled (Settings > Connection > API Settings)
  3. Open http://{charger-ip}/api/status in a browser — if it responds with JSON, the API is reachable
  4. Check that TapHome CCU and the charger are on the same network / VLAN
Charging current not changing
  1. The template only maps six values (6, 8, 10, 12, 14, 16 A). If the charger shows a different value (e.g., 20 A set via the app), TapHome will display the nearest mapped position
  2. Verify the charger firmware is 051.4 or newer — older firmware uses a different filter syntax that may cause parsing issues
PV surplus charging not working
  1. Confirm the Charging Mode is set to Eco — surplus logic only activates in this mode
  2. Verify that Power to Grid and PV Power values are being written regularly (at least every 30 seconds)
  3. Check that the values are in kW (the template converts to W automatically)
  4. Open http://{charger-ip}/api/status?filter=pgrid,ppv to verify the charger is receiving the values

The eto (total energy) API key is now exposed as the Wallbox Electric Meter device — the value fetched in the status filter is no longer unused.

Available devices

go-e Wallbox Module
Custom Variables

Go-e

Read (module)
responseJson := "error";



VAR response := SENDHTTPREQUEST("api/status?filter=car,nrg,psm,amp,eto,lmo,frc");

IF response.IsSuccess
    responseJson := response.Content;
ELSE
    VAR contentJson := response.Content;
    VAR errCode := response.StatusCode;
    VAR message := PARSEJSON(contentJson, "message");
    #ADDERROR("Failed to read data - (" + errCode + ") " + message);
END
Charger Status Multi-value Switch Read-only

Car connection and charging state — Failure, Available, Charging, Preparing, Finished

uint8
Values / States: Failure · Available · Charging · Preparing · Finished

Charger Status

Read switch state
RETURN(PARSEjson(responseJson, "car"));
Write switch state
# Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/set/value=" + Mu);
# IF response.IsSuccess = false
#  ADDERROR(response.StatusCode);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/setValue", "GET", "value=" + Mu, "header1:value1", "header2:value2", ...);\r
# Or VAR request := HTTPREQUEST("/example/setValue");
# request.Method := "PUT";
# VAR response := SENDHTTPREQUEST(request);
#r
#
# Send TCP, UDP data:
# VAR data1 := "{\"name\":\"John\", \"age\":" + Mu + "}";
# SENDDATA(data1);
# VAR data2 := TOBYTES("{\"name\":\"John\", \"age\":" + Mu + "}", "iso-8859-1");
# SENDDATA(data2);
# You can process received TCP or UDP data in the Listener script
#
#
# Upload data to FTP:
# FTPUPLOAD("filePath", "somedata=" + Mu, "write"); # use "append" mode to append data to existing file
Charging Current Multi-value Switch

Requested charging current selector — 6, 8, 10, 12, 14, 16 A in discrete steps

uint8 Unit: A numeric
Values / States: 6-Amp · 8-Amp · 10-Amp · 12-Amp · 14-Amp · 16-Amp

Charging Current

Read switch state
VAR ampers := PARSEjson(responseJson, "amp");
RETURN(ampers/2-3);
Write switch state
VAR amps:= (Mu +3)*2;
VAR response := SENDHTTPREQUEST("api/set?amp=" + amps);
IF response.IsSuccess = false
ADDERROR(response.StatusCode);
END
Charging Mode Multi-value Switch

Charging logic selector — Basic (continuous), Eco (price-optimized / PV surplus), Daily trip (auto-stop at target)

uint8 numeric
Values / States: Basic · Eco · Daily trip

Charging Mode

Read switch state
RETURN(PARSEjson(responseJson, "lmo")-3);
Write switch state
VAR response := SENDHTTPREQUEST("api/set?lmo=" + (Mu+3));
IF response.IsSuccess = false
ADDERROR(response.StatusCode);
END
Force State Multi-value Switch

Charging override — Neutral leaves the decision to the charger, Stopped blocks charging, Charge forces it on

uint8
Values / States: Neutral · Stopped · Charge

Force State

Read switch state
RETURN(PARSEjson(responseJson, "frc"));
Write switch state
VAR response := SENDHTTPREQUEST("api/set?frc=" + (Mu));
IF response.IsSuccess = false
ADDERROR(response.StatusCode);
END
L1 Current Variable Read-only
numeric Unit: A json_path

L1 Current

Read
VAR a := PARSETEXT (PARSEjson(responseJson, "nrg"), "[", "]");
VAR b := SPLIT(a,",");
RETURN(TODOUBLE(GETAT(b,4)))
Write
# Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/set/value=" + Va);
# IF response.IsSuccess = false
#  ADDERROR(response.StatusCode);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/setValue", "GET", "value=" + Va, "header1:value1", "header2:value2", ...);\r
# Or VAR request := HTTPREQUEST("/example/setValue");
# request.Method := "PUT";
# VAR response := SENDHTTPREQUEST(request);
#r
#
# Send TCP, UDP data:
# VAR data1 := "{\"name\":\"John\", \"age\":" + Va + "}";
# SENDDATA(data1);
# VAR data2 := TOBYTES("{\"name\":\"John\", \"age\":" + Va + "}", "iso-8859-1");
# SENDDATA(data2);
# You can process received TCP or UDP data in the Listener script
#
#
# Upload data to FTP:
# FTPUPLOAD("filePath", "somedata=" + Va, "write"); # use "append" mode to append data to existing file
Read (module)
# Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/getValue");
# IF response.IsSuccess
#  VAR content := response.Content;
#  VAR responseHeaders := response.Headers;
#  RETURN(PARSEXML(content, "//element1/value1"));
# ELSE
#  ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
#  RETURN(NaN);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/getValue", "GET", "some data", "header1:value1", "header2:value2", ...);
# OR
# VAR request := HTTPREQUEST("/example/getValue", "POST", "some data");
# request.headers := { "header1:value1", "header2:value2", ...};
# request.method := "GET";
# request.data := null;
# VAR response := SENDHTTPREQUEST(request);
#
#
# Send TCP, UDP data:
# VAR data1 := BYTECOLLECTION("0a bb ea df 01");
# SENDDATA(data1);
# VAR data2 := "{\"name\":\"John\", \"age\":32}";
# SENDDATA(data2);
# VAR data3 := TOBYTES("{\"name\":\"John\", \"age\":32}", "iso-8859-1");
# SENDDATA(data3);
# Process received TCP or UDP data and set device values in the Listener script
#
#
# Download data from FTP:
# FTPDOWNLOAD("filePath");
L1 Voltage Variable Read-only
numeric Unit: V json_path

L1 Voltage

Read
VAR a := PARSETEXT (PARSEjson(responseJson, "nrg"), "[", "]");
VAR b := SPLIT(a,",");
RETURN(TODOUBLE(GETAT(b,0)))
Write
# Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/set/value=" + Va);
# IF response.IsSuccess = false
#  ADDERROR(response.StatusCode);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/setValue", "GET", "value=" + Va, "header1:value1", "header2:value2", ...);\r
# Or VAR request := HTTPREQUEST("/example/setValue");
# request.Method := "PUT";
# VAR response := SENDHTTPREQUEST(request);
#r
#
# Send TCP, UDP data:
# VAR data1 := "{\"name\":\"John\", \"age\":" + Va + "}";
# SENDDATA(data1);
# VAR data2 := TOBYTES("{\"name\":\"John\", \"age\":" + Va + "}", "iso-8859-1");
# SENDDATA(data2);
# You can process received TCP or UDP data in the Listener script
#
#
# Upload data to FTP:
# FTPUPLOAD("filePath", "somedata=" + Va, "write"); # use "append" mode to append data to existing file
Read (module)
# Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/getValue");
# IF response.IsSuccess
#  VAR content := response.Content;
#  VAR responseHeaders := response.Headers;
#  RETURN(PARSEXML(content, "//element1/value1"));
# ELSE
#  ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
#  RETURN(NaN);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/getValue", "GET", "some data", "header1:value1", "header2:value2", ...);
# OR
# VAR request := HTTPREQUEST("/example/getValue", "POST", "some data");
# request.headers := { "header1:value1", "header2:value2", ...};
# request.method := "GET";
# request.data := null;
# VAR response := SENDHTTPREQUEST(request);
#
#
# Send TCP, UDP data:
# VAR data1 := BYTECOLLECTION("0a bb ea df 01");
# SENDDATA(data1);
# VAR data2 := "{\"name\":\"John\", \"age\":32}";
# SENDDATA(data2);
# VAR data3 := TOBYTES("{\"name\":\"John\", \"age\":32}", "iso-8859-1");
# SENDDATA(data3);
# Process received TCP or UDP data and set device values in the Listener script
#
#
# Download data from FTP:
# FTPDOWNLOAD("filePath");
L2 Current Variable Read-only
numeric Unit: A json_path

L2 Current

Read
VAR a := PARSETEXT (PARSEjson(responseJson, "nrg"), "[", "]");
VAR b := SPLIT(a,",");
RETURN(TODOUBLE(GETAT(b,5)))
Write
# Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/set/value=" + Va);
# IF response.IsSuccess = false
#  ADDERROR(response.StatusCode);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/setValue", "GET", "value=" + Va, "header1:value1", "header2:value2", ...);\r
# Or VAR request := HTTPREQUEST("/example/setValue");
# request.Method := "PUT";
# VAR response := SENDHTTPREQUEST(request);
#r
#
# Send TCP, UDP data:
# VAR data1 := "{\"name\":\"John\", \"age\":" + Va + "}";
# SENDDATA(data1);
# VAR data2 := TOBYTES("{\"name\":\"John\", \"age\":" + Va + "}", "iso-8859-1");
# SENDDATA(data2);
# You can process received TCP or UDP data in the Listener script
#
#
# Upload data to FTP:
# FTPUPLOAD("filePath", "somedata=" + Va, "write"); # use "append" mode to append data to existing file
Read (module)
# Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/getValue");
# IF response.IsSuccess
#  VAR content := response.Content;
#  VAR responseHeaders := response.Headers;
#  RETURN(PARSEXML(content, "//element1/value1"));
# ELSE
#  ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
#  RETURN(NaN);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/getValue", "GET", "some data", "header1:value1", "header2:value2", ...);
# OR
# VAR request := HTTPREQUEST("/example/getValue", "POST", "some data");
# request.headers := { "header1:value1", "header2:value2", ...};
# request.method := "GET";
# request.data := null;
# VAR response := SENDHTTPREQUEST(request);
#
#
# Send TCP, UDP data:
# VAR data1 := BYTECOLLECTION("0a bb ea df 01");
# SENDDATA(data1);
# VAR data2 := "{\"name\":\"John\", \"age\":32}";
# SENDDATA(data2);
# VAR data3 := TOBYTES("{\"name\":\"John\", \"age\":32}", "iso-8859-1");
# SENDDATA(data3);
# Process received TCP or UDP data and set device values in the Listener script
#
#
# Download data from FTP:
# FTPDOWNLOAD("filePath");
L2 Voltage Variable Read-only
numeric Unit: V json_path

L2 Voltage

Read
VAR a := PARSETEXT (PARSEjson(responseJson, "nrg"), "[", "]");
VAR b := SPLIT(a,",");
RETURN(TODOUBLE(GETAT(b,1)))
Write
# Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/set/value=" + Va);
# IF response.IsSuccess = false
#  ADDERROR(response.StatusCode);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/setValue", "GET", "value=" + Va, "header1:value1", "header2:value2", ...);\r
# Or VAR request := HTTPREQUEST("/example/setValue");
# request.Method := "PUT";
# VAR response := SENDHTTPREQUEST(request);
#r
#
# Send TCP, UDP data:
# VAR data1 := "{\"name\":\"John\", \"age\":" + Va + "}";
# SENDDATA(data1);
# VAR data2 := TOBYTES("{\"name\":\"John\", \"age\":" + Va + "}", "iso-8859-1");
# SENDDATA(data2);
# You can process received TCP or UDP data in the Listener script
#
#
# Upload data to FTP:
# FTPUPLOAD("filePath", "somedata=" + Va, "write"); # use "append" mode to append data to existing file
Read (module)
# Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/getValue");
# IF response.IsSuccess
#  VAR content := response.Content;
#  VAR responseHeaders := response.Headers;
#  RETURN(PARSEXML(content, "//element1/value1"));
# ELSE
#  ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
#  RETURN(NaN);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/getValue", "GET", "some data", "header1:value1", "header2:value2", ...);
# OR
# VAR request := HTTPREQUEST("/example/getValue", "POST", "some data");
# request.headers := { "header1:value1", "header2:value2", ...};
# request.method := "GET";
# request.data := null;
# VAR response := SENDHTTPREQUEST(request);
#
#
# Send TCP, UDP data:
# VAR data1 := BYTECOLLECTION("0a bb ea df 01");
# SENDDATA(data1);
# VAR data2 := "{\"name\":\"John\", \"age\":32}";
# SENDDATA(data2);
# VAR data3 := TOBYTES("{\"name\":\"John\", \"age\":32}", "iso-8859-1");
# SENDDATA(data3);
# Process received TCP or UDP data and set device values in the Listener script
#
#
# Download data from FTP:
# FTPDOWNLOAD("filePath");
L3 Current Variable Read-only
numeric Unit: A json_path

L3 Current

Read
VAR a := PARSETEXT (PARSEjson(responseJson, "nrg"), "[", "]");
VAR b := SPLIT(a,",");
RETURN(TODOUBLE(GETAT(b,6)))
Write
# Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/set/value=" + Va);
# IF response.IsSuccess = false
#  ADDERROR(response.StatusCode);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/setValue", "GET", "value=" + Va, "header1:value1", "header2:value2", ...);\r
# Or VAR request := HTTPREQUEST("/example/setValue");
# request.Method := "PUT";
# VAR response := SENDHTTPREQUEST(request);
#r
#
# Send TCP, UDP data:
# VAR data1 := "{\"name\":\"John\", \"age\":" + Va + "}";
# SENDDATA(data1);
# VAR data2 := TOBYTES("{\"name\":\"John\", \"age\":" + Va + "}", "iso-8859-1");
# SENDDATA(data2);
# You can process received TCP or UDP data in the Listener script
#
#
# Upload data to FTP:
# FTPUPLOAD("filePath", "somedata=" + Va, "write"); # use "append" mode to append data to existing file
Read (module)
# Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/getValue");
# IF response.IsSuccess
#  VAR content := response.Content;
#  VAR responseHeaders := response.Headers;
#  RETURN(PARSEXML(content, "//element1/value1"));
# ELSE
#  ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
#  RETURN(NaN);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/getValue", "GET", "some data", "header1:value1", "header2:value2", ...);
# OR
# VAR request := HTTPREQUEST("/example/getValue", "POST", "some data");
# request.headers := { "header1:value1", "header2:value2", ...};
# request.method := "GET";
# request.data := null;
# VAR response := SENDHTTPREQUEST(request);
#
#
# Send TCP, UDP data:
# VAR data1 := BYTECOLLECTION("0a bb ea df 01");
# SENDDATA(data1);
# VAR data2 := "{\"name\":\"John\", \"age\":32}";
# SENDDATA(data2);
# VAR data3 := TOBYTES("{\"name\":\"John\", \"age\":32}", "iso-8859-1");
# SENDDATA(data3);
# Process received TCP or UDP data and set device values in the Listener script
#
#
# Download data from FTP:
# FTPDOWNLOAD("filePath");
L3 Voltage Variable Read-only
numeric Unit: V json_path

L3 Voltage

Read
VAR a := PARSETEXT (PARSEjson(responseJson, "nrg"), "[", "]");
VAR b := SPLIT(a,",");
RETURN(TODOUBLE(GETAT(b,2)))
Write
# Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/set/value=" + Va);
# IF response.IsSuccess = false
#  ADDERROR(response.StatusCode);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/setValue", "GET", "value=" + Va, "header1:value1", "header2:value2", ...);\r
# Or VAR request := HTTPREQUEST("/example/setValue");
# request.Method := "PUT";
# VAR response := SENDHTTPREQUEST(request);
#r
#
# Send TCP, UDP data:
# VAR data1 := "{\"name\":\"John\", \"age\":" + Va + "}";
# SENDDATA(data1);
# VAR data2 := TOBYTES("{\"name\":\"John\", \"age\":" + Va + "}", "iso-8859-1");
# SENDDATA(data2);
# You can process received TCP or UDP data in the Listener script
#
#
# Upload data to FTP:
# FTPUPLOAD("filePath", "somedata=" + Va, "write"); # use "append" mode to append data to existing file
Read (module)
# Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/getValue");
# IF response.IsSuccess
#  VAR content := response.Content;
#  VAR responseHeaders := response.Headers;
#  RETURN(PARSEXML(content, "//element1/value1"));
# ELSE
#  ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
#  RETURN(NaN);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/getValue", "GET", "some data", "header1:value1", "header2:value2", ...);
# OR
# VAR request := HTTPREQUEST("/example/getValue", "POST", "some data");
# request.headers := { "header1:value1", "header2:value2", ...};
# request.method := "GET";
# request.data := null;
# VAR response := SENDHTTPREQUEST(request);
#
#
# Send TCP, UDP data:
# VAR data1 := BYTECOLLECTION("0a bb ea df 01");
# SENDDATA(data1);
# VAR data2 := "{\"name\":\"John\", \"age\":32}";
# SENDDATA(data2);
# VAR data3 := TOBYTES("{\"name\":\"John\", \"age\":32}", "iso-8859-1");
# SENDDATA(data3);
# Process received TCP or UDP data and set device values in the Listener script
#
#
# Download data from FTP:
# FTPDOWNLOAD("filePath");
Phase Switching Multi-value Switch

Phase configuration — Automatic (charger decides), 1-Phase (forced), 3-Phase (forced). Can switch during active charging.

uint8
Values / States: Automatic · 1-Phase · 3-Phase

Phase Switching

Read switch state
RETURN(PARSEjson(responseJson, "psm"));
Write switch state
VAR response := SENDHTTPREQUEST("api/set?psm=" + Mu);
IF response.IsSuccess = false
ADDERROR(response.StatusCode);
END
Power to Grid Variable

Write-only — sends external grid power data (kW) to the charger for surplus charging calculations

numeric Unit: kW json_path

Power to Grid

Write
VAR pgrid := "{\"pGrid\":"+ Round(Va*1000)+"}";

VAR response := SENDHTTPREQUEST("api/set?ids=" + pgrid);

IF response.IsSuccess = false
ADDERROR(response.StatusCode);
END
Read (module)
# Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/getValue");
# IF response.IsSuccess
#  VAR content := response.Content;
#  VAR responseHeaders := response.Headers;
#  RETURN(PARSEXML(content, "//element1/value1"));
# ELSE
#  ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
#  RETURN(NaN);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/getValue", "GET", "some data", "header1:value1", "header2:value2", ...);
# OR
# VAR request := HTTPREQUEST("/example/getValue", "POST", "some data");
# request.headers := { "header1:value1", "header2:value2", ...};
# request.method := "GET";
# request.data := null;
# VAR response := SENDHTTPREQUEST(request);
#
#
# Send TCP, UDP data:
# VAR data1 := BYTECOLLECTION("0a bb ea df 01");
# SENDDATA(data1);
# VAR data2 := "{\"name\":\"John\", \"age\":32}";
# SENDDATA(data2);
# VAR data3 := TOBYTES("{\"name\":\"John\", \"age\":32}", "iso-8859-1");
# SENDDATA(data3);
# Process received TCP or UDP data and set device values in the Listener script
#
#
# Download data from FTP:
# FTPDOWNLOAD("filePath");
PV Power Variable

Write-only — sends external PV production data (kW) to the charger for surplus charging calculations

numeric Unit: kW json_path

PV Power

Write
VAR pPv := "{\"pPv\":"+ Round(Va*1000)+"}";

VAR response := SENDHTTPREQUEST("api/set?ids=" + pPv);

IF response.IsSuccess = false
ADDERROR(response.StatusCode);
END
Read (module)
# Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/getValue");
# IF response.IsSuccess
#  VAR content := response.Content;
#  VAR responseHeaders := response.Headers;
#  RETURN(PARSEXML(content, "//element1/value1"));
# ELSE
#  ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
#  RETURN(NaN);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/getValue", "GET", "some data", "header1:value1", "header2:value2", ...);
# OR
# VAR request := HTTPREQUEST("/example/getValue", "POST", "some data");
# request.headers := { "header1:value1", "header2:value2", ...};
# request.method := "GET";
# request.data := null;
# VAR response := SENDHTTPREQUEST(request);
#
#
# Send TCP, UDP data:
# VAR data1 := BYTECOLLECTION("0a bb ea df 01");
# SENDDATA(data1);
# VAR data2 := "{\"name\":\"John\", \"age\":32}";
# SENDDATA(data2);
# VAR data3 := TOBYTES("{\"name\":\"John\", \"age\":32}", "iso-8859-1");
# SENDDATA(data3);
# Process received TCP or UDP data and set device values in the Listener script
#
#
# Download data from FTP:
# FTPDOWNLOAD("filePath");
Wallbox Electric Meter Electricity Meter Read-only

Energy meter — total energy delivered by the charger (eto) and instantaneous charging power

numeric Unit: kWh json_path

Wallbox Electric Meter

Read total consumption
RETURN(PARSEjson(responseJson, "eto"))
Read demand
VAR a := PARSETEXT (PARSEjson(responseJson, "nrg"), "[", "]");
VAR b := SPLIT(a,",");
RETURN(TODOUBLE(GETAT(b,11))/1000)
Connection: Packet Parser → HTTP
Possible improvements (18)
  • Voltage N — Neutral voltage in V, available in nrg array index 3
  • Per-phase Power (L1, L2, L3) — Individual phase power in W — the template reads only element 11 (demand of the Wallbox Electric Meter)
  • Power Total — Total power in W. The former 'Current consumption' device read this element; the Wallbox Electric Meter that replaced it reads element 11 instead. See inconsistency report
  • Power Factor (L1, L2, L3) — Power factor per phase, available in nrg array
  • Session Energy — Energy consumed in current charging session (Wh)
  • Error State — Error code — None, FiAc, FiDc, Phase, Overvolt, Overamp, etc. Useful for diagnostics.
  • Allow Charging — Whether the car is presently allowed to charge
  • Force State — Force charger state: Neutral=0, Off=1, On=2. Read/write. Could override charging logic.
  • Cable Current Limit — Maximum current the connected cable supports (A)
  • Temperature Sensors — Controller and charger temperature sensors array
  • Grid Frequency — Grid frequency in Hz
  • Firmware Version — Current firmware version string
  • Serial Number — Device serial number
  • Uptime — Time since boot in milliseconds
  • Energy Limit — Charging energy limit in Wh (null=disabled). Read/write.
  • Ampere Maximum — Maximum ampere limit (R/W)
  • Minimum Charging Current — Minimum charging current (R/W)
  • PV Surplus Feature — Enable/disable PV surplus charging (boolean, R/W)

Sources

  • go-eCharger API v2 — HTTP API Reference
    github.com 2026-03-27
  • go-e Charger Gemini flex — Data Sheet V1.4
    go-e.com 2026-03-27
    PDF
  • ha-goecharger-api2 — Home Assistant Integration
    github.com 2026-03-27

Found a problem with this device template?

Tell us what's wrong, what's missing, or how the template should behave. We rely on your feedback to keep the catalog accurate.

Verified by TapHome

Want to use this in your TapHome Core?

Open this template in the Customer Portal to apply it to one of your homes, or to draft a refinement and submit it back to the catalog.

Open in portal