#!/usr/bin/python3 from flask import Flask, abort, jsonify, make_response, request from colorsys import hsv_to_rgb import board import neopixel import signal import sys class Led: __IFACE_PIN = board.D18 __PIXEL_COUNT = 127 def __init__(self, power, brightness, color_angle): self.power = power self.brightness = brightness self.color_angle = color_angle self.iface_pin = self.__IFACE_PIN self.strip = neopixel.NeoPixel(self.iface_pin, self.__PIXEL_COUNT) self.strip[0] = (255, 0, 0) def update(self, off=False): rgb = self.angle_2_rgb() r, g, b = rgb print(f"Setting LED strip to RGB: {r}, {g}, {b}") self.strip.fill((r, g, b)) if not self.power: print("Turning off strip") self.strip.fill((0, 0, 0)) def angle_2_rgb(self): r, g, b = hsv_to_rgb((self.color_angle)/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 def power_down(self): print("Shutting down LEDs") self.strip.fill((0, 0, 0)) self.strip.fill((0, 0, 0)) 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 = 360 - 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, host="0.0.0.0") def exit_handler(*_): print("Exiting gracefully") led.power_down() sys.exit(0) signal.signal(signal.SIGINT, exit_handler) init_server() start_server()