Wallboxen werden ja momentan wurden gefördert und da sowieso früher oder später der Kauf eines Elektroautos (BEV) ansteht, hatte ich mir mal so eine unter's Carport schrauben lassen.

Die Wallbox muss als Förderbedingung eine "intelligente Steuerung" haben, wofür wohl eine API ausreicht.
Wie sieht diese bei der Wallbe Eco 2.0s aus?

Die Wallbox kann via TCP per Modbus gesteuert und abgefragt werden. Da ist allerdings ersteinmal schwer ran zu kommen, da DHCP standardmäßig deaktiviert ist und sie eine selbst vergebene IP hat.

Auf einer Seite lese ich die Info "Die Firma Wallbe bietet nur Servicepartnern den Zugriff auf das Webinterface und auf die Einstellungen via Modbus. Privatkunden ist dieser Weg ausdrücklich versperrt. Solltet ihr die folgenden Einstellungen verwenden und/oder ändern, verliert ihr gegebenenfalls die Garantie."
...was etwas seltsam ist, wenn man sie ja intelligent steuern können soll...hmmm...

Das Arbeiten an elektrischen Anlagen darf nur von entsprechendem Fachpersonal ausgeführt werden.
Das Arbeiten mit Strom ist lebensgefährlich!

Netzwerk

Pfeift man auf diesen Passus, heißt es ersteinmal, den Computer mit einem Netzwerkkabel direkt anzustöpseln, ihm manuell eine IP im 192.168.0.x-Netz und der Teilnetzmaske 255.255.255.0 zuzuweisen und dann im Browser die IP 192.168.0.5 aufzurufen. Passwort ist wallbe7213

Unter "Network" nun DHCP aktivieren und mit "Submit" speichern.
Ggf. muss die Box ersteinmal neu gestartet werden.

Nun die Wallbox mit dem Router statt dem Computer verbinden.
Und bevor man den Deckel wieder schließt, den DIP-Schalter Nummer 10 auf "ON" schalten – nur dann kann man auch per Modbus die Ladefreigabe schalten.

PHP-Skript

Ich greife hierbei auf die phpmodbus-Library zurück, wobei hier nur das in phpmodbus-master enthaltene Unter-Verzeichnis Phpmodbus benötigt wird.
Dieses Verzeichnis ins selbe Verzeichnis folgende Test-Datei legen:

wallbe.php
<?php

require_once 'Phpmodbus/ModbusMaster.php';

$modbus = new ModbusMaster("192.168.178.99", "TCP"); // Hier die korrekte IP-Adresse eintragen

try {
       
        // Modul-ID ist immer 255
       
        //
        // Abfragen
        //
       
        // Status abfragen: Register 100
        // A    Ladestation frei / Kein Ladekabel angeschlossen
        // B    Ladestation belegt / Ladekabel angeschlossen
        // C+D  Ladestation belegt / Autorisierung erfolgt/Fahrzeug la?dt
        // E/F  Sto?rung / Sto?rungSammelfehler Error Codes (Status F nur bei online Stationen oder Ansteuerung u?ber einen Eingang)
        $status = $modbus->readMultipleRegisters(255, 100, 1);
        echo("Status " . chr($status[1]));
       
        // Fehlercodes: Register 107
        // 1. Kabelabweisung 13A und 20A
        // 2. Kabelabweisung 13 A
        // 3. Ungu?ltiger PP-Wert
        // 4. Ungu?ltiger CP-Wert
        // 5. Status F wegen fehlender Verfu?gbarkeit der Ladestation
        // 6. Verriegelungsfehler
        // 7. Entriegelungsfehler
        // 8. LD ist wa?hrend Verriegelung abgefallen
        // 9. U?berstromabschaltung
        // 10. Kommunikationsproblem mit Energiemeter
        // 11. Status D, Fahrzeug abgewiesen
        // 12. Schu?tzfehler erkannt
        // 13. Fahrzeugseitig keine Diode im Control Pilot Kreis
        // 14. Reserved
        // 15. DC Fehlerstrom detektiert
        // 16. Master-Slave Kommunikationsfehler
        if (chr($status[1]) == "E" || chr($status[1]) == "F") {
                $recData = $modbus->readMultipleRegisters(255, 107, 1);
                echo "</br>Fehler:</br>";
                var_dump($recData);
                }

        // Ladestatus abfragen: Register 400
        $recData = $modbus->readCoils(255, 400, 1);
        echo "</br>Ladestatus:</br>";
        var_dump($recData);

        // Ladedauer abfragen (in Sekunden): Register 102
        $recData = $modbus->readMultipleRegisters(255, 102, 1);
        echo "</br>Ladedauer:</br>";
        var_dump($recData);
       
        // Ladestrom abfragen  (160 => 16 A): Register 528
        $recData = $modbus->readMultipleRegisters(255, 528, 1);
        echo "</br>Ladestrom:</br>";
        var_dump($recData);
       
        // Aktueller (tatsächlicher) Ladestrom abfragen  (160 => 16 A): Register 300
        $recData = $modbus->readMultipleRegisters(255, 300, 1);
        echo "</br>Aktueller Ladestrom:</br>";
        var_dump($recData);

        //
        // Senden
        //
       
        // Laden an/aus schalten: Register 400
        $modbus->writeMultipleCoils(255, 400, array(true)); // an
        $modbus->writeMultipleCoils(255, 400, array(false)); // aus
       
        // Ladestrom ändern/begrenzen: Register 528
        $modbus->writeMultipleRegister(255, 528, array(160), array("INT"));  // Auf max. 16A setzen

} catch (Exception $e) {
    // Print error information if any
    echo $modbus;
    echo $e;
    exit;
    }

perl

Zur Steuerung verwende ich eher ein perl-Skript. Sorry, aber ich hänge noch an Perl, die Syntax von python finde ich immer so grausam :-(

Voraussetzung ist die Installation von Device::Modbus::TCP::Client was per cpan installiert werden kann.

#!/usr/bin/perl

use Device::Modbus::TCP::Client;

my $cmd = $ARGV[0];

if ($cmd eq "" || $cmd !~ /^(status|an|ein|start|aus|stop|set)$/) {
  print "Verwendung: wallbe.pl <status|an|aus|set> <bei set die Stromstärke in Ampere>\n";
  print "Beispiel:   wallbe.pl set 16\n";
  exit;
  }
if ($cmd eq "set" && $ARGV[1] eq "") {
  print "Bei Kommando 'set' bitte die Lade-Stromstäre in Ampere (min. 6 max 16) angeben\n";
  print "Beispiel: wallbe.pl set 16\n";
  exit;
  }
 
my $client = Device::Modbus::TCP::Client->new(host => '192.168.178.20'); # <-- IP der Wallbox

if ($cmd eq "status") {
  # Wallbox-Status
  my $req = $client->read_holding_registers(unit => 255, address => 100, quantity => 1);
  $client->send_request($req) || die "Send error: $!";
  my $response = $client->receive_response;
  my $status = chr($response->{message}->{values}->[0]);
  print "Status: ", $status, " - ";
  if ($status eq "A") { print " Ladestation frei / Kein Ladekabel angeschlossen\n"; }
  if ($status eq "B") { print " Ladestation belegt / Ladekabel angeschlossen\n"; }
  if ($status eq "C") { print " Ladestation belegt / Autorisierung erfolgt/Fahrzeug lädt\n"; }
  if ($status eq "D") { print " Ladestation belegt / Autorisierung erfolgt/Fahrzeug lädt\n"; }
  if ($status eq "E") { print " Störung / Störung Sammelfehler Error Codes\n"; }
  if ($status eq "F") { print " Störung / Störung Sammelfehler Error Codes\n"; }
  # Ladestatus
  my $req = $client->read_coils(unit => 255, address => 400, quantity => 1);
  $client->send_request($req) || die "Send error: $!";
  my $response = $client->receive_response;
  print "Ladestatus: ", $response->{message}->{values}->[0], "\n";
  # Ladedauer
  my $req = $client->read_holding_registers(unit => 255, address => 102, quantity => 1);
  $client->send_request($req) || die "Send error: $!";
  my $response = $client->receive_response;
  print "Ladedauer:  ", $response->{message}->{values}->[0], " Sekunden\n";
  # Ladestrom
  my $req = $client->read_holding_registers(unit => 255, address => 528, quantity => 1);
  $client->send_request($req) || die "Send error: $!";
  my $response = $client->receive_response;
  print "Ladestrom:  ", ($response->{message}->{values}->[0]/10), " A\n";
  # Aktueller (tatsächlicher) Ladestrom
  my $req = $client->read_holding_registers(unit => 255, address => 300, quantity => 1);
  $client->send_request($req) || die "Send error: $!";
  my $response = $client->receive_response;
  print "Aktueller Ladestrom: ", ($response->{message}->{values}->[0]/10), " A\n";
} elsif ($cmd eq "an" || $cmd eq "ein" || $cmd eq "start") {
  my $req = $client->write_multiple_coils(unit => 255, address => 400, values => [1]);
  $client->send_request($req) || die "Send error: $!";
  my $response = $client->receive_response;
  print "Befehl gesendet...\n";
  sleep(3);
  my $req = $client->read_coils(unit => 255, address => 400, quantity => 1);
  $client->send_request($req) || die "Send error: $!";
  my $response = $client->receive_response;
  print "Ladestatus: ", $response->{message}->{values}->[0], "\n";
  #`mosquitto_pub -h "127.0.0.1" -u mqtt_user -P mqtt_pass -v -t wallbox/aktiv -r -m 1`; # optional: Status auf mqtt-Server setzen
} elsif ($cmd eq "aus" || $cmd eq "stop") {
  my $req = $client->write_multiple_coils(unit => 255, address => 400, values => [0]);
  $client->send_request($req) || die "Send error: $!";
  my $response = $client->receive_response;
  print "Befehl gesendet...\n";
  sleep(3);
  my $req = $client->read_coils(unit => 255, address => 400, quantity => 1);
  $client->send_request($req) || die "Send error: $!";
  my $response = $client->receive_response;
  print "Ladestatus: ", $response->{message}->{values}->[0], "\n";
  #`mosquitto_pub -h "127.0.0.1" -u mqtt_user -P mqtt_pass -v -t wallbox/aktiv -r -m 0`; # optional: Status auf mqtt-Server setzen
} elsif ($cmd eq "set") {
  my $strom = $ARGV[0]*10;
  my $req = $client->write_multiple_registers(unit => 255, address  => 528, values => [$strom] );
  $client->send_request($req) || die "Send error: $!";
  my $response = $client->receive_response;
  print "Befehl gesendet...\n";
  sleep(3);
  my $req = $client->read_holding_registers(unit => 255, address => 528, quantity => 1);
  $client->send_request($req) || die "Send error: $!";
  my $response = $client->receive_response;
  print "Ladestrom:  ", ($response->{message}->{values}->[0]/10), " A\n";
  #`mosquitto_pub -h "127.0.0.1" -u mqtt_user -P mqtt_pass -v -t wallbox/leistung -r -m $response->{message}->{values}->[0]`; # optional: Status auf mqtt-Server setzen
  }

Verwendung:

wallbe.pl status # Status abfragen
wallbe.pl an     # Aktiviert die Ladefunktion. Wird ein Auto angeschlossen,
                 # wird es geladen (Aliasse: ein, start)
wallbe.pl aus    # Deaktiviert die Ladefunktion. Wird ein Auto angeschlossen,
                 # passiert nichts (Alias: stop)
wallbe.pl set 16 # Setzt die maximale Ladestromstärke auf 16A

Weitere Hilfsquellen

Die meisten Infos, wie man die Wallbox ins Netzwerk bekommt (mit der Info, dass DHCP nicht standardmäßig eingeschaltet ist) und eine Übersicht aller vorhandenen Modbus-Register habe ich im Loxwiki gefunden.

Sehr interessant ist die herunterladbare wallbe Modbus TCP Dokumentation am Ende des Artikels.