2024-10-04 16:35:45 +01:00

101 рядки
3.1 KiB
Python

import os
import RPi.GPIO as GPIO
import time
from lib.mqtt import create_client, control_player, create_config, check_current_status, check_current_disc, update_disc
from lib.home_assistant import load_disc, pause_media, play_media_again, set_shuffle, next_track
from dotenv import load_dotenv
load_dotenv()
use_mqtt = os.environ["use_mqtt"].lower() == "true"
if use_mqtt:
client = create_client()
create_config(client)
# Debug: Print environment variable
print(f"Using MQTT: {use_mqtt}")
# GPIO button pin setup
BUTTON_PINS = [17, 18, 27, 22]
GPIO.setmode(GPIO.BCM) # Use BCM numbering
# Set up each button pin as input with internal pull-up resistors
for pin in BUTTON_PINS:
GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# Button Handlers
def handle_button_1():
if use_mqtt:
if check_current_status(client) == "PLAY":
print("Pausing playback via MQTT.")
control_player(client, "PAUSE")
else:
print("Playing media via MQTT.")
control_player(client, "PLAY")
else:
print("Pausing/Playing via Home Assistant.")
if check_current_status(client) == "PLAY":
pause_media()
else:
play_media_again()
def handle_button_2():
print("Skipping to the next track.")
if use_mqtt:
control_player(client, "SKIP")
control_player(client, "PLAY")
else:
next_track()
def handle_button_3():
start_time = time.time()
if use_mqtt:
disc_data = check_current_disc(client)
# Wait until the button is released or held for more than 3 seconds
while GPIO.input(BUTTON_PINS[2]) == GPIO.LOW:
if time.time() - start_time >= 3:
print("Button 3 held for 3 seconds! Resetting to RADIO2 via MQTT.")
update_disc(client, ["ytmusic", disc_data['name'], disc_data['type'], "RESET"])
control_player(client, "PLAY")
update_disc(client, ["ytmusic", disc_data['name'], disc_data['type'], disc_data['id']])
return # Exit after sending RADIO2
print("Button 3 pressed briefly! Sending RADIO via MQTT.")
control_player(client, "RADIO")
else:
print("Button 3 functionality not implemented for Home Assistant.")
def handle_button_4():
print("Toggling shuffle mode.")
if use_mqtt:
control_player(client, "SHUFFLE")
control_player(client, "PLAY")
else:
set_shuffle()
# GPIO Callback Handlers
def button_callback(channel):
if channel == BUTTON_PINS[0]:
handle_button_1()
elif channel == BUTTON_PINS[1]:
handle_button_2()
elif channel == BUTTON_PINS[2]:
handle_button_3()
elif channel == BUTTON_PINS[3]:
handle_button_4()
# Add event detection for each button press
for pin in BUTTON_PINS:
GPIO.add_event_detect(pin, GPIO.FALLING, callback=button_callback, bouncetime=200)
try:
# Keep the script running to detect button presses
while True:
time.sleep(1) # Sleep to reduce CPU usage
except KeyboardInterrupt:
pass
finally:
GPIO.cleanup() # Clean up GPIO on exit