user()->can('maintenance.view')) { abort(403); } $business_id = $request->session()->get('user.business_id'); $devices = IotDevice::where('business_id', $business_id)->get(); $alerts = IotAlert::where('business_id', $business_id)->where('status', 'open')->latest('id')->limit(20)->get(); return view('maintenance::iot.index', compact('devices', 'alerts')); } public function ingest(Request $request, IotIngestionService $ingestion) { $validated = $request->validate([ 'business_id' => 'required|integer', 'device_uid' => 'required|string', 'readings' => 'required|array', 'readings.*.metric' => 'required|string', 'readings.*.value' => 'required|numeric', ]); $ingestion->ingest((int) $validated['business_id'], $validated['device_uid'], $validated['readings']); return response()->json(['success' => true]); } public function storeDevice(Request $request) { if (! auth()->user()->can('maintenance.equipment.update')) { abort(403); } $business_id = $request->session()->get('user.business_id'); $validated = $request->validate([ 'device_uid' => 'required|string|max:100', 'name' => 'required|string|max:255', 'protocol' => 'required|in:mqtt,opcua,http,modbus', 'equipment_id' => 'nullable|integer', 'topic' => 'nullable|string', ]); IotDevice::create(array_merge($validated, ['business_id' => $business_id])); return redirect()->back()->with('status', ['success' => 1, 'msg' => __('maintenance::lang.iot_device_created')]); } public function storeRule(Request $request) { if (! auth()->user()->can('maintenance.equipment.update')) { abort(403); } $business_id = $request->session()->get('user.business_id'); $validated = $request->validate([ 'equipment_id' => 'nullable|integer', 'metric' => 'required|string|max:100', 'operator' => 'required|in:gt,lt,gte,lte,eq', 'threshold' => 'required|numeric', 'auto_work_order' => 'nullable|boolean', ]); IotPredictiveRule::create(array_merge($validated, [ 'business_id' => $business_id, 'auto_work_order' => $request->boolean('auto_work_order'), ])); return redirect()->back()->with('status', ['success' => 1, 'msg' => __('maintenance::lang.iot_rule_created')]); } }