SpeechRecognizerPy/state_machine.py

95 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Модуль машины состояний (конечный автомат)
import speaker # Для разговоров
import datetime # Для времени
from pyowm import OWM # использование OpenWeatherMap для получения данных о погоде (pip install pyowm)
machine = None # Конечный автомат
current_state = None # Текущее состояние
weather_api_key = None # Ключ для OpenWeatherMap
def init(assistant_name):
"""Инициализирует конечный автомат"""
global machine
global current_state
global weather_api_key
with open("weatherApiKey.txt", "r") as key:
weather_api_key = key.read()
current_state = "Начало"
machine = {
"Начало":{
assistant_name.lower(): switchToListen
},
"Слушаю задание":{
"время": switchToTime,
"погода": switchToWeather
}
}
def work():
"""Обрабатывает конечный автомат"""
global machine
global current_state
speaker.speak(f"Доброго времени суток! Ассистент начинает работу")
while(True):
word = input().lower() # Пока считаем с клавиатуры предложение
# Если ассистент знает такое слово для перехода
if (word in machine[current_state].keys()):
# Выполняем действия и переход в новое состояние
current_state = machine[current_state][word]()
else:
# иначе переспросим
speaker.speak("Я не понял, пожалуйста повторите")
print("Сейчас автомат в: " + current_state)
# Переход на "Слушаю задание"
def switchToListen():
speaker.speak("Слушаю")
return "Слушаю задание"
# Переход на "Говорю время" и возвращаюсь в "Начало"
def switchToTime():
now = datetime.datetime.now()
speaker.speak(f"Сейчас {now.hour} часов, {now.minute} минут")
return "Начало"
# Переход на "Вопрос локации погоды"
def switchToWeather():
global weather_api_key
speaker.speak("Дома?")
word = input().lower() # Пока считаем с клавиатуры предложение
if (word == "да"):
location = "Home"
else:
speaker.speak("Назовите локацию")
location = input().lower() # Пока считаем с клавиатуры предложение
try:
open_weather_map = OWM(weather_api_key)
# запрос данных о текущем состоянии погоды
weather_manager = open_weather_map.weather_manager()
observation = weather_manager.weather_at_place(location)
weather = observation.weather
except:
speaker.speak("Извините. Ошибка запроса к серверу погоды")
traceback.print_exc() # Вывод трейсбека для отладки
return "Начало"
# разбивание данных на части для удобства работы с ними
status = weather.detailed_status
temperature = weather.temperature('celsius')["temp"]
wind_speed = weather.wind()["speed"]
pressure = int(weather.pressure["press"] / 1.333) # переведено из гПА в мм рт.ст.
speaker.speak(f"Сейчас на улице {temperature} градусов, скорость ветра {wind_speed} метров в секунду, давление {pressure} миллиметров ртутного столба")
return "Начало"