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); } } }