Hardy Barth echarge cpμ2 pro

Wenn mehr als ein Gerät an den Raspberry angeschlossen werden sollen. Z.B. ein Regler und ein Wechselrichter oder mehrere Wechselrichter. Das Maximum sind 6 Geräte pro Raspberry Pi.

Moderator: Ulrich

Benutzeravatar
mdkeil
Beiträge: 379
Registriert: So 12. Sep 2021, 20:40
Hat sich bedankt: 15 Mal
Danksagung erhalten: 23 Mal

Re: Hardy Barth echarge cpμ2 pro

Beitrag von mdkeil »

Hier mal die "rudimentäre" API-Doku, obgleich ich für mich nun den Weg gegangen bin, die Steuerung der WB über EVCC zu machen.

https://github.com/OpenEMS/openems/blob ... ia_api.pdf
IBN: 07/2021
Fronius Symo : 13.2kWp S 45° + 3.96 kWp S 15°
Fronius Primo : 2.97 kWp N 15°
Speicher: 14,3 kWh LiFePO4 (EEL) + Seplos BMS @ Victron MP-II 48/5000
Wallbox: 11kW echarge Hardy Barth Cpμ2 Pro
######
Tibber-Invite (100% Öko-Strom + 50€ Bonus)

epuran
Beiträge: 3
Registriert: So 4. Sep 2022, 18:30

Re: Hardy Barth echarge cpμ2 pro

Beitrag von epuran »

Hallo,

da ich von Solaranzeige überzeugt bin und aber eine Hardy cpµ2 pro Wallbox habe, mache ich hier weiter. Die Schnittstelle von µ2 pro ist wie Ulrich schon vermutet hat etwas anderes. Deswegen habe ich das Daten einlesen in den hardy_barth_math.php ausgelagert.

Code: Alles auswählen

<?php
/******************************************************************************
//  Hie können eigene Berechnungen gemacht werden, wenn das nötig ist.
//  Es stehen alle Felder folgender Measurements zur Verfügung:
//  Laderegler ==>  Measurement 'PV'      ->  Array  $LRVar
//  Wechselrichter ==> Measurement 'AC'   ->  Array  $WRVar
//  SmartMeter ==> Measurement 'AC'       ->  Array  $MeterVar
//  BMS ==>  Measurement 'Batterie'       ->  Array  $BMSVar
//
//  Die Steuerung benötigt folgende Variablen, die man hier noch beeinflussen 
//  kann. Bitte hier nur benutzen, wenn man sie auch anders berechnen möchte. 
//  Ansonsten hier nicht benutzen.
//
//
//  $PVLeistung      = erzeugte Solarleistung in Watt
//  $ACLeistung      = erzeugte Wechselstrom Leistung in Watt 
//  $Bezug           = aktuell bezogene Gesamtleistung in Watt
//  $Einspeisung     = aktuelle Einspeisung in Watt
//  $SOC             = aktuelle Kapazität in Prozent. 0 - 100%
//
//  $aWATTar["Preis_kWh"]  = Preis positiv oder negativ
//  $aWATTar["Sortierung"] = Sortireung der aktuellen 12 Stunden  1 - 12
//                           1 = schlechtester und 12 = bester Preis
//
//  Beschreibung dieses Array's ist in dem Dokument Automation.pdf
//  $UserKontaktAuswertung["Relais1"]["Kontakt1"] = 0 / 1  0 = OFF / AUS 
//  $UserKontaktAuswertung["Relais2"]["Kontakt2"] = 0 / 1  1 = ON / EIN
//  usw.
******************************************************************************/

//  Status:
//  A = Ready
//  B = Ladung aktiv
//  C = Fehler
//  D = Fehler
//  Kein Strom

if ( $Daten["device"]["modelname"] == "Salia PLCC Slave" ) {
    $funktionen->log_schreiben( "-------------   bin SALIA slave   --------------------- ", "|--", 8 );

    $aktuelleDaten["Name"] = $Daten["device"]["modelname"];

    $aktuelleDaten["wbsaldoactive"] = 0;
    $aktuelleDaten["Wh_Leistung_aktuell"] = (int)$Daten["secc"]["port0"]["metering"]["power"]["active_total"]["actual"]; 
    $aktuelleDaten["Wh_Gesamtleistung"] = (int)$Daten["secc"]["port0"]["metering"]["energy"]["active_total"]["actual"];
    $aktuelleDaten["Leistungsfaktor"] = 0;

    $aktuelleDaten["Leistung_R"]        = (int)$Daten["secc"]["port0"]["metering"]["power"]["active"]["ac"]["l1"]["actual"];
    $aktuelleDaten["Strom_R"]           = (int)$Daten["secc"]["port0"]["metering"]["current"]["ac"]["l1"]["actual"];
    if ( $aktuelleDaten["Strom_R"] <> 0 ){
        $aktuelleDaten["Strom_R"] = $aktuelleDaten["Strom_R"]/100;
    }
    $aktuelleDaten["Spannung_R"]        = 230;
    $aktuelleDaten["Leistungsfaktor_R"] = 0;

    $aktuelleDaten["Leistung_S"]         = (int)$Daten["secc"]["port0"]["metering"]["power"]["active"]["ac"]["l2"]["actual"];
    $aktuelleDaten["Strom_S"]            = (int)$Daten["secc"]["port0"]["metering"]["current"]["ac"]["l2"]["actual"];
    if ( $aktuelleDaten["Strom_S"] <> 0 ){
        $aktuelleDaten["Strom_S"] = $aktuelleDaten["Strom_S"]/100;
    }
    $aktuelleDaten["Spannung_S"]         = 230;
    $aktuelleDaten["Leistungsfaktor_S"]  = 0;

    $aktuelleDaten["Leistung_T"]         = (int)$Daten["secc"]["port0"]["metering"]["power"]["active"]["ac"]["l3"]["actual"];
    $aktuelleDaten["Strom_T"]            = (int)$Daten["secc"]["port0"]["metering"]["current"]["ac"]["l3"]["actual"];
    if ( $aktuelleDaten["Strom_T"] <> 0 ){
        $aktuelleDaten["Strom_T"] = $aktuelleDaten["Strom_T"]/100;
    }
    $aktuelleDaten["Spannung_T"]         = 230;
    $aktuelleDaten["Leistungsfaktor_T"]  = 0;

    $aktuelleDaten["Seriennummer"] = $Daten["device"]["serial"];
    $aktuelleDaten["Protokoll-Version"] = $Daten["device"]["software_version"];

    $aktuelleDaten["Mode"] = $Daten["secc"]["port0"]["charging"];

    $aktuelleDaten["LadungAmpere"] = ($aktuelleDaten["Strom_R"] + $aktuelleDaten["Strom_S"] + $aktuelleDaten["Strom_T"]);
    $aktuelleDaten["Status"] = $Daten["secc"]["port0"]["ci"]["charge"]["cp"]["status"];
    $aktuelleDaten["AmpereVorgabe"] = $Daten["secc"]["port0"]["ci"]["evse"]["basic"]["grid_current_limit"]["actual"];
    $aktuelleDaten["MaxAmpere"]     = $Daten["secc"]["port0"]["ci"]["evse"]["basic"]["offered_current_limit"];
    $aktuelleDaten["Anz_Phasen"]    = $Daten["secc"]["port0"]["ci"]["evse"]["basic"]["phase_count"];
    $aktuelleDaten["Hersteller"] = $Daten["device"]["modelname"];

    $aktuelleDaten["ModeID"] = 0;
    $funktionen->log_schreiben( "-------------  ist B ------------------ ".$Daten["secc"]["port0"]["ci"]["charge"]["cp"]["status"], "|--", 8 ); 
    if ($Daten["secc"]["port0"]["ci"]["charge"]["cp"]["status"] == "B"){
        $aktuelleDaten["StateID"] = 0;  
    }
    elseif ($Daten["secc"]["port0"]["ci"]["charge"]["cp"]["status"] == "C") {
        $aktuelleDaten["StateID"] = 3;  
    }
    else {
        $aktuelleDaten["StateID"] = $Daten["secc"]["port0"]["plug_lock"]["state"]["actual"];
    }

    if ($Daten["secc"]["port0"]["ci"]["charge"]["plug"]["status"] == "locked") {
        $aktuelleDaten["Connected"] = 1;
    }
    else {
        $aktuelleDaten["Connected"] = 0;
    }

     $aktuelleDaten["PVMode"] = $Daten["secc"]["port0"]["salia"]["chargemode"];
 }
return;
?>
Mit dem $aktuelleDaten["StateID"] bin ich immer noch am basteln. Mir ist noch nicht klar wofür das ist.

Die Steuerung muss auch angepasst werden. Danke an mdkeil für die Doku.
In hardy_barth.php ab Zeile 179

Code: Alles auswählen

    // Auf "manual" Mode umschalten! Damit Befehle entgegemngenommen werden.
//    $http_daten = array("URL" => "http://".$WR_IP."/api/v1/pvmode", "Port" => $WR_Port, "Header" => array('Content-Type: application/x-www-form-urlencoded', 'Accept: application/json'), "Data" => "pvmode=manual");
    $http_daten = array("URL" => "http://".$WR_IP."/api/secc", "Port" => $WR_Port, "Header" => array('Content-Type: application/x-www-form-urlencoded', 'Accept: application/json'), "Data" => "{\"salia/chargemode\":\"manual\"}");
    $Daten = $funktionen->http_read( $http_daten );
    $funktionen->log_schreiben( "Wallbox auf PVMode = manual  umschalten".$http_daten, "   ", 1 );
    // Hier wird der Befehl gesendet...
    // -----------------------------------------------------
    // $Teile[0] , $Teile[1]
    if ($Teile[0] == "start") {
//      $http_daten = array("URL" => "http://".$WR_IP."/api/v1/chargecontrols/".$WBID."/start", "Port" => $WR_Port, "Header" => array('Content-Type: application/json', 'Accept: application/json', 'Content-length: 0'), "Data" => "");
      $http_daten = array("URL" => "http://".$WR_IP."/api/secc", "Port" => $WR_Port, "Header" => array('Content-Type: application/json', 'Accept: application/json'), "Data" => "{\"grid_current_limit\":\"6\"}");
      $Daten = $funktionen->http_read( $http_daten );
      if (isset($Daten["errors"]["message"])) {
        $funktionen->log_schreiben( "Fehler!: ".$Daten["errors"]["message"], "   ", 1 );
      }
      $funktionen->log_schreiben( "Wallbox: Ladung gestartet.", "   ", 7 );
    }
    elseif ($Teile[0] == "stop") {
//      $http_daten = array("URL" => "http://".$WR_IP."/api/v1/chargecontrols/".$WBID."/stop", "Port" => $WR_Port, "Header" => array('Content-Type: application/json', 'Accept: application/json', 'Content-length: 0'), "Data" => "");
      $http_daten = array("URL" => "http://".$WR_IP."/api/secc", "Port" => $WR_Port, "Header" => array('Content-Type: application/json', 'Accept: application/json'), "Data" => "{\"grid_current_limit\":\"0\"}");
      $Daten = $funktionen->http_read( $http_daten );
      if (isset($Daten["errors"]["message"])) {
        $funktionen->log_schreiben( "Fehler!: ".$Daten["errors"]["message"], "   ", 1 );
      }
      $funktionen->log_schreiben( "Wallbox: Ladung unterbrochen.", "   ", 7 );
    }
    elseif ($Teile[0] == "ampere") {
//      $http_daten = array("URL" => "http://".$WR_IP."/api/v1/pvmode/manual/ampere", "Port" => $WR_Port, "Header" => array('Content-Type: application/x-www-form-urlencoded', 'Accept: application/json'), "Data" => "manualmodeamp=".$Teile[1]);
      $http_daten = array("URL" => "http://".$WR_IP."/api/secc", "Port" => $WR_Port, "Header" => array('Content-Type: application/json', 'Accept: application/json'), "Data" => "{\"grid_current_limit\":\"".$Teile[1]."\"}");
      $Daten = $funktionen->http_read( $http_daten );
      $funktionen->log_schreiben( "Wallbox: Stromstärke eingestellt auf ".$Teile[1]." Ampere", "   ", 7 );
    }
    // -----------------------------------------------------
Die Befehle für die Wallbox sind:

Set manual mode:
curl -X PUT -d ’{“salia/chargemode“:“manual“}’ http://169.254.12.53/api/secc
Set charging current to 10 A:
curl -X PUT -d '{"grid_current_limit":"10"}' http://169.254.12.53/api/secc
Send heartbeat (< 60 sec interval):
curl -X PUT -d ’{“salia/heartbeat“:“alive“}’ http://169.254.12.53/api/secc
Stop charging:
curl -X PUT -d '{"grid_current_limit":"0"}' http://169.254.12.53/api/secc

nun jetzt meine Frage:
weiß jemand wofür heartbeat ist? Muss man alle 60 sec so ein Befehl an die Wallbox senden dass die aktiv bleib?
Ich vermisse auch den Startbefehl. Ist es mit set charging current xA gemeint?

Gruß
epuran
Sungrow SG10.0RT: 9,6kwp
Sungrow SH8.0RT: SBR096
-----------------------
Wallbox Hardy Barth cpμ2 pro

Antworten

Zurück zu „Multi-Regler-Version [ bis zu 6 Geräten an einem Raspberry Pi ]“