-
Notifications
You must be signed in to change notification settings - Fork 0
/
plugin_weather_wttr.py
141 lines (105 loc) · 5.73 KB
/
plugin_weather_wttr.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# Погода через wttr.in
# author: Oleg Bakharev
# TODO: (все настраивается тут, потом переделать)
from datetime import datetime
import requests
from vacore import VACore
# местоположение
location = 'Yaroslavl'
# информация о плагине и начальные настройки
def start(core: VACore):
manifest = {
'name': 'Погода (wttr.in)',
'version': '1.0',
'require_online': True,
'commands': {
'погода|погода за окном|погода сейчас': get_weather,
'прогноз погоды': get_weather_forecast,
}
}
return manifest
# вычисляет вариант текста для конкретного числительного из набора вариантов
def compute_suffix(value: str, variants: list):
n = int(value.strip()[-1])
if (n == 0) or (n >= 5):
suffix = variants[0]
elif (n == 1):
suffix = variants[1]
if len(value) >= 2:
if value.strip()[-2] == '1':
suffix = variants[2]
else:
suffix = variants[2]
return suffix
# текст прогноза погоды на основании переданных данныхъ о температуре, влажности, давлении и скорости ветра
def forecast_text(temp: str, humidity: str, pressure: str, wind_speed: str):
text = 'Температура {0} {1}, Влажность {2} {3}, Давление - {4} {5} ртутного столба, Ветер {6} {7} в час.'.format(
temp, compute_suffix(temp, ['градусов', 'градус', 'градуса']),
humidity, compute_suffix(humidity, ['процентов', 'процент', 'процента']),
pressure, compute_suffix(pressure, ['миллиметров', 'миллиметр', 'миллиметра']),
wind_speed, compute_suffix(wind_speed, ['километров', 'километр', 'километра'])
)
return text
# запросить погоду для данного местоположения
def request_weather(location: str):
url = 'https://wttr.in/{0}?Q?m&format=j1&lang=ru'.format(location)
req = requests.get(url)
return req.json()
# сформировать описание погоды, на основании словаря JSON
def get_weather_text(data: dict):
descr = data['lang_ru'][0]['value']
humidity = data['humidity']
pressure = round(int(data['pressure']) / 1.333)
if 'temp_C' in data:
temp = data['temp_C']
else:
temp = data['tempC']
wind_speed = data['windspeedKmph']
return descr + '. ' + forecast_text(temp, humidity, str(pressure), wind_speed)
# получить текст для описания даты прогноза
def get_date(data: str):
day_list = ('первое', 'второе', 'третье', 'четвёртое','пятое', 'шестое', 'седьмое', 'восьмое','девятое', 'десятое', 'одиннадцатое', 'двенадцатое','тринадцатое', 'четырнадцатое', 'пятнадцатое', 'шестнадцатое','семнадцатое', 'восемнадцатое', 'девятнадцатое', 'двадцатое','двадцать первое', 'двадцать второе', 'двадцать третье','двадцать четвёртое', 'двадцать пятое', 'двадцать шестое','двадцать седьмое', 'двадцать восьмое', 'двадцать девятое','тридцатое', 'тридцать первое')
weekday_list = ('понедельник','вторник','среду','четверг','пятницу','субботу','воскресенье')
month_list = ('января', 'февраля', 'марта', 'апреля', 'мая', 'июня','июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря')
d = datetime.strptime(data, '%Y-%m-%d')
day = day_list[d.day - 1]
weekday = weekday_list[d.weekday()]
month = month_list[d.month - 1]
#year = d.year
#text = 'Прогноз на ' + weekday + ' с датой' + day + ' ' + month + ' ' + str(year) + ' года.'
text = 'Прогноз на ' + weekday + ' с датой' + day + ' ' + month + ' '
return text
# текущая погода
def get_weather(core: VACore, phrase: str):
try:
core.play_voice_assistant_speech('Текущая погодная сводка')
weathers = request_weather(location)
text = get_weather_text(weathers['current_condition'][0])
core.play_voice_assistant_speech(text)
return
except Exception as e:
pass
# прогноз погоды на три дня
def get_weather_forecast(core: VACore, phrase: str):
# произнести прогноз на определенное время суток
def say_hourly_weather(daytime: str, hourly: dict):
core.play_voice_assistant_speech(daytime);
text = get_weather_text(hourly)
core.play_voice_assistant_speech(text)
try:
core.play_voice_assistant_speech('Прогноз погоды на три дня')
weathers = request_weather(location)['weather'] # город или координаты
for weather in weathers:
# дата на которую прогноз
d = weather['date']
# произнести дату
core.play_voice_assistant_speech(get_date(d))
# произнести утренний прогноз
say_hourly_weather("Утро", weather['hourly'][2])
# произнести дневной прогноз
say_hourly_weather("День", weather['hourly'][4])
# произнести вечернний прогноз
say_hourly_weather("Вечер", weather['hourly'][6])
return
except Exception as e:
pass