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

    [wiregate] 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
    KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
    WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
    PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

    #2
    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
    EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
    -> Bitte KEINE PNs!

    Kommentar


      #3
      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;
      KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
      WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
      PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

      Kommentar


        #4
        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..
        EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
        -> Bitte KEINE PNs!

        Kommentar


          #5
          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;
          KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
          WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
          PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

          Kommentar


            #6
            Erledischt

            Makki
            EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
            -> Bitte KEINE PNs!

            Kommentar


              #7
              Geht das auch mit dem Homemanger oder direkt mit dem WR TL5000-21?

              Kommentar


                #8
                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
                KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
                WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
                PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

                Kommentar


                  #9
                  Gibt es eine andere Möglichkeit ?

                  Kommentar


                    #10
                    Hallo
                    Was für eine Schnittstelle hat dein WR ?
                    Gruß NetFritz
                    KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
                    WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
                    PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

                    Kommentar


                      #11
                      Bluetooth und Web


                      Gesendet von meinem iPad mit Tapatalk

                      Kommentar


                        #12
                        Hallo
                        Fürs Web Interface kenne ich keine Lösung.
                        Für Bluetooth gibt es was.
                        Bitte mal hier fragen.
                        Portal? Photovoltaikforum
                        Gruß NetFritz
                        KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
                        WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
                        PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

                        Kommentar

                        Lädt...
                        X