Будущее всё ближе. Лет 10 назад я и не мог подумать, что буду заводить машину с помощью голосовой команды!
Последние годы я с интересом наблюдал за бурным развитием голосовых ассистентов. После выхода Google Home Mini, решил что и мне уже пора попробовать, так как цена стала более-менее адекватной для «игрушки». Первый проект — интеграция голосового помощника с GSM модулем StarLine для автозапуска, контроля координат, напряжения аккумулятора и других параметров, отдаваемых сигнализацией автомобиля. Итак, поехали?
Наличие Google Home не обязательно, всё описанное далее будет работать и с приложением Google Assistant на телефоне. У меня установлен GSM/GPS модуль StarLine M31, но должно работать со всеми GSM сигнализациями от StarLine.
gunicorn -b :3333 flask.starline:app
from flask import Flask, request
from flask_restful import reqparse, Resource, Api, abort
import requests
import logging
DEVICE_ID = 1234567 # Use HTTPS sniffer to find your DEVICE_ID in https://starline-online.ru/ traffic
LOGIN = 'YOUR_STARLINE_EMAIL'
PASS = 'YOUR_STARLINE_PASSWORD'
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest'}
def start_engine():
with requests.Session() as session:
t = session.get('https://starline-online.ru/', headers=header)
login = session.post('https://starline-online.ru/user/login', {
'LoginForm[login]': LOGIN,
'LoginForm[pass]': PASS,
'LoginForm[rememberMe]': 'off'}, headers=header)
logging.debug(login.content)
r0 = session.get('https://starline-online.ru/device', headers=header)
logging.debug(r0.content)
r = session.post('https://starline-online.ru/device/{0}/executeCommand'.format(DEVICE_ID), {
'value': '1',
'action': 'ign',
'password': ''}, headers=header, timeout=1)
logging.debug(r.status_code)
logging.debug(r.content)
logout = session.post('https://starline-online.ru/user/logout', {
'': ''}, )
return ('Engine started!')
def stop_engine():
with requests.Session() as session:
t = session.get('https://starline-online.ru/', headers=header)
login = session.post('https://starline-online.ru/user/login', {
'LoginForm[login]': LOGIN,
'LoginForm[pass]': PASS,
'LoginForm[rememberMe]': 'off'}, headers=header)
logging.debug(login.content)
r0 = session.get('https://starline-online.ru/device', headers=header)
logging.debug(r0.content)
r = session.post('https://starline-online.ru/device/{0}/executeCommand'.format(DEVICE_ID), {
'value': '0',
'action': 'ign',
'password': ''}, headers=header)
logging.debug(r.status_code)
logging.debug(r.content)
logout = session.post('https://starline-online.ru/user/logout', {
'': ''}, )
return ('Engine stopped!')
def get_params():
with requests.Session() as session:
t = session.get('https://starline-online.ru/', headers=header)
login = session.post('https://starline-online.ru/user/login', {
'LoginForm[login]': LOGIN,
'LoginForm[pass]': PASS,
'LoginForm[rememberMe]': 'off'}, headers=header)
logging.debug(login.content)
r0 = session.get('https://starline-online.ru/device', headers=header)
logging.debug(r0.content)
res_dict = r0.json()['answer']['devices'][0]
logout = session.post('https://starline-online.ru/user/logout', {
'': ''}, )
return {'battery': res_dict['battery'], 'temperature': res_dict['ctemp']}
def get_battery_text():
return ("Battery voltage {0} volts.".format(get_params()['battery']))
def get_temperature_text():
return ("Temperature: {0} degrees.".format(get_params()['temperature']))
app = Flask(__name__)
app.config['BUNDLE_ERRORS'] = True
api = Api(app)
class ProccessGoogleRequest(Resource):
def get(self):
return {"status": "OK"}
def post(self):
req = request.get_json()
logging.debug(request.get_json())
response = ''
if req['result']['metadata']['intentName'] == 'GetBattery':
response = get_battery_text()
if req['result']['metadata']['intentName'] == 'GetTemperature':
response = get_temperature_text()
if req['result']['metadata']['intentName'] == 'StartEngine':
response = start_engine()
if req['result']['metadata']['intentName'] == 'StopEngine':
response = stop_engine()
if response == '':
abort(400, message='Intent not detected')
return {"speech": response, "displayText": response}
api.add_resource(ProccessGoogleRequest, '/starline/')
if __name__ == '__main__':
app.run(debug=False)
К сожалению, не доступен сервер mySQL