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