kein Boolean-Chart mit Highcharts unter IPS 4.0

Hallo Community,

seit dem Umstieg auf IPS 4.0 kann ich keine Boolean-Charts mehr mit Highcharts anzeigen lassen.
Highcharts mit Float-Variablen funktionieren.

Hier 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']= 35070 /*[Geräte\Highcharts\HC_V202a\Technik\Wärmepumpe\WP]*/;  // 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']= 35456 /*[Geräte\Highcharts\HC_V202a\Technik\Wärmepumpe\Highcharts_V202a.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*8*1*1; // 1Jahr: 60s*60min*24h*365d
    //$CfgDaten['EndTime'] = time(); // jetzt

      $ZeitRaum = GetValue(36582 /*[Geräte\Highcharts\HC_V202a\Technik\Wärmepumpe\HC_Zeitraum]*/);
       // AggType: [0=Hour, 1=Day, 2=Week, 3=Month, 4=Year] .. wie der Werte gelesen werden soll
      Switch ($ZeitRaum) {
          Case 0:
          Case 2:
          Case 1:
             $AggType = 0;
             Break;
          Case 7:
          Case 30:
             $AggType = 1;
             Break;
          Case 365:
           Case 90:
          Case 180:
             $AggType = 3;
             Break;
           Default:
           $AggType = 0;
      };
      If ($ZeitRaum == 0) {$ZeitRaum = (1/24);};
      If ($ZeitRaum == 1) {$ZeitRaum = (8/24);};
      If ($ZeitRaum == 2) {$ZeitRaum = (24/24);};
     $EndPunkt = GetValue(14041 /*[Geräte\Highcharts\HC_V202a\Technik\Wärmepumpe\HC_Endpunkt]*/);
     $CfgDaten["EndTime"] = time() + 60 * 60 * 24 * $ZeitRaum * $EndPunkt;
     $CfgDaten["StartTime"] = $CfgDaten["EndTime"] - 60 * 60 * 24 * $ZeitRaum;

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

    // **************************************************************************************
    // *** 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'] = "Sole-Temperatur";
    //    $CfgDaten['yAxis'][0]['Unit'] = "°C";
    //    $CfgDaten['yAxis'][0]['opposite'] = false;
    //$CfgDaten['yAxis'][0]['tickInterval'] = 2.5;
    //$CfgDaten['yAxis'][0]['min'] = 0;
    //    $CfgDaten['yAxis'][0]['max'] = 10;

    $CfgDaten['yAxis'][0]['title']['text'] = "Betrieb";
    $CfgDaten['yAxis'][0]['Unit'] = " ";
    $CfgDaten['yAxis'][0]['opposite'] = true;
    $CfgDaten['yAxis'][0]['tickInterval'] = 0.2;
    $CfgDaten['yAxis'][0]['min'] = 0;
    $CfgDaten['yAxis'][0]['max'] = 1;

    //    $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'] = "T_Sole_RL";
    //    $serie['Id'] = 54883 /*[Geräte\Heizung\Sole\T_Sole_VL_corr]*/ ;
    //    $serie['Unit'] = "°C";
    //    $serie['ReplaceValues'] = false;
    //    $serie['RoundValue'] = 2;
    //    $serie['type'] = "line";
        //$serie['step'] = "left";
    //    $serie['yAxis'] = 0;
    //$serie['AggType'] = 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;
    //$serie['AggValue'] ='Min';
    //    $CfgDaten['series'][] = $serie;

    //    $serie = array();
    //    $serie['name'] = "T_Sole_VL";
    //    $serie['Id'] =   43552/*[Geräte\Temperatursensoren\DS18B20 (10)\T_Sole_RL]*/;
    //    $serie['Unit'] = "°C";
    //    $serie['ReplaceValues'] = false;
    //    $serie['RoundValue'] = 2;
    //    $serie['type'] = "line";
        //$serie['step'] = "left";
    //    $serie['yAxis'] = 0;
    //$serie['AggType'] = 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;
    //$serie['AggValue'] ='Min';
    //    $CfgDaten['series'][] = $serie;


    //        $serie = array();
    //        $serie['name'] = "WP-Betrieb";
    //        $serie['Id'] = 37925 /*[Geräte\Heizung\Betrieb_WP]*/;
    //        $serie['Unit'] = array(0=>'AUS', 1=>'AN');
    	  //$serie['ReplaceValues'] = false;
    //        $serie['ReplaceValues'] = array(0=>0.01, 1=>0.99);
    //        $serie['type'] = "line";
    //        $serie['step'] = "left";
    //        $serie['yAxis'] = 0;
    //        $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'] = "Heizung";
        $serie['Id'] = 46597 /*[Geräte\Heizung\Betrieb_WP_HZ]*/;
        $serie['Unit'] = array(0=>'AUS', 1=>'AN');
    	  //$serie['ReplaceValues'] = false;
        $serie['ReplaceValues'] = array(0=>0.01, 1=>0.99);
        $serie['type'] = "line";
        $serie['step'] = "left";
        $serie['yAxis'] = 0;
        $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'] = "Warmwasser";
        $serie['Id'] = 14285 /*[Geräte\Heizung\Betrieb_WP_WW]*/;
        $serie['Unit'] = array(0=>'AUS', 1=>'AN');
    	  //$serie['ReplaceValues'] = false;
        $serie['ReplaceValues'] = array(0=>0.01, 1=>0.99);
        $serie['type'] = "line";
        $serie['step'] = "left";
        $serie['yAxis'] = 0;
        $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'] = "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;//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
        }
    }



?>

Wenn ich folgenden Abschnitt entferne (Boolean):

$serie = array();
        $serie['name'] = "Heizung";
        $serie['Id'] = 46597 /*[Geräte\Heizung\Betrieb_WP_HZ]*/;
        $serie['Unit'] = array(0=>'AUS', 1=>'AN');
    	  //$serie['ReplaceValues'] = false;
        $serie['ReplaceValues'] = array(0=>0.01, 1=>0.99);
        $serie['type'] = "line";
        $serie['step'] = "left";
        $serie['yAxis'] = 0;
        $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'] = "Warmwasser";
        $serie['Id'] = 14285 /*[Geräte\Heizung\Betrieb_WP_WW]*/;
        $serie['Unit'] = array(0=>'AUS', 1=>'AN');
    	  //$serie['ReplaceValues'] = false;
        $serie['ReplaceValues'] = array(0=>0.01, 1=>0.99);
        $serie['type'] = "line";
        $serie['step'] = "left";
        $serie['yAxis'] = 0;
        $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;

und damit ersetzte (Float):

 $serie = array();
    $serie['name'] = "Photovoltaik";
    $serie['Id'] = 15702 /*[Geräte\S0_Modul\S0 Modul (1)\Pel_PV_02min]*/;//26970;
    $serie['Unit'] = "Watt";
    $serie['ReplaceValues'] = false;
    $serie['RoundValue'] = 1;
    $serie['type'] = "line";	//"column";
    $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;

Dann funktioniert das Skript (mit Float-Variablen).

Wie schaffe ich es, das Skript mit den Boolean-Variablen zum Laufen zu bekommen?

Vielen Dank für Eure Hilfe

Grüße
Wickie

PS: Betriebssystem Ubuntu 14.04

Hallo Community,

hat keiner eine Idee, wieso keine Boolean-Variablen mehr angezeigt werden?

Gibt es denn Fehlermeldungen?

paresy

Hallo Paresy,

nein, es gibt keine Fehlermeldung.

Wenn ich beim Skript eine Float-Variable angebe, dann wird ein Graph erzeugt:

$serie['Id'] = 45285; //14285 /*[Geräte\Heizung\Betrieb_WP_WW]*/;


Wird im identischen Skript eine Boolean-Variable daragestellt, dann erscheint der Graph nicht (hier keine Wertänderung im besagten Zeitraum):

Ändere ich den Zeitraum (–> Woche: Änderung der Variable im besagten Zeitraum), dann wird auch kein Graph angezeigt, es ändert sich jedoch die Skalierung der y-Achse:

Hier das Skript (ConfigHighcharts_V202a.ips):

<?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
	//echo "
",'Eigenverbauch  ' , $EV, "
";

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

    // IPS Variablen IDŽs
    $CfgDaten['ContentVarableId']= 35070 /*[Geräte\Highcharts\HC_V202a\Technik\Wärmepumpe\WP]*/;  // 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']= 35456 /*[Geräte\Highcharts\HC_V202a\Technik\Wärmepumpe\Highcharts_V202a.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*8*1*1; // 1Jahr: 60s*60min*24h*365d
    //$CfgDaten['EndTime'] = time(); // jetzt

      $ZeitRaum = GetValue(36582 /*[Geräte\Highcharts\HC_V202a\Technik\Wärmepumpe\HC_Zeitraum]*/);
       // AggType: [0=Hour, 1=Day, 2=Week, 3=Month, 4=Year] .. wie der Werte gelesen werden soll
      Switch ($ZeitRaum) {
          Case 0:
          Case 2:
          Case 1:
             $AggType = 0;
             Break;
          Case 7:
          Case 30:
             $AggType = 1;
             Break;
          Case 365:
           Case 90:
          Case 180:
             $AggType = 3;
             Break;
           Default:
           $AggType = 0;
      };
      If ($ZeitRaum == 0) {$ZeitRaum = (1/24);};
      If ($ZeitRaum == 1) {$ZeitRaum = (8/24);};
      If ($ZeitRaum == 2) {$ZeitRaum = (24/24);};
     $EndPunkt = GetValue(14041 /*[Geräte\Highcharts\HC_V202a\Technik\Wärmepumpe\HC_Endpunkt]*/);
     $CfgDaten["EndTime"] = time() + 60 * 60 * 24 * $ZeitRaum * $EndPunkt;
     $CfgDaten["StartTime"] = $CfgDaten["EndTime"] - 60 * 60 * 24 * $ZeitRaum;

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

    // **************************************************************************************
    // *** 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'] = "Sole-Temperatur";
    //    $CfgDaten['yAxis'][0]['Unit'] = "°C";
    //    $CfgDaten['yAxis'][0]['opposite'] = false;
    //$CfgDaten['yAxis'][0]['tickInterval'] = 2.5;
    //$CfgDaten['yAxis'][0]['min'] = 0;
    //    $CfgDaten['yAxis'][0]['max'] = 10;

////////////////////////////////////////////////////////////////////////////////
    $CfgDaten['yAxis'][0]['title']['text'] = "Betrieb";
    $CfgDaten['yAxis'][0]['Unit'] = " ";
    $CfgDaten['yAxis'][0]['opposite'] = true;
    //$CfgDaten['yAxis'][0]['tickInterval'] = 0.2;
    //$CfgDaten['yAxis'][0]['min'] = 0;
    //$CfgDaten['yAxis'][0]['max'] = 1;
////////////////////////////////////////////////////////////////////////////////


    //    $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'] = "T_Sole_RL";
    //    $serie['Id'] = 54883 /*[Geräte\Heizung\Sole\T_Sole_VL_corr]*/ ;
    //    $serie['Unit'] = "°C";
    //    $serie['ReplaceValues'] = false;
    //    $serie['RoundValue'] = 2;
    //    $serie['type'] = "line";
        //$serie['step'] = "left";
    //    $serie['yAxis'] = 0;
    //$serie['AggType'] = 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;
    //$serie['AggValue'] ='Min';
    //    $CfgDaten['series'][] = $serie;

    //    $serie = array();
    //    $serie['name'] = "T_Sole_VL";
    //    $serie['Id'] =   43552/*[Geräte\Temperatursensoren\DS18B20 (10)\T_Sole_RL]*/;
    //    $serie['Unit'] = "°C";
    //    $serie['ReplaceValues'] = false;
    //    $serie['RoundValue'] = 2;
    //    $serie['type'] = "line";
        //$serie['step'] = "left";
    //    $serie['yAxis'] = 0;
    //$serie['AggType'] = 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;
    //$serie['AggValue'] ='Min';
    //    $CfgDaten['series'][] = $serie;


    //        $serie = array();
    //        $serie['name'] = "WP-Betrieb";
    //        $serie['Id'] = 37925 /*[Geräte\Heizung\Betrieb_WP]*/;
    //        $serie['Unit'] = array(0=>'AUS', 1=>'AN');
    	  //$serie['ReplaceValues'] = false;
    //        $serie['ReplaceValues'] = array(0=>0.01, 1=>0.99);
    //        $serie['type'] = "line";
    //        $serie['step'] = "left";
    //        $serie['yAxis'] = 0;
    //        $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'] = "Warmwasser";
        $serie['Id'] = 14285; //14285 /*[Geräte\Heizung\Betrieb_WP_WW]*/;
        //$serie['Unit'] = array(0=>'AUS', 1=>'AN');
    	  $serie['ReplaceValues'] = false;
        //$serie['ReplaceValues'] = array(0=>0.01, 1=>0.99);
        $serie['type'] = "line";
        $serie['step'] = "left";
        $serie['yAxis'] = 0;
        $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'] = "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;//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
        }
    }

?>

hier das entspechende Highcharts-Skript (Highcharts_V202a.ips):

<?
	$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;
		echo "Highchartes Zeile 100, s: ", $s, "
";
	}

//echo $z[$i]["ohnePV"], "
";
	// ------------------------------------------------------------------------
	// 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 (isset($variable['VariableValue']['ValueType']) && ($variable['VariableValue']['ValueType'] != 3))//////
   die ("Abbruch - Content-Variable ist keine STRING-Variable.");//////

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

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

		return $cfg;
	}

	// ------------------------------------------------------------------------
	// 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_GetLoggedValuesCompatibility($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");
		 }
	}


	function AC_GetLoggedValuesCompatibility($instanceID, $variableID, $startTime, $endTime, $limit) {
    $values = AC_GetLoggedValues($instanceID, $variableID, $startTime, $endTime, $limit );
    if((sizeof($values) == 0) || (end($values)['TimeStamp'] > $startTime)) {
        $previousRow = AC_GetLoggedValues($instanceID, $variableID, 0, $startTime - 1, 1 );
        $values = array_merge($values, $previousRow);
    }
    return $values;
}

?>

hier das ips.js:

/**
 * IPS theme for Highcharts JS
 * @author sanman
 */

Highcharts.theme = {
	colors: ["#DDDF0D", "#7798BF", "#55BF3B", "#DF5353", "#aaeeee", "#ff0066", "#eeaaee", 
		"#55BF3B", "#DF5353", "#7798BF", "#aaeeee"],
	chart: {
		backgroundColor: 'transparent',
		borderWidth: 0,
		borderRadius: 0,
		plotBackgroundColor: null,
		plotShadow: false,
		plotBorderWidth: 0
	},
	title: {
		style: { 
			color: '#FFF',
			font: '16px Arial, sans-serif'
		}
	},
	subtitle: {
		style: { 
			color: '#DDD',
			font: '12px Arial, sans-serif'
		}
	},
	xAxis: {
		gridLineWidth: 0,
		lineColor: '#999',
		tickColor: '#999',
		labels: {
			style: {
				color: '#999',
				fontWeight: 'bold'
			}
		},
		title: {
			style: {
				color: '#AAA',
				font: 'bold 12px Arial, sans-serif'
			}				
		}
	},
	yAxis: {
		alternateGridColor: null,
		minorTickInterval: null,
		gridLineColor: 'rgba(255, 255, 255, .1)',
		lineWidth: 0,
		tickWidth: 0,
		labels: {
			style: {
				color: '#999',
				fontWeight: 'bold'
			}
		},
		title: {
			style: {
				color: '#AAA',
				font: 'bold 12px Arial, sans-serif'
			}				
		}
	},
	legend: {
		itemStyle: {
			color: '#CCC'
		},
		itemHoverStyle: {
			color: '#FFF'
		},
		itemHiddenStyle: {
			color: '#333'
		}
	},
	labels: {
		style: {
			color: '#CCC'
		}
	},
	tooltip: {
		backgroundColor: {
			linearGradient: [0, 0, 0, 50],
			stops: [
				[0, 'rgba(96, 96, 96, .8)'],
				[1, 'rgba(16, 16, 16, .8)']
			]
		},
		borderWidth: 0,
		style: {
			color: '#FFF'
		}
	},
	
	
	plotOptions: {
		line: {
			dataLabels: {
				color: '#CCC'
			},
			marker: {
				lineColor: '#333'
			}
		},
		spline: {
			marker: {
				lineColor: '#333'
			}
		},
		scatter: {
			marker: {
				lineColor: '#333'
			}
		}
	},
	
	toolbar: {
		itemStyle: {
			color: '#CCC'
		}
	},
	
	navigation: {
		buttonOptions: {
			backgroundColor: {
				linearGradient: [0, 0, 0, 20],
				stops: [
					[0.4, '#606060'],
					[0.6, '#333333']
				]
			},
			borderColor: '#000000',
			symbolStroke: '#C0C0C0',
			hoverSymbolStroke: '#FFFFFF'
		}
	},
	
	exporting: {
		buttons: {
			exportButton: {
				symbolFill: '#55BE3B'
			},
			printButton: {
				symbolFill: '#7797BE'
			}
		}
	},	
	
	// special colors for some of the demo examples
	legendBackgroundColor: 'rgba(48, 48, 48, 0.8)',
	legendBackgroundColorSolid: 'rgb(70, 70, 70)',
	dataLabelsColor: '#444',
	textColor: '#E0E0E0',
	maskColor: 'rgba(255,255,255,0.3)'
};

// Apply the theme
var highchartsOptions = Highcharts.setOptions(Highcharts.theme);

und das IPS_Template.php:

<?php 
	// ab IPS-Highcharts Script V2.0000		 
	// 07.05.2012 	geändert auf jquery/1.7.2
	
	if (!isset($_GET['CfgFile'])) 
      { 
       $CfgFile = false; 
      } 
   else 
      { 
       $CfgFile = $_GET['CfgFile']; 
      } 

   if (!isset($_GET['ScriptId'])) 
      { 
       $iScriptId = false; 
      } 
   else 
      { 
       $iScriptId = (int)$_GET['ScriptId']; 
      } 

	
	// ScriptId wurde übergeben -> aktuelle Daten werden geholt
	if ($iScriptId != false)
	{
		$ConfigScript=IPS_GetScript($iScriptId);      // Id des Config Scripts
	
		include_once(IPS_GetKernelDir() . "scripts/" .$ConfigScript['ScriptFile']);
		global $sConfig;
		//$sConfig = IPS_RunScriptWait($iScriptId);
		$s = utf8_encode($sConfig);	
		
	}
	// Filename würde übergeben -> Daten aus Datei lesen
	else if ($CfgFile != false)
	{
		// prüfen ob übergeben Datei existiert
		if (!file_exists($CfgFile))
		{
			echo "Datei '$CfgFile' nicht vorhanden!!!";
			return;
		}

		// file vorhanden -> einlesen
		$handle = fopen($CfgFile,"r");
		$s ="";
		while (!feof($handle))
		{
			$s .= fgets($handle);
		}
		fclose($handle);
		$s = utf8_encode($s);	
	}
	else
	{
		echo "Achtung! Fehlerhafte Parameter CfgFile bzw ScriptId";
		return;
	}
	
	// Bereiche splitten -> erster Teil sind diverse Config Infos, zweiter Teik sind die Daten für Highcharts
	$s = explode("|||" , $s);
	
	if (count($s) >= 2)
	{
		$TempString = trim($s[0],"
 ");
		$JavaScriptConfigForHighchart = $s[1];	
		
		$LangOptions="lang: {}";
		if (count($s) > 2)
			$LangOptions = trim($s[2],"
 ");
		
		// aus den Daten ein schönes Array machen
		$TempStringArr = explode("
", $TempString);
		foreach($TempStringArr as $Item)
		{
			$KeyValue = explode("=>", $Item);
			$AdditionalConfigData[trim($KeyValue[0]," []")] = trim($KeyValue[1]," ");
		}
		
		// Verzeichnis + Theme
		if ($AdditionalConfigData['Theme'] != '')
			$AdditionalConfigData['Theme']= 'js/themes/' . $AdditionalConfigData['Theme'];

		//$AdditionalConfigData["Height"]="1200px";
		//$AdditionalConfigData["Width"]="600px";

			
	}
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
		<title>Highcharts</title>
		
		<!-- 1. Add these JavaScript inclusions in the head of your page -->
		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
		<!-- wenn lokal vorhanden .... <script type="text/javascript" src="jquery/1.7.2/jquery.js"></script> -->
		<script type="text/javascript" src="js/highcharts.js"></script>
		
		<!-- 1a) add a theme file -->
		<script type="text/javascript" src="<?php echo $AdditionalConfigData['Theme'] ?>"></script>
			
		<!-- 1b) the exporting module -->
		<script type="text/javascript" src="js/modules/exporting.js"></script>
		
		<!-- 2. Add the JavaScript to initialize the chart on document ready -->
		
		<script type="text/javascript">

		var chart;
			Highcharts.setOptions({<?php echo $LangOptions; ?>});
				
			$(document).ready(function() {
				chart = new Highcharts.Chart({<?php echo $JavaScriptConfigForHighchart; ?>});

		</script>
	</head>
		
	<body>
	
		<!-- 3. Add the container -->
		<div id="container" style="width: <?php echo $AdditionalConfigData['Width'] ?>; height: <?php echo $AdditionalConfigData['Height'] ?>; margin: 0 auto"></div>
	</body>
</html>

hier die Boolean-Variable im Standard-IPS-Chart:

Viele Grüße
Wickie

Hab dasselbe Problem…

Hallo in die Runde,

das erste Problem konnte ich eingrenzen:
der Befehl

$serie['Unit'] = array(0=>'AUS', 1=>'AN');

führt zu folgender Fehlermeldung im Highcharts.ips Skript:

Notice: Array to string conversion in /var/lib/symcon/scripts/35456.ips.php on line 1268

nach Auskommentieren der entsprechenden Zeile

//$s .= "[this.y + ' ". $Serie['Unit']."'],";

und

$s .= "test"; // Fehler mti IPS 4.0

macht das Skript schon mal weiter…
Wie lautet die Zeile richtig? Bzw. wo steckt der Fehler?

Bis zu folgendem Befehl:

$serie['ReplaceValues'] = array(0=>0.01, 1=>0.99);

dann erscheint kein Graph mehr. Kommentiere ich die betreffende Zeile aus, dann erscheint der Graph:


Ich möchte ihn jedoch nicht als „Sägezahn“, sonder als 0 & 1.
Kann mir jemand weiterhelfen?

Anbei das entsprechende 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']= 35070 /*[Geräte\Highcharts\HC_V202a\Technik\Wärmepumpe\WP]*/;  // 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']= 35456 /*[Geräte\Highcharts\HC_V202a\Technik\Wärmepumpe\Highcharts_V202a.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*8*1*1; // 1Jahr: 60s*60min*24h*365d
    //$CfgDaten['EndTime'] = time(); // jetzt

      $ZeitRaum = GetValue(36582 /*[Geräte\Highcharts\HC_V202a\Technik\Wärmepumpe\HC_Zeitraum]*/);
       // AggType: [0=Hour, 1=Day, 2=Week, 3=Month, 4=Year] .. wie der Werte gelesen werden soll
      Switch ($ZeitRaum) {
          Case 0:
          Case 2:
          Case 1:
             $AggType = 0;
             Break;
          Case 7:
          Case 30:
             $AggType = 1;
             Break;
          Case 365:
           Case 90:
          Case 180:
             $AggType = 3;
             Break;
           Default:
           $AggType = 0;
      };
      If ($ZeitRaum == 0) {$ZeitRaum = (1/24);};
      If ($ZeitRaum == 1) {$ZeitRaum = (8/24);};
      If ($ZeitRaum == 2) {$ZeitRaum = (24/24);};
     $EndPunkt = GetValue(14041 /*[Geräte\Highcharts\HC_V202a\Technik\Wärmepumpe\HC_Endpunkt]*/);
     $CfgDaten["EndTime"] = time() + 60 * 60 * 24 * $ZeitRaum * $EndPunkt;
     $CfgDaten["StartTime"] = $CfgDaten["EndTime"] - 60 * 60 * 24 * $ZeitRaum;


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

    // **************************************************************************************
    // *** 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'] = "Betrieb";
    $CfgDaten['yAxis'][0]['Unit'] = " ";
    $CfgDaten['yAxis'][0]['opposite'] = true;
    $CfgDaten['yAxis'][0]['tickInterval'] = 0.2;
    $CfgDaten['yAxis'][0]['min'] = 0;
    $CfgDaten['yAxis'][0]['max'] = 1;

    //    $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'] = "Warmwasser";
    $serie['Id'] = 14285 /*[Geräte\S0_Modul\S0 Modul (1)\Pel_PV_02min]*/;//26970;
    //$serie['Unit'] = "Watt";
    $serie['Unit'] = array(0=>'AUS', 1=>'AN');
    $serie['ReplaceValues'] = false;
    //$serie['ReplaceValues'] = array(0=>0.01, 1=>0.99);  // org
    $serie['RoundValue'] = 1;
    $serie['type'] = "line";	//"column";
    $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['step'] = "left";
 
    

    $serie = array();
    $serie['name'] = "Heizung";
    $serie['Id'] = 46597 /*[Geräte\S0_Modul\S0 Modul (1)\Pel_Verbrauch_02min]*/;
    $serie['Unit'] = "Watt";
    $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'] = "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'] = 450;         // 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
        }
    }



?>

und 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;
		echo "Highchartes Zeile 100, s: ", $s, "
";
	}

//echo $z[$i]["ohnePV"], "
";
	// ------------------------------------------------------------------------
	// 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 (isset($variable['VariableValue']['ValueType']) && ($variable['VariableValue']['ValueType'] != 3))//////
   die ("Abbruch - Content-Variable ist keine STRING-Variable.");//////

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

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

		return $cfg;
	}

	// ------------------------------------------------------------------------
	// 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_GetLoggedValuesCompatibility($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']."'],";
			      $s .= "test"; // Fehler mti IPS 4.0
			      
		      }
				$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");
		 }
	}


	function AC_GetLoggedValuesCompatibility($instanceID, $variableID, $startTime, $endTime, $limit) {
    $values = AC_GetLoggedValues($instanceID, $variableID, $startTime, $endTime, $limit );
    if((sizeof($values) == 0) || (end($values)['TimeStamp'] > $startTime)) {
        $previousRow = AC_GetLoggedValues($instanceID, $variableID, 0, $startTime - 1, 1 );
        $values = array_merge($values, $previousRow);
    }
    return $values;
}

?>

Vielen Dank für Eure Tipps
Wickie

Hallo,

ist zwar nicht die endgültige Lösung, als Gedankenanstoß evtl. für weitere Fehlersuche brauchbar.
Könnte es an Umlauten (Deutsch/Englisch/Spracheinstellung) liegen?

So funktioniert es bei mir nicht (leerer Graph, keine Fehlermeldung);

$serie['ReplaceValues'] = array(0=>2.5, 1=>20);

So funktioniert es:

$serie['ReplaceValues'] = array(0=>2,5, 1=>20);

Ich habe, wie auf den beigefügten Bildern ersichtlich, auch noch fehlerhafte Achsenbeschriftungen bei Umlauten.

Allerdings sind bei mir die Voraussetzungen etwas anders.
Ich habe gestern endlich - nach Umzug von Win7 und langem Verzicht auf Graphen - Highchart 3.0 auf einen Raspi(Jessie) installiert nach diesem Besispiel [Highcharts - Multigraph.

](https://www.symcon.de/forum/threads/17625-Highcharts-Multigraph?highlight=highchart+khc)

Das liegt am Umgang von IPS/PHP mit den lokalen Einstellungen des Betriebssystems unter Linux. Unter Windows wäre das nicht passiert.
Unter Linux gilt unter der Spracheinstellung deutsch das Komma (’,’) als Dezimaltrenner (Beispiel Float-Wert: 3,1415), unter Spracheinstellung englisch wie gehabt der Punkt (’.’) als Dezimaltrenner (Beispiel Float-Wert: 3.1415).
Ich hab mir deswegen auch schon in meinen Projekten den Wolf gesucht (und hatte noch keinen RasPi als lebende Testumgebung).

Bedanken dürft Ihr Euch dafür bei IP-Symcon, die dieses Thema nicht mal ignorieren (sind ja nur die Nutzer, die sich daran aufreiben) :smiley:


array(0=>2,5, 1=>20);

Das kann leider nicht korrekt sein, da durch das Komma das Array nun 3 statt zwei Elemente hat.

paresy

Hallo Community,

hallo khge,
du hast mir mit deinen Beiträgen auf die Sprünge geholfen. Dank dir:
ich hatte bei mir zwei Fehler im Skript:

$serie['type'] = "line";

dort stand „spline“ anstatt „line“

$serie['step'] = true;

diese Zeile fehlte einfach… :rolleyes:

Das Skript scheint trotzdem einige Macken zu haben:
Wenn man „Replace Values“ auf false setzt:

$serie['ReplaceValues'] = false;

dann erscheint gar kein Graph.
Bei

$serie['ReplaceValues'] = array(0=>0,3, 1=>1,7);

erscheint der Graph:


der Graph erscheint auch, wenn man folgendes eingibt:

$serie['ReplaceValues'] = array(0=>0, 1=>1); 

→ der Array

array(0=>0,3, 1=>1,7)

ist also ein Array mit 4 Elementen (0 3 1 7).
Wird der Befehl

$serie['ReplaceValues'] = array(0=>0.3, 1=>1.7);

angegeben, dann erscheint gar kein Graph…

@khge
bei dir dürfte dein Code

$serie['ReplaceValues'] = array(0=>2,5, 1=>20);

identisch sein zu

$serie['ReplaceValues'] = array(0=>2, 1=>20);

Bei mir funktioniert die Chartdarstellung wieder, die Syntax verstehe ich aber immer noch nicht, bzw. wo genau der Fehler bei „Reaplace Values“ liegt.
Das gleiche Problem dürfte bei

$s .= "[this.y + ' ". $Serie['Unit']."'],";  

vorliegen.

Viele Grüße
Wickie

Hallo Community,

ich kann zwar mittlerweile wieder Boolean-Charts unter Highcharts darstellen, jedoch nicht zusammen mit Float-Variablen.

Kann es einen Zusammenhang mit diesem Problem sein?
https://www.symcon.de/forum/threads/32482-Bild-ablegen-abh%C3%A4ngig-vom-Betriebsystem

Macht es Sinn, in den Skripten nach

\\

zu suchen und mit

.DIRECTORY_SEPARATOR.

zu ersetzen?

Das Betriebssystem ist Ubuntu 14.4 (mit IPS 4.0)

Danke für Tipps
Wickie