ABL eMHS home per HTTPMOD in FHEM einbinden

Begonnen von stefan_hb, 27 März 2024, 22:42:10

Vorheriges Thema - Nächstes Thema

stefan_hb

Moin,

dank des Forums und mit Hilfe von BURP funktioniert der zumindest der Lesezugriff von FHEM auf das o.g. Gerät schon einmal. Es soll bei mir eine Wallbox eMH1 (aus dem Hause ABL) steuern, neben einer Statusanzeige möchte ich das Laden von FHEM aus ein-und ausschalten können. Bin aktuell recht zuversichtlich, dass das auch klappen wird. Lohnt aus Eurer Sicht eine Dokumentation hier im Forum oder sonstwo in der weiten FHEM-Welt?

Grüße aus Bremen,

Stefan, vor etlichen Jahren als habefan hier unterwegs

stefan_hb

Moin zusammen,

der Status des Geräts lässt sich über HTTPMOD per Get...-Befehl auslesen. Um z.B. den Lademodus umzuschalten, braucht es scheinbar eine solche Konstruktion:
#####################################################################
# fSetChargeMode()
#####################################################################
sub fSetChargeMode($$) {
  # 2024-04-10
  # -
  my $device = shift;
  my $mode = shift;

  #update charge mode settings (+ re-auth if neccessary)
  fhem("get $device ChargeMode");
  #wait for fhem to update readings -> tut noch nicht wirklich
  sleep(10);
 
  my $lastmode =
      ReadingsVal($device, "mincharginpowerquota", "lock");
  my $minchargepower =
      ReadingsVal($device, "mincharginpowerquota", "0");
  my $minpvpower =
      ReadingsVal($device, "minpvpowerquota", "0");
  my $lastminchargepower =
      ReadingsVal($device, "lastminchargingpowerquota", "0");
  my $lastminpvpower =
      ReadingsVal($device, "lastminpvpowerquota", "0");
  my $sid =  InternalVal($device, "sid", "");

  if ($mode eq "lock") {
    $minchargepower = "null";
    $minpvpower = "0";
  } elsif ($mode eq "grid") {
    $minchargepower = "null";
    $minpvpower = "0";
  } elsif ($mode eq "pv") {
    $minchargepower = "null";
    $minpvpower = "100";
  } elsif ($mode eq "hybrid") {
    if ($mode ne $lastmode) {
      $minchargepower = $lastminchargepower;
      $minpvpower = $lastminpvpower;
    }
  }
 
  #html header
  my $header = "Authorization: Bearer ".$sid."\r\n";
  $header .= "Content-Type: application/json;charset=utf-8";
  Log 3, "fSetChargeMode(): set header to +++ $header +++";

  #build html body
  my $bodydata = "{";
  $bodydata .= "\"mode\":\"$mode\",";
  $bodydata .= "\"mincharginpowerquota\":$minchargepower,";
  $bodydata .= "\"minpvpowerquota\":$minpvpower";
  $bodydata .= "}";
  Log 3, "fSetChargeMode(): set body data to +++ $bodydata +++";
 
  #build html request
  my $htmlrequest = {
      url      => "http://xxx.xxx.xxx.xxx/api/e-mobility/config/chargemode",
      method   => "PUT",
      timeout  => 5,
      callback => sub() {},
      header   => $header,
      data     => $bodydata
  };

  #send request
  HttpUtils_NonblockingGet($htmlrequest);

  #update readings
  fhem("get $device ChargeMode");

  return ;
}

Soweit, so funktionstüchtig.

"Schön" bzw. einfach bedienbar fehlt noch. Ich kann mir vorstellen, irgendetwas "übergeordnetes" zu definieren und darüber Aufrufe eines zugehörigen HTTPMODs bzw. der genannten Funktion anzustoßen, ein Dummy im Zusammenspiel mit einigen notify z.B. Geht es auch besser? Wie würdet Ihr das aufbauen?

Vielen Dank für Eure Hilfe,

stefan

Prof. Dr. Peter Henning

Gute Arbeit, soweit.

Problem ist allerdings die Wartbarkeit solcher Code-Schnipsel. Ich würde versuchen, das komplett mit HTTPMOD zu realisieren, alle Möglichkeiten dafür sind im Modul vorhanden - obwohl es immer eine Weile dauert, bis man sich da genau eingelesen hat.

Warum? Weil das die beste Möglichkeit bietet, auf FHEM-Ebene (nicht auf Perl-Ebene) die Abläufe und Bezeichnungen zu vereinheitlichen.

Und warum wäre diese Vereinheitlichung wünschenswert? Weil man dann ein universell verwendbares Modul zum Energiemanagement bauen kann.

Allerdings hat das bisher nur theoretischen Wert, ich habe die HTTPMOD-Version für meine go-e Wallbox geschrieben, obwohl das E-Auto immer noch nicht da ist :-(

LG

pah

stefan_hb

Ich bin leider (vorerst) daran gescheitert, den Lademodus über HTTPMOD umzuschalten bzw. irgendwelche Daten an das ABL-Gerät zu senden. Die o.g. Funktion erledigt das einerseits zuverlässig, einige Schwächen sind zwischenzeitlich ausgemerzt:
- Als Parameter erwartet die Funktion den FHEM-Namen des HTTPMOD für das ABL-Gerät sowie den Namen des Dummy, über den der Lademodus umgeschaltet werden kann.
- Das HTTPMOD ruft alle zehn Minuten Daten ab, so dass die sid dort immer gültig ist.
- Betriebsart und der min. PV-Anteil am Ladestrom werden aus den Readings des Dummy (Betriebsart) bzw. des HTTPMOD gebildet.
- Die IP-Adresse holt sich die Funktion aus dem HTTPMOD.

Damit bleibt als ABL-spezifische Aufgabe der Funktion noch, den HTML-Request aus div. Readings zu erstellen und abzusenden.

Auf FHEM-Ebene gibt es aktuell:
- ein HTTPMOD für das Lastmanagement, darüber laufen der Login und das Auslesen von Istwerten
- zwei Dummys; einen zum Setzen des Lademodus und einen zum Einstellen des min. PV-Anteils beim hybriden Laden
- ein Notify, der auf Änderungen beim geforderten Lademodus reagiert
- ein at, das die Perl-Funktion zeitverzögert aufruft (Da der Lademodus durchgeklickt werden kann, erschien mir das sinnvoll.)

Somit kann ich jetzt die Wallbox vom Handy aus sperren und freigeben. Alles, was mit Solar zu tun hat, kann ich mangels PV-Anlage nicht wirklich testen und hoffe ebenfalls darauf, dass das E-Auto bald eintrifft ;-)

Die Codeschnipsel dazu teile ich bei Bedarf gerne, ebenso nehme ich gerne Tipps an, wie sich ein Setzen von mehreren Werten per PUT und JSON direkt in HTTPMOD realisieren lässt ...

Viele Grüße,,

stefan