diff --git a/.asoundrc b/.asoundrc new file mode 100644 index 0000000..702367d --- /dev/null +++ b/.asoundrc @@ -0,0 +1,21 @@ +pcm.!default { + type asym + playback.pcm { + type plug + slave.pcm "output" + } + capture.pcm { + type plug + slave.pcm "input" + } +} + +pcm.output { + type hw + card 1 +} + +ctl.!default { + type hw + card 1 +} diff --git a/beep.wav b/beep.wav new file mode 100644 index 0000000..d1b259e Binary files /dev/null and b/beep.wav differ diff --git a/kukuc-clock.py b/kukuc-clock.py new file mode 100644 index 0000000..b72d292 --- /dev/null +++ b/kukuc-clock.py @@ -0,0 +1,69 @@ +import RPi.GPIO as GPIO +import time +from datetime import datetime +import subprocess +import sys +from slovak_datetime_formatter import get_datetime_as_slovak_sentence + +BUTTON_TIMEOUT = 30 # pressing and holding the button longer then e.g. 2 seconds terminates playing +PIN = 17 # listen to changes on this GPIO +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.call(["aplay", "beep.wav"]) + +def generate_presny_cas(): + text = get_datetime_as_slovak_sentence(datetime.now()) + print(f"Generating presny_cas.wav for '{text}'") + subprocess.call( + [ + "curl", "--silent", "--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() + +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: + print("Cought exception...") + sys.exit() +finally: + GPIO.cleanup() diff --git a/kukuc-clock.service b/kukuc-clock.service new file mode 100644 index 0000000..960f340 --- /dev/null +++ b/kukuc-clock.service @@ -0,0 +1,15 @@ +[Unit] +Description=kukuc-clock +After=sound.target + +[Service] +Type=simple +User=pi +Group=pi +WorkingDirectory=/home/pi/kukuc-clock +ExecStart=/usr/bin/python3 -u /home/pi/kukuc-clock/kukuc-clock.py +Restart=always +RestartSec=3 + +[Install] +WantedBy=multi-user.target diff --git a/presny_cas.wav b/presny_cas.wav new file mode 100644 index 0000000..1b87f41 Binary files /dev/null and b/presny_cas.wav differ diff --git a/slovak_datetime_formatter.py b/slovak_datetime_formatter.py new file mode 100644 index 0000000..94508e5 --- /dev/null +++ b/slovak_datetime_formatter.py @@ -0,0 +1,177 @@ +from datetime import datetime + +hodiny_slovnik = { + 0: "dvanásť", + 1: "jedna", + 2: "dve", + 3: "tri", + 4: "štyri", + 5: "päť", + 6: "šesť", + 7: "sedem", + 8: "osem", + 9: "deväť", + 10: "desať", + 11: "jedenásť", + 12: "dvanásť", + 13: "jedna", + 14: "dve", + 15: "tri", + 16: "štyri", + 17: "päť", + 18: "šesť", + 19: "sedem", + 20: "osem", + 21: "deväť", + 22: "desať", + 23: "jedenásť", + 24: "dvanásť", +} + +minuty_slovnik = { + 0: "nula", + 1: "jedna", + 2: "dve", + 3: "tri", + 4: "štyri", + 5: "päť", + 6: "šesť", + 7: "sedem", + 8: "osem", + 9: "deväť", + 10: "desať", + 11: "jedenásť", + 12: "dvanásť", + 13: "trinásť", + 14: "štrnásť", + 15: "pätnásť", + 16: "šestnásť", + 17: "sedemnásť", + 18: "osemnásť", + 19: "devätnásť", + 20: "dvadsať", + 21: "dvadsať jedna", + 22: "dvadsať dve", + 23: "dvadsať tri", + 24: "dvadsať štyri", + 25: "dvadsať päť", + 26: "dvadsať šesť", + 27: "dvadsať sedem", + 28: "dvadsať osem", + 29: "dvadsať deväť", + 30: "tridsať", + 31: "tridsať jedna", + 32: "tridsať dve", + 33: "tridsať tri", + 34: "tridsať štyri", + 35: "tridsať päť", + 36: "tridsať šesť", + 37: "tridsať sedem", + 38: "tridsať osem", + 39: "tridsať deväť", + 40: "štyridsať", + 41: "štyridsať jedna", + 42: "štyridsať dve", + 43: "štyridsať tri", + 44: "štyridsať štyri", + 45: "štyridsať päť", + 46: "štyridsať šesť", + 47: "štyridsať sedem", + 48: "štyridsať osem", + 49: "štyridsať deväť", + 50: "päťdesiat", + 51: "päťdesiat jedna", + 52: "päťdesiat dve", + 53: "päťdesiat tri", + 54: "päťdesiat štyri", + 55: "päťdesiat päť", + 56: "päťdesiat šesť", + 57: "päťdesiat sedem", + 58: "päťdesiat osem", + 59: "päťdesiat deväť", +} + +dni_slovnik = { + 0: "pondelok", + 1: "utorok", + 2: "streda", + 3: "štvrtok", + 4: "piatok", + 5: "sobota", + 6: "nedeľa", +} + +mesiace_slovnik = { + 1: "januára", + 2: "februára", + 3: "marca", + 4: "apríla", + 5: "mája", + 6: "júna", + 7: "júla", + 8: "augusta", + 9: "septembra", + 10: "októbra", + 11: "novembra", + 12: "decembra", +} + +cisla = { + 1: "prvého", + 2: "druhého", + 3: "tretieho", + 4: "štvrtého", + 5: "piateho", + 6: "šiesteho", + 7: "siedmeho", + 8: "ôsmeho", + 9: "deviateho", + 10: "desiateho", + 11: "jedenásteho", + 12: "dvanásteho", + 13: "trinásteho", + 14: "štrnásteho", + 15: "pätnásteho", + 16: "šestnásteho", + 17: "sedemnásteho", + 18: "osemnásteho", + 19: "devätnásteho", + 20: "dvadsiateho", + 21: "dvadsiateho prvého", + 22: "dvadsiateho druhého", + 23: "dvadsiateho tretieho", + 24: "dvadsiateho štvrtého", + 25: "dvadsiateho piateho", + 26: "dvadsiateho šiesteho", + 27: "dvadsiateho siedmeho", + 28: "dvadsiateho ôsmeho", + 29: "dvadsiateho deviateho", + 30: "tridsiateho", + 31: "tridsiateho prvého", +} + +def format_hodiny(hodina): + if hodina == 'jedna': + return 'hodina' + elif hodina.endswith('dve') or hodina.endswith('tri') or hodina.endswith('štyri'): + return 'hodiny' + else: + return 'hodín' + +def format_minuty(minuta): + if minuta == 'jedna': + return 'minúta' + elif minuta == 'dve' or minuta == 'tri' or minuta == 'štyri': + return 'minúty' + else: + return 'minút' + +# Zobrazenie času a dátumu +def get_datetime_as_slovak_sentence(cas): + hodiny = hodiny_slovnik[cas.hour % 12] + minuty = minuty_slovnik[cas.minute] + + return f"Je {hodiny} {format_hodiny(hodiny)} a {minuty} {format_minuty(minuty)}, {dni_slovnik[cas.weekday()]}, {cisla[cas.day]} {mesiace_slovnik[cas.month]}" + +if __name__ == "__main__": + print(get_datetime_as_slovak_sentence(datetime.now()))