HighCharts auf einem Raspberry

Hallo Leute,

frohe Ostern an Alle.

Ich versuche die HighCharts auf dem Raspberry zu implementieren.
Die IPS Library inkl. HighCharts habe ich bereits erfolgreich installiert.
Leider gibt es im WebFront immer die Meldung „File not found“.
Also vermute ich das ich die Pfadangaben in dem HighCharts Skript ändern muß.
Alle bisherigen Änderungen haben aber nicht zum Erfolg geführt.
Unter Windows gab es hier keine Probleme.
Hat jemand eine Anleitung für Dummys mit der ich die HighCharts auch auf dem Raspberry zum Laufen bekomme.

Vielen Dank!

Gruß

Axel

EDIT: gerade gesehen, dass es hier um die Installation unter der IPS-Library geht, daher passt meine Antwort vielleicht doch nicht so ganz. Aber ich lasse es mal so stehen - vielleicht hilft es dem einen oder anderen ja vielleicht …

Hallo Axel,
bei mir läuft Highcharts inzwischen auf dem Raspberry. Aus der Erinnerung kurz ein paar Schritte, die ich durchgeführt habe:

(1) Unter „/usr/share/symcon/webfront/user“ das File „IPS-Highcharts.php“ ablegen:
/usr/share/symcon/webfront/user/IPS-Highcharts.php
(der Pfad auf dieses Skript ist in dem Skript „Highcharts_V3.00“ hardcodiert)

(2) Außerdem von highcharts.com das Highcharts-Paket runterladen, und so entpacken, dass es
unter „/usr/share/symcon/webfront/user“ folgendermaßen erscheint:
/usr/share/symcon/webfront/user/Highcharts/

In diesem Verzeichnis sollten dann die mitgelieferten Unterverzeichnisse/Files folgendermaßen erscheinen:
-> api
-> examples
-> exporting-server
-> gfx
-> graphics
-> index.htm
-> js

(3) In der IPS-Konsole habe ich dann folgende Objekte angelegt:

  • Das Skript „Highcharts_V3.00“ habe ich bei mir in einen zentralen Skripte-Ordner abgelegt
  • Die String-Variable (Typ HTML-Box) und darunterliegend das Konfigurationsscript braucht man (soweit ich es bisher verstanden habe) pro Diagramm einmal. Ich hab’s zum Beispiel in meine Kategorie „Keller->Hausanschlussraum->Stromzaehler“ abgelegt und das Konfigfile enstprechend angepasst.

(4) Speziell beim Raspberry musste ich dann noch folgende Änderungen im Script „Highcharts_V3.00“ durchführen:

  • In allen Funktionen, in denen „$_IPS“ auftaucht, am Anfang der Funktion ein „global $_IPS;“ ergänzen. In der Funktion „Check_ContentVariable“ habe ich dann noch folgendes angepasst:

// if ($variable[‚VariableValue‘][‚ValueType‘] != 3)
if ($variable[‚VariableType‘] != 3)

Damit habe ich es dann irgendwann zum Laufen bekommen.

Gruß
Peter

Super Anleitung. Ich bin auch gerade unter OSX dabei, mich vorzuhangeln und das hilft mir doch sehr, die eine oder andere Hürde nicht selbst nehmen zu müssen. Danke

Irgendwie habe ich wohl seit HighCharts 2.02 nichts mehr gemacht und das rächt sich nun.

Ich hab die Sachen soweit umgesetzt aber wie und wo wird denn nun in der Config die ID einer ContentVariablen (String/HTML-Box) zugeordnet?

Irgendwie finde ich nur Config-Beispiele ohne diesen Eintrag und wie kann ich dann meiner Variablen die Grafik zuweisen.

Mhmmmm :eek:

Im Config-Script gibt es die Zeile

$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)

Wenn Du also das Config-Script unter die Content-Variable hängst, funktioniert es ohne Änderung. Wenn Du das Skript irgendwo anders ablegst, gibt Du hier statt „-1“ die ID der Content-Variablen an.

Das originale Config-Script findest Du auf der Seite Highcharts - Multigraph - erster Beitrag, Download unter den Bildern (Highcharts_V3.00.rar).

wie kann ich dann meiner Variablen die Grafik zuweisen.

Deine Variable (HTMLBox) ist Deine Grafik und taucht dann in der WebFront auf (sofern sichtbar gemacht)
Gruß
Peter

Danke für die Antwort.

Das Problem war deutlich einfacher, denn ich hatte einfach drei falsche Konfig-Dateien. Alle wohl nur kastrierte Beispiele. Grrrrhhhh.

Ich hatte auch in Deinen Link geschaut (hatte ich selbst schon gesucht und gefunden) - aber nun auch mal ganz nach unten gescrollt und endlich auch alles passende gefunden. Hast mich auf den richtigen Weg gebracht. :wink:

So, läuft nun auch unter OSX richtig. Nur das mit den fehlenden Umlauten ist nervig.

Du kannst die Umlaute mit UTF-8 codieren. Also so:
$CfgDaten[‚title‘][‚text‘] = „Elektrische Leistung \u00e4 \u00f6 \u00fc“;
Dann wird im Webfront angezeigt: „Elektrische Leistung ä ö ü“

Gruß
Peter

Ok, ne Notlösung wäre es. Danke.

Hi Peter,

VIELEN DANK - FUNKTIONIERT AUCH AUF dem Windows V4 IPS !!!

herbertf

Hallo Leute,

Ich verwende schon seit einiger Zeit die Highchart-Skripte von khc https://www.symcon.de/forum/threads/17625-Highcharts-Multigraph?p=120721#post120721
Konkret bin ich noch auf der V2.02. Auf Windows IPS4.0 hat alles prima geklappt. Ich schaffe es einfach nicht die Highcharts auf dem PI zum Laufen zu bringen. Bekomme immer wieder den Fehler:

File not found

Ich habe jetzt den Ordner (C:\IP-Symcon\webfront\user\Highcharts) mit seinem gesamten Inhalt

  • Ordner „examples“
  • Ordner „exporting-server“
  • Ordner „gfx“
  • Ordner „graphics“
  • Ordner „js“
  • Datei index.htm
  • Datei IPS_Template.php

nach

/usr/share/symcon/webfront/user/

kopiert. Leider immer wieder der Fehler „File not found“.
Ich habe also versucht auf dem Windows IPS4.0 auch diesen Fehler zu produzieren und habe durch umbenennen der Datei C:\IP-Symcon\webfront\user\Highcharts\IPS_Template.php genau den selben Fehler erreicht. Also, dachte ich, es könnten Rechte-Probleme sein. Habe auf dem PI genau dieser Datei mit

chmod 777

die Rechte erweitert. Leider ohne Erfolg. Hat jemand vielleicht die khc-Skripte schon auf nem PI am Laufen :confused:

Schon mal in den Scripten Slash und Backslash - oder umgekehrt - getauscht?

Ok … ich habe die Stellen gefunden und im Code kommentiert:

„/usr/share/symcon/scripts/Highcharts_V2.02.ips“

	function GetContentVariableString($cfg, $callBy, $callIdent)
	{
		$chartType = $cfg['Ips']['ChartType'];
		$height = $cfg['HighChart']['Height'] + 16;

		if (isset($cfg['Ips']['Dashboard']['Ip']) && isset($cfg['Ips']['Dashboard']['Port']))
		{
			$s = "http://" . $cfg['Ips']['Dashboard']['Ip'] . ":" . $cfg['Ips']['Dashboard']['Port'] .
#				"/User/$chartType/IPS_Template.php?$callBy="	. $callIdent . " " .                         # --- für Windows ---
				"/user/$chartType/IPS_Template.php?$callBy="	. $callIdent . " " .                         # --- für Linux ---
				"width='100%' height='". $height ."' frameborder='1' scrolling='no'";
		}
		else
		{
#			$s = "<iframe src='./User/$chartType/IPS_Template.php?$callBy="	. $callIdent . "' " .      # --- für Windows ---
			$s = "<iframe src='./user/$chartType/IPS_Template.php?$callBy="	. $callIdent . "' " .      # --- für Linux ---
				"width='100%' height='". $height ."' frameborder='0' scrolling='no'></iframe>";
		}
		return $s;
	}

„/usr/share/symcon/webfront/user/Highcharts/IPS_Template.php“

	// ScriptId wurde übergeben -> aktuelle Daten werden geholt
	if ($iScriptId != false)
	{
		$ConfigScript=IPS_GetScript($iScriptId);      // Id des Config Scripts
	
#		include_once(IPS_GetKernelDir() . "scripts\\" .$ConfigScript['ScriptFile']);	        # --- Windows ---	
		include_once(IPS_GetKernelDir() . "scripts/" .$ConfigScript['ScriptFile']);		# --- Linux ---
		global $sConfig;
		//$sConfig = IPS_RunScriptWait($iScriptId);
		$s = utf8_encode($sConfig);	
		
	}

Danach muss das Konfig-Skript für den jeweiligen Chart ausgeführt werden, damit die ContentVariable (iframe) aktualisiert wird. Es sollte statt „User“ danach „user“ im iframe drinstehen.

so zum Beispiel:

<iframe src='./user/Highcharts/IPS_Template.php?ScriptId=36119' width='100%' height='516' frameborder='0' scrolling='no'></iframe>

Hallo Forum,

ich muss mich mal an dieses ältere Problem dranhängen.

Ich habe auf einen Windows 7 Rechner erfolgreich die Highcharts 3.0.1 unter Symcon 4.0 zum laufen bekommen.
Nun versuche ich schon seit mehreren Tagen diese auf einen Raspberry zum laufen zu bekommen.
Ich habe schon alle Versionen 2.02, 3.0 und 3.01 versucht. Leider ohne Erfolg.
Bei mir wird immer File not found im Webfront angezeigt.

Ich habe echt alle Beiträge dazu durch und keine Idee mehr an was es liegen kann.

@Boui: Was hast du noch anpassen müssen um die Highcharts zum laufen zu bekommen?
Die anderen Tipps haben alle nichts gebracht.

Struktur auf dem Raspberry


IPS-Highchart.php

<?php 

	if (!isset($_GET['ScriptId']))       { 
       echo "Highcharts4IPS Fehler: Aufruf-Parameter 'ScriptId' fehlt";
       return;
  	} 
   	else       { 
   		$iScriptId = (int)$_GET['ScriptId']; 
  	} 
  	
	echo IPS_RunScriptWaitEx($iScriptId, array('getHTML' => true ));

?>

Highcharts_V3.0.1

<?
	$version = "3.01"; $versionDate = "04.05.2014";

	//ToDo:
	//FEATURE: Plotbands. Timestamp in From und To
	//Fehlerquelle: AggType ist "Größer" als der angezeigte Zeitraum
	// vielleicht alles als cfg direkt json_encoden und nicht jedes Teil einzeln

	//--------------------------------------------------------------------------------------------------------------------------------
	// Für die Darstellung der Graphen wird das HTML5/JS Framework "Highcharts" der Fa. Highslide Software verwendet (www.highcharts.com)
	// Alle Rechte dieses Frameworks liegen bei Highslide Software.
	// 'Highcharts' kann unter folgenden Bedinungen kostenlos eingesetzt werden:
	// 	Namensnennung ? Sie müssen den Namen des Autors/Rechteinhabers in der von ihm festgelegten Weise nennen.
	// 	Keine kommerzielle Nutzung ? Dieses Werk bzw. dieser Inhalt darf nicht für kommerzielle Zwecke verwendet werden.
	// Download: wwww.highcharts.com/download/ ... und die Dateien einfach in das Webfront (Es sollte ein V 2.2 oder höher verwendet werden.
	// Demos: http://www.highcharts.com/demo/
	// API: http://www.highcharts.com/ref/
	//--------------------------------------------------------------------------------------------------------------------------------
	// Changelog:
	//	--- V2.00 ---------------------------------------------------------------------------------------------------------------------
	//	04/2012 		KHC	REFACT   Umfangreiches Überarbeiten der Highchart-Script Funktionen.
	// bis    			            Integration der meisten Original-Highcharts-Options als PHP-Array (siehe http://www.highcharts.com/ref)
	// 05/2012                    Highcharts-Options "lang" aus IPS_Template.php in Highcharts-Script verschoben
	//	--- V2.01 ---------------------------------------------------------------------------------------------------------------------
	// 07.05.2012  KHC   NEU      Test mit Integration Highstock. Neuer Parameter ['Ips']['ChartType'] = 'Highcharts' oder 'Highstock'
	// 07.05.2012  KHC   NEU      IPS_Template.php auf jquery 1.7.2 geändert
	// 07.05.2012  KHC   FIX      krsort durch array_reverse getauscht, da krsort Probleme beim json_encode macht
	// 08.05.2012  KHC   REFACT   intern noch mehr auf Arrays umgestellt und etwas umstrukturiert
	// 09.05.2012  KHC   NEU      über 'CreateConfigFileByPathAndFilename($stringForCfgFile, $path, $filename)' kann eine Tmp_datei mit bel. Namen geschrieben werden
	// 10.05.2012  KHC   FIX      Fehler beim Auswerten der AggregatedValues behoben (ReadDataFromDBAndCreateDataArray)
	// 12.05.2012  KHC   FIX      Tooltip für "ReplaceValues" korrigiert
	// 12.05.2012  KHC   CHANGE   Start- und Endzeitpunkt der X-Achse wurde automatisch um 5 Minuten korrigiert -> dies wurde entfernt
	// 12.05.2012  KHC   NEU      mit ['xAxis']['min']=false und ['xAxis']['min']=false kann festeglegt werden dass Min oder Max nicht autom. festgelegt werden
	//	--- V2.02 ---------------------------------------------------------------------------------------------------------------------
	// 13.05.2012  KHC   FIX      RunType=file: Wenn Highstock vorgewählt wurde wurde das tmp File nicht in die Highstock-Verzeichnis geschrieben
	// 16.05.2012  KHC   NEU      Integration Highstock: ['navigator'], ['rangeSelector'] und ['scrollbar']
	// 18.05.2012  KHC   FIX      Integration Highstock: Zusätzliche series.type 'candlestick' und 'ohlc' erlauben
	// 19.05.2012  KHC   NEU      Neue Parameter ['Ips']['Dashboard'] für die Darstellung im Dashboard
	//	--- V2.03 ---------------------------------------------------------------------------------------------------------------------
	// 01.06.2012  KHC   FIX      In der Konfiguration war es nicht möglich Anführungszeichen zu übergeben -> korrigiert
	// 20.06.2012  KHC   FIX      Wenn keine Daten in ausgelesenen Array kam ein Fehler (Prüfen ob $TempData vorhanden sind)
	// 15.09.2012  KHC   NEU      neue Highcharts Version 2.3.2 -> neue Charttypen zulassen, IPS_Template angepasst
	// 18.09.2013  KHC   FIX      mit IPS3.x (use AC_GetLoggedValuesCompatibility)
	// 19.03.2014  KHC   NEU      Neuer Parameter ['TooltipDateTimeFormat']: Default =
	// --- V3.00 ---------------------------------------------------------------------------------------------------------------------
	// 04/2014  	KHC   NEU      Entfernen der Prüfung des Highcharts-Types --> dadurch alle Highcharts-Charttypen verwendet werden können
	// bis                        ['Ips']['ScriptsHighCharts'],['Ips']['ScriptsHighstock'],['Ips']['ScriptsTheme'], ['Ips']['Scriptsjquery']. Keine Angabe Werte aus Internet
	// 05/2014                    ['Ips']['HtmlScript'] default = leer, dann wird der komplette HtmlCode erzeugt, kann aber auch
	//                            IPS-Highcharts.php ist die neue Template.php (kommt jetzt direkt in Users Verzeichnis) und
	//                            ['HighChart']['AddScrips'][] Array von zusätzlichen Scripten (z.B.: higcharts-3d.js)
	// --- V3.01 ---------------------------------------------------------------------------------------------------------------------
	// 07.05.2014  KHC   NEU      Wenn kein ['RunMode'] definiert wird -> default 'script'
	// 30.05.2014  KHC   NEU      TryToFindContentVariableByLookingHierachyUpstairs
	//--------------------------------------------------------------------------------------------------------------------------------
	// 31.10.2016  KHC   FIX      Umstellung auf 4.0 -> $var['VariableValue']['ValueType'] --> $var['VariableValue']
	// 24.11.2016  KHC   FIX      Probleme mit Umlauten -> mb_detect_encoding an Stelle $item = utf8_encode($item);

   function RunHighcharts($cfg){

		if (isset($_IPS['getHTML'])){
			echo GetFullHtmlString($cfg);
		}
		else if(isset($_IPS['ScriptId'])){
			echo GetDataString($cfg);
		}
		else {
			WriteContent($cfg);
		}
	}

	function GetDataString($cfg){
		DebugModuleName($cfg, "GetDataString");
		if(isset($_IPS['start'])){
				$cfg['AggregatedValues']['WeekValues'] = -1;
				$cfg['StartTime'] = $_IPS['start'] / 1000;
				$cfg['EndTime'] = $_IPS['end'] / 1000;

				$range = $_IPS['end'] - $_IPS['start'];


				// 10 days range loads minute data
				if ($range < 10 * 24 * 3600 * 1000) {
					//alle Werte
				// 2 months range loads hourly data
				} elseif ($range < 2 * 31 * 24 * 3600 * 1000) {
					$cfg['AggregatedValues']['HourValues'] = 0;

				// one year range loads daily data
				} elseif ($range < 15 * 31 * 24 * 3600 * 1000) {
					$cfg['AggregatedValues']['DayValues'] = 0;

				// greater range loads monthly data
				} else {
					$cfg['AggregatedValues']['WeekValues'] = 0;
				}
			}
			$cfg = CheckConfig($cfg);

			$a = ReadDataFromDBAndCreateDataArray($cfg, $cfg['series'][0]);
			$data = my_json_encode($a);
			return $data;
	}

   function GetFullHtmlString($cfg){
		DebugModuleName($cfg, "GetFullHtmlString");

	 	$cfg = CheckConfig($cfg);

		$hcSetOptions = GetHtmlForHighchartsSetOptions($cfg);
		$hcScripts = GetHtmlForScripts($cfg);
		$hcThemes = GetHtmlForTheme($cfg);

		if ($cfg['Ips']['ChartType'] == "Highstock")
			$hcChartType = "StockChart";
		else
			$hcChartType = "Chart";

		$hcHtmlScript = isset($cfg['Ips']['HtmlScript'])
		   ? $cfg['Ips']['HtmlScript']
		   : 	'<script type="text/javascript">
						var chart = new Highcharts.'.$hcChartType.'(%%%%);
					</script>';

		$s = '<html>
			    <head>
			         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
					   '.$hcScripts.'
					   '.$hcThemes.'
						'.$hcSetOptions.'
			    </head>
			    <body>
					<div id="container" style="width: 100%; height: 100%; margin: 0 auto"></div>
					'.$hcHtmlScript.'
			    	</body>
				</html>';

      $pos = strpos($s, "%%%%");
      if ($pos !== false) {
	      $hcRenderOptions = GetHighChartsCfgFile($cfg);
			$s = str_replace("%%%%", $hcRenderOptions, $s);
		}

		return $s;
   }

   function GetHtmlForTheme($cfg){
		DebugModuleName($cfg, "GetHtmlForTheme");

		if (!isset($cfg['HighChart']['Theme']))
		   return "";

		$path = isset($cfg['Ips']['ScriptsTheme'])
		   ? $path = $cfg['Ips']['ScriptsTheme'] . '/' . $cfg['HighChart']['Theme']
		   : $path = 'http://code.highcharts.com/themes/' . $cfg['HighChart']['Theme'];

		return '<script type="text/javascript" src="' . $path . '"></script>';
	}

	function GetHtmlForScripts($cfg){
		DebugModuleName($cfg, "GetHtmlForScripts");

		$s = isset($cfg['Ips']['Scriptsjquery'])
			   ? GenerateScriptLineBy ($cfg['Ips']['Scriptsjquery'] ."/" , 'jquery.min.js')
			   : GenerateScriptLineBy ('http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/' , 'jquery.min.js');

		if ($cfg['Ips']['ChartType'] == 'Highcharts'){

		   $path = isset($cfg['Ips']['ScriptsHighCharts'])
		      ? $cfg['Ips']['ScriptsHighCharts'] . "/"
		      : "http://code.highcharts.com/";

			$s .= GenerateScriptLineBy($path, 'highcharts.js');
			$s .= GenerateScriptLineBy($path, 'highcharts-more.js');

			if (isset($cfg['HighChart']['AddScrips'])){
				foreach($cfg['HighChart']['AddScrips'] as $script){
					$s .= GenerateScriptLineBy($path, $script);
				}
			}

			if (isset($cfg['chart']['options3d']))
				$s .= GenerateScriptLineBy($path, 'highcharts-3d.js');

			if (isset($cfg['exporting']) && $cfg['exporting']['enabled'] == true)
				$s .= GenerateScriptLineBy($path, 'modules/exporting.js');

		}
		else if ($cfg['Ips']['ChartType'] == 'Highstock'){

			$path = isset($cfg['Ips']['ScriptsHighstock'])
		      ? $cfg['Ips']['ScriptsHighstock'] . "/"
		      : "http://code.highcharts.com/stock/";

			$s .= GenerateScriptLineBy($path, 'highstock.js');
			$s .= GenerateScriptLineBy($path, 'highcharts-more.js');
			if (isset($cfg['exporting']) && $cfg['exporting']['enabled'] == true)
				$s .= GenerateScriptLineBy($path, 'modules/exporting.js');
		}

		return $s ;
	}

	function GenerateScriptLineBy($path, $scriptName){
		return '<script type="text/javascript" src="' . $path . $scriptName . '"></script>';
	}


	function WriteContent($cfg){
		DebugModuleName($cfg, "WriteContent");

		$cfg = CheckConfig($cfg);

		if (WriteContentForScript($cfg))
			return;

		if (PopupContent($cfg))
			return;

		if (WriteFileAndSetContent($cfg))
			return;

		if (WriteContentForDashboard($cfg))
			return;

	}

	function CreateContentString($cfg, $fullfilename){
	   return "<iframe src='$fullfilename' " .
					" width=". $cfg["HighChart"]["Width"] .
					" height=". $cfg["HighChart"]["Height"] .
					" frameborder='0' scrolling='no' ></iframe>";
	}

	function CreateFilenameForContentString($filename, $paramter = false){
	   $s = "./user/" . $filename;
	   if ($paramter != false)
			$s .= "?$paramter";
		return $s;
	}

	function WriteContentForDashboard($cfg){
	   DebugModuleName($cfg, "WriteContentForDashboard");

		if (isset($cfg['Ips']['Dashboard']['Ip']) && isset($cfg['Ips']['Dashboard']['Port'])){

			$scriptId = $_IPS['SELF'];

			$s = "http://" . $cfg['Ips']['Dashboard']['Ip'] . ":" . $cfg['Ips']['Dashboard']['Port'] .
				"/user/IPS-Highcharts.php?ScriptId=$scriptId " .
				" width=". $cfg["HighChart"]["Width"] .
				" height=". $cfg["HighChart"]["Height"] + 16 .
				" ' frameborder='1' scrolling='no'";

			SetValueString($cfg['ContentVarableId'], $s);
			return true;
		}
	}

	function WriteFileAndSetContent($cfg){
	   DebugModuleName($cfg, "WriteFileAndSetContent");
		if ($cfg['RunMode'] == "file"){

         $scriptId = $_IPS['SELF'];
			$filename = CreateNewHighchartsFile(GetFullHtmlString($cfg), $scriptId);
			$fullfilename = CreateFilenameForContentString($filename);

			$s = CreateContentString($cfg, $fullfilename);

			SetValueString($cfg['ContentVarableId'], $s);

			return true;
		}
	}

	function WriteContentForScript($cfg){
	   DebugModuleName($cfg, "WriteContentForScript");
		if ($cfg['RunMode'] == "script"){

         $scriptId = $_IPS['SELF'];
			$fullfilename = CreateFilenameForContentString("IPS-Highcharts.php", "ScriptId=$scriptId");

			$s = CreateContentString($cfg, $fullfilename);

			SetValueString($cfg['ContentVarableId'], $s);

			return true;
		}
	}

	function PopupContent($cfg){
	   DebugModuleName($cfg, "PopupContent");
		if ($cfg['RunMode'] == "popup"){

			$scriptId = $_IPS['SELF'];
			$fullfilename = CreateFilenameForContentString("IPS-Highcharts.php", "ScriptId=$scriptId");

			$s = CreateContentString($cfg, $fullfilename);

			WFC_SendPopup($cfg['WebFrontConfigId'],
					$cfg['WFCPopupTitle'],
					$s);

			return true;
		}
	}

	function CreateNewHighchartsFile($s, $scriptId)
	{
		$filename =  "IPS-Highcharts" . "-ScriptId_$scriptId.html";

		// Standard-Dateiname .....
		$fullFilename = IPS_GetKernelDir() . "webfront\user\\" . $filename;

		// schreiben der Daten
		$handle = fopen($fullFilename, "w");
		fwrite($handle, $s);
		fclose($handle);

		return $filename;
	}

	// ------------------------------------------------------------------------
	// CheckConfig
	//    Aufruf bei jedem Cfg-Start
	//    IN: $cfg = ..
	//    OUT: korrigierte cfg
	// ------------------------------------------------------------------------
	function CheckConfig($cfg){

		DebugModuleName($cfg, "CheckConfig");

		$cfg = CheckCfgDaten($cfg);
		$cfg = CompatibilityCheck($cfg);
		$cfg = CheckAndCompleteConfig($cfg);
		return $cfg;
	}

 	function CheckCfgDaten($cfg)	{

      DebugModuleName($cfg, "CheckCfgDaten");

		// Debugging
		IfNotIssetSetValue($cfg['Ips']['Debug']['Modules'], 			false);
		IfNotIssetSetValue($cfg['Ips']['Debug']['ShowJSON'], 			false);
		IfNotIssetSetValue($cfg['Ips']['Debug']['ShowJSON_Data'], 	false);
		IfNotIssetSetValue($cfg['Ips']['Debug']['ShowCfg'], 			false);

		// ChartType
		IfNotIssetSetValue($cfg['Ips']['ChartType'],						'Highcharts');

   	if (!in_array($cfg['Ips']['ChartType'], array("Highcharts", "Highstock")))
		   die ("Abbruch! Für ChartType sind nur folgende Möglichkeiten zulässig: Highcharts, Highstock");

		// RunMode
		IfNotIssetSetValue($cfg['RunMode'], 								"script");

   	if (!in_array($cfg['RunMode'], array("script", "file", "popup")))
		   die ("Abbruch! Für RunMode sind nur folgende Möglichkeiten zulässig: Script, File, Popup");

		if ($_IPS['SENDER'] != "WebInterface" && $cfg['RunMode'] != "popup")
			$cfg = Check_ContentVariable($cfg, $_IPS['SELF']);

	   return $cfg;
	}

	function CompatibilityCheck($cfg)	{

		DebugModuleName($cfg,"CompatibilityCheck");

		// Series
		if (isset($cfg['Series']) && isset($cfg['series']))
			die ("Abbruch - Es düfen nicht gleichzeitig 'Series' und 'series' definiert werden.");
		if (isset($cfg['Series']) && !isset($cfg['series']))
			$cfg['series'] = $cfg['Series'];
		unset ($cfg['Series']);

		// Title
		if (isset($cfg['Title']) && !isset($cfg['title']['text']))
			$cfg['title']['text'] = $cfg['Title'];
		unset ($cfg['Title']);

		// SubTitle
		if (isset($cfg['SubTitle']) && !isset($cfg['subtitle']['text']))
			$cfg['subtitle']['text'] = $cfg['SubTitle'];
		unset ($cfg['SubTitle']);

		// SubTitleDateTimeFormat
		if (isset($cfg['SubTitleDateTimeFormat']) && !isset($cfg['subtitle']['Ips']['DateTimeFormat']))
			$cfg['subtitle']['Ips']['DateTimeFormat'] = $cfg['SubTitleDateTimeFormat'];
		unset ($cfg['SubTitleDateTimeFormat']);

		// yAxis
		if (isset($cfg['yAxis']))
		{
			$axisArr = array();
			foreach ($cfg['yAxis'] as $Axis)
			{
				$cfgAxis = $Axis;

				// Name
				if (isset($Axis['Name']) && !isset($cfgAxis['title']['text']))
					$cfgAxis['title']['text'] = $Axis['Name'];
				unset ($cfgAxis['Name']);

				// TickInterval
				if (isset($Axis['TickInterval']) && !isset($cfgAxis['tickinterval']))
						$cfgAxis['tickinterval'] = $Axis['TickInterval'];
				unset ($cfgAxis['TickInterval']);

				// Opposite
				if (isset($Axis['Opposite']) && !isset($cfgAxis['opposite']))
						$cfgAxis['opposite'] = $Axis['Opposite'];
				unset ($cfgAxis['Opposite']);

	      	$axisArr[] = $cfgAxis;
			}
	      $cfg['yAxis'] = $axisArr;
		}

		// ips Theme
		if (isset($cfg['HighChart']['Theme'])
			&& $cfg['HighChart']['Theme'] == "ips.js"
			&& !isset($cfg['Ips']['ScriptsTheme'])){
			   $cfg['Ips']['ScriptsTheme'] = "Highcharts/js/themes";
		}

  		return $cfg;
	}

	// ------------------------------------------------------------------------
	// CheckCfg
	//    Prüft die Konfiguration und korrigiert und Vervollständigtdiese zum Teil
	//    IN: $cfg = ..
	//    OUT: der erzeugte Config String
	// ------------------------------------------------------------------------
	function CheckAndCompleteConfig($cfg) 	{

		DebugModuleName($cfg, "CheckCfg");

		$cfg = CheckCfg_Common($cfg);
		$cfg = CheckCfg_AreaHighChart($cfg);
		$cfg = CheckCfg_AggregatedValues($cfg);
  		$cfg = CheckCfg_StartEndTime($cfg);
  		$cfg = CheckCfg_Series($cfg);

  		return $cfg;
	}

	// ------------------------------------------------------------------------
	// CheckCfg_Common
	//    wenn RunMode=Popup, prüfen der dazugehörigen Daten wie WebfrontConfigId, usw.
	//		und wenn RunMode=Popup, prüfen der dazugehörigen Daten wie WebfrontConfigId, usw.
	//    IN: $cfg
	//    OUT: korrigiertes $cfg
	// ------------------------------------------------------------------------
	function CheckCfg_Common($cfg)
 	{
      DebugModuleName($cfg,"CheckCfg_Common");

		if (!isset($cfg['series']))
			die ("Abbruch - Es wurden keine Serien definiert.");

		// Id des ArchiveHandler auslesen
		if (!isset($cfg['ArchiveHandlerId']) || $cfg['ArchiveHandlerId'] == -1)
		{
      	$instances = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}');
			$cfg['ArchiveHandlerId'] = $instances[0];
		}
		// Prüfen des ArchiveHandlers
		$instance = @IPS_GetInstance($cfg['ArchiveHandlerId']);
		if ($instance['ModuleInfo']['ModuleID'] != "{43192F0B-135B-4CE7-A0A7-1475603F3060}")
			die ("Abbruch - 'ArchiveHandlerId' (".$cfg['ArchiveHandlerId'].") ist keine Instance eines ArchiveHandler.");

		if ($cfg['RunMode'] == "popup")
		{
			// keine Webfront Id
			if (!isset($cfg['WebFrontConfigId']))
				die ("Abbruch - Konfiguration von 'WebFrontConfigId' fehlt.");

			// prüfen ob die übergebene Id ein WebFront ist
			$instance = @IPS_GetInstance($cfg['WebFrontConfigId']);
			if ($instance['ModuleInfo']['ModuleID'] != "{3565B1F2-8F7B-4311-A4B6-1BF1D868F39E}")
				die ("Abbruch - 'WebFrontConfigId' ist keine WebFrontId");

			IfNotIssetSetValue($cfg['WFCPopupTitle'], "");
		}

		// wenn der Tooltipformater genutz wird kann damit das Format des DateTime festgelegt werden
		IfNotIssetSetValue($cfg['TooltipDateTimeFormat'], "%A %d.%m.%Y %H:%M");

	   return $cfg;
	}


	// ------------------------------------------------------------------------
	// Check_ContentVariable
	//    prüfen ob Angaben der Content Variable stimmen oder ob es das übergeordnete Element ist
	//    IN: $cfg
	//    OUT: korrigiertes $cfg
	// ------------------------------------------------------------------------
	function Check_ContentVariable($cfg, $scriptId)
	{
	   DebugModuleName($cfg,"Check_ContentVariable");

		// wenn keine Id übergeben wurde wird das übergeordnete Objekt als Content verwendet
		if (!isset($cfg['ContentVarableId']) || $cfg['ContentVarableId'] <= 0)
		//	$cfg['ContentVarableId'] = IPS_GetParent($scriptId);
			$cfg['ContentVarableId'] = TryToFindContentVariableByLookingHierachyUpstairs($scriptId);

		$variable = @IPS_GetVariable($cfg['ContentVarableId']);
		if ($variable == false)
	   	die ("Abbruch - Content-Variable nicht gefunden.");

		if ($variable['VariableType'] != 3)
	   	die ("Abbruch - Content-Variable ist keine STRING-Variable.");

	   if ($variable['VariableCustomProfile'] != "~HTMLBox")
	   	die ("Abbruch - Content-Variable muss als Profil '~HTMLBox' verwenden.");

		return $cfg;
	}

	function TryToFindContentVariableByLookingHierachyUpstairs($id){

		while (true){
			$id = @IPS_GetParent($id);
		   if ($id == 0)
		      break;

			$variable = @IPS_GetVariable($id);
			if ($variable == false)
				continue;

			if ($variable['VariableType'] != 3)
		   	continue;

		   if ($variable['VariableCustomProfile'] != "~HTMLBox")
		   	continue;

			break;
		}
		return $id;



	}

	// ------------------------------------------------------------------------
	// CheckCfg_AreaHighChart
	//
	//    IN: $cfg
	//    OUT: korrigiertes $cfg
	// ------------------------------------------------------------------------
	function CheckCfg_AreaHighChart($cfg)
 	{
	   DebugModuleName($cfg,"CheckCfg_AreaHighChart");

		IfNotIssetSetValue($cfg['HighChart']['Width'], "100%");
		IfNotIssetSetValue($cfg['HighChart']['Height'], 400);

		if($cfg['HighChart']['Width'] == 0)
         $cfg['HighChart']['Width'] = "100%";

 		return $cfg;
	}

	// ------------------------------------------------------------------------
	// CheckCfg_StartEndTime
	//    Start- und Endzeit des gesamten Charts errechnen, und an jede Serie übergeben
	//    IN: $cfg
	//    OUT: korrigiertes $cfg
	// ------------------------------------------------------------------------
	function CheckCfg_StartEndTime($cfg)
	{
		DebugModuleName($cfg,"CheckCfg_StartEndTime");

		$cfg['Ips']['ChartStartTime'] = $cfg['StartTime'];
		$cfg['Ips']['ChartEndTime'] = $cfg['EndTime'];

		$offsetExistsAtSerie = false;
		$Count = count($cfg['series']);

		for ($i = 0; $i < $Count; $i++)
		{
			$Serie = $cfg['series'][$i];

			// wenn für die Serie keine Start oder Endzeit übergeben würde wird der Standardwert genommen
			IfNotIssetSetValue($Serie['StartTime'], $cfg['StartTime']);
			IfNotIssetSetValue($Serie['EndTime'], $cfg['EndTime']);

			if ($Serie['StartTime'] < $cfg['Ips']['ChartStartTime'])
				$cfg['Ips']['ChartStartTime'] = $Serie['StartTime'];
			if ($Serie['EndTime'] > $cfg['Ips']['ChartEndTime'])
				$cfg['Ips']['ChartEndTime'] = $Serie['EndTime'];

			$Serie['Ips']['EndTimeString'] = date("/r", $Serie['EndTime']);
			$Serie['Ips']['StartTimeString']= date("/r", $Serie['StartTime']);

			$cfg['series'][$i] = $Serie;

			if (isset($Serie['Offset']) && $Serie['Offset'] != 0)
				$offsetExistsAtSerie =true;
		}

		// wenn ein Offset definiert wurde gilt nur der global eingestellte Start und Endzeitpunkt
		if ($offsetExistsAtSerie = true)
      {
         $cfg['Ips']['ChartStartTime'] = $cfg['StartTime'];
			$cfg['Ips']['ChartEndTime'] = $cfg['EndTime'];
      }

		return $cfg;

	}

	// ------------------------------------------------------------------------
	// CheckCfg_Series
	//    prüfen der Serien
	//    IN: $cfg
	//    OUT: korrigiertes $cfg
	// ------------------------------------------------------------------------
	function CheckCfg_Series($cfg)
 	{
		DebugModuleName($cfg,"CheckCfg_Series");

		$Id_AH = $cfg['ArchiveHandlerId'];

		$series = array();
		foreach ($cfg['series'] as $Serie)
		{
			$VariableId = @$Serie['Id'];

			// hier wird nur geprüft ob Wert von Eingabe passen könnte (wenn vorhanden)
			if  (isset($Serie['AggType']) && ($Serie['AggType']<0 || $Serie['AggType']>4) )
				die ("Abbruch - 'AggType' hat keinen korrekten Wert");

			$Serie['Ips']['IsCounter'] = $VariableId && (@AC_GetAggregationType($Id_AH, $VariableId) == 1);

			// über AggValue kann Min/Max oder Avg vorgewählt werden (zum Lesen der AggregValues)
			IfNotIssetSetValue($Serie['AggValue'], "Avg");

			if ($Serie['AggValue'] != "Avg"
				&& $Serie['AggValue'] != "Min"
				&& $Serie['AggValue'] != "Max")
			   	die ("Abbruch - 'AggValue' hat keinen gültigen Wert");

			// Offset für Darstellung von z.B. Monate und Vormonat in einem Chart
			IfNotIssetSetValue($Serie['Offset'], 0);

			IfNotIssetSetValue($Serie['ReplaceValues'], false);

			// Name (Kompatibilität aus V1.x)
			if (isset($Serie['Name']) && !isset($Serie['name']))
				$Serie['name'] = $Serie['Name'];
			unset($Serie['Name']);

			if (!isset($Serie['name'])){
				if (isset($Serie['Id']))
					$Serie['name'] = @IPS_GetName($Serie['Id']);
				else
					$Serie['name'] = "";
			}


			IfNotIssetSetValue($Serie['name'], "");

			//KHC 28.04.2014 keine Prüfung des Types
			// type & Parameter
			if (isset($Serie['type']) && isset($Serie['Param']))
				die ("Abbruch - Definition von 'Param' und 'type' in Serie gleichzeitig nicht möglich.");
			if (!isset($Serie['type']) && !isset($Serie['Param']))
				die ("Abbruch - Serie muss Definition von 'Param' oder 'type' enthalten.");

			// Mögliche Charttypen
			$allowedSeriesTypes = array();
			if ($cfg['Ips']['ChartType'] == 'Highcharts')
				$allowedSeriesTypes = array('area','areaspline','bar','column','line','pie','scatter','spline', 'gauge', 'columnrange', 'arearange');
			else if ($cfg['Ips']['ChartType'] == 'Highstock')
				$allowedSeriesTypes = array('area','areaspline','bar','column','line','pie','scatter','spline','ohlc','candlestick');

			if (!isset($Serie['type']) && isset($Serie['Param']))
			{
				// type aus Param übernehmen
				foreach($allowedSeriesTypes as $item)
				{
					if (strrpos($Serie['Param'],"'$item'") > 0)
			   		$Serie['Ips']['Type'] = $item;
				}
			}
			else
			{
			//	if (!in_array($Serie['type'], $allowedSeriesTypes))
			//		die ("Abbruch - Serien-Type (" . $Serie['type'] .  ") nicht erkennbar.");
			//	else
					$Serie['Ips']['Type'] = $Serie['type'];
			}
			if (!isset($Serie['Ips']['Type']))
				die ("Abbruch - Serien-Type nicht erkennbar.");


			// data
			if (isset($Serie['Data']) && isset($Serie['data']))
				die ("Abbruch - Definition von 'Data' und 'data' in ein und derselben Serie nicht möglich.");
			if (!isset($Serie['data']) && isset($Serie['Data']))
         {
			   $Serie['data'] = $Serie['Data'];
			   unset($Serie['Data']);
			}

			// diverse Prüfungen bei PIE-Charts
			if ($Serie['Ips']['Type'] == 'pie')
			{
            if (isset($Serie['Id']))
            {
					if (!isset($Serie['AggType']))
						die ("Abbruch - Wird ein Pie über Id definiert muss auch AggType parametriert werden");

					// wenn nichts angegeben wird 'AggNameFormat: automatisch abhängig vom 'AggType' berechnet
					if (!isset($Serie['AggNameFormat']))
					{
						if ($Serie['AggType'] == 0)   //0=Hour
							$Serie['AggNameFormat'] = "d.m.Y H:i";
						else if ($Serie['AggType'] == 1) //1=Day
							$Serie['AggNameFormat'] = "d.m.Y";
						else if ($Serie['AggType'] == 2) //2=Week
							$Serie['AggNameFormat'] = "\K\WW Y";
						else if ($Serie['AggType'] == 3) //3=Month
							$Serie['AggNameFormat'] = "M Y";
						else if ($Serie['AggType'] == 4) //4=Year
							$Serie['AggNameFormat'] = "Y";
					}
            }
            else if (isset($Serie['data']))
            {
               foreach($Serie['data'] as $data)
               {
                  if (isset($data['Id']) && isset($data['y']))
                  	die ("Abbruch - Pie['data']: Id und y sind als gleichzeitige Parameter nicht möglich.");
                  //if (!isset($data['Id']) && !isset($data['y']))
                 	// 	die ("Abbruch - Pie['data']: Id oder y muss definiert sein");
                 	// kann man so nicht prüfen
               }
            }
            else
				{
					die ("Abbruch - Pie kann nie Daten besitzen. Es muss entweder über 'Id' oder über 'data' definiert werden.");
				}

			}

			// geänderte Werte wieder zurückschreiben
			$series[] = $Serie;
		}
		// geänderte Werte wieder zurückschreiben

		$cfg['series'] = $series;
 		return $cfg;
	}

	// ------------------------------------------------------------------------
	// CheckCfg_AggregatedValues
	//    prüfen der AggregatedValues und Übernahme dieser in die Serien
	//    IN: $cfg
	//    OUT: korrigiertes $cfg
	// ------------------------------------------------------------------------
 	function CheckCfg_AggregatedValues($cfg)
 	{
		DebugModuleName($cfg,"CheckCfg_AggregatedValues");

		if (!isset($cfg['AggregatedValues']))
			$cfg['AggregatedValues'] = array();

		// Default - wenn nichts vorbelegt
		IfNotIssetSetValue($cfg['AggregatedValues']['MixedMode'], false);
		IfNotIssetSetValue($cfg['AggregatedValues']['HourValues'], -1);
		IfNotIssetSetValue($cfg['AggregatedValues']['DayValues'], -1);
		IfNotIssetSetValue($cfg['AggregatedValues']['WeekValues'], -1);
		IfNotIssetSetValue($cfg['AggregatedValues']['MonthValues'], -1);
		IfNotIssetSetValue($cfg['AggregatedValues']['YearValues'], -1);
		IfNotIssetSetValue($cfg['AggregatedValues']['NoLoggedValues'], 100);

		$series = array();
		foreach ($cfg['series'] as $Serie)
		{
			// prüfen ob für die Serie Einstellungen für AggregatedValues vorhanden sind,
			// wenn nicht Übernahme aus cfg
			if (isset($Serie['AggregatedValues']))
			{
				IfNotIssetSetValue($Serie['AggregatedValues']['MixedMode'], $cfg['AggregatedValues']['MixedMode']);
				IfNotIssetSetValue($Serie['AggregatedValues']['HourValues'], $cfg['AggregatedValues']['HourValues']);
				IfNotIssetSetValue($Serie['AggregatedValues']['DayValues'], $cfg['AggregatedValues']['DayValues']);
				IfNotIssetSetValue($Serie['AggregatedValues']['WeekValues'], $cfg['AggregatedValues']['WeekValues']);
				IfNotIssetSetValue($Serie['AggregatedValues']['MonthValues'], $cfg['AggregatedValues']['MonthValues']);
				IfNotIssetSetValue($Serie['AggregatedValues']['YearValues'], $cfg['AggregatedValues']['YearValues']);
				IfNotIssetSetValue($Serie['AggregatedValues']['NoLoggedValues'], $cfg['AggregatedValues']['NoLoggedValues']);
			}
			else	// nein -> Daten aus übergeordneter cfg übernehmen
				$Serie['AggregatedValues'] = $cfg['AggregatedValues'];

     		// Umrechnen der Tage in Sekunden ... für direktes addieren zum Timestamp
			$MinPerTag = 24*60*60;

			if ($Serie['AggregatedValues']['HourValues'] != -1)
				$Serie['AggregatedValues']['HourValues'] *= $MinPerTag;
			if ($Serie['AggregatedValues']['DayValues'] != -1)
				$Serie['AggregatedValues']['DayValues'] *= $MinPerTag;
			if ($Serie['AggregatedValues']['WeekValues'] != -1)
				$Serie['AggregatedValues']['WeekValues'] *= $MinPerTag;
			if ($Serie['AggregatedValues']['MonthValues'] != -1)
				$Serie['AggregatedValues']['MonthValues'] *= $MinPerTag;
			if ($Serie['AggregatedValues']['YearValues'] != -1)
				$Serie['AggregatedValues']['YearValues'] *= $MinPerTag;
			if ($Serie['AggregatedValues']['NoLoggedValues'] != -1)
				$Serie['AggregatedValues']['NoLoggedValues'] *= $MinPerTag;

			// geänderte Werte wieder zurückschreiben
			$series[] = $Serie;
		}
		// geänderte Werte wieder zurückschreiben
		$cfg['series'] = $series;

		// die sind jetzt nicht mehr nötig.....
		unset($cfg['AggregatedValues']);

		return $cfg;
	}


// ***************************************************************************************************************************

	function AddRootParameterWhichStartsWithLowerCase($cfg, $existingCfg){
		$result = array();
		foreach ($cfg as $key => $value) {
			$firstChar = substr ($key, 0, 1);
			if ($firstChar != strtolower($firstChar))
			   continue;

			if (!isset($existingCfg[$key]))
				$result[$key] = $cfg[$key];
		}

	   return $result;
	}

	// ------------------------------------------------------------------------
	// GetHighChartsCfgFile
	//    Falls nicht konfiguriert, wird dies als Default String genommen
	//    OUT: natürlich den String ....
	// ------------------------------------------------------------------------
	function GetHighChartsCfgFile($cfg)
	{
		DebugModuleName($cfg,"GetHighChartsCfgFile");

		$cfgArr['chart'] = CreateArrayForChart($cfg);
		$cfgArr['credits'] = CreateArrayForCredits($cfg);
		$cfgArr['exporting'] = CreateArrayForExporting($cfg);
		$cfgArr['title'] = CreateArrayForTitle($cfg);
		$cfgArr['subtitle'] = CreateArrayForSubTitle($cfg);
		$cfgArr['tooltip'] = CreateArrayForTooltip($cfg);
		$cfgArr['xAxis'] = CreateArrayForXAxis($cfg);
		$cfgArr['yAxis'] = CreateArrayForYAxis($cfg);

		if ($cfg['Ips']['Debug']['ShowJSON'])
			DebugString(my_json_encode($cfgArr));

		$cfgArr['series'] = CreateArrayForSeries($cfg) ;

		if ($cfg['Ips']['Debug']['ShowJSON_Data'])
			DebugString(my_json_encode($cfgArr));

		$cfgArr = array_merge(
			AddRootParameterWhichStartsWithLowerCase($cfg, $cfgArr),
			$cfgArr);

		// Array in JSON wandeln
		$s = my_json_encode($cfgArr);

		// ersetzten des 'Param'-Parameters (Altlast aus V1.x)
		$s = str_replace(",Param@@@:",",",$s);

		return $s;
	}

	// ------------------------------------------------------------------------
	// GetHtmlForHighchartsSetOptions
	//
	//    IN: $cfg
	//    OUT: JSON Options String für den Bereich 'lang'
	// ------------------------------------------------------------------------
	function GetHtmlForHighchartsSetOptions($cfg)
	{
		DebugModuleName($cfg, "GetHtmlForHighchartsSetOptions");

		// Default
		IfNotIssetSetValue($cfg['lang']['decimalPoint'], ",");
		IfNotIssetSetValue($cfg['lang']['thousandsSep'], ".");

		IfNotIssetSetValue($cfg['lang']['months'], ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember']);
		IfNotIssetSetValue($cfg['lang']['shortMonths'], ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez']);
		IfNotIssetSetValue($cfg['lang']['weekdays'], ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag']);

		$s = "lang:" . my_json_encode($cfg['lang']);

		return '<script type="text/javascript">
						Highcharts.setOptions({'.$s.'});
					</script>';
	}

	// ------------------------------------------------------------------------
	// CreateArrayForSeries
	//
	//    IN: $cfg
	//    OUT: der String welcher dann in das IPS_Template geschrieben wird.
	// ------------------------------------------------------------------------
	function CreateArrayForSeries($cfg)
	{
		DebugModuleName($cfg,"CreateArrayForSeries");

		// Daten für einzelne Serien erzeugen
		$dataArr = array();
		foreach ($cfg['series'] as $Serie)
		{
			if ($Serie['Ips']['Type'] == 'pie')
			{
				$Serie['data'] = CreateDataArrayForPie($cfg, $Serie);
			}
			else
			{
            // Daten wurden von extern übergeben
				if (isset($Serie['data']))
				{
					if (is_array($Serie['data']))
						$Serie['data'] = CreateDataArrayFromExternalData($Serie['data'], $Serie);
					else
						$Serie['data'] = $Serie['data'];

				}
				// Daten werden aus DB gelesen
				else
					$Serie['data'] = ReadDataFromDBAndCreateDataArray($cfg, $Serie);
			}

			// ... aus Serie umkopieren
			$serieArr = $Serie;

			// nicht für JSON benötigte Parameter löschen
			unset($serieArr['Param']);
			unset($serieArr['AggregatedValues']);
			unset($serieArr['Unit']);
			unset($serieArr['StartTime']);
			unset($serieArr['EndTime']);
			unset($serieArr['ReplaceValues']);
			unset($serieArr['Ips']);
			unset($serieArr['Offset']);
			unset($serieArr['AggValue']);
			unset($serieArr['AggType']);
			unset($serieArr['AggNameFormat']);
			unset($serieArr['ScaleFactor']);
			unset($serieArr['RoundValue']);

			// ersetzten des 'Param'-Parameters (Altlast aus V1.x)
			if (isset($Serie['Param']))
				$serieArr['Param@@@'] = "@" . $Serie['Param'] . "@";

			$dataArr[] = $serieArr;
		}

		return $dataArr;
	}

	// ------------------------------------------------------------------------
	// PopulateDate
	//
	//    IN: $dt
	//			 $serie
	//    OUT: Date-Value für Data-String
	// ------------------------------------------------------------------------
	function PopulateDate($dt, $serie)
	{
		if ($dt < $serie['StartTime'])
			$dt = $serie['StartTime'] ;

		// z.B.: Date.UTC(2011,4,27,19,42,19),23.4
		return  CreateDateUTC($dt + $serie['Offset']);
	}

	// ------------------------------------------------------------------------
	// PopulateValue
	//
	//    IN: $val
	//			 $serie
	//    OUT: korrigiertes $cfg
	// ------------------------------------------------------------------------
	function PopulateValue($val, $serie)
	{
		// Werte ersetzten (sinnvoll für Boolean, oder Integer - z.B.: Tür/Fenster-Kontakt oder Drehgriffkontakt)
		if ($serie['ReplaceValues'] != false)
		{
			if (isset($serie['ReplaceValues'][$val]))
				$val = $serie['ReplaceValues'][$val];
		}

		// Skalieren von Loggingdaten
		if (isset($serie['ScaleFactor']))
			$val = $val * $serie['ScaleFactor'];

		// Rounden von Nachkommastellen
		if (isset($serie['RoundValue']))
			$val = round($val, $serie['RoundValue']);


		return $val;
	}

	// ------------------------------------------------------------------------
	// CreateDataArrayForPie
	//    Liest die aktuellen Werte aus den übergebenen Variablen und erzeugt die Daten für das PIE
	//    IN: $cfg, $Serie
	//    OUT: der Data String
	// ------------------------------------------------------------------------
	function CreateDataArrayForPie($cfg, $serie)
	{
		DebugModuleName($cfg,"CreateDataArrayForPie");

		if (isset($serie['Id']))
		{
		  	return ReadPieDataById($cfg, $serie);
		}
		else if (isset($serie['data']))
		{
			$result = array();
			foreach($serie['data'] as $item)
			{
			   if (isset($item['Id']))
			   {
				   $currentValue = ReadCurrentValue($item['Id']);
				   $item['y'] = PopulateValue($currentValue['Value'], $serie) ;
			   }
			   $result[] = $item;
			}
			return $result;
		}
		else
		{
		   Die ("Abbruch - Pie-Definition nicht korrekt");
		}
		return $Data;
	}

	// ------------------------------------------------------------------------
	// ReadPieDataById
	//    liest die Aggregated-Werte einer einer Vriablen aus und erzeugt das entsprechende Array
	//    IN: $cfg, $serie
	//    OUT: Config Array
	// ------------------------------------------------------------------------
	function ReadPieDataById($cfg, $serie)
	{
		$id_AH = $cfg['ArchiveHandlerId'];

		$tempData = @AC_GetAggregatedValues($id_AH, $serie['Id'], $serie['AggType'], $serie['StartTime'], $serie['EndTime'], 0);
		$tempData = array_reverse($tempData);

		$result = array();
		foreach ($tempData as $ValueItem)
	   {
			$item['name'] = ReplaceToGermanDate(date($serie['AggNameFormat'], $ValueItem['TimeStamp']));
			$item['y'] = PopulateValue($ValueItem[$serie['AggValue']], $serie);
			$result[] = $item;
	   }
	   unset ($tempData);

	   return $result;
	}

	// ------------------------------------------------------------------------
	// CalculateStartAndEndTimeForAggreagtedValues
	//       Liest den Start- und Endzeitpunkt des angefragten Bereiches
	//    IN: $Serie, $search : "" für alle Werte, "Hour", "Day", usw
	//    OUT: Array(StartTime,EndTime)
	// ------------------------------------------------------------------------
	function CalculateStartAndEndTimeForAggreagtedValues($Serie, $search ="")
	{
		$start = -1;		$ende = -1;
		$trap = false;
		$sum = 0;

		if ($search == "")
		{
		   $search =="Values";
		   $start = 0;
		   $trap = true;
		}
		foreach($Serie['AggregatedValues'] as $key => $value)
		{
			if (strrpos ($key, "Values") != false)
			{
				if ($value > 0)
					$sum += $value;

				if (strrpos ($key, $search) !== false)
				{
					$trap = true;
					if ($value == -1)
					   return false;
				}

				if (!$trap)
				   continue;

			   if ($value < 0)
			   	continue;

				if ($start == -1)
				{
					$start =  $sum;
			   	continue;
				}

				if ($start != -1 && $ende ==-1)
				{
					$ende =  $sum;
					break;
				}
			}
		}

		$result = false;
		if ($start != -1)
		{
         $result["EndTime"] = $Serie["EndTime"] - $start;
			if ($ende == -1)
	      	$result["StartTime"] = $Serie["StartTime"];
			else
				$result["StartTime"] = $Serie["EndTime"] - $ende;

			if ($result["StartTime"] < $Serie["StartTime"])
			 	$result["StartTime"] = $Serie["StartTime"];

		 	if ($result["StartTime"] == $Serie["EndTime"])
			 	$result = false;
		}

		return $result;
	}

	// ------------------------------------------------------------------------
	// ReadDataFromDBAndCreateDataArray
	//    Liest die Series-Daten aus der DB und schreibt sie in den DataString
	//    IN: $cfg, $Serie
	//    OUT: der Data String
	// ------------------------------------------------------------------------
	function ReadDataFromDBAndCreateDataArray($cfg, $Serie)
	{
		DebugModuleName($cfg,"ReadDataFromDBAndCreateDataArray");

		if (!isset($Serie['Id']))
		   return "";

		// errechne die Zeitspanne
		if ($Serie['EndTime'] > time())
			$Diff = time() - $Serie['StartTime'];
		else
			$Diff = $Serie['EndTime'] - $Serie['StartTime'];

		$Id_AH = $cfg['ArchiveHandlerId'];
		$dataArray = array();
		$VariableId = (int)$Serie['Id'];
		$Agg = -1;
		$ReadCurrentValue = true;

		// wenn ReplaceValues definiert wurden werden nur geloggte und keine Aggregated Werte gelesen
		if ($Serie['ReplaceValues'] != false)
		{
			if ($Diff > $Serie['AggregatedValues']['NoLoggedValues'])
			{
				$Serie['StartTime'] = $Serie['EndTime'] - $Serie['AggregatedValues']['NoLoggedValues'];
			}

			// Einzelwerte lesen
		   $dataArray = ReadAndAddToLoggedData($dataArray, $Id_AH, $VariableId, -1 , $Serie["StartTime"], $Serie["EndTime"], "Value", $Serie);
		}
		else if ($Serie['AggregatedValues']['MixedMode'])    // im MixedMode werden anfangs alle Werte, dann die Stunden- und zuletzt Tageswerte ausgelesen
		{
			// zuerst Einzelwerte
			$result = CalculateStartAndEndTimeForAggreagtedValues($Serie, "");
			if ($result != false)
			{
				if ($Serie['Ips']['IsCounter']) 						// wenn Zähler dann immer Agg.Values
					$dataArray = ReadAndAddToLoggedData($dataArray, $Id_AH, $VariableId, 0, $result["StartTime"], $result["EndTime"], $Serie['AggValue'], $Serie);
				else
   			   $dataArray = ReadAndAddToLoggedData($dataArray, $Id_AH, $VariableId, -1 , $result["StartTime"], $result["EndTime"], "Value", $Serie);
			}

			// -> Stundenwerte
			$result = CalculateStartAndEndTimeForAggreagtedValues($Serie,"Hour");
			if ($result != false)
				$dataArray = ReadAndAddToLoggedData($dataArray, $Id_AH, $VariableId, 0, $result["StartTime"], $result["EndTime"], $Serie['AggValue'], $Serie);

			// -> Tageswerte
			$result = CalculateStartAndEndTimeForAggreagtedValues($Serie,"Day");
			if ($result != false)
				$dataArray = ReadAndAddToLoggedData($dataArray, $Id_AH, $VariableId, 1, $result["StartTime"], $result["EndTime"], $Serie['AggValue'], $Serie);

			// -> Wochenwerten
			$result = CalculateStartAndEndTimeForAggreagtedValues($Serie,"Week");
			if ($result != false)
				$dataArray = ReadAndAddToLoggedData($dataArray, $Id_AH, $VariableId, 2, $result["StartTime"], $result["EndTime"], $Serie['AggValue'], $Serie);

			// -> Monatswerte
			$result = CalculateStartAndEndTimeForAggreagtedValues($Serie,"Month");
			if ($result != false)
				$dataArray = ReadAndAddToLoggedData($dataArray, $Id_AH, $VariableId, 3, $result["StartTime"], $result["EndTime"], $Serie['AggValue'], $Serie);

			// -> Jahreswerte
			$result = CalculateStartAndEndTimeForAggreagtedValues($Serie,"Year");
			if ($result != false)
				$dataArray = ReadAndAddToLoggedData($dataArray, $Id_AH, $VariableId, 4, $result["StartTime"], $result["EndTime"], $Serie['AggValue'], $Serie);
		}
		else
		{
			$Agg = -1;	// ->  AC_GetLoggedValues

         if  (isset($Serie['AggType']))   // wenn 'AggType' definiert wurde, wird dies vorrangig bearbeitet
         {
         	$Agg = $Serie['AggType'];
         }
			elseif ($Serie['AggregatedValues']['YearValues']!= -1 && $Diff > $Serie['AggregatedValues']['YearValues'])
				$Agg = 4;	//  -> AC_GetAggregatedValues [0=Hour, 1=Day, 2=Week, 3=Month, 4=Year]
			elseif ($Serie['AggregatedValues']['MonthValues']!= -1 && $Diff > $Serie['AggregatedValues']['MonthValues'])
				$Agg = 3;	//  -> AC_GetAggregatedValues [0=Hour, 1=Day, 2=Week, 3=Month, 4=Year]
			elseif ($Serie['AggregatedValues']['WeekValues']!= -1 && $Diff > $Serie['AggregatedValues']['WeekValues'])
				$Agg = 2;	//  -> AC_GetAggregatedValues [0=Hour, 1=Day, 2=Week, 3=Month, 4=Year]
			elseif ($Serie['AggregatedValues']['DayValues']!= -1 && $Diff > $Serie['AggregatedValues']['DayValues'])
				$Agg = 1;	//  -> AC_GetAggregatedValues [0=Hour, 1=Day, 2=Week, 3=Month, 4=Year]
			else if ($Serie['AggregatedValues']['HourValues']!= -1 && $Diff > $Serie['AggregatedValues']['HourValues'])
				$Agg = 0;	//  -> AC_GetAggregatedValues [0=Hour, 1=Day, 2=Week, 3=Month, 4=Year]

			// es wurde noch nichts definiert und es handelt sich um einen Zähler --> Tageswerte
         if ($Agg == -1 && $Serie['Ips']['IsCounter'])
	         $Agg = 0;

			if ($Agg == -1)
			{
				// Zeitraum ist zu groß -> nur bis max. Zeitraum einlesen
				if ($Diff > $Serie['AggregatedValues']['NoLoggedValues'])
					$Serie['StartTime'] = $Serie['EndTime'] - $Serie['AggregatedValues']['NoLoggedValues'];

				// Alle Werte
			   $dataArray = ReadAndAddToLoggedData($dataArray, $Id_AH, $VariableId, -1 , $Serie["StartTime"], $Serie["EndTime"], "Value", $Serie);
			}
			else
			{
				$dataArray = ReadAndAddToLoggedData($dataArray, $Id_AH, $VariableId, $Agg, $Serie["StartTime"], $Serie["EndTime"], $Serie['AggValue'], $Serie);
				$ReadCurrentValue = false;
			}
		}

		// sortieren, so , dass der aktuellste Wert zuletzt kommt
		$dataArray = array_reverse($dataArray);

		// aktuellen Wert der Variable noch in Array aufnehmen
		if ($ReadCurrentValue
			&& $Serie['EndTime'] >= time()    			// nicht wenn Endzeitpunkt vor NOW ist
			&& !$Serie['Ips']['IsCounter'])				// nicht bei Zählervariablen
			{
				$curValue = ReadCurrentValue($VariableId);
				$dataArray[] = CreateDataItem($curValue['TimeStamp'], $curValue['Value'], $Serie);
			}


		return $dataArray ;
	}

	// ------------------------------------------------------------------------
	// ReadCurrentValue
	//    IN: $VariableId
	//    OUT: Aktueller Wert
	// ------------------------------------------------------------------------
	function ReadCurrentValue($variableId)
	{
		$currentVal['Value']= GetValue($variableId);
		$currentVal['TimeStamp'] = time();

		return $currentVal;
	}

	// ------------------------------------------------------------------------
	// ReadAndAddToLoggedData
	//    IN: siehe Parameter
	//    OUT: Vervollständigte Logged Data
	// ------------------------------------------------------------------------
	function ReadAndAddToLoggedData($loggedData, $id_AH, $variableId, $aggType, $startTime, $endTime, $aggValueName, $serie)
	{
		$cfg['Ips']['Debug']['Modules'] = true;

		if ($aggType >= 0)
			$tempData = @AC_GetAggregatedValues($id_AH, $variableId, $aggType, $startTime, $endTime, 0);
		else
		//			$tempData = @AC_GetLoggedValues($id_AH, $variableId, $startTime, $endTime, 0 );
					$tempData = @AC_GetLoggedValuesCompatibility($id_AH, $variableId, $startTime, $endTime, 0 );

		if ($tempData)
		{
		   foreach ($tempData as $item)
		   {
				$loggedData[] = CreateDataItem($item['TimeStamp'], $item[$aggValueName], $serie);
		   }
		}
	   unset ($tempData);

		return $loggedData;
	}

	function CreateDataItem($dt, $val, $serie)
	{
		// Wert anpassen (Round, Scale)
		$val = PopulateValue($val, $serie);

		// z.B.: Date.UTC(2011,4,27,19,42,19),23.4
		$dtUTC = PopulateDate($dt, $serie);

		return array("@$dtUTC@", $val);
	}

	// ------------------------------------------------------------------------
	// CreateDataArrayFromExternalData
	//    Umwandeln der externen Daten in ein Daten Array
	//    IN: $arr = Aus IPS-Datenbank ausgelesenen Daten (LoggedData)
	//        $Serie = Config Daten der aktuellen Serie
	//    OUT: Highcharts ConfigString für Series-Data
	// ------------------------------------------------------------------------
	function CreateDataArrayFromExternalData($arr, $Serie)
	{
		$result = array();
		foreach($Serie['data'] as $item)
		{
			if (is_array($item))
			{
			   if (isset($item['TimeStamp']) && !isset($item['x']))
			   {
				   $item['x'] = "@" . PopulateDate($item['TimeStamp'], $Serie) . "@";
				   unset($item['TimeStamp']);
			   }
			   if (isset($item['Value']) && !isset($item['y']))
			   {
				   $item['y'] = $item['Value'];
				   unset($item['Value']);
			   }
			   if (isset($item['y']))
					$item['y'] = PopulateValue($item['y'], $Serie);

			   $result[] = $item;
		   }
			else
				$result[] = $item;
		}

		return $result;
	}

	// ------------------------------------------------------------------------
	// CreateTooltipFormatter
	//    Auslesen von immer wieder benötigten Werten aus der Variable
	//    IN: $cfg = Alle Config Daten
	//    OUT: Highcharts ConfigString für Tooltip-Formatter (Interaktive Anzeige des Wertes)
	// ------------------------------------------------------------------------
	function CreateTooltipFormatter($cfg)
	{
		DebugModuleName($cfg,"CreateTooltipFormatter");

		//ToDo: da sollten wir etwas lesbarer arbeiten
		$s = "";
		$offset ="";

		foreach ($cfg['series'] as $Serie )
		{
			if ($Serie['Ips']['Type'] == 'pie')
			{
				if (isset($Serie['data']))
				{
					$s .= "[";
					foreach($Serie['data'] as $data)
					{
						$unit = @$Serie['Unit'];
						if (isset($data['Unit']))
							$unit = $data['Unit'];

						$s .= "this.y +' " . $unit . "',";
					}
					$s = trim($s,",");
					$s .= "][this.point.x],";
				}
				else
				{
					$unit = @$Serie['Unit'];
					$s .= "[this.y + ' " . $unit . "'],";
				}
				$offset .= "0,";  // pies haben nie einen Offset
			}
			else
			{
			   // hier wird das VariableCustomProfile aus IPS übernommen
			   if (!isset($Serie['Unit']))
				{
					// hole das Variablen Profil
					$IPSProfil = @GetIPSVariableProfile($Serie['Id']);
					if ($IPSProfil != false)
					{
						if (array_key_exists("Associations",$IPSProfil) && count($IPSProfil['Associations'])>0)
						{
							$Arr = array();
							foreach($IPSProfil['Associations'] as $Item)
							{
							   $Arr[$Item['Value']] = $Item['Name'];
							}

							if (!is_array($Serie['ReplaceValues']))         // erzeuge Tooltips vollständig aus VariablenProfil
								$s .= CreateTooltipSubValues($Arr, array_keys($Arr));
							else  														// oder nehme ReplaceValues zur Hilfe
								$s .= CreateTooltipSubValues($Arr, $Serie['ReplaceValues']);
						}
						else
						{
							// Suffix als Einheit übernehmen
							$Serie['Unit'] = trim($IPSProfil['Suffix'], " ");
							$s .= "[this.y + ' ". $Serie['Unit']."'],";
						}
					}
					else  // falls VariablenId nicht existiert
					{
						$s .= "[this.y ],";
					}
				}
				// es wurden Unit und ReplaceValues übergeben
				else if (is_array($Serie['Unit']) && is_array($Serie['ReplaceValues']))
				{
					$s .= CreateTooltipSubValues($Serie['Unit'],$Serie['ReplaceValues']);
				}
				else		// Einheit aus übergebenem Parmeter Unit
				{
			      $s .= "[this.y + ' ". $Serie['Unit']."'],";
		      }
				$offset .= $Serie['Offset'] . ",";
	      }

		}

		$s = trim($s , "," );
		$offset = trim($offset , "," );

		//*1000 da JS in [ms] angebgeben wird un php in [s]
/*		$TooltipString="function() {
								var serieIndex = this.series.index;

								if (this.series.type == 'pie')
								{
			               	var pointIndex = this.point.x;
  									var unit = [".$s. "][serieIndex][pointIndex];

  									if (!unit)
									  unit = [".$s. "][serieIndex][0];

									return '<b>' + this.point.name +': </b> '+ unit +'<br/>= ' + this.percentage.toFixed(1) + ' %';
  								}
								else
			               {
				               var pointIndex = 0;
  									var unit = [".$s. "][serieIndex][pointIndex];
									var offset = [".$offset. "][serieIndex] * 1000;

									var offsetInfo ='';
									if (offset != 0)
										offsetInfo = '<br/>(Achtung Zeitwert hat einen Offset)';
									else
										offsetInfo ='';

									return '<b>' + this.series.name + ': </b> '+ unit + '<br/>'
										+ Highcharts.dateFormat('%A %d.%m.%Y %H:%M', this.x - offset)
										+ offsetInfo;


								}
						} ";
*/

		$TooltipString = "function() {
								var serieIndex = this.series.index;
								var unit = [".$s. "][serieIndex];
								var offset = [".$offset. "][serieIndex] * 1000;
								var offsetInfo ='';

								if (offset != 0)
									offsetInfo = '<br/>(Achtung Zeitwert hat einen Offset)';
								else
									offsetInfo ='';

								if (this.series.type == 'pie')
								{
									return '<b>' + this.point.name +': </b> '+ unit +'<br/>= ' + this.percentage.toFixed(1) + ' %';
  								}
								else
			               {
									return '<b>' + this.series.name + ': </b> '+ unit + '<br/>'
										+ Highcharts.dateFormat('".$cfg['TooltipDateTimeFormat']."', this.x - offset)
										+ offsetInfo;
								}
						} ";



		return $TooltipString;
	}

	// ------------------------------------------------------------------------
	// CreateTooltipSubValues
	//    Erzeugt den Tooltip für Unter-Elemente
	//    IN: shownTooltipArr = Array der Werte (Synonyme) welche im Tooltip angezeigt werden sollen
	//        chartValueArr = Array der Werte welche im Chart eingetragen werden
	//    OUT: Tooltip String
	// ------------------------------------------------------------------------
	function CreateTooltipSubValues($shownTooltipArr, $chartValueArr)
	{
		$s="{";
		$Count = count($shownTooltipArr);
		for ($i = 0; $i < $Count ; $i++)
		{
			if (isset($chartValueArr[$i]) && isset($shownTooltipArr[$i]))
			   $s .= $chartValueArr[$i] .": '" . $shownTooltipArr[$i] ."'," ;
		}
		$s = trim($s, ",") . "}";

		return $s ."[this.y],";
	}

	// ------------------------------------------------------------------------
	// GetIPSVariableProfile
	//    Liest das Variablen Profil der übergeben Variable aus
	//    Versucht zuerst das eigene und wenn nicht verfügbar das Standar Profil auszulesen
	//    IN: variableId = Id der Variablen
	//    OUT: Variablen Profil
	// ------------------------------------------------------------------------
	function GetIPSVariableProfile($variableId)
	{
		$var = @IPS_GetVariable($variableId);
		if ($var == false) // Variabel existiert nicht
		   return false;

		$profilName = $var['VariableCustomProfile']; 	// "Eigenes Profil"

		if ($profilName == false)                     	// "Standard" Profil
			$profilName = $var['VariableProfile'];

		if ($profilName != false)
			return IPS_GetVariableProfile($profilName);  // und jetzt die dazugehörigen Daten laden
		else
			return false;
	}



	// ------------------------------------------------------------------------
	// CreateArrayForChart
	//
	//    IN: $cfg
	//    OUT: Config Array für den Bereich 'chart'
	// ------------------------------------------------------------------------
	function CreateArrayForChart($cfg)
	{
		if (!isset($cfg['chart']))
			$cfg['chart'] = array();

		//Default
		IfNotIssetSetValue($cfg['chart']['renderTo'], "container");
		IfNotIssetSetValue($cfg['chart']['zoomType'], "xy");

		return $cfg['chart'];
	}

	// ------------------------------------------------------------------------
	// CreateArrayForCredits
	//
	//    IN: $cfg
	//    OUT: Config Array für den Bereich 'credits'
	// ------------------------------------------------------------------------
	function CreateArrayForCredits($cfg)
	{
		if (!isset($cfg['credits']))
			$cfg['credits'] = array();

		//Default
		IfNotIssetSetValue($cfg['credits']['enabled'], false);

		return $cfg['credits'];
	}

	// ------------------------------------------------------------------------
	// CreateArrayForTitle
	//
	//    IN: $cfg
	//    OUT: Config Array für den Bereich 'title'
	// ------------------------------------------------------------------------
	function CreateArrayForTitle($cfg)
	{
		if (!isset($cfg['title']))
			$cfg['title'] = array();

		return $cfg['title'];
	}

	// ------------------------------------------------------------------------
	// CreateArrayForExporting
	//
	//    IN: $cfg
	//    OUT: Config Array für den Bereich 'exporting'
	// ------------------------------------------------------------------------
	function CreateArrayForExporting($cfg)
	{
		if (!isset($cfg['exporting']))
			$cfg['exporting'] = array();

		//Default
		IfNotIssetSetValue($cfg['exporting']['enabled'], false);
		IfNotIssetSetValue($cfg['exporting']['buttons']['printButton']['enabled'], false);

		return $cfg['exporting'];
	}

	// ------------------------------------------------------------------------
	// CreateArrayForTooltip
	//
	//    IN: $cfg
	//    OUT: Config Array für den Bereich 'tooltip'
	// ------------------------------------------------------------------------
	function CreateArrayForTooltip($cfg)
	{
		if (!isset($cfg['tooltip']))
			$cfg['tooltip'] = array();

		//Default
		// wenn not isset -> autom. erzeugen durch IPS
		if (!isset($cfg['tooltip']['formatter']))
		   $cfg['tooltip']['formatter'] = "@" . CreateTooltipFormatter($cfg) . "@";
		// wenn "" -> default by highcharts
		else if ($cfg['tooltip']['formatter'] == "")
		{
		   // do nothing
		}

		return $cfg['tooltip'];
	}

	// ------------------------------------------------------------------------
	// CreateArrayForSubTitle
	//
	//    IN: $cfg
	//    OUT: Config Array für den Bereich subtitle
	// ------------------------------------------------------------------------
	function CreateArrayForSubTitle($cfg)
	{
		if (!isset($cfg['subtitle']))
			$cfg['subtitle'] = array();

		//Default
		IfNotIssetSetValue($cfg['subtitle']['text'], "Zeitraum: %STARTTIME% - %ENDTIME%");
		IfNotIssetSetValue($cfg['subtitle']['Ips']['DateTimeFormat'], "(D) d.m.Y H:i");

		$s = $cfg['subtitle']['text'];
		$s = str_ireplace("%STARTTIME%", date($cfg['subtitle']['Ips']['DateTimeFormat'], $cfg['Ips']['ChartStartTime']), $s);
		$s = str_ireplace("%ENDTIME%", date($cfg['subtitle']['Ips']['DateTimeFormat'], $cfg['Ips']['ChartEndTime']), $s);
		$cfg['subtitle']['text'] = ReplaceToGermanDate($s);

		unset($cfg['subtitle']['Ips']);

		return $cfg['subtitle'];
	}
	// ------------------------------------------------------------------------
	// CreateArrayForXAxis
	//    Erzeugen das ArrX-Achsen Strings für Highchart-Config
	//    IN: $cfg
	//       es besteht die Möglichkeit den Achsen String bereits im Highchart Format zu hinterlegen
	//       oder die folgenden Parameter als Array einzustellen: Name, Min, Max, TickInterval, Opposite, Unit
	//    OUT: Highcharts String für die Achsen
	// ------------------------------------------------------------------------
	function CreateArrayForXAxis($cfg)
	{
	   // khc 28.04.2014
		//if (!isset($cfg['xAxis']))
		//   return null;

		if (!isset($cfg['xAxis']))
			$cfg['xAxis'] = array();

		//Default
		IfNotIssetSetValue($cfg['xAxis']['type'], "datetime");
		IfNotIssetSetValue($cfg['xAxis']['dateTimeLabelFormats']['second'], "%H:%M:%S");
		IfNotIssetSetValue($cfg['xAxis']['dateTimeLabelFormats']['minute'], "%H:%M");
		IfNotIssetSetValue($cfg['xAxis']['dateTimeLabelFormats']['hour'], "%H:%M");
		IfNotIssetSetValue($cfg['xAxis']['dateTimeLabelFormats']['day'], "%e. %b");
		IfNotIssetSetValue($cfg['xAxis']['dateTimeLabelFormats']['week'], "%e. %b");
		IfNotIssetSetValue($cfg['xAxis']['dateTimeLabelFormats']['month'], "%b %y");
		IfNotIssetSetValue($cfg['xAxis']['dateTimeLabelFormats']['year'], "%Y");

		IfNotIssetSetValue($cfg['xAxis']['allowDecimals'], false);

		if (isset($cfg['xAxis']['min']) && $cfg['xAxis']['min'] == false)
			unset($cfg['xAxis']['min']);
		else
			IfNotIssetSetValue($cfg['xAxis']['min'], "@" . CreateDateUTC($cfg['Ips']['ChartStartTime']) ."@");

		if (isset($cfg['xAxis']['max']) && $cfg['xAxis']['max'] == false)
			unset($cfg['xAxis']['max']);
		else
			IfNotIssetSetValue($cfg['xAxis']['max'], "@" . CreateDateUTC($cfg['Ips']['ChartEndTime'])."@");



		return $cfg['xAxis'];
	}

	// ------------------------------------------------------------------------
	// CreateArrayForYAxis
	//    Erzeugen der Y-Achsen Strings für Highchart-Config
	//    IN: $cfg
	//       es besteht die Möglichkeit den Achsen String bereits im Highchart Format zu hinterlegen
	//       oder die folgenden Parameter als Array einzustellen: Name, Min, Max, TickInterval, Opposite, Unit
	//    OUT: Highcharts String für die Achsen
	// ------------------------------------------------------------------------
	function CreateArrayForYAxis($cfg)
	{
		// khc 28.04.2014
		if (!isset($cfg['yAxis']))
			return null;

		$result = array();

		foreach ($cfg['yAxis'] as $Axis )
		{
			// erst mal alles kopieren
			$cfgAxis = $Axis;

			if (!isset($cfgAxis['labels']['formatter']) && isset($Axis['Unit']))
				$cfgAxis['labels']['formatter'] ="@function() { return this.value +' ". $Axis['Unit']."'; }@";

      	$result[] = $cfgAxis;
		}

		return $result;
	}

	// ------------------------------------------------------------------------
	// CreateDateUTC
	//    Erzeugen des DateTime Strings für Highchart-Config
	//    IN: $timeStamp = Zeitstempel
	//    OUT: Highcharts DateTime-Format als UTC String ... Date.UTC(1970, 9, 27, )
	//       Achtung! Javascript Monat beginnt bei 0 = Januar
	// ------------------------------------------------------------------------
	function CreateDateUTC($timeStamp)
	{
		$monthForJS = ((int)date("m", $timeStamp))-1 ;	// Monat -1 (PHP->JS)
		return "Date.UTC(" . date("Y,", $timeStamp) .$monthForJS. date(",j,H,i,s", $timeStamp) .")";
	}

	// ------------------------------------------------------------------------
	// ReplaceToGermanDate
	//    Falls nicht konfiguriert, wird dies als Default String genommen
	//    IN: String mit englischen Wochentagen, bzw. Monaten
	//    OUT: der String übersetzt ins Deutsche
	// ------------------------------------------------------------------------
	function ReplaceToGermanDate($value)
	{
			$trans = array(
			    'Monday'    => 'Montag',
			    'Tuesday'   => 'Dienstag',
			    'Wednesday' => 'Mittwoch',
			    'Thursday'  => 'Donnerstag',
			    'Friday'    => 'Freitag',
			    'Saturday'  => 'Samstag',
			    'Sunday'    => 'Sonntag',
			    'Mon'       => 'Mo',
			    'Tue'       => 'Di',
			    'Wed'       => 'Mi',
			    'Thu'       => 'Do',
			    'Fri'       => 'Fr',
			    'Sat'       => 'Sa',
			    'Sun'       => 'So',
			    'January'   => 'Januar',
			    'February'  => 'Februar',
			    'March'     => 'März',
			    'May'       => 'Mai',
			    'June'      => 'Juni',
			    'July'      => 'Juli',
			    'October'   => 'Oktober',
			    'December'  => 'Dezember',
			    'Mar'     	 => 'Mär',
			    'May'       => 'Mai',
			    'Oct'   	 => 'Okt',
			    'Dec'  		 => 'Dez',
		);
		return  strtr($value, $trans);
	}


	// ------------------------------------------------------------------------
	// my_json_encode
	//
	//    IN: PHP-Array
	//    OUT: JSON String
	// ------------------------------------------------------------------------
	function my_json_encode($cfgArr)
	{
		array_walk_recursive($cfgArr, "CheckArrayItems");

		$s = json_encode($cfgArr);

		// workaround damit die " übergeben werden
		$s = str_replace('\"', "%'%",$s);

		// alle " entfernen
		$s = str_replace('"', '',$s);

		// Zeilenumbruch, Tabs, etc entfernen ... bin mir nicht so sicher ob das so gut ist
		$s = RemoveUnsupportedStrings($s);

		// workaround damit die " übergeben werden
		$s = str_replace( "%'%", '"',$s);

		return $s;
	}

	// ------------------------------------------------------------------------
	// CheckArrayItems
	//
	//    IN: Array-Item
	//    OUT:
	// ------------------------------------------------------------------------
	function CheckArrayItems(&$item)
	{
		if (is_string($item))
		{
			if ($item == "@" || $item == "@@" )
			{
				$item = "'" . $item . "'";
			}
			else if ((substr($item,0,1) == "@" && substr($item,-1) == "@"))
			{
				$item = trim($item, "@");
			}
/*			else if ((substr($item,0,1) == "$" && substr($item,-1) == "$"))
			{
				$item = trim($item, "$");
			}*/
			else
			{
				$item = "'" . trim($item, "'") . "'";
			}

			if (mb_detect_encoding($item, 'UTF-8', true) === false) {
 			     $item = utf8_encode($item);
			}
		}
	}

	function is_utf8($str)
	{
	    return preg_match("/^(
	         [\x09\x0A\x0D\x20-\x7E]            # ASCII
	       | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
	       |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
	       | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
	       |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
	       |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
	       | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
	       |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
	      )*$/x",
	      $str);
	}
	function force_utf8($str, $inputEnc='WINDOWS-1252')
	{
	    if ( is_utf8($str) )
	    {
	        // Nichts zu tun.
	        return $str;
	    }

	    if ( strtoupper($inputEnc) == 'ISO-8859-1')
	    {
	        return utf8_encode($str);
	    }

	    if ( function_exists('mb_convert_encoding') )
	    {
	        return mb_convert_encoding($str, 'UTF-8', $inputEnc);
	    }

	    if ( function_exists('iconv') )
	    {
	        return iconv($inputEnc, 'UTF-8', $str);
	    }

	    else
	    {
	        // Alternativ kann man auch den Originalstring ausgeben.
	        trigger_error(
	        'Kann String nicht nach UTF-8 kodieren in Datei '
	        . __FILE__ . ', Zeile ' . __LINE__ . '!', E_USER_ERROR);
	    }
	}
	// ------------------------------------------------------------------------
	// RemoveUnsupportedStrings
	//    Versuchen Sonderzeichen wie Zeilenumbrüche, Tabs, etc. aus dem übergebenen String zu entfernen
	//    IN: $str
	//    OUT: $str
	// ------------------------------------------------------------------------
	function RemoveUnsupportedStrings($str)
	{
		$str = str_replace("\	","",$str);
		$str = str_replace("\
","",$str);
		$str = str_replace("\\r","",$str);
		$str = str_ireplace("\\\u00","\\u00",$str);  // da muss man nochmals checken
		$str = str_replace("\\\\","",$str);

		return $str;
	}

	// ------------------------------------------------------------------------
	// IfNotIssetSetValue
	//    pfüft ob isset($item), wenn nicht wird $value in &$item geschrieben
	//    IN: &$item, $value
	//    OUT: &$item
	// ------------------------------------------------------------------------
	function IfNotIssetSetValue(&$item, $value )
	{
		if (!isset($item)
			|| (is_string($item) && $item == ""))   // zusätzliche Abfrage in 2.01
		{
			$item = $value;
			return false;
		}

		return true;
	}

	// ------------------------------------------------------------------------
	// getmicrotime
	//
	//    IN:
	//    OUT:
	// ------------------------------------------------------------------------
	function getmicrotime($short = false)
	{
	   list($usec,$sec)=explode(" ", microtime());

		if ($short )
	      return (float)$usec + (float)substr($sec,-1);
		else
		   return (float)$usec + (float)$sec;
	}

	// ------------------------------------------------------------------------
	// DebugString
	//
	//    IN:
	//    OUT:
	// ------------------------------------------------------------------------
	function DebugString($str)
	{
	   $s = RemoveUnsupportedStrings($str);
	   echo $s;
	}

	// ------------------------------------------------------------------------
	// DebugModuleName
	//
	//    IN:
	//    OUT:
	// ------------------------------------------------------------------------
	function DebugModuleName($cfg, $name)
	{
		if (isset($cfg['Ips']['Debug']['Modules']) && $cfg['Ips']['Debug']['Modules'])
		{
			//global $IPS_SENDER, $version, $versionDate;
			global $version, $versionDate;

		   IPS_LogMessage($_IPS['SENDER'] ." - " .getmicrotime(true) , "Highcharts $version ($versionDate) - $name");
		 }
	}
	function AC_GetLoggedValuesCompatibility($instanceID, $variableID, $startTime, $endTime, $limit)
	{
    	$values = AC_GetLoggedValues($instanceID, $variableID, $startTime, $endTime, $limit );
  		if((sizeof($values) == 0) || (end($values)['TimeStamp'] > $startTime))
		{
        $previousRow = AC_GetLoggedValues($instanceID, $variableID, 0, $startTime - 1, 1 );
        $values = array_merge($values, $previousRow);
    	}
    	return $values;
	}



?>

Conig

<?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

	// 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']= 42061 /*[[in Arbeit]\Highcharts\Chart\HighCharts AKTUELL]*/;  				// ID des Highcharts Scripts

	// Highcharts oder Highstock (default = Highcharts
	$CfgDaten['Ips']['ChartType'] = 'Highcharts';

	// Zeitraum welcher dargestellt werden soll (kann durch die Zeitvorgaben in den Serien verändert werden)
	if (!isset($CfgDaten["StartTime"]))
	 	$CfgDaten["StartTime"] = mktime(0,0,0, date("m", time()), date("d",time()), date("Y",time())); // ab heute 00:00 Uhr
	if (!isset($CfgDaten["EndTime"]))
		$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

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

	// wenn Popup dann muss die WebfrontConfigId und der Titele übergeben werden
	if ($CfgDaten['RunMode'] == "popup")
	{
		$CfgDaten['WebFrontConfigId'] = 26841 /*[Main]*/;
		$CfgDaten['WFCPopupTitle'] = "Ich bin der Text, welcher als Überschrift im Popup gezeigt wird";
	}

	// Übergabe der IP-Adresse und des Ports für die Darstellung im Dashboard
	// Wichtig! Wenn Darstellung in Webfront diese Variablen auskommentieren
	//$CfgDaten['Ips']['Dashboard']['Ip'] = "127.0.0.1";
	//$CfgDaten['Ips']['Dashboard']['Port'] = "82";

	// 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'] = "Chart-Überschrift";

	// **************************************************************************************
	// *** 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;
	// $CfgDaten['tooltip']['formatter'] = Null; // IPS erstellt selbständig einen Tooltip
	// $CfgDaten['tooltip']['formatter'] = "";   // Standard - Highcharts Tooltip
	// $CfgDaten['TooltipDateTimeFormat'] = "%A %d.%m.%Y %H:%M";  // Standard Tooltip DateTime-Format

	// **************************************************************************************
	// *** 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']

	$CfgDaten['yAxis'][0]['title']['text'] = "Temperaturen";
	$CfgDaten['yAxis'][0]['Unit'] = "°C";
	$CfgDaten['yAxis'][0]['opposite'] = false;
	$CfgDaten['yAxis'][0]['tickInterval'] = 5;
	$CfgDaten['yAxis'][0]['min'] = 0;
	$CfgDaten['yAxis'][0]['max'] = 40;

	$CfgDaten['yAxis'][1]['title']['text'] = "Heizungssteller / Luftfeuchte";
	$CfgDaten['yAxis'][1]['Unit'] = "%";
	$CfgDaten['yAxis'][1]['opposite'] = true;

	$CfgDaten['yAxis'][2]['title']['text'] = "Drehgriffkontakte / Türkontakte";
	$CfgDaten['yAxis'][2]['labels']['formatter'] = "@function() { if (this.value == 0.5) return 'geschlossen'; if (this.value == 1) return 'gekippt';if (this.value == 2) return 'geöffnet' }@";
	$CfgDaten['yAxis'][2]['allowDecimals'] = true;
	$CfgDaten['yAxis'][2]['showFirstLabel '] = false;
	$CfgDaten['yAxis'][2]['showLastLabel '] = false;
	$CfgDaten['yAxis'][2]['opposite'] = true;
	$CfgDaten['yAxis'][2]['labels']['rotation'] = 90;

	$CfgDaten['yAxis'][3]['title']['text'] = "Columns";
	$CfgDaten['yAxis'][3]['Unit'] = "kWh";

	// **************************************************************************************
	// *** series *** http://www.highcharts.com/ref/#series
	// **************************************************************************************
	// $serie['name'] = "Temperatur; // Name der Kurve (Anzeige in Legende und Tooltip)
	//		-> veraltet: 'Name' -> verwende [series']['name']
	// $serie['Unit'] = "°C"; // Anzeige in automatisch erzeugtem Tooltip
	// 	wenn $serie['Unit'] = NULL; // oder Unit wird gar nicht definiert, wird versucht die Einheit aus dem Variablenprofil automatisch auszulesen
	// $serie['ReplaceValues'] = false; // Werte werden wie geloggt übernommen
	// 	$serie['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)
	// $serie['type'] = 'spline'; // Festlegung des Kuventypes (area, areaspline, line, spline, pie, Column)
	// $serie['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
	// $serie['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
	// $serie['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
	// $serie['Offset'] = 24*60*60; hiermit können Kurven unterschiedlicher Zeiträume in einem Chart dargestellt. Angabe ist in Minuten
	//	$serie['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
	// $serie['EndTime'] = mktime(0,0,0,2,1,2012);  		// der Zeitpunkt der Zeitpunkt aus den $CfgDaten genommen
	// $serie['ScaleFactor'] = 10; // Skalierungsfaktor mit welchem der ausgelesene Werte multipliziert wird
	// $serie['RoundValue'] = 1; // Anzahl der Nachkommastellen
	//	$serie['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
	// $serie['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.

	$serie = array();
	$serie['name'] = 'Pie';
	$serie['type'] = 'pie';
	$serie['data'][] = array('name'=>'Aussentemperatur', 'Id' => 23960, 'Unit'=>"°C");
	$serie['data'][] = array('name'=>'Luftfeuchte', 'Id' => 13641, 'Unit'=>"%");
	$serie['allowPointSelect'] = true;
	$serie['cursor'] = 'pointer';
	$serie['center'] = array(300,100);
	$serie['size'] = 100;
	$serie['dataLabels']['enabled'] = true;
	$CfgDaten['series'][] = $serie;

	$serie = array();
	$serie['name'] = "Aussentemperatur";
	$serie['Id'] = 23960 /*[Devices\_\Aussentemperatur\Garten Vor Garage\TEMPERATURE]*/;
	$serie['Unit'] = "°C";
	$serie['ReplaceValues'] = false;
	$serie['RoundValue'] = 0;
	$serie['type'] = "spline";
	$serie['yAxis'] = 0;
	$serie['marker']['enabled'] = false;
	$serie['shadow'] = true;
	$serie['lineWidth'] = 1;
	$serie['states']['hover']['lineWidth'] = 2;
	$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;

	$serie = array();
	$serie['name'] = "Luftfeuchte";
	$serie['Id'] = 11590 /*[Devices\OG\Bad & WC\Klima\Wandthermostat Ist\HUMIDITY]*/;
	$serie['Unit'] = "%";
	$serie['ReplaceValues'] = false;
	$serie['type'] = "spline";
	$serie['step'] = false;
	$serie['yAxis'] = 1;
	$serie['shadow'] = true;
	$serie['lineWidth'] = 1;
	$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;

	$serie = array();
	$serie['name'] = "Drehgriffkontakt";
	$serie['Id'] = 44451 /*[Devices\EG\Gäste WC\Fenster Tür Präsenz\Fenster (Drehgriffkontakt)\STATE]*/;
	$serie['Unit'] = array(0=>'geschlossen', 1=>'gekippt', 2=>'geöffnet');
	$serie['ReplaceValues'] = array(0=>0.5, 1=>1, 2=>2);
	$serie['type'] = "line";
	$serie['step'] = true;
	$serie['yAxis'] = 2;
	$serie['shadow'] = true;
	$serie['lineWidth'] = 1;
	$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;

	$serie = array();
	$serie['name'] = "Column";
	$serie['Id'] = 29842 /*[Devices\_\eHZ\Akt.Werte\eHZ Zählerstände\Zähler EnBW (Zweirichtungszähler)\Bezug (von EnBW)]*/;
	$serie['Unit'] = "kWh";
	$serie['ReplaceValues'] =false;
	$serie['type'] = "column";
	$serie['step'] = false;
	$serie['yAxis'] = 3;
	$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;


	// 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'] = "100%"; 	// in px,  0 wird auch in 100% konvertiert
	$CfgDaten['HighChart']['Height'] = 600; 		// in px

	// ab V3.000 sind diese Parameter hinzugekommen
	// lokale Skripte oder aus Internet
	// ['Ips']['ScriptsHighCharts']  		Verzeichnis in welchen sich die Scripte befinden falls man diese lokal hält,
	// ['Ips']['ScriptsHighstock']         default = leer, dann werden die Scripte aus dem Internet geholt
	// ['Ips']['Scriptsjquery']
	// ['Ips']['ScriptsTheme'] das ist das Themes Verzeichnis. Wenn man mit der ips.js arbeitet, sollte man dort alle Highchart Themes hinkopieren und den Pfad antprechend angeben

	// ['Ips']['HtmlScript'] default = leer, Script komplett erzeugen, wenn man z.B.: mit Dynamik arbeitet kann man hier Anpassungen machen.

	// -------------------------------------------------------------------------------------------------------------------------------------
	// und jetzt los ......
	$s = IPS_GetScript($CfgDaten['HighChartScriptId']); 	// Id des Highcharts-Scripts
	include($s['ScriptFile']);

	// das ist ab V3.000 der neue Aufruf
	RunHighcharts($CfgDaten);



?>

Eine Idee warum wird die Datei nicht gefunden?

Danke schon mal für die Anregungen.

Ich habe gar nichts anpassen müssen. Alle Dateien beim Wechsel von Windows auf Linux kopiert und ehrlich gesagt, hatte ich gar nicht daran gedacht, dass es nicht laufen könnte.

Hast Du da wirklich IPS liegen? Das schaut etwas leer aus.

Bei mir ist das unter /var/lib/symcon/webfront/user

Gesendet von iPad mit Tapatalk

Hallo Boui!

Ich glaube du hast den entscheidenden Anstoß gegeben. Bei der Installation von Symcon vor ca. 2 Jahren Habe ich mich irgendwie vertan. Seit dem gibt es noch eine zweite Version unter einer anderen IP in der Konsole. Diese habe ich nie benutzt. Und genau in diese habe ich jetzt die Highcharts kopiert:banghead::banghead::o. Das das nicht funktioniert erklärt sich von selbst. Deine Pfadangabe hat es gebracht :smiley:

Danke

Super, freut mich.

Gesendet von iPhone mit Tapatalk

Hallo Boui,

ich bekomme die Highcharts 3.0.1 auf dem Raspberry nicht zum laufen. Ich habe jetzt schon den Ordner „user“ von der Windows Version genommen wo die Highcharts laufen und auf den Raspberry kopiert. Noch die Config angepasst aber nichts passiert. Das Fenster im Webfront bleibt dunkel ohne Meldung. Das ganze habe ich jetzt schon X-mal gemacht. Du hast geschrieben das du es einfach rüber kopiert hast und es lief. Vielleicht doch noch etwas angepasst? Hast du noch eine Idee was ich machen könnte?

LG

Morgen frühestens kann ich nochmal meine Struktur prüfen.

Gesendet von iPhone mit Tapatalk

Ok und schon mal danke

Bei mir schaut das so aus:

/var/lib/symcon/webfront/user/

  • IPS-Highcharts.php
  • Highcharts Verzeichnis

Ich hab mir auch die Scripte angeschaut. Da ist nix speziell angepasst Alles Standard.
Auch habe ich die Inhalte von deinen Dateien oben verglichen. Alles wie bei mir.

Im Script für die Darstellung hast Du ja nur den Eintrag ID der ContentVariable, ID der Highcharts 3.01 und die geloggten Variablen.
Das ist wie unter jedem anderen BS auch.