@paul53 ah!
darüber bin ich auch gestolpert.
Problemstellung:
Sind alle Fenster in einem Raum geschlossen?
Geräte
Von paul53 übernommen
const roomID = 'javascript.0.variables.Schließsensoren.BadezimmerOffen';
const ids = ['zigbee.0.00158d00040be1df.opened', 'zigbee.0.00158d00024904cc.opened'];
on(ids, function() { // triggert bei Wertänderung
let istEinFensterOffen = false;
for (let i in ids) {
if (getState(ids[i]).val) istEinFensterOffen = true; // Uns interessieren nur true Werte.
}
// Nachdem alle abgefragt wurden, setze den Wert.
setState(roomID, istEinFensterOffen, true);
});
@paul53 said in Meine Skriptesammlung:
@LSchulze sagte:
Die eben angelegte Variable wird im nächsten Skript eingesetzt um eine Deckenlampe zu steuern.
Bitte für einen Datenpunkt nicht die Bezeichnung "Variable" verwenden, da es zu Verwechslungen mit Script-Variablen kommen kann.
Effizienterer Code:
const raumBewegungID = 'javascript.0.variables.BewegungBüro'; const deviceID = 'yeelight-2.0.Büro_Deckenlampe'; //Gerät, dass geschaltet werden soll on(raumBewegungID, function (obj) { // triggert bei Wertänderung var value = obj.state.val; // Schalte das Gerät, sofern es nicht den Sollzustand hat. if (getState(deviceID + ".control.power").val != value) { setState(deviceID + ".control.power"/*power*/, value); } });
Ich habe deinen Vorschlag in der V002 eingesetzt.
Problemstellung:
Ist es gerade Hell draußen?
TODO
var draußenEsIstHellID = "javascript.0.variables.DraußenEsIstHell"
schedule({astro: "sunriseEnd", shift: 0}, function () {
setState(draußenEsIstHellID, true, true);
});
schedule({astro: "sunsetStart", shift: 0}, function () {
setState(draußenEsIstHellID, false, true);
});
schedule("*/30 * * * *", function () {
if (compareTime(getAstroDate("sunriseEnd", undefined, 0), null, ">", null) && compareTime(getAstroDate("sunsetStart", undefined, 0), null, "<", null)) {
setState(draußenEsIstHellID, true, true);
} else {
setState(draußenEsIstHellID, false, true);
}
});
Problemstellung:
Jedes Zimmer hat eine Bewegungserkennung, doch manchmal will ich im Schlafzimmer das Licht selbst steuern.
Geräte:
IKEA E1524/E1810 - TRADFRI remote control
Eine yeelight Lampe, oder jede andere mit diesen Modi
Mögliche Probleme
Todos:
Aktionen
var lastBri = 100;
var lastCT = 1;
var deviceID = 'zigbee.0.ec1bbdfffeed42cf';
var lightID = 'yeelight-2.0.Büro_Deckenlampe.control';
on({id: deviceID + ".toggle", change: "gt"}, function(obj) {
setState(lightID + '.power', !getState(lightID + '.power').val);
});
on({id: deviceID + ".up_click", change: "gt"}, function(obj) {
var bri = getState(lightID + '.active_bright').val
if (bri < 90) {
setState(lightID + '.active_bright', bri+10);
lastBri = bri+10;
return;
}
else setState(lightID + '.active_bright', 100)
});
on({id: deviceID + ".down_click", change: "gt"}, function(obj) {
var bri = getState(lightID + '.active_bright').val
if (bri > 10) {
setState(lightID + '.active_bright', bri-10);
lastBri = bri-10;
return;
}
else setState(lightID + '.active_bright', 0)
});
on({id: deviceID + ".right_button", change: "gt"}, function(obj) {
setState(lightID + '.moon_mode', !getState(lightID + '.moon_mode').val);
});
on({id: deviceID + ".right_click", change: "gt"}, function(obj) {
setState(lightID + ".ct", ([2700, 3500, 4000, 5500, 6500][(lastCT - 1)]));
lastCT = lastCT + 1;
if(lastCT>5)
lastCT = 5;
});
on({id: deviceID + ".left_click", change: "gt"}, function(obj) {
setState(lightID + ".ct", ([2700, 3500, 4000, 5500, 6500][(lastCT - 1)]));
lastCT = lastCT - 1;
if(lastCT<1)
lastCT = 1;
});
Problemstellung:
Im Badezimmer fehlt mir eine einfache Möglichkeit zwischen Radiosendern auf einem Chromecast Gerät wechseln zu können.
Geräte:
ToDo
Aktionen
Drehregler zum steuern vom Volumen
1 Click - Start / Pause
2 Click - Nächster Radiosender
3 Click - wird nicht verwendet.
var deviceID = 'zigbee.0.680ae2fffe37314a';
var volumenID = "javascript.0.variables.VolumenKüche";
var chromecastID = 'chromecast.0.Küche_Home';
var radiosenderListe = ['http://www.wdr.de/wdrlive/media/1live_fiehe.m3u', 'http://st01.dlf.de/dlf/01/128/mp3/stream.mp3', 'http://st03.dlf.de/dlf/03/128/mp3/stream.mp3', 'http://wdr-1live-specials.icecast.wdr.de/wdr/1live/specials/mp3/128/stream.mp3?ar-distributor=ffa1', null];
var last = 1;
on({id: deviceID + '.rotate_right', change: "any"}, function (obj) {
var newState = getState(volumenID).val + 5;
if(newState > 100)
newState = 100;
setState(volumenID, newState);
});
on({id: deviceID + '.rotate_left', change: "any"}, function (obj) {
var newState = getState(volumenID).val - 5;
if(newState < 0)
newState = 0;
setState(volumenID, newState);
});
on({id: deviceID + '.rotate_stop', change: "gt"}, function (obj) {
setState(".status.volume", getState(volumenID));
});
on({id: deviceID + '.button_play_pause', change: "gt"}, function (obj) {
if(getState(chromecastID + ".player.paused").val == false)
{
getState(chromecastID + ".player.paused", function (err, state) {
setState(chromecastID + ".player.pause"/*Küche_Home.player.play*/, state ? !state.val : true);
});
}
else
{
getState(chromecastID + ".player.paused", function (err, state) {
setState(chromecastID + ".player.play"/*Küche_Home.player.play*/, state ? state.val : true);
});
}
});
on({id: deviceID + '.button_skip_foward', change: "gt"}, function (obj) {
setState(chromecastID + ".player.url2play", (radiosenderListe[(last - 1)]));
last = last + 1;
if(last>4)
last = 0;
});
Die eben angelegten Datenpunkt wird im nächsten Skript eingesetzt um eine Deckenlampe zu steuern.
Geräte
Mögliche Probleme
TODO
[V002]
var raumBewegungID = 'javascript.0.variables.BewegungBüro';
var deviceID = 'yeelight-2.0.Büro_Deckenlampe'; //Gerät, dass geschaltet werden soll
var onlyNighttime = true
var nighttimeID = 'javascript.0.variables.DraußenEsIstHell'
on(raumBewegungID, function (obj) { // triggert bei Wertänderung
var value = obj.state.val;
// Schalte das Gerät, sofern die Tageszeit es zulässt und es nicht bereits den Sollzustand hat.
if ((( onlyNighttime && getState(nighttimeID).val == false) // Ist es Nacht?
|| onlyNighttime == false ) // Oder ist das egal?
&& getState(deviceID + ".control.power").val != value) {
setState(deviceID + ".control.power"/*power*/, value);
}
});
Starten möchte ich damit, eine Variable zu erstellen, die mir anzeigt ob in einem Raum in den letzten Minuten eine Bewegung stattfand. Diese Variable kann dann von anderen Skripten abgefragt werden um zB das Licht anzumachen, das Rollo hochzufahren oder die Musikanlage zu starten.
Hierbei ist wichtig die Grenzen der eingesetzten Human Motion detektoren zu kennen. Bei Ikea und Aqara erhaltet ihr zB nur bei größeren Bewegungen auch eine Aktualisierung der Occupancy. Bei Ikea kann sogar nur alle paar Minuten eine erneute Bewegung erkannt werden. Bei Aqara gibt es einen Trick17 um dieses Limit zu verringern. Aus diesem Grund habe ich mich für diesen Aufbau entschieden:
Es wird die Bewegungsvariable auf True gesetzt, sobald die erste Occupancy Meldung vom Motion Detektor kommt, dann wird gewartet bis dieser Occupancy-Wert das erste mal false wird. Dann wird ein Timer gestartet und löst zB 10 Minuten später aus und schaltet die Variable wieder auf false. Sollte sich in der Zwischenzeit erneut jemand bewegt haben, wird der Timer zurückgesetzt.
Geräte:
Setup:
bewegungssensorID kann ein Aqara oder Ikea Bewegungsmelder sein. Beide verwenden "occupancy" um eine Bewegung zu melden. Es wird nur gt/lt dieser Meldungen ausgewertet.
Es gibt 2 Javascript Variablen
var bewegungssensorID = 'zigbee.0.588e81fffe4204f9'; //Bewegungssensor, der geprüft werden soll
var raumBewegungID = 'javascript.0.variables.BewegungBüro'; //Gerät, dass geschaltet werden soll
var timeoutLimitID = 'javascript.0.variables.timeoutBüroLimit';
var timeoutLimit = getState(timeoutLimitID).val * 60 * 1000;
var timeout;
on({id: bewegungssensorID + '.occupancy', change: "gt"}, function (obj) {
var value = obj.state.val; var oldValue = obj.oldState.val;
(function () {if (timeout) {clearTimeout(timeout); timeout = null;}})(); // Es gab Bewegung, setze timeout zurück
setState(raumBewegungID, true, true); // setze Raum
});
on({id: bewegungssensorID + '.occupancy', change: "lt"}, function (obj) {
var value = obj.state.val; var oldValue = obj.oldState.val;
timeout = setTimeout(function () {
setState(raumBewegungID, false, true); // Wenn der Timeout erreicht ist, setze Raum zurück
}, timeoutLimit);
});
V002 - Noch in der Erprobung
const raumID = 'javascript.0.variables.BewegungBüro';
const ids = ['zigbee.0.588e81fffe4204f9.occupancy', 'zigbee.0.588e81fffe42b19e.occupancy'];
var timeoutLimitID = 'javascript.0.variables.timeoutBüroLimit';
var timeoutLimit = getState(timeoutLimitID).val * 60 * 1000;
var timeout
on(ids, function(obj) {
var value = obj.state.val; var oldValue = obj.oldState.val;
if(value != oldValue) // triggert bei Wertänderung
{
if(value>oldValue){
(function () {if (timeout) {clearTimeout(timeout); timeout = null;}})(); // Sollte ein Timer laufen, setzen wir ihn zurück
setState(raumID, true, true); // setze Raum
}
else{
(function () {if (timeout) {clearTimeout(timeout); timeout = null;}})(); // Sollte ein Timer laufen, setzen wir ihn zurück
timeout = setTimeout(function () {
setState(raumID, false, true); // Wenn der Timeout erreicht ist, setze Raum zurück
}, timeoutLimit);
}
}
});
Moin,
ich möchte euch an meinen Skripten teilhaben lassen. Ich würde mir feedback wünschen, solange es konstruktiv ist.
Grundpfeiler der Skripte
Todo:
Architektur
hi,
ich konnte vermutlich alles richtig installieren aber bei mir erscheinen gar nicht die eigentlichen Commandos. Wie komme ich an die?
scheint wohl ein bekanntes Problem zu sein. Dann geht das Gateway morgen zurück zu ikea -.-