Skip to content

Latest commit

 

History

History
268 lines (229 loc) · 29.9 KB

go-eCharger Modbus TCP API v1 DE.md

File metadata and controls

268 lines (229 loc) · 29.9 KB

GO-E Charger Modbus TCP/IP Dokumentation Deutsch

Version Date Author Description
1.0 2020-10-01 Peter Pötzi Initial version

Index

Doku zu den verwendeten libraries

Aktivierung der API

Um die API zu aktivieren muss in der go-eCharger app unter Erweiterte Einstellungen der
API Zugriff aktiviert werden. Nach der Aktivierung ist ein Neustart der Ladebox notwendig.
Die API steht erst ab Firmware Version 0.40 zur Verfügung.

Verbindung

Modbus TCP wird über folgende Verbindungen angeboten:

Verbindung Port
WLAN 502

Der go-e Charger hat die Geräte ID 1.

Modbus Register

Die Register ID ist 0-Indiziert. Daher muss für manche Clients die Register ID um 1
erhöht werden.

Register sind als Holding Register oder Input Register ausgeführt.

  • Holding Register erlauben ein Lesen und Schreiben
  • Input Register nur ein Lesen.

Bei Werten die über mehrere Register gehen sind alle 16-Bit Packete ein big-endian. Der go-eCharger verwendet standardmäßig Big Endian (Word Swap).

Register Bezeichnung Register Typ Datentyp Länge Beschreibung
100 CAR_STATE Input Register unsigned integer (16) 1 Status PWM Signalisierung
0: unbekannt, Ladestation defekt
1: Ladestation bereit, kein Fahrzeug
2: Fahrzeug lädt
3: Warte auf Fahrzeug
4: Ladung beendet, Fahrzeug noch
verbunden
101 PP_CABLE Input Register unsigned integer (16) 1 Typ2 Kabel Ampere codierung
13-32: Ampere Codierung
0: kein Kabel
105
106
FWV Input Register ascii (4 byte) 2 Firmware Version als ASCII
107 ERROR Input Register unsigned integer (16) 1 error:
1: RCCB (Fehlerstromschutzschalter)
3: PHASE (Phasenstörung)
8: NO_GROUND (Erdungserkennung)
10, default: INTERNAL (sonstiges)
108
109
VOLT_L1 Input Register unsigned integer (32) 2 Spannung auf L1 in Volt
110
111
VOLT_L2 Input Register unsigned integer (32) 2 Spannung auf L2 in Volt
112
113
VOLT_L3 Input Register unsigned integer (32) 2 Spannung auf L3 in Volt
114
115
AMP_L1 Input Register unsigned integer (32) 2 Ampere auf L1 in 0.1A (123 entspricht 12, 3A)
116
117
AMP_L2 Input Register unsigned integer (32) 2 Ampere auf L2 in 0.1A (123 entspricht 12, 3A)
118
119
AMP_L3 Input Register unsigned integer (32) 2 Ampere auf L3 in 0.1A (123 entspricht 12, 3A)
120
121
POWER_TOTAL Input Register unsigned integer (32) 2 Leistung gesamt in 0.01kW (360 entspricht 3, 6kW)
128
129
ENERGY_TOTAL Input Register unsigned integer (32) 2 Gesamt geladene Energiemenge in 0.1kWh
132
133
ENERGY_CHARGE Input Register unsigned integer (32) 2 Geladene Energiemenge in
Deka-Watt-Sekunden
Beispiel:100’000 bedeutet, 1’000’000
Ws (=277Wh = 0, 277kWh) wurden in
diesem Ladevorgang geladen.
144
145
VOLT_N Input Register unsigned integer (32) 2 Spannung auf N in Volt
146
147
POWER_L1 Input Register unsigned integer (32) 2 Leistung auf L1 in 0.1kW (36 entspricht 3, 6kW)
148
149
POWER_L2 Input Register unsigned integer (32) 2 Leistung auf L2 in 0.1kW (36 entspricht 3, 6kW)
150
151
POWER_L3 Input Register unsigned integer (32) 2 Leistung auf L3 in 0.1kW (36 entspricht 3, 6kW)
152
153
POWER_FACTOR_L1 Input Register unsigned integer (32) 2 Leistungsfaktor auf L1 in %
154
155
POWER_FACTOR_L2 Input Register unsigned integer (32) 2 Leistungsfaktor auf L2 in %
156
157
POWER_FACTOR_L3 Input Register unsigned integer (32) 2 Leistungsfaktor auf L3 in %
158
159
POWER_FACTOR_N Input Register unsigned integer (32) 2 Leistungsfaktor auf N in %
200 ALLOW Holding Register unsigned integer (16) 1 allow_charging: PWM Signal darf
anliegen
0: nein
1: ja
201 ACCESS_STATE Holding Register unsigned integer (16) 1 access_state: Zugangskontrolle.
0: Offen
1: RFID / App benötigt
2: Strompreis / automatisch
3: Scheduler
202 ADAPTER_INPUT Input Register unsigned integer (16) 1 adapter_in: Ladebox ist mit Adapter
angesteckt
0: NO_ADAPTER
1: 16A_ADAPTER
203 UNLOCKED_BY Input Register unsigned integer (16) 1 Nummer der RFID Karte, die den
jetzigen Ladevorgang freigeschalten
hat
204 CABLE_LOCK_MODE Holding Register unsigned integer (16) 1 Kabelverriegelung Einstellung
0: Verriegeln solange Auto angesteckt
1: Nach Ladevorgang automatisch
entriegeln
2: Kabel immer verriegelt lassen
205 PHASES Input Register unsigned integer (16) 1 Phasen vor und nach dem Schütz
binary flags: 0b00ABCDEF
A... phase 3, vor dem Schütz
B... phase 2 vor dem Schütz
C... phase 1 vor dem Schütz
D... phase 3 nach dem Schütz
E... phase 2 nach dem Schütz
F... phase 1 nach dem Schütz
pha 0b00001000: Phase 1 ist
vorhanden
pha 0b00111000: Phase1-3 ist
vorhanden
206 LED_BRIGHTNESS Holding Register unsigned integer (16) 1 LED Helligkeit von 0-255
0: LED aus
255: LED Helligkeit maxima
207 LED_SAVE_ENERGY Holding Register unsigned integer (16) 1 led_save_energy: LED automatisch
nach 10 Sekunden abschalten
0: Energiesparfunktion deaktiviert
1: Energiesparfunktion aktiviert
208 ELECTRICITY_PRICES_HOURS Holding Register unsigned integer (16) 1 Minimale ​Anzahl ​von Stunden in der
mit "Strompreis - automatisch" geladen
werden muss
Beispiel: 2 ("Auto ist nach 2 Stundenvoll genug")
209 ELECTRICITY_PRICES_FINISHED Holding Register unsigned integer (16) 1 Stunde (​Uhrzeit​) in der mit "Strompreis
- automatisch" die Ladung mindestens
aho ​Stunden gedauert haben muss.
Beispiel: 7 ("Fertig bis 7:00, also davor
mindestens 2 Stunden geladen")
210 ELECTRICITY_PRICES_ZONE Holding Register unsigned integer (16) 1 Awattar Preiszone
0: Österreich
1: Deutschland
211 AMPERE_MAX Holding Register unsigned integer (16) 1 Absolute max. Ampere: Maximalwert
für Ampere Einstellung
Beispiel: 20 (Einstellung auf mehr als
20A in der App nicht möglich)
212 AMPERE_L1 Holding Register unsigned integer (16) 1 Ampere Level 1 für Druckknopf am
Gerät.
6-32: Ampere Stufe aktiviert
0: Stufe deaktivert (wird übersprungen)
213 AMLERE_L2 Holding Register unsigned integer (16) 1 Ampere Level 2 für Druckknopf am
Gerät.
6-32: Ampere Stufe aktiviert
0: Stufe deaktivert (wird übersprungen)
214 AMPERE_L3 Holding Register unsigned integer (16) 1 Ampere Level 3 für Druckknopf am
Gerät.
6-32: Ampere Stufe aktiviert
0: Stufe deaktivert (wird übersprungen)
215 AMPERE_L4 Holding Register unsigned integer (16) 1 Ampere Level 4 für Druckknopf am
Gerät.
6-32: Ampere Stufe aktiviert
0: Stufe deaktivert (wird übersprungen)
216 AMPERE_L5 Holding Register unsigned integer (16) 1 Ampere Level 5 für Druckknopf am
Gerät.
6-32: Ampere Stufe aktiviert
0: Stufe deaktivert (wird übersprungen)
217 CLOUD_DISABLED Holding Register unsigned integer (16) 1 Cloud disabled
0: cloud enabled
1: cloud disabled
218 NORWAY_MODE Holding Register unsigned integer (16) 1 Norwegen-Modus​ aktiviert
0: deaktiviert (Erdungserkennung
aktiviert)
1: aktiviert (keine Erdungserkennung,
nur für IT-Netze gedacht)
299 AMPERE_VOLATILE Holding Register unsigned integer (16) 1 Ampere Wert für die PWM
Signalisierung in ganzen Ampere von
6-32A

Wird nicht im EEPROM gespeichert
und wird beim nächsten Bootvorgang
auf den zuletzt im EEPROM
gespeicherten Wert ​zurückgesetzt​.
Für Energieregelung
300 AMPERE_EEPROM Holding Register unsigned integer (16) 1 Ampere Wert für die PWM
Signalisierung in ganzen Ampere von
6-32A

Wird im EEPROM ​gespeichert ​(max.
Schreibzyklen ca. 100.000)
301
302
303
MAC Input Register unsigned integer (48) 3 MAC Adresse der WLAN Station, binär
304
305
306
307
308
309
SNR Input Register ascii (12 byte) 6 Seriennummer des go-eCharger, als
ASCII
310
311
312
313
314
HOSTNAME Input Register ascii (10 byte) 6 Hostname des go-eCharger, als ASCII
315
316
317
318
IP Input Register ascii (8 byte) 4 IP Adresse des go-eCharger, 1 Bytepro Register
319
320
321
322
SUBNET Input Register unsigned integer (64) 4 Subnetzmaske des go-eCharger, 1
Byte pro Register
323
324
325
326
GATEWAY Input Register ascii (4 byte) 4 Gateway des go-eCharger, 1 Byte proRegister

Verbindung mit dem Charger herstellen

// clientG.js
const net = require("net"); // importiert net
const modbus = require("jsmodbus"); // importiert jsmodbus
const socket = new net.Socket(); // instanziert Socket
const client = new modbus.client.TCP(socket, 1); // instanziert eine Client TCP connection mit hilfe vom Socket und der unitId
const options = { // config für die connection
    port: 502, // port
    host: 'xxx.xxx.xxx.xxx' // ip
};
openSocket(socket, options)

socket.on("error", (err) => { // Wird aufgerufen, wenn der Computer einen Fehler beim aufrufen von der Verbindung hat
    console.log(err); // gibt den Fehler in der Konsole aus
})

Daten über den Input Register auslesen

/**
 * @function
 * @name getInputRegisters
 * @param {object} socket 
 * @param {object} client 
 * @param {number} register - attribut von der Spalte "Register" von der GO-E Charger Modbus API
 * @param {number} count -  attribut von der Spalte "Länge" von der GOE-E Charger Modbus API
 * 

 * Diese Funktion gibt das JSON Objekt aus, welches vom Charger gesendet wirdc
 * 
 */
function getInputRegisters(socket, client, register, count) {
    socket.on("connect", function() { // Wird aufgerufen, wenn der Computer eine Verbindung herstellt 
        /**
         * @method 
         * @name readInputRegisters - read only Option vom Modbus (Von der GO-E Charger Modbus API -> Spalte Register Typ)
         * @param {number} register - attribut von der Spalte "Register" von der GO-E Charger Modbus API
         * @param {number} count -  attribut von der Spalte "Länge" von der GOE-E Charger Modbus API
         */
        client.readInputRegisters(register, count).then(function(response) {
            console.log(response); // Gibt die response in der Konsole aus
        }).catch(function(err) {
            console.log(err); // Gibt den error in der Konsole aus
        });
    })
}

Daten über den Holding Register auslesen

/**
 * @function
 * @name getHoldingRegisters
 * @param {object} socket 
 * @param {object} client 
 * @param {number} register - attribut von der Spalte "Register" von der GO-E Charger Modbus API
 * @param {number} count -  attribut von der Spalte "Länge" von der GOE-E Charger Modbus API
 * 
 * Diese Funktion gibt das JSON Objekt aus, welches vom Charger gesendet wird
 * 
 */
function getHoldingRegisters(socket, client, register, count) {
    socket.on("connect", function() { // Wird aufgerufen, wenn der Computer eine Verbindung herstellt 
        /**
         * @method 
         * @name readHoldingRegisters - read only Option vom Modbus (Von der GO-E Charger Modbus API -> Spalte Register Typ)
         * @param {number} register - attribut von der Spalte "Register" von der GO-E Charger Modbus API
         * @param {number} count -  attribut von der Spalte "Länge" von der GOE-E Charger Modbus API
         */
        client.readHoldingRegisters(register, count).then(function(response) {
            console.log(response); // Gibt die response in der Konsole aus
        }).catch(function(err) {
            console.log(err); // Gibt den error in der Konsole aus
        });
    })
}

Daten über den Holding Register eintragen

/**
 * @function
 * @name setHoldingRegisters
 * @param {object} socket 
 * @param {object} client 
 * @param {number} register - attribut von der Spalte "Register" von der GO-E Charger Modbus API
 * @param {number} value - attribut um dem gegebenen register einen neuen Wert zuzufügen
 * 
 * Diese Funktion setzt einen gegebenen wert auf eine gegebene register adresse
 * 
 */
function setHoldingRegisters(socket, client, register, value) {
    socket.on("connect", function() {
        /**
         * @method 
         * @name writeSingleRegister - read und write option von Mosbus
         * @param {number} register - attribut von der Spalte "Register" von der GO-E Charger Modbus API
         * @param {number} value - attribut um dem gegebenen register einen neuen Wert zuzufügen
         */
        client.writeSingleRegister(register, value).then(function(response) {
            console.log(response); // gibt den response aus
        }).catch(function(err) {
            console.log(err); // gibt den Fehler aus
            closeSocket(socket);
        })
    })
}

Socket schließen

/**
 * @function
 * @name closeSocket
 * @param {object} socket 
 * 
 * Diese Funktion schließt den Socket
 * 
 */
function closeSocket(socket) {
    socket.end();
}

Socket öffnen

/**
 * @function
 * @name openSocket
 * @param {object} socket 
 * @param {object} option - config für die Connection
 * 
 * Diese Funktion öffnet den Socket
 *  
 */
function openSocket(socket, option) {
    socket.connect(options); // Mit der gegebenen config mit dem Socket verbinden
}