From 8c2f00d6a36eb6c1e8f4babd1ed80b5220a901aa Mon Sep 17 00:00:00 2001 From: Karl Hudgell Date: Thu, 8 Feb 2024 13:03:43 +0000 Subject: [PATCH] working wled logic --- public/locales/en/common.json | 12 ++++++++---- src/widgets/components.js | 1 + src/widgets/widgets.js | 2 ++ src/widgets/wled/component.jsx | 36 ++++++++++++++++++++++++++++++++++ src/widgets/wled/proxy.js | 36 ++++++++++++++++++++++++++++++++++ src/widgets/wled/widget.js | 14 +++++++++++++ 6 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 src/widgets/wled/component.jsx create mode 100644 src/widgets/wled/proxy.js create mode 100644 src/widgets/wled/widget.js diff --git a/public/locales/en/common.json b/public/locales/en/common.json index 5521fd0c..0acd35c6 100644 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -770,7 +770,7 @@ "ping": "Ping" }, "urbackup": { - "ok" : "Ok", + "ok": "Ok", "errored": "Errors", "noRecent": "Out of Date", "totalUsed": "Used Storage" @@ -823,7 +823,11 @@ "totalRoms": "Total ROMs" }, "netdata": { - "warnings": "Warnings", - "criticals": "Criticals" + "warnings": "Warnings", + "criticals": "Criticals" + }, + "wled": { + "deviceName": "Device Name", + "deviceState": "Device State" } -} +} \ No newline at end of file diff --git a/src/widgets/components.js b/src/widgets/components.js index bb9b00fe..6ec7abec 100644 --- a/src/widgets/components.js +++ b/src/widgets/components.js @@ -110,6 +110,7 @@ const components = { urbackup: dynamic(() => import("./urbackup/component")), watchtower: dynamic(() => import("./watchtower/component")), whatsupdocker: dynamic(() => import("./whatsupdocker/component")), + wled: dynamic(() => import("./wled/component")), xteve: dynamic(() => import("./xteve/component")), }; diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js index fe474406..2e1f5f2c 100644 --- a/src/widgets/widgets.js +++ b/src/widgets/widgets.js @@ -104,6 +104,7 @@ import whatsupdocker from "./whatsupdocker/widget"; import xteve from "./xteve/widget"; import urbackup from "./urbackup/widget"; import romm from "./romm/widget"; +import wled from "./wled/widget"; const widgets = { adguard, @@ -214,6 +215,7 @@ const widgets = { watchtower, whatsupdocker, xteve, + wled }; export default widgets; diff --git a/src/widgets/wled/component.jsx b/src/widgets/wled/component.jsx new file mode 100644 index 00000000..8cb8f93d --- /dev/null +++ b/src/widgets/wled/component.jsx @@ -0,0 +1,36 @@ +import Container from "components/services/widget/container"; +import Block from "components/services/widget/block"; +import useWidgetAPI from "utils/proxy/use-widget-api"; + +export default function Component({ service }) { + const { widget } = service; + + const { data: wledData, error: wledError } = useWidgetAPI(widget, "api"); + + if (wledError) { + return ; + } + + if (!wledData) { + return ( + + + + + ); + } + let state + if (wledData.state.on === 1){ + state = "On"; + } else { + state = "Off"; + } + + return ( + + + + + + ); +} diff --git a/src/widgets/wled/proxy.js b/src/widgets/wled/proxy.js new file mode 100644 index 00000000..2d7e3a9b --- /dev/null +++ b/src/widgets/wled/proxy.js @@ -0,0 +1,36 @@ +import { formatApiCall } from "utils/proxy/api-helpers"; +import { httpProxy } from "utils/proxy/http"; +import createLogger from "utils/logger"; +import widgets from "widgets/widgets"; +import getServiceWidget from "utils/config/service-helpers"; + +const logger = createLogger("wledProxyHandler"); + +export default async function wledProxyHandler(req, res) { + const { group, service, endpoint } = req.query; + + if (!group || !service) { + return res.status(400).json({ error: "Invalid proxy service type" }); + } + + const widget = await getServiceWidget(group, service); + const api = widgets?.[widget.type]?.api; + if (!api) { + return res.status(403).json({ error: "Service does not support API calls" }); + } + + const url = formatApiCall(api, { endpoint, ...widget }); + const method = "GET"; + + const [status, contentType, data] = await httpProxy(url, { + method, + }); + + if (status !== 200) { + logger.debug("Error %d calling wled endpoint %s", status, url); + return res.status(status).json({ error: { message: `HTTP Error ${status}`, url, data } }); + } + + if (contentType) res.setHeader("Content-Type", contentType); + return res.status(status).send(data); +} diff --git a/src/widgets/wled/widget.js b/src/widgets/wled/widget.js new file mode 100644 index 00000000..df772ed2 --- /dev/null +++ b/src/widgets/wled/widget.js @@ -0,0 +1,14 @@ +import wledProxyHandler from "./proxy"; + +const widget = { + api: "{url}/{endpoint}", + proxyHandler: wledProxyHandler, + + mappings: { + api: { + endpoint: "json/", + }, + }, +}; + +export default widget;