Initial version

This commit is contained in:
cpu
2023-12-06 03:04:00 +01:00
parent b29616d7b9
commit fe274974c4
6 changed files with 282 additions and 0 deletions

21
.asoundrc Normal file
View File

@@ -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
}

BIN
beep.wav Normal file

Binary file not shown.

69
kukuc-clock.py Normal file
View File

@@ -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()

15
kukuc-clock.service Normal file
View File

@@ -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

BIN
presny_cas.wav Normal file

Binary file not shown.

View File

@@ -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()))