var app = angular.module('habridge', [ 'ngRoute' ]); app.config(function ($routeProvider) { $routeProvider.when('/#', { templateUrl: 'views/nonconfiguration.html', controller: 'ViewingController' }).when('/show', { templateUrl: 'views/configuration.html', controller: 'ViewingController' }).when('/editor', { templateUrl: 'views/editor.html', controller: 'AddingController' }).when('/editdevice', { templateUrl: 'views/editdevice.html', controller: 'AddingController' }).when('/veradevices', { templateUrl: 'views/veradevice.html', controller: 'AddingController' }).when('/verascenes', { templateUrl: 'views/verascene.html', controller: 'AddingController' }).when('/harmonydevices', { templateUrl: 'views/harmonydevice.html', controller: 'AddingController' }).when('/harmonyactivities', { templateUrl: 'views/harmonyactivity.html', controller: 'AddingController' }).otherwise({ templateUrl: 'views/nonconfiguration.html', controller: 'ViewingController' }) }); app.run( function (bridgeService) { bridgeService.loadBridgeSettings(); bridgeService.updateShowVera(); bridgeService.updateShowHarmony(); bridgeService.getHABridgeVersion(); }); app.factory('BridgeSettings', function() { var BridgeSettings = {}; BridgeSettings.upnpconfigaddress = ""; BridgeSettings.serverport = ""; BridgeSettings.upnpdevicedb = ""; BridgeSettings.upnpresponseport = ""; BridgeSettings.veraaddress = ""; BridgeSettings.harmonyaddress = ""; BridgeSettings.upnpstrict = ""; BridgeSettings.traceupnp = ""; BridgeSettings.devmode = ""; BridgeSettings.setupnpconfigaddress = function(aconfigaddress){ BridgeSettings.upnpconfigaddress = aconfigaddress; }; BridgeSettings.setserverport = function(aserverport){ BridgeSettings.serverport = aserverport; }; BridgeSettings.setupnpdevicedb = function(aupnpdevicedb){ BridgeSettings.upnpdevicedb = aupnpdevicedb; }; BridgeSettings.setupnpresponseport = function(aupnpresponseport){ BridgeSettings.upnpresponseport = aupnpresponseport; }; BridgeSettings.setveraaddress = function(averaaddress){ BridgeSettings.veraaddress = averaaddress; }; BridgeSettings.setharmonyaddress = function(aharmonyaddress){ BridgeSettings.harmonyaddress = aharmonyaddress; }; BridgeSettings.setupnpstrict = function(aupnpstrict){ BridgeSettings.upnpstrict = aupnpstrict; }; BridgeSettings.settraceupnp = function(atraceupnp){ BridgeSettings.traceupnp = atraceupnp; }; BridgeSettings.setdevmode = function(adevmode){ BridgeSettings.devmode = adevmode; }; return BridgeSettings; }); app.service('bridgeService', function ($http, $window, BridgeSettings) { var self = this; self.BridgeSettings = BridgeSettings; this.state = {base: window.location.origin + "/api/devices", upnpbase: window.location.origin + "/upnp/settings", huebase: window.location.origin + "/api", devices: [], device: [], error: "", showVera: false, showHarmony: false, habridgeversion: ""}; this.viewDevices = function () { this.state.error = ""; return $http.get(this.state.base).then( function (response) { self.state.devices = response.data; }, function (error) { if (error.data) { self.state.error = error.data.message; } else { self.state.error = "Some error occurred."; } console.log(error); } ); }; this.getHABridgeVersion = function () { this.state.error = ""; return $http.get(this.state.base + "/habridge/version").then( function (response) { self.state.habridgeversion = response.data.version; }, function (error) { if (error.data) { self.state.error = error.data.message; } else { self.state.error = "cannot get version"; } console.log(error); } ); }; this.loadBridgeSettings = function () { this.state.error = ""; return $http.get(this.state.upnpbase).then( function (response) { self.BridgeSettings.setupnpconfigaddress(response.data.upnpconfigaddress); self.BridgeSettings.setserverport(response.data.serverport); self.BridgeSettings.setupnpdevicedb(response.data.upnpdevicedb); self.BridgeSettings.setupnpresponseport(response.data.upnpresponseport); self.BridgeSettings.setveraaddress(response.data.veraaddress); self.BridgeSettings.setharmonyaddress(response.data.harmonyaddress); self.BridgeSettings.settraceupnp(response.data.traceupnp); self.BridgeSettings.setupnpstrict(response.data.upnpstrict); self.BridgeSettings.setdevmode(response.data.devmode); if(self.BridgeSettings.veraaddress == "1.1.1.1" || self.BridgeSettings.veraaddress == "") self.state.showVera = false; else self.state.showVera = true; if(self.BridgeSettings.harmonyaddress == "1.1.1.1" || self.BridgeSettings.harmonyaddress == "") self.state.showHarmony = false; else self.state.showHarmony = true; }, function (error) { if (error.data) { $window.alert("Load Bridge Settings Error: " + error.data.message); } else { $window.alert("Load Bridge Settings Error: unknown"); } console.log(error); } ); }; this.updateShowVera = function () { if(self.BridgeSettings.veraaddress == "1.1.1.1" || self.BridgeSettings.veraaddress == "") this.state.showVera = false; else this.state.showVera = true; return; } this.updateShowHarmony = function () { if(self.BridgeSettings.harmonyaddress == "1.1.1.1" || self.BridgeSettings.harmonyaddress == "") this.state.showHarmony = false; else this.state.showHarmony = true; return; } this.viewVeraDevices = function () { this.state.error = ""; if(!this.state.showVera) return; this.state.error = ""; return $http.get(this.state.base + "/vera/devices").then( function (response) { self.state.veradevices = response.data; }, function (error) { if (error.data) { $window.alert("Get Vera Devices Error: " + error.data.message); } else { $window.alert("Get Vera Devices Error: unknown"); } } ); }; this.viewVeraScenes = function () { this.state.error = ""; if(!this.state.showVera) return; return $http.get(this.state.base + "/vera/scenes").then( function (response) { self.state.verascenes = response.data; }, function (error) { if (error.data) { $window.alert("Get Vera Scenes Error: " + error.data.message); } else { $window.alert("Get Vera Scenes Error: unknown"); } } ); }; this.viewHarmonyActivities = function () { this.state.error = ""; if(!this.state.showHarmony) return; return $http.get(this.state.base + "/harmony/activities").then( function (response) { self.state.harmonyactivities = response.data; }, function (error) { if (error.data) { $window.alert("Get Harmony Activities Error: " + error.data.message); } else { $window.alert("Get Harmony Activities Error: unknown"); } } ); }; this.viewHarmonyDevices = function () { this.state.error = ""; if(!this.state.showHarmony) return; return $http.get(this.state.base + "/harmony/devices").then( function (response) { self.state.harmonydevices = response.data; }, function (error) { if (error.data) { $window.alert("Get Harmony Devices Error: " + error.data.message); } else { $window.alert("Get Harmony Devices Error: unknown"); } } ); }; this.addDevice = function (id, name, type, onUrl, offUrl, httpVerb, contentType, contentBody, contentBodyOff) { this.state.error = ""; if(httpVerb != null && httpVerb != "") type = "custom"; if (id) { var putUrl = this.state.base + "/" + id; return $http.put(putUrl, { id: id, name: name, deviceType: type, onUrl: onUrl, offUrl: offUrl, httpVerb: httpVerb, contentType: contentType, contentBody: contentBody, contentBodyOff: contentBodyOff }).then( function (response) { self.viewDevices(); }, function (error) { if (error.data) { $window.alert("Edit Device Error: " + error.data.message); } $window.alert("Edit Device Error: unknown"); } ); } else { if(type == null || type == "") type = "switch"; if(httpVerb != null && httpVerb != "") type = "custom"; return $http.post(this.state.base, { name: name, deviceType: type, onUrl: onUrl, offUrl: offUrl, httpVerb: httpVerb, contentType: contentType, contentBody: contentBody, contentBodyOff: contentBodyOff }).then( function (response) { self.viewDevices(); }, function (error) { if (error.data) { $window.alert("Add new Device Error: " + error.data.message); } $window.alert("Add new Device Error: unknown"); } ); } }; this.deleteDevice = function (id) { this.state.error = ""; return $http.delete(this.state.base + "/" + id).then( function (response) { self.viewDevices(); }, function (error) { if (error.data) { self.state.error = error.data.message; } $window.alert("Delete Device Error: unknown"); } ); }; this.editDevice = function (id, name, onUrl, offUrl, httpVerb, contentType, contentBody, contentBodyOff) { self.state.device = {id: id, name: name, onUrl: onUrl, offUrl: offUrl, httpVerb: httpVerb, contentType: contentType, contentBody: contentBody, contentBodyOff: contentBodyOff}; }; }); app.controller('ViewingController', function ($scope, $location, $http, $window, bridgeService, BridgeSettings) { $scope.BridgeSettings = bridgeService.BridgeSettings; bridgeService.viewDevices(); $scope.bridge = bridgeService.state; bridgeService.updateShowVera(); bridgeService.updateShowHarmony(); $scope.predicate = ''; $scope.reverse = true; $scope.order = function(predicate) { $scope.reverse = ($scope.predicate === predicate) ? !$scope.reverse : false; $scope.predicate = predicate; }; $scope.deleteDevice = function (device) { bridgeService.deleteDevice(device.id); }; $scope.testUrl = function (device, type) { if(type == "on") { if(device.deviceType == "activity" || device.deviceType == "button") { $http.put($scope.bridge.huebase + "/test/lights/" + device.id + "/state", "{\"on\":true}").then( function (response) { $window.alert("Request Exceuted: " + response.statusText); }, function (error) { $window.alert("Request Error: " + error.statusText + ", with status: " + error.status + ", Pleae look in your console log."); } ); return; } if(device.httpVerb == "PUT") $http.put(device.onUrl, device.contentBody).then( function (response) { $window.alert("Request Exceuted: " + response.statusText); }, function (error) { $window.alert("Request Error: " + error.statusText + ", with status: " + error.status + ", Pleae look in your console log."); } ); else if(device.httpVerb == "POST") $http.post(device.onUrl, device.contentBody).then( function (response) { $window.alert("Request Exceuted: " + response.statusText); }, function (error) { $window.alert("Request Error: " + error.statusText + ", with status: " + error.status + ", Pleae look in your console log."); } ); else window.open(device.onUrl, "_blank"); } else { if(device.deviceType == "activity" || device.deviceType == "button") { $http.put($scope.bridge.huebase + "/test/lights/" + device.id + "/state", "{\"on\":false}").then( function (response) { $window.alert("Request Exceuted: " + response.statusText); }, function (error) { $window.alert("Request Error: " + error.statusText + ", with status: " + error.status + ", Pleae look in your console log."); } ); return; } if(device.httpVerb == "PUT") $http.put(device.offUrl, device.contentBodyOff).then( function (response) { $window.alert("Request Exceuted: " + response.statusText); }, function (error) { $window.alert("Request Error: " + error.statusText + ", with status: " + error.status + ", Pleae look in your console log."); } ); else if(device.httpVerb == "POST") $http.post(device.offUrl, device.contentBodyOff).then( function (response) { $window.alert("Request Exceuted: " + response.statusText); }, function (error) { $window.alert("Request Error: " + error.statusText + ", with status: " + error.status + ", Pleae look in your console log."); } ); else window.open(device.offUrl, "_blank"); } }; $scope.setBridgeUrl = function (url) { bridgeService.state.base = url; bridgeService.viewDevices(); }; $scope.editDevice = function (device) { bridgeService.editDevice(device.id, device.name, device.onUrl, device.offUrl, device.httpVerb, device.contentType, device.contentBody, device.contentBodyOff); $location.path('/editdevice'); }; }); app.controller('AddingController', function ($scope, $location, $http, bridgeService, BridgeSettings) { $scope.device = {id: "", name: "", deviceType: "switch", onUrl: "", offUrl: ""}; $scope.vera = {base: "", port: "3480", id: ""}; $scope.vera.base = "http://" + BridgeSettings.veraaddress; bridgeService.device = $scope.device; bridgeService.viewVeraDevices(); bridgeService.viewVeraScenes(); bridgeService.viewHarmonyActivities(); bridgeService.viewHarmonyDevices(); $scope.bridge = bridgeService.state; bridgeService.updateShowVera(); bridgeService.updateShowHarmony(); $scope.device = bridgeService.state.device; $scope.predicate = ''; $scope.reverse = true; $scope.device_dim_control = ""; $scope.order = function(predicate) { $scope.reverse = ($scope.predicate === predicate) ? !$scope.reverse : false; $scope.predicate = predicate; }; $scope.buildUrlsUsingDevice = function (dim_control) { if ($scope.vera.base.indexOf("http") < 0) { $scope.vera.base = "http://" + $scope.vera.base; } if(dim_control.indexOf("byte") >= 0 || dim_control.indexOf("percent") >= 0 || dim_control.indexOf("math") >= 0) $scope.device.onUrl = $scope.vera.base + ":" + $scope.vera.port + "/data_request?id=action&output_format=json&DeviceNum=" + $scope.vera.id + "&serviceId=urn:upnp-org:serviceId:Dimming1&action=SetLoadLevelTarget&newLoadlevelTarget=" + dim_control; else $scope.device.onUrl = $scope.vera.base + ":" + $scope.vera.port + "/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=1&DeviceNum=" + $scope.vera.id; $scope.device.offUrl = $scope.vera.base + ":" + $scope.vera.port + "/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=0&DeviceNum=" + $scope.vera.id; }; $scope.buildUrlsUsingScene = function () { if ($scope.vera.base.indexOf("http") < 0) { $scope.vera.base = "http://" + $scope.vera.base; } $scope.device.deviceType = "scene"; $scope.device.onUrl = $scope.vera.base + ":" + $scope.vera.port + "/data_request?id=action&output_format=json&serviceId=urn:micasaverde-com:serviceId:HomeAutomationGateway1&action=RunScene&SceneNum=" + $scope.vera.id; $scope.device.offUrl = $scope.vera.base + ":" + $scope.vera.port + "/data_request?id=action&output_format=json&serviceId=urn:micasaverde-com:serviceId:HomeAutomationGateway1&action=RunScene&SceneNum=" + $scope.vera.id; }; $scope.buildDeviceUrls = function (veradevice, dim_control) { if ($scope.vera.base.indexOf("http") < 0) { $scope.vera.base = "http://" + $scope.vera.base; } $scope.device.deviceType = "switch"; $scope.device.name = veradevice.name; if(dim_control.indexOf("byte") >= 0 || dim_control.indexOf("percent") >= 0 || dim_control.indexOf("math") >= 0) $scope.device.onUrl = $scope.vera.base + ":" + $scope.vera.port + "/data_request?id=action&output_format=json&DeviceNum=" + veradevice.id + "&serviceId=urn:upnp-org:serviceId:Dimming1&action=SetLoadLevelTarget&newLoadlevelTarget=" + dim_control; else $scope.device.onUrl = $scope.vera.base + ":" + $scope.vera.port + "/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=1&DeviceNum=" + veradevice.id; $scope.device.offUrl = $scope.vera.base + ":" + $scope.vera.port + "/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=0&DeviceNum=" + veradevice.id; }; $scope.buildSceneUrls = function (verascene) { if ($scope.vera.base.indexOf("http") < 0) { $scope.vera.base = "http://" + $scope.vera.base; } $scope.device.deviceType = "scene"; $scope.device.name = verascene.name; $scope.device.onUrl = $scope.vera.base + ":" + $scope.vera.port + "/data_request?id=action&output_format=json&serviceId=urn:micasaverde-com:serviceId:HomeAutomationGateway1&action=RunScene&SceneNum=" + verascene.id; $scope.device.offUrl = $scope.vera.base + ":" + $scope.vera.port + "/data_request?id=action&output_format=json&serviceId=urn:micasaverde-com:serviceId:HomeAutomationGateway1&action=RunScene&SceneNum=" + verascene.id; }; $scope.buildActivityUrls = function (harmonyactivity) { $scope.device.deviceType = "activity"; $scope.device.name = harmonyactivity.label; $scope.device.onUrl = "{\"name\":\"" + harmonyactivity.id + "\"}"; $scope.device.offUrl = "{\"name\":\"-1\"}"; }; $scope.buildButtonUrls = function (harmonydevice, onbutton, offbutton) { $scope.device.deviceType = "button"; $scope.device.name = harmonydevice.label; $scope.device.onUrl = "{\"device\":\"" + harmonydevice.id + "\",\"button\":\"" + onbutton + "\"}"; $scope.device.offUrl = "{\"device\":\"" + harmonydevice.id + "\",\"button\":\"" + offbutton + "\"}"; }; $scope.testUrl = function (device, type) { if(type == "on") { if(device.deviceType == "activity" || device.deviceType == "button") { $http.put($scope.bridge.huebase + "/test/lights/" + device.id + "/state", "{\"on\":true}").then( function (response) { $window.alert("Request Exceuted: " + response.statusText); }, function (error) { $window.alert("Request Error: " + error.statusText + ", with status: " + error.status + ", Pleae look in your console log."); } ); return; } if(device.httpVerb == "PUT") $http.put(device.onUrl, device.contentBody).then( function (response) { $window.alert("Request Exceuted: " + response.statusText); }, function (error) { $window.alert("Request Error: " + error.statusText + ", with status: " + error.status + ", Pleae look in your console log."); } ); else if(device.httpVerb == "POST") $http.post(device.onUrl, device.contentBody).then( function (response) { $window.alert("Request Exceuted: " + response.statusText); }, function (error) { $window.alert("Request Error: " + error.statusText + ", with status: " + error.status + ", Pleae look in your console log."); } ); else window.open(device.onUrl, "_blank"); } else { if(device.deviceType == "activity" || device.deviceType == "button") { $http.put($scope.bridge.huebase + "/test/lights/" + device.id + "/state", "{\"on\":false}").then( function (response) { $window.alert("Request Exceuted: " + response.statusText); }, function (error) { $window.alert("Request Error: " + error.statusText + ", with status: " + error.status + ", Pleae look in your console log."); } ); return; } if(device.httpVerb == "PUT") $http.put(device.offUrl, device.contentBodyOff).then( function (response) { $window.alert("Request Exceuted: " + response.statusText); }, function (error) { $window.alert("Request Error: " + error.statusText + ", with status: " + error.status + ", Pleae look in your console log."); } ); else if(device.httpVerb == "POST") $http.post(device.offUrl, device.contentBodyOff).then( function (response) { $window.alert("Request Exceuted: " + response.statusText); }, function (error) { $window.alert("Request Error: " + error.statusText + ", with status: " + error.status + ", Pleae look in your console log."); } ); else window.open(device.offUrl, "_blank"); } }; $scope.addDevice = function () { bridgeService.addDevice($scope.device.id, $scope.device.name, $scope.device.deviceType, $scope.device.onUrl, $scope.device.offUrl, $scope.device.httpVerb, $scope.device.contentType, $scope.device.contentBody, $scope.device.contentBodyOff).then( function () { $scope.device.id = ""; $scope.device.name = ""; $scope.device.onUrl = ""; $scope.device.deviceType = "switch"; $scope.device.offUrl = ""; $scope.device.httpVerb = null; $scope.device.contentType = null; $scope.device.contentBody = null; $scope.device.contentBodyOff = null; $location.path('/#'); }, function (error) { } ); } }); app.controller('ErrorsController', function ($scope, bridgeService) { $scope.bridge = bridgeService.state; }); app.controller('VersionController', function ($scope, bridgeService) { $scope.bridge = bridgeService.state; });