IPSHighcharts und Highcharts sind ja eigentlich verschiedene Dinge.
versteh ich nicht. Sind doch fast gleich. Dachte nur ich steig auf die IPSHighcharts um damit ich die Updates automatisch bekomme. Wenn ich khc richtig verstanden habe hat er die Updates einfach in die Library gestellt anstatt die im initialen Threat zu aktualisieren. Wo ist der Unterschied?
Du bist hier bei den Normalos gelandet und damit im falschen Forenbereich.
versteh ich auch nicht. Hier ist doch die offizielle Fragestelle zum derzeit aktuellen HC 2.x Script von khc. Oder?
Wo wäre ich denn richtig?
Offensichtlich zu wenig damit beschäftigt, wie ich auch bis vorhin. Und warum aktualisierst Du dann doch selber?
Wenn ich khc richtig verstanden habe hat er die Updates einfach in die Library gestellt anstatt die im initialen Threat zu aktualisieren. Wo ist der Unterschied?
Hat sich khc in dieser Richtung geäussert? Die Bemerkung von Andreas ist anders:
„Die Implementierung von IPSHighcharts der IPSLibrary wurde aus diesem Thread übernommen – besten Dank an dieser Stelle an den User khc!“
Nachzulesen, und verlinkt, hier:
versteh ich auch nicht
Klar, wenn die Unterschiede nicht bekannt sind
Hier ist doch die offizielle Fragestelle zum derzeit aktuellen HC 2.x Script von khc
Richtig, endet mit 2.02 und läuft auch aktuell, im anderen Verzeichnis --> heisst und bedeutet aber nicht IPSHighCharts !
Wo wäre ich denn richtig?
Wie schon verlinkt
Hat auch den Vorteil, dass Andreas dann die (funktionierende :D) Aktualisierung bereitstellt
Highcharts ansich hat erstmal nix mit IPS zu tun. Das ist eine eigenständige JS Library: http://www.highcharts.com/
Du könntest die auch komplett nackt ohne irgendwelche Scripte außm Forum verwenden. (ich mach das zb.)
Dann wurde von khc und anderen Forumsteilnehmern eine Scriptsammlung verfasst um diese Library komfortabel mit IPS nutzen zu können. Um die geht es in diesem Thread.
Später hatte dann Brownson die Scriptsammlung genommen und in seine IPSLibrary verpackt.
Die wird hier diskutiert:
Prinzipiell ist mal beides problemlos nebeneinander lauffähig.
Dies ist aber nicht anzuraten da man sehr leicht ist die Verzeichnisse verwechselt. So ist es auch dir ergangen.
Hallo Powerfreddy und bbernhard,
vielen Dank für die ausührlichen Aufklärungen.
Teile davon waren mir schon klar. Andere nicht.
Hab ich das richtig verstanden, dass die Scriptsammlung von khc, um die es in diesem Threat geht nicht mehr weiter entwickelt wird? Nur noch die von Browson in der Library?
Und das Thema auf das Ihr verlinkt hab ich für einen VorstellungsThreat gehalten. Q&A dachte ich weiterhin hier. War wohl ein Missverständnis.
Dann werd ich wohl dort weiter fragen.
Danke nochmal.
Weiss ich nicht, mein Skript läuft noch mit 2.02, kann aber gerade nicht nachvollziehen, ob ich noch irgendwelche Anpassungen im Lauf der Zeit vorgenommen habe. Die V3.09 der HighCharts habe ich kürzlich runtergeladen und überspielt. Läuft weiterhin.
So, hab mich dazu entschieden bei khc’s Scripten zu bleiben.
Hab mich also auf die Suche gemacht warum manche Charts mit der HC 3.09 nicht mehr richtig angezeigt werden.
Die Lösung: Sind alle Configs bei denen ich die Configuration „Title“ komplett auskommentiert hatte.
Nun noch mal zurück zum eigentlichen Anliegen (einige Posts weiter unten) wie ich den ChartType „columnrange“ configurieren muss/kann. Hab in der HC-Options-Reference gefunden, dass die highcharts-more.js dazu benötigt wird.
In meinem HC-Verzeichnis ist die vorhanden. Aber wird die überhaupt eingebunden/angesprochen?
Im Script Highcharts_V2.02.ips find ich nix.
Kann mir bitte jemand einen Tipp geben?
für dein Problem hab ich jetzt nicht direkt eine Lösung parat.
Da du dich scheinbar mehr zur hardcore Fraktion hingezogen fühlst, so kann ich dir auch meine Variante zukommen lassen.
Sie basiert auch auf den khc scripten.
Es sind aber die ganzen array zur formatierung rausgeschmissen und so umgebaut das ich die Formatierungsstrings direkt von der highcharts homepage per copy&paste einfügen kann.
Damit bin ich flexibel für alle neuen highcharts features.
Datenextraktion und Aufbau der HTMLStrings sind von der khc Version geklaut.
Viele Standard Optionen sind in eine „styles datei“ ausgelagert. Damit wird die config Datei sehr sehr viel kürzer. Es ist damit auch einfacher alle Charts gleich aussehen zu lassen.
Zusätzlich hab ich mir noch ein paar Buttons zur interaktiven Auswahl des Plotzeitraumes eingebaut.
Post # 24
„Ich“ tu mir damit leichter, ist aber natürlich Geschmackssache.
Warnung: Hab das nur für mich gmacht, viele Id sind hardgecodet. Support kann und will ich keinen geben.
Hi,
ich verwende das Highcharts Script und komme an einer Stelle nicht weiter. Die IST und SOLL Temperatur sollen auf der linken Y-Achse, die Stellgröße vom Heizkörper Stellantrieb auf der rechten Y-Achse liegen. Soweit funktioniert das auch.
Nur bekomme ich das nicht hin, dass die linke Y-Achse immer so skaliert wird dass die maximale Auflösung erreicht wird und die rechte Y-Achse immer auf 0-100%.
Ich verwende das Highcharts Script 2.02
Wenn jemand eine Idee hat, wäre ich sehr dankbar.
Danke Schorsch
PS: habe den Beitrag vom ursprünglichen Thread hierherverschoben. Denke, dass dies der richtige Thread ist.
Hallo Communiy,
habe mich jetzt auch an die Highcharts herangetraut, jedoch ohne Erfolg.
Habe mich an die Anleitung gehalten:
Hier mein IP-Symcon Verzeichnis:
Hier die IPS-Baumstruktur:
Das Config-Skript:
<?php
// bei der Konfiguration unbedingt auf die Groß/Kleinschreibung achten
// es wurde versucht folgende Namensgebeung in der Konfiguration zu verwenden
// Parameter mit kleinen Anfangsbuchstaben = Parameter welche von Highcharts übnernommen wurden. Siehe dazu: http://www.highcharts.com/ref/
// Parameter mit großen Anfangsbuchstaben = für das IPS-Highcharts-Script eingeführte Parameter
Global $CfgDaten; // damit kann der Script auch von anderen Scripten aufgerufen werden und bereits mit CfgDaten vorkonfiguriert werden
// IPS Variablen IDŽs
$CfgDaten['ContentVarableId']= 18411 /*[Geräte\Highcharts\StringVariable]*/; // ID der String Variable in welche die Daten geschrieben werden (-1 oder überhaupt nicht angeben wenn die Content Variable das übergordnete Element ist)
$CfgDaten['HighChartScriptId']= 49286 /*[Geräte\Highcharts\Highcharts_V2.02.ips]*/; // ID des Highcharts Scripts
// Highcharts oder Highstock (default = Highcharts
$CfgDaten['Ips']['ChartType'] = 'Highcharts';
// Zeitraum welcher dargestellt werden soll (kann durch die Zeitvorgaben in den Serien verändert werden)
$CfgDaten['StartTime'] = mktime(0,0,0, date("m", time()), date("d",time())-10, date("Y",time())); // ab heute 00:00 Uhr
$CfgDaten['EndTime'] = mktime(23,59,59, date("m", time()), date("d",time()), date("Y",time())); // ab heute 23:59 Uhr, oder //$CfgDaten['EndTime'] = time(); // = bis jetzt
// damit wird die Art des Aufrufes festgelegt
$CfgDaten['RunMode'] = "script"; // file, script, popup
if ($CfgDaten['RunMode'] == "popup")
{
$CfgDaten['WebFrontConfigId'] = 26841 /*[Objekt #26841 existiert nicht]*/;
$CfgDaten['WFCPopupTitle'] = "Ich bin der Text, welcher als Überschrift im Popup gezeigt wird";
}
// Übergabe der IP-Adresse und des Ports für die Darstellung im Dashboard
// Wichtig! Wenn Darstellung in Webfront diese Variablen auskommentieren
//$CfgDaten['Ips']['Dashboard']['Ip'] = "127.0.0.1";
//$CfgDaten['Ips']['Dashboard']['Port'] = "82";
// Serienübergreifende Einstellung für das Laden von Werten
$CfgDaten['AggregatedValues']['HourValues'] = -1; // ist der Zeitraum größer als X Tage werden Stundenwerte geladen
$CfgDaten['AggregatedValues']['DayValues'] = -1; // ist der Zeitraum größer als X Tage werden Tageswerte geladen
$CfgDaten['AggregatedValues']['WeekValues'] = -1; // ist der Zeitraum größer als X Tage werden Wochenwerte geladen
$CfgDaten['AggregatedValues']['MonthValues'] = -1; // ist der Zeitraum größer als X Tage werden Monatswerte geladen
$CfgDaten['AggregatedValues']['YearValues'] = -1; // ist der Zeitraum größer als X Tage werden Jahreswerte geladen
$CfgDaten['AggregatedValues']['NoLoggedValues'] = 1000; // ist der Zeitraum größer als X Tage werden keine Boolean Werte mehr geladen, diese werden zuvor immer als Einzelwerte geladen $CfgDaten['AggregatedValues']['MixedMode'] = false; // alle Zeitraumbedingungen werden kombiniert
$CfgDaten['AggregatedValues']['MixedMode'] = false;
// Systematik funktioniert jetzt additiv. D.h. die angegebenen Werte gehen ab dem letzten Wert
//
// -5 Tage -3 Tage EndTime
// | | | |
// | |DayValue = 2 |HourValues = 3 |
// |Tageswerte |Stundenwerte |jeder geloggte Wert |
// **************************************************************************************
// *** Highcharts Options ***
// **************************************************************************************
// Ab hier werden die Bereiche des Highchart-Objektes parametriert.
// Dieser Bereich wurde (soweit möglich) identisch der Originalstruktur gehalten.
// Informationen über die Parametrierung findet man unter http://www.highcharts.com/ref/
// **************************************************************************************
// *** chart *** http://www.highcharts.com/ref/#chart
// **************************************************************************************
// $CfgDaten['chart']['zoomType'] = "'x'"; //default: $CfgDaten['chart']['zoomType'] = "'xy'";
// **************************************************************************************
// *** credits *** siehe http://www.highcharts.com/ref/#credits
// **************************************************************************************
// $CfgDaten['credits']['text'] = "used by IPS";
// $CfgDaten['credits']['href'] = "http://www.ip-symcon.de/forum/f53/highcharts-multigraph-v1-0-a-17625/#post120721";
// **************************************************************************************
// *** title *** siehe http://www.highcharts.com/ref/#title
// **************************************************************************************
// $CfgDaten['title']['text'] = "Chart-Überschrift"; // Überchrift des gesamten Charts
// -> veraltet: 'Title' -> verwende ['title']['text']
$CfgDaten['title']['text'] = "Chart-Überschrift";
// **************************************************************************************
// *** subtitle *** siehe http://www.highcharts.com/ref/#subtitle
// **************************************************************************************
// $CfgDaten['subtitle']['text'] = "Zeitraum: %STARTTIME% - %ENDTIME%" // Sub-Überschrift. Wenn nichts angegeben wird wird dieser String als Default verwendet
// -> veraltet: 'SubTitle' -> verwende ['subtitle']['text']
// $CfgDaten['subtitle']['Ips']['DateTimeFormat'] = "(D) d.m.Y H:i" // z.B.: "(D) d.m.Y H:i" (wird auch als Default herangezogen wenn nichts konfiguriert wurde)
// -> veraltet: 'SubTitleDateTimeFormat' -> verwende ['subtitle']['Ips']['DateTimeFormat']
// -> entfallen: 'SubTitleFormat' -> unnötiger Paramter, wird jetzt in ['subtitle']['text'] angegeben
$CfgDaten['subtitle']['text'] = "Zeitraum: %STARTTIME% - %ENDTIME%";
$CfgDaten['subtitle']['Ips']['DateTimeFormat'] = "(D) d.m.Y H:i";
// **************************************************************************************
// *** tooltip *** http://www.highcharts.com/ref/#tooltip
// **************************************************************************************
// $CfgDaten['tooltip']['enabled'] = false;
// $CfgDaten['tooltip']['formatter'] = Null; // IPS erstellt selbständig einen Tooltip
// $CfgDaten['tooltip']['formatter'] = ""; // Standard - Highcharts Tooltip
// **************************************************************************************
// *** exporting *** http://www.highcharts.com/ref/#exporting
// **************************************************************************************
// $CfgDaten['exporting']['enabled'] = true;
// **************************************************************************************
// *** lang *** http://www.highcharts.com/ref/#lang
// **************************************************************************************
// $CfgDaten['lang']['resetZoom'] = "Zoom zurücksetzten";
// **************************************************************************************
// *** legend *** http://www.highcharts.com/ref/#legend
// **************************************************************************************
// $CfgDaten['legend']['backgroundColor'] = '#FCFFC5';
// **************************************************************************************
// *** xAxis *** http://www.highcharts.com/ref/#xAxis
// **************************************************************************************
// $CfgDaten['xAxis']['lineColor'] = '#FF0000';
// $CfgDaten['xAxis']['plotBands'][] = array("color"=>'#FCFFC5',"from"=> "@Date.UTC(2012, 3, 29)@","to"=> "@Date.UTC(2012, 3, 30)@");
// **************************************************************************************
// *** yAxis *** http://www.highcharts.com/ref/#yAxis
// **************************************************************************************
// $CfgDaten['yAxis'][0]['title']['text'] = "Temperaturen"; // Bezeichnung der Achse
// -> veraltet: 'Name' und 'TitleText' -> verwende ['title']['text']
// $CfgDaten['yAxis'][0]['Unit'] = "°C"; // Einheit für die Beschriftung die Skalenwerte
// $CfgDaten['yAxis'][0]['min'] = 0; // Achse beginnt bei Min (wenn nichts angegeben wird wird der Min der Achse automatisch eingestellt)
// $CfgDaten['yAxis'][0]['max'] = 40; // Achse geht bis Max (wenn nichts angegeben wird wird der Max der Achse automatisch eingestellt)
// -> veraltet: 'Min' und 'Max'
// $CfgDaten['yAxis'][0]['opposite'] = false; // Achse wird auf der rechten (true) oder linken Seite (false) des Charts angezeigt (default = false)
// -> veraltet: 'Opposite'
// $CfgDaten['yAxis'][0]['tickInterval'] = 5; // Skalenwerte alle x (TickInterval)
// -> veraltet: 'TickInterval'
// -> entfallen: 'PlotBands' -> verwende ['yAxis'][0]['plotBands'], (siehe Beispiel 'cfg - drehgriff und tf-kontakt')
// -> entfallen: 'YAxisColor' -> verwende ['yAxis'][0]['title']['style']
// -> entfallen: 'TitleStyle'-> verwende ['yAxis'][0]['title']['style']
$CfgDaten['yAxis'][0]['title']['text'] = "Temperaturen";
$CfgDaten['yAxis'][0]['Unit'] = "°C";
$CfgDaten['yAxis'][0]['opposite'] = false;
$CfgDaten['yAxis'][0]['tickInterval'] = 5;
$CfgDaten['yAxis'][0]['min'] = 0;
$CfgDaten['yAxis'][0]['max'] = 40;
// $CfgDaten['yAxis'][1]['title']['text'] = "Heizungssteller / Luftfeuchte";
// $CfgDaten['yAxis'][1]['Unit'] = "%";
// $CfgDaten['yAxis'][1]['opposite'] = true;
// $CfgDaten['yAxis'][2]['title']['text'] = "Drehgriffkontakte / Türkontakte";
// $CfgDaten['yAxis'][2]['labels']['formatter'] = "@function() { if (this.value == 0.5) return 'geschlossen'; if (this.value == 1) return 'gekippt';if (this.value == 2) return 'geöffnet' }@";
// $CfgDaten['yAxis'][2]['allowDecimals'] = true;
// $CfgDaten['yAxis'][2]['showFirstLabel '] = false;
// $CfgDaten['yAxis'][2]['showLastLabel '] = false;
// $CfgDaten['yAxis'][2]['opposite'] = true;
// $CfgDaten['yAxis'][2]['labels']['rotation'] = 90;
// $CfgDaten['yAxis'][3]['title']['text'] = "Columns";
// $CfgDaten['yAxis'][3]['Unit'] = "kWh";
// **************************************************************************************
// *** series *** http://www.highcharts.com/ref/#series
// **************************************************************************************
// $serie['name'] = "Temperatur; // Name der Kurve (Anzeige in Legende und Tooltip)
// -> veraltet: 'Name' -> verwende [series']['name']
// $serie['Unit'] = "°C"; // Anzeige in automatisch erzeugtem Tooltip
// wenn $serie['Unit'] = NULL; // oder Unit wird gar nicht definiert, wird versucht die Einheit aus dem Variablenprofil automatisch auszulesen
// $serie['ReplaceValues'] = false; // Werte werden wie geloggt übernommen
// $serie['ReplaceValues'] = array(0=>0.2,1=>10) // der Wert 0 wird in 0.2 geändert, der Wert 1 wird in 10 geändert
// das macht für die Darstellung von Boolean Werte Sinn, oder für Drehgriffkontakte (Werte 0,1,2)
// $serie['type'] = 'spline'; // Festlegung des Kuventypes (area, areaspline, line, spline, pie, Column)
// $serie['yAxis'] = 0; // Nummer welche Y-Achse verwendet werden soll (ab 0)
// -> veraltet: 'Param' -> verwende die Highcharts Parameter - sollte eigentlich noch so funktionieren wie in IPS-Highcharts V1.x
// $serie['AggType'] = 0 // Festlegung wie die Werte gelesen werden soll (0=Hour, 1=Day, 2=Week, 3=Month, 4=Year), hat Vorrang gegenüber den Einstellungen in AggregatedValues
// wird kein AggType definiert werden alle gelogten Werte angezeigt
// $serie['AggNameFormat'] = "d.m.Y H:i"; // (gilt nur bei den Pies, wenn eine Id verwendet wird), entspricht dem PHP-date("xxx") Format, welches das Format der Pie Namen festlegt, wenn keine Eingabe werden Default Werte genommen
// $serie['Offset'] = 24*60*60; hiermit können Kurven unterschiedlicher Zeiträume in einem Chart dargestellt. Angabe ist in Minuten
// $serie['StartTime'] = mktime(0,0,0,1,1,2012); // wird für die entsprechende Serie eine Anfangs- und/oder Endzeitpunkt festgelegt wird dieser verwendet. Ansonsten wird
// $serie['EndTime'] = mktime(0,0,0,2,1,2012); // der Zeitpunkt der Zeitpunkt aus den $CfgDaten genommen
// $serie['ScaleFactor'] = 10; // Skalierungsfaktor mit welchem der ausgelesene Werte multipliziert wird
// $serie['RoundValue'] = 1; // Anzahl der Nachkommastellen
// $serie['AggValue'] ='Min' // über AggValue kann Min/Max oder Avg vorgewählt werden (Default bei keiner Angabe ist Avg)
// ist sinnvoll wenn nicht Einzelwerte sondern Stundenwerte, Tageswerte, usw. ausgelesen werden
// $serie['data'] = array('TimeStamp'=> time(),'Value'=12) // hier kann ein Array an eigenen Datenpunkten übergeben werden. In diesem Fall werden für diese Serie keine Daten aus der Variable gelesenen.
$serie = array();
$serie['name'] = 'Pie';
$serie['type'] = 'pie';
$serie['data'][] = array('name'=>'Aussentemperatur', 'Id' => 15936, 'Unit'=>"°C");
$serie['data'][] = array('name'=>'Luftfeuchte', 'Id' => 17593, 'Unit'=>"%");
$serie['allowPointSelect'] = true;
$serie['cursor'] = 'pointer';
$serie['center'] = array(300,100);
$serie['size'] = 100;
$serie['dataLabels']['enabled'] = true;
$CfgDaten['series'][] = $serie;
$serie = array();
$serie['name'] = "Aussentemperatur";
$serie['Id'] = 15936 /*[Geräte\Feuchtesensoren\Temperatur & Feuchtesensor Aussen (317, RH)\Temperatur_Aussen]*/;
$serie['Unit'] = "°C";
$serie['ReplaceValues'] = false;
$serie['RoundValue'] = 0;
$serie['type'] = "spline";
$serie['yAxis'] = 0;
$serie['marker']['enabled'] = false;
$serie['shadow'] = true;
$serie['lineWidth'] = 1;
$serie['states']['hover']['lineWidth'] = 2;
$serie['marker']['states']['hover']['enabled'] = true;
$serie['marker']['states']['hover']['symbol'] = 'circle';
$serie['marker']['states']['hover']['radius'] = 4;
$serie['marker']['states']['hover']['lineWidth'] = 1;
$CfgDaten['series'][] = $serie;
$serie = array();
$serie['name'] = "Luftfeuchte";
$serie['Id'] = 17593 /*[Geräte\Feuchtesensoren\Temperatur & Feuchtesensor Aussen (317, RH)\relFeuchte_Aussen]*/;
$serie['Unit'] = "%";
$serie['ReplaceValues'] = false;
$serie['type'] = "spline";
$serie['step'] = false;
$serie['yAxis'] = 1;
$serie['shadow'] = true;
$serie['lineWidth'] = 1;
$serie['states']['hover']['lineWidth'] = 2;
$serie['marker']['enabled'] = false;
$serie['marker']['states']['hover']['enabled'] = true;
$serie['marker']['states']['hover']['symbol'] = 'circle';
$serie['marker']['states']['hover']['radius'] = 4;
$serie['marker']['states']['hover']['lineWidth'] = 1;
$CfgDaten['series'][] = $serie;
// $serie = array();
// $serie['name'] = "Drehgriffkontakt";
// $serie['Id'] = 44451 /*[Objekt #44451 existiert nicht]*/;
// $serie['Unit'] = array(0=>'geschlossen', 1=>'gekippt', 2=>'geöffnet');
// $serie['ReplaceValues'] = array(0=>0.5, 1=>1, 2=>2);
// $serie['type'] = "line";
// $serie['step'] = true;
// $serie['yAxis'] = 2;
// $serie['shadow'] = true;
// $serie['lineWidth'] = 1;
// $serie['states']['hover']['lineWidth'] = 2;
// $serie['marker']['enabled'] = false;
// $serie['marker']['states']['hover']['enabled'] = true;
// $serie['marker']['states']['hover']['symbol'] = 'circle';
// $serie['marker']['states']['hover']['radius'] = 4;
// $serie['marker']['states']['hover']['lineWidth'] = 1;
// $CfgDaten['series'][] = $serie;
// $serie = array();
// $serie['name'] = "Column";
// $serie['Id'] = 29842 /*[Objekt #29842 existiert nicht]*/;
// $serie['Unit'] = "kWh";
// $serie['ReplaceValues'] =false;
// $serie['type'] = "column";
// $serie['step'] = false;
// $serie['yAxis'] = 3;
// $serie['shadow'] = true;
// $serie['states']['hover']['lineWidth'] = 2;
// $serie['marker']['enabled'] = false;
// $serie['marker']['states']['hover']['enabled'] = true;
// $serie['marker']['states']['hover']['symbol'] = 'circle';
// $serie['marker']['states']['hover']['radius'] = 4;
// $serie['marker']['states']['hover']['lineWidth'] = 1;
// $CfgDaten['series'][] = $serie;
// Highcharts-Theme
// $CfgDaten['HighChart']['Theme']="grid.js"; // von Highcharts mitgeliefert: dark-green.js, dark-blue.js, gray.js, grid.js
$CfgDaten['HighChart']['Theme']="ips.js"; // IPS-Theme muss per Hand in in Themes kopiert werden....
// Abmessungen des erzeugten Charts
$CfgDaten['HighChart']['Width'] = 0; // in px, 0 = 100%
$CfgDaten['HighChart']['Height'] = 600; // in px
// -------------------------------------------------------------------------------------------------------------------------------------
// und jetzt los ......
$s = IPS_GetScript($CfgDaten['HighChartScriptId']); // Id des Highcharts-Scripts
include($s['ScriptFile']);
// hier werden die CfgDaten geprüft und bei Bedarf vervollständigt
$CfgDaten = CheckCfgDaten($CfgDaten);
// abhängig von der Art des Aufrufs -> json String für Highcharts erzeugen
if (isset($CfgDaten['RunMode'])
&& ($CfgDaten['RunMode'] == "script" || $CfgDaten['RunMode'] == "popup"))
{
// Variante1: Übergabe der ScriptId. Daten werden beim Aufruf der PHP Seite erzeugt und direkt übergeben. Dadurch kann eine autom. Aktualisierung der Anzeige erfolgen
if ($IPS_SENDER != "WebInterface")
{
WriteContentWithScriptId ($CfgDaten, $IPS_SELF); // und jetzt noch die ContentTextbox
return; // Ende, weil durch die Zuweisung des Script sowieso nochmals aufgerufen wird
}
$sConfig = CreateConfigString($CfgDaten); // erzeugen und zurückgeben des Config Strings
}
else
{
//Variante2: Übergabe des Textfiles. Daten werden in tmp-File gespeichert. Eine automatische Aktualisierung beim Anzeigen der Content-Textbox erfolgt nicht
$sConfig = CreateConfigString($CfgDaten); // erzeugen und zurückgeben des Config Strings
$tmpFilename = CreateConfigFile($sConfig, $IPS_SELF); // und ab damit ins tmp-Files
if ($IPS_SENDER != "WebInterface")
{
WriteContentWithFilename ($CfgDaten, $tmpFilename); // und jetzt noch die ContentTextbox
}
}
?>
Das Highchart-Skript:
<?
$version = "2.02"; $versionDate = "20.05.2012";
//ToDo:
//FEATURE: Plotbands. Timestamp in From und To
//Fehlerquelle: AggType ist "Größer" als der angezeigte Zeitraum
// vielleicht alles als cfg direkt json_encoden und nicht jedes Teil einzeln
//--------------------------------------------------------------------------------------------------------------------------------
// Für die Darstellung der Graphen wird das HTML5/JS Framework "Highcharts" der Fa. Highslide Software verwendet (www.highcharts.com)
// Alle Rechte dieses Frameworks liegen bei Highslide Software.
// 'Highcharts' kann unter folgenden Bedinungen kostenlos eingesetzt werden:
// Namensnennung Sie müssen den Namen des Autors/Rechteinhabers in der von ihm festgelegten Weise nennen.
// Keine kommerzielle Nutzung Dieses Werk bzw. dieser Inhalt darf nicht für kommerzielle Zwecke verwendet werden.
// Download: wwww.highcharts.com/download/ ... und die Dateien einfach in das Webfront (Es sollte ein V 2.2 oder höher verwendet werden.
// Demos: http://www.highcharts.com/demo/
// API: http://www.highcharts.com/ref/
//--------------------------------------------------------------------------------------------------------------------------------
// Changelog:
// --- V2.00 ---------------------------------------------------------------------------------------------------------------------
// 04/2012 KHC REFACT Umfangreiches Überarbeiten der Highchart-Script Funktionen.
// bis Integration der meisten Original-Highcharts-Options als PHP-Array (siehe http://www.highcharts.com/ref)
// 05/2012 Highcharts-Options "lang" aus IPS_Template.php in Highcharts-Script verschoben
// --- V2.01 ---------------------------------------------------------------------------------------------------------------------
// 07.05.2012 KHC NEU Test mit Integration Highstock. Neuer Parameter ['Ips']['ChartType'] = 'Highcharts' oder 'Highstock'
// 07.05.2012 KHC NEU IPS_Template.php auf jquery 1.7.2 geändert
// 07.05.2012 KHC FIX krsort durch array_reverse getauscht, da krsort Probleme beim json_encode macht
// 08.05.2012 KHC REFACT intern noch mehr auf Arrays umgestellt und etwas umstrukturiert
// 09.05.2012 KHC NEU über 'CreateConfigFileByPathAndFilename($stringForCfgFile, $path, $filename)' kann eine Tmp_datei mit bel. Namen geschrieben werden
// 10.05.2012 KHC FIX Fehler beim Auswerten der AggregatedValues behoben (ReadDataFromDBAndCreateDataArray)
// 12.05.2012 KHC FIX Tooltip für "ReplaceValues" korrigiert
// 12.05.2012 KHC CHANGE Start- und Endzeitpunkt der X-Achse wurde automatisch um 5 Minuten korrigiert -> dies wurde entfernt
// 12.05.2012 KHC NEU mit ['xAxis']['min']=false und ['xAxis']['min']=false kann festeglegt werden dass Min oder Max nicht autom. festgelegt werden
// --- V2.02 ---------------------------------------------------------------------------------------------------------------------
// 13.05.2012 KHC FIX RunType=file: Wenn Highstock vorgewählt wurde wurde das tmp File nicht in die Highstock-Verzeichnis geschrieben
// 16.05.2012 KHC NEU Integration Highstock: ['Navigator'], ['rangeSelector'] und ['scrollbar']
// 18.05.2012 KHC FIX Integration Highstock: Zusätzliche series.type 'candlestick' und 'ohlc' erlauben
// 19.05.2012 KHC NEU Neue Parameter ['Ips']['Dashboard'] für die Darstellung im Dashboard
//--------------------------------------------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------
// WriteContentWithFilename
// Mit dieser Funktion wird der Content-String geschrieben.
// IN: $cfg = ..
// IN: $tmpFilename = Der Dateiname welche die Config Daten enthält
// ------------------------------------------------------------------------
function WriteContentWithFilename($cfg, $tmpFilename)
{
DebugModuleName($cfg,"WriteContentWithFilename");
if ($tmpFilename != "")
{
SetValue($cfg['ContentVarableId'],
GetContentVariableString ($cfg, "CfgFile", $tmpFilename));
}
else
SetValue($cfg['ContentVarableId'], 'Falsche Parameter beim Funktionsaufruf "WriteContentTextbox"');
}
// ------------------------------------------------------------------------
// WriteContentWithScriptId
// Mit dieser Funktion wird der Content-String geschrieben.
// IN: $cfg = ..
// IN: $scriptId = Die Script Id welche den ConfigString enthält.
// ------------------------------------------------------------------------
function WriteContentWithScriptId($cfg, $scriptId)
{
DebugModuleName($cfg,"WriteContentWithScriptId");
if ($cfg['RunMode'] == "popup")
{
WFC_SendPopup($cfg['WebFrontConfigId'],
$cfg['WFCPopupTitle'] ,
GetContentVariableString ($cfg, "ScriptId", $scriptId));
}
else
{
SetValue($cfg['ContentVarableId'],
GetContentVariableString ($cfg, "ScriptId", $scriptId));
}
}
function GetContentVariableString($cfg, $callBy, $callIdent)
{
$chartType = $cfg['Ips']['ChartType'];
$height = $cfg['HighChart']['Height'] + 16;
if (isset($cfg['Ips']['Dashboard']['Ip']) && isset($cfg['Ips']['Dashboard']['Port']))
{
$s = "http://" . $cfg['Ips']['Dashboard']['Ip'] . ":" . $cfg['Ips']['Dashboard']['Port'] .
"/User/$chartType/IPS_Template.php?$callBy=" . $callIdent . " " .
"width='100%' height='". $height ."' frameborder='1' scrolling='no'";
}
else
{
$s = "<iframe src='./User/$chartType/IPS_Template.php?$callBy=" . $callIdent . "' " .
"width='100%' height='". $height ."' frameborder='0' scrolling='no'></iframe>";
}
return $s;
}
// ------------------------------------------------------------------------
// CreateConfigFile
// Erzeugt das tmp-Highcharts Config-File mit der $id als Dateinamen
// IN: $stringForCfgFile = String welcher in das File geschrieben wird
// ------------------------------------------------------------------------
function CreateConfigFile($stringForCfgFile, $id, $charttype = 'Highcharts')
{
$path = "webfront\user\\" . $charttype;
$filename = $charttype . "Cfg$id.tmp";
return CreateConfigFileByPathAndFilename($stringForCfgFile, $path, $filename);
}
// ------------------------------------------------------------------------
// CreateConfigFileByPathAndFilename
// Erzeugt das tmp-Highcharts Config-File
// IN: $stringForCfgFile = String welcher in das File geschrieben wird
// $path, $filename = Pfad un Name des Tmp-Files welches erzeugt werden soll
// ------------------------------------------------------------------------
function CreateConfigFileByPathAndFilename($stringForCfgFile, $path, $filename)
{
// Standard-Dateiname .....
$tmpFilename = IPS_GetKernelDir() . $path . "\\" . $filename;
// schreiben der Config Daten
$handle = fopen($tmpFilename,"w");
fwrite($handle, $stringForCfgFile);
fclose($handle);
return $tmpFilename;
}
// ------------------------------------------------------------------------
// CheckCfgDaten
// Aufruf bei jedem Cfg-Start
// IN: $cfg = ..
// OUT: korrigierte cfg
// ------------------------------------------------------------------------
function CheckCfgDaten($cfg)
{
DebugModuleName($cfg,"CheckCfgDaten");
global $IPS_SELF, $IPS_SENDER;
// Debugging
IfNotIssetSetValue($cfg['Ips']['Debug']['Modules'], false);
IfNotIssetSetValue($cfg['Ips']['Debug']['ShowJSON'], false);
IfNotIssetSetValue($cfg['Ips']['Debug']['ShowJSON_Data'], false);
IfNotIssetSetValue($cfg['Ips']['Debug']['ShowCfg'], false);
// ChartType
IfNotIssetSetValue($cfg['Ips']['ChartType'], 'Highcharts');
if ($cfg['Ips']['ChartType'] != 'Highcharts' && $cfg['Ips']['ChartType'] != 'Highstock')
die ("Abbruch! Es sind nur 'Highcharts' oder 'Highstock' als ChartType zulässig");
// über WebInterface kommt der Aufruf wenn die Content-Variable aktualisiert wird
if ($IPS_SENDER != "WebInterface" && $cfg['RunMode'] != "popup")
$cfg = Check_ContentVariable($cfg, $IPS_SELF);
return $cfg;
}
// ------------------------------------------------------------------------
// CreateConfigString
// Erzeugt den für Higcharts benötigten Config String und gibt diesen als String zurück
// IN: $cfg = ..
// OUT: der erzeugte Config String
// ------------------------------------------------------------------------
function CreateConfigString($cfg)
{
DebugModuleName($cfg,"CreateConfigString");
$cfg = CompatibilityCheck($cfg);
$cfg = CheckCfg($cfg);
$cfgString = GetHighChartsCfgFile($cfg);
// Zusätzliche Config in Highchart Config hinzufügen
$cfgString = ReadAdditionalConfigData($cfg) . "
|||
" . $cfgString;
// Language Options aus IPS_Template.php hierher verschoben
$cfgString .= "
|||
". GetHighChartsLangOptions($cfg);;
return $cfgString;
}
function CompatibilityCheck($cfg)
{
DebugModuleName($cfg,"CompatibilityCheck");
// Series
if (isset($cfg['Series']) && isset($cfg['series']))
die ("Abbruch - Es düfen nicht gleichzeitig 'Series' und 'series' definiert werden.");
if (isset($cfg['Series']) && !isset($cfg['series']))
$cfg['series'] = $cfg['Series'];
unset ($cfg['Series']);
// Title
if (isset($cfg['Title']) && !isset($cfg['title']['text']))
$cfg['title']['text'] = $cfg['Title'];
unset ($cfg['Title']);
// SubTitle
if (isset($cfg['SubTitle']) && !isset($cfg['subtitle']['text']))
$cfg['subtitle']['text'] = $cfg['SubTitle'];
unset ($cfg['SubTitle']);
// SubTitleDateTimeFormat
if (isset($cfg['SubTitleDateTimeFormat']) && !isset($cfg['subtitle']['Ips']['DateTimeFormat']))
$cfg['subtitle']['Ips']['DateTimeFormat'] = $cfg['SubTitleDateTimeFormat'];
unset ($cfg['SubTitleDateTimeFormat']);
// yAxis
if (isset($cfg['yAxis']))
{
$axisArr = array();
foreach ($cfg['yAxis'] as $Axis)
{
$cfgAxis = $Axis;
// Name
if (isset($Axis['Name']) && !isset($cfgAxis['title']['text']))
$cfgAxis['title']['text'] = $Axis['Name'];
unset ($cfgAxis['Name']);
// TickInterval
if (isset($Axis['TickInterval']) && !isset($cfgAxis['tickinterval']))
$cfgAxis['tickinterval'] = $Axis['TickInterval'];
unset ($cfgAxis['TickInterval']);
// Opposite
if (isset($Axis['Opposite']) && !isset($cfgAxis['opposite']))
$cfgAxis['opposite'] = $Axis['Opposite'];
unset ($cfgAxis['Opposite']);
$axisArr[] = $cfgAxis;
}
$cfg['yAxis'] = $axisArr;
}
return $cfg;
}
// ------------------------------------------------------------------------
// CheckCfg
// Prüft daKonfiguration und korrigiert und Vervollständigtdiese zum Teil
// IN: $cfg = ..
// OUT: der erzeugte Config String
// ------------------------------------------------------------------------
function CheckCfg($cfg)
{
DebugModuleName($cfg,"CheckCfg");
$cfg = CheckCfg_Common($cfg);
$cfg = CheckCfg_AreaHighChart($cfg);
$cfg = CheckCfg_AggregatedValues($cfg);
$cfg = CheckCfg_StartEndTime($cfg);
$cfg = CheckCfg_Series($cfg);
return $cfg;
}
// ------------------------------------------------------------------------
// CheckCfg_Common
// wenn RunMode=Popup, prüfen der dazugehörigen Daten wie WebfrontConfigId, usw.
// und wenn RunMode=Popup, prüfen der dazugehörigen Daten wie WebfrontConfigId, usw.
// IN: $cfg
// OUT: korrigiertes $cfg
// ------------------------------------------------------------------------
function CheckCfg_Common($cfg)
{
DebugModuleName($cfg,"CheckCfg_Common");
if (!isset($cfg['series']))
die ("Abbruch - Es wurden keine Serien definiert.");
// Id des ArchiveHandler auslesen
if (!isset($cfg['ArchiveHandlerId']) || $cfg['ArchiveHandlerId'] == -1)
{
$instances = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}');
$cfg['ArchiveHandlerId'] = $instances[0];
}
// Prüfen des ArchiveHandlers
$instance = @IPS_GetInstance($cfg['ArchiveHandlerId']);
if ($instance['ModuleInfo']['ModuleID'] != "{43192F0B-135B-4CE7-A0A7-1475603F3060}")
die ("Abbruch - 'ArchiveHandlerId' (".$cfg['ArchiveHandlerId'].") ist keine Instance eines ArchiveHandler.");
if ($cfg['RunMode'] == "popup")
{
// keine Webfront Id
if (!isset($cfg['WebFrontConfigId']))
die ("Abbruch - Konfiguration von 'WebFrontConfigId' fehlt.");
// prüfen ob die übergebene Id ein WebFront ist
$instance = @IPS_GetInstance($cfg['WebFrontConfigId']);
if ($instance['ModuleInfo']['ModuleID'] != "{3565B1F2-8F7B-4311-A4B6-1BF1D868F39E}")
die ("Abbruch - 'WebFrontConfigId' ist keine WebFrontId");
IfNotIssetSetValue($cfg['WFCPopupTitle'], "");
}
return $cfg;
}
// ------------------------------------------------------------------------
// Check_ContentVariable
// prüfen ob Angaben der Content Variable stimmen oder ob es das übergeordnete Element ist
// IN: $cfg
// OUT: korrigiertes $cfg
// ------------------------------------------------------------------------
function Check_ContentVariable($cfg, $scriptId)
{
DebugModuleName($cfg,"Check_ContentVariable");
// wenn keine Id übergeben wurde wird das übergeordnete Objekt als Content verwendet
if (!isset($cfg['ContentVarableId']) || $cfg['ContentVarableId'] <= 0)
$cfg['ContentVarableId'] = IPS_GetParent($scriptId);
$variable = @IPS_GetVariable($cfg['ContentVarableId']);
if ($variable == false)
die ("Abbruch - Content-Variable nicht gefunden.");
if ($variable['VariableValue']['ValueType'] != 3)
die ("Abbruch - Content-Variable ist keine STRING-Variable.");
if ($variable['VariableCustomProfile'] != "~HTMLBox")
die ("Abbruch - Content-Variable muss als Profil '~HTMLBox' verwenden.");
return $cfg;
}
// ------------------------------------------------------------------------
// CheckCfg_AreaHighChart
//
// IN: $cfg
// OUT: korrigiertes $cfg
// ------------------------------------------------------------------------
function CheckCfg_AreaHighChart($cfg)
{
DebugModuleName($cfg,"CheckCfg_AreaHighChart");
IfNotIssetSetValue($cfg['HighChart']['Theme'], "");
IfNotIssetSetValue($cfg['HighChart']['Width'], 0);
IfNotIssetSetValue($cfg['HighChart']['Height'], 400);
return $cfg;
}
// ------------------------------------------------------------------------
// CheckCfg_StartEndTime
// Start- und Endzeit des gesamten Charts errechnen, und an jede Serie übergeben
// IN: $cfg
// OUT: korrigiertes $cfg
// ------------------------------------------------------------------------
function CheckCfg_StartEndTime($cfg)
{
DebugModuleName($cfg,"CheckCfg_StartEndTime");
$cfg['Ips']['ChartStartTime'] = $cfg['StartTime'];
$cfg['Ips']['ChartEndTime'] = $cfg['EndTime'];
$offsetExistsAtSerie = false;
$Count = count($cfg['series']);
for ($i = 0; $i < $Count; $i++)
{
$Serie = $cfg['series'][$i];
// wenn für die Serie keine Start oder Endzeit übergeben würde wird der Standardwert genommen
IfNotIssetSetValue($Serie['StartTime'], $cfg['StartTime']);
IfNotIssetSetValue($Serie['EndTime'], $cfg['EndTime']);
if ($Serie['StartTime'] < $cfg['Ips']['ChartStartTime'])
$cfg['Ips']['ChartStartTime'] = $Serie['StartTime'];
if ($Serie['EndTime'] > $cfg['Ips']['ChartEndTime'])
$cfg['Ips']['ChartEndTime'] = $Serie['EndTime'];
$Serie['Ips']['EndTimeString'] = date("/r", $Serie['EndTime']);
$Serie['Ips']['StartTimeString']= date("/r", $Serie['StartTime']);
$cfg['series'][$i] = $Serie;
if (isset($Serie['Offset']) && $Serie['Offset'] != 0)
$offsetExistsAtSerie =true;
}
// wenn ein Offset definiert wurde gilt nur der global eingestellte Start und Endzeitpunkt
if ($offsetExistsAtSerie = true)
{
$cfg['Ips']['ChartStartTime'] = $cfg['StartTime'];
$cfg['Ips']['ChartEndTime'] = $cfg['EndTime'];
}
return $cfg;
}
// ------------------------------------------------------------------------
// CheckCfg_Series
// prüfen der Serien
// IN: $cfg
// OUT: korrigiertes $cfg
// ------------------------------------------------------------------------
function CheckCfg_Series($cfg)
{
DebugModuleName($cfg,"CheckCfg_Series");
$Id_AH = $cfg['ArchiveHandlerId'];
$series = array();
foreach ($cfg['series'] as $Serie)
{
$VariableId = @$Serie['Id'];
// hier wird nur geprüft ob Wert von Eingabe passen könnte (wenn vorhanden)
if (isset($Serie['AggType']) && ($Serie['AggType']<0 || $Serie['AggType']>4) )
die ("Abbruch - 'AggType' hat keinen korrekten Wert");
$Serie['Ips']['IsCounter'] = $VariableId && (@AC_GetAggregationType($Id_AH, $VariableId) == 1);
// über AggValue kann Min/Max oder Avg vorgewählt werden (zum Lesen der AggregValues)
IfNotIssetSetValue($Serie['AggValue'], "Avg");
if ($Serie['AggValue'] != "Avg"
&& $Serie['AggValue'] != "Min"
&& $Serie['AggValue'] != "Max")
die ("Abbruch - 'AggValue' hat keinen gültigen Wert");
// Offset für Darstellung von z.B. Monate und Vormonat in einem Chart
IfNotIssetSetValue($Serie['Offset'], 0);
IfNotIssetSetValue($Serie['ReplaceValues'], false);
// Name (Kompatibilität aus V1.x)
if (isset($Serie['Name']) && !isset($Serie['name']))
$Serie['name'] = $Serie['Name'];
unset($Serie['Name']);
IfNotIssetSetValue($Serie['name'], "");
// type & Parameter
if (isset($Serie['type']) && isset($Serie['Param']))
die ("Abbruch - Definition von 'Param' und 'type' in Serie gleichzeitig nicht möglich.");
if (!isset($Serie['type']) && !isset($Serie['Param']))
die ("Abbruch - Serie muss Definition von 'Param' oder 'type' enthalten.");
// Mögliche Charttypen
$allowedSeriesTypes = array();
if ($cfg['Ips']['ChartType'] == 'Highcharts')
$allowedSeriesTypes = array('area','areaspline','bar','column','line','pie','scatter','spline');
else if ($cfg['Ips']['ChartType'] == 'Highstock')
$allowedSeriesTypes = array('area','areaspline','bar','column','line','pie','scatter','spline','ohlc','candlestick');
if (!isset($Serie['type']) && isset($Serie['Param']))
{
// type aus Param übernehmen
foreach($allowedSeriesTypes as $item)
{
if (strrpos($Serie['Param'],"'$item'") > 0)
$Serie['Ips']['Type'] = $item;
}
}
else
{
if (!in_array($Serie['type'], $allowedSeriesTypes))
die ("Abbruch - Serien-Type (" . $Serie['type'] . ") nicht erkennbar.");
else
$Serie['Ips']['Type'] = $Serie['type'];
}
if (!isset($Serie['Ips']['Type']))
die ("Abbruch - Serien-Type nicht erkennbar.");
// data
if (isset($Serie['Data']) && isset($Serie['data']))
die ("Abbruch - Definition von 'Data' und 'data' in ein und derselben Serie nicht mölglich.");
if (!isset($Serie['data']) && isset($Serie['Data']))
{
$Serie['data'] = $Serie['Data'];
unset($Serie['Data']);
}
// diverse Prüfungen bei PIE-Charts
if ($Serie['Ips']['Type'] == 'pie')
{
if (isset($Serie['Id']))
{
if (!isset($Serie['AggType']))
die ("Abbruch - Wird ein Pie über Id definiert muss auch AggType parametriert werden");
// wenn nichts angegeben wird 'AggNameFormat: automatisch abhängig vom 'AggType' berechnet
if (!isset($Serie['AggNameFormat']))
{
if ($Serie['AggType'] == 0) //0=Hour
$Serie['AggNameFormat'] = "d.m.Y H:i";
else if ($Serie['AggType'] == 1) //1=Day
$Serie['AggNameFormat'] = "d.m.Y";
else if ($Serie['AggType'] == 2) //2=Week
$Serie['AggNameFormat'] = "\K\WW Y";
else if ($Serie['AggType'] == 3) //3=Month
$Serie['AggNameFormat'] = "M Y";
else if ($Serie['AggType'] == 4) //4=Year
$Serie['AggNameFormat'] = "Y";
}
}
else if (isset($Serie['data']))
{
foreach($Serie['data'] as $data)
{
if (isset($data['Id']) && isset($data['y']))
die ("Abbruch - Pie['data']: Id und y sind als gleichzeitige Parameter nicht möglich.");
//if (!isset($data['Id']) && !isset($data['y']))
// die ("Abbruch - Pie['data']: Id oder y muss definiert sein");
// kann man so nicht prüfen
}
}
else
{
die ("Abbruch - Pie kann nie Daten besitzen. Es muss entweder über 'Id' oder über 'data' definiert werden.");
}
}
// geänderte Werte wieder zurückschreiben
$series[] = $Serie;
}
// geänderte Werte wieder zurückschreiben
$cfg['series'] = $series;
return $cfg;
}
// ------------------------------------------------------------------------
// CheckCfg_AggregatedValues
// prüfen der AggregatedValues und Übernahme dieser in die Serien
// IN: $cfg
// OUT: korrigiertes $cfg
// ------------------------------------------------------------------------
function CheckCfg_AggregatedValues($cfg)
{
DebugModuleName($cfg,"CheckCfg_AggregatedValues");
if (!isset($cfg['AggregatedValues']))
$cfg['AggregatedValues'] = array();
// Default - wenn nichts vorbelegt
IfNotIssetSetValue($cfg['AggregatedValues']['MixedMode'], false);
IfNotIssetSetValue($cfg['AggregatedValues']['HourValues'], -1);
IfNotIssetSetValue($cfg['AggregatedValues']['DayValues'], -1);
IfNotIssetSetValue($cfg['AggregatedValues']['WeekValues'], -1);
IfNotIssetSetValue($cfg['AggregatedValues']['MonthValues'], -1);
IfNotIssetSetValue($cfg['AggregatedValues']['YearValues'], -1);
IfNotIssetSetValue($cfg['AggregatedValues']['NoLoggedValues'], 100);
$series = array();
foreach ($cfg['series'] as $Serie)
{
// prüfen ob für die Serie Einstellungen für AggregatedValues vorhanden sind,
// wenn nicht Übernahme aus cfg
if (isset($Serie['AggregatedValues']))
{
IfNotIssetSetValue($Serie['AggregatedValues']['MixedMode'], $cfg['AggregatedValues']['MixedMode']);
IfNotIssetSetValue($Serie['AggregatedValues']['HourValues'], $cfg['AggregatedValues']['HourValues']);
IfNotIssetSetValue($Serie['AggregatedValues']['DayValues'], $cfg['AggregatedValues']['DayValues']);
IfNotIssetSetValue($Serie['AggregatedValues']['WeekValues'], $cfg['AggregatedValues']['WeekValues']);
IfNotIssetSetValue($Serie['AggregatedValues']['MonthValues'], $cfg['AggregatedValues']['MonthValues']);
IfNotIssetSetValue($Serie['AggregatedValues']['YearValues'], $cfg['AggregatedValues']['YearValues']);
IfNotIssetSetValue($Serie['AggregatedValues']['NoLoggedValues'], $cfg['AggregatedValues']['NoLoggedValues']);
}
else // nein -> Daten aus übergeordneter cfg übernehmen
$Serie['AggregatedValues'] = $cfg['AggregatedValues'];
// Umrechnen der Tage in Sekunden ... für direktes addieren zum Timestamp
$MinPerTag = 24*60*60;
if ($Serie['AggregatedValues']['HourValues'] != -1)
$Serie['AggregatedValues']['HourValues'] *= $MinPerTag;
if ($Serie['AggregatedValues']['DayValues'] != -1)
$Serie['AggregatedValues']['DayValues'] *= $MinPerTag;
if ($Serie['AggregatedValues']['WeekValues'] != -1)
$Serie['AggregatedValues']['WeekValues'] *= $MinPerTag;
if ($Serie['AggregatedValues']['MonthValues'] != -1)
$Serie['AggregatedValues']['MonthValues'] *= $MinPerTag;
if ($Serie['AggregatedValues']['YearValues'] != -1)
$Serie['AggregatedValues']['YearValues'] *= $MinPerTag;
if ($Serie['AggregatedValues']['NoLoggedValues'] != -1)
$Serie['AggregatedValues']['NoLoggedValues'] *= $MinPerTag;
// geänderte Werte wieder zurückschreiben
$series[] = $Serie;
}
// geänderte Werte wieder zurückschreiben
$cfg['series'] = $series;
// die sind jetzt nicht mehr nötig.....
unset($cfg['AggregatedValues']);
return $cfg;
}
// ------------------------------------------------------------------------
// ReadAdditionalConfigData
// zusätzliche Daten für File (hat jetzt aber nichts mit den eigentlichen Highchart Config String zu tun
// IN: $cfg
// OUT: der String welcher dann in das IPS_Template geschrieben wird.
// ------------------------------------------------------------------------
function ReadAdditionalConfigData($cfg)
{
DebugModuleName($cfg,"ReadAdditionalConfigData");
// z.B.: Breite und Höhe für Container
// Breite und Höhe anpassen für HTML Ausgabe
$s['Theme'] = $cfg['HighChart']['Theme'];
if ($cfg['HighChart']['Width'] == 0)
$s['Width'] = "100%";
else
$s['Width'] = $cfg['HighChart']['Width']. "px";
$s['Height'] = $cfg['HighChart']['Height']. "px";
return trim(print_r($s, true), "Array
()") ;
}
// ***************************************************************************************************************************
// ------------------------------------------------------------------------
// GetHighChartsCfgFile
// Falls nicht konfiguriert, wird dies als Default String genommen
// OUT: natürlich den String ....
// ------------------------------------------------------------------------
function GetHighChartsCfgFile($cfg)
{
DebugModuleName($cfg,"GetHighChartsCfgFile");
$cfgArr['chart'] = CreateArrayForChart($cfg);
if (isset($cfg['colors']))
$cfgArr['colors'] = $cfg['colors'];
$cfgArr['credits'] = CreateArrayForCredits($cfg);
if (isset($cfg['global']))
$cfgArr['global'] = $cfg['global'];
if (isset($cfg['labels']))
$cfgArr['labels'] = $cfg['labels'];
// $cfg['lang'])) werden seperat behandelt
if (isset($cfg['legend']))
$cfgArr['legend'] = $cfg['legend'];
if (isset($cfg['loading']))
$cfgArr['loading'] = $cfg['loading'];
if (isset($cfg['plotOptions']))
$cfgArr['plotOptions'] = $cfg['plotOptions'];
$cfgArr['exporting'] = CreateArrayForExporting($cfg);
if (isset($cfg['symbols']))
$cfgArr['symbols'] = $cfg['symbols'];
$cfgArr['title'] = CreateArrayForTitle($cfg);
$cfgArr['subtitle'] = CreateArrayForSubTitle($cfg);
$cfgArr['tooltip'] = CreateArrayForTooltip($cfg);
$cfgArr['xAxis'] = CreateArrayForXAxis($cfg);
$cfgArr['yAxis'] = CreateArrayForYAxis($cfg);
if ($cfg['Ips']['ChartType'] == 'Highstock')
{
if (isset($cfg['navigator']))
$cfgArr['navigator'] = $cfg['navigator'];
if (isset($cfg['rangeSelector']))
$cfgArr['rangeSelector'] = $cfg['rangeSelector'];
if (isset($cfg['scrollbar']))
$cfgArr['scrollbar'] = $cfg['scrollbar'];
}
if ($cfg['Ips']['Debug']['ShowJSON'])
DebugString(my_json_encode($cfgArr));
$cfgArr['series'] = CreateArrayForSeries($cfg) ;
if ($cfg['Ips']['Debug']['ShowJSON_Data'])
DebugString(my_json_encode($cfgArr));
// Array in JSON wandeln
$s = my_json_encode($cfgArr);
// ersetzten des 'Param'-Parameters (Altlast aus V1.x)
$s = str_replace(",Param@@@:",",",$s);
$s = trim($s, "{");
$s .= ");";
return $s;
}
// ------------------------------------------------------------------------
// GetHighChartsLangOptions
//
// IN: $cfg
// OUT: JSON Options String für den Bereich 'lang'
// ------------------------------------------------------------------------
function GetHighChartsLangOptions($cfg)
{
DebugModuleName($cfg,"GetHighChartsLangOptions");
// Default
IfNotIssetSetValue($cfg['lang']['decimalPoint'], ",");
IfNotIssetSetValue($cfg['lang']['thousandsSep'], ".");
IfNotIssetSetValue($cfg['lang']['months'], ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember']);
IfNotIssetSetValue($cfg['lang']['shortMonths'], ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez']);
IfNotIssetSetValue($cfg['lang']['weekdays'], ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag']);
$s = "lang:" . my_json_encode($cfg['lang']);
return $s;
}
// ------------------------------------------------------------------------
// CreateArrayForSeries
//
// IN: $cfg
// OUT: der String welcher dann in das IPS_Template geschrieben wird.
// ------------------------------------------------------------------------
function CreateArrayForSeries($cfg)
{
DebugModuleName($cfg,"CreateArrayForSeries");
// Daten für einzelne Serien erzeugen
$dataArr = array();
foreach ($cfg['series'] as $Serie)
{
if ($Serie['Ips']['Type'] == 'pie')
{
$Serie['data'] = CreateDataArrayForPie($cfg, $Serie);
}
else
{
// Daten wurden von extern übergeben
if (isset($Serie['data']))
{
if (is_array($Serie['data']))
$Serie['data'] = CreateDataArrayFromExternalData($Serie['data'], $Serie);
else
$Serie['data'] = $Serie['data'];
}
// Daten werden aus DB gelesen
else
$Serie['data'] = ReadDataFromDBAndCreateDataArray($cfg, $Serie);
}
// ... aus Serie umkopieren
$serieArr = $Serie;
// nicht für JSON benötigte Parameter löschen
unset($serieArr['Param']);
unset($serieArr['AggregatedValues']);
unset($serieArr['Unit']);
unset($serieArr['StartTime']);
unset($serieArr['EndTime']);
unset($serieArr['ReplaceValues']);
unset($serieArr['Ips']);
unset($serieArr['Offset']);
unset($serieArr['AggValue']);
unset($serieArr['AggType']);
unset($serieArr['AggNameFormat']);
unset($serieArr['ScaleFactor']);
unset($serieArr['RoundValue']);
// ersetzten des 'Param'-Parameters (Altlast aus V1.x)
if (isset($Serie['Param']))
$serieArr['Param@@@'] = "@" . $Serie['Param'] . "@";
$dataArr[] = $serieArr;
}
return $dataArr;
}
// ------------------------------------------------------------------------
// PopulateDate
//
// IN: $dt
// $serie
// OUT: Date-Value für Data-String
// ------------------------------------------------------------------------
function PopulateDate($dt, $serie)
{
if ($dt < $serie['StartTime'])
$dt = $serie['StartTime'] ;
// z.B.: Date.UTC(2011,4,27,19,42,19),23.4
return CreateDateUTC($dt + $serie['Offset']);
}
// ------------------------------------------------------------------------
// PopulateValue
//
// IN: $val
// $serie
// OUT: korrigiertes $cfg
// ------------------------------------------------------------------------
function PopulateValue($val, $serie)
{
// Werte ersetzten (sinnvoll für Boolean, oder Integer - z.B.: Tür/Fenster-Kontakt oder Drehgriffkontakt)
if ($serie['ReplaceValues'] != false)
{
if (isset($serie['ReplaceValues'][$val]))
$val = $serie['ReplaceValues'][$val];
}
// Skalieren von Loggingdaten
if (isset($serie['ScaleFactor']))
$val = $val * $serie['ScaleFactor'];
// Rounden von Nachkommastellen
if (isset($serie['RoundValue']))
$val = round($val, $serie['RoundValue']);
return $val;
}
// ------------------------------------------------------------------------
// CreateDataArrayForPie
// Liest die aktuellen Werte aus den übergebenen Variablen und erzeugt die Daten für das PIE
// IN: $cfg, $Serie
// OUT: der Data String
// ------------------------------------------------------------------------
function CreateDataArrayForPie($cfg, $serie)
{
DebugModuleName($cfg,"CreateDataArrayForPie");
if (isset($serie['Id']))
{
return ReadPieDataById($cfg, $serie);
}
else if (isset($serie['data']))
{
$result = array();
foreach($serie['data'] as $item)
{
if (isset($item['Id']))
{
$currentValue = ReadCurrentValue($item['Id']);
$item['y'] = PopulateValue($currentValue['Value'], $serie) ;
}
$result[] = $item;
}
return $result;
}
else
{
Die ("Abbruch - Pie-Definition nicht korrekt");
}
return $Data;
}
// ------------------------------------------------------------------------
// ReadPieDataById
// liest die Aggregated-Werte einer einer Vriablen aus und erzeugt das entsprechende Array
// IN: $cfg, $serie
// OUT: Config Array
// ------------------------------------------------------------------------
function ReadPieDataById($cfg, $serie)
{
$id_AH = $cfg['ArchiveHandlerId'];
$tempData = @AC_GetAggregatedValues($id_AH, $serie['Id'], $serie['AggType'], $serie['StartTime'], $serie['EndTime'], 0);
$tempData = array_reverse($tempData);
$result = array();
foreach ($tempData as $ValueItem)
{
$item['name'] = ReplaceToGermanDate(date($serie['AggNameFormat'], $ValueItem['TimeStamp']));
$item['y'] = PopulateValue($ValueItem[$serie['AggValue']], $serie);
$result[] = $item;
}
unset ($tempData);
return $result;
}
// ------------------------------------------------------------------------
// CalculateStartAndEndTimeForAggreagtedValues
// Liest den Start- und Endzeitpunkt des angefragten Bereiches
// IN: $Serie, $search : "" für alle Werte, "Hour", "Day", usw
// OUT: Array(StartTime,EndTime)
// ------------------------------------------------------------------------
function CalculateStartAndEndTimeForAggreagtedValues($Serie, $search ="")
{
$start = -1; $ende = -1;
$trap = false;
$sum = 0;
if ($search == "")
{
$search =="Values";
$start = 0;
$trap = true;
}
foreach($Serie['AggregatedValues'] as $key => $value)
{
if (strrpos ($key, "Values") != false)
{
if ($value > 0)
$sum += $value;
if (strrpos ($key, $search) !== false)
{
$trap = true;
if ($value == -1)
return false;
}
if (!$trap)
continue;
if ($value < 0)
continue;
if ($start == -1)
{
$start = $sum;
continue;
}
if ($start != -1 && $ende ==-1)
{
$ende = $sum;
break;
}
}
}
$result = false;
if ($start != -1)
{
$result["EndTime"] = $Serie["EndTime"] - $start;
if ($ende == -1)
$result["StartTime"] = $Serie["StartTime"];
else
$result["StartTime"] = $Serie["EndTime"] - $ende;
if ($result["StartTime"] < $Serie["StartTime"])
$result["StartTime"] = $Serie["StartTime"];
if ($result["StartTime"] == $Serie["EndTime"])
$result = false;
}
return $result;
}
// ------------------------------------------------------------------------
// ReadDataFromDBAndCreateDataArray
// Liest die Series-Daten aus der DB und schreibt sie in den DataString
// IN: $cfg, $Serie
// OUT: der Data String
// ------------------------------------------------------------------------
function ReadDataFromDBAndCreateDataArray($cfg, $Serie)
{
DebugModuleName($cfg,"ReadDataFromDBAndCreateDataArray");
if (!isset($Serie['Id']))
return "";
// errechne die Zeitspanne
if ($Serie['EndTime'] > time())
$Diff = time() - $Serie['StartTime'];
else
$Diff = $Serie['EndTime'] - $Serie['StartTime'];
$Id_AH = $cfg['ArchiveHandlerId'];
$dataArray = array();
$VariableId = (int)$Serie['Id'];
$Agg = -1;
$ReadCurrentValue = true;
// wenn ReplaceValues definiert wurden werden nur geloggte und keine Aggregated Werte gelesen
if ($Serie['ReplaceValues'] != false)
{
if ($Diff > $Serie['AggregatedValues']['NoLoggedValues'])
{
$Serie['StartTime'] = $Serie['EndTime'] - $Serie['AggregatedValues']['NoLoggedValues'];
}
// Einzelwerte lesen
$dataArray = ReadAndAddToLoggedData($dataArray, $Id_AH, $VariableId, -1 , $Serie["StartTime"], $Serie["EndTime"], "Value", $Serie);
}
else if ($Serie['AggregatedValues']['MixedMode']) // im MixedMode werden anfangs alle Werte, dann die Stunden- und zuletzt Tageswerte ausgelesen
{
// zuerst Einzelwerte
$result = CalculateStartAndEndTimeForAggreagtedValues($Serie, "");
if ($result != false)
{
if ($Serie['Ips']['IsCounter']) // wenn Zähler dann immer Agg.Values
$dataArray = ReadAndAddToLoggedData($dataArray, $Id_AH, $VariableId, 0, $result["StartTime"], $result["EndTime"], $Serie['AggValue'], $Serie);
else
$dataArray = ReadAndAddToLoggedData($dataArray, $Id_AH, $VariableId, -1 , $result["StartTime"], $result["EndTime"], "Value", $Serie);
}
// -> Stundenwerte
$result = CalculateStartAndEndTimeForAggreagtedValues($Serie,"Hour");
if ($result != false)
$dataArray = ReadAndAddToLoggedData($dataArray, $Id_AH, $VariableId, 0, $result["StartTime"], $result["EndTime"], $Serie['AggValue'], $Serie);
// -> Tageswerte
$result = CalculateStartAndEndTimeForAggreagtedValues($Serie,"Day");
if ($result != false)
$dataArray = ReadAndAddToLoggedData($dataArray, $Id_AH, $VariableId, 1, $result["StartTime"], $result["EndTime"], $Serie['AggValue'], $Serie);
// -> Wochenwerten
$result = CalculateStartAndEndTimeForAggreagtedValues($Serie,"Week");
if ($result != false)
$dataArray = ReadAndAddToLoggedData($dataArray, $Id_AH, $VariableId, 2, $result["StartTime"], $result["EndTime"], $Serie['AggValue'], $Serie);
// -> Monatswerte
$result = CalculateStartAndEndTimeForAggreagtedValues($Serie,"Month");
if ($result != false)
$dataArray = ReadAndAddToLoggedData($dataArray, $Id_AH, $VariableId, 3, $result["StartTime"], $result["EndTime"], $Serie['AggValue'], $Serie);
// -> Jahreswerte
$result = CalculateStartAndEndTimeForAggreagtedValues($Serie,"Year");
if ($result != false)
$dataArray = ReadAndAddToLoggedData($dataArray, $Id_AH, $VariableId, 4, $result["StartTime"], $result["EndTime"], $Serie['AggValue'], $Serie);
}
else
{
$Agg = -1; // -> AC_GetLoggedValues
if (isset($Serie['AggType'])) // wenn 'AggType' definiert wurde, wird dies vorrangig bearbeitet
{
$Agg = $Serie['AggType'];
}
elseif ($Serie['AggregatedValues']['YearValues']!= -1 && $Diff > $Serie['AggregatedValues']['YearValues'])
$Agg = 4; // -> AC_GetAggregatedValues [0=Hour, 1=Day, 2=Week, 3=Month, 4=Year]
elseif ($Serie['AggregatedValues']['MonthValues']!= -1 && $Diff > $Serie['AggregatedValues']['MonthValues'])
$Agg = 3; // -> AC_GetAggregatedValues [0=Hour, 1=Day, 2=Week, 3=Month, 4=Year]
elseif ($Serie['AggregatedValues']['WeekValues']!= -1 && $Diff > $Serie['AggregatedValues']['WeekValues'])
$Agg = 2; // -> AC_GetAggregatedValues [0=Hour, 1=Day, 2=Week, 3=Month, 4=Year]
elseif ($Serie['AggregatedValues']['DayValues']!= -1 && $Diff > $Serie['AggregatedValues']['DayValues'])
$Agg = 1; // -> AC_GetAggregatedValues [0=Hour, 1=Day, 2=Week, 3=Month, 4=Year]
else if ($Serie['AggregatedValues']['HourValues']!= -1 && $Diff > $Serie['AggregatedValues']['HourValues'])
$Agg = 0; // -> AC_GetAggregatedValues [0=Hour, 1=Day, 2=Week, 3=Month, 4=Year]
// es wurde noch nichts definiert und es handelt sich um einen Zähler --> Tageswerte
if ($Agg == -1 && $Serie['Ips']['IsCounter'])
$Agg = 0;
if ($Agg == -1)
{
// Zeitraum ist zu groß -> nur bis max. Zeitraum einlesen
if ($Diff > $Serie['AggregatedValues']['NoLoggedValues'])
$Serie['StartTime'] = $Serie['EndTime'] - $Serie['AggregatedValues']['NoLoggedValues'];
// Alle Werte
$dataArray = ReadAndAddToLoggedData($dataArray, $Id_AH, $VariableId, -1 , $Serie["StartTime"], $Serie["EndTime"], "Value", $Serie);
}
else
{
$dataArray = ReadAndAddToLoggedData($dataArray, $Id_AH, $VariableId, $Agg, $Serie["StartTime"], $Serie["EndTime"], $Serie['AggValue'], $Serie);
$ReadCurrentValue = false;
}
}
// sortieren, so , dass der aktuellste Wert zuletzt kommt
$dataArray = array_reverse($dataArray);
// aktuellen Wert der Variable noch in Array aufnehmen
if ($ReadCurrentValue
&& $Serie['EndTime'] >= time() // nicht wenn Endzeitpunkt vor NOW ist
&& !$Serie['Ips']['IsCounter']) // nicht bei Zählervariablen
{
$curValue = ReadCurrentValue($VariableId);
$dataArray[] = CreateDataItem($curValue['TimeStamp'], $curValue['Value'], $Serie);
}
return $dataArray ;
}
// ------------------------------------------------------------------------
// ReadCurrentValue
// IN: $VariableId
// OUT: Aktueller Wert
// ------------------------------------------------------------------------
function ReadCurrentValue($variableId)
{
$currentVal['Value']= GetValue($variableId);
$currentVal['TimeStamp'] = time();
return $currentVal;
}
// ------------------------------------------------------------------------
// ReadAndAddToLoggedData
// IN: siehe Parameter
// OUT: Vervollständigte Logged Data
// ------------------------------------------------------------------------
function ReadAndAddToLoggedData($loggedData, $id_AH, $variableId, $aggType, $startTime, $endTime, $aggValueName, $serie)
{
$cfg['Ips']['Debug']['Modules'] = true;
if ($aggType >= 0)
$tempData = @AC_GetAggregatedValues($id_AH, $variableId, $aggType, $startTime, $endTime, 0);
else
$tempData = @AC_GetLoggedValues($id_AH, $variableId, $startTime, $endTime, 0 );
foreach ($tempData as $item)
{
$loggedData[] = CreateDataItem($item['TimeStamp'], $item[$aggValueName], $serie);
}
unset ($tempData);
return $loggedData;
}
function CreateDataItem($dt, $val, $serie)
{
// Wert anpassen (Round, Scale)
$val = PopulateValue($val, $serie);
// z.B.: Date.UTC(2011,4,27,19,42,19),23.4
$dtUTC = PopulateDate($dt, $serie);
return array("@$dtUTC@", $val);
}
// ------------------------------------------------------------------------
// CreateDataArrayFromExternalData
// Umwandeln der externen Daten in ein Daten Array
// IN: $arr = Aus IPS-Datenbank ausgelesenen Daten (LoggedData)
// $Serie = Config Daten der aktuellen Serie
// OUT: Highcharts ConfigString für Series-Data
// ------------------------------------------------------------------------
function CreateDataArrayFromExternalData($arr, $Serie)
{
$result = array();
foreach($Serie['data'] as $item)
{
if (is_array($item))
{
if (isset($item['TimeStamp']) && !isset($item['x']))
{
$item['x'] = "@" . PopulateDate($item['TimeStamp'], $Serie) . "@";
unset($item['TimeStamp']);
}
if (isset($item['Value']) && !isset($item['y']))
{
$item['y'] = $item['Value'];
unset($item['Value']);
}
if (isset($item['y']))
$item['y'] = PopulateValue($item['y'], $Serie);
$result[] = $item;
}
else
$result[] = $item;
}
return $result;
}
// ------------------------------------------------------------------------
// CreateTooltipFormatter
// Auslesen von immer wieder benötigten Werten aus der Variable
// IN: $cfg = Alle Config Daten
// OUT: Highcharts ConfigString für Tooltip-Formatter (Interaktive Anzeige des Wertes)
// ------------------------------------------------------------------------
function CreateTooltipFormatter($cfg)
{
DebugModuleName($cfg,"CreateTooltipFormatter");
//ToDo: da sollten wir etwas lesbarer arbeiten
$s = "";
$offset ="";
foreach ($cfg['series'] as $Serie )
{
if ($Serie['Ips']['Type'] == 'pie')
{
if (isset($Serie['data']))
{
$s .= "[";
foreach($Serie['data'] as $data)
{
$unit = @$Serie['Unit'];
if (isset($data['Unit']))
$unit = $data['Unit'];
$s .= "this.y +' " . $unit . "',";
}
$s = trim($s,",");
$s .= "][this.point.x],";
}
else
{
$unit = @$Serie['Unit'];
$s .= "[this.y + ' " . $unit . "'],";
}
$offset .= "0,"; // pies haben nie einen Offset
}
else
{
// hier wird das VariableCustomProfile aus IPS übernommen
if (!isset($Serie['Unit']))
{
// hole das Variablen Profil
$IPSProfil = @GetIPSVariableProfile($Serie['Id']);
if ($IPSProfil != false)
{
if (array_key_exists("Associations",$IPSProfil) && count($IPSProfil['Associations'])>0)
{
$Arr = array();
foreach($IPSProfil['Associations'] as $Item)
{
$Arr[$Item['Value']] = $Item['Name'];
}
if (!is_array($Serie['ReplaceValues'])) // erzeuge Tooltips vollständig aus VariablenProfil
$s .= CreateTooltipSubValues($Arr, array_keys($Arr));
else // oder nehme ReplaceValues zur Hilfe
$s .= CreateTooltipSubValues($Arr, $Serie['ReplaceValues']);
}
else
{
// Suffix als Einheit übernehmen
$Serie['Unit'] = trim($IPSProfil['Suffix'], " ");
$s .= "[this.y + ' ". $Serie['Unit']."'],";
}
}
else // falls VariablenId nicht existiert
{
$s .= "[this.y ],";
}
}
// es wurden Unit und ReplaceValues übergeben
else if (is_array($Serie['Unit']) && is_array($Serie['ReplaceValues']))
{
$s .= CreateTooltipSubValues($Serie['Unit'],$Serie['ReplaceValues']);
}
else // Einheit aus übergebenem Parmeter Unit
{
$s .= "[this.y + ' ". $Serie['Unit']."'],";
}
$offset .= $Serie['Offset'] . ",";
}
}
$s = trim($s , "," );
$offset = trim($offset , "," );
//*1000 da JS in [ms] angebgeben wird un php in [s]
/* $TooltipString="function() {
var serieIndex = this.series.index;
if (this.series.type == 'pie')
{
var pointIndex = this.point.x;
var unit = [".$s. "][serieIndex][pointIndex];
if (!unit)
unit = [".$s. "][serieIndex][0];
return '<b>' + this.point.name +': </b> '+ unit +'<br/>= ' + this.percentage.toFixed(1) + ' %';
}
else
{
var pointIndex = 0;
var unit = [".$s. "][serieIndex][pointIndex];
var offset = [".$offset. "][serieIndex] * 1000;
var offsetInfo ='';
if (offset != 0)
offsetInfo = '<br/>(Achtung Zeitwert hat einen Offset)';
else
offsetInfo ='';
return '<b>' + this.series.name + ': </b> '+ unit + '<br/>'
+ Highcharts.dateFormat('%A %d.%m.%Y %H:%M', this.x - offset)
+ offsetInfo;
}
} ";
*/
$TooltipString="function() {
var serieIndex = this.series.index;
var unit = [".$s. "][serieIndex];
var offset = [".$offset. "][serieIndex] * 1000;
var offsetInfo ='';
if (offset != 0)
offsetInfo = '<br/>(Achtung Zeitwert hat einen Offset)';
else
offsetInfo ='';
if (this.series.type == 'pie')
{
return '<b>' + this.point.name +': </b> '+ unit +'<br/>= ' + this.percentage.toFixed(1) + ' %';
}
else
{
return '<b>' + this.series.name + ': </b> '+ unit + '<br/>'
+ Highcharts.dateFormat('%A %d.%m.%Y %H:%M', this.x - offset)
+ offsetInfo;
}
} ";
return $TooltipString;
}
// ------------------------------------------------------------------------
// CreateTooltipSubValues
// Erzeugt den Tooltip für Unter-Elemente
// IN: shownTooltipArr = Array der Werte (Synonyme) welche im Tooltip angezeigt werden sollen
// chartValueArr = Array der Werte welche im Chart eingetragen werden
// OUT: Tooltip String
// ------------------------------------------------------------------------
function CreateTooltipSubValues($shownTooltipArr, $chartValueArr)
{
$s="{";
$Count = count($shownTooltipArr);
for ($i = 0; $i < $Count ; $i++)
{
if (isset($chartValueArr[$i]) && isset($shownTooltipArr[$i]))
$s .= $chartValueArr[$i] .": '" . $shownTooltipArr[$i] ."'," ;
}
$s = trim($s, ",") . "}";
return $s ."[this.y],";
}
// ------------------------------------------------------------------------
// GetIPSVariableProfile
// Liest das Variablen Profil der übergeben Variable aus
// Versucht zuerst das eigene und wenn nicht verfügbar das Standar Profil auszulesen
// IN: variableId = Id der Variablen
// OUT: Variablen Profil
// ------------------------------------------------------------------------
function GetIPSVariableProfile($variableId)
{
$var = @IPS_GetVariable($variableId);
if ($var == false) // Variabel existiert nicht
return false;
$profilName = $var['VariableCustomProfile']; // "Eigenes Profil"
if ($profilName == false) // "Standard" Profil
$profilName = $var['VariableProfile'];
if ($profilName != false)
return IPS_GetVariableProfile($profilName); // und jetzt die dazugehörigen Daten laden
else
return false;
}
// ------------------------------------------------------------------------
// CreateArrayForChart
//
// IN: $cfg
// OUT: Config Array für den Bereich 'chart'
// ------------------------------------------------------------------------
function CreateArrayForChart($cfg)
{
if (!isset($cfg['chart']))
$cfg['chart'] = array();
//Default
IfNotIssetSetValue($cfg['chart']['renderTo'], "container");
IfNotIssetSetValue($cfg['chart']['zoomType'], "xy");
return $cfg['chart'];
}
// ------------------------------------------------------------------------
// CreateArrayForCredits
//
// IN: $cfg
// OUT: Config Array für den Bereich 'credits'
// ------------------------------------------------------------------------
function CreateArrayForCredits($cfg)
{
if (!isset($cfg['credits']))
$cfg['credits'] = array();
//Default
IfNotIssetSetValue($cfg['credits']['enabled'], false);
return $cfg['credits'];
}
// ------------------------------------------------------------------------
// CreateArrayForTitle
//
// IN: $cfg
// OUT: Config Array für den Bereich 'title'
// ------------------------------------------------------------------------
function CreateArrayForTitle($cfg)
{
if (!isset($cfg['title']))
$cfg['title'] = array();
return $cfg['title'];
}
// ------------------------------------------------------------------------
// CreateArrayForExporting
//
// IN: $cfg
// OUT: Config Array für den Bereich 'exporting'
// ------------------------------------------------------------------------
function CreateArrayForExporting($cfg)
{
if (!isset($cfg['exporting']))
$cfg['exporting'] = array();
//Default
IfNotIssetSetValue($cfg['exporting']['buttons']['printButton']['enabled'], false);
return $cfg['exporting'];
}
// ------------------------------------------------------------------------
// CreateArrayForTooltip
//
// IN: $cfg
// OUT: Config Array für den Bereich 'tooltip'
// ------------------------------------------------------------------------
function CreateArrayForTooltip($cfg)
{
if (!isset($cfg['tooltip']))
$cfg['tooltip'] = array();
//Default
// wenn not isset -> autom. erzeugen durch IPS
if (!isset($cfg['tooltip']['formatter']))
$cfg['tooltip']['formatter'] = "@" . CreateTooltipFormatter($cfg) . "@";
// wenn "" -> default by highcharts
else if ($cfg['tooltip']['formatter'] == "")
{
// do nothing
}
return $cfg['tooltip'];
}
// ------------------------------------------------------------------------
// CreateArrayForSubTitle
//
// IN: $cfg
// OUT: Config Array für den Bereich subtitle
// ------------------------------------------------------------------------
function CreateArrayForSubTitle($cfg)
{
if (!isset($cfg['subtitle']))
$cfg['subtitle'] = array();
//Default
IfNotIssetSetValue($cfg['subtitle']['text'], "Zeitraum: %STARTTIME% - %ENDTIME%");
IfNotIssetSetValue($cfg['subtitle']['Ips']['DateTimeFormat'], "(D) d.m.Y H:i");
$s = $cfg['subtitle']['text'];
$s = str_ireplace("%STARTTIME%", date($cfg['subtitle']['Ips']['DateTimeFormat'], $cfg['Ips']['ChartStartTime']), $s);
$s = str_ireplace("%ENDTIME%", date($cfg['subtitle']['Ips']['DateTimeFormat'], $cfg['Ips']['ChartEndTime']), $s);
$cfg['subtitle']['text'] = ReplaceToGermanDate($s);
unset($cfg['subtitle']['Ips']);
return $cfg['subtitle'];
}
// ------------------------------------------------------------------------
// CreateArrayForXAxis
// Erzeugen das ArrX-Achsen Strings für Highchart-Config
// IN: $cfg
// es besteht die Möglichkeit den Achsen String bereits im Highchart Format zu hinterlegen
// oder die folgenden Parameter als Array einzustellen: Name, Min, Max, TickInterval, Opposite, Unit
// OUT: Highcharts String für die Achsen
// ------------------------------------------------------------------------
function CreateArrayForXAxis($cfg)
{
if (!isset($cfg['xAxis']))
$cfg['xAxis'] = array();
//Default
IfNotIssetSetValue($cfg['xAxis']['type'], "datetime");
IfNotIssetSetValue($cfg['xAxis']['dateTimeLabelFormats']['second'], "%H:%M:%S");
IfNotIssetSetValue($cfg['xAxis']['dateTimeLabelFormats']['minute'], "%H:%M");
IfNotIssetSetValue($cfg['xAxis']['dateTimeLabelFormats']['hour'], "%H:%M");
IfNotIssetSetValue($cfg['xAxis']['dateTimeLabelFormats']['day'], "%e. %b");
IfNotIssetSetValue($cfg['xAxis']['dateTimeLabelFormats']['week'], "%e. %b");
IfNotIssetSetValue($cfg['xAxis']['dateTimeLabelFormats']['month'], "%b %y");
IfNotIssetSetValue($cfg['xAxis']['dateTimeLabelFormats']['year'], "%Y");
IfNotIssetSetValue($cfg['xAxis']['allowDecimals'], false);
if (isset($cfg['xAxis']['min']) && $cfg['xAxis']['min'] == false)
unset($cfg['xAxis']['min']);
else
IfNotIssetSetValue($cfg['xAxis']['min'], "@" . CreateDateUTC($cfg['Ips']['ChartStartTime']) ."@");
if (isset($cfg['xAxis']['max']) && $cfg['xAxis']['max'] == false)
unset($cfg['xAxis']['max']);
else
IfNotIssetSetValue($cfg['xAxis']['max'], "@" . CreateDateUTC($cfg['Ips']['ChartEndTime'])."@");
return $cfg['xAxis'];
}
// ------------------------------------------------------------------------
// CreateArrayForYAxis
// Erzeugen der Y-Achsen Strings für Highchart-Config
// IN: $cfg
// es besteht die Möglichkeit den Achsen String bereits im Highchart Format zu hinterlegen
// oder die folgenden Parameter als Array einzustellen: Name, Min, Max, TickInterval, Opposite, Unit
// OUT: Highcharts String für die Achsen
// ------------------------------------------------------------------------
function CreateArrayForYAxis($cfg)
{
if (!isset($cfg['yAxis']))
return null;
$result = array();
foreach ($cfg['yAxis'] as $Axis )
{
// erst mal alles kopieren
$cfgAxis = $Axis;
if (!isset($cfgAxis['labels']['formatter']) && isset($Axis['Unit']))
$cfgAxis['labels']['formatter'] ="@function() { return this.value +' ". $Axis['Unit']."'; }@";
$result[] = $cfgAxis;
}
return $result;
}
// ------------------------------------------------------------------------
// CreateDateUTC
// Erzeugen des DateTime Strings für Highchart-Config
// IN: $timeStamp = Zeitstempel
// OUT: Highcharts DateTime-Format als UTC String ... Date.UTC(1970, 9, 27, )
// Achtung! Javascript Monat beginnt bei 0 = Januar
// ------------------------------------------------------------------------
function CreateDateUTC($timeStamp)
{
$monthForJS = ((int)date("m", $timeStamp))-1 ; // Monat -1 (PHP->JS)
return "Date.UTC(" . date("Y,", $timeStamp) .$monthForJS. date(",j,H,i,s", $timeStamp) .")";
}
// ------------------------------------------------------------------------
// ReplaceToGermanDate
// Falls nicht konfiguriert, wird dies als Default String genommen
// IN: String mit englischen Wochentagen, bzw. Monaten
// OUT: der String übersetzt ins Deutsche
// ------------------------------------------------------------------------
function ReplaceToGermanDate($value)
{
$trans = array(
'Monday' => 'Montag',
'Tuesday' => 'Dienstag',
'Wednesday' => 'Mittwoch',
'Thursday' => 'Donnerstag',
'Friday' => 'Freitag',
'Saturday' => 'Samstag',
'Sunday' => 'Sonntag',
'Mon' => 'Mo',
'Tue' => 'Di',
'Wed' => 'Mi',
'Thu' => 'Do',
'Fri' => 'Fr',
'Sat' => 'Sa',
'Sun' => 'So',
'January' => 'Januar',
'February' => 'Februar',
'March' => 'März',
'May' => 'Mai',
'June' => 'Juni',
'July' => 'Juli',
'October' => 'Oktober',
'December' => 'Dezember',
'Mar' => 'Mär',
'May' => 'Mai',
'Oct' => 'Okt',
'Dec' => 'Dez',
);
return strtr($value, $trans);
}
// ------------------------------------------------------------------------
// my_json_encode
//
// IN: PHP-Array
// OUT: JSON String
// ------------------------------------------------------------------------
function my_json_encode($cfgArr)
{
array_walk_recursive($cfgArr, "CheckArrayItems");
$s = json_encode($cfgArr);
// alle " entfernen
$s = str_replace('"', '',$s);
// Zeilenumbruch, Tabs, etc entfernen ... bin mir nicht so sicher ob das so gut ist
$s = RemoveUnsupportedStrings($s);
return $s;
}
// ------------------------------------------------------------------------
// CheckArrayItems
//
// IN: Array-Item
// OUT:
// ------------------------------------------------------------------------
function CheckArrayItems(&$item)
{
if (is_string($item))
{
if ($item == "@" || $item == "@@" )
{
$item = "'" . $item . "'";
}
else if ((substr($item,0,1) == "@" && substr($item,-1) == "@"))
{
$item = trim($item, "@");
}
/* else if ((substr($item,0,1) == "$" && substr($item,-1) == "$"))
{
$item = trim($item, "$");
}*/
else
{
$item = "'" . trim($item, "'") . "'";
}
$item = utf8_encode($item);
}
}
// ------------------------------------------------------------------------
// RemoveUnsupportedStrings
// Versuchen Sonderzeichen wie Zeilenumbrüche, Tabs, etc. aus dem übergebenen String zu entfernen
// IN: $str
// OUT: $str
// ------------------------------------------------------------------------
function RemoveUnsupportedStrings($str)
{
$str = str_replace("\ ","",$str);
$str = str_replace("\
","",$str);
$str = str_replace("\\r","",$str);
$str = str_ireplace("\\\u00","\\u00",$str); // da muss man nochmals checken
$str = str_replace("\\\\","",$str);
return $str;
}
// ------------------------------------------------------------------------
// IfNotIssetSetValue
// pfüft ob isset($item), wenn nicht wird $value in &$item geschrieben
// IN: &$item, $value
// OUT: &$item
// ------------------------------------------------------------------------
function IfNotIssetSetValue(&$item, $value )
{
if (!isset($item)
|| (is_string($item) && $item == "")) // zusätzliche Abfrage in 2.01
{
$item = $value;
return false;
}
return true;
}
// ------------------------------------------------------------------------
// getmicrotime
//
// IN:
// OUT:
// ------------------------------------------------------------------------
function getmicrotime($short = false)
{
list($usec,$sec)=explode(" ", microtime());
if ($short )
return (float)$usec + (float)substr($sec,-1);
else
return (float)$usec + (float)$sec;
}
// ------------------------------------------------------------------------
// DebugString
//
// IN:
// OUT:
// ------------------------------------------------------------------------
function DebugString($str)
{
$s = RemoveUnsupportedStrings($str);
echo $s;
}
// ------------------------------------------------------------------------
// DebugModuleName
//
// IN:
// OUT:
// ------------------------------------------------------------------------
function DebugModuleName($cfg, $name)
{
if (isset($cfg['Ips']['Debug']['Modules']) && $cfg['Ips']['Debug']['Modules'])
{
global $IPS_SENDER, $version, $versionDate;
IPS_LogMessage($IPS_SENDER ." - " .getmicrotime(true) , "Highcharts $version ($versionDate) - $name");
}
}
?>
Die Darstellung im WebFront:
Muss man die String-Variable (~HTMLBox) eigentlich loggen?
In welches Verzeichnis muss die entpackte Datei (ips.js) von template_ips.rar kopiert werden?
IPS_Template.php stammt aus Highcharts_V2.02/IPS_Template/Highscharts/IPS_Template.php und wurde in das Verzeichnis C:\IP-Symcon\webfront\user\Highcharts kopiert. Ist das so korrekt?
<?php
// bei der Konfiguration unbedingt auf die Groß/Kleinschreibung achten
// es wurde versucht folgende Namensgebeung in der Konfiguration zu verwenden
// Parameter mit kleinen Anfangsbuchstaben = Parameter welche von Highcharts ÃŒbnernommen wurden. Siehe dazu: http://www.highcharts.com/ref/
// Parameter mit großen Anfangsbuchstaben = fÌr das IPS-Highcharts-Script eingefÌhrte Parameter
Global $CfgDaten; // damit kann der Script auch von anderen Scripten aufgerufen werden und bereits mit CfgDaten vorkonfiguriert werden
// IPS Variablen IDÅœs
$CfgDaten['ContentVarableId']= 18411 /*[Geräte\Highcharts\StringVariable]*/; // ID der String Variable in welche die Daten geschrieben werden (-1 oder ÃŒberhaupt nicht angeben wenn die Content Variable das ÃŒbergordnete Element ist)
$CfgDaten['HighChartScriptId']= 49286 /*[Geräte\Highcharts\StringVariable\Highcharts_V202.ips]*/; // ID des Highcharts Scripts
// Highcharts oder Highstock (default = Highcharts
$CfgDaten['Ips']['ChartType'] = 'Highcharts';
// Zeitraum welcher dargestellt werden soll (kann durch die Zeitvorgaben in den Serien verÀndert werden)
$CfgDaten['StartTime'] = mktime(0,0,0, date("m", time()), date("d",time())-1, date("Y",time())); // ab heute 00:00 Uhr
$CfgDaten['EndTime'] = mktime(23,59,59, date("m", time()), date("d",time()), date("Y",time())); // ab heute 23:59 Uhr, oder //$CfgDaten['EndTime'] = time(); // = bis jetzt
//$CfgDaten['StartTime'] = time()-60*60*24*1*1; // 1Jahr: 60s*60min*24h*365d
//$CfgDaten['EndTime'] = time(); // jetzt
// damit wird die Art des Aufrufes festgelegt
$CfgDaten['RunMode'] = "script"; // file, script, popup
if ($CfgDaten['RunMode'] == "popup")
{
$CfgDaten['WebFrontConfigId'] = 25689 /*[WebFront]*/;
$CfgDaten['WFCPopupTitle'] = "Ich bin der Text, welcher als Ueberschrift im Popup gezeigt wird";
}
// Ãœbergabe der IP-Adresse und des Ports fÃŒr die Darstellung im Dashboard
// Wichtig! Wenn Darstellung in Webfront diese Variablen auskommentieren
//$CfgDaten['Ips']['Dashboard']['Ip'] = "127.0.0.1";
//$CfgDaten['Ips']['Dashboard']['Port'] = "82";
// SerienÃŒbergreifende Einstellung fÃŒr das Laden von Werten
$CfgDaten['AggregatedValues']['HourValues'] = -1; // ist der Zeitraum größer als X Tage werden Stundenwerte geladen
$CfgDaten['AggregatedValues']['DayValues'] = -1; // ist der Zeitraum größer als X Tage werden Tageswerte geladen
$CfgDaten['AggregatedValues']['WeekValues'] = -1; // ist der Zeitraum größer als X Tage werden Wochenwerte geladen
$CfgDaten['AggregatedValues']['MonthValues'] = -1; // ist der Zeitraum größer als X Tage werden Monatswerte geladen
$CfgDaten['AggregatedValues']['YearValues'] = -1; // ist der Zeitraum größer als X Tage werden Jahreswerte geladen
$CfgDaten['AggregatedValues']['NoLoggedValues'] = 1000; // ist der Zeitraum größer als X Tage werden keine Boolean Werte mehr geladen, diese werden zuvor immer als Einzelwerte geladen $CfgDaten['AggregatedValues']['MixedMode'] = false; // alle Zeitraumbedingungen werden kombiniert
$CfgDaten['AggregatedValues']['MixedMode'] = false;
// Systematik funktioniert jetzt additiv. D.h. die angegebenen Werte gehen ab dem letzten Wert
//
// -5 Tage -3 Tage EndTime
// | | | |
// | |DayValue = 2 |HourValues = 3 |
// |Tageswerte |Stundenwerte |jeder geloggte Wert |
// **************************************************************************************
// *** Highcharts Options ***
// **************************************************************************************
// Ab hier werden die Bereiche des Highchart-Objektes parametriert.
// Dieser Bereich wurde (soweit möglich) identisch der Originalstruktur gehalten.
// Informationen ÃŒber die Parametrierung findet man unter http://www.highcharts.com/ref/
// **************************************************************************************
// *** chart *** http://www.highcharts.com/ref/#chart
// **************************************************************************************
// $CfgDaten['chart']['zoomType'] = "'x'"; //default: $CfgDaten['chart']['zoomType'] = "'xy'";
// **************************************************************************************
// *** credits *** siehe http://www.highcharts.com/ref/#credits
// **************************************************************************************
// $CfgDaten['credits']['text'] = "used by IPS";
// $CfgDaten['credits']['href'] = "http://www.ip-symcon.de/forum/f53/highcharts-multigraph-v1-0-a-17625/#post120721";
// **************************************************************************************
// *** title *** siehe http://www.highcharts.com/ref/#title
// **************************************************************************************
// $CfgDaten['title']['text'] = "Chart-Ãœberschrift"; // Ãœberchrift des gesamten Charts
// -> veraltet: 'Title' -> verwende ['title']['text']
$CfgDaten['title']['text'] = "Chart-Ueberschrift";
// **************************************************************************************
// *** subtitle *** siehe http://www.highcharts.com/ref/#subtitle
// **************************************************************************************
// $CfgDaten['subtitle']['text'] = "Zeitraum: %STARTTIME% - %ENDTIME%" // Sub-Ãœberschrift. Wenn nichts angegeben wird wird dieser String als Default verwendet
// -> veraltet: 'SubTitle' -> verwende ['subtitle']['text']
// $CfgDaten['subtitle']['Ips']['DateTimeFormat'] = "(D) d.m.Y H:i" // z.B.: "(D) d.m.Y H:i" (wird auch als Default herangezogen wenn nichts konfiguriert wurde)
// -> veraltet: 'SubTitleDateTimeFormat' -> verwende ['subtitle']['Ips']['DateTimeFormat']
// -> entfallen: 'SubTitleFormat' -> unnötiger Paramter, wird jetzt in ['subtitle']['text'] angegeben
$CfgDaten['subtitle']['text'] = "Zeitraum: %STARTTIME% - %ENDTIME%";
$CfgDaten['subtitle']['Ips']['DateTimeFormat'] = "(D) d.m.Y H:i";
// **************************************************************************************
// *** tooltip *** http://www.highcharts.com/ref/#tooltip
// **************************************************************************************
// $CfgDaten['tooltip']['enabled'] = false;
// $CfgDaten['tooltip']['formatter'] = Null; // IPS erstellt selbstÀndig einen Tooltip
// $CfgDaten['tooltip']['formatter'] = ""; // Standard - Highcharts Tooltip
// **************************************************************************************
// *** exporting *** http://www.highcharts.com/ref/#exporting
// **************************************************************************************
// $CfgDaten['exporting']['enabled'] = true;
// **************************************************************************************
// *** lang *** http://www.highcharts.com/ref/#lang
// **************************************************************************************
// $CfgDaten['lang']['resetZoom'] = "Zoom zurÃŒcksetzten";
// **************************************************************************************
// *** legend *** http://www.highcharts.com/ref/#legend
// **************************************************************************************
// $CfgDaten['legend']['backgroundColor'] = '#FCFFC5';
// **************************************************************************************
// *** xAxis *** http://www.highcharts.com/ref/#xAxis
// **************************************************************************************
// $CfgDaten['xAxis']['lineColor'] = '#FF0000';
// $CfgDaten['xAxis']['plotBands'][] = array("color"=>'#FCFFC5',"from"=> "@Date.UTC(2012, 3, 29)@","to"=> "@Date.UTC(2012, 3, 30)@");
// **************************************************************************************
// *** yAxis *** http://www.highcharts.com/ref/#yAxis
// **************************************************************************************
// $CfgDaten['yAxis'][0]['title']['text'] = "Temperaturen"; // Bezeichnung der Achse
// -> veraltet: 'Name' und 'TitleText' -> verwende ['title']['text']
// $CfgDaten['yAxis'][0]['Unit'] = "°C"; // Einheit fÌr die Beschriftung die Skalenwerte
// $CfgDaten['yAxis'][0]['min'] = 0; // Achse beginnt bei Min (wenn nichts angegeben wird wird der Min der Achse automatisch eingestellt)
// $CfgDaten['yAxis'][0]['max'] = 40; // Achse geht bis Max (wenn nichts angegeben wird wird der Max der Achse automatisch eingestellt)
// -> veraltet: 'Min' und 'Max'
// $CfgDaten['yAxis'][0]['opposite'] = false; // Achse wird auf der rechten (true) oder linken Seite (false) des Charts angezeigt (default = false)
// -> veraltet: 'Opposite'
// $CfgDaten['yAxis'][0]['tickInterval'] = 5; // Skalenwerte alle x (TickInterval)
// -> veraltet: 'TickInterval'
// -> entfallen: 'PlotBands' -> verwende ['yAxis'][0]['plotBands'], (siehe Beispiel 'cfg - drehgriff und tf-kontakt')
// -> entfallen: 'YAxisColor' -> verwende ['yAxis'][0]['title']['style']
// -> entfallen: 'TitleStyle'-> verwende ['yAxis'][0]['title']['style']
$CfgDaten['yAxis'][0]['title']['text'] = "Temperaturen";
$CfgDaten['yAxis'][0]['Unit'] = "°C";
$CfgDaten['yAxis'][0]['opposite'] = false;
$CfgDaten['yAxis'][0]['tickInterval'] = 5;
$CfgDaten['yAxis'][0]['min'] = 0;
$CfgDaten['yAxis'][0]['max'] = 40;
// $CfgDaten['yAxis'][1]['title']['text'] = "Heizungssteller / Luftfeuchte";
// $CfgDaten['yAxis'][1]['Unit'] = "%";
// $CfgDaten['yAxis'][1]['opposite'] = true;
// $CfgDaten['yAxis'][2]['title']['text'] = "Drehgriffkontakte / TÃŒrkontakte";
// $CfgDaten['yAxis'][2]['labels']['formatter'] = "@function() { if (this.value == 0.5) return 'geschlossen'; if (this.value == 1) return 'gekippt';if (this.value == 2) return 'geöffnet' }@";
// $CfgDaten['yAxis'][2]['allowDecimals'] = true;
// $CfgDaten['yAxis'][2]['showFirstLabel '] = false;
// $CfgDaten['yAxis'][2]['showLastLabel '] = false;
// $CfgDaten['yAxis'][2]['opposite'] = true;
// $CfgDaten['yAxis'][2]['labels']['rotation'] = 90;
// $CfgDaten['yAxis'][3]['title']['text'] = "Columns";
// $CfgDaten['yAxis'][3]['Unit'] = "kWh";
// **************************************************************************************
// *** series *** http://www.highcharts.com/ref/#series
// **************************************************************************************
// $serie['name'] = "Temperatur; // Name der Kurve (Anzeige in Legende und Tooltip)
// -> veraltet: 'Name' -> verwende [series']['name']
// $serie['Unit'] = "°C"; // Anzeige in automatisch erzeugtem Tooltip
// wenn $serie['Unit'] = NULL; // oder Unit wird gar nicht definiert, wird versucht die Einheit aus dem Variablenprofil automatisch auszulesen
// $serie['ReplaceValues'] = false; // Werte werden wie geloggt ÃŒbernommen
// $serie['ReplaceValues'] = array(0=>0.2,1=>10) // der Wert 0 wird in 0.2 geÀndert, der Wert 1 wird in 10 geÀndert
// das macht fÃŒr die Darstellung von Boolean Werte Sinn, oder fÃŒr Drehgriffkontakte (Werte 0,1,2)
// $serie['type'] = 'spline'; // Festlegung des Kuventypes (area, areaspline, line, spline, pie, Column)
// $serie['yAxis'] = 0; // Nummer welche Y-Achse verwendet werden soll (ab 0)
// -> veraltet: 'Param' -> verwende die Highcharts Parameter - sollte eigentlich noch so funktionieren wie in IPS-Highcharts V1.x
// $serie['AggType'] = 0 // Festlegung wie die Werte gelesen werden soll (0=Hour, 1=Day, 2=Week, 3=Month, 4=Year), hat Vorrang gegenÃŒber den Einstellungen in AggregatedValues
// wird kein AggType definiert werden alle gelogten Werte angezeigt
// $serie['AggNameFormat'] = "d.m.Y H:i"; // (gilt nur bei den Pies, wenn eine Id verwendet wird), entspricht dem PHP-date("xxx") Format, welches das Format der Pie Namen festlegt, wenn keine Eingabe werden Default Werte genommen
// $serie['Offset'] = 24*60*60; hiermit können Kurven unterschiedlicher ZeitrÀume in einem Chart dargestellt. Angabe ist in Minuten
// $serie['StartTime'] = mktime(0,0,0,1,1,2012); // wird fÃŒr die entsprechende Serie eine Anfangs- und/oder Endzeitpunkt festgelegt wird dieser verwendet. Ansonsten wird
// $serie['EndTime'] = mktime(0,0,0,2,1,2012); // der Zeitpunkt der Zeitpunkt aus den $CfgDaten genommen
// $serie['ScaleFactor'] = 10; // Skalierungsfaktor mit welchem der ausgelesene Werte multipliziert wird
// $serie['RoundValue'] = 1; // Anzahl der Nachkommastellen
// $serie['AggValue'] ='Min' // Ìber AggValue kann Min/Max oder Avg vorgewÀhlt werden (Default bei keiner Angabe ist Avg)
// ist sinnvoll wenn nicht Einzelwerte sondern Stundenwerte, Tageswerte, usw. ausgelesen werden
// $serie['data'] = array('TimeStamp'=> time(),'Value'=12) // hier kann ein Array an eigenen Datenpunkten ÃŒbergeben werden. In diesem Fall werden fÃŒr diese Serie keine Daten aus der Variable gelesenen.
// $serie = array();
// $serie['name'] = 'Pie';
// $serie['type'] = 'pie';
// $serie['data'][] = array('name'=>'Aussentemperatur', 'Id' => 15936, 'Unit'=>"°C");
// $serie['data'][] = array('name'=>'Luftfeuchte', 'Id' => 17593, 'Unit'=>"%");
// $serie['allowPointSelect'] = true;
// $serie['cursor'] = 'pointer';
// $serie['center'] = array(300,100);
// $serie['size'] = 100;
// $serie['dataLabels']['enabled'] = true;
// $CfgDaten['series'][] = $serie;
$serie = array();
$serie['name'] = "Aussentemperatur";
$serie['Id'] = 24896 /*[Geräte\Feuchtesensoren\Temperatur & Feuchtesensor BJ Unterputz (121,T, Speis)\Temperatur]*/;
$serie['Unit'] = "°C";
$serie['ReplaceValues'] = false;
$serie['RoundValue'] = 0;
$serie['type'] = "line";
$serie['yAxis'] = 0;
$serie['marker']['enabled'] = false;
$serie['shadow'] = true;
$serie['lineWidth'] = 1;
$serie['states']['hover']['lineWidth'] = 2;
$serie['marker']['states']['hover']['enabled'] = true;
$serie['marker']['states']['hover']['symbol'] = 'circle';
$serie['marker']['states']['hover']['radius'] = 4;
$serie['marker']['states']['hover']['lineWidth'] = 1;
$CfgDaten['series'][] = $serie;
// $serie = array();
// $serie['name'] = "Luftfeuchte";
// $serie['Id'] = 17593 /*[Geräte\Feuchtesensoren\Temperatur & Feuchtesensor Aussen (317, RH)\relFeuchte_Aussen]*/;
// $serie['Unit'] = "%";
// $serie['ReplaceValues'] = false;
// $serie['type'] = "spline";
// $serie['step'] = false;
// $serie['yAxis'] = 1;
// $serie['shadow'] = true;
// $serie['lineWidth'] = 1;
// $serie['states']['hover']['lineWidth'] = 2;
// $serie['marker']['enabled'] = false;
// $serie['marker']['states']['hover']['enabled'] = true;
// $serie['marker']['states']['hover']['symbol'] = 'circle';
// $serie['marker']['states']['hover']['radius'] = 4;
// $serie['marker']['states']['hover']['lineWidth'] = 1;
// $CfgDaten['series'][] = $serie;
// $serie = array();
// $serie['name'] = "Drehgriffkontakt";
// $serie['Id'] = 44451 /*[Objekt #44451 existiert nicht]*/;
// $serie['Unit'] = array(0=>'geschlossen', 1=>'gekippt', 2=>'geöffnet');
// $serie['ReplaceValues'] = array(0=>0.5, 1=>1, 2=>2);
// $serie['type'] = "line";
// $serie['step'] = true;
// $serie['yAxis'] = 2;
// $serie['shadow'] = true;
// $serie['lineWidth'] = 1;
// $serie['states']['hover']['lineWidth'] = 2;
// $serie['marker']['enabled'] = false;
// $serie['marker']['states']['hover']['enabled'] = true;
// $serie['marker']['states']['hover']['symbol'] = 'circle';
// $serie['marker']['states']['hover']['radius'] = 4;
// $serie['marker']['states']['hover']['lineWidth'] = 1;
// $CfgDaten['series'][] = $serie;
// $serie = array();
// $serie['name'] = "Column";
// $serie['Id'] = 29842 /*[Objekt #29842 existiert nicht]*/;
// $serie['Unit'] = "kWh";
// $serie['ReplaceValues'] =false;
// $serie['type'] = "column";
// $serie['step'] = false;
// $serie['yAxis'] = 3;
// $serie['shadow'] = true;
// $serie['states']['hover']['lineWidth'] = 2;
// $serie['marker']['enabled'] = false;
// $serie['marker']['states']['hover']['enabled'] = true;
// $serie['marker']['states']['hover']['symbol'] = 'circle';
// $serie['marker']['states']['hover']['radius'] = 4;
// $serie['marker']['states']['hover']['lineWidth'] = 1;
// $CfgDaten['series'][] = $serie;
// Highcharts-Theme
// $CfgDaten['HighChart']['Theme']="grid.js"; // von Highcharts mitgeliefert: dark-green.js, dark-blue.js, gray.js, grid.js
$CfgDaten['HighChart']['Theme']="ips.js"; // IPS-Theme muss per Hand in in Themes kopiert werden....
// Abmessungen des erzeugten Charts
$CfgDaten['HighChart']['Width'] = 0; // in px, 0 = 100%
$CfgDaten['HighChart']['Height'] = 600; // in px
// -------------------------------------------------------------------------------------------------------------------------------------
// und jetzt los ......
$s = IPS_GetScript($CfgDaten['HighChartScriptId']); // Id des Highcharts-Scripts
include($s['ScriptFile']);
// hier werden die CfgDaten geprÌft und bei Bedarf vervollstÀndigt
$CfgDaten = CheckCfgDaten($CfgDaten);
// abhÀngig von der Art des Aufrufs -> json String fÌr Highcharts erzeugen
if (isset($CfgDaten['RunMode'])
&& ($CfgDaten['RunMode'] == "script" || $CfgDaten['RunMode'] == "popup"))
{
// Variante1: Ãœbergabe der ScriptId. Daten werden beim Aufruf der PHP Seite erzeugt und direkt ÃŒbergeben. Dadurch kann eine autom. Aktualisierung der Anzeige erfolgen
if ($IPS_SENDER != "WebInterface")
{
WriteContentWithScriptId ($CfgDaten, $IPS_SELF); // und jetzt noch die ContentTextbox
return; // Ende, weil durch die Zuweisung des Script sowieso nochmals aufgerufen wird
}
$sConfig = CreateConfigString($CfgDaten); // erzeugen und zurÃŒckgeben des Config Strings
}
else
{
//Variante2: Ãœbergabe des Textfiles. Daten werden in tmp-File gespeichert. Eine automatische Aktualisierung beim Anzeigen der Content-Textbox erfolgt nicht
$sConfig = CreateConfigString($CfgDaten); // erzeugen und zurÃŒckgeben des Config Strings
$tmpFilename = CreateConfigFile($sConfig, $IPS_SELF); // und ab damit ins tmp-Files
if ($IPS_SENDER != "WebInterface")
{
WriteContentWithFilename ($CfgDaten, $tmpFilename); // und jetzt noch die ContentTextbox
}
}
?>
$CfgDaten[‚yAxis‘][0] ist aktiviert und
$serie['yAxis'] = 0; bezieht sich auf diese Achse.
Hallo Wickie,
hab Dein Config-Script (wie auch das letzte) mal bei mir (mit Anpassungen der IDs) laufen lassen. Ich bekomm einen Chart.
In der Vergangenheit gabs schon öfters Probleme mit neuinstallationen von HC. Da hat immer was gefehlt. Ich hab mir noch nicht die Mühe gemacht herauszufinden welche Datei/en es ist/sind. Wenn man die neuen Versionen über die Alten bügelt gehts (bei mir).
hier mal mein aktuelles highcharts Verzeichnis zum Download:
Mein Automatisierungs-Rechner ist noch ohne Internet.
Habe den IP-Symcon Ordner auf mein Notebook kopiert, welches Internet hat:
–> Highchart-Graph wird korrekt im Webfront dargestellt
Gibt es eine Möglichkeit, Highcharts auch offline zu nutzen?
Schon langsam nervt die Telekom… den Hausanschluss haben sie im Juli gelegt aber immer noch nicht geschafft in freizuschalten… :mad:
Vielen Dank an Wolfgang, für die tolle Unterstützung.
Wenn es keine Möglichkeit gibt, HC offline zu verwenden, dann muss ich halt noch ein paar Wochen warten. Das kann ich verkfraften.
ich verstehe es auch nicht:
Notebook mit Internet: Highchart wird angezeigt
Notebook ohne Internet: Highchart wird angezeigt
IP-Symcon Ordner kopiert auf Desktop-PC
Desktop-PC ohne Internet: Highchart wird nicht angzeigt
In diesem Thread bin ich auf folgenden Beitrag gestoßen:
einige Beiträge später steht:
Habe die jquery-2.1.0.min.js von der Homepage runtergeladen und in das Verzeichnis highcharts/js kopiert.
Habe jedoch keine Ahnung, in welcher Datei und wie und wo ich folgendes eintragen soll:
Wenn ich im Webfront das ConfigSkript ausführe, erscheint im Highchart ganz kurz diese Webseite: http://ajax.googleapis.com/ajax
Deshalb kann es schon sein, dass eine Internetverbindung notwendig ist, beim Abruf von HC.
Als ich bei meinem Notebook die Internetverbindung beendete, konnte ich jedoch den HC aufrufen. Hatte dabei zwischenzeitlich die y-Achse gespiegelt, um einen Unterscheid feststellen zu können… → wurde korrekt dargestellt.
Hallo Wickie,
habs grade mal getestet. Erstell Dir ein Verzeichnis \webfront\user\jquery und entpack mal die jquery.js aus dem Anhang da rein. Ist die 1.9.1.
Dann kommentier die Zeile