Repository: pwr-Solaar/Solaar

Issue:
K600 keyboard natural scrolling and persistent key/button mapping issue
**Information**
<!-- Make sure that your issue is not one of the known issues in the Solaar documentation at https://pwr-solaar.github.io/Solaar/ -->
<!-- Do not bother opening an issue for a version older than 1.1.0.  Upgrade to the latest version and see if your issue persists. -->
<!-- If you not running the current version of Solaar, strongly consider upgrading to the newest version. -->
- Solaar version (`solaar --version` or `git describe --tags` if cloned from this repository): solaar 1.1.3rc2
- Distribution: Linux Mint 20.3 Cinnamon
- Kernel version (ex. `uname -srmo`): Linux 5.16.15-051615-generic x86_64 GNU/Linux
- Output of `solaar show`:

<details>

```
Solaar version 1.1.3rc2

Unifying Receiver
  Device path  : /dev/hidraw0
  USB id       : 046d:C52B
  Serial       : 6FF69CDA
    Firmware   : 24.11.B0036
    Bootloader : 02.09
    Other      : AA.E5
  Has 1 paired device(s) out of a maximum of 6.
  Notifications: wireless, software present (0x000900)
  Device activity counters: 1=62

  1: Keyboard K600 TV
     Device path  : /dev/hidraw2
     WPID         : 4078
     Codename     : K600 TV
     Kind         : keyboard
     Protocol     : HID++ 4.5
     Polling rate : 8 ms (125Hz)
     Serial number: F8F15AC0
     Model ID:      B35340780000
     Unit ID:       A9996F5C
        Bootloader: BOT 73.01.B0017
          Firmware: MPK 08.01.B0017
             Other: 
             Other: 
     Supports 36 HID++ 2.0 features:
         0: ROOT                   {0000}   
         1: FEATURE SET            {0001}   
         2: DEVICE FW VERSION      {0003}   
            Firmware: Bootloader BOT 73.01.B0017 0000663D98BD
            Firmware: Firmware MPK 08.01.B0017 4078663D98BD
            Firmware: Other   
            Firmware: Other   
            Unit ID: A9996F5C  Model ID: B35340780000  Transport IDs: {'btleid': 'B353', 'wpid': '4078'}
         3: DEVICE NAME            {0005}   
            Name: Keyboard K600 TV
            Kind: keyboard
         4: WIRELESS DEVICE STATUS {1D4B}   
         5: RESET                  {0020}   
         6: DEVICE FRIENDLY NAME   {0007}   
            Friendly Name: Keyboard K600 T
         7: BATTERY STATUS         {1000}   
            Battery: 90%, discharging, next level 50%.
         8: REPROG CONTROLS V4     {1B04}   
            Key/Button Diversion (saved): {Fn Left Click:Regular, Multiplatform App Switch:Regular, Multiplatform Back:Regular, Multiplatform Insert:Regular, Brightness Down:Regular, Brightness Up:Regular, Host Switch Channel 1:Regular, Host Switch Channel 2:Regular, Host Switch Channel 3:Regular, MultiPlatform Search:Regular, MultiPlatform Home/Mission Control:Regular, MultiPlatform Menu/Show/Hide Virtual Keyboard/Launchpad:Regular, Previous Fn:Regular, Play/Pause Fn:Regular, Next Fn:Regular, Mute Fn:Regular, Volume Down Fn:Regular, Volume Up Fn:Regular}
            Key/Button Diversion        : {Fn Left Click:Regular, Multiplatform App Switch:Regular, Multiplatform Back:Regular, Multiplatform Insert:Regular, Brightness Down:Regular, Brightness Up:Regular, Host Switch Channel 1:Regular, Host Switch Channel 2:Regular, Host Switch Channel 3:Regular, MultiPlatform Search:Regular, MultiPlatform Home/Mission Control:Regular, MultiPlatform Menu/Show/Hide Virtual Keyboard/Launchpad:Regular, Previous Fn:Regular, Play/Pause Fn:Regular, Next Fn:Regular, Mute Fn:Regular, Volume Down Fn:Regular, Volume Up Fn:Regular}
         9: PERSISTENT REMAPPABLE ACTION {1C00}   
solaar: assertion failed: /usr/share/solaar/lib/logitech_receiver/settings.py line 1035
```
</details>

- Contents of `~/.config/solaar/config.yaml`:

<details>

```
- 1.1.3rc2
- _NAME: Keyboard K600 TV
  _absent: [hi-res-scroll, lowres-scroll-mode, hires-smooth-invert, hires-smooth-resolution, hires-scroll-mode, smart-shift, thumb-scroll-mode, thumb-scroll-invert,
    onboard_profiles, report_rate, pointer_speed, dpi, dpi-sliding, speed-change, mouse-gestures, backlight, backlight-timed, reprogrammable-keys, divert-crown,
    crown-smooth, divert-gkeys, m-key-leds, mr-key-led]
  _modelId: B35340780000
  _sensitive: {fn-swap: false, gesture2-gestures: false}
  _serial: F8F15AC0
  _unitId: A9996F5C
  _wpid: '4078'
  disable-keyboard-keys: {1: false, 8: false, 16: false}
  divert-keys: {183: 0, 186: 0, 189: 0, 190: 0, 199: 0, 200: 0, 209: 0, 210: 0, 211: 0, 212: 0, 213: 0, 214: 0, 228: 0, 229: 0, 230: 0, 231: 0, 232: 0,
    233: 0}
  fn-swap: false
  gesture2-divert: {1: false, 2: false, 4: false, 5: false, 10: false, 44: false, 84: false, 85: false, 100: false}
  gesture2-gestures: {1: true, 2: true, 4: true, 5: true, 10: true, 30: true, 34: false, 42: true, 43: true, 45: true, 84: false}
  gesture2-params:
    4: {scale: 256}
  multiplatform: 3
```
</details>


- Errors or warrnings from Solaar:
<!-- Run Solaar as `solaar -dd`, after killing any running Solaar processes.  If any warnings or errors show up, include the output here. -->

<details>

```
11:23:31,332     INFO [MainThread] root: language en_NZ (UTF-8), translations path None
11:23:31,407     INFO [MainThread] logitech_receiver.diversion: GDK Keymap set up
11:23:31,414     INFO [MainThread] solaar.upower: connected to system dbus, watching for suspend/resume events
11:23:31,428     INFO [MainThread] solaar.ui.notify: starting desktop notifications
11:23:31,450     INFO [MainThread] solaar.listener: starting receiver listening threads
11:23:31,451     INFO [MainThread] solaar.listener: receiver event add DeviceInfo(path='/dev/hidraw0', vendor_id='046D', product_id='C52B', serial='', release=None, manufacturer=None, product=None, interface=2, driver='logitech-djreceiver', bus_id=3, isDevice=None)
11:23:31,451     INFO [MainThread] logitech_receiver.base: New lock 12
11:23:31,459     INFO [ReceiverListener:hidraw0] logitech_receiver.listener: started with <UnifyingReceiver(/dev/hidraw0,12)> (12)
11:23:31,459     INFO [ReceiverListener:hidraw0] solaar.listener: <UnifyingReceiver(/dev/hidraw0,12)>: notifications listener has started (12)
11:23:31,459     INFO [ReceiverListener:hidraw0] logitech_receiver.base: New lock <_ThreadedHandle(/dev/hidraw0)>
11:23:31,463     INFO [ReceiverListener:hidraw0] logitech_receiver.receiver: <UnifyingReceiver(/dev/hidraw0,12)>: receiver notifications enabled => ('wireless', 'software present')
11:23:31,467     INFO [ReceiverListener:hidraw0] solaar.listener: status_changed <UnifyingReceiver(/dev/hidraw0,12)>: present, No paired devices. (0) 
11:23:31,481     INFO [ReceiverListener:hidraw0] logitech_receiver.receiver: <UnifyingReceiver(/dev/hidraw0,12)>: found new device 1 (4078)
11:23:31,481     INFO [ReceiverListener:hidraw0] logitech_receiver.base: New lock 15
11:23:31,481     INFO [ReceiverListener:hidraw0] solaar.listener: connection Notification(10,1,41,04,B17840) for <Device(1,4078,Keyboard K600 TV,F8F15AC0)> (keyboard)
11:23:31,926     INFO [ReceiverListener:hidraw0] solaar.listener: status_changed <UnifyingReceiver(/dev/hidraw0,12)>: present, 1 paired device. (0) 
11:23:32,044     INFO [ReceiverListener:hidraw0] solaar.listener: status_changed <Device(1,4078,Keyboard K600 TV,F8F15AC0)>: paired online, {'LINK ENCRYPTED': True, 'BATTERY LEVEL': 90, 'BATTERY STATUS': NamedInt(0, 'discharging'), 'BATTERY NEXT LEVEL': 50, 'BATTERY VOLTAGE': None, 'BATTERY CHARGING': False, 'ERROR': None} (0) 
11:23:32,163     INFO [ReceiverListener:hidraw0] logitech_receiver.device: <Device(1,4078,Keyboard K600 TV,F8F15AC0)>: unitId A9996F5C does not match serial F8F15AC0
11:23:33,816     INFO [ReceiverListener:hidraw0] logitech_receiver.status: <Device(1,4078,Keyboard K600 TV,F8F15AC0)> pushing device settings [<Setting([feature:toggle] K600 TV:fn-swap=None)>, <Setting([feature:map choice] K600 TV:persistent-remappable-keys=None)>, <Setting([feature:map choice] K600 TV:divert-keys=None)>, <Setting([feature:multiple toggle] K600 TV:disable-keyboard-keys=None)>, <Setting([feature:choice] K600 TV:multiplatform=None)>, <Setting([feature:choice] K600 TV:change-host=None)>, <Setting([feature:multiple toggle] K600 TV:gesture2-gestures=None)>, <Setting([feature:multiple toggle] K600 TV:gesture2-divert=None)>, <Setting([feature:multiple range] K600 TV:gesture2-params=None)>]
11:23:33,836    ERROR [ReceiverListener:hidraw0] logitech_receiver.listener: processing Notification(10,1,41,04,B17840)
Traceback (most recent call last):
  File "/usr/share/solaar/lib/logitech_receiver/listener.py", line 188, in run
    self._notifications_callback(n)
  File "/usr/share/solaar/lib/solaar/listener.py", line 264, in _notifications_handler
    _notifications.process(dev, n)
  File "/usr/share/solaar/lib/logitech_receiver/notifications.py", line 60, in process
    return _process_device_notification(device, status, notification)
  File "/usr/share/solaar/lib/logitech_receiver/notifications.py", line 178, in _process_device_notification
    return _process_hidpp10_notification(device, status, n)
  File "/usr/share/solaar/lib/logitech_receiver/notifications.py", line 288, in _process_hidpp10_notification
    status.changed(active=link_established)
  File "/usr/share/solaar/lib/logitech_receiver/status.py", line 311, in changed
    _settings.apply_all_settings(d)
  File "/usr/share/solaar/lib/logitech_receiver/settings.py", line 1305, in apply_all_settings
    s.apply()
  File "/usr/share/solaar/lib/logitech_receiver/settings.py", line 334, in apply
    value = self.read(self.persist)  # Don't use persisted value if setting doesn't persist
  File "/usr/share/solaar/lib/logitech_receiver/settings.py", line 372, in read
    reply_map[int(key)] = self._validator.validate_read(reply, key)
  File "/usr/share/solaar/lib/logitech_receiver/settings.py", line 1035, in validate_read
    assert reply_value in self.choices[
AssertionError: validator_class: failed to validate read value 01
11:23:33,842     INFO [ReceiverListener:hidraw0] logitech_receiver.notifications: <Device(1,4078,Keyboard K600 TV,F8F15AC0)>: spurious BATTERY status Notification(11,1,07,10,0400C16D0A0000000000000000000000)
```

</details>

**Describe the bug**
1. Upon enabling Gestures -> Natural scrolling, the natural scrolling feature of the touchpad is enabled as expected. Upon rebooting, however, the natural scrolling feature is disabled. Cycling the lock icon next to Gestures to Ignore this setting -> Changes allowed -> No changes allowed enables this feature.
2. A continuous circular rotating icon is observed next to the Persistent Key/Button Mapping option, with hover text "Working..." and it is not possible to use this feature at all.

**To Reproduce**
Steps to reproduce the behavior:
1. Natural scrolling issue
    1. Open Solaar
    2. Enable Gestures -> Natural scrolling
    3. Reboot computer
    4. Natural scrolling feature appears to be disabled
2. Persistent Key/Button Mapping issue
    1. Open Solaar
    2. Observe continuous circular rotating icon next to option, with hover text "Working..."

**Screenshots**
If applicable, add screenshots to help explain your problem.

![Screenshot from 2022-04-30 11-33-49](https://user-images.githubusercontent.com/14113814/166080832-787581cf-f4e5-4ff9-9b13-d39a221af24b.png)

**Additional context**
Seems to be related to #1519 and #1102



Discussion:
It may be that the two problems are related, with the remappable problem causing settings to not be correctly reapplied after a suspend.

Something bad is definitely happening for persistent key/button remapping.  The device is sending a response that Solaar thinks is invalid.  Please clone Solaar from this repository and run as `bin/solaar -ddd` to get full debugging output from the current version of Solaar up to the assertion error.
@pfps - Thanks a lot for your prompt reply. I hope this is what you asked for:

<details>

```
16:54:18,244     INFO [MainThread] root: language en_NZ (UTF-8), translations path None
16:54:18,321     INFO [MainThread] logitech_receiver.diversion: GDK Keymap set up
16:54:18,324    DEBUG [MainThread] solaar.ui.tray: using AppIndicator3
16:54:18,327     INFO [MainThread] solaar.upower: connected to system dbus, watching for suspend/resume events
16:54:18,342    DEBUG [MainThread] solaar.ui: startup registered=True, remote=False
16:54:18,342    DEBUG [AsyncUI] solaar.tasks: started
16:54:18,342     INFO [MainThread] solaar.ui.notify: starting desktop notifications
16:54:18,343    DEBUG [MainThread] solaar.ui.icons: sys.path[0] = <path>/Solaar/lib
16:54:18,343    DEBUG [MainThread] solaar.ui.icons: looking for icons in <path>/Solaar/icons
16:54:18,343    DEBUG [MainThread] solaar.ui.icons: looking for icons in <path>/Solaar/share/solaar/icons
16:54:18,343    DEBUG [MainThread] solaar.ui.icons: icon theme paths: ['<path>/Solaar/share/solaar/icons', '<home>/.local/share/icons', '<home>/.icons', '/usr/share/cinnamon/icons', '/usr/share/gnome/icons', '<home>/.local/share/flatpak/exports/share/icons', '/var/lib/flatpak/exports/share/icons', '/usr/local/share/icons', '/usr/share/icons', '/usr/share/cinnamon/pixmaps', '/usr/share/gnome/pixmaps', '<home>/.local/share/flatpak/exports/share/pixmaps', '/var/lib/flatpak/exports/share/pixmaps', '/usr/local/share/pixmaps', '/usr/share/pixmaps']
16:54:18,365     INFO [MainThread] solaar.listener: starting receiver listening threads
16:54:18,366    DEBUG [MainThread] hidapi.udev: Found device BID 0003 VID 0000046D PID 0000C52B INTERFACE 2 FILTER 2
16:54:18,366     INFO [MainThread] solaar.listener: receiver event add DeviceInfo(path='/dev/hidraw0', vendor_id='046D', product_id='C52B', serial='', release=None, manufacturer=None, product=None, interface=2, driver='logitech-djreceiver', bus_id=3, isDevice=None)
16:54:18,366     INFO [MainThread] logitech_receiver.base: New lock 12
16:54:18,366    DEBUG [MainThread] logitech_receiver.base: (12) <= w[10 FF 83B5 030000]
16:54:18,368    DEBUG [MainThread] logitech_receiver.base: (12) => r[11 FF 83B5 036FF69CDA0106080000000000000000]
16:54:18,368    DEBUG [MainThread] logitech_receiver.base: (12) <= w[10 FF 80B2 000000]
16:54:18,370    DEBUG [MainThread] logitech_receiver.base: (12) => r[20 01 4101 78401E4000000400000000]
16:54:18,372    DEBUG [MainThread] logitech_receiver.base: (12) => r[20 00 4102 0000000000000000000000]
16:54:18,374    DEBUG [MainThread] logitech_receiver.base: (12) => r[10 FF 8F80 B20300]
16:54:18,374    DEBUG [MainThread] logitech_receiver.base: (12) device 0xFF error on request {80B2}: 3 = invalid value
16:54:18,374     INFO [ReceiverListener:hidraw0] logitech_receiver.listener: started with <UnifyingReceiver(/dev/hidraw0,12)> (12)
16:54:18,375     INFO [ReceiverListener:hidraw0] solaar.listener: <UnifyingReceiver(/dev/hidraw0,12)>: notifications listener has started (12)
16:54:18,375     INFO [ReceiverListener:hidraw0] logitech_receiver.base: New lock <_ThreadedHandle(/dev/hidraw0)>
16:54:18,375    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) <= w[10 FF 8000 100900]
16:54:18,376    DEBUG [MainThread] solaar.ui: activate
16:54:18,376    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[10 FF 8000 000000]
16:54:18,376    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) <= w[10 FF 8100 000000]
16:54:18,378    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[10 FF 8100 000900]
16:54:18,378     INFO [ReceiverListener:hidraw0] logitech_receiver.receiver: <UnifyingReceiver(/dev/hidraw0,12)>: receiver notifications enabled => ('wireless', 'software present')
16:54:18,378    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) <= w[10 FF 8002 020000]
16:54:18,380    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[10 01 4104 B17840]
16:54:18,382    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[10 FF 8002 000000]
16:54:18,382     INFO [ReceiverListener:hidraw0] solaar.listener: status_changed <UnifyingReceiver(/dev/hidraw0,12)>: present, No paired devices. (0) 
16:54:18,382    DEBUG [MainThread] solaar.ui: status changed: <UnifyingReceiver(/dev/hidraw0,12)> (NONE) None
16:54:18,383    DEBUG [MainThread] solaar.ui.window: new receiver row ('/dev/hidraw0', 0, True, 'Unifying Receiver', 'preferences-desktop-peripherals', None, None, <UnifyingReceiver(/dev/hidraw0,12)>)
16:54:18,394    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) <= w[10 FF 83B5 400000]
16:54:18,396    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 FF 83B5 40074B36303020545600000000000000]
16:54:18,396     INFO [ReceiverListener:hidraw0] logitech_receiver.receiver: <UnifyingReceiver(/dev/hidraw0,12)>: found new device 1 (4078)
16:54:18,396    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) pinging device 1
16:54:18,396     INFO [ReceiverListener:hidraw0] logitech_receiver.base: New lock 15
16:54:18,396    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[10 01 0018 00006B]
16:54:18,711    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0700 5A320000000000000000000000000000]
16:54:18,729    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0018 04056B00000000000000000000000000]
16:54:18,729    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 000B 00010000000000000000000000000000]
16:54:18,735    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0710 0400C16D0A0000000000000000000000]
16:54:18,752    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 000B 01000100000000000000000000000000]
16:54:18,753    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 010B 00000000000000000000000000000000]
16:54:18,772    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 010B 23000000000000000000000000000000]
16:54:18,773    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 000D 00050000000000000000000000000000]
16:54:18,792    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 000D 03000000000000000000000000000000]
16:54:18,793    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 0309 00000000000000000000000000000000]
16:54:18,812    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0309 10000000000000000000000000000000]
16:54:18,813    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 031A 00000000000000000000000000000000]
16:54:18,832    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 031A 4B6579626F617264204B363030205456]
16:54:18,833    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) <= w[10 FF 83B5 300000]
16:54:18,837    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 FF 83B5 30F8F15AC01E4000000F000000000000]
16:54:18,396     INFO [ReceiverListener:hidraw0] solaar.listener: connection Notification(10,1,41,04,B17840) for <Device(1,4078,Keyboard K600 TV,F8F15AC0)> (keyboard)
16:54:18,837     INFO [ReceiverListener:hidraw0] solaar.listener: status_changed <UnifyingReceiver(/dev/hidraw0,12)>: present, 1 paired device. (0) 
16:54:18,838    DEBUG [ReceiverListener:hidraw0] logitech_receiver.notifications: <Device(1,4078,Keyboard K600 TV,F8F15AC0)>: protocol 4 connection notification: software=True, encrypted=True, link=True, payload=True
16:54:18,838    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 000F 10000000000000000000000000000000]
16:54:18,838    DEBUG [MainThread] solaar.ui: status changed: <UnifyingReceiver(/dev/hidraw0,12)> (NONE) None
16:54:18,933    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 000F 07000100000000000000000000000000]
16:54:18,933    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 0708 00000000000000000000000000000000]
16:54:18,952    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0708 5A320000000000000000000000000000]
16:54:18,953    DEBUG [ReceiverListener:hidraw0] logitech_receiver.hidpp20: device 1 battery 90% charged, next 50%, status discharging
16:54:18,953    DEBUG [ReceiverListener:hidraw0] logitech_receiver.status: <Device(1,4078,Keyboard K600 TV,F8F15AC0)>: battery 90, discharging
16:54:18,953     INFO [ReceiverListener:hidraw0] solaar.listener: status_changed <Device(1,4078,Keyboard K600 TV,F8F15AC0)>: paired online, {'LINK ENCRYPTED': True, 'BATTERY LEVEL': 90, 'BATTERY STATUS': NamedInt(0, 'discharging'), 'BATTERY NEXT LEVEL': 50, 'BATTERY VOLTAGE': None, 'BATTERY CHARGING': False, 'ERROR': None} (0) 
16:54:18,954    DEBUG [MainThread] solaar.ui: status changed: <Device(1,4078,Keyboard K600 TV,F8F15AC0)> (NONE) None
16:54:18,961    DEBUG [MainThread] solaar.ui.icons: battery icon for 90:False = battery-full
16:54:18,974    DEBUG [ReceiverListener:hidraw0] solaar.configuration: load => ['1.1.3', {'_NAME': 'Keyboard K600 TV', '_absent': ['hi-res-scroll', 'lowres-scroll-mode', 'hires-smooth-invert', 'hires-smooth-resolution', 'hires-scroll-mode', 'smart-shift', 'thumb-scroll-mode', 'thumb-scroll-invert', 'onboard_profiles', 'report_rate', 'pointer_speed', 'dpi', 'dpi-sliding', 'speed-change', 'mouse-gestures', 'backlight', 'backlight-timed', 'reprogrammable-keys', 'divert-crown', 'crown-smooth', 'divert-gkeys', 'm-key-leds', 'mr-key-led'], '_modelId': 'B35340780000', '_sensitive': {'fn-swap': False, 'gesture2-gestures': False}, '_serial': 'F8F15AC0', '_unitId': 'A9996F5C', '_wpid': '4078', 'change-host': None, 'disable-keyboard-keys': {1: False, 8: False, 16: False}, 'divert-keys': {183: 0, 186: 0, 189: 0, 190: 0, 199: 0, 200: 0, 209: 0, 210: 0, 211: 0, 212: 0, 213: 0, 214: 0, 228: 0, 229: 0, 230: 0, 231: 0, 232: 0, 233: 0}, 'fn-swap': False, 'gesture2-divert': {1: False, 2: False, 4: False, 5: False, 10: False, 44: False, 84: False, 85: False, 100: False}, 'gesture2-gestures': {1: True, 2: True, 4: True, 5: True, 10: True, 30: True, 34: False, 42: True, 43: True, 45: True, 84: False}, 'gesture2-params': {4: {'scale': 256}}, 'multiplatform': 3}]
16:54:18,974    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 000B 00030000000000000000000000000000]
16:54:18,974    DEBUG [MainThread] solaar.ui.tray: picked device with lowest battery: ('/dev/hidraw0', 1, 'Keyboard K600 TV', {'LINK ENCRYPTED': True, 'BATTERY LEVEL': 90, 'BATTERY STATUS': NamedInt(0, 'discharging'), 'BATTERY NEXT LEVEL': 50, 'BATTERY VOLTAGE': None, 'BATTERY CHARGING': False, 'ERROR': None})
16:54:18,974    DEBUG [MainThread] solaar.ui.icons: battery icon for 90:False = battery-full
16:54:18,975    DEBUG [MainThread] solaar.ui.window: new device row ('/dev/hidraw0', 1, True, 'K600 TV', 'input-keyboard', None, None, <Device(1,4078,Keyboard K600 TV,F8F15AC0)>) at index 0
16:54:18,975    DEBUG [MainThread] solaar.ui.icons: battery icon for 90:False = battery-full
16:54:19,055    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 000B 02000200000000000000000000000000]
16:54:19,055    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 020D 00000000000000000000000000000000]
16:54:19,074    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 020D 04A9996F5C0006B35340780000000000]
16:54:19,075     INFO [ReceiverListener:hidraw0] logitech_receiver.device: <Device(1,4078,Keyboard K600 TV,F8F15AC0)>: unitId A9996F5C does not match serial F8F15AC0
16:54:19,075    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 000F 40A00000000000000000000000000000]
16:54:19,094    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 000F 00000000000000000000000000000000]
16:54:19,095    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 000A 40A20000000000000000000000000000]
16:54:19,114    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 000A 0D000000000000000000000000000000]
16:54:19,115    DEBUG [ReceiverListener:hidraw0] logitech_receiver.settings_templates: check_feature fn-swap [NEW FN INVERSION] detected <Setting([feature:toggle] K600 TV:fn-swap=None)>
16:54:19,115    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 000B 1C000000000000000000000000000000]
16:54:19,134    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 000B 09000000000000000000000000000000]
16:54:19,135    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 091B 00000000000000000000000000000000]
16:54:19,154    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 091B 0E030000000000000000000000000000]
16:54:19,155    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 000A 1B040000000000000000000000000000]
16:54:19,174    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 000A 08000400000000000000000000000000]
16:54:19,175    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 090B 00000000000000000000000000000000]
16:54:19,194    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 090B 00410000000000000000000000000000]
16:54:19,195    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 092A 00FF0000000000000000000000000000]
16:54:19,215    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 092A 00D60000000000000000000000000000]
16:54:19,215    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 093D 00D6FF00000000000000000000000000]
16:54:19,234    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 093D 00D60000000000000000000000000000]
16:54:19,235    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 092D 01FF0000000000000000000000000000]
16:54:19,255    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 092D 00C70000000000000000000000000000]
16:54:19,255    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 093E 00C7FF00000000000000000000000000]
16:54:19,276    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 093E 00C70000000000000000000000000000]
16:54:19,277    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 092F 02FF0000000000000000000000000000]
16:54:19,296    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 092F 00C80000000000000000000000000000]
16:54:19,297    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 0938 00C8FF00000000000000000000000000]
16:54:19,316    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0938 00C80000000000000000000000000000]
16:54:19,317    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 092D 03FF0000000000000000000000000000]
16:54:19,336    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 092D 00E40000000000000000000000000000]
16:54:19,337    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 093F 00E4FF00000000000000000000000000]
16:54:19,357    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 093F 00E40000000000000000000000000000]
16:54:19,357    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 092F 04FF0000000000000000000000000000]
16:54:19,376    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 092F 00E50000000000000000000000000000]
16:54:19,377    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 0939 00E5FF00000000000000000000000000]
16:54:19,396    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0939 00E50000000000000000000000000000]
16:54:19,397    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 0929 05FF0000000000000000000000000000]
16:54:19,416    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0929 00E60000000000000000000000000000]
16:54:19,417    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 093D 00E6FF00000000000000000000000000]
16:54:19,437    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 093D 00E60000000000000000000000000000]
16:54:19,437    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 092A 06FF0000000000000000000000000000]
16:54:19,456    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 092A 00E70000000000000000000000000000]
16:54:19,457    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 093A 00E7FF00000000000000000000000000]
16:54:19,477    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 093A 00E70000000000000000000000000000]
16:54:19,477    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 092E 07FF0000000000000000000000000000]
16:54:19,496    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 092E 00E80000000000000000000000000000]
16:54:19,497    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 093A 00E8FF00000000000000000000000000]
16:54:19,516    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 093A 00E80000000000000000000000000000]
16:54:19,517    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 092D 08FF0000000000000000000000000000]
16:54:19,536    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 092D 00E90000000000000000000000000000]
16:54:19,537    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 0939 00E9FF00000000000000000000000000]
16:54:19,556    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0939 00E90000000000000000000000000000]
16:54:19,557    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 0928 09FF0000000000000000000000000000]
16:54:19,579    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0928 00BE0000000000000000000000000000]
16:54:19,579    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 093D 00BEFF00000000000000000000000000]
16:54:19,599    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 093D 00BE0000000001000000000000000000]
16:54:19,599    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 092E 0AFF0000000000000000000000000000]
16:54:19,619    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 092E 00D50000000000000000000000000000]
16:54:19,619    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 093B 00D5FF00000000000000000000000000]
16:54:19,639    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 093B 00D50000000000000000000000000000]
16:54:19,639    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 092D 0BFF0000000000000000000000000000]
16:54:19,659    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 092D 00BD0000000000000000000000000000]
16:54:19,659    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 093A 00BDFF00000000000000000000000000]
16:54:19,679    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 093A 00BD0000000000000000000000000000]
16:54:19,679    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 092C 0CFF0000000000000000000000000000]
16:54:19,699    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 092C 00BA0000000000000000000000000000]
16:54:19,699    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 093D 00BAFF00000000000000000000000000]
16:54:19,719    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 093D 00BA0000000000000000000000000000]
16:54:19,719    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 092D 0DFF0000000000000000000000000000]
16:54:19,739    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 092D 00D40000000000000000000000000000]
16:54:19,739    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 0939 00D4FF00000000000000000000000000]
16:54:19,759    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0939 00D40000000000000000000000000000]
16:54:19,766    DEBUG [ReceiverListener:hidraw0] logitech_receiver.settings_templates: check_feature persistent-remappable-keys [PERSISTENT REMAPPABLE ACTION] detected <Setting([feature:map choice] K600 TV:persistent-remappable-keys=None)>
16:54:19,766    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 0008 1B010000000000000000000000000000]
16:54:19,861    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0008 00000000000000000000000000000000]
16:54:19,861    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 080C 00000000000000000000000000000000]
16:54:19,881    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 080C 13000000000000000000000000000000]
16:54:19,881    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 081D 00000000000000000000000000000000]
16:54:19,900    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 081D 00D100AE6A0100000000000000000000]
16:54:19,901    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 081C 01000000000000000000000000000000]
16:54:19,921    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 081C 00D200AF6A0200000000000000000000]
16:54:19,921    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 081B 02000000000000000000000000000000]
16:54:19,941    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 081B 00D300B06A0300000000000000000000]
16:54:19,941    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 0819 03000000000000000000000000000000]
16:54:19,961    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0819 00D600B37A0400000000000000000000]
16:54:19,961    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 081A 04000000000000000000000000000000]
16:54:19,981    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 081A 00C700A37A0500000000000000000000]
16:54:19,981    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 081D 05000000000000000000000000000000]
16:54:20,001    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 081D 00C800A47A0600000000000000000000]
16:54:20,001    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 081E 06000000000000000000000000000000]
16:54:20,021    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 081E 00E400067A0700000000000000000000]
16:54:20,021    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 081C 07000000000000000000000000000000]
16:54:20,041    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 081C 00E500047A0800000000000000000000]
16:54:20,041    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 081B 08000000000000000000000000000000]
16:54:20,061    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 081B 00E600057A0900000000000000000000]
16:54:20,061    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 081C 09000000000000000000000000000000]
16:54:20,081    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 081C 00E700037A0A00000000000000000000]
16:54:20,081    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 0819 0A000000000000000000000000000000]
16:54:20,101    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0819 00E800027A0B00000000000000000000]
16:54:20,101    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 081C 0B000000000000000000000000000000]
16:54:20,120    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 081C 00E900017A0C00000000000000000000]
16:54:20,121    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 0819 0C000000000000000000000000000000]
16:54:20,143    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0819 00BE009A7A0000000000000000000000]
16:54:20,143    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 0818 0D000000000000000000000000000000]
16:54:20,163    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0818 00D500B2740000000000000000000000]
16:54:20,163    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 081C 0E000000000000000000000000000000]
16:54:20,183    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 081C 00BD0099740000000000000000000000]
16:54:20,183    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 081D 0F000000000000000000000000000000]
16:54:20,203    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 081D 00BA0096740000000000000000000000]
16:54:20,203    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 0818 10000000000000000000000000000000]
16:54:20,223    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0818 00D400B1740000000000000000000000]
16:54:20,223    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 081A 11000000000000000000000000000000]
16:54:20,243    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 081A 00B70092200000000000000000000000]
16:54:20,243    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 081C 12000000000000000000000000000000]
16:54:20,263    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 081C 00340062040000000000000000000000]
16:54:20,263    DEBUG [ReceiverListener:hidraw0] logitech_receiver.settings_templates: check_feature divert-keys [REPROG CONTROLS V4] detected <Setting([feature:map choice] K600 TV:divert-keys=None)>
16:54:20,263    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 000C 45210000000000000000000000000000]
16:54:20,283    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 000C 10000000000000000000000000000000]
16:54:20,283    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 100C 00000000000000000000000000000000]
16:54:20,303    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 100C 19000000000000000000000000000000]
16:54:20,303    DEBUG [ReceiverListener:hidraw0] logitech_receiver.settings_templates: check_feature disable-keyboard-keys [KEYBOARD DISABLE KEYS] detected <Setting([feature:multiple toggle] K600 TV:disable-keyboard-keys=None)>
16:54:20,303    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 000E 45310000000000000000000000000000]
16:54:20,323    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 000E 11000100000000000000000000000000]
16:54:20,323    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 110E 00000000000000000000000000000000]
16:54:20,343    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 110E 03000707030003000000000000000000]
16:54:20,343    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 1118 00000000000000000000000000000000]
16:54:20,363    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 1118 00060001000000000000000000000000]
16:54:20,363    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 1119 01000000000000000000000000000000]
16:54:20,382    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 1119 01058000000000000000000000000000]
16:54:20,383    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 1119 02000000000000000000000000000000]
16:54:20,403    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 1119 02041000000000000000000000000000]
16:54:20,403    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 111A 03000000000000000000000000000000]
16:54:20,425    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 111A 03000100000000000000000000000000]
16:54:20,425    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 111C 04000000000000000000000000000000]
16:54:20,445    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 111C 04012000000000000000000000000000]
16:54:20,445    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 111F 05000000000000000000000000000000]
16:54:20,465    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 111F 05024000000000000000000000000000]
16:54:20,465    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 111D 06000000000000000000000000000000]
16:54:20,485    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 111D 06030800000000000000000000000000]
16:54:20,485    DEBUG [ReceiverListener:hidraw0] logitech_receiver.settings_templates: check_feature multiplatform [MULTIPLATFORM] detected <Setting([feature:choice] K600 TV:multiplatform=None)>
16:54:20,486    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 0009 18140000000000000000000000000000]
16:54:20,504    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0009 0B000100000000000000000000000000]
16:54:20,505    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 0B0A 00000000000000000000000000000000]
16:54:20,525    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0B0A 03000000000000000000000000000000]
16:54:20,525    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 0009 18150000000000000000000000000000]
16:54:20,545    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0009 0C000100000000000000000000000000]
16:54:20,545    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 0C0C 00000000000000000000000000000000]
16:54:20,565    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0C0C 13090300000000000000000000000000]
16:54:20,565    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 0C1B 00000000000000000000000000000000]
16:54:20,585    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0C1B 00010100051800000000000000000000]
16:54:20,585    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 0C3E 00000000000000000000000000000000]
16:54:20,605    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0C3E 00006B61696A75000000000000000000]
16:54:20,605    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 0C1E 01000000000000000000000000000000]
16:54:20,625    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0C1E 01000000001800000000000000000000]
16:54:20,625    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 0C19 02000000000000000000000000000000]
16:54:20,645    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0C19 02000000001800000000000000000000]
16:54:20,645    DEBUG [ReceiverListener:hidraw0] logitech_receiver.settings_templates: check_feature change-host [CHANGE HOST] detected <Setting([feature:choice] K600 TV:change-host=None)>
16:54:20,645    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 000E 65010000000000000000000000000000]
16:54:20,665    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 000E 13000000000000000000000000000000]
16:54:20,665    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 130F 00000000000000000000000000000000]
16:54:20,684    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 130F 4203410141020400320480148C21A301]
16:54:20,685    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 1309 00080000000000000000000000000000]
16:54:20,707    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 1309 A302A304A305A11EA30A4105822C852D]
16:54:20,707    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 130E 00100000000000000000000000000000]
16:54:20,727    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 130E AD2AAD2B4204AF549122825582640100]
16:54:20,727    DEBUG [ReceiverListener:hidraw0] logitech_receiver.settings_templates: check_feature gesture2-gestures [GESTURE 2] detected <Setting([feature:multiple toggle] K600 TV:gesture2-gestures=None)>
16:54:20,727    DEBUG [ReceiverListener:hidraw0] logitech_receiver.settings_templates: check_feature gesture2-divert [GESTURE 2] detected <Setting([feature:multiple toggle] K600 TV:gesture2-divert=None)>
16:54:20,728    DEBUG [ReceiverListener:hidraw0] logitech_receiver.settings_templates: check_feature gesture2-params [GESTURE 2] detected <Setting([feature:multiple range] K600 TV:gesture2-params=None)>
16:54:20,728     INFO [ReceiverListener:hidraw0] logitech_receiver.status: <Device(1,4078,Keyboard K600 TV,F8F15AC0)> pushing device settings [<Setting([feature:toggle] K600 TV:fn-swap=None)>, <Setting([feature:map choice] K600 TV:persistent-remappable-keys=None)>, <Setting([feature:map choice] K600 TV:divert-keys=None)>, <Setting([feature:multiple toggle] K600 TV:disable-keyboard-keys=None)>, <Setting([feature:choice] K600 TV:multiplatform=None)>, <Setting([feature:choice] K600 TV:change-host=None)>, <Setting([feature:multiple toggle] K600 TV:gesture2-gestures=None)>, <Setting([feature:multiple toggle] K600 TV:gesture2-divert=None)>, <Setting([feature:multiple range] K600 TV:gesture2-params=None)>]
16:54:20,728    DEBUG [ReceiverListener:hidraw0] logitech_receiver.settings: fn-swap: apply None (<Device(1,4078,Keyboard K600 TV,F8F15AC0)>)
16:54:20,728    DEBUG [ReceiverListener:hidraw0] logitech_receiver.settings: fn-swap: settings read None from <Device(1,4078,Keyboard K600 TV,F8F15AC0)>
16:54:20,728    DEBUG [ReceiverListener:hidraw0] logitech_receiver.settings: fn-swap: settings write False to <Device(1,4078,Keyboard K600 TV,F8F15AC0)>
16:54:20,728    DEBUG [ReceiverListener:hidraw0] logitech_receiver.settings: BooleanValidator: prepare_write(False, None) => b'\x00'
16:54:20,728    DEBUG [ReceiverListener:hidraw0] logitech_receiver.settings: fn-swap: settings prepare write(False) => b'\x00'
16:54:20,729    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 0D1E 00000000000000000000000000000000]
16:54:20,746    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0D1E 00010000000000000000000000000000]
16:54:20,747    DEBUG [ReceiverListener:hidraw0] logitech_receiver.settings: persistent-remappable-keys: apply None (<Device(1,4078,Keyboard K600 TV,F8F15AC0)>)
16:54:20,747    DEBUG [ReceiverListener:hidraw0] logitech_receiver.settings: persistent-remappable-keys: settings read None from <Device(1,4078,Keyboard K600 TV,F8F15AC0)>
16:54:20,748    ERROR [ReceiverListener:hidraw0] logitech_receiver.listener: processing Notification(10,1,41,04,B17840)
Traceback (most recent call last):
  File "<path>/Solaar/lib/logitech_receiver/listener.py", line 188, in run
    self._notifications_callback(n)
  File "<path>/Solaar/lib/solaar/listener.py", line 264, in _notifications_handler
    _notifications.process(dev, n)
  File "<path>/Solaar/lib/logitech_receiver/notifications.py", line 60, in process
    return _process_device_notification(device, status, notification)
  File "<path>/Solaar/lib/logitech_receiver/notifications.py", line 178, in _process_device_notification
    return _process_hidpp10_notification(device, status, n)
  File "<path>/Solaar/lib/logitech_receiver/notifications.py", line 288, in _process_hidpp10_notification
    status.changed(active=link_established)
  File "<path>/Solaar/lib/logitech_receiver/status.py", line 311, in changed
    _settings.apply_all_settings(d)
  File "<path>/Solaar/lib/logitech_receiver/settings.py", line 1305, in apply_all_settings
    s.apply()
  File "<path>/Solaar/lib/logitech_receiver/settings.py", line 334, in apply
    value = self.read(self.persist)  # Don't use persisted value if setting doesn't persist
  File "<path>/Solaar/lib/logitech_receiver/settings.py", line 372, in read
    reply_map[int(key)] = self._validator.validate_read(reply, key)
  File "<path>/Solaar/lib/logitech_receiver/settings.py", line 1035, in validate_read
    assert reply_value in self.choices[
AssertionError: validator_class: failed to validate read value 01
16:54:20,750    DEBUG [ReceiverListener:hidraw0] logitech_receiver.notifications: <Device(1,4078,Keyboard K600 TV,F8F15AC0)>: notification for feature BATTERY STATUS, report 0, data 5A320000000000000000000000000000
16:54:20,750    DEBUG [ReceiverListener:hidraw0] logitech_receiver.status: <Device(1,4078,Keyboard K600 TV,F8F15AC0)>: battery 90, discharging
16:54:20,751    DEBUG [ReceiverListener:hidraw0] logitech_receiver.notifications: <Device(1,4078,Keyboard K600 TV,F8F15AC0)>: notification for feature BATTERY STATUS, report 0, data 0400C16D0A0000000000000000000000
16:54:20,751     INFO [ReceiverListener:hidraw0] logitech_receiver.notifications: <Device(1,4078,Keyboard K600 TV,F8F15AC0)>: spurious BATTERY status Notification(11,1,07,10,0400C16D0A0000000000000000000000)
16:54:20,751    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 000F 07000100000000000000000000000000]
16:54:20,751    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 0708 5A320000000000000000000000000000]
16:54:20,751    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 000B 02000200000000000000000000000000]
16:54:20,751    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 020D 04A9996F5C0006B35340780000000000]
16:54:20,752    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 000F 00000000000000000000000000000000]
16:54:20,752    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 000A 0D000000000000000000000000000000]
16:54:20,752    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 000B 09000000000000000000000000000000]
16:54:20,753    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 091B 0E030000000000000000000000000000]
16:54:20,753    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 000A 08000400000000000000000000000000]
16:54:20,753    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 090B 00410000000000000000000000000000]
16:54:20,753    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 092A 00D60000000000000000000000000000]
16:54:20,753    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 093D 00D60000000000000000000000000000]
16:54:20,753    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 092D 00C70000000000000000000000000000]
16:54:20,753    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 093E 00C70000000000000000000000000000]
16:54:20,753    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 092F 00C80000000000000000000000000000]
16:54:20,753    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 0938 00C80000000000000000000000000000]
16:54:20,754    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 092D 00E40000000000000000000000000000]
16:54:20,754    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 093F 00E40000000000000000000000000000]
16:54:20,754    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 092F 00E50000000000000000000000000000]
16:54:20,754    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 0939 00E50000000000000000000000000000]
16:54:20,754    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 0929 00E60000000000000000000000000000]
16:54:20,754    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 093D 00E60000000000000000000000000000]
16:54:20,754    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 092A 00E70000000000000000000000000000]
16:54:20,754    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 093A 00E70000000000000000000000000000]
16:54:20,754    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 092E 00E80000000000000000000000000000]
16:54:20,754    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 093A 00E80000000000000000000000000000]
16:54:20,754    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 092D 00E90000000000000000000000000000]
16:54:20,755    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 0939 00E90000000000000000000000000000]
16:54:20,755    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 0928 00BE0000000000000000000000000000]
16:54:20,755    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 093D 00BE0000000001000000000000000000]
16:54:20,755    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 092E 00D50000000000000000000000000000]
16:54:20,755    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 093B 00D50000000000000000000000000000]
16:54:20,755    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 092D 00BD0000000000000000000000000000]
16:54:20,755    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 093A 00BD0000000000000000000000000000]
16:54:20,755    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 092C 00BA0000000000000000000000000000]
16:54:20,755    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 093D 00BA0000000000000000000000000000]
16:54:20,755    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 092D 00D40000000000000000000000000000]
16:54:20,755    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 0939 00D40000000000000000000000000000]
16:54:20,755    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 0008 00000000000000000000000000000000]
16:54:20,755    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 080C 13000000000000000000000000000000]
16:54:20,756    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 081D 00D100AE6A0100000000000000000000]
16:54:20,756    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 081C 00D200AF6A0200000000000000000000]
16:54:20,756    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 081B 00D300B06A0300000000000000000000]
16:54:20,756    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 0819 00D600B37A0400000000000000000000]
16:54:20,756    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 081A 00C700A37A0500000000000000000000]
16:54:20,756    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 081D 00C800A47A0600000000000000000000]
16:54:20,756    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 081E 00E400067A0700000000000000000000]
16:54:20,756    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 081C 00E500047A0800000000000000000000]
16:54:20,756    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 081B 00E600057A0900000000000000000000]
16:54:20,756    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 081C 00E700037A0A00000000000000000000]
16:54:20,756    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 0819 00E800027A0B00000000000000000000]
16:54:20,756    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 081C 00E900017A0C00000000000000000000]
16:54:20,756    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 0819 00BE009A7A0000000000000000000000]
16:54:20,757    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 0818 00D500B2740000000000000000000000]
16:54:20,757    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 081C 00BD0099740000000000000000000000]
16:54:20,757    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 081D 00BA0096740000000000000000000000]
16:54:20,757    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 0818 00D400B1740000000000000000000000]
16:54:20,757    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 081A 00B70092200000000000000000000000]
16:54:20,757    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 081C 00340062040000000000000000000000]
16:54:20,757    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 000C 10000000000000000000000000000000]
16:54:20,757    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 100C 19000000000000000000000000000000]
16:54:20,757    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 000E 11000100000000000000000000000000]
16:54:20,757    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (12) => r[11 01 110E 03000707030003000000000000000000]
```
</details>
Yes, thanks.  That shows the problem Solaar is encountering.

The following responses are unexpected and badly handled by Solaar because it assumes that a permanent mapping response with a reserved mapping type value below to be zero elsewhere.
```
16:54:19,557    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 0928 09FF0000000000000000000000000000] index 09
16:54:19,579    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 0928 00BE0000000000000000000000000000] key BE Multiplatform_Inser
16:54:19,579    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) <= w[11 01 093D 00BEFF00000000000000000000000000]
16:54:19,599    DEBUG [ReceiverListener:hidraw0] logitech_receiver.base: (15) => r[11 01 093D 00BE 00 00 0000 01 00 0000000000000000] reserved, 0000, L-Ctrl
```
The fix is to ignore non-zero values for reserved remapping types.


Resolving patch:
diff --git a/lib/logitech_receiver/hidpp20.py b/lib/logitech_receiver/hidpp20.py
--- a/lib/logitech_receiver/hidpp20.py
+++ b/lib/logitech_receiver/hidpp20.py
@@ -727,6 +727,8 @@ def _query_key(self, index: int):
                 remapped = special_keys.HORIZONTAL_SCROLL[remapped]
             elif actionId == special_keys.ACTIONID.Consumer:
                 remapped = special_keys.HID_CONSUMERCODES[remapped]
+            elif actionId == special_keys.ACTIONID.Empty:  # purge data from empty value
+                remapped = modifiers = status = 0
             self.keys[index] = PersistentRemappableAction(self.device, index, key, actionId, remapped, modifiers, status)
         elif _log.isEnabledFor(_WARNING):
             _log.warn(f"Key with index {index} was expected to exist but device doesn't report it.")


Test patch: