From 1fd23c03925ee6c85d821029f64ee6118dc43c74 Mon Sep 17 00:00:00 2001 From: janis Date: Wed, 25 Nov 2020 20:12:09 +0200 Subject: [PATCH 01/36] wip --- interface/src/project/DemoProject.tsx | 5 +- .../project/RgbStateWebSocketController.tsx | 61 +++++++++++++++++++ interface/src/project/types.ts | 4 ++ src/main.cpp | 7 ++- 4 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 interface/src/project/RgbStateWebSocketController.tsx diff --git a/interface/src/project/DemoProject.tsx b/interface/src/project/DemoProject.tsx index 74f25e5..1304281 100644 --- a/interface/src/project/DemoProject.tsx +++ b/interface/src/project/DemoProject.tsx @@ -10,6 +10,7 @@ import { AuthenticatedRoute } from '../authentication'; import DemoInformation from './DemoInformation'; import LightStateRestController from './LightStateRestController'; import LightStateWebSocketController from './LightStateWebSocketController'; +import RgbStateWebSocketController from './RgbStateWebSocketController'; import LightMqttSettingsController from './LightMqttSettingsController'; class DemoProject extends Component { @@ -25,12 +26,14 @@ class DemoProject extends Component { + + @@ -40,4 +43,4 @@ class DemoProject extends Component { } -export default DemoProject; +export default DemoProject; \ No newline at end of file diff --git a/interface/src/project/RgbStateWebSocketController.tsx b/interface/src/project/RgbStateWebSocketController.tsx new file mode 100644 index 0000000..6b5bb1d --- /dev/null +++ b/interface/src/project/RgbStateWebSocketController.tsx @@ -0,0 +1,61 @@ +import React, { Component } from 'react'; +import { ValidatorForm } from 'react-material-ui-form-validator'; + +import { Typography, Box, Switch } from '@material-ui/core'; +import { WEB_SOCKET_ROOT } from '../api'; +import { WebSocketControllerProps, WebSocketFormLoader, WebSocketFormProps, webSocketController } from '../components'; +import { SectionContent, BlockFormControlLabel } from '../components'; + +import { RgbState } from './types'; + +export const RGB_SETTINGS_WEBSOCKET_URL = WEB_SOCKET_ROOT + "rgbState"; + +type RgbStateWebSocketControllerProps = WebSocketControllerProps; + +class RgbStateWebSocketController extends Component { + + render() { + return ( + + ( + + )} + /> + + ) + } +} + +export default webSocketController(RGB_SETTINGS_WEBSOCKET_URL, 100, RgbStateWebSocketController); + +type RgbStateWebSocketControllerFormProps = WebSocketFormProps; + +function RgbStateWebSocketControllerForm(props: RgbStateWebSocketControllerFormProps) { + const { data, saveData, setData } = props; + + const changeLedOn = (event: React.ChangeEvent) => { + setData({ led_on: event.target.checked }, saveData); + } + + return ( + + + + The switch below controls the LED via the WebSocket. It will automatically update whenever the LED state changes. + + + + } + label="LED State?" + /> + + ); +} \ No newline at end of file diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts index 3221255..ba6cf24 100644 --- a/interface/src/project/types.ts +++ b/interface/src/project/types.ts @@ -7,3 +7,7 @@ export interface LightMqttSettings { name: string; mqtt_path : string; } + +export interface RgbState { + led_on : boolean; +} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 6c72025..dfe95fc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -15,7 +15,12 @@ ESP8266React esp8266React(&server); // &lightMqttSettingsService); RgbStateService rgbStateService = RgbStateService(&server, esp8266React.getSecurityManager()); - +update_handler_id_t updateHandler = rgbStateService.addUpdateHandler( + [&](const String& originId) { + Serial.print("The light's state has been updated by: "); + Serial.println(originId); + } +); void setup() { // start serial and filesystem From 2ef80744ef78f2de0b10296adb8c31935ad877df Mon Sep 17 00:00:00 2001 From: janis Date: Wed, 25 Nov 2020 21:57:14 +0200 Subject: [PATCH 02/36] wip --- .../project/RgbStateWebSocketController.tsx | 29 +++++++++-- interface/src/project/components/RgbSlider.js | 50 +++++++++++++++++++ interface/src/project/types.ts | 3 ++ 3 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 interface/src/project/components/RgbSlider.js diff --git a/interface/src/project/RgbStateWebSocketController.tsx b/interface/src/project/RgbStateWebSocketController.tsx index 6b5bb1d..9387e02 100644 --- a/interface/src/project/RgbStateWebSocketController.tsx +++ b/interface/src/project/RgbStateWebSocketController.tsx @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import React, { Component, useState } from 'react'; import { ValidatorForm } from 'react-material-ui-form-validator'; import { Typography, Box, Switch } from '@material-ui/core'; @@ -33,17 +33,39 @@ export default webSocketController(RGB_SETTINGS_WEBSOCKET_URL, 100, RgbStateWebS type RgbStateWebSocketControllerFormProps = WebSocketFormProps; function RgbStateWebSocketControllerForm(props: RgbStateWebSocketControllerFormProps) { + const { data, saveData, setData } = props; + const classes = useStyles(); + const [value, setValue] = useState(30); + const changeLedOn = (event: React.ChangeEvent) => { - setData({ led_on: event.target.checked }, saveData); + setData( + { led_on: event.target.checked, redValue: 255, greenValue: 255, BlueValue: 255 }, + saveData); } + const handleSliderChange:any = (event:any, newValue:any) => { + setValue(newValue); + }; + + const handleInputChange = (event: any) => { + setValue(event.target.value === '' ? '' : Number(event.target.value)); + }; + + const handleBlur = () => { + if (value < 0) { + setValue(0); + } else if (value > 100) { + setValue(100); + } + }; + return ( - The switch below controls the LED via the WebSocket. It will automatically update whenever the LED state changes. + Toggle RGB state. + ); } \ No newline at end of file diff --git a/interface/src/project/components/RgbSlider.js b/interface/src/project/components/RgbSlider.js new file mode 100644 index 0000000..4ed3a1a --- /dev/null +++ b/interface/src/project/components/RgbSlider.js @@ -0,0 +1,50 @@ +import React from 'react'; +import { makeStyles } from '@material-ui/core/styles'; +import Grid from '@material-ui/core/Grid'; +import Slider from '@material-ui/core/Slider'; +import Input from '@material-ui/core/Input'; + +const useStyles = makeStyles({ + root: { + width: "100%", + }, + input: { + width: 42, + }, + }); + +export default ({}) => { + return ( +
+ + Red value + + + + + + + + + +
+ ) +} \ No newline at end of file diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts index ba6cf24..57049ee 100644 --- a/interface/src/project/types.ts +++ b/interface/src/project/types.ts @@ -10,4 +10,7 @@ export interface LightMqttSettings { export interface RgbState { led_on : boolean; + redValue : number; + greenValue : number; + BlueValue : number; } \ No newline at end of file From 9d49f3d768ef9bbd38bc91bf00f634619a01452a Mon Sep 17 00:00:00 2001 From: janis Date: Wed, 25 Nov 2020 22:29:52 +0200 Subject: [PATCH 03/36] wip --- .../project/RgbStateWebSocketController.tsx | 25 +-- interface/src/project/components/RgbSlider.js | 159 ++++++++++++++---- 2 files changed, 129 insertions(+), 55 deletions(-) diff --git a/interface/src/project/RgbStateWebSocketController.tsx b/interface/src/project/RgbStateWebSocketController.tsx index 9387e02..b70008d 100644 --- a/interface/src/project/RgbStateWebSocketController.tsx +++ b/interface/src/project/RgbStateWebSocketController.tsx @@ -5,6 +5,7 @@ import { Typography, Box, Switch } from '@material-ui/core'; import { WEB_SOCKET_ROOT } from '../api'; import { WebSocketControllerProps, WebSocketFormLoader, WebSocketFormProps, webSocketController } from '../components'; import { SectionContent, BlockFormControlLabel } from '../components'; +import RgbSlider from './components/RgbSlider'; import { RgbState } from './types'; @@ -36,31 +37,12 @@ function RgbStateWebSocketControllerForm(props: RgbStateWebSocketControllerFormP const { data, saveData, setData } = props; - const classes = useStyles(); - const [value, setValue] = useState(30); - const changeLedOn = (event: React.ChangeEvent) => { setData( { led_on: event.target.checked, redValue: 255, greenValue: 255, BlueValue: 255 }, saveData); } - const handleSliderChange:any = (event:any, newValue:any) => { - setValue(newValue); - }; - - const handleInputChange = (event: any) => { - setValue(event.target.value === '' ? '' : Number(event.target.value)); - }; - - const handleBlur = () => { - if (value < 0) { - setValue(0); - } else if (value > 100) { - setValue(100); - } - }; - return ( @@ -78,7 +60,10 @@ function RgbStateWebSocketControllerForm(props: RgbStateWebSocketControllerFormP } label="LED State?" /> - + ); } \ No newline at end of file diff --git a/interface/src/project/components/RgbSlider.js b/interface/src/project/components/RgbSlider.js index 4ed3a1a..ec379ee 100644 --- a/interface/src/project/components/RgbSlider.js +++ b/interface/src/project/components/RgbSlider.js @@ -1,50 +1,139 @@ -import React from 'react'; +import React, { useState } from 'react'; import { makeStyles } from '@material-ui/core/styles'; import Grid from '@material-ui/core/Grid'; import Slider from '@material-ui/core/Slider'; import Input from '@material-ui/core/Input'; +import { Typography } from '@material-ui/core'; const useStyles = makeStyles({ root: { - width: "100%", + width: "100%", }, input: { - width: 42, + width: 52, }, - }); +}); + +export default ({setDataHandler, saveDataHandler}) => { + + const classes = useStyles(); + const [red, setRed] = useState(30); + const [green, setGreen] = useState(30); + const [blue, setBlue] = useState(30); + + const handleSliderChange = (event, newValue) => { + setRed(newValue) + console.log(event.target); + // setData( + // { led_on: true, redValue: 255, greenValue: 255, BlueValue: 255 }, + // saveData); + }; + + const handleInputChange = event => { + setRed(event.target.value === '' ? '' : Number(event.target.value)); + } + + const handleBlur = () => { + if (red < 0) { + setRed(0); + } else if (red > 255) { + setRed(255); + } + }; -export default ({}) => { return (
- - Red value - - - - - - - - - -
+ + Red value + + + + + + + + + + + + Blue value + + + + + + + + + + + + Greem value + + + + + + + + + + ) } \ No newline at end of file From 4ecc0b4618a783af7d2b3b1d6354a5649f5b779d Mon Sep 17 00:00:00 2001 From: janis Date: Thu, 26 Nov 2020 22:08:04 +0200 Subject: [PATCH 04/36] wip --- .../project/RgbStateWebSocketController.tsx | 12 ++- interface/src/project/components/RgbSlider.js | 96 +++++++++++++++---- interface/src/project/types.ts | 6 +- src/RgbStateService.cpp | 10 +- src/RgbStateService.h | 48 +++++++++- 5 files changed, 141 insertions(+), 31 deletions(-) diff --git a/interface/src/project/RgbStateWebSocketController.tsx b/interface/src/project/RgbStateWebSocketController.tsx index b70008d..3881b46 100644 --- a/interface/src/project/RgbStateWebSocketController.tsx +++ b/interface/src/project/RgbStateWebSocketController.tsx @@ -8,6 +8,8 @@ import { SectionContent, BlockFormControlLabel } from '../components'; import RgbSlider from './components/RgbSlider'; import { RgbState } from './types'; +import { random } from 'lodash'; +import { randomInt } from 'crypto'; export const RGB_SETTINGS_WEBSOCKET_URL = WEB_SOCKET_ROOT + "rgbState"; @@ -38,8 +40,14 @@ function RgbStateWebSocketControllerForm(props: RgbStateWebSocketControllerFormP const { data, saveData, setData } = props; const changeLedOn = (event: React.ChangeEvent) => { + console.log(Math.floor(Math.random() * (255 + 1))) setData( - { led_on: event.target.checked, redValue: 255, greenValue: 255, BlueValue: 255 }, + { + led_on: event.target.checked, + red_value: Math.floor(Math.random() * (255 + 1)), + green_value: Math.floor(Math.random() * (255 + 1)), + Blue_value: Math.floor(Math.random() * (255 + 1)) + }, saveData); } @@ -60,7 +68,7 @@ function RgbStateWebSocketControllerForm(props: RgbStateWebSocketControllerFormP } label="LED State?" /> - diff --git a/interface/src/project/components/RgbSlider.js b/interface/src/project/components/RgbSlider.js index ec379ee..ca198ac 100644 --- a/interface/src/project/components/RgbSlider.js +++ b/interface/src/project/components/RgbSlider.js @@ -7,11 +7,35 @@ import { Typography } from '@material-ui/core'; const useStyles = makeStyles({ root: { + width: "100%", }, input: { width: 52, }, + thumb: { + height: 24, + width: 24, + backgroundColor: "#fff", + border: "2px solid currentColor", + marginTop: -8, + marginLeft: -12, + "&:focus, &:hover, &$active": { + boxShadow: "inherit" + } + }, + active: {}, + valueLabel: { + left: "calc(-50% + 4px)" + }, + track: { + height: 8, + borderRadius: 4 + }, + rail: { + height: 8, + borderRadius: 4 + } }); export default ({setDataHandler, saveDataHandler}) => { @@ -21,16 +45,41 @@ export default ({setDataHandler, saveDataHandler}) => { const [green, setGreen] = useState(30); const [blue, setBlue] = useState(30); - const handleSliderChange = (event, newValue) => { + const handleRedSlider = (event, newValue) => { setRed(newValue) - console.log(event.target); - // setData( - // { led_on: true, redValue: 255, greenValue: 255, BlueValue: 255 }, - // saveData); + sendToApi(); + }; + + const handleGreenSlider = (event, newValue) => { + setGreen(newValue) + sendToApi(); }; - const handleInputChange = event => { + const handleBlueSlider = (event, newValue) => { + setBlue(newValue) + sendToApi(); + }; + + const handleRedInputChange = event => { setRed(event.target.value === '' ? '' : Number(event.target.value)); + sendToApi(); + } + + const handleGreenInputChange = event => { + setGreen(event.target.value === '' ? '' : Number(event.target.value)); + sendToApi(); + } + + const handleBlueInputChange = event => { + setBlue(event.target.value === '' ? '' : Number(event.target.value)); + sendToApi(); + } + + const sendToApi = () => { + console.log("red: ",red,"green: ", green, "blue: " , blue) + setDataHandler( + { led_on: true, red_value: red, green_value: green, blue_value: blue }, + saveDataHandler); } const handleBlur = () => { @@ -43,26 +92,29 @@ export default ({setDataHandler, saveDataHandler}) => { return (
+ + {/* Red slider */} Red value { - - Blue value + {/* Green slider */} + + Green value + {/* blue sider */} - Greem value + Blue value @@ -122,14 +176,14 @@ export default ({setDataHandler, saveDataHandler}) => { className={classes.input} value={blue} margin="dense" - onChange={handleInputChange} + onChange={handleBlueInputChange} onBlur={handleBlur} inputProps={{ step: 1, min: 0, max: 255, type: 'number', - 'aria-labelledby': 'green-slider', + 'aria-labelledby': 'blue-slider', }} /> diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts index 57049ee..3c0eb28 100644 --- a/interface/src/project/types.ts +++ b/interface/src/project/types.ts @@ -10,7 +10,7 @@ export interface LightMqttSettings { export interface RgbState { led_on : boolean; - redValue : number; - greenValue : number; - BlueValue : number; + red_value : number; + green_value : number; + Blue_value : number; } \ No newline at end of file diff --git a/src/RgbStateService.cpp b/src/RgbStateService.cpp index 86c2247..2a202db 100644 --- a/src/RgbStateService.cpp +++ b/src/RgbStateService.cpp @@ -1,6 +1,6 @@ #include -RgbStateService::RgbStateService(AsyncWebServer* server,SecurityManager* securityManager) : +RgbStateService::RgbStateService(AsyncWebServer* server, SecurityManager* securityManager) : _httpEndpoint(RgbState::read, RgbState::update, this, @@ -28,11 +28,17 @@ void RgbStateService::begin() { } void RgbStateService::onConfigUpdated() { + Serial.println(_state.ledOn); + Serial.print("red"); + Serial.println(_state.redValue); + Serial.print("green"); + Serial.println(_state.greenValue); + Serial.print("blue"); + Serial.println(_state.blueValue); digitalWrite(LED_PIN, _state.ledOn ? LED_ON : LED_OFF); } void RgbStateService::registerConfig() { - String configTopic; String subTopic; String pubTopic; diff --git a/src/RgbStateService.h b/src/RgbStateService.h index dfcaaab..050abc2 100644 --- a/src/RgbStateService.h +++ b/src/RgbStateService.h @@ -8,6 +8,9 @@ #define PRINT_DELAY 5000 #define DEFAULT_LED_STATE false +#define DEFAULT_RED_VALUE 255 +#define DEFAULT_GREEN_VALUE 255 +#define DEFAULT_BLUE_VALUE 255 #define OFF_STATE "OFF" #define ON_STATE "ON" @@ -27,20 +30,59 @@ class RgbState { public: bool ledOn; - uint8_t RedBrightness = 255; - uint8_t GreenBrightness = 255; - uint8_t BlueBrightness = 255; + uint8_t redValue = 255; + uint8_t greenValue = 255; + uint8_t blueValue = 255; static void read(RgbState& settings, JsonObject& root) { + Serial.println("read function called"); root["led_on"] = settings.ledOn; + root["red_value"] = settings.redValue; + root["green_value"] = settings.greenValue; + root["blue_value"] = settings.blueValue; } static StateUpdateResult update(JsonObject& root, RgbState& lightState) { + int redLigth = root["red_value"]; + int greenLigth = root["green_value"]; + int blueLigth = root["blue_value"]; + + Serial.println("set function called"); + Serial.print("red: "); + Serial.println(redLigth); + Serial.print("green: "); + Serial.println(greenLigth); + Serial.print("blue: "); + Serial.println(blueLigth); + boolean newState = root["led_on"] | DEFAULT_LED_STATE; + int red = root["red_value"] | DEFAULT_RED_VALUE; + int blue = root["green_value"] | DEFAULT_GREEN_VALUE; + int green = root["green_value"] | DEFAULT_GREEN_VALUE; + if (lightState.ledOn != newState) { lightState.ledOn = newState; return StateUpdateResult::CHANGED; + }else if (lightState.redValue != red) + { + Serial.print("red changed : "); + Serial.println(red); + lightState.redValue = red; + return StateUpdateResult::CHANGED; + }else if (lightState.greenValue!=green) + { + Serial.print("blue changed : "); + Serial.println(blue); + lightState.greenValue = green; + return StateUpdateResult::CHANGED; + }else if (lightState.blueValue != blue) + { + Serial.print("green changed : "); + Serial.println(green); + lightState.blueValue = blue; + return StateUpdateResult::CHANGED; } + return StateUpdateResult::UNCHANGED; } From d7425d755f4969f22197fab7b51f90e441a5b613 Mon Sep 17 00:00:00 2001 From: janis Date: Sun, 29 Nov 2020 18:02:38 +0200 Subject: [PATCH 05/36] fixed slider --- .../project/RgbStateWebSocketController.tsx | 4 +- interface/src/project/components/RgbSlider.js | 57 +++++++++++++------ 2 files changed, 42 insertions(+), 19 deletions(-) diff --git a/interface/src/project/RgbStateWebSocketController.tsx b/interface/src/project/RgbStateWebSocketController.tsx index 3881b46..faf1cbe 100644 --- a/interface/src/project/RgbStateWebSocketController.tsx +++ b/interface/src/project/RgbStateWebSocketController.tsx @@ -1,4 +1,4 @@ -import React, { Component, useState } from 'react'; +import React, { Component } from 'react'; import { ValidatorForm } from 'react-material-ui-form-validator'; import { Typography, Box, Switch } from '@material-ui/core'; @@ -8,8 +8,6 @@ import { SectionContent, BlockFormControlLabel } from '../components'; import RgbSlider from './components/RgbSlider'; import { RgbState } from './types'; -import { random } from 'lodash'; -import { randomInt } from 'crypto'; export const RGB_SETTINGS_WEBSOCKET_URL = WEB_SOCKET_ROOT + "rgbState"; diff --git a/interface/src/project/components/RgbSlider.js b/interface/src/project/components/RgbSlider.js index ca198ac..c749152 100644 --- a/interface/src/project/components/RgbSlider.js +++ b/interface/src/project/components/RgbSlider.js @@ -7,7 +7,7 @@ import { Typography } from '@material-ui/core'; const useStyles = makeStyles({ root: { - + width: "100%", }, input: { @@ -21,24 +21,24 @@ const useStyles = makeStyles({ marginTop: -8, marginLeft: -12, "&:focus, &:hover, &$active": { - boxShadow: "inherit" + boxShadow: "inherit" } - }, - active: {}, - valueLabel: { + }, + active: {}, + valueLabel: { left: "calc(-50% + 4px)" - }, - track: { + }, + track: { height: 8, borderRadius: 4 - }, - rail: { + }, + rail: { height: 8, borderRadius: 4 - } + } }); -export default ({setDataHandler, saveDataHandler}) => { +export default ({ setDataHandler, saveDataHandler }) => { const classes = useStyles(); const [red, setRed] = useState(30); @@ -76,13 +76,32 @@ export default ({setDataHandler, saveDataHandler}) => { } const sendToApi = () => { - console.log("red: ",red,"green: ", green, "blue: " , blue) + console.log("red: ", red, "green: ", green, "blue: ", blue) setDataHandler( { led_on: true, red_value: red, green_value: green, blue_value: blue }, saveDataHandler); } - const handleBlur = () => { + const handleBlur = (color) => { + switch (color) { + case "red": + if (red < 0) { + setRed(0); + } else if (red > 255) setRed(255); + break; + case "green": + if (green < 0) { + setGreen(0); + } else if (green > 255) setGreen(255); + break; + case "blue": + if (blue < 0) { + setBlue(0); + } else if (blue > 255) setBlue(255); + break; + default: + break; + } if (red < 0) { setRed(0); } else if (red > 255) { @@ -115,7 +134,7 @@ export default ({setDataHandler, saveDataHandler}) => { value={red} margin="dense" onChange={handleRedInputChange} - onBlur={handleBlur} + onBlur={handleBlur("red")} inputProps={{ step: 1, min: 0, @@ -134,6 +153,9 @@ export default ({setDataHandler, saveDataHandler}) => { { value={green} margin="dense" onChange={handleGreenInputChange} - onBlur={handleBlur} + onBlur={handleBlur("green")} inputProps={{ step: 1, min: 0, @@ -165,6 +187,9 @@ export default ({setDataHandler, saveDataHandler}) => { { value={blue} margin="dense" onChange={handleBlueInputChange} - onBlur={handleBlur} + onBlur={handleBlur("blue")} inputProps={{ step: 1, min: 0, From 2828d9f516b7c5bc537616acab4016d90d095569 Mon Sep 17 00:00:00 2001 From: janis Date: Wed, 2 Dec 2020 18:13:33 +0200 Subject: [PATCH 06/36] RGB driver functionality --- .../project/RgbStateWebSocketController.tsx | 8 +- interface/src/project/components/RgbSlider.js | 19 ++--- platformio.ini | 1 + src/RgbStateService.cpp | 15 ++-- src/RgbStateService.h | 75 +++++++++---------- src/main.cpp | 37 ++------- 6 files changed, 65 insertions(+), 90 deletions(-) diff --git a/interface/src/project/RgbStateWebSocketController.tsx b/interface/src/project/RgbStateWebSocketController.tsx index faf1cbe..0507c72 100644 --- a/interface/src/project/RgbStateWebSocketController.tsx +++ b/interface/src/project/RgbStateWebSocketController.tsx @@ -38,13 +38,12 @@ function RgbStateWebSocketControllerForm(props: RgbStateWebSocketControllerFormP const { data, saveData, setData } = props; const changeLedOn = (event: React.ChangeEvent) => { - console.log(Math.floor(Math.random() * (255 + 1))) setData( { led_on: event.target.checked, - red_value: Math.floor(Math.random() * (255 + 1)), - green_value: Math.floor(Math.random() * (255 + 1)), - Blue_value: Math.floor(Math.random() * (255 + 1)) + red_value: data.red_value, + green_value: data.green_value, + Blue_value: data.Blue_value }, saveData); } @@ -69,6 +68,7 @@ function RgbStateWebSocketControllerForm(props: RgbStateWebSocketControllerFormP ); diff --git a/interface/src/project/components/RgbSlider.js b/interface/src/project/components/RgbSlider.js index c749152..c39ff47 100644 --- a/interface/src/project/components/RgbSlider.js +++ b/interface/src/project/components/RgbSlider.js @@ -38,24 +38,27 @@ const useStyles = makeStyles({ } }); -export default ({ setDataHandler, saveDataHandler }) => { - +export default ({ setDataHandler, saveDataHandler, data }) => { + const classes = useStyles(); - const [red, setRed] = useState(30); - const [green, setGreen] = useState(30); - const [blue, setBlue] = useState(30); + const [red, setRed] = useState(data.red_value); + const [green, setGreen] = useState(data.green_value); + const [blue, setBlue] = useState(data.blue_value); const handleRedSlider = (event, newValue) => { + console.log("red: ",newValue) setRed(newValue) sendToApi(); }; const handleGreenSlider = (event, newValue) => { + console.log("green: ",newValue) setGreen(newValue) sendToApi(); }; const handleBlueSlider = (event, newValue) => { + console.log("blue: ", newValue) setBlue(newValue) sendToApi(); }; @@ -76,7 +79,6 @@ export default ({ setDataHandler, saveDataHandler }) => { } const sendToApi = () => { - console.log("red: ", red, "green: ", green, "blue: ", blue) setDataHandler( { led_on: true, red_value: red, green_value: green, blue_value: blue }, saveDataHandler); @@ -102,11 +104,6 @@ export default ({ setDataHandler, saveDataHandler }) => { default: break; } - if (red < 0) { - setRed(0); - } else if (red > 255) { - setRed(255); - } }; return ( diff --git a/platformio.ini b/platformio.ini index d11e760..4cc0ee3 100644 --- a/platformio.ini +++ b/platformio.ini @@ -35,6 +35,7 @@ lib_deps = ArduinoJson@>=6.0.0,<7.0.0 ESP Async WebServer@>=1.2.0,<2.0.0 AsyncMqttClient@>=0.8.2,<1.0.0 + fastled/FastLED @ ^3.3.3 [env:esp12e] platform = espressif8266 diff --git a/src/RgbStateService.cpp b/src/RgbStateService.cpp index 2a202db..28c46e4 100644 --- a/src/RgbStateService.cpp +++ b/src/RgbStateService.cpp @@ -28,13 +28,14 @@ void RgbStateService::begin() { } void RgbStateService::onConfigUpdated() { - Serial.println(_state.ledOn); - Serial.print("red"); - Serial.println(_state.redValue); - Serial.print("green"); - Serial.println(_state.greenValue); - Serial.print("blue"); - Serial.println(_state.blueValue); + Serial.println("onConfigUpdated called .."); + // Serial.println(_state.ledOn); + // Serial.print("red"); + // Serial.println(_state.redValue); + // Serial.print("green"); + // Serial.println(_state.greenValue); + // Serial.print("blue"); + // Serial.println(_state.blueValue); digitalWrite(LED_PIN, _state.ledOn ? LED_ON : LED_OFF); } diff --git a/src/RgbStateService.h b/src/RgbStateService.h index 050abc2..0c9467c 100644 --- a/src/RgbStateService.h +++ b/src/RgbStateService.h @@ -3,14 +3,15 @@ #include #include +#include #define LED_PIN 2 #define PRINT_DELAY 5000 #define DEFAULT_LED_STATE false #define DEFAULT_RED_VALUE 255 -#define DEFAULT_GREEN_VALUE 255 -#define DEFAULT_BLUE_VALUE 255 +#define DEFAULT_GREEN_VALUE 210 +#define DEFAULT_BLUE_VALUE 45 #define OFF_STATE "OFF" #define ON_STATE "ON" @@ -22,6 +23,11 @@ #elif defined(ESP8266) #define LED_ON 0x0 #define LED_OFF 0x1 + +#define NUM_LEDS 1 +#define CLOCK_PIN 14 // D5 +#define DATA_PIN 12 // D6 + #endif #define RGB_SETTINGS_ENDPOINT_PATH "/rest/rgbState" @@ -30,12 +36,16 @@ class RgbState { public: bool ledOn; - uint8_t redValue = 255; - uint8_t greenValue = 255; - uint8_t blueValue = 255; + uint8_t redValue; + uint8_t greenValue; + uint8_t blueValue; + CRGB leds[NUM_LEDS]; + + RgbState() { + FastLED.addLeds(leds, NUM_LEDS); + } static void read(RgbState& settings, JsonObject& root) { - Serial.println("read function called"); root["led_on"] = settings.ledOn; root["red_value"] = settings.redValue; root["green_value"] = settings.greenValue; @@ -43,46 +53,30 @@ class RgbState { } static StateUpdateResult update(JsonObject& root, RgbState& lightState) { - int redLigth = root["red_value"]; - int greenLigth = root["green_value"]; - int blueLigth = root["blue_value"]; - - Serial.println("set function called"); - Serial.print("red: "); - Serial.println(redLigth); - Serial.print("green: "); - Serial.println(greenLigth); - Serial.print("blue: "); - Serial.println(blueLigth); - boolean newState = root["led_on"] | DEFAULT_LED_STATE; int red = root["red_value"] | DEFAULT_RED_VALUE; - int blue = root["green_value"] | DEFAULT_GREEN_VALUE; int green = root["green_value"] | DEFAULT_GREEN_VALUE; - - if (lightState.ledOn != newState) { - lightState.ledOn = newState; - return StateUpdateResult::CHANGED; - }else if (lightState.redValue != red) - { - Serial.print("red changed : "); - Serial.println(red); + int blue = root["blue_value"] | DEFAULT_BLUE_VALUE; + + if (red != lightState.redValue || green != lightState.greenValue || blue != lightState.blueValue) { lightState.redValue = red; - return StateUpdateResult::CHANGED; - }else if (lightState.greenValue!=green) - { - Serial.print("blue changed : "); - Serial.println(blue); lightState.greenValue = green; - return StateUpdateResult::CHANGED; - }else if (lightState.blueValue != blue) - { - Serial.print("green changed : "); - Serial.println(green); lightState.blueValue = blue; + lightState.updateRgbDriver(); + + return StateUpdateResult::CHANGED; + } + + if (lightState.ledOn != newState) { + lightState.ledOn = newState; + if (lightState.ledOn) { + lightState.leds[0].setRGB(0, 0, 0); + FastLED.show(); + return StateUpdateResult::CHANGED; + } + lightState.updateRgbDriver(); return StateUpdateResult::CHANGED; } - return StateUpdateResult::UNCHANGED; } @@ -106,6 +100,11 @@ class RgbState { } return StateUpdateResult::UNCHANGED; } + + RgbState updateRgbDriver() { + leds[0].setRGB(this->redValue, this->greenValue, this->blueValue); + FastLED.show(); + } }; class RgbStateService : public StatefulService { diff --git a/src/main.cpp b/src/main.cpp index dfe95fc..d5ff945 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,36 +6,25 @@ AsyncWebServer server(80); ESP8266React esp8266React(&server); -// LightMqttSettingsService lightMqttSettingsService = -// LightMqttSettingsService(&server, esp8266React.getFS(), esp8266React.getSecurityManager()); - -// LightStateService lightStateService = LightStateService(&server, -// esp8266React.getSecurityManager(), -// esp8266React.getMqttClient(), -// &lightMqttSettingsService); - RgbStateService rgbStateService = RgbStateService(&server, esp8266React.getSecurityManager()); -update_handler_id_t updateHandler = rgbStateService.addUpdateHandler( - [&](const String& originId) { - Serial.print("The light's state has been updated by: "); - Serial.println(originId); - } -); + +// update_handler_id_t updateHandler = rgbStateService.addUpdateHandler([&](const String& originId) { +// Serial.print("The light's state has been updated by: "); +// Serial.println(originId); +// }); void setup() { // start serial and filesystem Serial.begin(SERIAL_BAUD_RATE); + // RgbState RgbState (); + // start the framework and demo project esp8266React.begin(); // load the initial light settings - // lightStateService.begin(); rgbStateService.begin(); - // start the light service - // lightMqttSettingsService.begin(); - // start the server server.begin(); } @@ -44,15 +33,3 @@ void loop() { // run the framework's loop function esp8266React.loop(); } - - -// class RgbState { -// public: -// bool on = false; -// uint8_t RedBrightness = 255; -// uint8_t GreenBrightness = 255; -// uint8_t BlueBrightness = 255; -// }; - -// class RgbStateService : public StatefulService { -// }; From 3240597614f54f4a13e8f0153145e1685378456c Mon Sep 17 00:00:00 2001 From: janis Date: Thu, 3 Dec 2020 19:12:50 +0200 Subject: [PATCH 07/36] Added draggable line chart --- features.ini | 4 +- interface/package-lock.json | 10 +++ interface/package.json | 2 + interface/src/project/AquariumController.tsx | 36 ++++++++ interface/src/project/DemoProject.tsx | 46 ---------- .../{DemoInformation.tsx => Information.tsx} | 2 +- interface/src/project/ProjectMenu.tsx | 4 +- interface/src/project/ProjectRouting.tsx | 6 +- .../project/RgbStateWebSocketController.tsx | 2 + .../src/project/components/RgbSettings.js | 49 +++++++++++ src/LightMqttSettingsService.cpp | 16 ---- src/LightMqttSettingsService.h | 41 --------- src/LightStateService.cpp | 73 --------------- src/LightStateService.h | 88 ------------------- src/RgbStateService.h | 4 +- 15 files changed, 109 insertions(+), 274 deletions(-) create mode 100644 interface/src/project/AquariumController.tsx delete mode 100644 interface/src/project/DemoProject.tsx rename interface/src/project/{DemoInformation.tsx => Information.tsx} (97%) create mode 100644 interface/src/project/components/RgbSettings.js delete mode 100644 src/LightMqttSettingsService.cpp delete mode 100644 src/LightMqttSettingsService.h delete mode 100644 src/LightStateService.cpp delete mode 100644 src/LightStateService.h diff --git a/features.ini b/features.ini index 6b6e231..24f69e6 100644 --- a/features.ini +++ b/features.ini @@ -4,5 +4,5 @@ build_flags = -D FT_SECURITY=1 -D FT_MQTT=0 -D FT_NTP=1 - -D FT_OTA=1 - -D FT_UPLOAD_FIRMWARE=1 + -D FT_OTA=0 + -D FT_UPLOAD_FIRMWARE=0 diff --git a/interface/package-lock.json b/interface/package-lock.json index 014040e..9174735 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -6521,6 +6521,16 @@ "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" }, + "highcharts": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/highcharts/-/highcharts-8.2.2.tgz", + "integrity": "sha512-F63TXO7RxsvTcpO/KOubQZWualYpCMyCTuKtoWbt7KCsfQ3Kl7Fr6HEyyJdjkYl+XlnmnKlSRi9d3HjLK9Q0wg==" + }, + "highcharts-react-official": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/highcharts-react-official/-/highcharts-react-official-3.0.0.tgz", + "integrity": "sha512-VefJgDY2hkT9gfppsQGrRF2g5u8d9dtfHGcx2/xqiP+PkZXCqalw9xOeKVCRvJKTOh0coiDFwvVjOvB7KaGl4A==" + }, "history": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", diff --git a/interface/package.json b/interface/package.json index b4080e1..51a0575 100644 --- a/interface/package.json +++ b/interface/package.json @@ -14,6 +14,8 @@ "@types/react-router": "^5.1.8", "@types/react-router-dom": "^5.1.6", "compression-webpack-plugin": "^4.0.0", + "highcharts": "^8.2.2", + "highcharts-react-official": "^3.0.0", "jwt-decode": "^3.1.1", "lodash": "^4.17.20", "mime-types": "^2.1.27", diff --git a/interface/src/project/AquariumController.tsx b/interface/src/project/AquariumController.tsx new file mode 100644 index 0000000..0affa13 --- /dev/null +++ b/interface/src/project/AquariumController.tsx @@ -0,0 +1,36 @@ +import React, { Component } from 'react'; +import { Redirect, Switch, RouteComponentProps } from 'react-router-dom' + +import { Tabs, Tab } from '@material-ui/core'; + +import { PROJECT_PATH } from '../api'; +import { MenuAppBar } from '../components'; +import { AuthenticatedRoute } from '../authentication'; + +import DemoInformation from './Information'; +import RgbStateWebSocketController from './RgbStateWebSocketController'; + +class AquariumController extends Component { + + handleTabChange = (event: React.ChangeEvent<{}>, path: string) => { + this.props.history.push(path); + }; + + render() { + return ( + + + + + + + + + + + + ) + } +} + +export default AquariumController; \ No newline at end of file diff --git a/interface/src/project/DemoProject.tsx b/interface/src/project/DemoProject.tsx deleted file mode 100644 index 1304281..0000000 --- a/interface/src/project/DemoProject.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import React, { Component } from 'react'; -import { Redirect, Switch, RouteComponentProps } from 'react-router-dom' - -import { Tabs, Tab } from '@material-ui/core'; - -import { PROJECT_PATH } from '../api'; -import { MenuAppBar } from '../components'; -import { AuthenticatedRoute } from '../authentication'; - -import DemoInformation from './DemoInformation'; -import LightStateRestController from './LightStateRestController'; -import LightStateWebSocketController from './LightStateWebSocketController'; -import RgbStateWebSocketController from './RgbStateWebSocketController'; -import LightMqttSettingsController from './LightMqttSettingsController'; - -class DemoProject extends Component { - - handleTabChange = (event: React.ChangeEvent<{}>, path: string) => { - this.props.history.push(path); - }; - - render() { - return ( - - - - - - - - - - - - - - - - - - ) - } - -} - -export default DemoProject; \ No newline at end of file diff --git a/interface/src/project/DemoInformation.tsx b/interface/src/project/Information.tsx similarity index 97% rename from interface/src/project/DemoInformation.tsx rename to interface/src/project/Information.tsx index 2b9967b..c56c314 100644 --- a/interface/src/project/DemoInformation.tsx +++ b/interface/src/project/Information.tsx @@ -6,7 +6,7 @@ class DemoInformation extends Component { render() { return ( - + This simple demo project allows you to control the built-in LED. It demonstrates how the esp8266-react framework may be extended for your own IoT project. diff --git a/interface/src/project/ProjectMenu.tsx b/interface/src/project/ProjectMenu.tsx index b7d2739..ba89168 100644 --- a/interface/src/project/ProjectMenu.tsx +++ b/interface/src/project/ProjectMenu.tsx @@ -12,11 +12,11 @@ class ProjectMenu extends Component { const path = this.props.match.url; return ( - + - + ) diff --git a/interface/src/project/ProjectRouting.tsx b/interface/src/project/ProjectRouting.tsx index fc378e6..598a3bc 100644 --- a/interface/src/project/ProjectRouting.tsx +++ b/interface/src/project/ProjectRouting.tsx @@ -4,7 +4,7 @@ import { Redirect, Switch } from 'react-router'; import { PROJECT_PATH } from '../api'; import { AuthenticatedRoute } from '../authentication'; -import DemoProject from './DemoProject'; +import AquariumController from './AquariumController'; class ProjectRouting extends Component { @@ -16,14 +16,14 @@ class ProjectRouting extends Component { * Add your project page routing below. */ } - + { /* * The redirect below caters for the default project route and redirecting invalid paths. * The "to" property must match one of the routes above for this to work correctly. */ } - + ) } diff --git a/interface/src/project/RgbStateWebSocketController.tsx b/interface/src/project/RgbStateWebSocketController.tsx index 0507c72..79c8c99 100644 --- a/interface/src/project/RgbStateWebSocketController.tsx +++ b/interface/src/project/RgbStateWebSocketController.tsx @@ -6,6 +6,7 @@ import { WEB_SOCKET_ROOT } from '../api'; import { WebSocketControllerProps, WebSocketFormLoader, WebSocketFormProps, webSocketController } from '../components'; import { SectionContent, BlockFormControlLabel } from '../components'; import RgbSlider from './components/RgbSlider'; +import RgbSettings from './components/RgbSettings'; import { RgbState } from './types'; @@ -70,6 +71,7 @@ function RgbStateWebSocketControllerForm(props: RgbStateWebSocketControllerFormP saveDataHandler={saveData} data={data} /> + ); } \ No newline at end of file diff --git a/interface/src/project/components/RgbSettings.js b/interface/src/project/components/RgbSettings.js new file mode 100644 index 0000000..9d70541 --- /dev/null +++ b/interface/src/project/components/RgbSettings.js @@ -0,0 +1,49 @@ +import React from "react"; +import { render } from "react-dom"; +// Import Highcharts +import Highcharts from "highcharts/highstock"; +//import HighchartsReact from "./HighchartsReact.min.js"; +import HighchartsReact from "highcharts-react-official"; + +import HC_more from "highcharts/highcharts-more"; //module +HC_more(Highcharts); //init module + +require("highcharts/modules/draggable-points")(Highcharts); + +class RgbSettings extends React.Component { + constructor(props) { + super(props); + + this.state = { + options: { + yAxis: { + softMin: 0, + softMax: 255 + }, + series: [ + { + dragDrop: { + draggableY: true + }, + data: [10, 20, 240] + } + ] + } + }; + } + + render() { + return ( + + ); + } +} + +export default RgbSettings; + +// render(, document.getElementById("root")); diff --git a/src/LightMqttSettingsService.cpp b/src/LightMqttSettingsService.cpp deleted file mode 100644 index bddd909..0000000 --- a/src/LightMqttSettingsService.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include - -LightMqttSettingsService::LightMqttSettingsService(AsyncWebServer* server, FS* fs, SecurityManager* securityManager) : - _httpEndpoint(LightMqttSettings::read, - LightMqttSettings::update, - this, - server, - LIGHT_BROKER_SETTINGS_PATH, - securityManager, - AuthenticationPredicates::IS_AUTHENTICATED), - _fsPersistence(LightMqttSettings::read, LightMqttSettings::update, this, fs, LIGHT_BROKER_SETTINGS_FILE) { -} - -void LightMqttSettingsService::begin() { - _fsPersistence.readFromFS(); -} diff --git a/src/LightMqttSettingsService.h b/src/LightMqttSettingsService.h deleted file mode 100644 index 23a2218..0000000 --- a/src/LightMqttSettingsService.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef LightMqttSettingsService_h -#define LightMqttSettingsService_h - -#include -#include -#include - -#define LIGHT_BROKER_SETTINGS_FILE "/config/brokerSettings.json" -#define LIGHT_BROKER_SETTINGS_PATH "/rest/brokerSettings" - -class LightMqttSettings { - public: - String mqttPath; - String name; - String uniqueId; - - static void read(LightMqttSettings& settings, JsonObject& root) { - root["mqtt_path"] = settings.mqttPath; - root["name"] = settings.name; - root["unique_id"] = settings.uniqueId; - } - - static StateUpdateResult update(JsonObject& root, LightMqttSettings& settings) { - settings.mqttPath = root["mqtt_path"] | ESPUtils::defaultDeviceValue("homeassistant/light/"); - settings.name = root["name"] | ESPUtils::defaultDeviceValue("light-"); - settings.uniqueId = root["unique_id"] | ESPUtils::defaultDeviceValue("light-"); - return StateUpdateResult::CHANGED; - } -}; - -class LightMqttSettingsService : public StatefulService { - public: - LightMqttSettingsService(AsyncWebServer* server, FS* fs, SecurityManager* securityManager); - void begin(); - - private: - HttpEndpoint _httpEndpoint; - FSPersistence _fsPersistence; -}; - -#endif // end LightMqttSettingsService_h diff --git a/src/LightStateService.cpp b/src/LightStateService.cpp deleted file mode 100644 index 8169622..0000000 --- a/src/LightStateService.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include - -LightStateService::LightStateService(AsyncWebServer* server, - SecurityManager* securityManager, - AsyncMqttClient* mqttClient, - LightMqttSettingsService* lightMqttSettingsService) : - _httpEndpoint(LightState::read, - LightState::update, - this, - server, - LIGHT_SETTINGS_ENDPOINT_PATH, - securityManager, - AuthenticationPredicates::IS_AUTHENTICATED), - _mqttPubSub(LightState::haRead, LightState::haUpdate, this, mqttClient), - _webSocket(LightState::read, - LightState::update, - this, - server, - LIGHT_SETTINGS_SOCKET_PATH, - securityManager, - AuthenticationPredicates::IS_AUTHENTICATED), - _mqttClient(mqttClient), - _lightMqttSettingsService(lightMqttSettingsService) { - // configure led to be output - pinMode(LED_PIN, OUTPUT); - - // configure MQTT callback - _mqttClient->onConnect(std::bind(&LightStateService::registerConfig, this)); - - // configure update handler for when the light settings change - _lightMqttSettingsService->addUpdateHandler([&](const String& originId) { registerConfig(); }, false); - - // configure settings service update handler to update LED state - addUpdateHandler([&](const String& originId) { onConfigUpdated(); }, false); -} - -void LightStateService::begin() { - _state.ledOn = DEFAULT_LED_STATE; - onConfigUpdated(); -} - -void LightStateService::onConfigUpdated() { - digitalWrite(LED_PIN, _state.ledOn ? LED_ON : LED_OFF); -} - -void LightStateService::registerConfig() { - if (!_mqttClient->connected()) { - return; - } - String configTopic; - String subTopic; - String pubTopic; - - DynamicJsonDocument doc(256); - _lightMqttSettingsService->read([&](LightMqttSettings& settings) { - configTopic = settings.mqttPath + "/config"; - subTopic = settings.mqttPath + "/set"; - pubTopic = settings.mqttPath + "/state"; - doc["~"] = settings.mqttPath; - doc["name"] = settings.name; - doc["unique_id"] = settings.uniqueId; - }); - doc["cmd_t"] = "~/set"; - doc["stat_t"] = "~/state"; - doc["schema"] = "json"; - doc["brightness"] = false; - - String payload; - serializeJson(doc, payload); - _mqttClient->publish(configTopic.c_str(), 0, false, payload.c_str()); - - _mqttPubSub.configureTopics(pubTopic, subTopic); -} diff --git a/src/LightStateService.h b/src/LightStateService.h deleted file mode 100644 index e9c9a9c..0000000 --- a/src/LightStateService.h +++ /dev/null @@ -1,88 +0,0 @@ -#ifndef LightStateService_h -#define LightStateService_h - -#include - -#include -#include -#include - -#define LED_PIN 2 -#define PRINT_DELAY 5000 - -#define DEFAULT_LED_STATE false -#define OFF_STATE "OFF" -#define ON_STATE "ON" - -// Note that the built-in LED is on when the pin is low on most NodeMCU boards. -// This is because the anode is tied to VCC and the cathode to the GPIO 4 (Arduino pin 2). -#ifdef ESP32 -#define LED_ON 0x1 -#define LED_OFF 0x0 -#elif defined(ESP8266) -#define LED_ON 0x0 -#define LED_OFF 0x1 -#endif - -#define LIGHT_SETTINGS_ENDPOINT_PATH "/rest/lightState" -#define LIGHT_SETTINGS_SOCKET_PATH "/ws/lightState" - -class LightState { - public: - bool ledOn; - - static void read(LightState& settings, JsonObject& root) { - root["led_on"] = settings.ledOn; - } - - static StateUpdateResult update(JsonObject& root, LightState& lightState) { - boolean newState = root["led_on"] | DEFAULT_LED_STATE; - if (lightState.ledOn != newState) { - lightState.ledOn = newState; - return StateUpdateResult::CHANGED; - } - return StateUpdateResult::UNCHANGED; - } - - static void haRead(LightState& settings, JsonObject& root) { - root["state"] = settings.ledOn ? ON_STATE : OFF_STATE; - } - - static StateUpdateResult haUpdate(JsonObject& root, LightState& lightState) { - String state = root["state"]; - // parse new led state - boolean newState = false; - if (state.equals(ON_STATE)) { - newState = true; - } else if (!state.equals(OFF_STATE)) { - return StateUpdateResult::ERROR; - } - // change the new state, if required - if (lightState.ledOn != newState) { - lightState.ledOn = newState; - return StateUpdateResult::CHANGED; - } - return StateUpdateResult::UNCHANGED; - } -}; - -class LightStateService : public StatefulService { - public: - LightStateService(AsyncWebServer* server, - SecurityManager* securityManager, - AsyncMqttClient* mqttClient, - LightMqttSettingsService* lightMqttSettingsService); - void begin(); - - private: - HttpEndpoint _httpEndpoint; - MqttPubSub _mqttPubSub; - WebSocketTxRx _webSocket; - AsyncMqttClient* _mqttClient; - LightMqttSettingsService* _lightMqttSettingsService; - - void registerConfig(); - void onConfigUpdated(); -}; - -#endif diff --git a/src/RgbStateService.h b/src/RgbStateService.h index 0c9467c..9f7dc64 100644 --- a/src/RgbStateService.h +++ b/src/RgbStateService.h @@ -57,7 +57,7 @@ class RgbState { int red = root["red_value"] | DEFAULT_RED_VALUE; int green = root["green_value"] | DEFAULT_GREEN_VALUE; int blue = root["blue_value"] | DEFAULT_BLUE_VALUE; - + if (red != lightState.redValue || green != lightState.greenValue || blue != lightState.blueValue) { lightState.redValue = red; lightState.greenValue = green; @@ -68,13 +68,13 @@ class RgbState { } if (lightState.ledOn != newState) { - lightState.ledOn = newState; if (lightState.ledOn) { lightState.leds[0].setRGB(0, 0, 0); FastLED.show(); return StateUpdateResult::CHANGED; } lightState.updateRgbDriver(); + lightState.ledOn = newState; return StateUpdateResult::CHANGED; } return StateUpdateResult::UNCHANGED; From 4bc7adef6dc774514c64dfb79e778145c8015080 Mon Sep 17 00:00:00 2001 From: janis Date: Thu, 3 Dec 2020 20:42:08 +0200 Subject: [PATCH 08/36] wip.. --- .../src/project/components/RgbSettings.js | 81 ++++++++++++------- src/RgbStateService.h | 6 ++ 2 files changed, 58 insertions(+), 29 deletions(-) diff --git a/interface/src/project/components/RgbSettings.js b/interface/src/project/components/RgbSettings.js index 9d70541..e093d8f 100644 --- a/interface/src/project/components/RgbSettings.js +++ b/interface/src/project/components/RgbSettings.js @@ -1,5 +1,4 @@ -import React from "react"; -import { render } from "react-dom"; +import React, { useState, useEffect } from "react"; // Import Highcharts import Highcharts from "highcharts/highstock"; //import HighchartsReact from "./HighchartsReact.min.js"; @@ -10,40 +9,64 @@ HC_more(Highcharts); //init module require("highcharts/modules/draggable-points")(Highcharts); -class RgbSettings extends React.Component { - constructor(props) { - super(props); +export default (props) => { - this.state = { - options: { - yAxis: { - softMin: 0, - softMax: 255 - }, - series: [ - { - dragDrop: { - draggableY: true - }, - data: [10, 20, 240] - } - ] + const [options, setOptions] = useState({ + title:{ + text: "RGB day/night cycle" + }, + chart: { + type: "spline" + // type: "area" + }, + yAxis: { + softMin: 0, + softMax: 255 + }, + xAxis: { + categories: [ + '01:00','02:00','03:00','04:00','05:00','06:00','07:00','08:00','09:00','10:00','11:00','12:00', + '13:00','14:00','15:00','16:00','17:00','18:00','19:00','20:00','21:00','22:00','23:00','24:00' + ], + tickmarkPlacement: 'on', + title: { + enabled: false } - }; - } + }, + series: [ + { + name:"Red", + color:"red", + dragDrop: {draggableY: true}, + data: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24] + }, + { + name:"green", + color:"green", + dragDrop: {draggableY: true}, + data: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240] + }, + { + name:"blue", + color:"blue", + dragDrop: {draggableY: true}, + data: [100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100] + } + ] + }) - render() { - return ( + return ( + <> - ); - } + + ); } - -export default RgbSettings; +// export default RgbSettings; // render(, document.getElementById("root")); diff --git a/src/RgbStateService.h b/src/RgbStateService.h index 9f7dc64..1445925 100644 --- a/src/RgbStateService.h +++ b/src/RgbStateService.h @@ -68,9 +68,15 @@ class RgbState { } if (lightState.ledOn != newState) { + Serial.print("old state : "); + Serial.println(lightState.ledOn); + Serial.print("new state : "); + Serial.println(newState); + if (lightState.ledOn) { lightState.leds[0].setRGB(0, 0, 0); FastLED.show(); + lightState.ledOn = newState; return StateUpdateResult::CHANGED; } lightState.updateRgbDriver(); From c2c988a0aac7154bcd3162863476302340a00425 Mon Sep 17 00:00:00 2001 From: janis Date: Thu, 3 Dec 2020 21:20:41 +0200 Subject: [PATCH 09/36] added line chart for each color --- .../project/RgbStateWebSocketController.tsx | 6 ++- .../src/project/components/RgbSettings.js | 48 +++++++++++-------- 2 files changed, 33 insertions(+), 21 deletions(-) diff --git a/interface/src/project/RgbStateWebSocketController.tsx b/interface/src/project/RgbStateWebSocketController.tsx index 79c8c99..5ad95fe 100644 --- a/interface/src/project/RgbStateWebSocketController.tsx +++ b/interface/src/project/RgbStateWebSocketController.tsx @@ -71,7 +71,11 @@ function RgbStateWebSocketControllerForm(props: RgbStateWebSocketControllerFormP saveDataHandler={saveData} data={data} /> - + ); } \ No newline at end of file diff --git a/interface/src/project/components/RgbSettings.js b/interface/src/project/components/RgbSettings.js index e093d8f..56e75fb 100644 --- a/interface/src/project/components/RgbSettings.js +++ b/interface/src/project/components/RgbSettings.js @@ -1,18 +1,18 @@ import React, { useState, useEffect } from "react"; -// Import Highcharts import Highcharts from "highcharts/highstock"; -//import HighchartsReact from "./HighchartsReact.min.js"; import HighchartsReact from "highcharts-react-official"; +import HC_more from "highcharts/highcharts-more"; +import { FormActions, FormButton } from '../../components'; +import SaveIcon from '@material-ui/icons/Save'; -import HC_more from "highcharts/highcharts-more"; //module -HC_more(Highcharts); //init module +HC_more(Highcharts); require("highcharts/modules/draggable-points")(Highcharts); -export default (props) => { +export default ({ setDataHandler, saveDataHandler, data }) => { const [options, setOptions] = useState({ - title:{ + title: { text: "RGB day/night cycle" }, chart: { @@ -25,8 +25,8 @@ export default (props) => { }, xAxis: { categories: [ - '01:00','02:00','03:00','04:00','05:00','06:00','07:00','08:00','09:00','10:00','11:00','12:00', - '13:00','14:00','15:00','16:00','17:00','18:00','19:00','20:00','21:00','22:00','23:00','24:00' + '01:00', '02:00', '03:00', '04:00', '05:00', '06:00', '07:00', '08:00', '09:00', '10:00', '11:00', '12:00', + '13:00', '14:00', '15:00', '16:00', '17:00', '18:00', '19:00', '20:00', '21:00', '22:00', '23:00', '24:00' ], tickmarkPlacement: 'on', title: { @@ -35,35 +35,43 @@ export default (props) => { }, series: [ { - name:"Red", - color:"red", - dragDrop: {draggableY: true}, - data: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24] + name: "Red", + color: "red", + dragDrop: { draggableY: true , draggableX:false}, + data: [{y:1,x:0},{y:1,x:1},{y:1,x:2},{y:1,x:3},{y:1,x:4},{y:1,x:5},{y:1,x:6},{y:1,x:7},{y:1,x:8},{y:1,x:9},{y:1,x:10},{y:1,x:11},{y:1,x:12},{y:1,x:13},{y:1,x:14},{y:1,x:15},{y:1,x:16},{y:1,x:17},{y:1,x:18},{y:1,x:19}, {y:1,x:20},{y:1,x:21},{y:1,x:22},{y:1,x:23}] }, { - name:"green", - color:"green", - dragDrop: {draggableY: true}, + name: "green", + color: "green", + dragDrop: { draggableY: true }, data: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240] }, { - name:"blue", - color:"blue", - dragDrop: {draggableY: true}, - data: [100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100] + name: "blue", + color: "blue", + dragDrop: { draggableY: true }, + data: [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100] } ] }) + const handleSubmit = () => { + console.log('rgb setting: ', options.series[0].data) + } + return ( <> + + } variant="contained" color="primary" type="submit" onClick={handleSubmit}> + Save + + ); } From 223905b3f9a748a1eaf25e8839906d3b0ffa8ec1 Mon Sep 17 00:00:00 2001 From: janis Date: Sat, 5 Dec 2020 22:13:54 +0200 Subject: [PATCH 10/36] Option to select drag color in graph --- .../src/project/components/RgbSettings.js | 47 +++++++++++++++++-- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/interface/src/project/components/RgbSettings.js b/interface/src/project/components/RgbSettings.js index 56e75fb..536fbdc 100644 --- a/interface/src/project/components/RgbSettings.js +++ b/interface/src/project/components/RgbSettings.js @@ -3,6 +3,7 @@ import Highcharts from "highcharts/highstock"; import HighchartsReact from "highcharts-react-official"; import HC_more from "highcharts/highcharts-more"; import { FormActions, FormButton } from '../../components'; +import { Radio, RadioGroup, FormControl, FormLabel, FormControlLabel, } from '@material-ui/core'; import SaveIcon from '@material-ui/icons/Save'; @@ -11,6 +12,8 @@ require("highcharts/modules/draggable-points")(Highcharts); export default ({ setDataHandler, saveDataHandler, data }) => { + const [selectedColor, setSelectedColor] = useState('red'); + const [options, setOptions] = useState({ title: { text: "RGB day/night cycle" @@ -37,19 +40,19 @@ export default ({ setDataHandler, saveDataHandler, data }) => { { name: "Red", color: "red", - dragDrop: { draggableY: true , draggableX:false}, - data: [{y:1,x:0},{y:1,x:1},{y:1,x:2},{y:1,x:3},{y:1,x:4},{y:1,x:5},{y:1,x:6},{y:1,x:7},{y:1,x:8},{y:1,x:9},{y:1,x:10},{y:1,x:11},{y:1,x:12},{y:1,x:13},{y:1,x:14},{y:1,x:15},{y:1,x:16},{y:1,x:17},{y:1,x:18},{y:1,x:19}, {y:1,x:20},{y:1,x:21},{y:1,x:22},{y:1,x:23}] + dragDrop: { draggableY: true, draggableX: false }, + data: [{ y: 1, x: 0 }, { y: 1, x: 1 }, { y: 1, x: 2 }, { y: 1, x: 3 }, { y: 1, x: 4 }, { y: 1, x: 5 }, { y: 1, x: 6 }, { y: 1, x: 7 }, { y: 1, x: 8 }, { y: 1, x: 9 }, { y: 1, x: 10 }, { y: 1, x: 11 }, { y: 1, x: 12 }, { y: 1, x: 13 }, { y: 1, x: 14 }, { y: 1, x: 15 }, { y: 1, x: 16 }, { y: 1, x: 17 }, { y: 1, x: 18 }, { y: 1, x: 19 }, { y: 1, x: 20 }, { y: 1, x: 21 }, { y: 1, x: 22 }, { y: 1, x: 23 }] }, { name: "green", color: "green", - dragDrop: { draggableY: true }, + dragDrop: { draggableY: false }, data: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240] }, { name: "blue", color: "blue", - dragDrop: { draggableY: true }, + dragDrop: { draggableY: false }, data: [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100] } ] @@ -59,6 +62,32 @@ export default ({ setDataHandler, saveDataHandler, data }) => { console.log('rgb setting: ', options.series[0].data) } + const handleRadioChange = (event) => { + let newValue = event.target.value; + setSelectedColor(newValue); + setOptions({ ...options }, options.series[0].dragDrop.draggableY = false); + setOptions({ ...options }, options.series[1].dragDrop.draggableY = false); + setOptions({ ...options }, options.series[2].dragDrop.draggableY = false); + + console.log({ ...options }) + switch (newValue) { + case "red": + const redDraggable = options.series[0].dragDrop.draggableY; + setOptions({ ...options }, options.series[0].dragDrop.draggableY = redDraggable ? false : true) + break; + case "green": + const greenDraggable = options.series[1].dragDrop.draggableY; + setOptions({ ...options }, options.series[1].dragDrop.draggableY = greenDraggable ? false : true) + break; + case "blue": + const blueDraggable = options.series[2].dragDrop.draggableY; + setOptions({ ...options }, options.series[2].dragDrop.draggableY = blueDraggable ? false : true) + break; + default: + break; + } + } + return ( <> { highcharts={Highcharts} options={options} /> + + + Select to enagble draggable line chart + + } label="Red" /> + } label="Green" /> + } label="Blue" /> + + + } variant="contained" color="primary" type="submit" onClick={handleSubmit}> Save From 191b9e12605dfd6f3d2a82bf9da26c63445de3dd Mon Sep 17 00:00:00 2001 From: janis Date: Sun, 6 Dec 2020 14:20:37 +0200 Subject: [PATCH 11/36] wip.. --- .../src/project/components/RgbSettings.js | 236 ++++++++++++++++-- 1 file changed, 216 insertions(+), 20 deletions(-) diff --git a/interface/src/project/components/RgbSettings.js b/interface/src/project/components/RgbSettings.js index 536fbdc..d2d6e9e 100644 --- a/interface/src/project/components/RgbSettings.js +++ b/interface/src/project/components/RgbSettings.js @@ -15,49 +15,245 @@ export default ({ setDataHandler, saveDataHandler, data }) => { const [selectedColor, setSelectedColor] = useState('red'); const [options, setOptions] = useState({ - title: { - text: "RGB day/night cycle" - }, + chart: { - type: "spline" - // type: "area" + type: 'spline', + zoomType: 'x', + panning: true, + panKey: 'shift', + + events: { + load: function () { + this.xAxis[0].setExtremes(Date.UTC(2010, 0, 1, 9, 0, 0), Date.UTC(2010, 0, 1, 16, 0, 0)); + } + } }, + yAxis: { - softMin: 0, - softMax: 255 + }, xAxis: { - categories: [ - '01:00', '02:00', '03:00', '04:00', '05:00', '06:00', '07:00', '08:00', '09:00', '10:00', '11:00', '12:00', - '13:00', '14:00', '15:00', '16:00', '17:00', '18:00', '19:00', '20:00', '21:00', '22:00', '23:00', '24:00' - ], - tickmarkPlacement: 'on', + min: Date.UTC(2010, 0, 1, 0, 0, 0), + max: Date.UTC(2010, 0, 2, 0, 0, 0), + type: 'datetime', + tickPositioner: function () { + var info = this.tickPositions.info; + var positions = []; + for (let i = Date.UTC(2010, 0, 1, 0, 0, 0); i <= Date.UTC(2010, 0, 2, 0, 0, 0); i += 3600 * 1000) { + positions.push(i); + } + positions.info = info; + return positions; + }, + lineWidth: 1, + dateTimeLabelFormats: { + day: '%H:%M' + }, title: { enabled: false } + /* categories: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] */ }, + + series: [ { name: "Red", color: "red", - dragDrop: { draggableY: true, draggableX: false }, - data: [{ y: 1, x: 0 }, { y: 1, x: 1 }, { y: 1, x: 2 }, { y: 1, x: 3 }, { y: 1, x: 4 }, { y: 1, x: 5 }, { y: 1, x: 6 }, { y: 1, x: 7 }, { y: 1, x: 8 }, { y: 1, x: 9 }, { y: 1, x: 10 }, { y: 1, x: 11 }, { y: 1, x: 12 }, { y: 1, x: 13 }, { y: 1, x: 14 }, { y: 1, x: 15 }, { y: 1, x: 16 }, { y: 1, x: 17 }, { y: 1, x: 18 }, { y: 1, x: 19 }, { y: 1, x: 20 }, { y: 1, x: 21 }, { y: 1, x: 22 }, { y: 1, x: 23 }] + dragDrop: { draggableY: true }, + data: [ + { + y: 0, + x: Date.UTC(2010, 0, 1, 9, 0, 0), + color: 'red' + }, + { + y: 1, + x: Date.UTC(2010, 0, 1, 10, 0, 0), + color: 'red' + }, + { + y: 3, + x: Date.UTC(2010, 0, 1, 11, 0, 0), + color: 'red' + }, + + ] }, { - name: "green", - color: "green", + name: "Blue", + color: "blue", dragDrop: { draggableY: false }, - data: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240] + data: [ + { + y: 46, + x: Date.UTC(2010, 0, 1, 9, 0, 0), + }, + { + y: 23, + x: Date.UTC(2010, 0, 1, 10, 0, 0), + }, + { + y: 3, + x: Date.UTC(2010, 0, 1, 11, 0, 0), + }, + + ] }, { - name: "blue", - color: "blue", + name: "Green", + color: "green", dragDrop: { draggableY: false }, - data: [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100] + data: [ + { + y: 5, + x: Date.UTC(2010, 0, 1, 9, 0, 0), + }, + { + y: 156, + x: Date.UTC(2010, 0, 1, 10, 0, 0), + }, + { + y: 33, + x: Date.UTC(2010, 0, 1, 11, 0, 0), + }, + + ] } ] + + + // chart: { + // zoomType: 'x' + // }, + // xAxis: { + // type: 'datetime', + // tickInterval: 3600 * 1000, + // min: Date.UTC(2013,4,22), + // max: Date.UTC(2013,4,23), + // }, + // series: [{ + // data: [ + // [1369206795000, 1], + // [1369225421000, 3], + // [1369230934000, 2] + // ], + // pointStart: Date.UTC(2012, 5, 22), + // pointInterval: 24 * 3600 * 1000 // one day + // }] + + // rangeSelector: { + // selected: 4 + // }, + // title: { + // text: "RGB day/night cycle" + // }, + // chart: { + // type: "spline", + // zoomType: 'x', + // panning: true, + // panKey: "ctrl", + // pinchType: 'x', + // events: { + // load() { + // this.xAxis[0].setExtremes(6, 16); + // } + // } + // }, + // tooltip: { + // followTouchMove: false + // }, + // credits: { + // text: '© Janis Davidsons', + // href: '' + // }, + // yAxis: { + // // softMin: 0, + // // softMax: 255, + // categories: [1, 2, 3, 4, 5, 6, 7, 8, 9] + // }, + // xAxis: { + // min: Date.UTC(2020, 0, 1, 0, 0, 0), + // max: Date.UTC(2020, 0, 2, 0, 0, 0), + // type: 'datetime', + // tickPositioner: function () { + // var info = this.tickPositions.info; + // var positions = []; + // for (let i = Date.UTC(2020, 0, 1, 0, 0, 0); i <= Date.UTC(2020, 0, 2, 0, 0, 0); i += 3600 * 1000) { + // positions.push(i); + // } + // positions.info = info; + // console.log(positions) + // return positions; + // }, + // lineWidth: 1, + // dateTimeLabelFormats: { + // day: '%H:%M' + // }, + // // title: { + // // enabled: false + // // } + // // type: 'datetime', + // // tickInterval: 3600 * 1000, + // // min: Date.UTC(2013,4,22), + // // max: Date.UTC(2013,4,23), + // // // tickInterval: 2, + // // // categories: [1537639969000, 1537640271000, 1537640573000, 1537640874000, 1537641176000, 1537641478000, 1537641780000, 1537642081000, 1537642383000, 1537642685000, 1537642987000, 1537643289000, 1537643590000, 1537643892000, 1537644194000, 1537644496000, 1537644797000, 1537645099000, 1537645401000, 1537645703000, 1537646004000, 1537646306000, 1537646608000, 1537646910000, 1537647212000], + // // // categories: [ + // // // '01:00', '02:00', '03:00', '04:00', '05:00', '06:00', '07:00', '08:00', '09:00', '10:00', '11:00', '12:00', + // // // '13:00', '14:00', '15:00', '16:00', '17:00', '18:00', '19:00', '20:00', '21:00', '22:00', '23:00', '24:00' + // // // ], + // // // startOnTick: false, + // // tickmarkPlacement: 'on', + // // title: { + // // enabled: false + // // } + // }, + // series: [ + // { + // name: "Red", + // color: "red", + // dragDrop: { draggableY: true, draggableX: false }, + // showInNavigator: true, + // data: [ + // { y: 1, x: Date.UTC(2020, 0, 1, 0, 0, 0) }, + // { y: 1, x: Date.UTC(2020, 0, 1, 1, 0, 0) }, + // { y: 1, x: Date.UTC(2020, 0, 1, 2, 0, 0) }, + // { y: 1, x: Date.UTC(2020, 0, 1, 3, 0, 0) }, + // { y: 1, x: Date.UTC(2020, 0, 1, 4, 0, 0) }, + // { y: 1, x: Date.UTC(2020, 0, 1, 5, 0, 0) }, + // { y: 1, x: Date.UTC(2020, 0, 1, 6, 0, 0) }, + // { y: 1, x: Date.UTC(2020, 0, 1, 7, 0, 0) }, + // { y: 1, x: Date.UTC(2020, 0, 1, 8, 0, 0) }, + // { y: 1, x: Date.UTC(2020, 0, 1, 9, 0, 0) }, + // // { y: 1, x: 10 }, { y: 1, x: 11 }, { y: 1, x: 12 }, { y: 1, x: 13 }, { y: 1, x: 14 }, { y: 1, x: 15 }, { y: 1, x: 16 }, { y: 1, x: 17 }, { y: 1, x: 18 }, { y: 1, x: 19 }, { y: 1, x: 20 }, { y: 1, x: 21 }, { y: 1, x: 22 }, { y: 1, x: 23 } + // ], + // // pointStart: Date.UTC(2012, 05, 22), + // // pointInterval: 24 * 3600 * 1000 // one day + // }, + // { + // name: "green", + // color: "green", + // dragDrop: { draggableY: false }, + // showInNavigator: true, + // data: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240], + // // pointStart: Date.UTC(2012, 05, 22), + // // pointInterval: 24 * 3600 * 1000 // one day + // }, + // { + // name: "blue", + // color: "blue", + // dragDrop: { draggableY: false }, + // showInNavigator: true, + // data: [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100], + // // pointStart: Date.UTC(2012, 05, 22), + // // pointInterval: 24 * 3600 * 1000 // one day + // } + // ] }) + var time = [1537639969000, 1537640271000, 1537640573000, 1537640874000, 1537641176000, 1537641478000, 1537641780000, 1537642081000, 1537642383000, 1537642685000, 1537642987000, 1537643289000, 1537643590000, 1537643892000, 1537644194000, 1537644496000, 1537644797000, 1537645099000, 1537645401000, 1537645703000, 1537646004000, 1537646306000, 1537646608000, 1537646910000, 1537647212000]; + const handleSubmit = () => { console.log('rgb setting: ', options.series[0].data) } From 5904a89f19a732806b6e037bbe541d436cf7e400 Mon Sep 17 00:00:00 2001 From: janis Date: Sun, 6 Dec 2020 15:48:52 +0200 Subject: [PATCH 12/36] wip --- .../src/project/components/RgbSettings.js | 228 +++++------------- 1 file changed, 63 insertions(+), 165 deletions(-) diff --git a/interface/src/project/components/RgbSettings.js b/interface/src/project/components/RgbSettings.js index d2d6e9e..3d019e5 100644 --- a/interface/src/project/components/RgbSettings.js +++ b/interface/src/project/components/RgbSettings.js @@ -21,25 +21,34 @@ export default ({ setDataHandler, saveDataHandler, data }) => { zoomType: 'x', panning: true, panKey: 'shift', - events: { load: function () { - this.xAxis[0].setExtremes(Date.UTC(2010, 0, 1, 9, 0, 0), Date.UTC(2010, 0, 1, 16, 0, 0)); + this.xAxis[0].setExtremes(Date.UTC(2020, 0, 1, 9, 0, 0), Date.UTC(2020, 0, 1, 22, 0, 0)); } } }, + tooltip: { + followTouchMove: false + }, + credits: { + text: '© Janis Davidsons', + href: '' + }, yAxis: { + dragMaxY: 255, + min: 0, + max: 255 }, xAxis: { - min: Date.UTC(2010, 0, 1, 0, 0, 0), - max: Date.UTC(2010, 0, 2, 0, 0, 0), + min: Date.UTC(2020, 0, 1, 0, 0, 0), + max: Date.UTC(2020, 0, 2, 0, 0, 0), type: 'datetime', tickPositioner: function () { var info = this.tickPositions.info; var positions = []; - for (let i = Date.UTC(2010, 0, 1, 0, 0, 0); i <= Date.UTC(2010, 0, 2, 0, 0, 0); i += 3600 * 1000) { + for (let i = Date.UTC(2020, 0, 1, 0, 0, 0); i <= Date.UTC(2020, 0, 2, 0, 0, 0); i += 3600 * 500) { positions.push(i); } positions.info = info; @@ -51,8 +60,14 @@ export default ({ setDataHandler, saveDataHandler, data }) => { }, title: { enabled: false + }, + labels: { + rotation: -45, + style: { + fontSize: '13px', + fontFamily: 'Verdana, sans-serif' + } } - /* categories: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] */ }, @@ -60,200 +75,78 @@ export default ({ setDataHandler, saveDataHandler, data }) => { { name: "Red", color: "red", - dragDrop: { draggableY: true }, + dragDrop: { + draggableY: true, + dragMaxY: 255, + dragMinY:0 + }, data: [ { y: 0, - x: Date.UTC(2010, 0, 1, 9, 0, 0), - color: 'red' + x: Date.UTC(2020, 0, 1, 9, 0, 0), }, { y: 1, - x: Date.UTC(2010, 0, 1, 10, 0, 0), - color: 'red' + x: Date.UTC(2020, 0, 1, 10, 0, 0), }, { y: 3, - x: Date.UTC(2010, 0, 1, 11, 0, 0), - color: 'red' + x: Date.UTC(2020, 0, 1, 11, 0, 0), }, ] }, { - name: "Blue", - color: "blue", - dragDrop: { draggableY: false }, + name: "Green", + color: "green", + dragDrop: { + draggableY: false, + dragMaxY: 255, + dragMinY:0 + }, data: [ { - y: 46, - x: Date.UTC(2010, 0, 1, 9, 0, 0), + y: 5, + x: Date.UTC(2020, 0, 1, 9, 0, 0), }, { - y: 23, - x: Date.UTC(2010, 0, 1, 10, 0, 0), + y: 156, + x: Date.UTC(2020, 0, 1, 10, 0, 0), }, { - y: 3, - x: Date.UTC(2010, 0, 1, 11, 0, 0), + y: 33, + x: Date.UTC(2020, 0, 1, 11, 0, 0), }, ] }, { - name: "Green", - color: "green", - dragDrop: { draggableY: false }, + name: "Blue", + color: "blue", + dragDrop: { + draggableY: false, + dragMaxY: 255, + dragMinY:0 + }, data: [ { - y: 5, - x: Date.UTC(2010, 0, 1, 9, 0, 0), + y: 46, + x: Date.UTC(2020, 0, 1, 9, 0, 0), }, { - y: 156, - x: Date.UTC(2010, 0, 1, 10, 0, 0), + y: 23, + x: Date.UTC(2020, 0, 1, 10, 0, 0), }, { - y: 33, - x: Date.UTC(2010, 0, 1, 11, 0, 0), + y: 3, + x: Date.UTC(2020, 0, 1, 11, 0, 0), }, ] - } + }, ] - - - // chart: { - // zoomType: 'x' - // }, - // xAxis: { - // type: 'datetime', - // tickInterval: 3600 * 1000, - // min: Date.UTC(2013,4,22), - // max: Date.UTC(2013,4,23), - // }, - // series: [{ - // data: [ - // [1369206795000, 1], - // [1369225421000, 3], - // [1369230934000, 2] - // ], - // pointStart: Date.UTC(2012, 5, 22), - // pointInterval: 24 * 3600 * 1000 // one day - // }] - - // rangeSelector: { - // selected: 4 - // }, - // title: { - // text: "RGB day/night cycle" - // }, - // chart: { - // type: "spline", - // zoomType: 'x', - // panning: true, - // panKey: "ctrl", - // pinchType: 'x', - // events: { - // load() { - // this.xAxis[0].setExtremes(6, 16); - // } - // } - // }, - // tooltip: { - // followTouchMove: false - // }, - // credits: { - // text: '© Janis Davidsons', - // href: '' - // }, - // yAxis: { - // // softMin: 0, - // // softMax: 255, - // categories: [1, 2, 3, 4, 5, 6, 7, 8, 9] - // }, - // xAxis: { - // min: Date.UTC(2020, 0, 1, 0, 0, 0), - // max: Date.UTC(2020, 0, 2, 0, 0, 0), - // type: 'datetime', - // tickPositioner: function () { - // var info = this.tickPositions.info; - // var positions = []; - // for (let i = Date.UTC(2020, 0, 1, 0, 0, 0); i <= Date.UTC(2020, 0, 2, 0, 0, 0); i += 3600 * 1000) { - // positions.push(i); - // } - // positions.info = info; - // console.log(positions) - // return positions; - // }, - // lineWidth: 1, - // dateTimeLabelFormats: { - // day: '%H:%M' - // }, - // // title: { - // // enabled: false - // // } - // // type: 'datetime', - // // tickInterval: 3600 * 1000, - // // min: Date.UTC(2013,4,22), - // // max: Date.UTC(2013,4,23), - // // // tickInterval: 2, - // // // categories: [1537639969000, 1537640271000, 1537640573000, 1537640874000, 1537641176000, 1537641478000, 1537641780000, 1537642081000, 1537642383000, 1537642685000, 1537642987000, 1537643289000, 1537643590000, 1537643892000, 1537644194000, 1537644496000, 1537644797000, 1537645099000, 1537645401000, 1537645703000, 1537646004000, 1537646306000, 1537646608000, 1537646910000, 1537647212000], - // // // categories: [ - // // // '01:00', '02:00', '03:00', '04:00', '05:00', '06:00', '07:00', '08:00', '09:00', '10:00', '11:00', '12:00', - // // // '13:00', '14:00', '15:00', '16:00', '17:00', '18:00', '19:00', '20:00', '21:00', '22:00', '23:00', '24:00' - // // // ], - // // // startOnTick: false, - // // tickmarkPlacement: 'on', - // // title: { - // // enabled: false - // // } - // }, - // series: [ - // { - // name: "Red", - // color: "red", - // dragDrop: { draggableY: true, draggableX: false }, - // showInNavigator: true, - // data: [ - // { y: 1, x: Date.UTC(2020, 0, 1, 0, 0, 0) }, - // { y: 1, x: Date.UTC(2020, 0, 1, 1, 0, 0) }, - // { y: 1, x: Date.UTC(2020, 0, 1, 2, 0, 0) }, - // { y: 1, x: Date.UTC(2020, 0, 1, 3, 0, 0) }, - // { y: 1, x: Date.UTC(2020, 0, 1, 4, 0, 0) }, - // { y: 1, x: Date.UTC(2020, 0, 1, 5, 0, 0) }, - // { y: 1, x: Date.UTC(2020, 0, 1, 6, 0, 0) }, - // { y: 1, x: Date.UTC(2020, 0, 1, 7, 0, 0) }, - // { y: 1, x: Date.UTC(2020, 0, 1, 8, 0, 0) }, - // { y: 1, x: Date.UTC(2020, 0, 1, 9, 0, 0) }, - // // { y: 1, x: 10 }, { y: 1, x: 11 }, { y: 1, x: 12 }, { y: 1, x: 13 }, { y: 1, x: 14 }, { y: 1, x: 15 }, { y: 1, x: 16 }, { y: 1, x: 17 }, { y: 1, x: 18 }, { y: 1, x: 19 }, { y: 1, x: 20 }, { y: 1, x: 21 }, { y: 1, x: 22 }, { y: 1, x: 23 } - // ], - // // pointStart: Date.UTC(2012, 05, 22), - // // pointInterval: 24 * 3600 * 1000 // one day - // }, - // { - // name: "green", - // color: "green", - // dragDrop: { draggableY: false }, - // showInNavigator: true, - // data: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240], - // // pointStart: Date.UTC(2012, 05, 22), - // // pointInterval: 24 * 3600 * 1000 // one day - // }, - // { - // name: "blue", - // color: "blue", - // dragDrop: { draggableY: false }, - // showInNavigator: true, - // data: [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100], - // // pointStart: Date.UTC(2012, 05, 22), - // // pointInterval: 24 * 3600 * 1000 // one day - // } - // ] }) - var time = [1537639969000, 1537640271000, 1537640573000, 1537640874000, 1537641176000, 1537641478000, 1537641780000, 1537642081000, 1537642383000, 1537642685000, 1537642987000, 1537643289000, 1537643590000, 1537643892000, 1537644194000, 1537644496000, 1537644797000, 1537645099000, 1537645401000, 1537645703000, 1537646004000, 1537646306000, 1537646608000, 1537646910000, 1537647212000]; - const handleSubmit = () => { console.log('rgb setting: ', options.series[0].data) } @@ -265,19 +158,24 @@ export default ({ setDataHandler, saveDataHandler, data }) => { setOptions({ ...options }, options.series[1].dragDrop.draggableY = false); setOptions({ ...options }, options.series[2].dragDrop.draggableY = false); - console.log({ ...options }) switch (newValue) { case "red": const redDraggable = options.series[0].dragDrop.draggableY; setOptions({ ...options }, options.series[0].dragDrop.draggableY = redDraggable ? false : true) + console.log('red: ', { ...options.series }) + break; case "green": const greenDraggable = options.series[1].dragDrop.draggableY; setOptions({ ...options }, options.series[1].dragDrop.draggableY = greenDraggable ? false : true) + console.log('green: ', { ...options.series }) + break; case "blue": const blueDraggable = options.series[2].dragDrop.draggableY; setOptions({ ...options }, options.series[2].dragDrop.draggableY = blueDraggable ? false : true) + console.log('blue: ', { ...options.series }) + break; default: break; @@ -305,7 +203,7 @@ export default ({ setDataHandler, saveDataHandler, data }) => { } variant="contained" color="primary" type="submit" onClick={handleSubmit}> Save - + ); From ab90aa44f19d2f4804fb860345770450fefd8003 Mon Sep 17 00:00:00 2001 From: janis Date: Sun, 6 Dec 2020 17:20:01 +0200 Subject: [PATCH 13/36] wip --- .../src/project/components/RgbSettings.js | 83 ++++++++----------- 1 file changed, 34 insertions(+), 49 deletions(-) diff --git a/interface/src/project/components/RgbSettings.js b/interface/src/project/components/RgbSettings.js index 3d019e5..5a73784 100644 --- a/interface/src/project/components/RgbSettings.js +++ b/interface/src/project/components/RgbSettings.js @@ -46,6 +46,7 @@ export default ({ setDataHandler, saveDataHandler, data }) => { max: Date.UTC(2020, 0, 2, 0, 0, 0), type: 'datetime', tickPositioner: function () { + var info = this.tickPositions.info; var positions = []; for (let i = Date.UTC(2020, 0, 1, 0, 0, 0); i <= Date.UTC(2020, 0, 2, 0, 0, 0); i += 3600 * 500) { @@ -70,7 +71,6 @@ export default ({ setDataHandler, saveDataHandler, data }) => { } }, - series: [ { name: "Red", @@ -78,23 +78,18 @@ export default ({ setDataHandler, saveDataHandler, data }) => { dragDrop: { draggableY: true, dragMaxY: 255, - dragMinY:0 + dragMinY: 0 }, - data: [ - { - y: 0, - x: Date.UTC(2020, 0, 1, 9, 0, 0), - }, - { - y: 1, - x: Date.UTC(2020, 0, 1, 10, 0, 0), - }, - { - y: 3, - x: Date.UTC(2020, 0, 1, 11, 0, 0), - }, - - ] + data: (function () { + var positions = []; + for (let i = Date.UTC(2020, 0, 1, 0, 0, 0); i <= Date.UTC(2020, 0, 2, 0, 0, 0); i += 3600 * 500) { + positions.push({ + y: 46, + x: i, + }); + } + return positions; + }()) }, { name: "Green", @@ -102,23 +97,18 @@ export default ({ setDataHandler, saveDataHandler, data }) => { dragDrop: { draggableY: false, dragMaxY: 255, - dragMinY:0 + dragMinY: 0 }, - data: [ - { - y: 5, - x: Date.UTC(2020, 0, 1, 9, 0, 0), - }, - { - y: 156, - x: Date.UTC(2020, 0, 1, 10, 0, 0), - }, - { - y: 33, - x: Date.UTC(2020, 0, 1, 11, 0, 0), - }, - - ] + data: (function () { + var positions = []; + for (let i = Date.UTC(2020, 0, 1, 0, 0, 0); i <= Date.UTC(2020, 0, 2, 0, 0, 0); i += 3600 * 500) { + positions.push({ + y: 146, + x: i, + }); + } + return positions; + }()) }, { name: "Blue", @@ -126,23 +116,18 @@ export default ({ setDataHandler, saveDataHandler, data }) => { dragDrop: { draggableY: false, dragMaxY: 255, - dragMinY:0 + dragMinY: 0 }, - data: [ - { - y: 46, - x: Date.UTC(2020, 0, 1, 9, 0, 0), - }, - { - y: 23, - x: Date.UTC(2020, 0, 1, 10, 0, 0), - }, - { - y: 3, - x: Date.UTC(2020, 0, 1, 11, 0, 0), - }, - - ] + data: (function () { + var positions = []; + for (let i = Date.UTC(2020, 0, 1, 0, 0, 0); i <= Date.UTC(2020, 0, 2, 0, 0, 0); i += 3600 * 500) { + positions.push({ + y: 83, + x: i, + }); + } + return positions; + }()) }, ] }) From 2ae2804ee2b905e8d02f0a3b45fe6dee6bbdf066 Mon Sep 17 00:00:00 2001 From: janis Date: Sun, 6 Dec 2020 19:07:56 +0200 Subject: [PATCH 14/36] wip --- .../src/project/components/RgbSettings.js | 257 +++++++++++++----- 1 file changed, 187 insertions(+), 70 deletions(-) diff --git a/interface/src/project/components/RgbSettings.js b/interface/src/project/components/RgbSettings.js index 5a73784..8a2002f 100644 --- a/interface/src/project/components/RgbSettings.js +++ b/interface/src/project/components/RgbSettings.js @@ -17,13 +17,24 @@ export default ({ setDataHandler, saveDataHandler, data }) => { const [options, setOptions] = useState({ chart: { - type: 'spline', zoomType: 'x', panning: true, - panKey: 'shift', events: { load: function () { - this.xAxis[0].setExtremes(Date.UTC(2020, 0, 1, 9, 0, 0), Date.UTC(2020, 0, 1, 22, 0, 0)); + // this.xAxis[0].setExtremes(Date.UTC(2020, 0, 1, 9, 0, 0), Date.UTC(2020, 0, 1, 22, 0, 0)); + + // set up the updating of the chart each second + // var series = this.series[0]; + + // for (let i = Date.UTC(2020, 0, 1, 0, 0, 0); i <= Date.UTC(2020, 0, 2, 0, 0, 0); i += 3600 * 500) { + + // series.addPoint([Date(i), 100], true, true); + // } + + // var x = (new Date()).getTime(), // current time + // y = Math.round(Math.random() * 100); + // series.addPoint([x, y], true, true); + } } }, @@ -41,95 +52,201 @@ export default ({ setDataHandler, saveDataHandler, data }) => { min: 0, max: 255 }, + xAxis: { min: Date.UTC(2020, 0, 1, 0, 0, 0), max: Date.UTC(2020, 0, 2, 0, 0, 0), type: 'datetime', - tickPositioner: function () { - - var info = this.tickPositions.info; - var positions = []; - for (let i = Date.UTC(2020, 0, 1, 0, 0, 0); i <= Date.UTC(2020, 0, 2, 0, 0, 0); i += 3600 * 500) { - positions.push(i); - } - positions.info = info; - return positions; - }, + dateTimeLabelFormats: { hour: '%H:%M' }, lineWidth: 1, dateTimeLabelFormats: { day: '%H:%M' }, title: { enabled: false - }, - labels: { - rotation: -45, - style: { - fontSize: '13px', - fontFamily: 'Verdana, sans-serif' - } } + /* categories: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] */ + }, + + time: { + useUTC: false + }, + + rangeSelector: { + buttons: [{ + count: 1, + type: 'hour', + text: '1H' + }, { + count: 5, + type: 'hour', + text: '5H' + }, { + type: 'all', + text: 'All' + }], + inputEnabled: false, + selected: 2 + }, + + title: { + text: 'Live random data' + }, + + exporting: { + enabled: false }, series: [ { name: "Red", color: "red", + type: 'spline', dragDrop: { draggableY: true, dragMaxY: 255, - dragMinY: 0 - }, - data: (function () { - var positions = []; - for (let i = Date.UTC(2020, 0, 1, 0, 0, 0); i <= Date.UTC(2020, 0, 2, 0, 0, 0); i += 3600 * 500) { - positions.push({ - y: 46, - x: i, - }); - } - return positions; - }()) - }, - { - name: "Green", - color: "green", - dragDrop: { - draggableY: false, - dragMaxY: 255, - dragMinY: 0 - }, - data: (function () { - var positions = []; - for (let i = Date.UTC(2020, 0, 1, 0, 0, 0); i <= Date.UTC(2020, 0, 2, 0, 0, 0); i += 3600 * 500) { - positions.push({ - y: 146, - x: i, - }); - } - return positions; - }()) - }, - { - name: "Blue", - color: "blue", - dragDrop: { - draggableY: false, - dragMaxY: 255, - dragMinY: 0 + dragMinY: 0, }, + data: (function () { - var positions = []; - for (let i = Date.UTC(2020, 0, 1, 0, 0, 0); i <= Date.UTC(2020, 0, 2, 0, 0, 0); i += 3600 * 500) { - positions.push({ - y: 83, - x: i, - }); + // generate an array of random data + var data = [], + i; + + for (i = Date.UTC(2020, 0, 1, -2, 0, 0); i <= Date.UTC(2020, 0, 2, -2, 0, 0); i += 3600 * 500) { + + console.log(new Date(Date.UTC(2020, 0, 1, -2, 0, 0)).getHours()) + + data.push([ + i, + Math.round(Math.random() * 255) + ]); } - return positions; + + // for (i = -4; i <= 3; i += 1) { + // data.push([ + // time + i * 1000 *60 *30 , + // Math.round(Math.random() * 100) + // ]); + // } + return data; }()) - }, - ] + }] + + // chart: { + // type: 'spline', + // zoomType: 'x', + // panning: true, + // panKey: 'shift', + // events: { + // load: function () { + // this.xAxis[0].setExtremes(Date.UTC(2020, 0, 1, 9, 0, 0), Date.UTC(2020, 0, 1, 22, 0, 0)); + // } + // } + // }, + + // tooltip: { + // followTouchMove: false + // }, + // credits: { + // text: '© Janis Davidsons', + // href: '' + // }, + // yAxis: { + // dragMaxY: 255, + + // min: 0, + // max: 255 + // }, + // xAxis: { + // min: Date.UTC(2020, 0, 1, 0, 0, 0), + // max: Date.UTC(2020, 0, 2, 0, 0, 0), + // type: 'datetime', + // tickPositioner: function () { + + // var info = this.tickPositions.info; + // var positions = []; + // for (let i = Date.UTC(2020, 0, 1, 0, 0, 0); i <= Date.UTC(2020, 0, 2, 0, 0, 0); i += 3600 * 500) { + // positions.push(i); + // } + // positions.info = info; + // return positions; + // }, + // lineWidth: 1, + // dateTimeLabelFormats: { + // day: '%H:%M' + // }, + // title: { + // enabled: false + // }, + // labels: { + // rotation: -45, + // style: { + // fontSize: '13px', + // fontFamily: 'Verdana, sans-serif' + // } + // } + // }, + + // series: [ + // { + // name: "Red", + // color: "red", + // dragDrop: { + // draggableY: true, + // dragMaxY: 255, + // dragMinY: 0 + // }, + // data: (function () { + // var positions = []; + // for (let i = Date.UTC(2020, 0, 1, 0, 0, 0); i <= Date.UTC(2020, 0, 2, 0, 0, 0); i += 3600 * 500) { + // positions.push({ + // y: 46, + // x: i, + // }); + // } + // return positions; + // }()) + // }, + // { + // name: "Green", + // color: "green", + // dragDrop: { + // draggableY: false, + // dragMaxY: 255, + // dragMinY: 0 + // }, + // data: (function () { + // var positions = []; + // for (let i = Date.UTC(2020, 0, 1, 0, 0, 0); i <= Date.UTC(2020, 0, 2, 0, 0, 0); i += 3600 * 500) { + // positions.push({ + // y: 146, + // x: i, + // }); + // } + // return positions; + // }()) + // }, + // { + // name: "Blue", + // color: "blue", + // dragDrop: { + // draggableY: false, + // dragMaxY: 255, + // dragMinY: 0 + // }, + // data: (function () { + // var positions = []; + // for (let i = Date.UTC(2020, 0, 1, 0, 0, 0); i <= Date.UTC(2020, 0, 2, 0, 0, 0); i += 3600 * 500) { + // positions.push({ + // y: 83, + // x: i, + // }); + // } + // return positions; + // }()) + // }, + // ] }) const handleSubmit = () => { @@ -170,8 +287,8 @@ export default ({ setDataHandler, saveDataHandler, data }) => { return ( <> From 50db42dc4d1383a864c608295ced4c7e8c129e10 Mon Sep 17 00:00:00 2001 From: janis Date: Sun, 6 Dec 2020 19:55:04 +0200 Subject: [PATCH 15/36] wip.. --- .../src/project/components/RgbSettings.js | 79 ++++++++++++++----- 1 file changed, 61 insertions(+), 18 deletions(-) diff --git a/interface/src/project/components/RgbSettings.js b/interface/src/project/components/RgbSettings.js index 8a2002f..981b923 100644 --- a/interface/src/project/components/RgbSettings.js +++ b/interface/src/project/components/RgbSettings.js @@ -57,6 +57,12 @@ export default ({ setDataHandler, saveDataHandler, data }) => { min: Date.UTC(2020, 0, 1, 0, 0, 0), max: Date.UTC(2020, 0, 2, 0, 0, 0), type: 'datetime', + title: { + text: 'Hours' + }, + + + dateTimeLabelFormats: { hour: '%H:%M' }, lineWidth: 1, dateTimeLabelFormats: { @@ -65,7 +71,6 @@ export default ({ setDataHandler, saveDataHandler, data }) => { title: { enabled: false } - /* categories: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] */ }, time: { @@ -90,13 +95,22 @@ export default ({ setDataHandler, saveDataHandler, data }) => { }, title: { - text: 'Live random data' + text: "RGB day/night cycle" }, exporting: { enabled: false }, + tooltip: { + split: true, + xDateFormat: '%H:%M' + // headerFormat: '', + // dateTimeLabelFormats: { + // day: '%H:%M' + // } + }, + series: [ { name: "Red", @@ -107,31 +121,60 @@ export default ({ setDataHandler, saveDataHandler, data }) => { dragMaxY: 255, dragMinY: 0, }, + visible: true, + // tooltip: { + // pointFormat: '' + // }, + + data: (function () { + var data = [] + for (let i = Date.UTC(2020, 0, 1, -2, 0, 0); i <= Date.UTC(2020, 0, 2, -2, 0, 0); i += 3600 * 500) { + data.push([i, Math.round(Math.random() * 255)]); + } + + return data; + }()) + }, + { + name: "Green", + color: "green", + type: 'spline', + dragDrop: { + draggableY: true, + dragMaxY: 255, + dragMinY: 0, + }, data: (function () { - // generate an array of random data - var data = [], - i; + var data = [] - for (i = Date.UTC(2020, 0, 1, -2, 0, 0); i <= Date.UTC(2020, 0, 2, -2, 0, 0); i += 3600 * 500) { + for (let i = Date.UTC(2020, 0, 1, -2, 0, 0); i <= Date.UTC(2020, 0, 2, -2, 0, 0); i += 3600 * 500) { + data.push([i, Math.round(Math.random() * 255)]); + } - console.log(new Date(Date.UTC(2020, 0, 1, -2, 0, 0)).getHours()) + return data; + }()) + }, + { + name: "Blue", + color: "blue", + type: 'spline', + dragDrop: { + draggableY: true, + dragMaxY: 255, + dragMinY: 0, + }, - data.push([ - i, - Math.round(Math.random() * 255) - ]); + data: (function () { + var data = [] + for (let i = Date.UTC(2020, 0, 1, -2, 0, 0); i <= Date.UTC(2020, 0, 2, -2, 0, 0); i += 3600 * 500) { + data.push([i, Math.round(Math.random() * 255)]); } - // for (i = -4; i <= 3; i += 1) { - // data.push([ - // time + i * 1000 *60 *30 , - // Math.round(Math.random() * 100) - // ]); - // } return data; }()) - }] + } + ] // chart: { // type: 'spline', From 53bd7e4e15bd4e7593ce8c6c85c162e79b202e56 Mon Sep 17 00:00:00 2001 From: janis Date: Sun, 6 Dec 2020 21:42:36 +0200 Subject: [PATCH 16/36] wip --- .../src/project/components/RgbSettings.js | 20 +++++++++++++++---- src/RgbStateService.cpp | 2 +- src/RgbStateService.h | 9 +++++++++ 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/interface/src/project/components/RgbSettings.js b/interface/src/project/components/RgbSettings.js index 981b923..855a01f 100644 --- a/interface/src/project/components/RgbSettings.js +++ b/interface/src/project/components/RgbSettings.js @@ -17,6 +17,7 @@ export default ({ setDataHandler, saveDataHandler, data }) => { const [options, setOptions] = useState({ chart: { + type: 'spline', zoomType: 'x', panning: true, events: { @@ -38,9 +39,11 @@ export default ({ setDataHandler, saveDataHandler, data }) => { } } }, - - tooltip: { - followTouchMove: false + navigator: { + series: { + color: '#FF00FF', + lineWidth: 1 + } }, credits: { text: '© Janis Davidsons', @@ -77,6 +80,12 @@ export default ({ setDataHandler, saveDataHandler, data }) => { useUTC: false }, + plotOptions: { + series: { + showInNavigator: true + } + }, + rangeSelector: { buttons: [{ count: 1, @@ -104,7 +113,10 @@ export default ({ setDataHandler, saveDataHandler, data }) => { tooltip: { split: true, - xDateFormat: '%H:%M' + xDateFormat: '%H:%M', + valueDecimals: 0, + followTouchMove: false, + pointFormat: '{series.name}: {point.y}
', // headerFormat: '', // dateTimeLabelFormats: { // day: '%H:%M' diff --git a/src/RgbStateService.cpp b/src/RgbStateService.cpp index 28c46e4..0052dbd 100644 --- a/src/RgbStateService.cpp +++ b/src/RgbStateService.cpp @@ -36,7 +36,7 @@ void RgbStateService::onConfigUpdated() { // Serial.println(_state.greenValue); // Serial.print("blue"); // Serial.println(_state.blueValue); - digitalWrite(LED_PIN, _state.ledOn ? LED_ON : LED_OFF); + // digitalWrite(LED_PIN, _state.ledOn ? LED_ON : LED_OFF); } void RgbStateService::registerConfig() { diff --git a/src/RgbStateService.h b/src/RgbStateService.h index 1445925..8138669 100644 --- a/src/RgbStateService.h +++ b/src/RgbStateService.h @@ -57,6 +57,15 @@ class RgbState { int red = root["red_value"] | DEFAULT_RED_VALUE; int green = root["green_value"] | DEFAULT_GREEN_VALUE; int blue = root["blue_value"] | DEFAULT_BLUE_VALUE; + Serial.println('update called: '); + Serial.print('red: '); + Serial.println(red); + Serial.print('green: '); + Serial.println(green); + Serial.print('blue: '); + Serial.println(blue); + Serial.print('on state: '); + Serial.println(newState); if (red != lightState.redValue || green != lightState.greenValue || blue != lightState.blueValue) { lightState.redValue = red; From 233d65ab6d50b577e8db35030340e26a2bd14542 Mon Sep 17 00:00:00 2001 From: janis Date: Tue, 8 Dec 2020 20:52:06 +0200 Subject: [PATCH 17/36] Blue color bug fix --- .../project/RgbStateWebSocketController.tsx | 2 +- interface/src/project/types.ts | 14 +++--- src/RgbStateService.cpp | 8 ---- src/RgbStateService.h | 44 +++++-------------- 4 files changed, 18 insertions(+), 50 deletions(-) diff --git a/interface/src/project/RgbStateWebSocketController.tsx b/interface/src/project/RgbStateWebSocketController.tsx index 5ad95fe..2fa990b 100644 --- a/interface/src/project/RgbStateWebSocketController.tsx +++ b/interface/src/project/RgbStateWebSocketController.tsx @@ -44,7 +44,7 @@ function RgbStateWebSocketControllerForm(props: RgbStateWebSocketControllerFormP led_on: event.target.checked, red_value: data.red_value, green_value: data.green_value, - Blue_value: data.Blue_value + blue_value: data.blue_value }, saveData); } diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts index 3c0eb28..c44cda3 100644 --- a/interface/src/project/types.ts +++ b/interface/src/project/types.ts @@ -2,15 +2,15 @@ export interface LightState { led_on: boolean; } -export interface LightMqttSettings { - unique_id : string; +export interface LightMqttSettings { + unique_id: string; name: string; - mqtt_path : string; + mqtt_path: string; } export interface RgbState { - led_on : boolean; - red_value : number; - green_value : number; - Blue_value : number; + led_on: boolean; + red_value: number; + green_value: number; + blue_value: number; } \ No newline at end of file diff --git a/src/RgbStateService.cpp b/src/RgbStateService.cpp index 0052dbd..9abd863 100644 --- a/src/RgbStateService.cpp +++ b/src/RgbStateService.cpp @@ -29,14 +29,6 @@ void RgbStateService::begin() { void RgbStateService::onConfigUpdated() { Serial.println("onConfigUpdated called .."); - // Serial.println(_state.ledOn); - // Serial.print("red"); - // Serial.println(_state.redValue); - // Serial.print("green"); - // Serial.println(_state.greenValue); - // Serial.print("blue"); - // Serial.println(_state.blueValue); - // digitalWrite(LED_PIN, _state.ledOn ? LED_ON : LED_OFF); } void RgbStateService::registerConfig() { diff --git a/src/RgbStateService.h b/src/RgbStateService.h index 8138669..e2072b7 100644 --- a/src/RgbStateService.h +++ b/src/RgbStateService.h @@ -41,6 +41,7 @@ class RgbState { uint8_t blueValue; CRGB leds[NUM_LEDS]; + // Class constructor RgbState() { FastLED.addLeds(leds, NUM_LEDS); } @@ -57,14 +58,15 @@ class RgbState { int red = root["red_value"] | DEFAULT_RED_VALUE; int green = root["green_value"] | DEFAULT_GREEN_VALUE; int blue = root["blue_value"] | DEFAULT_BLUE_VALUE; - Serial.println('update called: '); - Serial.print('red: '); - Serial.println(red); - Serial.print('green: '); - Serial.println(green); - Serial.print('blue: '); - Serial.println(blue); - Serial.print('on state: '); + + Serial.print("update called: "); + Serial.print("red: "); + Serial.print(red); + Serial.print("green: "); + Serial.print(green); + Serial.print("blue: "); + Serial.print(blue); + Serial.print("on state: "); Serial.println(newState); if (red != lightState.redValue || green != lightState.greenValue || blue != lightState.blueValue) { @@ -77,11 +79,6 @@ class RgbState { } if (lightState.ledOn != newState) { - Serial.print("old state : "); - Serial.println(lightState.ledOn); - Serial.print("new state : "); - Serial.println(newState); - if (lightState.ledOn) { lightState.leds[0].setRGB(0, 0, 0); FastLED.show(); @@ -95,27 +92,6 @@ class RgbState { return StateUpdateResult::UNCHANGED; } - static void haRead(RgbState& settings, JsonObject& root) { - root["state"] = settings.ledOn ? ON_STATE : OFF_STATE; - } - - static StateUpdateResult haUpdate(JsonObject& root, RgbState& lightState) { - String state = root["state"]; - // parse new led state - boolean newState = false; - if (state.equals(ON_STATE)) { - newState = true; - } else if (!state.equals(OFF_STATE)) { - return StateUpdateResult::ERROR; - } - // change the new state, if required - if (lightState.ledOn != newState) { - lightState.ledOn = newState; - return StateUpdateResult::CHANGED; - } - return StateUpdateResult::UNCHANGED; - } - RgbState updateRgbDriver() { leds[0].setRGB(this->redValue, this->greenValue, this->blueValue); FastLED.show(); From e590ae3e18f54ea24b154deb3a57a18607af98d0 Mon Sep 17 00:00:00 2001 From: janis Date: Tue, 8 Dec 2020 21:39:37 +0200 Subject: [PATCH 18/36] File system initializing --- src/RgbStateService.cpp | 9 +++++++-- src/RgbStateService.h | 6 +++++- src/main.cpp | 12 ++++-------- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/RgbStateService.cpp b/src/RgbStateService.cpp index 86c2247..9f37e97 100644 --- a/src/RgbStateService.cpp +++ b/src/RgbStateService.cpp @@ -1,6 +1,6 @@ #include -RgbStateService::RgbStateService(AsyncWebServer* server,SecurityManager* securityManager) : +RgbStateService::RgbStateService(AsyncWebServer* server, SecurityManager* securityManager, FS* fs) : _httpEndpoint(RgbState::read, RgbState::update, this, @@ -14,7 +14,12 @@ RgbStateService::RgbStateService(AsyncWebServer* server,SecurityManager* securit server, RGB_SETTINGS_SOCKET_PATH, securityManager, - AuthenticationPredicates::IS_AUTHENTICATED) { + AuthenticationPredicates::IS_AUTHENTICATED), + _fsPersistence(RgbState::read, + RgbState::update, + this, + fs, + "/config/RgbState.json") { // configure led to be output pinMode(LED_PIN, OUTPUT); diff --git a/src/RgbStateService.h b/src/RgbStateService.h index dfcaaab..b010f51 100644 --- a/src/RgbStateService.h +++ b/src/RgbStateService.h @@ -3,6 +3,8 @@ #include #include +#include +#include #define LED_PIN 2 #define PRINT_DELAY 5000 @@ -68,12 +70,14 @@ class RgbState { class RgbStateService : public StatefulService { public: - RgbStateService(AsyncWebServer* server, SecurityManager* securityManager); + RgbStateService(AsyncWebServer* server, SecurityManager* securityManager, FS* fs); + void begin(); private: HttpEndpoint _httpEndpoint; WebSocketTxRx _webSocket; + FSPersistence _fsPersistence; void registerConfig(); void onConfigUpdated(); diff --git a/src/main.cpp b/src/main.cpp index 6c72025..8e693e7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,15 +6,11 @@ AsyncWebServer server(80); ESP8266React esp8266React(&server); -// LightMqttSettingsService lightMqttSettingsService = -// LightMqttSettingsService(&server, esp8266React.getFS(), esp8266React.getSecurityManager()); +RgbStateService rgbStateService = RgbStateService(&server, esp8266React.getSecurityManager(), esp8266React.getFS()); -// LightStateService lightStateService = LightStateService(&server, -// esp8266React.getSecurityManager(), -// esp8266React.getMqttClient(), -// &lightMqttSettingsService); - -RgbStateService rgbStateService = RgbStateService(&server, esp8266React.getSecurityManager()); +// update_handler_id_t updateHandler = rgbStateService.addUpdateHandler([&](const String& originId) { +// Serial.print("The light's state has been updated by: "); +// Serial.println(originId); void setup() { From 08fbe957c224e9f6c74dc2b23951e6cbb0e01bd9 Mon Sep 17 00:00:00 2001 From: janis Date: Wed, 9 Dec 2020 19:40:57 +0200 Subject: [PATCH 19/36] wip.. --- src/RgbStateService.h | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/src/RgbStateService.h b/src/RgbStateService.h index b010f51..ac81096 100644 --- a/src/RgbStateService.h +++ b/src/RgbStateService.h @@ -33,11 +33,11 @@ class RgbState { uint8_t GreenBrightness = 255; uint8_t BlueBrightness = 255; - static void read(RgbState& settings, JsonObject& root) { + static void read(RgbState& settings, JsonObject& root, FS& fileSystem) { root["led_on"] = settings.ledOn; } - static StateUpdateResult update(JsonObject& root, RgbState& lightState) { + static StateUpdateResult update(JsonObject& root, RgbState& lightState, FS& fileSystem) { boolean newState = root["led_on"] | DEFAULT_LED_STATE; if (lightState.ledOn != newState) { lightState.ledOn = newState; @@ -45,27 +45,6 @@ class RgbState { } return StateUpdateResult::UNCHANGED; } - - static void haRead(RgbState& settings, JsonObject& root) { - root["state"] = settings.ledOn ? ON_STATE : OFF_STATE; - } - - static StateUpdateResult haUpdate(JsonObject& root, RgbState& lightState) { - String state = root["state"]; - // parse new led state - boolean newState = false; - if (state.equals(ON_STATE)) { - newState = true; - } else if (!state.equals(OFF_STATE)) { - return StateUpdateResult::ERROR; - } - // change the new state, if required - if (lightState.ledOn != newState) { - lightState.ledOn = newState; - return StateUpdateResult::CHANGED; - } - return StateUpdateResult::UNCHANGED; - } }; class RgbStateService : public StatefulService { From c255e0f783c4305d5ebc28179dc17c6a2b039ea8 Mon Sep 17 00:00:00 2001 From: janis Date: Wed, 9 Dec 2020 22:17:15 +0200 Subject: [PATCH 20/36] RGB state is saved in file system persistence. --- .gitignore | 1 + lib/framework/FSPersistence.h | 8 ++++++++ src/RgbStateService.cpp | 3 ++- src/RgbStateService.h | 18 +++++------------- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index facc712..6770efa 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ /interface/build /interface/node_modules .vscode +*.json diff --git a/lib/framework/FSPersistence.h b/lib/framework/FSPersistence.h index 9fc547b..3e369a1 100644 --- a/lib/framework/FSPersistence.h +++ b/lib/framework/FSPersistence.h @@ -24,6 +24,7 @@ class FSPersistence { } void readFromFS() { + Serial.println("FS read called.."); File settingsFile = _fs->open(_filePath, "r"); if (settingsFile) { @@ -57,7 +58,14 @@ class FSPersistence { return false; } + char buffer[1000]; + + Serial.println("FS write called"); + serializeJsonPretty(jsonDocument, buffer); + Serial.println(buffer); + // serialize the data to the file + serializeJson(jsonDocument, settingsFile); settingsFile.close(); return true; diff --git a/src/RgbStateService.cpp b/src/RgbStateService.cpp index ae4de9f..f39e23b 100644 --- a/src/RgbStateService.cpp +++ b/src/RgbStateService.cpp @@ -28,12 +28,13 @@ RgbStateService::RgbStateService(AsyncWebServer* server, SecurityManager* securi } void RgbStateService::begin() { - _state.ledOn = DEFAULT_LED_STATE; onConfigUpdated(); } void RgbStateService::onConfigUpdated() { Serial.println("onConfigUpdated called .."); + _fsPersistence.readFromFS(); + } void RgbStateService::registerConfig() { diff --git a/src/RgbStateService.h b/src/RgbStateService.h index d85176e..33d3f1b 100644 --- a/src/RgbStateService.h +++ b/src/RgbStateService.h @@ -9,7 +9,7 @@ #define LED_PIN 2 #define PRINT_DELAY 5000 -#define DEFAULT_LED_STATE false +#define DEFAULT_LED_STATE true #define DEFAULT_RED_VALUE 255 #define DEFAULT_GREEN_VALUE 210 #define DEFAULT_BLUE_VALUE 45 @@ -47,29 +47,21 @@ class RgbState { FastLED.addLeds(leds, NUM_LEDS); } - static void read(RgbState& settings, JsonObject& root, FS& fileSystem) { + static void read(RgbState& settings, JsonObject& root) { + Serial.println("RgbStateService update called.."); root["led_on"] = settings.ledOn; root["red_value"] = settings.redValue; root["green_value"] = settings.greenValue; root["blue_value"] = settings.blueValue; + settings.updateRgbDriver(); } - static StateUpdateResult update(JsonObject& root, RgbState& lightState, FS& fileSystem) { + static StateUpdateResult update(JsonObject& root, RgbState& lightState) { boolean newState = root["led_on"] | DEFAULT_LED_STATE; int red = root["red_value"] | DEFAULT_RED_VALUE; int green = root["green_value"] | DEFAULT_GREEN_VALUE; int blue = root["blue_value"] | DEFAULT_BLUE_VALUE; - Serial.print("update called: "); - Serial.print("red: "); - Serial.print(red); - Serial.print("green: "); - Serial.print(green); - Serial.print("blue: "); - Serial.print(blue); - Serial.print("on state: "); - Serial.println(newState); - if (red != lightState.redValue || green != lightState.greenValue || blue != lightState.blueValue) { lightState.redValue = red; lightState.greenValue = green; From 87f3139945148f69b446e8e97c3d66aaed841824 Mon Sep 17 00:00:00 2001 From: janis Date: Mon, 14 Dec 2020 19:32:52 +0200 Subject: [PATCH 21/36] wip.. --- .../src/components/WebSocketFormLoader.tsx | 2 +- interface/src/project/AquariumController.tsx | 3 + .../src/project/RgbSettingsController.tsx | 47 ++++++ .../project/RgbStateWebSocketController.tsx | 8 +- .../src/project/components/RgbSettings.js | 144 +----------------- interface/src/project/types.ts | 13 ++ src/RgbStateService.h | 13 +- 7 files changed, 76 insertions(+), 154 deletions(-) create mode 100644 interface/src/project/RgbSettingsController.tsx diff --git a/interface/src/components/WebSocketFormLoader.tsx b/interface/src/components/WebSocketFormLoader.tsx index ee5f335..83a7d1f 100644 --- a/interface/src/components/WebSocketFormLoader.tsx +++ b/interface/src/components/WebSocketFormLoader.tsx @@ -37,4 +37,4 @@ export default function WebSocketFormLoader(props: WebSocketFormLoaderProps { @@ -22,10 +23,12 @@ class AquariumController extends Component { + + diff --git a/interface/src/project/RgbSettingsController.tsx b/interface/src/project/RgbSettingsController.tsx new file mode 100644 index 0000000..9ba6543 --- /dev/null +++ b/interface/src/project/RgbSettingsController.tsx @@ -0,0 +1,47 @@ +import React, { Component } from 'react'; +import { ValidatorForm } from 'react-material-ui-form-validator'; + +import { Typography, Box, Switch } from '@material-ui/core'; +import { WEB_SOCKET_ROOT } from '../api'; +import { WebSocketControllerProps, WebSocketFormLoader, WebSocketFormProps, webSocketController } from '../components'; +import { SectionContent, BlockFormControlLabel } from '../components'; +import RgbSettings from './components/RgbSettings'; + +import { RgbOptions } from './types'; + +export const RGB_SETTINGS_WEBSOCKET_URL = WEB_SOCKET_ROOT + "rgbOptions"; + +type RgbStateWebSocketControllerProps = WebSocketControllerProps; + +class RgbStateWebSocketController extends Component { + + render() { + return ( + + ( + + )} + /> + + ) + } +} + +export default webSocketController(RGB_SETTINGS_WEBSOCKET_URL, 100, RgbStateWebSocketController); + +type RgbStateWebSocketControllerFormProps = WebSocketFormProps; + +function RgbStateWebSocketControllerForm(props: RgbStateWebSocketControllerFormProps) { + + const { data, saveData, setData } = props; + + return ( + + ); +} \ No newline at end of file diff --git a/interface/src/project/RgbStateWebSocketController.tsx b/interface/src/project/RgbStateWebSocketController.tsx index 2fa990b..cf67a7f 100644 --- a/interface/src/project/RgbStateWebSocketController.tsx +++ b/interface/src/project/RgbStateWebSocketController.tsx @@ -6,7 +6,6 @@ import { WEB_SOCKET_ROOT } from '../api'; import { WebSocketControllerProps, WebSocketFormLoader, WebSocketFormProps, webSocketController } from '../components'; import { SectionContent, BlockFormControlLabel } from '../components'; import RgbSlider from './components/RgbSlider'; -import RgbSettings from './components/RgbSettings'; import { RgbState } from './types'; @@ -48,7 +47,7 @@ function RgbStateWebSocketControllerForm(props: RgbStateWebSocketControllerFormP }, saveData); } - + console.log(data); return ( @@ -71,11 +70,6 @@ function RgbStateWebSocketControllerForm(props: RgbStateWebSocketControllerFormP saveDataHandler={saveData} data={data} /> - ); } \ No newline at end of file diff --git a/interface/src/project/components/RgbSettings.js b/interface/src/project/components/RgbSettings.js index 855a01f..67c2ef1 100644 --- a/interface/src/project/components/RgbSettings.js +++ b/interface/src/project/components/RgbSettings.js @@ -19,23 +19,9 @@ export default ({ setDataHandler, saveDataHandler, data }) => { chart: { type: 'spline', zoomType: 'x', - panning: true, + // panning: true, events: { load: function () { - // this.xAxis[0].setExtremes(Date.UTC(2020, 0, 1, 9, 0, 0), Date.UTC(2020, 0, 1, 22, 0, 0)); - - // set up the updating of the chart each second - // var series = this.series[0]; - - // for (let i = Date.UTC(2020, 0, 1, 0, 0, 0); i <= Date.UTC(2020, 0, 2, 0, 0, 0); i += 3600 * 500) { - - // series.addPoint([Date(i), 100], true, true); - // } - - // var x = (new Date()).getTime(), // current time - // y = Math.round(Math.random() * 100); - // series.addPoint([x, y], true, true); - } } }, @@ -117,10 +103,6 @@ export default ({ setDataHandler, saveDataHandler, data }) => { valueDecimals: 0, followTouchMove: false, pointFormat: '{series.name}: {point.y}
', - // headerFormat: '', - // dateTimeLabelFormats: { - // day: '%H:%M' - // } }, series: [ @@ -134,9 +116,6 @@ export default ({ setDataHandler, saveDataHandler, data }) => { dragMinY: 0, }, visible: true, - // tooltip: { - // pointFormat: '' - // }, data: (function () { var data = [] @@ -187,124 +166,10 @@ export default ({ setDataHandler, saveDataHandler, data }) => { }()) } ] - - // chart: { - // type: 'spline', - // zoomType: 'x', - // panning: true, - // panKey: 'shift', - // events: { - // load: function () { - // this.xAxis[0].setExtremes(Date.UTC(2020, 0, 1, 9, 0, 0), Date.UTC(2020, 0, 1, 22, 0, 0)); - // } - // } - // }, - - // tooltip: { - // followTouchMove: false - // }, - // credits: { - // text: '© Janis Davidsons', - // href: '' - // }, - // yAxis: { - // dragMaxY: 255, - - // min: 0, - // max: 255 - // }, - // xAxis: { - // min: Date.UTC(2020, 0, 1, 0, 0, 0), - // max: Date.UTC(2020, 0, 2, 0, 0, 0), - // type: 'datetime', - // tickPositioner: function () { - - // var info = this.tickPositions.info; - // var positions = []; - // for (let i = Date.UTC(2020, 0, 1, 0, 0, 0); i <= Date.UTC(2020, 0, 2, 0, 0, 0); i += 3600 * 500) { - // positions.push(i); - // } - // positions.info = info; - // return positions; - // }, - // lineWidth: 1, - // dateTimeLabelFormats: { - // day: '%H:%M' - // }, - // title: { - // enabled: false - // }, - // labels: { - // rotation: -45, - // style: { - // fontSize: '13px', - // fontFamily: 'Verdana, sans-serif' - // } - // } - // }, - - // series: [ - // { - // name: "Red", - // color: "red", - // dragDrop: { - // draggableY: true, - // dragMaxY: 255, - // dragMinY: 0 - // }, - // data: (function () { - // var positions = []; - // for (let i = Date.UTC(2020, 0, 1, 0, 0, 0); i <= Date.UTC(2020, 0, 2, 0, 0, 0); i += 3600 * 500) { - // positions.push({ - // y: 46, - // x: i, - // }); - // } - // return positions; - // }()) - // }, - // { - // name: "Green", - // color: "green", - // dragDrop: { - // draggableY: false, - // dragMaxY: 255, - // dragMinY: 0 - // }, - // data: (function () { - // var positions = []; - // for (let i = Date.UTC(2020, 0, 1, 0, 0, 0); i <= Date.UTC(2020, 0, 2, 0, 0, 0); i += 3600 * 500) { - // positions.push({ - // y: 146, - // x: i, - // }); - // } - // return positions; - // }()) - // }, - // { - // name: "Blue", - // color: "blue", - // dragDrop: { - // draggableY: false, - // dragMaxY: 255, - // dragMinY: 0 - // }, - // data: (function () { - // var positions = []; - // for (let i = Date.UTC(2020, 0, 1, 0, 0, 0); i <= Date.UTC(2020, 0, 2, 0, 0, 0); i += 3600 * 500) { - // positions.push({ - // y: 83, - // x: i, - // }); - // } - // return positions; - // }()) - // }, - // ] }) const handleSubmit = () => { + setDataHandler(options.series, saveDataHandler) console.log('rgb setting: ', options.series[0].data) } @@ -364,7 +229,4 @@ export default ({ setDataHandler, saveDataHandler, data }) => { ); -} -// export default RgbSettings; - -// render(, document.getElementById("root")); +} \ No newline at end of file diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts index c44cda3..a47a94e 100644 --- a/interface/src/project/types.ts +++ b/interface/src/project/types.ts @@ -13,4 +13,17 @@ export interface RgbState { red_value: number; green_value: number; blue_value: number; +} + +interface Series { + name:string, + color:string, + type:string, + dragDrop: object, + visible:boolean, + data: [][] +} + +export interface RgbOptions { + series: Series[] } \ No newline at end of file diff --git a/src/RgbStateService.h b/src/RgbStateService.h index 33d3f1b..c228a28 100644 --- a/src/RgbStateService.h +++ b/src/RgbStateService.h @@ -48,12 +48,11 @@ class RgbState { } static void read(RgbState& settings, JsonObject& root) { - Serial.println("RgbStateService update called.."); + Serial.println("RgbStateService read called.."); root["led_on"] = settings.ledOn; root["red_value"] = settings.redValue; root["green_value"] = settings.greenValue; root["blue_value"] = settings.blueValue; - settings.updateRgbDriver(); } static StateUpdateResult update(JsonObject& root, RgbState& lightState) { @@ -73,8 +72,7 @@ class RgbState { if (lightState.ledOn != newState) { if (lightState.ledOn) { - lightState.leds[0].setRGB(0, 0, 0); - FastLED.show(); + lightState.updateRgbDriver(true); lightState.ledOn = newState; return StateUpdateResult::CHANGED; } @@ -85,7 +83,12 @@ class RgbState { return StateUpdateResult::UNCHANGED; } - RgbState updateRgbDriver() { + void updateRgbDriver(bool turnOff = false) { + if (turnOff) { + leds[0].fadeToBlackBy(255); + FastLED.show(); + return; + } leds[0].setRGB(this->redValue, this->greenValue, this->blueValue); FastLED.show(); } From f95152780f29a3b9b93360bb041f23cc5db9f73b Mon Sep 17 00:00:00 2001 From: janis Date: Tue, 15 Dec 2020 20:38:07 +0200 Subject: [PATCH 22/36] On state file persistence bug fix --- lib/framework/FSPersistence.h | 10 ++++-- src/RgbStateService.cpp | 8 +++-- src/RgbStateService.h | 67 +++++++++++++++++++++-------------- 3 files changed, 53 insertions(+), 32 deletions(-) diff --git a/lib/framework/FSPersistence.h b/lib/framework/FSPersistence.h index 3e369a1..30a9906 100644 --- a/lib/framework/FSPersistence.h +++ b/lib/framework/FSPersistence.h @@ -24,7 +24,6 @@ class FSPersistence { } void readFromFS() { - Serial.println("FS read called.."); File settingsFile = _fs->open(_filePath, "r"); if (settingsFile) { @@ -32,6 +31,13 @@ class FSPersistence { DeserializationError error = deserializeJson(jsonDocument, settingsFile); if (error == DeserializationError::Ok && jsonDocument.is()) { JsonObject jsonObject = jsonDocument.as(); + + char buffer[1000]; + + Serial.println("FS read called"); + serializeJsonPretty(jsonDocument, buffer); + Serial.println(buffer); + _statefulService->updateWithoutPropagation(jsonObject, _stateUpdater); settingsFile.close(); return; @@ -65,7 +71,7 @@ class FSPersistence { Serial.println(buffer); // serialize the data to the file - + serializeJson(jsonDocument, settingsFile); settingsFile.close(); return true; diff --git a/src/RgbStateService.cpp b/src/RgbStateService.cpp index f39e23b..c7ceb1c 100644 --- a/src/RgbStateService.cpp +++ b/src/RgbStateService.cpp @@ -21,19 +21,21 @@ RgbStateService::RgbStateService(AsyncWebServer* server, SecurityManager* securi fs, "/config/RgbState.json") { // configure led to be output - pinMode(LED_PIN, OUTPUT); + // pinMode(LED_PIN, OUTPUT); // configure settings service update handler to update LED state addUpdateHandler([&](const String& originId) { onConfigUpdated(); }, false); } void RgbStateService::begin() { - onConfigUpdated(); + Serial.println("RgbStateService begin called.."); + // onConfigUpdated(); + _fsPersistence.readFromFS(); } void RgbStateService::onConfigUpdated() { Serial.println("onConfigUpdated called .."); - _fsPersistence.readFromFS(); + } diff --git a/src/RgbStateService.h b/src/RgbStateService.h index c228a28..b7a0b3c 100644 --- a/src/RgbStateService.h +++ b/src/RgbStateService.h @@ -9,7 +9,7 @@ #define LED_PIN 2 #define PRINT_DELAY 5000 -#define DEFAULT_LED_STATE true +#define DEFAULT_LED_STATE false #define DEFAULT_RED_VALUE 255 #define DEFAULT_GREEN_VALUE 210 #define DEFAULT_BLUE_VALUE 45 @@ -36,10 +36,10 @@ class RgbState { public: - bool ledOn; - uint8_t redValue; - uint8_t greenValue; - uint8_t blueValue; + bool led_on; + uint8_t red_value; + uint8_t green_value; + uint8_t blue_value; CRGB leds[NUM_LEDS]; // Class constructor @@ -48,48 +48,61 @@ class RgbState { } static void read(RgbState& settings, JsonObject& root) { - Serial.println("RgbStateService read called.."); - root["led_on"] = settings.ledOn; - root["red_value"] = settings.redValue; - root["green_value"] = settings.greenValue; - root["blue_value"] = settings.blueValue; + root["led_on"] = settings.led_on; + root["red_value"] = settings.red_value; + root["green_value"] = settings.green_value; + root["blue_value"] = settings.blue_value; } static StateUpdateResult update(JsonObject& root, RgbState& lightState) { + boolean newState = root["led_on"] | DEFAULT_LED_STATE; int red = root["red_value"] | DEFAULT_RED_VALUE; int green = root["green_value"] | DEFAULT_GREEN_VALUE; int blue = root["blue_value"] | DEFAULT_BLUE_VALUE; - if (red != lightState.redValue || green != lightState.greenValue || blue != lightState.blueValue) { - lightState.redValue = red; - lightState.greenValue = green; - lightState.blueValue = blue; - lightState.updateRgbDriver(); + bool onValueChanged = lightState.checkLightOnValue(newState); + bool rgbValueChanged = lightState.checkRgbValues(red, green, blue); + if (onValueChanged || rgbValueChanged) { return StateUpdateResult::CHANGED; } + return StateUpdateResult::UNCHANGED; + } - if (lightState.ledOn != newState) { - if (lightState.ledOn) { - lightState.updateRgbDriver(true); - lightState.ledOn = newState; - return StateUpdateResult::CHANGED; + bool checkRgbValues(int red, int green, int blue) { + if (red != this->red_value || green != this->green_value || blue != this->blue_value) { + this->red_value = red; + this->green_value = green; + this->blue_value = blue; + this->updateRgbDriver(); + return true; + } + return false; + } + + bool checkLightOnValue(bool onValue) { + if (this->led_on != onValue) { + + if (this->led_on) { + this->updateRgbDriver(true); + this->led_on = false; + return true; } - lightState.updateRgbDriver(); - lightState.ledOn = newState; - return StateUpdateResult::CHANGED; + this->updateRgbDriver(); + this->led_on = true; + return true; } - return StateUpdateResult::UNCHANGED; + return false; } void updateRgbDriver(bool turnOff = false) { if (turnOff) { - leds[0].fadeToBlackBy(255); - FastLED.show(); + leds[0].fadeToBlackBy(255); + FastLED.show(); return; } - leds[0].setRGB(this->redValue, this->greenValue, this->blueValue); + leds[0].setRGB(this->red_value, this->green_value, this->blue_value); FastLED.show(); } }; From b53c7a98c862496713ecc121739801acd490dc65 Mon Sep 17 00:00:00 2001 From: janis Date: Wed, 16 Dec 2020 19:14:35 +0200 Subject: [PATCH 23/36] wip.. --- .../src/project/RgbSettingsController.tsx | 2 +- src/RgbCycleService.cpp | 30 +++++++++ src/RgbCycleService.h | 64 +++++++++++++++++++ src/RgbStateService.cpp | 3 - src/RgbStateService.h | 16 +++-- src/main.cpp | 5 +- 6 files changed, 111 insertions(+), 9 deletions(-) create mode 100644 src/RgbCycleService.cpp create mode 100644 src/RgbCycleService.h diff --git a/interface/src/project/RgbSettingsController.tsx b/interface/src/project/RgbSettingsController.tsx index 9ba6543..29beae7 100644 --- a/interface/src/project/RgbSettingsController.tsx +++ b/interface/src/project/RgbSettingsController.tsx @@ -9,7 +9,7 @@ import RgbSettings from './components/RgbSettings'; import { RgbOptions } from './types'; -export const RGB_SETTINGS_WEBSOCKET_URL = WEB_SOCKET_ROOT + "rgbOptions"; +export const RGB_SETTINGS_WEBSOCKET_URL = WEB_SOCKET_ROOT + "rgbCycle"; type RgbStateWebSocketControllerProps = WebSocketControllerProps; diff --git a/src/RgbCycleService.cpp b/src/RgbCycleService.cpp new file mode 100644 index 0000000..6da03f5 --- /dev/null +++ b/src/RgbCycleService.cpp @@ -0,0 +1,30 @@ +#include + +RgbCycleService::RgbCycleService(AsyncWebServer* server, SecurityManager* securityManager, FS* fs) : + _httpEndpoint(RgbCycleState::read, + RgbCycleState::update, + this, + server, + RGB_CYCLE_ENDPOINT_PATH, + securityManager, + AuthenticationPredicates::IS_AUTHENTICATED), + _webSocket(RgbCycleState::read, + RgbCycleState::update, + this, + server, + RGB_CYCLE_SOCKET_PATH, + securityManager, + AuthenticationPredicates::IS_AUTHENTICATED), + _fsPersistence(RgbCycleState::read, + RgbCycleState::update, + this, + fs, + "/config/RgbState.json") { + + // add event listener for rgbCycle Object + //addUpdateHandler([&](const String& originId) { onConfigUpdated(); }, false); +} + +void RgbCycleService::begin(){ + _fsPersistence.readFromFS(); +} \ No newline at end of file diff --git a/src/RgbCycleService.h b/src/RgbCycleService.h new file mode 100644 index 0000000..9da22ab --- /dev/null +++ b/src/RgbCycleService.h @@ -0,0 +1,64 @@ +#ifndef RgbCycleService_h +#define RgbCycleService_h + +#include +#include +#include +#include + +#ifdef ESP32 +#define LED_ON 0x1 +#define LED_OFF 0x0 +#elif defined(ESP8266) +#define LED_ON 0x0 +#define LED_OFF 0x1 + +#define NUM_LEDS 1 +#define CLOCK_PIN 14 // D5 +#define DATA_PIN 12 // D6 + +#endif + +#define RGB_CYCLE_ENDPOINT_PATH "/rest/rgbCycle" +#define RGB_CYCLE_SOCKET_PATH "/ws/rgbCycle" + +class RgbCycleState { + public: + bool test; + + CRGB leds[NUM_LEDS]; + + // Class constructor + RgbCycleState() { + FastLED.addLeds(leds, NUM_LEDS); + } + + static void read(RgbCycleState& settings, JsonObject& root) { + + } + + static StateUpdateResult update(JsonObject& root, RgbCycleState& rgbCycleState) { + + Serial.println("Rgb cycle update..."); + Serial.println(root); + + + return StateUpdateResult::CHANGED; + } +}; + +class RgbCycleService : public StatefulService { + public: + RgbCycleService(AsyncWebServer* server, SecurityManager* securityManager, FS* fs); + + void begin(); + + private: + HttpEndpoint _httpEndpoint; + WebSocketTxRx _webSocket; + FSPersistence _fsPersistence; + + void registerConfig(); + void onConfigUpdated(); +}; +#endif \ No newline at end of file diff --git a/src/RgbStateService.cpp b/src/RgbStateService.cpp index c7ceb1c..0d0f752 100644 --- a/src/RgbStateService.cpp +++ b/src/RgbStateService.cpp @@ -28,15 +28,12 @@ RgbStateService::RgbStateService(AsyncWebServer* server, SecurityManager* securi } void RgbStateService::begin() { - Serial.println("RgbStateService begin called.."); // onConfigUpdated(); _fsPersistence.readFromFS(); } void RgbStateService::onConfigUpdated() { Serial.println("onConfigUpdated called .."); - - } void RgbStateService::registerConfig() { diff --git a/src/RgbStateService.h b/src/RgbStateService.h index b7a0b3c..4739730 100644 --- a/src/RgbStateService.h +++ b/src/RgbStateService.h @@ -55,7 +55,6 @@ class RgbState { } static StateUpdateResult update(JsonObject& root, RgbState& lightState) { - boolean newState = root["led_on"] | DEFAULT_LED_STATE; int red = root["red_value"] | DEFAULT_RED_VALUE; int green = root["green_value"] | DEFAULT_GREEN_VALUE; @@ -72,6 +71,7 @@ class RgbState { bool checkRgbValues(int red, int green, int blue) { if (red != this->red_value || green != this->green_value || blue != this->blue_value) { + Serial.println("rgb value not the same.."); this->red_value = red; this->green_value = green; this->blue_value = blue; @@ -83,25 +83,33 @@ class RgbState { bool checkLightOnValue(bool onValue) { if (this->led_on != onValue) { - + Serial.println("on state is not the same..."); if (this->led_on) { - this->updateRgbDriver(true); this->led_on = false; + this->updateRgbDriver(true); return true; } - this->updateRgbDriver(); this->led_on = true; + this->updateRgbDriver(); return true; } return false; } void updateRgbDriver(bool turnOff = false) { + Serial.println("rgb driver should update.."); + Serial.println(this->led_on); + Serial.println(this->red_value); + Serial.println(this->green_value); + Serial.println(this->blue_value); + if (turnOff) { + Serial.println("driver - turn off"); leds[0].fadeToBlackBy(255); FastLED.show(); return; } + Serial.println("driver - change color"); leds[0].setRGB(this->red_value, this->green_value, this->blue_value); FastLED.show(); } diff --git a/src/main.cpp b/src/main.cpp index 59e5793..3178858 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,5 +1,6 @@ #include #include +#include #define SERIAL_BAUD_RATE 115200 @@ -7,6 +8,7 @@ AsyncWebServer server(80); ESP8266React esp8266React(&server); RgbStateService rgbStateService = RgbStateService(&server, esp8266React.getSecurityManager(), esp8266React.getFS()); +RgbCycleService rgbCycleService = RgbCycleService(&server, esp8266React.getSecurityManager(), esp8266React.getFS()); // update_handler_id_t updateHandler = rgbStateService.addUpdateHandler([&](const String& originId) { // Serial.print("The light's state has been updated by: "); @@ -22,8 +24,9 @@ void setup() { // start the framework and demo project esp8266React.begin(); - // load the initial light settings + // load the initial RGB object rgbStateService.begin(); + rgbCycleService.begin(); // start the server server.begin(); From 4ee913c6c8256e89c8a1e8b51a00e227a50bae23 Mon Sep 17 00:00:00 2001 From: janis Date: Tue, 22 Dec 2020 19:22:38 +0200 Subject: [PATCH 24/36] wip.. --- src/RgbStateService.h | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/RgbStateService.h b/src/RgbStateService.h index 4739730..372b244 100644 --- a/src/RgbStateService.h +++ b/src/RgbStateService.h @@ -81,27 +81,36 @@ class RgbState { return false; } + + return StateUpdateResult::UNCHANGED; + } + + bool checkRgbValues(int red, int green, int blue) { + if (red != redValue || green != greenValue || blue != blueValue) { + redValue = red; + greenValue = green; + blueValue = blue; + updateRgbDriver(); + return true; + } + return false; + } + bool checkLightOnValue(bool onValue) { - if (this->led_on != onValue) { - Serial.println("on state is not the same..."); - if (this->led_on) { - this->led_on = false; - this->updateRgbDriver(true); + if (ledOn != onValue) { + if (ledOn) { + ledOn = false; + updateRgbDriver(true); return true; } - this->led_on = true; - this->updateRgbDriver(); + ledOn = true; + updateRgbDriver(); return true; } return false; } void updateRgbDriver(bool turnOff = false) { - Serial.println("rgb driver should update.."); - Serial.println(this->led_on); - Serial.println(this->red_value); - Serial.println(this->green_value); - Serial.println(this->blue_value); if (turnOff) { Serial.println("driver - turn off"); @@ -110,7 +119,7 @@ class RgbState { return; } Serial.println("driver - change color"); - leds[0].setRGB(this->red_value, this->green_value, this->blue_value); + leds[0].setRGB(this->redValue, this->greenValue, this->blueValue); FastLED.show(); } }; From 479cbdafe0609dee05bea2dd5c18cff7eb1a4ec2 Mon Sep 17 00:00:00 2001 From: janis Date: Tue, 22 Dec 2020 19:33:26 +0200 Subject: [PATCH 25/36] wip.. --- src/RgbStateService.h | 35 +++++++++++------------------------ src/main.cpp | 4 ++-- 2 files changed, 13 insertions(+), 26 deletions(-) diff --git a/src/RgbStateService.h b/src/RgbStateService.h index 372b244..a340617 100644 --- a/src/RgbStateService.h +++ b/src/RgbStateService.h @@ -37,9 +37,9 @@ class RgbState { public: bool led_on; - uint8_t red_value; - uint8_t green_value; - uint8_t blue_value; + uint8_t redValue; + uint8_t greenValue; + uint8_t blueValue; CRGB leds[NUM_LEDS]; // Class constructor @@ -49,9 +49,9 @@ class RgbState { static void read(RgbState& settings, JsonObject& root) { root["led_on"] = settings.led_on; - root["red_value"] = settings.red_value; - root["green_value"] = settings.green_value; - root["blue_value"] = settings.blue_value; + root["red_value"] = settings.redValue; + root["green_value"] = settings.greenValue; + root["blue_value"] = settings.blueValue; } static StateUpdateResult update(JsonObject& root, RgbState& lightState) { @@ -70,34 +70,21 @@ class RgbState { } bool checkRgbValues(int red, int green, int blue) { - if (red != this->red_value || green != this->green_value || blue != this->blue_value) { + if (red != this->redValue || green != this->greenValue || blue != this->blueValue) { Serial.println("rgb value not the same.."); - this->red_value = red; - this->green_value = green; - this->blue_value = blue; + this->redValue = red; + this->greenValue = green; + this->blueValue = blue; this->updateRgbDriver(); return true; } return false; } - - return StateUpdateResult::UNCHANGED; } - bool checkRgbValues(int red, int green, int blue) { - if (red != redValue || green != greenValue || blue != blueValue) { - redValue = red; - greenValue = green; - blueValue = blue; - updateRgbDriver(); - return true; - } - return false; - } - bool checkLightOnValue(bool onValue) { - if (ledOn != onValue) { + if (this->ledOn != onValue) { if (ledOn) { ledOn = false; updateRgbDriver(true); diff --git a/src/main.cpp b/src/main.cpp index 3178858..a6d011b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,7 +8,7 @@ AsyncWebServer server(80); ESP8266React esp8266React(&server); RgbStateService rgbStateService = RgbStateService(&server, esp8266React.getSecurityManager(), esp8266React.getFS()); -RgbCycleService rgbCycleService = RgbCycleService(&server, esp8266React.getSecurityManager(), esp8266React.getFS()); +// RgbCycleService rgbCycleService = RgbCycleService(&server, esp8266React.getSecurityManager(), esp8266React.getFS()); // update_handler_id_t updateHandler = rgbStateService.addUpdateHandler([&](const String& originId) { // Serial.print("The light's state has been updated by: "); @@ -26,7 +26,7 @@ void setup() { // load the initial RGB object rgbStateService.begin(); - rgbCycleService.begin(); + // rgbCycleService.begin(); // start the server server.begin(); From e98f70da2b251c2be07f7246cb31601fb81d6e81 Mon Sep 17 00:00:00 2001 From: janis Date: Tue, 22 Dec 2020 20:30:21 +0200 Subject: [PATCH 26/36] wip.. --- src/RgbStateService.h | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/RgbStateService.h b/src/RgbStateService.h index a340617..8029f0e 100644 --- a/src/RgbStateService.h +++ b/src/RgbStateService.h @@ -36,7 +36,7 @@ class RgbState { public: - bool led_on; + bool ledOn; uint8_t redValue; uint8_t greenValue; uint8_t blueValue; @@ -48,7 +48,7 @@ class RgbState { } static void read(RgbState& settings, JsonObject& root) { - root["led_on"] = settings.led_on; + root["led_on"] = settings.ledOn; root["red_value"] = settings.redValue; root["green_value"] = settings.greenValue; root["blue_value"] = settings.blueValue; @@ -80,17 +80,15 @@ class RgbState { } return false; } - return StateUpdateResult::UNCHANGED; - } bool checkLightOnValue(bool onValue) { if (this->ledOn != onValue) { - if (ledOn) { - ledOn = false; + if (this->ledOn) { + this->ledOn = false; updateRgbDriver(true); return true; } - ledOn = true; + this->ledOn = true; updateRgbDriver(); return true; } @@ -98,7 +96,6 @@ class RgbState { } void updateRgbDriver(bool turnOff = false) { - if (turnOff) { Serial.println("driver - turn off"); leds[0].fadeToBlackBy(255); @@ -106,7 +103,7 @@ class RgbState { return; } Serial.println("driver - change color"); - leds[0].setRGB(this->redValue, this->greenValue, this->blueValue); + leds[0].setRGB(redValue, greenValue, blueValue); FastLED.show(); } }; From dc75eb962d7672d558ab6f8bb50f30bf3a2a9557 Mon Sep 17 00:00:00 2001 From: janis Date: Wed, 30 Dec 2020 19:03:46 +0200 Subject: [PATCH 27/36] Created RGB driver Singleton --- src/RgbDriver.cpp | 23 +++++++++++++++++++++++ src/RgbDriver.h | 22 ++++++++++++++++++++++ src/RgbStateService.h | 32 ++++++-------------------------- 3 files changed, 51 insertions(+), 26 deletions(-) create mode 100644 src/RgbDriver.cpp create mode 100644 src/RgbDriver.h diff --git a/src/RgbDriver.cpp b/src/RgbDriver.cpp new file mode 100644 index 0000000..964f5b7 --- /dev/null +++ b/src/RgbDriver.cpp @@ -0,0 +1,23 @@ +#include +#include + +RgbDriver* RgbDriver::pInstance = 0; + +RgbDriver* RgbDriver::getInstance() { + if (pInstance == 0) { + pInstance = new RgbDriver; + FastLED.addLeds(pInstance->leds, NUM_LEDS); + } + + return pInstance; +} + +void RgbDriver::updateRgb(int red, int green, int blue) { + pInstance->leds[0].setRGB(red, green, blue); + FastLED.show(); +} + +void RgbDriver::turnOff(){ + pInstance->leds[0].fadeToBlackBy(255); + FastLED.show(); +} \ No newline at end of file diff --git a/src/RgbDriver.h b/src/RgbDriver.h new file mode 100644 index 0000000..f3b36a1 --- /dev/null +++ b/src/RgbDriver.h @@ -0,0 +1,22 @@ +#ifndef RgbDriver_h +#define RgbDriver_h + +#include + +#define NUM_LEDS 1 +#define CLOCK_PIN 14 // D5 +#define DATA_PIN 12 // D6 + +class RgbDriver { + public: + CRGB leds[NUM_LEDS]; + static void updateRgb(int red, int blue, int green); + static void turnOff(); + static RgbDriver* getInstance(); + int data; + + private: + static RgbDriver* pInstance; +}; + +#endif \ No newline at end of file diff --git a/src/RgbStateService.h b/src/RgbStateService.h index 8029f0e..4d45811 100644 --- a/src/RgbStateService.h +++ b/src/RgbStateService.h @@ -4,10 +4,7 @@ #include #include #include -#include - -#define LED_PIN 2 -#define PRINT_DELAY 5000 +#include #define DEFAULT_LED_STATE false #define DEFAULT_RED_VALUE 255 @@ -25,10 +22,6 @@ #define LED_ON 0x0 #define LED_OFF 0x1 -#define NUM_LEDS 1 -#define CLOCK_PIN 14 // D5 -#define DATA_PIN 12 // D6 - #endif #define RGB_SETTINGS_ENDPOINT_PATH "/rest/rgbState" @@ -40,11 +33,11 @@ class RgbState { uint8_t redValue; uint8_t greenValue; uint8_t blueValue; - CRGB leds[NUM_LEDS]; + RgbDriver* driver; // Class constructor RgbState() { - FastLED.addLeds(leds, NUM_LEDS); + driver = driver->getInstance(); } static void read(RgbState& settings, JsonObject& root) { @@ -71,11 +64,10 @@ class RgbState { bool checkRgbValues(int red, int green, int blue) { if (red != this->redValue || green != this->greenValue || blue != this->blueValue) { - Serial.println("rgb value not the same.."); this->redValue = red; this->greenValue = green; this->blueValue = blue; - this->updateRgbDriver(); + driver->updateRgb(red, green, blue); return true; } return false; @@ -85,27 +77,15 @@ class RgbState { if (this->ledOn != onValue) { if (this->ledOn) { this->ledOn = false; - updateRgbDriver(true); + driver->turnOff(); return true; } this->ledOn = true; - updateRgbDriver(); + driver->updateRgb(redValue, greenValue, blueValue); return true; } return false; } - - void updateRgbDriver(bool turnOff = false) { - if (turnOff) { - Serial.println("driver - turn off"); - leds[0].fadeToBlackBy(255); - FastLED.show(); - return; - } - Serial.println("driver - change color"); - leds[0].setRGB(redValue, greenValue, blueValue); - FastLED.show(); - } }; class RgbStateService : public StatefulService { From 4a25357c17e46c412c2f9d23c77f9ceab3afb699 Mon Sep 17 00:00:00 2001 From: janis Date: Wed, 30 Dec 2020 20:26:17 +0200 Subject: [PATCH 28/36] wip.. --- interface/src/project/AquariumController.tsx | 2 +- ...sController.tsx => RgbCycleController.tsx} | 12 +++++----- .../src/project/components/RgbSettings.js | 6 +++-- src/RgbCycleService.cpp | 3 ++- src/RgbCycleService.h | 22 +++++++------------ src/main.cpp | 4 ++-- 6 files changed, 23 insertions(+), 26 deletions(-) rename interface/src/project/{RgbSettingsController.tsx => RgbCycleController.tsx} (72%) diff --git a/interface/src/project/AquariumController.tsx b/interface/src/project/AquariumController.tsx index dc9b5cf..6eb30fe 100644 --- a/interface/src/project/AquariumController.tsx +++ b/interface/src/project/AquariumController.tsx @@ -9,7 +9,7 @@ import { AuthenticatedRoute } from '../authentication'; import DemoInformation from './Information'; import RgbStateWebSocketController from './RgbStateWebSocketController'; -import RgbSettingsController from './RgbSettingsController'; +import RgbSettingsController from './RgbCycleController'; class AquariumController extends Component { diff --git a/interface/src/project/RgbSettingsController.tsx b/interface/src/project/RgbCycleController.tsx similarity index 72% rename from interface/src/project/RgbSettingsController.tsx rename to interface/src/project/RgbCycleController.tsx index 29beae7..e95a5fb 100644 --- a/interface/src/project/RgbSettingsController.tsx +++ b/interface/src/project/RgbCycleController.tsx @@ -11,9 +11,9 @@ import { RgbOptions } from './types'; export const RGB_SETTINGS_WEBSOCKET_URL = WEB_SOCKET_ROOT + "rgbCycle"; -type RgbStateWebSocketControllerProps = WebSocketControllerProps; +type RgbCycleControllerProps = WebSocketControllerProps; -class RgbStateWebSocketController extends Component { +class RgbCycleController extends Component { render() { return ( @@ -21,7 +21,7 @@ class RgbStateWebSocketController extends Component ( - + )} />
@@ -29,11 +29,11 @@ class RgbStateWebSocketController extends Component; +type RgbCycleControllerFormProps = WebSocketFormProps; -function RgbStateWebSocketControllerForm(props: RgbStateWebSocketControllerFormProps) { +function RgbCycleControllerForm(props: RgbCycleControllerFormProps) { const { data, saveData, setData } = props; diff --git a/interface/src/project/components/RgbSettings.js b/interface/src/project/components/RgbSettings.js index 67c2ef1..6655d3e 100644 --- a/interface/src/project/components/RgbSettings.js +++ b/interface/src/project/components/RgbSettings.js @@ -169,8 +169,10 @@ export default ({ setDataHandler, saveDataHandler, data }) => { }) const handleSubmit = () => { - setDataHandler(options.series, saveDataHandler) - console.log('rgb setting: ', options.series[0].data) + // setDataHandler({ data: options.series }, saveDataHandler) + setDataHandler({ data: "test Cycle data" }, saveDataHandler); + + console.log('rgb setting: ', options.series) } const handleRadioChange = (event) => { diff --git a/src/RgbCycleService.cpp b/src/RgbCycleService.cpp index 6da03f5..e2f7d2c 100644 --- a/src/RgbCycleService.cpp +++ b/src/RgbCycleService.cpp @@ -19,12 +19,13 @@ RgbCycleService::RgbCycleService(AsyncWebServer* server, SecurityManager* securi RgbCycleState::update, this, fs, - "/config/RgbState.json") { + "/config/RgbCycle.json") { // add event listener for rgbCycle Object //addUpdateHandler([&](const String& originId) { onConfigUpdated(); }, false); } void RgbCycleService::begin(){ + Serial.println("Cycle begin ..."); _fsPersistence.readFromFS(); } \ No newline at end of file diff --git a/src/RgbCycleService.h b/src/RgbCycleService.h index 9da22ab..5b4daf3 100644 --- a/src/RgbCycleService.h +++ b/src/RgbCycleService.h @@ -4,7 +4,7 @@ #include #include #include -#include +#include #ifdef ESP32 #define LED_ON 0x1 @@ -13,10 +13,6 @@ #define LED_ON 0x0 #define LED_OFF 0x1 -#define NUM_LEDS 1 -#define CLOCK_PIN 14 // D5 -#define DATA_PIN 12 // D6 - #endif #define RGB_CYCLE_ENDPOINT_PATH "/rest/rgbCycle" @@ -24,25 +20,23 @@ class RgbCycleState { public: - bool test; + RgbDriver* driver; - CRGB leds[NUM_LEDS]; - // Class constructor RgbCycleState() { - FastLED.addLeds(leds, NUM_LEDS); + driver = driver->getInstance(); } static void read(RgbCycleState& settings, JsonObject& root) { - + // Serial.println("Cycle read..."); + //todo Implement read functionalty } static StateUpdateResult update(JsonObject& root, RgbCycleState& rgbCycleState) { - - Serial.println("Rgb cycle update..."); - Serial.println(root); + const char* data = root["data"]; + Serial.println("Cycle update..."); + Serial.println(data); - return StateUpdateResult::CHANGED; } }; diff --git a/src/main.cpp b/src/main.cpp index a6d011b..3178858 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,7 +8,7 @@ AsyncWebServer server(80); ESP8266React esp8266React(&server); RgbStateService rgbStateService = RgbStateService(&server, esp8266React.getSecurityManager(), esp8266React.getFS()); -// RgbCycleService rgbCycleService = RgbCycleService(&server, esp8266React.getSecurityManager(), esp8266React.getFS()); +RgbCycleService rgbCycleService = RgbCycleService(&server, esp8266React.getSecurityManager(), esp8266React.getFS()); // update_handler_id_t updateHandler = rgbStateService.addUpdateHandler([&](const String& originId) { // Serial.print("The light's state has been updated by: "); @@ -26,7 +26,7 @@ void setup() { // load the initial RGB object rgbStateService.begin(); - // rgbCycleService.begin(); + rgbCycleService.begin(); // start the server server.begin(); From a598b823f152953958cda5641ba6498d77977791 Mon Sep 17 00:00:00 2001 From: janis Date: Sun, 3 Jan 2021 19:47:11 +0200 Subject: [PATCH 29/36] Save day/night cycle data to API file system. --- interface/src/project/RgbCycleController.tsx | 6 +- .../src/project/components/RgbSettings.js | 42 +++++++-- lib/framework/FSPersistence.h | 12 +-- src/RgbCycleService.cpp | 3 +- src/RgbCycleService.h | 85 +++++++++++++++++-- src/RgbStateService.h | 16 ++-- 6 files changed, 130 insertions(+), 34 deletions(-) diff --git a/interface/src/project/RgbCycleController.tsx b/interface/src/project/RgbCycleController.tsx index e95a5fb..ca7cfa2 100644 --- a/interface/src/project/RgbCycleController.tsx +++ b/interface/src/project/RgbCycleController.tsx @@ -1,10 +1,9 @@ import React, { Component } from 'react'; -import { ValidatorForm } from 'react-material-ui-form-validator'; -import { Typography, Box, Switch } from '@material-ui/core'; +import {Switch } from '@material-ui/core'; import { WEB_SOCKET_ROOT } from '../api'; import { WebSocketControllerProps, WebSocketFormLoader, WebSocketFormProps, webSocketController } from '../components'; -import { SectionContent, BlockFormControlLabel } from '../components'; +import { SectionContent} from '../components'; import RgbSettings from './components/RgbSettings'; import { RgbOptions } from './types'; @@ -36,6 +35,7 @@ type RgbCycleControllerFormProps = WebSocketFormProps; function RgbCycleControllerForm(props: RgbCycleControllerFormProps) { const { data, saveData, setData } = props; + console.log(data); return ( { }) const handleSubmit = () => { - // setDataHandler({ data: options.series }, saveDataHandler) - setDataHandler({ data: "test Cycle data" }, saveDataHandler); - - console.log('rgb setting: ', options.series) + let result = { red: [], green: [], blue: [] }; + + let conv = arr => arr.map(v => Array.isArray(v) ? conv(v) : String(v) || 0); + + options.series.map(color => { + color.data.map(value => { + result[color.color].push(value[1].toString()) + }) + }); + // options.series[0].data.forEach(element => { + // result["red"].push(element[1].toString()) + // result["blue"].push(element[1].toString()) + + // }) + console.log(result) + console.log("data from api before: ", data); + + + setDataHandler({ + graph: { red: result.red } + }, saveDataHandler); + + setTimeout(() => { + setDataHandler({ + graph: { green: result.green } + }, saveDataHandler); + }, 500) + + setTimeout(() => { + setDataHandler({ + graph: { blue: result.blue } + }, saveDataHandler); + }, 500) + + // console.log('rgb setting: ', options.series) + // console.log("stringified array : ", result) + console.log("data from api after: ", data); } const handleRadioChange = (event) => { diff --git a/lib/framework/FSPersistence.h b/lib/framework/FSPersistence.h index 30a9906..d9fc49c 100644 --- a/lib/framework/FSPersistence.h +++ b/lib/framework/FSPersistence.h @@ -25,18 +25,15 @@ class FSPersistence { void readFromFS() { File settingsFile = _fs->open(_filePath, "r"); - + Serial.println(_filePath); if (settingsFile) { DynamicJsonDocument jsonDocument = DynamicJsonDocument(_bufferSize); DeserializationError error = deserializeJson(jsonDocument, settingsFile); if (error == DeserializationError::Ok && jsonDocument.is()) { JsonObject jsonObject = jsonDocument.as(); - char buffer[1000]; - Serial.println("FS read called"); - serializeJsonPretty(jsonDocument, buffer); - Serial.println(buffer); + serializeJsonPretty(jsonDocument, Serial); _statefulService->updateWithoutPropagation(jsonObject, _stateUpdater); settingsFile.close(); @@ -64,11 +61,8 @@ class FSPersistence { return false; } - char buffer[1000]; - Serial.println("FS write called"); - serializeJsonPretty(jsonDocument, buffer); - Serial.println(buffer); + serializeJsonPretty(jsonDocument, Serial); // serialize the data to the file diff --git a/src/RgbCycleService.cpp b/src/RgbCycleService.cpp index e2f7d2c..65afb6a 100644 --- a/src/RgbCycleService.cpp +++ b/src/RgbCycleService.cpp @@ -19,7 +19,8 @@ RgbCycleService::RgbCycleService(AsyncWebServer* server, SecurityManager* securi RgbCycleState::update, this, fs, - "/config/RgbCycle.json") { + "/config/RgbCycle.json", + 4096) { // add event listener for rgbCycle Object //addUpdateHandler([&](const String& originId) { onConfigUpdated(); }, false); diff --git a/src/RgbCycleService.h b/src/RgbCycleService.h index 5b4daf3..fc439c8 100644 --- a/src/RgbCycleService.h +++ b/src/RgbCycleService.h @@ -21,22 +21,91 @@ class RgbCycleState { public: RgbDriver* driver; - + String time; + String color; + int red[49] = {0}; + int green[49] = {0}; + int blue[49] = {0}; + // Class constructor RgbCycleState() { driver = driver->getInstance(); } - static void read(RgbCycleState& settings, JsonObject& root) { - // Serial.println("Cycle read..."); - //todo Implement read functionalty + static void read(RgbCycleState& settings, JsonObject& root) { + + root.createNestedObject("graph"); + root["graph"].createNestedArray("red"); + root["graph"].createNestedArray("green"); + root["graph"].createNestedArray("blue"); + + for (size_t i = 0; i < 49; i++) { + root["graph"]["red"].add(settings.red[i]); + root["graph"]["green"].add(settings.green[i]); + root["graph"]["blue"].add(settings.blue[i]); + + // Serial.println(settings.red[i]); + } + + // for (const int& value : settings.red) { + // root["graph"]["red"].add(value); + // Serial.println(value); + // i++; + // } } static StateUpdateResult update(JsonObject& root, RgbCycleState& rgbCycleState) { - const char* data = root["data"]; - Serial.println("Cycle update..."); - Serial.println(data); - + JsonArray red = root["graph"]["red"].as(); + JsonArray green = root["graph"]["green"].as(); + JsonArray blue = root["graph"]["blue"].as(); + + if (red) { + // Serial.println("red"); + int i = 0; + for (JsonVariant value : red) { + rgbCycleState.red[i] = value.as(); + // Serial.println(value.as()); + // Serial.println(rgbCycleState.red[i]); + i++; + } + } + if (green) { + // Serial.println("green"); + int i = 0; + for (JsonVariant value : green) { + rgbCycleState.green[i] = value.as(); + i++; + } + } + if (blue) { + // Serial.println("blue"); + int i = 0; + for (JsonVariant value : blue) { + rgbCycleState.blue[i] = value.as(); + i++; + } + } + + Serial.println("Cycle update..."); + Serial.println("red"); + for (size_t i = 0; i < 49; i++) { + Serial.print(rgbCycleState.red[i]); + } + Serial.println(""); + Serial.println("green"); + for (size_t i = 0; i < 49; i++) { + Serial.print(rgbCycleState.green[i]); + } + Serial.println(""); + Serial.println("blue"); + for (size_t i = 0; i < 49; i++) { + Serial.print(rgbCycleState.blue[i]); + } + Serial.println(""); + + // serializeJsonPretty(root, Serial); + // Serial.println(time); + return StateUpdateResult::CHANGED; } }; diff --git a/src/RgbStateService.h b/src/RgbStateService.h index 4d45811..d0c6d20 100644 --- a/src/RgbStateService.h +++ b/src/RgbStateService.h @@ -63,10 +63,10 @@ class RgbState { } bool checkRgbValues(int red, int green, int blue) { - if (red != this->redValue || green != this->greenValue || blue != this->blueValue) { - this->redValue = red; - this->greenValue = green; - this->blueValue = blue; + if (red != redValue || green != greenValue || blue != blueValue) { + redValue = red; + greenValue = green; + blueValue = blue; driver->updateRgb(red, green, blue); return true; } @@ -74,13 +74,13 @@ class RgbState { } bool checkLightOnValue(bool onValue) { - if (this->ledOn != onValue) { - if (this->ledOn) { - this->ledOn = false; + if (ledOn != onValue) { + if (ledOn) { + ledOn = false; driver->turnOff(); return true; } - this->ledOn = true; + ledOn = true; driver->updateRgb(redValue, greenValue, blueValue); return true; } From 5148a9674e2c0a3000af3dcb7ef13c668c450423 Mon Sep 17 00:00:00 2001 From: janis Date: Sun, 10 Jan 2021 19:48:46 +0200 Subject: [PATCH 30/36] Red values save and load --- interface/src/project/AquariumController.tsx | 4 +- interface/src/project/RgbCycleController.tsx | 1 - .../src/project/components/RgbSettings.js | 46 +++++++------------ src/RgbCycleService.h | 7 +-- 4 files changed, 22 insertions(+), 36 deletions(-) diff --git a/interface/src/project/AquariumController.tsx b/interface/src/project/AquariumController.tsx index 6eb30fe..a910471 100644 --- a/interface/src/project/AquariumController.tsx +++ b/interface/src/project/AquariumController.tsx @@ -9,7 +9,7 @@ import { AuthenticatedRoute } from '../authentication'; import DemoInformation from './Information'; import RgbStateWebSocketController from './RgbStateWebSocketController'; -import RgbSettingsController from './RgbCycleController'; +import RgbCycleController from './RgbCycleController'; class AquariumController extends Component { @@ -28,7 +28,7 @@ class AquariumController extends Component { - + diff --git a/interface/src/project/RgbCycleController.tsx b/interface/src/project/RgbCycleController.tsx index ca7cfa2..3a13a38 100644 --- a/interface/src/project/RgbCycleController.tsx +++ b/interface/src/project/RgbCycleController.tsx @@ -35,7 +35,6 @@ type RgbCycleControllerFormProps = WebSocketFormProps; function RgbCycleControllerForm(props: RgbCycleControllerFormProps) { const { data, saveData, setData } = props; - console.log(data); return ( { +export default ({ setDataHandler, saveDataHandler, data: colorData }) => { const [selectedColor, setSelectedColor] = useState('red'); @@ -117,9 +117,11 @@ export default ({ setDataHandler, saveDataHandler, data }) => { visible: true, data: (function () { - var data = [] + let data = [] + let index = 0; for (let i = Date.UTC(2020, 0, 1, -2, 0, 0); i <= Date.UTC(2020, 0, 2, -2, 0, 0); i += 3600 * 500) { - data.push([i, Math.round(Math.random() * 255)]); + data.push({ x: i, y: colorData.graph.red[index] }); + index++; } return data; @@ -139,7 +141,7 @@ export default ({ setDataHandler, saveDataHandler, data }) => { var data = [] for (let i = Date.UTC(2020, 0, 1, -2, 0, 0); i <= Date.UTC(2020, 0, 2, -2, 0, 0); i += 3600 * 500) { - data.push([i, Math.round(Math.random() * 255)]); + data.push({ x: i, y: 150 }); } return data; @@ -158,7 +160,8 @@ export default ({ setDataHandler, saveDataHandler, data }) => { data: (function () { var data = [] for (let i = Date.UTC(2020, 0, 1, -2, 0, 0); i <= Date.UTC(2020, 0, 2, -2, 0, 0); i += 3600 * 500) { - data.push([i, Math.round(Math.random() * 255)]); + data.push({ x: i, y: 100 }); + // Math.round(Math.random() * 255) } return data; @@ -167,6 +170,13 @@ export default ({ setDataHandler, saveDataHandler, data }) => { ] }) + useEffect(() => { + const redData = colorData.graph.red; + for (let index = 0; index < redData.length; index++) { + options.series[0].data[index][1] = redData[index] + } + }, []) + const handleSubmit = () => { let result = { red: [], green: [], blue: [] }; @@ -174,37 +184,13 @@ export default ({ setDataHandler, saveDataHandler, data }) => { options.series.map(color => { color.data.map(value => { - result[color.color].push(value[1].toString()) + result[color.color].push(Math.round(value.y).toString()) }) }); - // options.series[0].data.forEach(element => { - // result["red"].push(element[1].toString()) - // result["blue"].push(element[1].toString()) - - // }) - console.log(result) - console.log("data from api before: ", data); - setDataHandler({ graph: { red: result.red } }, saveDataHandler); - - setTimeout(() => { - setDataHandler({ - graph: { green: result.green } - }, saveDataHandler); - }, 500) - - setTimeout(() => { - setDataHandler({ - graph: { blue: result.blue } - }, saveDataHandler); - }, 500) - - // console.log('rgb setting: ', options.series) - // console.log("stringified array : ", result) - console.log("data from api after: ", data); } const handleRadioChange = (event) => { diff --git a/src/RgbCycleService.h b/src/RgbCycleService.h index fc439c8..dd79ea0 100644 --- a/src/RgbCycleService.h +++ b/src/RgbCycleService.h @@ -33,7 +33,6 @@ class RgbCycleState { } static void read(RgbCycleState& settings, JsonObject& root) { - root.createNestedObject("graph"); root["graph"].createNestedArray("red"); root["graph"].createNestedArray("green"); @@ -41,12 +40,14 @@ class RgbCycleState { for (size_t i = 0; i < 49; i++) { root["graph"]["red"].add(settings.red[i]); - root["graph"]["green"].add(settings.green[i]); - root["graph"]["blue"].add(settings.blue[i]); + // root["graph"]["green"].add(settings.green[i]); + // root["graph"]["blue"].add(settings.blue[i]); // Serial.println(settings.red[i]); } + Serial.println("api read called..."); + // for (const int& value : settings.red) { // root["graph"]["red"].add(value); // Serial.println(value); From fa892f4b0975685e2d3158574a1d2112430eff7a Mon Sep 17 00:00:00 2001 From: janis Date: Mon, 22 Feb 2021 21:12:09 +0200 Subject: [PATCH 31/36] auto mode --- .clang-format | 0 .gitignore | 0 .travis.yml | 0 LICENSE.txt | 0 README.md | 0 factory_settings.ini | 0 features.ini | 0 interface/.env | 0 interface/.env.development | 0 interface/.env.production | 0 interface/config-overrides.js | 0 interface/package-lock.json | 0 interface/package.json | 0 interface/progmem-generator.js | 0 interface/public/app/icon.png | Bin interface/public/app/manifest.json | 0 interface/public/css/roboto.css | 0 interface/public/favicon.ico | Bin interface/public/fonts/li.woff2 | Bin interface/public/fonts/me.woff2 | Bin interface/public/fonts/re.woff2 | Bin interface/public/index.html | 0 interface/src/App.tsx | 0 interface/src/AppRouting.tsx | 0 interface/src/CustomMuiTheme.tsx | 0 interface/src/SignIn.tsx | 0 interface/src/ap/APModes.ts | 0 interface/src/ap/APSettingsController.tsx | 0 interface/src/ap/APSettingsForm.tsx | 0 interface/src/ap/APStatus.ts | 0 interface/src/ap/APStatusController.tsx | 0 interface/src/ap/APStatusForm.tsx | 0 interface/src/ap/AccessPoint.tsx | 0 interface/src/ap/types.ts | 0 interface/src/api/Endpoints.ts | 0 interface/src/api/Env.ts | 0 interface/src/api/index.ts | 0 .../src/authentication/AuthenticatedRoute.tsx | 0 .../src/authentication/Authentication.ts | 0 .../authentication/AuthenticationContext.tsx | 0 .../authentication/AuthenticationWrapper.tsx | 0 .../authentication/UnauthenticatedRoute.tsx | 0 interface/src/authentication/index.ts | 0 interface/src/components/ApplicationError.tsx | 0 .../src/components/BlockFormControlLabel.tsx | 0 interface/src/components/ErrorButton.tsx | 0 interface/src/components/FormActions.tsx | 0 interface/src/components/FormButton.tsx | 0 .../src/components/FullScreenLoading.tsx | 0 interface/src/components/HighlightAvatar.tsx | 0 interface/src/components/MenuAppBar.tsx | 0 .../src/components/PasswordValidator.tsx | 0 interface/src/components/RestController.tsx | 0 interface/src/components/RestFormLoader.tsx | 0 interface/src/components/SectionContent.tsx | 0 interface/src/components/SingleUpload.tsx | 0 .../src/components/WebSocketController.tsx | 1 + .../src/components/WebSocketFormLoader.tsx | 0 interface/src/components/index.ts | 0 interface/src/features/ApplicationContext.tsx | 0 interface/src/features/FeaturesContext.tsx | 0 interface/src/features/FeaturesWrapper.tsx | 0 interface/src/features/types.ts | 0 interface/src/history.ts | 0 interface/src/index.tsx | 0 interface/src/mqtt/Mqtt.tsx | 0 interface/src/mqtt/MqttSettingsController.tsx | 0 interface/src/mqtt/MqttSettingsForm.tsx | 0 interface/src/mqtt/MqttStatus.ts | 0 interface/src/mqtt/MqttStatusController.tsx | 0 interface/src/mqtt/MqttStatusForm.tsx | 0 interface/src/mqtt/types.ts | 0 interface/src/ntp/NTPSettingsController.tsx | 0 interface/src/ntp/NTPSettingsForm.tsx | 0 interface/src/ntp/NTPStatus.ts | 0 interface/src/ntp/NTPStatusController.tsx | 0 interface/src/ntp/NTPStatusForm.tsx | 0 interface/src/ntp/NetworkTime.tsx | 0 interface/src/ntp/TZ.tsx | 0 interface/src/ntp/TimeFormat.ts | 0 interface/src/ntp/types.ts | 0 interface/src/project/AquariumController.tsx | 0 interface/src/project/Information.tsx | 0 .../project/LightMqttSettingsController.tsx | 0 .../src/project/LightStateRestController.tsx | 0 .../project/LightStateWebSocketController.tsx | 0 interface/src/project/ProjectMenu.tsx | 0 interface/src/project/ProjectRouting.tsx | 0 interface/src/project/RgbCycleController.tsx | 0 .../project/RgbStateWebSocketController.tsx | 2 +- .../src/project/components/RgbSettings.js | 0 interface/src/project/components/RgbSlider.js | 0 interface/src/project/types.ts | 0 interface/src/react-app-env.d.ts | 0 .../src/security/ManageUsersController.tsx | 0 interface/src/security/ManageUsersForm.tsx | 0 interface/src/security/Security.tsx | 0 .../security/SecuritySettingsController.tsx | 0 .../src/security/SecuritySettingsForm.tsx | 0 interface/src/security/UserForm.tsx | 0 interface/src/security/types.ts | 0 interface/src/serviceWorker.ts | 0 .../src/system/OTASettingsController.tsx | 0 interface/src/system/OTASettingsForm.tsx | 0 interface/src/system/System.tsx | 0 .../src/system/SystemStatusController.tsx | 0 interface/src/system/SystemStatusForm.tsx | 0 .../src/system/UploadFirmwareController.tsx | 0 interface/src/system/UploadFirmwareForm.tsx | 0 interface/src/system/types.ts | 0 interface/src/validators/index.ts | 0 interface/src/validators/isHostname.ts | 0 interface/src/validators/isIP.ts | 0 interface/src/validators/optional.ts | 0 interface/src/validators/or.ts | 0 interface/src/wifi/WiFiConnection.tsx | 0 interface/src/wifi/WiFiConnectionContext.tsx | 0 interface/src/wifi/WiFiNetworkScanner.tsx | 0 interface/src/wifi/WiFiNetworkSelector.tsx | 0 interface/src/wifi/WiFiSecurityModes.ts | 0 interface/src/wifi/WiFiSettingsController.tsx | 0 interface/src/wifi/WiFiSettingsForm.tsx | 0 interface/src/wifi/WiFiStatus.ts | 0 interface/src/wifi/WiFiStatusController.tsx | 0 interface/src/wifi/WiFiStatusForm.tsx | 0 interface/src/wifi/types.ts | 0 interface/tsconfig.json | 0 lib/framework/APSettingsService.cpp | 0 lib/framework/APSettingsService.h | 0 lib/framework/APStatus.cpp | 0 lib/framework/APStatus.h | 0 lib/framework/ArduinoJsonJWT.cpp | 0 lib/framework/ArduinoJsonJWT.h | 0 lib/framework/AuthenticationService.cpp | 0 lib/framework/AuthenticationService.h | 0 lib/framework/ESP8266React.cpp | 0 lib/framework/ESP8266React.h | 0 lib/framework/ESPFS.h | 0 lib/framework/ESPUtils.h | 0 lib/framework/FSPersistence.h | 4 +- lib/framework/FactoryResetService.cpp | 0 lib/framework/FactoryResetService.h | 0 lib/framework/Features.h | 0 lib/framework/FeaturesService.cpp | 0 lib/framework/FeaturesService.h | 0 lib/framework/HttpEndpoint.h | 0 lib/framework/JsonUtils.h | 0 lib/framework/MqttPubSub.h | 0 lib/framework/MqttSettingsService.cpp | 0 lib/framework/MqttSettingsService.h | 0 lib/framework/MqttStatus.cpp | 0 lib/framework/MqttStatus.h | 0 lib/framework/NTPSettingsService.cpp | 0 lib/framework/NTPSettingsService.h | 0 lib/framework/NTPStatus.cpp | 0 lib/framework/NTPStatus.h | 0 lib/framework/OTASettingsService.cpp | 0 lib/framework/OTASettingsService.h | 0 lib/framework/RestartService.cpp | 0 lib/framework/RestartService.h | 0 lib/framework/SecurityManager.h | 0 lib/framework/SecuritySettingsService.cpp | 0 lib/framework/SecuritySettingsService.h | 0 lib/framework/StatefulService.cpp | 0 lib/framework/StatefulService.h | 0 lib/framework/SystemStatus.cpp | 0 lib/framework/SystemStatus.h | 0 lib/framework/UploadFirmwareService.cpp | 0 lib/framework/UploadFirmwareService.h | 0 lib/framework/WebSocketTxRx.h | 0 lib/framework/WiFiScanner.cpp | 0 lib/framework/WiFiScanner.h | 0 lib/framework/WiFiSettingsService.cpp | 0 lib/framework/WiFiSettingsService.h | 0 lib/framework/WiFiStatus.cpp | 0 lib/framework/WiFiStatus.h | 0 lib/readme.txt | 0 media/build.png | Bin media/dark.png | Bin media/devserver.png | Bin media/esp12e.jpg | Bin media/esp32.jpg | Bin media/framework.png | Bin media/screenshots.png | Bin media/uploadfs.png | Bin media/uploadfw.png | Bin platformio.ini | 108 +++++++++++++----- scripts/build_interface.py | 0 src/RgbCycleService.cpp | 16 +-- src/RgbCycleService.h | 9 +- src/RgbDriver.cpp | 17 ++- src/RgbDriver.h | 3 + src/RgbStateService.cpp | 2 + src/RgbStateService.h | 5 + src/main.cpp | 68 ++++++++++- 195 files changed, 176 insertions(+), 59 deletions(-) mode change 100644 => 100755 .clang-format mode change 100644 => 100755 .gitignore mode change 100644 => 100755 .travis.yml mode change 100644 => 100755 LICENSE.txt mode change 100644 => 100755 README.md mode change 100644 => 100755 factory_settings.ini mode change 100644 => 100755 features.ini mode change 100644 => 100755 interface/.env mode change 100644 => 100755 interface/.env.development mode change 100644 => 100755 interface/.env.production mode change 100644 => 100755 interface/config-overrides.js mode change 100644 => 100755 interface/package-lock.json mode change 100644 => 100755 interface/package.json mode change 100644 => 100755 interface/progmem-generator.js mode change 100644 => 100755 interface/public/app/icon.png mode change 100644 => 100755 interface/public/app/manifest.json mode change 100644 => 100755 interface/public/css/roboto.css mode change 100644 => 100755 interface/public/favicon.ico mode change 100644 => 100755 interface/public/fonts/li.woff2 mode change 100644 => 100755 interface/public/fonts/me.woff2 mode change 100644 => 100755 interface/public/fonts/re.woff2 mode change 100644 => 100755 interface/public/index.html mode change 100644 => 100755 interface/src/App.tsx mode change 100644 => 100755 interface/src/AppRouting.tsx mode change 100644 => 100755 interface/src/CustomMuiTheme.tsx mode change 100644 => 100755 interface/src/SignIn.tsx mode change 100644 => 100755 interface/src/ap/APModes.ts mode change 100644 => 100755 interface/src/ap/APSettingsController.tsx mode change 100644 => 100755 interface/src/ap/APSettingsForm.tsx mode change 100644 => 100755 interface/src/ap/APStatus.ts mode change 100644 => 100755 interface/src/ap/APStatusController.tsx mode change 100644 => 100755 interface/src/ap/APStatusForm.tsx mode change 100644 => 100755 interface/src/ap/AccessPoint.tsx mode change 100644 => 100755 interface/src/ap/types.ts mode change 100644 => 100755 interface/src/api/Endpoints.ts mode change 100644 => 100755 interface/src/api/Env.ts mode change 100644 => 100755 interface/src/api/index.ts mode change 100644 => 100755 interface/src/authentication/AuthenticatedRoute.tsx mode change 100644 => 100755 interface/src/authentication/Authentication.ts mode change 100644 => 100755 interface/src/authentication/AuthenticationContext.tsx mode change 100644 => 100755 interface/src/authentication/AuthenticationWrapper.tsx mode change 100644 => 100755 interface/src/authentication/UnauthenticatedRoute.tsx mode change 100644 => 100755 interface/src/authentication/index.ts mode change 100644 => 100755 interface/src/components/ApplicationError.tsx mode change 100644 => 100755 interface/src/components/BlockFormControlLabel.tsx mode change 100644 => 100755 interface/src/components/ErrorButton.tsx mode change 100644 => 100755 interface/src/components/FormActions.tsx mode change 100644 => 100755 interface/src/components/FormButton.tsx mode change 100644 => 100755 interface/src/components/FullScreenLoading.tsx mode change 100644 => 100755 interface/src/components/HighlightAvatar.tsx mode change 100644 => 100755 interface/src/components/MenuAppBar.tsx mode change 100644 => 100755 interface/src/components/PasswordValidator.tsx mode change 100644 => 100755 interface/src/components/RestController.tsx mode change 100644 => 100755 interface/src/components/RestFormLoader.tsx mode change 100644 => 100755 interface/src/components/SectionContent.tsx mode change 100644 => 100755 interface/src/components/SingleUpload.tsx mode change 100644 => 100755 interface/src/components/WebSocketController.tsx mode change 100644 => 100755 interface/src/components/WebSocketFormLoader.tsx mode change 100644 => 100755 interface/src/components/index.ts mode change 100644 => 100755 interface/src/features/ApplicationContext.tsx mode change 100644 => 100755 interface/src/features/FeaturesContext.tsx mode change 100644 => 100755 interface/src/features/FeaturesWrapper.tsx mode change 100644 => 100755 interface/src/features/types.ts mode change 100644 => 100755 interface/src/history.ts mode change 100644 => 100755 interface/src/index.tsx mode change 100644 => 100755 interface/src/mqtt/Mqtt.tsx mode change 100644 => 100755 interface/src/mqtt/MqttSettingsController.tsx mode change 100644 => 100755 interface/src/mqtt/MqttSettingsForm.tsx mode change 100644 => 100755 interface/src/mqtt/MqttStatus.ts mode change 100644 => 100755 interface/src/mqtt/MqttStatusController.tsx mode change 100644 => 100755 interface/src/mqtt/MqttStatusForm.tsx mode change 100644 => 100755 interface/src/mqtt/types.ts mode change 100644 => 100755 interface/src/ntp/NTPSettingsController.tsx mode change 100644 => 100755 interface/src/ntp/NTPSettingsForm.tsx mode change 100644 => 100755 interface/src/ntp/NTPStatus.ts mode change 100644 => 100755 interface/src/ntp/NTPStatusController.tsx mode change 100644 => 100755 interface/src/ntp/NTPStatusForm.tsx mode change 100644 => 100755 interface/src/ntp/NetworkTime.tsx mode change 100644 => 100755 interface/src/ntp/TZ.tsx mode change 100644 => 100755 interface/src/ntp/TimeFormat.ts mode change 100644 => 100755 interface/src/ntp/types.ts mode change 100644 => 100755 interface/src/project/AquariumController.tsx mode change 100644 => 100755 interface/src/project/Information.tsx mode change 100644 => 100755 interface/src/project/LightMqttSettingsController.tsx mode change 100644 => 100755 interface/src/project/LightStateRestController.tsx mode change 100644 => 100755 interface/src/project/LightStateWebSocketController.tsx mode change 100644 => 100755 interface/src/project/ProjectMenu.tsx mode change 100644 => 100755 interface/src/project/ProjectRouting.tsx mode change 100644 => 100755 interface/src/project/RgbCycleController.tsx mode change 100644 => 100755 interface/src/project/RgbStateWebSocketController.tsx mode change 100644 => 100755 interface/src/project/components/RgbSettings.js mode change 100644 => 100755 interface/src/project/components/RgbSlider.js mode change 100644 => 100755 interface/src/project/types.ts mode change 100644 => 100755 interface/src/react-app-env.d.ts mode change 100644 => 100755 interface/src/security/ManageUsersController.tsx mode change 100644 => 100755 interface/src/security/ManageUsersForm.tsx mode change 100644 => 100755 interface/src/security/Security.tsx mode change 100644 => 100755 interface/src/security/SecuritySettingsController.tsx mode change 100644 => 100755 interface/src/security/SecuritySettingsForm.tsx mode change 100644 => 100755 interface/src/security/UserForm.tsx mode change 100644 => 100755 interface/src/security/types.ts mode change 100644 => 100755 interface/src/serviceWorker.ts mode change 100644 => 100755 interface/src/system/OTASettingsController.tsx mode change 100644 => 100755 interface/src/system/OTASettingsForm.tsx mode change 100644 => 100755 interface/src/system/System.tsx mode change 100644 => 100755 interface/src/system/SystemStatusController.tsx mode change 100644 => 100755 interface/src/system/SystemStatusForm.tsx mode change 100644 => 100755 interface/src/system/UploadFirmwareController.tsx mode change 100644 => 100755 interface/src/system/UploadFirmwareForm.tsx mode change 100644 => 100755 interface/src/system/types.ts mode change 100644 => 100755 interface/src/validators/index.ts mode change 100644 => 100755 interface/src/validators/isHostname.ts mode change 100644 => 100755 interface/src/validators/isIP.ts mode change 100644 => 100755 interface/src/validators/optional.ts mode change 100644 => 100755 interface/src/validators/or.ts mode change 100644 => 100755 interface/src/wifi/WiFiConnection.tsx mode change 100644 => 100755 interface/src/wifi/WiFiConnectionContext.tsx mode change 100644 => 100755 interface/src/wifi/WiFiNetworkScanner.tsx mode change 100644 => 100755 interface/src/wifi/WiFiNetworkSelector.tsx mode change 100644 => 100755 interface/src/wifi/WiFiSecurityModes.ts mode change 100644 => 100755 interface/src/wifi/WiFiSettingsController.tsx mode change 100644 => 100755 interface/src/wifi/WiFiSettingsForm.tsx mode change 100644 => 100755 interface/src/wifi/WiFiStatus.ts mode change 100644 => 100755 interface/src/wifi/WiFiStatusController.tsx mode change 100644 => 100755 interface/src/wifi/WiFiStatusForm.tsx mode change 100644 => 100755 interface/src/wifi/types.ts mode change 100644 => 100755 interface/tsconfig.json mode change 100644 => 100755 lib/framework/APSettingsService.cpp mode change 100644 => 100755 lib/framework/APSettingsService.h mode change 100644 => 100755 lib/framework/APStatus.cpp mode change 100644 => 100755 lib/framework/APStatus.h mode change 100644 => 100755 lib/framework/ArduinoJsonJWT.cpp mode change 100644 => 100755 lib/framework/ArduinoJsonJWT.h mode change 100644 => 100755 lib/framework/AuthenticationService.cpp mode change 100644 => 100755 lib/framework/AuthenticationService.h mode change 100644 => 100755 lib/framework/ESP8266React.cpp mode change 100644 => 100755 lib/framework/ESP8266React.h mode change 100644 => 100755 lib/framework/ESPFS.h mode change 100644 => 100755 lib/framework/ESPUtils.h mode change 100644 => 100755 lib/framework/FSPersistence.h mode change 100644 => 100755 lib/framework/FactoryResetService.cpp mode change 100644 => 100755 lib/framework/FactoryResetService.h mode change 100644 => 100755 lib/framework/Features.h mode change 100644 => 100755 lib/framework/FeaturesService.cpp mode change 100644 => 100755 lib/framework/FeaturesService.h mode change 100644 => 100755 lib/framework/HttpEndpoint.h mode change 100644 => 100755 lib/framework/JsonUtils.h mode change 100644 => 100755 lib/framework/MqttPubSub.h mode change 100644 => 100755 lib/framework/MqttSettingsService.cpp mode change 100644 => 100755 lib/framework/MqttSettingsService.h mode change 100644 => 100755 lib/framework/MqttStatus.cpp mode change 100644 => 100755 lib/framework/MqttStatus.h mode change 100644 => 100755 lib/framework/NTPSettingsService.cpp mode change 100644 => 100755 lib/framework/NTPSettingsService.h mode change 100644 => 100755 lib/framework/NTPStatus.cpp mode change 100644 => 100755 lib/framework/NTPStatus.h mode change 100644 => 100755 lib/framework/OTASettingsService.cpp mode change 100644 => 100755 lib/framework/OTASettingsService.h mode change 100644 => 100755 lib/framework/RestartService.cpp mode change 100644 => 100755 lib/framework/RestartService.h mode change 100644 => 100755 lib/framework/SecurityManager.h mode change 100644 => 100755 lib/framework/SecuritySettingsService.cpp mode change 100644 => 100755 lib/framework/SecuritySettingsService.h mode change 100644 => 100755 lib/framework/StatefulService.cpp mode change 100644 => 100755 lib/framework/StatefulService.h mode change 100644 => 100755 lib/framework/SystemStatus.cpp mode change 100644 => 100755 lib/framework/SystemStatus.h mode change 100644 => 100755 lib/framework/UploadFirmwareService.cpp mode change 100644 => 100755 lib/framework/UploadFirmwareService.h mode change 100644 => 100755 lib/framework/WebSocketTxRx.h mode change 100644 => 100755 lib/framework/WiFiScanner.cpp mode change 100644 => 100755 lib/framework/WiFiScanner.h mode change 100644 => 100755 lib/framework/WiFiSettingsService.cpp mode change 100644 => 100755 lib/framework/WiFiSettingsService.h mode change 100644 => 100755 lib/framework/WiFiStatus.cpp mode change 100644 => 100755 lib/framework/WiFiStatus.h mode change 100644 => 100755 lib/readme.txt mode change 100644 => 100755 media/build.png mode change 100644 => 100755 media/dark.png mode change 100644 => 100755 media/devserver.png mode change 100644 => 100755 media/esp12e.jpg mode change 100644 => 100755 media/esp32.jpg mode change 100644 => 100755 media/framework.png mode change 100644 => 100755 media/screenshots.png mode change 100644 => 100755 media/uploadfs.png mode change 100644 => 100755 media/uploadfw.png mode change 100644 => 100755 platformio.ini mode change 100644 => 100755 scripts/build_interface.py mode change 100644 => 100755 src/RgbCycleService.cpp mode change 100644 => 100755 src/RgbCycleService.h mode change 100644 => 100755 src/RgbDriver.cpp mode change 100644 => 100755 src/RgbDriver.h mode change 100644 => 100755 src/RgbStateService.cpp mode change 100644 => 100755 src/RgbStateService.h mode change 100644 => 100755 src/main.cpp diff --git a/.clang-format b/.clang-format old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/.travis.yml b/.travis.yml old mode 100644 new mode 100755 diff --git a/LICENSE.txt b/LICENSE.txt old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/factory_settings.ini b/factory_settings.ini old mode 100644 new mode 100755 diff --git a/features.ini b/features.ini old mode 100644 new mode 100755 diff --git a/interface/.env b/interface/.env old mode 100644 new mode 100755 diff --git a/interface/.env.development b/interface/.env.development old mode 100644 new mode 100755 diff --git a/interface/.env.production b/interface/.env.production old mode 100644 new mode 100755 diff --git a/interface/config-overrides.js b/interface/config-overrides.js old mode 100644 new mode 100755 diff --git a/interface/package-lock.json b/interface/package-lock.json old mode 100644 new mode 100755 diff --git a/interface/package.json b/interface/package.json old mode 100644 new mode 100755 diff --git a/interface/progmem-generator.js b/interface/progmem-generator.js old mode 100644 new mode 100755 diff --git a/interface/public/app/icon.png b/interface/public/app/icon.png old mode 100644 new mode 100755 diff --git a/interface/public/app/manifest.json b/interface/public/app/manifest.json old mode 100644 new mode 100755 diff --git a/interface/public/css/roboto.css b/interface/public/css/roboto.css old mode 100644 new mode 100755 diff --git a/interface/public/favicon.ico b/interface/public/favicon.ico old mode 100644 new mode 100755 diff --git a/interface/public/fonts/li.woff2 b/interface/public/fonts/li.woff2 old mode 100644 new mode 100755 diff --git a/interface/public/fonts/me.woff2 b/interface/public/fonts/me.woff2 old mode 100644 new mode 100755 diff --git a/interface/public/fonts/re.woff2 b/interface/public/fonts/re.woff2 old mode 100644 new mode 100755 diff --git a/interface/public/index.html b/interface/public/index.html old mode 100644 new mode 100755 diff --git a/interface/src/App.tsx b/interface/src/App.tsx old mode 100644 new mode 100755 diff --git a/interface/src/AppRouting.tsx b/interface/src/AppRouting.tsx old mode 100644 new mode 100755 diff --git a/interface/src/CustomMuiTheme.tsx b/interface/src/CustomMuiTheme.tsx old mode 100644 new mode 100755 diff --git a/interface/src/SignIn.tsx b/interface/src/SignIn.tsx old mode 100644 new mode 100755 diff --git a/interface/src/ap/APModes.ts b/interface/src/ap/APModes.ts old mode 100644 new mode 100755 diff --git a/interface/src/ap/APSettingsController.tsx b/interface/src/ap/APSettingsController.tsx old mode 100644 new mode 100755 diff --git a/interface/src/ap/APSettingsForm.tsx b/interface/src/ap/APSettingsForm.tsx old mode 100644 new mode 100755 diff --git a/interface/src/ap/APStatus.ts b/interface/src/ap/APStatus.ts old mode 100644 new mode 100755 diff --git a/interface/src/ap/APStatusController.tsx b/interface/src/ap/APStatusController.tsx old mode 100644 new mode 100755 diff --git a/interface/src/ap/APStatusForm.tsx b/interface/src/ap/APStatusForm.tsx old mode 100644 new mode 100755 diff --git a/interface/src/ap/AccessPoint.tsx b/interface/src/ap/AccessPoint.tsx old mode 100644 new mode 100755 diff --git a/interface/src/ap/types.ts b/interface/src/ap/types.ts old mode 100644 new mode 100755 diff --git a/interface/src/api/Endpoints.ts b/interface/src/api/Endpoints.ts old mode 100644 new mode 100755 diff --git a/interface/src/api/Env.ts b/interface/src/api/Env.ts old mode 100644 new mode 100755 diff --git a/interface/src/api/index.ts b/interface/src/api/index.ts old mode 100644 new mode 100755 diff --git a/interface/src/authentication/AuthenticatedRoute.tsx b/interface/src/authentication/AuthenticatedRoute.tsx old mode 100644 new mode 100755 diff --git a/interface/src/authentication/Authentication.ts b/interface/src/authentication/Authentication.ts old mode 100644 new mode 100755 diff --git a/interface/src/authentication/AuthenticationContext.tsx b/interface/src/authentication/AuthenticationContext.tsx old mode 100644 new mode 100755 diff --git a/interface/src/authentication/AuthenticationWrapper.tsx b/interface/src/authentication/AuthenticationWrapper.tsx old mode 100644 new mode 100755 diff --git a/interface/src/authentication/UnauthenticatedRoute.tsx b/interface/src/authentication/UnauthenticatedRoute.tsx old mode 100644 new mode 100755 diff --git a/interface/src/authentication/index.ts b/interface/src/authentication/index.ts old mode 100644 new mode 100755 diff --git a/interface/src/components/ApplicationError.tsx b/interface/src/components/ApplicationError.tsx old mode 100644 new mode 100755 diff --git a/interface/src/components/BlockFormControlLabel.tsx b/interface/src/components/BlockFormControlLabel.tsx old mode 100644 new mode 100755 diff --git a/interface/src/components/ErrorButton.tsx b/interface/src/components/ErrorButton.tsx old mode 100644 new mode 100755 diff --git a/interface/src/components/FormActions.tsx b/interface/src/components/FormActions.tsx old mode 100644 new mode 100755 diff --git a/interface/src/components/FormButton.tsx b/interface/src/components/FormButton.tsx old mode 100644 new mode 100755 diff --git a/interface/src/components/FullScreenLoading.tsx b/interface/src/components/FullScreenLoading.tsx old mode 100644 new mode 100755 diff --git a/interface/src/components/HighlightAvatar.tsx b/interface/src/components/HighlightAvatar.tsx old mode 100644 new mode 100755 diff --git a/interface/src/components/MenuAppBar.tsx b/interface/src/components/MenuAppBar.tsx old mode 100644 new mode 100755 diff --git a/interface/src/components/PasswordValidator.tsx b/interface/src/components/PasswordValidator.tsx old mode 100644 new mode 100755 diff --git a/interface/src/components/RestController.tsx b/interface/src/components/RestController.tsx old mode 100644 new mode 100755 diff --git a/interface/src/components/RestFormLoader.tsx b/interface/src/components/RestFormLoader.tsx old mode 100644 new mode 100755 diff --git a/interface/src/components/SectionContent.tsx b/interface/src/components/SectionContent.tsx old mode 100644 new mode 100755 diff --git a/interface/src/components/SingleUpload.tsx b/interface/src/components/SingleUpload.tsx old mode 100644 new mode 100755 diff --git a/interface/src/components/WebSocketController.tsx b/interface/src/components/WebSocketController.tsx old mode 100644 new mode 100755 index 5fe9fa3..e8436ec --- a/interface/src/components/WebSocketController.tsx +++ b/interface/src/components/WebSocketController.tsx @@ -62,6 +62,7 @@ export function webSocketController>(ws } onMessage = (event: MessageEvent) => { + console.log("incoming web socket message : ", event.data); const rawData = event.data; if (typeof rawData === 'string' || rawData instanceof String) { this.handleMessage(JSON.parse(rawData as string) as WebSocketMessage); diff --git a/interface/src/components/WebSocketFormLoader.tsx b/interface/src/components/WebSocketFormLoader.tsx old mode 100644 new mode 100755 diff --git a/interface/src/components/index.ts b/interface/src/components/index.ts old mode 100644 new mode 100755 diff --git a/interface/src/features/ApplicationContext.tsx b/interface/src/features/ApplicationContext.tsx old mode 100644 new mode 100755 diff --git a/interface/src/features/FeaturesContext.tsx b/interface/src/features/FeaturesContext.tsx old mode 100644 new mode 100755 diff --git a/interface/src/features/FeaturesWrapper.tsx b/interface/src/features/FeaturesWrapper.tsx old mode 100644 new mode 100755 diff --git a/interface/src/features/types.ts b/interface/src/features/types.ts old mode 100644 new mode 100755 diff --git a/interface/src/history.ts b/interface/src/history.ts old mode 100644 new mode 100755 diff --git a/interface/src/index.tsx b/interface/src/index.tsx old mode 100644 new mode 100755 diff --git a/interface/src/mqtt/Mqtt.tsx b/interface/src/mqtt/Mqtt.tsx old mode 100644 new mode 100755 diff --git a/interface/src/mqtt/MqttSettingsController.tsx b/interface/src/mqtt/MqttSettingsController.tsx old mode 100644 new mode 100755 diff --git a/interface/src/mqtt/MqttSettingsForm.tsx b/interface/src/mqtt/MqttSettingsForm.tsx old mode 100644 new mode 100755 diff --git a/interface/src/mqtt/MqttStatus.ts b/interface/src/mqtt/MqttStatus.ts old mode 100644 new mode 100755 diff --git a/interface/src/mqtt/MqttStatusController.tsx b/interface/src/mqtt/MqttStatusController.tsx old mode 100644 new mode 100755 diff --git a/interface/src/mqtt/MqttStatusForm.tsx b/interface/src/mqtt/MqttStatusForm.tsx old mode 100644 new mode 100755 diff --git a/interface/src/mqtt/types.ts b/interface/src/mqtt/types.ts old mode 100644 new mode 100755 diff --git a/interface/src/ntp/NTPSettingsController.tsx b/interface/src/ntp/NTPSettingsController.tsx old mode 100644 new mode 100755 diff --git a/interface/src/ntp/NTPSettingsForm.tsx b/interface/src/ntp/NTPSettingsForm.tsx old mode 100644 new mode 100755 diff --git a/interface/src/ntp/NTPStatus.ts b/interface/src/ntp/NTPStatus.ts old mode 100644 new mode 100755 diff --git a/interface/src/ntp/NTPStatusController.tsx b/interface/src/ntp/NTPStatusController.tsx old mode 100644 new mode 100755 diff --git a/interface/src/ntp/NTPStatusForm.tsx b/interface/src/ntp/NTPStatusForm.tsx old mode 100644 new mode 100755 diff --git a/interface/src/ntp/NetworkTime.tsx b/interface/src/ntp/NetworkTime.tsx old mode 100644 new mode 100755 diff --git a/interface/src/ntp/TZ.tsx b/interface/src/ntp/TZ.tsx old mode 100644 new mode 100755 diff --git a/interface/src/ntp/TimeFormat.ts b/interface/src/ntp/TimeFormat.ts old mode 100644 new mode 100755 diff --git a/interface/src/ntp/types.ts b/interface/src/ntp/types.ts old mode 100644 new mode 100755 diff --git a/interface/src/project/AquariumController.tsx b/interface/src/project/AquariumController.tsx old mode 100644 new mode 100755 diff --git a/interface/src/project/Information.tsx b/interface/src/project/Information.tsx old mode 100644 new mode 100755 diff --git a/interface/src/project/LightMqttSettingsController.tsx b/interface/src/project/LightMqttSettingsController.tsx old mode 100644 new mode 100755 diff --git a/interface/src/project/LightStateRestController.tsx b/interface/src/project/LightStateRestController.tsx old mode 100644 new mode 100755 diff --git a/interface/src/project/LightStateWebSocketController.tsx b/interface/src/project/LightStateWebSocketController.tsx old mode 100644 new mode 100755 diff --git a/interface/src/project/ProjectMenu.tsx b/interface/src/project/ProjectMenu.tsx old mode 100644 new mode 100755 diff --git a/interface/src/project/ProjectRouting.tsx b/interface/src/project/ProjectRouting.tsx old mode 100644 new mode 100755 diff --git a/interface/src/project/RgbCycleController.tsx b/interface/src/project/RgbCycleController.tsx old mode 100644 new mode 100755 diff --git a/interface/src/project/RgbStateWebSocketController.tsx b/interface/src/project/RgbStateWebSocketController.tsx old mode 100644 new mode 100755 index cf67a7f..846899e --- a/interface/src/project/RgbStateWebSocketController.tsx +++ b/interface/src/project/RgbStateWebSocketController.tsx @@ -47,7 +47,7 @@ function RgbStateWebSocketControllerForm(props: RgbStateWebSocketControllerFormP }, saveData); } - console.log(data); + return ( diff --git a/interface/src/project/components/RgbSettings.js b/interface/src/project/components/RgbSettings.js old mode 100644 new mode 100755 diff --git a/interface/src/project/components/RgbSlider.js b/interface/src/project/components/RgbSlider.js old mode 100644 new mode 100755 diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts old mode 100644 new mode 100755 diff --git a/interface/src/react-app-env.d.ts b/interface/src/react-app-env.d.ts old mode 100644 new mode 100755 diff --git a/interface/src/security/ManageUsersController.tsx b/interface/src/security/ManageUsersController.tsx old mode 100644 new mode 100755 diff --git a/interface/src/security/ManageUsersForm.tsx b/interface/src/security/ManageUsersForm.tsx old mode 100644 new mode 100755 diff --git a/interface/src/security/Security.tsx b/interface/src/security/Security.tsx old mode 100644 new mode 100755 diff --git a/interface/src/security/SecuritySettingsController.tsx b/interface/src/security/SecuritySettingsController.tsx old mode 100644 new mode 100755 diff --git a/interface/src/security/SecuritySettingsForm.tsx b/interface/src/security/SecuritySettingsForm.tsx old mode 100644 new mode 100755 diff --git a/interface/src/security/UserForm.tsx b/interface/src/security/UserForm.tsx old mode 100644 new mode 100755 diff --git a/interface/src/security/types.ts b/interface/src/security/types.ts old mode 100644 new mode 100755 diff --git a/interface/src/serviceWorker.ts b/interface/src/serviceWorker.ts old mode 100644 new mode 100755 diff --git a/interface/src/system/OTASettingsController.tsx b/interface/src/system/OTASettingsController.tsx old mode 100644 new mode 100755 diff --git a/interface/src/system/OTASettingsForm.tsx b/interface/src/system/OTASettingsForm.tsx old mode 100644 new mode 100755 diff --git a/interface/src/system/System.tsx b/interface/src/system/System.tsx old mode 100644 new mode 100755 diff --git a/interface/src/system/SystemStatusController.tsx b/interface/src/system/SystemStatusController.tsx old mode 100644 new mode 100755 diff --git a/interface/src/system/SystemStatusForm.tsx b/interface/src/system/SystemStatusForm.tsx old mode 100644 new mode 100755 diff --git a/interface/src/system/UploadFirmwareController.tsx b/interface/src/system/UploadFirmwareController.tsx old mode 100644 new mode 100755 diff --git a/interface/src/system/UploadFirmwareForm.tsx b/interface/src/system/UploadFirmwareForm.tsx old mode 100644 new mode 100755 diff --git a/interface/src/system/types.ts b/interface/src/system/types.ts old mode 100644 new mode 100755 diff --git a/interface/src/validators/index.ts b/interface/src/validators/index.ts old mode 100644 new mode 100755 diff --git a/interface/src/validators/isHostname.ts b/interface/src/validators/isHostname.ts old mode 100644 new mode 100755 diff --git a/interface/src/validators/isIP.ts b/interface/src/validators/isIP.ts old mode 100644 new mode 100755 diff --git a/interface/src/validators/optional.ts b/interface/src/validators/optional.ts old mode 100644 new mode 100755 diff --git a/interface/src/validators/or.ts b/interface/src/validators/or.ts old mode 100644 new mode 100755 diff --git a/interface/src/wifi/WiFiConnection.tsx b/interface/src/wifi/WiFiConnection.tsx old mode 100644 new mode 100755 diff --git a/interface/src/wifi/WiFiConnectionContext.tsx b/interface/src/wifi/WiFiConnectionContext.tsx old mode 100644 new mode 100755 diff --git a/interface/src/wifi/WiFiNetworkScanner.tsx b/interface/src/wifi/WiFiNetworkScanner.tsx old mode 100644 new mode 100755 diff --git a/interface/src/wifi/WiFiNetworkSelector.tsx b/interface/src/wifi/WiFiNetworkSelector.tsx old mode 100644 new mode 100755 diff --git a/interface/src/wifi/WiFiSecurityModes.ts b/interface/src/wifi/WiFiSecurityModes.ts old mode 100644 new mode 100755 diff --git a/interface/src/wifi/WiFiSettingsController.tsx b/interface/src/wifi/WiFiSettingsController.tsx old mode 100644 new mode 100755 diff --git a/interface/src/wifi/WiFiSettingsForm.tsx b/interface/src/wifi/WiFiSettingsForm.tsx old mode 100644 new mode 100755 diff --git a/interface/src/wifi/WiFiStatus.ts b/interface/src/wifi/WiFiStatus.ts old mode 100644 new mode 100755 diff --git a/interface/src/wifi/WiFiStatusController.tsx b/interface/src/wifi/WiFiStatusController.tsx old mode 100644 new mode 100755 diff --git a/interface/src/wifi/WiFiStatusForm.tsx b/interface/src/wifi/WiFiStatusForm.tsx old mode 100644 new mode 100755 diff --git a/interface/src/wifi/types.ts b/interface/src/wifi/types.ts old mode 100644 new mode 100755 diff --git a/interface/tsconfig.json b/interface/tsconfig.json old mode 100644 new mode 100755 diff --git a/lib/framework/APSettingsService.cpp b/lib/framework/APSettingsService.cpp old mode 100644 new mode 100755 diff --git a/lib/framework/APSettingsService.h b/lib/framework/APSettingsService.h old mode 100644 new mode 100755 diff --git a/lib/framework/APStatus.cpp b/lib/framework/APStatus.cpp old mode 100644 new mode 100755 diff --git a/lib/framework/APStatus.h b/lib/framework/APStatus.h old mode 100644 new mode 100755 diff --git a/lib/framework/ArduinoJsonJWT.cpp b/lib/framework/ArduinoJsonJWT.cpp old mode 100644 new mode 100755 diff --git a/lib/framework/ArduinoJsonJWT.h b/lib/framework/ArduinoJsonJWT.h old mode 100644 new mode 100755 diff --git a/lib/framework/AuthenticationService.cpp b/lib/framework/AuthenticationService.cpp old mode 100644 new mode 100755 diff --git a/lib/framework/AuthenticationService.h b/lib/framework/AuthenticationService.h old mode 100644 new mode 100755 diff --git a/lib/framework/ESP8266React.cpp b/lib/framework/ESP8266React.cpp old mode 100644 new mode 100755 diff --git a/lib/framework/ESP8266React.h b/lib/framework/ESP8266React.h old mode 100644 new mode 100755 diff --git a/lib/framework/ESPFS.h b/lib/framework/ESPFS.h old mode 100644 new mode 100755 diff --git a/lib/framework/ESPUtils.h b/lib/framework/ESPUtils.h old mode 100644 new mode 100755 diff --git a/lib/framework/FSPersistence.h b/lib/framework/FSPersistence.h old mode 100644 new mode 100755 index d9fc49c..7b5a615 --- a/lib/framework/FSPersistence.h +++ b/lib/framework/FSPersistence.h @@ -33,7 +33,7 @@ class FSPersistence { JsonObject jsonObject = jsonDocument.as(); Serial.println("FS read called"); - serializeJsonPretty(jsonDocument, Serial); + // serializeJsonPretty(jsonDocument, Serial); _statefulService->updateWithoutPropagation(jsonObject, _stateUpdater); settingsFile.close(); @@ -62,7 +62,7 @@ class FSPersistence { } Serial.println("FS write called"); - serializeJsonPretty(jsonDocument, Serial); + // serializeJsonPretty(jsonDocument, Serial); // serialize the data to the file diff --git a/lib/framework/FactoryResetService.cpp b/lib/framework/FactoryResetService.cpp old mode 100644 new mode 100755 diff --git a/lib/framework/FactoryResetService.h b/lib/framework/FactoryResetService.h old mode 100644 new mode 100755 diff --git a/lib/framework/Features.h b/lib/framework/Features.h old mode 100644 new mode 100755 diff --git a/lib/framework/FeaturesService.cpp b/lib/framework/FeaturesService.cpp old mode 100644 new mode 100755 diff --git a/lib/framework/FeaturesService.h b/lib/framework/FeaturesService.h old mode 100644 new mode 100755 diff --git a/lib/framework/HttpEndpoint.h b/lib/framework/HttpEndpoint.h old mode 100644 new mode 100755 diff --git a/lib/framework/JsonUtils.h b/lib/framework/JsonUtils.h old mode 100644 new mode 100755 diff --git a/lib/framework/MqttPubSub.h b/lib/framework/MqttPubSub.h old mode 100644 new mode 100755 diff --git a/lib/framework/MqttSettingsService.cpp b/lib/framework/MqttSettingsService.cpp old mode 100644 new mode 100755 diff --git a/lib/framework/MqttSettingsService.h b/lib/framework/MqttSettingsService.h old mode 100644 new mode 100755 diff --git a/lib/framework/MqttStatus.cpp b/lib/framework/MqttStatus.cpp old mode 100644 new mode 100755 diff --git a/lib/framework/MqttStatus.h b/lib/framework/MqttStatus.h old mode 100644 new mode 100755 diff --git a/lib/framework/NTPSettingsService.cpp b/lib/framework/NTPSettingsService.cpp old mode 100644 new mode 100755 diff --git a/lib/framework/NTPSettingsService.h b/lib/framework/NTPSettingsService.h old mode 100644 new mode 100755 diff --git a/lib/framework/NTPStatus.cpp b/lib/framework/NTPStatus.cpp old mode 100644 new mode 100755 diff --git a/lib/framework/NTPStatus.h b/lib/framework/NTPStatus.h old mode 100644 new mode 100755 diff --git a/lib/framework/OTASettingsService.cpp b/lib/framework/OTASettingsService.cpp old mode 100644 new mode 100755 diff --git a/lib/framework/OTASettingsService.h b/lib/framework/OTASettingsService.h old mode 100644 new mode 100755 diff --git a/lib/framework/RestartService.cpp b/lib/framework/RestartService.cpp old mode 100644 new mode 100755 diff --git a/lib/framework/RestartService.h b/lib/framework/RestartService.h old mode 100644 new mode 100755 diff --git a/lib/framework/SecurityManager.h b/lib/framework/SecurityManager.h old mode 100644 new mode 100755 diff --git a/lib/framework/SecuritySettingsService.cpp b/lib/framework/SecuritySettingsService.cpp old mode 100644 new mode 100755 diff --git a/lib/framework/SecuritySettingsService.h b/lib/framework/SecuritySettingsService.h old mode 100644 new mode 100755 diff --git a/lib/framework/StatefulService.cpp b/lib/framework/StatefulService.cpp old mode 100644 new mode 100755 diff --git a/lib/framework/StatefulService.h b/lib/framework/StatefulService.h old mode 100644 new mode 100755 diff --git a/lib/framework/SystemStatus.cpp b/lib/framework/SystemStatus.cpp old mode 100644 new mode 100755 diff --git a/lib/framework/SystemStatus.h b/lib/framework/SystemStatus.h old mode 100644 new mode 100755 diff --git a/lib/framework/UploadFirmwareService.cpp b/lib/framework/UploadFirmwareService.cpp old mode 100644 new mode 100755 diff --git a/lib/framework/UploadFirmwareService.h b/lib/framework/UploadFirmwareService.h old mode 100644 new mode 100755 diff --git a/lib/framework/WebSocketTxRx.h b/lib/framework/WebSocketTxRx.h old mode 100644 new mode 100755 diff --git a/lib/framework/WiFiScanner.cpp b/lib/framework/WiFiScanner.cpp old mode 100644 new mode 100755 diff --git a/lib/framework/WiFiScanner.h b/lib/framework/WiFiScanner.h old mode 100644 new mode 100755 diff --git a/lib/framework/WiFiSettingsService.cpp b/lib/framework/WiFiSettingsService.cpp old mode 100644 new mode 100755 diff --git a/lib/framework/WiFiSettingsService.h b/lib/framework/WiFiSettingsService.h old mode 100644 new mode 100755 diff --git a/lib/framework/WiFiStatus.cpp b/lib/framework/WiFiStatus.cpp old mode 100644 new mode 100755 diff --git a/lib/framework/WiFiStatus.h b/lib/framework/WiFiStatus.h old mode 100644 new mode 100755 diff --git a/lib/readme.txt b/lib/readme.txt old mode 100644 new mode 100755 diff --git a/media/build.png b/media/build.png old mode 100644 new mode 100755 diff --git a/media/dark.png b/media/dark.png old mode 100644 new mode 100755 diff --git a/media/devserver.png b/media/devserver.png old mode 100644 new mode 100755 diff --git a/media/esp12e.jpg b/media/esp12e.jpg old mode 100644 new mode 100755 diff --git a/media/esp32.jpg b/media/esp32.jpg old mode 100644 new mode 100755 diff --git a/media/framework.png b/media/framework.png old mode 100644 new mode 100755 diff --git a/media/screenshots.png b/media/screenshots.png old mode 100644 new mode 100755 diff --git a/media/uploadfs.png b/media/uploadfs.png old mode 100644 new mode 100755 diff --git a/media/uploadfw.png b/media/uploadfw.png old mode 100644 new mode 100755 diff --git a/platformio.ini b/platformio.ini old mode 100644 new mode 100755 index 4cc0ee3..aaabc34 --- a/platformio.ini +++ b/platformio.ini @@ -1,50 +1,98 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + [platformio] extra_configs = - factory_settings.ini - features.ini + factory_settings.ini + features.ini default_envs = esp12e -;default_envs = node32s [env] -build_flags= - ${factory_settings.build_flags} - ${features.build_flags} - -D NO_GLOBAL_ARDUINOOTA - ; Uncomment ENABLE_CORS to enable Cross-Origin Resource Sharing (required for local React development) - -D ENABLE_CORS - -D CORS_ORIGIN=\"http://localhost:3000\" - ; Uncomment PROGMEM_WWW to enable the storage of the WWW data in PROGMEM - -D PROGMEM_WWW - -; ensure transitive dependencies are included for correct platforms only +build_flags = + ${factory_settings.build_flags} + ${features.build_flags} + -D NO_GLOBAL_ARDUINOOTA + -D ENABLE_CORS + -D CORS_ORIGIN=\"http://localhost:3000\" + -D PROGMEM_WWW lib_compat_mode = strict - -; Uncomment & modify the lines below in order to configure OTA updates -;upload_flags = -; --port=8266 -; --auth=esp-react -;upload_port = 192.168.0.11 - framework = arduino monitor_speed = 115200 - extra_scripts = - pre:scripts/build_interface.py + pre:scripts/build_interface.py +lib_deps = + ArduinoJson@>=6.0.0,<7.0.0 + ESP Async WebServer@>=1.2.0,<2.0.0 + AsyncMqttClient@>=0.8.2,<1.0.0 + fastled/FastLED @ ^3.3.3 + paulstoffregen/Time @ ^1.6 + paulstoffregen/TimeAlarms @ 0.0.0-alpha+sha.c291c1ddad -lib_deps = - ArduinoJson@>=6.0.0,<7.0.0 - ESP Async WebServer@>=1.2.0,<2.0.0 - AsyncMqttClient@>=0.8.2,<1.0.0 - fastled/FastLED @ ^3.3.3 - [env:esp12e] platform = espressif8266 board = esp12e board_build.f_cpu = 160000000L board_build.filesystem = littlefs +lib_deps = + paulstoffregen/TimeAlarms@0.0.0-alpha+sha.c291c1ddad + paulstoffregen/Time@^1.6.0 [env:node32s] -; Comment out min_spiffs.csv setting if disabling PROGMEM_WWW with ESP32 board_build.partitions = min_spiffs.csv platform = espressif32 board = node32s +lib_deps = + paulstoffregen/TimeAlarms@0.0.0-alpha+sha.c291c1ddad + paulstoffregen/Time@^1.6.0 + +[factory_settings] +build_flags = + -D FACTORY_WIFI_SSID=\"Janis_network\" + -D FACTORY_WIFI_PASSWORD=\"8378969948\" + -D FACTORY_WIFI_HOSTNAME=\"esp-react\" + + -D FACTORY_AP_PROVISION_MODE=AP_MODE_DISCONNECTED + -D FACTORY_AP_SSID=\"ESP8266-React\" + -D FACTORY_AP_PASSWORD=\"esp-react\" + -D FACTORY_AP_LOCAL_IP=\"192.168.4.1\" + -D FACTORY_AP_GATEWAY_IP=\"192.168.4.1\" + -D FACTORY_AP_SUBNET_MASK=\"255.255.255.0\" + + -D FACTORY_ADMIN_USERNAME=\"admin\" + -D FACTORY_ADMIN_PASSWORD=\"admin\" + -D FACTORY_GUEST_USERNAME=\"guest\" + -D FACTORY_GUEST_PASSWORD=\"guest\" + + -D FACTORY_NTP_ENABLED=true + -D FACTORY_NTP_TIME_ZONE_LABEL=\"Europe/Riga\" + -D FACTORY_NTP_TIME_ZONE_FORMAT=\"GMT0BST,M3.5.0/1,M10.5.0\" + -D FACTORY_NTP_SERVER=\"time.google.com\" + + -D FACTORY_OTA_PORT=8266 + -D FACTORY_OTA_PASSWORD=\"esp-react\" + -D FACTORY_OTA_ENABLED=true + + -D FACTORY_MQTT_ENABLED=false + -D FACTORY_MQTT_HOST=\"test.mosquitto.org\" + -D FACTORY_MQTT_PORT=1883 + -D FACTORY_MQTT_USERNAME=\"\" + -D FACTORY_MQTT_PASSWORD=\"\" + -D FACTORY_MQTT_KEEP_ALIVE=60 + -D FACTORY_MQTT_CLEAN_SESSION=true + -D FACTORY_MQTT_MAX_TOPIC_LENGTH=128 + +[features] +build_flags = + -D FT_PROJECT=1 + -D FT_SECURITY=1 + -D FT_MQTT=0 + -D FT_NTP=1 + -D FT_OTA=0 + -D FT_UPLOAD_FIRMWARE=0 diff --git a/scripts/build_interface.py b/scripts/build_interface.py old mode 100644 new mode 100755 diff --git a/src/RgbCycleService.cpp b/src/RgbCycleService.cpp old mode 100644 new mode 100755 index 65afb6a..facb435 --- a/src/RgbCycleService.cpp +++ b/src/RgbCycleService.cpp @@ -15,18 +15,12 @@ RgbCycleService::RgbCycleService(AsyncWebServer* server, SecurityManager* securi RGB_CYCLE_SOCKET_PATH, securityManager, AuthenticationPredicates::IS_AUTHENTICATED), - _fsPersistence(RgbCycleState::read, - RgbCycleState::update, - this, - fs, - "/config/RgbCycle.json", - 4096) { - + _fsPersistence(RgbCycleState::read, RgbCycleState::update, this, fs, "/config/RgbCycle.json", 4096) { // add event listener for rgbCycle Object - //addUpdateHandler([&](const String& originId) { onConfigUpdated(); }, false); + // addUpdateHandler([&](const String& originId) { onConfigUpdated(); }, false); } -void RgbCycleService::begin(){ - Serial.println("Cycle begin ..."); - _fsPersistence.readFromFS(); +void RgbCycleService::begin() { + Serial.println("Cycle begin ..."); + _fsPersistence.readFromFS(); } \ No newline at end of file diff --git a/src/RgbCycleService.h b/src/RgbCycleService.h old mode 100644 new mode 100755 index dd79ea0..afb8297 --- a/src/RgbCycleService.h +++ b/src/RgbCycleService.h @@ -6,14 +6,6 @@ #include #include -#ifdef ESP32 -#define LED_ON 0x1 -#define LED_OFF 0x0 -#elif defined(ESP8266) -#define LED_ON 0x0 -#define LED_OFF 0x1 - -#endif #define RGB_CYCLE_ENDPOINT_PATH "/rest/rgbCycle" #define RGB_CYCLE_SOCKET_PATH "/ws/rgbCycle" @@ -40,6 +32,7 @@ class RgbCycleState { for (size_t i = 0; i < 49; i++) { root["graph"]["red"].add(settings.red[i]); + // root["graph"]["green"].add(settings.green[i]); // root["graph"]["blue"].add(settings.blue[i]); diff --git a/src/RgbDriver.cpp b/src/RgbDriver.cpp old mode 100644 new mode 100755 index 964f5b7..0bc4028 --- a/src/RgbDriver.cpp +++ b/src/RgbDriver.cpp @@ -1,5 +1,7 @@ #include #include +#include +#include RgbDriver* RgbDriver::pInstance = 0; @@ -17,7 +19,16 @@ void RgbDriver::updateRgb(int red, int green, int blue) { FastLED.show(); } -void RgbDriver::turnOff(){ - pInstance->leds[0].fadeToBlackBy(255); - FastLED.show(); +void RgbDriver::updateRgb() { + Serial.println(timeStatus()); + FastLED.show(); +} + +void RgbDriver::test() { + // Serial.println("test"); +} + +void RgbDriver::turnOff() { + pInstance->leds[0].setRGB(0, 0, 0); + FastLED.show(); } \ No newline at end of file diff --git a/src/RgbDriver.h b/src/RgbDriver.h old mode 100644 new mode 100755 index f3b36a1..2a9b464 --- a/src/RgbDriver.h +++ b/src/RgbDriver.h @@ -11,6 +11,9 @@ class RgbDriver { public: CRGB leds[NUM_LEDS]; static void updateRgb(int red, int blue, int green); + static void updateRgb(); + static void turnOn(); + static void test(); static void turnOff(); static RgbDriver* getInstance(); int data; diff --git a/src/RgbStateService.cpp b/src/RgbStateService.cpp old mode 100644 new mode 100755 index 0d0f752..a5ee1cc --- a/src/RgbStateService.cpp +++ b/src/RgbStateService.cpp @@ -36,6 +36,8 @@ void RgbStateService::onConfigUpdated() { Serial.println("onConfigUpdated called .."); } + + void RgbStateService::registerConfig() { String configTopic; String subTopic; diff --git a/src/RgbStateService.h b/src/RgbStateService.h old mode 100644 new mode 100755 index d0c6d20..892bc42 --- a/src/RgbStateService.h +++ b/src/RgbStateService.h @@ -34,6 +34,7 @@ class RgbState { uint8_t greenValue; uint8_t blueValue; RgbDriver* driver; + time_t time; // Class constructor RgbState() { @@ -62,6 +63,10 @@ class RgbState { return StateUpdateResult::UNCHANGED; } + // static int getColorValues(){ + // Serial.println(redValue); + // } + bool checkRgbValues(int red, int green, int blue) { if (red != redValue || green != greenValue || blue != blueValue) { redValue = red; diff --git a/src/main.cpp b/src/main.cpp old mode 100644 new mode 100755 index 3178858..6f09ef3 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #define SERIAL_BAUD_RATE 115200 @@ -10,18 +11,23 @@ ESP8266React esp8266React(&server); RgbStateService rgbStateService = RgbStateService(&server, esp8266React.getSecurityManager(), esp8266React.getFS()); RgbCycleService rgbCycleService = RgbCycleService(&server, esp8266React.getSecurityManager(), esp8266React.getFS()); -// update_handler_id_t updateHandler = rgbStateService.addUpdateHandler([&](const String& originId) { -// Serial.print("The light's state has been updated by: "); +// update_handler_id_t updateHandler = rgbCycleService.addUpdateHandler([&](const String& originId) { +// Serial.print("The RgbCycle's state has been updated by: "); // Serial.println(originId); // }); +unsigned long previousMillis = 0; +const long interval = 1000; +void turnLightsOn(); +void turnLightsOff(); + void setup() { // start serial and filesystem Serial.begin(SERIAL_BAUD_RATE); - // RgbState RgbState (); + setTime(time(nullptr)); - // start the framework and demo project + // start the framework and project esp8266React.begin(); // load the initial RGB object @@ -30,9 +36,63 @@ void setup() { // start the server server.begin(); + + time_t now = time(nullptr); + + struct tm* time; + time = localtime(&now); + + setTime(time->tm_hour, time->tm_min, time->tm_sec, time->tm_mday, time->tm_mon + 1, time->tm_year + 1900); + + Alarm.alarmRepeat(20, 54, 0, turnLightsOn); + Alarm.alarmRepeat(20, 55, 0, turnLightsOff); + + // update driver every second + Alarm.timerRepeat(1, RgbDriver::updateRgb); + // Alarm.timerRepeat(5, turnLightsOn); + // Alarm.timerRepeat(8, turnLightsOff); } void loop() { // run the framework's loop function esp8266React.loop(); + Alarm.delay(1000); + + // rgbCycleService.update( + // [&](RgbCycleState& state) { + // Serial.println(state.red[22]); + // return StateUpdateResult::CHANGED; // notify StatefulService by returning CHANGED + // }, + // "timer"); + // } +} + +void turnLightsOff() { + Serial.print("Led off called... "); + + rgbStateService.update( + [&](RgbState& state) { + if (state.ledOn) { + RgbDriver::updateRgb(0, 0, 0); + state.ledOn = false; + return StateUpdateResult::CHANGED; + } + return StateUpdateResult::UNCHANGED; + }, + "rgbState"); } + +void turnLightsOn() { + Serial.println("Led on called.."); + + rgbStateService.update( + [&](RgbState& state) { + if (!state.ledOn) { + RgbDriver::updateRgb(state.redValue, state.greenValue, state.blueValue); + state.ledOn = true; + return StateUpdateResult::CHANGED; + } + return StateUpdateResult::UNCHANGED; + }, + "rgbState"); +} \ No newline at end of file From e2e1baf1bf5fe4bb50846abfa8867a6175701c9a Mon Sep 17 00:00:00 2001 From: janis Date: Mon, 22 Mar 2021 19:44:42 +0200 Subject: [PATCH 32/36] Set timerAlarms date and time. --- src/RgbDriver.cpp | 5 ----- src/RgbDriver.h | 4 +--- src/RgbStateService.cpp | 10 +-------- src/main.cpp | 50 +++++++++++++++++++++++++---------------- 4 files changed, 33 insertions(+), 36 deletions(-) diff --git a/src/RgbDriver.cpp b/src/RgbDriver.cpp index 0bc4028..fda98f7 100755 --- a/src/RgbDriver.cpp +++ b/src/RgbDriver.cpp @@ -20,14 +20,9 @@ void RgbDriver::updateRgb(int red, int green, int blue) { } void RgbDriver::updateRgb() { - Serial.println(timeStatus()); FastLED.show(); } -void RgbDriver::test() { - // Serial.println("test"); -} - void RgbDriver::turnOff() { pInstance->leds[0].setRGB(0, 0, 0); FastLED.show(); diff --git a/src/RgbDriver.h b/src/RgbDriver.h index 2a9b464..80e01b4 100755 --- a/src/RgbDriver.h +++ b/src/RgbDriver.h @@ -13,13 +13,11 @@ class RgbDriver { static void updateRgb(int red, int blue, int green); static void updateRgb(); static void turnOn(); - static void test(); static void turnOff(); static RgbDriver* getInstance(); - int data; private: - static RgbDriver* pInstance; + static RgbDriver* pInstance; }; #endif \ No newline at end of file diff --git a/src/RgbStateService.cpp b/src/RgbStateService.cpp index a5ee1cc..bd79bf1 100755 --- a/src/RgbStateService.cpp +++ b/src/RgbStateService.cpp @@ -15,13 +15,7 @@ RgbStateService::RgbStateService(AsyncWebServer* server, SecurityManager* securi RGB_SETTINGS_SOCKET_PATH, securityManager, AuthenticationPredicates::IS_AUTHENTICATED), - _fsPersistence(RgbState::read, - RgbState::update, - this, - fs, - "/config/RgbState.json") { - // configure led to be output - // pinMode(LED_PIN, OUTPUT); + _fsPersistence(RgbState::read, RgbState::update, this, fs, "/config/RgbState.json") { // configure settings service update handler to update LED state addUpdateHandler([&](const String& originId) { onConfigUpdated(); }, false); @@ -36,8 +30,6 @@ void RgbStateService::onConfigUpdated() { Serial.println("onConfigUpdated called .."); } - - void RgbStateService::registerConfig() { String configTopic; String subTopic; diff --git a/src/main.cpp b/src/main.cpp index 6f09ef3..82d3f81 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -14,19 +14,18 @@ RgbCycleService rgbCycleService = RgbCycleService(&server, esp8266React.getSecur // update_handler_id_t updateHandler = rgbCycleService.addUpdateHandler([&](const String& originId) { // Serial.print("The RgbCycle's state has been updated by: "); // Serial.println(originId); -// }); +int currentSecond = 0; +const int trigerTime = 15; +bool isTimeSet = false; -unsigned long previousMillis = 0; -const long interval = 1000; void turnLightsOn(); void turnLightsOff(); +void onEverySecond(); void setup() { // start serial and filesystem Serial.begin(SERIAL_BAUD_RATE); - setTime(time(nullptr)); - // start the framework and project esp8266React.begin(); @@ -37,20 +36,8 @@ void setup() { // start the server server.begin(); - time_t now = time(nullptr); - - struct tm* time; - time = localtime(&now); - - setTime(time->tm_hour, time->tm_min, time->tm_sec, time->tm_mday, time->tm_mon + 1, time->tm_year + 1900); - - Alarm.alarmRepeat(20, 54, 0, turnLightsOn); - Alarm.alarmRepeat(20, 55, 0, turnLightsOff); - - // update driver every second - Alarm.timerRepeat(1, RgbDriver::updateRgb); - // Alarm.timerRepeat(5, turnLightsOn); - // Alarm.timerRepeat(8, turnLightsOff); + // Once a second call onEverySecond function + Alarm.timerRepeat(1, onEverySecond); } void loop() { @@ -95,4 +82,29 @@ void turnLightsOn() { return StateUpdateResult::UNCHANGED; }, "rgbState"); +} + +void onEverySecond() { + + if (!isTimeSet && currentSecond > trigerTime) { + Serial.println("Setting time..."); + time_t now = time(nullptr); + tm* timeinfo = localtime(&now); + int sec = timeinfo->tm_sec; + int min = timeinfo->tm_min; + int hour = timeinfo->tm_hour; + int day = timeinfo->tm_mday; + int month = timeinfo->tm_mon + 1; + int year = timeinfo->tm_year + 1900; + setTime(hour, min, sec, day, month, year); + Alarm.alarmRepeat(12, 00, 0, turnLightsOn); + Alarm.alarmRepeat(22, 00, 0, turnLightsOff); + isTimeSet = true; + } + + if(!isTimeSet){ + currentSecond ++; + } + + RgbDriver::updateRgb(); } \ No newline at end of file From 39f817630473c733973886bd562d9680267ff3dd Mon Sep 17 00:00:00 2001 From: janis Date: Mon, 22 Mar 2021 19:46:16 +0200 Subject: [PATCH 33/36] Cleanup --- src/main.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 82d3f81..e793ed6 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -55,8 +55,6 @@ void loop() { } void turnLightsOff() { - Serial.print("Led off called... "); - rgbStateService.update( [&](RgbState& state) { if (state.ledOn) { @@ -70,8 +68,6 @@ void turnLightsOff() { } void turnLightsOn() { - Serial.println("Led on called.."); - rgbStateService.update( [&](RgbState& state) { if (!state.ledOn) { From fa16d7ab80495a15bef9985a42cc9acfb52828cd Mon Sep 17 00:00:00 2001 From: janis Date: Tue, 23 Mar 2021 21:10:28 +0200 Subject: [PATCH 34/36] Separate colors --- interface/src/project/Information.tsx | 53 ++++---------------- interface/src/project/RgbCycleController.js | 38 ++++++++++++++ interface/src/project/RgbCycleController.tsx | 46 ----------------- src/BlueService.cpp | 19 +++++++ src/BlueService.h | 38 ++++++++++++++ src/GreenService.cpp | 19 +++++++ src/GreenService.h | 38 ++++++++++++++ src/RedService.cpp | 19 +++++++ src/RedService.h | 38 ++++++++++++++ src/RgbCycleService.h | 3 +- src/main.cpp | 11 ++++ 11 files changed, 230 insertions(+), 92 deletions(-) create mode 100755 interface/src/project/RgbCycleController.js delete mode 100755 interface/src/project/RgbCycleController.tsx create mode 100644 src/BlueService.cpp create mode 100644 src/BlueService.h create mode 100644 src/GreenService.cpp create mode 100644 src/GreenService.h create mode 100644 src/RedService.cpp create mode 100644 src/RedService.h diff --git a/interface/src/project/Information.tsx b/interface/src/project/Information.tsx index c56c314..83271dc 100755 --- a/interface/src/project/Information.tsx +++ b/interface/src/project/Information.tsx @@ -8,64 +8,29 @@ class DemoInformation extends Component { return ( - This simple demo project allows you to control the built-in LED. - It demonstrates how the esp8266-react framework may be extended for your own IoT project. + This interface allows you to control the aquarium lights. - It is recommended that you keep your project interface code under the project directory. - This serves to isolate your project code from the from the rest of the user interface which should - simplify merges should you wish to update your project with future framework changes. - - - The demo project interface code is stored in the 'interface/src/project' directory: - + It is still in development process and new features are being added on regular basis. +
- - - - - - - - - - - - - - - - See the project README for a full description of the demo project. + See my projects at github . diff --git a/interface/src/project/RgbCycleController.js b/interface/src/project/RgbCycleController.js new file mode 100755 index 0000000..08632a8 --- /dev/null +++ b/interface/src/project/RgbCycleController.js @@ -0,0 +1,38 @@ +import React, { Component } from 'react'; +import { Switch } from '@material-ui/core'; +import { WEB_SOCKET_ROOT } from '../api'; +import { WebSocketFormLoader, webSocketController } from '../components'; +import { SectionContent } from '../components'; +import RgbSettings from './components/RgbSettings'; + +export const RGB_SETTINGS_WEBSOCKET_URL = WEB_SOCKET_ROOT + "rgbCycle"; + +const RgbCycleController = (props) => { + const test = webSocketController(WEB_SOCKET_ROOT + "green", 100, RgbCycleController); + console.log(test.data) + return ( + + ( + + )} + /> + + ) +} + +export default webSocketController(RGB_SETTINGS_WEBSOCKET_URL, 100, RgbCycleController); + +const RgbCycleControllerForm = (props) => { + + const { data, saveData, setData } = props; + + return ( + + ); +} \ No newline at end of file diff --git a/interface/src/project/RgbCycleController.tsx b/interface/src/project/RgbCycleController.tsx deleted file mode 100755 index 3a13a38..0000000 --- a/interface/src/project/RgbCycleController.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import React, { Component } from 'react'; - -import {Switch } from '@material-ui/core'; -import { WEB_SOCKET_ROOT } from '../api'; -import { WebSocketControllerProps, WebSocketFormLoader, WebSocketFormProps, webSocketController } from '../components'; -import { SectionContent} from '../components'; -import RgbSettings from './components/RgbSettings'; - -import { RgbOptions } from './types'; - -export const RGB_SETTINGS_WEBSOCKET_URL = WEB_SOCKET_ROOT + "rgbCycle"; - -type RgbCycleControllerProps = WebSocketControllerProps; - -class RgbCycleController extends Component { - - render() { - return ( - - ( - - )} - /> - - ) - } -} - -export default webSocketController(RGB_SETTINGS_WEBSOCKET_URL, 100, RgbCycleController); - -type RgbCycleControllerFormProps = WebSocketFormProps; - -function RgbCycleControllerForm(props: RgbCycleControllerFormProps) { - - const { data, saveData, setData } = props; - - return ( - - ); -} \ No newline at end of file diff --git a/src/BlueService.cpp b/src/BlueService.cpp new file mode 100644 index 0000000..e0868e4 --- /dev/null +++ b/src/BlueService.cpp @@ -0,0 +1,19 @@ +#include + +BlueService::BlueService(AsyncWebServer* server, SecurityManager* securityManager, FS* fs) : + _webSocket(BlueState::read, + BlueState::update, + this, + server, + BLUE_LIGHT_SOCKET_PATH, + securityManager, + AuthenticationPredicates::IS_AUTHENTICATED), + _fsPersistence(BlueState::read, BlueState::update, this, fs, "/config/blueColor.json", 4096) { + // add event listener for rgbCycle Object + // addUpdateHandler([&](const String& originId) { onConfigUpdated(); }, false); +} + +void BlueService::begin() { + Serial.println("blue begin ..."); + _fsPersistence.readFromFS(); +} \ No newline at end of file diff --git a/src/BlueService.h b/src/BlueService.h new file mode 100644 index 0000000..b22ef25 --- /dev/null +++ b/src/BlueService.h @@ -0,0 +1,38 @@ +#ifndef BlueService_h +#define BlueService_h + +#include +#include +#include + +#define BLUE_LIGHT_SOCKET_PATH "/ws/blueColor" + +class BlueState { + public: + RgbDriver* driver; + String time; + int blue[49] = {0}; + + // Class constructor + BlueState() { + driver = driver->getInstance(); + } + + static void read(BlueState& settings, JsonObject& root) {} + + static StateUpdateResult update(JsonObject& root, BlueState& redState) {} +}; + +class BlueService : public StatefulService { + public: + BlueService(AsyncWebServer* server, SecurityManager* securityManager, FS* fs); + void begin(); + + private: + WebSocketTxRx _webSocket; + FSPersistence _fsPersistence; + + void registerConfig(); + void onConfigUpdated(); +}; +#endif \ No newline at end of file diff --git a/src/GreenService.cpp b/src/GreenService.cpp new file mode 100644 index 0000000..718e736 --- /dev/null +++ b/src/GreenService.cpp @@ -0,0 +1,19 @@ +#include + +GreenService::GreenService(AsyncWebServer* server, SecurityManager* securityManager, FS* fs) : + _webSocket(GreenState::read, + GreenState::update, + this, + server, + GREEN_LIGHT_SOCKET_PATH, + securityManager, + AuthenticationPredicates::IS_AUTHENTICATED), + _fsPersistence(GreenState::read, GreenState::update, this, fs, "/config/greenColor.json", 4096) { + // add event listener for rgbCycle Object + // addUpdateHandler([&](const String& originId) { onConfigUpdated(); }, false); +} + +void GreenService::begin() { + Serial.println("green begin ..."); + _fsPersistence.readFromFS(); +} \ No newline at end of file diff --git a/src/GreenService.h b/src/GreenService.h new file mode 100644 index 0000000..f1634e9 --- /dev/null +++ b/src/GreenService.h @@ -0,0 +1,38 @@ +#ifndef GreenService_h +#define GreenService_h + +#include +#include +#include + +#define GREEN_LIGHT_SOCKET_PATH "/ws/greenColor" + +class GreenState { + public: + RgbDriver* driver; + String time; + int green[49] = {0}; + + // Class constructor + GreenState() { + driver = driver->getInstance(); + } + + static void read(GreenState& settings, JsonObject& root) {} + + static StateUpdateResult update(JsonObject& root, GreenState& blueState) {} +}; + +class GreenService : public StatefulService { + public: + GreenService(AsyncWebServer* server, SecurityManager* securityManager, FS* fs); + void begin(); + + private: + WebSocketTxRx _webSocket; + FSPersistence _fsPersistence; + + void registerConfig(); + void onConfigUpdated(); +}; +#endif \ No newline at end of file diff --git a/src/RedService.cpp b/src/RedService.cpp new file mode 100644 index 0000000..0119378 --- /dev/null +++ b/src/RedService.cpp @@ -0,0 +1,19 @@ +#include + +RedService::RedService(AsyncWebServer* server, SecurityManager* securityManager, FS* fs) : + _webSocket(RedState::read, + RedState::update, + this, + server, + RED_LIGHT_SOCKET_PATH, + securityManager, + AuthenticationPredicates::IS_AUTHENTICATED), + _fsPersistence(RedState::read, RedState::update, this, fs, "/config/redColor.json", 4096) { + // add event listener for rgbCycle Object + // addUpdateHandler([&](const String& originId) { onConfigUpdated(); }, false); +} + +void RedService::begin() { + Serial.println("red begin ..."); + _fsPersistence.readFromFS(); +} \ No newline at end of file diff --git a/src/RedService.h b/src/RedService.h new file mode 100644 index 0000000..23d3393 --- /dev/null +++ b/src/RedService.h @@ -0,0 +1,38 @@ +#ifndef RedService_h +#define RedService_h + +#include +#include +#include + +#define RED_LIGHT_SOCKET_PATH "/ws/redColor" + +class RedState { + public: + RgbDriver* driver; + String time; + int red[49] = {0}; + + // Class constructor + RedState() { + driver = driver->getInstance(); + } + + static void read(RedState& settings, JsonObject& root) {} + + static StateUpdateResult update(JsonObject& root, RedState& redState) {} +}; + +class RedService : public StatefulService { + public: + RedService(AsyncWebServer* server, SecurityManager* securityManager, FS* fs); + void begin(); + + private: + WebSocketTxRx _webSocket; + FSPersistence _fsPersistence; + + void registerConfig(); + void onConfigUpdated(); +}; +#endif \ No newline at end of file diff --git a/src/RgbCycleService.h b/src/RgbCycleService.h index afb8297..057bf0a 100755 --- a/src/RgbCycleService.h +++ b/src/RgbCycleService.h @@ -107,12 +107,11 @@ class RgbCycleState { class RgbCycleService : public StatefulService { public: RgbCycleService(AsyncWebServer* server, SecurityManager* securityManager, FS* fs); - void begin(); private: - HttpEndpoint _httpEndpoint; WebSocketTxRx _webSocket; + HttpEndpoint _httpEndpoint; FSPersistence _fsPersistence; void registerConfig(); diff --git a/src/main.cpp b/src/main.cpp index e793ed6..3e7f4a4 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #define SERIAL_BAUD_RATE 115200 @@ -10,6 +11,8 @@ ESP8266React esp8266React(&server); RgbStateService rgbStateService = RgbStateService(&server, esp8266React.getSecurityManager(), esp8266React.getFS()); RgbCycleService rgbCycleService = RgbCycleService(&server, esp8266React.getSecurityManager(), esp8266React.getFS()); +RedService redService = RedService(&server, esp8266React.getSecurityManager(), esp8266React.getFS()); + // update_handler_id_t updateHandler = rgbCycleService.addUpdateHandler([&](const String& originId) { // Serial.print("The RgbCycle's state has been updated by: "); @@ -32,6 +35,7 @@ void setup() { // load the initial RGB object rgbStateService.begin(); rgbCycleService.begin(); + redService.begin(); // start the server server.begin(); @@ -102,5 +106,12 @@ void onEverySecond() { currentSecond ++; } + rgbCycleService.update( + [&](RgbCycleState& state) { + Serial.println(state.red[22]); + return StateUpdateResult::CHANGED; // notify StatefulService by returning CHANGED + }, + "timer"); + RgbDriver::updateRgb(); } \ No newline at end of file From ffbdf0902d591c576fe1586fda31ebbb06a67f5a Mon Sep 17 00:00:00 2001 From: janis Date: Tue, 23 Mar 2021 21:42:33 +0200 Subject: [PATCH 35/36] Wip --- src/{ => colorService}/BlueService.cpp | 2 +- src/{ => colorService}/BlueService.h | 0 src/{ => colorService}/GreenService.cpp | 2 +- src/{ => colorService}/GreenService.h | 0 src/{ => colorService}/RedService.cpp | 2 +- src/{ => colorService}/RedService.h | 0 src/main.cpp | 18 +++++++++++------- 7 files changed, 14 insertions(+), 10 deletions(-) rename src/{ => colorService}/BlueService.cpp (96%) rename src/{ => colorService}/BlueService.h (100%) rename src/{ => colorService}/GreenService.cpp (96%) rename src/{ => colorService}/GreenService.h (100%) rename src/{ => colorService}/RedService.cpp (96%) rename src/{ => colorService}/RedService.h (100%) diff --git a/src/BlueService.cpp b/src/colorService/BlueService.cpp similarity index 96% rename from src/BlueService.cpp rename to src/colorService/BlueService.cpp index e0868e4..a412b7f 100644 --- a/src/BlueService.cpp +++ b/src/colorService/BlueService.cpp @@ -1,4 +1,4 @@ -#include +#include "BlueService.h" BlueService::BlueService(AsyncWebServer* server, SecurityManager* securityManager, FS* fs) : _webSocket(BlueState::read, diff --git a/src/BlueService.h b/src/colorService/BlueService.h similarity index 100% rename from src/BlueService.h rename to src/colorService/BlueService.h diff --git a/src/GreenService.cpp b/src/colorService/GreenService.cpp similarity index 96% rename from src/GreenService.cpp rename to src/colorService/GreenService.cpp index 718e736..cdb5af7 100644 --- a/src/GreenService.cpp +++ b/src/colorService/GreenService.cpp @@ -1,4 +1,4 @@ -#include +#include "GreenService.h" GreenService::GreenService(AsyncWebServer* server, SecurityManager* securityManager, FS* fs) : _webSocket(GreenState::read, diff --git a/src/GreenService.h b/src/colorService/GreenService.h similarity index 100% rename from src/GreenService.h rename to src/colorService/GreenService.h diff --git a/src/RedService.cpp b/src/colorService/RedService.cpp similarity index 96% rename from src/RedService.cpp rename to src/colorService/RedService.cpp index 0119378..c6553d2 100644 --- a/src/RedService.cpp +++ b/src/colorService/RedService.cpp @@ -1,4 +1,4 @@ -#include +#include "RedService.h" RedService::RedService(AsyncWebServer* server, SecurityManager* securityManager, FS* fs) : _webSocket(RedState::read, diff --git a/src/RedService.h b/src/colorService/RedService.h similarity index 100% rename from src/RedService.h rename to src/colorService/RedService.h diff --git a/src/main.cpp b/src/main.cpp index 3e7f4a4..fb2e12e 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,7 +1,9 @@ #include #include #include -#include +#include "./colorService/RedService.h" +#include "./colorService/GreenService.h" +#include "./colorService/BlueService.h" #include #define SERIAL_BAUD_RATE 115200 @@ -12,7 +14,8 @@ ESP8266React esp8266React(&server); RgbStateService rgbStateService = RgbStateService(&server, esp8266React.getSecurityManager(), esp8266React.getFS()); RgbCycleService rgbCycleService = RgbCycleService(&server, esp8266React.getSecurityManager(), esp8266React.getFS()); RedService redService = RedService(&server, esp8266React.getSecurityManager(), esp8266React.getFS()); - +GreenService greenService = GreenService(&server, esp8266React.getSecurityManager(), esp8266React.getFS()); +BlueService blueService = BlueService(&server, esp8266React.getSecurityManager(), esp8266React.getFS()); // update_handler_id_t updateHandler = rgbCycleService.addUpdateHandler([&](const String& originId) { // Serial.print("The RgbCycle's state has been updated by: "); @@ -36,6 +39,8 @@ void setup() { rgbStateService.begin(); rgbCycleService.begin(); redService.begin(); + greenService.begin(); + blueService.begin(); // start the server server.begin(); @@ -85,8 +90,7 @@ void turnLightsOn() { } void onEverySecond() { - - if (!isTimeSet && currentSecond > trigerTime) { + if (!isTimeSet && currentSecond > trigerTime) { Serial.println("Setting time..."); time_t now = time(nullptr); tm* timeinfo = localtime(&now); @@ -102,11 +106,11 @@ void onEverySecond() { isTimeSet = true; } - if(!isTimeSet){ - currentSecond ++; + if (!isTimeSet) { + currentSecond++; } - rgbCycleService.update( + rgbCycleService.update( [&](RgbCycleState& state) { Serial.println(state.red[22]); return StateUpdateResult::CHANGED; // notify StatefulService by returning CHANGED From 335d5a9bbce5f42cc76f8ec146beff40fa2c74f8 Mon Sep 17 00:00:00 2001 From: janis Date: Mon, 26 Apr 2021 19:58:00 +0300 Subject: [PATCH 36/36] Separate color service --- interface/src/project/AquariumController.tsx | 3 +- interface/src/project/RgbCycleController.js | 8 +++-- src/colorService/GreenService.h | 32 ++++++++++++++++++-- src/main.cpp | 12 ++++---- 4 files changed, 42 insertions(+), 13 deletions(-) diff --git a/interface/src/project/AquariumController.tsx b/interface/src/project/AquariumController.tsx index a910471..4905615 100755 --- a/interface/src/project/AquariumController.tsx +++ b/interface/src/project/AquariumController.tsx @@ -28,7 +28,8 @@ class AquariumController extends Component { - + + diff --git a/interface/src/project/RgbCycleController.js b/interface/src/project/RgbCycleController.js index 08632a8..3466920 100755 --- a/interface/src/project/RgbCycleController.js +++ b/interface/src/project/RgbCycleController.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import React, { Component, useEffect } from 'react'; import { Switch } from '@material-ui/core'; import { WEB_SOCKET_ROOT } from '../api'; import { WebSocketFormLoader, webSocketController } from '../components'; @@ -6,10 +6,12 @@ import { SectionContent } from '../components'; import RgbSettings from './components/RgbSettings'; export const RGB_SETTINGS_WEBSOCKET_URL = WEB_SOCKET_ROOT + "rgbCycle"; +export const GREEN_COLOR_WEBSOCKET_URL = WEB_SOCKET_ROOT + "greenLight"; +// const test = webSocketController(GREEN_COLOR_WEBSOCKET_URL, 100, RgbCycleController); const RgbCycleController = (props) => { - const test = webSocketController(WEB_SOCKET_ROOT + "green", 100, RgbCycleController); - console.log(test.data) + const Test = webSocketController(GREEN_COLOR_WEBSOCKET_URL, 100, RgbCycleController); + return ( #include -#define GREEN_LIGHT_SOCKET_PATH "/ws/greenColor" +#define GREEN_LIGHT_SOCKET_PATH "/ws/greenLight" class GreenState { public: @@ -18,9 +18,35 @@ class GreenState { driver = driver->getInstance(); } - static void read(GreenState& settings, JsonObject& root) {} + static void read(GreenState& settings, JsonObject& root) { + Serial.println("green test read called"); + root.createNestedObject("graph"); + root["graph"].createNestedArray("green"); - static StateUpdateResult update(JsonObject& root, GreenState& blueState) {} + for (size_t i = 0; i < 49; i++) { + root["graph"]["green"].add(settings.green[i]); + } + } + + static StateUpdateResult update(JsonObject& root, GreenState& greenState) { + JsonArray green = root["graph"]["green"].as(); + + int i = 0; + for (JsonVariant value : green) { + greenState.green[i] = value.as(); + i++; + } + + Serial.println("Cycle update..."); + Serial.println(""); + Serial.println("green"); + for (size_t i = 0; i < 49; i++) { + Serial.print(greenState.green[i]); + } + Serial.println(""); + + return StateUpdateResult::CHANGED; + } }; class GreenService : public StatefulService { diff --git a/src/main.cpp b/src/main.cpp index fb2e12e..eb0b22f 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -110,12 +110,12 @@ void onEverySecond() { currentSecond++; } - rgbCycleService.update( - [&](RgbCycleState& state) { - Serial.println(state.red[22]); - return StateUpdateResult::CHANGED; // notify StatefulService by returning CHANGED - }, - "timer"); + // rgbCycleService.update( + // [&](RgbCycleState& state) { + // Serial.println(state.red[22]); + // return StateUpdateResult::CHANGED; // notify StatefulService by returning CHANGED + // }, + // "timer"); RgbDriver::updateRgb(); } \ No newline at end of file