var Clay = require('pebble-clay'); var clayConfig = require('./config'); var clay = new Clay(clayConfig); var messageKeys = require('message_keys'); var sid; var status; var retry; retry = 1; function xhr_to_syno(method, url_path, onload_function, max_retry) { console.log('------xhr start') status = ""; if (JSON.parse(localStorage.getItem('clay-settings')).server) { var server = JSON.parse(localStorage.getItem('clay-settings')).server url = server + url_path; var xhr = new XMLHttpRequest(); xhr.timeout = 4000; // time in milliseconds xhr.open(method, url, true); console.log('------xhr opened on ' + url + ' # retry=' + retry) xhr.onload = function() { console.log('------xhr onload') if (xhr.readyState === 4) { retry = 1; console.log('------xhr request returned'); if (xhr.status == 200) { onload_function(xhr); return true; } else { console.log('------xhr request returned error code ' + xhr.status); return false; } } }; xhr.ontimeout = function(e) { retry++; if (retry < max_retry) { console.log('------xhr timed out retrying another time '); xhr_to_syno(method, url_path, onload_function, max_retry); } else { console.log('------xhr timed out ' + retry + ' time'); //send back "timeout" to watch message = "Call to server timed out, verify settings and connectivity"; // Build message var dict = { 'status': message, }; // Send the message Pebble.sendAppMessage(dict, function(e) { console.log('sent'); }, function() { console.log('failed'); }); return false; } }; xhr.send(null); } else { Pebble.showSimpleNotificationOnPebble("DSCam H-S", "You need to set your Synology account and server."); } } function authenticate() { var response; sid = ""; console.log('---- authenticate'); if (JSON.parse(localStorage.getItem('clay-settings')).username && JSON.parse(localStorage.getItem('clay-settings')).password) { var username = JSON.parse(localStorage.getItem('clay-settings')).username; var password = JSON.parse(localStorage.getItem('clay-settings')).password; console.log('-- username:' + username); console.log('-- password:' + password); var url_path = "/webapi/auth.cgi?api=SYNO.API.Auth&method=Login&version=2&account=" + username + "&passwd=" + password + "&session=SurveillanceStation&format=sid"; var method = "GET"; onload_function = function(xhr) { response = JSON.parse(xhr.responseText); if (response.success == true) { sid = response.data.sid; console.log('------Authentication succeeded'); if (sid != "") { message = "Welcome to Syno Cam Switch ! ready & authenticated"; // Build message var dict = { 'auth': message, }; // Send the message Pebble.sendAppMessage(dict, function(e) { console.log('sent'); }, function() { console.log('failed'); }); } else { console.log('------Unexpected error : authentication is OK but no SID retrieved'); } } else { console.log('------Authentication failed : ' + response.toString()); } }; max_retry = 10; xhr_to_syno(method, url_path, onload_function, max_retry); } else { console.log("--- failed to get settings"); Pebble.showSimpleNotificationOnPebble("DSCam H-S", "You need to set your Synology account and server."); } } function get_status() { var response; if (sid != "") { status = ""; console.log('---- get_status'); var url_path = "/webapi/entry.cgi?api=SYNO.SurveillanceStation.HomeMode&version=1&method=GetInfo&_sid=" + sid; var method = "GET"; onload_function = function(xhr) { response = JSON.parse(xhr.responseText); if (response.success == true) { status = response.data.on; var message; switch (status) { case true: message = "Your Home mode is ON"; break; case false: message = "Your Home mode is OFF"; break; default: message = "home mode is unknown !"; } // Build message var dict = { 'status': message, }; // Send the message Pebble.sendAppMessage(dict, function(e) { console.log('sent'); }, function() { console.log('failed'); }); } } max_retry = 10; xhr_to_syno(method, url_path, onload_function, max_retry); } else { authenticate(); get_status(); } } function switch_home(bool) { var response; console.log('---- authenticate'); if (sid != "") { status = ""; console.log('---- get_status'); url_path = "/webapi/entry.cgi?api=SYNO.SurveillanceStation.HomeMode&version=1&method=GetInfo&_sid=" + sid; var method = "GET"; onload_status_function = function(xhr) { response = JSON.parse(xhr.responseText); if (response.success == true) { status = response.data.on; console.log('------ status:' + status); var message; var dict; if (status != bool) { console.log('---- switching home mode to ' + bool); url_path = "/webapi/entry.cgi?api=SYNO.SurveillanceStation.HomeMode&version=1&method=Switch&on=" + bool + "&_sid=" + sid; method = "GET" onload_switch_function = function(xhr) { response = JSON.parse(xhr.responseText); if (response.success == true) { status = bool; switch (status) { case true: message = "You just set Home mode ON"; break; case false: message = "You just set Home mode OFF"; break; default: message = "something happened, try again !"; } // Build message dict = { 'status': message, }; // Send the message Pebble.sendAppMessage(dict, function(e) { console.log('sent'); }, function() { console.log('failed'); }); } } max_retry = 10; xhr_to_syno(method, url_path, onload_switch_function, max_retry); } else { console.log('---- nothing to do, status already ' + status); switch (status) { case true: message = "Your Home Mode is already ON"; break; case false: message = "Your Home Mode is already OFF"; break; default: message = "something happened, try again !"; } // Build message dict = { 'status': message, }; // Send the message Pebble.sendAppMessage(dict, function(e) { console.log('sent'); }, function() { console.log('failed'); }); } } } max_retry = 10; xhr_to_syno(method, url_path, onload_status_function, max_retry); } else { authenticate(); switch_home(bool); } } // Get JS readiness events Pebble.addEventListener('ready', function(e) { console.log("---- local storage:"); console.log("user " + JSON.parse(localStorage.getItem('clay-settings')).username); console.log('PebbleKit JS is ready'); // Update Watch on this Pebble.sendAppMessage({ 'JSReady': 1 }); }); // Get AppMessage events Pebble.addEventListener('appmessage', function(e) { // Get the dictionary from the message var dict = e.payload; console.log(dict[0].toString()); switch (dict[0]) { case 'auth': authenticate(); break; case 'get': get_status(); break; case 'home_on': switch_home(true); break; case 'home_off': switch_home(false); break; default: console.log('Sorry. I don\'t understand your request :' + dict[0]); } });