diff --git a/app/Http/Controllers/APIS/CustomerApi/TelemetryController.php b/app/Http/Controllers/APIS/CustomerApi/TelemetryController.php index c006e84..f79d67a 100644 --- a/app/Http/Controllers/APIS/CustomerApi/TelemetryController.php +++ b/app/Http/Controllers/APIS/CustomerApi/TelemetryController.php @@ -364,6 +364,106 @@ class TelemetryController extends Controller // return response()->json(['telemetry' => $response]); // } + // public function telemetryDataAsset(Request $request) + // { + // $token = readHeaderToken(); + // $customerId = User::where('id', $token['sub'])->value('customer_id'); + + // $validator = Validator::make($request->all(), [ + // 'asset_id' => 'required|string', + // 'startTs' => 'nullable|string', + // 'endTs' => 'nullable|string', + // ]); + + // if ($validator->fails()) { + // return jsonResponseWithErrorMessage($validator->errors()->first(), 400); + // } + + // $assetId = $request->input('asset_id'); + // $startTs = $request->input('startTs') ?: now()->subHours(24)->timestamp * 1000; + // $endTs = $request->input('endTs') ?: now()->timestamp * 1000; + + // $devices = Device::with([ + // 'deviceProfile', + // 'timeseriesKeys' => function ($query) { + // $query->where('display_on_dashboard', true) + // ->orWhere('display_on_popup', true) + // ->select(['id', 'device_profile_xid', 'key_name', 'display_name', 'display_on_dashboard', 'display_on_popup']); + // } + // ])->where('asset_id', $assetId) + // ->where('customer_id', $customerId) + // ->get(); + + // if ($devices->isEmpty()) { + // return response()->json(['error' => 'No devices found for the asset'], 404); + // } + + // $response = $devices->map(function ($device) use ($startTs, $endTs) { + // $keysData = $device->timeseriesKeys; + + // $keyNames = $keysData->pluck('key_name')->toArray(); + // $telemetryResponse = $this->customerInfoService->getTelemetryData($device, $keyNames, $startTs, $endTs); + + // $alarmMap = $this->getDeviceAlarmsForTelemetry($device->id); + + // $alertMessages = TimeseriesAlertMessage::whereIn('timeseries_key_master_xid', $keysData->pluck('id')) + // ->orderBy('min_value', 'asc') + // ->get() + // ->groupBy('timeseries_key_master_xid'); + // $telemetry = $keysData->map(function ($keyData) use ($telemetryResponse, $alarmMap, $alertMessages) { + // return collect($telemetryResponse[$keyData->key_name] ?? [])->map(function ($item) use ($keyData, $alarmMap, $alertMessages) { + // $keyName = $keyData->key_name; + // $alert = isset($alarmMap[$keyName]); + // $value = floatval($item['value'] ?? 0); + // $colorCode = null; + + // // Default to grey if value is 0 + // if ($value == 0) { + // $colorCode = "grey"; + // } else { + // // Check alert messages for this key + // if (isset($alertMessages[$keyData->id])) { + // foreach ($alertMessages[$keyData->id] as $alertMsg) { + // // If min_value or max_value is null, return null + // if (is_null($alertMsg->min_value) || is_null($alertMsg->max_value)) { + // $colorCode = 'green'; + // break; + // } + + // if ($value >= floatval($alertMsg->min_value) && $value <= floatval($alertMsg->max_value)) { + // $colorCode = $alertMsg->color_code; + // break; + // } + // } + // } + // } + + // return [ + // 'key_name' => $keyName, + // 'display_name' => $keyData->display_name, + // 'display_on_dashboard' => $keyData->display_on_dashboard, + // 'display_on_popup' => $keyData->display_on_popup, + // 'timestamp' => $item['ts'] ?? null, + // 'value' => $value, + // 'alert' => $alert, + // 'color_code' => $colorCode, // Now handles null & grey cases + // ]; + // }); + // })->flatten(1); + + // return [ + // 'device_id' => (string) $device->id, + // 'device_profile_name' => (string) $device->deviceProfile->name, + // 'asset_id' => (string) $device->asset_id, + // 'device_profile_id' => (string) $device->device_profile_id, + // 'telemetry' => array_values($telemetry->toArray()), + // ]; + // }); + + // return response()->json(['telemetry' => $response]); + // } + + public function telemetryDataAsset(Request $request) { $token = readHeaderToken(); @@ -371,8 +471,6 @@ class TelemetryController extends Controller $validator = Validator::make($request->all(), [ 'asset_id' => 'required|string', - 'startTs' => 'nullable|string', - 'endTs' => 'nullable|string', ]); if ($validator->fails()) { @@ -380,8 +478,10 @@ class TelemetryController extends Controller } $assetId = $request->input('asset_id'); - $startTs = $request->input('startTs') ?: now()->subHours(24)->timestamp * 1000; - $endTs = $request->input('endTs') ?: now()->timestamp * 1000; + + // Set timestamps in milliseconds for database query + $endTsMs = now()->timestamp * 1000; // Current time in milliseconds + $startTsMs = $endTsMs - (30 * 60 * 1000); // 5 minutes ago in milliseconds $devices = Device::with([ 'deviceProfile', @@ -391,81 +491,106 @@ class TelemetryController extends Controller ->select(['id', 'device_profile_xid', 'key_name', 'display_name', 'display_on_dashboard', 'display_on_popup']); } ])->where('asset_id', $assetId) - ->where('customer_id', $customerId) - ->get(); + ->where('customer_id', $customerId) + ->get(); if ($devices->isEmpty()) { return response()->json(['error' => 'No devices found for the asset'], 404); } - $response = $devices->map(function ($device) use ($startTs, $endTs) { + $response = $devices->map(function ($device) use ($startTsMs, $endTsMs) { $keysData = $device->timeseriesKeys; - $keyNames = $keysData->pluck('key_name')->toArray(); - $telemetryResponse = $this->customerInfoService->getTelemetryData($device, $keyNames, $startTs, $endTs); + + // Get telemetry data for start and end times + $startTelemetry = $this->customerInfoService->getTelemetryData($device, $keyNames, $startTsMs, $startTsMs); + $endTelemetry = $this->customerInfoService->getTelemetryData($device, $keyNames, $endTsMs, $endTsMs); $alarmMap = $this->getDeviceAlarmsForTelemetry($device->id); - $alertMessages = TimeseriesAlertMessage::whereIn('timeseries_key_master_xid', $keysData->pluck('id')) ->orderBy('min_value', 'asc') ->get() ->groupBy('timeseries_key_master_xid'); - $telemetry = $keysData->map(function ($keyData) use ($telemetryResponse, $alarmMap, $alertMessages) { - return collect($telemetryResponse[$keyData->key_name] ?? [])->map(function ($item) use ($keyData, $alarmMap, $alertMessages) { - $keyName = $keyData->key_name; - $alert = isset($alarmMap[$keyName]); - $value = floatval($item['value'] ?? 0); - $colorCode = null; - // Default to grey if value is 0 - if ($value == 0) { - $colorCode = "grey"; + $telemetry = $keysData->map(function ($keyData) use ($startTelemetry, $endTelemetry, $alarmMap, $alertMessages) { + $startData = collect($startTelemetry[$keyData->key_name] ?? [])->last(); + $endData = collect($endTelemetry[$keyData->key_name] ?? [])->last(); + + $startValue = floatval($startData['value'] ?? 0); + $endValue = floatval($endData['value'] ?? 0); + + // Determine trend based on start vs end values + $trend = null; + if ($startValue > 0) { + if ($endValue > $startValue) { + $trend = 'upward'; + } elseif ($endValue < $startValue) { + $trend = 'downward'; } else { - // Check alert messages for this key - if (isset($alertMessages[$keyData->id])) { - foreach ($alertMessages[$keyData->id] as $alertMsg) { - // If min_value or max_value is null, return null - if (is_null($alertMsg->min_value) || is_null($alertMsg->max_value)) { - $colorCode = 'green'; - break; - } + $trend = 'stable'; + } + } - if ($value >= floatval($alertMsg->min_value) && $value <= floatval($alertMsg->max_value)) { - $colorCode = $alertMsg->color_code; - break; - } + // Format timestamp properly (convert to seconds if in milliseconds) + if (!isset($currentData['ts'])) { + $timestamp = now()->timestamp; + } elseif (is_float($currentData['ts']) || $currentData['ts'] > 9999999999) { + $timestamp = intval($currentData['ts'] / 1000); + } else { + $timestamp = $currentData['ts']; + } + + // Color code logic + $colorCode = null; + if ($endValue == 0) { + $colorCode = "grey"; + } else { + if (isset($alertMessages[$keyData->id])) { + foreach ($alertMessages[$keyData->id] as $alertMsg) { + if (is_null($alertMsg->min_value) || is_null($alertMsg->max_value)) { + $colorCode = 'green'; + break; + } + if ($endValue >= floatval($alertMsg->min_value) && $endValue <= floatval($alertMsg->max_value)) { + $colorCode = $alertMsg->color_code; + break; } } } + } - return [ - 'key_name' => $keyName, - 'display_name' => $keyData->display_name, - 'display_on_dashboard' => $keyData->display_on_dashboard, - 'display_on_popup' => $keyData->display_on_popup, - 'timestamp' => $item['ts'] ?? null, - 'value' => $value, - 'alert' => $alert, - 'color_code' => $colorCode, // Now handles null & grey cases - ]; - }); - })->flatten(1); + return [ + 'key_name' => $keyData->key_name, + 'display_name' => $keyData->display_name, + 'display_on_dashboard' => $keyData->display_on_dashboard, + 'display_on_popup' => $keyData->display_on_popup, + 'timestamp' => $timestamp, + 'value' => $endValue, + 'start_value' => $startValue > 0 ? $startValue : null, + 'trend' => $trend, + 'alert' => isset($alarmMap[$keyData->key_name]), + 'color_code' => $colorCode, + ]; + })->filter()->values(); return [ 'device_id' => (string) $device->id, 'device_profile_name' => (string) $device->deviceProfile->name, 'asset_id' => (string) $device->asset_id, 'device_profile_id' => (string) $device->device_profile_id, - 'telemetry' => array_values($telemetry->toArray()), + 'telemetry' => $telemetry, ]; }); - return response()->json(['telemetry' => $response]); + return response()->json([ + 'telemetry' => $response, + 'time_range' => [ + 'startTs' => intval($startTsMs / 1000), // Current period start (seconds) + 'endTs' => intval($endTsMs / 1000), // Current period end (seconds) + ] + ]); } - - - private function getDeviceAlarmsForTelemetry($deviceId) { Log::info("Fetching alarms for device: {$deviceId}");