Files
backend_vib360_laravel/app/Http/Controllers/APIS/CustomerApi/TelemetryController.php
2025-04-01 20:06:28 +05:30

917 lines
38 KiB
PHP

<?php
namespace App\Http\Controllers\APIS\CustomerApi;
use App\Http\Controllers\Controller;
use App\Models\Asset;
use App\Models\Device;
use App\Models\TimeseriesKeyMaster;
use App\Services\AlarmService;
use App\Services\CustomerInfoService;
use Illuminate\Container\Attributes\DB;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB as FacadesDB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;
class TelemetryController extends Controller
{
protected $customerInfoService, $alarmService;
// public function __construct(CustomerInfoService $customerInfoService)
// {
// $this->customerInfoService = $customerInfoService;
// }
public function __construct(CustomerInfoService $customerInfoService, AlarmService $alarmService)
{
$this->customerInfoService = $customerInfoService;
$this->alarmService = $alarmService; // 💡 Add AlarmService
}
// public function telemetryDataAsset(Request $request)
// {
// $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; // Default: last 24 hrs
// $endTs = $request->input('endTs') ?: now()->timestamp * 1000;
// $devices = Device::with('deviceProfile')
// ->where('asset_id', $assetId)
// ->get();
// if ($devices->isEmpty()) {
// return response()->json(['error' => 'No devices found for the asset'], 404);
// }
// $response = [];
// foreach ($devices as $device) {
// $filteredTelemetry = [];
// // Fetch telemetry data
// $keysData = TimeseriesKeyMaster::where('device_profile_xid', $device->device_profile_id)
// ->where('display_on_dashboard', 1)
// ->get(['key_name', 'display_name', 'display_on_dashboard', 'display_on_popup']);
// $keyNames = $keysData->pluck('key_name')->toArray();
// // Retrieve telemetry data
// $telemetryResponse = $this->customerInfoService->getTelemetryData($device, $keyNames, $startTs, $endTs);
// foreach ($keysData as $keyData) {
// $keyName = $keyData->key_name;
// if (isset($telemetryResponse[$keyName])) {
// foreach ($telemetryResponse[$keyName] as $item) {
// // 💡 Check alert status for each telemetry key
// $alert = $this->checkTelemetryKeyAlert($device->id, $keyName);
// $filteredTelemetry[] = [
// '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' => $item['value'] ?? null,
// 'alert' => $alert // ✅ Add alert status for each key
// ];
// }
// }
// }
// $response[] = [
// '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' => $filteredTelemetry,
// ];
// }
// return response()->json(['telemetry' => $response]);
// }
// public function telemetryDataAsset(Request $request)
// {
// $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') ?: null;
// $endTs = $request->input('endTs') ?: null;
// // Fetch devices associated with the asset
// $devices = Device::with('deviceProfile')
// ->where('asset_id', $assetId)
// ->get();
// if ($devices->isEmpty()) {
// return response()->json(['error' => 'No devices found for the asset'], 404);
// }
// $response = [];
// foreach ($devices as $device) {
// $telemetry = [];
// $keysData = TimeseriesKeyMaster::where('device_profile_xid', $device->device_profile_id)
// ->where(function ($query) {
// $query->where('display_on_dashboard', true)
// ->orWhere('display_on_popup', true);
// })
// ->get(['key_name', 'display_name', 'display_on_dashboard', 'display_on_popup']);
// $keyNames = $keysData->pluck('key_name')->toArray();
// // Log key names for debugging
// // Log::info('Key Names for Device', ['device_id' => $device->id, 'key_names' => $keyNames]);
// // Fetch telemetry data
// $telemetryResponse = $this->customerInfoService->getTelemetryData($device, $keyNames, $startTs, $endTs);
// foreach ($keysData as $keyData) {
// $keyName = $keyData->key_name;
// if (isset($telemetryResponse[$keyName])) {
// foreach ($telemetryResponse[$keyName] as $item) {
// $telemetry[] = [
// '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' => $item['value'] ?? null,
// ];
// }
// }
// }
// $response[] = [
// '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' => $telemetry,
// ];
// }
// return response()->json(['telemetry' => $response]);
// }
// public function telemetryDataAsset(Request $request)
// {
// $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; // Default: last 24 hrs
// $endTs = $request->input('endTs') ?: now()->timestamp * 1000;
// $devices = Device::with('deviceProfile')
// ->where('asset_id', $assetId)
// ->get();
// if ($devices->isEmpty()) {
// return response()->json(['error' => 'No devices found for the asset'], 404);
// }
// $response = [];
// foreach ($devices as $device) {
// $telemetry = [];
// // Fetch telemetry keys
// $keysData = TimeseriesKeyMaster::where('device_profile_xid', $device->device_profile_id)
// ->where(function ($query) {
// $query->where('display_on_dashboard', true)
// ->orWhere('display_on_popup', true);
// })
// ->get(['key_name', 'display_name', 'display_on_dashboard', 'display_on_popup']);
// $keyNames = $keysData->pluck('key_name')->toArray();
// // Fetch telemetry data
// $telemetryResponse = $this->customerInfoService->getTelemetryData($device, $keyNames, $startTs, $endTs);
// // Fetch alarms for the device and map by telemetry key
// $alarmMap = $this->getDeviceAlarmsForTelemetry($device->id);
// foreach ($keysData as $keyData) {
// $keyName = $keyData->key_name;
// if (isset($telemetryResponse[$keyName])) {
// foreach ($telemetryResponse[$keyName] as $item) {
// // Check if the telemetry key has an alarm
// $alert = isset($alarmMap[$keyName]);
// $telemetry[] = [
// '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' => $item['value'] ?? null,
// 'alert' => $alert // ✅ Display alert status
// ];
// }
// }
// }
// $response[] = [
// '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' => $telemetry,
// ];
// }
// return response()->json(['telemetry' => $response]);
// }
// public function telemetryDataAsset(Request $request)
// {
// Log::info("Received telemetryDataAsset request.", $request->all());
// $validator = Validator::make($request->all(), [
// 'asset_id' => 'required|string',
// 'startTs' => 'nullable|string',
// 'endTs' => 'nullable|string',
// ]);
// if ($validator->fails()) {
// Log::error("Validation failed: " . $validator->errors()->first());
// return jsonResponseWithErrorMessage($validator->errors()->first(), 400);
// }
// $assetId = $request->input('asset_id');
// $startTs = $request->input('startTs') ?: now()->subHours(24)->timestamp * 1000; // Default: last 24 hrs
// $endTs = $request->input('endTs') ?: now()->timestamp * 1000;
// Log::info("Telemetry time range: Start => {$startTs}, End => {$endTs}");
// // Fetch devices associated with the asset
// $devices = Device::with('deviceProfile')
// ->where('asset_id', $assetId)
// ->get();
// if ($devices->isEmpty()) {
// Log::warning("No devices found for asset ID: {$assetId}");
// return response()->json(['error' => 'No devices found for the asset'], 404);
// }
// Log::info("Found " . $devices->count() . " devices for asset ID: {$assetId}");
// $response = [];
// foreach ($devices as $device) {
// $telemetry = [];
// Log::info("Processing device ID: {$device->id}");
// // Fetch telemetry keys
// $keysData = TimeseriesKeyMaster::where('device_profile_xid', $device->device_profile_id)
// ->where(function ($query) {
// $query->where('display_on_dashboard', true)
// ->orWhere('display_on_popup', true);
// })
// ->get(['key_name', 'display_name', 'display_on_dashboard', 'display_on_popup']);
// Log::info("Fetched " . $keysData->count() . " telemetry keys for device ID: {$device->id}");
// $keyNames = $keysData->pluck('key_name')->toArray();
// // Fetch telemetry data
// $telemetryResponse = $this->customerInfoService->getTelemetryData($device, $keyNames, $startTs, $endTs);
// Log::info("Fetched telemetry data for device ID: {$device->id}");
// // Fetch alarms for the device and map by telemetry key
// $alarmMap = $this->getDeviceAlarmsForTelemetry($device->id);
// Log::info("Fetched alarms for device ID: {$device->id}", $alarmMap);
// foreach ($keysData as $keyData) {
// $keyName = $keyData->key_name;
// if (isset($telemetryResponse[$keyName])) {
// foreach ($telemetryResponse[$keyName] as $item) {
// // Check if the telemetry key has an alarm
// $alert = isset($alarmMap[$keyName]);
// $telemetry[] = [
// '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' => $item['value'] ?? null,
// 'alert' => $alert // ✅ Display alert status
// ];
// }
// }
// }
// $response[] = [
// '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' => $telemetry,
// ];
// Log::info("Processed telemetry for device ID: {$device->id}");
// }
// Log::info("Telemetry data successfully generated for asset ID: {$assetId}");
// return response()->json(['telemetry' => $response]);
// }
public function telemetryDataAsset(Request $request)
{
Log::info("Received telemetryDataAsset request.", $request->all());
$validator = Validator::make($request->all(), [
'asset_id' => 'required|string',
'startTs' => 'nullable|string',
'endTs' => 'nullable|string',
]);
if ($validator->fails()) {
Log::error("Validation failed: " . $validator->errors()->first());
return jsonResponseWithErrorMessage($validator->errors()->first(), 400);
}
$assetId = $request->input('asset_id');
$startTs = $request->input('startTs') ?: now()->subHours(24)->timestamp * 1000; // Default: last 24 hrs
$endTs = $request->input('endTs') ?: now()->timestamp * 1000;
Log::info("Telemetry time range: Start => {$startTs}, End => {$endTs}");
// Fetch devices associated with the asset
$devices = Device::with('deviceProfile')
->where('asset_id', $assetId)
->get();
if ($devices->isEmpty()) {
Log::warning("No devices found for asset ID: {$assetId}");
return response()->json(['error' => 'No devices found for the asset'], 404);
}
Log::info("Found " . $devices->count() . " devices for asset ID: {$assetId}");
$response = [];
foreach ($devices as $device) {
$telemetry = [];
Log::info("Processing device ID: {$device->id}");
// Fetch telemetry keys where display_on_dashboard is true
$keysData = TimeseriesKeyMaster::where('device_profile_xid', $device->device_profile_id)
->where('display_on_dashboard', true) // ✅ Only fetch keys where display_on_dashboard is true
->get(['key_name', 'display_name', 'display_on_dashboard', 'display_on_popup']);
Log::info("Fetched " . $keysData->count() . " telemetry keys for device ID: {$device->id}");
$keyNames = $keysData->pluck('key_name')->toArray();
// Fetch telemetry data
$telemetryResponse = $this->customerInfoService->getTelemetryData($device, $keyNames, $startTs, $endTs);
Log::info("Fetched telemetry data for device ID: {$device->id}");
// Fetch alarms for the device and map by telemetry key
$alarmMap = $this->getDeviceAlarmsForTelemetry($device->id);
Log::info("Fetched alarms for device ID: {$device->id}", $alarmMap);
foreach ($keysData as $keyData) {
$keyName = $keyData->key_name;
if (isset($telemetryResponse[$keyName])) {
foreach ($telemetryResponse[$keyName] as $item) {
// Check if the telemetry key has an alarm
$alert = isset($alarmMap[$keyName]);
$telemetry[] = [
'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' => $item['value'] ?? null,
'alert' => $alert // ✅ Display alert status
];
}
}
}
$response[] = [
'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), // Reset array index
];
Log::info("Processed telemetry for device ID: {$device->id}");
}
Log::info("Telemetry data successfully generated for asset ID: {$assetId}");
return response()->json(['telemetry' => $response]);
}
private function getDeviceAlarmsForTelemetry($deviceId)
{
Log::info("Fetching alarms for device: {$deviceId}");
$pageSize = 1000;
$page = 0;
// Fetch ThingsBoard token
$token = $this->alarmService->getToken();
if (!$token) {
Log::error("Failed to fetch ThingsBoard token.");
return [];
}
Log::info("Token fetched successfully.");
$baseUrl = env('THINGSBOARD_URL');
$endTime = now()->timestamp * 1000; // Current time in ms
$startTime = now()->subHours(24)->timestamp * 1000; // 24 hours ago in ms
Log::info("Time range: Start => {$startTime}, End => {$endTime}");
// Fetch alarms from ThingsBoard API
try {
$response = Http::withHeaders([
'Authorization' => "Bearer $token",
'Accept' => 'application/json',
])->get("$baseUrl/api/v2/alarms", [
'statusList' => 'ACTIVE',
'severityList' => 'CRITICAL,MAJOR,MINOR,WARNING',
'pageSize' => $pageSize,
'page' => $page,
'startTime' => $startTime,
'endTime' => $endTime,
'sortProperty' => 'createdTime',
'sortOrder' => 'DESC',
'originator' => $deviceId // Filter by device ID
]);
if (!$response->successful()) {
Log::error("Failed to fetch alarms. Status: " . $response->status());
return [];
}
// Parse the response
$alarms = $response->json()['data'] ?? [];
Log::info("Fetched " . count($alarms) . " alarms for device ID: {$deviceId}");
// Map alarms by `type` field
$alarmMap = [];
foreach ($alarms as $alarm) {
if (isset($alarm['type'])) {
$alarmMap[$alarm['type']] = true;
}
}
Log::info("Mapped alarm types: ", $alarmMap);
return $alarmMap;
} catch (\Exception $e) {
Log::error("Error fetching alarms: " . $e->getMessage());
return [];
}
}
// public function telemetryDataDevice(Request $request)
// {
// try {
// $token = readHeaderToken();
// if (!$token) {
// return response()->json([
// 'success' => false,
// 'error' => 'Authorization token required'
// ], 401);
// }
// $validator = Validator::make($request->all(), [
// 'device_id' => 'required|string',
// 'startTs' => 'nullable|string',
// 'endTs' => 'nullable|string',
// ]);
// if ($validator->fails()) {
// return response()->json([
// 'success' => false,
// 'error' => $validator->errors()->first()
// ], 400);
// }
// $deviceId = $request->input('device_id');
// $startTs = $request->input('startTs') ?: null;
// $endTs = $request->input('endTs') ?: null;
// try {
// $deviceWithTelemetry = Device::with([
// 'deviceProfile',
// 'timeseriesKeys' => function ($query) {
// $query->select('key_name', 'display_name', 'device_profile_xid', 'display_on_dashboard','display_on_dashboard');
// }
// ])
// ->where('id', $deviceId)
// ->firstOrFail();
// $telemetryResponse = $this->customerInfoService->getTelemetryDataDevice(
// $deviceWithTelemetry,
// $deviceWithTelemetry->timeseriesKeys->pluck('key_name')->toArray(),
// $startTs,
// $endTs,
// $token
// );
// if (!is_array($telemetryResponse)) {
// throw new \Exception("Invalid telemetry data format received from service");
// }
// $telemetry = collect($telemetryResponse)
// ->flatMap(function ($items, $keyName) use ($deviceWithTelemetry) {
// $displayName = $deviceWithTelemetry->timeseriesKeys
// ->firstWhere('key_name', $keyName)?->display_name ?? $keyName;
// return collect($items)->map(function ($item) use ($keyName, $displayName) {
// return [
// 'key_name' => $keyName,
// 'timestamp' => $item['ts'] ?? null,
// 'value' => $item['value'] ?? null,
// 'display_name' => $displayName,
// 'display_on_dashboard'
// ];
// });
// })
// ->values()
// ->all();
// return response()->json([
// 'success' => true,
// 'telemetry' => [
// 'device_id' => (string) $deviceWithTelemetry->id,
// 'device_name' => $deviceWithTelemetry->name,
// 'device_profile_name' => $deviceWithTelemetry->deviceProfile->name,
// 'device_profile_id' => (string) $deviceWithTelemetry->device_profile_id,
// 'telemetry_data' => $telemetry,
// ]
// ], 200);
// } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $e) {
// return response()->json([
// 'success' => false,
// 'error' => 'Device not found'
// ], 404);
// } catch (\Exception $e) {
// return response()->json([
// 'success' => false,
// 'error' => 'Failed to fetch telemetry data',
// 'details' => config('app.debug') ? $e->getMessage() : null
// ], 503);
// }
// } catch (\Exception $e) {
// return response()->json([
// 'success' => false,
// 'error' => 'Internal server error',
// 'details' => config('app.debug') ? $e->getMessage() : null
// ], 500);
// }
// }
public function telemetryDataDevice(Request $request)
{
try {
Log::info('Telemetry request received', ['request_data' => $request->all()]);
$token = readHeaderToken();
if (!$token) {
Log::warning('Unauthorized access attempt: Missing token');
return response()->json([
'success' => false,
'error' => 'Authorization token required'
], 401);
}
$validator = Validator::make($request->all(), [
'device_id' => 'required|string',
'startTs' => 'nullable|string',
'endTs' => 'nullable|string',
]);
if ($validator->fails()) {
Log::error('Validation failed', ['errors' => $validator->errors()]);
return response()->json([
'success' => false,
'error' => $validator->errors()->first()
], 400);
}
$deviceId = $request->input('device_id');
$startTs = $request->input('startTs') ?: null;
$endTs = $request->input('endTs') ?: null;
try {
Log::info('Fetching device telemetry', ['device_id' => $deviceId]);
$deviceWithTelemetry = Device::with([
'deviceProfile',
'timeseriesKeys' => function ($query) {
$query->where(function ($q) {
$q->where('display_on_dashboard', true)
->orWhere('display_on_popup', true);
})
->select('key_name', 'display_name', 'device_profile_xid', 'display_on_dashboard', 'display_on_popup');
}
])
->where('id', $deviceId)
->firstOrFail();
$displayKeys = $deviceWithTelemetry->timeseriesKeys->pluck('key_name')->toArray();
$deviceProfileName = strtolower($deviceWithTelemetry->deviceProfile->name ?? '');
Log::info('Device profile and keys retrieved', [
'device_profile' => $deviceProfileName,
'display_keys' => $displayKeys
]);
// Pressure key condition
$pressureKey = 'Pressure_value';
$pressureActive = false;
$telemetryResponse = $this->customerInfoService->getTelemetryDataDevice(
$deviceWithTelemetry,
$displayKeys,
$startTs,
$endTs,
$token
);
if (!is_array($telemetryResponse)) {
Log::error('Invalid telemetry data format received');
throw new \Exception("Invalid telemetry data format received from service");
}
// Check if the device has "Gas Engine Profile" or "Engine Profile" in its profile name
if (
(strpos($deviceProfileName, 'gas engine profile') !== false || strpos($deviceProfileName, 'engine profile') !== false)
&& isset($telemetryResponse[$pressureKey])
&& is_array($telemetryResponse[$pressureKey])
) {
foreach ($telemetryResponse[$pressureKey] as $pressureData) {
if (!empty($pressureData['value']) && floatval($pressureData['value']) > 0) {
$pressureActive = true;
break;
}
}
}
Log::info('Telemetry data processed', [
'pressure_value' => $pressureActive,
'telemetry_keys' => array_keys($telemetryResponse)
]);
// Filter telemetry data based on display keys
$filteredResponse = array_intersect_key($telemetryResponse, array_flip($displayKeys));
// Add Pressure key if condition is met
if (isset($telemetryResponse[$pressureKey])) {
$filteredResponse[$pressureKey] = $telemetryResponse[$pressureKey];
}
$telemetry = collect($filteredResponse)
->flatMap(function ($items, $keyName) use ($deviceWithTelemetry) {
$keyData = $deviceWithTelemetry->timeseriesKeys->firstWhere('key_name', $keyName);
return collect($items)->map(function ($item) use ($keyName, $keyData) {
return [
'key_name' => $keyName,
'timestamp' => $item['ts'] ?? null,
'value' => $item['value'] ?? null,
'display_name' => $keyData->display_name ?? $keyName,
'display_on_dashboard' => $keyData->display_on_dashboard ?? false,
'display_on_popup' => $keyData->display_on_popup ?? false
];
});
})
->values()
->all();
Log::info('Telemetry response successfully generated', ['device_id' => $deviceId]);
return response()->json([
'success' => true,
'telemetry' => [
'device_id' => (string) $deviceWithTelemetry->id,
'device_name' => $deviceWithTelemetry->name,
'device_profile_name' => $deviceWithTelemetry->deviceProfile->name,
'device_profile_id' => (string) $deviceWithTelemetry->device_profile_id,
'pressure_value' => $pressureActive, // Updated response
'telemetry_data' => $telemetry,
]
], 200);
} catch (\Illuminate\Database\Eloquent\ModelNotFoundException $e) {
Log::error('Device not found', ['device_id' => $deviceId]);
return response()->json([
'success' => false,
'error' => 'Device not found'
], 404);
} catch (\Exception $e) {
Log::error('Failed to fetch telemetry data', [
'device_id' => $deviceId,
'error' => $e->getMessage()
]);
return response()->json([
'success' => false,
'error' => 'Failed to fetch telemetry data',
'details' => config('app.debug') ? $e->getMessage() : null
], 503);
}
} catch (\Exception $e) {
Log::critical('Internal server error', ['error' => $e->getMessage()]);
return response()->json([
'success' => false,
'error' => 'Internal server error',
'details' => config('app.debug') ? $e->getMessage() : null
], 500);
}
}
// public function telemetryDataDeviceDiagnostic(Request $request, $deviceId)
// {
// $devices = Device::with('deviceProfile')
// ->where('id', $deviceId)
// ->get();
// if ($devices->isEmpty()) {
// return response()->json(['error' => 'No devices found'], 404);
// }
// $startTs = $request->has('start_date') ? strtotime($request->start_date) * 1000 : null;
// $endTs = $request->has('end_date') ? strtotime($request->end_date) * 1000 : null;
// $response = [];
// foreach ($devices as $device) {
// $telemetry = [];
// $keyNames = TimeseriesKeyMaster::where('device_profile_xid', $device->device_profile_id)
// ->pluck('key_name', 'display_name')
// ->toArray();
// $telemetryResponse = $this->customerInfoService->getTelemetryDataDeviceDiagonostic($device, $keyNames, $startTs, $endTs);
// foreach ($keyNames as $keyName) {
// if (isset($telemetryResponse[$keyName])) {
// foreach ($telemetryResponse[$keyName] as $item) {
// $timestamp = $item['ts'] ?? null;
// // ✅ Filter telemetry by timestamp range
// if ($timestamp && $timestamp >= $startTs && $timestamp <= $endTs) {
// $telemetry[] = [
// 'key_name' => $keyName,
// 'timestamp' => $timestamp,
// 'start_date' => $startTs,
// 'end_date' => $endTs,
// 'value' => $item['value'] ?? null,
// 'display_name' => $keyName,
// ];
// }
// }
// }
// }
// if (!empty($telemetry)) {
// $response[] = [
// 'device_id' => (string) $device->id,
// 'device_name' => $device->name,
// 'device_profile_name' => (string) $device->deviceProfile->name,
// 'device_profile_id' => (string) $device->device_profile_id,
// 'telemetry' => $telemetry,
// ];
// }
// }
// return response()->json(['telemetry' => $response]);
// }
// public function telemetryDataDeviceDiagnostic(Request $request, $deviceId)
// {
// // Fetch devices
// $devices = Device::with('deviceProfile')
// ->where('id', $deviceId)
// ->get();
// if ($devices->isEmpty()) {
// return response()->json(['error' => 'No devices found'], 404);
// }
// // Get start and end timestamps from request parameters
// $startTs = $request->has('start_date') ? strtotime($request->start_date) * 1000 : null;
// $endTs = $request->has('end_date') ? strtotime($request->end_date) * 1000 : null;
// if (!$startTs || !$endTs) {
// return response()->json(['error' => 'Start date and end date are required'], 400);
// }
// $response = [];
// foreach ($devices as $device) {
// $telemetry = [];
// $keyNames = TimeseriesKeyMaster::where('device_profile_xid', $device->device_profile_id)
// ->pluck('key_name', 'display_name')
// ->toArray();
// $telemetryResponse = $this->customerInfoService->getTelemetryDataDeviceDiagonostic($device, $keyNames, $startTs, $endTs);
// foreach ($keyNames as $displayName => $keyName) {
// if (isset($telemetryResponse[$keyName])) {
// foreach ($telemetryResponse[$keyName] as $item) {
// $itemTs = $item['timestamp'] ?? null;
// // ✅ Filter only telemetry within the date range
// if ($itemTs >= $startTs && $itemTs <= $endTs) {
// $telemetry[] = [
// 'key_name' => $keyName,
// 'value' => $item['value'] ?? null,
// 'display_name' => $displayName,
// 'timestamp' => $itemTs,
// 'start_date' => $startTs,
// 'end_date' => $endTs
// ];
// }
// }
// }
// }
// if (!empty($telemetry)) {
// $response[] = [
// 'device_id' => (string) $device->id,
// 'device_name' => $device->name,
// 'device_profile_name' => (string) $device->deviceProfile->name,
// 'device_profile_id' => (string) $device->device_profile_id,
// 'telemetry' => $telemetry,
// ];
// }
// }
// return response()->json(['telemetry' => $response]);
// }
}