Unable to use solaar cli commands when the device is connected through bluetooth
Created by: IgorSamurovic
I want to use solaar cli to change host to another machine, like so:
solaar config "MX Keys Mini" change-host 3
solaar config "MX Anywhere" change-host 3
However, this only works if those devices are connected through the dongle. If they are connected through bluetooth, I am unable to do this and am getting this error:
igor@igor-pc:~/Documents/Scripts$ solaar config "MX Anywhere 3" change-host 3
solaar: error: Traceback (most recent call last):
File "/usr/share/solaar/lib/solaar/cli/__init__.py", line 204, in run
m.run(c, args, _find_receiver, _find_device)
File "/usr/share/solaar/lib/solaar/cli/config.py", line 124, in run
raise Exception("no online device found matching '%s'" % device_name)
Exception: no online device found matching 'mx anywhere 3'
I tried using other identifiers (like serial number) to make this work, to no avail. Even if the device shows up through solaar show
, attempts to run commands fail.
When I use this same functionality through the UI, the host is changed perfectly in 100% of cases, whether the device is connected through usb dongle or bluetooth. Also, worth noting, this happens both with the unifying receiver and bolt, so it does not seem to be receiver-specific. I suspect (as per error) that this would work through CLI, if the CLI utility "knew" about those devices, but it looks like it is unable to find them while the UI application can. I have not gone into code to see how they differ, so I might be shooting in the dark here.
Software info: Solaar: 1.1.1 System: Ubuntu 22.04.2 LTS Architecture: x86_64 Python: 3.10.6 Xorg: 1.21.1.3
Info about devices:
USB and Bluetooth Devices
1: MX Anywhere 3
Device path : /dev/hidraw4
USB id : 046d:B025
Codename : MX Anywhere 3
Kind : mouse
Protocol : HID++ 4.5
Serial number: ?
Model ID: B02540900000
Unit ID: 89BDFCBF
Bootloader: BL1 13.01.B0015
Firmware: MPM 24.01.B0015
Other:
Supports 31 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
Firmware: Bootloader BL1 13.01.B0015 0000AACD8D78
Firmware: Firmware MPM 24.01.B0015 B025AACD8D78
Firmware: Other
Unit ID: 89BDFCBF Model ID: B02540900000 Transport IDs: {'btleid': 'B025', 'wpid': '4090'}
3: DEVICE NAME {0005}
Name: MX Anywhere 3
Kind: mouse
4: WIRELESS DEVICE STATUS {1D4B}
5: RESET {0020}
6: CRYPTO ID {0021}
7: DEVICE FRIENDLY NAME {0007}
Friendly Name: MX Anywhere 3
8: UNIFIED BATTERY {1004}
9: REPROG CONTROLS V4 {1B04}
Key/Button Actions (saved): {'196': 82, '80': 80, '81': 81, '82': 196, '83': 83, '86': 86}
Key/Button Actions : {'80': 80, '81': 81, '82': 196, '83': 83, '86': 86, '196': 82}
Key/Button Diversion (saved): {'196': 0, '82': 0, '83': 1, '86': 1}
Key/Button Diversion : {'82': 0, '83': 1, '86': 1, '196': 0}
10: CHANGE HOST {1814}
Change Host : 2:igor-pc
11: XY STATS {2250}
12: ADJUSTABLE DPI {2201}
Sensitivity (DPI) (saved): 4000
Sensitivity (DPI) : 4000
13: SMART SHIFT ENHANCED {2111}
Scroll Wheel Rachet (saved): 50
Scroll Wheel Rachet : 50
14: HIRES WHEEL {2121}
Multiplier: 15
Has invert: Normal wheel motion
Has ratchet switch: Normal wheel mode
Low resolution mode
HID notification
Scroll Wheel Direction (saved): False
Scroll Wheel Direction : False
Scroll Wheel Resolution (saved): False
Scroll Wheel Resolution : False
15: WHEEL STATS {2251}
16: DFUCONTROL SIGNED {00C2}
17: DEVICE RESET {1802} internal, hidden
18: unknown:1803 {1803} internal, hidden
19: CONFIG DEVICE PROPS {1806} internal, hidden
20: unknown:1812 {1812} internal, hidden
21: OOBSTATE {1805} internal, hidden
22: unknown:1830 {1830} internal, hidden
23: unknown:18A1 {18A1} internal, hidden
24: unknown:1E00 {1E00} hidden
25: unknown:1EB0 {1EB0} internal, hidden
26: unknown:1861 {1861} internal, hidden
27: unknown:9300 {9300} internal, hidden
28: unknown:9001 {9001} internal, hidden
29: unknown:1E22 {1E22} internal, hidden
30: unknown:9205 {9205} internal, hidden
Has 7 reprogrammable keys:
0: Left Button , default: Left Click => Left Click
mse, analytics key events, pos:0, group:1, group mask:g1
reporting: default
1: Right Button , default: Right Click => Right Click
mse, analytics key events, pos:0, group:1, group mask:g1
reporting: default
2: Middle Button , default: Mouse Middle Button => Smart Shift
mse, reprogrammable, divertable, raw XY, analytics key events, pos:0, group:2, group mask:g1,g2
reporting: default
3: Back Button , default: Mouse Back Button => Mouse Back Button
mse, reprogrammable, divertable, raw XY, analytics key events, unknown:000800, pos:0, group:2, group mask:g1,g2
reporting: diverted
4: Forward Button , default: Mouse Forward Button => Mouse Forward Button
mse, reprogrammable, divertable, raw XY, analytics key events, unknown:000800, pos:0, group:2, group mask:g1,g2
reporting: diverted
5: Smart Shift , default: Smart Shift => Mouse Middle Button
mse, reprogrammable, divertable, raw XY, analytics key events, pos:0, group:2, group mask:g1,g2
reporting: default
6: Virtual Gesture Button , default: Virtual Gesture Button => Virtual Gesture Button
divertable, virtual, raw XY, force raw XY, pos:0, group:3, group mask:empty
reporting: default
Battery: 50%, discharging.
2: MX Keys Mini
Device path : /dev/hidraw14
USB id : 046d:B369
Codename : MX Keys Mini
Kind : ?
Protocol : HID++ 4.5
Serial number: ?
Model ID: B36900000000
Unit ID: E08AE7C9
Bootloader: BL1 53.00.B0004
Firmware: RBK 73.00.B0004
Other:
Supports 32 HID++ 2.0 features:
0: ROOT {0000}
1: FEATURE SET {0001}
2: DEVICE FW VERSION {0003}
Firmware: Bootloader BL1 53.00.B0004 B369CF1E27F2
Firmware: Firmware RBK 73.00.B0004 B369CF1E27F2
Firmware: Other
Unit ID: E08AE7C9 Model ID: B36900000000 Transport IDs: {'btleid': 'B369'}
3: DEVICE NAME {0005}
Name: MX Keys Mini
Kind: keyboard
4: WIRELESS DEVICE STATUS {1D4B}
5: RESET {0020}
6: DEVICE FRIENDLY NAME {0007}
Friendly Name: MX Keys Mini
7: UNIFIED BATTERY {1004}
8: REPROG CONTROLS V4 {1B04}
Key/Button Diversion (saved): {'226': 0, '227': 0, '229': 0, '231': 0, '232': 0, '233': 0, '259': 0, '264': 0, '266': 0, '279': 0, '284': 0}
Key/Button Diversion : {'226': 0, '227': 0, '259': 0, '264': 0, '266': 0, '284': 0, '229': 0, '231': 0, '232': 0, '233': 0, '279': 0}
9: CHANGE HOST {1814}
Change Host : 2:igor-pc
10: HOSTS INFO {1815}
Host 0 (paired): igor-pc
Host 1 (paired): igor-pc
Host 2 (paired): DTDLU555
11: BACKLIGHT2 {1982}
Backlight (saved): False
Backlight : False
12: K375S FN INVERSION {40A3}
Swap Fx function (saved): True
Swap Fx function : True
13: LOCK KEY STATE {4220}
14: KEYBOARD DISABLE KEYS {4521}
Disable keys (saved): {'1': False, '16': False, '8': False}
Disable keys : {'1': False, '8': False, '16': False}
15: MULTIPLATFORM {4531}
Set OS (saved): 3
Set OS : Android
16: unknown:00C3 {00C3}
17: DEVICE RESET {1802} internal, hidden, unknown:000010
18: unknown:1803 {1803} internal, hidden, unknown:000010
19: CONFIG DEVICE PROPS {1806} internal, hidden, unknown:000010
20: unknown:1816 {1816} internal, hidden, unknown:000010
21: OOBSTATE {1805} internal, hidden
22: unknown:1830 {1830} internal, hidden, unknown:000010
23: unknown:1891 {1891} internal, hidden, unknown:000008
24: unknown:18A1 {18A1} internal, hidden, unknown:000010
25: unknown:1E00 {1E00} hidden
26: unknown:1E02 {1E02} internal, hidden
27: unknown:1602 {1602}
28: unknown:1EB0 {1EB0} internal, hidden, unknown:000010
29: unknown:1861 {1861} internal, hidden, unknown:000010
30: unknown:1A20 {1A20} internal, hidden, unknown:000010
31: unknown:18B0 {18B0} internal, hidden, unknown:000010
Has 16 reprogrammable keys:
0: Host Switch Channel 1 , default: HostSwitch Channel 1 => HostSwitch Channel 1
is FN, FN sensitive, analytics key events, pos:1, group:0, group mask:empty
reporting: default
1: Host Switch Channel 2 , default: HostSwitch Channel 2 => HostSwitch Channel 2
is FN, FN sensitive, analytics key events, pos:2, group:0, group mask:empty
reporting: default
2: Host Switch Channel 3 , default: HostSwitch Channel 3 => HostSwitch Channel 3
is FN, FN sensitive, analytics key events, pos:3, group:0, group mask:empty
reporting: default
3: Backlight Down , default: Backlight Down => Backlight Down
is FN, FN sensitive, reprogrammable, divertable, analytics key events, pos:4, group:0, group mask:empty
reporting: default
4: Backlight Up , default: Backlight Up => Backlight Up
is FN, FN sensitive, reprogrammable, divertable, analytics key events, pos:5, group:0, group mask:empty
reporting: default
5: Show Desktop Fn , default: unknown:00D8 => unknown:00D8
is FN, FN sensitive, reprogrammable, divertable, analytics key events, pos:6, group:0, group mask:empty
reporting: default
6: Backlight Down Fn , default: LedToggle => LedToggle
is FN, FN sensitive, reprogrammable, divertable, analytics key events, pos:7, group:0, group mask:empty
reporting: default
7: Screenshot , default: unknown:00DF => unknown:00DF
is FN, FN sensitive, reprogrammable, divertable, analytics key events, pos:8, group:0, group mask:empty
reporting: default
8: Backlight Up Fn , default: unknown:00F1 => unknown:00F1
is FN, FN sensitive, reprogrammable, divertable, analytics key events, pos:9, group:0, group mask:empty
reporting: default
9: Play/Pause Fn , default: Play/Pause => Play/Pause
is FN, FN sensitive, reprogrammable, divertable, analytics key events, pos:10, group:0, group mask:empty
reporting: default
10: Mute Fn , default: Mute => Mute
is FN, FN sensitive, reprogrammable, divertable, analytics key events, pos:11, group:0, group mask:empty
reporting: default
11: Volume Down Fn , default: Volume Down => Volume Down
is FN, FN sensitive, reprogrammable, divertable, analytics key events, pos:12, group:0, group mask:empty
reporting: default
12: Volume Up Fn , default: Volume Up => Volume Up
nonstandard, reprogrammable, divertable, analytics key events, pos:13, group:0, group mask:empty
reporting: default
13: Lock Fn , default: unknown:00EC => unknown:00EC
nonstandard, reprogrammable, divertable, analytics key events, pos:14, group:0, group mask:empty
reporting: default
14: F Lock , default: Do Nothing One => Do Nothing One
is FN, analytics key events, pos:0, group:0, group mask:empty
reporting: default
15: unknown:0034 , default: Do Nothing One => Do Nothing One
nonstandard, analytics key events, pos:0, group:0, group mask:empty
reporting: default
Battery: 85%, discharging.
Upgraded to 1.1.8, now I am getting this error:
Setting change-host of MX Keys Mini to 3:
solaar: error: Traceback (most recent call last):
File "/usr/share/solaar/lib/solaar/cli/__init__.py", line 209, in run
m.run(c, args, _find_receiver, _find_device)
File "/usr/share/solaar/lib/solaar/cli/config.py", line 150, in run
for dev in find_device(receivers, device_name):
File "/usr/share/solaar/lib/solaar/cli/__init__.py", line 170, in _find_device
for dev in r:
File "/usr/share/solaar/lib/logitech_receiver/receiver.py", line 297, in __iter__
dev = self.__getitem__(number)
File "/usr/share/solaar/lib/logitech_receiver/receiver.py", line 314, in __getitem__
return self.register_new_device(key)
File "/usr/share/solaar/lib/logitech_receiver/receiver.py", line 241, in register_new_device
dev = Device(self, number, notification)
File "/usr/share/solaar/lib/logitech_receiver/device.py", line 100, in __init__
self.path = _hid.find_paired_node(receiver.path, number, 1) if receiver else info.path
File "/usr/share/solaar/lib/hidapi/udev.py", line 208, in find_paired_node
dev_phys = dev.find_parent('hid').get('HID_PHYS')
AttributeError: 'NoneType' object has no attribute 'get'
I should mention that the keyboard's host is now changed! However now running two quick commands in a succession doesn't work, so it only moves the keyboard and not the mouse, will be doing some research on that once I have some time.