adminService = $adminService; } // public function index() // { // try { // $token = readHeaderToken(); // // Fetch user with assets and device counts // $user = User::with(['assets.devices']) // ->withCount([ // 'assets as active_devices_count' => function ($query) { // $query->whereHas('devices', function ($q) { // $q->where('active', 1); // }); // }, // 'assets as inactive_devices_count' => function ($query) { // $query->whereHas('devices', function ($q) { // $q->where('active', 0); // }); // } // ]) // ->where('id', $token['sub']) // ->first(); // if (!$user) { // return response()->json(['error' => 'User not found'], 404); // } // $bearerToken = $this->adminService->getToken(); // $apiBaseUrl = env('THINGSBOARD_URL', 'http://65.0.131.117:8080'); // // Log::info('Devices: ' . json_encode($user->assets->flatMap->devices)); // foreach ($user->assets->flatMap->devices as $device) { // $device->health_status = null; // $device->online = null; // // Fetch device details from API using customer_id // $deviceResponse = Http::withHeaders([ // 'accept' => 'application/json', // 'Authorization' => 'Bearer ' . $bearerToken, // ])->get("$apiBaseUrl/api/customer/{$device->customer_id}/deviceInfos", [ // 'pageSize' => 100, // 'page' => 0 // ]); // if (!$deviceResponse->successful()) { // Log::error("Failed to fetch device info for Customer ID: {$device->customer_id}, Error: " . $deviceResponse->body()); // continue; // } // $deviceData = collect($deviceResponse->json()['data'] ?? []); // $matchingDevice = $deviceData->firstWhere('id.id', $device->id); // // Explicitly set online status for all devices // $device->online = $matchingDevice['active'] ?? null; // // Fetch telemetry data for the device // $telemetryResponse = Http::withHeaders([ // 'accept' => 'application/json', // 'Authorization' => 'Bearer ' . $bearerToken, // ])->get("$apiBaseUrl/api/plugins/telemetry/DEVICE/{$device->id}/values/timeseries", [ // 'useStrictDataTypes' => 'false' // ]); // if (!$telemetryResponse->successful()) { // Log::error("Failed to fetch telemetry for Device ID: {$device->id}, Error: " . $telemetryResponse->body()); // continue; // } // $telemetryData = $telemetryResponse->json(); // // Log::info('Telemetry data: ' . json_encode($telemetryData)); // $engineName = $telemetryData['Engine_Name'][0]['value'] ?? null; // // Extract values from telemetry data // $mechanicalHealthValue1 = isset($telemetryData['MechanicalHealth_value'][0]['value']) // ? (float) $telemetryData['MechanicalHealth_value'][0]['value'] // : null; // $engineEfficiencyValue1 = isset($telemetryData['EngineEfficiency_value'][0]['value']) // ? (float) $telemetryData['EngineEfficiency_value'][0]['value'] // : null; // $engineEfficiencyValue4 = isset($telemetryData['EngineEfficiency_valueInHealth'][0]['value']) // ? (float) $telemetryData['EngineEfficiency_valueInHealth'][0]['value'] // : null; // $powerLossValue1 = isset($telemetryData['PowerLoss_value'][0]['value']) // ? (float) $telemetryData['PowerLoss_value'][0]['value'] // : null; // // Default health status // $healthStatusColor = '#0EC23E'; // Green // if ($engineName === "Torque") { // $healthStatusColor = '#0EC23E'; // Green // } elseif ( // ($mechanicalHealthValue1 > 0 && $mechanicalHealthValue1 < 31) || // ($engineEfficiencyValue1 > 0 && $engineEfficiencyValue1 < 31) || // ($engineEfficiencyValue4 > 0 && $engineEfficiencyValue4 < 31) || // ($powerLossValue1 > 0 && $powerLossValue1 < 31) // ) { // $healthStatusColor = '#EF7F30'; // Red // } elseif ( // ($mechanicalHealthValue1 > 30 && $mechanicalHealthValue1 < 71) || // ($engineEfficiencyValue1 > 30 && $engineEfficiencyValue1 < 71) || // ($engineEfficiencyValue4 > 30 && $engineEfficiencyValue4 < 71) || // ($powerLossValue1 > 30 && $powerLossValue1 < 71) // ) { // $healthStatusColor = '#FFC164'; // Yellow // } // $device->health_status = "
"; // } // return response()->json($user); // } catch (Exception $e) { // Log::error('Error fetching telemetry data: ' . $e->getMessage()); // return response()->json(['error' => 'Failed to fetch data'], 500); // } // } // public function index() // { // try { // $token = readHeaderToken(); // // Fetch user with assets and device counts // $user = User::with(['assets.devices']) // ->withCount([ // 'assets as active_devices_count' => function ($query) { // $query->whereHas('devices', function ($q) { // $q->where('active', 1); // }); // }, // 'assets as inactive_devices_count' => function ($query) { // $query->whereHas('devices', function ($q) { // $q->where('active', 0); // }); // } // ]) // ->where('id', $token['sub']) // ->first(); // if (!$user) { // return response()->json(['error' => 'User not found'], 404); // } // $bearerToken = $this->adminService->getToken(); // $apiBaseUrl = env('THINGSBOARD_URL', 'http://65.0.131.117:8080'); // foreach ($user->assets->flatMap->devices as $device) { // $device->health_status = null; // $device->online = null; // $device->has_alarm = false; // Initialize alarm status to false // // Fetch device details from API using customer_id // $deviceResponse = Http::withHeaders([ // 'accept' => 'application/json', // 'Authorization' => 'Bearer ' . $bearerToken, // ])->get("$apiBaseUrl/api/customer/{$device->customer_id}/deviceInfos", [ // 'pageSize' => 100, // 'page' => 0 // ]); // if (!$deviceResponse->successful()) { // Log::error("Failed to fetch device info for Customer ID: {$device->customer_id}, Error: " . $deviceResponse->body()); // continue; // } // $deviceData = collect($deviceResponse->json()['data'] ?? []); // $matchingDevice = $deviceData->firstWhere('id.id', $device->id); // // Set online status // $device->online = $matchingDevice['active'] ?? null; // // Fetch alarm data for the device (last 24 hours) // $twentyFourHoursAgo = (time() - 86400) * 1000; // 24 hours ago in milliseconds // $currentTime = time() * 1000; // current time in milliseconds // $alarmResponse = Http::withHeaders([ // 'accept' => 'application/json', // 'Authorization' => 'Bearer ' . $bearerToken, // ])->get("$apiBaseUrl/api/alarm/DEVICE/{$device->id}", [ // 'pageSize' => 100, // 'page' => 0, // 'startTime' => $twentyFourHoursAgo, // 'endTime' => $currentTime, // 'fetchOriginator' => 'false', // 'searchStatus' => 'ACTIVE,ACKNOWLEDGED,CLEARED' // ]); // if ($alarmResponse->successful()) { // $alarms = $alarmResponse->json()['data'] ?? []; // $device->has_alarm = !empty($alarms); // Set to true if any alarms exist // } else { // Log::error("Failed to fetch alarms for Device ID: {$device->id}, Error: " . $alarmResponse->body()); // } // // Fetch telemetry data for the device // $telemetryResponse = Http::withHeaders([ // 'accept' => 'application/json', // 'Authorization' => 'Bearer ' . $bearerToken, // ])->get("$apiBaseUrl/api/plugins/telemetry/DEVICE/{$device->id}/values/timeseries", [ // 'useStrictDataTypes' => 'false' // ]); // if (!$telemetryResponse->successful()) { // Log::error("Failed to fetch telemetry for Device ID: {$device->id}, Error: " . $telemetryResponse->body()); // continue; // } // $telemetryData = $telemetryResponse->json(); // $engineName = $telemetryData['Engine_Name'][0]['value'] ?? null; // // Extract values from telemetry data // $mechanicalHealthValue1 = isset($telemetryData['MechanicalHealth_value'][0]['value']) // ? (float) $telemetryData['MechanicalHealth_value'][0]['value'] // : null; // $engineEfficiencyValue1 = isset($telemetryData['EngineEfficiency_value'][0]['value']) // ? (float) $telemetryData['EngineEfficiency_value'][0]['value'] // : null; // $engineEfficiencyValue4 = isset($telemetryData['EngineEfficiency_valueInHealth'][0]['value']) // ? (float) $telemetryData['EngineEfficiency_valueInHealth'][0]['value'] // : null; // $powerLossValue1 = isset($telemetryData['PowerLoss_value'][0]['value']) // ? (float) $telemetryData['PowerLoss_value'][0]['value'] // : null; // // Default health status // $healthStatusColor = '#0EC23E'; // Green // if ($engineName === "Torque") { // $healthStatusColor = '#0EC23E'; // Green // } elseif ( // ($mechanicalHealthValue1 > 0 && $mechanicalHealthValue1 < 31) || // ($engineEfficiencyValue1 > 0 && $engineEfficiencyValue1 < 31) || // ($engineEfficiencyValue4 > 0 && $engineEfficiencyValue4 < 31) || // ($powerLossValue1 > 0 && $powerLossValue1 < 31) // ) { // $healthStatusColor = '#EF7F30'; // Red // } elseif ( // ($mechanicalHealthValue1 > 30 && $mechanicalHealthValue1 < 71) || // ($engineEfficiencyValue1 > 30 && $engineEfficiencyValue1 < 71) || // ($engineEfficiencyValue4 > 30 && $engineEfficiencyValue4 < 71) || // ($powerLossValue1 > 30 && $powerLossValue1 < 71) // ) { // $healthStatusColor = '#FFC164'; // Yellow // } // $device->health_status = "
"; // } // return response()->json($user); // } catch (Exception $e) { // Log::error('Error fetching telemetry data: ' . $e->getMessage()); // return response()->json(['error' => 'Failed to fetch data'], 500); // } // } public function index() { try { $token = readHeaderToken(); // Fetch user with assets and device counts $user = User::with(['assets.devices']) ->withCount([ 'assets as active_devices_count' => function ($query) { $query->whereHas('devices', function ($q) { $q->where('active', 1); }); }, 'assets as inactive_devices_count' => function ($query) { $query->whereHas('devices', function ($q) { $q->where('active', 0); }); } ]) ->where('id', $token['sub']) ->first(); if (!$user) { return response()->json(['error' => 'User not found'], 404); } $bearerToken = $this->adminService->getToken(); $apiBaseUrl = env('THINGSBOARD_URL', 'http://65.0.131.117:8080'); foreach ($user->assets->flatMap->devices as $device) { $device->health_status = null; $device->online = null; $device->has_alarm = false; // 1. First check if device exists in ThingsBoard $deviceCheckResponse = Http::withHeaders([ 'accept' => 'application/json', 'Authorization' => 'Bearer ' . $bearerToken, ])->get("$apiBaseUrl/api/device/{$device->id}"); if (!$deviceCheckResponse->successful()) { Log::warning("Device not found in ThingsBoard: {$device->id}"); continue; // Skip this device } // Fetch device details from API using customer_id $deviceResponse = Http::withHeaders([ 'accept' => 'application/json', 'Authorization' => 'Bearer ' . $bearerToken, ])->get("$apiBaseUrl/api/customer/{$device->customer_id}/deviceInfos", [ 'pageSize' => 100, 'page' => 0 ]); if (!$deviceResponse->successful()) { Log::error("Failed to fetch device info for Customer ID: {$device->customer_id}, Error: " . $deviceResponse->body()); continue; } $deviceData = collect($deviceResponse->json()['data'] ?? []); $matchingDevice = $deviceData->firstWhere('id.id', $device->id); // Set online status $device->online = $matchingDevice['active'] ?? null; // Fetch alarm data for the device (last 24 hours) $twentyFourHoursAgo = (time() - 86400) * 1000; $currentTime = time() * 1000; // Fixed: Use separate API calls for each alarm status $alarmStatuses = ['ACTIVE', 'ACKNOWLEDGED', 'CLEARED']; $hasAlarm = false; foreach ($alarmStatuses as $status) { $alarmResponse = Http::withHeaders([ 'accept' => 'application/json', 'Authorization' => 'Bearer ' . $bearerToken, ])->get("$apiBaseUrl/api/alarm/DEVICE/{$device->id}", [ 'pageSize' => 100, 'page' => 0, 'startTime' => $twentyFourHoursAgo, 'endTime' => $currentTime, 'fetchOriginator' => 'false', 'searchStatus' => $status ]); if ($alarmResponse->successful()) { $alarms = $alarmResponse->json()['data'] ?? []; if (!empty($alarms)) { $hasAlarm = true; break; // No need to check other statuses if we found an alarm } } else { Log::error("Failed to fetch $status alarms for Device ID: {$device->id}, Error: " . $alarmResponse->body()); } } $device->has_alarm = $hasAlarm; // Fetch telemetry data for the device $telemetryResponse = Http::withHeaders([ 'accept' => 'application/json', 'Authorization' => 'Bearer ' . $bearerToken, ])->get("$apiBaseUrl/api/plugins/telemetry/DEVICE/{$device->id}/values/timeseries", [ 'useStrictDataTypes' => 'false' ]); if (!$telemetryResponse->successful()) { Log::error("Failed to fetch telemetry for Device ID: {$device->id}, Error: " . $telemetryResponse->body()); continue; } $telemetryData = $telemetryResponse->json(); $engineName = $telemetryData['Engine_Name'][0]['value'] ?? null; // Extract values from telemetry data $mechanicalHealthValue1 = isset($telemetryData['MechanicalHealth_value'][0]['value']) ? (float) $telemetryData['MechanicalHealth_value'][0]['value'] : null; $engineEfficiencyValue1 = isset($telemetryData['EngineEfficiency_value'][0]['value']) ? (float) $telemetryData['EngineEfficiency_value'][0]['value'] : null; $engineEfficiencyValue4 = isset($telemetryData['EngineEfficiency_valueInHealth'][0]['value']) ? (float) $telemetryData['EngineEfficiency_valueInHealth'][0]['value'] : null; $powerLossValue1 = isset($telemetryData['PowerLoss_value'][0]['value']) ? (float) $telemetryData['PowerLoss_value'][0]['value'] : null; // Default health status $healthStatusColor = '#0EC23E'; // Green if ($engineName === "Torque") { $healthStatusColor = '#0EC23E'; // Green } elseif ( ($mechanicalHealthValue1 > 0 && $mechanicalHealthValue1 < 31) || ($engineEfficiencyValue1 > 0 && $engineEfficiencyValue1 < 31) || ($engineEfficiencyValue4 > 0 && $engineEfficiencyValue4 < 31) || ($powerLossValue1 > 0 && $powerLossValue1 < 31) ) { $healthStatusColor = '#EF7F30'; // Red } elseif ( ($mechanicalHealthValue1 > 30 && $mechanicalHealthValue1 < 71) || ($engineEfficiencyValue1 > 30 && $engineEfficiencyValue1 < 71) || ($engineEfficiencyValue4 > 30 && $engineEfficiencyValue4 < 71) || ($powerLossValue1 > 30 && $powerLossValue1 < 71) ) { $healthStatusColor = '#FFC164'; // Yellow } $device->health_status = "
"; } return response()->json($user); } catch (Exception $e) { Log::error('Error fetching telemetry data: ' . $e->getMessage()); return response()->json(['error' => 'Failed to fetch data'], 500); } } }