Czech spoken time

Hi,
because there are very limited resources specific to Czech langue and time, I wrote my own script in Python to convert time to spoken sentences in Czech. Someone could find it useful.
Runs under pyscript extension.

Sample calling from HA script:

alias: Speak time in Living
sequence:
  - service: pyscript.human_time_cz
    data:
      EntityID: media_player.speaker_in_living
      Phase: True
mode: single
icon: mdi:account-tie-voice

file “human_time_cz.py”:

# --- Converts time to Czech human time sentence with some random variants
# --- Author: Traxeronus
# --- __________________________________________________________________________________________________________________
import time, random
# Create service
@service
def human_time_cz(EntityID = "", TimeToConvert = time, Phase = True):
  # Create tuples with specific words
  HNormal = (random.choice(["půlnoc", "12"]), "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", random.choice(["poledne", "12"]), "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11")
  HAfter = (random.choice(["půlnoci", "dvanácté"]), "jedné", "druhé", "třetí", "čtvrté", "páté", "šesté", "sedmé", "osmé", "deváté", "desáté", "jedenácté", random.choice(["poledni", "dvanácté"]), "jedné", "druhé", "třetí", "čtvrté", "páté", "šesté", "sedmé", "osmé", "deváté", "desáté", "jedenácté")
  HBefore = (random.choice(["půlnocí", "dvanáctou"]), "jednou", "druhou", "třetí", "čtvrtou", "pátou", "šestou", "sedmou", "osmou", "devátou", "desátou", "jedenáctou", random.choice(["polednem", "dvanáctou"]), "jednou", "druhou", "třetí", "čtvrtou", "pátou", "šestou", "sedmou", "osmou", "devátou", "desátou", "jedenáctou")
  HTo = ("12", "jednu", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "jednu", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11")
  HHa = ("dvanácté", "jedné", "druhé", "třetí", "čtvrté", "páté", "šesté", "sedmé", "osmé", "deváté", "desáté", "jedenácté", "dvanácté", "jedné", "druhé", "třetí", "čtvrté", "páté", "šesté", "sedmé", "osmé", "deváté", "desáté", "jedenácté")
  Phases = ("v noci", "ráno", "ráno", "ráno", "ráno", "ráno", "ráno", "ráno", "ráno", "dopoledne", "dopoledne", "dopoledne", "odpoledne", "odpoledne", "odpoledne", "odpoledne", "odpoledne", "odpoledne", "odpoledne", "večer", "večer", "večer", "večer", "v noci")
  # Get current time
  THc, TM = map(int, TimeToConvert.strftime("%H %M").split())
  # Get next hour
  if THc < 23:
    THn = (THc + 1)
  else:
    THn = 0
  # Compose hour declension
  HoursNc = ""
  if (THc >= 5 and THc <= 11) or (THc >= 17 and THc <= 23):
    HoursNc = " hodin"
  elif THc == 1 or THc == 13:
    HoursNc = " hodina"
  elif (THc >= 2 and THc <= 4) or (THc >= 14 and THc <= 16):
    HoursNc = " hodiny"
  elif (THc == 0 and HNormal[0] == "12") or (THc == 12 and HNormal[12] == "12"):
    HoursNc = " hodin"
  HoursNn = ""
  if (THn >= 5 and THn <= 11) or (THn >= 17 and THn <= 23):
    HoursNn = " hodin"
  elif THn == 1 or THn == 13:
    HoursNn = " hodina"
  elif (THn >= 2 and THn <= 4) or (THn >= 14 and THn <= 16):
    HoursNn = " hodiny"
  elif (THn == 0 and HNormal[0] == "12") or (THn == 12 and HNormal[12] == "12"):
    HoursNn = " hodin"
  # Compose sentences
  if TM == 0:
    if THc == 0 and HNormal[0] == "půlnoc":
      Result = random.choice([HNormal[0], "přesně " + HNormal[0]])
    elif THc == 12 and HNormal[12] == "poledne":
      Result = random.choice([HNormal[12], "přesně " + HNormal[12]])
    else:
      Result = random.choice([HNormal[THc], "přesně " + HNormal[THc], HNormal[THc] + HoursNc, "přesně " + HNormal[THc] + HoursNc])
  elif TM == 1:
    Result = random.choice(["1 minuta po " + HAfter[THc], "minuta po " + HAfter[THc], "chvilka po " + HAfter[THc], HNormal[THc] + " pryč", HNormal[THc] + " a 1 minuta", HNormal[THc] + HoursNc + " a 1 minuta"])
  elif TM >= 2 and TM <= 4:
    Result = random.choice([str(TM) + " minuty po " + HAfter[THc], "chvilka po " + HAfter[THc], "pár minut po " + HAfter[THc], HNormal[THc] + " pryč", HNormal[THc] + HoursNc + " pryč", HNormal[THc] + " a " + str(TM) + "minuty", HNormal[THc] + HoursNc + " a " + str(TM) + "minuty"])
  elif TM >= 5 and TM <= 10:
    Result = random.choice([str(TM) + " minut po " + HAfter[THc], HNormal[THc] + " a " + str(TM) + "minut", HNormal[THc] + HoursNc + " a " + str(TM) + "minut"])
  elif TM >= 11 and TM <= 13:
    Result = random.choice(["za " + str(15 - TM) + " minuty čtvrt na " + HTo[THn], "skoro čtvrt na " + HTo[THn], "za pár minut čtvrt na " + HTo[THn], HNormal[THc] + " a " + str(TM) + "minut", HNormal[THc] + HoursNc + " a " + str(TM) + "minut"])
  elif TM == 14:
    Result = random.choice(["za minutu čtvrt na " + HTo[THn], "čtvrt na " + HTo[THn], HNormal[THc] + " a 14 minut", HNormal[THc] + HoursNc + " a 14 minut"])
  elif TM == 15:
    Result = random.choice(["čtvrt na " + HTo[THn], "přesně čtvrt na " + HTo[THn], HNormal[THc] + " a 15 minut", HNormal[THc] + HoursNc + " a 15 minut"])
  elif TM == 16:
    Result = random.choice(["čtvrt na " + HTo[THn] + " a 1 minuta", "čtvrt na " + HTo[THn] + " a minuta", "čtvrt na " + HTo[THn], "minuta po čtvrt na " + HTo[THn]])
  elif TM >= 17 and TM <= 19:
    Result = random.choice(["čtvrt na " + HTo[THn] + " a " + str(TM - 15) + " minuty", "čtvrt na " + HTo[THn] + " a pár minut", "po čtvrt na " + HTo[THn], str(TM - 15) + "minuty po čtvrt na " + HTo[THn]])
  elif TM == 20:
    Result = random.choice(["čtvrt na " + HTo[THn] + " a 5 minut", "za 10 minut půl " + HHa[THn]])
  elif TM >= 21 and TM <= 25:
    Result = random.choice(["za " + str(30 - TM) + " minut půl " + HHa[THn], "za pár minut půl " + HHa[THn], "skoro půl " + HHa[THn]])
  elif TM >= 26 and TM <= 28:
    Result = random.choice(["za " + str(30 - TM) + " minuty půl " + HHa[THn], "za pár minut půl " + HHa[THn], "skoro půl " + HHa[THn]])
  elif TM == 29:
    Result = random.choice(["za minutu půl " + HHa[THn], "skoro půl " + HHa[THn]])
  elif TM == 30:
    Result = random.choice(["půl " + HHa[THn], "za půl hodiny " + HNormal[THn], "za půl hodiny " + HNormal[THn] + HoursNn, "přesně půl " + HHa[THn]])
  elif TM == 31:
    Result = random.choice(["půl " + HHa[THn] + " a minuta", "půl " + HHa[THn] + " a 1 minuta", "půl " + HHa[THn] + " pryč", "za půl hodiny " + HNormal[THn], "za půl hodiny " + HNormal[THn] + HoursNn])
  elif TM >= 32 and TM <= 34:
    Result = random.choice(["půl " + HHa[THn] + " a " + str(TM - 30) + " minuty", "půl " + HHa[THn] + " pryč", "za půl hodiny " + HNormal[THn], "za půl hodiny " + HNormal[THn] + HoursNn])
  elif TM == 35:
    Result = random.choice(["půl " + HHa[THn] + " a 5 minut", "půl " + HHa[THn] + " pryč", "za 10 minut tři čtvrtě na " + HTo[THn]])
  elif TM >= 36 and TM <= 40:
    Result = random.choice(["za " + str(45 - TM) + " minut tři čtvrtě na " + HTo[THn], "skoro tři čtvrtě na " + HTo[THn]])
  elif TM >= 41 and TM <= 43:
    Result = random.choice(["za " + str(45 - TM) + " minuty tři čtvrtě na " + HTo[THn], "skoro tři čtvrtě na " + HTo[THn]])
  elif TM == 44:
    Result = random.choice(["za minutu tři čtvrtě na " + HTo[THn], "za jednu minutu tři čtvrtě na " + HTo[THn], "skoro tři čtvrtě na " + HTo[THn]])
  elif TM == 45:
    Result = random.choice(["tři čtvrtě na " + HTo[THn], "za 15 minut " + HNormal[THn], "za 15 minut " + HNormal[THn] + HoursNn, "přesně tři čtvrtě na " + HTo[THn]])
  elif TM == 46:
    Result = random.choice(["tři čtvrtě na " + HTo[THn] + " a minuta", "tři čtvrtě na " + HTo[THn] + " a 1 minuta", "tři čtvrtě na " + HTo[THn] + " pryč"])
  elif TM >= 47 and TM <= 49:
    Result = random.choice(["tři čtvrtě na " + HTo[THn] + " a " + str(TM - 45) + " minuty", "tři čtvrtě na " + HTo[THn] + " a pár minut", "tři čtvrtě na " + HTo[THn] + " pryč"])
  elif TM == 50:
    Result = random.choice(["tři čtvrtě na " + HTo[THn] + " a 5 minut", "za 10 minut " + HNormal[THn], "za 10 minut " + HNormal[THn] + HoursNn])
  elif TM >= 51 and TM <= 55:
    Result = random.choice(["za " + str(60 - TM) + " minut " + HNormal[THn], "za " + str(60 - TM) + " minut " + HNormal[THn] + HoursNn, "za pár minut " + HNormal[THn], "za pár minut " + HNormal[THn] + HoursNn])
  elif TM >= 56 and TM <= 58:
    Result = random.choice([str(60 - TM) + " minuty před " + HBefore[THn], "za pár minut " + HNormal[THn], "za pár minut " + HNormal[THn] + HoursNn, "za " + str(60 - TM) + " minuty " + HNormal[THn], "za " + str(60 - TM) + " minuty " + HNormal[THn] + HoursNn])
  elif TM == 59:
    Result = random.choice(["za minutu " + HNormal[THn], "za minutu " + HNormal[THn] + HoursNn, "za jednu minutu " + HNormal[THn], "za jednu minutu " + HNormal[THn] + HoursNn, "minuta před " + HBefore[THn]])
  # Filter out Phase if "půlnoc" or "poledne"
  if "půlnoc" in Result or "poledn" in Result: Phase = False
  # Add other data and return the result
  if Phase: Result = Result + " " + Phases[THc]
  tts.cloud_say(entity_id = EntityID, message = Result)

5 Likes

Thanks it works perfectly. I had a bit of a problem with the script on how to use it, but finally it worked.