When devices are synced from a peer, they now retain their original
source scanner reference. This ensures:
- Device positions are calculated relative to the scanner that
detected them, not the local scanner
- Moving the local scanner won't affect synced devices' positions
- Popup shows "Source: <scanner_id>" for remotely-synced devices
Database changes:
- Added source_scanner_id, source_scanner_lat, source_scanner_lon
columns to devices table
- get_devices_since() includes source scanner info in sync data
- bulk_update_devices() accepts and stores source scanner position
- Added get_all_device_sources() method
API changes:
- /api/sync/devices GET includes scanner_lat and scanner_lon
- /api/sync/devices POST accepts source_scanner_lat/lon
- /api/device/floors includes sources dict
Frontend changes:
- loadDevicePositions() loads source scanner info
- getDevicePosition() uses source scanner position for synced devices
- Popup shows source scanner info for remotely-synced devices
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>