Q&A Highcharts - Multigraph V1.0

Hallo Wolfgang,

vielleicht kannst Du mir nochmals wegen den Tooltipp helfen:

wenn ich den Link von Dir folge und den Tooltip so reinkopiere zeigt er nichts an.

ich habe nun mal schrittweise den Tooltipp aufgebaut.
So kommt eine Anzeige:

		 $CfgDaten['tooltip']['formatter'] = "@function() {return '<b>' + Highcharts.dateFormat('%A, %d.%m.%Y', this.x) +'<\br>'  + ': ' + Highcharts.dateFormat('%H:%M', ((this.y*3600))*1000) + ' h</b>'}@";

Sobald ich this.series.name reinnehme leider nicht mehr:

		 $CfgDaten['tooltip']['formatter'] = "@function() {return '<b>' + Highcharts.dateFormat('%A, %d.%m.%Y', this.x) +'<\br>' + this.series.name + ': ' + Highcharts.dateFormat('%H:%M', ((this.y*3600))*1000) + ' h</b>'}@";

hier nochmals das Script um den Tooltipp herum:

// **************************************************************************************
    // *** tooltip *** http://www.highcharts.com/ref/#tooltip
    // **************************************************************************************
      $CfgDaten['tooltip']['useHTML']            = true;
       $CfgDaten['tooltip']['enabled']            = true;
       $CfgDaten['tooltip']['shared']            = true;
       $CfgDaten['tooltip']['crosshairs'][]    = array('width' =>1,'color' =>'grey','dashStyle'=>'dashdot' );

//       $CfgDaten['tooltip']['formatter']        = ''; // '' (aus HC) erzeugt HC-eigenen Standard TT; Null (aus IPS) erzeugt nur einen TT wenn nicht shared

        // Hintergrund für die nächsten Zeilen:
        // Die Basis ist aus http://www.ip-symcon.de/forum/f53/highcharts-multigraph-17625/#post161572 Abteilung 2. shared Tooltip
        // um die series.name und die series.value im Blocksatz anzuzeigen wurden Elemente aus http://www.ip-symcon.de/forum/f52/q-highcharts-v2-0-a-18312/index3.html#post172829
        // verwendet (Thema Tabelle)
        // Gründe der Funktionen:
        // 1. Umsortierung der Datenzeilen im TT. Herkunft: http://stackoverflow.com/questions/6867607/want-to-sort-highcharts-tooltip-results
        //        var sortedPoints = this.points.sort(function(a, b)
      //          {return ((a.y < b.y) ? -1 : ((a.y > b.y) ? 1 : 0));});
      //    und sortedPoints in '$.each(sortedPoints, function(i, point)'
      //
        //        abweichend vom Code in http://www.ip-symcon.de/forum/f52/q-highcharts-v2-0-a-18312/#post173569
        //     Die Option lineColor aus plotOptions.areaspline.lineColor funktioniert auch direkt unter series. Der Wert series.lineColor kann von der series.color in
        //        Charts vom type areaspline abweichen. Im vorliegenden Chart wurden die series.color verwendet um einen Chart zu erzeugen, der optisch ähnlich dem von
        //        Brownson in IPS Twilight ist, logisch aber nichts mehr mit den series.color zu tun hat. Da sich die series.color zu überlagern scheinen und HC diesbezügliche
        //        keine ConfigurationsMöglichkeiten bietet, wurden diese in o.g. series Configuration mit dem niedrigsten Wert als letzten deklariert und sollten in der
        //        Reihenfolge nicht geändert werden.
        //    Um die Serien in den TT wieder logisch anzuodnen wurde o.g. und unten realisierter Code verwendet.
        //    2.    Zuweisen der in 1. bezeichneten series.lineColor
        //    var colorX ...
        //    Da wie o.g. die Farben der series.color durch die areaspline bedingte series Anordung nicht mehr logisch sondern nur noch optischen Wert hat, wurden die
        //    Farben der Linien im TT durch o.g. und unten realisierter Code realisiert.
		 $CfgDaten['tooltip']['formatter'] = "@function() {return '<b>' + Highcharts.dateFormat('%A, %d.%m.%Y', this.x) +'<\br>' + this.series.name + ': ' + Highcharts.dateFormat('%H:%M', ((this.y*3600))*1000) + ' h</b>'}@";

/*
        $CfgDaten['tooltip']['formatter'] = "@function() {
            var s;
                var s = '<b>' + Highcharts.dateFormat('%A, %d.%m.%Y', this.x) + '</b>';
                var sortedPoints = this.points.sort(function(a, b)
                {return ((a.y < b.y) ? -1 : ((a.y > b.y) ? 1 : 0));});
                s += '<table cellspacing=\"0\" cellpadding=\"0\">';
                $.each(sortedPoints, function(i, point)
                {var colorX = {
                    '".@$CfgDaten['series'][0]['name']."': '".@$CfgDaten['series'][0]['lineColor']."',
                    '".@$CfgDaten['series'][1]['name']."': '".@$CfgDaten['series'][1]['lineColor']."',
                    '".@$CfgDaten['series'][2]['name']."': '".@$CfgDaten['series'][2]['lineColor']."',
                    '".@$CfgDaten['series'][3]['name']."': '".@$CfgDaten['series'][3]['lineColor']."',
                    '".@$CfgDaten['series'][4]['name']."': '".@$CfgDaten['series'][4]['lineColor']."',
                    '".@$CfgDaten['series'][5]['name']."': '".@$CfgDaten['series'][5]['lineColor']."',
                    '".@$CfgDaten['series'][6]['name']."': '".@$CfgDaten['series'][6]['lineColor']."',
                    '".@$CfgDaten['series'][7]['name']."': '".@$CfgDaten['series'][7]['lineColor']."',
                }[point.series.name];

            s += '<td colspan= 0><b><span style=color:' + colorX + '>' + this.series.name + ': </b></span></td>
                    <td><b><span style=color:' + colorX + '>' + Highcharts.dateFormat('%H:%M', (this.y*3600)*1000) + ' h</b></span></td>';
          s += '</tr>';
            });
            s += '</table>';
            return s;
            }@";
*/

Gruss
Thomas

Hallo Thomas4711,

steht dein ToolTipp-Part im Script noch immer über/vor dem Series-Part wie in Deinem ersten Beispiel?

Dann verschieb den ToolTipp-Part mal unter den Series-Part.

Kann man eigentlich be den Highcharts die Linien irgendwie glätten?

Ich habe nämlich jetzt einen Sensor im Wasserbett und der zeigt über lange Zeiten ganz konstante Werte an. Die Linie im HighChart ist aber etwas zackig. Das würde ich gerne glätten (weniger Messpunkte?).

Hallo Uhlhorn,

wenn die Linie zackig ist, hat Du auch verschiedene Werte. Um zu glätten könntest Du die Werte runden und/oder den ChartTyp von line auf spline ändern.

Danke für die Antwort. Auf Spline steht er schon. Wie glätte ich die Werte? Ich lasse ja nur die Sensoren loggen.
Im Moment sieht der Graph aus wie eine von einer Tremor-Hand gekritzelte Linie.

Poste mal Dein Script.

HC kann max 1000 Datenpunkte. Ich hab mir deshalb für manche Temperatursensoren die zu viele Daten schicken (mit Genuigkeit die ich nicht benötige) eine Hilfsvariable angelegt in die geloggt wird. Das Script wird aufgerufen bei Variablenänderung der Sensorvariablen und prüft die Differenz zum letzten Wert der Hilfsvariable. Wenn der kleiner als meine Vorgabe dann wird die Hilfsvariable nicht aktualisiert. Wenn mein vorgegebener Differentwert erreicht wurde, wird die Hilfsvariable gleich gerundet aktualisiert. Somit hab ich zum loggen und darstellen deutlich weniger Daten.
Bsp: Temperaturen in Technikraum im Keller. Geloggt auf eine Nachkommastelle bei einer Differenz von 0.2°. Im HC-Script hab ich dann (nur für den Screenshot) noch $serie[‚RoundValue‘] = 0; gesetzt.

Hallo zusammen,
ich mühe mich momentan ab, die Highcharts auf dem Raspberry zum Laufen zu bekommen. Anfangs hatte ich einige Fehlermeldungen, die ich beseitigen konnte, in dem ich im Skript Highcharts_V3.00 in einigen Funktionen „global $_IPS;“ ergänzt habe. Außerdem habe ich in der Funktion „Check_ContentVariable“ folgende Zeile geändert:

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

Einige Beispielkonfigurationen mit statischen Werten für die x-Achse, die in dem Konfigurationsfile als
$serie[‚data‘] = [1, 2, 3 … eingetragen werden, funktionieren bereits. Datenreihen, die ich im Archiv habe, werden aber nicht dargestellt. Es sieht so aus, als wenn die x-Werte nicht ausgewertet werden. Vielleicht habe ich in der Config-Datei (als Highcharts-Neuling) aber auch noch einen Fehler.

Hat einer von Euch auf dem Raspberry mit den Highcharts schon Erfolgt gehabt?

Gruß
Peter

Hallo

habe gerade die neue 3.0 Version geladen und konfiguriert
läuft auch wieder einigermassen , nur die Zeitwahl geht noch nicht richtig
in Version 2.2 hatte ich noch variablen für die angezeigte dauer (HC_Zeitraum ), die wird auch richtig gefüttert
und eine Variable (HC_Endpunkt) auch die wird versorgt
nun mein Problem:
ich weiss nicht wo im Skript die variablen verlinkt sind, sprich wo ich auf diese Variablen verweisen muss
die Zeitraum Anwahl geht dementsprechend auch nicht im Highchart

kann mir da wer helfen?

gruss Roman

hat sich erledigt

Hallo zusammen,

ich habe das Problem, dass Null-Werte über einen längeren Zeitraum nicht als solches dargestellt werden. Stattdessen wird der zuerst aufgetretene Nullwert mit dem ersten Wert ungleich Null verbunden (siehe Pfeile im Bild)). Herausgefunden habe ich, dass das Archiv nur geänderte Werte mit Timestamp speichert (ich logge die Werte alle 5 Minuten).
Gibt es hier eine elegante Lösung?

Grüße
Matthias

Hallo Matthias,

eine ganz unelegante Methode:
Wenn sich der Wert zur letzten Speicherung (bei dir 5Min) nicht geändert hat, dann zähle einen minimalen Wert (z.B. 0,01W --> 0,01W * 12 * 24 = ca. 3W pro Tag) zum alten Wert dazu.

Grüße
Wickie

Hallo Wickie,
das wäre natürlich möglich.
Ich könnte auch überprüfen, ob der aktuelle Wert > 0 und der letzte Wert=0 ist und für diesen Fall einen Log-Eintrag dazwischen mit P=0.1W ergänzen.
Meine Hoffnung ist noch, dass es hier eine ganz einfache Lösung gibt, da doch andere auch mit diesem Problem zu tun haben müssen.
Gruesse
Matthias

Ich habe beim Recherchieren im Forum den Tipp -also die Lösung- gefunden (#671), die Messwerte nicht direkt zu verbinden, sondern stufig darzustellen:

$serie[‚name‘] = „Leistung Verbrauch aus Netz“;
$serie[‚step‘] = „left“;

Q&A Highcharts - Multigraph V1.0 - Seite 68

Übrigens: Die Verbräuche nachts werden nicht geloggt, da ich alle Werte aus einem Kostal Piko ermittele und dieser nachts natürlich ausgeschaltet ist. Dies werde ich noch mittels eines separaten Verbrauchszähler korrigieren.

Grüße
Matthias

Hat von Euch schon mal jemand ein Windrose Diagramm genutzt und hat dafür ein Beispiel einer Config?
Wind rose | Highcharts

Hallo zusammen,

Ich habe Highcharts V3.00 erfolgreich eingebunden. Hier ein Auszug von meiner Serie:

// Datendefinition
	// ---------------

	$serie['Id'] 					= $id_state[$idx];
	$serie['data']                                    = NULL;
	$serie['name'] 												= $name_dev[$idx];
	$serie['AggType'] 											= NULL;
	$serie['Unit'] 												= NULL;
	$serie['type'] 												= $type[$idx];
	$serie['zIndex'] 												= $z_idx[$idx];
	$serie['color'] 												= $color[$idx];
	$serie['step'] 												= true;
	$serie['ReplaceValues'] 									= $a_rpl;#array(0=>$rpl_l ,1=>$rpl_h);
	$serie['yAxis'] 												= $y[$idx];
	$serie['visible'] 											= true;
	$serie['shadow'] 												= true;
	$serie['lineWidth'] 											= 1.2;
	$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;

Ich würde aber gerne von extern Daten liefern. Sprich auf

$serie[data] = $data

ein Array ($data) im folgenden Format anlegen:

Array
(
    [0] => Array
        (
            [0] => 1479682800000
            [1] => 2
        )

    [1] => Array
        (
            [0] => 1479683100000
            [1] => 3
        )

    [2] => Array
        (
            [0] => 1479683400000
            [1] => 4
        )

    [3] => Array
        (
            [0] => 1479683700000
            [1] => 2
        )

    [4] => Array
        (
            [0] => 1479684000000
            [1] => 1
        ) ... usw.

Das 1. Element ist immer der Unix-Zeitstempel und das 2. Element der Wert der Variable.
Dies klappt aber leider nur halbwegs. Sobald ich das externe Array anlege wird zwar der Chart gezeichnet aber immer mit einem Zeitversatz von einer Stunde nach hinten. Es sieht so aus als würde er dann UTC nehmen. :confused:

Hat vielleicht jemand eine Idee?

Hallo sunny2002,

wie erstellst Du denn das Array?

Hi Wolfgang,

Ich erstelle das Array mit diesem Eintrag:

		$data = IPS_Array_to_HCData($RoundedValue, array_reverse(AC_GetAggregatedValues(AC_HANDLER_ID, $id_state[$idx], $AggType, $CfgDaten["StartTime"], $CfgDaten["EndTime"], 10000)));

Die Funktion „IPS_Array_to_HCData“ stammt von Raketenschnecke:

// Function IPS_Array_to_HCData, wandelt ein Datenarray aus IPS in Array mit Wertepaaren [Timestamp, Value] um
function IPS_Array_to_HCData($RoundValue, $Array)
{
	/* Übergabe-Parameter:
	   * $RoundValue        => Rundungsfaktor
	   * $Array             => IPS Datenarray (erzeugt mit AC_Get-Befehlen)
	*/

	$result        = array();
	foreach($Array as $key=>$rs)
	{

	   $result[$key][]   = $rs['TimeStamp']*1000;                                 // Timestamp für JS (*1000)
	   if(isset($rs['Value']))
			$result[$key][]   = round($rs['Value'], $RoundValue);
		if(isset($rs['Avg']))
		   $result[$key][]   = round($rs['Avg'], $RoundValue);
	}
	$result1    = array_values($result);

	return $result1;
}

$CfgDaten[„StartTime“] und $CfgDaten[„EndTime“] habe ich jetzt testweise mal damit versucht:

	$ts                        										= mktime(0,0,0, date("m"), date("d"), date("Y"));
	$te                        										= mktime(23,59,59, date("m"), date("d"), date("Y"));

	// Zeitraum welcher dargestellt werden soll (kann durch die Zeitvorgaben in den Serien verändert werden)
	if (!isset($CfgDaten["StartTime"]))
	 	$CfgDaten["StartTime"] = $ts; 
	if (!isset($CfgDaten["EndTime"]))
		$CfgDaten["EndTime"] = $te;

Hallo sunni2002,

bist Du mittlerweile auf der Schiene RS-Spielwiese?

Auf welchem Betriebssystem läuft IPS?
Ist Deine Zeitzone korrekt?
Hast Du die IPS-Library installiert?

Sind die Werte, abgesehen vom ZeitOffset, plausiebel?
Stimmen die Zeiten und Werte in einem nativen IPS-Chart?

Poste mal das komplette Script.

Hi Wolfgang,

Danke für die Spielwiese. Damit klappt auch alles wunderbar wie es soll:)

  • Bei mir läuft IPS auf einem Windows 10 Pro 64bit System
  • Zeitzone ist korrekt (UTC+01:00 - Amsterdam, Berlin, …)
  • Ja, die IPS-Library habe ich installiert. Warum?
  • Die Werte sind plausibel. Die beiden HC3-Charts sehen nur aufgrund der Aggregationsstufe unterschiedlich aus. Aber im Grunde nach sind sie gleich, bis auf die Zeitverschiebung.
  • Nativer IPS-Chart zeigt es auch richtig an, wie der HC3-Cahrt, wenn ich die internen Daten beim HC3 verwende.

Aufgefallen ists mir, weil ich immer um 03:00 ein Backup fahre und hier die CPU beansprucht wird.

… und hier noch das Skript

<?
IPSUtils_Include ("IPSLogger.inc.php", "IPSLibrary::app::core::IPSLogger");
# ------------------------------------------------------------- KONFIG ----------------------------------------------------------------------------------
# GENERAL
# ---------------------------------------
include							  									  	  "42765.ips.php";
// AC-Handler definieren
define("AC_HANDLER_ID", IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0]);

$height 		= 500;
$c_chart1   = '#819FF7';
$c_chart2   = '#58FAAC';
$c_chart3   = '#FE2E2E';
$c_chart4   = '#F78181';
$c_chart5   = 'rgba(255,255,255, 0.9)';
$c_network 	= '#00BFFF';
$c_light   	= '#FFFF00';
$c_music   	= '#00FF00';
$c_energy  	= '#F78181';
$c_motion  	= '#FA8258';

# TITEL
# ---------------------------------------
$title = "CPU - Auslastung";

# VARIABLEN
# -------------------------------------------------------------------------------------------------------------------------------------------------------
$name_dev[]= 'IPS-PC';			$y[]= 0; $unit[]= "%"; $color[]= $c_chart3; $type[]= "areaspline"; $z_idx[]= 2; $id_state[]= 47584 /*[Technik\EG\Arbeitszimmer\IPS-PC\System\CpuAvg]*/;
#$name_dev[]= 'NAS-PC';			$y[]= 0; $unit[]= "%"; $color[]= $c_chart5; $type[]= "areaspline"; $z_idx[]= 1; $id_state[]= 15461 /*[Technik\EG\Arbeitszimmer\NAS\Status\CPU-Usage]*/;


# ------------------------------------------------------------- KONFIG ----------------------------------------------------------------------------------

	// Zeitraum
	$ts                        										= mktime(0,0,0, date("m"), date("d"), date("Y"));
	$te                        										= mktime(23,59,59, date("m"), date("d"), date("Y"));
	$AggType                                                 		= 6;

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

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

	// IPS Variablen ID´s
	$CfgDaten['ContentVarableId']= -1;  // ID der String Variable in welche die Daten geschrieben werden (-1 oder überhaupt nicht angeben wenn die Content Variable das übergordnete Element ist)
	$CfgDaten['HighChartScriptId']= 43284 /*[Skripte\Highcharts\Highcharts_V3.00.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)
	if (!isset($CfgDaten["StartTime"]))
	 	$CfgDaten["StartTime"] = $ts; //mktime(0,0,0, date("m", time()), date("d",time()), date("Y",time())); // ab heute 00:00 Uhr
	if (!isset($CfgDaten["EndTime"]))
		$CfgDaten["EndTime"] = $te; //mktime(23,59,59, date("m", time()), date("d",time()), date("Y",time())); // ab heute 23:59 Uhr, oder //$CfgDaten["EndTime"] = time();   // = bis jetzt

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

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

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

	// Serienübergreifende Einstellung für das Laden von Werten
	$CfgDaten['AggregatedValues']['HourValues'] = -1;      // ist der Zeitraum größer als X Tage werden Stundenwerte geladen
	$CfgDaten['AggregatedValues']['DayValues'] = -1;       // ist der Zeitraum größer als X Tage werden Tageswerte geladen
	$CfgDaten['AggregatedValues']['WeekValues'] = -1;      // ist der Zeitraum größer als X Tage werden Wochenwerte geladen
	$CfgDaten['AggregatedValues']['MonthValues'] = -1;      // ist der Zeitraum größer als X Tage werden Monatswerte geladen
	$CfgDaten['AggregatedValues']['YearValues'] = -1;      	// ist der Zeitraum größer als X Tage werden Jahreswerte geladen
	$CfgDaten['AggregatedValues']['NoLoggedValues'] = 1000; 	// ist der Zeitraum größer als X Tage werden keine Boolean Werte mehr geladen, diese werden zuvor immer als Einzelwerte geladen	$CfgDaten['AggregatedValues']['MixedMode'] = false;     // alle Zeitraumbedingungen werden kombiniert
	$CfgDaten['AggregatedValues']['MixedMode'] = false;

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


# AUTOMATISCHES ERZEUGEN DER Y-ACHSE (ReplaceValues) und TOOLTIPS ... je nach Größe des VariablenArrays
# ---------------------------------------------------------------------------------------------------------------------------
$idx = 0;
$cnt = 0;
$format = '';
$tooltip = '';
foreach ($name_dev as $data)  {
	$var[$idx]  = IPS_GetVariable($id_state[$idx]);                            # Aktuelle Variableneigenschaften holen
	$var_type   = $var[$idx]['VariableType'];
	$prof[$idx] = IPS_GetVariableProfile($var[$idx]['VariableCustomProfile']); # Aktuelle VariablenProfile holen
	$prof_asso = $prof[$idx]['Associations'];
	$idy = 0;
	$RoundedValue = 0;

	if ($var_type == 1 or $var_type == 2)   { # wenn Datentyp Integer (=1) oder Float (=2) ist dann ...

		$data = IPS_Array_to_HCData($RoundedValue, array_reverse(AC_GetAggregatedValues(AC_HANDLER_ID, $id_state[$idx], $AggType, $CfgDaten["StartTime"], $CfgDaten["EndTime"], 10000 /*[Objekt #10000 existiert nicht]*/)));
		$a_rpl = NULL;
		$tooltip .= "case '$name_dev[$idx]':";
		$tooltip .= "s += '<tr><td colspan=\"2\">' + '<span style=\"color:' + point.series.color + '\">' + point.series.name +': </span></td><td align=right style=\"color:' + point.series.color + '\">' + point.y.toFixed(1) + ' $unit[$idx]</td></tr>';";
		$tooltip .= "break;";
	}
	elseif ($var_type == 0) {  # wenn Datentyp Bool (=0) ist dann ...
		$data = IPS_Array_to_HCData($RoundedValue, array_reverse(AC_GetAggregatedValues(AC_HANDLER_ID, $id_state[$idx], $AggType, $CfgDaten["StartTime"], $CfgDaten["EndTime"], 10000 /*[Objekt #10000 existiert nicht]*/)));
		foreach ($prof_asso as $data2)   {  #  Aus allen Assoziation die die aktuelle Variable hat den Name holen und speichern
			$a_rpl[$idy] = $cnt;  # Array für ReplaceValues zuweisen
			$a_unit[$idy] = $data2['Name'];
			$unit  = $a_unit[$idy];
			$value = $cnt;
		   $idy ++;
		   $cnt ++;
		}
		$tooltip .= "case '$name_dev[$idx]':";
		$tooltip .= "		s += '<tr><td colspan=\"2\">' + '<span style=\"color:' + point.series.color + '\">' + point.series.name +': </span></td><td align=right style=\"color:' + point.series.color + '\">' + unit + '</td></tr>';";
		$tooltip .= "		break;";
	}

# ---------------------------------------------------------------------------------------------------------------------------

	// Datendefinition
	// ---------------

	$serie['Id'] 													= $id_state[$idx];
	$serie['data']                                     = $data;
	$serie['name'] 												= $name_dev[$idx];
	$serie['AggType'] 											= NULL;
	$serie['Unit'] 												= NULL;
	$serie['type'] 												= $type[$idx];
	$serie['zIndex'] 												= $z_idx[$idx];
	$serie['color'] 												= $color[$idx];
	$serie['step'] 												= true;
	$serie['ReplaceValues'] 									= $a_rpl;
	$serie['yAxis'] 												= $y[$idx];
	$serie['visible'] 											= true;
	$serie['shadow'] 												= true;
	$serie['lineWidth'] 											= 1.2;
	$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;

	$idx ++;

}

	// --------------------------------------------------------------------------
	// y-Achsen-Definition
	// --------------------------------------------------------------------------

 	$CfgDaten["yAxis"][0]['title']['text'] = "%";
 	$CfgDaten['yAxis'][0]['title']['rotation'] = 0;
	$CfgDaten["yAxis"][0]['Unit'] = "";
	$CfgDaten['yAxis'][0]['labels']['rotation'] = 0;
	$CfgDaten["yAxis"][0]['opposite'] = false;
	$CfgDaten["yAxis"][0]['tickInterval'] = 5.0;
	$CfgDaten["yAxis"][0]['min'] = 0;
	$CfgDaten["yAxis"][0]['max'] = 100; #$cnt;
	$CfgDaten["yAxis"][0]['title']['style']['color'] = "#FFFFFF";
	$CfgDaten["yAxis"][0]['labels']['style']['color'] = 'rgba(255,255,255, 0.8)';
	$CfgDaten["yAxis"][0]['labels']['staggerLines'] = 1;
	$CfgDaten["yAxis"][0]["gridLineWidth"] = 1.0;
	$CfgDaten["yAxis"][0]["gridLineDashStyle"] = "Dash";#"Solid";

 	$CfgDaten["yAxis"][1]['title']['text'] = "";
 	$CfgDaten['yAxis'][1]['title']['rotation'] = 0;
	$CfgDaten["yAxis"][1]['Unit'] = "";
	$CfgDaten['yAxis'][1]['labels']['rotation'] = 0;
	$CfgDaten["yAxis"][1]['opposite'] = true;
	$CfgDaten["yAxis"][1]['tickInterval'] = 0.5;
	$CfgDaten["yAxis"][1]['min'] = 0.0;
	$CfgDaten["yAxis"][1]['max'] = 10.0; #$cnt;
	$CfgDaten["yAxis"][1]['title']['style']['color'] = "#FFFFFF";
	$CfgDaten["yAxis"][1]['labels']['style']['color'] = 'rgba(255,255,255, 0.8)';
	$CfgDaten["yAxis"][1]['labels']['staggerLines'] = 1;
	$CfgDaten["yAxis"][1]["gridLineWidth"] = 1.0;
	$CfgDaten["yAxis"][1]["gridLineDashStyle"] = "Dash";#"Solid";
	$CfgDaten['yAxis'][1]['labels']['formatter'] = "@function() { if (this.value == 0) return 'AUS'; if (this.value == 1) return 'EIN';}@";
	$CfgDaten['yAxis'][1]['labels']['x'] = 10;
	$CfgDaten['yAxis'][1]['labels']['y'] = -5;
	// --------------------------------------------------------------------------
	// x-Achsen-Definition
	// --------------------------------------------------------------------------

	$CfgDaten["xAxis"]["gridLineWidth"] = 0.2;
	$CfgDaten["xAxis"]["gridLineDashStyle"] = "Solid";


	// Highcharts-Theme
	//	$CfgDaten['HighChart']['Theme']="grid.js";   // von Highcharts mitgeliefert: dark-green.js, dark-blue.js, gray.js, grid.js
	$CfgDaten['HighChart']['Theme']="ips.js";   // IPS-Theme muss per Hand in in Themes kopiert werden....

	// Abmessungen des erzeugten Charts
	$CfgDaten['HighChart']['Width'] = "100%"; 	// in px,  0 wird auch in 100% konvertiert
	$CfgDaten['HighChart']['Height'] = $height; 		// in px

	// weitere Optionen +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	// Chart-Optionen "Tooltip"
   $CfgDaten['tooltip']['useHTML'] 							= true;
   $CfgDaten['tooltip']['shared'] 							= true;
   $CfgDaten['tooltip']['crosshairs'][] 					= array('width' =>1,'color' =>'grey','dashStyle'=>'dashdot' );
	$CfgDaten['tooltip']['crosshairs'][] 					= array('width' =>1,'color' =>'grey','dashStyle'=>'dashdot' );
	$CfgDaten['tooltip']['formatter'] 						=


	"@function() {

	var s = '<b>' + Highcharts.dateFormat('%d.%m.%Y, %H:%M', this.x) +'</b><br/>';
	s += '<table cellspacing=\"0\" cellpadding=\"0\" width=\"120px\" style=\" font-size:12px; color:rgba(255,255,255, 0.9);\">';
	s += '<tr><td style=\"width:15px; height:5px;\"> </td><td style=\"width:100px;\"> </td><td style=\"width:80px;\"> </td></tr>';

   $.each(this.points, function(i, point) {

	if (point.y == '1') unit = 'Ein';	if (point.y == '0') unit = 'Aus';

	{}[this.series.name];
	switch (point.series.name)
	{
		$tooltip
	}

	});
	s += '</table>';
   return s;

	}@";

   $CfgDaten['legend']['enabled']			= true;
   $CfgDaten['legend']['borderRadius']		= 0;
   $CfgDaten['legend']['borderColor']		= "#787878";
   $CfgDaten['legend']['shadow']				= false;
   $CfgDaten['legend']['margin']				= 20;
   $CfgDaten['legend']['itemStyle']['fontSize']	= 16;
   $CfgDaten['chart']['zoomType']			= "x";
   $CfgDaten['chart']['animation']			= false;
   
 
	// ab V3.000 sind diese Parameter hinzugekommen
	// lokale Skripte oder aus Internet
	// ['Ips']['ScriptsHighCharts']  		Verzeichnis in welchen sich die Scripte befinden falls man diese lokal hält,
	// ['Ips']['ScriptsHighstock']         default = leer, dann werden die Scripte aus dem Internet geholt
	// ['Ips']['Scriptsjquery']
	// ['Ips']['ScriptsTheme'] das ist das Themes Verzeichnis. Wenn man mit der ips.js arbeitet, sollte man dort alle Highchart Themes hinkopieren und den Pfad antprechend angeben

	// ['Ips']['HtmlScript'] default = leer, Script komplett erzeugen, wenn man z.B.: mit Dynamik arbeitet kann man hier Anpassungen machen.
	// weitere Optionen +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	
	
	// -------------------------------------------------------------------------------------------------------------------------------------
	// und jetzt los ......
	$s = IPS_GetScript($CfgDaten['HighChartScriptId']); 	// Id des Highcharts-Scripts
	include($s['ScriptFile']);

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



?>

Die beiden HC3-Charts sehen nur aufgrund der Aggregationsstufe unterschiedlich aus. Aber im Grunde nach sind sie gleich, bis auf die Zeitverschiebung

Soll das heissen, dass die Variable aus der Du die Daten holst die selbe in beiden Screenshots ist? Nur die Aggregation ist unterschiedlich?

Oder was bedeutet „extern“?