customerInfoService = $customerInfoService; } public function telemetryDataAsset(Request $request) { $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') ?: null; $endTs = $request->input('endTs') ?: null; // Fetch devices associated with the asset $devices = Device::with('deviceProfile') ->where('asset_id', $assetId) ->get(); if ($devices->isEmpty()) { return response()->json(['error' => 'No devices found for the asset'], 404); } $response = []; foreach ($devices as $device) { $telemetry = []; $keysData = TimeseriesKeyMaster::where('device_profile_xid', $device->device_profile_id) ->where(function ($query) { $query->where('display_on_dashboard', true) ->orWhere('display_on_popup', true); }) ->get(['key_name', 'display_name', 'display_on_dashboard', 'display_on_popup']); $keyNames = $keysData->pluck('key_name')->toArray(); // Log key names for debugging // Log::info('Key Names for Device', ['device_id' => $device->id, 'key_names' => $keyNames]); // Fetch telemetry data $telemetryResponse = $this->customerInfoService->getTelemetryData($device, $keyNames, $startTs, $endTs); foreach ($keysData as $keyData) { $keyName = $keyData->key_name; if (isset($telemetryResponse[$keyName])) { foreach ($telemetryResponse[$keyName] as $item) { $telemetry[] = [ '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' => $item['value'] ?? null, ]; } } } $response[] = [ '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' => $telemetry, ]; } return response()->json(['telemetry' => $response]); } // public function telemetryDataDevice(Request $request) // { // try { // $token = readHeaderToken(); // if (!$token) { // return response()->json([ // 'success' => false, // 'error' => 'Authorization token required' // ], 401); // } // $validator = Validator::make($request->all(), [ // 'device_id' => 'required|string', // 'startTs' => 'nullable|string', // 'endTs' => 'nullable|string', // ]); // if ($validator->fails()) { // return response()->json([ // 'success' => false, // 'error' => $validator->errors()->first() // ], 400); // } // $deviceId = $request->input('device_id'); // $startTs = $request->input('startTs') ?: null; // $endTs = $request->input('endTs') ?: null; // try { // $deviceWithTelemetry = Device::with([ // 'deviceProfile', // 'timeseriesKeys' => function ($query) { // $query->select('key_name', 'display_name', 'device_profile_xid', 'display_on_dashboard','display_on_dashboard'); // } // ]) // ->where('id', $deviceId) // ->firstOrFail(); // $telemetryResponse = $this->customerInfoService->getTelemetryDataDevice( // $deviceWithTelemetry, // $deviceWithTelemetry->timeseriesKeys->pluck('key_name')->toArray(), // $startTs, // $endTs, // $token // ); // if (!is_array($telemetryResponse)) { // throw new \Exception("Invalid telemetry data format received from service"); // } // $telemetry = collect($telemetryResponse) // ->flatMap(function ($items, $keyName) use ($deviceWithTelemetry) { // $displayName = $deviceWithTelemetry->timeseriesKeys // ->firstWhere('key_name', $keyName)?->display_name ?? $keyName; // return collect($items)->map(function ($item) use ($keyName, $displayName) { // return [ // 'key_name' => $keyName, // 'timestamp' => $item['ts'] ?? null, // 'value' => $item['value'] ?? null, // 'display_name' => $displayName, // 'display_on_dashboard' // ]; // }); // }) // ->values() // ->all(); // return response()->json([ // 'success' => true, // 'telemetry' => [ // 'device_id' => (string) $deviceWithTelemetry->id, // 'device_name' => $deviceWithTelemetry->name, // 'device_profile_name' => $deviceWithTelemetry->deviceProfile->name, // 'device_profile_id' => (string) $deviceWithTelemetry->device_profile_id, // 'telemetry_data' => $telemetry, // ] // ], 200); // } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $e) { // return response()->json([ // 'success' => false, // 'error' => 'Device not found' // ], 404); // } catch (\Exception $e) { // return response()->json([ // 'success' => false, // 'error' => 'Failed to fetch telemetry data', // 'details' => config('app.debug') ? $e->getMessage() : null // ], 503); // } // } catch (\Exception $e) { // return response()->json([ // 'success' => false, // 'error' => 'Internal server error', // 'details' => config('app.debug') ? $e->getMessage() : null // ], 500); // } // } public function telemetryDataDevice(Request $request) { try { $token = readHeaderToken(); if (!$token) { return response()->json([ 'success' => false, 'error' => 'Authorization token required' ], 401); } $validator = Validator::make($request->all(), [ 'device_id' => 'required|string', 'startTs' => 'nullable|string', 'endTs' => 'nullable|string', ]); if ($validator->fails()) { return response()->json([ 'success' => false, 'error' => $validator->errors()->first() ], 400); } $deviceId = $request->input('device_id'); $startTs = $request->input('startTs') ?: null; $endTs = $request->input('endTs') ?: null; try { $deviceWithTelemetry = Device::with([ 'deviceProfile', 'timeseriesKeys' => function ($query) { $query->where(function ($q) { $q->where('display_on_dashboard', true) ->orWhere('display_on_popup', true); }) ->select('key_name', 'display_name', 'device_profile_xid', 'display_on_dashboard', 'display_on_popup'); } ]) ->where('id', $deviceId) ->firstOrFail(); $displayKeys = $deviceWithTelemetry->timeseriesKeys->pluck('key_name')->toArray(); if (empty($displayKeys)) { return response()->json([ 'success' => true, 'telemetry' => [ 'device_id' => (string) $deviceWithTelemetry->id, 'device_name' => $deviceWithTelemetry->name, 'device_profile_name' => $deviceWithTelemetry->deviceProfile->name, 'device_profile_id' => (string) $deviceWithTelemetry->device_profile_id, 'telemetry_data' => [], ] ], 200); } $telemetryResponse = $this->customerInfoService->getTelemetryDataDevice( $deviceWithTelemetry, $displayKeys, $startTs, $endTs, $token ); if (!is_array($telemetryResponse)) { throw new \Exception("Invalid telemetry data format received from service"); } $filteredResponse = array_intersect_key($telemetryResponse, array_flip($displayKeys)); $telemetry = collect($filteredResponse) ->flatMap(function ($items, $keyName) use ($deviceWithTelemetry) { $keyData = $deviceWithTelemetry->timeseriesKeys->firstWhere('key_name', $keyName); return collect($items)->map(function ($item) use ($keyName, $keyData) { return [ 'key_name' => $keyName, 'timestamp' => $item['ts'] ?? null, 'value' => $item['value'] ?? null, 'display_name' => $keyData->display_name ?? $keyName, 'display_on_dashboard' => $keyData->display_on_dashboard ?? false, 'display_on_popup' => $keyData->display_on_popup ?? false ]; }); }) ->values() ->all(); return response()->json([ 'success' => true, 'telemetry' => [ 'device_id' => (string) $deviceWithTelemetry->id, 'device_name' => $deviceWithTelemetry->name, 'device_profile_name' => $deviceWithTelemetry->deviceProfile->name, 'device_profile_id' => (string) $deviceWithTelemetry->device_profile_id, 'telemetry_data' => $telemetry, ] ], 200); } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $e) { return response()->json([ 'success' => false, 'error' => 'Device not found' ], 404); } catch (\Exception $e) { return response()->json([ 'success' => false, 'error' => 'Failed to fetch telemetry data', 'details' => config('app.debug') ? $e->getMessage() : null ], 503); } } catch (\Exception $e) { return response()->json([ 'success' => false, 'error' => 'Internal server error', 'details' => config('app.debug') ? $e->getMessage() : null ], 500); } } // public function telemetryDataDeviceDiagnostic(Request $request, $deviceId) // { // $devices = Device::with('deviceProfile') // ->where('id', $deviceId) // ->get(); // if ($devices->isEmpty()) { // return response()->json(['error' => 'No devices found'], 404); // } // $startTs = $request->has('start_date') ? strtotime($request->start_date) * 1000 : null; // $endTs = $request->has('end_date') ? strtotime($request->end_date) * 1000 : null; // $response = []; // foreach ($devices as $device) { // $telemetry = []; // $keyNames = TimeseriesKeyMaster::where('device_profile_xid', $device->device_profile_id) // ->pluck('key_name', 'display_name') // ->toArray(); // $telemetryResponse = $this->customerInfoService->getTelemetryDataDeviceDiagonostic($device, $keyNames, $startTs, $endTs); // foreach ($keyNames as $keyName) { // if (isset($telemetryResponse[$keyName])) { // foreach ($telemetryResponse[$keyName] as $item) { // $timestamp = $item['ts'] ?? null; // // ✅ Filter telemetry by timestamp range // if ($timestamp && $timestamp >= $startTs && $timestamp <= $endTs) { // $telemetry[] = [ // 'key_name' => $keyName, // 'timestamp' => $timestamp, // 'start_date' => $startTs, // 'end_date' => $endTs, // 'value' => $item['value'] ?? null, // 'display_name' => $keyName, // ]; // } // } // } // } // if (!empty($telemetry)) { // $response[] = [ // 'device_id' => (string) $device->id, // 'device_name' => $device->name, // 'device_profile_name' => (string) $device->deviceProfile->name, // 'device_profile_id' => (string) $device->device_profile_id, // 'telemetry' => $telemetry, // ]; // } // } // return response()->json(['telemetry' => $response]); // } // public function telemetryDataDeviceDiagnostic(Request $request, $deviceId) // { // // Fetch devices // $devices = Device::with('deviceProfile') // ->where('id', $deviceId) // ->get(); // if ($devices->isEmpty()) { // return response()->json(['error' => 'No devices found'], 404); // } // // Get start and end timestamps from request parameters // $startTs = $request->has('start_date') ? strtotime($request->start_date) * 1000 : null; // $endTs = $request->has('end_date') ? strtotime($request->end_date) * 1000 : null; // if (!$startTs || !$endTs) { // return response()->json(['error' => 'Start date and end date are required'], 400); // } // $response = []; // foreach ($devices as $device) { // $telemetry = []; // $keyNames = TimeseriesKeyMaster::where('device_profile_xid', $device->device_profile_id) // ->pluck('key_name', 'display_name') // ->toArray(); // $telemetryResponse = $this->customerInfoService->getTelemetryDataDeviceDiagonostic($device, $keyNames, $startTs, $endTs); // foreach ($keyNames as $displayName => $keyName) { // if (isset($telemetryResponse[$keyName])) { // foreach ($telemetryResponse[$keyName] as $item) { // $itemTs = $item['timestamp'] ?? null; // // ✅ Filter only telemetry within the date range // if ($itemTs >= $startTs && $itemTs <= $endTs) { // $telemetry[] = [ // 'key_name' => $keyName, // 'value' => $item['value'] ?? null, // 'display_name' => $displayName, // 'timestamp' => $itemTs, // 'start_date' => $startTs, // 'end_date' => $endTs // ]; // } // } // } // } // if (!empty($telemetry)) { // $response[] = [ // 'device_id' => (string) $device->id, // 'device_name' => $device->name, // 'device_profile_name' => (string) $device->deviceProfile->name, // 'device_profile_id' => (string) $device->device_profile_id, // 'telemetry' => $telemetry, // ]; // } // } // return response()->json(['telemetry' => $response]); // } }