Hi zusammen,
ich habe versucht ein Script zu schreiben, dass mir ermöglicht die Rolladen in jedem Raum meines Hauses über mein Jarvis Dashboard zu konfigurieren. Ich wollte keine statischen Zeiten, besser gesagt nicht NUR statische Zeiten um meine Rolladen zu schalten.
Zielvorstellung ist, für jeden Raum eine default Zeit zu haben wann die Rolladen hoch und runter fahren sollen, die aber durch die Eingabe in einem extra Feld überschrieben werden kann. (in meinem Codesnippet ist das Überschreiben noch nicht drin, es soll erstmal so zuverlässig funktionieren)

var ObjectID, j, k, ReadValues, Crondays, formerstate, formerformerstate, openh, openm, closeh, closem, time, openschedule, closeschedule;
// Read the description and the value from the object --> Ob die Knöpfe für die Tage gedrückt sind oder nicht
async function Read_Info(ObjectID) {
let desc = getObject(ObjectID).common.desc;
let value = getState(ObjectID).val;
return [desc,value];
}
// Trigger
on({id: [].concat(['shelly.0.FakeDatapoints.BlindScheduler.Office.Blinds_Schedule_Day_Mo']).concat(['shelly.0.FakeDatapoints.BlindScheduler.Office.Blinds_Schedule_Day_Tu']).concat(['shelly.0.FakeDatapoints.BlindScheduler.Office.Blinds_Schedule_Day_We']).concat(['shelly.0.FakeDatapoints.BlindScheduler.Office.Blinds_Schedule_Day_Th']).concat(['shelly.0.FakeDatapoints.BlindScheduler.Office.Blinds_Schedule_Day_Fr']).concat(['shelly.0.FakeDatapoints.BlindScheduler.Office.Blinds_Schedule_Day_Sa']).concat(['shelly.0.FakeDatapoints.BlindScheduler.Office.Blinds_Schedule_Day_Su']).concat(['shelly.0.FakeDatapoints.BlindScheduler.Office.Blinds_Default_Schedule_Close']).concat(['shelly.0.FakeDatapoints.BlindScheduler.Office.Blinds_Default_Schedule_Open']), change: "ne"}, async function (obj) {
// Put the list together for the for loop to build the cron value for the dates
var j_list = ['shelly.0.FakeDatapoints.BlindScheduler.Office.Blinds_Schedule_Day_Su', 'shelly.0.FakeDatapoints.BlindScheduler.Office.Blinds_Schedule_Day_Mo', 'shelly.0.FakeDatapoints.BlindScheduler.Office.Blinds_Schedule_Day_Tu', 'shelly.0.FakeDatapoints.BlindScheduler.Office.Blinds_Schedule_Day_We', 'shelly.0.FakeDatapoints.BlindScheduler.Office.Blinds_Schedule_Day_Th', 'shelly.0.FakeDatapoints.BlindScheduler.Office.Blinds_Schedule_Day_Fr', 'shelly.0.FakeDatapoints.BlindScheduler.Office.Blinds_Schedule_Day_Sa'];
// Put the list together for the for loop to build the cron value for the hours
var ObjOpen = 'shelly.0.FakeDatapoints.BlindScheduler.Office.Blinds_Default_Schedule_Open';
var ObjClose = 'shelly.0.FakeDatapoints.BlindScheduler.Office.Blinds_Default_Schedule_Close';
// Resetting some variables
Crondays = "";
formerstate = "";
formerformerstate = "";
//Loop to build the cron value for the dates based on j_list
for (var j_index in j_list) {
j = j_list[j_index];
ReadValues = await Read_Info(j);
if (j_index == '0' && ReadValues[1]){
Crondays = "0";
formerstate = ReadValues[1];
continue;
}
if (j_index >= "1"){
if(ReadValues[1] && formerstate && !(formerformerstate)){
Crondays += ("," + j_index)
}
if(ReadValues[1] && formerformerstate && formerstate){
Crondays = Crondays.replace(/..$/, "-" + j_index);
}
if(ReadValues[1] && !(formerstate)){
if(Crondays == ""){
Crondays += j_index
}else{
Crondays += ("," + j_index)
}
}
}
if(Crondays == "0-6"){Crondays = "*"}
formerformerstate = formerstate;
formerstate = ReadValues[1];
}
ReadValues = await Read_Info(ObjOpen);
time = ReadValues[1].split(":");
if(time[0].charAt(0) == 0){
openh = time[0].charAt(1)
}else{
openh = time[0]
}
if(time[1].charAt(0) == 0){
openm = time[1].charAt(1)
}else{
openm = time[1]
}
ReadValues = await Read_Info(ObjClose);
time = ReadValues[1].split(":");
if(time[0].charAt(0) == 0){
closeh = time[0].charAt(1)
}else{
closeh = time[0]
}
if(time[1].charAt(0) == 0){
closem = time[1].charAt(1)
}else{
closem = time[1]
}
(function () {if (openschedule) {clearSchedule(openschedule); openschedule = null;}})();
openschedule = schedule(openm + " " + openh + " * * " + Crondays, async function () {
setState("shelly.0.SHSW-25#3494547C0118#1.Shutter.Position"/*Position*/, 100);
setState("shelly.0.SHSW-25#3494547BF020#1.Shutter.Position"/*Position*/, 100);
});
(function () {if (closeschedule) {clearSchedule(closeschedule); closeschedule = null;}})();
closeschedule = schedule(closem + " " + closeh + " * * " + Crondays, async function () {
setState("shelly.0.SHSW-25#3494547C0118#1.Shutter.Position"/*Position*/, 0);
setState("shelly.0.SHSW-25#3494547BF020#1.Shutter.Position"/*Position*/, 0);
});
});
Nun habe ich das Problem, dass die Schedules funktionieren wenn ich die Zeiten z.B. auf in 5 Minuten stelle. Das auch zuverlässig. Wenn aber der nächste Schedule am folgenden Morgen laufen müsste, tut er es meistens nicht. Manchmal, aber nicht immer. Ich habe dieses Script für 2 Räume laufen, bei einem hat es dann mal funktioniert, beim anderen nicht. Ich frage mich woran das liegen könnte. Habt ihr eine Idee?
Darüber hinaus wäre ich an Verbesserungsvorschlägen interessiert wie man das Ganze noch besser lösen könnte, oder, falls der Weg schon gar nicht so schlecht sein sollte, wie ich das Script optimiert bekomme.
Vielen Dank für Eure Hilfe! Peter