Q&A Highcharts V2.0

IPSHighcharts und Highcharts sind ja eigentlich verschiedene Dinge.

versteh ich nicht. Sind doch fast gleich. Dachte nur ich steig auf die IPSHighcharts um damit ich die Updates automatisch bekomme. Wenn ich khc richtig verstanden habe hat er die Updates einfach in die Library gestellt anstatt die im initialen Threat zu aktualisieren. Wo ist der Unterschied?

Du bist hier bei den Normalos gelandet und damit im falschen Forenbereich.

versteh ich auch nicht. Hier ist doch die offizielle Fragestelle zum derzeit aktuellen HC 2.x Script von khc. Oder?
Wo wäre ich denn richtig?

Offensichtlich zu wenig damit beschäftigt, wie ich auch bis vorhin. Und warum aktualisierst Du dann doch selber? :wink:

Wenn ich khc richtig verstanden habe hat er die Updates einfach in die Library gestellt anstatt die im initialen Threat zu aktualisieren. Wo ist der Unterschied?

Hat sich khc in dieser Richtung geäussert? Die Bemerkung von Andreas ist anders:
„Die Implementierung von IPSHighcharts der IPSLibrary wurde aus diesem Thread übernommen – besten Dank an dieser Stelle an den User khc!“

Nachzulesen, und verlinkt, hier:

versteh ich auch nicht

Klar, wenn die Unterschiede nicht bekannt sind

Hier ist doch die offizielle Fragestelle zum derzeit aktuellen HC 2.x Script von khc

Richtig, endet mit 2.02 und läuft auch aktuell, im anderen Verzeichnis --> heisst und bedeutet aber nicht IPSHighCharts !

Wo wäre ich denn richtig?

Wie schon verlinkt

Hat auch den Vorteil, dass Andreas dann die (funktionierende :D) Aktualisierung bereitstellt

Gruß
Bruno

Ein paar Worte zur Geschichte:

Highcharts ansich hat erstmal nix mit IPS zu tun. Das ist eine eigenständige JS Library:
http://www.highcharts.com/
Du könntest die auch komplett nackt ohne irgendwelche Scripte außm Forum verwenden. (ich mach das zb.)

Dann wurde von khc und anderen Forumsteilnehmern eine Scriptsammlung verfasst um diese Library komfortabel mit IPS nutzen zu können. Um die geht es in diesem Thread.

Später hatte dann Brownson die Scriptsammlung genommen und in seine IPSLibrary verpackt.
Die wird hier diskutiert:

Prinzipiell ist mal beides problemlos nebeneinander lauffähig.
Dies ist aber nicht anzuraten da man sehr leicht ist die Verzeichnisse verwechselt. So ist es auch dir ergangen.

viel Glück
bb

Hallo Powerfreddy und bbernhard,
vielen Dank für die ausührlichen Aufklärungen.
Teile davon waren mir schon klar. Andere nicht.
Hab ich das richtig verstanden, dass die Scriptsammlung von khc, um die es in diesem Threat geht nicht mehr weiter entwickelt wird? Nur noch die von Browson in der Library?
Und das Thema auf das Ihr verlinkt hab ich für einen VorstellungsThreat gehalten. Q&A dachte ich weiterhin hier. War wohl ein Missverständnis.
Dann werd ich wohl dort weiter fragen.
Danke nochmal.

Weiss ich nicht, mein Skript läuft noch mit 2.02, kann aber gerade nicht nachvollziehen, ob ich noch irgendwelche Anpassungen im Lauf der Zeit vorgenommen habe. Die V3.09 der HighCharts habe ich kürzlich runtergeladen und überspielt. Läuft weiterhin.

Gruß
Bruno

So, hab mich dazu entschieden bei khc’s Scripten zu bleiben.
Hab mich also auf die Suche gemacht warum manche Charts mit der HC 3.09 nicht mehr richtig angezeigt werden.
Die Lösung: Sind alle Configs bei denen ich die Configuration „Title“ komplett auskommentiert hatte.

Nun noch mal zurück zum eigentlichen Anliegen (einige Posts weiter unten) wie ich den ChartType „columnrange“ configurieren muss/kann. Hab in der HC-Options-Reference gefunden, dass die highcharts-more.js dazu benötigt wird.
In meinem HC-Verzeichnis ist die vorhanden. Aber wird die überhaupt eingebunden/angesprochen?
Im Script Highcharts_V2.02.ips find ich nix.
Kann mir bitte jemand einen Tipp geben?

Servus Wolfgang

für dein Problem hab ich jetzt nicht direkt eine Lösung parat.
Da du dich scheinbar mehr zur hardcore Fraktion hingezogen fühlst, so kann ich dir auch meine Variante zukommen lassen.
Sie basiert auch auf den khc scripten.
Es sind aber die ganzen array zur formatierung rausgeschmissen und so umgebaut das ich die Formatierungsstrings direkt von der highcharts homepage per copy&paste einfügen kann.
Damit bin ich flexibel für alle neuen highcharts features.
Datenextraktion und Aufbau der HTMLStrings sind von der khc Version geklaut.

Viele Standard Optionen sind in eine „styles datei“ ausgelagert. Damit wird die config Datei sehr sehr viel kürzer. Es ist damit auch einfacher alle Charts gleich aussehen zu lassen.
Zusätzlich hab ich mir noch ein paar Buttons zur interaktiven Auswahl des Plotzeitraumes eingebaut.

Post # 24

„Ich“ tu mir damit leichter, ist aber natürlich Geschmackssache.
Warnung: Hab das nur für mich gmacht, viele Id sind hardgecodet. Support kann und will ich keinen geben.

gruß
bb

Hi,
ich verwende das Highcharts Script und komme an einer Stelle nicht weiter. Die IST und SOLL Temperatur sollen auf der linken Y-Achse, die Stellgröße vom Heizkörper Stellantrieb auf der rechten Y-Achse liegen. Soweit funktioniert das auch.
Nur bekomme ich das nicht hin, dass die linke Y-Achse immer so skaliert wird dass die maximale Auflösung erreicht wird und die rechte Y-Achse immer auf 0-100%.
Ich verwende das Highcharts Script 2.02
Wenn jemand eine Idee hat, wäre ich sehr dankbar.
Danke Schorsch

Hier der Auszug aus dem Script…



	$CfgDaten['HighChart']['Width'] = 0; 			// in px,  0 = 100%
	$CfgDaten['HighChart']['Height'] = 300; 		// in px

	$CfgDaten['yAxis'][0]['title']['text'] = "Temperaturen";
	$CfgDaten['yAxis'][0]['Unit'] = "°C";
	$CfgDaten['yAxis'][0]['opposite'] = false;
	$CfgDaten['yAxis'][0]['tickInterval'] = 0.5;
	//$CfgDaten['yAxis'][0]['min'] = 12.5;
	//$CfgDaten['yAxis'][0]['max'] = 25;

	$CfgDaten['yAxis'][1]['title']['text'] = "Stellantrieb";
	$CfgDaten['yAxis'][1]['Unit'] = "%";
	$CfgDaten['yAxis'][1]['opposite'] = true;
	//$CfgDaten['yAxis'][1]['min'] = 0;
	//$CfgDaten['yAxis'][1]['max'] = 100;
	//$CfgDaten['yAxis'][1]['tickInterval'] = 0;
	$CfgDaten['yAxis'][1]['allowDecimals'] = true;
	$CfgDaten['yAxis'][1]['showFirstLabel '] = false;
	$CfgDaten['yAxis'][1]['showLastLabel '] = false;


	$serie = array();
	$serie['name'] = "Soll Temp.";
	$serie['Id'] = $serieId2;
	$serie['Unit'] = "°C";
	$serie['ReplaceValues'] = false;
	$serie['RoundValue'] = 0;
	$serie['type'] = "spline";
	$serie['yAxis'] = 0;
	$serie['marker']['enabled'] = false;
	$serie['shadow'] = true;
	$serie['lineWidth'] = 3;
	$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'] = "Ist Temp.";
	$serie['Id'] = $serieId1;
	$serie['Unit'] = "°C";
	$serie['ReplaceValues'] = false;
	$serie['RoundValue'] = 1;
	$serie['type'] = "spline";
	$serie['yAxis'] = 0;
	$serie['marker']['enabled'] = false;
	$serie['shadow'] = true;
	$serie['lineWidth'] = 2;
	$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'] = "Stellantrieb";
	$serie['Id'] = $serieId3;
	$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;

Hallo zusammen,

die Frage ist schon fast peinlich, aber ich find nicht die richtigen Suchbegriffe.

Ich suche, wie man Charts verschiedener Zeitlinien (z.b. jetziger Monat - selber im Vorjahr) darstellt.

Hat jemand einen Link, oder besser den richtigen Suchbegriff mit mehreren Ergebnissen?

PS: habe den Beitrag vom ursprünglichen Thread hierherverschoben. Denke, dass dies der richtige Thread ist.

Hallo Communiy,

habe mich jetzt auch an die Highcharts herangetraut, jedoch ohne Erfolg.

Habe mich an die Anleitung gehalten:

Hier mein IP-Symcon Verzeichnis:

Hier die IPS-Baumstruktur:

Das Config-Skript:


<?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']= 18411 /*[Geräte\Highcharts\StringVariable]*/;  // 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']= 49286 /*[Geräte\Highcharts\Highcharts_V2.02.ips]*/;  				// 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)
	$CfgDaten['StartTime'] = mktime(0,0,0, date("m", time()), date("d",time())-10, date("Y",time())); // ab heute 00:00 Uhr
	$CfgDaten['EndTime'] = mktime(23,59,59, date("m", time()), date("d",time()), date("Y",time())); // ab heute 23:59 Uhr, oder //$CfgDaten['EndTime'] = time();   // = bis jetzt

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

	if ($CfgDaten['RunMode'] == "popup")
	{
		$CfgDaten['WebFrontConfigId'] = 26841 /*[Objekt #26841 existiert nicht]*/;
		$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

	// **************************************************************************************
	// *** 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' => 15936, 'Unit'=>"°C");
	$serie['data'][] = array('name'=>'Luftfeuchte', 'Id' => 17593, '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'] = 15936 /*[Geräte\Feuchtesensoren\Temperatur & Feuchtesensor Aussen (317, RH)\Temperatur_Aussen]*/;
	$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'] = 17593 /*[Geräte\Feuchtesensoren\Temperatur & Feuchtesensor Aussen (317, RH)\relFeuchte_Aussen]*/;
	$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 /*[Objekt #44451 existiert nicht]*/;
	//	$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 /*[Objekt #29842 existiert nicht]*/;
	//	$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'] = 0; 			// in px,  0 = 100%
	$CfgDaten['HighChart']['Height'] = 600; 		// in px

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

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

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

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

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



?>

Das Highchart-Skript:


<?
	$version = "2.02"; $versionDate = "20.05.2012";

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

	//--------------------------------------------------------------------------------------------------------------------------------

	// ------------------------------------------------------------------------
	// WriteContentWithFilename
	//    Mit dieser Funktion wird der Content-String geschrieben.
	//    IN: $cfg = ..
	//    IN: $tmpFilename = Der Dateiname welche die Config Daten enthält
	// ------------------------------------------------------------------------
	function WriteContentWithFilename($cfg, $tmpFilename)
	{
		DebugModuleName($cfg,"WriteContentWithFilename");

		if ($tmpFilename != "")
		{
			SetValue($cfg['ContentVarableId'],
						GetContentVariableString ($cfg, "CfgFile", $tmpFilename));
		}
		else
			SetValue($cfg['ContentVarableId'], 'Falsche Parameter beim Funktionsaufruf "WriteContentTextbox"');
	}

	// ------------------------------------------------------------------------
	// WriteContentWithScriptId
	//    Mit dieser Funktion wird der Content-String geschrieben.
	//    IN: $cfg = ..
	//    IN: $scriptId = Die Script Id welche den ConfigString enthält.
	// ------------------------------------------------------------------------
	function WriteContentWithScriptId($cfg, $scriptId)
	{
		DebugModuleName($cfg,"WriteContentWithScriptId");

		if ($cfg['RunMode'] == "popup")
		{
			WFC_SendPopup($cfg['WebFrontConfigId'],
						$cfg['WFCPopupTitle'] ,
						GetContentVariableString ($cfg, "ScriptId", $scriptId));
		}
		else
		{
			SetValue($cfg['ContentVarableId'],
				GetContentVariableString ($cfg, "ScriptId", $scriptId));
		}
	}

	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 . " " .
				"width='100%' height='". $height ."' frameborder='1' scrolling='no'";
		}
		else
		{
			$s = "<iframe src='./User/$chartType/IPS_Template.php?$callBy="	. $callIdent . "' " .
				"width='100%' height='". $height ."' frameborder='0' scrolling='no'></iframe>";
		}
		return $s;
	}

	// ------------------------------------------------------------------------
	// CreateConfigFile
	//    Erzeugt das tmp-Highcharts Config-File mit der $id als Dateinamen
	//    IN: $stringForCfgFile = String welcher in das File geschrieben wird
	// ------------------------------------------------------------------------
	function CreateConfigFile($stringForCfgFile, $id, $charttype = 'Highcharts')
	{
		$path = "webfront\user\\" . $charttype;
		$filename = $charttype . "Cfg$id.tmp";

		return CreateConfigFileByPathAndFilename($stringForCfgFile, $path, $filename);
	}

	// ------------------------------------------------------------------------
	// CreateConfigFileByPathAndFilename
	//    Erzeugt das tmp-Highcharts Config-File
	//    IN: $stringForCfgFile = String welcher in das File geschrieben wird
	// 		 $path, $filename = Pfad un Name des Tmp-Files welches erzeugt werden soll
	// ------------------------------------------------------------------------
	function CreateConfigFileByPathAndFilename($stringForCfgFile, $path, $filename)
	{
		// Standard-Dateiname .....
		$tmpFilename = IPS_GetKernelDir() . $path . "\\" . $filename;

		// schreiben der Config Daten
		$handle = fopen($tmpFilename,"w");
		fwrite($handle, $stringForCfgFile);
		fclose($handle);

		return $tmpFilename;
	}

	// ------------------------------------------------------------------------
	// CheckCfgDaten
	//    Aufruf bei jedem Cfg-Start
	//    IN: $cfg = ..
	//    OUT: korrigierte cfg
	// ------------------------------------------------------------------------
 	function CheckCfgDaten($cfg)
	{
      DebugModuleName($cfg,"CheckCfgDaten");

		global $IPS_SELF, $IPS_SENDER;

		// 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 ($cfg['Ips']['ChartType'] != 'Highcharts' && $cfg['Ips']['ChartType'] != 'Highstock')
		   die ("Abbruch! Es sind nur 'Highcharts' oder 'Highstock' als ChartType zulässig");

		// über WebInterface kommt der Aufruf wenn die Content-Variable aktualisiert wird
		if ($IPS_SENDER != "WebInterface" && $cfg['RunMode'] != "popup")
			$cfg = Check_ContentVariable($cfg, $IPS_SELF);

	   return $cfg;
	}

	// ------------------------------------------------------------------------
	// CreateConfigString
	//    Erzeugt den für Higcharts benötigten Config String und gibt diesen als String zurück
	//    IN: $cfg = ..
	//    OUT: der erzeugte Config String
	// ------------------------------------------------------------------------
	function CreateConfigString($cfg)
	{
      DebugModuleName($cfg,"CreateConfigString");

		$cfg = CompatibilityCheck($cfg);
      $cfg = CheckCfg($cfg);

		$cfgString = GetHighChartsCfgFile($cfg);

		// Zusätzliche Config in Highchart Config hinzufügen
		$cfgString = ReadAdditionalConfigData($cfg) . "
|||
" .  $cfgString;

		// Language Options aus IPS_Template.php hierher verschoben
		$cfgString .=  "
|||
". GetHighChartsLangOptions($cfg);;

		return $cfgString;
	}

	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;
		}
  		return $cfg;
	}

	// ------------------------------------------------------------------------
	// CheckCfg
	//    Prüft daKonfiguration und korrigiert und Vervollständigtdiese zum Teil
	//    IN: $cfg = ..
	//    OUT: der erzeugte Config String
	// ------------------------------------------------------------------------
	function CheckCfg($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'], "");
		}

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

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

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

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

		return $cfg;
	}

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

		IfNotIssetSetValue($cfg['HighChart']['Theme'], "");
		IfNotIssetSetValue($cfg['HighChart']['Width'], 0);
		IfNotIssetSetValue($cfg['HighChart']['Height'], 400);

 		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']);

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

			// 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');
			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ölglich.");
			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;
	}



	// ------------------------------------------------------------------------
	// ReadAdditionalConfigData
	//    zusätzliche Daten für File (hat jetzt aber nichts mit den eigentlichen Highchart Config String zu tun
	//    IN: $cfg
	//    OUT: der String welcher dann in das IPS_Template geschrieben wird.
	// ------------------------------------------------------------------------
	function ReadAdditionalConfigData($cfg)
	{
		DebugModuleName($cfg,"ReadAdditionalConfigData");

		// z.B.: Breite und Höhe für Container
		// Breite und Höhe anpassen für HTML Ausgabe
		$s['Theme'] = $cfg['HighChart']['Theme'];
		if ($cfg['HighChart']['Width'] == 0)
			$s['Width'] = "100%";
		else
			$s['Width'] = $cfg['HighChart']['Width']. "px";

		$s['Height'] = $cfg['HighChart']['Height']. "px";

		return trim(print_r($s, true), "Array
()") ;
	}

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

	// ------------------------------------------------------------------------
	// 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);

		if (isset($cfg['colors']))
			$cfgArr['colors'] = $cfg['colors'];

		$cfgArr['credits'] = CreateArrayForCredits($cfg);

		if (isset($cfg['global']))
			$cfgArr['global'] = $cfg['global'];

		if (isset($cfg['labels']))
			$cfgArr['labels'] = $cfg['labels'];

		// $cfg['lang'])) werden seperat behandelt

		if (isset($cfg['legend']))
			$cfgArr['legend'] = $cfg['legend'];

		if (isset($cfg['loading']))
			$cfgArr['loading'] = $cfg['loading'];

		if (isset($cfg['plotOptions']))
			$cfgArr['plotOptions'] = $cfg['plotOptions'];

		$cfgArr['exporting'] = CreateArrayForExporting($cfg);

		if (isset($cfg['symbols']))
			$cfgArr['symbols'] = $cfg['symbols'];

		$cfgArr['title'] = CreateArrayForTitle($cfg);
		$cfgArr['subtitle'] = CreateArrayForSubTitle($cfg);

		$cfgArr['tooltip'] = CreateArrayForTooltip($cfg);

		$cfgArr['xAxis'] = CreateArrayForXAxis($cfg);
		$cfgArr['yAxis'] = CreateArrayForYAxis($cfg);

		if ($cfg['Ips']['ChartType'] == 'Highstock')
		{
			if (isset($cfg['navigator']))
				$cfgArr['navigator'] = $cfg['navigator'];
			if (isset($cfg['rangeSelector']))
				$cfgArr['rangeSelector'] = $cfg['rangeSelector'];
			if (isset($cfg['scrollbar']))
				$cfgArr['scrollbar'] = $cfg['scrollbar'];
		}


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

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

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

		return $s;
	}

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

		// 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 $s;
	}


	// ------------------------------------------------------------------------
	// 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 );

	   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('%A %d.%m.%Y %H:%M', 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']['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)
	{
		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)
	{
		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);

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

		// Zeilenumbruch, Tabs, etc entfernen ... bin mir nicht so sicher ob das so gut ist
		$s = RemoveUnsupportedStrings($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, "'") . "'";
			}
			$item = utf8_encode($item);

		}
	}

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

		   IPS_LogMessage($IPS_SENDER ." - " .getmicrotime(true) , "Highcharts $version ($versionDate) - $name");
		 }
	}
?>

Die Darstellung im WebFront:

Muss man die String-Variable (~HTMLBox) eigentlich loggen?
In welches Verzeichnis muss die entpackte Datei (ips.js) von template_ips.rar kopiert werden?
IPS_Template.php stammt aus Highcharts_V2.02/IPS_Template/Highscharts/IPS_Template.php und wurde in das Verzeichnis C:\IP-Symcon\webfront\user\Highcharts kopiert. Ist das so korrekt?

Ich hoffe jemand kann mir weiterhelfen.

Vielen Dank

Grüße
Wickie

Hallo Wickie,

wenn Du deine $CfgDaten[‚yAxis‘][1] wieder aktivierst bekommst Du auch einen Chart.

Die String-Variable (~HTMLBox) muss man nicht loggen.

Die ips.js gehört ins \webfront\user\Highcharts\js hemes.

Die IPS_Template.php ist da richtig.

Hallo Wolfgang,

habe ich korrigiert, danke dafür.

Der Graph lässt sich trotzdem nicht darstellen im Webfront:

Hier das dazugehörige Skript:

<?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']= 18411 /*[Geräte\Highcharts\StringVariable]*/;  // 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']= 49286 /*[Geräte\Highcharts\StringVariable\Highcharts_V202.ips]*/;                  // 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)
    $CfgDaten['StartTime'] = mktime(0,0,0, date("m", time()), date("d",time())-1, date("Y",time())); // ab heute 00:00 Uhr
    $CfgDaten['EndTime'] = mktime(23,59,59, date("m", time()), date("d",time()), date("Y",time())); // ab heute 23:59 Uhr, oder //$CfgDaten['EndTime'] = time();   // = bis jetzt
    //$CfgDaten['StartTime'] = time()-60*60*24*1*1; // 1Jahr: 60s*60min*24h*365d
    //$CfgDaten['EndTime'] = time(); // jetzt

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

    if ($CfgDaten['RunMode'] == "popup")
    {
        $CfgDaten['WebFrontConfigId'] = 25689 /*[WebFront]*/;
        $CfgDaten['WFCPopupTitle'] = "Ich bin der Text, welcher als Ueberschrift 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-Ueberschrift";

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

    // **************************************************************************************
    // *** 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' => 15936, 'Unit'=>"°C");
    // $serie['data'][] = array('name'=>'Luftfeuchte', 'Id' => 17593, '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'] = 24896 /*[Geräte\Feuchtesensoren\Temperatur & Feuchtesensor BJ Unterputz (121,T, Speis)\Temperatur]*/;
    $serie['Unit'] = "°C";
    $serie['ReplaceValues'] = false;
    $serie['RoundValue'] = 0;
    $serie['type'] = "line";
    $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'] = 17593 /*[Geräte\Feuchtesensoren\Temperatur & Feuchtesensor Aussen (317, RH)\relFeuchte_Aussen]*/;
    // $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 /*[Objekt #44451 existiert nicht]*/;
    //    $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 /*[Objekt #29842 existiert nicht]*/;
    //    $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'] = 0;             // in px,  0 = 100%
    $CfgDaten['HighChart']['Height'] = 600;         // in px

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

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

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

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

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

$CfgDaten[‚yAxis‘][0] ist aktiviert und

$serie['yAxis'] = 0; bezieht sich auf diese Achse. 

Hast du noch einen Tipp?

Gruß Wickie

Hallo Wickie,
hab Dein Config-Script (wie auch das letzte) mal bei mir (mit Anpassungen der IDs) laufen lassen. Ich bekomm einen Chart.
In der Vergangenheit gabs schon öfters Probleme mit neuinstallationen von HC. Da hat immer was gefehlt. Ich hab mir noch nicht die Mühe gemacht herauszufinden welche Datei/en es ist/sind. Wenn man die neuen Versionen über die Alten bügelt gehts (bei mir).
hier mal mein aktuelles highcharts Verzeichnis zum Download:

http://harbich.homedns.org/IPS

versuchs mal.

Hallo Wolfgang,

danke für deine Dateien. Funktioniert jedoch immer noch nicht…
Kannst du mir vielleicht ein Highchart-Skript von dir zuschicken?

Habe echt keinen Plan mehr.
Am Firefox oder WinXP kann es nicht liegen, oder?

Gruß
Wickie :confused:

Glaub ich nicht.

Mein HC-Script 2.02 von KHC ist untoucht. Sollte man auch nicht verändern. Im Zweifel noch mal das Org. reinkopieren.

Loggst Du die Daten der Variable 24896 ?

yep, tue ich…

Habs :wink:

Mein Automatisierungs-Rechner ist noch ohne Internet.

Habe den IP-Symcon Ordner auf mein Notebook kopiert, welches Internet hat:
–> Highchart-Graph wird korrekt im Webfront dargestellt

Gibt es eine Möglichkeit, Highcharts auch offline zu nutzen?
Schon langsam nervt die Telekom… den Hausanschluss haben sie im Juli gelegt aber immer noch nicht geschafft in freizuschalten… :mad:

Vielen Dank an Wolfgang, für die tolle Unterstützung.
Wenn es keine Möglichkeit gibt, HC offline zu verwenden, dann muss ich halt noch ein paar Wochen warten. Das kann ich verkfraften.

Grüße vom erleichterten Wickie

Hallo Wickie,

HC needs WEB

das wäre mir neu.

Siehe http://forum.highcharts.com/post48606.html#p48606
Dort steht dass Du nur Web benötigst wenn du die Exporting Funktion nutzen willst und keinen eigenen Exporting Server hast.

Hab zum Test mal kurz unseren DSL Stecker gezogen. Alle Charts fukntionieren, auch die die ich heute noch nicht aktualisiert hatte (also kein Cache).

Hallo Wolfgang,

ich verstehe es auch nicht:
Notebook mit Internet: Highchart wird angezeigt
Notebook ohne Internet: Highchart wird angezeigt
IP-Symcon Ordner kopiert auf Desktop-PC
Desktop-PC ohne Internet: Highchart wird nicht angzeigt :confused:

In diesem Thread bin ich auf folgenden Beitrag gestoßen:

einige Beiträge später steht:

Habe die jquery-2.1.0.min.js von der Homepage runtergeladen und in das Verzeichnis highcharts/js kopiert.
Habe jedoch keine Ahnung, in welcher Datei und wie und wo ich folgendes eintragen soll:

<script type="text/javascript" src="js/jquery.min.js"></script>

und das hier gleichzeitig auskommentiere:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>

Komme irgendwie nicht weiter…

Wenn ich im Webfront das ConfigSkript ausführe, erscheint im Highchart ganz kurz diese Webseite: http://ajax.googleapis.com/ajax
Deshalb kann es schon sein, dass eine Internetverbindung notwendig ist, beim Abruf von HC.
Als ich bei meinem Notebook die Internetverbindung beendete, konnte ich jedoch den HC aufrufen. Hatte dabei zwischenzeitlich die y-Achse gespiegelt, um einen Unterscheid feststellen zu können… → wurde korrekt dargestellt.

Grüße
Wickie

Nachtrag:

<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>

befinden sich in C:\IP-Symcon\webfront\user\Highcharts\IPS_Template.php

Hallo Wickie,
habs grade mal getestet. Erstell Dir ein Verzeichnis \webfront\user\jquery und entpack mal die jquery.js aus dem Anhang da rein. Ist die 1.9.1.
Dann kommentier die Zeile

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>  

aus und füg

<script type="text/javascript" src="../jquery/jquery.js"></script>

ein.

Ergebnis?

jquery.zip (78.6 KB)