Wechselrichter Daten (HTML) parsen

Hallo,

das parsen der HTML Seite meines Wechselrichters per WWW Reader klappt nicht, da nur Variablennamen anstatt Werte im Quelltext stehen.

Im Forum habe ich folgende Umgehungslösung gefunden:

$lines = file(„http://192.168.0.100“);
print_r($lines);
Aber als Ausgabe gibt’s jedoch nur binären Kauderwelsch:

Array
(
[0] => ‹ïáìM
usw.

Kommt man irgendwie an die Werte anstatt der Variablennamen ran?
Oder sieht jemand noch eine andere Lösungsmöglichkeit?

Danke schonmal!:wink:

Ohne das Gerät zu haben oder zu kennen wird das jetzt schwer…
poste doch mal, was dein Browser als Quelltext anzeigt, wenn du die Seite dort aufrufst, vielleicht hilft das weiter??

<code>
<!DOCTYPE HTML PUBLIC „-//W3C//DTD XHTML 1.0 Strict//EN“ „http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd“>
<html xml:lang=„en“ xmlns=„http://www.w3.org/1999/xhtml“ lang=„en“>
<head>
<title>Schüco International</title>
<meta http-equiv=„Content-Type“ content=„text/html; charset=UTF-8“/>
<script src=„jquery.js“ type=„text/javascript“></script>
<script src=„jqueryui.js“ type=„text/javascript“></script>
<script src=„canvas.js“ type=„text/javascript“></script>

&lt;script src="flot.js" type="text/javascript"&gt;&lt;/script&gt;    
&lt;script src="kaco.js"  type="text/javascript"&gt;&lt;/script&gt;
&lt;link rel="stylesheet" href="style.css" type="text/css"&gt;&lt;/link&gt;
&lt;link rel="stylesheet" href="jqueryui.css" type="text/css"&gt;&lt;/link&gt;

</head>

<body onload=„kaco.start();“>
<div id=„container“>
<div id=„headerBox“>
<div id=„logoBox“>

      &lt;img src="logo.gif" alt="Schüco International Logo" id="logo"/&gt;
    &lt;/div&gt;
    &lt;div id="header"&gt;
      &lt;table id="hardFacts"&gt;
        &lt;tr&gt;
          &lt;th&gt;Gerätename:&lt;/th&gt;
          &lt;th&gt;RS-485 Adresse:&lt;/th&gt;
          &lt;th&gt; &lt;/th&gt;

        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td id="name"&gt;...&lt;/td&gt;
          &lt;td id="rsid"&gt;...&lt;/td&gt;
          &lt;td&gt; &lt;/td&gt;              
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;th&gt;Typ: &lt;/th&gt;

          &lt;th&gt;Netzwerkadresse: &lt;/th&gt;
          &lt;th&gt; &lt;/th&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td id="type"&gt;...&lt;/td&gt;
          &lt;td id="network"&gt;...&lt;/td&gt;
          &lt;td&gt; &lt;/td&gt;

        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;th&gt;Seriennummer: &lt;/th&gt;
          &lt;th&gt;MAC-Adresse: &lt;/th&gt;
          &lt;th&gt;Datenstand:&lt;/th&gt;
        &lt;/tr&gt;
        &lt;tr&gt;

          &lt;td id="serial"&gt;...&lt;/td&gt;
          &lt;td id="mac"&gt;...&lt;/td&gt;
          &lt;td id="today"&gt;...&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/table&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;div id="naviBox"&gt;
    &lt;ul id="navi"&gt;
      &lt;li&gt;
        &lt;a href="#" class="naviItem itemDay" onclick="kaco.switchToDayView();" title="Ansicht pro Tag"&gt;Tagesansicht&lt;/a&gt;
      &lt;/li&gt;
      &lt;li class="naviSpacer"&gt;|&lt;/li&gt;
      &lt;li&gt;
        &lt;a href="#" class="naviItem itemMonth" onclick="kaco.switchToMonthView();" title="Ansicht pro Monat"&gt;Monatsansicht&lt;/a&gt;

      &lt;/li&gt;
      &lt;li class="naviSpacer"&gt;|&lt;/li&gt;
      &lt;li&gt;
        &lt;a href="#" class="naviItem itemYear" onclick="kaco.switchToYearView();" title="Ansicht pro Jahr"&gt;Jahresansicht&lt;/a&gt;
      &lt;/li&gt;
      &lt;li class="naviSpacer"&gt;|&lt;/li&gt;
      &lt;li&gt;

        &lt;a href="#" class="naviItem itemEternal" onclick="kaco.switchToEternalView();" title="Gesamtansicht"&gt;Gesamtansicht&lt;/a&gt;
      &lt;/li&gt;
    &lt;/ul&gt;        
  &lt;/div&gt;
  &lt;div id="content" class="clearfix"&gt;               
    &lt;div id="contentLeft"&gt;        
      &lt;ul id="chartBarNavi"&gt;
        &lt;li class="chartBarButtons fback"&gt;
          &lt;a class="fastfwd" href="#" onclick="kaco.goFastBack();" title="Zum ersten Eintrag"&gt;
            &lt;img src="btn_fpre.gif" alt="Zum ersten Eintrag"/&gt;

          &lt;/a&gt;
          &lt;a href="#" onclick="kaco.goBack();" title="Ein Eintrag zurück"&gt;
            &lt;img src="btn_prev.gif" alt="zurück"/&gt;
          &lt;/a&gt;
        &lt;/li&gt;
        &lt;li class="currentScreen" id="currentScreenTitle"&gt;...&lt;/li&gt;
        &lt;li class="chartBarButtons next"&gt;
          &lt;a href="#" onclick="kaco.goForward();" title="Ein Eintrag weiter"&gt;

            &lt;img src="btn_next.gif" alt="weiter"/&gt;
          &lt;/a&gt;
          &lt;a class="fastfwd" href="#" onclick="kaco.goFastForward();" title="Zum letzten Eintrag"&gt;
            &lt;img src="btn_fne.gif" alt="weiter"/&gt;
          &lt;/a&gt;
          &lt;input type="hidden" id="calendar" /&gt;                
        &lt;/li&gt;
      &lt;/ul&gt;     
      
      &lt;div id="chart" style="padding: 80px 0 0 40px;"&gt;
        &lt;div style="position: relative; width: 530px; height: 360px; background:#f9f9f9 url(bgchart.jpg) no-repeat center center;" id="chartContainer"&gt;

        &lt;/div&gt;
        &lt;div id="axisLabel" style="text-align:center"&gt;&lt;/div&gt;
        
        &lt;h3 id="outOfBoundInfo" style="color:red; padding:5px; text-align:center"&gt;&lt;!-- 
           Für den ausgewählten Zeitraum liegen keine Daten vor.&lt;br/&gt; Der nächstmögliche Datensatz wird angezeigt.
            --&gt;
        &lt;/h3&gt;
      &lt;/div&gt;
               
    &lt;/div&gt;
    &lt;div id="contentRight"&gt;
      
      &lt;div id="performanceDataBox" class="greyBox"&gt;
        &lt;h3&gt;Status&lt;/h3&gt;

            &lt;div id="nowValueState"&gt;...&lt;/div&gt;
        &lt;hr/&gt;
        &lt;h3&gt;Momentanwerte&lt;/h3&gt;
        &lt;table class="ertragswerte"&gt;
          &lt;tr&gt;
            &lt;th&gt;Generatorleistung&lt;/th&gt;
            &lt;td id="nowValueGen"&gt;&lt;/td&gt;

          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;th&gt;Einspeiseleistung&lt;/th&gt;
            &lt;td id="nowValueIn"&gt;&lt;/td&gt;
          &lt;/tr&gt;
        &lt;/table&gt;
        &lt;hr/&gt;
        &lt;h3&gt;Ertragswerte&lt;/h3&gt;

        &lt;table class="ertragswerte"&gt;
          &lt;tr&gt;
            &lt;th id="dayLabel"&gt;...&lt;/th&gt;
            &lt;td id="dayValue"&gt;...&lt;/td&gt;
          &lt;/tr&gt;
        &lt;/table&gt;            
      &lt;/div&gt;
      &lt;div id="graphselectorBox" class="greyBox"&gt;

      &lt;form id="graphselector"&gt;
        &lt;h3&gt;Anzeige auswählen:&lt;/h3&gt;            
        &lt;table&gt;
           &lt;tr&gt;
              &lt;td&gt; &lt;/td&gt;
              &lt;td style="text-align:center"&gt;1&lt;/td&gt;
              &lt;td style="text-align:center"&gt;2&lt;/td&gt;

              &lt;td style="text-align:center"&gt;3&lt;/td&gt;
           &lt;/tr&gt;
           &lt;tr&gt;
              &lt;td style="width:130px;"&gt;&lt;label class="selector_label"&gt;Generatorspannung:&lt;/label&gt;&lt;/td&gt;
              &lt;td&gt;&lt;input type="checkbox" value="pvsp1" onclick="kaco.updateVisibleDayGraphs();" /&gt;&lt;/td&gt;
              &lt;td&gt;&lt;input type="checkbox" value="pvsp2" onclick="kaco.updateVisibleDayGraphs();" /&gt;&lt;/td&gt;
              &lt;td style="float:left;"&gt;&lt;input type="checkbox" class="d3" value="pvsp3" onclick="kaco.updateVisibleDayGraphs();" /&gt;&lt;/td&gt;          
           &lt;/tr&gt;

           &lt;tr&gt;
             &lt;td&gt;&lt;label class="selector_label"&gt;Generatorleistung:&lt;/label&gt;&lt;/td&gt;
             &lt;td&gt;&lt;input type="checkbox" value="pvl1" onclick="kaco.updateVisibleDayGraphs();" /&gt;&lt;/td&gt;
             &lt;td&gt;&lt;input type="checkbox" value="pvl2" onclick="kaco.updateVisibleDayGraphs();" /&gt;&lt;/td&gt;
             &lt;td style="float:left;"&gt;&lt;input type="checkbox" class="d3" value="pvl3" onclick="kaco.updateVisibleDayGraphs();" /&gt;&lt;/td&gt;                 
           &lt;/tr&gt;
           &lt;tr&gt;
             &lt;td&gt;&lt;label class="selector_label"&gt;Netzspannung:&lt;/label&gt;&lt;/td&gt;

             &lt;td&gt;&lt;input type="checkbox" value="nsp1" onclick="kaco.updateVisibleDayGraphs();" /&gt;&lt;/td&gt;
             &lt;td&gt;&lt;input type="checkbox" value="nsp2" onclick="kaco.updateVisibleDayGraphs();" /&gt;&lt;/td&gt;
             &lt;td style="float:left;"&gt;&lt;input type="checkbox" class="a3" value="nsp3" onclick="kaco.updateVisibleDayGraphs();" /&gt;&lt;/td&gt;
           &lt;/tr&gt;
           &lt;tr&gt;
              &lt;td colspan="4"&gt; &lt;/td&gt;
           &lt;/tr&gt;
           &lt;tr&gt;
              &lt;td&gt;&lt;label class="selector_label"&gt;Netzleistung:&lt;/label&gt;&lt;/td&gt;

              &lt;td&gt;&lt;input type="checkbox" value="nl" checked="checked" onclick="kaco.updateVisibleDayGraphs();" /&gt;&lt;/td&gt;
              &lt;td&gt; &lt;/td&gt;
              &lt;td&gt; &lt;/td&gt;
           &lt;/tr&gt;
           &lt;tr&gt;
              &lt;td&gt;&lt;label class="selector_label"&gt;Gerätetemperatur:&lt;/label&gt;&lt;/td&gt;
              &lt;td&gt;&lt;input type="checkbox" value="temp" onclick="kaco.updateVisibleDayGraphs();" /&gt;&lt;/td&gt;
              &lt;td&gt; &lt;/td&gt;

              &lt;td&gt; &lt;/td&gt;
           &lt;/tr&gt;
        &lt;/table&gt;            
      &lt;/form&gt;
      &lt;a style="float:right;" href="#" id="downloadLink"&gt;&lt;img src="/btn_exp.gif" /&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;    

</body>

</html>
</code>

und jetzt müsste ich noch wissen, welche Info du eigentlich daraus ziehen und verwerten willst?? Den Datenstand??

Das ist einer der relevanten Werte:

<th>Einspeiseleistung</th>
<td id=„nowValueIn“></td>

Aber da muss doch in deinem Quelltext jetzt auch irgendein Wert stehen, oder? Sonst kann der Browser da ja auch nichts anzeigen. Zaubern kann dein Browser ja auch nicht.

Genau das ist mein Problem:

das parsen der HTML Seite meines Wechselrichters per WWW Reader klappt nicht, da nur Variablennamen anstatt Werte im Quelltext stehen.

:eek:

Die Webseite greift irgendwie live auf die Werte im Wechselrichter zu und zeigt sie an, ohne dass sie im Quelltext stehen. Im Quelltext stehen dort, wo eigentlich Werte stehen sollten, nur Variablennamen wie nowValueIn. Ich hab das auch noch nicht erlebt. Aber irgendwie kann man bestimmt an die Daten ran kommen, nur wie???

Anbei ein Beweisfoto:o

in der kaco.js wird anscheinend zur Laufzeit noch was am HTML-Code geändert, das wird auch das Problem des Parsers und auch des zeilenweise Lesens der Seite sein, beide führen den HTML-Code nicht aus. ABER, die kaco.js muss dir ja auch zugänglich sein, da kannst du vielleicht ablesen wie er die Werte ermittelt !?!?

Ich empfehle dir mal, ladt dir mal Chrome und schau dir den Live-Code an mit den dort enthaltenen Entwicklerwerkzeugen

kaco.js muss dir ja auch zugänglich sein
Super Tip!:wink:

http://192.168.0.100/kaco.js

gibt aus:

var l = [ 'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember' ];

if (!String.pad) {
   String.prototype.pad = function(l, s, t) {
      return s || (s = " "), (l -= this.length) > 0 ? (s = new Array(Math.ceil(l / s.length) + 1).join(s)).substr(0, t = !t ? l
            : t == 1 ? 0 : Math.ceil(l / 2))
            + this + s.substr(0, l - t) : this;
   };
}
if (!String.trim) {
   String.prototype.trim = function() {
      return this.replace(/^\s*/, "").replace(/\s*$/, "");
   }
}

function num_format(num) {
   var n = num.toString();
   var nums = n.split('.');
   var newNum = "";

   if (nums.length > 1) {
      var dec = nums[1].substring(0, 2);
      newNum = nums[0] + "," + dec;
   } else {
      newNum = num;
   }

   return newNum;
}

var kaco = {

   usr : '',
   csv : '',

   initCount : 0,

   mode : '',
   current : null,
   view : null,
   tstamp : null,

   dcCount : 2,
   acCount : 3,

   override : false,

   dataIndex : null,
   data : {},
   state : {},

   noDataMode : false,

   start : function() {
      $.ajax({
         url : this.csv + '/metadata.csv',
         context : this,
         success : kaco.parseMeta
      });
      $.ajax({
         url : this.csv + '/pstatus.txt',
         context : this,
         success : kaco.parseStatus
      });
      /*
      $.ajax({
         url : this.csv + '/initlog.txt',
         context : this,
         success : kaco.parseInitlog
      });
      */

      this.tstamp = new Date();

      $("#chartContainer").bind("plotclick", function(event, pos, item) {
         if (item) {
            var val = item.datapoint[0];
            switch (kaco.mode) {
               case 'ETERNAL': {
                  kaco.tstamp.setYear(val);
                  kaco.switchToYearView();
                  break;
               }
               case 'YEAR': {
                  kaco.tstamp.setMonth(val - 1);
                  kaco.switchToMonthView();
                  break;
               }
               case 'MONTH': {
                  kaco.tstamp.setDate(val);
                  kaco.switchToDayView();
                  break;
               }
            }
         }
      });

      $("#chartContainer").bind("plothover", function(event, pos, item) {
         if (item) {
            kaco.showHover(item);
         } else {
            $("#tooltip").remove();
            kaco.dataIndex = null;
         }
      });

      // start updater threat
      setInterval(function() {
         kaco.triggerRealtimeUpdate();
      }, 30000);

      // init graph
      this.switchToDayView();
   },

   showHover : function(item) {
      var x = item.pageX + 10;
      var y = item.pageY + 10;
      var contents = item.datapoint[1].toFixed(2);
      if (this.dataIndex != item.dataIndex) {
         this.dataIndex = item.dataIndex;
         $("#tooltip").remove();
         $('<div id="tooltip">' + contents + '</div>').css({
            position : 'absolute',
            display : 'none',
            top : y,
            left : x,
            border : '1px solid #fdd',
            padding : '2px',
            'background-color' : '#ccc',
            opacity : 0.9
         }).appendTo("body").fadeIn(200);
      }
   },

   parseInitlog: function(data) {
      kaco.initCount++;
      /*
      var fields = data.split('.usr');
      fields[0].trim()
      */
   },
   
   parseStatus : function(data) {
      kaco.initCount++;
      var lines = data.split('\r');
      for ( var x = 0; x < lines.length; x++) {
         var entry = lines[x].split('  ');
         this.state[entry[0].trim()] = entry[1].trim();
      }
      this.triggerRealtimeUpdate();
   },

   parseMeta : function(data) {
      kaco.initCount++;
      this.triggerRealtimeUpdate();

      /*
       * 0.) Seriennummer 
       * 1.) Gerätetyp 
       * 2.) MAC-Adresse 
       * 3.) IP-Adresse 
       * 4.) Wechselrichter RS485 Adresse 
       * 5.) Anzahl AC-Phasen 
       * 6.) Anzahl DC-Eingänge 
       * 7.) AC Nennleistung [W] 
       * 8.) DC Nennleistung [W]
       */

      var fields = data.split(';');
      $('#serial').html(fields[0]);
      $('#name').html(fields[1]);
      $('#mac').html(fields[2]);
      $('#network').html(fields[3]);
      $('#rsid').html(fields[4]);

      this.acCount = parseInt(fields[5]);
      this.dcCount = parseInt(fields[6]);
      this.acPower = parseInt(fields[7]);
      this.dcPower = parseInt(fields[8]);

      var type = this.acPower / 1000 + ' kW Nennleistung, ';

      if (this.acCount == 3) {
         type += 'dreiphasig';
         $("input.a3").css( {
            display : 'block'
         });
      } else {
         type += 'einphasig';
      }
      $('#type').html(type);

      if (this.dcCount == 3) {
         $("input.d3").css( {
            display : 'block'
         });
      }

      $("#calendar").datepicker( {
         buttonImage : '/btn_cal.gif',
         buttonImageOnly : true,
         gotoCurrent : true,
         showOn : 'button',
         changeYear : true,
         maxDate : new Date(),
         minDate : '-1M',
         beforeShow : function(input, inst) {
            $("#calendar").datepicker("setDate", kaco.tstamp);
         },
         onSelect : function(dateText, inst) {
            kaco.tstamp = $("#calendar").datepicker("getUTCDate");
            kaco.switchToDayView();
         }
      });
   },

   triggerRealtimeUpdate : function() {
      // dump('InitCount: '+this.initCount+'
');
      if (this.initCount != 2)
         return;
      $.ajax( {
         url : this.csv + '/realtime.csv',
         context : this,
         success : kaco.refreshStatus
      });
   },

   refreshStatus : function(data) {
      // dump('got status data:
'+data+'
');

      var fields = data.split(';');

      $('#today').html((new Date(fields[0] * 1000)).toUTCString());

      var gen = [];
      var offset = this.dcCount + 1;
      // dump('Offset:'+offset+'
Count:'+this.dcCount+'
');
      for ( var t = 1; t <= this.dcCount; t++) {
         gen.push(num_format((fields[t] / (65535.0 / 1600.0)) * ((fields[t + this.dcCount + this.acCount]) / (65535.0 / 200.0))
               / 1000.0));
      }
      $('#nowValueGen').html(gen.join(' kW <br/>') + ' kW');
      $('#nowValueIn').html(num_format(fields[fields.length - 3] / (65535.0 / 100000.0) / 1000.0) + ' kW');

      var st = fields[fields.length - 1].trim();
      // dump('St:'+st+'
');
      if (this.state[st]) {
         $('#nowValueState').html(this.state[st]);
      } else {
         $('#nowValueState').html('Unbekannt');
      }

   },

   goBack : function() {
      this.loadData(this.view.getPrevious(this.tstamp));
      this.updateCurrentLabel();
   },

   goForward : function() {
      this.loadData(this.view.getNext(this.tstamp));
      this.updateCurrentLabel();
   },

   goFastForward : function() {
      this.loadData(this.view.getNextFast(this.tstamp));
      this.updateCurrentLabel();
   },

   goFastBack : function() {
      this.loadData(this.view.getPreviousFast(this.tstamp));
      this.updateCurrentLabel();
   },

   updateCurrentLabel : function() {
      var label;
      switch (this.mode) {
         case 'DAY': {
            label = 'Heute';
            if ((new Date).getUTCMonth() != this.tstamp.getUTCMonth() || (new Date).getUTCFullYear() != this.tstamp.getUTCFullYear() || (new Date).getUTCDate() != this.tstamp.getUTCDate()) {
               label = this.tstamp.getUTCDate() + '. ' + l[this.tstamp.getUTCMonth()] + ' ' + this.tstamp.getUTCFullYear();
            }
            break;
         }

         case 'MONTH': {
            label = 'Aktueller Monat';
            if ((new Date).getUTCMonth() != this.tstamp.getUTCMonth() || (new Date).getUTCFullYear() != this.tstamp.getUTCFullYear()) {
               label = l[this.tstamp.getUTCMonth()] + ' ' + this.tstamp.getUTCFullYear();
            }
            break;
         }

         case 'YEAR': {
            label = 'Aktuelles Jahr';
            if ((new Date).getUTCFullYear() != this.tstamp.getUTCFullYear()) {
               label = this.tstamp.getUTCFullYear();
            }
            break;
         }
      }
      $('#dayLabel').html(label);

   },

   switchToDayView : function() {
      this.mode = 'DAY';
      this.view = dayView;
      $('#axisLabel').html('Uhrzeit');
      $('#chartBarNavi').show();
      $('#graphselector').show();
      $('#calenderLink').show();
      $('.fastfwd').show();
      this.loadData(this.view.getCurrent(this.tstamp));
      this.updateCurrentLabel();
   },

   switchToMonthView : function() {
      this.mode = 'MONTH';
      this.view = monthView;
      $('#axisLabel').html('Tag');
      $('#chartBarNavi').show();
      $('.fastfwd').show();
      $('#graphselector').hide();
      $('#calenderLink').hide();
      this.loadData(this.view.getCurrent(this.tstamp));
      this.updateCurrentLabel();
   },

   switchToYearView : function() {
      this.mode = 'YEAR';
      this.view = yearView;
      $('#axisLabel').html('Monat');
      $('#chartBarNavi').show();
      $('#calenderLink').hide();
      $('#graphselector').hide();
      $('.fastfwd').hide();
      this.loadData(this.view.getCurrent(this.tstamp));
      this.updateCurrentLabel();
   },

   switchToEternalView : function() {
      this.mode = 'ETERNAL';
      this.view = eternalView;
      $('#axisLabel').html('Jahr');
      $('#dayLabel').html('Gesamtübersicht');
      $('#graphselector').hide();
      $('#chartBarNavi').hide();
      this.loadData('eternal');
   },

   updateVisibleDayGraphs : function() {
      this.drawGraph(this.data);
   },

   loadData : function(src) {
      try {
         var path = this.csv + '/' + src + '.csv';
         // dump('Requesting: '+path+'
');
         $('#currentScreenTitle').html(this.view.getTitle(this.tstamp));
         $.ajax( {
            url : path,
            context : this,
            success : kaco.parseData,
            error : kaco.noData
         });         
         $('#downloadLink').attr('href', this.usr + '/' + src + '.USR');
         return true;
      } catch (e) {
         this.noData();
         return false;
      }
   },

   noData : function() {
      kaco.noDataMode = true;
      $('#downloadLink').attr('href', 'javascript:alert("Keine Daten verfügbar");');
      $('#graphselector').hide();
      $('#axisLabel').hide();
      $('#chartContainer').html('<p class="nodata">Keine Daten verfügbar</p>');
      $('#dayValue').html('');
      $('#dayLabel').html('');
   },

   parseData : function(res) {
      var lines = res.split('\r');
      var values = [];

      for ( var t = 1; t < lines.length; t++) {
         values[t - 1] = lines[t].split(';');
      }

      switch (this.mode) {
         case 'ETERNAL':
         case 'MONTH':
         case 'YEAR': {
            this.data = this.parseGrouped(values);
            break;
         }
         case 'DAY': {
            this.data = this.parseDay(values);
            $('#graphselector').show();
            break;
         }
      }

      this.drawGraph(this.data);

      if (this.noDataMode) {
         this.noDataMode = false;
         var map = {
            'ETERNAL' : this.switchToEternalView,
            'MONTH' : this.switchToMonthView,
            'YEAR' : this.switchToYearView,
            'DAY' : this.switchToDayView
         }
         map[this.mode].call(this);
      }

   },

   parseGrouped : function(values) {
      var curValue = 0;
      var flag = false;
      var tmp = [];

      for ( var x = 0; x < values.length - 1; x++) {
         var data = values[x];

         var d = new Date();
         d.setTime(data[0] * 1000);
         curValue += parseInt(data[1]);
         var tick;
         switch (this.mode) {
            case 'YEAR': {
               tick = d.getUTCMonth() + 1;
               break;
            }
            case 'MONTH': {
               tick = d.getUTCDate();
               break;
            }
            case 'ETERNAL': {
               tick = d.getUTCFullYear();
               break;
            }
            default: {
               tick = d;
            }
         }
         // dump(this.mode + ': ' + tick + ' -> '+ Math.round(data[1] / 1000,2)
         // + '
');
         tmp.push( [ tick, Math.round(data[1] / 1000, 2) ]);
         if (flag)
            break;
      }
      $('#dayValue').html(Math.round(curValue / 1000) + ' kWh');
      return tmp;
   },

   parseDay : function(values) {

      var tmp = {
         'pvsp1' : {
            label : 'Generatorspannung 1 U [V]',
            data : [],
            yaxis : 1,
            color : 'rgb(255,0,0)'
         },
         'pvsp2' : {
            label : 'Generatorspannung 2 U [V]',
            data : [],
            yaxis : 1,
            color : 'rgb(255,128,128)'
         },
         'pvsp3' : {
            label : 'Generatorspannung 3 U [V]',
            data : [],
            yaxis : 1,
            color : 'rgb(255,192,192)'
         },
         'nsp1' : {
            label : 'Netzspannung 1 U [V]',
            data : [],
            yaxis : 2,
            color : 'rgb(0,0,255)'
         },
         'nsp2' : {
            label : 'Netzspannung 2 U [V]',
            data : [],
            yaxis : 2,
            color : 'rgb(128,128,255)'
         },
         'nsp3' : {
            label : 'Netzspannung 3 U [V]',
            data : [],
            yaxis : 2,
            color : 'rgb(192,192,255)'
         },
         'pvl1' : {
            label : 'Generatorleistung 1 P [kW]',
            data : [],
            yaxis : 3,
            color : 'rgb(255,128,0)'
         },
         'pvl2' : {
            label : 'Generatorleistung 2 P [kW]',
            data : [],
            yaxis : 3,
            color : 'rgb(255,192,64)'
         },
         'pvl3' : {
            label : 'Generatorleistung 3 P [kW]',
            data : [],
            yaxis : 3,
            color : 'rgb(255,255,0)'
         },
         'temp' : {
            label : 'Gerätetemperatur T [°C]',
            data : [],
            yaxis : 4,
            color : 'rgb(0,0,0)'
         },
         'nl' : {
            label : 'Netzleistung P [kW]',
            data : [],
            yaxis : 5,
            color : 'rgb(0,255,255)'
         }
      };

      /*
       * 3P:
       * 
       * 0.) Zeitstempel [s] (in Sekunden vom 01.01.1970) 
       * 1.) DC-Spannung [V] (2 bzw. 3 Werte) 
       * 2.)
       * 3.) 
       * 4.) AC-Spannung [V] (3 Werte) 
       * 5.) 
       * 6.)
       * 7.) DC-Strom [A] (2 bzw. 3 Werte) 
       * 8.) 
       * 9.) 
       * 10.) AC-Strom [A] (3 Werte) 
       * 11.)
       * 12.) 
       * 13.) AC-Leistung [W] 
       * 14.) Systemtemperatur [°C] 
       * 15.) Wechselrichterstatus
       * 
       * 2P:
       * 
       * 0.) Zeitstempel [s] (in Sekunden vom 01.01.1970) 
       * 1.) DC-Spannung [V] (2 bzw. 3 Werte) 
       * 2.) 
       * 3.) AC-Spannung [V] (3 Werte) 
       * 4.) 
       * 5.) 
       * 6.) DC-Strom [A] (2 bzw. 3 Werte) 
       * 7.) 
       * 8.) AC-Strom [A] (3 Werte) 
       * 9.) 
       * 10.) 
       * 11.) AC-Leistung [W] 
       * 12.) Systemtemperatur [°C] 
       * 13.) Wechselrichterstatus
       * 
       */

      if ((this.dcCount == 2) && (this.acCount == 3)) {
         for ( var x = 0; x < values.length; x++) {
            var data = values[x];

            if (data[0] == 0)
               continue;

            var tstamp = new Date();
            tstamp.setTime(data[0] * 1000);

            // DC Spannung
            tmp.pvsp1.data.push( [ tstamp, data[1] / (65535.0 / 1600.0) ]);
            tmp.pvsp2.data.push( [ tstamp, data[2] / (65535.0 / 1600.0) ]);

            // AC Spannung
            tmp.nsp1.data.push( [ tstamp, data[3] / (65535.0 / 1600.0) ]);
            tmp.nsp2.data.push( [ tstamp, data[4] / (65535.0 / 1600.0) ]);
            tmp.nsp3.data.push( [ tstamp, data[5] / (65535.0 / 1600.0) ]);

            // DC Leistung
            tmp.pvl1.data.push( [ tstamp, (data[6] / (65535.0 / 200.0) * (data[1] / (65535.0 / 1600.0))) / 1000 ]);
            tmp.pvl2.data.push( [ tstamp, (data[7] / (65535.0 / 200.0) * (data[2] / (65535.0 / 1600.0))) / 1000 ]);

            // AC Leistung
            tmp.nl.data.push( [ tstamp, data[11] / (65535.0 / 100000.0) / 1000 ]);
            tmp.temp.data.push( [ tstamp, data[12] / 100.0 ]);
         }
      } else if ((this.dcCount == 3) && (this.acCount == 3)) {
         for ( var x = 0; x < values.length; x++) {
            var data = values[x];

            if (data[0] == 0)
               continue;

            var tstamp = new Date();
            tstamp.setTime(data[0] * 1000);

            // DC Spannung
            tmp.pvsp1.data.push( [ tstamp, data[1] / (65535.0 / 1600.0) ]);
            tmp.pvsp2.data.push( [ tstamp, data[2] / (65535.0 / 1600.0) ]);
            tmp.pvsp3.data.push( [ tstamp, data[3] / (65535.0 / 1600.0) ]);

            // AC Spannung
            tmp.nsp1.data.push( [ tstamp, data[4] / (65535.0 / 1600.0) ]);
            tmp.nsp2.data.push( [ tstamp, data[5] / (65535.0 / 1600.0) ]);
            tmp.nsp3.data.push( [ tstamp, data[6] / (65535.0 / 1600.0) ]);

            // DC Leistung
            tmp.pvl1.data.push( [ tstamp, (data[7] / (65535.0 / 200.0) * (data[1] / (65535.0 / 1600.0))) / 1000 ]);
            tmp.pvl2.data.push( [ tstamp, (data[8] / (65535.0 / 200.0) * (data[2] / (65535.0 / 1600.0))) / 1000 ]);
            tmp.pvl3.data.push( [ tstamp, (data[9] / (65535.0 / 200.0) * (data[3] / (65535.0 / 1600.0))) / 1000 ]);

            // AC Leistung
            tmp.nl.data.push( [ tstamp, data[13] / (65535.0 / 100000.0) / 1000 ]);
            tmp.temp.data.push( [ tstamp, data[14] / 100.0 ]);
         }
      }

      var curValue = 0;
      var diff = 5;
      for ( var xx = 0; xx < tmp.nl.data.length; xx++) {
         // dump('NL-Value '+xx+': '+tmp.nl[xx]+'
');
         if (xx>0) {
            diff = parseInt((tmp.nl.data[xx][0].getTime() - tmp.nl.data[xx-1][0].getTime())/60000);
            //dump('DIFF:'+diff+'
');
         }
         curValue += tmp.nl.data[xx][1] * diff;
         // dump('CUR: '+curValue+'
');
      }
      //dump('setting day value
');

      $('#dayValue').html(Math.round(curValue / 60.0) + ' kWh');

      return tmp;
   },

   drawGraph : function(data) {
      if (this.override) {
         $("outOfBoundInfo").show();
      } else {
         $("outOfBoundInfo").hide();
      }
      this.override = false;
      var config = this.view.getChartConfig(data);
      $.plot($("#chartContainer"), config.chart, config.options);
      $('#axisLabel').show();
   }
}

var eternalView = {

   range : {
      min : (new Date()).getTime(),
      max : (new Date()).getTime()
   },

   getTitle : function(tstamp) {
      return 'Gesamtansicht ';
   },

   getChartConfig : function(data) {
      var ticks = [];
      var min = 0;
      var max = 15000;

      return {
         chart : [ {
            label : 'E [kWh]',
            data : data,
            bars : {
               show : true,
               barWidth : 0.5,
               align : 'center'
            }
         } ],
         options : {
            grid : {
               clickable : true,
               hoverable : true,
               autoHighlight : true
            },
            legend : {
               position : 'nw'
            },
            xaxis : {
               ticks : ticks,
               tickDecimals : 0,
               max : max + 1,
               min : min - 1
            },
            colors : [ "#003871" ]
         }
      };
   },
   getCurrent : function(tstamp) {
      if (tstamp.getTime() < this.range.min) {
         kaco.override = true;
         tstamp.setTime(this.range.min);
      }
      if (tstamp.getTime() > this.range.max) {
         kaco.override = true;
         tstamp.setTime(this.range.max);
      }
      return tstamp.getUTCFullYear();
   },

   getPrevious : function(tstamp) {
      tstamp.setFullYear(tstamp.getUTCFullYear() - 1);
      return this.getCurrent(tstamp);
   },

   getNext : function(tstamp) {
      tstamp.setFullYear(tstamp.getUTCFullYear() + 1);
      return this.getCurrent(tstamp);
   }
}

var yearView = {

   range : {
      min : (new Date(2008, 0, 1, 0, 0, 0)).getTime(),
      max : (new Date()).getTime()
   },

   getTitle : function(tstamp) {
      return 'Jahresansicht ' + tstamp.getUTCFullYear();
   },

   getChartConfig : function(data) {
      return {
         chart : [ {
            label : 'E [kWh]',
            data : data,
            bars : {
               show : true,
               barWidth : 0.5,
               align : 'center'
            }
         } ],
         options : {
            grid : {
               clickable : true,
               hoverable : true,
               autoHighlight : true
            },
            legend : {
               position : 'nw',
               opacity:0.4,
               style:'bar'
            },
            xaxis : {
               ticks : [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ],
               tickDecimals : 0,
               max : 13,
               min : 0
            },
            colors : [ "#003871" ]
         }
      };
   },

   getCurrent : function(tstamp) {
      if (tstamp.getTime() < this.range.min) {
         kaco.override = true;
         tstamp.setTime(this.range.min);
      }
      if (tstamp.getTime() > this.range.max) {
         kaco.override = true;
         tstamp.setTime(this.range.max);
      }
      return tstamp.getUTCFullYear();
   },

   getPrevious : function(tstamp) {
      tstamp.setFullYear(tstamp.getUTCFullYear() - 1);
      return this.getCurrent(tstamp);
   },

   getNext : function(tstamp) {
      tstamp.setFullYear(tstamp.getUTCFullYear() + 1);
      return this.getCurrent(tstamp);
   }
}

var monthView = {

   range : {
      min : (new Date(2009, 0, 1, 0, 0, 0)).getTime(),
      max : (new Date()).getTime()
   },

   getTitle : function(tstamp) {
      return 'Monatsansicht ' + l[tstamp.getUTCMonth()] + ' ' + tstamp.getUTCFullYear();
   },

   getChartConfig : function(data) {
      var tmp = yearView.getChartConfig(data);
      tmp.options.xaxis = {
         ticks : [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
               31 ],
         tickDecimals : 0,
         max : 32,
         min : 0
      }
      return tmp;
   },

   getCurrent : function(tstamp) {
      if (tstamp.getTime() < this.range.min) {
         kaco.override = true;
         tstamp.setTime(this.range.min);
      }
      if (tstamp.getTime() > this.range.max) {
         kaco.override = true;
         tstamp.setTime(this.range.max);
      }
      var m = (tstamp.getUTCMonth() + 1) + '';
      return tstamp.getUTCFullYear() + '' + m.pad(2, '0');
   },

   getPrevious : function(tstamp) {
      tstamp.setMonth(tstamp.getUTCMonth() - 1);
      return this.getCurrent(tstamp);
   },

   getNext : function(tstamp) {
      tstamp.setMonth(tstamp.getUTCMonth() + 1);
      return this.getCurrent(tstamp);
   },

   getPreviousFast : function(tstamp) {
      tstamp.setYear(tstamp.getUTCFullYear() - 1);
      return this.getCurrent(tstamp);
   },

   getNextFast : function(tstamp) {
      tstamp.setYear(tstamp.getUTCFullYear() + 1);
      return this.getCurrent(tstamp);
   }
};

var dayView = {

   range : {
      min : (new Date(2010, 4, 1, 0, 0, 0)).getTime(),
      max : (new Date()).getTime()
   },

   getTitle : function(tstamp) {
      var l = [ 'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November',
            'Dezember' ];
      return 'Tagesansicht ' + tstamp.getUTCDate() + '. ' + l[tstamp.getUTCMonth()] + ' ' + tstamp.getUTCFullYear();
   },

   getChartConfig : function(data) {
      /*
       * var label; switch (kaco.dayGraph) { case 'pvsp1': case 'pvsp2': case
       * 'pvsp3': { label = 'U [V]'; break; }
       * 
       * case 'pvst1': case 'pvst2': case 'pvst3': { label = 'I [A]'; break; }
       * 
       * case 'nsp1': case 'nsp2': case 'nsp3': { label = 'U [V]'; break; }
       * 
       * case 'nst1': case 'nst2': case 'nst3': { label = 'I [A]'; break; }
       * 
       * case 'nfr': { label = 'F [Hz]'; break; } case 'temp': { label = 'T
       * [°C]'; break; } case 'nl': { label = "P [kW]"; break; } }
       */

      var showData = [];
      $('#graphselector').find("input:checked").each(function() {
         var key = $(this).attr("value");
         if (key && data[key])
            // dump('Adding '+key+' to list of graphs
');
            showData.push(data[key]);
      });

      return {
         chart : showData,
         /*
          * { label: label, data: data, lines: { show: true } },
          */
         options : {
            grid : {
               clickable : true,
               hoverable : true,
               autoHighlight : true
            },
            legend : {
               position : 'nw'
            },
            xaxis : {
               mode : 'time',
               timeformat : '%h'
            },
            yaxis : {
               min : 0
            },
            yaxes : [ {
               position : "left",
               color: 'rgb(255,0,0)' 
            }, {
               position : "left",
               color: 'rgb(0,0,255)'
            }, {
               position : "left",
               color: 'rgb(255,128,0)'
            }, {
               position : "left",
               color: 'rgb(0,0,0)',
               max : 80
            }, {
               position : "left",
               color: 'rgb(0,255,255)'
            } ]
         // colors: ["#003871"]
         }
      };
   },

   getCurrent : function(tstamp) {
      if (tstamp.getTime() < this.range.min) {
         kaco.override = true;
         tstamp.setTime(this.range.min);
      }
      if (tstamp.getTime() > this.range.max) {
         kaco.override = true;
         tstamp.setTime(this.range.max);
      }
      var m = (tstamp.getUTCMonth() + 1) + '';
      var d = tstamp.getUTCDate() + '';
      return tstamp.getUTCFullYear() + '' + m.pad(2, '0') + d.pad(2, '0');
   },

   getPrevious : function(tstamp) {
      tstamp.setDate(tstamp.getUTCDate() - 1);
      return this.getCurrent(tstamp);
   },

   getNext : function(tstamp) {
      tstamp.setDate(tstamp.getUTCDate() + 1);
      return this.getCurrent(tstamp);
   },

   getPreviousFast : function(tstamp) {
      tstamp.setMonth(tstamp.getUTCMonth() - 1);
      return this.getCurrent(tstamp);
   },

   getNextFast : function(tstamp) {
      tstamp.setMonth(tstamp.getUTCMonth() + 1);
      return this.getCurrent(tstamp);
   }

};

Aber leider immer noch keine Werte…

da drin setzt er die Werte per Ajax… das ist etwas unschön, weil du da nicht so einfach ran kommst…

ABER… was liefert dir denn: http://192.168.0.100/metadata.csv
und http://192.168.0.100/pstatus.txt

in einem von beiden müssten die Werte drin stecken…

Leider nicht.:frowning:

http://192.168.0.100/metadata.csv
liefert Typ, Seriennummer, MAC, IP etc.

und
http://192.168.0.100/pstatus.txt
mögliche Fehlermeldungstexte…

Aber es gibt noch eine

http://192.168.0.100/realtime.csv

Dort stehen ein paar sich ständig ändernde Werte drin.
Da muss ich jetzt mal in Ruhe schauen wie und ob ich die zuordnen kann.

Vielen Dank für Deine Hilfe!!:wink:

ok naechster Versuch: /realtime.csv <- da war ich zu langsam mit dem Handy :wink:

Die Reihenfolge der Werte steht auch in der kaco.js weiter unten als Kommentar