Q&A Highcharts V2.0

ok, nee, wir nehmen Tor 1. Dann wird es in Zukunft leichter, mit den daten zu agieren
Änder mal in deinem Script Zeile 175: $serie = array(„Data“ => $ext_Data); in
$serie = array(„Data“ => $ext_data); (hatte ich falsch gepostet)

Das hier legt dir die Solldaten im neuen Format ab, dann probiert dein Config-Script nochmal aus


// +++ Konfig / Vorgaben +++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Auswertungszeitraum
	$year                            = 2012;                                        	// Berechnungen für welches Jahr? -> Wert ggf durch date("Y",time()) ersetzen

// Variable für HC-Data-String definieren
   $Sollwerte_String_ID					= 49380 /*[z01 Test Temp\HC PV Beispiel honk\PV Ertrag Soll monatlich]*/ ;

// PV Sollwerte (erwartete elektr. Arbeit pro Monat) definieren
	$PV_Soll_array 		= array(	0 => 74.39, 229.04, 369.71, 435.38, 484.43, 475.92, 486.46, 460.92, 384.3, 290.66, 176.75, 111.48); // Vorgabe Ertragswerte pro Monat
	
// +++ Konfig / Vorgaben  Ende +++++++++++++++++++++++++++++++++++++++++++++++++

// Startdefinition Arbeitsvariablen
	$PV_Soll_String      = "";    	// leere Stringvariable definieren
	$i 						= 0;     	// Schleifenzähler-Startwert = 1

// String PV Ertrag Sollwert aufbauen
	do
	{

		$PV_Soll_String .= mktime(0,0,0, 1+$i, 1, $year).",".$PV_Soll_array[0+$i]." ";
		$i++; // Schleifenzähler +1

	}
	while ($i < 12);

// String PV Ertrag Sollwert in String-Var schreiben
	setValueString($Sollwerte_String_ID, $PV_Soll_String);
echo $PV_Soll_String;

Hier noch die Anpassung zu deinem Quote-Script, eigentlich müsste es reichen, diese Zeile auszutauschen:

Alt:


$PV_Quote_String .= "[Date.UTC(".$year.",".$i.", 1, 00, 00, 00),".$PV_Quote."], ";

Neu:


$PV_Quote_String .= mktime(0,0,0, 1+$i, 1, $year).",".$PV_Quote." ";

Die String-Var sieht nun so aus:

1325372400,148.78 1328050800,229.04 1330556400,369.71 1333231200,435.38 1335823200,484.43 1338501600,475.92 1341093600,486.46 1343772000,460.92 1346450400,384.3 1349042400,290.66 1351724400,176.75 1354316400,111.48
für 2012.
Eingebunden habe ich es folgender Maßen:


	$Sollwerte = getValuestring(57861);
// SOLL-Werte
	$serie = array("Data" => $Sollwerte);
	$serie['name'] = "Column";
	$serie['Unit'] = "kWh";
	$serie['ReplaceValues'] =false;
	$serie['type'] = "column";
	$serie['step'] = false;
	$serie['yAxis'] = 0;
	$serie['shadow'] = true;
	$serie['states']['hover']['lineWidth'] = 2;
	$serie['marker']['enabled'] = false;
	$serie['marker']['states']['hover']['enabled'] = true;
	$serie['marker']['states']['hover']['symbol'] = 'circle';
	$serie['marker']['states']['hover']['radius'] = 4;
	$serie['marker']['states']['hover']['lineWidth'] = 1;
	$CfgDaten['series'][] = $serie;

Es werden jedoch viele Fehler geworfen (Screenshot).

Das Script sieht nun so aus:

<?
/*
    Funktion: Berechnung der monatlichen (Ertrags-)Quote einer PV-Anlage in %.
    Quote = (100*Ertrag)/Soll

    Ertrag = von der PV-Anlage erzeugte elektr. Arbeit in Kwh
    Soll = erwartete elektr. Arbeit pro Monat
*/


// +++ Konfig / Vorgaben +++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Auswertungszeitraum

    $year                  = GetValue(28289 /*[Scripte\Highcharts_V2.00\PV-Anlage pro Monat\Dummy Module\Highcharts_Jahre]*/ ); // Berechnungen für welches Jahr? -> Wert ggf durch date("Y",time()) ersetzen
    $ts                    = mktime(0,0,0, 1,1, $year); // ab 01.01.$year 0:00:00 Uhr
    $te                    = mktime(23,59,59, 12, 31, $year); // bis 31.12.$year 23:59:59 Uhr

// Definition der Variablen-ID's
    $PV_Quote_monatlich_id = 23512 /*[Program\SMA Webbox\Quote Monate]*/  ; // Ziel-Variable für HC-Data-String "Quote"
    $PV_Ertrag_id          = 57373 /*[Program\SMA Webbox\Ertrag täglich (Zähler)]*/ ; // Variablen-ID der geloggten PV Ertragsdaten
    $PV_Soll_array         = getValueString(57861 /*[Program\SMA Webbox\Sollwerte Monate]*/ ); // Var-ID, in der die PV-Solldaten (HC-String) liegen

// +++ Konfig / Vorgaben  Ende +++++++++++++++++++++++++++++++++++++++++++++++++


// Archive Handler, geloggte Daten auslesen
    $archiveID             = IPS_GetInstanceIDByName("Archive Handler", 0);   // Archive-Handler-ID
    $PV_Ertrag_array       = AC_GetAggregatedValues($archiveID, $PV_Ertrag_id, 3, $ts, $te, 12);

// Array-Daten formatieren
    $PV_Ertrag_array       = array_reverse($PV_Ertrag_array); // Array-Reihenfolge umkehren
    $PV_Soll_array         = substr($PV_Soll_array, 1, -3); // HC-String formatieren und in verarbeitungsfähige Form bringen
    $PV_Soll_array         = explode("[ ]", $PV_Soll_array);
    $PV_Soll_array         = explode("], [", $PV_Soll_array[0]);

// Startdefinition Arbeitsvariablen

	 $i = 0;
    $PV_Soll = array();

// echo $year;

// PV Soll-Werte aus HC-Sollwert-String extrahieren und in neues Array schreiben
    do
    {
       $temp_Soll_val      = substr(strrchr ($PV_Soll_array[$i], ","), 1);
       $PV_Soll[]          = $temp_Soll_val;
        $i++; // Schleifenzähler +1

    }
    while ($i < 12);

// Startvariablen neu definieren

	 $i                     = 0;
    $PV_Quote_String       = "";

// echo $i;
// String PV Quote aufbauen und in STRING-Var schreiben
    do
    {
       if (isset($PV_Ertrag_array[$i]['Avg']))
       {
          $PV_Quote         = round((100*$PV_Ertrag_array[$i]['Avg'])/$PV_Soll[$i], 1);
          $PV_Quote_String .= mktime(0,0,0, 1+$i, 1, $year).",".$PV_Quote." ";
//          $PV_Quote_String .= "[Date.UTC(".$year.",".$i.", 1, 00, 00, 00),".$PV_Quote."], ";
          $i++; // Schleifenzähler +1
        }
        else
        {
           $i    = 12;
        }
    }
    while ($i < 12);

// String PV Ertrag Sollwert in String-Var schreiben

	 if ($year == 2011)
	 {
	 setValueString($PV_Quote_monatlich_id , "[Date.UTC(2011,0, 1, 00, 00, 00),0],
	 														[Date.UTC(2011,1, 1, 00, 00, 00),0],
															[Date.UTC(2011,2, 1, 00, 00, 00),0],
															[Date.UTC(2011,3, 1, 00, 00, 00),0],
															[Date.UTC(2011,4, 1, 00, 00, 00),0],
															[Date.UTC(2011,5, 1, 00, 00, 00),0],
															[Date.UTC(2011,6, 1, 00, 00, 00),0],
															[Date.UTC(2011,7, 1, 00, 00, 00),0],
															[Date.UTC(2011,8, 1, 00, 00, 00),0],
															[Date.UTC(2011,9, 1, 00, 00, 00),0],
															[Date.UTC(2011,10, 1, 00, 00, 00),72.5],
															[Date.UTC(2011,11, 1, 00, 00, 00),108.9],");
	 }
	 else
	 {
    setValueString($PV_Quote_monatlich_id , $PV_Quote_String);
	 }

echo $year;
echo $PV_Quote_String;

?>

und wirft ebenfalls reichlich Fehler

Notice: Undefined offset: 1 in C:\IP-Symcon\scripts\21571.ips.php on line 46

Notice: Undefined offset: 2 in C:\IP-Symcon\scripts\21571.ips.php on line 46

Notice: Undefined offset: 3 in C:\IP-Symcon\scripts\21571.ips.php on line 46

Notice: Undefined offset: 4 in C:\IP-Symcon\scripts\21571.ips.php on line 46

Notice: Undefined offset: 5 in C:\IP-Symcon\scripts\21571.ips.php on line 46

Notice: Undefined offset: 6 in C:\IP-Symcon\scripts\21571.ips.php on line 46

Notice: Undefined offset: 7 in C:\IP-Symcon\scripts\21571.ips.php on line 46

Notice: Undefined offset: 8 in C:\IP-Symcon\scripts\21571.ips.php on line 46

Notice: Undefined offset: 9 in C:\IP-Symcon\scripts\21571.ips.php on line 46

Notice: Undefined offset: 10 in C:\IP-Symcon\scripts\21571.ips.php on line 46

Notice: Undefined offset: 11 in C:\IP-Symcon\scripts\21571.ips.php on line 46

Warning: Division by zero in C:\IP-Symcon\scripts\21571.ips.php on line 64

Warning: Division by zero in C:\IP-Symcon\scripts\21571.ips.php on line 64

Warning: Division by zero in C:\IP-Symcon\scripts\21571.ips.php on line 64

Warning: Division by zero in C:\IP-Symcon\scripts\21571.ips.php on line 64
20121325372400,130.4 1328050800,0 1330556400,0 1333231200,0 1335823200,0
wobei ich hier nicht ausschliessen möchte, dass das problem an dem vorgelagerten Soll-Werte Script möglicherweise daran Schuld ist.

Nun wundert mich nichts mehr :confused:

Dein PV-Quote-Script ist für die Tonne! Du solltest dringend versuchen, zu verstehen, was Du tust, insbesondere den Code!

hier wird ein String nach der neuen Formatierung zusammengebaut (so wie oben besprochen):


// String PV Quote aufbauen und in STRING-Var schreiben
    do
    {
       if (isset($PV_Ertrag_array[$i]['Avg']))
       {
          $PV_Quote         = round((100*$PV_Ertrag_array[$i]['Avg'])/$PV_Soll[$i], 1);
          $PV_Quote_String .= mktime(0,0,0, 1+$i, 1, $year).",".$PV_Quote." ";
//          $PV_Quote_String .= "[Date.UTC(".$year.",".$i.", 1, 00, 00, 00),".$PV_Quote."], ";
          $i++; // Schleifenzähler +1
        }
        else
        {
           $i    = 12;
        }
    }
    while ($i < 12);

hier hast du einen händisch gestrickten String nahc dem alten Format drin.


// String PV Ertrag Sollwert in String-Var schreiben

     if ($year == 2011)
     {
     setValueString($PV_Quote_monatlich_id , "[Date.UTC(2011,0, 1, 00, 00, 00),0],
                                                             [Date.UTC(2011,1, 1, 00, 00, 00),0],
                                                            [Date.UTC(2011,2, 1, 00, 00, 00),0],
                                                            [Date.UTC(2011,3, 1, 00, 00, 00),0],
                                                            [Date.UTC(2011,4, 1, 00, 00, 00),0],
                                                            [Date.UTC(2011,5, 1, 00, 00, 00),0],
                                                            [Date.UTC(2011,6, 1, 00, 00, 00),0],
                                                            [Date.UTC(2011,7, 1, 00, 00, 00),0],
                                                            [Date.UTC(2011,8, 1, 00, 00, 00),0],
                                                            [Date.UTC(2011,9, 1, 00, 00, 00),0],
                                                            [Date.UTC(2011,10, 1, 00, 00, 00),72.5],
                                                            [Date.UTC(2011,11, 1, 00, 00, 00),108.9],");
     }
     else
     {
    setValueString($PV_Quote_monatlich_id , $PV_Quote_String);
     }

Wenn Year jetzt auf „2011“ steht, kann das nur schief gehen…ob das der grund war, kann ich von hier nicht beurteilen,

ich hab zwischendurch Dein Config-Script lauffähig gemacht (da waren einige Fehler drin). Ist zwar etwas dirty, aber bei mir läuft es (ohne Fehler);


<?php
    // bei der Konfiguration unbedingt auf die Groß/Kleinschreibung achten
    // es wurde versucht folgende Namensgebeung in der Konfiguration zu verwenden
    // Parameter mit kleinen Anfangsbuchstaben = Parameter welche von Highcharts übnernommen wurden. Siehe dazu: http://www.highcharts.com/ref/
    // Parameter mit großen Anfangsbuchstaben = für das IPS-Highcharts-Script eingeführte Parameter

    Global $CfgDaten; // damit kann der Script auch von anderen Scripten aufgerufen werden und bereits mit CfgDaten vorkonfiguriert werden

   $year = 2012; //GetValue(28289 /*[Scripte\Highcharts_V2.00\PV-Anlage pro Monat\Dummy Module\Highcharts_Jahre]*/  );
   //$PV_Quote      = getValueString(23512 /*[Program\SMA Webbox\Quote Monate]*/  );

   $Solldaten_ID     =49380  /*[z01 Test Temp\HC PV Beispiel honk\PV Ertrag Soll monatlich]*/;
    $Solldaten_value  = getValuestring($Solldaten_ID);

    // Solldaten in automatisch indiziertes Array einlesen
    $rawData          =array();
    $Data          		=array();
    $rawData          =explode(" ",$Solldaten_value);
    for($i =0;$i<count($rawData); $i++)
    {
   $Data[$i]             = explode(",", $rawData[$i]);
    }

    // Array-Keys anpassen
    for($i =0;$i<count($Data)-1; $i++)
    {
   $ext_data[$i]['TimeStamp'] = $Data[$i][0];
   $ext_data[$i]['Value'] = $Data[$i][1];
   $ext_data[$i]['human_date'] = date("d.m.Y H:i", $ext_data[$i]['TimeStamp']);
    }
    
    // Quote auslesen

   	$Solldaten_ID     = 54120  /*[z01 Test Temp\HC PV Beispiel honk\Quote]*/;
    	$Solldaten_value  = getValuestring($Solldaten_ID);

    // Solldaten in automatisch indiziertes Array einlesen
    $rawData          =array();
    $Data          		=array();
    $rawData          =explode(" ",$Solldaten_value);
    //print_r($rawData);
    for($i =0;$i<count($rawData); $i++)
    {
   	$Data[$i]             = explode(",", $rawData[$i]);
    }

    // Array-Keys anpassen
    for($i =0;$i<count($Data)-1; $i++)
    {
	   if(isset($Data[$i][0])) {$quote_data[$i]['TimeStamp'] 						= $Data[$i][0];}
	   if(isset($Data[$i][1])) {$quote_data[$i]['Value'] 								= $Data[$i][1];}
	   if(isset($quote_data[$i]['TimeStamp'])) {$quote_data[$i]['human_date'] 	= @date("d.m.Y H:i", ($quote_data[$i]['TimeStamp']));}
    }
    //print_r($quote_data);
    
    // IPS Variablen ID´s
    $CfgDaten['ContentVarableId']= -1;  // ID der String Variable in welche die Daten geschrieben werden (-1 oder überhaupt nicht angeben wenn die Content Variable das übergordnete Element ist)
    $CfgDaten['HighChartScriptId']= 35562  /*[HighCarts\HighCharts  2.01]*/;                  // ID des Highcharts Scripts

    // Zeitraum welcher dargestellt werden soll (kann durch die Zeitvorgaben in den Serien verändert werden)
    $CfgDaten["StartTime"] = mktime(0,0,0,1,1, $year); // ab heute 00:00 Uhr
    $CfgDaten["EndTime"] = mktime(23,59,59, 12, 31, $year); // ab heute 23:59 Uhr, oder //$CfgDaten["EndTime"] = time();   // = bis jetzt

    // damit wird die Art des Aufrufes festgelegt
    $CfgDaten['RunMode'] = "script";     // file, script oder popup

   // Tooltip anpassen
   $CgDaten['tooltip']['shared']=true;
   $CfgDaten['tooltip']['crosshairs']=true;
   $CfgDaten['tooltip']['formatter']="";
   $CfgDaten['tooltip']['useHTML ']=true;
//   $CfgDaten['tooltip']['valueSuffix ']= " kWh";

    // Serienübergreifende Einstellung für das Laden von Werten
    $CfgDaten['AggregatedValues']['HourValues'] = -1;      // ist der Zeitraum größer als X Tage werden Stundenwerte geladen
    $CfgDaten['AggregatedValues']['DayValues'] = -1;       // ist der Zeitraum größer als X Tage werden Tageswerte geladen
    $CfgDaten['AggregatedValues']['WeekValues'] = -1;      // ist der Zeitraum größer als X Tage werden Wochenwerte geladen
    $CfgDaten['AggregatedValues']['MonthValues'] = 1;      // ist der Zeitraum größer als X Tage werden Monatswerte geladen
    $CfgDaten['AggregatedValues']['YearValues'] = -1;          // ist der Zeitraum größer als X Tage werden Jahreswerte geladen
    $CfgDaten['AggregatedValues']['NoLoggedValues'] = 1000;     // ist der Zeitraum größer als X Tage werden keine Boolean Werte mehr geladen, diese werden zuvor immer als Einzelwerte geladen    $CfgDaten['AggregatedValues']['MixedMode'] = false;     // alle Zeitraumbedingungen werden kombiniert
    $CfgDaten['AggregatedValues']['MixedMode'] = false;
    // Systematik funktioniert jetzt additiv. D.h. die angegebenen Werte gehen ab dem letzten Wert
    //
    //            -5 Tage           -3 Tage                        EndTime
    // |           |                  |                             |
    // |           |DayValue = 2     |HourValues = 3          |
    // |Tageswerte |Stundenwerte     |jeder geloggte Wert     |

    // **************************************************************************************
    // *** Highcharts Options ***
    // **************************************************************************************
    // Ab hier werden die Bereiche des Highchart-Objektes parametriert.
    // Dieser Bereich wurde (soweit möglich) identisch der Originalstruktur gehalten.
    // Informationen über die Parametrierung findet man unter http://www.highcharts.com/ref/

    // **************************************************************************************
    // *** chart *** http://www.highcharts.com/ref/#chart
    // **************************************************************************************
    // $CfgDaten['chart']['zoomType'] = "'x'";            //default: $CfgDaten['chart']['zoomType'] = "'xy'";

    // **************************************************************************************
    // *** credits *** siehe http://www.highcharts.com/ref/#credits
    // **************************************************************************************
    // $CfgDaten['credits']['text'] = "used by IPS";
    // $CfgDaten['credits']['href'] = "http://www.ip-symcon.de/forum/f53/highcharts-multigraph-v1-0-a-17625/#post120721";

    // **************************************************************************************
    // *** title *** siehe http://www.highcharts.com/ref/#title
    // **************************************************************************************
    // $CfgDaten['title']['text'] = "Chart-Überschrift";  // Überchrift des gesamten Charts
    //        -> veraltet: 'Title' -> verwende ['title']['text']

    $CfgDaten['title']['text'] = "PV Ertrag $year";

    // **************************************************************************************
    // *** subtitle *** siehe http://www.highcharts.com/ref/#subtitle
    // **************************************************************************************
    // $CfgDaten['subtitle']['text'] = "Zeitraum: %STARTTIME% - %ENDTIME%" // Sub-Überschrift. Wenn nichts angegeben wird wird dieser String als Default verwendet
    //        -> veraltet: 'SubTitle' -> verwende ['subtitle']['text']
    // $CfgDaten['subtitle']['Ips']['DateTimeFormat'] = "(D) d.m.Y H:i"    // z.B.: "(D) d.m.Y H:i" (wird auch als Default herangezogen wenn nichts konfiguriert wurde)
    //        -> veraltet: 'SubTitleDateTimeFormat' -> verwende ['subtitle']['Ips']['DateTimeFormat']
    //    -> entfallen: 'SubTitleFormat' ->unnötiger Paramter, wird jetzt in ['subtitle']['text'] angegeben

    $CfgDaten['subtitle']['text'] = "Zeitraum: %STARTTIME% - %ENDTIME%";
    $CfgDaten['subtitle']['Ips']['DateTimeFormat'] = "(D) d.m.Y H:i";

    // **************************************************************************************
    // *** tooltip *** http://www.highcharts.com/ref/#tooltip
    // **************************************************************************************
    //$CfgDaten['tooltip']['enabled'] = false;

    // **************************************************************************************
    // *** exporting *** http://www.highcharts.com/ref/#exporting
    // **************************************************************************************
    //$CfgDaten['exporting']['enabled'] = true;

    // **************************************************************************************
    // *** lang *** http://www.highcharts.com/ref/#lang
    // **************************************************************************************
    //$CfgDaten['lang']['resetZoom'] = "Zoom zurücksetzten";

    // **************************************************************************************
    // *** legend *** http://www.highcharts.com/ref/#legend
    // **************************************************************************************
    //$CfgDaten['legend']['backgroundColor'] = '#FCFFC5';

    // **************************************************************************************
    // *** xAxis *** http://www.highcharts.com/ref/#xAxis
    // **************************************************************************************
    //$CfgDaten['xAxis']['lineColor'] = '#FF0000';
    //$CfgDaten['xAxis']['plotBands'][] = array("color"=>'#FCFFC5',"from"=> "@Date.UTC(2012, 3, 29)@","to"=> "@Date.UTC(2012, 3, 30)@");

    // **************************************************************************************
    // *** yAxis *** http://www.highcharts.com/ref/#yAxis
    // **************************************************************************************
    // $CfgDaten['yAxis'][0]['title']['text'] = "Temperaturen"; // Bezeichnung der Achse
    //        -> veraltet: 'Name' und 'TitleText' -> verwende ['title']['text']
    // $CfgDaten['yAxis'][0]['Unit'] = "°C";    // Einheit für die Beschriftung die Skalenwerte
    //    $CfgDaten['yAxis'][0]['min'] = 0; // Achse beginnt bei Min (wenn nichts angegeben wird wird der Min der Achse automatisch eingestellt)
    //    $CfgDaten['yAxis'][0]['max'] = 40; // Achse geht bis Max (wenn nichts angegeben wird wird der Max der Achse automatisch eingestellt)
    //        -> veraltet: 'Min' und 'Max'
    //    $CfgDaten['yAxis'][0]['opposite'] = false; // Achse wird auf der rechten (true) oder linken Seite (false) des Charts angezeigt (default = false)
    //        -> veraltet: 'Opposite'
    //    $CfgDaten['yAxis'][0]['tickInterval'] = 5; // Skalenwerte alle x (TickInterval)
    //        -> veraltet: 'TickInterval'
    //    -> entfallen: 'PlotBands' -> verwende ['yAxis'][0]['plotBands'],  (siehe Beispiel 'cfg - drehgriff und tf-kontakt')
    //    -> entfallen: 'YAxisColor' -> verwende ['yAxis'][0]['title']['style']
    //    -> entfallen: 'TitleStyle'-> verwende ['yAxis'][0]['title']['style']

    // Definition Y-Achse 5
   $Ai                                                = 0;
	$CfgDaten["yAxis"][$Ai]['title']['text'] 				= "Ertrag in kWh";
	$CfgDaten["yAxis"][$Ai]['Unit'] 							= NULL;
	$CfgDaten["yAxis"][$Ai]['opposite'] 					= false;
	$CfgDaten["yAxis"][$Ai]['allowDecimals'] 				= false;
	$CfgDaten["yAxis"][$Ai]['min'] 							= 0;
	$CfgDaten["yAxis"][$Ai]['tickIntervall']				= NULL;
	$CfgDaten["yAxis"][$Ai]['max'] 							= NULL;
   $CfgDaten["yAxis"][$Ai]['labels']['style']['color']= '#123456';
   $CfgDaten["yAxis"][$Ai]['title']['style']['color']	= $CfgDaten["yAxis"][$Ai]['labels']['style']['color'];

   // Definition Y-Achse 6
   $Ai                                                = 1;
	$CfgDaten["yAxis"][$Ai]['title']['text'] 				= "Quote";
	$CfgDaten["yAxis"][$Ai]['Unit'] 							= NULL;
	$CfgDaten["yAxis"][$Ai]['opposite'] 					= false;
	$CfgDaten["yAxis"][$Ai]['allowDecimals'] 				= false;
	$CfgDaten["yAxis"][$Ai]['min'] 							= 0;
	$CfgDaten["yAxis"][$Ai]['tickIntervall']				= NULL;
	$CfgDaten["yAxis"][$Ai]['max'] 							= 100;
   $CfgDaten["yAxis"][$Ai]['labels']['style']['color']= '#AABBAA';
   $CfgDaten["yAxis"][$Ai]['title']['style']['color']	= $CfgDaten["yAxis"][$Ai]['labels']['style']['color'];

    // **************************************************************************************
    // *** series *** http://www.highcharts.com/ref/#series
    // **************************************************************************************
    // $CfgDaten['name'] = "Temperatur; // Name der Kurve (Anzeige in Legende und Tooltip)
    //        -> veraltet: 'Name' -> verwende ['name']
    // $CfgDaten['Unit'] = "°C"; // Anzeige in automatisch erzeugtem Tooltip
    //     wenn $CfgDaten['Unit'] = NULL; // oder Unit wird gar nicht definiert, wird versucht die Einheit aus dem Variablenprofil automatisch auszulesen
    // $CfgDaten['ReplaceValues'] = false; // Werte werden wie geloggt übernommen
    // $CfgDaten['ReplaceValues'] = array(0=>0.2,1=>10) // der Wert 0 wird in 0.2 geändert, der Wert 1 wird in 10 geändert
    //       das macht für die Darstellung von Boolean Werte Sinn, oder für Drehgriffkontakte (Werte 0,1,2)
    // $CfgDaten['type'] = 'spline'; // Festlegung des Kuventypes (area, areaspline, line, spline, pie, Column)
    // $CfgDaten['yAxis'] = 0; // Nummer welche Y-Achse verwendet werden soll (ab 0)
    //     -> veraltet: 'Param' -> verwende die Highcharts Parameter - sollte eigentlich noch so funktionieren wie in IPS-Highcharts V1.x
    // $CfgDaten['AggType'] = 0 // Festlegung wie die Werte gelesen werden soll (0=Hour, 1=Day, 2=Week, 3=Month, 4=Year), hat Vorrang gegenüber den Einstellungen in AggregatedValues
    //    wird kein AggType definiert werden alle gelogten Werte angezeigt
    // $CfgDaten['AggNameFormat'] = "d.m.Y H:i"; // (gilt nur bei den Pies, wenn eine Id verwendet wird), entspricht dem PHP-date("xxx") Format, welches das Format der Pie Namen festlegt, wenn keine Eingabe werden Default Werte genommen
    // $CfgDaten['Offset'] = 24*60*60; hiermit können Kurven unterschiedlicher Zeiträume in einem Chart dargestellt. Angabe ist in Minuten
    //    $CfgDaten['StartTime'] = mktime(0,0,0,1,1,2012);     // wird für die entsprechende Serie eine Anfangs- und/oder Endzeitpunkt festgelegt wird dieser verwendet. Ansonsten wird
    // CfgDaten['EndTime'] = mktime(0,0,0,2,1,2012);          // der Zeitpunkt der Zeitpunkt aus den $CfgDaten genommen
    // CfgDaten['ScaleFactor'] = 10; // Skalierungsfaktor mit welchem der ausgelesene Werte multipliziert wird
    // CfgDaten['RoundValue'] = 1; // Anzahl der Nachkommastellen
    //    CfgDaten['AggValue'] ='Min' // über AggValue kann Min/Max oder Avg vorgewählt werden (Default bei keiner Angabe ist Avg)
    //        ist sinnvoll wenn nicht Einzelwerte sondern Stundenwerte, Tageswerte, usw. ausgelesen werden
    // CfgDaten['data'] = array('TimeStamp'=> time(),'Value'=12) // hier kann ein Array an eigenen Datenpunkten übergeben werden. In diesem Fall werden für diese Serie keine Daten aus der Variable gelesenen.

// SOLL-Werte
	$serie 															= array(//"Id"=>12130,
																					"Data" => $ext_data,
																					"Name" =>"Soll-ertrag",
																					"Unit"=>"kWh",
																					"zIndex"=> 3,
                                                               "AggType"=>3,
																					"AggValue"=>"Avg",
																					"RoundValue"=>1,
																					"ScaleFactor"=> 1,
																					"ReplaceValues"=>false);
 	$serie['type'] 												= "column";
	$serie['step'] 												= false;
	$serie['yAxis'] 												= 0;
	$serie['visible'] 											= true;
	$serie['showInLegend'] 										= true;
	$serie['enableMouseTracking'] 							= true;
	$serie['color'] 												= '#AABBAA';
	$serie['shadow'] 												= true;
	$serie['dashStyle']                                = NULL;
	$serie['lineWidth'] 											= 1;
	$serie['states']['hover']['lineWidth'] 				= 0;
	$serie['marker']['enabled'] 								= true;
	$serie['marker']['symbol'] 								= 'circle';
	$serie['marker']['states']['hover']['enabled'] 		= true;
	$serie['marker']['states']['hover']['symbol'] 		= 'circle';
	$serie['marker']['states']['hover']['radius'] 		= 4;
	$serie['marker']['states']['hover']['lineWidth'] 	= 1;
	$CfgDaten["Series"][] 										= $serie;
    
    // Quote-Werte
    	$serie 															= array(//"Id"=>12130,
																					"Data" => $quote_data,
																					"Name" =>"Ertrag",
																					"Unit"=>"%",
																					"zIndex"=> 3,
                                                               "AggType"=>3,
																					"AggValue"=>"Avg",
																					"RoundValue"=>1,
																					"ScaleFactor"=> 1,
																					"ReplaceValues"=>false);
 	$serie['type'] 												= "line";
	$serie['step'] 												= false;
	$serie['yAxis'] 												= 1;
	$serie['visible'] 											= true;
	$serie['showInLegend'] 										= true;
	$serie['enableMouseTracking'] 							= true;
	$serie['color'] 												= '#AABBAA';
	$serie['shadow'] 												= true;
	$serie['dashStyle']                                = NULL;
	$serie['lineWidth'] 											= 1;
	$serie['states']['hover']['lineWidth'] 				= 0;
	$serie['marker']['enabled'] 								= true;
	$serie['marker']['symbol'] 								= 'circle';
	$serie['marker']['states']['hover']['enabled'] 		= true;
	$serie['marker']['states']['hover']['symbol'] 		= 'circle';
	$serie['marker']['states']['hover']['radius'] 		= 4;
	$serie['marker']['states']['hover']['lineWidth'] 	= 1;
	$CfgDaten["Series"][] 										= $serie;

// Ertrag pro Monat
  // NS Dauer pro Monat
	$serie 															= array("Id"=>12130,
																					//"Data" => $year_data,
																					"Name" =>"Ertrag",
																					"Unit"=>"kWh",
																					"zIndex"=> 2,
                                                               "AggType"=>3,
																					"AggValue"=>"Avg",
																					"RoundValue"=>1,
																					"ScaleFactor"=> 1,
																					"ReplaceValues"=>false);
 	$serie['type'] 												= "column";
	$serie['step'] 												= false;
	$serie['yAxis'] 												= 0;
	$serie['visible'] 											= true;
	$serie['showInLegend'] 										= true;
	$serie['enableMouseTracking'] 							= true;
	$serie['color'] 												= '#123456';
	$serie['shadow'] 												= true;
	$serie['dashStyle']                                = NULL;
	$serie['lineWidth'] 											= 1;
	$serie['states']['hover']['lineWidth'] 				= 0;
	$serie['marker']['enabled'] 								= true;
	$serie['marker']['symbol'] 								= 'circle';
	$serie['marker']['states']['hover']['enabled'] 		= true;
	$serie['marker']['states']['hover']['symbol'] 		= 'circle';
	$serie['marker']['states']['hover']['radius'] 		= 4;
	$serie['marker']['states']['hover']['lineWidth'] 	= 1;
	$CfgDaten["Series"][] 										= $serie;
	
    // Highcharts-Theme
    //    $CfgDaten['HighChart']['Theme']="grid.js";   // von Highcharts mitgeliefert: dark-green.js, dark-blue.js, gray.js, grid.js
    $CfgDaten['HighChart']['Theme']="ips.js";   // IPS-Theme muss per Hand in in Themes kopiert werden....

    // Abmessungen des erzeugten Charts
    $CfgDaten['HighChart']['Width'] = 0;             // in px,  0 = 100%
    $CfgDaten['HighChart']['Height'] = 300;         // in px
//print_r($CfgDaten);
    // -------------------------------------------------------------------------------------------------------------------------------------
    // und jetzt los ......
    $s = IPS_GetScript($CfgDaten['HighChartScriptId']);     // Id des Highcharts-Scripts
    include($s['ScriptFile']);

      // hier werden die CfgDaten geprüft und bei Bedarf vervollständigt
    $CfgDaten = CheckCfgDaten($CfgDaten);

    // abhängig von der Art des Aufrufs -> json String für Highcharts erzeugen
    if (isset($CfgDaten['RunMode'])
        && ($CfgDaten['RunMode'] == "script" || $CfgDaten['RunMode'] == "popup"))
    {
        // Variante1: Übergabe der ScriptId. Daten werden beim Aufruf der PHP Seite erzeugt und direkt übergeben. Dadurch kann eine autom. Aktualisierung der Anzeige erfolgen
        if ($IPS_SENDER != "WebInterface")
        {
            WriteContentWithScriptId ($CfgDaten, $IPS_SELF);             // und jetzt noch die ContentTextbox
            return;                                                   // Ende, weil durch die Zuweisung des Script sowieso nochmals aufgerufen wird
        }

        $sConfig = CreateConfigString($CfgDaten);                     // erzeugen und zurückgeben des Config Strings
    }
    else
    {
        //Variante2: Übergabe des Textfiles. Daten werden in tmp-File gespeichert. Eine automatische Aktualisierung beim Anzeigen der Content-Textbox erfolgt nicht
        $sConfig = CreateConfigString($CfgDaten);                     // erzeugen und zurückgeben des Config Strings

        $tmpFilename = CreateConfigFile($sConfig, $IPS_SELF);         // und ab damit ins tmp-Files
        if ($IPS_SENDER != "WebInterface")
        {
            WriteContentWithFilename ($CfgDaten, $tmpFilename);       // und jetzt noch die ContentTextbox
        }
    }

?>

Ich hatte einen händisch gestrickten String nach dem alten Format drin, weil es für mich die schnellste Lösung auf meine Frage damals (guckst Du hier) war. Ich bin leider nicht so fit in solchen Dingen und muss gestehen, dass ich mich da schon tierisch gefreut hatte, als es auf die Art lief. Aktuell sieht mein Quote-Script also so aus:

<?
/*
    Funktion: Berechnung der monatlichen (Ertrags-)Quote einer PV-Anlage in %.
    Quote = (100*Ertrag)/Soll

    Ertrag = von der PV-Anlage erzeugte elektr. Arbeit in Kwh
    Soll = erwartete elektr. Arbeit pro Monat
*/


// +++ Konfig / Vorgaben +++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Auswertungszeitraum

    $year                  = GetValue(28289 /*[Scripte\Highcharts_V2.00\PV-Anlage pro Monat\Dummy Module\Highcharts_Jahre]*/ ); // Berechnungen für welches Jahr? -> Wert ggf durch date("Y",time()) ersetzen
    $ts                    = mktime(0,0,0, 1,1, $year); // ab 01.01.$year 0:00:00 Uhr
    $te                    = mktime(23,59,59, 12, 31, $year); // bis 31.12.$year 23:59:59 Uhr

// Definition der Variablen-ID's
    $PV_Quote_monatlich_id = 23512 /*[Program\SMA Webbox\Quote Monate]*/  ; // Ziel-Variable für HC-Data-String "Quote"
    $PV_Ertrag_id          = 57373 /*[Program\SMA Webbox\Ertrag täglich (Zähler)]*/ ; // Variablen-ID der geloggten PV Ertragsdaten
    $PV_Soll_array         = getValueString(57861 /*[Program\SMA Webbox\Sollwerte Monate]*/ ); // Var-ID, in der die PV-Solldaten (HC-String) liegen

// +++ Konfig / Vorgaben  Ende +++++++++++++++++++++++++++++++++++++++++++++++++


// Archive Handler, geloggte Daten auslesen
    $archiveID             = IPS_GetInstanceIDByName("Archive Handler", 0);   // Archive-Handler-ID
    $PV_Ertrag_array       = AC_GetAggregatedValues($archiveID, $PV_Ertrag_id, 3, $ts, $te, 12);

// Array-Daten formatieren
    $PV_Ertrag_array       = array_reverse($PV_Ertrag_array); // Array-Reihenfolge umkehren
    $PV_Soll_array         = substr($PV_Soll_array, 1, -3); // HC-String formatieren und in verarbeitungsfähige Form bringen
    $PV_Soll_array         = explode("[ ]", $PV_Soll_array);
    $PV_Soll_array         = explode("], [", $PV_Soll_array[0]);

// Startdefinition Arbeitsvariablen

	 $i = 0;
    $PV_Soll = array();

// echo $year;

// PV Soll-Werte aus HC-Sollwert-String extrahieren und in neues Array schreiben
    do
    {
       $temp_Soll_val      = substr(strrchr ($PV_Soll_array[$i], ","), 1);
       $PV_Soll[]          = $temp_Soll_val;
        $i++; // Schleifenzähler +1

    }
    while ($i < 12);

// Startvariablen neu definieren

	 $i                     = 0;
    $PV_Quote_String       = "";

// echo $i;
// String PV Quote aufbauen und in STRING-Var schreiben
    do
    {
       if (isset($PV_Ertrag_array[$i]['Avg']))
       {
          $PV_Quote         = round((100*$PV_Ertrag_array[$i]['Avg'])/$PV_Soll[$i], 1);
          $PV_Quote_String .= mktime(0,0,0, 1+$i, 1, $year).",".$PV_Quote." ";
//          $PV_Quote_String .= "[Date.UTC(".$year.",".$i.", 1, 00, 00, 00),".$PV_Quote."], ";
          $i++; // Schleifenzähler +1
        }
        else
        {
           $i    = 12;
        }
    }
    while ($i < 12);

// String PV Ertrag Sollwert in String-Var schreiben
setValueString($PV_Quote_monatlich_id , $PV_Quote_String);

echo $year;
echo $PV_Quote_String;

?>

und es wirf folgende Fehler:

Notice: Undefined offset: 1 in C:\IP-Symcon\scripts\21571.ips.php on line 46

Notice: Undefined offset: 2 in C:\IP-Symcon\scripts\21571.ips.php on line 46

Notice: Undefined offset: 3 in C:\IP-Symcon\scripts\21571.ips.php on line 46

Notice: Undefined offset: 4 in C:\IP-Symcon\scripts\21571.ips.php on line 46

Notice: Undefined offset: 5 in C:\IP-Symcon\scripts\21571.ips.php on line 46

Notice: Undefined offset: 6 in C:\IP-Symcon\scripts\21571.ips.php on line 46

Notice: Undefined offset: 7 in C:\IP-Symcon\scripts\21571.ips.php on line 46

Notice: Undefined offset: 8 in C:\IP-Symcon\scripts\21571.ips.php on line 46

Notice: Undefined offset: 9 in C:\IP-Symcon\scripts\21571.ips.php on line 46

Notice: Undefined offset: 10 in C:\IP-Symcon\scripts\21571.ips.php on line 46

Notice: Undefined offset: 11 in C:\IP-Symcon\scripts\21571.ips.php on line 46

Warning: Division by zero in C:\IP-Symcon\scripts\21571.ips.php on line 64

Warning: Division by zero in C:\IP-Symcon\scripts\21571.ips.php on line 64

Warning: Division by zero in C:\IP-Symcon\scripts\21571.ips.php on line 64

Warning: Division by zero in C:\IP-Symcon\scripts\21571.ips.php on line 64
die Ausgabe vom Quoten-String gibt dies aus:
1325372400,130.4 1328050800,0 1330556400,0 1333231200,0 1335823200,0

Mich wundert zusätzlich, dass in Deinem Screenshot ein Januar 2013 auftaucht. Das habe ich bei mir auch und weiß nicht wieso. Ich dachte es läge an mir. :rolleyes:
Definiert ist doch nur:

    // Zeitraum welcher dargestellt werden soll (kann durch die Zeitvorgaben in den Serien verändert werden)
    $CfgDaten["StartTime"] = mktime(0,0,0,1,1, $year); // ab heute 00:00 Uhr
    $CfgDaten["EndTime"] = mktime(23,59,59, 12, 31, $year); // ab heute 23:59 Uhr, oder //$CfgDaten["EndTime"] = time();   // = bis jetzt

probier mal das hier aus:


<?
/*
    Funktion: Berechnung der monatlichen (Ertrags-)Quote einer PV-Anlage in %.
    Quote = (100*Ertrag)/Soll

    Ertrag = von der PV-Anlage erzeugte elektr. Arbeit in Kwh
    Soll = erwartete elektr. Arbeit pro Monat
*/


// +++ Konfig / Vorgaben +++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Auswertungszeitraum

    $year                  = 2012; //GetValue(28289 /*[Scripte\Highcharts_V2.00\PV-Anlage pro Monat\Dummy Module\Highcharts_Jahre]*/ ); // Berechnungen für welches Jahr? -> Wert ggf durch date("Y",time()) ersetzen
    $ts                    = mktime(0,0,0, 1,1, $year); // ab 01.01.$year 0:00:00 Uhr
    $te                    = mktime(23,59,59, 12, 31, $year); // bis 31.12.$year 23:59:59 Uhr

// Definition der Variablen-ID's
    $PV_Quote_monatlich_id = 54120  /*[z01 Test Temp\HC PV Beispiel honk\Quote]*/; // Ziel-Variable für HC-Data-String "Quote"
    $PV_Ertrag_id          = 12130 /*[Program\SMA Webbox\Ertrag täglich (Zähler)]*/ ; // Variablen-ID der geloggten PV Ertragsdaten
    $PV_Soll_raw         = getValueString(49380 /*[Program\SMA Webbox\Sollwerte Monate]*/ ); // Var-ID, in der die PV-Solldaten (HC-String) liegen

// +++ Konfig / Vorgaben  Ende +++++++++++++++++++++++++++++++++++++++++++++++++


// Archive Handler, geloggte Daten auslesen
    $archiveID             = IPS_GetInstanceIDByName("Archive Handler", 0);   // Archive-Handler-ID
    $PV_Ertrag_array       = AC_GetAggregatedValues($archiveID, $PV_Ertrag_id, 3, $ts, $te, 12);
   //print_r($PV_Ertrag_array);
   	
// Array-Daten formatieren
    $PV_Soll_raw         	= explode(" ", $PV_Soll_raw);
    for($i=0;$i<count($PV_Soll_raw)-1;$i++)
    {
    	$PV_Soll_array[$i]         = explode(",", $PV_Soll_raw[$i]);
    	$PV_Soll_array[$i][]       = date("d.m.Y H:i", $PV_Soll_array[$i][0]);
	}
	
// String PV Quote aufbauen und in STRING-Var schreiben
   $PV_Quote_String = "";
   
    for($i=0;$i <= count($PV_Ertrag_array); $i++)
    {
         if (isset($PV_Ertrag_array[$i]['Avg']) >0)
         {
          $PV_Quote         = round((100*$PV_Ertrag_array[$i]['Avg'])/ $PV_Soll_array[$i][1], 1);
          $PV_Quote_String .= mktime(0,0,0, date("m",$PV_Ertrag_array[$i]['TimeStamp']), 1, date("Y",$PV_Ertrag_array[$i]['TimeStamp'])).",".$PV_Quote." ";
          //Debug:
          //echo "#$i, Array: ".$PV_Ertrag_array[$i]['Avg'].", $PV_Quote
";

        }
        
    }

// String PV Ertrag Sollwert in String-Var schreiben
setValueString($PV_Quote_monatlich_id , $PV_Quote_String);

//echo $year;
//echo $PV_Quote_String;

?>

-> „Januar2013“

das kommt vielleicht daher, da ich bei der Festlegung von Start und Endzeitpunkt der X-Achse um 5 Minuten hinzu-zähle bzw. ab-ziehe.
Da der Endwerte auf 23:59 festgelegt ist wird dadurch ein Wert im Januar 2013 generiert.
Einfach den Max etwas korrigieren… -> z.B. 23:50

Gemacht habe ich dass, da sonst der Start oder Endzeitpunkt der Achse nicht korrekt dargestellt wurde.
Kann sein dass das Problem mit dem akt. Highcharts bereits behoben ist. Werde ich mal testen.

Aus meinem HC Script heraus kommen komische Variablen.
Ein print_r($rawData); liefert

Array
(
[0] => 1325372400,148.78
[1] => 1328050800,229.04
[2] => 1330556400,369.71
[3] => 1333231200,435.38
[4] => 1335823200,484.43
[5] => 1338501600,475.92
[6] => 1341093600,486.46
[7] => 1343772000,460.92
[8] => 1346450400,384.3
[9] => 1349042400,290.66
[10] => 1351724400,176.75
[11] => 1354316400,111.48
[12] =>
)

Ein print_r($quote_data); liefert

Array
(
[0] => Array
(
[TimeStamp] => 1325372400
[Value] => 148.78
[human_date] => 01.01.2012 00:00
)

[1] =&gt; Array
    (
        [TimeStamp] =&gt; 1328050800
        [Value] =&gt; 229.04
        [human_date] =&gt; 01.02.2012 00:00
    )
[2] =&gt; Array
    (
        [TimeStamp] =&gt; 1330556400
        [Value] =&gt; 369.71
        [human_date] =&gt; 01.03.2012 00:00
    )
[3] =&gt; Array
    (
        [TimeStamp] =&gt; 1333231200
        [Value] =&gt; 435.38
        [human_date] =&gt; 01.04.2012 00:00
    )
[4] =&gt; Array
    (
        [TimeStamp] =&gt; 1335823200
        [Value] =&gt; 484.43
        [human_date] =&gt; 01.05.2012 00:00
    )
[5] =&gt; Array
    (
        [TimeStamp] =&gt; 1338501600
        [Value] =&gt; 475.92
        [human_date] =&gt; 01.06.2012 00:00
    )
[6] =&gt; Array
    (
        [TimeStamp] =&gt; 1341093600
        [Value] =&gt; 486.46
        [human_date] =&gt; 01.07.2012 00:00
    )
[7] =&gt; Array
    (
        [TimeStamp] =&gt; 1343772000
        [Value] =&gt; 460.92
        [human_date] =&gt; 01.08.2012 00:00
    )
[8] =&gt; Array
    (
        [TimeStamp] =&gt; 1346450400
        [Value] =&gt; 384.3
        [human_date] =&gt; 01.09.2012 00:00
    )
[9] =&gt; Array
    (
        [TimeStamp] =&gt; 1349042400
        [Value] =&gt; 290.66
        [human_date] =&gt; 01.10.2012 00:00
    )
[10] =&gt; Array
    (
        [TimeStamp] =&gt; 1351724400
        [Value] =&gt; 176.75
        [human_date] =&gt; 01.11.2012 00:00
    )
[11] =&gt; Array
    (
        [TimeStamp] =&gt; 1354316400
        [Value] =&gt; 111.48
        [human_date] =&gt; 01.12.2012 00:00
    )

)

Ist das nicht das Gleiche?

EDIT: Es wurde zweimal $Solldaten_ID verarbeitet. Ich habe das jetzt korrigiert.

Nicht desto trotz stimmt was nicht. Ein print_r($quote_data); liefert ein

Array
(
[0] => Array
(
[TimeStamp] => 1335823200
[Value] => 99.4
[human_date] => 01.05.2012 00:00
)

[1] =&gt; Array
    (
        [TimeStamp] =&gt; 1333231200
        [Value] =&gt; 203.8
        [human_date] =&gt; 01.04.2012 00:00
    )

[2] =&gt; Array
    (
        [TimeStamp] =&gt; 1330556400
        [Value] =&gt; 111
        [human_date] =&gt; 01.03.2012 00:00
    )

[3] =&gt; Array
    (
        [TimeStamp] =&gt; 1328050800
        [Value] =&gt; 61.7
        [human_date] =&gt; 01.02.2012 00:00
    )

[4] =&gt; Array
    (
        [TimeStamp] =&gt; 1325372400
        [Value] =&gt; 29.9
        [human_date] =&gt; 01.01.2012 00:00
    )

)

Das ist rückwärts chronologisch.

genau, ich hab tatsächlich das falsche Array beim Kopieren erwischt (Gruß an KHC :D)

bau mal diese Zeile nach


// Array-Keys anpassen
    for($i =0;$i<count($Data)-1; $i++)
    {
	   if(isset($Data[$i][0])) {$quote_data[$i]['TimeStamp'] 						= $Data[$i][0];}
	   if(isset($Data[$i][1])) {$quote_data[$i]['Value'] 								= $Data[$i][1];}
	   if(isset($quote_data[$i]['TimeStamp'])) {$quote_data[$i]['human_date'] 	= @date("d.m.Y H:i", ($quote_data[$i]['TimeStamp']));}
    }

ein:


$quote_data = array_reverse($quote_data);

Ok, kein Problem. :slight_smile:
So langsam geht es auf die Zielgerade. Es gibt aktuell noch einen Berechnungsfehler. Nehme ich als Beispiel den Januar 2012. Soll=148,78, Ist=144,7, Quote=29,87 (es müsste aber 97,26 sein).

ok, so ist das wenn man mit fiktiven Daten arbeitet: an der falschen Stelle korrigiert.

nimm mal das „array_reverse“ aus dem Config-Chart wieder raus.
der fehler war in der Quotenberechnung, das Ertrags-Array muss reverse sortiert werden.
hier das angepasste script:


<?
/*
    Funktion: Berechnung der monatlichen (Ertrags-)Quote einer PV-Anlage in %.
    Quote = (100*Ertrag)/Soll

    Ertrag = von der PV-Anlage erzeugte elektr. Arbeit in Kwh
    Soll = erwartete elektr. Arbeit pro Monat
*/


// +++ Konfig / Vorgaben +++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Auswertungszeitraum

    $year                  = 2012; //GetValue(28289 /*[Objekt #28289 existiert nicht]*/ ); // Berechnungen für welches Jahr? -> Wert ggf durch date("Y",time()) ersetzen
    $ts                    = mktime(0,0,0, 1,1, $year); // ab 01.01.$year 0:00:00 Uhr
    $te                    = mktime(23,59,59, 12, 31, $year); // bis 31.12.$year 23:59:59 Uhr

// Definition der Variablen-ID's
    $PV_Quote_monatlich_id = 54120 /*[z01 Test Temp\HC PV Beispiel honk\Quote]*/ ; // Ziel-Variable für HC-Data-String "Quote"
    $PV_Ertrag_id          = 12130 /*[Smart Metering\IPS EKM-868\EKM-868 I Hausverteilung\EKM-868 #01 Zentraleinspeisung\Energieverbrauch]*/ ; // Variablen-ID der geloggten PV Ertragsdaten
    $PV_Soll_raw         = getValueString(49380 /*[z01 Test Temp\HC PV Beispiel honk\PV Ertrag Soll monatlich]*/ ); // Var-ID, in der die PV-Solldaten (HC-String) liegen

// +++ Konfig / Vorgaben  Ende +++++++++++++++++++++++++++++++++++++++++++++++++


// Archive Handler, geloggte Daten auslesen
    $archiveID             = IPS_GetInstanceIDByName("Archive Handler", 0);   // Archive-Handler-ID
    $PV_Ertrag_array       = AC_GetAggregatedValues($archiveID, $PV_Ertrag_id, 3, $ts, $te, 12);
    $PV_Ertrag_array       = array_reverse($PV_Ertrag_array);
   //print_r($PV_Ertrag_array);
   	
// Array-Daten formatieren
    $PV_Soll_raw         	= explode(" ", $PV_Soll_raw);
    for($i=0;$i<count($PV_Soll_raw)-1;$i++)
    {
    	$PV_Soll_array[$i]         = explode(",", $PV_Soll_raw[$i]);
    	$PV_Soll_array[$i][]       = date("d.m.Y H:i", $PV_Soll_array[$i][0]);
	}
	//print_r($PV_Soll_array);
	
// String PV Quote aufbauen und in STRING-Var schreiben
   $PV_Quote_String = "";
   
    for($i=0;$i <= count($PV_Ertrag_array); $i++)
    {
         if (isset($PV_Ertrag_array[$i]['Avg']) >0)
         {
          $PV_Quote         = round((100*$PV_Ertrag_array[$i]['Avg'])/ $PV_Soll_array[$i][1], 1);
          $PV_Quote_String .= mktime(0,0,0, date("m",$PV_Ertrag_array[$i]['TimeStamp']), 1, date("Y",$PV_Ertrag_array[$i]['TimeStamp'])).",".$PV_Quote." ";
          //Debug:
          //echo "#$i, Array: ".$PV_Ertrag_array[$i]['Avg'].", $PV_Quote
";

        }
        
    }

// String PV Ertrag Sollwert in String-Var schreiben
setValueString($PV_Quote_monatlich_id , $PV_Quote_String);

//echo $year;
//echo $PV_Quote_String;

?>

Mein Output-Chart sieht auch plausibel aus, sollte also passen-.
aber den nächsten Fehler, den ich dir eingebaut habe, behebste selbst!
:smiley:

Off Topic:

Wußte garnicht das wir kostenlose Programmierer im Forum haben

Da werde ich wohl mal darauf zurückkommen :wink:

das war nicht kostenlos, das war umsonst!
:smiley:

och komm … umsonst klingt so hart. Demnächst kommt die Grillsession. Du bist gerne auf ein saftiges Steak und eiskaltes Bier eingeladen. Ich bin Dir ehrlich sehr dankbar für Deinen Einsatz, weiß aber auch dass ich es HIER nicht so recht zurückgeben kann. Das Angebot steht! Außerdem … auch ich lerne dazu. :wink:
Aktueller Status: sieht super aus! Es gibt nur zwei Dinge. Das eine ist, so befürchte ich, das gleiche was ich schon hatte. Es geht um das Jahr 2011. Ich hatte dort nur einen Ertrag in den Monaten November und Dezember. Ertrag Nov=128,15, Dez=121,39. Die Sollwerte lauten Nov=176,75 und für Dez=111,48. Die errechnete Quote ist 86,13 und 53 %. Das stimmt ja aber nicht! Sie sollten 72,5 und 108,89 % lauten. Wenn ich nun den Ertrag November mit dem Januar matche, dann passt es (Jan Soll 148,78). Für den Dez/Feb analog (Feb Soll 229,04). Genau deshalb hatte ich damals diese if-Geschichte eingebaut (guckst Du hier bzw. hier).
Die zweite Sache ist pure Kosmetik; wie bekomme ich alle drei Werte in ein Label? Wie bekomme ich das Ist über das Soll (Screeshot)?

na ok, so kann man das auch auffassen :smiley: -> Ganz entspannt,
Rest Morgen, ok?

Gerne! Gleiche Stelle, gleiche Welle. :smiley:
1000 DANK!

den lösen wir noch schnell:
1.

2. HighChart-Doku, Stichwort „zIndex“