Q&A Highcharts - Multigraph V1.0

Genau das war das Problem! Besten Dank!

Gruss, Michael

Hi Honk,

hier mal ein Lösungs- Ansatz:

  1. 2 String-Variablen anlegen: 1x für Sollwerte, 1x für Quote-Daten
  2. Script zum Generieren des HC-Data-Strings für Sollwerte anlegen
  3. Script zum generieren des HC-Data-Strings für Quote-Werte anlegen
  4. Data-String in HC-Config-Script einfügen

Script HC-Data-String Sollwerte (Script 1x am 01.01. laufen lassen)


<?

// +++ 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 => 148.78/2, 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 = 0

// String PV Ertrag Sollwert aufbauen
	do
	{

		$PV_Soll_String .= "[Date.UTC(".$year.",".$i.", 1, 00, 00, 00),".$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);

?>

Script HC-Data-String Ertragswerte (Script 1x täglich oder monatlich laufen lassen)


<?
/*
	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;                                        	// 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;                                           		// Variablen-ID der geloggten PV Ertragsdaten
	$PV_Soll_array                   = getValueString(49380);                        // 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();

// 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                 = "";


// 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], 0);
				$PV_Quote_String .= "[Date.UTC(".$year.",".$i.", 1, 00, 00, 00),".$PV_Quote."], ";
				$i++; // Schleifenzähler +1
		}
		else
		{

		   $i	= 12;
		}
	}
	while ($i < 12);

	//echo $PV_Quote_String;

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

?>

Data-Strings in HC-Config-Chart einfügen (nicht vergessen, die Var-ID’s für $PV_Ertrag_Soll und $PV_Quote oben im Sript zu deklarieren)


yAxis: [	%yAxis% ],
            series: [ %data%
							{name: 'PV Ertrag (Soll)', type:'column', yAxis: 0, visible: true, color: '#A5A5A5', shadow: true, lineWidth: 1, showInLegend: true, enableMouseTracking: true,
								states: {hover:{lineWidth: 1}},dashStyle: 'shortdot', marker: { enabled: true, states: { hover: { enabled: false, radius: 4}}},
								data:[$PV_Ertrag_Soll]
							},
							{name: 'Quote', type:'line', Unit: '%', yAxis: 1, visible: true, color: '#C00000', shadow: true, lineWidth: 0, showInLegend: true, enableMouseTracking: true,
								states: {hover:{lineWidth: 1}}, marker: { enabled: true, states: { hover: { enabled: false, radius: 4}}},
								data:[$PV_Quote]
							},
							 ]

die beiden Data-Strings werden in den Config-String (ganz unten) im HC-Config-Script reinkopiert, $CfgDaten[„HighChartCfg“] muss true sein!


    // => ab V1.0002
    // HighchartConfig String
    $CfgDaten["HighChartCfg"]= true;  // false = default String wird verwendet

    // Beispiel für ein von extern übergebener CfgString. Dies entspricht exakt dem Highcrats ConfigString aus der Highcharts.com/ref
    // zusätzlich können bzw. teilweise müssen folgenden Platzhalter verwendet werden.
    // %title.text% = $CfgDaten["Title"]
    // %subtitle.text% = CfgDaten["SubTitle"], oder bei "" der automatisch erzeugte Zeitraum
    // %yAxis% = die genierten y-Achsen welche durch $CfgDaten["yAxis"] konfiguriert wurden
    // %tooltip% = der generiert Tooltip
    // %xAxis.min% und %xAxis.may% = der durch $CfgDaten["StartTime"] und $CfgDaten["EndTime"] festgelegte Zeitraum
    // %data% = die aus der Datenbank gelesenen Daten, ohne diesen Platzhalter läuft gar nichts
	$CfgDaten["HighChartCfg"]="
  :
  :
                      yAxis: [	%yAxis% ],
                               series: [ %data%
                        => ab hier die Data-Series einkopieren

Am Ende kann das dann so aussehen:

WOW!! 1000 Dank schon mal. Das sieht so aus als wenn es perfekt passt.
Ich probiere es direkt mal aus.

EDIT: Leider erhalte ich ein

Notice: Undefined variable: PV_Ertrag_Soll in C:\IP-Symcon\scripts\40055.ips.php on line 281

Notice: Undefined variable: PV_Quote in C:\IP-Symcon\scripts\40055.ips.php on line 283

EDIT2: Es liegt sicher daran:

Data-Strings in HC-Config-Chart einfügen (nicht vergessen, die Var-ID’s für $PV_Ertrag_Soll und $PV_Quote oben im Sript zu deklarieren)
ich weiß jedoch nicht genau, was Du damit meinst.

Ich habe eine Frage zu Deiner Lösung: Was ist mit den Folgejahren?
Muss ich jeweils zum 01.01. eines Folgejahres beide Scripte anpassen? Wie wirkt sich das dann im Highcharts Graph aus, wenn ich das letzte Jahr betrachten möchte?

EDIT: Zur Erklärung; ich habe mein HC Config ein wenig gemoddet

<?php

	// => ab V1.0004, damit kann der Script auch von anderen Scripten aufgerufen werden und bereits mit CfgDaten vorkonfiguriert werden
	Global $CfgDaten; //$CfgDaten = array();

	// Überschriften
	$CfgDaten["Title"]= "Photovoltaik-Anlage";
	$CfgDaten["SubTitle"]= ""; // "" = Automatisch über Zeitraum

   // IPS Variablen ID´s
	//$CfgDaten["ArchiveHandlerId"]= 55645 /*[Objekt #55645 existiert nicht]*/; 	// Archive Handler
	// => ab V1.0005, damit kann braucht der ArciveHandler nicht mehr belegt werden
	$CfgDaten["ArchiveHandlerId"] = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}');
	$CfgDaten["ArchiveHandlerId"] = $CfgDaten["ArchiveHandlerId"][0];
	
	$CfgDaten["ContentVarableId"]= 36041 /*[Scripte\Highcharts_V1.0005\PV-Anlage Graphen\PV-Anlage Graphen]*/  ; // ID der Content-Variable
	$CfgDaten["HighChartScriptId"]= 32779 /*[Scripte\Highcharts_V1.0005\Highcharts_V1.0005]*/ ; // ID des Highcharts Scripts

	// Zeitraum welcher dargestellt werden soll
	// $CfgDaten["StartTime"] = mktime(0,0,0, date("m", time()), date("d",time()), date("Y",time())); // ab heute 00:00 Uhr
	// $CfgDaten["EndTime"] = mktime(23,59,59, date("m", time()), date("d",time()), date("Y",time())); // ab heute 23:59 Uhr, oder //$CfgDaten["EndTime"] = time();   // = bis jetzt

	$ZeitRaum = GetValue(26975 /*[Scripte\Highcharts_V1.0005\PV-Anlage Graphen\HC_PV-Anlage\Zeitraum]*/ );
	If ($ZeitRaum == 0) {$ZeitRaum = (8/24);};
	$EndPunkt = GetValue(56205 /*[Scripte\Highcharts_V1.0005\PV-Anlage Graphen\HC_PV-Anlage\HC_PV-Anlage_Endpoint_Graphen]*/ );
	$CfgDaten["EndTime"] = time() + 60 * 60 * 24 * $ZeitRaum * $EndPunkt;
	$CfgDaten["StartTime"] = $CfgDaten["EndTime"] - 60 * 60 * 24 * $ZeitRaum;
.
.
.

wenn Du den Kommentar hier (Auszug aus dem 1. Script):


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

anwendest:


// Auswertungszeitraum 
    $year                            = date("Y",time());

und dann noch mal auf die Überschrift schaust:

Script HC-Data-String Sollwerte (Script 1x am 01.01. laufen lassen)

hast du für jedes Kalenderjahr die aktuellen Daten. Mehr muss nicht angepasst werden

Wie wirkt sich das dann im Highcharts Graph aus, wenn ich das letzte Jahr betrachten möchte?

dann musst du in Script 1 das zu betrachtende Kalenderjahr angeben sowie im HC-Config-Script die $CfgDaten[„StartTime“] und $CfgDaten[„EndTime“] anpassen

damit ist gemeint, das den beiden genannten Variablen (die in den Data-Strings enthalten sind) zuvor Werte zugeweisen werden müssen. In diesem Falle müssen die in den String-Vars abgelegten Data-Strings ausgelesen und zugewiesen werden.


$PV_Ertrag_Soll = getValueString(49380 /*[z01 Test Temp\HC PV Beispiel honk\PV Ertrag Soll monatlich]*/ );
$PV_Quote      = getValueString(54120 /*[z01 Test Temp\HC PV Beispiel honk\Quote]*/ );

Ich bin aber mal sowas von beeindruckt!
Ich habe zwar noch diverse Anpassungen machen müssen, aber das war nur Kosmetik. Und über Geschmack lässt sich bekanntlich streiten.
FUNKTIONAL: TOPP! :smiley: :loveips:

vielleicht noch ein paar Worte zum konzeptionellen Ansatz (hätte ich vielleicht oben gleich mit reinpacken sollen):

mir ging es nicht um eine fertige plug-and-play-Lösung, sondern nur um einen Ansatz, wie man

[ul]
a) ausserhalb der IPS-DB Datensätze generiert und in einer HC-konformen Struktur ablegt, sowie

[li]b)um das anschließende Einbinden dieser Datensätze in HC.[/ul]
[/li]
Die Ablage der HC Data-Strings (HC-Data-String = ein komplettes Datensatz-Array für einen vollständigen Graphen im HC, beinhaltet jeweils die x- und y-Daten) habe ich deshalb in String-Variablen ausgelagert, weil sie sich so auch unabhängig vom eigentlichen HC-Config-Script manipulieren lassen (in diesem Beispiel z.B. tägliches Neuberechnen der PV Ertrags-Quote). Weiterhin sind diese Datastrings auch für beliebige andere Diagramme verfügbar.

Die eigentliche Darstellung im HC-Chart ist in der Tat Geschmackssache, das kann jeder nach eígenem Geschmack anpassen. Daher sind diese Parameter auch nicht Bestandteil der oben geposteten Codes.

Es gab eine Unschönheit; ich habe mir zwei Knöpfchen gebaut (DummyModul, Variable mit Profil) mit dem ich durch die Jahre springen kann. Die Jahreszahl gebe ich dann an das HC Script weiter und dieses wiederum zeichnet die Graphen nach Datum/Jahr sortiert. Mit der Quote und den Sollwerten war es aber so, das Soll zum 01.01. als String geschrieben wird mit dem dann aktuellen Jahr. Quote analog dazu, Zeitpunkt beliebig, mit dem dann aktuellen Jahr. Wenn ich nun im WFE das Jahr von 2012 auf 2011 gewechselt hatte, dann kam nur Quatsch heraus, da ja Sollwerte und Quote mit 2012 als Jahr abgelegt wurden.
Das habe ich jetzt so gelöst, dass ich bei Variablenänderung (Jahr) die Scripte Sollwerte und Quote gestartet werden, die sich dann wiederum das Jahr aus der Variable Jahr holen. Das klappt auch soweit (und ich bin mächtig stolz auf mich :wink: ).
Leider scheint es aber ein Bug im „HC-Data-String Ertragswerte“-Script zu geben. Ich hatte im Jahr 2011 nur in den Monaten 11 und 12 Ertrag. Ein

echo $PV_Quote_String;

wirft allerdings ein

[Date.UTC(2011,0, 1, 00, 00, 00),86], [Date.UTC(2011,1, 1, 00, 00, 00),53],
. Das sieht dann entsprechend so aus:

tja, so ist das nunmal, wenn die SPEC nachträglich angepasst oder erweitert wird :wink: Das Script war nicht dafür gedacht, in die Vergangenheit zu gehen. Daher habe ich keine Logik eingebaut, die auf den Zeitraum bezogen vorhandene Daten checkt. Die Array’s sortieren stumpf aufsteigend…:smiley:

Kann man das programatisch abfangen?
Ansonsten versuche ich mich an einer IF/ELSE Lösung. :wink:

EDIT: Toll wäre natürlich wenn man rückwirkend (Zeitstempel) in eine Variable schreiben könnte … LINK

Hallo Axel,
die Zeitauswahl funktioniert super, Danke!.
Um die Graphen bei Änderung der Zeitauswahl automatisch neu zu Zeichnen braucht man nur das Konfig-Script bei Änderung der Variablen HC_Endwert un HC_Zeitraum zu triggern.

Danke und Gruß,
Pierre

Config_trigger.JPG

Hi Pierre,

schon klar, aber ich hab halt knapp 25 Graphen und will das cleverer lösen.

Grüsse, Axel

Wo muss ich denn hier:

<?
/*
    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_V1.0005\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]*/  ; // 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]*/ ); // 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();


// 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       = "";


// 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], 0);
                $PV_Quote_String .= "[Date.UTC(".$year.",".$i.", 1, 00, 00, 00),".$PV_Quote."], ";
                $i++; // Schleifenzähler +1
        }
        else
        {
           $i    = 12;
        }
    }
    while ($i < 12);

 echo $PV_Quote_String;

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

?>

eine if/else Abfrage einbauen, um den String (wie in meinem Fall) erst ab Nov 2011 schreiben zu lassen. Ich weiß, es wäre dann recht statisch, aber damit kann ich gut leben.
Also; wenn $year = 2011, dann schreibe string ab ($year,10, 1, 00, 00, 00) ansonsten (2012,0, 1, 00, 00, 00). Gerne auch als Variablen ($year,$start_monat, 1, 00, 00, 00). :slight_smile:
Ich teste die ganze Zeit hier rum, komme aber nicht an die Lösung. Danke im Voraus.

Ich habe für jeden Graphen eine eigene „Zeitraum“ Leiste, die triggert dann nur den eigenen Graphen. Ist zwar ein wenig aufwendig, geht aber ohne Probleme.

Gruß, Pierre

@all: Keiner eine Idee?
Mit

// Startdefinition Arbeitsvariablen

	 if ($year == 2011)
	 {
	 $i = 10;
	 }
	 else
	 {
	 $i = 0;
    $PV_Soll = array();
    }

wird auf jeden Fall schon mal die richtige Quote berechnet. Aber leider für den String wird

[Date.UTC(2011,0, 1, 00, 00, 00),72.5], [Date.UTC(2011,1, 1, 00, 00, 00),108.9],
erstellt.

Changelog

[ul]
[li]FIX: Sortieren der eingelesen Daten da sonst die aktuellste Highcharts Version 2.2.0 Probleme macht[/li][li]NEU: Je Serie kann ein eigener Zeitbereich vorgeben werden („StartTime“ und „EndTime“)[/li][li]NEU: von @Neon: „Offset“ je Serie, in Verbindung mit eigenem Zeitbereich ist es dadurch möglich die ein und selbe Variable zb. für den akt. Monat und Vormonat gleichzeitig darzustellen[/li][li]NEU: von @Raketenschnecke: Je Serie kann optional über „RoundValue“ festgelegt werden auf wie viele Nachkommastellen gerundet werden soll[/li][li]NEU: von @axelp : Je Serie kann optional über „ScaleFactor“ ein Skalierungsfaktor definiert werden[/li][li]NEU: Konfigurationsmöglichkeiten für SubTitle („SubTitleDateTimeFormat“ und „SubTitleFormat“)[/li][li]NEU: von @Raketenschnecke: Je Serie kann optional über „AggValue“ definiert werden welcher Value (Min, Max oder Avg) im Chart angezeigt wird[/li][li]NEU: von @Raketenschnecke: Integration der Highcharts-PlotBands[/li][li]NEU: Möglichkeit des Aufrufs als WFCPopup und der Darstellung von Highcharts in diesem Fenster.[/li][li]NEU: Jeder Serie können über „Data“ von extern Werte übergeben werden. Dann werden für diese Serie aber keine Werte aus der DB gelesen.[/li][*][/ul]

Changelog

[ul]
[li]FIX: Bugfix von V1.006 (AggType für Zählerwerte und AggregatedValues)
[/li][li]NEU: AggregatedValues können jetzt auch Weeks, Months und Years vorgegeben werden (Achtung! Die Parametrierungssystematik hat sich geändert (Beschreibung siehe Cfg-Script))
[/li][li]NEU: von @Raketenschnecke: Möglichkeit der Farbeinstellung für Achsen
[/li][*][/ul]

Am einfachsten habe ich folgende Vorgehensweise empfunden um die vorhandenen Charts mit der aktuellen Version zum laufen zu bringen.
Dadurch waren bei mir keine zusätzlichen Anpassungen in den Cfg Scripts der einzelnen Charts notwendig.

1.) Sicherheitskopie des aktuellen Highcharts-Scripts
2.) Source aus neuer Version Highcharts V1.0007 Script per Copy & Paste in das über Highcharts - Script kopieren. Dadurch muss nicht in den Cfg Scripten die Highcharts-Id angepasst werden.

Alle neuen Funktionen können ja dann bei Bedarf eingebaut werden.

Viel Spaß
KHC

Funktionieren bei Euch die PIEs noch?
Ich habe nicht verändert und trotzdem wird mir ein PIE nicht mehr angezeigt.

// PIE
	$CfgDaten["Series"][] = array("Id"=>array(52428,21925),
	"Name" =>array("Betriebsstunden","Wärmemenge kWh"),
	"Unit"=>array("h","kWh"),
	"ReplaceValues"=>false,
	"Param" =>"type:'pie',
	center: [200, 100],
	size: 300,
	showInLegend: true,
	shadow: true,
	lineWidth: 1,
	dataLabels: {enabled: false}");