2025-03-11 17:15:41 +05:30
|
|
|
<?php
|
|
|
|
|
|
2025-03-11 17:52:55 +05:30
|
|
|
namespace App\Http\Controllers\APIS\CustomerApi;
|
2025-03-11 17:15:41 +05:30
|
|
|
|
|
|
|
|
use App\Http\Controllers\Controller;
|
2025-03-24 13:31:06 +05:30
|
|
|
use App\Models\Asset;
|
2025-03-11 17:52:55 +05:30
|
|
|
use App\Models\User;
|
2025-03-11 17:15:41 +05:30
|
|
|
use App\Models\UserAssetLink;
|
2025-03-25 11:40:43 +05:30
|
|
|
use App\Services\AdminService;
|
2025-03-11 17:15:41 +05:30
|
|
|
use Illuminate\Http\Request;
|
2025-03-11 19:44:37 +05:30
|
|
|
use Tymon\JWTAuth\Facades\JWTAuth;
|
2025-03-25 11:40:43 +05:30
|
|
|
use Illuminate\Support\Facades\Http;
|
2025-03-12 19:19:13 +05:30
|
|
|
use Illuminate\Container\Attributes\Auth;
|
|
|
|
|
use Illuminate\Database\QueryException;
|
|
|
|
|
use Illuminate\Support\Facades\Log;
|
2025-03-25 11:40:43 +05:30
|
|
|
use Exception;
|
|
|
|
|
|
|
|
|
|
|
2025-03-11 17:15:41 +05:30
|
|
|
class UserAssetLinkController extends Controller
|
|
|
|
|
{
|
2025-03-25 11:40:43 +05:30
|
|
|
private $adminService;
|
|
|
|
|
|
|
|
|
|
public function __construct(AdminService $adminService)
|
|
|
|
|
{
|
|
|
|
|
$this->adminService = $adminService;
|
|
|
|
|
}
|
2025-03-12 19:19:13 +05:30
|
|
|
|
2025-03-31 19:18:36 +05:30
|
|
|
// public function index()
|
|
|
|
|
// {
|
|
|
|
|
// try {
|
|
|
|
|
// $token = readHeaderToken();
|
2025-03-18 15:45:21 +05:30
|
|
|
|
2025-03-31 19:18:36 +05:30
|
|
|
// // 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();
|
2025-03-18 15:45:21 +05:30
|
|
|
|
2025-03-31 19:18:36 +05:30
|
|
|
// if (!$user) {
|
|
|
|
|
// return response()->json(['error' => 'User not found'], 404);
|
|
|
|
|
// }
|
2025-03-18 15:45:21 +05:30
|
|
|
|
2025-03-31 19:18:36 +05:30
|
|
|
// $bearerToken = $this->adminService->getToken();
|
|
|
|
|
// $apiBaseUrl = env('THINGSBOARD_URL', 'http://65.0.131.117:8080');
|
2025-03-18 15:45:21 +05:30
|
|
|
|
2025-03-25 11:40:43 +05:30
|
|
|
|
2025-03-31 19:18:36 +05:30
|
|
|
// // 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 = "<div style='height: 10px; width: 10px; border-radius: 50%; display: inline-block; margin-left: 10px; background-color: $healthStatusColor'></div>";
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 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'
|
|
|
|
|
// ]);
|
2025-03-25 11:40:43 +05:30
|
|
|
|
2025-03-31 19:18:36 +05:30
|
|
|
// 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 = "<div style='height: 10px; width: 10px; border-radius: 50%; display: inline-block; margin-left: 10px; background-color: $healthStatusColor'></div>";
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// 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);
|
|
|
|
|
});
|
2025-03-26 16:53:02 +05:30
|
|
|
}
|
2025-03-31 19:18:36 +05:30
|
|
|
])
|
|
|
|
|
->where('id', $token['sub'])
|
|
|
|
|
->first();
|
|
|
|
|
|
|
|
|
|
if (!$user) {
|
|
|
|
|
return response()->json(['error' => 'User not found'], 404);
|
|
|
|
|
}
|
2025-03-25 11:40:43 +05:30
|
|
|
|
2025-03-31 19:18:36 +05:30
|
|
|
$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
|
|
|
|
|
}
|
2025-03-26 16:53:02 +05:30
|
|
|
|
2025-03-31 19:18:36 +05:30
|
|
|
// 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
|
|
|
|
|
]);
|
2025-03-26 16:53:02 +05:30
|
|
|
|
2025-03-31 19:18:36 +05:30
|
|
|
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([
|
2025-03-26 16:53:02 +05:30
|
|
|
'accept' => 'application/json',
|
|
|
|
|
'Authorization' => 'Bearer ' . $bearerToken,
|
2025-03-31 19:18:36 +05:30
|
|
|
])->get("$apiBaseUrl/api/alarm/DEVICE/{$device->id}", [
|
|
|
|
|
'pageSize' => 100,
|
|
|
|
|
'page' => 0,
|
|
|
|
|
'startTime' => $twentyFourHoursAgo,
|
|
|
|
|
'endTime' => $currentTime,
|
|
|
|
|
'fetchOriginator' => 'false',
|
|
|
|
|
'searchStatus' => $status
|
2025-03-26 16:53:02 +05:30
|
|
|
]);
|
|
|
|
|
|
2025-03-31 19:18:36 +05:30
|
|
|
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());
|
2025-03-25 11:40:43 +05:30
|
|
|
}
|
2025-03-31 19:18:36 +05:30
|
|
|
}
|
2025-03-26 16:53:02 +05:30
|
|
|
|
2025-03-31 19:18:36 +05:30
|
|
|
$device->has_alarm = $hasAlarm;
|
2025-03-28 19:48:29 +05:30
|
|
|
|
2025-03-31 19:18:36 +05:30
|
|
|
// 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'
|
|
|
|
|
]);
|
2025-03-28 19:48:29 +05:30
|
|
|
|
2025-03-31 19:18:36 +05:30
|
|
|
if (!$telemetryResponse->successful()) {
|
|
|
|
|
Log::error("Failed to fetch telemetry for Device ID: {$device->id}, Error: " . $telemetryResponse->body());
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2025-03-28 19:48:29 +05:30
|
|
|
|
2025-03-31 19:18:36 +05:30
|
|
|
$telemetryData = $telemetryResponse->json();
|
2025-03-28 19:48:29 +05:30
|
|
|
|
2025-03-31 19:18:36 +05:30
|
|
|
$engineName = $telemetryData['Engine_Name'][0]['value'] ?? null;
|
2025-03-28 19:48:29 +05:30
|
|
|
|
2025-03-31 19:18:36 +05:30
|
|
|
// Extract values from telemetry data
|
|
|
|
|
$mechanicalHealthValue1 = isset($telemetryData['MechanicalHealth_value'][0]['value'])
|
|
|
|
|
? (float) $telemetryData['MechanicalHealth_value'][0]['value']
|
|
|
|
|
: null;
|
2025-03-28 19:48:29 +05:30
|
|
|
|
2025-03-31 19:18:36 +05:30
|
|
|
$engineEfficiencyValue1 = isset($telemetryData['EngineEfficiency_value'][0]['value'])
|
|
|
|
|
? (float) $telemetryData['EngineEfficiency_value'][0]['value']
|
|
|
|
|
: null;
|
2025-03-28 19:48:29 +05:30
|
|
|
|
2025-03-31 19:18:36 +05:30
|
|
|
$engineEfficiencyValue4 = isset($telemetryData['EngineEfficiency_valueInHealth'][0]['value'])
|
|
|
|
|
? (float) $telemetryData['EngineEfficiency_valueInHealth'][0]['value']
|
|
|
|
|
: null;
|
2025-03-28 19:48:29 +05:30
|
|
|
|
2025-03-31 19:18:36 +05:30
|
|
|
$powerLossValue1 = isset($telemetryData['PowerLoss_value'][0]['value'])
|
|
|
|
|
? (float) $telemetryData['PowerLoss_value'][0]['value']
|
|
|
|
|
: null;
|
2025-03-25 11:40:43 +05:30
|
|
|
|
2025-03-31 19:18:36 +05:30
|
|
|
// Default health status
|
|
|
|
|
$healthStatusColor = '#0EC23E'; // Green
|
2025-03-28 19:48:29 +05:30
|
|
|
|
2025-03-31 19:18:36 +05:30
|
|
|
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 = "<div style='height: 10px; width: 10px; border-radius: 50%; display: inline-block; margin-left: 10px; background-color: $healthStatusColor'></div>";
|
2025-03-25 11:40:43 +05:30
|
|
|
}
|
2025-03-31 19:18:36 +05:30
|
|
|
|
|
|
|
|
return response()->json($user);
|
|
|
|
|
} catch (Exception $e) {
|
|
|
|
|
Log::error('Error fetching telemetry data: ' . $e->getMessage());
|
|
|
|
|
return response()->json(['error' => 'Failed to fetch data'], 500);
|
2025-03-25 11:40:43 +05:30
|
|
|
}
|
2025-03-11 19:05:25 +05:30
|
|
|
}
|
2025-03-31 19:18:36 +05:30
|
|
|
}
|