Files
kukuc-clock/kukuc-clock.py
2023-12-12 19:52:52 +01:00

105 lines
2.5 KiB
Python

import signal
import sys
import time
from datetime import datetime
import subprocess
from slovak_datetime_formatter import get_datetime_as_slovak_sentence
if len(sys.argv) > 1 and sys.argv[1] == "test":
import dummygpio as GPIO
else:
import RPi.GPIO as GPIO
BUTTON_TIMEOUT = (
30 # button release timeout terminates playing
)
PIN = 27 # listen to changes on this GPIO pin
GPIO.setmode(GPIO.BCM) # use BCM pin layout
GPIO.setwarnings(False)
def setup_pin():
GPIO.setup(PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
def terminate_playing(proc):
print("Terminating playing...")
proc.terminate()
proc.wait(timeout=5)
print("Terminated")
def play_presny_cas():
print("Playing presny_cas.wav")
proc = subprocess.Popen(["aplay", "presny_cas.wav"])
wait_for_button_release_or_timeout(PIN, BUTTON_TIMEOUT)
print("GPIO went HIGH - terminating playing")
terminate_playing(proc)
def play_beep():
print("Playing beep.wav")
subprocess.run(["aplay", "beep.wav"], check=True)
def get_credentials():
with open("credentials.txt") as f:
cred_line = f.readline().strip()
username, password = cred_line.split(":")
return username, password
def generate_presny_cas():
text = get_datetime_as_slovak_sentence(datetime.now())
print(f"Generating presny_cas.wav for '{text}' using a remote API call")
username, password = get_credentials()
subprocess.call(
[
"curl", "--silent", "-u", f"{username}:{password}",
"--get",
"--data-urlencode", f"text={text}",
"https://tts.virtonline.eu/api/tts",
"--output", "presny_cas.wav",
]
)
print("Generated presny_cas.wav")
def wait_for_button_release_or_timeout(pin, timeout):
timeout_start = time.time()
while time.time() < timeout_start + timeout:
if GPIO.input(pin) == GPIO.HIGH:
break
time.sleep(0.05)
def handle_pin(pin):
print(f"GPIO {pin} LOW - event triggered")
generate_presny_cas()
play_presny_cas()
def signal_handler(sig, frame):
print("Interrupt received, cleaning up!")
GPIO.cleanup()
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
try:
setup_pin()
play_beep()
play_beep()
GPIO.add_event_detect(PIN, GPIO.FALLING, callback=handle_pin, bouncetime=1000)
print(f"Waiting for the GPIO {PIN} to go LOW...")
while True:
time.sleep(0.01)
except Exception as e:
print("Caught exception: ", e)
sys.exit()
finally:
GPIO.cleanup()