'array', 'last_seen' => 'datetime', 'is_active' => 'boolean', 'signal_strength' => 'integer' ]; // Relasi ke sensors public function sensors(): HasMany { return $this->hasMany(Sensor::class); } // Relasi ke sensor readings public function sensorReadings(): HasMany { return $this->hasMany(SensorReading::class); } // Relasi ke activity logs public function activityLogs(): HasMany { return $this->hasMany(ActivityLog::class); } // Relasi ke alerts public function alerts(): HasMany { return $this->hasMany(Alert::class); } // Scope untuk device online public function scopeOnline($query) { return $query->where('status', 'online'); } // Scope untuk device aktif public function scopeActive($query) { return $query->where('is_active', true); } /** * Cek apakah device benar-benar online berdasarkan last_seen (dalam 2 menit terakhir) */ public function getIsOnlineAttribute(): bool { if (!$this->last_seen) { return false; } return $this->last_seen->diffInMinutes(now()) <= 2; } /** * Update status device ke online dan catat last_seen */ public static function markOnline(int $deviceId): void { static::where('id', $deviceId)->update([ 'status' => 'online', 'last_seen' => now(), ]); } // Accessor untuk status badge color public function getStatusColorAttribute() { return match($this->status) { 'online' => 'green', 'offline' => 'red', 'maintenance' => 'yellow', default => 'gray' }; } }