iot-v2-rn/light_node/event_loop.py

77 lines
2.0 KiB
Python

from flask import Flask, abort, jsonify, make_response, request
from colorsys import hsv_to_rgb
class Led:
__IFACE_PIN = 18
__COLOR_OFFSET = 0
def __init__(self, power, brightness, color_angle):
self.power = power
self.brightness = brightness
self.color_angle = color_angle
self.iface_pin = self.__IFACE_PIN
def update(self):
rgb = self.angle_2_rgb()
r, g, b = rgb
print(f"Setting LED strip to RGB: {r}, {g}, {b}")
def angle_2_rgb(self):
r, g, b = hsv_to_rgb((self.color_angle+self.__COLOR_OFFSET)/360, 1, self.brightness/255)
r *= 255
g *= 255
b *= 255
return (r, g, b)
def json_state(self):
state = {'power': self.power,
'brightness': self.brightness,
'color': self.color_angle}
return state
led = Led(False, 0, 0)
server = Flask('Light_Node')
def init_server():
@server.errorhandler(404)
def not_found(error):
return make_response(jsonify({'error': 'Not found'}), 404)
@server.errorhandler(400)
def bad_request(error='other'):
return make_response(jsonify({'error': 'Bad request'}), 400)
@server.errorhandler(501)
def server_crash(error):
return make_response(jsonify({'error': 'Server crashed, check logs'}), 501)
@server.route('/setState', methods=['POST', 'GET'])
def change_led_state():
try:
print(request)
new_state = request.json
print(f"New state: {new_state}")
led.power = bool(new_state['power'])
led.brightness = int(new_state['brightness'])
led.color_angle = int(new_state['color'])
led.update()
return jsonify({"success": True})
except:
return bad_request()
pass
@server.route('/', methods=['GET'])
def main_tab():
return jsonify(led.json_state())
def start_server():
server.run(debug=True)
init_server()
start_server()