[PLUGIN] RotaryEncoder II

Hi murphym681,
I have just updated my radio to the latest Volumio version 3.546 - the Rotary plugin (v 1.0.15) is still working for me, all the Encoders work as normal and saving settings also works.
The error message “could not kill handler process” indicates an issue with the GPIO settings on your end. The plugin cannot release the handler process.
You can try to uninstall and reinstall the plugin and do the settings from start - maybe something is messed up in your settings.
If you want support, please follow the instructions in post #1 in this thread - otherwise it is impossible to analyze anything.

Best regards,
Thomas

Hi murphym681,
Hi T0MR0,

I have the same issue. When saving changed parameters, the LOG says “could not kill handler process”. The values remain unchanged.
Then I tried to uninstall. This did not work either (without feedback in the GUI). Identical message in the LOG.
Subsequently, I have completely deleted the plugin directory via ssh and after a restart (then the plugin was no longer visible in the GUI :smirk:) I have installed again. The initial parameters were again the old ones (which have to be changed) and the changes still cannot be saved.

Best regards
M.

Log Saving Parameter

info: CALLMETHOD: system_hardware rotaryencoder2 updateEncoder [object Object]
info: CoreCommandRouter::executeOnPlugin: rotaryencoder2 , updateEncoder
info: [ROTARYENCODER2] updateEncoder: Rotary2 with:{“enabled1”:true,“rotaryType1”:{“value”:1,“label”:“1/1”},“pinA1”:“24”,“pinB1”:“25”,“dialAction1”:{“value”:2,“label”:“Titel vor/zurück”},“socketCmdCCW1”:“”,“socketDataCCW1”:“”,“socketCmdCW1”:“”,“socketDataCW1”:“”,“pinPush1”:32,“pinPushDebounce1”:10,“pushState1”:true,“pushAction1”:{“value”:1,“label”:“Wiedergabe starten”},“socketCmdPush1”:“”,“socketDataPush1”:“”,“longPushAction1”:{“value”:0,“label”:“…”},“socketCmdLongPush1”:“”,“socketDataLongPush1”:“”,“delayLongPush1”:“1500”,“doublePushAction1”:{“value”:0,“label”:“…”},“socketCmdDoublePush1”:“”,“socketDataDoublePush1”:“”,“delayDoublePush1”:“700”}
info: [ROTARYENCODER2] sanityCheckSettings: Rotary2 for:{“enabled1”:true,“rotaryType1”:{“value”:1,“label”:“1/1”},“pinA1”:“24”,“pinB1”:“25”,“dialAction1”:{“value”:2,“label”:“Titel vor/zurück”},“socketCmdCCW1”:“”,“socketDataCCW1”:“”,“socketCmdCW1”:“”,“socketDataCW1”:“”,“pinPush1”:32,“pinPushDebounce1”:10,“pushState1”:true,“pushAction1”:{“value”:1,“label”:“Wiedergabe starten”},“socketCmdPush1”:“”,“socketDataPush1”:“”,“longPushAction1”:{“value”:0,“label”:“…”},“socketCmdLongPush1”:“”,“socketDataLongPush1”:“”,“delayLongPush1”:“1500”,“doublePushAction1”:{“value”:0,“label”:“…”},“socketCmdDoublePush1”:“”,“socketDataDoublePush1”:“”,“delayDoublePush1”:“700”}
info: [ROTARYENCODER2] deactivateRotaries: 1,2,3
info: [ROTARYENCODER2] deactivateRotaries: 2,3
info: [ROTARYENCODER2] deactivateRotaries: 3
info: [ROTARYENCODER2] deactivateRotaries:
info: [ROTARYENCODER2] deactivateRotaries: end of recursion.
info: [ROTARYENCODER2] detachListener: [object Object]
error: [ROTARYENCODER2] detachListener: could not kill handler process [object Object]
info:

Log uninstall

info: CoreCommandRouter::executeOnPlugin: system , getPrivacySettings
info: CALLMETHOD: system_controller my_volumio retreiveBackendEventStates undefined
info: CoreCommandRouter::executeOnPlugin: my_volumio , retreiveBackendEventStates
info: Received Get System Version
info: CoreCommandRouter::executeOnPlugin: system , getSystemVersion
info: Starting Uninstall of plugin system_hardware - rotaryencoder2
info: Uninstalling plugin rotaryencoder2
info: [ROTARYENCODER2] onStop: Stopping Plugin.
info: [ROTARYENCODER2] deactivateRotaries: 1,2,3
info: [ROTARYENCODER2] deactivateRotaries: 2,3
info: [ROTARYENCODER2] deactivateRotaries: 3
info: [ROTARYENCODER2] deactivateRotaries:
info: [ROTARYENCODER2] deactivateRotaries: end of recursion.
info: [ROTARYENCODER2] detachListener: [object Object]
error: [ROTARYENCODER2] detachListener: could not kill handler process [object Object]
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 2 milliseconds


info: sendMpdCommand playlistinfo took 0 milliseconds

OK. I dug out my dusted development RPi and tried to replicate your issue with the little info you give me:

  • upgraded to Volumio V3.546 (with plugin V1.0.18) still works and when I enable/disable the rotaries, I get the below readings in the logs
  • downgraded the plugin to the last “stable” version (V1.0.15) - same reading again
  • upgraded the plugin to the last “beta” version (V1.0.19) - same reading again
  • Looked at your log:
    • your are using GPIOs 24/25 (rotary) and GPIO 32 (push button)
    • GPIO 32 is not a documented hardware GPIO on the RPi pin-header - the plugin basically allows you to put any number in - I do not do a lot of sanity checking, but if you are developing your hardware, you should normally know, which GPIO you connected to. You may be mixing GPIO numbering and pin numbering - I have put a warning at the bottom of this chapter in the documentation. But even if I put 32 in, the plugin still works - the button is just not working.
    • You only posted the settings for Rotary2 - is it possible that Rotary1 is not configured or incorrectly configured? Due to some strange behavior of the Kernel, all handles to all the rotaries need to be killed before we can make changes to any of them - so even if you save Rotary2, the issue might be Rotary1
  • I inserted your settings into my Rotary1 and Rotary2 - both times it is working, despite the non-sense GPIO number (only the push button is not working, because there is no GPIO32 I can connect it to)

From my point of view, the plugin is working fine regardless of Volumio version and plugin version. Since you seem to be able to use ssh you could log into your Volumio system and issue the command ls -laR /dev/input/ after you observed the error and post the result here - it might show us, what handle is stuck and cannot be released - it might be, that the system is preventing us from killing a handle that is used for something more important. The message basically just calls kill on a process that gives us the Kernels handle to the rotary device - if killing fails, it can mean that we are not allowed to kill the process (e.g. if the GPIO is used by the system for something else - a DAC, Display, SPI, I2C…)

In case all of my guesses above are not helping - please do me a favor and follow my bug report instructions - I need to know your system, Volumio Version and plugin version and a step by step instruction how to replicate the problem + a complete log to help me “re-build” your configuration (and not only the part where you think the bug is) - else I am wasting my time - it took me over an hour to test 3 plugin versions and poke around, while it would cost you 3 minutes to write down your config and maybe 10 minutes to create a proper log file.

This is the result I always get, regardless of changes I make:

info: [ROTARYENCODER2] deactivateRotaries: 1,2,3
info: [ROTARYENCODER2] deactivateRotaries: 2,3
info: [ROTARYENCODER2] deactivateRotaries: 3
info: [ROTARYENCODER2] deactivateRotaries:
info: [ROTARYENCODER2] deactivateRotaries: end of recursion.
info: [ROTARYENCODER2] detachListener: [object Object]
info: [ROTARYENCODER2] detachListener: successfully killed handler process
1 Like

Hello T0MR0,

Sorry it took me so long to reply … there was just too much going on.
In any case, thanks for your detailed reconstruction report. Next time I will compile the information more completely.
Even after I posted, I tried various things and then broke the system so badly that I couldn’t install or uninstall anything. I then decided, or was actually forced, to start again with a factory reset. Now everything works as it should.

But a few more words about the condition that brought me to the original question: Yes, I had entered the wrong values at the time (it was already a bit later that night) and so the pin numbers ended up in the fields instead of the GPIO numbers. That’s exactly why I wanted to correct it. Unfortunately, I had overlooked correcting the value for the button in the attempt to record the LOGs. However, I had changed all the values in many other previous attempts, including creating a decoder #3 on a trial basis, etc. The result was never positive.
I’m sorry that I can no longer generate the error, but I can contribute one thing from memory: I was using Volumio version V3.546 and the latest stable version of the plugin.

If the error situation should occur again, I would post again and leave the system untouched.

Best regards and thanks again

Hello - part II,

I’m just wondering whether I can reproduce the error if I enter the “wrong” GPIO numbers again!? I will make a backup of my configuration in the next few days and try exactly that. If it occurs again, I’ll post a complete LOG.

Best regards
M.

Do that - it would help me a lot to have a reproducible problem report.
I spent some more thought about it, too.
The problem seems to be, that when the handle does not release, the plugin does not properly disable the rotary and a restart just tries to bring them up again with the wrong settings.
I did not reset settings on purpose, when the rotary gets disabled, because I often want to disable a rotary, but do not want to enter all settings again. I will try to change the programming such, that the values are either autmatically reset, when the handle does not release or the user gets asked if he/she wants to reset them.
But this needs some time - which I currently do not have. So let’s see who is faster :wink:

Hi T0MR0,

I have found a few minutes to rebuild the situation.

So I re-entered the wrong values (as before) in the second encoder location. And I was able to reproduce the error!
It is no longer possible for me to change the values. I then created a complete log and added it here:

By the way, I use the HifiBerry DAC plus and this may be an important additional piece of information: By entering the wrong values for the encoder, GPIO18 is used twice.

If I can help further, e.g. by generating more logs or similar, please let me know.

Best regards

M.

Log
Starting Live Log...
info: CoreCommandRouter::executeOnPlugin: system , getPrivacySettings
Cannot compose Albumart path
info: CoreCommandRouter::executeOnPlugin: my_volumio , getMyVolumioStatus
info: CoreCommandRouter::executeOnPlugin: my_volumio , setMyVolumioToken
info: CoreCommandRouter::executeOnPlugin: my_volumio , getMyVolumioStatus
info: CoreCommandRouter::executeOnPlugin: my_volumio , setMyVolumioToken
...............................................................++++
info: CALLMETHOD: system_controller system enableLiveLog true
info: CoreCommandRouter::executeOnPlugin: system , enableLiveLog
info: Launching a new LiveLog session
info: [MyVolumio PluginManager] Adding plugin bluetooth to plan premium
info: [MyVolumio PluginManager] Adding plugin multiroom to plan premium
info: [MyVolumio PluginManager] Adding plugin metavolumio to plan premium
info: [MyVolumio PluginManager] Adding plugin manifestui to plan premium
info: [MyVolumio PluginManager] Adding plugin cd_controller to plan premium
info: [MyVolumio PluginManager] Adding plugin smart_inputs to plan premium
info: [MyVolumio PluginManager] Adding plugin hi_res_audio to plan premium
info: [MyVolumio PluginManager] Adding plugin tidal to plan premium
info: [MyVolumio PluginManager] Adding plugin qobuz to plan premium
info: [MyVolumio PluginManager] Adding plugin tidalconnect to plan premium
info: [MyVolumio PluginManager] Adding plugin bluetooth to plan superstar
info: [MyVolumio PluginManager] Adding plugin multiroom to plan superstar
info: [MyVolumio PluginManager] Adding plugin metavolumio to plan superstar
info: [MyVolumio PluginManager] Adding plugin manifestui to plan superstar
info: [MyVolumio PluginManager] Adding plugin cd_controller to plan superstar
info: [MyVolumio PluginManager] Adding plugin smart_inputs to plan superstar
info: [MyVolumio PluginManager] Adding plugin hi_res_audio to plan superstar
info: [MyVolumio PluginManager] Adding plugin tidal to plan superstar
info: [MyVolumio PluginManager] Adding plugin qobuz to plan superstar
info: [MyVolumio PluginManager] Adding plugin tidalconnect to plan superstar
info: [MyVolumio PluginManager] Adding plugin bluetooth to plan virtuoso
info: [MyVolumio PluginManager] Adding plugin manifestui to plan virtuoso
info: [MyVolumio PluginManager] Adding plugin cd_controller to plan virtuoso
info: [MyVolumio PluginManager] Adding plugin tidal to plan virtuoso
info: [MyVolumio PluginManager] Adding plugin qobuz to plan virtuoso
info: [MyVolumio PluginManager] Adding plugin tidalconnect to plan virtuoso
info: Adding plugin bluetooth to MyMusic Plugins
info: Adding plugin multiroom to MyMusic Plugins
info: Adding plugin metavolumio to MyMusic Plugins
info: Adding plugin cd_controller to MyMusic Plugins
info: Adding plugin smart_inputs to MyMusic Plugins
info: Adding plugin tidalconnect to MyMusic Plugins
info: [MyVolumio PluginManager] Loading plugin "my_volumio"...
..................................++++
e is 65537 (0x010001)
writing RSA key
info: [MyVolumio PluginManager] MyVolumio plugin successfully loaded
info: [MyVolumio PluginManager] Starting plugin system_controller.my_volumio
info: CoreCommandRouter::executeOnPlugin: system , getConfigParam
info: CoreCommandRouter::executeOnPlugin: system , getConfigParam
info: Starting MyVolumio Remote Streaming Endpoints
info: MyVolumio login type: Token
info: [MyVolumio PluginManager] MyVolumio plugin successfully started
info: [MyVolumio PluginManager] Loading plugin "streaming_services"...
info: Starting Streaming Service Transparent Proxy
info: [MyVolumio PluginManager] Streaming Services plugin successfully loaded
info: [MyVolumio PluginManager] Starting plugin music_service.streaming_services
info: Streaming services startup
info: Starting Streaming Daemon
 volumio : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/bin/systemctl restart volumio-streaming-daemon.service
pam_unix(sudo:session): session opened for user root by (uid=0)
info: [MyVolumio PluginManager] Streaming Services plugin successfully started
pam_unix(sudo:session): session closed for user root
error: Cannot start Volumio Streaming Daemon
error: Failed initialization of streaming services: Error: Error: Command failed: /usr/bin/sudo systemctl restart volumio-streaming-daemon.service
Failed to restart volumio-streaming-daemon.service: Unit volumio-streaming-daemon.service not found.
info: MYVOLUMIO SUCCESSFULLY LOGGED IN
STREAMING PROXY: Starting server on port 3245
Node JS runtime: 14

info: AutoStart - Plugin is starting
info: CoreCommandRouter::volumioGetQueue
info: CoreStateMachine::getQueue
info: CorePlayQueue::getQueue
info: AutoStart - start playing
info: AutoStart - start playing with no specific position
info: CoreCommandRouter::volumioPlay
info: CoreStateMachine::play index 0
info: CoreStateMachine::setConsumeUpdateService undefined
info: CoreStateMachine::stop
info: CoreStateMachine::setConsumeUpdateService undefined
info: CoreStateMachine::play index undefined
info: CoreStateMachine::setConsumeUpdateService undefined
info: CorePlayQueue::getTrack 0
info: CoreStateMachine::startPlaybackTimer
info: CorePlayQueue::getTrack 0
info: [1701116038670] ControllerWebradio::clearAddPlayTrack

info: sendMpdCommand stop took 1 milliseconds

info:
---------------------------- MPD announces system playlist update
info: Ignoring MPD Status Update
info: sendMpdCommand clear took 2 milliseconds

error: updateQueue error: null
info: ------------------------------ 4ms

 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

 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: CorePlayQueue::getTrack 0
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: sendMpdCommand add "http://streaming.radio.co:80/s774887f7b/listen" took 1 milliseconds
info: CoreStateMachine::setConsumeUpdateService mpd

Upnp client error: Error: This socket has been ended by the other party
info: ------------------------------ 4ms
info: sendMpdCommand play took 2 milliseconds
info:
---------------------------- MPD announces state update: player
info: ControllerMpd::getState

pcm512x 1-004d: No SCLK, using BCLK: -2
info:
---------------------------- MPD announces state update: player
info: sendMpdCommand status took 16 milliseconds
info: ControllerMpd::getState



info: sendMpdCommand status took 2 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 stop
info: ------------------------------ 27ms
info: sendMpdCommand playlistinfo took 6 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: CorePlayQueue::getTrack 0
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: CoreStateMachine::pushState
info: CoreCommandRouter::volumioPushState
info: ------------------------------ 33ms
info: [GPIO_Control] *** musicPlay ***
info: [GPIO_Control] Delaying: 0ms
info: [GPIO_Control] *** musicPlay ***
info: [GPIO_Control] Delaying: 0ms
info: [GPIO_Control] Turning GPIO 27 On (musicPlay)
info:
---------------------------- MPD announces system playlist update
info: Ignoring MPD Status Update
info:
---------------------------- MPD announces state update: player
info: ControllerMpd::getState

info:
---------------------------- MPD announces system playlist update
info: Ignoring MPD Status Update
info:
---------------------------- MPD announces state update: player
info: ControllerMpd::getState

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


info: ------------------------------ 5ms
info: sendMpdCommand status took 4 milliseconds
info: sendMpdCommand playlistinfo took 3 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: ------------------------------ 35ms
info: sendMpdCommand playlistinfo took 28 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::volumioPushState
info: CoreStateMachine::pushState
info: CoreCommandRouter::volumioPushState
info: ------------------------------ 66ms
info: [GPIO_Control] *** musicPlay ***
info: [GPIO_Control] Delaying: 0ms
info: [GPIO_Control] *** musicPlay ***
info: [GPIO_Control] Delaying: 0ms
info: [GPIO_Control] *** musicPlay ***
info: [GPIO_Control] Delaying: 0ms
info: [GPIO_Control] *** musicPlay ***
info: [GPIO_Control] Delaying: 0ms
info: [GPIO_Control] Turning GPIO 27 On (musicPlay)
info: CoreCommandRouter::executeOnPlugin: my_volumio , getMyVolumioStatus
info: MyVolumio token set successfully
info: MYVOLUMIO: Adding device
info: MYVOLUMIO: Evaluating Server
info: MyVolumio status changed
info: Streaming services startup
info: Starting Streaming Daemon
info: Removing browser output: myVolumio user plan is not superstar
info: Removing audio output:
info: Stoppping Tunnel 1
 volumio : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/bin/systemctl restart volumio-streaming-daemon.service
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=/bin/systemctl stop sshtunnel.service
pam_unix(sudo:session): session opened for user root by (uid=0)

error: Cannot start Volumio Streaming Daemon
error: Failed initialization of streaming services: Error: Error: Command failed: /usr/bin/sudo systemctl restart volumio-streaming-daemon.service
Failed to restart volumio-streaming-daemon.service: Unit volumio-streaming-daemon.service not found.
info: CoreCommandRouter::executeOnPlugin: my_volumio , getMyVolumioStatus
pam_unix(sudo:session): session closed for user root
info: Remote SSH Stopped
info: Setting Geolocation for MyVolumio to eu10
info: CoreCommandRouter::executeOnPlugin: system , getConfigParam
info: CoreCommandRouter::executeOnPlugin: system , getConfigParam
info: CoreCommandRouter::executeOnPlugin: system , getConfigParam

error: Failed to add MyVolumio device: {"message":"USER_NOT_FOUND"}
info: CoreCommandRouter::executeOnPlugin: system , getPrivacySettings

info: CoreCommandRouter::volumioGetState
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: Updating MyVolumio device info
info: CoreCommandRouter::executeOnPlugin: system , getConfigParam
info: CoreCommandRouter::executeOnPlugin: system , getConfigParam
info: CoreCommandRouter::executeOnPlugin: system , getConfigParam
info: CoreCommandRouter::executeOnPlugin: my_volumio , getMyVolumioStatus
info: CoreCommandRouter::executeOnPlugin: my_volumio , getMyVolumioToken
error: Failed to update MyVolumio device: {"message":"DEVICE_NOT_FOUND"}
info: CoreCommandRouter::executeOnPlugin: my_volumio , getMyVolumioStatus
Soliciting pool server 148.251.5.46
info: CoreCommandRouter::executeOnPlugin: system , getSystemVersion
info: CoreCommandRouter::executeOnPlugin: system , getConfigParam
info: CoreCommandRouter::executeOnPlugin: my_volumio , getAutoUpdateCheckEnabled
No test mode
No alpha test mode
info: CoreCommandRouter::executeOnPlugin: my_volumio , getAutoUpdateEnabled
info: Update Ready: {"changeLogLink":"","description":"You're already on the latest version","title":"No Updates Available","updateavailable":false}
info: CoreCommandRouter::executeOnPlugin: updater_comm , setUpdateMessageCache
info: CoreCommandRouter::executeOnPlugin: my_volumio , getMyVolumioStatus
Soliciting pool server 89.58.51.72
info: CoreCommandRouter::volumioStop
info: CoreStateMachine::stop
info: CoreStateMachine::setConsumeUpdateService undefined
info: CoreStateMachine::stPlaybackTimer
info: CoreStateMachine::updateTrackBlock
info: CorePlayQueue::getTrackBlock
info: CoreStateMachine::pushState
info: CorePlayQueue::getTrack 0
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
info: CoreStateMachine::serviceStop
info: CorePlayQueue::getTrack 0
info: CoreCommandRouter::serviceStop
info: [1701116050065] ControllerWebradio::stop

info: [GPIO_Control] *** musicStop ***
info: [GPIO_Control] Delaying: 0ms
info: [GPIO_Control] Turning GPIO 27 Off (musicStop)
info: touch_display: Setting screensaver timeout to 0 seconds.
info: sendMpdCommand stop took 78 milliseconds
info:
---------------------------- MPD announces state update: player
info: ControllerMpd::getState

info: sendMpdCommand status took 1 milliseconds


info: sendMpdCommand playlistinfo took 2 milliseconds

info: ControllerMpd::pushState
info: CoreCommandRouter::servicePushState
info: CoreStateMachine::pushState
info: CorePlayQueue::getTrack 0
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , saveDeviceInfo
info: CoreCommandRouter::volumioPushState
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: ------------------------------ 28ms
info: [GPIO_Control] *** musicStop ***
info: [GPIO_Control] Delaying: 0ms
info: [GPIO_Control] Turning GPIO 27 Off (musicStop)
Soliciting pool server 78.47.168.188
info: MYVOLUMIO: Adding device
info: MYVOLUMIO: Evaluating Server
info: Setting Geolocation for MyVolumio to eu6
info: CoreCommandRouter::executeOnPlugin: system , getConfigParam
Soliciting pool server 62.75.236.38
Soliciting pool server 129.70.132.34
Soliciting pool server 142.132.210.78
info: CoreCommandRouter::executeOnPlugin: alsa_controller , getConfigParam
info: CoreCommandRouter::executeOnPlugin: alsa_controller , getConfigParam
info: CoreCommandRouter::executeOnPlugin: i2s_dacs , getConfigParam
info: CoreCommandRouter::executeOnPlugin: i2s_dacs , getConfigParam
info: CoreCommandRouter::executeOnPlugin: appearance , getConfigParam
info: CoreCommandRouter::executeOnPlugin: mpd , getMyCollectionStatsObject
info: CoreCommandRouter::volumioGetBrowseSources
info: CoreCommandRouter::executeOnPlugin: system , getSystemVersion
error: Failed to add MyVolumio device: {"message":"USER_NOT_FOUND"}
info: Updating MyVolumio device info
info: CoreCommandRouter::executeOnPlugin: system , getConfigParam
Soliciting pool server 130.61.44.4
Soliciting pool server 144.76.59.37
Soliciting pool server 162.159.200.123
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 43s 647.69ms e[39m
info: CoreCommandRouter::volumiosetStartupVolume
info: CoreCommandRouter::executeOnPlugin: alsa_controller , getConfigParam
info: CoreCommandRouter::executeOnPlugin: system , getConfigParam
info: CoreCommandRouter::Close All Modals sent
info: CoreCommandRouter::Close All Modals sent
pcm512x 1-004d: No SCLK, using BCLK: -2
error: Failed to update MyVolumio device: {"message":"DEVICE_NOT_FOUND"}
Soliciting pool server 194.163.182.21
Soliciting pool server 193.203.3.170
Soliciting pool server 80.153.195.191
info: CoreCommandRouter::executeOnPlugin: alsa_controller , checkAudioDeviceAvailable
info: CoreCommandRouter::executeOnPlugin: i2s_dacs , getI2sStatus
info: CoreCommandRouter::executeOnPlugin: system , versionChangeDetect
Soliciting pool server 217.197.91.176
Soliciting pool server 78.46.60.40
Soliciting pool server 45.9.61.155
Soliciting pool server 17.253.14.251
Soliciting pool server 2001:638:a000:1123:123::4
info: [ROTARYENCODER2] onStop: Stopping Plugin.
info: [ROTARYENCODER2] deactivateRotaries: 1,2,3
info: [ROTARYENCODER2] deactivateRotaries: 2,3
info: [ROTARYENCODER2] deactivateRotaries: 3
info: [ROTARYENCODER2] deactivateRotaries:
info: [ROTARYENCODER2] deactivateRotaries: end of recursion.
info: [ROTARYENCODER2] detachListener: [object Object]
error: [ROTARYENCODER2] detachListener: could not kill handler process [object Object]
receive: Unexpected origin timestamp 0xe90f771a.413c1b73 does not match aorg 0000000000.00000000 from server@193.203.3.170 xmt 0xe90f773f.c2db8c5d
receive: Unexpected origin timestamp 0xe90f771a.414ef736 does not match aorg 0000000000.00000000 from server@148.251.5.46 xmt 0xe90f773f.c2bc6c9c
receive: Unexpected origin timestamp 0xe90f771a.4141f14b does not match aorg 0000000000.00000000 from server@144.76.59.37 xmt 0xe90f773f.c2d4156a
receive: Unexpected origin timestamp 0xe90f771a.412a13b9 does not match aorg 0000000000.00000000 from server@45.9.61.155 xmt 0xe90f773f.c37cd821
receive: Unexpected origin timestamp 0xe90f771a.4136fec4 does not match aorg 0000000000.00000000 from server@80.153.195.191 xmt 0xe90f773f.c2f9160a
receive: Unexpected origin timestamp 0xe90f771a.414740c4 does not match aorg 0000000000.00000000 from server@129.70.132.34 xmt 0xe90f773f.c3261293
receive: Unexpected origin timestamp 0xe90f771a.414c712b does not match aorg 0000000000.00000000 from server@89.58.51.72 xmt 0xe90f773f.c3bde650
info: CoreCommandRouter::executeOnPlugin: system , getPrivacySettings
info: CALLMETHOD: system_controller my_volumio retreiveBackendEventStates undefined
info: CoreCommandRouter::executeOnPlugin: my_volumio , retreiveBackendEventStates
info: Received Get System Version
info: CoreCommandRouter::executeOnPlugin: system , getSystemVersion
info: Received Get System Info
info: CoreCommandRouter::executeOnPlugin: system , getSystemInfo
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , getThisDevice
info: Discovery: Getting this device information
info: CoreCommandRouter::volumioGetState
info: CorePlayQueue::getTrack 0
info: CoreCommandRouter::executeOnPlugin: network , getCachedIPAddresses
info: CoreCommandRouter::executeOnPlugin: system , getPrivacySettings
info: CALLMETHOD: system_controller my_volumio retreiveBackendEventStates undefined
info: CoreCommandRouter::executeOnPlugin: my_volumio , retreiveBackendEventStates
info: Received Get System Version
info: CoreCommandRouter::executeOnPlugin: system , getSystemVersion
info: Received Get System Info
info: CoreCommandRouter::executeOnPlugin: system , getSystemInfo
info: CoreCommandRouter::executeOnPlugin: volumiodiscovery , getThisDevice
info: Discovery: Getting this device information
info: CoreCommandRouter::volumioGetState
info: CorePlayQueue::getTrack 0
info: CoreCommandRouter::executeOnPlugin: network , getCachedIPAddresses
info: [ROTARYENCODER2] onStop: Stopping Plugin.
info: [ROTARYENCODER2] deactivateRotaries: 1,2,3
info: [ROTARYENCODER2] deactivateRotaries: 2,3
info: [ROTARYENCODER2] deactivateRotaries: 3
info: [ROTARYENCODER2] deactivateRotaries:
info: [ROTARYENCODER2] deactivateRotaries: end of recursion.
info: [ROTARYENCODER2] detachListener: [object Object]
error: [ROTARYENCODER2] detachListener: could not kill handler process [object Object]
info: CoreCommandRouter::getUIConfigOnPlugin
info: [ROTARYENCODER2] getUIConfig: starting:
info: [ROTARYENCODER2] getUIConfig: i18nStrings{"ROTARYENCODER2":{"CONFIG":"Rotary Encoder II Plugin Konfiguration","SAVE":"Speichern","ENCODER0":"Drehgeber 1","D_ENCODER0":"Einstellungen für den ersten Drehgeber.","ENCODER1":"Drehgeber 2","D_ENCODER1":"Einstellungen für den zweiten Drehgeber.","ENCODER2":"Drehgeber 3","D_ENCODER2":"Einstellungen für den dritten Drehgeber.","ROTARYTYPE":"Perioden pro Schritt","D_ROTARYTYPE":"Perioden pro Schritt (Voll: A und B ganze Periode, Halb: A und B halbe Periode, Viertel: A oder B halbe Periode","FULL":"Volle Perioden Typ","HALF":"Halbe Perioden Typ","QUARTER":"Viertel Perioden Typ","PINA":"Anschluss A GPIO","D_PINA":"GPIO Ein-/Ausgang der mit dem ersten Anschluss des Drehgebers verbunden ist.","PINB":"Anschluss B GPIO","D_PINB":"GPIO Ein-/Ausgang der mit dem zweiten Anschluss des Drehgebers verbunden ist.","DIALACTION":"Drehfunktion","D_DIALACTION":"Funktion, die durch Drehen des Drehgebers ausgelöst wird. Die Funktion 'Websocket Nachricht senden' kann z.B. verwendet werden, um Websock Kommandos an andere Plugins zu senden. (Siehe https://volumio.github.io/docs/API/WebSocket_APIs.html Abschnitt 'CallMethod on Plugin' für weitere Informationen.)","DOTS":"...","VOLUME":"Lautstärke","SKIP":"Titel vor/zurück","SEEK":"Suche im Titel","SCROLL":"Scrollen","EMIT":"Websocket Nachricht senden","SOCKCMDCCW":"Kommando GUZS","SOCKDATACCW":"Daten GUZS","SOCKCMDCW":"Kommando UZS","SOCKDATACW":"Daten UZS","SOCKCMD":"Kommando","SOCKDATA":"Daten","D_SOCKCMD":"Kommandos, die via Websocket gesendet werden sollen.","D_SOCKDATA":"Daten, die zusammen mit dem Websocket Kommando gesendet werden.","PINPUSH":"Taster GPIO","D_PINPUSH":"GPIO Ein-/Ausgang der mit dem Taster des Drehgebers verbunden ist. 0 oder leer zum deaktivieren.","PUSHACTION":"Funktion Tastendruck","D_PUSHACTION":"Funktion, die durch das Drücken des Tasters ausgelöst wird.","LONGPUSHACTION":"Funktion langer Tastendruck","D_LONGPUSHACTION":"Funktion, die durch das lange Drücken des Tasters ausgelöst wird.","DOUBLEPUSHACTION":"Funktion doppelter Tastendruck","D_DOUBLEPUSHACTION":"Funktion, die durch das zweifache Drücken des Tasters ausgelöst wird","PINPUSHDEBOUNCE":"Entprell-Zeit (ms)","D_PINPUSHDEBOUNCE":"Entprell-Zeit für den Taster. Falls der Taster Hardware-entprellt ist, 0 setzen.","PUSHSTATE":"Taster-Logikpegel low-aktiv","D_PUSHSTATE":"Aktivieren, wenn der Logikpegel am GPIO bei gedrücktem Taster 'low' ist.","PINPUSHDELAY":"Verzögerung Tastendruck lang (ms)","D_PINPUSHDEDELAY":"Zeit in ms, die man den Taster gedrückt halten muss, um die Aktion für den langen Tastendruck auszulösen","PINDOUBLEPUSHDELAY":"Maximale Zeit zwischen doppelten Tastendrücken (ms)","D_PINDOUBLEPUSHDEDELAY":"Zeit in ms, innerhalb der zwei Tastendrücke passieren müssen","SET_DEBUG":"Fehlerdiagnose Einstellungen","D_SET_DEBUG":"Einstellungen zur Unterstützung der Fehlersuche.","PLAY":"Wiedergabe starten","PAUSE":"Pause","PLAYPAUSE":"Pause an/aus","STOP":"Stop","REPEAT":"Wiederholen","RANDOM":"Zufällige Wiedergabe","CLEARQUEUE":"Wiedergabeliste löschen","MUTE":"Stumm","UNMUTE":"Stumm aufheben","TOGGLEMUTE":"Stumm an/aus","SHUTDOWN":"System herunterfahren","REBOOT":"System neu starten","RESTARTAPP":"Applikation neu starten","DUMPLOG":"Log Datei abspeichern","LOGGING":"Log","D_LOGGING":"Aktiviert das Schreiben von Log-Nachrichten. Fehlermeldungen werden immer geschrieben.","TOAST_START_SUCCESS":"Plugin erfolgreich gestartet.","TOAST_STOP_SUCCESS":"Plugin erfolgreich angehalten.","TOAST_START_FAIL":"Start des Plugins fehlgeschlagen.","TOAST_STOP_FAIL":"Anhalten des Plugins fehlgeschlagen.","TOAST_GPIO_BLOCKED":"GPIO Pin nicht frei","TOAST_MSG_OVERLAY_BLOCKING":"Blockiert durch weiteres Overlay.","TOAST_SAVE_SUCCESS":"Speichern erfolgreich","TOAST_MSG_SAVE":"Einstellungen für Drehgeber ","TOAST_DEBUG_SAVE":"Einstellungen für Fehlersuche","TOAST_SAVE_FAIL":"Speichern gescheitert","TOAST_WRONG_PARAMETER":"Fehler in Einstellungen","TOAST_NEEDS_INTEGER":"GPIO Pins müssen Ganzzahlen sein.","TOAST_PINS_DIFFERENT":"GPIO Pins für Anschlüsse A/B/Taster müssen verschieden sein.","TOAST_PINS_BLOCKED":"Pins werden in einem der anderen Drehgeber verwendet","TOAST_NO_TYPE":"Bitte 'Periode pro Schritt' angeben!"}}
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'!"}}
info: [ROTARYENCODER2] getUIConfig: language code: de dir: /data/plugins/system_hardware/rotaryencoder2
info: [ROTARYENCODER2] getI18nString("VOLUME"):Lautstärke
info: [ROTARYENCODER2] getI18nString("TOGGLEMUTE"):Stumm an/aus
info: [ROTARYENCODER2] getI18nString("TOGGLEMUTE"):Stumm an/aus
info: [ROTARYENCODER2] getI18nString("TOGGLEMUTE"):Stumm an/aus
info: [ROTARYENCODER2] getI18nString("SKIP"):Titel vor/zurück
info: [ROTARYENCODER2] getI18nString("PLAY"):Wiedergabe starten
info: [ROTARYENCODER2] getI18nString("STOP"):Stop
info: [ROTARYENCODER2] getI18nString("REPEAT"):Wiederholen
info: [ROTARYENCODER2] getI18nString("DOTS"):...
info: [ROTARYENCODER2] getI18nString("DOTS"):...
info: [ROTARYENCODER2] getI18nString("DOTS"):...
info: [ROTARYENCODER2] getI18nString("DOTS"):...
info: CALLMETHOD: system_hardware rotaryencoder2 updateEncoder [object Object]
info: CoreCommandRouter::executeOnPlugin: rotaryencoder2 , updateEncoder
info: [ROTARYENCODER2] updateEncoder: Rotary2 with:{"enabled1":true,"rotaryType1":{"value":1,"label":"1/1"},"pinA1":"24","pinB1":"25","dialAction1":{"value":2,"label":"Titel vor/zurück"},"socketCmdCCW1":"","socketDataCCW1":"","socketCmdCW1":"","socketDataCW1":"","pinPush1":"12","pinPushDebounce1":10,"pushState1":true,"pushAction1":{"value":1,"label":"Wiedergabe starten"},"socketCmdPush1":"","socketDataPush1":"","longPushAction1":{"value":4,"label":"Stop"},"socketCmdLongPush1":"","socketDataLongPush1":"","delayLongPush1":"1500","doublePushAction1":{"value":5,"label":"Wiederholen"},"socketCmdDoublePush1":"","socketDataDoublePush1":"","delayDoublePush1":"700"}
info: [ROTARYENCODER2] sanityCheckSettings: Rotary2 for:{"enabled1":true,"rotaryType1":{"value":1,"label":"1/1"},"pinA1":"24","pinB1":"25","dialAction1":{"value":2,"label":"Titel vor/zurück"},"socketCmdCCW1":"","socketDataCCW1":"","socketCmdCW1":"","socketDataCW1":"","pinPush1":"12","pinPushDebounce1":10,"pushState1":true,"pushAction1":{"value":1,"label":"Wiedergabe starten"},"socketCmdPush1":"","socketDataPush1":"","longPushAction1":{"value":4,"label":"Stop"},"socketCmdLongPush1":"","socketDataLongPush1":"","delayLongPush1":"1500","doublePushAction1":{"value":5,"label":"Wiederholen"},"socketCmdDoublePush1":"","socketDataDoublePush1":"","delayDoublePush1":"700"}
info: [ROTARYENCODER2] deactivateRotaries: 1,2,3
info: [ROTARYENCODER2] deactivateRotaries: 2,3
info: [ROTARYENCODER2] deactivateRotaries: 3
info: [ROTARYENCODER2] deactivateRotaries:
info: [ROTARYENCODER2] deactivateRotaries: end of recursion.
info: [ROTARYENCODER2] detachListener: [object Object]
error: [ROTARYENCODER2] detachListener: could not kill handler process [object Object]
info: CoreCommandRouter::executeOnPlugin: my_volumio , getMyVolumioStatus
info: CoreCommandRouter::executeOnPlugin: my_volumio , getMyVolumioToken
info: Enabling plugin rotaryencoder2
info: Loading plugin "rotaryencoder2"...
info: PLUGIN START: rotaryencoder2
info: [ROTARYENCODER2] loadI18nStrings: /data/plugins/system_hardware/rotaryencoder2/i18n/strings_de.json
info: [ROTARYENCODER2] loadI18nStrings: loaded: {"ROTARYENCODER2":{"CONFIG":"Rotary Encoder II Plugin Konfiguration","SAVE":"Speichern","ENCODER0":"Drehgeber 1","D_ENCODER0":"Einstellungen für den ersten Drehgeber.","ENCODER1":"Drehgeber 2","D_ENCODER1":"Einstellungen für den zweiten Drehgeber.","ENCODER2":"Drehgeber 3","D_ENCODER2":"Einstellungen für den dritten Drehgeber.","ROTARYTYPE":"Perioden pro Schritt","D_ROTARYTYPE":"Perioden pro Schritt (Voll: A und B ganze Periode, Halb: A und B halbe Periode, Viertel: A oder B halbe Periode","FULL":"Volle Perioden Typ","HALF":"Halbe Perioden Typ","QUARTER":"Viertel Perioden Typ","PINA":"Anschluss A GPIO","D_PINA":"GPIO Ein-/Ausgang der mit dem ersten Anschluss des Drehgebers verbunden ist.","PINB":"Anschluss B GPIO","D_PINB":"GPIO Ein-/Ausgang der mit dem zweiten Anschluss des Drehgebers verbunden ist.","DIALACTION":"Drehfunktion","D_DIALACTION":"Funktion, die durch Drehen des Drehgebers ausgelöst wird. Die Funktion 'Websocket Nachricht senden' kann z.B. verwendet werden, um Websock Kommandos an andere Plugins zu senden. (Siehe https://volumio.github.io/docs/API/WebSocket_APIs.html Abschnitt 'CallMethod on Plugin' für weitere Informationen.)","DOTS":"...","VOLUME":"Lautstärke","SKIP":"Titel vor/zurück","SEEK":"Suche im Titel","SCROLL":"Scrollen","EMIT":"Websocket Nachricht senden","SOCKCMDCCW":"Kommando GUZS","SOCKDATACCW":"Daten GUZS","SOCKCMDCW":"Kommando UZS","SOCKDATACW":"Daten UZS","SOCKCMD":"Kommando","SOCKDATA":"Daten","D_SOCKCMD":"Kommandos, die via Websocket gesendet werden sollen.","D_SOCKDATA":"Daten, die zusammen mit dem Websocket Kommando gesendet werden.","PINPUSH":"Taster GPIO","D_PINPUSH":"GPIO Ein-/Ausgang der mit dem Taster des Drehgebers verbunden ist. 0 oder leer zum deaktivieren.","PUSHACTION":"Funktion Tastendruck","D_PUSHACTION":"Funktion, die durch das Drücken des Tasters ausgelöst wird.","LONGPUSHACTION":"Funktion langer Tastendruck","D_LONGPUSHACTION":"Funktion, die durch das lange Drücken des Tasters ausgelöst wird.","DOUBLEPUSHACTION":"Funktion doppelter Tastendruck","D_DOUBLEPUSHACTION":"Funktion, die durch das zweifache Drücken des Tasters ausgelöst wird","PINPUSHDEBOUNCE":"Entprell-Zeit (ms)","D_PINPUSHDEBOUNCE":"Entprell-Zeit für den Taster. Falls der Taster Hardware-entprellt ist, 0 setzen.","PUSHSTATE":"Taster-Logikpegel low-aktiv","D_PUSHSTATE":"Aktivieren, wenn der Logikpegel am GPIO bei gedrücktem Taster 'low' ist.","PINPUSHDELAY":"Verzögerung Tastendruck lang (ms)","D_PINPUSHDEDELAY":"Zeit in ms, die man den Taster gedrückt halten muss, um die Aktion für den langen Tastendruck auszulösen","PINDOUBLEPUSHDELAY":"Maximale Zeit zwischen doppelten Tastendrücken (ms)","D_PINDOUBLEPUSHDEDELAY":"Zeit in ms, innerhalb der zwei Tastendrücke passieren müssen","SET_DEBUG":"Fehlerdiagnose Einstellungen","D_SET_DEBUG":"Einstellungen zur Unterstützung der Fehlersuche.","PLAY":"Wiedergabe starten","PAUSE":"Pause","PLAYPAUSE":"Pause an/aus","STOP":"Stop","REPEAT":"Wiederholen","RANDOM":"Zufällige Wiedergabe","CLEARQUEUE":"Wiedergabeliste löschen","MUTE":"Stumm","UNMUTE":"Stumm aufheben","TOGGLEMUTE":"Stumm an/aus","SHUTDOWN":"System herunterfahren","REBOOT":"System neu starten","RESTARTAPP":"Applikation neu starten","DUMPLOG":"Log Datei abspeichern","LOGGING":"Log","D_LOGGING":"Aktiviert das Schreiben von Log-Nachrichten. Fehlermeldungen werden immer geschrieben.","TOAST_START_SUCCESS":"Plugin erfolgreich gestartet.","TOAST_STOP_SUCCESS":"Plugin erfolgreich angehalten.","TOAST_START_FAIL":"Start des Plugins fehlgeschlagen.","TOAST_STOP_FAIL":"Anhalten des Plugins fehlgeschlagen.","TOAST_GPIO_BLOCKED":"GPIO Pin nicht frei","TOAST_MSG_OVERLAY_BLOCKING":"Blockiert durch weiteres Overlay.","TOAST_SAVE_SUCCESS":"Speichern erfolgreich","TOAST_MSG_SAVE":"Einstellungen für Drehgeber ","TOAST_DEBUG_SAVE":"Einstellungen für Fehlersuche","TOAST_SAVE_FAIL":"Speichern gescheitert","TOAST_WRONG_PARAMETER":"Fehler in Einstellungen","TOAST_NEEDS_INTEGER":"GPIO Pins müssen Ganzzahlen sein.","TOAST_PINS_DIFFERENT":"GPIO Pins für Anschlüsse A/B/Taster müssen verschieden sein.","TOAST_PINS_BLOCKED":"Pins werden in einem der anderen Drehgeber verwendet","TOAST_NO_TYPE":"Bitte 'Periode pro Schritt' angeben!"}}
info: [ROTARYENCODER2] onStart: Config loaded: {"syncSave":true,"autosave":true,"autosaveDelay":1000,"saved":true,"atomicSave":false,"data":{"enabled0":{"type":"boolean","value":true},"rotaryType0":{"type":"number","value":2},"pinA0":{"type":"string","value":"5"},"pinB0":{"type":"string","value":"6"},"dialAction0":{"type":"number","value":1},"socketCmdCW0":{"type":"string","value":""},"socketDataCW0":{"type":"string","value":""},"socketCmdCCW0":{"type":"string","value":""},"socketDataCCW0":{"type":"string","value":""},"pinPush0":{"type":"number","value":13},"pinPushDebounce0":{"type":"number","value":10},"pushState0":{"type":"boolean","value":true},"pushAction0":{"type":"number","value":10},"socketCmdPush0":{"type":"string","value":""},"socketDataPush0":{"type":"string","value":""},"longPushAction0":{"type":"number","value":10},"socketCmdLongPush0":{"type":"string","value":""},"socketDataLongPush0":{"type":"string","value":""},"delayLongPush0":{"type":"string","value":"1500"},"doublePushAction0":{"type":"number","value":10},"socketCmdDoublePush0":{"type":"string","value":""},"socketDataDoublePush0":{"type":"string","value":""},"delayDoublePush0":{"type":"string","value":"700"},"enabled1":{"type":"boolean","value":true},"rotaryType1":{"type":"number","value":1},"pinA1":{"type":"string","value":"18"},"pinB1":{"type":"string","value":"22"},"dialAction1":{"type":"number","value":2},"socketCmdCW1":{"type":"string","value":""},"socketDataCW1":{"type":"string","value":""},"socketCmdCCW1":{"type":"string","value":""},"socketDataCCW1":{"type":"string","value":""},"pinPush1":{"type":"number","value":30},"pinPushDebounce1":{"type":"number","value":10},"pushState1":{"type":"boolean","value":true},"pushAction1":{"type":"number","value":1},"socketCmdPush1":{"type":"string","value":""},"socketDataPush1":{"type":"string","value":""},"longPushAction1":{"type":"number","value":4},"socketCmdLongPush1":{"type":"string","value":""},"socketDataLongPush1":{"type":"string","value":""},"delayLongPush1":{"type":"string","value":"1500"},"doublePushAction1":{"type":"number","value":5},"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"}
info: [ROTARYENCODER2] activateRotaries: 1,2,3
info: [ROTARYENCODER2] activateRotaries: 1,2
info: [ROTARYENCODER2] activateRotaries: 1
info: [ROTARYENCODER2] activateRotaries:
info: [ROTARYENCODER2] activateRotaries: end of recursion.
info: [ROTARYENCODER2] addOverlay: 5 6 2

 volumio : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/dtoverlay rotary-encoder pin_a=5 pin_b=6 relative_axis=true steps-per-period=2
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: CorePlayQueue::getTrack 0
info: /dev/input:
by-path
event0
event1
mice
mouse0
/dev/input/by-path:
platform-rotary@5-event
platform-soc:firmware:touchscreen-event
info: [ROTARYENCODER2] attachListener: /dev/input/by-path/platform-rotary@5-event
info: [ROTARYENCODER2] addEventHandle for rotary: 1
info: [ROTARYENCODER2] addOverlay: 18 22 1
 volumio : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/dtoverlay rotary-encoder pin_a=18 pin_b=22 relative_axis=true steps-per-period=1
pam_unix(sudo:session): session opened for user root by (uid=0)
pam_unix(sudo:session): session closed for user root
info: /dev/input:
by-path
event0
event1
mice
mouse0
/dev/input/by-path:
platform-rotary@5-event
platform-soc:firmware:touchscreen-event
info: [ROTARYENCODER2] attachListener: /dev/input/by-path/platform-rotary@12-event
info: [ROTARYENCODER2] addEventHandle for rotary: 2
info: [ROTARYENCODER2] activateButtons: 1,2,3
info: [ROTARYENCODER2] activateButtons: 1,2
info: [ROTARYENCODER2] activateButtons: 1
info: [ROTARYENCODER2] activateButtons:
info: [ROTARYENCODER2] activateButtons: end of recursion.
info: [ROTARYENCODER2] activateButtons: Now assign push button: 1, debounce: 10
info: [ROTARYENCODER2] Push Button 1 now resolving.
info: [ROTARYENCODER2] activateButtons: Now assign push button: 2, debounce: 10
info: [ROTARYENCODER2] Push Button 2 now resolving.
info: [ROTARYENCODER2] onStart: Plugin successfully started.
info: Done.
info: [ROTARYENCODER2] addEventHandle: Stream from rotary encoder ended.
error: [ROTARYENCODER2] addEventHandle: stderr: /bin/cat: /dev/input/by-path/platform-rotary@12-event: No such file or directory
info: [ROTARYENCODER2] addEventHandle: child process exited with code 1
info: [ROTARYENCODER2] onStop: Stopping Plugin.
info: [ROTARYENCODER2] deactivateRotaries: 1,2,3
info: [ROTARYENCODER2] deactivateRotaries: 2,3
info: [ROTARYENCODER2] deactivateRotaries: 3
info: [ROTARYENCODER2] deactivateRotaries:
info: [ROTARYENCODER2] deactivateRotaries: end of recursion.
info: [ROTARYENCODER2] detachListener: [object Object]
error: [ROTARYENCODER2] detachListener: could not kill handler process [object Object]

@T0MR0
I edited your post so it does what you intended

@T0MR0, Hi I am using your plugin since years now and I am thankful for.
I have since years an issue but learned to live with that, however now I would like to change my hardware setup and therefore it is maybe time to speak about. Maybe you can help me.
System is Raspberry 4 with latest build and plugin

In the “GPIO Buttons” Plugin I have manipulated all standard actions for other commands except one. That is the “Play/Pause” Command. Why?
I am doing so because the Playing/Pause Command in the “RotaryEncoder II” Plugin has a strange behavior when dealing with playing web radio.

When I am executing the button function “play/pause” on e.g., GPIO 4 and want to play web radio the following will happen:

Step No. | Hardware | Command | Action | Result

  1. | Button GPIO4 | Play/Pause | Play | True
  2. | Button GPIO4 | Play/Pause | Pause | True
  3. | Button GPIO4 | Play/Pause | Play | True
  4. | Button GPIO4 | Play/Pause | Play | False

That means Play, Pause, Play, FAILURE because the radio will not stop anymore with the buttons toggle command. when I set “Play” on short press and “Stop” on long press command it is working!
Assumption:
web radio needs some special support to work properly with the play/pause toggle command
While all other player sources are working with the emit command “pause” the web radio source needs the command “stop” instead.

While investigating a bit I found that in the “GPIO Button” plugin in the “gpio-buttons/index.js” there is a “if/else” request to find out if web radio is used, and if yes, the command is:

//Play / Pause
GPIOButtons.prototype.playPause = function() {
  //this.logger.info('GPIO-Buttons: Play/pause button pressed');
  socket.emit('getState','');
  socket.once('pushState', function (state) {
    if(state.status=='play' && state.service=='webradio'){
      socket.emit('stop');
    } else if(state.status=='play'){
      socket.emit('pause');
    } else {
      socket.emit('play');
    }
  });
};

Is there a way to write that code in an emit command for your plugin?
As I have no experience with “if/else” commands in emit commands and I do not know if this is supported it seems I need a little bit help from your side. Please can you support me?

Kind Regards
Benjamin

Hi testpilot,

thanks for the effort - I still cannot completely rebuild the issue, since it really seems to be related to your DAC (which I do not have on my testsystem, and I made it a habit, not to develop on my Audio gear in a hurry :wink:).
But the log and the description gave me the idea - I tried to use GPIOs that are assigned to something else and could reproduce a similar problem.
I have changed my code, so it does not get stuck anymore and instead throws a warning to check GPIOs and reboot the system.
However, the handle is not correctly released and I have no possibilities to check the system integrity - therefore the recommendation to reboot. However, the plugin should now properly save the changed settings and thus be able to be stopped, started and settings changed - please test with your problem, if it fixes that.
Version 1.0.20 is in the beta channel.
Still the warning to everybody reading this with similar problems: If you do hardware development on an RPi, you are responsible to make proper settings, that plugin is not intended to do sanity-checks on your hardware.

Hi Benjamin,

thanks for the hint, never used the Pause/Play toggle - I just updated the code as you requested - it should work with V1.0.20
Just think, that I may need to also update the ‘Pause’ function to issue stop if webradio is playing… that’ll go into 1.0.21 then :wink:

1 Like

Dear T0MR0 I will give feedback when Plugin is available on Volumio. Thank you so much for the fix!
Kind regards
Benjamin

It already is in the beta channel. You can install it after enabling beta plugins under http://volumio.local/dev

1 Like

Hi I have enabled the BETA Plugins.
Then I can see your Version V1.0.20.
When I deinstall old version V1.0.15 and install V1.0.20. or update V1.0.15 to V1.0.20, it promps that plugin was installed and enabled successfully.
However, in the “Installed Plugins” folder it shows deactive.
Then I try to activate it which prompts successfully and it again shows V1.0.15.
The Toggle issue remains.
Have I done something wrong?
Cheers Benjamin

please try this

  1. uninstall the plugin
  2. reboot
  3. enter the plugin section
  4. on the rotary encoder ii plugin, select “details”
  5. click on “install v1.0.20 (Beta)”
  6. when done, reboot
1 Like

You make my day!!!
Thank you!
Now all is working fine and I have testet with different sources and scenarious. Works like a charme

Does this plugin require “gpio” from the wiringpi package to function properly? Because version 2.50 of wiringpi does not support the Raspberry Pi 5, and there are no current plans to release new versions of wiringpi at this time. It’s been forked and a 2.70 version of that fork is in the works, but with no expected release date.

I can’t get this plugin (version 1.15) to work on a Raspberry Pi 5 at all. When I install it, then reboot, it’s listed as “inactive” despite being enabled. It then refuses to be uninstalled. I also can’t get the buttons-gpio plugin to work, with the exact same issues.

Hard to tell. I do not have a Pi5 for testing.
You could try to generate a log file following the instructions in the first post of this thread.
Just installing and rebooting normally doesn’t produce the behavior you describe.

Upon further research, it seems to be specifically a Pi 5 issue. The GPIO of the Pi 5 is no longer accessible in the same way as it was on all previous iterations of the boards. That means the GPIO libraries in Raspberry Pi OS based on Bullseye cannot be used to interact with the GPIO on the Pi 5. And since Volumio is based on Bullseye and uses those repositories, there’s currently no way to install the correct libraries and utilities, even though Volumio was updated with a kernel that supports the Pi 5

I always inform myself before posting, just to avoid looking like an idiot…
Volumio is based on Buster :wink: