sneha #61

Merged
Sneha.Yadav merged 2 commits from sneha into main 2025-04-02 14:16:54 +00:00

View File

@@ -364,6 +364,106 @@ class TelemetryController extends Controller
// return response()->json(['telemetry' => $response]);
// }
// public function telemetryDataAsset(Request $request)
// {
// $token = readHeaderToken();
// $customerId = User::where('id', $token['sub'])->value('customer_id');
// $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') ?: now()->subHours(24)->timestamp * 1000;
// $endTs = $request->input('endTs') ?: now()->timestamp * 1000;
// $devices = Device::with([
// 'deviceProfile',
// 'timeseriesKeys' => function ($query) {
// $query->where('display_on_dashboard', true)
// ->orWhere('display_on_popup', true)
// ->select(['id', 'device_profile_xid', 'key_name', 'display_name', 'display_on_dashboard', 'display_on_popup']);
// }
// ])->where('asset_id', $assetId)
// ->where('customer_id', $customerId)
// ->get();
// if ($devices->isEmpty()) {
// return response()->json(['error' => 'No devices found for the asset'], 404);
// }
// $response = $devices->map(function ($device) use ($startTs, $endTs) {
// $keysData = $device->timeseriesKeys;
// $keyNames = $keysData->pluck('key_name')->toArray();
// $telemetryResponse = $this->customerInfoService->getTelemetryData($device, $keyNames, $startTs, $endTs);
// $alarmMap = $this->getDeviceAlarmsForTelemetry($device->id);
// $alertMessages = TimeseriesAlertMessage::whereIn('timeseries_key_master_xid', $keysData->pluck('id'))
// ->orderBy('min_value', 'asc')
// ->get()
// ->groupBy('timeseries_key_master_xid');
// $telemetry = $keysData->map(function ($keyData) use ($telemetryResponse, $alarmMap, $alertMessages) {
// return collect($telemetryResponse[$keyData->key_name] ?? [])->map(function ($item) use ($keyData, $alarmMap, $alertMessages) {
// $keyName = $keyData->key_name;
// $alert = isset($alarmMap[$keyName]);
// $value = floatval($item['value'] ?? 0);
// $colorCode = null;
// // Default to grey if value is 0
// if ($value == 0) {
// $colorCode = "grey";
// } else {
// // Check alert messages for this key
// if (isset($alertMessages[$keyData->id])) {
// foreach ($alertMessages[$keyData->id] as $alertMsg) {
// // If min_value or max_value is null, return null
// if (is_null($alertMsg->min_value) || is_null($alertMsg->max_value)) {
// $colorCode = 'green';
// break;
// }
// if ($value >= floatval($alertMsg->min_value) && $value <= floatval($alertMsg->max_value)) {
// $colorCode = $alertMsg->color_code;
// break;
// }
// }
// }
// }
// return [
// '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' => $value,
// 'alert' => $alert,
// 'color_code' => $colorCode, // Now handles null & grey cases
// ];
// });
// })->flatten(1);
// return [
// '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' => array_values($telemetry->toArray()),
// ];
// });
// return response()->json(['telemetry' => $response]);
// }
public function telemetryDataAsset(Request $request)
{
$token = readHeaderToken();
@@ -371,8 +471,6 @@ class TelemetryController extends Controller
$validator = Validator::make($request->all(), [
'asset_id' => 'required|string',
'startTs' => 'nullable|string',
'endTs' => 'nullable|string',
]);
if ($validator->fails()) {
@@ -380,8 +478,10 @@ class TelemetryController extends Controller
}
$assetId = $request->input('asset_id');
$startTs = $request->input('startTs') ?: now()->subHours(24)->timestamp * 1000;
$endTs = $request->input('endTs') ?: now()->timestamp * 1000;
// Set timestamps in milliseconds for database query
$endTsMs = now()->timestamp * 1000; // Current time in milliseconds
$startTsMs = $endTsMs - (30 * 60 * 1000); // 5 minutes ago in milliseconds
$devices = Device::with([
'deviceProfile',
@@ -391,81 +491,106 @@ class TelemetryController extends Controller
->select(['id', 'device_profile_xid', 'key_name', 'display_name', 'display_on_dashboard', 'display_on_popup']);
}
])->where('asset_id', $assetId)
->where('customer_id', $customerId)
->get();
->where('customer_id', $customerId)
->get();
if ($devices->isEmpty()) {
return response()->json(['error' => 'No devices found for the asset'], 404);
}
$response = $devices->map(function ($device) use ($startTs, $endTs) {
$response = $devices->map(function ($device) use ($startTsMs, $endTsMs) {
$keysData = $device->timeseriesKeys;
$keyNames = $keysData->pluck('key_name')->toArray();
$telemetryResponse = $this->customerInfoService->getTelemetryData($device, $keyNames, $startTs, $endTs);
// Get telemetry data for start and end times
$startTelemetry = $this->customerInfoService->getTelemetryData($device, $keyNames, $startTsMs, $startTsMs);
$endTelemetry = $this->customerInfoService->getTelemetryData($device, $keyNames, $endTsMs, $endTsMs);
$alarmMap = $this->getDeviceAlarmsForTelemetry($device->id);
$alertMessages = TimeseriesAlertMessage::whereIn('timeseries_key_master_xid', $keysData->pluck('id'))
->orderBy('min_value', 'asc')
->get()
->groupBy('timeseries_key_master_xid');
$telemetry = $keysData->map(function ($keyData) use ($telemetryResponse, $alarmMap, $alertMessages) {
return collect($telemetryResponse[$keyData->key_name] ?? [])->map(function ($item) use ($keyData, $alarmMap, $alertMessages) {
$keyName = $keyData->key_name;
$alert = isset($alarmMap[$keyName]);
$value = floatval($item['value'] ?? 0);
$colorCode = null;
// Default to grey if value is 0
if ($value == 0) {
$colorCode = "grey";
$telemetry = $keysData->map(function ($keyData) use ($startTelemetry, $endTelemetry, $alarmMap, $alertMessages) {
$startData = collect($startTelemetry[$keyData->key_name] ?? [])->last();
$endData = collect($endTelemetry[$keyData->key_name] ?? [])->last();
$startValue = floatval($startData['value'] ?? 0);
$endValue = floatval($endData['value'] ?? 0);
// Determine trend based on start vs end values
$trend = null;
if ($startValue > 0) {
if ($endValue > $startValue) {
$trend = 'upward';
} elseif ($endValue < $startValue) {
$trend = 'downward';
} else {
// Check alert messages for this key
if (isset($alertMessages[$keyData->id])) {
foreach ($alertMessages[$keyData->id] as $alertMsg) {
// If min_value or max_value is null, return null
if (is_null($alertMsg->min_value) || is_null($alertMsg->max_value)) {
$colorCode = 'green';
break;
}
$trend = 'stable';
}
}
if ($value >= floatval($alertMsg->min_value) && $value <= floatval($alertMsg->max_value)) {
$colorCode = $alertMsg->color_code;
break;
}
// Format timestamp properly (convert to seconds if in milliseconds)
if (!isset($currentData['ts'])) {
$timestamp = now()->timestamp;
} elseif (is_float($currentData['ts']) || $currentData['ts'] > 9999999999) {
$timestamp = intval($currentData['ts'] / 1000);
} else {
$timestamp = $currentData['ts'];
}
// Color code logic
$colorCode = null;
if ($endValue == 0) {
$colorCode = "grey";
} else {
if (isset($alertMessages[$keyData->id])) {
foreach ($alertMessages[$keyData->id] as $alertMsg) {
if (is_null($alertMsg->min_value) || is_null($alertMsg->max_value)) {
$colorCode = 'green';
break;
}
if ($endValue >= floatval($alertMsg->min_value) && $endValue <= floatval($alertMsg->max_value)) {
$colorCode = $alertMsg->color_code;
break;
}
}
}
}
return [
'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' => $value,
'alert' => $alert,
'color_code' => $colorCode, // Now handles null & grey cases
];
});
})->flatten(1);
return [
'key_name' => $keyData->key_name,
'display_name' => $keyData->display_name,
'display_on_dashboard' => $keyData->display_on_dashboard,
'display_on_popup' => $keyData->display_on_popup,
'timestamp' => $timestamp,
'value' => $endValue,
'start_value' => $startValue > 0 ? $startValue : null,
'trend' => $trend,
'alert' => isset($alarmMap[$keyData->key_name]),
'color_code' => $colorCode,
];
})->filter()->values();
return [
'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' => array_values($telemetry->toArray()),
'telemetry' => $telemetry,
];
});
return response()->json(['telemetry' => $response]);
return response()->json([
'telemetry' => $response,
'time_range' => [
'startTs' => intval($startTsMs / 1000), // Current period start (seconds)
'endTs' => intval($endTsMs / 1000), // Current period end (seconds)
]
]);
}
private function getDeviceAlarmsForTelemetry($deviceId)
{
Log::info("Fetching alarms for device: {$deviceId}");