Hier mal quick&dirty:
Gebaut hab ich das wie der gute Dennis es hier beschreibt: https://www.youtube.com/watch?v=gN2gJ3IYXpo&t=491s
Da ich aber kein Blockly Freund bin, hab ich ein Javascript entwickelt, welches per HTTP Request, die LEDs setzt.
Paar Infos dazu:
Ich setze sehr stark auf den LinkedDevices Adapter und schreibe dort den Datenpunkt "open" für die Türkontaktsensoren entsprechend um: false=geschlossen, true=offen. Die Datenpunkte existierten bereits und ich wollte hierfür keine neuen anlegen.
In ObjektLEDs wird die Zuordnung des Datenpunktes auf die LED definiert.
Mit den Variablen Doors,BoolDevicesTrueRED,BoolDevicesTrueGreen und Lights definiert man, wie sich die LED verhalten soll.
Für die Mülltonnen hab ich eine Sonderbehandlung, da ich mein Mülltonnenscript nicht komplett umbauen wollte.
Hier mein Script:
/*
BEI TASMOTA BEGINNT DIE ZÄHLUNG BEI 1 !!!
LED 29: Wohnzimmer linke Tür LED 18: Kai Türe LED 17: Gästezimmer Türe LED 6: Altpapaier LED 5: linke Waschmaschine
LED 28: Wohnzimmer rechte Tür LED 19: Kai Fenster LED 16: Gästezimmer Fenster LED 7: Biomüll LED 4: rechte Waschmaschine
LED 27: Küche Fenster LED 20: Lea Türe LED 15: Büro Fenster LED 8: Restmüll LED 3: Trockner
LED 26: WC Fenster LED 21: Bad Fenster LED 14: Klimagerät LED 9: Wertstoffe LED 2: Geschirrspüler
LED 25: Waschküche Fenster LED 22: Schlafzimmer Fenster LED 13: Entertainment LED 10: LED 1:
LED 24: Keller Fenster LED 23: Garagentor LED 12: LED 11: LED 0: Gäste WLAN
*/
// Lichtfarbendefinition
//Originale Farbwerte:
//var ColorOK = "10FF00"; //Grün
//var ColorWarning = "ffcb05"; //Orange bis Gelb
//var ColorError = "ff0000"; //Rot
//diese waren zu hell, durch Konvertierung auf HSL, dimmen auf ide Hälfte (L = 25%) und zurück nach RGB, ergibt:
var ColorOK = "043800"; //Grün
var ColorWarning = "806600"; //Orange bis Gelb
var ColorError = "800000"; //Rot
//Gerätedefinition
var DisplayIP = "10.1.24.105";
var ObjektLEDs = [
//BEI TASMOTA BEGINNT DIE ZÄHLUNG BEI 1 !!!
{ Objekt: 'linkeddevices.0.Livingroom.wlanGuest', LED: '01' },
{ Objekt: '', LED: '02' },
{ Objekt: 'linkeddevices.0.Kitchen.DisherStatusBinaer', LED: '03' },
{ Objekt: 'linkeddevices.0.Washroom.DryerStatusBinaer', LED: '04' },
{ Objekt: 'linkeddevices.0.Washroom.WasherRightStatusBinaer', LED: '05' },
{ Objekt: 'linkeddevices.0.Washroom.WasherLeftStatusBinaer', LED: '06' },
{ Objekt: 'Altpapier', LED: '07' }, //Altpapier
{ Objekt: 'BioMuell', LED: '08' }, //Biomüll
{ Objekt: 'RestMuell', LED: '09' }, //Restmüll
{ Objekt: 'Wertstoffe', LED: '10' }, //Wertstoffe
{ Objekt: '', LED: '11' },
{ Objekt: '', LED: '12' },
{ Objekt: '', LED: '13' },
{ Objekt: 'linkeddevices.0.Livingroom.ENTERTAINMENTstate', LED: '14' },
{ Objekt: 'linkeddevices.0.Office.KLIMAGERAETstate', LED: '15' },
{ Objekt: '', LED: '16' },
{ Objekt: '', LED: '17' },
{ Objekt: 'linkeddevices.0.Guests.DoorOpened', LED: '18' },
{ Objekt: 'linkeddevices.0.Kai.DoorOpened', LED: '19' },
{ Objekt: 'linkeddevices.0.Kai.WindowOpened', LED: '20' },
{ Objekt: 'linkeddevices.0.Lea.DoorOpened', LED: '21' },
{ Objekt: 'linkeddevices.0.Bath.WindowOpened', LED: '22' },
{ Objekt: 'linkeddevices.0.Sleepingroom.opened', LED: '23' },
{ Objekt: 'linkeddevices.0.Garage.opened', LED: '24' },
{ Objekt: 'linkeddevices.0.Cellar.WindowOpened', LED: '25' },
{ Objekt: 'linkeddevices.0.Washroom.WindowOpened', LED: '26' },
{ Objekt: 'linkeddevices.0.WC.WindowOpened', LED: '27' },
{ Objekt: 'linkeddevices.0.Kitchen.opened', LED: '28' },
{ Objekt: 'linkeddevices.0.Livingroom.DoorRightOpened', LED: '29' },
{ Objekt: 'linkeddevices.0.Livingroom.DoorLeftOpened', LED: '30' }
];
//Türen und Fenster
var Doors = ['linkeddevices.0.Livingroom.DoorLeftOpened','linkeddevices.0.Livingroom.DoorRightOpened','linkeddevices.0.Garage.opened','linkeddevices.0.Bath.WindowOpened',
'linkeddevices.0.Kitchen.opened','linkeddevices.0.Sleepingroom.opened','linkeddevices.0.Kai.DoorOpened','linkeddevices.0.Kai.WindowOpened','linkeddevices.0.Lea.DoorOpened',
'linkeddevices.0.Cellar.WindowOpened','linkeddevices.0.Washroom.WindowOpened','linkeddevices.0.WC.WindowOpened','linkeddevices.0.Guests.DoorOpened'];
var BoolDevicesTrueRED = ['linkeddevices.0.Office.KLIMAGERAETstate','linkeddevices.0.Livingroom.ENTERTAINMENTstate','linkeddevices.0.Livingroom.wlanGuest',
'linkeddevices.0.Washroom.DryerStatusBinaer','linkeddevices.0.Washroom.WasherLeftStatusBinaer','linkeddevices.0.Washroom.WasherRightStatusBinaer','linkeddevices.0.Kitchen.DisherStatusBinaer']; //LED ist rot, wenn der Status dieses Gerätes TRUE ist
var BoolDevicesTrueGreen = []; //LED ist grün, wenn der Status dieses Gerätes TRUE ist
var Lights = []; //LED ist gelb, wenn die Lampe an ist, ansonsten aus
// -----------------------------------------
function wait(ms){
var start = new Date().getTime();
var end = start;
while(end < start + ms) {
end = new Date().getTime();
}
}
function RunRequest(URL){
try {
require("request")(URL).on("error", function (e) {console.error(e);});
} catch (e) { console.error(e); }
console.log("Statusdisplay Request: " + URL);
}
// --- Funktion für Einzelledsteuerung ----------------------------------------------------------
function SwitchLED (LEDNo, ColorCode) {
if (getState('sonoff.0.Statusdisplay.POWER').val) {
RunRequest("http://"+DisplayIP+"/cm?cmnd=Led"+LEDNo+"%20"+ColorCode);
}
}
function GetLedNo (DeviceTriggerName){
//log ("Dev: " + DeviceTriggerName);
for (var ObjektLED in ObjektLEDs) { //ObjektLED enthält nur eine Nummer und nicht das Element
//log ("Name: " + ObjektLEDs[ObjektLED].Objekt);
if (ObjektLEDs[ObjektLED].Objekt == DeviceTriggerName) {
return (ObjektLEDs[ObjektLED].LED);
}
}
}
function SetBoolDevicesTrueRED (DeviceTriggerName, DeviceTriggerValue) {
if (DeviceTriggerValue == "true" || DeviceTriggerValue == "1" || DeviceTriggerValue == "läuft" ) {
SwitchLED (GetLedNo(DeviceTriggerName),ColorError);
} else {
SwitchLED (GetLedNo(DeviceTriggerName),ColorOK);
}
}
function SetBoolDevicesTrueGreen (DeviceTriggerName, DeviceTriggerValue) {
if (DeviceTriggerValue == "true" || DeviceTriggerValue == "1") {
SwitchLED (GetLedNo(DeviceTriggerName),ColorOK);
} else {
SwitchLED (GetLedNo(DeviceTriggerName),ColorError);
}
}
function SetDoorsLED (DeviceTriggerName, DeviceTriggerValue) {
if (DeviceTriggerValue == "geschlossen") {
SwitchLED (GetLedNo(DeviceTriggerName),ColorOK);
} else {
SwitchLED (GetLedNo(DeviceTriggerName),ColorError);
}
}
function SetLightsLED (DeviceTriggerName, DeviceTriggerValue) {
if (DeviceTriggerValue) {
SwitchLED (GetLedNo(DeviceTriggerName),ColorWarning);
} else {
SwitchLED (GetLedNo(DeviceTriggerName),"000000");
}
}
function SetMuelltonnenLights(){
function SwitchGarbageLEDs(GarbageName,Days){
if (Days == 0) {
SwitchLED (GetLedNo(GarbageName),ColorError);
} else if (Days == 1) {
SwitchLED (GetLedNo(GarbageName),ColorWarning);
} else {
SwitchLED (GetLedNo(GarbageName),ColorOK);
}
}
var RestMuellResttage = getState('Datenpunkte.0.Wertstoffe.Restmüll_Resttage').val;
var BioMuellResttage = getState('Datenpunkte.0.Wertstoffe.Bio_Resttage').val;
var AltpapierResttage = getState('Datenpunkte.0.Wertstoffe.Papier_Resttage').val;
var WertstoffeResttage = getState('Datenpunkte.0.Wertstoffe.Wertstoffe_Resttage').val;
SwitchGarbageLEDs("BioMuell",BioMuellResttage);
SwitchGarbageLEDs("RestMuell",RestMuellResttage);
SwitchGarbageLEDs("Altpapier",AltpapierResttage);
SwitchGarbageLEDs("Wertstoffe",WertstoffeResttage);
}
// --- globale Displayfunktionen ----------------------------------------------------------------
function ResetDisplay(){
setState('sonoff.0.StatusDisplay.Color','000000');
//setState('sonoff.0.StatusDisplay.POWER',false); //Power wird bei MQTT automatisch auf false gesetzt
}
function SwitchOffDisplayDelayed(){
//setStateDelayed('sonoff.0.Statusdisplay.POWER',false,(1000 * 60)); //Angabe in Millisekunden
}
function SwitchOnOffDisplay(PowerOn){
if (PowerOn) {
RunRequest("http://"+DisplayIP+"/cm?cmnd=Power%20on");
log ("Status Display: Power On");
} else {
RunRequest("http://"+DisplayIP+"/cm?cmnd=Power%20off");
log ("Status Display: Power Off");
}
}
function InitDisplay(){
log ("+++ Statusdisplay Init");
//Option20 setzen: LED: ermöglicht den Dimmwert zu verändern, ohne die Versorgung einzuschalten (default = 0 / off)
RunRequest("http://"+DisplayIP+"/cm?cmnd=SetOption20%201");
RunRequest("http://"+DisplayIP+"/cm?cmnd=fade%200");
RunRequest("http://"+DisplayIP+"/cm?cmnd=scheme%200");
wait (1000); //Milliseconds
//alle undefinierten LEDs löschen
for (i = 0; i < 30; i++) {
//console.log ("------------------------------------------------------------");
//console.log(ObjektLEDs[i].Objekt + ": " + ObjektLEDs[i].Objekt.length);
if (ObjektLEDs[i].Objekt == '') {
SwitchLED ((i+1),"000000");
wait (500); //Milliseconds
}
}
if (Doors.length > 0) {
Doors.forEach(function(element) {
SetDoorsLED(element,getState(element).val);
});
}
if (BoolDevicesTrueRED.length > 0) {
BoolDevicesTrueRED.forEach(function(element) {
//var value = getState(element).val;
//SetBoolDevicesTrueRED(element,value);
SetBoolDevicesTrueRED(element,getState(element).val);
});
}
if (BoolDevicesTrueGreen.length > 0) {
BoolDevicesTrueGreen.forEach(function(element) {
SetBoolDevicesTrueGreen(element,getState(element).val);
});
}
if (Lights.length > 0) {
Lights.forEach(function(element) {
SetLightsLED(element,getState(element).val);
});
}
SetMuelltonnenLights();
}
// --- MAIN ---------------------------------------------------------------------------
on({id:'sonoff.0.Statusdisplay.POWER', change: 'ne'},(obj) => {
var value = obj.state.val;
log ("Statusdisplay - Power: " + value);
if (value) {
InitDisplay();
}
});
on({id: Doors, change: 'ne'},(obj) => {
//setState('sonoff.0.StatusDisplay.POWER',true)
var value = obj.state.val;
var objArr = obj.id.match(/(^.+)\.(.+)\.(.+)$/, ""); //Aufteilung in Pfad + Device + CMD
//var DeviceID=objArr[1]+"."+objArr[2];
//var DeviceName=objArr[2];
/*console.log("Trigger: " + objArr[0]);
console.log("Pfad: " + objArr[1]);
console.log("Devic);name: " + objArr[2]);
console.log("localDeviceID:"+DeviceID);*/
SetDoorsLED(objArr[0],value);
SwitchOffDisplayDelayed();
});
on({id: BoolDevicesTrueRED, change: 'ne'},(obj) => {
//setState('sonoff.0.StatusDisplay.POWER'/*Turn On/Off*/,true)
var value = obj.state.val;
var objArr = obj.id.match(/(^.+)\.(.+)\.(.+)$/, ""); //Aufteilung in Pfad + Device + CMD
SetBoolDevicesTrueRED(objArr[0],value);
SwitchOffDisplayDelayed();
});
on({id: BoolDevicesTrueGreen, change: 'ne'},(obj) => {
//setState('sonoff.0.StatusDisplay.POWER'/*Turn On/Off*/,true)
var value = obj.state.val;
var objArr = obj.id.match(/(^.+)\.(.+)\.(.+)$/, ""); //Aufteilung in Pfad + Device + CMD
SetBoolDevicesTrueGreen(objArr[0],value);
SwitchOffDisplayDelayed();
});
on({id: Lights, change: 'ne'},(obj) => {
//setState('sonoff.0.StatusDisplay.POWER'/*Turn On/Off*/,true)
//InitDisplay();
var value = obj.state.val;
var objArr = obj.id.match(/(^.+)\.(.+)\.(.+)$/, ""); //Aufteilung in Pfad + Device + CMD
SetLightsLED(objArr[0],value);
SwitchOffDisplayDelayed();
});
//-- Inits --
if (getState('linkeddevices.0.Diningroom.StatusdisplayPOWER').val == false) {
//setState('linkeddevices.0.Diningroom.StatusdisplayPOWER',true); //Power True triggert "InitDisplay()"
SwitchOnOffDisplay(true);
} else {
InitDisplay();
}
//Display AN/AUS Steuerung
on({id: 'javascript.0.Astro.Astrotag',val: true}, function(){
//Wenn es Tag wird Display anschalten
if (getState('linkeddevices.0.Diningroom.StatusdisplayPOWER').val == false) {
SwitchOnOffDisplay(true);
}
})
on({id: 'linkeddevices.0.Diningroom.CEILINGSWITCHSwitch', change: 'ne'}, function() {
//Wenn es Nacht ist, wird das Display mit der Deckenlampe geschaltet
if (getState('javascript.0.Astro.Astrotag').val == false) {
SwitchOnOffDisplay(getState('linkeddevices.0.Diningroom.CEILINGSWITCHSwitch').val);
}
})
//schedule('0 6 * * *', function(){SwitchOnOffDisplay(true)});
schedule('55 22 * * *', function(){SwitchOnOffDisplay(false)}); //zur Sicherheit trotzdem um 23 Uhr ausschalten
schedule('1 6 * * *', SetMuelltonnenLights);