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 //-------------------------------------------------------------------------------------------------------------------------------- // ------------------------------------------------------------------------ // 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"); // damit das Ding auch sauber dargestellt wird $Height = $cfg['HighChart']['Height'] + 16; $ChartType = $cfg['Ips']['ChartType']; if ($tmpFilename != "") SetValue($cfg['ContentVarableId'], ""); 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"); $ChartType = $cfg['Ips']['ChartType']; if ($cfg['RunMode'] == "popup") { WFC_SendPopup($cfg['WebFrontConfigId'], $cfg['WFCPopupTitle'] , ""); } else { $Height = $cfg['HighChart']['Height'] + 16; SetValue($cfg['ContentVarableId'], ""); } } // ------------------------------------------------------------------------ // 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['RunMode'] != "dashboard" ) $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) . "\n|||\n" . $cfgString; // Language Options aus IPS_Template.php hierher verschoben $cfgString .= "\n|||\n". 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'], ""); } if ($cfg['RunMode'] == "dashboard") { if (!isset($cfg['Ips']['Dashboard']['Ip'])) die ("Abbruch - Konfiguration von ['Ips']['Dashboard']['Ip'] fehlt."); if (!isset($cfg['Ips']['Dashboard']['Port'])) die ("Abbruch - Konfiguration von ['Ips']['Dashboard']['Port'] fehlt."); } 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\n()") ; } // *************************************************************************************************************************** // ------------------------------------------------------------------------ // 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 '' + this.point.name +': '+ unit +'
= ' + this.percentage.toFixed(1) + ' %'; } else { var pointIndex = 0; var unit = [".$s. "][serieIndex][pointIndex]; var offset = [".$offset. "][serieIndex] * 1000; var offsetInfo =''; if (offset != 0) offsetInfo = '
(Achtung Zeitwert hat einen Offset)'; else offsetInfo =''; return '' + this.series.name + ': '+ unit + '
' + 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 = '
(Achtung Zeitwert hat einen Offset)'; else offsetInfo =''; if (this.series.type == 'pie') { return '' + this.point.name +': '+ unit +'
= ' + this.percentage.toFixed(1) + ' %'; } else { return '' + this.series.name + ': '+ unit + '
' + 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("\\t","",$str); $str = str_replace("\\n","",$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"); } } ?>