Ankündigung

Einklappen
Keine Ankündigung bisher.

Datenlogger Photovoltaik

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [WireGate-Plugin] Datenlogger Photovoltaik

    Hallo,

    hier ein Plugin, mit dem ich meine Photovoltaik-Anlage mit dem Wiregate auslese und die Werte speichere und auf den Bus bringe.

    Es handelt sich um eine Würth-Anlage mit Kaco-Wechselrichtern und einem Kaco-ProLog-Datenlogger. Der Datenlogger hängt über RS485 an den Wechselrichtern und das Plugin fragt regelmäßig Daten beim Logger über eine Webabfrage ab. Die Webabfrage liefert ein CSV, das dann entsprechend geparst wird und die einzelnen Werte anschließend in RRDs/auf den Bus geschrieben werden.

    Vielleicht kann das ja jemand gebrauchen...

    Schöne Grüße
    Christian


    Aktueller Code:http://openautomation.svn.sourceforg...pl?view=markup

    #2
    Wow, sehr schön!

    Kannst auch ein Bild von den erstellten Grafiken / Visu-Anzeige einstellen, damit man sieht, was am Ende rauskommt?

    Merci

    Stefan

    Kommentar


      #3
      Naja, viel passiert mit den Daten bisher nicht, den ganzen Kram schaufel ich zurzeit nur zu Testzwecken auf den Bus. Interessanter finde ich das Logging auf dem WG in RRDs, daraus habe ich mit drraw ein paar Graphen erstellt, siehe Anhang.

      Später will ich das vielleicht mal als Grundlage nutzen, um Verbraucher zu schalten (z.B. die wartenden Wasch- oder Spülmaschine bei genug Leistung zu starten usw.)
      Angehängte Dateien

      Kommentar


        #4
        Hallo,

        ich habe vor, die Daten von meinem Kostal Piko auf dem WG auzuzeichnen. Leider bin ich totaler Anfänger was Perl angeht und habe auch mein WireGate erst seit gestern. Nun versuche ich gerade aus dem Code von von chriss1980 eine passende Version für meinen WR zu bauen und komme nicht wirklich voran.

        Da es bei mir auf dem Bau doch noch arg ungemütlich ist, habe ich mir die Daten Daten vom WR lokal (in /tmp) aufs WG kopiert um das ganze zu Hause in Ruhe auszuprobieren. Leider gibt das Plugin immer nur "Abfrage fehlgeschlagen" zurück. Meine Perlkenntnisse sind aber derart gering, dass ich keine Ahnung habe ob das Einlesen der Datei nicht geklappt hat oder ob ich was falsch programmiert habe. Vielleicht kann mir ja jemand mal kurz auf die Sprünge helfen. Die html-Datei des WR habe ich angehängt(im Original ohne.txt), mein Plugin sieht zur folgendermaßen aus:
        Code:
        # Datenlogger PV-Anlage Kostal Piko 10.1
        # v0.1
        use LWP::Simple;
        # Konfig
        my $Wechselrichter_IP = "169.254.28.151"; # Standard IP Kostal Piko 10.1
        my $CurrentDataPath = "/index.fhtml"; # Uebersicht aktuelle Leistungsdaten
        my $LogDownloadPath  = "/LogDaten.dat"; # Log (TXT-Format)
        # my $content = get( "http://$Wechselrichter_IP$CurrentDataPath" );
        my $content = get( "/tmp$CurrentDataPath" ); # testweise offline vom WireGate
        return "PV-Datenabfrage fehlgeschlagen" unless defined $content;
        my @CurrentData = split( /\|/, $content );
        #update_rrd("PV_AC_Leistung","",$CurrentData[0],"GAUGE");
        return $CurrentData[0]
        Gibt's eigentlich einen Debug-Modus oder sowas für die Plugins, so dass man mal schauen kann was beim Einlesen der Webseite überhaupt ankommt?

        Gruß,
        Hauke
        Angehängte Dateien
        Endlich umgezogen. Fertig? Noch lange nicht... ;-)

        Kommentar


          #5
          Inzwischen bin ich etwas weiter, Auslesen der .fhtml-Datei klappt fast. Nur beim Reduzieren auf die eigentlichen Zahlenwerte bin ich gerade am verzweifeln.
          Der Code sieht inzwischen aus wie folgt:
          Code:
          use LWP::Simple;
          # my $Wechselrichter_IP = "169.254.28.151"; # Standard IP Kostal Piko 10.1
          my $Wechselrichter_IP = [URL="http://www.xxx.xx"]www.xxx.xx[/URL]; # Testweise Webserver
          my $CurrentDataPath  = "/index.fhtml"; # Uebersicht aktuelle Leistungsdaten
          my $LogDownloadPath  = "/LogDaten.dat"; # Log (TXT-Format)
          my @CurrentData;
          my $content;
          my @values;
          $content = get( "http://$Wechselrichter_IP$CurrentDataPath" );
          return "PV-Datenabfrage fehlgeschlagen" unless defined $content;
          my @CurrentData = split( /\<td/, $content );
          my $i = 0;
          foreach ( @CurrentData ) {
           $_ =~ /.*>(.*)</;
           @values[$i] = $1;
           @CurrentData[$i] =~ s/</&lt;/g;    # nur wegen HTML-Ausgabe
           @CurrentData[$i] =~ s/>/&gt;/g;    # nur wegen HTML-Ausgabe
           @values[$i] =~ s/</&lt;/g;    # nur wegen HTML-Ausgabe
           @values[$i] =~ s/>/&gt;/g;    # nur wegen HTML-Ausgabe
           $i++;
          }
          #update_rrd("PV_AC_Leistung","",$values[15],"GAUGE");
          return ("Data = <br>14@CurrentData[14]<br>15@CurrentData[15]<br>16@CurrentData[16]<br>17@CurrentData[17]<br>18@CurrentData[18]<br>19@CurrentData[19] <br><br>
          Values =<br>14@values[14]<br>15@values[15]<br>16@values[16]<br>17@values[17]<br>18@values[18]<br>19@values[19]")
          Das Plugin gibt folgendes aus:
          Code:
          Data = 
          14 width="100"> aktuell</td> 
          15 align="right" bgcolor="#FFFFFF" width="70"> 549</td> 
          16 width="140"> W</td> 
          17 width="100"> Gesamtenergie</td> 
          18 align="right" bgcolor="#FFFFFF" width="70"> 53</td> 
          19 width="50"> kWh</td> 
           
          Values =
          14
          15
          16 W
          17
          18
          19 kWh
          Wieso klappt das bei Zelle 16 und 19, bei den anderen jedoch nicht? Der einzige Unterschied den ich entdecken kann ist, dass bei 16 und 18 nach dem <td> zwei Leerzeichen folgen, bei den übrigen nur eines. Ich begreife jedoch nicht, warum der value-Array bei den übrigen Zellen leer bleibt, der reguäre Ausdruck sollte eigentlich alles zwischen den Tags greifen, oder?
          Endlich umgezogen. Fertig? Noch lange nicht... ;-)

          Kommentar


            #6
            So, die erste Hürde ist geschafft. Einlesen (der akt. Leistung) funkioniert soweit. Das Problem war der Zeilenvorschub...
            Jetzt kommt natürlich noch ein bisschen Fleißarbeit, die anderen Werte einlesen etc.

            Wenn's komplett fertig ist werde ich das ganze dann auch mal vorstellen.

            Gruß,
            Hauke
            Endlich umgezogen. Fertig? Noch lange nicht... ;-)

            Kommentar


              #7
              Hallo Hauke,

              schön, wenn es klappt. Eventuell kannst Du Dir das Leben mit einem passenden Perl-Modul zum parsen von Websites wesentlich einfacher machen und musst nicht manuell/fehlerträchtig per Regex die tatsächlichen Werte aus den HTML-Setien befreien.

              BTW, mein PV-System stellt die Daten auch per HTML und zusätzlich über das einfache CSV-Format (wie im Plugin genutzt) zur Verfügung.

              Grüße
              Christian

              Kommentar


                #8
                Hallo Christian,

                ich kann auch eine Log-Datei im txt-Format abrufen, allerdings stehen da nicht nur die aktuellen Werte drin, sondern es werden alle 15 min Werte ans Log angehängt. Ich müsste dann also nur die letzte Zeile auswerten bzw. prüfen ob ich die aktuell letzte Zeile schon mal gelesen habe. Werde ich vielleicht auch noch mal zusätzlich machen, aber für eine spätere Anzeige wollte ich gerne einen Refresh<15min haben, außerdem sind im Log keine Werte für aktuelle Gesamtleistung (nur DC-Leistung der einzelnen Strings und AC-Leistung auf den einzelnen Phasen). Zudem die Gesamtleistung nicht pro Tag sondern nur absolut Gesamt einmalig beim Systemstart und nicht fortlaufend mitgeloggt.
                Daher wollte ich vorrangig die html auswerten.

                Wie hast du eigentlich deine rrd's parametriert? Gleiche Auflösung wie Temperaturen, 5min? Oder z.B. für Tagesenergie was anderes?


                Hauke
                Endlich umgezogen. Fertig? Noch lange nicht... ;-)

                Kommentar


                  #9
                  Zitat von Hauke Beitrag anzeigen
                  Wie hast du eigentlich deine rrd's parametriert? Gleiche Auflösung wie Temperaturen, 5min? Oder z.B. für Tagesenergie was anderes?
                  Bisher noch mit Standardeinstellungen. Aber das muss ich "bei Gelegenheit" mal prüfen und ggf. anpassen, damit das langfristig (>10 Jahre) sinnvolle Daten enthält.

                  Kommentar


                    #10
                    Schön! Wenns halbwegs "ready" ist bitte auch ins SF-repository (Chris M. oder ich geben Rechte) oder mir sagen dann commite ich es;
                    steigert denke ich die Übersicht auf Dauer deutlich..

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

                    Kommentar


                      #11
                      HTML-Tabellen mit RegEx-s parsen ist ein kühnes Unterfangen. Es kann beim nächsten Update in die Hose gehen. Und solange nicht die Kodierung der Seite korrekt ausgewertet wird, bleibt es sowieso Dauergefrickel.

                      Es gibt für solche Aufgaben bereits (mindestens) einen Perl-HTML Tabellenparser. Der baut auf Standards, und ist für Erweiterungen sehr komfortabel. Man muss sich halt nur ein bisschen einlesen, was sich aber lohnt. Da ich die Anfangswiderstände, sich mit sowas zu befassen, nur zu gut kenne, war ich so nett ;-), und hab für den Thread hier mal ein kleines Beispiel zum Parsen einer Tabelle gebastelt. Die Kommentare sind englisch, weil ich das aus meinen persönlichen Repository zusammen gedadddelt habe.

                      Code:
                      #!/usr/bin/perl -w
                      use strict;
                      use HTML::TableExtract;
                      
                      my $HtmlString = "";
                      my $Tables = 0;
                      my ($RowNr, $ColNr);
                      
                      sub slurpFile()
                      {
                          # slurp file
                          my $lineTerm = $/;
                          undef $/;
                          $HtmlString = <STDIN>;
                          $/ = $lineTerm;
                      }
                      
                      
                      #--------------------------------------------------
                      
                      &slurpFile();
                      # print "HTMLSTRING: [ $HtmlString ]\n";  # only for debug
                      
                      # tell the parser which columns to read
                      $Tables = HTML::TableExtract->new( headers => [qw(eins zwei drei)], keep_html=>1 );
                      $Tables->parse($HtmlString);
                      
                      # Examine all matching tables (should be only one in this example as there should only be one table with such headers)
                      foreach my $table ($Tables->tables)
                      {
                          # the table rows each contain the definitions for a particular keyword
                          $RowNr = -1;
                          foreach my $rowCols ($table->rows)
                          {
                              ++$RowNr;
                      #       print "ROW: $RowNr:";
                              $ColNr = -1;
                              foreach my $col (@$rowCols)
                              {
                                  ++$ColNr;
                                  my $dbgcol = $col ? $col:"undef";
                      
                                  # $col contains the original cell-content, including markup
                                  ($col) and print "Column: [", $col, "]\n";
                                  (!$col) and print "empty col\n";
                              } # foreach my $col (@$rowCols) ...
                          } # foreach my $rowCols ($table->rows) ...
                      } # foreach my $table ($Tables->tables) ...
                      Aufgerufen wird das in diesem Fall so:

                      $ html_parser.pl < html_table.html

                      wobei 'html_parser.pl' der Name ist, unter dem obiges script abgespeichert wird, und html_table.html diese html-Datei zum ausprobieren ist:

                      Code:
                      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
                             "http://www.w3.org/TR/html4/strict.dtd">
                      <html>
                      <head>
                      <title>Kopf, K&ouml;rper und Fu&szlig; einer Tabelle definieren</title>
                      </head>
                      <body>
                      
                      <h1>Betroffene Menschen</h1>
                      
                      <table border="1" rules="groups">
                        <thead>
                          <tr>
                            <th>eins</th>
                            <th>zwei</th>
                            <th>drei</th>
                          </tr>
                        </thead>
                        <tfoot>
                          <tr>
                            <td><i>betroffen:<br>4 Mio. Menschen</i></td>
                            <td><i>betroffen:<br>2 Mio. Menschen</i></td>
                            <td><i>betroffen:<br>1 Mio. Menschen</i></td>
                          </tr>
                        </tfoot>
                        <tbody>
                          <tr>
                            <td>Berlin</td>
                            <td>Hamburg</td>
                            <td>M&uuml;nchen</td>
                          </tr><tr>
                            <td>Milj&ouml;h</td>
                            <td>Kiez</td>
                            <td>Bierdampf</td>
                          </tr><tr>
                            <td>Buletten</td>
                            <td>Frikadellen</td>
                            <td>Fleischpflanzerl</td>
                          </tr>
                        </tbody>
                      </table>
                      
                      </body>
                      </html>
                      Ich empfehle _dringend_, die selbst-Parserei unter persönlichen Erfolgen abzuspeichern, und dort zu lassen. ;-)
                      Kein Support per PN: Fragen bzw. Fehlermeldungen bitte im Forum posten.

                      Kommentar


                        #12
                        Zitat von emax Beitrag anzeigen
                        HTML-Tabellen mit RegEx-s parsen ist ein kühnes Unterfangen.
                        [..]
                        Ich empfehle _dringend_, die selbst-Parserei unter persönlichen Erfolgen abzuspeichern, und dort zu lassen. ;-)
                        Sehr schönes Statement und völlig richtig. Danke für die Beispiele mit dem Tabellen-Parser; den kannte ich noch nicht und werde meinem System so sicherlich noch ein paar weitere Daten entlocken können.

                        Grüße
                        Christian

                        Kommentar


                          #13
                          Noch ein Hinweis: HTML::TableExtract; muss, wenn es auf dem Wiregate nicht verfügbar ist, aber noch installiert werden. Sofern das nicht implizit mit Makkis famoser Update-Klick-und-funktioniert-Prozedur zu machen ist, muss es mit cpan nachgeholt werden. Das lässt sich aber ebenso automatisieren wie apt-get update.

                          @makki: Letzteres ginge dann wohl an Dich ...

                          Wäre aber ohnehin zu überlegen, weil auf Dauer ja durchaus auch noch andere cpan-Module betroffen sein könnten.
                          Kein Support per PN: Fragen bzw. Fehlermeldungen bitte im Forum posten.

                          Kommentar


                            #14
                            Zitat von chriss1980 Beitrag anzeigen
                            Danke für die Beispiele mit dem Tabellen-Parser; den kannte ich noch nicht und werde meinem System so sicherlich noch ein paar weitere Daten entlocken können.
                            Freut mich sehr, wenn das so rüber kommt. :-)
                            Kein Support per PN: Fragen bzw. Fehlermeldungen bitte im Forum posten.

                            Kommentar


                              #15
                              Kann ich nun auch nur zustimmen und würde noch hinzufügen: Wann immer man den Schrott vermeiden kann, HTML zu parsen (also es auch als strukturiertes CSV, XML, ..) verfügbar ist -> nehmen!

                              Auf WG wie Debian muss man aber dafür aber vorher
                              libhtml-tableextract-perl
                              nachinstallieren, gibts aber Standardmässig..

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

                              Kommentar

                              Lädt...
                              X