Implemented Lighting Control
This commit is contained in:
124
app.py
124
app.py
@@ -2,19 +2,23 @@ import json
|
||||
from hashlib import scrypt
|
||||
from os import urandom
|
||||
from hmac import compare_digest
|
||||
from colorsys import rgb_to_hsv
|
||||
|
||||
from flask import Flask, render_template, request, redirect, url_for, session, abort
|
||||
from flask_pymongo import PyMongo
|
||||
from bson import ObjectId
|
||||
import bson.json_util as bson
|
||||
import requests
|
||||
|
||||
SCRYPT_PARAMS = {"n": 16384, "r": 8, "p": 1}
|
||||
HEX_CHARS = set("0123456789ABCDEF")
|
||||
|
||||
app = Flask(__name__)
|
||||
with open("./config.json", "r", encoding="utf-8") as file:
|
||||
config = json.load(file)
|
||||
app.config["MONGO_URI"] = f"mongodb://{config['db']}/akasha"
|
||||
app.config["SECRET_KEY"] = config["fsk"]
|
||||
LIGHT_URL = f"http://192.168.1.10/api/{config['light']}"
|
||||
mongo = PyMongo(
|
||||
app,
|
||||
username="index",
|
||||
@@ -45,7 +49,7 @@ def inject_data():
|
||||
@app.before_request
|
||||
def apply_checks():
|
||||
username = session.get("username")
|
||||
if request.endpoint is "static":
|
||||
if request.endpoint == "static":
|
||||
return
|
||||
ddata = db.domains.find_one_or_404({"id": request.endpoint})
|
||||
udata = db.users.find_one({"id": username}) if username else None
|
||||
@@ -98,7 +102,9 @@ def render_main():
|
||||
fpdata = db.frontpage.find_one({"id": request.endpoint})
|
||||
dsdata = db.domains.find({"cat": {"$ne": None}})
|
||||
udata = (
|
||||
db.users.find_one({"id": session["username"]}) if session["username"] else None
|
||||
db.users.find_one({"id": session["username"]})
|
||||
if session.get("username")
|
||||
else None
|
||||
)
|
||||
results = {"ade": {}, "bea": {}, "cam": {}, "des": {}}
|
||||
for ddata in dsdata:
|
||||
@@ -178,13 +184,10 @@ def database_edit(collection, oid):
|
||||
try:
|
||||
if not document:
|
||||
db[collection].delete_one({"_id": ObjectId(oid)})
|
||||
print("DELETED")
|
||||
elif oid:
|
||||
db[collection].replace_one({"_id": ObjectId(oid)}, document)
|
||||
print("REPLACED")
|
||||
else:
|
||||
db[collection].insert_one(document)
|
||||
print("INSERTED")
|
||||
except:
|
||||
abort(500)
|
||||
return redirect(url_for("database"))
|
||||
@@ -202,7 +205,6 @@ def database_edit(collection, oid):
|
||||
|
||||
@app.route("/tasks", methods=["GET", "POST"])
|
||||
def tasks():
|
||||
print(request.form, request.method)
|
||||
if request.method == "POST":
|
||||
act = request.form.get("action", "save")
|
||||
match act:
|
||||
@@ -252,3 +254,113 @@ def tasks():
|
||||
blocked_tasks=blocked_tasks,
|
||||
complete_tasks=complete_tasks,
|
||||
)
|
||||
|
||||
|
||||
@app.route("/lighting", methods=["GET", "POST"])
|
||||
def lighting():
|
||||
print(request.form, request.method)
|
||||
try:
|
||||
if request.method == "POST":
|
||||
act = request.form.get("action", "none")
|
||||
bri = request.form.get("brightness", "0")
|
||||
light = request.form.get("light", "-1")
|
||||
try:
|
||||
bri = int(bri)
|
||||
except:
|
||||
bri = -1
|
||||
try:
|
||||
light = int(light)
|
||||
except:
|
||||
light = -1
|
||||
if light < 0:
|
||||
abort(404)
|
||||
match act:
|
||||
case "toggle":
|
||||
if bri > 0:
|
||||
requests.put(
|
||||
f"{LIGHT_URL}/lights/{light}/state",
|
||||
json={"on": False},
|
||||
timeout=5,
|
||||
)
|
||||
else:
|
||||
requests.put(
|
||||
f"{LIGHT_URL}/lights/{light}/state",
|
||||
json={"on": True},
|
||||
timeout=5,
|
||||
)
|
||||
case "bright":
|
||||
if bri > 0:
|
||||
requests.put(
|
||||
f"{LIGHT_URL}/lights/{light}/state",
|
||||
json={"on": True, "bri": bri},
|
||||
timeout=5,
|
||||
)
|
||||
else:
|
||||
requests.put(
|
||||
f"{LIGHT_URL}/lights/{light}/state",
|
||||
json={"on": False},
|
||||
timeout=5,
|
||||
)
|
||||
case "ctsel":
|
||||
ct = request.form.get("ct", "366")
|
||||
try:
|
||||
ct = int(ct)
|
||||
except:
|
||||
ct = 366
|
||||
print("CT: ", ct)
|
||||
requests.put(
|
||||
f"{LIGHT_URL}/lights/{light}/state",
|
||||
json={"on": True, "ct": ct},
|
||||
timeout=5,
|
||||
)
|
||||
case "hssel":
|
||||
color = request.form.get("hs", "#FF00AA")
|
||||
if color[0] == "#":
|
||||
color = color[1:]
|
||||
color = color.upper()
|
||||
if len(color) != 6 or not all(c in HEX_CHARS for c in color):
|
||||
color = "FF00AA"
|
||||
rgb = [int(color[i : i + 2], 16) / 255 for i in range(0, 6, 2)]
|
||||
hsv = rgb_to_hsv(*rgb)
|
||||
requests.put(
|
||||
f"{LIGHT_URL}/lights/{light}/state",
|
||||
json={
|
||||
"on": True,
|
||||
"hue": int(hsv[0] * 65535),
|
||||
"sat": int(hsv[1] * 254),
|
||||
"bri": int(hsv[2] * 254),
|
||||
},
|
||||
timeout=5,
|
||||
)
|
||||
res = requests.get(LIGHT_URL, timeout=5)
|
||||
try:
|
||||
raw = res.json()
|
||||
except:
|
||||
abort(500)
|
||||
result = {
|
||||
group: {
|
||||
"name": raw["groups"][group]["name"],
|
||||
"lights": {},
|
||||
}
|
||||
for group in raw["groups"]
|
||||
}
|
||||
result[-1] = {"name": "Ungrouped", "lights": {}}
|
||||
for light in raw["lights"]:
|
||||
ldata = raw["lights"][light]
|
||||
if not ldata["state"]["on"]:
|
||||
color = "#000000"
|
||||
elif ldata["state"].get("colormode") == "hs":
|
||||
color = f"hsl({ldata['state']['hue']/65535*360} {ldata['state']['sat']*100/256} {ldata['state']['bri']*50/256})"
|
||||
else:
|
||||
color = f"hsl(35 75 {int(ldata["state"]["bri"] / 3)})"
|
||||
ldata["display"] = color
|
||||
ungrouped = True
|
||||
for group in raw["groups"]:
|
||||
if light in raw["groups"][group]["lights"]:
|
||||
result[group]["lights"][light] = ldata
|
||||
ungrouped = False
|
||||
if ungrouped:
|
||||
result[-1]["lights"][light] = ldata
|
||||
return render_template("lighting.html", ldata=result)
|
||||
except requests.exceptions.ConnectionError:
|
||||
abort(500)
|
||||
|
||||
Reference in New Issue
Block a user