Ein Statusdisplay für ioBroker mit ESP32 und NeoPixel LEDs im IKEA Bilderrahmen.
Die Idee war ein simples und energiesparendes Anzeigetableu zu bauen ohne dauerhaft einen kleinen Monitor mit Strom versorgen zu müssen. Ein paar LEDs brauchen nicht viel Strom...
Erster Prototyp – nichts hält länger als ein Provisorium, daher ist dieser Prototyp im Produktivbetrieb
Dieser Code ist als JavaScript dargestellter Blockly-Code für ioBroker. Er nutzt die HTTP API von WLED zur Steuerung der LEDs.
var IP, Farben, Offset, hex, schedule2, Request2, j, LED_Beginn_Offset, i, RGB, Number_of_LEDs, LEDs, result, LED_ID, COLOR, percentage;
// Beschreibe diese Funktion …
async function Steuere_Led(IP, Farben, Offset) {
Request2 = ['curl -X POST "http://',IP,'/json/state" -d \'{"seg":{"i":['].join('');
j = 0;
for (var i_index in Farben) {
i = Farben[i_index];
RGB = await Hex2Dec(i);
if (j != 0) {
Request2 = String(Request2) + ', ';
}
Request2 = [Request2,j + Offset,',[',getAttr(RGB, 'r'),',',getAttr(RGB, 'g'),',',getAttr(RGB, 'b'),']'].join('');
j = (typeof j === 'number' ? j : 0) + 1;
}
Request2 = String(Request2) + ']}}\' -H "Content-Type: application/json"';
console.log(Request2);
exec(Request2, async (error, result, stderr) => {
if (result == '{"success":true}') {
console.log((['LED: ',LED_ID,' Wurde erfolgreich auf Farbe: ',COLOR,' gesetzt'].join('')));
} else {
console.error((['Konnte LED: ',LED_ID,' auf IP: ',IP,' nicht steuern!'].join('')));
}
});
}
// Beschreibe diese Funktion …
async function Hex2Dec(hex) {
{
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
return result ? {
r: parseInt(result[1], 16),
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
} : null;
}
//Geklaut von stackoverflow user "tim-down" hier: https://stackoverflow.com/a/5624139
}
function listsRepeat(value, n) {
var array = [];
for (var i = 0; i < n; i++) {
array[i] = value;
}
return array;
}
schedule2 = schedule('*/15 * * * * *', async () => {
// If You dont start with the fisrt LED of the Strip (0=first LED)
LED_Beginn_Offset = 0;
// Number of LEDS
Number_of_LEDs = 47;
// IP Adress of your WLED device
IP = '192.168.178.180';
// Change the Color here, if default is not "OFF" (Off == Black)
LEDs = listsRepeat('#000000', Number_of_LEDs);
// Mülltonnen
if (getState('trashschedule.0.next.daysLeft').val == 1 && getState('trashschedule.0.next.types').val == 'Wertstoff') {
LEDs[7] = '#3333ff';
}
if (getState('trashschedule.0.next.daysLeft').val == 1 && getState('trashschedule.0.next.types').val == 'Papier') {
LEDs[8] = '#3333ff';
}
if (getState('trashschedule.0.next.daysLeft').val == 1 && getState('trashschedule.0.next.types').val == 'Restabfall') {
LEDs[9] = '#3333ff';
}
// Unwetter
if (getState('dwd.0.numberOfWarnings').val > 0) {
if (getState('dwd.0.warning.level').val == '2') {
LEDs[10] = '#ffff33';
} else if (getState('dwd.0.warning.level').val == '3') {
LEDs[10] = '#ff6600';
} else if (getState('dwd.0.warning.level').val == '4') {
LEDs[10] = '#ff0000';
} else if (getState('dwd.0.warning.level').val == '5') {
LEDs[10] = '#cc33cc';
}
}
// Nina
if (getState('nina.0.03455.numberOfWarn').val > 0) {
LEDs[11] = '#ff0000';
}
// Heizung
if (getState('javascript.0.Guntamatic.Stoerung 0').val != ' ' || getState('javascript.0.Guntamatic.Stoerung 1').val != ' ') {
LEDs[0] = '#ff0000';
}
if (getState('javascript.0.Guntamatic.Asche leeren in').val < 40) {
LEDs[1] = '#ffcc66';
} else if (getState('javascript.0.Guntamatic.Asche leeren in').val < 20) {
LEDs[1] = '#ff0000';
}
if (getState('shelly.0.shellyplusplugs#d4d4da7c4830#1.Relay0.Switch').val == true) {
LEDs[2] = '#33cc00';
}
// Ladezustand Auto
percentage = 0;
var repeat_end = Math.round(getState('vw-connect.0.VSSZZZAAZMD501106.charger.status.batteryStatusData.stateOfCharge.content').val / 10);
for (var count = 0; count < repeat_end; count++) {
// Erste LED der Prozentanzeige (10 gesammt)
LEDs[((26 + percentage) - 1)] = '#3366ff';
percentage = (typeof percentage === 'number' ? percentage : 0) + 1;
}
// Netz Einspeißung/ Verbrauch
if (getState('mqtt.0.iot.smartmeter.sensor.2.obis.1-0:16.7.0.255.value').val > 0) {
percentage = 0;
var repeat_end2 = Math.ceil(getState('mqtt.0.iot.smartmeter.sensor.2.obis.1-0:16.7.0.255.value').val / 2000);
for (var count2 = 0; count2 < repeat_end2; count2++) {
// Erste LED der Prozentanzeige (10 gesammt)
LEDs[((16 + percentage) - 1)] = '#ff9900';
percentage = (typeof percentage === 'number' ? percentage : 0) + 1;
}
} else {
percentage = 0;
var repeat_end3 = Math.ceil(getState('mqtt.0.iot.smartmeter.sensor.2.obis.1-0:16.7.0.255.value').val / -2000);
for (var count3 = 0; count3 < repeat_end3; count3++) {
// Erste LED der Prozentanzeige (10 gesammt)
LEDs[((16 + percentage) - 1)] = '#33cc00';
percentage = (typeof percentage === 'number' ? percentage : 0) + 1;
}
}
// Wallbox
if (getState('0_userdata.0.go-e.Lademodus').val == 1) {
LEDs[36] = '#ff6600';
} else if (getState('0_userdata.0.go-e.Lademodus').val == 2) {
LEDs[35] = '#33cc00';
} else if (getState('0_userdata.0.go-e.Lademodus').val == 3) {
LEDs[35] = '#33cc00';
LEDs[36] = '#ff6600';
}
if (getState('go-e.0.allow_charging').val == 1) {
percentage = 0;
var repeat_end4 = Math.round(getState('go-e.0.amperePV').val * 0.6);
for (var count4 = 0; count4 < repeat_end4; count4++) {
// Erste LED der Prozentanzeige (10 gesammt)
LEDs[((38 + percentage) - 1)] = '#33ff33';
percentage = (typeof percentage === 'number' ? percentage : 0) + 1;
}
}
percentage = 0;
var repeat_end5 = Math.round(getState('go-e.0.energy.power').val - 1);
for (var count5 = 0; count5 < repeat_end5; count5++) {
// Erste LED der Prozentanzeige (10 gesammt)
LEDs[((38 + percentage) - 1)] = '#3333ff';
percentage = (typeof percentage === 'number' ? percentage : 0) + 1;
}
// Sende LED Steuerbefehl
await Steuere_Led(IP, LEDs, LED_Beginn_Offset);
});
null;
1 - 1;