Hallo Gemeinde, durch die Vorlage von @Mic seinem Script zur Schaltung von Lichter per BW: https://www.forum.iobroker.net/topic/22034/vorlage-bewegungsmelder-xiaomi-aqara-geräte-lichter-steuern. Hab ich mir gedacht das müsste auch mit sämtlichen anderen Geräten laufen. Hab mir das script mal angeschaut und versucht das zu erweitern. Da ich Java-script lernen möchte und ich sowas schon lange umsetzen wollte war die Vorlage dafür perfekt, danke dafür!!!
Ich habe es jetzt so, versuch zu erweitern das jedes Gerät als trigger verwendet werden kann. Eine Astro Funktion mit eingebaut, die Vorlage dafür kommt auch aus diesem Forum nur leider finde ich diesen Beitrag bzw die Quelle nicht mehr. Jedenfalls danke an die Ersteller dieses Skriptes
Mit der Erweiterung sind Dimmer mit einbezogen dass das Licht abhängig von der Tageszeit einen bestimmten Helligkeit-wert bekommt.
Ich bin kein Java-script typ jediglich totaler Anfänger also werden einigen Pros sicherlich Fehler auffallen aber bei mir läuft es bis jetzt ganz gut und ich hab Schon einige Geräte integriert.
Über Feedback, Anregungen und Verbesserungsvorschläge bin ich sehr offen denn nur so kann man weiter lernen.
Danke an alle Ersteller und deren Quelle bzw Codes.
/*******************************************************************************
* Inspiriert von Vorlage: https://forum.iobroker.net/topic/22034/vorlage-bewegungsmelder-xiaomi-aqara-geräte-lichter-steuern
* Autor: ioBroker-Forum-Name: Mic / Github-Name: Mic-M
* Source: https://github.com/Mic-M/iobroker.xiaomi-aquara-motion-control
/*******************************************************************************
/*******************************************************************************
* Konfiguration
******************************************************************************/
// Hier die einzelnen Geräte konfigurieren und beliebig Zeilen hinzufügen.
//
// [1] + [2] Zeiten: nur in den angegebenen Zeiten wird geschaltet. Falls immer geschaltet
// werden soll, dann jeweils '0:00' und '23:59' eintragen.
//
// [3] Timmer wielange eingeschalten bleiben soll.
//
// [4] Lux: Ab wieviel Lux soll nicht mehr eingeshaltet werden? 9999, wird unabhängig von der Lux messung immer eingeschaltet.
//
// [5] Datenpunkt Trigger: Datenpunkt mit welchen Gerät getriggert werden soll.
//
// [6] Datenpunkt schaltendes Gerät: Datenpunkt welher Gerät geschaltet werden soll.
//
// [7] Dimmer State: Falls dimmer vorhanden hier ID eintragen wenn nicht ' ' ausrufezeichen leer lassen!!!
//
// [8] Tageszeit: Schalten der Geräte nach Tagezeit !!! Nur in verbindung mit Astro script:
// https://forum.iobroker.net/topic/2423/astro-tageszeit-abfragen-und-in-datenpunkt-eintragen
// Es funktioniert nur eine Zeit, compareTime oder Tageszeit!
//
// [9] Datenpunkt Lux: Datenpunkt für Lux messung.
const DEVICE = [];
// [0] Name [1] Zeit [2] Zeit [3] Nach wie vielen Minuten ohne [4]Lux [5] Datenpunkt Trigger [6] Datenpunkt schaltendes Gerät etc. [7] Dimmer State [8] Tageszeit [9] Datenpunkt Lux
// (beliebig) von bis änderung wieder aus? Falls 0,
// dann wird nicht ausgeschaltet.
DEVICE[0] = [ 'Flur Mitte', '00:00', '23:59', 1, 50, 'mihome.0.devices.sensor_motion_aq2_158d000276d447.state', 'sonoff.0.Flur Mitte.POWER', 'sonoff.0.Flur Mitte.Dimmer', false, 'mihome.0.devices.sensor_motion_aq2_158d000276d447.lux'];
DEVICE[1] = [ 'Haustürlicht', '00:00', '00:00', 20, 9999, 'mihome.0.devices.magnet_158d00026a2b28.state', 'sonoff.0.Haustürlicht.POWER', ' ', true];
DEVICE[2] = [ 'Gartenlicht', '00:00', '00:00', 0, 9999, 'mihome.0.devices.magnet_158d0001c2e8d6.state', 'sonoff.0.Garten-Spot.POWER', ' ', true];
DEVICE[3] = [ 'Flur Unten', '00:00', '23:59', 1, 50, 'mihome.0.devices.sensor_motion_aq2_158d000276d3d1.state', 'sonoff.0.Flur unten hinten.POWER', ' ', false, 'mihome.0.devices.sensor_motion_aq2_158d000276d3d1.lux'];
DEVICE[4] = [ 'Haustürlicht_Klingel','00:00', '00:00', 30, 9999, 'hm-rpc.0.MEQ0485030.1.STATE', 'sonoff.0.Haustürlicht.POWER', ' ', true];
const BRIGHTNESS = [];
// [0] Nacht [1] Morgendämmerung [2] Sonnenaufgang [3] Morgen [4] Vormittag [5] Mittag [6] Nachmittag [7] Abend [8] Sonnenuntergang [9] Abenddämmerung
//Sind % Angaben
BRIGHTNESS[0] = [ 1, 20, 50, 70, 100, 100, 100, 80, 80, 60];
//
const DAYTIME = [];
// [0] Nacht [1] Morgendämmerung [2] Sonnenaufgang [3] Morgen [4] Vormittag [5] Mittag [6] Nachmittag [7] Abend [8] Sonnenuntergang [9] Abenddämmerung
//
DAYTIME[0] = [true, true, true, false, false, false, false, false, true, true];
//
// Logeinträge: Infos zeigen (wenn eingeschaltet oder ausgeschaltet wurde)
const INFO = true;
// Logeinträge: Zusätzliche Einträge anzeigen zur Fehlerbehebung. Auf "false" setzen, wenn alles funktioniert.
const DEBUG = false;
/*******************************************************************************
* Ab hier nichts mehr ändern / Stop editing here!
******************************************************************************/
main();
function main() {
for (let i = 0; i < DEVICE.length; i++) {
let timer = null;
on({id: DEVICE[i][5], change: 'any'}, function(obj) {
// Falls Timer läuft: auf null setzen.
if (timer) {
clearTimeout(timer);
timer = null;
}
if(obj.state.val) {
if (DEBUG) log('[DEBUG] ' + DEVICE[i][0] + ': State hat sich geändert auf true');
//Prüfung auf Zeitangabe
if(DEVICE[i][1] > '00:00' || DEVICE[i][2] > '00:00' && DEVICE[i][8] === true) {if (DEBUG) log('[DEBUG] ' + 'Keine richtige CompareTime bzw Tageszeit anweisung!');}
//
else {
//CompareTime
if(compareTime(DEVICE[i][1],DEVICE[i][2], 'between')) {
if (DEBUG) log('[DEBUG] ' + DEVICE[i][0] + ': Weiter mit CompareTime!');
//Prüfung auf LUX einstellung
let LuxIsGiven = true; // Default auf true, wird false gesetzt, falls nicht gegeben.
if(DEVICE[i][4] < 9999 ) {
if (DEBUG) log('[DEBUG] ' + DEVICE[i][0] + ': Prüfung auf Lux ist aktiviert.')
// Prüfung gemessene Lux kleiner Schwellwert, bis zu dem geschalten werden soll
let luxActual = getState(DEVICE[i][9]).val;
if (luxActual >= DEVICE[i][4]) {
if (DEBUG) log('[DEBUG] ' + DEVICE[i][0] + ': Gemessene Lux = ' + luxActual + ', >= Schwelle von ' + DEVICE[i][4] + ', daher wird nicht geschaltet.')
LuxIsGiven = false;
} else {
if (DEBUG) log('[DEBUG] ' + DEVICE[i][0] + ': Gemessene Lux = ' + luxActual + ', < Schwelle von ' + DEVICE[i][4] + ', daher eingeschaltet.')
}
}
//Dimmer werde setzen
if(DEVICE[i][7] != ' ') {
let tageszeitActual = getState('javascript.0.Astro.Tageszeit.current'/*Tageszeit*/).val;
var dimmer;
if(tageszeitActual === "Nacht") dimmer = BRIGHTNESS[i][0];
if(tageszeitActual === "Morgendämmerung") dimmer = BRIGHTNESS[i][1];
if(tageszeitActual === "Sonnenaufgang") dimmer = BRIGHTNESS [i][2];
if(tageszeitActual === "Morgen") dimmer = BRIGHTNESS [i][3];
if(tageszeitActual === "Vormittag") dimmer = BRIGHTNESS [i][4];
if(tageszeitActual === "Mittag") dimmer = BRIGHTNESS [i][5];
if(tageszeitActual === "Nachmittag") dimmer = BRIGHTNESS [i][6];
if(tageszeitActual === "Abend") dimmer = BRIGHTNESS [i][7];
if(tageszeitActual === "Sonnenuntergang") dimmer = BRIGHTNESS [i][8];
if(tageszeitActual === "Abenddämmerung") dimmer = BRIGHTNESS [i][9];
if (DEBUG) log('[DEBUG]' + DEVICE[i][0] + ': Tageszeit = ' + tageszeitActual + ' entspricht ' + 'Dimmerwert: ' + dimmer );
}
// Wir schalten, wenn Gerät derzeit aus ist und Lux passt
let deviceStatus = getState(DEVICE[i][6]).val;
if ( (deviceStatus === false) && (LuxIsGiven === true) ){
setState(DEVICE[i][6], true); // Licht/Gerät wird geschaltet.
if(DEVICE[i][7] != ' ') {setState(DEVICE[i][7], dimmer)
if(INFO) log(DEVICE[i][0] + ' wurde eingeshaltet mit Helligkeit: ' + dimmer)}
else if(INFO) log(DEVICE[i][0] + ' wurde eingeschaltet ohne Dimmer!')
}
} else {
if(DEVICE[i][8], true) {
if (DEBUG) log('[DEBUG] ' + DEVICE[i][0] + ': Weiter mit Tageszeitangabe!');
let tageszeitActual = getState('javascript.0.Astro.Tageszeit.current'/*Tageszeit*/).val;
var daytime = false;
if(tageszeitActual === "Nacht" && DAYTIME[0][0] === true) daytime = true;
if(tageszeitActual === "Morgendämmerung" && DAYTIME[0][1] === true) daytime = true;
if(tageszeitActual === "Sonnenaufgang" && DAYTIME[0][2] === true) daytime = true;
if(tageszeitActual === "Morgen" && DAYTIME[0][3] === true) daytime = true;
if(tageszeitActual === "Vormittag" && DAYTIME[0][4] === true) daytime = true;
if(tageszeitActual === "Mittag" && DAYTIME[i][5] === true) daytime = true;
if(tageszeitActual === "Nachmittag" && DAYTIME[0][6] === true) daytime = true;
if(tageszeitActual === "Abend" && DAYTIME[0][7] === true) daytime = true;
if(tageszeitActual === "Sonnenuntergang" && DAYTIME[0][8] === true) daytime = true;
if(tageszeitActual === "Abenddämmerung" && DAYTIME[0][9] === true) daytime = true;
}
let deviceStatus = getState(DEVICE[i][6]).val;
if ( (deviceStatus === false) && (daytime === true)) {
setState(DEVICE[i][6], true); // Licht/Gerät wird geschaltet.
if(INFO) log(DEVICE[i][0] + ' wurde eingeschaltet per Tageszeit.');
} else if(INFO) log(DEVICE[i][0] + ' keine gesetzte Tageszeit im Moment.');
}
}
}
else {
if (DEBUG) log('[DEBUG] ' + DEVICE[i][0] + ': State geändert auf false');
// Ausschalten. Aber nur falls gewünscht (falls 0, dann soll nicht per diesem Script ausgeschaltet werden).
if (DEVICE[i][3] > 0 ) {
// wenn erstmals keine Bewegung wird Timer gestartet
timer = setTimeout(function() {
timer = null;
setState(DEVICE[i][6], false); // Licht/Gerät aus nach Ablauf Timer
if(INFO) log(DEVICE[i][0] + ': kein Trigger mehr, daher ausgeschaltet.');
}, DEVICE[i][3] * 1000); // Timer setzen auf X Minuten
}
}
});
}
}
Grüße Axel