Ich habe ein Skript gecoded (mehr schlecht als recht) welches genau sowas umsetzt [1]. Durch einen Bug im Javascript-Adapter wird aber der Log etwas zugemüllt dadurch. Habe das mittlerweile auch für die Musikwecker erweitert, falls Interesse besteht.
NEWS
Latest posts made by qoka
-
RE: Alexa2.0 Adapter - Wecker
-
Selector, Objekte, und States gelöschter Wecker/Alarme
Hallo zusammen,
ein Verhalten des selectors ($(…)) beim Suchen von Wecker Objekten bringt mich langsam aber sicher um den Verstand Das Phänomen wurde hier schon von BigTastyBacon (viewtopic.php?f=37&t=16095&start=240#p176009) berichtet.
Ich lösche einen Wecker in der Alexa App und sehe
alexa2.0 2018-09-26 21:08:50.764 info channel Echo-Devices.XXXXXXX.Alarm.d990f7ee-d347-3c7c-91fc-416fe363d131 deleted (null) alexa2.0 2018-09-26 21:08:50.763 info state Echo-Devices.XXXXXXX.Alarm.d990f7ee-d347-3c7c-91fc-416fe363d131.triggered deleted alexa2.0 2018-09-26 21:08:50.762 info state Echo-Devices.XXXXXXX.Alarm.d990f7ee-d347-3c7c-91fc-416fe363d131.enabled deleted alexa2.0 2018-09-26 21:08:50.751 info state Echo-Devices.XXXXXXX.Alarm.d990f7ee-d347-3c7c-91fc-416fe363d131.time deleted
Eine Abfrage:
$("state[id=Alarm.]").each(function (id, i) { console.log('id'); console.log(id); console.log('obj') console.log(JSON.stringify(getObject(id))) console.log('state') console.log(JSON.stringify(getState(id).val)) });
Liefert dann beispielsweise für *.enabled
javascript.0 2018-09-26 21:16:16.981 info script.js.AlarmCopy: true javascript.0 2018-09-26 21:16:16.981 info script.js.AlarmCopy: state javascript.0 2018-09-26 21:16:16.981 info script.js.AlarmCopy: null javascript.0 2018-09-26 21:16:16.980 warn Object "alexa2.0.Echo-Devices.XXXXXXX.Alarm.d990f7ee-d347-3c7c-91fc-416fe363d131.enabled" does not exist javascript.0 2018-09-26 21:16:16.980 info script.js.AlarmCopy: obj javascript.0 2018-09-26 21:16:16.980 info script.js.AlarmCopy: alexa2.0.Echo-Devices.XXXXXXX.Alarm.d990f7ee-d347-3c7c-91fc-416fe363d131.enabled javascript.0 2018-09-26 21:16:16.979 info script.js.AlarmCopy: id
Ein Neustart des javascript adapters löst das Problem bis erneut ein Wecker gelöscht wurde.
Kurzum: Der selector findet gelöschte Wecker, deren Objekte existieren nicht mehr, aber die States können gelesen werden.
Meine Frage: Ist das ein Verständnisproblem (Objekt/State) bei mir, oder ist hier tatsächlich etwas nicht in Ordnung? Gibt es einen alternativen Weg um alle aktuell existieren Wecker Objekte auszulesen der das umgeht?
Beste Grüße und Vielen Dank
qoka
-
RE: Alexa2 - Object von getriggerte channel ansprechen
Ich bin noch nicht wirklich zum ausführlichen Debuggen gekommen und eins, zwei Lösungen sind echt unschön, aber hier Mal mein aktueller Stand was den Alexa Wecker angeht.
- einmal ein Skript zum Auslesen der aktuell frühesten Weckzeit, welches jede Minute ausgeführt wird
! ````
function CreateAlarm() {// define alarm var alarm=[]; // select all existing alarms // TODO $("channel[state.id=*.time]") or so does not work, no role for alarm defined // N.B.: subscription of alarm keys not robust against deleting alarms, thus use of schedule $('state[id=alexa2.0.Echo-Devices.*.Alarm.*.enabled]').each(function (id, i) { // crop alarm id var cropped_id=id.substr(0, id.lastIndexOf(".")) // check if alarmid has object // TODO: selector returns ids of nonexisting objects(?) change approach or suppress warning if (getObject(cropped_id) !== null){ alarm.push({time: getState(cropped_id + ".time").val, enabled: getState(cropped_id + ".enabled").val}); } });
! // find earliest alarm with state enabled if at least one enabled alarm exists
alarm=alarm.sort((a,b) => a.time >= b.time).find(alarm => alarm.enabled);
if (alarm !== undefined) {
setState("javascript.0.Wecker.alarm.time",alarm.time);
setState("javascript.0.Wecker.alarm.enabled",alarm.enabled);
}
else {
setState("javascript.0.Wecker.alarm.time","none");
setState("javascript.0.Wecker.alarm.enabled",false);
}}
! // schedule script
schedule("*/60 * * * * *", CreateAlarm);
! ````- ein Skript, welches aus dem erstellten Objekt ("javascript.0.Wecker.alarm") ein paar Schedules zu früheren Uhrzeiten erzeugt
! ````
//HueTrigger
function HueTrigger() {// get state var state = getState("javascript.0.Wecker.hue.triggered").val // set state iff false and turn on hue wakup light scene if (state === false) { setState("javascript.0.Wecker.hue.triggered", true) setState("alexa2.0.Smart-Home-Devices.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.active",true); }
}
! //CoffeeTrigger
function CoffeeTrigger() {// get state var state = getState("javascript.0.Wecker.coffee.triggered").val // set state iff false and turn on coffee plug if (state === false) { setState("javascript.0.Wecker.coffee.triggered", true) setState("alexa2.0.Smart-Home-Devices.XXXXXXXXXXXXXXXXXXXXXXXXXXXX.powerState",true); }
}
! // init timers
var timer_hue=null;
var timer_coffee=null;
! // set timers for alarm time string
function AlarmTimer(timestring) {// check if timestring is not none if (timestring.val !== "none") { // get time var alarmtime = timestring.val.split(':'); // set hue timer var huetime = new Date(1,1,1,alarmtime[0],alarmtime[1],alarmtime[2],0); huetime.setMinutes(huetime.getMinutes()-11); clearSchedule(timer_hue); timer_hue = schedule(String(huetime.getMinutes()) + ' ' + String(huetime.getHours()) + ' * * *', HueTrigger); // save hue object setState("javascript.0.Wecker.hue.time",String(huetime.getHours()).replace(/^(\d)$/, "0$1") + ":" + String(huetime.getMinutes()).replace(/^(\d)$/, "0$1") + ":00"); setState("javascript.0.Wecker.hue.enabled",true);
!
// set coffee timer
var coffeetime = new Date(1,1,1,alarmtime[0],alarmtime[1],alarmtime[2],0);
coffeetime.setMinutes(coffeetime.getMinutes()-60);
clearSchedule(timer_coffee);
timer_coffee = schedule(String(coffeetime.getMinutes()) + ' ' + String(coffeetime.getHours()) + ' * * *', CoffeeTrigger);// save coffe object setState("javascript.0.Wecker.coffee.time",String(coffeetime.getHours()).replace(/^(\d)$/, "0$1") + ":" + String(coffeetime.getMinutes()).replace(/^(\d)$/, "0$1") + ":00"); setState("javascript.0.Wecker.coffee.enabled",true);
!
}
else {
! // clear hue timer
clearSchedule(timer_hue);
setState("javascript.0.Wecker.hue.time","none");
setState("javascript.0.Wecker.hue.enabled",false);// clear coffee timer clearSchedule(timer_coffee); setState("javascript.0.Wecker.coffee.time","none"); setState("javascript.0.Wecker.coffee.enabled",false); }
! }
! // run on start of script
AlarmTimer(getState("javascript.0.Wecker.alarm.time"));
! // subscribe to alarm.time
on("javascript.0.Wecker.alarm.time",function(obj){AlarmTimer(getState("javascript.0.Wecker.alarm.time"));});- ein Skript was den Alarm trigger nutzt um beim Beenden des Weckers ein Skript zu starten und trigger zu resetten >! ```` // define regex for alarm trigger var x = new RegExp("\alexa2\.0\.Echo-Devices.*\.Alarm\.*\.triggered"); >! // on trigger true on({id: x, val: true}, function (obj) { // get alarm trigger var state = getState("javascript.0.Wecker.alarm.triggered").val >! // set alarm trigger true if (state === false) { setState("javascript.0.Wecker.alarm.triggered", true); } }); >! // on trigger false on({id: x, val: false}, function (obj) { // get alarm trigger var state = getState("javascript.0.Wecker.alarm.triggered").val // set alarm, hue, and coffee false and run routine for alarm off if (state === true) { setState("javascript.0.Wecker.alarm.triggered", false) setState("javascript.0.Wecker.coffee.triggered", false) setState("javascript.0.Wecker.hue.triggered", false) setState("alexa2.0.Echo-Devices.XXXXXXXXXXXXXXXX.Routines.XXXXXXXXXXXXXXXXXX", true); } });
Falls irgendjemand elegantere Wege oder Lösungen kennt, sind diese Willkommen. Vorallem, dass der Selektor IDs zu gelöschten Objekten findet sorgt im Moment dazu, dass der LOG zugemüllt wird.
BG
-
RE: Alexa2 - Object von getriggerte channel ansprechen
Getriggert wird:
var x = new RegExp("\alexa2\.0\.Echo-Devices.G090LV05455400XX\.Alarm\.*\.enabled");
wenn enabled == true dann soll das object time von gleiche channel gelesen werden um die Uhrzeit des Weckers erfahre. Danach soll dieser Uhrzeit in eine von mir erstellte object "kaffeemschine_weckzeit" mit eine stunde weniger geschrieben werden. `
Hallo,
ich habe das mit einem schedule gelöst:
-
alle X Sekunden wird nach dem frühesten, aktiven Wecker gesucht (mit selector $('channel[state.id=alexa2.0.Echo-Devices..Alarm..enabled]') und Vergleichen der Uhrzeit aller aktiven Wecker)
-
dessen Werte werden in einem Objekt Wecker (enabled: boolean und time: Weckzeit) gespeichert
-
Wecker.enabled triggert eine Funktion die ein paar schedules zu früheren Uhrzeiten setzt (zB: Hue Wakeup -10 Minuten, Espressomaschine -60 Minuten) setzt
Wenn du Interesse daran hast, kann ich dir meine Skripte zukommen lassen oder sie hier posten. Sind nur höchstwahrscheinlich grauenhaft programmiert
Beste Grüße
-
-
RE: Iobroker.alexa2 v0.4+
Mal JavaScript Adapter neu gestartet? `
Hallo,
ja, dann beginnt das ganze Spiel von vorne. Scheint so, als müsste man, nachdem man einen Wecker gelöscht hat (Alexa App –> Wecker löschen) den Adapter neu starten. Liegt dann wohl am Javascript Adapter, oder? :? `
Hallo, ich bin auf das gleiche Problem (Selector findet alte, gelöschte Wecker-Objekte, die nicht im ioBroker Objektbaum angezeigt werden) gestoßen. Hat noch irgendjemand eine Idee, wie man das lösen kann? Ist für das Auslesen der Weckerdaten irgendwie doch essentiell
BG und Danke,
qoka
-
RE: Alexa2 - Object von getriggerte channel ansprechen
Hallo,
bist du damit weitergekommen? Ich möchte etwas sehr ähnliches realisieren (auslesen der frühesten auf aktiv gesetzten Weckzeit).
BG