@@ -463,46 +463,49 @@ def getDeviceData(self, mac, period=""):
463463
464464 # Fetch device info + computed fields
465465 sql = f"""
466- SELECT
467- d.*,
468- CASE
469- WHEN d.devAlertDown != 0 AND d.devPresentLastScan = 0 THEN 'Down'
470- WHEN d.devPresentLastScan = 1 THEN 'On-line'
471- ELSE 'Off-line'
472- END AS devStatus,
473-
474- (SELECT COUNT(*) FROM Sessions
475- WHERE ses_MAC = d.devMac AND (
476- ses_DateTimeConnection >= { period_date_sql } OR
477- ses_DateTimeDisconnection >= { period_date_sql } OR
478- ses_StillConnected = 1
479- )) AS devSessions,
480-
481- (SELECT COUNT(*) FROM Events
482- WHERE eve_MAC = d.devMac AND eve_DateTime >= { period_date_sql }
483- AND eve_EventType NOT IN ('Connected','Disconnected')) AS devEvents,
484-
485- (SELECT COUNT(*) FROM Events
486- WHERE eve_MAC = d.devMac AND eve_DateTime >= { period_date_sql }
487- AND eve_EventType = 'Device Down') AS devDownAlerts,
488-
489- (SELECT CAST(MAX(0, SUM(
490- julianday(IFNULL(ses_DateTimeDisconnection,'{ now } ')) -
491- julianday(CASE WHEN ses_DateTimeConnection < { period_date_sql }
492- THEN { period_date_sql } ELSE ses_DateTimeConnection END)
493- ) * 24) AS INT)
494- FROM Sessions
495- WHERE ses_MAC = d.devMac
496- AND ses_DateTimeConnection IS NOT NULL
497- AND (ses_DateTimeDisconnection IS NOT NULL OR ses_StillConnected = 1)
498- AND (ses_DateTimeConnection >= { period_date_sql }
499- OR ses_DateTimeDisconnection >= { period_date_sql } OR ses_StillConnected = 1)
500- ) AS devPresenceHours
501-
502- FROM Devices d
503- WHERE d.devMac = ? OR CAST(d.rowid AS TEXT) = ?
466+ SELECT
467+ d.*,
468+ LOWER(d.devMac) AS devMac,
469+ LOWER(d.devParentMAC) AS devParentMAC,
470+ CASE
471+ WHEN d.devAlertDown != 0 AND d.devPresentLastScan = 0 THEN 'Down'
472+ WHEN d.devPresentLastScan = 1 THEN 'On-line'
473+ ELSE 'Off-line'
474+ END AS devStatus,
475+
476+ (SELECT COUNT(*) FROM Sessions
477+ WHERE LOWER(ses_MAC) = LOWER(d.devMac) AND (
478+ ses_DateTimeConnection >= { period_date_sql } OR
479+ ses_DateTimeDisconnection >= { period_date_sql } OR
480+ ses_StillConnected = 1
481+ )) AS devSessions,
482+
483+ (SELECT COUNT(*) FROM Events
484+ WHERE LOWER(eve_MAC) = LOWER(d.devMac) AND eve_DateTime >= { period_date_sql }
485+ AND eve_EventType NOT IN ('Connected','Disconnected')) AS devEvents,
486+
487+ (SELECT COUNT(*) FROM Events
488+ WHERE LOWER(eve_MAC) = LOWER(d.devMac) AND eve_DateTime >= { period_date_sql }
489+ AND eve_EventType = 'Device Down') AS devDownAlerts,
490+
491+ (SELECT CAST(MAX(0, SUM(
492+ julianday(IFNULL(ses_DateTimeDisconnection,'{ now } ')) -
493+ julianday(CASE WHEN ses_DateTimeConnection < { period_date_sql }
494+ THEN { period_date_sql } ELSE ses_DateTimeConnection END)
495+ ) * 24) AS INT)
496+ FROM Sessions
497+ WHERE LOWER(ses_MAC) = LOWER(d.devMac)
498+ AND ses_DateTimeConnection IS NOT NULL
499+ AND (ses_DateTimeDisconnection IS NOT NULL OR ses_StillConnected = 1)
500+ AND (ses_DateTimeConnection >= { period_date_sql }
501+ OR ses_DateTimeDisconnection >= { period_date_sql } OR ses_StillConnected = 1)
502+ ) AS devPresenceHours
503+
504+ FROM Devices d
505+ WHERE LOWER(d.devMac) = LOWER(?) OR CAST(d.rowid AS TEXT) = ?
504506 """
505507
508+
506509 conn = get_temp_db_connection ()
507510 cur = conn .cursor ()
508511 cur .execute (sql , (mac , mac ))
@@ -818,9 +821,9 @@ def updateDeviceColumn(self, mac, column_name, column_value):
818821 conn = get_temp_db_connection ()
819822 cur = conn .cursor ()
820823
821- # Build safe SQL with column name
822- sql = f"UPDATE Devices SET { column_name } =? WHERE devMac=?"
823- cur .execute (sql , (column_value , mac ))
824+ # Convert the MAC to lowercase for comparison
825+ sql = f"UPDATE Devices SET { column_name } =? WHERE LOWER( devMac) =?"
826+ cur .execute (sql , (column_value , mac . lower () ))
824827 conn .commit ()
825828
826829 if cur .rowcount > 0 :
@@ -831,6 +834,7 @@ def updateDeviceColumn(self, mac, column_name, column_value):
831834 conn .close ()
832835 return result
833836
837+
834838 def lockDeviceField (self , mac , field_name ):
835839 """Lock a device field so it won't be overwritten by plugins."""
836840 if field_name not in FIELD_SOURCE_MAP :
0 commit comments