label = $name; $dataset->data = []; $dataset->borderColor = $color; $dataset->backgroundColor = $color . "55"; $dataset->borderWidth = 1; $dataset->pointRadius = 0; $dataset->pointHoverRadius = 5; $dataset->tension = 0.2; if ($name == "Solarleistung") { $dataset->stack = "SolarPwr"; $dataset->fill = "none"; $dataset->yAxisID = 'y'; } else if ($name == "Ladestand") { $dataset->stack = "Charge"; $dataset->fill = "none"; $dataset->yAxisID = 'y1'; } else { $dataset->stack = "Consumers"; if (!$filled) { $filled = true; $dataset->fill = "origin"; } else { $dataset->fill = "-1"; } $dataset->yAxisID = 'y'; } return $dataset; } /** * Führt $query aus und baut daraus das Chart.js-Objekt. * $labelFactor multipliziert die Zeitspalte (1 für Textbeschriftungen, * 1000 für Unix-Zeitstempel, die Chart.js in Millisekunden erwartet). */ function buildChartData($mysql, $query, $linecolors, $labelFactor = 1) { $obj = (object)[]; $obj->labels = []; $obj->datasets = []; $result = mysqli_query($mysql, $query); if (!$result) { // Nicht ins Ergebnis schreiben - der Aufrufer liefert JSON aus. error_log("chartData: " . mysqli_error($mysql)); return $obj; } if ($result->num_rows < 2) { return $obj; } $column = []; // Spaltenname -> Position in $obj->datasets $filled = false; foreach ($result->fetch_fields() as $field) { if ($field->name == "time") { continue; } $column[$field->name] = count($obj->datasets); $obj->datasets[] = chartDataset($field->name, $linecolors, $filled); } while ($row = $result->fetch_assoc()) { foreach ($row as $name => $value) { if ($name == "time") { $obj->labels[] = $labelFactor == 1 ? $value : $value * $labelFactor; } else { $obj->datasets[$column[$name]]->data[] = $value; } } } return $obj; }