sayliR #58

Merged
Sayli.Raut merged 5 commits from sayliR into main 2025-04-01 14:14:35 +00:00
3 changed files with 66 additions and 61 deletions

View File

@@ -256,12 +256,12 @@ class CustomerDeviceInfoController extends Controller
// 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']
$mechanicalHealthValue1 = isset($telemetryData['MechanicalHealth_valueInPercent'][0]['value'])
? (float) $telemetryData['MechanicalHealth_valueInPercent'][0]['value']
: null;
$engineEfficiencyValue1 = isset($telemetryData['EngineEfficiency_value'][0]['value'])
? (float) $telemetryData['EngineEfficiency_value'][0]['value']
$engineEfficiencyValue1 = isset($telemetryData['EngineEfficiency_valueInPercent'][0]['value'])
? (float) $telemetryData['EngineEfficiency_valueInPercent'][0]['value']
: null;
$engineEfficiencyValue4 = isset($telemetryData['EngineEfficiency_valueInHealth'][0]['value'])

View File

@@ -4,8 +4,11 @@ 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\TimeseriesAlertMessage;
use App\Models\TimeseriesKeyMaster;
use App\Models\User;
use App\Services\AlarmService;
use App\Services\CustomerInfoService;
use Illuminate\Container\Attributes\DB;
@@ -363,7 +366,8 @@ class TelemetryController extends Controller
public function telemetryDataAsset(Request $request)
{
Log::info("Received telemetryDataAsset request.", $request->all());
$token = readHeaderToken();
$customerId = User::where('id', $token['sub'])->value('customer_id');
$validator = Validator::make($request->all(), [
'asset_id' => 'required|string',
@@ -372,86 +376,89 @@ class TelemetryController extends Controller
]);
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
$startTs = $request->input('startTs') ?: now()->subHours(24)->timestamp * 1000;
$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)
$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()) {
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}");
$response = $devices->map(function ($device) use ($startTs, $endTs) {
$keysData = $device->timeseriesKeys;
$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;
$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;
if (isset($telemetryResponse[$keyName])) {
foreach ($telemetryResponse[$keyName] as $item) {
// Check if the telemetry key has an alarm
$alert = isset($alarmMap[$keyName]);
// 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;
}
$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
];
if ($value >= floatval($alertMsg->min_value) && $value <= floatval($alertMsg->max_value)) {
$colorCode = $alertMsg->color_code;
break;
}
}
}
}
}
}
$response[] = [
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), // Reset array index
'telemetry' => array_values($telemetry->toArray()),
];
Log::info("Processed telemetry for device ID: {$device->id}");
}
Log::info("Telemetry data successfully generated for asset ID: {$assetId}");
});
return response()->json(['telemetry' => $response]);
}
@@ -459,7 +466,6 @@ class TelemetryController extends Controller
private function getDeviceAlarmsForTelemetry($deviceId)
{
Log::info("Fetching alarms for device: {$deviceId}");
@@ -873,4 +879,4 @@ class TelemetryController extends Controller
// return response()->json(['telemetry' => $response]);
// }
}
}

View File

@@ -67,7 +67,6 @@ class CustomerInfoService
$token = $this->adminService->getToken();
if (!$token) {
Log::error('Failed to fetch ThingsBoard token');
return ['error' => 'Failed to fetch ThingsBoard token'];
}