861 lines
35 KiB
PHP
861 lines
35 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\APIS\CustomerApi;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Asset;
|
|
use App\Models\Customer;
|
|
use App\Models\Device;
|
|
use App\Models\TimeseriesKeyMaster;
|
|
use App\Models\User;
|
|
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)
|
|
{
|
|
$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(['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 = TimeseriesKeyMaster::where('device_profile_xid', $device->device_profile_id)
|
|
->where('display_on_dashboard', true)
|
|
->get(['key_name', 'display_name', 'display_on_dashboard', 'display_on_popup']);
|
|
|
|
|
|
$keyNames = $keysData->pluck('key_name')->toArray();
|
|
$telemetryResponse = $this->customerInfoService->getTelemetryData($device, $keyNames, $startTs, $endTs);
|
|
|
|
$alarmMap = $this->getDeviceAlarmsForTelemetry($device->id);
|
|
|
|
// Use map() instead of foreach
|
|
$telemetry = $keysData->map(function ($keyData) use ($telemetryResponse, $alarmMap) {
|
|
$keyName = $keyData->key_name;
|
|
$alert = isset($alarmMap[$keyName]);
|
|
|
|
return collect($telemetryResponse[$keyName] ?? [])->map(fn($item) => [
|
|
'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
|
|
]);
|
|
})->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]);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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 {
|
|
$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->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();
|
|
|
|
if (empty($displayKeys)) {
|
|
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' => [],
|
|
]
|
|
], 200);
|
|
}
|
|
|
|
$telemetryResponse = $this->customerInfoService->getTelemetryDataDevice(
|
|
$deviceWithTelemetry,
|
|
$displayKeys,
|
|
$startTs,
|
|
$endTs,
|
|
$token
|
|
);
|
|
|
|
|
|
|
|
if (!is_array($telemetryResponse)) {
|
|
throw new \Exception("Invalid telemetry data format received from service");
|
|
}
|
|
|
|
$filteredResponse = array_intersect_key($telemetryResponse, array_flip($displayKeys));
|
|
|
|
$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();
|
|
|
|
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 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]);
|
|
// }
|
|
|
|
}
|