HomeMatic liest und ändert Daten der Wallbox SMA EV Charger 22

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

DidiTheE
Beiträge: 99
Registriert: 19.02.2018, 20:52
Wohnort: Waldshut-Tiengen
Hat sich bedankt: 11 Mal
Danksagung erhalten: 7 Mal

HomeMatic liest und ändert Daten der Wallbox SMA EV Charger 22

Beitrag von DidiTheE » 04.02.2022, 12:20

(Beitrag komplett überarbeitet am 27.02.2022)

Seit längerer Zeit schon lese ich die Daten meiner SMA Solaranlage über Modbus aus und verarbeite sie in HomeMatic weiter (siehe dazu auch viewtopic.php?f=31&t=47813&hilit=Sunny+ ... ge#p478866).
Leider besitzt aber die Wallbox "SMA EV Charger 22" bisher keine Modbus Schnittstelle (Stand 27.02.22) und ein Zugriff der Daten blieb mir somit verwehrt.

Nach einigen Recherchen im Internet habe ich dann eine Lösung gefunden, die Daten des SMA EV Charger 22 über die JSON-API-Schnittstelle der Wallbox mit HomeMatic auszulesen. Ein entsprechender curl Aufrufe an die Wallbox und Verarbeitung der Antworten macht die aktuelle Betriebsdaten als auch die Einstellparameter des Gerätes zugänglich.

Auf dem gleichen Weg lassen sich so auch Parameter der Wallbox ändern und z.B. die gewünschte Lademenge und Zielzeit. Die dadurch entstehenden Anwendungsmöglichkeiten für die Automatisierung sind vielfältig.

Die Implementierung in HomeMatic habe ich wie folgt realisiert:
  • 1. Hauptrogramm zum Abfragen von
    • a. Zugriffs-Token der Wallbox
      b. Aktuelle Betriebsdaten
    2. Zusatzprogramm zum Abfragen von Einstellparameter
    3. Zusatzprogramme zum Ändern von Parametern
    • a. Setzen von Lademenge und Ladedauer
      b. Ändern der Betriebsart der Wallbox (z.B. auf Optimiertes Laden)
Für die Steuerung und den Datenaustausch zwischen den Programmen verwende ich mehrere Systemvariablen. Die Wichtigsten dabei sind

SMA EV Access IP = IP Adresse der Wallbox im Format "http://192.168.123.xx"
SMA EV Access USER = User ID zum Zugriff auf die Wallbox
SMA EV Access PASSWORD = Zugehöriges Passwort
SMA EV Meldung = Meldungen/Feedback aus den Programmen zur Anzeige im verwendeten GUI
SMA EV Ladevorgang Energiemenge (Werteliste) = -Auswählen-;1 kWh;2 kWh;3 kWh;4 kWh;5 kWh;6 kWh;…
SMA EV Ladevorgang Dauer (Werteliste) = -Auswählen-;1 Std.;2 Std.;3 Std.;4 Std.;5 Std.;6 Std.;7 Std.;…

Ein erster Test
Mit nachfolgendem Skript habe ich mir den Zugriff auf die Wallboxdaten erarbeitet.
Es ermittelt den Zugriffs-Token und liest dann die Daten aus der Wallbox.
Um die im JSON Format empfangenen Daten besser analysieren zu können, werden in einem Testprogramm die einzelnen Kanäle aufgelistet

Code: Alles auswählen

! Test Skript zum Lesen und Schreiben von Daten vom SMA EV Charger 22
! !! Nicht für den operativen Einsatz vorgesehen !!
! --------------------------------------------------------------------
string IP      = dom.GetObject("SMA EV Access IP").Value();
string USER    = dom.GetObject("SMA EV Access USER").Value();
string PASSWORD= dom.GetObject("SMA EV Access PASSWORD").Value();

string sToken  = "";
var    s       = "";

WriteLine("------------------------------------------------------");
WriteLine("- 1. Access Token bei Wallbox abfragen -")
string lGetOut = ""; string lGetErr = "";

string sCurl = ("curl "#IP#"/api/v1/token -d 'grant_type=password&username="#USER#"&password="#PASSWORD#"' | jq .access_token");

WriteLine ("sCurl = " # sCurl);

system.Exec( sCurl, &lGetOut,&lGetErr);
WriteLine("Out = " # lGetOut); WriteLine("Err = " # lGetErr);

if (lGetOut == "") {WriteLine("- No Access Token received -"); quit;}

sToken = " -H 'Authorization: Bearer '" # lGetOut.Replace("\"", ""); ! "

WriteLine("Token = " #sToken);

WriteLine("------------------------------------------------------");
WriteLine("- 2. Aktuelle Daten von Wallbox abfragen -");
string lGetOut = ""; string lGetErr = "";

string sCurl = ("curl "#IP#"/api/v1/measurements/live/ -d '[{\"componentId\":\"IGULD:SELF\"}]'" # sToken);

WriteLine ("sCurl = " # sCurl);

system.Exec( sCurl, &lGetOut,&lGetErr);
! WriteLine("Out = " # lGetOut); WriteLine("Err = " # lGetErr);
if (lGetOut == "") {WriteLine("- No Data received -"); quit;}

! Alle Objekte der Antwort auflisten
var i = 0;
var sText = lGetOut.StrValueByIndex("{\"channelId\":", i);
while (sText <> "")
{
    WriteLine(i # " = " # sText);
    i = i + 1;
    sText = lGetOut.StrValueByIndex("{\"channelId\":", i);
}
Hinweis: Für den Abruf des Token von der Wallbox braucht es die zugehörigen Zugriffsdaten. Der Account "Admin" geht offenbar nicht, es muss ein anderes User-Account angelegt werden.

Nachdem das Testprogramm fehlerfrei funktionierte, habe ich mich an das operative Version gemacht.

Lesen der Betriebsdaten
Das Hauptprogramm wird zyklisch jede Minute ausgeführt, bestimmt dabei jeweils das aktuelle Zugriffs-Token und liest die Betriebsdaten .

Code: Alles auswählen

! HomeMatic
! Skript zum Auslesen der Daten einer SMA EV Charger 22 Wallbox.
!
! Die benötigten Daten werden in die entsprechenden Systemvariablen gespeichert.
! Falls Access Token oder Daten nicht gelesen werden können, bricht das Skript ab.
!
! 02.02.22 ED: Initial Version
! 17.02.22 ED: Direktabruf mir "curl" ohne Shell Script
! ----------------------------------------------------------------------------------
string IP      = dom.GetObject("SMA EV Access IP").Value();
string USER    = dom.GetObject("SMA EV Access USER").Value();
string PASSWORD= dom.GetObject("SMA EV Access PASSWORD").Value();

string sToken  = "";
var    s       = "";

WriteLine("------------------------------------------------------");
WriteLine("- 1. Access Token bei Wallbox abfragen -")
string lGetOut = ""; string lGetErr = "";
string sCurl = ("curl "#IP#"/api/v1/token -d 'grant_type=password&username="#USER#"&password="#PASSWORD#"' | jq .access_token");
WriteLine ("sCurl = " # sCurl); ! Debug

system.Exec( sCurl, &lGetOut,&lGetErr);
! WriteLine("Out = " # lGetOut); WriteLine("Err = " # lGetErr);
if (lGetOut == "")
{
  s = "Token lesen fehlgeschlagen"; WriteLine(s);
  dom.GetObject("SMA EV Meldung").State(s);
  quit;
}

! Token für weiter verwendung aufbereiten
sToken = " -H 'Authorization: Bearer '" # lGetOut.Replace("\"", ""); ! "

! Token in Systemvariable zwischenspeichern
dom.GetObject("SMA EV Token").State(sToken);

WriteLine("------------------------------------------------------");
WriteLine("- 2. Aktuelle Daten von Wallbox abfragen -");
string lGetOut = ""; string lGetErr = "";
string sCurl = ("curl "#IP#"/api/v1/measurements/live/ -d '[{\"componentId\":\"IGULD:SELF\"}]'" # sToken);
WriteLine ("sCurl = " # sCurl); ! Debug

system.Exec( sCurl, &lGetOut,&lGetErr);
! WriteLine("Out = " # lGetOut); WriteLine("Err = " # lGetErr);
if (lGetOut == "")
{
  s = "Daten lesen fehlgeschlagen"; WriteLine(s);
  !dom.GetObject("SMA EV Meldung").State(s);
  quit;
}

! 3. Data Parser (Daten extrahieren)
! ------------------------------
! Einzelschritte des Parsers, um Prinzip verständlich zu machen
! s = lGetOut.StrValueByIndex("Measurement.ChaSess.WhIn", 1); WriteLine("s1= "# s);
! s = s.StrValueByIndex("},", 0); WriteLine("s2= "# s);
! s = s.StrValueByIndex("\"value\":", 1); WriteLine("s3= "# s);
! s = s.StrValueByIndex("}]", 0).Substr(7, s.Length());
! WriteLine("ChaSess.WhIn= "# s);
! ------------------------------

s = lGetOut.StrValueByIndex("Measurement.ChaSess.WhIn", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); WriteLine("ChaSess.WhIn= "# s);
    dom.GetObject("SMA EV Energie Ladevorgang").State( s.ToFloat()/1000 );
s = lGetOut.StrValueByIndex("Measurement.Chrg.ModSw", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); WriteLine("Chrg.ModSw= "# s);
    if (s==4950) {dom.GetObject("SMA EV Drehschalter").State(1);} else {dom.GetObject("SMA EV Drehschalter").State(0);}
s = lGetOut.StrValueByIndex("Measurement.GridMs.A.phsA", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); WriteLine("GridMs.A.phsA= "# s);
    dom.GetObject("SMA EV Netzstrom Phs L1").State(s.ToFloat()*-1);
s = lGetOut.StrValueByIndex("Measurement.GridMs.A.phsB", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); WriteLine("GridMs.A.phsB= "# s);
    dom.GetObject("SMA EV Netzstrom Phs L2").State(s.ToFloat()*-1);
s = lGetOut.StrValueByIndex("Measurement.GridMs.A.phsC", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); WriteLine("GridMs.A.phsC= "# s);
    dom.GetObject("SMA EV Netzstrom Phs L3").State(s.ToFloat()*-1);
s = lGetOut.StrValueByIndex("Measurement.GridMs.Hz", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); WriteLine("GridMs.Hz= "# s);
    dom.GetObject("SMA EV Netzfrequenz").State(s);
s = lGetOut.StrValueByIndex("Measurement.GridMs.PhV.phsA", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); WriteLine("GridMs.PhV.phsA= "# s);
    dom.GetObject("SMA EV Netzspannung Phs L1").State(s);
s = lGetOut.StrValueByIndex("Measurement.GridMs.PhV.phsB", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); WriteLine("GridMs.PhV.phsB= "# s);
    dom.GetObject("SMA EV Netzspannung Phs L2").State(s);
s = lGetOut.StrValueByIndex("Measurement.GridMs.PhV.phsC", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); WriteLine("GridMs.PhV.phsC= "# s);
    dom.GetObject("SMA EV Netzspannung Phs L3").State(s);
! s = lGetOut.StrValueByIndex("Measurement.GridMs.TotPF", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); WriteLine("GridMs.TotPF= "# s);
! s = lGetOut.StrValueByIndex("Measurement.GridMs.TotVA", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); WriteLine("GridMs.TotVA= "# s);
! s = lGetOut.StrValueByIndex("Measurement.GridMs.TotVAr", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); WriteLine("GridMs.TotVAr= "# s);
! s = lGetOut.StrValueByIndex("Measurement.InOut.GI1", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); WriteLine("InOut.GI1= "# s);
! s = lGetOut.StrValueByIndex("Measurement.Metering.GridMs.TotWIn", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); WriteLine("Metering.GridMs.TotWIn= "# s);
s = lGetOut.StrValueByIndex("Measurement.Metering.GridMs.TotWIn.ChaSta", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); WriteLine("GridMs.TotWIn.ChaSta= "# s);
    dom.GetObject("SMA EV Leistung Ladestation").State(s.ToFloat()/1000);
! s = lGetOut.StrValueByIndex("Measurement.Metering.GridMs.TotWhIn", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); WriteLine("Metering.GridMs.TotWhIn= "# s);
s = lGetOut.StrValueByIndex("Measurement.Metering.GridMs.TotWhIn.ChaSta", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); WriteLine("GridMs.TotWhIn.ChaSta= "# s);
    dom.GetObject("SMA EV Zählerstand Ladestation").State(s.ToFloat()/1000);
s = lGetOut.StrValueByIndex("Measurement.Operation.EVeh.ChaStt", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); WriteLine("Operation.EVeh.ChaStt= "# s);
    dom.GetObject("SMA EV Status Ladevorgang").State(s.ToInteger()-200111); ! Element aus Werteliste
! s = lGetOut.StrValueByIndex("Measurement.Operation.EVeh.Health", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); WriteLine("Operation.EVeh.Health= "# s);
s = lGetOut.StrValueByIndex("Measurement.Operation.Evt.Msg", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); WriteLine("Operation.Evt.Msg= "# s);
    dom.GetObject("SMA EV Zustandsmeldung").State(s);
s = lGetOut.StrValueByIndex("Measurement.Operation.Health", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); WriteLine("Operation.Health= "# s);
    if (s.ToInteger() == 307) {s="Ok";}
    dom.GetObject("SMA EV Zustand").State(s);
! s = lGetOut.StrValueByIndex("Measurement.Operation.WMaxLimSrc", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); WriteLine("Operation.WMaxLimSrc= "# s);

s = "Daten lesen erfolgreich"; WriteLine(s);

WriteLine("- fertig -");
Die Wallbox antwortet mit einem JSON String. Die gewünschte Daten werden im HM Skript herausgefiltert und in entsprechende Systemvariablen gespeichert.
Zugegeben, mein "JSON Parser" ist rudimentär, funktioniert aber bestens.
Die Kanalnamen und deren Bedeutung können übrigens im GUI der Wallbox unter Momentanwerte leicht herausgefunden werden.

Lesen der Einstellparameter
Der im Hauptprogramm ermittelte Zugriffs-Token wird übernommen und die Einstellparameter in einem separaten Programm ausgelesen.
Hier das Testprogramm für das Lesen der Parameter

Code: Alles auswählen

! Test Skript zum Lesen und Schreiben von Daten vom SMA EV Charger 22
! !! Nicht für den operativen Einsatz vorgesehen !!
! --------------------------------------------------------------------
string IP      = dom.GetObject("SMA EV Access IP").Value();
string USER    = dom.GetObject("SMA EV Access USER").Value();
string PASSWORD= dom.GetObject("SMA EV Access PASSWORD").Value();

string sToken  = "";
var    s       = "";

WriteLine("------------------------------------------------------");
WriteLine("- 1. Access Token bei Wallbox abfragen -")
string lGetOut = ""; string lGetErr = "";

string sCurl = ("curl "#IP#"/api/v1/token -d 'grant_type=password&username="#USER#"&password="#PASSWORD#"' | jq .access_token");

WriteLine ("sCurl = " # sCurl);

system.Exec( sCurl, &lGetOut,&lGetErr);
WriteLine("Out = " # lGetOut); WriteLine("Err = " # lGetErr);

if (lGetOut == "") {WriteLine("- No Access Token received -"); quit;}

sToken = " -H 'Authorization: Bearer '" # lGetOut.Replace("\"", ""); ! "

WriteLine("Token = " #sToken);

WriteLine("------------------------------------------------------");
WriteLine("- 2. Parameter von Wallbox abfragen -");
string lGetOut = ""; string lGetErr = "";

string sCurl = ("curl -s -k -X 'POST' "#IP#"/api/v1/parameters/search/ -H 'Content-Type: application/json' -H 'Referer: http://$IP/webui/Plant:1,IGULD:SELF/configuration/view-parameters' -d '{\"queryItems\":[{\"componentId\":\"IGULD:SELF\"}]}'" # sToken);

WriteLine ("sCurl = " # sCurl);

system.Exec( sCurl, &lGetOut,&lGetErr);
!WriteLine("Out = " # lGetOut); WriteLine("Err = " # lGetErr);

if (lGetOut == "") {WriteLine("- No Data received -"); quit;}

! Alle Objekte der Antwort auflisten
var i = 0;
var sText = lGetOut.StrValueByIndex("{\"channelId\":", i);
while (sText <> "")
{
  WriteLine(i # " = " # sText);
  i = i + 1;
  sText = lGetOut.StrValueByIndex("{\"channelId\":", i);
}
Der Zugriff gibt insgesamt 60 Parametern zurück, von denen mich aber lediglich Betriebsart, Vorgabe der Ladedauer, Lademenge und Uhrzeit des Ladeendes interessieren.
Da meine Wallbox automatische Firmware-Updates durchführt, überwache ich zusätzlich die Firmware auf Änderungen und protokolliere das ggf. Reiner Neugier.

Hier das operative Programm

Code: Alles auswählen

! HomeMatic
! Skript zum Auslesen der Parameter einer SMA EV Charger 22 Wallbox.
! Da der Access Token zyklisch beim Lesen der Daten (anderes HM Programm)
! gelesen wird, kann hier der Token aus der Systemvariable gelesen werden.
!
! Die benötigten Parameter werden in die entsprechenden Systemvariablen gespeichert.
!
! 17.02.22 ED: Initial Version
! ----------------------------------------------------------------------------------
string IP      = dom.GetObject("SMA EV Access IP").Value();

string lGetOut = "";
string lGetErr = "";
string sCurl   = "";
var    s       = "";
var    s1      = "";
var    n       = "";
var    v       = "";
var    i       = 0;

! Access Token aus Systemvariable übernehmen
WriteLine("------------------------------------------------------");
string sToken  = dom.GetObject("SMA EV Token").Value();
WriteLine("Access Token= " # sToken)
WriteLine("------------------------------------------------------");

sCurl = ("curl -s -k -X 'POST' "#IP#"/api/v1/parameters/search/ -H 'Content-Type: application/json' -H 'Referer: http://$IP/webui/Plant:1,IGULD:SELF/configuration/view-parameters' -d '{\"queryItems\":[{\"componentId\":\"IGULD:SELF\"}]}'" # sToken);
! WriteLine ("sCurl = " # sCurl);

system.Exec( sCurl, &lGetOut,&lGetErr);
!WriteLine("Out = " # lGetOut); WriteLine("Err = " # lGetErr);
if (lGetOut == "")
{
  s = "Parameter lesen fehlgeschlagen"; WriteLine(s);
  !dom.GetObject("SMA EV Meldung").State(s);
  quit;
}

! 2. Parameter Parser (Daten extrahieren)
! ---------------------------------------
! Einzelschritte des Parsers, um Prinzip verständlich zu machen
! s = lGetOut.StrValueByIndex("Parameter.Chrg.ActChaMod", 1); WriteLine("s1= "# s);
! s = s.StrValueByIndex("},", 0); WriteLine("s2= "# s);
! s = s.StrValueByIndex("\"value\":", 1); WriteLine("s3= "# s);
! s = s.StrValueByIndex("}]", 0).Substr(7, s.Length()); WriteLine("s4= "# s);
! s = s.Replace("\"", ""); ! Am Schluss Anführungszeichen entfernen
! WriteLine("Parameter.Chrg.ActChaMod= "# s);
! ------------------------------

s = lGetOut.StrValueByIndex("Parameter.Chrg.ActChaMod", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); s=s.Replace("\"", ""); WriteLine("Parameter.Chrg.ActChaMod= "# s); !"
    dom.GetObject("SMA EV Betriebsart_int").State( s.ToString(0) );
    dom.GetObject("SMA EV Betriebsart").State( s.ToInteger()-4718 ); ! Übersetzung in Werteliste

s = lGetOut.StrValueByIndex("Parameter.Chrg.Plan.DurTmm", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); s=s.Replace("\"", ""); WriteLine("Parameter.Chrg.Plan.DurTmm= "# s); !"
    dom.GetObject("SMA EV Ladevorgang Dauer_int").State(s.ToString(0));
    dom.GetObject("SMA EV Ladevorgang Dauer").State(s.ToInteger()/60);   ! In Stunden, d.h. Index innerhalb Werteliste umrechnen

s = lGetOut.StrValueByIndex("Parameter.Chrg.Plan.En", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); s=s.Replace("\"", ""); WriteLine("Parameter.Chrg.Plan.En= "# s); !"
    dom.GetObject("SMA EV Ladevorgang Energiemenge_int").State(s.ToString(1));
    ! Aktuelle Einstellung von kWh in Index innerhalb Werteliste umrechnen
    i = s.ToInteger(); if ((i > 10) && (i <= 50)){i = ((i-10)/5) + 10; } elseif ((i > 50) && (i <= 100)){i = ((i-50)/10) + 18; } elseif ((i < 0) || (i > 100)){i = 0; }
    dom.GetObject("SMA EV Ladevorgang Energiemenge").State(i);

s = lGetOut.StrValueByIndex("Parameter.Chrg.Plan.StopTm", 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); s=s.Replace("\"", ""); WriteLine("Parameter.Chrg.Plan.StopTm= "# s # " -- " # s.ToInteger().ToTime()); !"
    dom.GetObject("SMA EV Ladevorgang Ende_int").State(s.ToString(0));
    dom.GetObject("SMA EV Ladevorgang Ende").State(s.ToInteger().ToTime().Format("%d.%m.%Y %H:%M"));

! SW Versionen überprüfen und informieren bei Änderung
n = "Parameter.Nameplate.ChrgCtrl.SwRevTxt";
v = "SMA EV Vers. Ladecontroller";     ! Zugehörige Systemvariable
s = lGetOut.StrValueByIndex(n, 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); s=s.Replace("\"", ""); WriteLine(n # "= "# s); !"
if (s <> dom.GetObject( v ).Value())
{
  s1 = "SW Version geändert: "# n # "  -Alt: " # dom.GetObject( v ).Value() # "  -Neu: " # s;
  dom.GetObject( v ).State(s);
  dom.GetObject( "P:Info" ).State(s1);
  dom.GetObject("@HomeNotification").State("Änderung: " # v # " " # system.Date("%H:%M"));
}

n = "Parameter.Nameplate.CmpOS.SwRev"; ! EV Parameter
v = "SMA EV Vers. Betriebssystem";     ! Zugehörige Systemvariable
s = lGetOut.StrValueByIndex(n, 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); s=s.Replace("\"", ""); WriteLine(n # "= "# s); !"
if (s <> dom.GetObject( v ).Value())
{
  s1 = "SW Version geändert: "# n # "  -Alt: " # dom.GetObject( v ).Value() # "  -Neu: " # s;
  dom.GetObject( v ).State(s);
  dom.GetObject( "P:Info" ).State(s1);
  dom.GetObject("@HomeNotification").State("Änderung: " # v # " " # system.Date("%H:%M"));
}

n = "Parameter.SwCmp.CmpEnnexOS.Frwk.SwRev"; ! EV Parameter
v = "SMA EV Vers. ennexOS";                  ! Zugehörige Systemvariable
s = lGetOut.StrValueByIndex(n, 1); s = s.StrValueByIndex("},", 0).StrValueByIndex("\"value\":", 1).StrValueByIndex("}]", 0).Substr(7, s.Length()); s=s.Replace("\"", ""); WriteLine(n # "= "# s); !"
if (s <> dom.GetObject( v ).Value())
{
  s1 = "SW Version geändert: "# n # "  -Alt: " # dom.GetObject( v ).Value() # "  -Neu: " # s;
  dom.GetObject( v ).State(s);
  dom.GetObject( "P:Info" ).State(s1);
  dom.GetObject("@HomeNotification").State("Änderung: " # v # " " # system.Date("%H:%M"));
}

s = "Parameter lesen erfolgreich"; WriteLine(s);

WriteLine("- fertig -");
Ändern von Einstellparameter
Als nächstes geht es an das Verändern von Parametern. Ich möchte manuell und automatisch die Betriebsart der Wallbox umstellen und den Ladevorgang steuern können.
Dafür sind lediglich drei Parameter der Wallbox relevant,

1. die gewünscht Energiemenge (Parameter.Chrg.Plan.En)
2. das gewünschte Ende des Ladevorgangs (Parameter.Chrg.Plan.StopTm)
3. der Betriebsmodus der Wallbox (Parameter.Chrg.ActChaMod)

Sendet man die ersten zwei Parameter an die Wallbox, ändert diese selbständig den Betriebsmodus auf "Laden mit Vorgabe" und beginnt bzw. plant den Ladevorgang entsprechend ein.
Für die Vorgabe verwende ich zwei Systemvariablen vom Typ Werteliste
  • SMA EV Ladevorgang Energiemenge Werteliste -Auswählen-;1 kWh;2 kWh;3 kWh;4 kWh;5 kWh;6 kWh;…
    SMA EV Ladevorgang Dauer Werteliste -Auswählen-;1 Std.;2 Std.;3 Std.;4 Std.;5 Std.;6 Std.;7 Std.;…
Die Verwendung von Wertelisten hat hier den Vorteil, dass beim verwendeten GUI keine zusätzliche Plausibilitätsprüfung notwendig ist.
Hier das operative Programm

Code: Alles auswählen

! HomeMatic
! Skript zum Setzen folgender Parameter einer SMA EV Charger 22 Wallbox
! 1. Energiemenge (Systemvariable: SMA EV Ladevorgang Energiemenge)
! 2. Zielzeit     (Systemvariable: SMA EV Ladevorgang Ende + aktuelles Datem und Uhrzeit)
!
! 20.02.22 ED: Initial Version
! 16.03.22 ED: Aufruf mit Zeitstempel und Länge
! ----------------------------------------------------------------------------------
string IP      = dom.GetObject("SMA EV Access IP").Value();

string lGetOut = "";
string lGetErr = "";
string sCurl   = "";
var    s       = "";
var    i       = 0;

! Access Token aus Systemvariable übernehmen
WriteLine("------------------------------------------------------");
string sToken  = dom.GetObject("SMA EV Token").Value();
WriteLine("Access Token= " # sToken)
WriteLine("------------------------------------------------------");

WriteLine("- 1. Parameter an Wallbox senden -");
var    iPlanEn     = 0;    ! kWh
var    iPlanDurTmm = 0;    ! Min
var    iPlanStopTm = 0;    ! Zeit

! Aktueller Zeitstempel in GMT
var GMT=((currenttime.Format("%z").ToInteger())/-100)*60*60; ! Korrekturwert in Sekunden für Umrechnung in GMT
var sTimestamp = (currenttime+GMT).Format("%Y-%m-%dT%H:%M:%S.000Z"); ! Formatierte Ausgabe
WriteLine("Timestamp: "#sTimestamp);

!JSON Datenstring-Template mit Platzhalter xxx=Ladedauer; yyy=Energiemenge; ttt=Zeitstempel
string sData  = "{\"values\":[";
sData = sData # "{\"channelId\":\"Parameter.Chrg.Plan.DurTmm\",\"timestamp\":\"ttt\",\"value\":xxx},";
sData = sData # "{\"channelId\":\"Parameter.Chrg.Plan.En\",\"timestamp\":\"ttt\",\"value\":yyy}";
sData = sData # "]}";

iPlanEn = dom.GetObject("SMA EV Ladevorgang Energiemenge").Value();  ! Index aus Werteliste Energiemenge
WriteLine("-Energiemenge = " # iPlanEn # " kWh");

i = dom.GetObject("SMA EV Ladevorgang Dauer").Value();         ! Index aus Werteliste (Stunden)
iPlanStopTm = currenttime.ToInteger() + (i.ToInteger()*60*60); ! Aktuelle Zeit + Index in Minuten
WriteLine("Index: "#i# "   -Zielzeit     = " # iPlanStopTm # " >> " # iPlanStopTm.ToTime().Format("%d.%m.%Y %H:%M"));

! Platzhalter durch Daten ersetzen
sData = sData.Replace("xxx",i.ToString(0));
sData = sData.Replace("yyy",iPlanEn.ToString(0));
sData = sData.Replace("ttt",sTimestamp);

! Länge des Datenpakets bestimmen
var iDataLen = sData.Length();
WriteLine("Data = " # sData # "  Länge = " # iDataLen);

! Vollständigen String für curl Aufruf zusammenstellen
sCurl = "curl -s -k -X 'PUT' "#IP#"/api/v1/parameters/IGULD:SELF ";
sCurl = sCurl # "-H 'Content-Type: application/json' ";
sCurl = sCurl # "-H 'Referer: "#IP#"/webui/Plant:1,IGULD:SELF/configuration/view-parameters' ";
sCurl = sCurl # "-H 'Content-Length: " # iDataLen.ToInteger() # "' ";
sCurl = sCurl # "-d '" # sData # "' " # sToken;

WriteLine ("sCurl = " # sCurl);

system.Exec( sCurl, &lGetOut,&lGetErr);
WriteLine("Out = " # lGetOut); WriteLine("Err = " # lGetErr);

if (lGetErr <> "")
{
  s = "Parameter schreiben fehlgeschlagen"; WriteLine(s);
  dom.GetObject("SMA EV Meldung").State(s);
}
else
{
  s = "Laden mit Zeit- und Energievorgabe"; WriteLine(s);
  dom.GetObject("SMA EV Meldung").State(s);
}

WriteLine("- fertig -");
Weitere Programmbeispiel:
- Sofortiges Laden (Energiemenge 20kWh, Dauer 1 Std)

Code: Alles auswählen

! HomeMatic
! Skript setzt Parameter einer SMA EV Charger 22 Wallbox so, dass sie umgehend mit
! dem Laden beginnt
! 1. Energiemenge (Systemvariable: SMA EV Ladevorgang Energiemenge)
! 2. Zielzeit     (Systemvariable: SMA EV Ladevorgang Ende + aktuelles Datem und Uhrzeit)
!
! 25.02.22 ED: Initial Version
! 16.03.22 ED: Aufruf mit Zeitstempel und Länge
! ----------------------------------------------------------------------------------
string IP      = dom.GetObject("SMA EV Access IP").Value();

string lGetOut = "";
string lGetErr = "";
string sCurl   = "";
var    s       = "";
var    i       = 0;

! Access Token aus Systemvariable übernehmen
WriteLine("------------------------------------------------------");
string sToken  = dom.GetObject("SMA EV Token").Value();
WriteLine("Access Token= " # sToken)
WriteLine("------------------------------------------------------");

WriteLine("- 1. Parameter an Wallbox senden -");
var    iPlanEn     = 20;    ! kWh
var    iPlanDurTmm = 60;    ! Min
var    iPlanStopTm =  0;    ! Zeit

! Aktueller Zeitstempel in GMT
var GMT=((currenttime.Format("%z").ToInteger())/-100)*60*60; ! Korrekturwert in Sekunden für Umrechnung in GMT
var sTimestamp = (currenttime+GMT).Format("%Y-%m-%dT%H:%M:%S.000Z"); ! Formatierte Ausgabe
WriteLine("Timestamp: "#sTimestamp);

!JSON Datenstring-Template mit Platzhalter xxx=Ladedauer; yyy=Energiemenge; ttt=Zeitstempel
string sData  = "{\"values\":[";
sData = sData # "{\"channelId\":\"Parameter.Chrg.Plan.DurTmm\",\"timestamp\":\"ttt\",\"value\":xxx},";
sData = sData # "{\"channelId\":\"Parameter.Chrg.Plan.En\",\"timestamp\":\"ttt\",\"value\":yyy}";
sData = sData # "]}";

WriteLine("-Energiemenge = " # iPlanEn # " kWh");

iPlanStopTm = currenttime.ToInteger() + (iPlanDurTmm.ToInteger()*60); ! Aktuelle Zeit + Zeitvorgabe
WriteLine("Dauer: "#iPlanDurTmm# "   -Zielzeit     = " # iPlanStopTm # " >> " # iPlanStopTm.ToTime().Format("%d.%m.%Y %H:%M"));

! Platzhalter im Template durch Daten ersetzen
sData = sData.Replace("xxx",iPlanDurTmm.ToString(0));
sData = sData.Replace("yyy",iPlanEn.ToString(0));
sData = sData.Replace("ttt",sTimestamp);

! Länge des Datenpakets bestimmen
var iDataLen = sData.Length();
WriteLine("Data = " # sData # "  Länge = " # iDataLen);

! Vollständigen String für curl Aufruf zusammenstellen
sCurl = "curl -s -k -X 'PUT' "#IP#"/api/v1/parameters/IGULD:SELF ";
sCurl = sCurl # "-H 'Content-Type: application/json' ";
sCurl = sCurl # "-H 'Referer: "#IP#"/webui/Plant:1,IGULD:SELF/configuration/view-parameters' ";
sCurl = sCurl # "-H 'Content-Length: " # iDataLen.ToInteger() # "' ";
sCurl = sCurl # "-d '" # sData # "' " # sToken;

WriteLine ("sCurl = " # sCurl);

system.Exec( sCurl, &lGetOut,&lGetErr);
WriteLine("Out = " # lGetOut); WriteLine("Err = " # lGetErr);

if (lGetErr <> "")
{
  s = "Parameter schreiben fehlgeschlagen"; WriteLine(s);
  dom.GetObject("SMA EV Meldung").State(s);
}
else
{
  s = "Sofortiges Laden aktiviert"; WriteLine(s);
  dom.GetObject("SMA EV Meldung").State(s);
}

WriteLine("- fertig -");
- Betriebsmodus auf "Optimiertes laden" stellen

Code: Alles auswählen

! HomeMatic
! Skript zum Setzen folgender Parameter einer SMA EV Charger 22 Wallbox
! 1. Betriebsart Ladevorgang auf 4719 (Optimiertes Laden)
!
! 20.02.22 ED: Initial Version
! ----------------------------------------------------------------------------------
string IP      = dom.GetObject("SMA EV Access IP").Value();

string lGetOut = "";
string lGetErr = "";
string sCurl   = "";
var    s       = "";
var    i       = 0;

! Access Token aus Systemvariable übernehmen
WriteLine("------------------------------------------------------");
string sToken  = dom.GetObject("SMA EV Token").Value();
WriteLine("Access Token= " # sToken)
WriteLine("------------------------------------------------------");

WriteLine("- 1. Parameter an Wallbox senden -");

!JSON Datenstring mit Platzhalter xxx=Energiemenge; yyy=Zielzeit
sData = " -d '{\"values\":[{\"channelId\":\"Parameter.Chrg.ActChaMod\",\"value\":\"4719\"}]}' ";

! Vollständigen String für curl Aufruf zusammenstellen
sCurl = ("curl -s -k -X 'PUT' "#IP#"/api/v1/parameters/IGULD:SELF -H 'Content-Type: application/json' -H 'Referer: "#IP#"/webui/Plant:1,IGULD:SELF/configuration/view-parameters' "# sData # sToken );

system.Exec( sCurl, &lGetOut,&lGetErr);
WriteLine("Out = " # lGetOut); WriteLine("Err = " # lGetErr);

if (lGetErr <> "")
{
  s = "Parameter schreiben fehlgeschlagen"; WriteLine(s);
  dom.GetObject("SMA EV Meldung").State(s);
}
else
{
  s = "Optimiertes Laden aktiviert"; WriteLine(s);
  dom.GetObject("SMA EV Meldung").State(s);
}

WriteLine("- fertig -");
Hinweis:
Die Wallbox ist auf zu schnell aufeinander folgende Änderungen empfindlich. Ich hatte beim Testen Situationen, bei denen die Wallbox nicht mehr geladen und erst nach aus- und wieder Einstecken am Fahrzeug wieder normal funktioniert hat. Entsprechend braucht es beim Timing der Programme noch Optimierungen.

Ausblick
Als nächstes möchte ich nun noch den Ladezustand der Fahrzeugbatterie erfassen und dann in Automatisierungsaufgaben verwenden, z.B. "Fahrzeug ist morgens um 7:00 immer für mindestens 40km geladen".
Das Fahrzeug ist ein Mercedes. Ob ich die Daten gelesen bekommen und wie das ggf. funktioniert, werde ich in einem separaten Projekt berichten.
- Raspberry 3B (Charly)
- 121 Geräten mit insgesamt 493 Kanälen, 1 HmIP-HAP als Repeater
- 2 separate Raspberry mit jeweils Historian und ioBroker

DidiTheE
Beiträge: 99
Registriert: 19.02.2018, 20:52
Wohnort: Waldshut-Tiengen
Hat sich bedankt: 11 Mal
Danksagung erhalten: 7 Mal

Re: HomeMatic liest und ändert Daten der Wallbox SMA EV Charger 22

Beitrag von DidiTheE » 16.03.2022, 14:04

Beim Setzen der Ladevorgaben kam es wiederholt zu Hängern, manchmal lief der Ladevorgang nicht los oder das Fahrzeug wurde nicht vollgeladen. Die Wallbox ließ sich dann auch nicht mehr über die SMA App steuern. Erst das Trennen des Steckers vom Fahrzeug und das erneute Einstecken haben geholfen.

Weitere Untersuchungen haben erbracht, dass für die Änderungen folgende zusätzlichen Informationen gesendet werden müssen:
1. Zeitstempel der Änderung als Textstring im GMT Format
2. Länge des gesamten Datenstrings

Mit diesen zwei Ergänzungen läuft die Steuerung jetzt stabil. Die entsprechenden Anpassungen sind hier viewtopic.php?f=18&t=72536#p704796 eingearbeitet.
- Raspberry 3B (Charly)
- 121 Geräten mit insgesamt 493 Kanälen, 1 HmIP-HAP als Repeater
- 2 separate Raspberry mit jeweils Historian und ioBroker

kafetzke
Beiträge: 34
Registriert: 30.07.2018, 13:47
Hat sich bedankt: 2 Mal
Danksagung erhalten: 5 Mal

Re: HomeMatic liest und ändert Daten der Wallbox SMA EV Charger 22

Beitrag von kafetzke » 23.04.2022, 15:27

Moin DidiTheE,

vielen Dank für deine Anleitung - ich konnte dies problemlos übernehmen, um gezielt zwischen 6 und 10 Ampere minimalen Ladestrom zu switchen (sinnvoll beim Renault ZOE Ph2, da bei 6A kein Umschalten auf 3phasig möglich ist).

Vg Kafetzke

PS.: Ich war mal so frei, deinen Beitrag zu verlinken: https://www.photovoltaikforum.com/threa ... ost2594262

EV-Driver-80
Beiträge: 2
Registriert: 25.03.2023, 11:53
System: sonstige
Hat sich bedankt: 2 Mal

Re: HomeMatic liest und ändert Daten der Wallbox SMA EV Charger 22

Beitrag von EV-Driver-80 » 25.03.2023, 12:02

Hallo @DidiTheE, erstmal vielen vielen Dank für deine Programmbeispiele. Die haben mir schon viel weitergeholfen.
Da ich aber den Home Assistant nutze und diese im Node RED ausführe muss ich hier und etwas umbauen. Lademodi Auswahl usw. klappt bereits alles ohne Probleme. Nun scheitre ich aber dabei meinem EV Charger beizubringen jetzt mal schnell 10kWh ins Auto zu pumpen.
Scheinbar ist das die Königsdisziplin da du ja auch damit ein paar Probleme hattest.
Du könntest mir (und ein paar andern Home Assist Usern) ein großen Gefallen tun und den abgesetzten CURL Befehl hier posten. Z.B. wie der aussieht wenn man um Punkt 13 Uhr dem EV Charger sagen will lade mir nun mal 10 kWh ins Auto.
Spontan dachte ich ich sage dem das er in einer Minute 10kWh laden soll, klappte aber nicht bei mir. ich vermute das irgendwas mit der Längenangabe oder dem Zeitstempel nicht passt, daher wäre ein reales Beispiel sehr hilfreich wie der abgesetzte CURL Befehl nun aussieht.
Dieser wird ja hier ausgegeben:
WriteLine ("sCurl = " # sCurl);

Mein CURL Befehl sieht aktuell so aus:
curl -k -X "PUT" http://192.168.XXX.XXX/api/v1/parameters/IGULD:SELF -H "Content-Type: application/json" -H "Referer: http://192.168.XXX.XXX/webui/Plant:1,IG ... parameters" -H "Content-Length: 224" -d '{"values":[{"channelId":"Parameter.Chrg.Plan.DurTmm","timestamp":"2023-03-25T13:00:00.000Z","value":"1"},{"channelId":"Parameter.Chrg.Plan.En","timestamp":"2023-03-25T13:00:00.000Z","value":"10"}]}' -H "Authorization: Bearer eyJhbG......igr52M"

Vielen Dank im Voraus.

CCUMike
Beiträge: 3
Registriert: 25.03.2023, 17:15
System: CCU

Re: HomeMatic liest und ändert Daten der Wallbox SMA EV Charger 22

Beitrag von CCUMike » 25.03.2023, 17:29

Moin Zusammen

Ich brauche eure Hilfe.

Ich versuche nur die Werte aus der SMA EV zubekommen aber daran scheiters schon. :cry:
Was mach ich da Falsch.

Der Test Code :

Code: Alles auswählen

! Test Skript zum Lesen und Schreiben von Daten vom SMA EV Charger 22
! !! Nicht für den operativen Einsatz vorgesehen !!
! --------------------------------------------------------------------
string IP      = dom.GetObject("SMA EV Access IP").Value();
string USER    = dom.GetObject("SMA EV Access USER").Value();
string PASSWORD= dom.GetObject("SMA EV Access PASSWORD").Value();

string sToken  = "";
var    s       = "";

WriteLine("------------------------------------------------------");
WriteLine("- 1. Access Token bei Wallbox abfragen -")
string lGetOut = ""; string lGetErr = "";

string sCurl = ("curl "#IP#"/api/v1/token -d 'grant_type=password&username="#USER#"&password="#PASSWORD#"' | jq .access_token");

WriteLine ("sCurl = " # sCurl);

system.Exec( sCurl, &lGetOut,&lGetErr);
WriteLine("Out = " # lGetOut); WriteLine("Err = " # lGetErr);

if (lGetOut == "") {WriteLine("- No Access Token received -"); quit;}

sToken = " -H 'Authorization: Bearer '" # lGetOut.Replace("\"", ""); ! "

WriteLine("Token = " #sToken);

WriteLine("------------------------------------------------------");
WriteLine("- 2. Aktuelle Daten von Wallbox abfragen -");
string lGetOut = ""; string lGetErr = "";

string sCurl = ("curl "#IP#"/api/v1/measurements/live/ -d '[{\"componentId\":\"IGULD:SELF\"}]'" # sToken);

WriteLine ("sCurl = " # sCurl);

system.Exec( sCurl, &lGetOut,&lGetErr);
! WriteLine("Out = " # lGetOut); WriteLine("Err = " # lGetErr);
if (lGetOut == "") {WriteLine("- No Data received -"); quit;}

! Alle Objekte der Antwort auflisten
var i = 0;
var sText = lGetOut.StrValueByIndex("{\"channelId\":", i);
while (sText <> "")
{
    WriteLine(i # " = " # sText);
    i = i + 1;
    sText = lGetOut.StrValueByIndex("{\"channelId\":", i);
}


Die Ausgabe :

Code: Alles auswählen

-----------------------------------------------------
- 1. Access Token bei Wallbox abfragen -
sCurl = curl 0/api/v1/token -d 'grant_type=password&username=0&password=0' | jq .access_token
Out = 
Err = /bin/sh: jq: not found
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0curl: (6) Could not resolve: 0 (Domain name not found)

- No Access Token received -
Unbenannt.png
Im Vorraus Vielen Dank

DidiTheE
Beiträge: 99
Registriert: 19.02.2018, 20:52
Wohnort: Waldshut-Tiengen
Hat sich bedankt: 11 Mal
Danksagung erhalten: 7 Mal

Re: HomeMatic liest und ändert Daten der Wallbox SMA EV Charger 22

Beitrag von DidiTheE » 25.03.2023, 19:28

Hi Mike,

ich habe dein Programm bei mir mal unverändert laufen lassen und es funktioniert.
Es bringt folgenden Output:

Code: Alles auswählen

------------------------------------------------------
- 1. Access Token bei Wallbox abfragen -
sCurl = curl http://192.168.123.41/api/v1/token -d 'grant_type=password&username=xxxx&password=yyyy' | jq .access_token
Out = "eyJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2Nzk3Njc1MTcsInN1YiI6IkQuRWJuZXIiLCJ1aWQiOiJhYmFiYzkxYi1lYTIxLTQ2YzEtOTEzOS0wNjY3NjMyNzY5MzciLCJleHAiOjE2Nzk3NzExMTd9.s5kzZPeOLtEhMa1GUvp16sBuwFjxEl8qfIrVbNCdKLQ"

Err =   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100   561    0   505  100    56   4351    482 --:--:-- --:--:-- --:--:--  4878

Token =  -H 'Authorization: Bearer 'eyJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2Nzk3Njc1MTcsInN1YiI6IkQuRWJuZXIiLCJ1aWQiOiJhYmFiYzkxYi1lYTIxLTQ2YzEtOTEzOS0wNjY3NjMyNzY5MzciLCJleHAiOjE2Nzk3NzExMTd9.s5kzZPeOLtEhMa1GUvp16sBuwFjxEl8qfIrVbNCdKLQ

------------------------------------------------------
- 2. Aktuelle Daten von Wallbox abfragen -
sCurl = curl http://192.168.123.41/api/v1/measurements/live/ -d '[{"componentId":"IGULD:SELF"}]' -H 'Authorization: Bearer 'eyJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2Nzk3Njc1MTcsInN1YiI6IkQuRWJuZXIiLCJ1aWQiOiJhYmFiYzkxYi1lYTIxLTQ2YzEtOTEzOS0wNjY3NjMyNzY5MzciLCJleHAiOjE2Nzk3NzExMTd9.s5kzZPeOLtEhMa1GUvp16sBuwFjxEl8qfIrVbNCdKLQ

0 = [
1 = "channelId":"Measurement.ChaSess.WhIn","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T14:33:02.950Z","value":5510}]},
2 = "channelId":"Measurement.Chrg.ModSw","componentId":"IGULD:SELF","values":[{"time":"2023-01-29T14:03:40.811Z","value":4950}]},
3 = "channelId":"Measurement.GridMs.A.phsA","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T18:05:16.876Z","value":0}]},
4 = "channelId":"Measurement.GridMs.A.phsB","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T18:05:16.876Z","value":0}]},
5 = "channelId":"Measurement.GridMs.A.phsC","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T18:05:16.873Z","value":0}]},
6 = "channelId":"Measurement.GridMs.Hz","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T18:05:14.405Z","value":50.04}]},
7 = "channelId":"Measurement.GridMs.PhV.phsA","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T18:05:14.429Z","value":237.20000000000002}]},
8 = "channelId":"Measurement.GridMs.PhV.phsB","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T18:05:14.422Z","value":236.20000000000002}]},
9 = "channelId":"Measurement.GridMs.PhV.phsC","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T18:05:14.417Z","value":237.70000000000002}]},
10 = "channelId":"Measurement.GridMs.TotPF","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T18:05:14.406Z","value":1}]},
11 = "channelId":"Measurement.GridMs.TotVA","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T18:05:14.403Z","value":0}]},
12 = "channelId":"Measurement.GridMs.TotVAr","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T18:05:14.403Z","value":0}]},
13 = "channelId":"Measurement.InOut.GI1","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T18:05:16.572Z","value":0}]},
14 = "channelId":"Measurement.Metering.GridMs.TotWIn","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T18:05:14.403Z","value":0}]},
15 = "channelId":"Measurement.Metering.GridMs.TotWIn.ChaSta","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T18:05:14.403Z","value":0}]},
16 = "channelId":"Measurement.Metering.GridMs.TotWhIn","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T18:05:14.360Z","value":1953667}]},
17 = "channelId":"Measurement.Metering.GridMs.TotWhIn.ChaSta","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T18:05:14.360Z","value":1953667}]},
18 = "channelId":"Measurement.Operation.EVeh.ChaStt","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T18:05:16.428Z","value":200112}]},
19 = "channelId":"Measurement.Operation.EVeh.Health","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T18:05:16.871Z","value":307}]},
20 = "channelId":"Measurement.Operation.Evt.Msg","componentId":"IGULD:SELF","values":[{"time":"2023-03-24T18:29:26.636Z","value":302}]},
21 = "channelId":"Measurement.Operation.Health","componentId":"IGULD:SELF","values":[{"time":"2023-03-24T18:29:26.636Z","value":307}]},
22 = "channelId":"Measurement.Operation.WMaxLimNom","componentId":"IGULD:SELF","values":[{"time":"1970-01-01T00:00:00.973Z"}]},
23 = "channelId":"Measurement.Operation.WMaxLimSrc","componentId":"IGULD:SELF","values":[{"time":"2023-01-29T14:03:15.765Z","value":2608}]},
24 = "channelId":"Measurement.Wl.AcqStt","componentId":"IGULD:SELF","values":[{"time":"2023-02-26T12:54:18.857Z","value":3369}]},
25 = "channelId":"Measurement.Wl.ConnStt","componentId":"IGULD:SELF","values":[{"time":"2023-02-26T12:54:18.719Z","value":1725}]},
26 = "channelId":"Measurement.Wl.SigPwr","componentId":"IGULD:SELF","values":[{"time":"2023-02-26T12:54:18.719Z","value":0}]},
27 = "channelId":"Measurement.Wl.SoftAcsConnStt","componentId":"IGULD:SELF","values":[{"time":"2023-03-14T18:03:29.410Z","value":308}]},
28 = "channelId":"Setpoint.PlantControl.PCC.ChrgActCnt","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T18:04:37.875Z","value":1}]}]
Das Problem bei dir liegt beim Zugriff auf Wallbox. Es wird kein Access Token zurückgegeben.
Mögliche Ursachen
1. In deinem Curl Aufruf sind Wallbox-Adresse sowie Username und Pwd jeweils "0". Hier müssten Werte drin stehen (siehe meine Beispielausgabe).
2. Das User-Account "Admin" funktioniert für den Zugriff nicht, es muss ein anderes User-Account angelegt werden.
3. Gross-Kleinschreibung bei Username und Pwd sind wichtig.
4. Weder Username noch Pwd dürfen Leerzeichen enthalten. Überprüfe ggf. die Werte der verwendeten Systemvariablen.

Falls bei 1. tatsächlich überall "0" drin steht, versuche mal die Werte direkt im Code einzutrage, z.B.

Code: Alles auswählen

string IP = "http://192.168.178.215";
string USER  = "test";
string PASSWORD= "passwort";
Grüße, Dietmar
- Raspberry 3B (Charly)
- 121 Geräten mit insgesamt 493 Kanälen, 1 HmIP-HAP als Repeater
- 2 separate Raspberry mit jeweils Historian und ioBroker

Benutzeravatar
Henke
Beiträge: 1498
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 133 Mal
Danksagung erhalten: 302 Mal

Re: HomeMatic liest und ändert Daten der Wallbox SMA EV Charger 22

Beitrag von Henke » 25.03.2023, 19:31

Was mich stutzig macht ist das die eingegebenen Variablen nicht bei der Debug Ausgabe erscheinen.

sCurl = curl 0/api/v1/token -d 'grant_type=password&username=0&password=0' | jq .access_token
sollte mindestens mit http:// anfangen. Aber ich vermute, das hast du von Hand gelöscht um es uns etwas schwieriger zu machen.

Der Fehler "Err = /bin/sh: jq: not found" sagt, das das Programm jq nicht vorhanden ist. Wenn ich mich richtig erinnere wird dies durch RasberryMatic automatisch mit installiert und fehlt auf der original CCU.

DidiTheE
Beiträge: 99
Registriert: 19.02.2018, 20:52
Wohnort: Waldshut-Tiengen
Hat sich bedankt: 11 Mal
Danksagung erhalten: 7 Mal

Re: HomeMatic liest und ändert Daten der Wallbox SMA EV Charger 22

Beitrag von DidiTheE » 25.03.2023, 19:45

EV-Driver-80 hat geschrieben:
25.03.2023, 12:02
Du könntest mir (und ein paar andern Home Assist Usern) ein großen Gefallen tun und den abgesetzten CURL Befehl hier posten. Z.B. wie der aussieht wenn man um Punkt 13 Uhr dem EV Charger sagen will lade mir nun mal 10 kWh ins Auto.
Spontan dachte ich ich sage dem das er in einer Minute 10kWh laden soll, klappte aber nicht bei mir. ich vermute das irgendwas mit der Längenangabe oder dem Zeitstempel nicht passt, daher wäre ein reales Beispiel sehr hilfreich wie der abgesetzte CURL Befehl nun aussieht.
Um den Ladevorgang sofort zu starten, setze ich aktuell als Energiemenge 10kWh und Dauer 1 Std ein. Wenn du eine Minute als Ladedauer angibst, wird das vermutlich von der Wallbox als ungültig verworfen.

Hier Mal die Ausgabe des Programms (Startzeit 19:42 Winterzeit)

Code: Alles auswählen

------------------------------------------------------
Access Token=  -H 'Authorization: Bearer 'eyJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2Nzk3Njk3MjEsInN1YiI6IkQuRWJuZXIiLCJ1aWQiOiJhYmFiYzkxYi1lYTIxLTQ2YzEtOTEzOS0wNjY3NjMyNzY5MzciLCJleHAiOjE2Nzk3NzMzMjF9.U_AJ2iNWPGz7IxGEMY6J0R3HeuT0hVv6yGQ7XgB9wAk

------------------------------------------------------
- 1. Parameter an Wallbox senden -
Timestamp: 2023-03-25T18:42:12.000Z
-Energiemenge = 10 kWh
Dauer: 60   -Zielzeit     = 1679773332 >> 25.03.2023 20:42
Data = {"values":[{"channelId":"Parameter.Chrg.Plan.DurTmm","timestamp":"2023-03-25T18:42:12.000Z","value":60},{"channelId":"Parameter.Chrg.Plan.En","timestamp":"2023-03-25T18:42:12.000Z","value":10}]}  Länge = 194

sCurl = curl -s -k -X 'PUT' http://192.168.123.41/api/v1/parameters/IGULD:SELF -H 'Content-Type: application/json' -H 'Referer: http://192.168.123.41/webui/Plant:1,IGULD:SELF/configuration/view-parameters' -H 'Content-Length: 194' -d '{"values":[{"channelId":"Parameter.Chrg.Plan.DurTmm","timestamp":"2023-03-25T18:42:12.000Z","value":60},{"channelId":"Parameter.Chrg.Plan.En","timestamp":"2023-03-25T18:42:12.000Z","value":10}]}'  -H 'Authorization: Bearer 'eyJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2Nzk3Njk3MjEsInN1YiI6IkQuRWJuZXIiLCJ1aWQiOiJhYmFiYzkxYi1lYTIxLTQ2YzEtOTEzOS0wNjY3NjMyNzY5MzciLCJleHAiOjE2Nzk3NzMzMjF9.U_AJ2iNWPGz7IxGEMY6J0R3HeuT0hVv6yGQ7XgB9wAk

Out = 
Err = 
<p style="text-align: center; font-size: 0.7em; background-color: orange; color: black;">19:42: Sofortiges Laden aktiviert</p>
- fertig -
Hoffe, das hilft weiter.

Grüße, Dietmar
- Raspberry 3B (Charly)
- 121 Geräten mit insgesamt 493 Kanälen, 1 HmIP-HAP als Repeater
- 2 separate Raspberry mit jeweils Historian und ioBroker

CCUMike
Beiträge: 3
Registriert: 25.03.2023, 17:15
System: CCU

Re: HomeMatic liest und ändert Daten der Wallbox SMA EV Charger 22

Beitrag von CCUMike » 25.03.2023, 20:01

@Henke
sCurl = curl 0/api/v1/token -d 'grant_type=password&username=0&password=0' | jq .access_token
sollte mindestens mit http:// anfangen. Aber ich vermute, das hast du von Hand gelöscht um es uns etwas schwieriger zu machen.
Nein, die 0 len habe ich nicht von Hand eingefügt.
Der Fehler "Err = /bin/sh: jq: not found" sagt, das das Programm jq nicht vorhanden ist. Wenn ich mich richtig erinnere wird dies durch RasberryMatic automatisch mit installiert und fehlt auf der original CCU.
Das ist schon mal ein Hinweis, bin auf der Suche nach einen Add On für die CCU3

@DidiTheE
1. In deinem Curl Aufruf sind Wallbox-Adresse sowie Username und Pwd jeweils "0". Hier müssten Werte drin stehen (siehe meine Beispielausgabe).
2. Das User-Account "Admin" funktioniert für den Zugriff nicht, es muss ein anderes User-Account angelegt werden.
3. Gross-Kleinschreibung bei Username und Pwd sind wichtig.
4. Weder Username noch Pwd dürfen Leerzeichen enthalten. Überprüfe ggf. die Werte der verwendeten Systemvariablen.
Das habe ich alles Berücksichtigt.
string IP = "http://192.168.178.215";
string USER = "test";
string PASSWORD= "passwort";
Das ist nun die Antwort
------------------------------------------------------
- 1. Access Token bei Wallbox abfragen -
sCurl = curl http://192.168.178.215/api/v1/token -d 'grant_type=password&username=XXXXXX&password=XXXXXX' | jq .access_token
Out =
Err = /bin/sh: jq: not found
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed

0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 567 0 508 100 59 3060 355 --:--:-- --:--:-- --:--:-- 3415
(23) Failed writing body

- No Access Token received -

CCUMike
Beiträge: 3
Registriert: 25.03.2023, 17:15
System: CCU

Re: HomeMatic liest und ändert Daten der Wallbox SMA EV Charger 22

Beitrag von CCUMike » 25.03.2023, 20:28

@All

Vielen Dank euch Beiden.

Habe das Add On jq für die CCU3 Installiert.
Und die Variablen den den Code

Code: Alles auswählen

string IP = "http://192.168.178.215";
string USER  = "test";
string PASSWORD= "passwort";
übernommen.

Und das Ergebnis :
------------------------------------------------------
- 1. Access Token bei Wallbox abfragen -
sCurl = curl http://192.168.178.215/api/v1/token -d 'grant_type=password&username=xxxxxxr&password=xxxxxx' | jq .access_token
Out = "eyJhbGciOiJIUzI1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Err = % Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed

0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 567 0 508 100 59 6120 710 --:--:-- --:--:-- --:--:-- 6914

Token = -H 'Authorization: Bearer 'eyJhbGciOiJIUzI1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

------------------------------------------------------
- 2. Aktuelle Daten von Wallbox abfragen -
sCurl = curl http://192.168.178.215/api/v1/measurements/live/ -d '[{"componentId":"IGULD:SELF"}]' -H 'Authorization: Bearer 'eyJhbGciOiJIUzI1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
0 = [
1 = "channelId":"Measurement.ChaSess.WhIn","componentId":"IGULD:SELF","values":[{"time":"2023-03-24T15:16:56.523Z","value":0}]},
2 = "channelId":"Measurement.Chrg.ModSw","componentId":"IGULD:SELF","values":[{"time":"2023-03-18T07:36:18.162Z","value":4718}]},
3 = "channelId":"Measurement.GridMs.A.phsA","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T19:21:44.968Z","value":0}]},
4 = "channelId":"Measurement.GridMs.A.phsB","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T19:21:44.967Z","value":0}]},
5 = "channelId":"Measurement.GridMs.A.phsC","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T19:21:44.966Z","value":0}]},
6 = "channelId":"Measurement.GridMs.Hz","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T19:21:40.508Z","value":50.01}]},
7 = "channelId":"Measurement.GridMs.PhV.phsA","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T19:21:40.527Z","value":231.8}]},
8 = "channelId":"Measurement.GridMs.PhV.phsB","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T19:21:40.527Z","value":231.9}]},
9 = "channelId":"Measurement.GridMs.PhV.phsC","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T19:21:40.521Z","value":233}]},
10 = "channelId":"Measurement.GridMs.TotPF","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T19:21:40.509Z","value":1}]},
11 = "channelId":"Measurement.GridMs.TotVA","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T19:21:40.508Z","value":0}]},
12 = "channelId":"Measurement.GridMs.TotVAr","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T19:21:40.508Z","value":0}]},
13 = "channelId":"Measurement.InOut.GI1","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T19:21:45.125Z","value":0}]},
14 = "channelId":"Measurement.Metering.GridMs.TotWIn","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T19:21:40.508Z","value":0}]},
15 = "channelId":"Measurement.Metering.GridMs.TotWIn.ChaSta","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T19:21:40.508Z","value":0}]},
16 = "channelId":"Measurement.Metering.GridMs.TotWhIn","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T19:21:40.455Z","value":148092}]},
17 = "channelId":"Measurement.Metering.GridMs.TotWhIn.ChaSta","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T19:21:40.455Z","value":148092}]},
18 = "channelId":"Measurement.Operation.EVeh.ChaStt","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T19:21:44.501Z","value":200111}]},
19 = "channelId":"Measurement.Operation.EVeh.Health","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T19:21:44.958Z","value":307}]},
20 = "channelId":"Measurement.Operation.Evt.Msg","componentId":"IGULD:SELF","values":[{"time":"2023-03-24T15:16:56.548Z","value":302}]},
21 = "channelId":"Measurement.Operation.Health","componentId":"IGULD:SELF","values":[{"time":"2023-03-24T15:16:56.549Z","value":307}]},
22 = "channelId":"Measurement.Operation.WMaxLimNom","componentId":"IGULD:SELF","values":[{"time":"1970-01-01T00:00:00.973Z"}]},
23 = "channelId":"Measurement.Operation.WMaxLimSrc","componentId":"IGULD:SELF","values":[{"time":"2023-02-14T13:46:43.743Z","value":2608}]},
24 = "channelId":"Measurement.Wl.AcqStt","componentId":"IGULD:SELF","values":[{"time":"2023-03-05T12:02:31.006Z","value":3369}]},
25 = "channelId":"Measurement.Wl.ConnStt","componentId":"IGULD:SELF","values":[{"time":"2023-03-05T12:08:47.374Z","value":303}]},
26 = "channelId":"Measurement.Wl.SigPwr","componentId":"IGULD:SELF","values":[{"time":"2023-03-05T12:08:47.374Z","value":0}]},
27 = "channelId":"Measurement.Wl.SoftAcsConnStt","componentId":"IGULD:SELF","values":[{"time":"2023-03-05T12:08:47.464Z","value":303}]},
28 = "channelId":"Setpoint.PlantControl.PCC.ChrgActCnt","componentId":"IGULD:SELF","values":[{"time":"2023-03-25T19:21:09.246Z","value":0}]}]

Antworten

Zurück zu „Projektvorstellungen“