Q&A Highcharts V2.0

Wolfgang,
prima, dann hat das Leiden ja ein Ende :smiley:
und ja: es wäre super, wenn du dein Beispiel hier einstellst, weil einige Sachen drinstecken, die im Forum bisher nicht diskutiert wurden. Spart sicher dem Ein oder Anderen ein paar graue Haare.

Hallo RS,
habs dann zum Schluss auch durch Kompromisse abgekürzt. Das selbe Spiel mit den Farben hätt ich auch noch gerne in Legends gehabt … Jetzt hab ich sie einfach ausgeblendet, da die Legends und ihre Funktionalität für den Chart nicht relevant sind.
Wohin soll ich den Code denn posten? Hier oder ins Wiki?

ich denke, hier passt es ganz gut rein: http://www.ip-symcon.de/forum/f53/highcharts-multigraph-17625/

Ich hätte da gerne auch noch mal ein Problem :smiley:

Nachdem Raketenschnecke mir geholfen hat, das Pie Chart richtig zu konfigurieren, habe ich das seit Wochen bei mir drin und gestern schwant mir komisches.

Ich hatte versucht mit Start Enddate den Zeitraum einzugrenzen, der das Pie Chart füllt:


$CfgDaten['StartTime'] = mktime(0,0,0, date("m", time()), date("d",time())-2, 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

Hier also 2 Tage.

Die Variablen, die ich im Pie Chart haben will sind dann so in der Serie dargestellt:


$serie['data'][] = array('name'=>'Wasserbett', 'color'=>'#A60000', 'Id' => 43994 , 'Unit'=>"kWh");
$serie['data'][] = array('name'=>'Boiler', 'color'=>'#FF7400', 'Id' => 36687, 'Unit'=>"kWh");
$serie['data'][] = array('name'=>'Deckenfluter', 'color'=>'#1D7373', 'Id' => 55741, 'Unit'=>"kWh");
$serie['data'][] = array('name'=>'Fernseher', 'color'=>'#33CCCC', 'Id' => 20717, 'Unit'=>"kWh");
$serie['data'][] = array('name'=>'Gefriertruhe', 'color'=>'#FF9640', 'Id' => 38822, 'Unit'=>"kWh");
$serie['data'][] = array('name'=>'Microwelle & Kaffeemaschine', 'color'=>'#FF4040', 'Id' => 15808, 'Unit'=>"kWh");
$serie['data'][] = array('name'=>'PC Kreis', 'color'=>'', 'Id' => 17602, 'Unit'=>"kWh");
$serie['data'][] = array('name'=>'QNAP', 'color'=>'', 'Id' => 18201, 'Unit'=>"kWh");
$serie['data'][] = array('name'=>'Seven24 Kreis', 'color'=>'', 'Id' => 48774, 'Unit'=>"kWh");
$serie['data'][] = array('name'=>'Spülmaschine', 'color'=>'', 'Id' => 10060, 'Unit'=>"kWh");
$serie['data'][] = array('name'=>'Trockner', 'color'=>'', 'Id' => 41159, 'Unit'=>"kWh");
$serie['data'][] = array('name'=>'Waschmaschine', 'color'=>'', 'Id' => 20831, 'Unit'=>"kWh");
$serie['data'][] = array('name'=>'DEH Dusche', 'color'=>'', 'Id' => 19810, 'Unit'=>"kWh");
$serie['data'][] = array('name'=>'DEH Bad', 'color'=>'', 'Id' => 43432, 'Unit'=>"kWh");

Die Werte selbst sind Zählervariablen.

Was das Pie Chart nun macht ist, die Gesamtsumme der Zähler darstellen und nicht den eingeschränkten Bereich.
Aufgefallen ist mir das, weil ich seit 2 Tagen einen Megaverbraucher (Durchlauferhitzer) drin habe, der kaum ins Gewicht fällt (schön wärs).

Anscheinend muss ich die Ursprungsmenge begrenzen, wie aber mache ich das?

Mic

die Werte für ein pie-Chart werden immer actual gezogen. Der Zeitraum hat darauf keinen Einfluss. Das Pie-Chart zeigt die Werte, die zum Zeitpunkt des Scriptlaufes in der var standen.
Wenn ich dann noch verstanden habe, was du erreichen willst, könnte ich damit meine Grübel-Instanz füttern :smiley: Im Moment hab ich wenig Hoffnung

Mein Ziel ist es einen Pie Chart zu generieren, um die größten Stromfresser eines Zeitraums zu ermitteln.
Gestern, die Letzte Woche, etc.

Vor allem, weil ich erst später die Durchlauferhitzer mit den EKM angeschlossen habe und damit die Aussagekraft meines aktuellen Pie Charts gegen Null geht.

soweit hab ich das verstanden, aber welche daten willst du im Pie darstellen? Den bewussten Zeitraum? Einen Zeitpunkt? Wenn ja, welchen Zeitpunkt?
Das solltest Du schon definieren. Dann schauen wir, wie man das lösen kann

ich glaube, jerzt verstehe ich dich nicht. :o
ich will einen zeitraum.

bsp.
in der zaehlervar steht

1.1.12. 5
1.2.12. 6
1.3.12. 7
1.4.12. 8

dann will ich nur Feb und Mar und haette dann 2 als Wert.

natuerlich habe ich pro monat nicht nur einen Wert, das soll nur exemplarisch aein.

ok, Du willst also den Verbrauch innerhalb eines Zeitraums als Pie dargestellt haben.
Eine ergänzende Frage noch: welche Intervalle sollen ausgewertet werden: Tage, Stunden, Monate, jahre?

ok, mal ein Schuß ins Blaue:

  1. Schritt: Daten aus der IPS-DB auslesen und für Pie verdichten (Auswertungszeitraum: n abgeschlossene Kalendermonate, „21446“ ist die ID der Verbrauchsdaten-Variable [Zähler], ‚$CfgDaten[„ArchiveHandlerId“]‘ enthält die Archive-Handler ID, muss zuvor definiert werden)
// Daten aus IPS-DB auslesen
	$RawData   = AC_GetAggregatedValues($CfgDaten["ArchiveHandlerId"], 21446, 3, $CfgDaten["StartTime"], $CfgDaten["EndTime"], 50);
	//print_r($RawData);

// Daten verdichten
	$pie02      = 0;
	for($i=0;$i<count($RawData);$i++)
	{
		$pie02   += $RawData[$i]['Avg'];
	}
	unset($RawData);
  1. Schritt: Übergabe der verdichteten Daten an das Series-Array:
// IPS-Objekte Pie
	$serie = array();
	$serie['name'] = 'Pie';
	$serie['type'] = 'pie';
	$serie['data'][] = array('name'=>'OG', 'y' => $pie01, 'unit'=>"kWh");
	$serie['data'][] = array('name'=>'MG', 'y' => $pie02, 'Unit'=>"kWh");
	$serie['data'][] = array('name'=>'UG', 'y' => $pie03, 'Unit'=>"kWh");
	$serie['allowPointSelect'] = true;
	$serie['cursor'] = 'pointer';
	$serie['center'] = array(300,100);
	$serie['size'] = 100;
	$serie['dataLabels']['enabled'] = true;
	$CfgDaten['series'][] = $serie;

Ich versuche deiner Grübelinstanz zu folgen …:rolleyes:

Ergänze also folgende Zeilen:


$CfgDaten["ArchiveHandlerId"]=16474  /*[Archive Handler]*/;
$CfgDaten['StartTime'] = mktime(0,0,0, date("m", time()), date("d",time())-2, date("Y",time())); 
$CfgDaten['EndTime'] = mktime(23,59,59, date("m", time()), date("d",time()), date("Y",time())); 

Wenn ich dann aber RawData ausgeben lasse ist dort ein leeres Array.

Ansatz klingt aber vielversprechend.
Kann man mit AC_GetLoggedValues arbeiten?
Da bekomme ich den vergangen Krams ins array.

„21446“ ist die ID der Verbrauchsdaten-Variable [Zähler],
die auch angepasst?

zeig mal den gesamten relevanten Code

Kann man mit AC_GetLoggedValues arbeiten?
wenn es irgend geht: bitte nicht. Kann ziemlich auf die Performance gehen und ist für größere Abfragezeiträume ungeeignet (und sowieso auf 10.000 Datensätze limitiert)

Der Gesamte Code sieht dann so aus:


$CfgDaten["ZaehlerID"]=59498  /*[Homecontrol\Keller\EKM-868 (EM1010)\Counter]*/;

$CfgDaten["ArchiveHandlerId"]=16474  /*[Archive Handler]*/;
$CfgDaten['StartTime'] = mktime(0,0,0, date("m", time()), date("d",time()), date("Y",time())); // ab heute 00:00 Uhr
$CfgDaten['EndTime'] = mktime(01,00,00, date("m", time()), date("d",time()), date("Y",time())); // ab heute 23:59 Uhr, oder //$CfgDaten['EndTime'] = time();   // = bis jetzt

// Daten aus IPS-DB auslesen
    $RawData   = AC_GetAggregatedValues($CfgDaten["ArchiveHandlerId"], $CfgDaten["ZaehlerID"] , 3, $CfgDaten["StartTime"], $CfgDaten["EndTime"], 50);
    //$RawData     = AC_GetLoggedValues($CfgDaten["ArchiveHandlerId"], $CfgDaten["ZaehlerID"], $CfgDaten["StartTime"], $CfgDaten["EndTime"], 2);

  print_r($RawData);

Bei dem auskommentierten GetLoggedValues habe ich das Array voll, beim anderen leer.
Was macht der Parameter, der 3 ist?

Edit:
Ha, ich weiß warum.
3 ist der Aggregationstyp.
3 ist zu groß gewählt, soviele daten hab ich noch nicht, mit 1 kommt was.

Danke, das bringt mich erstmal auf die richtige Spur.
Muss jetzt nochmal meine Hinrwindungen quälen.

3 ist der Aggregationstyp.
3 ist zu groß gewählt, soviele daten hab ich noch nicht, mit 1 kommt was.

nicht ganz: 3 entspricht der Monatsverdichtung, d.h. es wird pro Kalendermonat 1 Datensatz ausgegeben. Sobald im jeweiligen Monat ein wert in der DB ist, erfolgt auch bei AggType3 eine Ausgabe.

Und wenn ich das:

$CfgDaten['StartTime'] = mktime(0,0,0, date("m", time()), date("d",time()), date("Y",time())); // ab heute 00:00 Uhr
$CfgDaten['EndTime'] = mktime(01,00,00, date("m", time()), date("d",time()), date("Y",time())); // ab heute 23:59 Uhr, oder //$CfgDaten['EndTime'] = time();   // = bis jetzt


mit dem hier:

Auswertungszeitraum: n abgeschlossene Kalendermonate,

vergleiche, dann wird es wohl noch eine Weile dauern:rolleyes:

Sobald im jeweiligen Monat ein wert in der DB ist, erfolgt auch bei AggType3 eine Ausgabe.

Das scheint aber nicht zu stimmen, denn ich bekomme nur Werte bei 1, also Tag.
Das Ding habe ich diese Woche Sonntag eingebunden, also keine ganze Woche.

Anscheinend werden nur vollständige Bereiche ausgegeben.

sehe ich auch so. Vielleicht hast du ein anderes IPS.
RS.net Screenshot 002 2012-09-14.png

diesen Screenshot habe ich eben gemacht, nachdem ich den Zeitraum auf 2 Tage eingegrenzt habe. Code identisch zu dem, den ich weiter oben gepostet habe.
Dann fehlt mir hierzu: http://www.ip-symcon.de/forum/f52/q-highcharts-v2-0-a-18312/index29.html#post173866
noch Feedback, so dass ich im Moment überhaupt nicht weiß, wo du eigentlich hin willst.

Geht doch alles schon in die richtige Richtung.

Habe auch schon ein Pie erzeugen können.
Das einzige was noch problematisch ist, ist der Auswertungszeitraum.

Mein kompletter Code sieht jetzt so aus:


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


$CfgDaten["ZaehlerID"]=59498 /*[Homecontrol\Keller\EKM-868 (EM1010)\Counter]*/ ;

$CfgDaten["ArchiveHandlerId"]=16474 /*[Archive Handler]*/ ;
$CfgDaten['StartTime'] = mktime(0,0,0, date("m", time()), date("d",time()), date("Y",time())); // ab heute 00:00 Uhr
$CfgDaten['EndTime'] = time();


	$serieData[0] = 43994; $serieName[0]='Wasserbett';
	$serieData[1] = 36687; $serieName[1]='Boiler';
	$serieData[2] = 55741; $serieName[2]='Deckenfluter';
	$serieData[3] = 20717; $serieName[3]='Fernseher';
	$serieData[4] = 38822; $serieName[4]='Gefriertruhe';
	$serieData[5] = 15808; $serieName[5]='Microwelle & Kaffeemaschine';
	$serieData[6] = 17602; $serieName[6]='PC Kreis';
	$serieData[7] = 18201; $serieName[7]='QNAP';
	$serieData[8] = 48774; $serieName[8]='Seven24 Kreis';
	$serieData[9] = 10060; $serieName[9]='Spülmaschine';
	$serieData[10] = 41159; $serieName[10]='Trockner';
	$serieData[11] = 20831; $serieName[11]='Waschmaschine';
	$serieData[12] = 19810; $serieName[12]='DEH Dusche';
	$serieData[13] = 43432; $serieName[13]='DEH Bad';

    for($i=0;$i<count($serieData);$i++)
    {
         $RawData   = AC_GetAggregatedValues($CfgDaten["ArchiveHandlerId"], $serieData[$i] , 2, $CfgDaten["StartTime"], $CfgDaten["EndTime"], 50);
		   $pie[$i]   = 0;
		   for($j=0;$j<count($RawData);$j++)
    		{
        			$pie[$i]   += $RawData[$j]['Avg'];
    		}
		   unset($RawData);

	 }



	$CfgDaten['ContentVarableId']= 58898 /*[Global\Highchart\Charts\Energie\Stromfresser]*/ ;							// 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']= 46691 /*[Global\Highchart\Scripts\Highcharts_V2.02]*/ ;  									// ID des Highcharts Scripts
	$CfgDaten['Ips']['ChartType'] = 'Highcharts';
	$CfgDaten['StartTime'] = mktime(0,0,0, date("m", time()), date("d",time())-2, 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['RunMode'] = "script"; 	// file, script, popup

	if ($CfgDaten['RunMode'] == "popup")
	{
		$CfgDaten['WebFrontConfigId'] = 49302 /*[WebFront Configurator]*/;
		$CfgDaten['WFCPopupTitle'] = "Ich bin der Text, welcher als Überschrift im Popup gezeigt wird";
	}

	$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['title']['text'] = "Stromfresser";

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

	$CfgDaten['yAxis'][0]['title']['text'] = "Verbrauch";
	$CfgDaten['yAxis'][0]['Unit'] = "kWh";
	$CfgDaten['yAxis'][0]['opposite'] = true;


	$serie = array();
	$serie['Unit'] = "kWh";
	$serie['ReplaceValues'] = false;
	$serie['RoundValue'] = 1;
	$serie['type'] = "pie";
//	$serie['inverted'] = true;
	$serie['xAxis'] = 0;
	$serie['AggType'] = 1;
	$serie['marker']['enabled'] = false;
	$serie['shadow'] = true;
	$serie['lineWidth'] = 0;
   for($i=0;$i<count($serieData);$i++)
   {
			$serie['data'][] = array('name'=>$serieName[$i], 'y' => $pie[$i] , 'Unit'=>"kWh");
	}
	$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;


	// Highcharts-Theme
	//$CfgDaten['HighChart']['Theme']="gray.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
		}
	}





  
?>

Ich bekomme nun Daten, wenn ich
$RawData = AC_GetAggregatedValues($CfgDaten[„ArchiveHandlerId“], $serieData[$i] , 1, $CfgDaten[„StartTime“], $CfgDaten[„EndTime“], 50);
einstelle.
Jedoch keine bei:
$RawData = AC_GetAggregatedValues($CfgDaten[„ArchiveHandlerId“], $serieData[$i] , 2, $CfgDaten[„StartTime“], $CfgDaten[„EndTime“], 50);

Ich will die letzte volle Woche haben.

ich schätze, das ist wieder irgend so ein Test.
Ich würde an Deiner Stelle einen Schritt nach dem anderen gehen. Ich hab versucht, Dir einen Weg aufzuzeigen (der auch funktioniert).
Wenn Du meinst, statt dessen einen eigenen Code zu bauen (der sich selbst widerspricht) und der mindestens den nächsten Schritt darstellt, kann ich kaum sinnvoll helfen.
Vielleicht hilft auch, ab hier http://www.ip-symcon.de/forum/f52/q-highcharts-v2-0-a-18312/index29.html#post173866 nochmal gründlich und genauestens zu lesen und Schritt für Schritt zu übernehmen. Für ein funktionierendes Pie ist der Code auf jeden Fall ausreichend.

Hi Raketenschnecke,

ich weiß nicht welche Geister dich verfolgen, aber der zusätzliche Code ist doch in Ordnung.
Das ist dein Code, den ich für alle meine Verbraucher erweitert habe.

Auch wenn ich nur den ersten Teil nehme, ist ab dem Wert 2 das Array leer.
Das ist das einzige Problem was ich gerade habe.

$RawData = AC_GetAggregatedValues($CfgDaten[„ArchiveHandlerId“], $serieData[$i] , 1, $CfgDaten[„StartTime“], $CfgDaten[„EndTime“], 50);2012-09-15 09-38-32_IP-Symcon WebFront - Waterfox.png

$RawData = AC_GetAggregatedValues($CfgDaten[„ArchiveHandlerId“], $serieData[$i] , 2, $CfgDaten[„StartTime“], $CfgDaten[„EndTime“], 50);

Ich bin dir echt für deine Hilfe dankbar, ohne dich wäre ich nicht so weit.
Allerdings verstehe ich manchmal nicht, was dich treibt.

Mic