[PLUGIN] RotaryEncoder II

Hi all,
thanks for your patience - after the holidays I found some time to debug. I found the bug that causes the issue on my system and fixed it. You can go ahead and try, if it also fixes your issue.

As far as I can see, after the initial merge, new pull-requests now get immediately released on the beta-channel of the plugin store. I can already see version 1.0.12.

If you are interested, here is what caused the issue:

  • Every time, the configuration settings are saved, all buttons are deactivated and then reactivated with the new settings
  • Due to a tiny typo, an if...else condition always evaluated to false, the code inside the condition was never executed. Thus the event handlers for the interrupts were never removed and thus every save created an additional event handler.
  • At every button press, all the handlers fired at the same time and increased a counter that is evaluated against 1 before triggering the button action. With more than one handler, it will always be >1.
  • This never occured to me during testing, because after installing the plugin, I only set the parameters once and saved one time - every handler was only installed once.
  • The issue disappears, if you restart volumio - killing all the additional event handlers

v1.0.12 fixes the typo and now the condition correctly evaluates and removes the event handlers.

1 Like

Hi @T0MR0 ,

nice finding! I will try right away

This explains why it works fine for me too. Ive done so many installs and know what to input where. I only do it once.
Nice one :+1:

Hello

here is a working schematic view of the STEC11B03 encoder to the GPIO pins of the Raspberry.
Thanks to M1ck for his corrections.

Additionally my schematic view of a KY-040 encoder to the Raspberry in connection with an ALLO BOSS DAC. The GPIO PINS were chosen so that they do not collide with the GPIO PINS used by the ALLO BOSS DAC.

This works very good on a RPI3B+, Volumio 3.251 an RotaryEncoder II 1.0.11 plugin

Thanks T0MR0 four your great plugin

One suggestion for improvement: the KY-040 is just a regular rotary encoder. So it is probably just a typo that there is a 5V input connected to a 3.3V output. I‘d suggest to remove the 5V label, to prevent people from roasting their inputs, because they think they can as well supply the KY-040 with 5V. It will just pass any supply voltage to the GPIO and as stated above, 5V is too much. The picture is probably from a doc for Arduino - but the ATTiny can withstand higher voltages than the BCMs.

hey T0MR0
thanks for your improvements. I changed the picture above.

2 Likes

Hello.
First of all thanks for creating this plugin. It is a great extension for Volumio!
I’m building a new internet radio for my grandpa to replace the old ESP32 thing. And the old way with knobs and buttons is more easy to understand rather than touch and web.
I was playing around with encoder config changing periods per tick and GPIO settings.
it started working as a volume knob. but when I tried changing it to be Prev/Next title it fails with an error :

CALLMETHOD: system_hardware rotaryencoder2 updateEncoder [object Object]

If I try to disable it - it says :

error: [ROTARYENCODER2] detachListener: could not kill handler process

Even if I disable plugin and do a restart - it says that it is active.
If execute this command :

volumio@radio:/data$ sh /data/plugins/system_hardware/rotaryencoder2/uninstall.sh
Done
pluginuninstallend

but plugin is still there.

Hardware is a Raspberry PI 3B +
Plugin Version: 1.0.12
Volumio Version: 3.251

Even after system factory reset First config is working, but any change can not be updated, saved.

My goal is to have 2 knobs Volume/Program and start stop button.
Since it is a one time config I will try trial/error method to know a full config in order to save it once.
But maybe it can be fixed in plugin for other users.
Please let me know If I can provide more info for troubleshooting.
Many thanks,
Daniil

Hi Daniil,
welcome to the forum.
Sorry, that it does not work for you. I’ll try to help.

Few remarks already:

  • the uninstall.sh script is not the uninstall routine of the plugin, it is a standard script of the plugin system, that a plugin can use to install/uninstall additional things beside java scripts - rotaryencoder2 does not use it, because it does not require anything beside js
  • the error message about the handler process might point to the issue. Under the hood, the plugin connects to a kernel driver for the rotary, and the message means, that the plugin cannot disconnect from the handler - and then it may not be able to properly close or uninstall. I had this in early versions of the plugin, too - but did not observe it anymore after changing how the handle is released
  • I assume, that it happens due to the changing of settings you describe (“playing around”). It still should not be like that, so we can try to find out, where the issue is
  • when you say ‘restart’ do you mean a volumio vrestart or a reboot of the RPi?
  • It looks, like you can SSH into your Pi, could you generate a log file as described at the bottom of the first post in this thread? That may give me an idea, why the improved release process for the handler does not work in your case. Would be best, if you send it attached to a PM.

Hello,
Just collected logs on my RPI.
For the test I tried the following :

  • changing type prev/next → Volume

  • change one GPIO for encoder

  • Add pushbutton GPIO

For restart I tried both reboot and power off/on.
After some failed attempts I did a factory reset and installed plugin from scratch since uninstall was not working from UI.

From the first attempt I entered right values which are working but could not be changed/saved.

Thanks a lot.

I can’t attach logs since I’m a new user. will paste it here :

Logs:

-- Logs begin at Thu 2019-02-14 10:11:59 UTC. --
Jun 04 08:11:56 myradio volumio[679]: info: [ROTARYENCODER2] activateButtons: 1,2,3
Jun 04 08:11:56 myradio volumio[679]: info: [ROTARYENCODER2] activateButtons: 1,2
Jun 04 08:11:56 myradio volumio[679]: info: [ROTARYENCODER2] activateButtons: 1
Jun 04 08:11:56 myradio volumio[679]: info: [ROTARYENCODER2] activateButtons:
Jun 04 08:11:56 myradio volumio[679]: info: [ROTARYENCODER2] activateButtons: end of recursion.
Jun 04 08:11:56 myradio volumio[679]: info: [ROTARYENCODER2] Push Button 1 is disabled (no Gpio).
Jun 04 08:11:56 myradio volumio[679]: info: [ROTARYENCODER2] onStart: Plugin successfully started.
Jun 04 08:11:56 myradio volumio[679]: info: Done.
Jun 04 08:12:04 myradio volumio[679]: info: CoreCommandRouter::volumioGetState
Jun 04 08:12:04 myradio volumio[679]: info: CorePlayQueue::getTrack 2
Jun 04 08:12:14 myradio volumio[679]: info: CoreCommandRouter::volumioGetState
Jun 04 08:12:14 myradio volumio[679]: info: CorePlayQueue::getTrack 2
Jun 04 08:12:14 myradio volumio[679]: info: Listing playlists
Jun 04 08:12:14 myradio volumio[679]: info: Listing playlists
Jun 04 08:12:16 myradio volumio[679]: info: [ROTARYENCODER2] onStop: Stopping Plugin.
Jun 04 08:12:16 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries: 1,2,3
Jun 04 08:12:16 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries: 2,3
Jun 04 08:12:16 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries: 3
Jun 04 08:12:16 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries:
Jun 04 08:12:16 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries: end of recursion.
Jun 04 08:12:16 myradio volumio[679]: info: [ROTARYENCODER2] detachListener: [object Object]
Jun 04 08:12:16 myradio volumio[679]: info: [ROTARYENCODER2] detachListener: successfully killed handler process
Jun 04 08:12:16 myradio volumio[679]: info: [ROTARYENCODER2] checkOverlayExists: Checking for existing overlays for Rotary: 1
Jun 04 08:12:16 myradio sudo[11153]:  volumio : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/dtoverlay -l
Jun 04 08:12:16 myradio sudo[11153]: pam_unix(sudo:session): session opened for user root by (uid=0)
Jun 04 08:12:16 myradio sudo[11153]: pam_unix(sudo:session): session closed for user root
Jun 04 08:12:16 myradio volumio[679]: info: [ROTARYENCODER2] checkOverlayExists: check pinA=22pinB=27 in Overlays (in load order):
Jun 04 08:12:16 myradio volumio[679]: 0:  rotary-encoder  pin_a=22 pin_b=27 relative_axis=true steps-per-period=1
Jun 04 08:12:16 myradio volumio[679]: info: [ROTARYENCODER2] checkOverlayExists: rotary 1uses overlay 0
Jun 04 08:12:16 myradio volumio[679]: info: [ROTARYENCODER2] removeOverlay: 0
Jun 04 08:12:16 myradio sudo[11156]:  volumio : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/dtoverlay -r 0
Jun 04 08:12:16 myradio sudo[11156]: pam_unix(sudo:session): session opened for user root by (uid=0)
Jun 04 08:12:16 myradio volumio[679]: info: [ROTARYENCODER2] addEventHandle: Stream from rotary encoder ended.
Jun 04 08:12:16 myradio volumio[679]: info: [ROTARYENCODER2] addEventHandle: child process exited with code null
Jun 04 08:12:16 myradio sudo[11156]: pam_unix(sudo:session): session closed for user root
Jun 04 08:12:16 myradio volumio[679]: info: [ROTARYENCODER2] removeOverlay: 0 returned:
Jun 04 08:12:16 myradio sudo[11166]:  volumio : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/dtoverlay -l
Jun 04 08:12:16 myradio sudo[11166]: pam_unix(sudo:session): session opened for user root by (uid=0)
Jun 04 08:12:16 myradio sudo[11166]: pam_unix(sudo:session): session closed for user root
Jun 04 08:12:16 myradio volumio[679]: info: [ROTARYENCODER2] removeOverlay: "overlay -l" returned: No overlays loaded
Jun 04 08:12:16 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries: deactivated rotary1
Jun 04 08:12:16 myradio volumio[679]: info: [ROTARYENCODER2] deactivateButtons: 1,2,3
Jun 04 08:12:16 myradio volumio[679]: info: [ROTARYENCODER2] deactivateButtons: 2,3
Jun 04 08:12:16 myradio volumio[679]: info: [ROTARYENCODER2] deactivateButtons: 3
Jun 04 08:12:16 myradio volumio[679]: info: [ROTARYENCODER2] deactivateButtons:
Jun 04 08:12:16 myradio volumio[679]: info: [ROTARYENCODER2] deactivateButtons: end of recursion.
Jun 04 08:12:16 myradio volumio[679]: info: [ROTARYENCODER2] deactivateButtons: button 3 is disabled.
Jun 04 08:12:16 myradio volumio[679]: info: [ROTARYENCODER2] deactivateButtons: button 2 is disabled.
Jun 04 08:12:24 myradio volumio[679]: info: CoreCommandRouter::volumioGetState
Jun 04 08:12:24 myradio volumio[679]: info: CorePlayQueue::getTrack 2
Jun 04 08:12:26 myradio volumio[679]: info: [ROTARYENCODER2] onStop: Stopping Plugin.
Jun 04 08:12:26 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries: 1,2,3
Jun 04 08:12:26 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries: 2,3
Jun 04 08:12:26 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries: 3
Jun 04 08:12:26 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries:
Jun 04 08:12:26 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries: end of recursion.
Jun 04 08:12:26 myradio volumio[679]: info: [ROTARYENCODER2] detachListener: [object Object]
Jun 04 08:12:26 myradio volumio[679]: error: [ROTARYENCODER2] detachListener: could not kill handler process
Jun 04 08:12:31 myradio volumio[679]: info: CoreCommandRouter::getUIConfigOnPlugin
Jun 04 08:12:31 myradio volumio[679]: info: [ROTARYENCODER2] getUIConfig: starting:
Jun 04 08:12:31 myradio volumio[679]: info: [ROTARYENCODER2] getUIConfig: i18nStrings{"ROTARYENCODER2":{"CONFIG":"Rotary Encoder II Plugin Configuration","SAVE":"Save","ENCODER0":"Rotary Encoder 1","D_ENCODER0":"Settings for the first rotary encoder.","ENCODER1":"Rotary Encoder 2","D_ENCODER1":"Settings for the second rotary encoder.","ENCODER2":"Rotary Encoder 3","D_ENCODER2":"Settings for the third rotary encoder.","ROTARYTYPE":"Periods per tick","D_ROTARYTYPE":"Periods per tick (Full: A and B full period, half: A and B half period, quarter: A or B half period","FULL":"Full-period mode","HALF":"Half-period mode","QUARTER":"Quarter-period mode","PINA":"Pin A GPIO","D_PINA":"GPIO pin that is connected to the first pin of the rotary.","PINB":"Pin B GPIO","D_PINB":"GPIO pin that is connected to the second pin of the rotary.","DIALACTION":"Dial Action","D_DIALACTION":"Action to be triggered by turning the rotary encocer. Option 'Emit Websocket Message' can be used to control other plugins using the Volumio Websock calls between Plugins. (see https://volumio.github.io/docs/API/WebSocket_APIs.html section 'CallMethod on Plugin' for details)","DOTS":"...","VOLUME":"Volume","SKIP":"Prev/Next title","SEEK":"Seek in title","SCROLL":"Scroll","EMIT":"Emit Websocket Message","SOCKCMDCCW":"Command CCW","SOCKDATACCW":"Data CCW","SOCKCMDCW":"Command CW","SOCKDATACW":"Data CW","SOCKCMD":"Command","SOCKDATA":"Data","D_SOCKCMD":"Command to send via Websocket","D_SOCKDATA":"Data to include with the Websocket Command","PINPUSH":"Pushbutton GPIO","D_PINPUSH":"GPIO pin that is connected to the pushbutton pin of the rotary. 0 or empty to disable.","PINPUSHDEBOUNCE":"Debounce-time (ms)","D_PINPUSHDEBOUNCE":"Debounce time for the button. If the button has hardware-debouncing, set to 0.","PUSHSTATE":"Button logic-level active low","D_PUSHSTATE":"Activate this, if pressing the button pulls the logic level on the GPIO low.","PINPUSHDELAY":"Delay for a long button press (ms)","D_PINPUSHDEDELAY":"Minimum duration of a button press, that will trigger the long push action in ms","PINDOUBLEPUSHDELAY":"Maximum interval for double press (ms)","D_PINDOUBLEPUSHDEDELAY":"Time interval in ms, within which a double press has to be detected.","PUSHACTION":"Short Press Action","D_PUSHACTION":"Action that gets triggered, when pushbutton is pressed briefly.","LONGPUSHACTION":"Long Press Action","D_LONGPUSHACTION":"Action that gets triggered, when pushbutton is pressed longer.","DOUBLEPUSHACTION":"Double Press Action","D_DOUBLEPUSHACTION":"Action that gets triggered, when pushbutton is pressed twice quickly.","SET_DEBUG":"Debug Settings","D_SET_DEBUG":"Settings for functional debugging.","PLAY":"Play","PAUSE":"Pause","PLAYPAUSE":"Play/Pause toggle","STOP":"Stop","REPEAT":"Repeat","RANDOM":"Random","CLEARQUEUE":"Clear Queue","MUTE":"Mute","UNMUTE":"Unmute","TOGGLEMUTE":"Toggle Mute","SHUTDOWN":"System Shutdown","REBOOT":"System Reboot","RESTARTAPP":"Restart Application","DUMPLOG":"Dump logfile","LOGGING":"Logging","D_LOGGING":"Switch the output of log messages on or off. Error messages are always logged.","TOAST_START_SUCCESS":"Plugin successfully started.","TOAST_STOP_SUCCESS":"Plugin successfully stopped.","TOAST_START_FAIL":"Plugin failed to start.","TOAST_STOP_FAIL":"Plugin failed to stop.","TOAST_GPIO_BLOCKED":"GPIO Pin unavailable","TOAST_MSG_OVERLAY_BLOCKING":"Blocked by another overlay.","TOAST_SAVE_SUCCESS":"Successfully saved","TOAST_MSG_SAVE":"Settings for Encoder ","TOAST_DEBUG_SAVE":"Debug Settings","TOAST_SAVE_FAIL":"Save failed","TOAST_WRONG_PARAMETER":"Error in parameters","TOAST_NEEDS_INTEGER":"GPIO Pins must be Integers.","TOAST_PINS_DIFFERENT":"GPIO Pins for A/B/Button must be different.","TOAST_PINS_BLOCKED":"Pins already used in another Encoder.","TOAST_NO_TYPE":"Please select 'Periods per tick'!"}}
Jun 04 08:12:31 myradio volumio[679]: info: [ROTARYENCODER2] getUIConfig: i18nStringsDefaults{"ROTARYENCODER2":{"CONFIG":"Rotary Encoder II Plugin Configuration","SAVE":"Save","ENCODER0":"Rotary Encoder 1","D_ENCODER0":"Settings for the first rotary encoder.","ENCODER1":"Rotary Encoder 2","D_ENCODER1":"Settings for the second rotary encoder.","ENCODER2":"Rotary Encoder 3","D_ENCODER2":"Settings for the third rotary encoder.","ROTARYTYPE":"Periods per tick","D_ROTARYTYPE":"Periods per tick (Full: A and B full period, half: A and B half period, quarter: A or B half period","FULL":"Full-period mode","HALF":"Half-period mode","QUARTER":"Quarter-period mode","PINA":"Pin A GPIO","D_PINA":"GPIO pin that is connected to the first pin of the rotary.","PINB":"Pin B GPIO","D_PINB":"GPIO pin that is connected to the second pin of the rotary.","DIALACTION":"Dial Action","D_DIALACTION":"Action to be triggered by turning the rotary encocer. Option 'Emit Websocket Message' can be used to control other plugins using the Volumio Websock calls between Plugins. (see https://volumio.github.io/docs/API/WebSocket_APIs.html section 'CallMethod on Plugin' for details)","DOTS":"...","VOLUME":"Volume","SKIP":"Prev/Next title","SEEK":"Seek in title","SCROLL":"Scroll","EMIT":"Emit Websocket Message","SOCKCMDCCW":"Command CCW","SOCKDATACCW":"Data CCW","SOCKCMDCW":"Command CW","SOCKDATACW":"Data CW","SOCKCMD":"Command","SOCKDATA":"Data","D_SOCKCMD":"Command to send via Websocket","D_SOCKDATA":"Data to include with the Websocket Command","PINPUSH":"Pushbutton GPIO","D_PINPUSH":"GPIO pin that is connected to the pushbutton pin of the rotary. 0 or empty to disable.","PINPUSHDEBOUNCE":"Debounce-time (ms)","D_PINPUSHDEBOUNCE":"Debounce time for the button. If the button has hardware-debouncing, set to 0.","PUSHSTATE":"Button logic-level active low","D_PUSHSTATE":"Activate this, if pressing the button pulls the logic level on the GPIO low.","PINPUSHDELAY":"Delay for a long button press (ms)","D_PINPUSHDEDELAY":"Minimum duration of a button press, that will trigger the long push action in ms","PINDOUBLEPUSHDELAY":"Maximum interval for double press (ms)","D_PINDOUBLEPUSHDEDELAY":"Time interval in ms, within which a double press has to be detected.","PUSHACTION":"Short Press Action","D_PUSHACTION":"Action that gets triggered, when pushbutton is pressed briefly.","LONGPUSHACTION":"Long Press Action","D_LONGPUSHACTION":"Action that gets triggered, when pushbutton is pressed longer.","DOUBLEPUSHACTION":"Double Press Action","D_DOUBLEPUSHACTION":"Action that gets triggered, when pushbutton is pressed twice quickly.","SET_DEBUG":"Debug Settings","D_SET_DEBUG":"Settings for functional debugging.","PLAY":"Play","PAUSE":"Pause","PLAYPAUSE":"Play/Pause toggle","STOP":"Stop","REPEAT":"Repeat","RANDOM":"Random","CLEARQUEUE":"Clear Queue","MUTE":"Mute","UNMUTE":"Unmute","TOGGLEMUTE":"Toggle Mute","SHUTDOWN":"System Shutdown","REBOOT":"System Reboot","RESTARTAPP":"Restart Application","DUMPLOG":"Dump logfile","LOGGING":"Logging","D_LOGGING":"Switch the output of log messages on or off. Error messages are always logged.","TOAST_START_SUCCESS":"Plugin successfully started.","TOAST_STOP_SUCCESS":"Plugin successfully stopped.","TOAST_START_FAIL":"Plugin failed to start.","TOAST_STOP_FAIL":"Plugin failed to stop.","TOAST_GPIO_BLOCKED":"GPIO Pin unavailable","TOAST_MSG_OVERLAY_BLOCKING":"Blocked by another overlay.","TOAST_SAVE_SUCCESS":"Successfully saved","TOAST_MSG_SAVE":"Settings for Encoder ","TOAST_DEBUG_SAVE":"Debug Settings","TOAST_SAVE_FAIL":"Save failed","TOAST_WRONG_PARAMETER":"Error in parameters","TOAST_NEEDS_INTEGER":"GPIO Pins must be Integers.","TOAST_PINS_DIFFERENT":"GPIO Pins for A/B/Button must be different.","TOAST_PINS_BLOCKED":"Pins already used in another Encoder.","TOAST_NO_TYPE":"Please select 'Periods per tick'!"}}
Jun 04 08:12:31 myradio volumio[679]: info: [ROTARYENCODER2] getUIConfig: language code: en dir: /data/plugins/system_hardware/rotaryencoder2
Jun 04 08:12:31 myradio volumio[679]: info: [ROTARYENCODER2] getI18nString("SKIP"):Prev/Next title
Jun 04 08:12:31 myradio volumio[679]: info: [ROTARYENCODER2] getI18nString("DOTS"):...
Jun 04 08:12:31 myradio volumio[679]: info: [ROTARYENCODER2] getI18nString("DOTS"):...
Jun 04 08:12:31 myradio volumio[679]: info: [ROTARYENCODER2] getI18nString("DOTS"):...
Jun 04 08:12:31 myradio volumio[679]: info: [ROTARYENCODER2] getI18nString("DOTS"):...
Jun 04 08:12:31 myradio volumio[679]: info: [ROTARYENCODER2] getI18nString("DOTS"):...
Jun 04 08:12:31 myradio volumio[679]: info: [ROTARYENCODER2] getI18nString("DOTS"):...
Jun 04 08:12:31 myradio volumio[679]: info: [ROTARYENCODER2] getI18nString("DOTS"):...
Jun 04 08:12:31 myradio volumio[679]: info: [ROTARYENCODER2] getI18nString("DOTS"):...
Jun 04 08:12:31 myradio volumio[679]: info: [ROTARYENCODER2] getI18nString("DOTS"):...
Jun 04 08:12:31 myradio volumio[679]: info: [ROTARYENCODER2] getI18nString("DOTS"):...
Jun 04 08:12:34 myradio volumio[679]: info: CoreCommandRouter::volumioGetState
Jun 04 08:12:34 myradio volumio[679]: info: CorePlayQueue::getTrack 2
Jun 04 08:12:34 myradio volumio[679]: info: Listing playlists
Jun 04 08:12:34 myradio volumio[679]: info: Listing playlists
Jun 04 08:12:37 myradio volumio[679]: info: CALLMETHOD: system_hardware rotaryencoder2 updateEncoder [object Object]
Jun 04 08:12:37 myradio volumio[679]: info: CoreCommandRouter::executeOnPlugin: rotaryencoder2 , updateEncoder
Jun 04 08:12:37 myradio volumio[679]: info: [ROTARYENCODER2] updateEncoder: Rotary1 with:{"enabled0":true,"rotaryType0":{"value":1,"label":"1/1"},"pinA0":22,"pinB0":27,"dialAction0":{"value":1,"label":"Volume"},"socketCmdCCW0":"","socketDataCCW0":"","socketCmdCW0":"","socketDataCW0":"","pinPush0":0,"pinPushDebounce0":5,"pushState0":false,"pushAction0":{"value":0,"label":"..."},"socketCmdPush0":"","socketDataPush0":"","longPushAction0":{"value":0,"label":"..."},"socketCmdLongPush0":"","socketDataLongPush0":"","delayLongPush0":"1500","doublePushAction0":{"value":0,"label":"..."},"socketCmdDoublePush0":"","socketDataDoublePush0":"","delayDoublePush0":"700"}
Jun 04 08:12:37 myradio volumio[679]: info: [ROTARYENCODER2] sanityCheckSettings: Rotary1 for:{"enabled0":true,"rotaryType0":{"value":1,"label":"1/1"},"pinA0":22,"pinB0":27,"dialAction0":{"value":1,"label":"Volume"},"socketCmdCCW0":"","socketDataCCW0":"","socketCmdCW0":"","socketDataCW0":"","pinPush0":0,"pinPushDebounce0":5,"pushState0":false,"pushAction0":{"value":0,"label":"..."},"socketCmdPush0":"","socketDataPush0":"","longPushAction0":{"value":0,"label":"..."},"socketCmdLongPush0":"","socketDataLongPush0":"","delayLongPush0":"1500","doublePushAction0":{"value":0,"label":"..."},"socketCmdDoublePush0":"","socketDataDoublePush0":"","delayDoublePush0":"700"}
Jun 04 08:12:37 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries: 1,2,3
Jun 04 08:12:37 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries: 2,3
Jun 04 08:12:37 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries: 3
Jun 04 08:12:37 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries:
Jun 04 08:12:37 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries: end of recursion.
Jun 04 08:12:37 myradio volumio[679]: info: [ROTARYENCODER2] detachListener: [object Object]
Jun 04 08:12:37 myradio volumio[679]: error: [ROTARYENCODER2] detachListener: could not kill handler process
Jun 04 08:12:44 myradio volumio[679]: info: CoreCommandRouter::volumioGetState
Jun 04 08:12:44 myradio volumio[679]: info: CorePlayQueue::getTrack 2
Jun 04 08:12:49 myradio volumio[679]: info: CALLMETHOD: system_hardware rotaryencoder2 updateEncoder [object Object]
Jun 04 08:12:49 myradio volumio[679]: info: CoreCommandRouter::executeOnPlugin: rotaryencoder2 , updateEncoder
Jun 04 08:12:49 myradio volumio[679]: info: [ROTARYENCODER2] updateEncoder: Rotary1 with:{"enabled0":true,"rotaryType0":{"value":1,"label":"1/1"},"pinA0":"23","pinB0":27,"dialAction0":{"value":1,"label":"Volume"},"socketCmdCCW0":"","socketDataCCW0":"","socketCmdCW0":"","socketDataCW0":"","pinPush0":0,"pinPushDebounce0":5,"pushState0":false,"pushAction0":{"value":0,"label":"..."},"socketCmdPush0":"","socketDataPush0":"","longPushAction0":{"value":0,"label":"..."},"socketCmdLongPush0":"","socketDataLongPush0":"","delayLongPush0":"1500","doublePushAction0":{"value":0,"label":"..."},"socketCmdDoublePush0":"","socketDataDoublePush0":"","delayDoublePush0":"700"}
Jun 04 08:12:49 myradio volumio[679]: info: [ROTARYENCODER2] sanityCheckSettings: Rotary1 for:{"enabled0":true,"rotaryType0":{"value":1,"label":"1/1"},"pinA0":"23","pinB0":27,"dialAction0":{"value":1,"label":"Volume"},"socketCmdCCW0":"","socketDataCCW0":"","socketCmdCW0":"","socketDataCW0":"","pinPush0":0,"pinPushDebounce0":5,"pushState0":false,"pushAction0":{"value":0,"label":"..."},"socketCmdPush0":"","socketDataPush0":"","longPushAction0":{"value":0,"label":"..."},"socketCmdLongPush0":"","socketDataLongPush0":"","delayLongPush0":"1500","doublePushAction0":{"value":0,"label":"..."},"socketCmdDoublePush0":"","socketDataDoublePush0":"","delayDoublePush0":"700"}
Jun 04 08:12:49 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries: 1,2,3
Jun 04 08:12:49 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries: 2,3
Jun 04 08:12:49 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries: 3
Jun 04 08:12:49 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries:
Jun 04 08:12:49 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries: end of recursion.
Jun 04 08:12:49 myradio volumio[679]: info: [ROTARYENCODER2] detachListener: [object Object]
Jun 04 08:12:49 myradio volumio[679]: error: [ROTARYENCODER2] detachListener: could not kill handler process
Jun 04 08:12:54 myradio volumio[679]: info: CoreCommandRouter::volumioGetState
Jun 04 08:12:54 myradio volumio[679]: info: CorePlayQueue::getTrack 2
Jun 04 08:12:55 myradio volumio[679]: info: Listing playlists
Jun 04 08:12:55 myradio volumio[679]: info: Listing playlists
Jun 04 08:13:03 myradio volumio[679]: info: CALLMETHOD: system_hardware rotaryencoder2 updateEncoder [object Object]
Jun 04 08:13:03 myradio volumio[679]: info: CoreCommandRouter::executeOnPlugin: rotaryencoder2 , updateEncoder
Jun 04 08:13:03 myradio volumio[679]: info: [ROTARYENCODER2] updateEncoder: Rotary1 with:{"enabled0":true,"rotaryType0":{"value":1,"label":"1/1"},"pinA0":"23","pinB0":27,"dialAction0":{"value":1,"label":"Volume"},"socketCmdCCW0":"","socketDataCCW0":"","socketCmdCW0":"","socketDataCW0":"","pinPush0":"14","pinPushDebounce0":5,"pushState0":false,"pushAction0":{"value":0,"label":"..."},"socketCmdPush0":"","socketDataPush0":"","longPushAction0":{"value":0,"label":"..."},"socketCmdLongPush0":"","socketDataLongPush0":"","delayLongPush0":"1500","doublePushAction0":{"value":0,"label":"..."},"socketCmdDoublePush0":"","socketDataDoublePush0":"","delayDoublePush0":"700"}
Jun 04 08:13:03 myradio volumio[679]: info: [ROTARYENCODER2] sanityCheckSettings: Rotary1 for:{"enabled0":true,"rotaryType0":{"value":1,"label":"1/1"},"pinA0":"23","pinB0":27,"dialAction0":{"value":1,"label":"Volume"},"socketCmdCCW0":"","socketDataCCW0":"","socketCmdCW0":"","socketDataCW0":"","pinPush0":"14","pinPushDebounce0":5,"pushState0":false,"pushAction0":{"value":0,"label":"..."},"socketCmdPush0":"","socketDataPush0":"","longPushAction0":{"value":0,"label":"..."},"socketCmdLongPush0":"","socketDataLongPush0":"","delayLongPush0":"1500","doublePushAction0":{"value":0,"label":"..."},"socketCmdDoublePush0":"","socketDataDoublePush0":"","delayDoublePush0":"700"}
Jun 04 08:13:03 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries: 1,2,3
Jun 04 08:13:03 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries: 2,3
Jun 04 08:13:03 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries: 3
Jun 04 08:13:03 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries:
Jun 04 08:13:03 myradio volumio[679]: info: [ROTARYENCODER2] deactivateRotaries: end of recursion.
Jun 04 08:13:03 myradio volumio[679]: info: [ROTARYENCODER2] detachListener: [object Object]
Jun 04 08:13:03 myradio volumio[679]: error: [ROTARYENCODER2] detachListener: could not kill handler process
Jun 04 08:13:04 myradio volumio[679]: info: CoreCommandRouter::volumioGetState
Jun 04 08:13:04 myradio volumio[679]: info: CorePlayQueue::getTrack 2
Jun 04 08:13:11 myradio nmbd[596]: [2022/06/04 08:13:11.742023,  0] ../source3/nmbd/nmbd_namequery.c:109(query_name_response)
Jun 04 08:13:11 myradio nmbd[596]:   query_name_response: Multiple (2) responses received for a query on subnet 192.XXX.X.XXX for name WORKGROUP<1d>.
Jun 04 08:13:11 myradio nmbd[596]:   This response was from IP 192.XXX.X.X, reporting an IP address of 192.168.0.1.
Jun 04 08:13:14 myradio volumio[679]: info: CALLMETHOD: system_hardware rotaryencoder2 updateDebugSettings [object Object]
Jun 04 08:13:14 myradio volumio[679]: info: CoreCommandRouter::executeOnPlugin: rotaryencoder2 , updateDebugSettings
Jun 04 08:13:14 myradio volumio[679]: info: [ROTARYENCODER2] updateDebugSettings: Saving Debug Settings:{"logging":false}
Jun 04 08:13:14 myradio volumio[679]: info: CoreCommandRouter::volumioGetState
Jun 04 08:13:15 myradio volumio[679]: info: CorePlayQueue::getTrack 2
Jun 04 08:13:15 myradio volumio[679]: info: Listing playlists
Jun 04 08:13:15 myradio volumio[679]: info: Listing playlists
Jun 04 08:13:23 myradio volumio[679]: info: CoreCommandRouter::executeOnPlugin: my_volumio , getMyVolumioStatus
Jun 04 08:13:23 myradio volumio[679]: info: CoreCommandRouter::executeOnPlugin: my_volumio , getMyVolumioToken
Jun 04 08:13:25 myradio volumio[679]: info: CoreCommandRouter::volumioGetState
Jun 04 08:13:25 myradio volumio[679]: info: CorePlayQueue::getTrack 2
Jun 04 08:13:25 myradio volumio[679]: info: Enabling plugin rotaryencoder2
Jun 04 08:13:25 myradio volumio[679]: info: Loading plugin "rotaryencoder2"...
Jun 04 08:13:25 myradio volumio[679]: info: PLUGIN START: rotaryencoder2
Jun 04 08:13:25 myradio volumio[679]: verbose: New Socket.io Connection to localhost:3000 from 127.0.0.1 UA: node-XMLHttpRequest Total Clients: 9
Jun 04 08:13:25 myradio sudo[11172]:  volumio : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/dtoverlay rotary-encoder pin_a=22 pin_b=27 relative_axis=true steps-per-period=1
Jun 04 08:13:25 myradio sudo[11172]: pam_unix(sudo:session): session opened for user root by (uid=0)
Jun 04 08:13:25 myradio volumio[679]: info: CoreCommandRouter::volumioGetState
Jun 04 08:13:25 myradio volumio[679]: info: CorePlayQueue::getTrack 2
Jun 04 08:13:25 myradio kernel: rotary-encoder rotary@16: gray
Jun 04 08:13:25 myradio kernel: input: rotary@16 as /devices/platform/rotary@16/input/input7
Jun 04 08:13:25 myradio sudo[11172]: pam_unix(sudo:session): session closed for user root
Jun 04 08:13:25 myradio systemd-udevd[11177]: Process '/usr/sbin/th-cmd --socket /var/run/thd.socket --passfd --udev' failed with exit code 1.
Jun 04 08:13:26 myradio volumio[679]: info: Done.
Jun 04 08:13:33 myradio sudo[11189]:  volumio : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/dtoverlay -l
Jun 04 08:13:33 myradio sudo[11189]: pam_unix(sudo:session): session opened for user root by (uid=0)
Jun 04 08:13:33 myradio sudo[11189]: pam_unix(sudo:session): session closed for user root
Jun 04 08:13:33 myradio sudo[11192]:  volumio : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/dtoverlay -r 0
Jun 04 08:13:33 myradio sudo[11192]: pam_unix(sudo:session): session opened for user root by (uid=0)
Jun 04 08:13:33 myradio sudo[11192]: pam_unix(sudo:session): session closed for user root
Jun 04 08:13:33 myradio sudo[11202]:  volumio : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/dtoverlay -l
Jun 04 08:13:33 myradio sudo[11202]: pam_unix(sudo:session): session opened for user root by (uid=0)
Jun 04 08:13:33 myradio sudo[11202]: pam_unix(sudo:session): session closed for user root
Jun 04 08:13:35 myradio volumio[679]: info: CoreCommandRouter::volumioGetState
Jun 04 08:13:35 myradio volumio[679]: info: CorePlayQueue::getTrack 2
Jun 04 08:13:35 myradio volumio[679]: info: Listing playlists
Jun 04 08:13:35 myradio volumio[679]: info: Listing playlists

Hi Daniil,
thanks for reporting this, you actually found a bug, that I never observed during testing.
I already have a fix - just commited and already online - please try if v1.0.13 solves your issue.

Best regards,
Thomas

1 Like

Hello,
Thank you a lot for your help.
A workaround you’ve provided helped me to overcome this weird bug.

volumio vstop
cp /data/plugins/system_hardware/rotaryencoder2/config.json /data/configuration/system_hardware/rotaryencoder2/config.json
volumio vrestart

Unfortunately the V 1.0.13 still has issues if I try to change pin assignment or debounce time.
But at least I can continue configuring this device.

Logs
volumio@myradio:/data/plugins$ journalctl -f
-- Logs begin at Sat 2022-06-04 14:16:27 UTC. --
Jun 05 07:49:25 myradio volumio[19499]: info: CoreCommandRouter::executeOnPlugin: i2s_dacs , getI2sStatus
Jun 05 07:49:25 myradio volumio[19499]: info: CoreCommandRouter::executeOnPlugin: system , versionChangeDetect
Jun 05 07:49:27 myradio volumio[19499]: info: CoreCommandRouter::volumioGetState
Jun 05 07:49:27 myradio volumio[19499]: info: CorePlayQueue::getTrack 0
Jun 05 07:49:37 myradio volumio[19499]: info: CoreCommandRouter::volumioGetState
Jun 05 07:49:37 myradio volumio[19499]: info: CorePlayQueue::getTrack 0
Jun 05 07:49:37 myradio volumio[19499]: info: Listing playlists
Jun 05 07:49:37 myradio volumio[19499]: info: Listing playlists
Jun 05 07:49:47 myradio volumio[19499]: info: CoreCommandRouter::volumioGetState
Jun 05 07:49:47 myradio volumio[19499]: info: CorePlayQueue::getTrack 0
Jun 05 07:49:51 myradio volumio[19499]: info: CALLMETHOD: system_hardware rotaryencoder2 updateDebugSettings [object Object]
Jun 05 07:49:52 myradio volumio[19499]: info: CoreCommandRouter::executeOnPlugin: rotaryencoder2 , updateDebugSettings
Jun 05 07:49:52 myradio volumio[19499]: info: [ROTARYENCODER2] getI18nString("TOAST_SAVE_SUCCESS"):Successfully saved
Jun 05 07:49:52 myradio volumio[19499]: info: [ROTARYENCODER2] getI18nString("TOAST_DEBUG_SAVE"):Debug Settings
Jun 05 07:49:56 myradio volumio[19499]: info: CoreCommandRouter::executeOnPlugin: my_volumio , getMyVolumioStatus
Jun 05 07:49:56 myradio volumio[19499]: info: CoreCommandRouter::executeOnPlugin: my_volumio , getMyVolumioToken
Jun 05 07:49:57 myradio volumio[19499]: info: CoreCommandRouter::volumioGetState
Jun 05 07:49:57 myradio volumio[19499]: info: CorePlayQueue::getTrack 0
Jun 05 07:49:57 myradio volumio[19499]: info: Listing playlists
Jun 05 07:49:57 myradio volumio[19499]: info: Listing playlists
Jun 05 07:50:00 myradio volumio[19499]: info: [ROTARYENCODER2] onStop: Stopping Plugin.
Jun 05 07:50:00 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateRotaries: 1,2,3
Jun 05 07:50:00 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateRotaries: 2,3
Jun 05 07:50:00 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateRotaries: 3
Jun 05 07:50:00 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateRotaries:
Jun 05 07:50:00 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateRotaries: end of recursion.
Jun 05 07:50:00 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateButtons: 1,2,3
Jun 05 07:50:00 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateButtons: 2,3
Jun 05 07:50:00 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateButtons: 3
Jun 05 07:50:00 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateButtons:
Jun 05 07:50:00 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateButtons: end of recursion.
Jun 05 07:50:00 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateButtons: button 3 is disabled.
Jun 05 07:50:00 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateButtons: button 2 is disabled.
Jun 05 07:50:00 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateButtons: button 1 is disabled.
Jun 05 07:50:00 myradio volumio[19499]: info: [ROTARYENCODER2] getI18nString("TOAST_STOP_SUCCESS"):Plugin successfully stopped.
Jun 05 07:50:00 myradio volumio[19499]: info: [ROTARYENCODER2] onStop: Plugin successfully stopped.
Jun 05 07:50:00 myradio volumio[19499]: info: Disabling plugin rotaryencoder2
Jun 05 07:50:00 myradio volumio[19499]: info: Done.
Jun 05 07:50:01 myradio volumio[19499]: info: Enabling plugin rotaryencoder2
Jun 05 07:50:01 myradio volumio[19499]: info: Loading plugin "rotaryencoder2"...
Jun 05 07:50:01 myradio volumio[19499]: info: PLUGIN START: rotaryencoder2
Jun 05 07:50:01 myradio volumio[19499]: info: [ROTARYENCODER2] loadI18nStrings: /data/plugins/system_hardware/rotaryencoder2/i18n/strings_en.json
Jun 05 07:50:01 myradio volumio[19499]: info: [ROTARYENCODER2] loadI18nStrings: loaded: {"ROTARYENCODER2":{"CONFIG":"Rotary Encoder II Plugin Configuration","SAVE":"Save","ENCODER0":"Rotary Encoder 1","D_ENCODER0":"Settings for the first rotary encoder.","ENCODER1":"Rotary Encoder 2","D_ENCODER1":"Settings for the second rotary encoder.","ENCODER2":"Rotary Encoder 3","D_ENCODER2":"Settings for the third rotary encoder.","ROTARYTYPE":"Periods per tick","D_ROTARYTYPE":"Periods per tick (Full: A and B full period, half: A and B half period, quarter: A or B half period","FULL":"Full-period mode","HALF":"Half-period mode","QUARTER":"Quarter-period mode","PINA":"Pin A GPIO","D_PINA":"GPIO pin that is connected to the first pin of the rotary.","PINB":"Pin B GPIO","D_PINB":"GPIO pin that is connected to the second pin of the rotary.","DIALACTION":"Dial Action","D_DIALACTION":"Action to be triggered by turning the rotary encocer. Option 'Emit Websocket Message' can be used to control other plugins using the Volumio Websock calls between Plugins. (see https://volumio.github.io/docs/API/WebSocket_APIs.html section 'CallMethod on Plugin' for details)","DOTS":"...","VOLUME":"Volume","SKIP":"Prev/Next title","SEEK":"Seek in title","SCROLL":"Scroll","EMIT":"Emit Websocket Message","SOCKCMDCCW":"Command CCW","SOCKDATACCW":"Data CCW","SOCKCMDCW":"Command CW","SOCKDATACW":"Data CW","SOCKCMD":"Command","SOCKDATA":"Data","D_SOCKCMD":"Command to send via Websocket","D_SOCKDATA":"Data to include with the Websocket Command","PINPUSH":"Pushbutton GPIO","D_PINPUSH":"GPIO pin that is connected to the pushbutton pin of the rotary. 0 or empty to disable.","PINPUSHDEBOUNCE":"Debounce-time (ms)","D_PINPUSHDEBOUNCE":"Debounce time for the button. If the button has hardware-debouncing, set to 0.","PUSHSTATE":"Button logic-level active low","D_PUSHSTATE":"Activate this, if pressing the button pulls the logic level on the GPIO low.","PINPUSHDELAY":"Delay for a long button press (ms)","D_PINPUSHDEDELAY":"Minimum duration of a button press, that will trigger the long push action in ms","PINDOUBLEPUSHDELAY":"Maximum interval for double press (ms)","D_PINDOUBLEPUSHDEDELAY":"Time interval in ms, within which a double press has to be detected.","PUSHACTION":"Short Press Action","D_PUSHACTION":"Action that gets triggered, when pushbutton is pressed briefly.","LONGPUSHACTION":"Long Press Action","D_LONGPUSHACTION":"Action that gets triggered, when pushbutton is pressed longer.","DOUBLEPUSHACTION":"Double Press Action","D_DOUBLEPUSHACTION":"Action that gets triggered, when pushbutton is pressed twice quickly.","SET_DEBUG":"Debug Settings","D_SET_DEBUG":"Settings for functional debugging.","PLAY":"Play","PAUSE":"Pause","PLAYPAUSE":"Play/Pause toggle","STOP":"Stop","REPEAT":"Repeat","RANDOM":"Random","CLEARQUEUE":"Clear Queue","MUTE":"Mute","UNMUTE":"Unmute","TOGGLEMUTE":"Toggle Mute","SHUTDOWN":"System Shutdown","REBOOT":"System Reboot","RESTARTAPP":"Restart Application","DUMPLOG":"Dump logfile","LOGGING":"Logging","D_LOGGING":"Switch the output of log messages on or off. Error messages are always logged.","TOAST_START_SUCCESS":"Plugin successfully started.","TOAST_STOP_SUCCESS":"Plugin successfully stopped.","TOAST_START_FAIL":"Plugin failed to start.","TOAST_STOP_FAIL":"Plugin failed to stop.","TOAST_GPIO_BLOCKED":"GPIO Pin unavailable","TOAST_MSG_OVERLAY_BLOCKING":"Blocked by another overlay.","TOAST_SAVE_SUCCESS":"Successfully saved","TOAST_MSG_SAVE":"Settings for Encoder ","TOAST_DEBUG_SAVE":"Debug Settings","TOAST_SAVE_FAIL":"Save failed","TOAST_WRONG_PARAMETER":"Error in parameters","TOAST_NEEDS_INTEGER":"GPIO Pins must be Integers.","TOAST_PINS_DIFFERENT":"GPIO Pins for A/B/Button must be different.","TOAST_PINS_BLOCKED":"Pins already used in another Encoder.","TOAST_NO_TYPE":"Please select 'Periods per tick'!"}}
Jun 05 07:50:01 myradio volumio[19499]: info: [ROTARYENCODER2] onStart: Config loaded: {"syncSave":true,"autosave":true,"autosaveDelay":1000,"saved":true,"atomicSave":false,"data":{"enabled0":{"type":"boolean","value":false},"rotaryType0":{"type":"number","value":0},"pinA0":{"type":"string","value":""},"pinB0":{"type":"string","value":""},"dialAction0":{"type":"number","value":0},"socketCmdCW0":{"type":"string","value":""},"socketDataCW0":{"type":"string","value":""},"socketCmdCCW0":{"type":"string","value":""},"socketDataCCW0":{"type":"string","value":""},"pinPush0":{"type":"number","value":0},"pinPushDebounce0":{"type":"number","value":0},"pushState0":{"type":"boolean","value":false},"pushAction0":{"type":"number","value":0},"socketCmdPush0":{"type":"string","value":""},"socketDataPush0":{"type":"string","value":""},"longPushAction0":{"type":"number","value":0},"socketCmdLongPush0":{"type":"string","value":""},"socketDataLongPush0":{"type":"string","value":""},"delayLongPush0":{"type":"string","value":"1500"},"doublePushAction0":{"type":"number","value":0},"socketCmdDoublePush0":{"type":"string","value":""},"socketDataDoublePush0":{"type":"string","value":""},"delayDoublePush0":{"type":"string","value":"700"},"enabled1":{"type":"boolean","value":false},"rotaryType1":{"type":"number","value":0},"pinA1":{"type":"string","value":""},"pinB1":{"type":"string","value":""},"dialAction1":{"type":"number","value":0},"socketCmdCW1":{"type":"string","value":""},"socketDataCW1":{"type":"string","value":""},"socketCmdCCW1":{"type":"string","value":""},"socketDataCCW1":{"type":"string","value":""},"pinPush1":{"type":"number","value":0},"pinPushDebounce1":{"type":"number","value":0},"pushState1":{"type":"boolean","value":false},"pushAction1":{"type":"number","value":0},"socketCmdPush1":{"type":"string","value":""},"socketDataPush1":{"type":"string","value":""},"longPushAction1":{"type":"number","value":0},"socketCmdLongPush1":{"type":"string","value":""},"socketDataLongPush1":{"type":"string","value":""},"delayLongPush1":{"type":"string","value":"1500"},"doublePushAction1":{"type":"number","value":0},"socketCmdDoublePush1":{"type":"string","value":""},"socketDataDoublePush1":{"type":"string","value":""},"delayDoublePush1":{"type":"string","value":"700"},"enabled2":{"type":"boolean","value":false},"rotaryType2":{"type":"number","value":0},"pinA2":{"type":"string","value":""},"pinB2":{"type":"string","value":""},"dialAction2":{"type":"number","value":0},"socketCmdCW2":{"type":"string","value":""},"socketDataCW2":{"type":"string","value":""},"socketCmdCCW2":{"type":"string","value":""},"socketDataCCW2":{"type":"string","value":""},"pinPush2":{"type":"number","value":0},"pinPushDebounce2":{"type":"number","value":0},"pushState2":{"type":"boolean","value":false},"pushAction2":{"type":"number","value":0},"socketCmdPush2":{"type":"string","value":""},"socketDataPush2":{"type":"string","value":""},"longPushAction2":{"type":"number","value":0},"socketCmdLongPush2":{"type":"string","value":""},"socketDataLongPush2":{"type":"string","value":""},"delayLongPush2":{"type":"string","value":"1500"},"doublePushAction2":{"type":"number","value":0},"socketCmdDoublePush2":{"type":"string","value":""},"socketDataDoublePush2":{"type":"string","value":""},"delayDoublePush2":{"type":"string","value":"700"},"logging":{"type":"boolean","value":true}},"callbacks":{"_":{}},"filePath":"/data/configuration/system_hardware/rotaryencoder2/config.json"}
Jun 05 07:50:01 myradio volumio[19499]: info: [ROTARYENCODER2] activateRotaries: 1,2,3
Jun 05 07:50:01 myradio volumio[19499]: info: [ROTARYENCODER2] activateRotaries: 1,2
Jun 05 07:50:01 myradio volumio[19499]: info: [ROTARYENCODER2] activateRotaries: 1
Jun 05 07:50:01 myradio volumio[19499]: info: [ROTARYENCODER2] activateRotaries:
Jun 05 07:50:01 myradio volumio[19499]: info: [ROTARYENCODER2] activateRotaries: end of recursion.
Jun 05 07:50:01 myradio volumio[19499]: info: [ROTARYENCODER2] activateButtons: 1,2,3
Jun 05 07:50:01 myradio volumio[19499]: info: [ROTARYENCODER2] activateButtons: 1,2
Jun 05 07:50:01 myradio volumio[19499]: info: [ROTARYENCODER2] activateButtons: 1
Jun 05 07:50:01 myradio volumio[19499]: info: [ROTARYENCODER2] activateButtons:
Jun 05 07:50:01 myradio volumio[19499]: info: [ROTARYENCODER2] activateButtons: end of recursion.
Jun 05 07:50:01 myradio volumio[19499]: info: [ROTARYENCODER2] onStart: Plugin successfully started.
Jun 05 07:50:01 myradio volumio[19499]: info: Done.
Jun 05 07:50:01 myradio volumio[19499]: verbose: New Socket.io Connection to localhost:3000 from 127.0.0.1 UA: node-XMLHttpRequest Total Clients: 7
Jun 05 07:50:01 myradio volumio[19499]: info: CoreCommandRouter::volumioGetState
Jun 05 07:50:01 myradio volumio[19499]: info: CorePlayQueue::getTrack 0
Jun 05 07:50:04 myradio volumio[19499]: info: CoreCommandRouter::getUIConfigOnPlugin
Jun 05 07:50:04 myradio volumio[19499]: info: [ROTARYENCODER2] getUIConfig: starting:
Jun 05 07:50:04 myradio volumio[19499]: info: [ROTARYENCODER2] getUIConfig: i18nStrings{"ROTARYENCODER2":{"CONFIG":"Rotary Encoder II Plugin Configuration","SAVE":"Save","ENCODER0":"Rotary Encoder 1","D_ENCODER0":"Settings for the first rotary encoder.","ENCODER1":"Rotary Encoder 2","D_ENCODER1":"Settings for the second rotary encoder.","ENCODER2":"Rotary Encoder 3","D_ENCODER2":"Settings for the third rotary encoder.","ROTARYTYPE":"Periods per tick","D_ROTARYTYPE":"Periods per tick (Full: A and B full period, half: A and B half period, quarter: A or B half period","FULL":"Full-period mode","HALF":"Half-period mode","QUARTER":"Quarter-period mode","PINA":"Pin A GPIO","D_PINA":"GPIO pin that is connected to the first pin of the rotary.","PINB":"Pin B GPIO","D_PINB":"GPIO pin that is connected to the second pin of the rotary.","DIALACTION":"Dial Action","D_DIALACTION":"Action to be triggered by turning the rotary encocer. Option 'Emit Websocket Message' can be used to control other plugins using the Volumio Websock calls between Plugins. (see https://volumio.github.io/docs/API/WebSocket_APIs.html section 'CallMethod on Plugin' for details)","DOTS":"...","VOLUME":"Volume","SKIP":"Prev/Next title","SEEK":"Seek in title","SCROLL":"Scroll","EMIT":"Emit Websocket Message","SOCKCMDCCW":"Command CCW","SOCKDATACCW":"Data CCW","SOCKCMDCW":"Command CW","SOCKDATACW":"Data CW","SOCKCMD":"Command","SOCKDATA":"Data","D_SOCKCMD":"Command to send via Websocket","D_SOCKDATA":"Data to include with the Websocket Command","PINPUSH":"Pushbutton GPIO","D_PINPUSH":"GPIO pin that is connected to the pushbutton pin of the rotary. 0 or empty to disable.","PINPUSHDEBOUNCE":"Debounce-time (ms)","D_PINPUSHDEBOUNCE":"Debounce time for the button. If the button has hardware-debouncing, set to 0.","PUSHSTATE":"Button logic-level active low","D_PUSHSTATE":"Activate this, if pressing the button pulls the logic level on the GPIO low.","PINPUSHDELAY":"Delay for a long button press (ms)","D_PINPUSHDEDELAY":"Minimum duration of a button press, that will trigger the long push action in ms","PINDOUBLEPUSHDELAY":"Maximum interval for double press (ms)","D_PINDOUBLEPUSHDEDELAY":"Time interval in ms, within which a double press has to be detected.","PUSHACTION":"Short Press Action","D_PUSHACTION":"Action that gets triggered, when pushbutton is pressed briefly.","LONGPUSHACTION":"Long Press Action","D_LONGPUSHACTION":"Action that gets triggered, when pushbutton is pressed longer.","DOUBLEPUSHACTION":"Double Press Action","D_DOUBLEPUSHACTION":"Action that gets triggered, when pushbutton is pressed twice quickly.","SET_DEBUG":"Debug Settings","D_SET_DEBUG":"Settings for functional debugging.","PLAY":"Play","PAUSE":"Pause","PLAYPAUSE":"Play/Pause toggle","STOP":"Stop","REPEAT":"Repeat","RANDOM":"Random","CLEARQUEUE":"Clear Queue","MUTE":"Mute","UNMUTE":"Unmute","TOGGLEMUTE":"Toggle Mute","SHUTDOWN":"System Shutdown","REBOOT":"System Reboot","RESTARTAPP":"Restart Application","DUMPLOG":"Dump logfile","LOGGING":"Logging","D_LOGGING":"Switch the output of log messages on or off. Error messages are always logged.","TOAST_START_SUCCESS":"Plugin successfully started.","TOAST_STOP_SUCCESS":"Plugin successfully stopped.","TOAST_START_FAIL":"Plugin failed to start.","TOAST_STOP_FAIL":"Plugin failed to stop.","TOAST_GPIO_BLOCKED":"GPIO Pin unavailable","TOAST_MSG_OVERLAY_BLOCKING":"Blocked by another overlay.","TOAST_SAVE_SUCCESS":"Successfully saved","TOAST_MSG_SAVE":"Settings for Encoder ","TOAST_DEBUG_SAVE":"Debug Settings","TOAST_SAVE_FAIL":"Save failed","TOAST_WRONG_PARAMETER":"Error in parameters","TOAST_NEEDS_INTEGER":"GPIO Pins must be Integers.","TOAST_PINS_DIFFERENT":"GPIO Pins for A/B/Button must be different.","TOAST_PINS_BLOCKED":"Pins already used in another Encoder.","TOAST_NO_TYPE":"Please select 'Periods per tick'!"}}
Jun 05 07:50:04 myradio volumio[19499]: info: [ROTARYENCODER2] getUIConfig: i18nStringsDefaults{"ROTARYENCODER2":{"CONFIG":"Rotary Encoder II Plugin Configuration","SAVE":"Save","ENCODER0":"Rotary Encoder 1","D_ENCODER0":"Settings for the first rotary encoder.","ENCODER1":"Rotary Encoder 2","D_ENCODER1":"Settings for the second rotary encoder.","ENCODER2":"Rotary Encoder 3","D_ENCODER2":"Settings for the third rotary encoder.","ROTARYTYPE":"Periods per tick","D_ROTARYTYPE":"Periods per tick (Full: A and B full period, half: A and B half period, quarter: A or B half period","FULL":"Full-period mode","HALF":"Half-period mode","QUARTER":"Quarter-period mode","PINA":"Pin A GPIO","D_PINA":"GPIO pin that is connected to the first pin of the rotary.","PINB":"Pin B GPIO","D_PINB":"GPIO pin that is connected to the second pin of the rotary.","DIALACTION":"Dial Action","D_DIALACTION":"Action to be triggered by turning the rotary encocer. Option 'Emit Websocket Message' can be used to control other plugins using the Volumio Websock calls between Plugins. (see https://volumio.github.io/docs/API/WebSocket_APIs.html section 'CallMethod on Plugin' for details)","DOTS":"...","VOLUME":"Volume","SKIP":"Prev/Next title","SEEK":"Seek in title","SCROLL":"Scroll","EMIT":"Emit Websocket Message","SOCKCMDCCW":"Command CCW","SOCKDATACCW":"Data CCW","SOCKCMDCW":"Command CW","SOCKDATACW":"Data CW","SOCKCMD":"Command","SOCKDATA":"Data","D_SOCKCMD":"Command to send via Websocket","D_SOCKDATA":"Data to include with the Websocket Command","PINPUSH":"Pushbutton GPIO","D_PINPUSH":"GPIO pin that is connected to the pushbutton pin of the rotary. 0 or empty to disable.","PINPUSHDEBOUNCE":"Debounce-time (ms)","D_PINPUSHDEBOUNCE":"Debounce time for the button. If the button has hardware-debouncing, set to 0.","PUSHSTATE":"Button logic-level active low","D_PUSHSTATE":"Activate this, if pressing the button pulls the logic level on the GPIO low.","PINPUSHDELAY":"Delay for a long button press (ms)","D_PINPUSHDEDELAY":"Minimum duration of a button press, that will trigger the long push action in ms","PINDOUBLEPUSHDELAY":"Maximum interval for double press (ms)","D_PINDOUBLEPUSHDEDELAY":"Time interval in ms, within which a double press has to be detected.","PUSHACTION":"Short Press Action","D_PUSHACTION":"Action that gets triggered, when pushbutton is pressed briefly.","LONGPUSHACTION":"Long Press Action","D_LONGPUSHACTION":"Action that gets triggered, when pushbutton is pressed longer.","DOUBLEPUSHACTION":"Double Press Action","D_DOUBLEPUSHACTION":"Action that gets triggered, when pushbutton is pressed twice quickly.","SET_DEBUG":"Debug Settings","D_SET_DEBUG":"Settings for functional debugging.","PLAY":"Play","PAUSE":"Pause","PLAYPAUSE":"Play/Pause toggle","STOP":"Stop","REPEAT":"Repeat","RANDOM":"Random","CLEARQUEUE":"Clear Queue","MUTE":"Mute","UNMUTE":"Unmute","TOGGLEMUTE":"Toggle Mute","SHUTDOWN":"System Shutdown","REBOOT":"System Reboot","RESTARTAPP":"Restart Application","DUMPLOG":"Dump logfile","LOGGING":"Logging","D_LOGGING":"Switch the output of log messages on or off. Error messages are always logged.","TOAST_START_SUCCESS":"Plugin successfully started.","TOAST_STOP_SUCCESS":"Plugin successfully stopped.","TOAST_START_FAIL":"Plugin failed to start.","TOAST_STOP_FAIL":"Plugin failed to stop.","TOAST_GPIO_BLOCKED":"GPIO Pin unavailable","TOAST_MSG_OVERLAY_BLOCKING":"Blocked by another overlay.","TOAST_SAVE_SUCCESS":"Successfully saved","TOAST_MSG_SAVE":"Settings for Encoder ","TOAST_DEBUG_SAVE":"Debug Settings","TOAST_SAVE_FAIL":"Save failed","TOAST_WRONG_PARAMETER":"Error in parameters","TOAST_NEEDS_INTEGER":"GPIO Pins must be Integers.","TOAST_PINS_DIFFERENT":"GPIO Pins for A/B/Button must be different.","TOAST_PINS_BLOCKED":"Pins already used in another Encoder.","TOAST_NO_TYPE":"Please select 'Periods per tick'!"}}
Jun 05 07:50:04 myradio volumio[19499]: info: [ROTARYENCODER2] getUIConfig: language code: en dir: /data/plugins/system_hardware/rotaryencoder2
Jun 05 07:50:04 myradio volumio[19499]: info: [ROTARYENCODER2] getI18nString("DOTS"):...
Jun 05 07:50:04 myradio volumio[19499]: info: [ROTARYENCODER2] getI18nString("DOTS"):...
Jun 05 07:50:04 myradio volumio[19499]: info: [ROTARYENCODER2] getI18nString("DOTS"):...
Jun 05 07:50:04 myradio volumio[19499]: info: [ROTARYENCODER2] getI18nString("DOTS"):...
Jun 05 07:50:04 myradio volumio[19499]: info: [ROTARYENCODER2] getI18nString("DOTS"):...
Jun 05 07:50:04 myradio volumio[19499]: info: [ROTARYENCODER2] getI18nString("DOTS"):...
Jun 05 07:50:04 myradio volumio[19499]: info: [ROTARYENCODER2] getI18nString("DOTS"):...
Jun 05 07:50:04 myradio volumio[19499]: info: [ROTARYENCODER2] getI18nString("DOTS"):...
Jun 05 07:50:04 myradio volumio[19499]: info: [ROTARYENCODER2] getI18nString("DOTS"):...
Jun 05 07:50:04 myradio volumio[19499]: info: [ROTARYENCODER2] getI18nString("DOTS"):...
Jun 05 07:50:04 myradio volumio[19499]: info: [ROTARYENCODER2] getI18nString("DOTS"):...
Jun 05 07:50:04 myradio volumio[19499]: info: [ROTARYENCODER2] getI18nString("DOTS"):...
Jun 05 07:50:07 myradio volumio[19499]: info: CoreCommandRouter::volumioGetState
Jun 05 07:50:07 myradio volumio[19499]: info: CorePlayQueue::getTrack 0
Jun 05 07:50:17 myradio volumio[19499]: info: CoreCommandRouter::volumioGetState
Jun 05 07:50:17 myradio volumio[19499]: info: CorePlayQueue::getTrack 0
Jun 05 07:50:17 myradio volumio[19499]: info: Listing playlists
Jun 05 07:50:17 myradio volumio[19499]: info: Listing playlists
Jun 05 07:50:18 myradio volumio[19499]: info: CALLMETHOD: system_hardware rotaryencoder2 updateEncoder [object Object]
Jun 05 07:50:18 myradio volumio[19499]: info: CoreCommandRouter::executeOnPlugin: rotaryencoder2 , updateEncoder
Jun 05 07:50:18 myradio volumio[19499]: info: [ROTARYENCODER2] updateEncoder: Rotary1 with:{"enabled0":true,"rotaryType0":{"value":2,"label":"1/2"},"pinA0":"22","pinB0":"27","dialAction0":{"value":1,"label":"Volume"},"socketCmdCCW0":"","socketDataCCW0":"","socketCmdCW0":"","socketDataCW0":"","pinPush0":0,"pinPushDebounce0":0,"pushState0":false,"pushAction0":{"value":0,"label":"..."},"socketCmdPush0":"","socketDataPush0":"","longPushAction0":{"value":0,"label":"..."},"socketCmdLongPush0":"","socketDataLongPush0":"","delayLongPush0":"1500","doublePushAction0":{"value":0,"label":"..."},"socketCmdDoublePush0":"","socketDataDoublePush0":"","delayDoublePush0":"700"}
Jun 05 07:50:18 myradio volumio[19499]: info: [ROTARYENCODER2] sanityCheckSettings: Rotary1 for:{"enabled0":true,"rotaryType0":{"value":2,"label":"1/2"},"pinA0":"22","pinB0":"27","dialAction0":{"value":1,"label":"Volume"},"socketCmdCCW0":"","socketDataCCW0":"","socketCmdCW0":"","socketDataCW0":"","pinPush0":0,"pinPushDebounce0":0,"pushState0":false,"pushAction0":{"value":0,"label":"..."},"socketCmdPush0":"","socketDataPush0":"","longPushAction0":{"value":0,"label":"..."},"socketCmdLongPush0":"","socketDataLongPush0":"","delayLongPush0":"1500","doublePushAction0":{"value":0,"label":"..."},"socketCmdDoublePush0":"","socketDataDoublePush0":"","delayDoublePush0":"700"}
Jun 05 07:50:18 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateRotaries: 1,2,3
Jun 05 07:50:18 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateRotaries: 2,3
Jun 05 07:50:18 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateRotaries: 3
Jun 05 07:50:18 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateRotaries:
Jun 05 07:50:18 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateRotaries: end of recursion.
Jun 05 07:50:18 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateButtons: 1,2,3
Jun 05 07:50:18 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateButtons: 2,3
Jun 05 07:50:18 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateButtons: 3
Jun 05 07:50:18 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateButtons:
Jun 05 07:50:18 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateButtons: end of recursion.
Jun 05 07:50:18 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateButtons: button 3 is disabled.
Jun 05 07:50:18 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateButtons: button 2 is disabled.
Jun 05 07:50:18 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateButtons: button 1 is disabled.
Jun 05 07:50:18 myradio volumio[19499]: info: [ROTARYENCODER2] updateEncoder: Changing Encoder 1 Settings to new values
Jun 05 07:50:18 myradio volumio[19499]: info: [ROTARYENCODER2] activateRotaries: 1,2,3
Jun 05 07:50:18 myradio volumio[19499]: info: [ROTARYENCODER2] activateRotaries: 1,2
Jun 05 07:50:18 myradio volumio[19499]: info: [ROTARYENCODER2] activateRotaries: 1
Jun 05 07:50:18 myradio volumio[19499]: info: [ROTARYENCODER2] activateRotaries:
Jun 05 07:50:18 myradio volumio[19499]: info: [ROTARYENCODER2] activateRotaries: end of recursion.
Jun 05 07:50:18 myradio volumio[19499]: info: [ROTARYENCODER2] addOverlay: 22 27 2
Jun 05 07:50:18 myradio sudo[19717]:  volumio : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/dtoverlay rotary-encoder pin_a=22 pin_b=27 relative_axis=true steps-per-period=2
Jun 05 07:50:18 myradio sudo[19717]: pam_unix(sudo:session): session opened for user root by (uid=0)
Jun 05 07:50:18 myradio kernel: rotary-encoder rotary@16: gray
Jun 05 07:50:18 myradio kernel: input: rotary@16 as /devices/platform/rotary@16/input/input24
Jun 05 07:50:18 myradio sudo[19717]: pam_unix(sudo:session): session closed for user root
Jun 05 07:50:18 myradio volumio[19499]: info: /dev/input:
Jun 05 07:50:18 myradio volumio[19499]: event0
Jun 05 07:50:18 myradio volumio[19499]: mice
Jun 05 07:50:18 myradio systemd-udevd[19727]: Process '/usr/sbin/th-cmd --socket /var/run/thd.socket --passfd --udev' failed with exit code 1.
Jun 05 07:50:19 myradio volumio[19499]: info: [ROTARYENCODER2] attachListener: /dev/input/by-path/platform-rotary@16-event
Jun 05 07:50:19 myradio volumio[19499]: info: [ROTARYENCODER2] addEventHandle for rotary: 1
Jun 05 07:50:19 myradio volumio[19499]: info: [ROTARYENCODER2] activateButtons: 1,2,3
Jun 05 07:50:19 myradio volumio[19499]: info: [ROTARYENCODER2] activateButtons: 1,2
Jun 05 07:50:19 myradio volumio[19499]: info: [ROTARYENCODER2] activateButtons: 1
Jun 05 07:50:19 myradio volumio[19499]: info: [ROTARYENCODER2] activateButtons:
Jun 05 07:50:19 myradio volumio[19499]: info: [ROTARYENCODER2] activateButtons: end of recursion.
Jun 05 07:50:19 myradio volumio[19499]: info: [ROTARYENCODER2] Push Button 1 is disabled (no Gpio).
Jun 05 07:50:19 myradio volumio[19499]: info: [ROTARYENCODER2] getI18nString("TOAST_SAVE_SUCCESS"):Successfully saved
Jun 05 07:50:19 myradio volumio[19499]: info: [ROTARYENCODER2] getI18nString("TOAST_MSG_SAVE"):Settings for Encoder
Jun 05 07:50:19 myradio volumio[19499]: info: [ROTARYENCODER2] updateEncoder: SUCCESS with Toast: Successfully saved Settings for Encoder 1
Jun 05 07:50:19 myradio volumio[19499]: info: [ROTARYENCODER2] getI18nString("TOAST_SAVE_SUCCESS"):Successfully saved
Jun 05 07:50:19 myradio volumio[19499]: info: [ROTARYENCODER2] getI18nString("TOAST_MSG_SAVE"):Settings for Encoder
Jun 05 07:50:26 myradio volumio[19499]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: 1
Jun 05 07:50:26 myradio volumio[19499]: info: [ROTARYENCODER2] emitDialCommand: 1 with value 1for Rotary: 1
Jun 05 07:50:26 myradio volumio[19499]: info: [ROTARYENCODER2] emitDialCommand: VOLUME UP
Jun 05 07:50:26 myradio volumio[19499]: info: VolumeController::SetAlsaVolume+
Jun 05 07:50:26 myradio volumio[19499]: info: CoreStateMachine::pushState
Jun 05 07:50:26 myradio volumio[19499]: info: CorePlayQueue::getTrack 0
Jun 05 07:50:26 myradio volumio[19499]: info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
Jun 05 07:50:26 myradio volumio[19499]: info: CoreCommandRouter::volumioPushState
Jun 05 07:50:26 myradio volumio[19499]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: 1
Jun 05 07:50:26 myradio volumio[19499]: info: [ROTARYENCODER2] emitDialCommand: 1 with value 1for Rotary: 1
Jun 05 07:50:26 myradio volumio[19499]: info: [ROTARYENCODER2] emitDialCommand: VOLUME UP
Jun 05 07:50:26 myradio volumio[19499]: info: VolumeController::SetAlsaVolume+
Jun 05 07:50:26 myradio volumio[19499]: info: CoreStateMachine::pushState
Jun 05 07:50:26 myradio volumio[19499]: info: CorePlayQueue::getTrack 0
Jun 05 07:50:26 myradio volumio[19499]: info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
Jun 05 07:50:26 myradio volumio[19499]: info: CoreCommandRouter::volumioPushState
Jun 05 07:50:26 myradio volumio[19499]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: 1
Jun 05 07:50:26 myradio volumio[19499]: info: [ROTARYENCODER2] emitDialCommand: 1 with value 1for Rotary: 1
Jun 05 07:50:26 myradio volumio[19499]: info: [ROTARYENCODER2] emitDialCommand: VOLUME UP
Jun 05 07:50:26 myradio volumio[19499]: info: VolumeController::SetAlsaVolume+
Jun 05 07:50:26 myradio volumio[19499]: info: CoreStateMachine::pushState
Jun 05 07:50:26 myradio volumio[19499]: info: CorePlayQueue::getTrack 0
Jun 05 07:50:26 myradio volumio[19499]: info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
Jun 05 07:50:26 myradio volumio[19499]: info: CoreCommandRouter::volumioPushState
Jun 05 07:50:26 myradio volumio[19499]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: 1
Jun 05 07:50:26 myradio volumio[19499]: info: [ROTARYENCODER2] emitDialCommand: 1 with value 1for Rotary: 1
Jun 05 07:50:26 myradio volumio[19499]: info: [ROTARYENCODER2] emitDialCommand: VOLUME UP
Jun 05 07:50:26 myradio volumio[19499]: info: VolumeController::SetAlsaVolume+
Jun 05 07:50:26 myradio volumio[19499]: info: CoreStateMachine::pushState
Jun 05 07:50:26 myradio volumio[19499]: info: CorePlayQueue::getTrack 0
Jun 05 07:50:26 myradio volumio[19499]: info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
Jun 05 07:50:26 myradio volumio[19499]: info: CoreCommandRouter::volumioPushState
Jun 05 07:50:26 myradio volumio[19499]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: 1
Jun 05 07:50:26 myradio volumio[19499]: info: [ROTARYENCODER2] emitDialCommand: 1 with value 1for Rotary: 1
Jun 05 07:50:26 myradio volumio[19499]: info: [ROTARYENCODER2] emitDialCommand: VOLUME UP
Jun 05 07:50:26 myradio volumio[19499]: info: VolumeController::SetAlsaVolume+
Jun 05 07:50:26 myradio volumio[19499]: info: CoreStateMachine::pushState
Jun 05 07:50:26 myradio volumio[19499]: info: CorePlayQueue::getTrack 0
Jun 05 07:50:26 myradio volumio[19499]: info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
Jun 05 07:50:26 myradio volumio[19499]: info: CoreCommandRouter::volumioPushState
Jun 05 07:50:27 myradio volumio[19499]: info: CoreCommandRouter::volumioGetState
Jun 05 07:50:27 myradio volumio[19499]: info: CorePlayQueue::getTrack 0
Jun 05 07:50:27 myradio volumio[19499]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: -1
Jun 05 07:50:27 myradio volumio[19499]: info: [ROTARYENCODER2] emitDialCommand: 1 with value -1for Rotary: 1
Jun 05 07:50:27 myradio volumio[19499]: info: [ROTARYENCODER2] emitDialCommand: VOLUME DOWN
Jun 05 07:50:27 myradio volumio[19499]: info: VolumeController::SetAlsaVolume-
Jun 05 07:50:27 myradio volumio[19499]: info: CoreStateMachine::pushState
Jun 05 07:50:27 myradio volumio[19499]: info: CorePlayQueue::getTrack 0
Jun 05 07:50:27 myradio volumio[19499]: info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
Jun 05 07:50:27 myradio volumio[19499]: info: CoreCommandRouter::volumioPushState
Jun 05 07:50:27 myradio volumio[19499]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: -1
Jun 05 07:50:27 myradio volumio[19499]: info: [ROTARYENCODER2] emitDialCommand: 1 with value -1for Rotary: 1
Jun 05 07:50:27 myradio volumio[19499]: info: [ROTARYENCODER2] emitDialCommand: VOLUME DOWN
Jun 05 07:50:27 myradio volumio[19499]: info: VolumeController::SetAlsaVolume-
Jun 05 07:50:27 myradio volumio[19499]: info: CoreStateMachine::pushState
Jun 05 07:50:27 myradio volumio[19499]: info: CorePlayQueue::getTrack 0
Jun 05 07:50:27 myradio volumio[19499]: info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
Jun 05 07:50:27 myradio volumio[19499]: info: CoreCommandRouter::volumioPushState
Jun 05 07:50:27 myradio volumio[19499]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: -1
Jun 05 07:50:27 myradio volumio[19499]: info: [ROTARYENCODER2] emitDialCommand: 1 with value -1for Rotary: 1
Jun 05 07:50:27 myradio volumio[19499]: info: [ROTARYENCODER2] emitDialCommand: VOLUME DOWN
Jun 05 07:50:27 myradio volumio[19499]: info: VolumeController::SetAlsaVolume-
Jun 05 07:50:27 myradio volumio[19499]: info: CoreStateMachine::pushState
Jun 05 07:50:27 myradio volumio[19499]: info: CorePlayQueue::getTrack 0
Jun 05 07:50:27 myradio volumio[19499]: info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
Jun 05 07:50:27 myradio volumio[19499]: info: CoreCommandRouter::volumioPushState
Jun 05 07:50:27 myradio volumio[19499]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: -1
Jun 05 07:50:27 myradio volumio[19499]: info: [ROTARYENCODER2] emitDialCommand: 1 with value -1for Rotary: 1
Jun 05 07:50:27 myradio volumio[19499]: info: [ROTARYENCODER2] emitDialCommand: VOLUME DOWN
Jun 05 07:50:27 myradio volumio[19499]: info: VolumeController::SetAlsaVolume-
Jun 05 07:50:27 myradio volumio[19499]: info: CoreStateMachine::pushState
Jun 05 07:50:27 myradio volumio[19499]: info: CorePlayQueue::getTrack 0
Jun 05 07:50:27 myradio volumio[19499]: info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
Jun 05 07:50:27 myradio volumio[19499]: info: CoreCommandRouter::volumioPushState
Jun 05 07:50:27 myradio volumio[19499]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: -1
Jun 05 07:50:27 myradio volumio[19499]: info: [ROTARYENCODER2] emitDialCommand: 1 with value -1for Rotary: 1
Jun 05 07:50:27 myradio volumio[19499]: info: [ROTARYENCODER2] emitDialCommand: VOLUME DOWN
Jun 05 07:50:27 myradio volumio[19499]: info: VolumeController::SetAlsaVolume-
Jun 05 07:50:27 myradio volumio[19499]: info: CoreStateMachine::pushState
Jun 05 07:50:27 myradio volumio[19499]: info: CorePlayQueue::getTrack 0
Jun 05 07:50:27 myradio volumio[19499]: info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
Jun 05 07:50:27 myradio volumio[19499]: info: CoreCommandRouter::volumioPushState
Jun 05 07:50:27 myradio volumio[19499]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: -1
Jun 05 07:50:27 myradio volumio[19499]: info: [ROTARYENCODER2] emitDialCommand: 1 with value -1for Rotary: 1
Jun 05 07:50:27 myradio volumio[19499]: info: [ROTARYENCODER2] emitDialCommand: VOLUME DOWN
Jun 05 07:50:27 myradio volumio[19499]: info: VolumeController::SetAlsaVolume-
Jun 05 07:50:27 myradio volumio[19499]: info: CoreStateMachine::pushState
Jun 05 07:50:27 myradio volumio[19499]: info: CorePlayQueue::getTrack 0
Jun 05 07:50:27 myradio volumio[19499]: info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
Jun 05 07:50:27 myradio volumio[19499]: info: CoreCommandRouter::volumioPushState
Jun 05 07:50:27 myradio volumio[19499]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: -1
Jun 05 07:50:27 myradio volumio[19499]: info: [ROTARYENCODER2] emitDialCommand: 1 with value -1for Rotary: 1
Jun 05 07:50:27 myradio volumio[19499]: info: [ROTARYENCODER2] emitDialCommand: VOLUME DOWN
Jun 05 07:50:27 myradio volumio[19499]: info: VolumeController::SetAlsaVolume-
Jun 05 07:50:27 myradio volumio[19499]: info: CoreStateMachine::pushState
Jun 05 07:50:27 myradio volumio[19499]: info: CorePlayQueue::getTrack 0
Jun 05 07:50:27 myradio volumio[19499]: info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
Jun 05 07:50:27 myradio volumio[19499]: info: CoreCommandRouter::volumioPushState
Jun 05 07:50:36 myradio volumio[19499]: info: CALLMETHOD: system_hardware rotaryencoder2 updateEncoder [object Object]
Jun 05 07:50:36 myradio volumio[19499]: info: CoreCommandRouter::executeOnPlugin: rotaryencoder2 , updateEncoder
Jun 05 07:50:36 myradio volumio[19499]: info: [ROTARYENCODER2] updateEncoder: Rotary1 with:{"enabled0":true,"rotaryType0":{"value":2,"label":"1/2"},"pinA0":"22","pinB0":"27","dialAction0":{"value":1,"label":"Volume"},"socketCmdCCW0":"","socketDataCCW0":"","socketCmdCW0":"","socketDataCW0":"","pinPush0":0,"pinPushDebounce0":"5","pushState0":false,"pushAction0":{"value":0,"label":"..."},"socketCmdPush0":"","socketDataPush0":"","longPushAction0":{"value":0,"label":"..."},"socketCmdLongPush0":"","socketDataLongPush0":"","delayLongPush0":"1500","doublePushAction0":{"value":0,"label":"..."},"socketCmdDoublePush0":"","socketDataDoublePush0":"","delayDoublePush0":"700"}
Jun 05 07:50:36 myradio volumio[19499]: info: [ROTARYENCODER2] sanityCheckSettings: Rotary1 for:{"enabled0":true,"rotaryType0":{"value":2,"label":"1/2"},"pinA0":"22","pinB0":"27","dialAction0":{"value":1,"label":"Volume"},"socketCmdCCW0":"","socketDataCCW0":"","socketCmdCW0":"","socketDataCW0":"","pinPush0":0,"pinPushDebounce0":"5","pushState0":false,"pushAction0":{"value":0,"label":"..."},"socketCmdPush0":"","socketDataPush0":"","longPushAction0":{"value":0,"label":"..."},"socketCmdLongPush0":"","socketDataLongPush0":"","delayLongPush0":"1500","doublePushAction0":{"value":0,"label":"..."},"socketCmdDoublePush0":"","socketDataDoublePush0":"","delayDoublePush0":"700"}
Jun 05 07:50:36 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateRotaries: 1,2,3
Jun 05 07:50:36 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateRotaries: 2,3
Jun 05 07:50:36 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateRotaries: 3
Jun 05 07:50:36 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateRotaries:
Jun 05 07:50:36 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateRotaries: end of recursion.
Jun 05 07:50:36 myradio volumio[19499]: info: [ROTARYENCODER2] detachListener: [object Object]
Jun 05 07:50:36 myradio volumio[19499]: info: [ROTARYENCODER2] detachListener: successfully killed handler process
Jun 05 07:50:36 myradio volumio[19499]: info: [ROTARYENCODER2] checkOverlayExists: Checking for existing overlays for Rotary: 1
Jun 05 07:50:36 myradio sudo[19748]:  volumio : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/dtoverlay -l
Jun 05 07:50:36 myradio sudo[19748]: pam_unix(sudo:session): session opened for user root by (uid=0)
Jun 05 07:50:36 myradio sudo[19748]: pam_unix(sudo:session): session closed for user root
Jun 05 07:50:36 myradio volumio[19499]: info: [ROTARYENCODER2] checkOverlayExists: check pinA=22pinB=27 in Overlays (in load order):
Jun 05 07:50:36 myradio volumio[19499]: 0:  rotary-encoder  pin_a=22 pin_b=27 relative_axis=true steps-per-period=2
Jun 05 07:50:36 myradio volumio[19499]: info: [ROTARYENCODER2] checkOverlayExists: rotary 1uses overlay 0
Jun 05 07:50:36 myradio volumio[19499]: info: [ROTARYENCODER2] removeOverlay: 0
Jun 05 07:50:36 myradio sudo[19751]:  volumio : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/dtoverlay -r 0
Jun 05 07:50:36 myradio sudo[19751]: pam_unix(sudo:session): session opened for user root by (uid=0)
Jun 05 07:50:36 myradio volumio[19499]: info: [ROTARYENCODER2] addEventHandle: Stream from rotary encoder ended.
Jun 05 07:50:36 myradio volumio[19499]: info: [ROTARYENCODER2] addEventHandle: child process exited with code null
Jun 05 07:50:36 myradio sudo[19751]: pam_unix(sudo:session): session closed for user root
Jun 05 07:50:36 myradio volumio[19499]: info: [ROTARYENCODER2] removeOverlay: 0 returned:
Jun 05 07:50:36 myradio sudo[19761]:  volumio : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/dtoverlay -l
Jun 05 07:50:36 myradio sudo[19761]: pam_unix(sudo:session): session opened for user root by (uid=0)
Jun 05 07:50:36 myradio sudo[19761]: pam_unix(sudo:session): session closed for user root
Jun 05 07:50:36 myradio volumio[19499]: info: [ROTARYENCODER2] removeOverlay: "overlay -l" returned: No overlays loaded
Jun 05 07:50:36 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateRotaries: deactivated rotary1
Jun 05 07:50:36 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateButtons: 1,2,3
Jun 05 07:50:36 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateButtons: 2,3
Jun 05 07:50:36 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateButtons: 3
Jun 05 07:50:36 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateButtons:
Jun 05 07:50:36 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateButtons: end of recursion.
Jun 05 07:50:36 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateButtons: button 3 is disabled.
Jun 05 07:50:36 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateButtons: button 2 is disabled.
Jun 05 07:50:37 myradio volumio[19499]: info: CoreCommandRouter::volumioGetState
Jun 05 07:50:37 myradio volumio[19499]: info: CorePlayQueue::getTrack 0
Jun 05 07:50:37 myradio volumio[19499]: info: Listing playlists
Jun 05 07:50:37 myradio volumio[19499]: info: Listing playlists
Jun 05 07:50:47 myradio volumio[19499]: info: CALLMETHOD: system_hardware rotaryencoder2 updateEncoder [object Object]
Jun 05 07:50:47 myradio volumio[19499]: info: CoreCommandRouter::executeOnPlugin: rotaryencoder2 , updateEncoder
Jun 05 07:50:47 myradio volumio[19499]: info: [ROTARYENCODER2] updateEncoder: Rotary1 with:{"enabled0":true,"rotaryType0":{"value":2,"label":"1/2"},"pinA0":"22","pinB0":"27","dialAction0":{"value":1,"label":"Volume"},"socketCmdCCW0":"","socketDataCCW0":"","socketCmdCW0":"","socketDataCW0":"","pinPush0":0,"pinPushDebounce0":"7","pushState0":false,"pushAction0":{"value":0,"label":"..."},"socketCmdPush0":"","socketDataPush0":"","longPushAction0":{"value":0,"label":"..."},"socketCmdLongPush0":"","socketDataLongPush0":"","delayLongPush0":"1500","doublePushAction0":{"value":0,"label":"..."},"socketCmdDoublePush0":"","socketDataDoublePush0":"","delayDoublePush0":"700"}
Jun 05 07:50:47 myradio volumio[19499]: info: [ROTARYENCODER2] sanityCheckSettings: Rotary1 for:{"enabled0":true,"rotaryType0":{"value":2,"label":"1/2"},"pinA0":"22","pinB0":"27","dialAction0":{"value":1,"label":"Volume"},"socketCmdCCW0":"","socketDataCCW0":"","socketCmdCW0":"","socketDataCW0":"","pinPush0":0,"pinPushDebounce0":"7","pushState0":false,"pushAction0":{"value":0,"label":"..."},"socketCmdPush0":"","socketDataPush0":"","longPushAction0":{"value":0,"label":"..."},"socketCmdLongPush0":"","socketDataLongPush0":"","delayLongPush0":"1500","doublePushAction0":{"value":0,"label":"..."},"socketCmdDoublePush0":"","socketDataDoublePush0":"","delayDoublePush0":"700"}
Jun 05 07:50:47 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateRotaries: 1,2,3
Jun 05 07:50:47 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateRotaries: 2,3
Jun 05 07:50:47 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateRotaries: 3
Jun 05 07:50:47 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateRotaries:
Jun 05 07:50:47 myradio volumio[19499]: info: [ROTARYENCODER2] deactivateRotaries: end of recursion.
Jun 05 07:50:47 myradio volumio[19499]: info: [ROTARYENCODER2] detachListener: [object Object]
Jun 05 07:50:47 myradio volumio[19499]: error: [ROTARYENCODER2] detachListener: could not kill handler process
Jun 05 07:50:47 myradio volumio[19499]: info: CoreCommandRouter::volumioGetState
Jun 05 07:50:47 myradio volumio[19499]: info: CorePlayQueue::getTrack 0
Jun 05 07:50:57 myradio volumio[19499]: info: CoreCommandRouter::volumioGetState
Jun 05 07:50:57 myradio volumio[19499]: info: CorePlayQueue::getTrack 0
Jun 05 07:50:57 myradio volumio[19499]: info: Listing playlists
Jun 05 07:50:57 myradio volumio[19499]: info: Listing playlists

Many Thanks,
Daniil

1 Like

Ok, thanks for the feedback. Only had an hour to investigate. It looked like it was fixed. Will try to spend a bit more time the next days, to fix completely. Looks like some parameter changes are not accepted, not saved and the user is not notified. Unfortunately, that will take some testing, since there are quite some combinations possible.
Happy that workaround helps for the moment. Will post here when it is fixed

Same problem here.
I’m on version v1.0.13.

Commandment 1: Thou shalt not code past 11 P.M. :sleeping:
I spotted the problem yesterday, but it was actually there twice (two conditions not caught) and it only happens, when the push button is not used - something that I never tried recently. It working now, even with button GPIO not configured.
Sorry, that I committed too quick, because I wanted to give you a quick fix.
Please try v1.0.14 and let me know, if it is fixed.

I’ll will try tomorrow…

I have now installed version 1.0.14 and for the time being everything works well with the only thing that the push button sometimes does not respond properly.
no other problems found.

Thanks for the feedback. If the push-button is not reliable, that can either be schematic or code. In case you can reproduce it, it would help to generate a log and share that, I could then try to see if it is related to the code.
Depends whether you want to spend the effort.

ok here the log immediately after booting raspberry pi.
i try a short press action (play/pause toggle) once after that it doesn’t work anymore.

volume rotary and reboot (long press) does work.
I disabled all non-essential plugins.

these are my settings, raspberry pi 4b 2gb.
rotary encoder KY-040.
rotary encoder KY-040

Starting Live Log...
info: CoreCommandRouter::volumioGetQueue
info: CoreStateMachine::getQueue
info: CorePlayQueue::getQueue
info: CoreCommandRouter::executeOnPlugin: system , getHwuuid
systemd-fsckd.service: Succeeded.
info: CoreCommandRouter::executeOnPlugin: my_volumio , getMyVolumioStatus
info: CoreCommandRouter::executeOnPlugin: my_volumio , getMyVolumioStatus
info: CALLMETHOD: system_controller system enableLiveLog true
info: CoreCommandRouter::executeOnPlugin: system , enableLiveLog
info: Launching a new LiveLog session
systemd-hostnamed.service: Succeeded.
rc rc0: two consecutive events of type space
info: CoreCommandRouter::executeOnPlugin: system , getSystemVersion
info: CoreCommandRouter::executeOnPlugin: system , getConfigParam
error: MyVolumio Plugin failed to authenticate in a timely fashion
info: Completed starting MyVolumio Plugin
info: BOOT COMPLETED
e[34m [Metrics] e[39m CommandRouter: e[31m 37s 514.00ms e[39m
info: CoreCommandRouter::volumiosetStartupVolume
info: CoreCommandRouter::executeOnPlugin: alsa_controller , getConfigParam
info: VolumeController:: Setting startup Volume 100
info: VolumeController::SetAlsaVolume100
info: CoreCommandRouter::executeOnPlugin: system , getConfigParam
info: CoreCommandRouter::Close All Modals sent
info: CoreCommandRouter::Close All Modals sent
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: Cannot play startup sound: Error: Command failed: /usr/bin/aplay -D volumio /volumio/app/startup.wav
aplay: main:828: audio open error: Device or resource busy
info: Received Get System Version
info: CoreCommandRouter::executeOnPlugin: system , getSystemVersion
info: CoreCommandRouter::executeOnPlugin: alsa_controller , checkAudioDeviceAvailable
info: CoreCommandRouter::executeOnPlugin: i2s_dacs , getI2sStatus
info: CoreCommandRouter::executeOnPlugin: system , versionChangeDetect
info: CoreCommandRouter::executeOnPlugin: system , getSystemInfo
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , getThisDevice
info: Discovery: Getting this device information
info: CoreCommandRouter::volumioGetState
info: CoreCommandRouter::executeOnPlugin: network , getCachedIPAddresses

info: CoreCommandRouter::volumioGetState
info: CoreCommandRouter::executeOnPlugin: wizard , getShowWizard
info: CoreCommandRouter::executeOnPlugin: system , getShowWizard
 volumio : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/sbin/ifconfig eth0
pam_unix(sudo:session): session opened for user root by (uid=0)
pam_unix(sudo:session): session closed for user root
 volumio : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/sbin/ifconfig wlan0
pam_unix(sudo:session): session opened for user root by (uid=0)
pam_unix(sudo:session): session closed for user root

info: CoreCommandRouter::volumioGetState
info: CoreCommandRouter::executeOnPlugin: multiroom , getMultiroom
info: Listing playlists
info: CoreCommandRouter::executeOnPlugin: appearance , getUiSettings
info: CoreCommandRouter::executeOnPlugin: wizard , getShowWizard
info: CoreCommandRouter::executeOnPlugin: system , getShowWizard
info: CoreCommandRouter::executeOnPlugin: system , getPrivacySettings
info:
---------------------------- MPD announces system playlist update
info: Ignoring MPD Status Update
info:
---------------------------- MPD announces state update: player
info: ControllerMpd::getState

info: ------------------------------ 2ms
info: sendMpdCommand status took 1 milliseconds


info: sendMpdCommand playlistinfo took 1 milliseconds

info: ControllerMpd::pushState
info: CoreCommandRouter::servicePushState
info: CorePlayQueue::getTrack 0


info: CoreStateMachine::syncState   stateService play
info: CoreStateMachine::syncState   currentStatus play
info: Received an update from plugin. extracting info from payload
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: CoreStateMachine::pushState
info: CoreCommandRouter::volumioPushState
info: ------------------------------ 28ms
info: CoreCommandRouter::volumioGetVisibleSources
info: CoreCommandRouter::executeOnPlugin: my_music , getDisabledSources
info: CoreCommandRouter::volumioGetQueue
info: CoreStateMachine::getQueue
info: CorePlayQueue::getQueue
info: CoreCommandRouter::executeOnPlugin: my_volumio , getMyVolumioStatus
info: CoreCommandRouter::executeOnPlugin: my_volumio , getMyVolumioStatus
info: CoreCommandRouter::executeOnPlugin: my_volumio , getMyVolumioToken
info: CoreCommandRouter::getUIConfigOnPlugin
info: VolumeController::SetAlsaVolume-
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume-
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume-
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume-
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume-
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume-
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: Received Get System Version
info: CoreCommandRouter::executeOnPlugin: system , getSystemVersion
info: VolumeController::SetAlsaVolume-
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume-
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume-
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume-
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume+
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume+
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume+
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume+
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume+
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume+
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume+
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume+
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume+
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
Soliciting pool server 213.239.154.12
Soliciting pool server 192.26.105.26
info: VolumeController::SetAlsaVolume+
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume+
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume+
info: CoreStateMachine::pushState
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume+
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume+
info: CoreStateMachine::pushState
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume+
info: CoreStateMachine::pushState
info: CoreCommandRouter::volumioPushState
Soliciting pool server 162.159.200.123
Soliciting pool server 194.104.0.153
info: VolumeController::SetAlsaVolume+
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume+
info: CoreStateMachine::pushState
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume+
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume+
info: CoreStateMachine::pushState
info: CoreCommandRouter::volumioPushState
info: VolumeController::SetAlsaVolume+
info: CoreStateMachine::pushState
info: CoreCommandRouter::volumioPushState
Soliciting pool server 185.51.192.34
Soliciting pool server 219.216.128.25
Soliciting pool server 50.7.177.195
Soliciting pool server 185.53.93.157
Soliciting pool server 129.250.35.250
Soliciting pool server 83.98.201.134
Soliciting pool server 194.0.5.123
Soliciting pool server 93.94.224.67
Soliciting pool server 83.137.149.135
receive: Unexpected origin timestamp 0xe649e179.9c6e666b does not match aorg 0000000000.00000000 from server@194.104.0.153 xmt 0xe649e1a3.31d4ca51
receive: Unexpected origin timestamp 0xe649e179.9c6b9a8e does not match aorg 0000000000.00000000 from server@185.51.192.34 xmt 0xe649e1a3.32d19865
receive: Unexpected origin timestamp 0xe649e179.9c6cf377 does not match aorg 0000000000.00000000 from server@162.159.200.123 xmt 0xe649e1a3.325ed120
receive: Unexpected origin timestamp 0xe649e179.9c669777 does not match aorg 0000000000.00000000 from server@83.137.149.135 xmt 0xe649e1a3.3002cfeb
receive: Unexpected origin timestamp 0xe649e179.9c6fb10e does not match aorg 0000000000.00000000 from server@192.26.105.26 xmt 0xe649e1a3.360f2007
receive: Unexpected origin timestamp 0xe649e179.9c6a2369 does not match aorg 0000000000.00000000 from server@219.216.128.25 xmt 0xe649e1a3.56eba555
info: CoreCommandRouter::volumioPause
info: CoreStateMachine::pause
info: CoreStateMachine::stPlaybackTimer
info: CoreStateMachine::servicePause
info: CorePlayQueue::getTrack 0
info: CoreCommandRouter::servicePause
info: [1654612776494] ControllerWebradio::pause

info:
---------------------------- MPD announces state update: player
info: sendMpdCommand pause took 114 milliseconds
info: ControllerMpd::getState

info: sendMpdCommand status took 1 milliseconds


info: sendMpdCommand playlistinfo took 1 milliseconds

info: ControllerMpd::pushState
info: CoreCommandRouter::servicePushState
info: CorePlayQueue::getTrack 0


info: CoreStateMachine::syncState   stateService pause
info: CoreStateMachine::syncState   currentStatus pause
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: CoreStateMachine::stPlaybackTimer
info: ------------------------------ 18ms
info: touch_display: Setting screensaver timeout to 0 seconds.
info: touch_display: Using Xserver unix domain socket /tmp/.X11-unix/X0
info: touch_display: Setting screensaver timeout to 0 seconds.
warn: [ROTARYENCODER2] Push Button 1 signalled "released" without intermediate "pressed". You may be suffering from bouncy buttons.
info: VolumeController::SetAlsaVolumemute
Unable to parse:
 Simple mixer control 'SoftMaster',0
  Capabilities: volume
  Playback channels: Front Left - Front Right
  Capture channels: Front Left - Front Right
  Limits: 0 - 99
  Front Left: 99 [100%]
  Front Right: 99 [100%]
error: Cannot get ALSA Volume: Error: Alsa Mixer Error: failed to parse output
info: CoreStateMachine::pushState
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
warn: [ROTARYENCODER2] Push Button 1 signalled "released" without intermediate "pressed". You may be suffering from bouncy buttons.
warn: [ROTARYENCODER2] Push Button 1 signalled "released" without intermediate "pressed". You may be suffering from bouncy buttons.
warn: [ROTARYENCODER2] Push Button 1 signalled "released" without intermediate "pressed". You may be suffering from bouncy buttons.
info: CoreCommandRouter::volumioPlay

info: CoreStateMachine::play index undefined
info: CoreStateMachine::setConsumeUpdateService undefined
info: CorePlayQueue::getTrack 0
info: CoreStateMachine::startPlaybackTimer
info: CorePlayQueue::getTrack 0
info: [1654612793988] ControllerWebradio::resume

info:
---------------------------- MPD announces state update: player
info: sendMpdCommand play took 20 milliseconds
info: ControllerMpd::getState

info: sendMpdCommand status took 1 milliseconds


info: sendMpdCommand playlistinfo took 1 milliseconds

info: ControllerMpd::pushState
info: CoreCommandRouter::servicePushState
info: CorePlayQueue::getTrack 0
info: Received update from a service different from the one supposed to be playing music. Skipping notification.Current webradio Received mpd
info: ------------------------------ 4ms
info: CoreCommandRouter::volumioPlay

info: CoreStateMachine::play index undefined
info: CoreStateMachine::setConsumeUpdateService undefined
info: CorePlayQueue::getTrack 0
info: CoreStateMachine::startPlaybackTimer
info: CorePlayQueue::getTrack 0
info: [1654612799373] ControllerWebradio::resume

info: sendMpdCommand play took 1 milliseconds
warn: [ROTARYENCODER2] Push Button 1 signalled "released" without intermediate "pressed". You may be suffering from bouncy buttons.
info: VolumeController::SetAlsaVolumeunmute
info: CoreStateMachine::pushState
info: CorePlayQueue::getTrack 0
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: CoreCommandRouter::volumioPlay

info: CoreStateMachine::play index undefined
info: CoreStateMachine::setConsumeUpdateService undefined
info: CorePlayQueue::getTrack 0
info: CoreStateMachine::startPlaybackTimer
info: CorePlayQueue::getTrack 0
info: [1654612877763] ControllerWebradio::resume

info: sendMpdCommand play took 1 milliseconds
info: CoreCommandRouter::volumioPlay

info: CoreStateMachine::play index undefined
info: CoreStateMachine::setConsumeUpdateService undefined
info: CorePlayQueue::getTrack 0
info: CoreStateMachine::startPlaybackTimer
info: CorePlayQueue::getTrack 0
info: [1654612884047] ControllerWebradio::resume

info: sendMpdCommand play took 0 milliseconds
warn: [ROTARYENCODER2] Push Button 1 signalled "released" without intermediate "pressed". You may be suffering from bouncy buttons.
warn: [ROTARYENCODER2] Push Button 1 signalled "released" without intermediate "pressed". You may be suffering from bouncy buttons.
info:
---------------------------- MPD announces system playlist update
info: Ignoring MPD Status Update
info:
---------------------------- MPD announces state update: player
info: ControllerMpd::getState

info: ------------------------------ 4ms
info: sendMpdCommand status took 2 milliseconds


info: sendMpdCommand playlistinfo took 1 milliseconds

info: ControllerMpd::pushState
info: CoreCommandRouter::servicePushState
info: CorePlayQueue::getTrack 0
info: Received update from a service different from the one supposed to be playing music. Skipping notification.Current webradio Received mpd
info: ------------------------------ 7ms

Hello,

Thank you for your effort.
I can confirm that saving changes for the encoders is working now.
I was able to switch Pins A and B to flip rotation direction and it was saved successfully.

And I also had an issue with strange behavior of the “play/pause toggle” button like @michel8166 has.
For me it is working only for the first press on the current radio station.
Like:

  1. Select station #4 → it starts playing
  2. Press Toggle Button - it stops playing
  3. Press Toggle Button Once again - it resumes playing.
  4. Press Toggle Button one more time - no reaction.
  5. Once I switch to another station it behaves the same.

If I issue the volumio toggle from the SSH session - it always works fine.

I think the Active low setting is correct for the KY040. But you should set the debounce timer to 50ms or so. The KY040 has Pull-ups, but no debouncing. So your problem might be, that the rotary is firing too fast for the plug-in.
Will spend some more time to check the code the next days, but that could be the issue.