Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release 2.7.0 #2358

Merged
merged 9 commits into from
Apr 26, 2024
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/pythonpackage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
strategy:
max-parallel: 4
matrix:
python-version: ['3.7', '3.8', '3.9', '3.10', '3.11']
python-version: ['3.9', '3.10', '3.11', '3.12']
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We are also dropping 3.8 here (release note state only dropping 3.7)


steps:
- uses: actions/checkout@v4
Expand Down
15 changes: 0 additions & 15 deletions .github/workflows/test_docker_debian.yml
Original file line number Diff line number Diff line change
Expand Up @@ -69,18 +69,3 @@ jobs:
# with:
# debian_codename: 'bullseye'
# platform: linux/arm/v6

run_buster_armv7:
name: 'buster armv7'
uses: ./.github/workflows/test_docker_debian_codename_sub.yml
with:
debian_codename: 'buster'
platform: linux/arm/v7

# # can be activate on test branches, currently failing
# run_buster_armv6:
# name: 'buster armv6'
# uses: ./.github/workflows/test_docker_debian_codename_sub.yml
# with:
# debian_codename: 'buster'
# platform: linux/arm/v6
4 changes: 2 additions & 2 deletions .github/workflows/test_docker_debian_codename_sub.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ jobs:
uses: docker/[email protected]

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3.1.0
uses: docker/setup-buildx-action@v3.2.0
with:
# network=host driver-opt needed to push to local registry
driver-opts: network=host
Expand Down Expand Up @@ -155,7 +155,7 @@ jobs:
uses: docker/[email protected]

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3.1.0
uses: docker/setup-buildx-action@v3.2.0

- name: Artifact Download Docker Image
uses: actions/download-artifact@v4
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ If the code change results in a test failure, we will make our best effort to co

### Guidelines

* The oldest supported Raspberry Pi OS version is currently **Buster**. Therefore all Python code should work with **Python 3.7**.
* All code has to run under the stable and legacy version of Raspberry Pi OS (please check if currently even an older version is still supported).
* For GPIO all code should work with **RPi.GPIO**. gpiozero is currently not intended to use.

### Additional Resources
Expand Down
14 changes: 2 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,6 @@

Phoniebox is a contactless jukebox for the Raspberry Pi, playing audio files, playlists, podcasts, web streams and spotify triggered by RFID cards. All plug and play via USB, no soldering iron needed. It also features GPIO buttons control support.

## Important Notice regarding Spotify Integration

**Spotify has [disabled access to libspotify on May 16, 2022](https://developer.spotify.com/community/news/2022/04/12/libspotify-sunset/).**

This means **Spotify in Phoniebox doesn't work at the moment**. For further information see [Spotify FAQ](https://github.com/MiczFlor/RPi-Jukebox-RFID/wiki/Spotify-FAQ)

We are working to provide an integrated solution.
For Version 2 there is a possible fix to reactivate spotify with a manual installation described [here](https://github.com/MiczFlor/RPi-Jukebox-RFID/issues/1815#issuecomment-1666535983).
For Version 3 [#2164](https://github.com/MiczFlor/RPi-Jukebox-RFID/pull/2164) is laying the groundwork. Help is greatly appreciated.

## The new Phoniebox Calendar is here

Another bunch of wonderful designs!
Expand Down Expand Up @@ -80,11 +70,11 @@ Check out the following references.
* [**RFID** control](https://github.com/MiczFlor/RPi-Jukebox-RFID/wiki/MANUAL#cardcontrol) for playout and controlling your Phoniebox (e.g. set [maximum volume with RFID](https://github.com/MiczFlor/RPi-Jukebox-RFID/pull/633) cards).
* Support for various RFID readers, e.g.
* USB
* [RC422](components/rfid-reader/RC522/README.md)
* [RC522](components/rfid-reader/RC522/README.md)
* [PN532](components/rfid-reader/PN532/README.md)
* PC/SC
* also [multiple readers](https://github.com/MiczFlor/RPi-Jukebox-RFID/pull/1012#issue-434052529) simultaneously
* [**GPIO** control](components/gpio_control/README.md) for [buttons](https://github.com/MiczFlor/RPi-Jukebox-RFID/wiki/Using-GPIO-hardware-buttons), [knobs / dials](https://github.com/MiczFlor/RPi-Jukebox-RFID/wiki/Audio-RotaryKnobVolume) and much more to control your Phoniebox via GPIO.
* [**GPIO** control](components/gpio_control/README.md) for [buttons](https://github.com/MiczFlor/RPi-Jukebox-RFID/wiki/Using-GPIO-hardware-buttons) and much more to control your Phoniebox via GPIO.
* Control via smooth [**Web App**](https://github.com/MiczFlor/RPi-Jukebox-RFID/wiki/MANUAL#webapp) running on ajax from your phone, tablet or PC. You can play, upload, move files, assign new RFID cards, control playout, settings, etc.
* Support for files with embedded chapters metadata (like m4a)
* Customizable poweroff command
Expand Down
2 changes: 1 addition & 1 deletion components/bluetooth-sink-switch/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ If no bluetooth device is connected, the output defaults back to speakers. After

### Limitations

This feature only works for the *Classic* Edition. Why? It relies on the mpd multiple output channels feature to switch between outputs. This is no available in mopidy, which is used in the Spotify Edition.
This feature only works for the *Classic* Edition. Why? It relies on the mpd multiple output channels feature to switch between outputs. This is not available in mopidy, which is used in the Spotify Edition.

## Installation

Expand Down
76 changes: 65 additions & 11 deletions components/gpio_control/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,20 +24,18 @@ Up to now the following input devices are implemented:
* **ShutdownButton**:
A specialized implementation for a shutdown button with integrated (but optional) LED support. It initializes a shutdown if the button is pressed more than `time_pressed` seconds and a (optional) LED on GPIO `led_pin` is flashing until that time is reached. For additional information, see [extended documentation below](#shutdownbutton).

* **RotaryEncoder**:
Control of a rotary encoder, for example KY040, see also in [Wiki](https://github.com/MiczFlor/RPi-Jukebox-RFID/wiki/Audio-RotaryKnobVolume).
It can be configured using `pinUp` and `PiNDown` (use GPIO numbers here), `functionCallUp`, `functionCallDown`, and `timeBase` see [extended documentation below](#rotaryencoder).

* **TwoButtonControl**:
This Device uses two Buttons and implements a third action if both buttons are pressed together. See [extended documentation below](#twobuttoncontrol).

* **RotaryEncoder**:
Control of a rotary encoder, for example KY040.
It can be configured using `Pin1` and `Pin2` (use GPIO numbers here), `functionCall1`, `functionCall2` see [extended documentation below](#rotaryencoder).

* **StatusLED**:
A LED which will light up once the Phoniebox has fully booted up and is ready to be used. For additional information, see [extended documentation below](#statusled).

Each section needs to be activated by setting `enabled: True`.

Many example files are located in `~/RPi-Jukebox-RFID/components/gpio_control/example_configs/`.

## Extended documentation

This section provides some extended documentation and guideline. Especially some exemplary configurations are introduced showing how these controls can be set up in the configuration file `~/RPi-Jukebox-RFID/settings/gpio_settings.ini`.
Expand Down Expand Up @@ -172,19 +170,75 @@ Furthermore, the following settings can be used as described for the [regular bu
A RotaryEncoder can be created using an `ini` entry like this:

```bash
[VolumeControl]
[RotaryVolumeControl]
enabled: True
Type: RotaryEncoder
Pin1: 7
Pin2: 8
timeBase: 0.02
Pin1: 22
Pin2: 23
timeBase: 0.1
functionCall1: functionCallVolU
functionCall2: functionCallVolD
```

Pin1 and FunctionCall1 correspond to rotary direction "up", while Pin2 and FunctionCall2 correspond to "down".
* **enabled**: This needs to be `True` for the rotary encoder to work.
* **Pin1**: GPIO number corresponding to rotary direction "clockwise" ('CLK')
* **Pin2**: GPIO number corresponding to rotary direction "counter clockwise" ('DT')
* **functionCall1**: function called for every rotation step corresponding to rotary direction "clockwise". See below for passed arguments. See [function documentation below](#functions).
* **functionCall2**: function called for every rotation step corresponding to rotary direction "counter clockwise". See below for passed arguments. See [function documentation below](#functions).
* **timeBase**: Factor used for calculating the rotation value base on rotation speed, defaults to `0.1`. Use `0` for deactivating rotation speed influence.
Example:
* a single rotation step leads to the value 1 passed to the function.
* steady rotation of two to or more steps, leads to the value 1 for the first call and the value 2 for all further calls.
* speeding up rotation of two to or more steps, leads to the value 1 for the first call, the value 2 for the second, the value 3 for the third and so on.
* **functionCall1Args**: Arguments for `functionCall1`, defaults to `None`. If defined takes precedence over rotation value. Arguments are ignored, if `functionCall1` does not take any.
* **functionCall2Args**: Arguments for `functionCall2`, defaults to `None`. If defined takes precedence over rotation value. Arguments are ignored, if `functionCall1` does not take any.

To also use the push button of the encoder just a button definition:
```bash
[Mute]
enabled: True
Type: Button
Pin: 27
functionCall: functionCallVol0
```

Note that the old configuration entries PinUp/PinDown and functionCallUp/functionCallDown are deprecated and might stop working in future.


```bash
[RotarySeekingControl]
enabled: True
Type: RotaryEncoder
Pin1: 22
Pin2: 23
timeBase: 0.1
functionCall1: functionCallPlayerSeekFwd
functionCall1Args: 5
functionCall2: functionCallPlayerSeekBack
functionCall2Args: 5
```

In this example, the encoder will be used to seek for- and backwards by 5 seconds on every rotation step. The rotation value will **NOT** be used in this case as the function args are defined!


#### Circuit diagram
```text
.---------------. .---------------.
| | | |
| CLK |----------------------| GPIO 22 |
| | | |
| DT |----------------------| GPIO 23 |
| | | |
| SW |----------------------| GPIO 27 |
| | | |
| + |----------------------| 3.3V |
| | | |
| GND |----------------------| GND |
| | | |
'---------------' '---------------'
KY-040 Raspberry
```

### StatusLED

A StatusLED can be created using an `ini` entry like this:
Expand Down

This file was deleted.

18 changes: 15 additions & 3 deletions components/gpio_control/example_configs/gpio_settings.ini
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,28 @@ antibouncehack: False

[VolumeControl]
enabled: False
Type: TwoButtonControl ;or RotaryEncoder
Type: TwoButtonControl
Pin1: 5
Pin2: 6
pull_up_down: pull_up
hold_time: 0.3
hold_mode: Repeat
timeBase: 0.1 ;only for RotaryEncoder
functionCall1: functionCallVolU
functionCall2: functionCallVolD
functionCallTwoButtons: functionCallVol0 ;only for TwoButtonControl
functionCallTwoButtons: functionCallVol0
;functionCall1Args: 1
;functionCall2Args: 1
;functionCallTwoButtonsArgs: x

[RotaryVolumeControl]
enabled: False
Type: RotaryEncoder
Pin1: 22
Pin2: 23
timeBase: 0.1
functionCall1: functionCallVolU
functionCall2: functionCallVolD

[PrevNextControl]
enabled: False
Type: TwoButtonControl
Expand Down Expand Up @@ -143,3 +151,7 @@ pull_up_down: pull_up
functionCall: functionCallTriggerPlayFolder
functionCallArgs: someRelativeFolderName

[StatusLED]
enabled: False
Type: StatusLED
Pin: 14

This file was deleted.

This file was deleted.

18 changes: 9 additions & 9 deletions components/gpio_control/function_calls.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@ def __init__(self):
def functionCallShutdown(self, *args):
function_call("{command} -c=shutdown".format(command=self.playout_control), shell=True)

def functionCallVolU(self, steps=None):
def functionCallVolU(self, steps=None, *args):
if steps is None:
function_call("{command} -c=volumeup".format(command=self.playout_control), shell=True)
else:
function_call("{command} -c=volumeup -v={value}".format(value=steps,
command=self.playout_control),
shell=True)

def functionCallVolD(self, steps=None):
def functionCallVolD(self, steps=None, *args):
if steps is None:
function_call("{command} -c=volumedown".format(command=self.playout_control), shell=True)
else:
Expand Down Expand Up @@ -65,22 +65,22 @@ def functionCallPlayerStop(self, *args):
function_call("{command} -c=playerstop".format(command=self.playout_control),
shell=True)

def functionCallPlayerSeekFwd(self, seconds=None):
def functionCallPlayerSeekFwd(self, seconds=None, *args):
if seconds is None:
seconds = 10
function_call("{command} -c=playerseek -v=+{value}".format(command=self.playout_control, value=seconds), shell=True)

def functionCallPlayerSeekBack(self, seconds=None):
def functionCallPlayerSeekBack(self, seconds=None, *args):
if seconds is None:
seconds = 10
function_call("{command} -c=playerseek -v=-{value}".format(command=self.playout_control, value=seconds), shell=True)

def functionCallPlayerSeekFarFwd(self, seconds=None):
def functionCallPlayerSeekFarFwd(self, seconds=None, *args):
if seconds is None:
seconds = 60
function_call("{command} -c=playerseek -v=+{value}".format(command=self.playout_control, value=seconds), shell=True)

def functionCallPlayerSeekFarBack(self, seconds=None):
def functionCallPlayerSeekFarBack(self, seconds=None, *args):
if seconds is None:
seconds = 60
function_call("{command} -c=playerseek -v=-{value}".format(command=self.playout_control, value=seconds), shell=True)
Expand All @@ -94,15 +94,15 @@ def functionCallPlayerRandomCard(self, *args):
def functionCallPlayerRandomFolder(self, *args):
function_call("{command} -c=randomfolder".format(command=self.playout_control), shell=True)

def functionCallBluetoothToggle(self, mode=None):
def functionCallBluetoothToggle(self, mode=None, *args):
if mode is None:
mode = 'toggle'
function_call("{command} -c=bluetoothtoggle -v={value}".format(command=self.playout_control, value=mode), shell=True)

def functionCallTriggerPlayCardId(self, cardid):
def functionCallTriggerPlayCardId(self, cardid, *args):
function_call("{command} --cardid={value}".format(command=self.rfid_trigger, value = cardid), shell=True)

def functionCallTriggerPlayFolder(self, folder):
def functionCallTriggerPlayFolder(self, folder, *args):
function_call("{command} --dir={value}".format(command=self.rfid_trigger, value = folder), shell=True)

def getFunctionCall(self, functionName):
Expand Down
Loading