diff --git a/app/Filament/Widgets/TrendLineChart.php b/app/Filament/Widgets/TrendLineChart.php new file mode 100644 index 0000000..fdc772b --- /dev/null +++ b/app/Filament/Widgets/TrendLineChart.php @@ -0,0 +1,206 @@ + [], + 'datasets' => [], + ]; + } + + $fromDateTime = Carbon::parse($fromDatetime); + $toDateTime = Carbon::parse($toDatetime); + + if ($fromDateTime->gt($toDateTime) || $fromDateTime->gt(now()) || $toDateTime->gt(now())) { + return [ + 'labels' => [], + 'datasets' => [], + ]; + } + + $durationHours = $fromDateTime->diffInHours($toDateTime); + if ($durationHours < 1 || $durationHours > 24) { + return [ + 'labels' => [], + 'datasets' => [], + ]; + } + + $intervalCount = $durationHours > 12 ? 12 : 10; + $intervalMinutes = $durationHours > 12 ? 120 : floor(($durationHours * 60) / $intervalCount); + + $labels = []; + $columnMap = []; + $datasetColors = []; + $dataSeries = []; + + // Determine columns and labels based on selected parameter + switch ($parameter) { + case 'Phase Voltage': + $columnMap = [ + 'voltage_ry' => 'Voltage RY Max', + 'voltage_yb' => 'Voltage YB Max', + 'voltage_br' => 'Voltage BR Max', + 'frequency' => 'Frequency Max', + ]; + $datasetColors = [ + 'voltage_ry' => 'rgba(255, 99, 132, 1)', // red + 'voltage_yb' => 'rgba(54, 162, 235, 1)', // blue + 'voltage_br' => 'rgba(255, 206, 86, 1)', // yellow + 'frequency' => 'rgba(75, 192, 192, 1)', // teal + ]; + break; + + case 'Line Voltage': + $columnMap = [ + 'voltage_r_n' => 'Voltage R-N Max', + 'voltage_y_n' => 'Voltage Y-N Max', + 'voltage_b_n' => 'Voltage B-N Max', + 'frequency' => 'Frequency Max', + ]; + $datasetColors = [ + 'voltage_r_n' => 'rgba(153, 102, 255, 1)', // purple + 'voltage_y_n' => 'rgba(255, 159, 64, 1)', // orange + 'voltage_b_n' => 'rgba(0, 200, 83, 1)', // green + 'frequency' => 'rgba(75, 192, 192, 1)', // teal + ]; + break; + case 'Current': + $columnMap = [ + 'current_r' => 'Current R Max', + 'current_y' => 'Current Y Max', + 'current_b' => 'Current B Max', + 'current_n' => 'Current N Max ', + ]; + $datasetColors = [ + 'current_r' => 'rgba(153, 102, 255, 1)', // purple + 'current_y' => 'rgba(255, 159, 64, 1)', // orange + 'current_b' => 'rgba(0, 200, 83, 1)', // green + 'current_n' => 'rgba(75, 192, 192, 1)', // teal + ]; + break; + + case 'Active Power': + $columnMap = [ + 'active_power_r' => 'Active Pow R Max', + 'active_power_y' => 'Active Pow Y Max', + 'active_power_b' => 'Active Pow B Max', + 'active_power_total' => 'Active Pow Tot Max ', + ]; + $datasetColors = [ + 'active_power_r' => 'rgba(153, 102, 255, 1)', // purple + 'active_power_y' => 'rgba(255, 159, 64, 1)', // orange + 'active_power_b' => 'rgba(0, 200, 83, 1)', // green + 'active_power_total' => 'rgba(75, 192, 192, 1)', // teal + ]; + break; + + case 'Power Factor': + $columnMap = [ + 'power_factor_r' => 'Power Fac R Max', + 'power_factor_y' => 'Power Fac Y Max', + 'power_factor_b' => 'Power Fac B Max', + 'power_factor_total' => 'Power Fac Tot Max ', + ]; + $datasetColors = [ + 'power_factor_r' => 'rgba(153, 102, 255, 1)', // purple + 'power_factor_y' => 'rgba(255, 159, 64, 1)', // orange + 'power_factor_b' => 'rgba(0, 200, 83, 1)', // green + 'power_factor_total' => 'rgba(75, 192, 192, 1)', // teal + ]; + break; + + case 'Units': + $columnMap = [ + 'apparent_energy_received' => 'AppEneRec Max', + 'reactive_energy_received' => 'ReacEneRec Max', + 'active_energy_received' => 'ActiveEneRec Max', + ]; + $datasetColors = [ + 'apparent_energy_received' => 'rgba(153, 102, 255, 1)', // purple + 'reactive_energy_received' => 'rgba(255, 159, 64, 1)', // orange + 'active_energy_received' => 'rgba(0, 200, 83, 1)', // green + ]; + break; + + default: + return [ + 'labels' => [], + 'datasets' => [], + ]; + } + + // Initialize empty arrays for each data series + foreach ($columnMap as $column => $label) { + $dataSeries[$column] = []; + } + + $current = $fromDateTime->copy(); + while ($current < $toDateTime) { + $next = $current->copy()->addMinutes($intervalMinutes); + + $selectParts = []; + foreach ($columnMap as $column => $label) { + $selectParts[] = "MAX({$column}::double precision) as {$column}"; + } + + $readings = MfmReading::where('mfm_meter_id', $meterId) + ->whereBetween('created_at', [$current, $next]) + ->selectRaw(implode(', ', $selectParts)) + ->first(); + + $labels[] = $current->format('H:i'); + + foreach ($columnMap as $column => $label) { + $dataSeries[$column][] = round($readings->{$column} ?? 0, 2); + } + + $current = $next; + } + + // Construct dataset array + $datasets = []; + foreach ($columnMap as $column => $label) { + $datasets[] = [ + 'label' => $label, + 'data' => $dataSeries[$column], + 'borderColor' => $datasetColors[$column], + 'backgroundColor' => str_replace('1)', '0.2)', $datasetColors[$column]), + 'fill' => false, + 'tension' => 0.1, + ]; + } + + return [ + 'labels' => $labels, + 'datasets' => $datasets, + ]; + } + + + protected function getType(): string + { + return 'line'; + } +}