diff --git a/app/Http/Controllers/APIS/CustomerApi/CustomerDeviceInfoController.php b/app/Http/Controllers/APIS/CustomerApi/CustomerDeviceInfoController.php index a5731ab..2b855cb 100644 --- a/app/Http/Controllers/APIS/CustomerApi/CustomerDeviceInfoController.php +++ b/app/Http/Controllers/APIS/CustomerApi/CustomerDeviceInfoController.php @@ -7,6 +7,7 @@ use App\Models\Customer; use App\Models\User; use Illuminate\Http\Request; use App\Services\CustomerInfoService; +use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Log; use Tymon\JWTAuth\Facades\JWTAuth; @@ -23,8 +24,8 @@ class CustomerDeviceInfoController extends Controller -// public function customerDeviceInfo(Request $request) -// { + // public function customerDeviceInfo(Request $request) + // { // try { // $tokenPayload = getTokenFromHeader($request); @@ -94,166 +95,230 @@ class CustomerDeviceInfoController extends Controller // ], 500); // } -// } + // } -// public function customerDeviceInfo(Request $request) -// { -// try { + // public function customerDeviceInfo(Request $request) + // { + // try { -// $token = readHeaderToken(); + // $token = readHeaderToken(); -// if (!$token) { -// return response()->json([ -// 'success' => false, -// 'error' => 'Authorization token required' -// ], 401); -// } + // if (!$token) { + // return response()->json([ + // 'success' => false, + // 'error' => 'Authorization token required' + // ], 401); + // } -// $user = User::with(['assets.devices:id,name,asset_id']) -// ->find($token['sub']); + // $user = User::with(['assets.devices:id,name,asset_id']) + // ->find($token['sub']); -// if (!$user) { -// return response()->json([ -// 'error' => 'user_not_found', -// 'message' => 'User not found' -// ], 404); -// } + // if (!$user) { + // return response()->json([ + // 'error' => 'user_not_found', + // 'message' => 'User not found' + // ], 404); + // } -// $devicesArray = $this->customerInfoService->getThingsBoardDevices($user->customer_id); + // $devicesArray = $this->customerInfoService->getThingsBoardDevices($user->customer_id); -// if (isset($devicesArray['error'])) { -// throw new \Exception($devicesArray['message'] ?? 'Failed to fetch devices'); -// } + // if (isset($devicesArray['error'])) { + // throw new \Exception($devicesArray['message'] ?? 'Failed to fetch devices'); + // } -// if (!is_array($devicesArray)) { -// throw new \Exception("Invalid devices data format received from service"); -// } + // if (!is_array($devicesArray)) { + // throw new \Exception("Invalid devices data format received from service"); + // } -// $userDeviceIds = $user->assets->flatMap->devices->pluck('id')->toArray(); + // $userDeviceIds = $user->assets->flatMap->devices->pluck('id')->toArray(); -// $activeCount = collect($devicesArray) -// ->whereIn('id.id', $userDeviceIds) -// ->where('active', true) -// ->count(); + // $activeCount = collect($devicesArray) + // ->whereIn('id.id', $userDeviceIds) + // ->where('active', true) + // ->count(); -// $deviceIdCount = count($userDeviceIds); -// return response()->json([ -// 'data' => [ -// 'active_count' => $activeCount, -// 'total_count' => $deviceIdCount, -// ], -// 'success' => true -// ], 200); + // $deviceIdCount = count($userDeviceIds); + // return response()->json([ + // 'data' => [ + // 'active_count' => $activeCount, + // 'total_count' => $deviceIdCount, + // ], + // 'success' => true + // ], 200); -// } catch (\Exception $e) { -// Log::error("Device info error: " . $e->getMessage()); -// $statusCode = ($e->getMessage() === "Invalid devices data format received from service") ? 503 : 500; + // } catch (\Exception $e) { + // Log::error("Device info error: " . $e->getMessage()); + // $statusCode = ($e->getMessage() === "Invalid devices data format received from service") ? 503 : 500; -// return response()->json([ -// 'error' => 'server_error', -// 'message' => 'An error occurred', -// 'details' => $e->getMessage() -// ], $statusCode); -// } -// } + // return response()->json([ + // 'error' => 'server_error', + // 'message' => 'An error occurred', + // 'details' => $e->getMessage() + // ], $statusCode); + // } + // } -public function customerDeviceInfo(Request $request) -{ - try { - $token = readHeaderToken($request); - if (!$token) { - return response()->json([ - 'success' => false, - 'error' => 'authorization_required', - 'message' => 'Authorization token required' - ], 401); - } + public function customerDeviceInfo(Request $request) + { + try { + $token = readHeaderToken($request); + if (!$token) { + return response()->json([ + 'success' => false, + 'error' => 'authorization_required', + 'message' => 'Authorization token required' + ], 401); + } - // Get user with devices - $user = User::with(['assets.devices:id,name,asset_id']) - ->find($token['sub']); + // Get user with devices + $user = User::with(['assets.devices:id,name,asset_id']) + ->find($token['sub']); - if (!$user) { - return response()->json([ - 'success' => false, - 'error' => 'user_not_found', - 'message' => 'User not found' - ], 404); - } + if (!$user) { + return response()->json([ + 'success' => false, + 'error' => 'user_not_found', + 'message' => 'User not found' + ], 404); + } - // Get user's device IDs - $userDeviceIds = $user->assets->flatMap->devices->pluck('id')->toArray(); + // Get user's device IDs + $userDevices = $user->assets->flatMap->devices; + $userDeviceIds = $userDevices->pluck('id')->toArray(); + + if (empty($userDeviceIds)) { + return response()->json([ + 'data' => [ + 'active_count' => 0, + 'total_count' => 0, + 'alarms_count' => 0, + 'red_count' => 0, + 'yellow_count' => 0, + 'green_count' => 0 + ], + 'success' => true + ], 200); + } + + // Get devices and alarms from service + $serviceResponse = $this->customerInfoService->getCustomerDevicesAndAlarms( + $user->customer_id, + $userDeviceIds + ); + + // Handle service errors + if (isset($serviceResponse['error'])) { + throw new \Exception($serviceResponse['message'] ?? 'Service request failed'); + } + + // Process devices + $devices = $serviceResponse['devices'] ?? []; + $activeCount = collect($devices) + ->whereIn('id.id', $userDeviceIds) + ->where('active', true) + ->count(); + + // Process alarms + $alarms = $serviceResponse['alarms'] ?? []; + $recentAlarms = $this->filterRecentAlarms($alarms); + + $bearerToken = $this->customerInfoService->getToken(); + $apiBaseUrl = env('THINGSBOARD_URL', 'http://65.0.131.117:8080'); + + + $redCount = 0; + $yellowCount = 0; + $greenCount = 0; + + foreach ($userDevices as $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; + + $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; + + // Determine health status + if ($engineName === "Torque") { + $greenCount++; + } elseif ( + ($mechanicalHealthValue1 > 0 && $mechanicalHealthValue1 < 31) || + ($engineEfficiencyValue1 > 0 && $engineEfficiencyValue1 < 31) || + ($engineEfficiencyValue4 > 0 && $engineEfficiencyValue4 < 31) || + ($powerLossValue1 > 0 && $powerLossValue1 < 31) + ) { + $redCount++; + } elseif ( + ($mechanicalHealthValue1 >= 31 && $mechanicalHealthValue1 < 71) || + ($engineEfficiencyValue1 >= 31 && $engineEfficiencyValue1 < 71) || + ($engineEfficiencyValue4 >= 31 && $engineEfficiencyValue4 < 71) || + ($powerLossValue1 >= 31 && $powerLossValue1 < 71) + ) { + $yellowCount++; + } else { + $greenCount++; + } + } - if (empty($userDeviceIds)) { return response()->json([ 'data' => [ - 'active_count' => 0, - 'total_count' => 0, - - 'alarms_count' => 0 + 'active_count' => $activeCount, + 'total_count' => count($userDeviceIds), + 'alarms_count' => count($recentAlarms), + 'red_count' => $redCount, + 'yellow_count' => $yellowCount, + 'green_count' => $greenCount, ], 'success' => true ], 200); + } catch (\Exception $e) { + Log::error("Device info error: " . $e->getMessage()); + return response()->json([ + 'success' => false, + 'error' => 'server_error', + 'message' => 'An error occurred while fetching device information', + 'details' => $e->getMessage() + ], 500); } + } - // Get devices and alarms from service - $serviceResponse = $this->customerInfoService->getCustomerDevicesAndAlarms( - $user->customer_id, - $userDeviceIds - ); - // Handle service errors - if (isset($serviceResponse['error'])) { - throw new \Exception($serviceResponse['message'] ?? 'Service request failed'); - } + private function filterRecentAlarms(array $alarms): array + { + $twentyFourHoursAgo = (time() - 86400) * 1000; - // Process devices - $devices = $serviceResponse['devices'] ?? []; - $activeCount = collect($devices) - ->whereIn('id.id', $userDeviceIds) - ->where('active', true) - ->count(); - - // Process alarms - $alarms = $serviceResponse['alarms'] ?? []; - - $recentAlarms = $this->filterRecentAlarms($alarms); - - return response()->json([ - 'data' => [ - 'active_count' => $activeCount, - 'total_count' => count($userDeviceIds), - - 'alarms_count' => count($recentAlarms), - - ], - 'success' => true - ], 200); - - } catch (\Exception $e) { - Log::error("Device info error: " . $e->getMessage()); - return response()->json([ - 'success' => false, - 'error' => 'server_error', - 'message' => 'An error occurred while fetching device information', - 'details' => $e->getMessage() - ], 500); + return array_values(array_filter($alarms, function ($alarm) use ($twentyFourHoursAgo) { + return ($alarm['createdTime'] ?? 0) >= $twentyFourHoursAgo; + })); } } - -private function filterRecentAlarms(array $alarms): array -{ - $twentyFourHoursAgo = (time() - 86400) * 1000; - - return array_values(array_filter($alarms, function($alarm) use ($twentyFourHoursAgo) { - return ($alarm['createdTime'] ?? 0) >= $twentyFourHoursAgo; - })); -} - - -} diff --git a/app/Services/CustomerInfoService.php b/app/Services/CustomerInfoService.php index 060d02d..2987e03 100644 --- a/app/Services/CustomerInfoService.php +++ b/app/Services/CustomerInfoService.php @@ -8,6 +8,8 @@ use Illuminate\Support\Facades\Log; use App\Services\AdminService; use Exception; use Illuminate\Support\Facades\Request; +use Illuminate\Support\Facades\Cache; + class CustomerInfoService { @@ -60,7 +62,7 @@ class CustomerInfoService - public function getTelemetryData($device, $keyNames, $startTs , $endTs ) + public function getTelemetryData($device, $keyNames, $startTs, $endTs) { $token = $this->adminService->getToken(); @@ -271,7 +273,6 @@ class CustomerInfoService } return $result; - } catch (\Exception $e) { Log::error("ThingsBoard service error: " . $e->getMessage()); return [ @@ -304,7 +305,6 @@ class CustomerInfoService $data = $response->json(); return $data['data'] ?? []; - } catch (\Exception $e) { Log::error("Device fetch error: " . $e->getMessage()); return [ @@ -344,7 +344,6 @@ class CustomerInfoService } return $response->json(); - } catch (\Exception $e) { Log::error("Alarm fetch error: " . $e->getMessage()); return [ @@ -355,4 +354,35 @@ class CustomerInfoService } } -} \ No newline at end of file + + public function getToken() + { + $baseUrl = env('THINGSBOARD_URL', 'http://65.0.131.117:8080'); + $username = env('THINGSBOARD_USERNAME', 'tenant1@thingsboard.org'); + $password = env('THINGSBOARD_PASSWORD', 'tenant1'); + + + if (Cache::has('thingsboard_token')) { + return Cache::get('thingsboard_token'); + } + + $response = Http::withHeaders([ + // 'accept' => 'application/json', + 'Content-Type' => 'application/json', + ]) + ->post("{$baseUrl}/api/auth/login", [ + 'username' => $username, + 'password' => $password, + ]); + + + if ($response->successful()) { + $token = $response->json('token'); + Cache::put('thingsboard_token', $token, now()->addMinutes(15)); + return $token; + } else { + Log::error("ThingsBoard Authentication Failed: " . $response->body()); + throw new Exception('Unable to authenticate with ThingsBoard: ' . $response->body()); + } + } +}