[Format der Beschriftung, Quelle] $ranges = [ "month" => ["'%d.%b.'", "roh"], "year" => ["'%b. %y'", "archiv"], "decade" => ["'%Y'", "archiv"], ]; // Filter auf die Zeitspalte. ZEIT wird durch den Spaltennamen der Quelle ersetzt. $filters = [ "month" => "DATE_FORMAT(ZEIT,'%Y%m%d') >= DATE_FORMAT(DATE_SUB(now(),INTERVAL 1 MONTH),'%Y%m%d')", "year" => "DATE_FORMAT(ZEIT,'%Y%m') >= DATE_FORMAT(DATE_SUB(now(),INTERVAL 13 MONTH),'%Y%m')", "decade" => "DATE_FORMAT(ZEIT,'%Y') >= DATE_FORMAT(DATE_SUB(now(),INTERVAL 10 YEAR),'%Y')", ]; // Datenreihen je Diagramm. Beide teilen sich Solarertrag und Heizstab und // unterscheiden sich nur darin, wohin die Energie fließt (prod) bzw. woher // sie kommt (cons). $quellen = [ "roh" => [ "tabelle" => "EnergyFlow", "zeit" => "datetime", "join" => "LEFT JOIN (SELECT DATE(stunde) AS tag, SUM(pv_fehlbetrag_kwh) AS fehlt FROM EnergyFlow_hourly GROUP BY 1) f ON f.tag = DATE(datetime)", "reihen" => [ "prod" => "SUM(pvP/12 - gridPfeed/12 - IF(battP < 0, -battP/12,0) - heaterPwr/12) + IFNULL(MAX(f.fehlt),0)*1000 AS Direktverbrauch, SUM(heaterPwr/12) AS Heizstab, SUM(IF(battP < 0, -battP/12,0)) AS Batterieladung, SUM(gridPfeed/12) AS Einspeisung", "cons" => "SUM(pvP/12 - gridPfeed/12 - IF(battP < 0, -battP/12,0) - heaterPwr/12) + IFNULL(MAX(f.fehlt),0)*1000 AS Solarverbrauch, SUM(heaterPwr/12) AS Heizstab, SUM(IF(battP > 0, battP/12,0)) AS Batteriebezug, SUM(gridPcons/12) AS Netzbezug", ], ], "archiv" => [ "tabelle" => "EnergyFlow_hourly", "zeit" => "stunde", "join" => "", "reihen" => [ "prod" => "SUM((pv_kwh + IFNULL(pv_fehlbetrag_kwh,0) - netz_einsp_kwh - batt_laden_kwh - heizstab_kwh)*1000) AS Direktverbrauch, SUM(heizstab_kwh*1000) AS Heizstab, SUM(batt_laden_kwh*1000) AS Batterieladung, SUM(netz_einsp_kwh*1000) AS Einspeisung", "cons" => "SUM((pv_kwh + IFNULL(pv_fehlbetrag_kwh,0) - netz_einsp_kwh - batt_laden_kwh - heizstab_kwh)*1000) AS Solarverbrauch, SUM(heizstab_kwh*1000) AS Heizstab, SUM(batt_entladen_kwh*1000) AS Batteriebezug, SUM(netz_bezug_kwh*1000) AS Netzbezug", ], ], ]; $linecolors["Direktverbrauch"] = "#FFFF00"; $linecolors["Solarverbrauch"] = "#FFFF00"; $linecolors["UG"] = "#FFaa00"; $linecolors["OG"] = "#FF4400"; $linecolors["Auto UG"] = "#00aaFF"; $linecolors["Auto OG"] = "#0044FF"; $linecolors["Heizstab"] = "#FF6600"; $linecolors["Batterieladung"] = "#00aa00"; $linecolors["Batteriebezug"] = "#00aa00"; $linecolors["Einspeisung"] = "#FF0000"; $linecolors["Netzbezug"] = "#FF0000"; $linecolors["Ladestand"] = "#00aa00"; $linecolors["Vorhersage"] = "#2222FF"; header('Content-Type: application/json; charset=utf-8'); $rangeKey = isset($_GET["range"]) ? $_GET["range"] : ""; $seriesKey = isset($_GET["series"]) ? $_GET["series"] : ""; if (!isset($ranges[$rangeKey]) || !in_array($seriesKey, ["prod", "cons"], true)) { http_response_code(400); echo json_encode(["error" => "Unbekannter Zeitraum oder Datenreihe."]); exit; } list($labelFormat, $quelleKey) = $ranges[$rangeKey]; $quelle = $quellen[$quelleKey]; $zeit = $quelle["zeit"]; $filter = str_replace("ZEIT", $zeit, $filters[$rangeKey]); $obj = (object)[]; $obj->labels = []; $obj->datasets = []; if (checkLogin()) { $mysql = new mysqli($mysql_server, $mysql_solarUser, $mysql_solarPass, $mysql_solarDB); $query = "SELECT DATE_FORMAT($zeit, $labelFormat) AS 'time', " . $quelle["reihen"][$seriesKey] . " FROM " . $quelle["tabelle"] . " " . $quelle["join"] . " WHERE $filter GROUP BY DATE_FORMAT($zeit, $labelFormat) ORDER BY MIN($zeit) ; "; $obj = buildChartData($mysql, $query, $linecolors); } echo json_encode($obj);