Shelly's schalten, direkt aus Grafana Dashboards heraus.
Moderator: Ulrich
- Ulrich
- Administrator
- Beiträge: 6523
- Registriert: Sa 7. Nov 2015, 10:33
- Wohnort: Essen
- Hat sich bedankt: 163 Mal
- Danksagung erhalten: 923 Mal
Re: Shelly's schalten, direkt aus Grafana Dashboards heraus.
Folgende Antwort kommt zurück:
Quellübergreifende (Cross-Origin) Anfrage blockiert: Die Gleiche-Quelle-Regel verbietet das Lesen der externen Ressource auf http://192.168.2.39/rpc/Shelly.GetStatus. (Grund: CORS-Kopfzeile 'Access-Control-Allow-Origin' fehlt). Statuscode: 200.
Es muss etwas mit CORS zu tun haben. Wie man das Problem behebt, kann ich auch noch nicht sagen. (Die IP ist von meinem Shelly)
Quellübergreifende (Cross-Origin) Anfrage blockiert: Die Gleiche-Quelle-Regel verbietet das Lesen der externen Ressource auf http://192.168.2.39/rpc/Shelly.GetStatus. (Grund: CORS-Kopfzeile 'Access-Control-Allow-Origin' fehlt). Statuscode: 200.
Es muss etwas mit CORS zu tun haben. Wie man das Problem behebt, kann ich auch noch nicht sagen. (Die IP ist von meinem Shelly)
-----------------------------------------------------
Ulrich . . . . . . . . [ Admin ]
Ulrich . . . . . . . . [ Admin ]
- Schwarzermann
- Beiträge: 346
- Registriert: Sa 9. Okt 2021, 11:16
- Wohnort: 87733
- Hat sich bedankt: 9 Mal
- Danksagung erhalten: 11 Mal
Re: Shelly's schalten, direkt aus Grafana Dashboards heraus.
Ok aktuell bin ich da noch dran
Der mit sympatischen Vollmeise
- Schwarzermann
- Beiträge: 346
- Registriert: Sa 9. Okt 2021, 11:16
- Wohnort: 87733
- Hat sich bedankt: 9 Mal
- Danksagung erhalten: 11 Mal
Re: Shelly's schalten, direkt aus Grafana Dashboards heraus.
Auf dem Desktop werden die Blöcke nebeneinander dargestellt so wie Platz ist, auf dem Smartphone untereinander hier schau ich mal wenn ich das ganze noch kleiner mache ob diese dann im Handy auch nebeneinander dargestellt werden.
Klar Farblich beist sich das aktuell aber die Sichtbarkeit ist halt deutlich.
Der mit sympatischen Vollmeise
- Schwarzermann
- Beiträge: 346
- Registriert: Sa 9. Okt 2021, 11:16
- Wohnort: 87733
- Hat sich bedankt: 9 Mal
- Danksagung erhalten: 11 Mal
Re: Shelly's schalten, direkt aus Grafana Dashboards heraus.
hier mal das Dashboard dazu wer sich daran versuchen möchte.
Der mit sympatischen Vollmeise
-
- Beiträge: 1889
- Registriert: Do 25. Jun 2020, 13:40
- Hat sich bedankt: 18 Mal
- Danksagung erhalten: 92 Mal
Re: Shelly's schalten, direkt aus Grafana Dashboards heraus.
Sers Allgäuer...
hier mal ein Schnäppchen
https://shellyparts.de/products/shelly- ... 8659846411
Gruss
hier mal ein Schnäppchen
https://shellyparts.de/products/shelly- ... 8659846411
Gruss
SMA Tripower 8/Growatt MIN 3000 TL-XE/1500S/SPH 4600,4 ARK LV,10kWh
ELWA DC WW Puffer m. 300L/Gesamt PV Leistung 20,5kWp gesteuert mit Pi4 und Pi5
hier stehen alle Geräte>> viewtopic.php?f=13&t=1069
ELWA DC WW Puffer m. 300L/Gesamt PV Leistung 20,5kWp gesteuert mit Pi4 und Pi5
hier stehen alle Geräte>> viewtopic.php?f=13&t=1069
- Schwarzermann
- Beiträge: 346
- Registriert: Sa 9. Okt 2021, 11:16
- Wohnort: 87733
- Hat sich bedankt: 9 Mal
- Danksagung erhalten: 11 Mal
Re: Shelly's schalten, direkt aus Grafana Dashboards heraus.
Was auch funktionniert ist auf dem Handy 2 Reihen nebneinander wenn man die grösse der Felder begrenzt ohne das die Übersicht darunter leidet.
Der mit sympatischen Vollmeise
- Schwarzermann
- Beiträge: 346
- Registriert: Sa 9. Okt 2021, 11:16
- Wohnort: 87733
- Hat sich bedankt: 9 Mal
- Danksagung erhalten: 11 Mal
Re: Shelly's schalten, direkt aus Grafana Dashboards heraus.
Code: Alles auswählen
<style>
#devices {
display: flex;
flex-wrap: wrap;
gap: 15px;
}
.device {
flex: 1 1 100px;
max-width: 180px;
padding: 10px;
border: 1px solid #003366;
border-radius: 12px;
box-shadow: 2px 2px 5px rgba(0,0,0,0.2);
color: white;
}
.device h3 {
margin: 5px 0 10px 0;
font-size: 14px;
text-align: center;
}
.btn {
color: white;
width: 100%;
height: 38px;
margin: 4px 0;
border: none;
border-radius: 8px;
font-size: 11px;
cursor: pointer;
}
.btn-on { background: green; }
.btn-off { background: red; }
</style>
<div id="devices"></div>
<script>
// Raumfarben (so belassen wie gewünscht)
const roomColors = {
"Arbeitszimmer": "#444a97",
"Schlafzimmer": "#d2cc19",
"Wohnzimmer": "#1c5a1b",
"Terrasse": "#7f19d2",
"Esszimmer": "#19bcd2",
"Küche": "#7e1161",
"Bad": "#3fe23c",
"Flur": "#3ce2d7"
};
// EG – alle Räume & Geräte
const devices = [
{
room: "Arbeitszimmer",
devices: [
{ ip: "192.168.178.60", relays: [{id:0,name:"Licht"}] },
{ ip: "192.168.178.61", relays: [{id:0,name:"Rollo Auf"},{id:1,name:"Rollo Zu"}] },
{ ip: "192.168.178.62", relays: [{id:0,name:"Steckdose 1"}] },
{ ip: "192.168.178.63", relays: [{id:0,name:"Steckdose 2"}] }
]
},
{
room: "Schlafzimmer",
devices: [
{ ip: "192.168.178.64", relays: [{id:0,name:"Licht"}] },
{ ip: "192.168.178.65", relays: [{id:0,name:"Rollo Auf"},{id:1,name:"Rollo Zu"}] },
{ ip: "192.168.178.66", relays: [{id:0,name:"Steckdose 1"}] },
{ ip: "192.168.178.67", relays: [{id:0,name:"Steckdose 2"}] },
{ ip: "192.168.178.68", relays: [{id:0,name:"Steckdose 3"}] },
{ ip: "192.168.178.69", relays: [{id:0,name:"Steckdose 4"}] }
]
},
{
room: "Wohnzimmer",
devices: [
{ ip: "192.168.178.70", relays: [{id:0,name:"Licht"}] },
{ ip: "192.168.178.71", relays: [{id:0,name:"Rollo 1 Auf"},{id:1,name:"Rollo 1 Zu"}] },
{ ip: "192.168.178.72", relays: [{id:0,name:"Rollo 2 Auf"},{id:1,name:"Rollo 2 Zu"}] },
{ ip: "192.168.178.73", relays: [{id:0,name:"Steckdose 1"}] },
{ ip: "192.168.178.74", relays: [{id:0,name:"Steckdose 2"}] },
{ ip: "192.168.178.75", relays: [{id:0,name:"Steckdose 3"}] },
{ ip: "192.168.178.76", relays: [{id:0,name:"Steckdose 4"}] },
{ ip: "192.168.178.77", relays: [{id:0,name:"Steckdose 5"}] }
]
},
{
room: "Terrasse",
devices: [
{ ip: "192.168.178.78", relays: [{id:0,name:"Licht"}] },
{ ip: "192.168.178.79", relays: [{id:0,name:"Markise Rein"},{id:1,name:"Markise Raus"}] },
{ ip: "192.168.178.80", relays: [{id:0,name:"Steckdose 1"}] },
{ ip: "192.168.178.81", relays: [{id:0,name:"Steckdose 2"}] }
]
},
{
room: "Esszimmer",
devices: [
{ ip: "192.168.178.82", relays: [{id:0,name:"Licht"}] },
{ ip: "192.168.178.83", relays: [{id:0,name:"Rollo 1 Auf"},{id:1,name:"Rollo 1 Zu"}] },
{ ip: "192.168.178.84", relays: [{id:0,name:"Rollo 2 Auf"},{id:1,name:"Rollo 2 Zu"}] },
{ ip: "192.168.178.85", relays: [{id:0,name:"Steckdose 1"}] },
{ ip: "192.168.178.86", relays: [{id:0,name:"Steckdose 2"}] },
{ ip: "192.168.178.87", relays: [{id:0,name:"Steckdose 3"}] }
]
},
{
room: "Küche",
devices: [
{ ip: "192.168.178.88", relays: [{id:0,name:"Licht"}] },
{ ip: "192.168.178.89", relays: [{id:0,name:"Rollo Auf"},{id:1,name:"Rollo Zu"}] },
{ ip: "192.168.178.90", relays: [{id:0,name:"Dunstabzug"}] },
{ ip: "192.168.178.91", relays: [
{id:0,name:"Herd Phase 1"},
{id:1,name:"Herd Phase 2"},
{id:2,name:"Herd Phase 3"}
] },
{ ip: "192.168.178.92", relays: [{id:0,name:"Steckdose 1"}] },
{ ip: "192.168.178.93", relays: [{id:0,name:"Steckdose 2"}] }
]
},
{
room: "Bad",
devices: [
{ ip: "192.168.178.94", relays: [{id:0,name:"Licht"}] },
{ ip: "192.168.178.95", relays: [{id:0,name:"Rollo Auf"},{id:1,name:"Rollo Zu"}] },
{ ip: "192.168.178.96", relays: [{id:0,name:"Spiegel Licht"}] }
]
},
{
room: "Flur",
devices: [
{ ip: "192.168.178.97", relays: [{id:0,name:"Licht Innen"}] },
{ ip: "192.168.178.98", relays: [{id:0,name:"Treppe Licht 1"}] },
{ ip: "192.168.178.99", relays: [{id:0,name:"Treppe Rollo Auf"},{id:1,name:"Treppe Rollo Zu"}] },
{ ip: "192.168.178.100", relays: [{id:0,name:"Treppe Licht 2"}] },
{ ip: "192.168.178.101", relays: [{id:0,name:"Rollo Garderobe Auf"},{id:1,name:"Rollo Garderobe Zu"}] },
{ ip: "192.168.178.102", relays: [{id:0,name:"Steckdose Haustür"}] },
{ ip: "192.168.178.103", relays: [{id:0,name:"Haustür Licht"}] }
]
}
];
const devicesDiv = document.getElementById("devices");
// Erzeuge UI & starte WebSockets
devices.forEach(roomBlock => {
const block = document.createElement("div");
block.className = "device";
block.style.backgroundColor = roomColors[roomBlock.room] || "#4169E1";
const title = document.createElement("h3");
title.innerText = roomBlock.room;
block.appendChild(title);
roomBlock.devices.forEach(device => {
// Buttons anlegen
device.relays.forEach(relay => {
const btn = document.createElement("button");
btn.id = `relay_${device.ip}_${relay.id}`;
btn.className = "btn btn-off";
btn.innerText = relay.name + " AUS";
btn.onclick = () => {
fetch(`http://${device.ip}/rpc/switch.toggle?id=${relay.id}`)
.catch(err => console.error("Toggle-Fehler:", err));
};
block.appendChild(btn);
});
// WebSocket je Gerät
initWebSocket(device);
});
devicesDiv.appendChild(block);
});
// WebSocket-Funktion inkl. einfacher Reconnect-Logik
function initWebSocket(device, attempt = 0) {
try {
const ws = new WebSocket(`ws://${device.ip}/rpc`);
ws.onopen = () => {
// Initialen Status anfordern
ws.send('{"id":1,"src":"grafana_panel","method":"Shelly.GetStatus"}');
};
ws.onmessage = (event) => {
try {
const obj = JSON.parse(event.data);
const status = obj.result || obj.params;
if (!status) return;
device.relays.forEach(relay => {
const sw = status[`switch:${relay.id}`];
if (sw && typeof sw.output === "boolean") {
updateButton(device.ip, relay, sw.output);
}
});
} catch(e) {
console.error("WS-Parse-Fehler:", e);
}
};
ws.onclose = () => {
// Leichter Backoff für Reconnect
const next = Math.min(10000, 1000 * (attempt + 1));
setTimeout(() => initWebSocket(device, attempt + 1), next);
};
ws.onerror = () => {
try { ws.close(); } catch(_) {}
};
} catch (err) {
console.error(`WebSocket zu ${device.ip} fehlgeschlagen:`, err);
}
}
// Button-UI aktualisieren
function updateButton(ip, relay, isOn) {
const btn = document.getElementById(`relay_${ip}_${relay.id}`);
if (!btn) return;
if (isOn) {
btn.className = "btn btn-on";
btn.innerText = `${relay.name} EIN`;
} else {
btn.className = "btn btn-off";
btn.innerText = `${relay.name} AUS`;
}
}
</script>
Der mit sympatischen Vollmeise
- Schwarzermann
- Beiträge: 346
- Registriert: Sa 9. Okt 2021, 11:16
- Wohnort: 87733
- Hat sich bedankt: 9 Mal
- Danksagung erhalten: 11 Mal
Re: Shelly's schalten, direkt aus Grafana Dashboards heraus.
Code: Alles auswählen
<style>
/* Layout für alle Geräteblöcke */
#devices {
display: flex; /* Geräteblöcke nebeneinander */
flex-wrap: wrap; /* umbrechen, falls zu breit */
gap: 15px; /* Abstand zwischen Blöcken */
}
/* Jedes Raum-Panel */
.device {
flex: 1 1 100px; /* flexibler Block, min. 100px breit */
max-width: 200px; /* max. Breite → hier anpassen */
padding: 10px; /* Innenabstand */
border: 1px solid #003366; /* Rahmen */
border-radius: 12px; /* abgerundete Ecken */
box-shadow: 2px 2px 5px rgba(0,0,0,0.2); /* Schatten */
color: white; /* Standardschriftfarbe */
}
/* Überschrift = Raumname */
.device h3 {
margin: 5px 0 10px 0;
font-size: 14px; /* Schriftgröße vom Raumtitel */
text-align: center;
}
/* Allgemeine Button-Einstellungen */
.btn {
color: white; /* Schriftfarbe */
width: 100%; /* nimmt die ganze Blockbreite ein */
height: 38px; /* Höhe der Buttons → ändern für größer/kleiner */
margin: 4px 0; /* Abstand oben/unten */
border: none; /* kein Rahmen */
border-radius: 8px; /* abgerundete Ecken */
font-size: 11px; /* Schriftgröße der Buttons */
cursor: pointer; /* Mauszeiger Hand */
}
/* Farbliche Zustände */
.btn-on { background: green; } /* Schalter EIN */
.btn-off { background: red; } /* Schalter AUS */
.btn-up { background: green; } /* Rollo: AUF */
.btn-stop { background: blue; } /* Rollo: STOP */
.btn-down { background: yellow; color: black; } /* Rollo: AB */
</style>
<div id="devices"></div>
<script>
/* Hintergrundfarben für jeden Raum */
const roomColors = {
"Arbeitszimmer": "#444a97",
"Schlafzimmer": "#d2cc19",
"Wohnzimmer": "#1c5a1b",
"Terrasse": "#7f19d2",
"Esszimmer": "#19bcd2",
"Küche": "#7e1161",
"Bad": "#3fe23c",
"Flur": "#3ce2d7"
};
/* ================================
Geräte-Liste EG
- type: "switch" → normales EIN/AUS
- type: "roller" → Roller-Modus (Kalibriert)
- type: "somfy" → Puls-Logik für Somfy Funkrelais
================================= */
const devices = [
{
room: "Arbeitszimmer",
devices: [
{ ip: "192.168.178.60", type: "switch", relays: [{id:0,name:"Licht"}] },
{ ip: "192.168.178.61", type: "somfy", name: "Rollo" }, // Somfy → Auto-Off im Shelly
{ ip: "192.168.178.62", type: "switch", relays: [{id:0,name:"Steckdose 1"}] },
{ ip: "192.168.178.63", type: "switch", relays: [{id:0,name:"Steckdose 2"}] }
]
},
{
room: "Schlafzimmer",
devices: [
{ ip: "192.168.178.64", type: "switch", relays: [{id:0,name:"Licht"}] },
{ ip: "192.168.178.65", type: "somfy", name: "Rollo" }, // Somfy → Auto-Off im Shelly
{ ip: "192.168.178.66", type: "switch", relays: [{id:0,name:"Steckdose 1"}] },
{ ip: "192.168.178.67", type: "switch", relays: [{id:0,name:"Steckdose 2"}] },
{ ip: "192.168.178.68", type: "switch", relays: [{id:0,name:"Steckdose 3"}] },
{ ip: "192.168.178.69", type: "switch", relays: [{id:0,name:"Steckdose 4"}] }
]
},
{
room: "Wohnzimmer",
devices: [
{ ip: "192.168.178.70", type: "switch", relays: [{id:0,name:"Licht"}] },
{ ip: "192.168.178.71", type: "roller", name: "Rollo 1" }, // echter Roller-Modus
{ ip: "192.168.178.72", type: "roller", name: "Rollo 2" },
{ ip: "192.168.178.73", type: "switch", relays: [{id:0,name:"Steckdose 1"}] },
{ ip: "192.168.178.74", type: "switch", relays: [{id:0,name:"Steckdose 2"}] },
{ ip: "192.168.178.75", type: "switch", relays: [{id:0,name:"Steckdose 3"}] },
{ ip: "192.168.178.76", type: "switch", relays: [{id:0,name:"Steckdose 4"}] },
{ ip: "192.168.178.77", type: "switch", relays: [{id:0,name:"Steckdose 5"}] }
]
},
{
room: "Terrasse",
devices: [
{ ip: "192.168.178.78", type: "switch", relays: [{id:0,name:"Licht"}] },
{ ip: "192.168.178.79", type: "roller", name: "Markise" },
{ ip: "192.168.178.80", type: "switch", relays: [{id:0,name:"Steckdose 1"}] },
{ ip: "192.168.178.81", type: "switch", relays: [{id:0,name:"Steckdose 2"}] }
]
},
{
room: "Esszimmer",
devices: [
{ ip: "192.168.178.82", type: "switch", relays: [{id:0,name:"Licht"}] },
{ ip: "192.168.178.83", type: "roller", name: "Rollo 1" },
{ ip: "192.168.178.84", type: "roller", name: "Rollo 2" },
{ ip: "192.168.178.85", type: "switch", relays: [{id:0,name:"Steckdose 1"}] },
{ ip: "192.168.178.86", type: "switch", relays: [{id:0,name:"Steckdose 2"}] },
{ ip: "192.168.178.87", type: "switch", relays: [{id:0,name:"Steckdose 3"}] }
]
},
{
room: "Küche",
devices: [
{ ip: "192.168.178.88", type: "switch", relays: [{id:0,name:"Licht"}] },
{ ip: "192.168.178.89", type: "roller", name: "Rollo" },
{ ip: "192.168.178.90", type: "switch", relays: [{id:0,name:"Dunstabzug"}] },
{ ip: "192.168.178.91", type: "switch", relays: [
{id:0,name:"Herd Phase 1"},{id:1,name:"Herd Phase 2"},{id:2,name:"Herd Phase 3"}
] },
{ ip: "192.168.178.92", type: "switch", relays: [{id:0,name:"Steckdose 1"}] },
{ ip: "192.168.178.93", type: "switch", relays: [{id:0,name:"Steckdose 2"}] }
]
},
{
room: "Bad",
devices: [
{ ip: "192.168.178.94", type: "switch", relays: [{id:0,name:"Licht"}] },
{ ip: "192.168.178.95", type: "roller", name: "Rollo" },
{ ip: "192.168.178.96", type: "switch", relays: [{id:0,name:"Spiegel Licht"}] }
]
},
{
room: "Flur",
devices: [
{ ip: "192.168.178.97", type: "switch", relays: [{id:0,name:"Licht Innen"}] },
{ ip: "192.168.178.98", type: "switch", relays: [{id:0,name:"Treppe Licht 1"}] },
{ ip: "192.168.178.99", type: "roller", name: "Treppe Rollo" },
{ ip: "192.168.178.100", type: "switch", relays: [{id:0,name:"Treppe Licht 2"}] },
{ ip: "192.168.178.101", type: "roller", name: "Rollo Garderobe" },
{ ip: "192.168.178.102", type: "switch", relays: [{id:0,name:"Steckdose Haustür"}] },
{ ip: "192.168.178.103", type: "switch", relays: [{id:0,name:"Haustür Licht"}] }
]
}
];
/* ================================
UI erzeugen
================================= */
const devicesDiv = document.getElementById("devices");
devices.forEach(roomBlock => {
const block = document.createElement("div");
block.className = "device";
block.style.backgroundColor = roomColors[roomBlock.room] || "#4169E1"; // Blockfarbe nach Raum
const title = document.createElement("h3");
title.innerText = roomBlock.room; // Raumname oben
block.appendChild(title);
roomBlock.devices.forEach(device => {
if (device.type === "roller") {
addRollerButtons(block, device); // Roller-Buttons AUF/STOP/AB
} else if (device.type === "somfy") {
addSomfyButtons(block, device); // Somfy-Puls-Buttons AUF/STOP/AB
} else if (device.type === "switch") {
device.relays.forEach(relay => {
const btn = document.createElement("button");
btn.id = `relay_${device.ip}_${relay.id}`;
btn.className = "btn btn-off";
btn.innerText = relay.name + " AUS";
btn.onclick = () => toggleRelay(device.ip, relay.id);
block.appendChild(btn);
});
}
});
devicesDiv.appendChild(block);
});
/* ================================
Funktions-Definitionen
================================= */
/* Schalter: Toggle EIN/AUS */
function toggleRelay(ip, relayId) {
fetch(`http://${ip}/rpc`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ id: 1, method: "Switch.Toggle", params: { id: relayId } })
}).catch(err => console.error("Toggle-Fehler:", err));
}
/* Roller-Befehle */
function sendRollerCmd(ip, action) {
let method = "";
if (action === "open") method = "Roller.Open";
if (action === "close") method = "Roller.Close";
if (action === "stop") method = "Roller.Stop";
fetch(`http://${ip}/rpc`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ id: 1, method: method, params: { id: 0 } })
}).catch(err => console.error("Roller-Fehler:", err));
}
/* Somfy Puls-Befehle → nur ON, Auto-Off macht Shelly */
function sendSomfyPulse(ip, relayId) {
fetch(`http://${ip}/rpc`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ id: 1, method: "Switch.Set", params: { id: relayId, on: true } })
}).catch(err => console.error("Somfy-Fehler:", err));
}
/* Buttons für Roller erzeugen */
function addRollerButtons(block, device) {
const btnUp = document.createElement("button");
btnUp.className = "btn btn-up";
btnUp.innerText = device.name + " AUF";
btnUp.onclick = () => sendRollerCmd(device.ip, "open");
block.appendChild(btnUp);
const btnStop = document.createElement("button");
btnStop.className = "btn btn-stop";
btnStop.innerText = device.name + " STOP";
btnStop.onclick = () => sendRollerCmd(device.ip, "stop");
block.appendChild(btnStop);
const btnDown = document.createElement("button");
btnDown.className = "btn btn-down";
btnDown.innerText = device.name + " AB";
btnDown.onclick = () => sendRollerCmd(device.ip, "close");
block.appendChild(btnDown);
}
/* Buttons für Somfy erzeugen */
function addSomfyButtons(block, device) {
const btnUp = document.createElement("button");
btnUp.className = "btn btn-up";
btnUp.innerText = device.name + " AUF";
btnUp.onclick = () => sendSomfyPulse(device.ip, 0);
block.appendChild(btnUp);
const btnStop = document.createElement("button");
btnStop.className = "btn btn-stop";
btnStop.innerText = device.name + " STOP";
btnStop.onclick = () => sendSomfyPulse(device.ip, 0);
block.appendChild(btnStop);
const btnDown = document.createElement("button");
btnDown.className = "btn btn-down";
btnDown.innerText = device.name + " AB";
btnDown.onclick = () => sendSomfyPulse(device.ip, 1);
block.appendChild(btnDown);
}
</script>
Auch habe ich hier mittlerweile mir ein Ki Abo genommen, um hier mehr möglichkeiten zuhaben. Wer hierfür etwas Spenden oder das unterstützen möchte:https://paypal.me/SchwarzerHotSpot?loca ... untry.x=DE hat hier die glegenheit dazu.
jeder Betrag ist willkommen mir kostet das Pro Abo 23 € im Monat, die ich für solchen Kreativen Unsinn gerne ausgebe.
Der mit sympatischen Vollmeise
- Schwarzermann
- Beiträge: 346
- Registriert: Sa 9. Okt 2021, 11:16
- Wohnort: 87733
- Hat sich bedankt: 9 Mal
- Danksagung erhalten: 11 Mal
Re: Shelly's schalten, direkt aus Grafana Dashboards heraus.
<style>
#devices {
display: flex; ... </script>
Aus diesem Code kann man sich eigene Räume bauen und auch die Relais aktivieren oder deaktivieren.
Aus diesem Code kann man sich eigene Räume bauen und auch die Relais aktivieren oder deaktivieren.
Der mit sympatischen Vollmeise
Wer ist online?
Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste