diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index e167268a..0d67c3f9 100755
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -782,7 +782,7 @@
"ping": "Ping"
},
"urbackup": {
- "ok" : "Ok",
+ "ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
@@ -845,10 +845,13 @@
"romm": {
"platforms": "Platforms",
"totalRoms": "Total ROMs"
- }
- ,
+ },
"netdata": {
"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 86eabc97..1c5aca8d 100644
--- a/src/widgets/components.js
+++ b/src/widgets/components.js
@@ -114,6 +114,7 @@ const components = {
watchtower: dynamic(() => import("./watchtower/component")),
whatsupdocker: dynamic(() => import("./whatsupdocker/component")),
wgeasy: dynamic(() => import("./wgeasy/component")),
+ wled: dynamic(() => import("./wled/component")),
xteve: dynamic(() => import("./xteve/component")),
};
diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js
index 84164bb4..d23b5761 100644
--- a/src/widgets/widgets.js
+++ b/src/widgets/widgets.js
@@ -108,6 +108,8 @@ import wgeasy from "./wgeasy/widget";
import xteve from "./xteve/widget";
import jdrssdownloader from "./jdrssdownloader/widget";
import urbackup from "./urbackup/widget";
+import romm from "./romm/widget";
+import wled from "./wled/widget";
const widgets = {
adguard,
@@ -222,6 +224,7 @@ const widgets = {
whatsupdocker,
wgeasy,
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;