Ankündigung

Einklappen
Keine Ankündigung bisher.

SMA-Webbox mit HTTP-RPC abfragen

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • NetFritz
    antwortet
    Hallo
    Fürs Web Interface kenne ich keine Lösung.
    Für Bluetooth gibt es was.
    Bitte mal hier fragen.
    Portal? Photovoltaikforum
    Gruß NetFritz

    Einen Kommentar schreiben:


  • freak83
    antwortet
    Bluetooth und Web


    Gesendet von meinem iPad mit Tapatalk

    Einen Kommentar schreiben:


  • NetFritz
    antwortet
    Hallo
    Was für eine Schnittstelle hat dein WR ?
    Gruß NetFritz

    Einen Kommentar schreiben:


  • freak83
    antwortet
    Gibt es eine andere Möglichkeit ?

    Einen Kommentar schreiben:


  • NetFritz
    antwortet
    Hallo
    @freak83
    Geht das auch mit dem Homemanger oder direkt mit dem WR TL5000-21?
    Das Plugin läuft nicht mit dem SMA-Homemanger und auch nicht direkt mit einem SMA Wechselrichter.
    Gruß NetFritz

    Einen Kommentar schreiben:


  • freak83
    antwortet
    Geht das auch mit dem Homemanger oder direkt mit dem WR TL5000-21?

    Einen Kommentar schreiben:


  • makki
    antwortet
    Erledischt

    Makki

    Einen Kommentar schreiben:


  • NetFritz
    antwortet
    Hallo
    Das Script hat jetzt ein paar Tage durchgelaufen.
    Eine kleine Änderung habe ich noch durchgeführt.
    Code:
    knx_write($leistung_ga,$Pac,9);
    ist jetzt
    knx_write($leistung_ga,$GriPwr,9);
    Hier nochmal das Script.
    @makki Du kannst dann das Script ins SVN schieben.
    Gruß NetFritz
    Code:
    # holt über HTTP-RPC die Daten von der SMA-Webbox
    # es wird GetProcessData und GetPlantOverview abgefragt
    # by NetFritz 5.2012
    #
    use HTML::Entities;
    use LWP::UserAgent;
    use JSON::XS;
    # ======= Anfang Konfig =======
    my $url = "http://192.168.2.7:85"; # IP der Webbox
    my $key = "004e:7d30b9bc";         # Key des WR muss vorher ermittelt werden
    my $leistung_ga = "5/0/1"; 
    my $leistung_pro_kw_ga = "5/0/2"; 
    my $tagesertrag_ga = "5/0/3"; 
    my $gesammtertrag_ga = "5/0/4"; 
    my $zustand_ga = "5/0/5"; 
    my $meldung_ga = "5/0/6"; 
    my $DC_Strom_Eingang_ga = "5/0/7";
    my $DC_Spannung_Eingang_ga = "5/0/8";
    my $Netzstrom_ga = "5/0/9";
    my $Leistung_Haushalt_ga = "5/0/15";
    # ======= Ende Konfig =========
    # Eigenen Aufruf-Zyklus auf 60 Sekunden setzen
    # der Aufrufzyklus ist unabhängig von der Taktzeit und muss kürzer sein!
    $plugin_info{$plugname.'_cycle'} = 60;
    my $res;
    my $ref;
    # ===== Abfragestring GetProcessData =====
    my $callobj = '/rpc?RPC={
                    "version": "1.0",
                    "proc": "GetProcessData",
                    "id": "1",
                    "format": "JSON",
                    "params":
                    {
                      "devices":
                      [
                      {
                        "key": "'. $key .'",
                        "channels": null
                      }
                      ]
                    }
                  }';
    #
    # ==== Abfragestring GetPlantOverview =====
    my $callobj1 = '/rpc?RPC={
                 "version": "1.0",
                 "proc": "GetPlantOverview",
                 "id": "1",
                 "format": "JSON"
                 }';
    #
    # ====== Abfrage GetProcessData ======
    $res = $url.$callobj; 
    $ref = rpcs($res);
    #
    my $Ipv = $ref->{'result'}->{'devices'}->[0]->{'channels'}->[0]->{'value'}; # DC Strom Eingang
    my $Upv = $ref->{'result'}->{'devices'}->[0]->{'channels'}->[1]->{'value'}; # DC Spannung Eingang
    my $Fac = $ref->{'result'}->{'devices'}->[0]->{'channels'}->[5]->{'value'}; # NetzFrequenz
    my $Iac = $ref->{'result'}->{'devices'}->[0]->{'channels'}->[6]->{'value'}; # Netzstrom
    my $Pac = $ref->{'result'}->{'devices'}->[0]->{'channels'}->[7]->{'value'}; # Leistung
    my $Riso = $ref->{'result'}->{'devices'}->[0]->{'channels'}->[8]->{'value'}; # Isolationswiderstand
    my $hon = $ref->{'result'}->{'devices'}->[0]->{'channels'}->[10]->{'value'}; # Einspeisezeit
    my $hTotal = $ref->{'result'}->{'devices'}->[0]->{'channels'}->[11]->{'value'}; # Betriebszeit
    my $ETotal = $ref->{'result'}->{'devices'}->[0]->{'channels'}->[12]->{'value'}; # Gesammtertrag
    my $NetzEin = $ref->{'result'}->{'devices'}->[0]->{'channels'}->[13]->{'value'}; # Netz-Ein
    # return $Ipv . "=" . $Upv . "=" . $Fac . "=" . $Iac . "=" . $Pac . "=" . $Riso . "=" . $hon . "=" . $hTotal . "=" . $ETotal . "=" . $NetzEin;
    #
    # ===== Abfrage GetPlantOverview =====
    $res = $url.$callobj1; 
    $ref = rpcs($res);
    my $GriPwr = $ref->{'result'}->{'overview'}->[0]->{'value'}; # Leistung
    my $GriEgyTdy = $ref->{'result'}->{'overview'}->[1]->{'value'}; # Tagesertrag
    my $GriEgyTot = $ref->{'result'}->{'overview'}->[2]->{'value'}; # Gesamtertrag
    my $OpStt = $ref->{'result'}->{'overview'}->[3]->{'value'}; # Zustand
    my $Msg = $ref->{'result'}->{'overview'}->[4]->{'value'}; # Meldung
    # return $GriPwr . "=" . $GriEgyTdy ."=". $GriEgyTot ."=". $OpStt ."=". $Msg ;
    # my $Tag_CO2_vermeidung = $GriEgyTdy*700; # 700g/kWh
    # Werte auf den BUS schreiben
     knx_write($leistung_ga,$GriPwr,9);
     knx_write($leistung_pro_kw_ga,$GriPwr/4.05,9);
     knx_write($tagesertrag_ga,$GriEgyTdy,9);
     knx_write($gesammtertrag_ga,$ETotal,9);
     knx_write($zustand_ga,$OpStt,16);
     knx_write($DC_Strom_Eingang_ga,$Ipv,9);
     knx_write($DC_Spannung_Eingang_ga,$Upv,9);
     knx_write($Netzstrom_ga,$Iac,9);
     # knx_write($meldung_ga,$$Msg,16);
    my $Leistung_Zaehler = knx_read("5/0/12",0,9);
    my $leistg_haush = knx_read("5/0/1",0,9)-$Leistung_Zaehler; # Leistung Haushalt
    knx_write($Leistung_Haushalt_ga,$leistg_haush,9);
    # Wert in RRD schreiben
    update_rrd("pv_leistung","",$GriPwr); 
    update_rrd("pv_leistung_kW","",$Pac/1000);
    update_rrd("pv_tagesertrag","",$GriEgyTdy);
    update_rrd("pv_DC_Strom_Eingang","",$Ipv);
    update_rrd("pv_DC_Spannung_Eingang","",$Upv/100);
    update_rrd("Leistung_Haushalt","",$leistg_haush);
    # ===== Sub holt die Werte von der Webbox =====
    sub rpcs{
       my $res = shift;
       my $brs = LWP::UserAgent->new;
       my $req = HTTP::Request->new(GET => $res);
       my $resp = $brs->request($req); 
       #
       if($resp->is_success()) {
         # print "Erfolg !";
       }else {
         return "Keine Antwort !";
       }
       #
       my $content = $resp->content;
       my %js_hash_ref = %{decode_json $content};
       my $ref=\%js_hash_ref; 
       #
       return($ref);
    }
    return;

    Einen Kommentar schreiben:


  • makki
    antwortet
    Jow, kann ja als Alternative ins SVN, es gibt immer mehrere Wege nach Rom

    (ich hatte nur keinen direkten Zugriff auf die Anlage bzw. keine Möglichkeit zu verifizieren und mit 36 Werten war mir das mit dem XML/Json dann irgendwann zu blöd, das CSV tuts auch im 5 Minuten-Takt, ist aber noch langsamer, daher extern geholt..)

    Makki

    P.S.: Im unteren Teil des ersten Plugins steht auskommentiert, wie man die ID's/SN der WR aus Plantoverview holt, aber das hab ich mir dann anders überlegt..
    Das CSV-Format ist - gelinde gesagt - ziemlich krude; fehlt mir aber einfach der Vergleich..

    Einen Kommentar schreiben:


  • NetFritz
    antwortet
    Hallo
    Hier mal mein Plugin.
    Ist sicher sicherlich noch verbesserungswürdig.
    Den Wechselrichter Key kann man so mit einem Browser holen.
    Code:
    http://IPderWebbox/rpc?RPC={"version":"1.0","proc":"GetDevices","id":"1","format":"JSON"}}
    Gruß NetFritz
    Code:
    # holt über HTTP-RPC die Daten von der SMA-Webbox
    # es wird GetProcessData und GetPlantOverview abgefragt
    # by NetFritz 5.2012
    #
    use HTML::Entities;
    use LWP::UserAgent;
    use JSON::XS;
    # ======= Anfang Konfig =======
    my $url = "http://192.168.2.7";  # IP der Webbox
    my $key = "004e:7d30b9bc";     # Key des WR muss vorher ermittelt werden
    my $leistung_ga = "5/0/1"; 
    my $leistung_pro_kw_ga = "5/0/2"; 
    my $tagesertrag_ga = "5/0/3"; 
    my $gesammtertrag_ga = "5/0/4"; 
    my $zustand_ga = "5/0/5"; 
    my $meldung_ga = "5/0/6"; 
    my $DC_Strom_Eingang_ga = "5/0/7";
    my $DC_Spannung_Eingang_ga = "5/0/8";
    my $Netzstrom_ga = "5/0/9";
    # ======= Ende Konfig =========
    # Eigenen Aufruf-Zyklus auf 60 Sekunden setzen
    # der Aufrufzyklus ist unabhängig von der Taktzeit und muss kürzer sein!
    $plugin_info{$plugname.'_cycle'} = 60;
    my $res;
    my $ref;
    # ===== Abfragestring GetProcessData =====
    my $callobj = '/rpc?RPC={
                    "version": "1.0",
                    "proc": "GetProcessData",
                    "id": "1",
                    "format": "JSON",
                    "params":
                    {
                      "devices":
                      [
                      {
                        "key": "'. $key .'",
                        "channels": null
                      }
                      ]
                    }
                  }';
    #
    # ==== Abfragestring GetPlantOverview =====
    my $callobj1 = '/rpc?RPC={
                 "version": "1.0",
                 "proc": "GetPlantOverview",
                 "id": "1",
                 "format": "JSON"
                 }';
    #
    # ====== Abfrage GetProcessData ======
    $res = $url.$callobj; 
    $ref = rpcs($res);
    #
    my $Ipv = $ref->{'result'}->{'devices'}->[0]->{'channels'}->[0]->{'value'}; # DC Strom Eingang
    my $Upv = $ref->{'result'}->{'devices'}->[0]->{'channels'}->[1]->{'value'}; # DC Spannung Eingang
    my $Fac = $ref->{'result'}->{'devices'}->[0]->{'channels'}->[5]->{'value'}; # NetzFrequenz
    my $Iac = $ref->{'result'}->{'devices'}->[0]->{'channels'}->[6]->{'value'}; # Netzstrom
    my $Pac = $ref->{'result'}->{'devices'}->[0]->{'channels'}->[7]->{'value'}; # Leistung
    my $Riso = $ref->{'result'}->{'devices'}->[0]->{'channels'}->[8]->{'value'}; # Isolationswiderstand
    my $hon = $ref->{'result'}->{'devices'}->[0]->{'channels'}->[10]->{'value'}; # Einspeisezeit
    my $hTotal = $ref->{'result'}->{'devices'}->[0]->{'channels'}->[11]->{'value'}; # Betriebszeit
    my $ETotal = $ref->{'result'}->{'devices'}->[0]->{'channels'}->[12]->{'value'}; # Gesammtertrag
    my $NetzEin = $ref->{'result'}->{'devices'}->[0]->{'channels'}->[13]->{'value'}; # Netz-Ein
    # return $Ipv . "=" . $Upv . "=" . $Fac . "=" . $Iac . "=" . $Pac . "=" . $Riso . "=" . $hon . "=" . $hTotal . "=" . $ETotal . "=" . $NetzEin;
    #
    # ===== Abfrage GetPlantOverview =====
    $res = $url.$callobj1; 
    $ref = rpcs($res);
    my $GriPwr = $ref->{'result'}->{'overview'}->[0]->{'value'}; # Leistung
    my $GriEgyTdy = $ref->{'result'}->{'overview'}->[1]->{'value'}; # Tagesertrag
    my $GriEgyTot = $ref->{'result'}->{'overview'}->[2]->{'value'}; # Gesamtertrag
    my $OpStt = $ref->{'result'}->{'overview'}->[3]->{'value'}; # Zustand
    my $Msg = $ref->{'result'}->{'overview'}->[4]->{'value'}; # Meldung
    # return $GriPwr . "=" . $GriEgyTdy ."=". $GriEgyTot ."=". $OpStt ."=". $Msg ;
    # auf den KNX-Bus schreiben
    # my $Tag_CO2_vermeidung = $GriEgyTdy*700; # 700g/kWh
    # Werte auf den BUS schreiben
     knx_write($leistung_ga,$Pac,9);
     knx_write($leistung_pro_kw_ga,$Pac/4.05,9);
     knx_write($tagesertrag_ga,$GriEgyTdy,9);
     knx_write($gesammtertrag_ga,$ETotal,9);
     knx_write($zustand_ga,$OpStt,16);
     knx_write($DC_Strom_Eingang_ga,$Ipv,9);
     knx_write($DC_Spannung_Eingang_ga,$Upv,9);
     knx_write($Netzstrom_ga,$Iac,9);
    # knx_write($meldung_ga,$$Msg,16);
     # Wert in RRD schreiben
    update_rrd("pv_leistung","",$Pac); 
    update_rrd("pv_leistung_kW","",$Pac/1000);
    update_rrd("pv_tagesertrag","",$GriEgyTdy);
    update_rrd("pv_DC_Strom_Eingang","",$Ipv);
    update_rrd("pv_DC_Spannung_Eingang","",$Upv/100);
    # ===== Sub holt die Werte von der Webbox =====
    sub rpcs{
       my $res = shift;
       my $brs = LWP::UserAgent->new;
       my $req = HTTP::Request->new(GET => $res);
       my $resp = $brs->request($req); 
       #
       if($resp->is_success()) {
         # print "Erfolg !";
       }else {
         return "Keine Antwort !";
       }
       #
       my $content = $resp->content;
       my %js_hash_ref = %{decode_json $content};
       my $ref=\%js_hash_ref; 
       #
       return($ref);
    }
    return;

    Einen Kommentar schreiben:


  • makki
    antwortet
    Solange die Plugins "alphabetisch" aufeinander folgen und denselben _cycle haben dürften sehr gute Chancen bestehen, das sie auch nacheinander ausgeführt werden;

    Quirks fallen mir noch viele ein, wie immer viel sauberer wäre, auf eine GA schicken und das andere Plugin darauf subscriben, dann wird es unabhängig von Änderungen immer asap aufgerufen..

    Makki

    P.S.: Ich hab mit der Webbox auch noch ein bisschen was gemacht aber noch nicht commited weil ungetestet; ich habs jetzt trotzdem mal hochgeschoben

    Einen Kommentar schreiben:


  • NetFritz
    hat ein Thema erstellt [wiregate] SMA-Webbox mit HTTP-RPC abfragen.

    SMA-Webbox mit HTTP-RPC abfragen

    Hallo
    Ich bin dabei ein Plugin für den SMA-Wechselrichter (Webbox) zu erstellen.
    Die Webbox wird über HTTP-RPC abgefragt.
    Es wird GetPlantOverview und GetProcessData ausgelesen.

    Nun bin ich auf auf folgendes Problem gestoßen.
    Ich will die Augenblickliche Haushaltsleistung errechnen und in ein GA schreiben.

    Dazu brauche ich GA Wechselrichter Leistung - GA Zähler Leistung.
    Da beige GAs aber von unterschiedlichen Plugins beschrieben werden, kann es vorkommen das die errechnete Leistung nicht stimmt.

    Beide Plugins müssten immer unmittelbar hintereinander aufgerufen werden.
    Wie stelle ich das am besten an?
    Eine Lösung wäre das das 2. Plugin vom ersten aufgerufen wird.
    Gruß NetFritz
Lädt...
X