telldus/telldus-gui/Plugins/SchedulerGUISimple/__init__.js

290 lines
9.5 KiB
JavaScript

/** SchedulerGUISimple **/
__setupPackage__( __extension__ );
__postInit__ = function() {
application.allDoneLoading.connect( com.telldus.schedulersimplegui.init );
}
com.telldus.schedulersimplegui = function() {
var deviceList;
var view;
var restoredJobsTimerKeys;
var sunData;
function init() {
view = new com.telldus.qml.view({
addJobsToSchedule: addJobsToSchedule,
getJob: getJob,
getMethodFromState: getMethodFromState,
getStateFromMethod: getStateFromMethod,
getSunRiseTime: getSunRiseTime,
getSunSetTime: getSunSetTime,
getSunData: getSunData,
getTypeFromTriggerstate: getTypeFromTriggerstate,
getTriggerstateFromType: getTriggerstateFromType,
restoreJobs: restoreJobs,
updateSunData: updateSunData
});
//devices:
var supportedMethods = com.telldus.core.TELLSTICK_TURNON | com.telldus.core.TELLSTICK_TURNOFF | com.telldus.core.TELLSTICK_DIM | com.telldus.core.TELLSTICK_BELL
deviceList = new com.telldus.qml.array();
var list = com.telldus.core.deviceList.getList();
for(var i=0; i < list.length; ++i) {
var item = list[i];
item.methods = com.telldus.core.methods(item.id, supportedMethods);
item.isEnabled = "enabled";
item.hasChanged = "false";
deviceList.push(item);
}
view.setProperty('deviceModel', deviceList);
//Listen for device-change
com.telldus.core.deviceChange.connect(deviceChange);
updateSunData(new Date()); //default
//set images:
view.setProperty("imageTriggerSunrise", "sunrise.png");
view.setProperty("imageTriggerSunset", "sunset.png");
view.setProperty("imageTriggerAbsolute", "absolute.png");
view.setProperty("imageActionOn", "on.png");
view.setProperty("imageActionOff", "off.png");
view.setProperty("imageActionDim", "dim.png");
view.setProperty("imageActionBell", "bell.png");
view.setProperty("imageInfo", "info.png");
//height/width constants
view.setProperty("constBarHeight", 10);
view.setProperty("constDeviceRowHeight", 50);
view.setProperty("constDeviceRowWidth", 600);
view.setProperty("constPointWidth", 30);
view.setProperty("mainHeight", 700); //TODO get this from somewhere
view.setProperty("mainWidth", 800); //TODO get this from somewhere
view.load("main.qml");
application.addWidget("scheduler.simple", "icon.png", view);
}
function deviceChange( deviceId, eventType ) {
if (eventType == com.telldus.core.TELLSTICK_DEVICE_ADDED) {
var item = com.telldus.core.deviceList.getDevice(deviceId);
item.isEnabled = "enabled";
deviceList.push(item);
}
}
function addJobsToSchedule(deviceId, points, deviceTimerKeys, callbackFunc){
//delete all current schedules for this device:
if(deviceTimerKeys != undefined){
for(var i=0;i<deviceTimerKeys.length;i++){
var waitForMore = (i == deviceTimerKeys.length-1) ? "true" : undefined;
com.telldus.scheduler.removeJob(deviceTimerKeys[i]);
}
}
if(restoredJobsTimerKeys != undefined && restoredJobsTimerKeys[deviceId] != undefined){
for(var i=0;i<restoredJobsTimerKeys[deviceId].length;i++){
var waitForMore = (i == restoredJobsTimerKeys[deviceId].length-1) ? "true" : undefined;
com.telldus.scheduler.removeJob(restoredJobsTimerKeys[deviceId][i]);
}
restoredJobsTimerKeys[deviceId] = undefined;
}
//add new schedules:
var jobs = new Array();
for(var i=0;i<points.length;i++){
var jobtemp = getJob(points[i], callbackFunc);
jobs.push(jobtemp);
}
saveJobs(deviceId, jobs);
return com.telldus.scheduler.addJobs(jobs);
}
function saveJobs(deviceId, devicejobs){
var settings = new com.telldus.settings();
var jobs = settings.value("jobs", "");
if(!jobs || jobs == undefined){
jobs = {}; //initialize new setting
}
jobs[deviceId] = devicejobs;
settings.setValue("jobs", jobs);
}
function loadJobs(updateLastRun){
var settings = new com.telldus.settings();
var storedJobs = settings.value("jobs", "");
restoredJobsTimerKeys = restoreJobsToSchedule(storedJobs, updateLastRun); //Start timers here, save keys so they can be removed if jobs are updated
return storedJobs;
}
function restoreJobsToSchedule(storedJobs, updateLastRun){
var deviceTimerKeys = {};
for(var devicekey in storedJobs){
var jobs = new Array();
for(var i=0;i<storedJobs[devicekey].length;i++){
if(storedJobs[devicekey][i] == undefined){
continue;
}
var jobtemp = restoreJob(storedJobs[devicekey][i], updateLastRun);
jobs.push(jobtemp);
}
if(jobs.length > 0){
deviceTimerKeys[devicekey] = com.telldus.scheduler.addJobs(jobs); //have to do this per device, so that the timerkeys are stored for each device
}
}
return deviceTimerKeys;
}
function restoreJob(storedJob, updateLastRunInGUI){
var execFunc = function(job){ print("Custom execute function running"); print("Job: " + job.v.name); var lastRun = new Date().getTime(); updateLastRun(job, lastRun); updateLastRunInGUI(job.v.device, job.v.events[job.v.id + "_0"].d.value, job.v.id, lastRun); return job.executeDefault();};
var job = new com.telldus.scheduler.JobRecurringWeek(storedJob.v);
job.v.executeFunc = execFunc;
return job;
}
function restoreJobs(updateLastRun){
var storedPoints = loadJobs(updateLastRun);
view.setProperty('storedPoints', storedPoints);
}
function getJob(pointArray, updateLastRunInGUI){ //deviceId, pointName, startdate, lastrun, pointMethod, pointDimValue, pointTime, pointType, pointFuzzinessBefore, pointFuzzinessAfter, pointOffset, pointDays
//updateLastRunInGUI: deviceId, day of week, id
var execFunc = function(job){ print("Custom execute function running"); print("Job: " + job.v.name); var lastRun = new Date().getTime(); updateLastRun(job, lastRun); updateLastRunInGUI(job.v.device, job.v.events[job.v.id + "_0"].d.value, job.v.id, lastRun); return job.executeDefault();};
var job = new com.telldus.scheduler.JobRecurringWeek({id: pointArray[13], executeFunc: execFunc, name: pointArray[1], type: com.telldus.scheduler.JOBTYPE_RECURRING_WEEK, startdate: pointArray[2], lastRun: pointArray[3], device: pointArray[0], method: pointArray[4], value: pointArray[5], absoluteTime: pointArray[12]});
var event = {};
var pointFuzzinessBefore = (pointArray[8]*60);
var pointFuzzinessAfter = (pointArray[9]*60);
var pointOffset = (pointArray[10]*60);
event.d = {id: (pointArray[13] + "_0"), value: pointArray[11][0], fuzzinessBefore: pointFuzzinessBefore, fuzzinessAfter: pointFuzzinessAfter, type: pointArray[7], offset: pointOffset, time: pointArray[6]};
job.addEvent(event);
for(var i=1;i<pointArray[11].length;i++){
event = {};
pointDay = pointArray[11][i];
event.d = {id: (pointArray[13] + "_" + i), value: pointDay, fuzzinessBefore: pointFuzzinessBefore, fuzzinessAfter: pointFuzzinessAfter, type: pointArray[7], offset: pointOffset, time: pointArray[6]};
job.addEvent(event);
}
return job;
}
//Update last run for this job from storage, then store it again
function updateLastRun(job, lastRun){
var settings = new com.telldus.settings();
var storedjobs = settings.value("jobs", "");
for(var devicekey in storedjobs){
if(devicekey == job.v.device){
for(var i=0;i<storedjobs[devicekey].length;i++){
if(storedjobs[devicekey][i].v.id == job.v.id){
storedjobs[devicekey][i].v.lastRun = lastRun;
break;
}
}
break;
}
}
settings.setValue("jobs", storedjobs);
}
function getMethodFromState(state){
var pointMethod = "";
if(state == "on"){
pointMethod = com.telldus.core.TELLSTICK_TURNON;
}
else if(state == "off"){
pointMethod = com.telldus.core.TELLSTICK_TURNOFF;
}
else if(state == "dim"){
pointMethod = com.telldus.core.TELLSTICK_DIM;
}
else if(state == "bell"){
pointMethod = com.telldus.core.TELLSTICK_BELL;
}
return pointMethod;
}
function getStateFromMethod(pointMethod){
var state = "";
if(pointMethod == com.telldus.core.TELLSTICK_TURNON){
state = "on";
}
else if(pointMethod == com.telldus.core.TELLSTICK_TURNOFF){
state = "off";
}
else if(pointMethod == com.telldus.core.TELLSTICK_DIM){
state = "dim";
}
else if(pointMethod == com.telldus.core.TELLSTICK_BELL){
state = "bell";
}
return state;
}
function updateSunData(date){
sunData = com.telldus.suncalculator.riseset(date);
return sunData;
}
function getSun(riseset, rowWidth, pointWidth){
var timevalues = sunData;
var hourminute;
if(riseset == "rise"){
hourminute = timevalues[0].split(':');
}
else{
hourminute = timevalues[1].split(':');
}
var hourSize = rowWidth/24;
return hourSize*hourminute[0] + hourSize * (hourminute[1]/60) - pointWidth/2;
}
//Raw sun data
function getSunData(date){
print("GET SUN DATA - can be made more efficient if called often...");
return com.telldus.suncalculator.riseset(date);
}
function getSunRiseTime(rowWidth, pointWidth){
return getSun("rise", rowWidth, pointWidth);
}
function getSunSetTime(rowWidth, pointWidth){
return getSun("set", rowWidth, pointWidth);
}
function getTypeFromTriggerstate(triggerstate){
var type = "";
if(triggerstate == "sunrise"){
type = com.telldus.scheduler.EVENTTYPE_SUNRISE;
}
else if(triggerstate == "sunset"){
type = com.telldus.scheduler.EVENTTYPE_SUNSET;
}
else{
type = com.telldus.scheduler.EVENTTYPE_ABSOLUTE;
}
return type;
}
function getTriggerstateFromType(type){
var triggerstate = "";
if(type == com.telldus.scheduler.EVENTTYPE_SUNRISE){
triggerstate = "sunrise";
}
else if(type == com.telldus.scheduler.EVENTTYPE_SUNSET){
triggerstate = "sunset";
}
else{
triggerstate = "absolute";
}
return triggerstate;
}
return { //Public functions
init:init
}
}();