[PLUGIN] RotaryEncoder II

Hi Darmur

I tried to install the rotary II plugin on Volumio 3 according to your proposal…
Once i get to the “npm install --save onoff@6.0.0” get the following:

In the end the pushbutton is working but the rotary encoder is not. With Volumio 2.X it did work…
Can you tell me what is the problem?
Thanks for your help

This is exactly what happens to me.
The author T0MR0 is looking into why it no longer works with V3
We need to be patient

Hi all,
sorry - still very busy times for me. Had a little time to dig and play and build a first fix.
Here is my current hypthesis:

  • In buster, we have the triggerhappy-daemon thd, which is watching the /dev/input folder for new devices. However, triggerhappy is not aware of rotary-encoders, so it does not act on the new device but seems to slow the udev process a bit.
  • I will not move to triggerhappy as was suggested, because it currently does not support rotary encoders and I do not like the idea of building on code, that seems to be abandoned since 2016. There is an open pull-request to include rotaries here which seems to be merged into another package in the meantime - but overall I trust the approach to build on Linux base-functionality more, as it works and is easier to maintain.
  • I also noticed, that dtoverlay returns before the by-path reference to the rotary is available to the system, because it is made with some delay by udev. Therefore the event-handle is not properly configured, which leads to the malfunction of one of the encoders.
  • As a first quick fix, to give all of you a work-around, I have installed a timeout to delay the activation of the events. This solves the issue on my test-system, giving me two functional encoders.
  • I uploaded a package in a branch on my personal repo. It was made with volumio plugin package on my Buster test-system. You should be able to use it and do a test. Let me know, how it goes. package is here
  • For a permanent fix I want to try and significantly improve the code. I think I found a way, to go back to readstream, but I need to test if it really does not crash the system anymore like in my old implementation, where it sometimes waited for data indefinitely. I also would like to insert a function that verifies, that the by-path reference is really installed, before it resolves the promise. Hope I have some time over the Holidays.
3 Likes

Hi @T0MR0

Just tested
Only using the 1 encoder as the volume, which seems to be working just fine.

You should submit it to the volumio plugin store as a beta, this will let other people have an encoder, while you work on getting it the way you want it to be.

Thanks BTW and good job :+1:

1 Like

I just submitted the patched version to the repo and created a pull request.
Hope this works, not 100% sure if I correctly followed the new Volumio 3 submission process. Let’s see, what the Jury says…
If I did not make a major mistake, you may be able to see it on the Beta Channel soon.

Hi T0MR0

The new version is working on my system as well, thank you!

1 Like

It is working I can confirm as well. Perfect job!

1 Like

Hi T0MR0

I have a strange behavior with the newest Rotary encoder version…It seems to be related with my Hifiberry DAC2 HD.
When Install the plugin and set the rotary to volume everything works fine. when I restart the system the sound is still there, but it when the startup is completed the sound dissapears. When i go into the Plugin setup and switch the rotary back to for example to track forward / backwards the sound comes back after saving. If I then switch back the rotary to Volume everything works fine until the next startup…
Do you have any Idea what could be the problem?
Thanks for your Help
Waldi

Hi Waldi, sorry to hear that, but I need a bit more info:

  • Which version are you referring to? 1.0.8 for Volumio3 or the version on the Volumio2 Plug-in Store?
  • Which Volumio version are U on?
  • Are you using any of GPIO2,3,16,18-21 for your rotaries?
  • Can you generate a log file?
  • I am using two kinds of Hifiberries without issues… and they use the same GPIOs as the HD.
    I need more info for a hypothesis…
    Regards Thomas
1 Like

it works like a charm with two encoders on Buster, well done!

Are you planning to publish it on the Volumio3 plugin store?

Hi, the PR is pending, see Here

Hi Thomas

Thanks for your answer…

I am referring to 1.0.8 for Volumio 3 and I am using it on Volumio 3. I use GIPIO 27 for the pushbutton and GPIO 17 and 22 for the rotary. I am actually sure that I did not mess up with the GPIOS of the Hifiberry …because the same setup with Volumio 2.9xx and the RotaryII decoder form the plugin store worked fine.
Ill try to make a log, I’ve never done one but I remember that it was described earlier in this post…Just needs some time…
Thanks for your Help

Christoph

Thomas, below the log (if that is the log you wanted…) since Dec 14.th when I reinstalled the plugin…
a lot and it is in German…shall I switch the language to english?

*volumio@waldis-volumio:~$ journalctl | grep -i encoder*
*Dec 14 19:21:00 waldis-volumio volumio[825]: info: Loading plugin "rotaryencoder2"...*
*Dec 14 19:21:02 waldis-volumio sudo[990]:  volumio : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/dtoverlay rotary-encoder pin_a=22 pin_b=17 relative_axis=true steps-per-period=1*
*Dec 14 19:21:02 waldis-volumio kernel: rotary-encoder rotary@16: gray*
*Dec 15 18:25:59 waldis-volumio volumio[825]: info: CALLMETHOD: user_interface rotaryencoder2 updateDebugSettings [object Object]*
*Dec 15 18:25:59 waldis-volumio volumio[825]: info: CoreCommandRouter::executeOnPlugin: rotaryencoder2 , updateDebugSettings*
*Dec 15 18:25:59 waldis-volumio volumio[825]: info: [ROTARYENCODER2] getI18nString("TOAST_SAVE_SUCCESS"):Speichern erfolgreich*
*Dec 15 18:25:59 waldis-volumio volumio[825]: info: [ROTARYENCODER2] getI18nString("TOAST_DEBUG_SAVE"):Einstellungen für Fehlersuche*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: CALLMETHOD: user_interface rotaryencoder2 updateEncoder [object Object]*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: CoreCommandRouter::executeOnPlugin: rotaryencoder2 , updateEncoder*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] updateEncoder: Rotary1 with:{"enabled0":true,"rotaryType0":{"value":1,"label":"1/1"},"pinA0":22,"pinB0":17,"dialAction0":{"value":2,"label":"Titel vor/zurück"},"socketCmdCCW0":"volume","socketDataCCW0":"-","socketCmdCW0":"volume","socketDataCW0":"+","pinPush0":27,"pinPushDebounce0":0,"pushState0":true,"pushAction0":{"value":3,"label":"Pause an/aus"},"socketCmdPush0":"","socketDataPush0":"","longPushAction0":{"value":11,"label":"System herunterfahren"},"socketCmdLongPush0":"","socketDataLongPush0":""}*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] sanityCheckSettings: Rotary1 for:{"enabled0":true,"rotaryType0":{"value":1,"label":"1/1"},"pinA0":22,"pinB0":17,"dialAction0":{"value":2,"label":"Titel vor/zurück"},"socketCmdCCW0":"volume","socketDataCCW0":"-","socketCmdCW0":"volume","socketDataCW0":"+","pinPush0":27,"pinPushDebounce0":0,"pushState0":true,"pushAction0":{"value":3,"label":"Pause an/aus"},"socketCmdPush0":"","socketDataPush0":"","longPushAction0":{"value":11,"label":"System herunterfahren"},"socketCmdLongPush0":"","socketDataLongPush0":""}*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] deactivateRotaries: 1,2,3*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] deactivateRotaries: 2,3*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] deactivateRotaries: 3*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] deactivateRotaries:*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] deactivateRotaries: end of recursion.*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] detachListener: [object Object]*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] detachListener: successfully killed handler process*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] checkOverlayExists: Checking for existing overlays for Rotary: 1*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] checkOverlayExists: check pinA=22pinB=17 in Overlays (in load order):*
*Dec 15 18:26:20 waldis-volumio volumio[825]: 0:  rotary-encoder  pin_a=22 pin_b=17 relative_axis=true steps-per-period=1*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] checkOverlayExists: rotary 1uses overlay 0*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] removeOverlay: 0*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle: Stream from rotary encoder ended.*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle: child process exited with code null*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] removeOverlay: 0 returned:*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] removeOverlay: "overlay -l" returned: No overlays loaded*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] deactivateRotaries: deactivated rotary1*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] deactivateButtons: 1,2,3*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] deactivateButtons: 2,3*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] deactivateButtons: 3*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] deactivateButtons:*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] deactivateButtons: end of recursion.*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] deactivateButtons: button 1 is disabled.*
*Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] updateEncoder: Changing Encoder 1 Settings to new values*
*Dec 15 18:26:21 waldis-volumio volumio[825]: info: [ROTARYENCODER2] activateRotaries: 1,2,3*
*Dec 15 18:26:21 waldis-volumio volumio[825]: info: [ROTARYENCODER2] activateRotaries: 1,2*
*Dec 15 18:26:21 waldis-volumio volumio[825]: info: [ROTARYENCODER2] activateRotaries: 1*
*Dec 15 18:26:21 waldis-volumio volumio[825]: info: [ROTARYENCODER2] activateRotaries:*
*Dec 15 18:26:21 waldis-volumio volumio[825]: info: [ROTARYENCODER2] activateRotaries: end of recursion.*
*Dec 15 18:26:21 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addOverlay: 22 17 1*
*Dec 15 18:26:21 waldis-volumio sudo[2683]:  volumio : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/dtoverlay rotary-encoder pin_a=22 pin_b=17 relative_axis=true steps-per-period=1*
*Dec 15 18:26:21 waldis-volumio kernel: rotary-encoder rotary@16: gray*
*Dec 15 18:26:22 waldis-volumio volumio[825]: info: [ROTARYENCODER2] attachListener: /dev/input/by-path/platform-rotary@16-event*
*Dec 15 18:26:22 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle for rotary: 1*
*Dec 15 18:26:22 waldis-volumio volumio[825]: info: [ROTARYENCODER2] activateButtons: 1,2,3*
*Dec 15 18:26:22 waldis-volumio volumio[825]: info: [ROTARYENCODER2] activateButtons: 1,2*
*Dec 15 18:26:22 waldis-volumio volumio[825]: info: [ROTARYENCODER2] activateButtons: 1*
*Dec 15 18:26:22 waldis-volumio volumio[825]: info: [ROTARYENCODER2] activateButtons:*
*Dec 15 18:26:22 waldis-volumio volumio[825]: info: [ROTARYENCODER2] activateButtons: end of recursion.*
*Dec 15 18:26:22 waldis-volumio volumio[825]: info: [ROTARYENCODER2] activateButtons: Now assign push button: 1*
*Dec 15 18:26:22 waldis-volumio volumio[825]: info: [ROTARYENCODER2] Push Button 1 now resolving.*
*Dec 15 18:26:22 waldis-volumio volumio[825]: info: [ROTARYENCODER2] getI18nString("TOAST_SAVE_SUCCESS"):Speichern erfolgreich*
*Dec 15 18:26:22 waldis-volumio volumio[825]: info: [ROTARYENCODER2] getI18nString("TOAST_MSG_SAVE"):Einstellungen für Drehgeber*
*Dec 15 18:26:22 waldis-volumio volumio[825]: info: [ROTARYENCODER2] updateEncoder: SUCCESS with Toast: Speichern erfolgreich Einstellungen für Drehgeber 1*
*Dec 15 18:26:22 waldis-volumio volumio[825]: info: [ROTARYENCODER2] getI18nString("TOAST_SAVE_SUCCESS"):Speichern erfolgreich*
*Dec 15 18:26:22 waldis-volumio volumio[825]: info: [ROTARYENCODER2] getI18nString("TOAST_MSG_SAVE"):Einstellungen für Drehgeber*
*Dec 15 18:27:02 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: -1*
*Dec 15 18:27:02 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value -1for Rotary: 1*
*Dec 15 18:27:02 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: -1*
*Dec 15 18:27:02 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value -1for Rotary: 1*
*Dec 15 18:27:02 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: -1*
*Dec 15 18:27:02 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value -1for Rotary: 1*
*Dec 15 18:27:02 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: -1*
*Dec 15 18:27:02 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value -1for Rotary: 1*
*Dec 15 18:27:02 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: -1*
*Dec 15 18:27:02 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value -1for Rotary: 1*
*Dec 15 18:27:03 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: -1*
*Dec 15 18:27:03 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value -1for Rotary: 1*
*Dec 15 18:27:03 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: 1*
*Dec 15 18:27:03 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value 1for Rotary: 1*
*Dec 15 18:27:03 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: 1*
*Dec 15 18:27:03 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value 1for Rotary: 1*
*Dec 15 18:27:03 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: 1*
*Dec 15 18:27:03 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value 1for Rotary: 1*
*Dec 15 18:27:03 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: 1*
*Dec 15 18:27:03 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value 1for Rotary: 1*
*Dec 15 18:27:03 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: 1*
*Dec 15 18:27:03 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value 1for Rotary: 1*
*Dec 15 18:27:03 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: 1*
*Dec 15 18:27:03 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value 1for Rotary: 1*
*Dec 15 18:27:03 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: 1*
*Dec 15 18:27:03 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value 1for Rotary: 1*
*Dec 15 18:27:03 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: -1*
*Dec 15 18:27:03 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value -1for Rotary: 1*
*Dec 15 18:27:04 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: -1*
*Dec 15 18:27:04 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value -1for Rotary: 1*
*Dec 15 18:27:04 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: -1*
*Dec 15 18:27:04 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value -1for Rotary: 1*
*Dec 15 18:27:04 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: -1*
*Dec 15 18:27:04 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value -1for Rotary: 1*
*Dec 15 18:27:04 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: -1*
*Dec 15 18:27:04 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value -1for Rotary: 1*
*Dec 15 18:27:04 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: -1*
*Dec 15 18:27:04 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value -1for Rotary: 1*
*Dec 15 18:27:05 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: 1*
*Dec 15 18:27:05 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value 1for Rotary: 1*
*Dec 15 18:27:05 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: 1*
*Dec 15 18:27:05 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value 1for Rotary: 1*
*Dec 15 18:27:05 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: 1*
*Dec 15 18:27:05 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value 1for Rotary: 1*
*Dec 15 18:27:05 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: 1*
*Dec 15 18:27:05 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value 1for Rotary: 1*
*Dec 15 18:27:05 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: 1*
*Dec 15 18:27:05 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value 1for Rotary: 1*
*Dec 15 18:27:05 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: 1*
*Dec 15 18:27:05 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value 1for Rotary: 1*
*Dec 15 18:27:05 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: 1*
*Dec 15 18:27:05 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value 1for Rotary: 1*
*Dec 15 18:27:05 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: 1*
*Dec 15 18:27:05 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value 1for Rotary: 1*
*Dec 15 18:27:05 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: 1*
*Dec 15 18:27:05 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value 1for Rotary: 1*
*Dec 15 18:27:06 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: -1*
*Dec 15 18:27:06 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value -1for Rotary: 1*
*Dec 15 18:27:06 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: -1*
*Dec 15 18:27:06 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value -1for Rotary: 1*
*Dec 15 18:27:06 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: -1*
*Dec 15 18:27:06 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value -1for Rotary: 1*
*Dec 15 18:27:06 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: -1*
*Dec 15 18:27:06 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value -1for Rotary: 1*
*Dec 15 18:27:06 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: -1*
*Dec 15 18:27:06 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value -1for Rotary: 1*
*Dec 15 18:27:06 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle received from rotary: 1 -> Dir: -1*
*Dec 15 18:27:06 waldis-volumio volumio[825]: info: [ROTARYENCODER2] emitDialCommand: 2 with value -1for Rotary: 1*
*Dec 15 18:27:32 waldis-volumio volumio[825]: info: [ROTARYENCODER2] getUIConfig: starting:*
*Dec 15 18:27:32 waldis-volumio volumio[825]: 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.","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.","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!"}}*
*Dec 15 18:27:32 waldis-volumio volumio[825]: 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.","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.","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'!"}}*
*Dec 15 18:27:32 waldis-volumio volumio[825]: info: [ROTARYENCODER2] getUIConfig: language code: de dir: /data/plugins/user_interface/rotaryencoder2*
*Dec 15 18:27:32 waldis-volumio volumio[825]: info: [ROTARYENCODER2] getI18nString("SKIP"):Titel vor/zurück*
*Dec 15 18:27:32 waldis-volumio volumio[825]: info: [ROTARYENCODER2] getI18nString("PLAYPAUSE"):Pause an/aus*
*Dec 15 18:27:32 waldis-volumio volumio[825]: info: [ROTARYENCODER2] getI18nString("SHUTDOWN"):System herunterfahren*
*Dec 15 18:27:32 waldis-volumio volumio[825]: info: [ROTARYENCODER2] getI18nString("DOTS"):...*
*Dec 15 18:27:32 waldis-volumio volumio[825]: info: [ROTARYENCODER2] getI18nString("DOTS"):...*
*Dec 15 18:27:32 waldis-volumio volumio[825]: info: [ROTARYENCODER2] getI18nString("DOTS"):...*
*Dec 15 18:27:32 waldis-volumio volumio[825]: info: [ROTARYENCODER2] getI18nString("DOTS"):...*
*Dec 15 18:27:32 waldis-volumio volumio[825]: info: [ROTARYENCODER2] getI18nString("DOTS"):...*
*Dec 15 18:27:32 waldis-volumio volumio[825]: info: [ROTARYENCODER2] getI18nString("DOTS"):...*
*volumio@waldis-volumio:~$ Volumio Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent*
*-bash: Volumio: command not found*
*volumio@waldis-volumio:~$ permitted by applicable law.*
*-bash: permitted: command not found*
*volumio@waldis-volumio:~$ Welcome to Volumio for Raspberry Pi (5.4.83-v7l+ armv7l)*
*-bash: syntax error near unexpected token `('*
*volumio@waldis-volumio:~$ volumio@waldis-volumio:~$ journalctl | grep -i encoder*
*-bash: volumio@waldis-volumio:~$: command not found*
*volumio@waldis-volumio:~$ Dec 14 19:21:00 waldis-volumio volumio[825]: info: Loading plugin "rotaryencoder2"...*
*-bash: Dec: command not found*
*volumio@waldis-volumio:~$ Dec 14 19:21:02 waldis-volumio sudo[990]:  volumio : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/dtoverlay rotary-encoder pin_a=22 pin_b=17 relative_axis=true steps-per-period=1*
*-bash: Dec: command not found*
*-bash: rotary-encoder: command not found*
*volumio@waldis-volumio:/$ Dec 14 19:21:02 waldis-volumio kernel: rotary-encoder rotary@16: gray*
*-bash: Dec: command not found*
*volumio@waldis-volumio:/$ Dec 15 18:25:59 waldis-volumio volumio[825]: info: CALLMETHOD: user_interface rotaryencoder2 updateDebugSettings [object Object]*
*-bash: Dec: command not found*
*volumio@waldis-volumio:/$ Dec 15 18:25:59 waldis-volumio volumio[825]: info: CoreCommandRouter::executeOnPlugin: rotaryencoder2 , updateDebugSettings*
*-bash: Dec: command not found*
*volumio@waldis-volumio:/$ Dec 15 18:25:59 waldis-volumio volumio[825]: info: [ROTARYENCODER2] getI18nString("TOAST_SAVE_SUCCESS"):Speichern erfolgreich*
*-bash: syntax error near unexpected token `('*
*volumio@waldis-volumio:/$ Dec 15 18:25:59 waldis-volumio volumio[825]: info: [ROTARYENCODER2] getI18nString("TOAST_DEBUG_SAVE"):Einstellungen für Fehlersuche*
*-bash: syntax error near unexpected token `('*
*volumio@waldis-volumio:/$ Dec 15 18:26:20 waldis-volumio volumio[825]: info: CALLMETHOD: user_interface rotaryencoder2 updateEncoder [object Object]*
*-bash: Dec: command not found*
*volumio@waldis-volumio:/$ Dec 15 18:26:20 waldis-volumio volumio[825]: info: CoreCommandRouter::executeOnPlugin: rotaryencoder2 , updateEncoder*
*-bash: Dec: command not found*
*volumio@waldis-volumio:/$ Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] updateEncoder: Rotary1 with:{"enabled0":true,"rotaryType0":{"value":1,"label":"1/1"},"pinA0":22,"pinB0":17,"dialAction0":{"value":2,"label":"Titel vor/zurück"},"socketCmdCCW0":"volume","socketDataCCW0":"-","socketCmdCW0":"volume","socketDataCW0":"+","pinPush0":27,"ppinPushDebounce0":0,"pushState0":true,"pushAction0":{"value":3,"label":"Pause an/aus"},"socketCmdPush0":"","socketDataPush0":"","longPushAction0":{"value":11,"label":"System herunterfahren"},"socketCmdLongPush0":"","socketDataLongPush0":""}*
*-bash: Dec: command not found*
*volumio@waldis-volumio:/$ Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] sanityCheckSettings: Rotary1 for:{"enabled0":true,"rotaryType0":{"value":1,"label":"1/1"},"pinA0":22,"pinB0":17,"dialAction0":{"value":2,"label":"Titel vor/zurück"},"socketCmdCCW0":"volume","socketDataCCW0":"-","socketCmdCW0":"volume","socketDataCW0":"+","pinPush0"::27,"pinPushDebounce0":0,"pushState0":true,"pushAction0":{"value":3,"label":"Pause an/aus"},"socketCmdPush0":"","socketDataPush0":"","longPushAction0":{"value":11,"label":"System herunterfahren"},"socketCmdLongPush0":"","socketDataLongPush0":""}*
*-bash: Dec: command not found*
*volumio@waldis-volumio:/$ Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] deactivateRotaries: 1,2,3*
*-bash: Dec: command not found*
*volumio@waldis-volumio:/$ Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] deactivateRotaries: 2,3*
*-bash: Dec: command not found*
*volumio@waldis-volumio:/$ Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] deactivateRotaries: 3*
*-bash: Dec: command not found*
*volumio@waldis-volumio:/$ Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] deactivateRotaries:*
*-bash: Dec: command not found*
*volumio@waldis-volumio:/$ Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] deactivateRotaries: end of recursion.*
*-bash: Dec: command not found*
*volumio@waldis-volumio:/$ Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] detachListener: [object Object]*
*-bash: Dec: command not found*
*volumio@waldis-volumio:/$ Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] detachListener: successfully killed handler process*
*-bash: Dec: command not found*
*volumio@waldis-volumio:/$ Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] checkOverlayExists: Checking for existing overlays for Rotary: 1*
*-bash: Dec: command not found*
*volumio@waldis-volumio:/$ Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] checkOverlayExists: check pinA=22pinB=17 in Overlays (in load order):*
*-bash: syntax error near unexpected token `('*
*volumio@waldis-volumio:/$ Dec 15 18:26:20 waldis-volumio volumio[825]: 0:  rotary-encoder  pin_a=22 pin_b=17 relative_axis=true steps-per-period=1*
*-bash: Dec: command not found*
*volumio@waldis-volumio:/$ Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] checkOverlayExists: rotary 1uses overlay 0*
*-bash: Dec: command not found*
*volumio@waldis-volumio:/$ Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] removeOverlay: 0*
*-bash: Dec: command not found*
*volumio@waldis-volumio:/$ Dec 15 18:26:20 waldis-volumio volumio[825]: info: [ROTARYENCODER2] addEventHandle: Stream from rotary encoder ended.*
*-bash: Dec: command not found*
*volumio@waldis-volumio:/$*

Hi Christoph,

Deutsch ist OK, kein Problem. Ich antworte aber weiter auf Englisch, dann hilft’s allen…

Looks all ok at first sight. I think, that something went wrong with logging - at the End of the log, every second line is Dec: command not found, which looks like you somehow pasted the log into the shell, which tries to interpret it, thinking that the Dec in the date is a command. But the rest is fine. However, the moment when the audio fails is probably not yet included, since you only start the logging at the beginning of the log and the next thing is, that you save the settings to “Skip Title fwd/back”, which in your original post is your work-around to make it working again.

I read your original post again and my interpretation is the following: You use the rotary to control volume and that works, but when you restart volumio, it starts to play music but then the sound disappears and you have to change settings, to make it work again. Can you confirm, if I get it correctly?

Now to my findings and some additional requests for debugging:

  1. I see that there are settings in the "socketCmdCW0", "socketCmdCCW0", "socketDataCW0" and "socketDataCCW0" parameters which are empty by default. Are you using those, to control the volume? If yes, can you try, to use the “Volume” setting from the “Dial action”-dropdown in the settings instead of the “Emit WebSocket Message” setting? I did not test “Emit WebSocket” with Volumio 3 yet, so it might be, that it is not fully working and the purpose of this was not volume control (I just used Volume control as an example in the help pages)
  2. On my system, the playback normally does not start automatically, are U using another plugin to automatically start playback? It could be an interference with the other plugin. In case this is the case, can you disable the other plugin and test again?
  3. The log you posted does not contain the actual startup, where your problem seems to happen. What I would ask you to provide would be the boot-log following the below steps:
    a. make sure that logging is enabled in the plugin settings
    b. restart Volumio
    c. Wait for the sound to disappear and then go to the settings and change the setting + save as you described
    d. Log into Volumio via SSH and write the boot-log to a file by issuing
    journalctl -b > mylog.txt
    (This prints the system log and pipes it into a text-file)

Please do not paste the full log-file here, better upload it as attachment or send it to me via personal message. I do not need to see the full log, only the part starting from Volumio System Startup section is important. You can remove any personal data from the log, if there is any (e.g. if you connect to servers or services and it contains any user data).

Beste Grüße,
Thomas

Hi Thomas

First, the strange thing is if I now change the settings from Volume (actually Volume and not WebSocket) to FWD/Back I cannot fix the issue…
I don know what i have done but i cannot reproduce it anymore…
So now the behavior is the following (regardless of the Rotary settings…) After startup i hear the sound form paradise radio until it is fully started up and the ui is visible on my display… Then the sound disappears but I hear the startup melody of Volumio after a short time. From this time on i can hear no sound anymore…
here you can find the log:mylog.txt (102.7 KB)
…and sorry for posting the large log, I couldn’t find the upload button…
Regards & Thanks Christoph

Hi Christoph,

I had little time, to go deep, but at first sight, I can already spot a few strange things in the log.
Here is what we can see:

  • The plugin starts-up just fine (line 227 to 356 (with some other things happening in-between))
  • The streaming Daemon starts around line 450
  • Almost immediately after that, there is line 458 saying: info: [ROTARYENCODER2] Push Button 1 released after NaNms.
  • This is strange, because the entry means, that the push-button of the rotary connected to GPIO 27 was released. But there was no entry, that it was ever pressed. :roll_eyes:
  • This has several reasons, probably:
    • the lazy programmer (me) has not properly initialized his variables, since it says after NaNms, because it cannot calculate the time - the calculationg is “current time - time when button pressed”. Since button was never pressed, calculation failed. I will fix this later this week
    • However, normally this situation should not occur, because the button has to be pressed, before it can be released. So there may be some things to check on your end:
      • Please check, if your setting for “Button Logic Level active low” is correct. If this setting is inverted, the plugin thinks, that the button is pressed all the time and when you actually press it, it thinks the button was released. I do not know your background, so in case the terms “logic level” and “active low” sound like Klingon to you (no offense to any Klingons reading this), you can find some background here
      • In case the setting is correct, it might be also a bouncy button, that is causing the issue. So you might want to try to set the “Debounce Time (ms)” to something like 10ms or up to 50ms (I promise, you will not notice)
  • After the generation of the wrong signal, music starts to play - on line 460 we issue a volumioPlay
  • Line 482 shows, that radioparadise is your choice (15:36:41) - and nice, we listen to Nine Inch Nails :slight_smile: (line 583)
  • Line 845 shows info: BOOT COMPLETED at 15:36:57 and that is, where on my system roughly the startup sound is played. So according to the log there should be about 16 seconds between the start of radio paradise and the startup sound
  • there are no further messages from the plugin
  • Sometimes, the easy things can also help: did you try to press your button again? Or maybe press and hold it? Or press Play on the web-interface? From the log it looks, like the startup process just stopped playback and it could actually be resumed

This is what I can see so far - there are also a lot of error messages I cannot interpret, but I think a lot of them are from other components in the Beta System and not related to your issue.
Actually, it looks like a bit timing related - the button is coming early, before Volumio has finished startup.
I’ll fix my bug with the uninitialized variable, but this cannot be the only issue. Please check your settings as proposed and let me know, if it helps.

Best regards,
Thomas

Hi Thomas

Thank you for your comprehensive post which was really fun to read (I am sure even for Klingons…)
Yesterday I made some investigations and yes, it is related to the pushbutton. I made a little hardware (which is my background) with a small seeeduino and a color LED ring.The seeeduino actually reads in the rotary, mirrors the state to certain outputs and handles the power of the raspberry and the display to achieve a low standby current. As it seems something in my software debouncing goes wrong (It’s always critical if hardies doing software…) and because of that it really might be that it gives out some pulses during the startup of the raspberry.
At the end of my debug session yesterday I managed to start up Volumio with sound, with the downside that the shutdown is not working anymore…

long story short, the problem lays on my own hardware / software no changes from your side are needet. I am sure that I can solve it now…Thanks to your inputs.

Ill let you know once it is working completely…

Best regards Christoph

If the problem is with debouncing. You are probably better off with hardware debouncing.
100nf capacitor between signal and ground.on each of pin a, pin b, and the switch.

Just want to say thank you for the plugin! I just installed a rotary encoder and everything is working as expected. Makes listening much more comfortable for me!

Just one quick suggestion: It would be nice if the long press action immediately happens after the trigger time (2s?), even when the button is still pressed. Also it would be cool to be able to adjust the trigger time.

1 Like

With that it would be impossible to add another feature i would prefer to have in a future version of the plugin, where it may be possible to add different actions by for example:

Pressing the button short (<2s.) = Mute / unmute
Pressing the button long (>2s.) = Pause / Play
Pressing the button extra long (~5s.) = Shutdown the PI

…my suggestion :slight_smile:

1 Like