Q&A Highcharts - Multigraph V1.0

Morgen zusammen,

ich bin einen Schritt weitergekommen und habe zumindest einen Workaround. Zunächst einmal sind die Events „load“ und „redraw“ die falschen. Beide werden ausgelöst, wenn das Chart gezeichnet wurde - nicht aber die Serien. Damit stehen die Serien auch nicht in den aufgerufenen Skripten zur Verfügung. Das richtige Event wäre eigentlich „afterAnimate“ auf der zuletzt dargestellten Serie. Laut Doku ist das bei gleichen Animationsdauern, diejenige, die als letzte hinzugefügt wurde. In unserem Fall also diejenige, die im Config-Skript als letzte der $Cfg hinzugefügt wird. Ich habe dies getestet, indem ich mir den Sourcecode eines Highcharts aus dem Webbrowser kopiert und das Event und die auszuführenden Methode händisch eingetragen habe. Funktioniert.

Leider stehe ich auf dem Schlauch, wenn es darum geht, mit der von Raketenschnecke gezeigten Methode das Event nachträglich auf eine Serie zu setzen.

$(\'#container\').highcharts(%%%%, function(chart){      
            Highcharts.addEvent(series[4], "afterAnimate", addLabelAfterStart);
            } );

funktioniert leider nicht. Ich sehe nur nicht was ich da falsch mache…

Zum Workaround:
Da ich im Vorfeld das „load“ Event mit

$(\'#container\').highcharts(%%%%, function(chart){      
            Highcharts.addEvent(chart, "load", addLabelAfterStart);
            } );

erfolgreich getestet hatte, habe ich in die Funktion „addLabelAfterStart“ einen Timer eingebaut und rufe die Funktion set_label() mit ausreichend großer Verzögerung auf, dass die Serien bereits angezeigt werden. Funktioniert prima, das Label wird eben ein bißchen später als die Serien angezeigt.

Hier der vollständige Sourcecode meines Config-Skriptes. Vielleicht möchte ja jemand ähnliches tun. Das Design ist noch nicht ausgefeilt - ist erstmal nur eine Spielwiese.
Falls jemand weiß, wie man das Event auf die Series bekommt wäre das natürlich perfekt. Mit meinem Workaround muss man bei Änderung der Animationszeit auch immer an den Timeout des Triggers denken.

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

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

	// Zeitraum welcher dargestellt werden soll (kann durch die Zeitvorgaben in den Serien verändert werden)
	if (!isset($CfgDaten["StartTime"]))
	 	$CfgDaten["StartTime"] = mktime(0,0,0, date("m", time()), date("d",time()), date("Y",time())); // ab heute 00:00 Uhr
	if (!isset($CfgDaten["EndTime"]))
		$CfgDaten["EndTime"] = time(); // ab heute 23:59 Uhr, oder //$CfgDaten["EndTime"] = time();   // = bis jetzt
 //echo mktime(23,59,59, date("m", time())-1, date("d",time()), date("Y",time()));
	// damit wird die Art des Aufrufes festgelegt
	$CfgDaten['RunMode'] = "script"; 	// file, script, popup

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

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

	// Serienübergreifende Einstellung für das Laden von Werten
	$CfgDaten['AggregatedValues']['HourValues'] = 35;      // 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'] = true;
	// 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'";
    $CfgDaten['chart']['backgroundColor'] = "'transparent'";
    $CfgDaten['chart']['height'] = 625;
    
    
	// **************************************************************************************
	// *** 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'] = "Temperaturen";
   

	// **************************************************************************************
	// *** subtitle *** siehe http://www.highcharts.com/ref/#subtitle
	// **************************************************************************************
	// $CfgDaten['subtitle']['text'] = "Zeitraum: %STARTTIME% - %ENDTIME%" // Sub-Überschrift. Wenn nichts angegeben wird wird dieser String als Default verwendet
	//		-> veraltet: 'SubTitle' -> verwende ['subtitle']['text']
	// $CfgDaten['subtitle']['Ips']['DateTimeFormat'] = "(D) d.m.Y H:i"	// z.B.: "(D) d.m.Y H:i" (wird auch als Default herangezogen wenn nichts konfiguriert wurde)
	//		-> veraltet: 'SubTitleDateTimeFormat' -> verwende ['subtitle']['Ips']['DateTimeFormat']
	//    -> entfallen: 'SubTitleFormat' -> unnötiger Paramter, wird jetzt in ['subtitle']['text'] angegeben

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

	// **************************************************************************************
	// *** tooltip *** http://www.highcharts.com/ref/#tooltip
	// **************************************************************************************
	// $CfgDaten['tooltip']['enabled'] = false;
	// $CfgDaten['tooltip']['formatter'] = Null; // IPS erstellt selbständig einen Tooltip
	// $CfgDaten['tooltip']['formatter'] = "";   // Standard - Highcharts Tooltip
	// $CfgDaten['TooltipDateTimeFormat'] = "%A %d.%m.%Y %H:%M";  // Standard Tooltip DateTime-Format

	// **************************************************************************************
	// *** exporting *** http://www.highcharts.com/ref/#exporting
	// **************************************************************************************
	// $CfgDaten['exporting']['enabled'] = true;

	// **************************************************************************************
	// *** lang *** http://www.highcharts.com/ref/#lang
	// **************************************************************************************
	// $CfgDaten['lang']['resetZoom'] = "Zoom zurücksetzten";

	// **************************************************************************************
	// *** legend *** http://www.highcharts.com/ref/#legend
	// **************************************************************************************
	// $CfgDaten['legend']['backgroundColor'] = '#FCFFC5';
     $CfgDaten['legend']['itemStyle']['color'] = "#c4c4c4";
     $CfgDaten['legend']['itemHoverStyle']['color'] = "#f3f3f3";
     $CfgDaten['legend']['itemHiddenStyle']['color'] = "#626262";

	// **************************************************************************************
	// *** xAxis *** http://www.highcharts.com/ref/#xAxis
	// **************************************************************************************
	// $CfgDaten['xAxis']['gridLineColor'] = '#FF0000';
    $CfgDaten['xAxis']['gridLineWidth'] = 1;
    $CfgDaten['xAxis']['gridLineColor'] = "#3d9800";
    $CfgDaten['xAxis']['gridLineDashStyle'] = 'DashDot';
    // $CfgDaten['xAxis']['tickColor'] = '#FF0000';
	// $CfgDaten['xAxis']['plotBands'][] = array("color"=>'#FCFFC5',"from"=> "@Date.UTC(2012, 3, 29)@","to"=> "@Date.UTC(2012, 3, 30)@");

	// **************************************************************************************
	// *** yAxis *** http://www.highcharts.com/ref/#yAxis
	// **************************************************************************************
	// $CfgDaten['yAxis'][0]['title']['text'] = "Temperaturen"; // Bezeichnung der Achse
	//		-> veraltet: 'Name' und 'TitleText' -> verwende ['title']['text']
	// $CfgDaten['yAxis'][0]['Unit'] = "°C";	// Einheit für die Beschriftung die Skalenwerte
	//	$CfgDaten['yAxis'][0]['min'] = 0; // Achse beginnt bei Min (wenn nichts angegeben wird wird der Min der Achse automatisch eingestellt)
	//	$CfgDaten['yAxis'][0]['max'] = 40; // Achse geht bis Max (wenn nichts angegeben wird wird der Max der Achse automatisch eingestellt)
	//		-> veraltet: 'Min' und 'Max'
	//	$CfgDaten['yAxis'][0]['opposite'] = false; // Achse wird auf der rechten (true) oder linken Seite (false) des Charts angezeigt (default = false)
	//		-> veraltet: 'Opposite'
	//	$CfgDaten['yAxis'][0]['tickInterval'] = 5; // Skalenwerte alle x (TickInterval)
	//		-> veraltet: 'TickInterval'
	//    -> entfallen: 'PlotBands' -> verwende ['yAxis'][0]['plotBands'],  (siehe Beispiel 'cfg - drehgriff und tf-kontakt')
	//    -> entfallen: 'YAxisColor' -> verwende ['yAxis'][0]['title']['style']
	//    -> entfallen: 'TitleStyle'-> verwende ['yAxis'][0]['title']['style']

	$CfgDaten['yAxis'][0]['title']['text'] = "Temperaturen";
	$CfgDaten['yAxis'][0]['Unit'] = "°C";
	$CfgDaten['yAxis'][0]['opposite'] = false;
	$CfgDaten['yAxis'][0]['tickInterval'] = 5;
	$CfgDaten['yAxis'][0]['min'] = 0;
	$CfgDaten['yAxis'][0]['max'] = 40;
    $CfgDaten['yAxis'][0]['gridLineWidth'] = 1;
    $CfgDaten['yAxis'][0]['gridLineColor'] = "#3d9800";
    $CfgDaten['yAxis'][0]['gridLineDashStyle'] = 'DashDot';

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

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

	$CfgDaten['yAxis'][3]['title']['text'] = "Columns";
	$CfgDaten['yAxis'][3]['Unit'] = "kWh";
*/
	// **************************************************************************************
	// *** series *** http://www.highcharts.com/ref/#series
	// **************************************************************************************
	// $serie['name'] = "Temperatur; // Name der Kurve (Anzeige in Legende und Tooltip)
	//		-> veraltet: 'Name' -> verwende [series']['name']
	// $serie['Unit'] = "°C"; // Anzeige in automatisch erzeugtem Tooltip
	// 	wenn $serie['Unit'] = NULL; // oder Unit wird gar nicht definiert, wird versucht die Einheit aus dem Variablenprofil automatisch auszulesen
	// $serie['ReplaceValues'] = false; // Werte werden wie geloggt übernommen
	// 	$serie['ReplaceValues'] = array(0=>0.2,1=>10) // der Wert 0 wird in 0.2 geändert, der Wert 1 wird in 10 geändert
	//   	das macht für die Darstellung von Boolean Werte Sinn, oder für Drehgriffkontakte (Werte 0,1,2)
	// $serie['type'] = 'spline'; // Festlegung des Kuventypes (area, areaspline, line, spline, pie, Column)
	// $serie['yAxis'] = 0; // Nummer welche Y-Achse verwendet werden soll (ab 0)
	// 	-> veraltet: 'Param' -> verwende die Highcharts Parameter - sollte eigentlich noch so funktionieren wie in IPS-Highcharts V1.x
	// $serie['AggType'] = 0 // Festlegung wie die Werte gelesen werden soll (0=Hour, 1=Day, 2=Week, 3=Month, 4=Year), hat Vorrang gegenüber den Einstellungen in AggregatedValues
	//    wird kein AggType definiert werden alle gelogten Werte angezeigt
	// $serie['AggNameFormat'] = "d.m.Y H:i"; // (gilt nur bei den Pies, wenn eine Id verwendet wird), entspricht dem PHP-date("xxx") Format, welches das Format der Pie Namen festlegt, wenn keine Eingabe werden Default Werte genommen
	// $serie['Offset'] = 24*60*60; hiermit können Kurven unterschiedlicher Zeiträume in einem Chart dargestellt. Angabe ist in Minuten
	//	$serie['StartTime'] = mktime(0,0,0,1,1,2012); 	// wird für die entsprechende Serie eine Anfangs- und/oder Endzeitpunkt festgelegt wird dieser verwendet. Ansonsten wird
	// $serie['EndTime'] = mktime(0,0,0,2,1,2012);  		// der Zeitpunkt der Zeitpunkt aus den $CfgDaten genommen
	// $serie['ScaleFactor'] = 10; // Skalierungsfaktor mit welchem der ausgelesene Werte multipliziert wird
	// $serie['RoundValue'] = 1; // Anzahl der Nachkommastellen
	//	$serie['AggValue'] ='Min' // über AggValue kann Min/Max oder Avg vorgewählt werden (Default bei keiner Angabe ist Avg)
	//		ist sinnvoll wenn nicht Einzelwerte sondern Stundenwerte, Tageswerte, usw. ausgelesen werden
	// $serie['data'] = array('TimeStamp'=> time(),'Value'=12) // hier kann ein Array an eigenen Datenpunkten übergeben werden. In diesem Fall werden für diese Serie keine Daten aus der Variable gelesenen.
/*
	$serie = array();
	$serie['name'] = 'Pie';
	$serie['type'] = 'pie';
	$serie['data'][] = array('name'=>'Aussentemperatur', 'Id' => 23960, 'Unit'=>"°C");
	$serie['data'][] = array('name'=>'Luftfeuchte', 'Id' => 13641, 'Unit'=>"%");
	$serie['allowPointSelect'] = true;
	$serie['cursor'] = 'pointer';
	$serie['center'] = array(300,100);
	$serie['size'] = 100;
	$serie['dataLabels']['enabled'] = true;
	$CfgDaten['series'][] = $serie;
*/
	$serie = array();
	$serie['name'] = "Wetterstation";
    $serie['Id'] = 16481;
	$serie['Unit'] = "°C";
	$serie['ReplaceValues'] = false;
	$serie['RoundValue'] = 1;
	$serie['type'] = "line";
	$serie['yAxis'] = 0;
	$serie['marker']['enabled'] = false;
	$serie['shadow'] = true;
	$serie['lineWidth'] = 2;
	$serie['states']['hover']['lineWidth'] = 3;
	$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'] = "Kinderzimmer";
    $serie['Id'] = 18153;
	$serie['Unit'] = "°C";
	$serie['ReplaceValues'] = false;
	$serie['RoundValue'] = 1;
	$serie['type'] = "line";
	$serie['yAxis'] = 0;
	$serie['marker']['enabled'] = false;
	$serie['shadow'] = true;
	$serie['lineWidth'] = 2;
	$serie['states']['hover']['lineWidth'] = 3;
	$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'] = "Dachboden";
    $serie['Id'] = 19649;
	$serie['Unit'] = "°C";
	$serie['ReplaceValues'] = false;
	$serie['RoundValue'] = 1;
	$serie['type'] = "spline";
	$serie['yAxis'] = 0;
	$serie['marker']['enabled'] = false;
	$serie['shadow'] = true;
	$serie['lineWidth'] = 2;
	$serie['states']['hover']['lineWidth'] = 3;
	$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'] = "Schlafzimmer";
    $serie['Id'] = 41018;
	$serie['Unit'] = "°C";
	$serie['ReplaceValues'] = false;
	$serie['RoundValue'] = 1;
	$serie['type'] = "spline";
	$serie['yAxis'] = 0;
	$serie['marker']['enabled'] = false;
	$serie['shadow'] = true;
	$serie['lineWidth'] = 2;
	$serie['states']['hover']['lineWidth'] = 3;
	$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'] = "Garage";
    $serie['Id'] = 20452;
	$serie['Unit'] = "°C";
	$serie['ReplaceValues'] = false;
	$serie['RoundValue'] = 1;
	$serie['type'] = "spline";
	$serie['yAxis'] = 0;
	$serie['marker']['enabled'] = false;
	$serie['shadow'] = true;
	$serie['lineWidth'] = 2;
	$serie['states']['hover']['lineWidth'] = 3;
	$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;

    
    $CfgDaten['Ips']['HtmlScript'] ='<div style="height: 30px;position: relative;top: -50px;"><button id="nogrid">NoGrid</button><button id="grid">Grid</button></div>
        <script type="text/javascript" >
        
        const compare = (arr, key, callback) => arr.reduce((prev, curr) => (callback(prev[key], curr[key]) ? prev : curr), {});

        var addLabel = function (event) {
            set_label();
            }; 

        var addLabelAfterStart = function (event) {
            setTimeout(function(){ set_label(); }, 1200);};
            
        var set_label = function () {
    
            var innen = innenTemperaturen(chart.series);
            min_innen = compare(innen, "minval", (a, b) => a < b);
            max_innen = compare(innen, "maxval", (a, b) => a > b);

            var aussen = aussenTemperaturen(chart.series);
            min_aussen = compare(aussen, "minval", (a, b) => a < b);
            max_aussen = compare(aussen, "maxval", (a, b) => a > b);
            
            if (min_innen.minval && min_aussen.minval) {                                                              
                var textlabel = "Aussen<br/>Max: " + max_aussen.name + "(" + max_aussen.maxval + "°C)<br/>" + 
                                "Min: " + min_aussen.name + "(" + min_aussen.minval + "°C)<br/>" +
                                "Innen<br/>Max: " + max_innen.name + "(" + max_innen.maxval + "°C)<br/>" +
                                "Min: " + min_innen.name + "(" + min_innen.minval + "°C)";
                }
            else if (min_innen.minval == undefined && min_aussen.minval ) {
                var textlabel = "Aussen<br/>Max: " + max_aussen.name + "(" + max_aussen.maxval + "°C)<br/>" + 
                                "Min: " + min_aussen.name + "(" + min_aussen.minval + "°C)";
                }
            else if (min_innen.minval && min_aussen.minval == undefined) {
                var textlabel = "Innen<br/>Max: " + max_innen.name + "(" + max_innen.maxval + "°C)<br/>" +
                                "Min: " + min_innen.name + "(" + min_innen.minval + "°C)";
                }
            else {
                var textlabel = "keine Datenserie aktiv."
                }

            if (!this.chart.lbl) {
                this.chart.lbl = this.chart.renderer.label(textlabel,100,100)
                .attr({
                    fill: \'#FCFFC5\',
                    zIndex: 8
                    })
                .add();

                }
            else {
                this.chart.lbl.destroy();
                this.chart.lbl = this.chart.renderer.label(textlabel,100,100)
                .attr({
                    fill: \'#FCFFC5\',
                    zIndex: 8
                    })
                .add();
                }
        }

        function innenTemperaturen(series_arr){
            return series_arr.filter(serie => serie.name != "Wetterstation" && serie.name != "Garage" && serie.visible != false).map( serie=> ({ name: serie.getName(), maxval: serie.dataMax, minval: serie.dataMin, vis: serie.visible }));
            }
        
         function aussenTemperaturen(series_arr){
            return series_arr.filter(serie => serie.name == "Wetterstation" && serie.visible != false).map( serie=> ({ name: serie.getName(), maxval: serie.dataMax, minval: serie.dataMin, vis: serie.visible }));
            }

        $(\'#container\').highcharts(%%%%, function(chart){      
            Highcharts.addEvent(chart, "load", addLabelAfterStart);
            } ); 
        
        var chart = $(\'#container\').highcharts();    
        
        Highcharts.addEvent(chart, "redraw", addLabel);      
          
        $(\'#nogrid\').click(function () {
            chart.update({
                xAxis: {gridLineWidth: 0}
                });
            });

        $(\'#grid\').click(function () {
            chart.update({
                xAxis: {gridLineWidth: 1}
                });
            });


        </script>';


	// Highcharts-Theme
		//$CfgDaten['HighChart']['Theme']="dark-unica.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'] = 700; 		// in px

	// ab V3.000 sind diese Parameter hinzugekommen
	// lokale Skripte oder aus Internet
	// ['Ips']['ScriptsHighCharts']  = './user/Highcharts/code/'; //		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'] = ".user/charts/test.html";

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

Abschließend noch zwei Screens - einmal mit und einmal ohne Außentemparaturen…


Hallo Leute,

habe mal bisschen Zeit gefunden mich endlich mit Highcharts zu befassen.

Funktion ist da. Die Darstellung von „ß“ oder „°C“ ist aber Falsch.

Anmerkung 2019-06-17 145350.png

Wo kann ich das Einstellen?

Gruß

Die Textausgabe in dem Label erfolgt über HTML. Versuch es mal mit den entsprechenden HTML Sonderzeichen. Für ß müsste ß funktionieren. Alternativ mal Google zu HTML Sonderzeichen befragen. Du findest dort schnell Listen mit allen möglichen Sonderzeichen.

Gruß,

Uwe

Hallo zusammen,

ich möchte meine Highcharts Grafik automatisiert als PNG oder JPEG speichern lassen. Es gibt da ein Export Modul aber irgendwie habe ich nicht verstanden wie man das verwenden kann ?!

Hat jemand eine Idee ?

Grüße,
Andreas

Hallo Zusammen,

ich versuche vergebens in einem spline-Diagramm 3 Strommesswerte eines Drehstromgeräts aufsummiert darzustellen.
Suchbegriffe waren stacked und gestapelt.

Leider habe ich es nach Stunden nicht hinbekommen.
Hat jemand einen Tipp für mich?

Hallo,

hat schon jemand erfolgreich die folgenden Chart-Typen vom Highcharts implementieren können?

*) Master Detail Charts
https://www.highcharts.com/demo/dynamic-master-detail

*) Synchronized Charts (mehrere Charts übereinander
https://www.highcharts.com/demo/synchronized-charts

Ich würde diese Charts gerne für die Auswertung der Homematic Wetterstation verwenden, kriege das aber nicht hin.
Vielleicht hat ja jemand ein passendes Konfigurationsscript.

vielen Dank
liebe Grüße
Wolfgang

Hallo hab gerade IPS auf 5.5 upgedatet.
Seit dem funktionieren die Graphen nicht mehr.

Verwende Highcharts 3.01

Fehler:
Abort Processing during Fatal-Error: The behavior of unparenthesized expressions containing both ‚.‘ and ‚+‘/’-’ will change in PHP 8: ‚+‘/’-’ will take a higher precedence
Error in Script C:\ProgramData\Symcon\scripts\37316.ips.php on Line 248

Kann mir jemand helfen?

Danke
Erwoolf

Ich vermute, wenn du die Operation weiter anschaust (Die geht über mehrere Zeilen), dann wirst du da irgendwo ein + oder - haben. Und dann beschreibt der Fehler ja, dass sich die Priorität dieser Operatoren ändert. Ich weiß jetzt nicht genau, was PHP da neu macht, ich würde aber vermuten, dass du es mit passender Klammerung fixen kannst, also $x = ‚Test‘ . (1 + 2); statt $x = ‚Test‘ . 1 + 2;

Hi,

ich nutzte HighCharts schon lange… nun wollte ich mal etwas umbauen und bin auf ein „Problem“ gestoßen was ich eigentlich noch nie hinbekommen habe:
Wie kann ich die Maxima der y-Achse festlegen/fixieren?!

In diesem Chart würde ich gerne die y-Achse [0] (kWh) z.B. auf 280 kWh festlegen. Versucht habe ich das wie folgt:

    $CfgDaten['yAxis'][0]['title']['text'] = "elek. Leistung [kWh]"; 
    $CfgDaten['yAxis'][0]['Unit'] = NULL; 
    $CfgDaten['yAxis'][0]['opposite'] = false; 
    $CfgDaten['yAxis'][0]['tickInterval'] = 40; 
    $CfgDaten['yAxis'][0]['min'] = 0;
    $CfgDaten['yAxis'][0]['max'] = 280; 

und

    $serie = array(); 
    $serie['name'] = "Verbrauch Wärmepumpe"; 
    $serie['Id'] = 26421; 
    $serie['Unit'] = "KWh"; 
    $serie['ReplaceValues'] =false;
	$serie['RoundValue'] = 0; 
    $serie['type'] = "column"; 
	$serie['color']= 'rgba(228, 249, 142, 0.6)';
	$serie['borderColor']= 'rgba(228, 249, 142, 0.3)';
	$serie['borderWidth']= "3"; 
    $serie['yAxis'] = 0;
    $CfgDaten['series'][] = $serie; 

Dennoch wird das Maximum wie im Screenshot zusehen ist auf 360 gesetzt.
Mache ich was falsch? hängt das mit den Rohdaten zusammen? dem Profil der Variable? Oder geht es nicht anders?

Gruß

hardlog

Hallo,

hast du zusätzlich schon folgendes ausprobiert:

...
$CfgDaten['yAxis'][0]['alignTicks'] = false;
$CfgDaten['yAxis'][0]['startOnTick'] = false;
$CfgDaten['yAxis'][0]['endOnTick'] = false;
$CfgDaten['yAxis'][0]['allowDecimals'] = true;
...

Das wars, 1000 Dank!!!

Gruß
hardlog

Bitte! Das hatte mir damals auch einige Zeit gekostet… :rolleyes:

Hallo,

ich brauch nochmal Hilfe:
Ich möchte in ein Säulendiagramm ähnlich diesem aus der Demo von Highchart

den jährlichen (geloggte Daten) Energieverbrauch in PV-Erzeugung, EInspeisung und Eigenverbrauch als „stacked“-Säule darstellen und die Jahre nebeneinander.
Ich bekomme es aber nicht allein hin:

	$serie = array();
	$serie['name'] = "Enerige";
    $serie['stacking'] = "normal";
	$serie['data'][] = array('name'=>'PV Ertrag', 'Id' => 26421, 'Unit'=>"kWh");
	$serie['data'][] = array('name'=>'Vertrauch', 'Id' => 59229, 'Unit'=>"kWh");
    $serie['data'][] = array('name'=>'Einspeisung', 'Id' => 39229, 'Unit'=>"kWh");
	$serie['Unit'] = "kWh";
	$serie['ReplaceValues'] =false;
	$serie['type'] = "column";
	$serie['step'] = false;
	$serie['yAxis'] = 0;
	$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;

Gruß
hardlog

einzelne Daten versuchsweise bekomme ich hin, aber keine Serien geloggter Daten.

   $serie['data'][] = array('color' => 'blue','TimeStamp'=> mktime(0,0,0,1,1,2020),'Value'=>5); 
    $serie['data'][] = array('color' => 'yellow','TimeStamp'=> mktime(0,0,0,1,1,2020),'Value'=>10); 
    $serie['data'][] = array('color' => 'red','TimeStamp'=> mktime(0,0,0,1,1,2020),'Value'=>7);

Bin nicht sicher, was Du genau darstellen willst. Wenn es Monatswerte aus mehreren Jahren nebeneinander sind, dann könnte das den Weg zeigen:

$Titel = "Gesamt";
	$Name = ["Kaltwasser", "Warmwasser", ];
	$ID = [15702 /*[Hardware - Haustechnik\Wasser\Wasserverbrauch\Kaltwasser - Zählerstand]*/, 35687 /*[Hardware - Haustechnik\Wasser\Wasserverbrauch\Warmwasser - Zählerstand]*/, ];
	$Color = ["#1A75FF", "#FF0000", ];

	$CfgDaten['title']['text'] = $CfgDaten['title']['text']." ".$Titel;
		
	for ($Stack = 0; $Stack <= count($ID)-1; $Stack++)
		{
		$Offset = 0;
		for ($Column = $kb_Vergangenheit; $Column >= 0; $Column--)
			{
			$serie = array();
			$serie['name'] = $Name[$Stack];
			$serie['Id'] = $ID[$Stack];
			$serie['Unit'] = "m³";
			$serie['color'] = $Color[$Stack];
			
			$serie['StartTime'] = strtotime(date("d.m.Y H:i:s", $CfgDaten["StartTime"])." -".$Column." years");
			$serie['EndTime'] = strtotime(date("d.m.Y H:i:s", $CfgDaten["EndTime"])." -".$Column." years");	
			$serie['Offset'] = $CfgDaten["StartTime"]-$serie['StartTime'];
			if ($kb_Einheit == 5 and $kb_Zeitraum == 2 and $kb_Aufloesung == 3) $serie['pointRange'] = 1000*60*60*24*31; // Bei Monatswerten korrekte Skala erzwingen
	
			$serie['name'] = $serie['name']." ".date("Y",$serie['StartTime']);
			$serie['ReplaceValues'] = false;
			$serie['RoundValue'] = 2;
			$serie['animation'] = false;
			$serie['type'] = "column";
			$serie['stack'] = $Column;
			$serie['stacking'] = "normal";
			$serie['yAxis'] = 0;
			$serie['shadow'] = true;
			$serie['lineWidth'] = 2;
			$serie['marker']['enabled'] = false;
			$serie['showInLegend'] = false;
			if ($Column == 0) $serie['showInLegend'] = true;
			//$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;
			}
		}

Die äussere Schleife generiert die Werte in einer Spalte übereinander, die innere Schleife die jeweiligen Monatswerte aus mehreren Jahren nebeneinander

$serie['stack'] = $Column;

. Musst Du sicher anpassen, weil mein Script nicht ganz Standard ist (und ja, die Darstellung ist nicht ‚korrekt‘ php ;-))

Moin, Moin,

ich muss jetzt noch mal hier nachfragen da es ja anscheinend bei Euch läuft. Ich erhalte folgenden Fehler:

Deprecated: The behavior of unparenthesized expressions containing both '.' and '+'/'-' will change in PHP 8: '+'/'-' will take a higher precedence in /var/lib/symcon/scripts/30550.ips.php on line 248

Ich habe nun schon versucht mit den Klammern zu bastelten (wobei ich nicht wirklich weiß, was ich da tue). Wenn ich die Klammern so setze:

" height=". ($cfg["HighChart"]["Height"] + 16) .

gibt es zwar keinen Fehler mehr,- der Chart wird aber auch nicht angezeigt.

Frage: Kann mir jemand sagen, wo ich genau die Änderungen vornehmen muss?

Danke und Gruß aus Hamburg

Möglicherweise hast Du davor oder danach einen Fehler eingebaut. Die von Dir geänderte Zeile ist nur ein Teil des Ausdrucks. Bei mir sieht der gesamte Ausdruck nach Korrektur wie folgt aus:

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

Gruß, Uwe

Puh,- das war ja nen Akt, das Konto zu erstellen…Irgend wie hat das aber mit dem alten Usernamen nicht mehr geklappt. OK,- aber zum Problem.
Jetzt bin ich ein Stück weiter. Mit den Klammern ist zwar die Fehlermeldung weg, aber der Chart wird trotz dem nicht angezeigt. Jetzt habe ich das ganze mal auf wieder auf http umgestellt und siehe da,- es funktioniert. Leider kann ich http nicht nutzen weil IPS bei mir nach außen gelegt ist. Daher ist IPS nur via https über den Standard Port 443 zu erreichen. Auch wenn ich im Codeteil http:// durch https:// ersetze und in der Highcharts_config auch den Hostnamen und den Port angebe:

	$CfgDaten['Ips']['Dashboard']['Ip'] = "ipsymcon.xyz.com";
	$CfgDaten['Ips']['Dashboard']['Port'] = "443";

wird nichts angezeigt.

Frage: Wie kann ich das Problem lösen? Port 80 ist nicht möglich und via IP wird das nicht funktionieren weil dann das Zertifikat ja nicht mehr stimmt.

Also, ich habe mir das ganze jetzt noch einmal genauer angeschaut. Rufe ich die URL:

http://ipsymcon.xyz.com:3777/#32218

auf, so bekomme ich den Chart angezeigt. In dem Fall eben via http und nicht https und über den Port 3777

rufe ich die URL:

https://ipsymcon.xyz.com/#32218

wird der Chart nicht angezeigt.

Für das Webinterface Webfrontend habe ich folgendes eingestellt:

es scheint völlig egal zu sein, was ich in der Highchart_config eintrage:

	// Ü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'] = "ipsymcon.xyz.com";
	$CfgDaten['Ips']['Dashboard']['Port'] = "443";

oder auch in der Highcharts die URL in https abändere:

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

ändert das nichts daran, dass der Chart via https nicht angezeigt wird.

Bin ich wirklich der einzige der das Problem hat? Hat hier keiner eine Idee wie ich das zum laufen bekomme? Ich kann das doch unmöglich via Port 80 nach außen legen.