domotik/myapp.py
2022-12-21 23:39:44 +01:00

119 lines
No EOL
4.4 KiB
Python

import os
import sys
import flask
import evdev
import requests
import time
import threading
import subprocess
import urllib.parse
app = flask.Flask(import_name=__name__, template_folder=".")
try:
sys.path.insert(0,'/home/pi/information')
except:
print("Unable to add 'information' folder into system path")
lock = threading.Lock()
def opener(lck):
with lck:
for _ in range(5):
requests.get("http://192.168.0.103/open")
def localtunnel_launcher(port=8000, wanted_subdomain="open-domodoor"):
result = subprocess.run(args="lt --port {} --subdomain {}".format(port,wanted_subdomain), shell=True, executable="/bin/bash")
print("Process returned:", result)
def remote_handler(lck):
n_attempts = 0
remote = None
while remote is None:
#---search for remote---
input_devices = os.listdir("/dev/input")
for device in input_devices:
try:
dev = evdev.InputDevice("/dev/input/"+device)
if "Wireless Present" in dev.name and "Keyboard" in dev.name and "usb" in dev.phys:
remote = dev
print("Remote found")
break
except:
pass
#---start retrieving events if remote detected---
if remote is not None:
try:
for event in remote.read_loop():
if event.type==evdev.ecodes.EV_KEY and event.code==evdev.ecodes.KEY_B and event.value==1:
print("Command received from remote")
opener(lck)
except:
remote = None
n_attempts += 1
print("Attempt "+str(n_attempts)+" fails in finding remote")
time.sleep(3)
#------ENDPOINTS------
@app.route(rule="/")
def index():
return flask.render_template("index.html")
@app.route(rule="/state")
def state_checker():
return "200 OK (working)\n"
@app.route(rule="/from_internet", methods=["POST"])
def receiver_from_internet():
data = flask.request.get_data(as_text=True)
data_dict = urllib.parse.parse_qs(qs=data)
print(data_dict)
if "pwd_retriever" in data_dict and data_dict["pwd_retriever"][0]=='please':
op = threading.Thread(target=opener, args=(lock,))
op.start()
return flask.render_template("success.html")
else:
return flask.render_template("fail.html")
@app.route(rule="/receiving", methods=["POST"])
def receiver():
data = flask.request.get_data(as_text=True)
data_dict = urllib.parse.parse_qs(qs=data)
for p in data_dict: data_dict[p]=data_dict[p][0]
print(data_dict)
response_events = {"events":[]}
#---action=incoming---
if data_dict["action"]=="incoming":
if "please" in data_dict["message"].lower():
op = threading.Thread(target=opener, args=(lock,))
op.start()
response_events["events"].append({"event":"log","message":"Server received "+data_dict["message_type"]+" from "+data_dict["from"]})
return flask.jsonify(response_events)
#---action=outgoing---
if data_dict["action"]=="outgoing":
response_events["events"].append({"event":"log","message":"Server received outgoing action"})
return flask.jsonify(response_events)
#---action=send_status---
if data_dict["action"]=="send_status":
response_events["events"].append({"event":"log","message":"Server received send_status action"})
return flask.jsonify(response_events)
#---action=forward_sent---
if data_dict["action"]=="forward_sent":
response_events["events"].append({"event":"log","message":"Server received forward_sent action"})
return flask.jsonify(response_events)
#---action=amqp_started---
if data_dict["action"]=="amqp_started":
response_events["events"].append({"event":"log","message":"Server received amqp_started action"})
return flask.jsonify(response_events)
#---action=device_status---
if data_dict["action"]=="device_status":
response_events["events"].append({"event":"log","message":"Server received notification of "+data_dict["status"]})
return flask.jsonify(response_events)
if __name__=="__main__":
remote_handler_thread = threading.Thread(target=remote_handler, args=(lock,))
remote_handler_thread.start()
localtunnel_thread = threading.Thread(target=localtunnel_launcher)
localtunnel_thread.start()
app.run(host="0.0.0.0", port=8000)