From 153faa780fb93e028a59a670cc7ff57fa670cc1a Mon Sep 17 00:00:00 2001 From: jghaanstra Date: Sat, 27 Jun 2020 13:01:27 +0200 Subject: [PATCH] Release 1.24.0 --- .homeychangelog.json | 3 + app.js | 25 + app.json | 451 +++++++++++++++++- assets/gas_concentration.svg | 62 +++ drivers/shelly-plug-s/device.js | 6 + drivers/shelly-plug-s/driver.js | 15 +- drivers/shelly-plug-s/pair/icon_select.html | 89 ++++ drivers/shelly-plug/device.js | 6 + drivers/shelly-plug/driver.js | 15 +- drivers/shelly-plug/pair/icon_select.html | 89 ++++ drivers/shelly1/device.js | 12 +- drivers/shelly1/driver.js | 3 +- drivers/shelly1/pair/icon_select.html | 90 +--- drivers/shelly1pm/device.js | 6 + drivers/shelly1pm/driver.js | 15 +- drivers/shelly1pm/pair/icon_select.html | 89 ++++ drivers/shelly2/device.js | 6 + drivers/shelly2/driver.js | 18 +- drivers/shelly2/pair/add_device.html | 3 +- drivers/shelly2/pair/icon_select.html | 89 ++++ drivers/shellybutton1/assets/icon.svg | 9 + drivers/shellybutton1/assets/images/large.jpg | Bin 0 -> 44318 bytes drivers/shellybutton1/assets/images/small.jpg | Bin 0 -> 14870 bytes drivers/shellybutton1/device.js | 100 ++++ drivers/shellybutton1/driver.js | 122 +++++ drivers/shellybutton1/pair/add_device.html | 18 + drivers/shellybutton1/pair/get_device.html | 9 + drivers/shellybutton1/pair/icon_select.html | 1 + .../shellybutton1/pair/manual_pairing.html | 121 +++++ .../shellybutton1/pair/select_pairing.html | 42 ++ drivers/shellybutton1/pair/start.html | 10 + drivers/shellygas/assets/icon.svg | 9 + drivers/shellygas/assets/images/large.jpg | Bin 0 -> 92850 bytes drivers/shellygas/assets/images/small.jpg | Bin 0 -> 14991 bytes drivers/shellygas/device.js | 121 +++++ drivers/shellygas/driver.js | 124 +++++ drivers/shellygas/pair/add_device.html | 18 + drivers/shellygas/pair/get_device.html | 9 + drivers/shellygas/pair/icon_select.html | 89 ++++ drivers/shellygas/pair/manual_pairing.html | 121 +++++ drivers/shellygas/pair/select_pairing.html | 42 ++ lib/util.js | 15 + locales/en.json | 1 + locales/nl.json | 1 + package-lock.json | 2 +- package.json | 2 +- pair_templates/icon_select.html | 89 ++++ 47 files changed, 2055 insertions(+), 112 deletions(-) create mode 100644 assets/gas_concentration.svg create mode 100644 drivers/shelly-plug-s/pair/icon_select.html create mode 100644 drivers/shelly-plug/pair/icon_select.html mode change 100644 => 120000 drivers/shelly1/pair/icon_select.html create mode 100644 drivers/shelly1pm/pair/icon_select.html create mode 100644 drivers/shelly2/pair/icon_select.html create mode 100644 drivers/shellybutton1/assets/icon.svg create mode 100644 drivers/shellybutton1/assets/images/large.jpg create mode 100644 drivers/shellybutton1/assets/images/small.jpg create mode 100644 drivers/shellybutton1/device.js create mode 100644 drivers/shellybutton1/driver.js create mode 100644 drivers/shellybutton1/pair/add_device.html create mode 100644 drivers/shellybutton1/pair/get_device.html create mode 120000 drivers/shellybutton1/pair/icon_select.html create mode 100644 drivers/shellybutton1/pair/manual_pairing.html create mode 100644 drivers/shellybutton1/pair/select_pairing.html create mode 100644 drivers/shellybutton1/pair/start.html create mode 100644 drivers/shellygas/assets/icon.svg create mode 100644 drivers/shellygas/assets/images/large.jpg create mode 100644 drivers/shellygas/assets/images/small.jpg create mode 100644 drivers/shellygas/device.js create mode 100644 drivers/shellygas/driver.js create mode 100644 drivers/shellygas/pair/add_device.html create mode 100644 drivers/shellygas/pair/get_device.html create mode 100644 drivers/shellygas/pair/icon_select.html create mode 100644 drivers/shellygas/pair/manual_pairing.html create mode 100644 drivers/shellygas/pair/select_pairing.html create mode 100644 pair_templates/icon_select.html diff --git a/.homeychangelog.json b/.homeychangelog.json index b46ca274..66209137 100644 --- a/.homeychangelog.json +++ b/.homeychangelog.json @@ -103,5 +103,8 @@ }, "1.23.0": { "en": "Added device ID to callback trigger card and removed the old button events card which was deprecated since the last couple of app versions." + }, + "1.24.0": { + "en": "Added support for Shelly Gas and Shelly Button 1. Also added the option to add a custom device icon (.svg) during pairing for the Shelly Gas, Shelly Button 1, Shelly Plug, Shelly Plug-S, Shelly1 and Shelly 2. More devices will follow. If you want to use a custom icon for an existing devices re-pairing is required. It cant be changed after pairing." } } diff --git a/app.js b/app.js index 50e4c2f9..01f83ec4 100644 --- a/app.js +++ b/app.js @@ -159,6 +159,31 @@ class ShellyApp extends Homey.App { } }) + // SHELLY GAS + new Homey.FlowCardAction('actionGasSetVolume') + .register() + .registerRunListener((args, state) => { + return util.sendCommand('/settings/?set_volume='+ args.volume +'', args.device.getSetting('address'), args.device.getSetting('username'), args.device.getSetting('password')); + }) + + new Homey.FlowCardAction('actionGasMute') + .register() + .registerRunListener((args, state) => { + return util.sendCommand('/mute', args.device.getSetting('address'), args.device.getSetting('username'), args.device.getSetting('password')); + }) + + new Homey.FlowCardAction('actionGasUnmute') + .register() + .registerRunListener((args, state) => { + return util.sendCommand('/unmute', args.device.getSetting('address'), args.device.getSetting('username'), args.device.getSetting('password')); + }) + + new Homey.FlowCardAction('actionGasTest') + .register() + .registerRunListener((args, state) => { + return util.sendCommand('/self_test', args.device.getSetting('address'), args.device.getSetting('username'), args.device.getSetting('password')); + }) + } } diff --git a/app.json b/app.json index d8f73493..0790031e 100644 --- a/app.json +++ b/app.json @@ -46,7 +46,7 @@ "Shelly i3" ] }, - "version": "1.23.0", + "version": "1.24.0", "compatibility": ">=3.0.0", "author": { "name": "Jelger Haanstra", @@ -165,6 +165,22 @@ "en": "Pf", "nl": "Pf" } + }, + "gas_concentration": { + "type": "number", + "title": { + "en": "Gas Concentration", + "nl": "Gas concentratie" + }, + "getable": true, + "setable": false, + "uiComponent": "sensor", + "insights": true, + "icon": "/assets/gas_concentration.svg", + "units": { + "en": "ppm", + "nl": "ppm" + } } }, "discovery": { @@ -339,6 +355,25 @@ ] ] }, + "shellybutton1": { + "type": "mdns-sd", + "mdns-sd": { + "name": "http", + "protocol": "tcp" + }, + "id": "{{txt.id}}", + "conditions": [ + [ + { + "field": "txt.id", + "match": { + "type": "regex", + "value": "^shellybutton1-" + } + } + ] + ] + }, "shellyduo": { "type": "mdns-sd", "mdns-sd": { @@ -453,6 +488,25 @@ ] ] }, + "shellygas": { + "type": "mdns-sd", + "mdns-sd": { + "name": "http", + "protocol": "tcp" + }, + "id": "{{txt.id}}", + "conditions": [ + [ + { + "field": "txt.id", + "match": { + "type": "regex", + "value": "^shellygas-" + } + } + ] + ] + }, "shellydimmer": { "type": "mdns-sd", "mdns-sd": { @@ -583,9 +637,12 @@ "singular": true }, "navigation": { - "next": "get_device" + "next": "icon_select" } }, + { + "id": "icon_select" + }, { "id": "get_device" }, @@ -724,9 +781,12 @@ "singular": true }, "navigation": { - "next": "get_device" + "next": "icon_select" } }, + { + "id": "icon_select" + }, { "id": "get_device" }, @@ -1047,9 +1107,12 @@ "singular": true }, "navigation": { - "next": "get_device" + "next": "icon_select" } }, + { + "id": "icon_select" + }, { "id": "get_device" }, @@ -1187,9 +1250,12 @@ "singular": true }, "navigation": { - "next": "get_device" + "next": "icon_select" } }, + { + "id": "icon_select" + }, { "id": "get_device" }, @@ -2233,6 +2299,132 @@ } ] }, + { + "id": "shellybutton1", + "discovery": "shellybutton1", + "name": { + "en": "Shelly Button 1", + "nl": "Shelly Button 1" + }, + "images": { + "large": "drivers/shellybutton1/assets/images/large.jpg", + "small": "drivers/shellybutton1/assets/images/small.jpg" + }, + "class": "button", + "capabilities": [ + "measure_battery", + "measure_voltage", + "button.callbackevents", + "button.removecallbackevents" + ], + "capabilitiesOptions": { + "button.callbackevents": { + "maintenanceAction": true, + "title": { + "en": "Set URLs for callbacks", + "nl": "Instellen URL's voor callbacks" + }, + "desc": { + "en": "Use this option to add callback URLs to your Shelly for use with trigger cards like short and long press events.", + "nl": "Gebruik deze optie om callback URL's toe te voegen aan jouw Shelly, deze worden gebruikt voor trigger cards zoals kort en lang ingedrukt acties." + } + }, + "button.removecallbackevents": { + "maintenanceAction": true, + "title": { + "en": "Remove callback URLs for triggers", + "nl": "Verwijderen callback URL's voor triggers" + }, + "desc": { + "en": "Use this option to remove callback URLs to your Shelly which are used with trigger cards like short and long press events.", + "nl": "Gebruik deze optie om callback URL's te verwijderen voor jouw Shelly, deze worden gebruikt voor trigger cards zoals kort en lang ingedrukt acties." + } + } + }, + "energy": { + "batteries": [ + "INTERNAL" + ] + }, + "pair": [ + { + "id": "start", + "navigation": { + "next": "list_devices" + } + }, + { + "id": "list_devices", + "template": "list_devices", + "options": { + "singular": true + }, + "navigation": { + "next": "icon_select" + } + }, + { + "id": "icon_select" + }, + { + "id": "get_device" + }, + { + "id": "login_credentials", + "template": "login_credentials", + "options": { + "logo": "../../../assets/shelly-logo.png" + } + }, + { + "id": "add_device" + }, + { + "id": "select_pairing" + }, + { + "id": "manual_pairing" + } + ], + "settings": [ + { + "type": "group", + "label": { + "en": "Shelly Button1 settings", + "nl": "Shelly Button1 instellingen" + }, + "children": [ + { + "id": "address", + "type": "text", + "value": "0.0.0.0", + "label": { + "en": "IP Address", + "nl": "IP adres" + } + }, + { + "id": "username", + "type": "text", + "value": "", + "label": { + "en": "Username", + "nl": "Gebruikersnaam" + } + }, + { + "id": "password", + "type": "password", + "value": "", + "label": { + "en": "Password", + "nl": "Wachtwoord" + } + } + ] + } + ] + }, { "id": "shellyduo", "discovery": "shellyduo", @@ -2993,6 +3185,147 @@ } ] }, + { + "id": "shellygas", + "discovery": "shellygas", + "name": { + "en": "Shelly Gas", + "nl": "Shelly Gas" + }, + "images": { + "large": "drivers/shellygas/assets/images/large.jpg", + "small": "drivers/shellygas/assets/images/small.jpg" + }, + "class": "sensor", + "capabilities": [ + "alarm_smoke", + "gas_concentration", + "button.callbackevents", + "button.removecallbackevents" + ], + "capabilitiesOptions": { + "button.callbackevents": { + "maintenanceAction": true, + "title": { + "en": "Set URLs for callbacks", + "nl": "Instellen URL's voor callbacks" + }, + "desc": { + "en": "Use this option to add callback URLs to your Shelly for use with trigger cards like short and long press events.", + "nl": "Gebruik deze optie om callback URL's toe te voegen aan jouw Shelly, deze worden gebruikt voor trigger cards zoals kort en lang ingedrukt acties." + } + }, + "button.removecallbackevents": { + "maintenanceAction": true, + "title": { + "en": "Remove callback URLs for triggers", + "nl": "Verwijderen callback URL's voor triggers" + }, + "desc": { + "en": "Use this option to remove callback URLs to your Shelly which are used with trigger cards like short and long press events.", + "nl": "Gebruik deze optie om callback URL's te verwijderen voor jouw Shelly, deze worden gebruikt voor trigger cards zoals kort en lang ingedrukt acties." + } + } + }, + "pair": [ + { + "id": "list_devices", + "template": "list_devices", + "options": { + "singular": true + }, + "navigation": { + "next": "icon_select" + } + }, + { + "id": "icon_select" + }, + { + "id": "get_device" + }, + { + "id": "login_credentials", + "template": "login_credentials", + "options": { + "logo": "../../../assets/shelly-logo.png" + } + }, + { + "id": "add_device" + }, + { + "id": "select_pairing" + }, + { + "id": "manual_pairing" + } + ], + "settings": [ + { + "type": "group", + "label": { + "en": "Shelly Gas settings", + "nl": "Shelly Gas instellingen" + }, + "children": [ + { + "id": "address", + "type": "text", + "value": "0.0.0.0", + "label": { + "en": "IP Address", + "nl": "IP adres" + } + }, + { + "id": "username", + "type": "text", + "value": "", + "label": { + "en": "Username", + "nl": "Gebruikersnaam" + } + }, + { + "id": "password", + "type": "password", + "value": "", + "label": { + "en": "Password", + "nl": "Wachtwoord" + } + }, + { + "id": "polling", + "type": "number", + "value": 5, + "attr": { + "min": 5, + "max": 3600 + }, + "label": { + "en": "Polling Frequency", + "nl": "Polling frequentie" + } + }, + { + "id": "offline", + "type": "number", + "value": 5, + "attr": { + "min": 2, + "max": 3600 + }, + "label": { + "en": "Minutes offline notification trigger", + "nl": "Minuten offline notificatie trigger" + } + } + ] + } + ] + }, { "id": "shellysmoke", "discovery": "shellysmoke", @@ -3840,6 +4173,35 @@ "example": "Error 401: not authenticated" } ] + }, + { + "id": "triggerGasConcentration", + "title": { + "en": "Gas concentration changed", + "nl": "Gas concentratie gewijzigd" + }, + "tokens": [ + { + "name": "ppm", + "type": "number", + "title": { + "en": "Parts per million", + "nl": "Delen per miljoen" + }, + "example": 3452 + } + ], + "args": [ + { + "name": "device", + "type": "device", + "placeholder": { + "en": "Select Shelly", + "nl": "Selecteer Shelly" + }, + "filter": "driver_id=shellygas" + } + ] } ], "conditions": [ @@ -4472,6 +4834,85 @@ "filter": "driver_id=shelly-plug|shelly-plug-s|shelly1|shelly1pm|shelly2|shelly2-rollershutter|shelly3em|shelly4pro|shelly25|shelly25-rollershutter|shellybulb|shellydimmer|shellyduo|shellyem|shellyrgbw2color|shellyrgbw2cwww|shellyrgbw2white|shellyvintage|shellyi3" } ] + }, + { + "id": "actionGasSetVolume", + "title": { + "en": "Set alarm volume", + "nl": "Instellen alarm volume" + }, + "args": [ + { + "name": "volume", + "type": "range", + "min": 0, + "max": 11, + "step": 1 + }, + { + "name": "device", + "type": "device", + "placeholder": { + "en": "Select Shelly", + "nl": "Selecteer Shelly" + }, + "filter": "driver_id=shellygas" + } + ] + }, + { + "id": "actionGasMute", + "title": { + "en": "Mute alarm", + "nl": "Dempen alarm" + }, + "args": [ + { + "name": "device", + "type": "device", + "placeholder": { + "en": "Select Shelly", + "nl": "Selecteer Shelly" + }, + "filter": "driver_id=shellygas" + } + ] + }, + { + "id": "actionGasUnmute", + "title": { + "en": "Unmute alarm", + "nl": "Dempen alarm uitschakelen" + }, + "args": [ + { + "name": "device", + "type": "device", + "placeholder": { + "en": "Select Shelly", + "nl": "Selecteer Shelly" + }, + "filter": "driver_id=shellygas" + } + ] + }, + { + "id": "actionGasTest", + "title": { + "en": "Test alarm", + "nl": "Alarm testen" + }, + "args": [ + { + "name": "device", + "type": "device", + "placeholder": { + "en": "Select Shelly", + "nl": "Selecteer Shelly" + }, + "filter": "driver_id=shellygas" + } + ] } ] } diff --git a/assets/gas_concentration.svg b/assets/gas_concentration.svg new file mode 100644 index 00000000..ea1185ce --- /dev/null +++ b/assets/gas_concentration.svg @@ -0,0 +1,62 @@ + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/drivers/shelly-plug-s/device.js b/drivers/shelly-plug-s/device.js index eb2f7d8b..dba03cb3 100644 --- a/drivers/shelly-plug-s/device.js +++ b/drivers/shelly-plug-s/device.js @@ -63,6 +63,12 @@ class ShellyPlugSDevice extends Homey.Device { onDeleted() { clearInterval(this.pollingInterval); clearInterval(this.pingInterval); + + const iconpath = "/userdata/" + this.getData().id +".svg"; + util.removeIcon(iconpath) + .catch(error => { + this.log(error); + }); } // HELPER FUNCTIONS diff --git a/drivers/shelly-plug-s/driver.js b/drivers/shelly-plug-s/driver.js index ced31b82..abf70056 100644 --- a/drivers/shelly-plug-s/driver.js +++ b/drivers/shelly-plug-s/driver.js @@ -10,6 +10,7 @@ class ShellyPlugSDriver extends Homey.Driver { const discoveryResults = discoveryStrategy.getDiscoveryResults(); let selectedDeviceId; let deviceArray = {}; + let deviceIcon = 'icon.svg'; socket.on('list_devices', (data, callback) => { const devices = Object.values(discoveryResults).map(discoveryResult => { @@ -51,7 +52,8 @@ class ShellyPlugSDriver extends Homey.Driver { }, store: { type: result.type - } + }, + icon: deviceIcon } if (result.auth) { socket.showView('login_credentials'); @@ -104,6 +106,17 @@ class ShellyPlugSDriver extends Homey.Driver { }) }); + socket.on('save_icon', (data, callback) => { + util.uploadIcon(data, selectedDeviceId) + .then(result => { + deviceIcon = "../../../userdata/"+ selectedDeviceId +".svg"; + callback(null, 'success'); + }) + .catch(error => { + callback(error, null); + }) + }); + } } diff --git a/drivers/shelly-plug-s/pair/icon_select.html b/drivers/shelly-plug-s/pair/icon_select.html new file mode 100644 index 00000000..ad60916d --- /dev/null +++ b/drivers/shelly-plug-s/pair/icon_select.html @@ -0,0 +1,89 @@ + + + +

If you wish to use a custom icon for your device you can upload it here. The icon needs to be in .svg format.

+
+ +
+
+
+ +
+
+
+ + +
diff --git a/drivers/shelly-plug/device.js b/drivers/shelly-plug/device.js index 0f29daa2..6459fe7b 100644 --- a/drivers/shelly-plug/device.js +++ b/drivers/shelly-plug/device.js @@ -63,6 +63,12 @@ class ShellyPlugDevice extends Homey.Device { onDeleted() { clearInterval(this.pollingInterval); clearInterval(this.pingInterval); + + const iconpath = "/userdata/" + this.getData().id +".svg"; + util.removeIcon(iconpath) + .catch(error => { + this.log(error); + }); } // HELPER FUNCTIONS diff --git a/drivers/shelly-plug/driver.js b/drivers/shelly-plug/driver.js index 29976989..eefe071e 100644 --- a/drivers/shelly-plug/driver.js +++ b/drivers/shelly-plug/driver.js @@ -10,6 +10,7 @@ class ShellyPlugDriver extends Homey.Driver { const discoveryResults = discoveryStrategy.getDiscoveryResults(); let selectedDeviceId; let deviceArray = {}; + let deviceIcon = 'icon.svg'; socket.on('list_devices', (data, callback) => { const devices = Object.values(discoveryResults).map(discoveryResult => { @@ -51,7 +52,8 @@ class ShellyPlugDriver extends Homey.Driver { }, store: { type: result.type - } + }, + icon: deviceIcon } if (result.auth) { socket.showView('login_credentials'); @@ -104,6 +106,17 @@ class ShellyPlugDriver extends Homey.Driver { }) }); + socket.on('save_icon', (data, callback) => { + util.uploadIcon(data, selectedDeviceId) + .then(result => { + deviceIcon = "../../../userdata/"+ selectedDeviceId +".svg"; + callback(null, 'success'); + }) + .catch(error => { + callback(error, null); + }) + }); + } } diff --git a/drivers/shelly-plug/pair/icon_select.html b/drivers/shelly-plug/pair/icon_select.html new file mode 100644 index 00000000..ad60916d --- /dev/null +++ b/drivers/shelly-plug/pair/icon_select.html @@ -0,0 +1,89 @@ + + + +

If you wish to use a custom icon for your device you can upload it here. The icon needs to be in .svg format.

+
+ +
+
+
+ +
+
+
+ + +
diff --git a/drivers/shelly1/device.js b/drivers/shelly1/device.js index 7a5d59cb..49d703ff 100644 --- a/drivers/shelly1/device.js +++ b/drivers/shelly1/device.js @@ -2,7 +2,6 @@ const Homey = require('homey'); const util = require('/lib/util.js'); -const fs = require('fs'); class Shelly1Device extends Homey.Device { @@ -81,13 +80,10 @@ class Shelly1Device extends Homey.Device { clearInterval(this.pingInterval); const iconpath = "/userdata/" + this.getData().id +".svg"; - try { - if (fs.existsSync(iconpath)) { - fs.unlinkSync(iconpath); - } - } catch (error) { - this.log(error) - } + util.removeIcon(iconpath) + .catch(error => { + this.log(error); + }); } // HELPER FUNCTIONS diff --git a/drivers/shelly1/driver.js b/drivers/shelly1/driver.js index 087b7d98..c2e8713d 100644 --- a/drivers/shelly1/driver.js +++ b/drivers/shelly1/driver.js @@ -96,8 +96,7 @@ class Shelly1Driver extends Homey.Driver { capabilities: ['onoff', 'button.callbackevents', 'button.removecallbackevents'], store: { type: result.device.type - }, - icon: deviceIcon + } } callback(null, result); } else { diff --git a/drivers/shelly1/pair/icon_select.html b/drivers/shelly1/pair/icon_select.html deleted file mode 100644 index ad60916d..00000000 --- a/drivers/shelly1/pair/icon_select.html +++ /dev/null @@ -1,89 +0,0 @@ - - - -

If you wish to use a custom icon for your device you can upload it here. The icon needs to be in .svg format.

-
- -
-
-
- -
-
-
- - -
diff --git a/drivers/shelly1/pair/icon_select.html b/drivers/shelly1/pair/icon_select.html new file mode 120000 index 00000000..2d757f77 --- /dev/null +++ b/drivers/shelly1/pair/icon_select.html @@ -0,0 +1 @@ +../../../pair_templates/icon_select.html \ No newline at end of file diff --git a/drivers/shelly1pm/device.js b/drivers/shelly1pm/device.js index e2c4f24e..64b0bba4 100644 --- a/drivers/shelly1pm/device.js +++ b/drivers/shelly1pm/device.js @@ -79,6 +79,12 @@ class Shelly1pmDevice extends Homey.Device { onDeleted() { clearInterval(this.pollingInterval); clearInterval(this.pingInterval); + + const iconpath = "/userdata/" + this.getData().id +".svg"; + util.removeIcon(iconpath) + .catch(error => { + this.log(error); + }); } // HELPER FUNCTIONS diff --git a/drivers/shelly1pm/driver.js b/drivers/shelly1pm/driver.js index dc2bfe5a..0c17d98e 100644 --- a/drivers/shelly1pm/driver.js +++ b/drivers/shelly1pm/driver.js @@ -10,6 +10,7 @@ class Shelly1pmDriver extends Homey.Driver { const discoveryResults = discoveryStrategy.getDiscoveryResults(); let selectedDeviceId; let deviceArray = {}; + let deviceIcon = 'icon.svg'; socket.on('list_devices', (data, callback) => { const devices = Object.values(discoveryResults).map(discoveryResult => { @@ -52,7 +53,8 @@ class Shelly1pmDriver extends Homey.Driver { capabilities: ["onoff", "measure_power", "meter_power_wmin", "meter_power", "measure_temperature", "button.callbackevents", "button.removecallbackevents"], store: { type: result.type - } + }, + icon: deviceIcon } if (result.auth) { socket.showView('login_credentials'); @@ -106,6 +108,17 @@ class Shelly1pmDriver extends Homey.Driver { }) }); + socket.on('save_icon', (data, callback) => { + util.uploadIcon(data, selectedDeviceId) + .then(result => { + deviceIcon = "../../../userdata/"+ selectedDeviceId +".svg"; + callback(null, 'success'); + }) + .catch(error => { + callback(error, null); + }) + }); + } } diff --git a/drivers/shelly1pm/pair/icon_select.html b/drivers/shelly1pm/pair/icon_select.html new file mode 100644 index 00000000..ad60916d --- /dev/null +++ b/drivers/shelly1pm/pair/icon_select.html @@ -0,0 +1,89 @@ + + + +

If you wish to use a custom icon for your device you can upload it here. The icon needs to be in .svg format.

+
+ +
+
+
+ +
+
+
+ + +
diff --git a/drivers/shelly2/device.js b/drivers/shelly2/device.js index 91adb526..101c6f62 100644 --- a/drivers/shelly2/device.js +++ b/drivers/shelly2/device.js @@ -74,6 +74,12 @@ class Shelly2Device extends Homey.Device { onDeleted() { return Homey.ManagerDrivers.getDriver('shelly2').loadDevices(); + + const iconpath = "/userdata/" + this.getData().id +".svg"; + util.removeIcon(iconpath) + .catch(error => { + this.log(error); + }); } } diff --git a/drivers/shelly2/driver.js b/drivers/shelly2/driver.js index 86aa51f7..afa4f033 100644 --- a/drivers/shelly2/driver.js +++ b/drivers/shelly2/driver.js @@ -17,6 +17,7 @@ class Shelly2Driver extends Homey.Driver { const discoveryResults = discoveryStrategy.getDiscoveryResults(); let selectedDeviceId; let deviceArray = {}; + let deviceIcon = 'icon.svg'; socket.on('list_devices', (data, callback) => { const devices = Object.values(discoveryResults).map(discoveryResult => { @@ -57,7 +58,8 @@ class Shelly2Driver extends Homey.Driver { }, store: { type: result.type - } + }, + icon: deviceIcon } if (result.auth) { socket.showView('login_credentials'); @@ -99,7 +101,8 @@ class Shelly2Driver extends Homey.Driver { }, store: { type: result.device.type - } + }, + icon: deviceIcon } callback(null, result); } else { @@ -111,6 +114,17 @@ class Shelly2Driver extends Homey.Driver { }) }); + socket.on('save_icon', (data, callback) => { + util.uploadIcon(data, selectedDeviceId) + .then(result => { + deviceIcon = "../../../userdata/"+ selectedDeviceId +".svg"; + callback(null, 'success'); + }) + .catch(error => { + callback(error, null); + }) + }); + } // HELPER FUNCTIONS diff --git a/drivers/shelly2/pair/add_device.html b/drivers/shelly2/pair/add_device.html index 452c9c45..41f6b161 100644 --- a/drivers/shelly2/pair/add_device.html +++ b/drivers/shelly2/pair/add_device.html @@ -23,7 +23,8 @@ main_device: result.data.id, channel: i, type: result.store.type - } + }, + icon: result.icon }, function(error, result ) { if (error) { Homey.alert(error, null, function() { diff --git a/drivers/shelly2/pair/icon_select.html b/drivers/shelly2/pair/icon_select.html new file mode 100644 index 00000000..ad60916d --- /dev/null +++ b/drivers/shelly2/pair/icon_select.html @@ -0,0 +1,89 @@ + + + +

If you wish to use a custom icon for your device you can upload it here. The icon needs to be in .svg format.

+
+ +
+
+
+ +
+
+
+ + +
diff --git a/drivers/shellybutton1/assets/icon.svg b/drivers/shellybutton1/assets/icon.svg new file mode 100644 index 00000000..7892247d --- /dev/null +++ b/drivers/shellybutton1/assets/icon.svg @@ -0,0 +1,9 @@ + + + + Shelly button1 + Created with Sketch. + + + + \ No newline at end of file diff --git a/drivers/shellybutton1/assets/images/large.jpg b/drivers/shellybutton1/assets/images/large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1a98dd66423cbceb38c741d7e828c01a52f3c6d1 GIT binary patch literal 44318 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 P{SW!>|KZ(y|C;_U6>(-P literal 0 HcmV?d00001 diff --git a/drivers/shellybutton1/assets/images/small.jpg b/drivers/shellybutton1/assets/images/small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9b2b0a7c769a4238a2d41b545d02821c54dd29ea GIT binary patch literal 14870 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 { + this.addCallbackUrls(); + }); + + this.registerCapabilityListener('button.removecallbackevents', async () => { + var shortpush_url = '/settings/input/0?shortpush_url=null'; + var double_shortpush_url = '/settings/input/0?double_shortpush_url=null'; + var triple_shortpush_url = '/settings/input/0?triple_shortpush_url=null'; + var longpush_url = '/settings/input/0?longpush_url=null'; + + try { + await util.sendCommand(shortpush_url, this.getSetting('address'), this.getSetting('username'), this.getSetting('password')); + await util.sendCommand(double_shortpush_url, this.getSetting('address'), this.getSetting('username'), this.getSetting('password')); + await util.sendCommand(triple_shortpush_url, this.getSetting('address'), this.getSetting('username'), this.getSetting('password')); + await util.sendCommand(longpush_url, this.getSetting('address'), this.getSetting('username'), this.getSetting('password')); + + return; + } catch (error) { + throw new Error(error); + } + }); + } + + onAdded() { + this.addCallbackUrls(); + } + + onDeleted() { + clearInterval(this.pollingInterval); + + const iconpath = "/userdata/" + this.getData().id +".svg"; + util.removeIcon(iconpath) + .catch(error => { + this.log(error); + }); + } + + // HELPER FUNCTIONS + pollDevice() { + clearInterval(this.pollingInterval); + + this.pollingInterval = setInterval(() => { + util.sendCommand('/status', this.getSetting('address'), this.getSetting('username'), this.getSetting('password')) + .then(result => { + let battery = result.bat.value; + let voltage = result.bat.voltage; + + // capability measure_power + if (battery != this.getCapabilityValue('measure_battery')) { + this.setCapabilityValue('measure_battery', battery); + } + + // capability measure_voltage + if (voltage != this.getCapabilityValue('measure_voltage')) { + this.setCapabilityValue('measure_voltage', voltage); + } + + }) + .catch(error => { + this.log('Device asleep or disconnected'); + }) + }, 4000); + } + + async addCallbackUrls() { + var homeyip = await util.getHomeyIp(); + + var shortpush_url = '/settings/input/0?shortpush_url=http://'+ homeyip +'/api/app/cloud.shelly/button_actions/shellybutton1/'+ this.getData().id +'/shortpush/'; + var double_shortpush_url = '/settings/input/0?double_shortpush_url=http://'+ homeyip +'/api/app/cloud.shelly/button_actions/shellybutton1/'+ this.getData().id +'/double_shortpush/'; + var triple_shortpush_url = '/settings/input/0?triple_shortpush_url=http://'+ homeyip +'/api/app/cloud.shelly/button_actions/shellybutton1/'+ this.getData().id +'/triple_shortpush/'; + var longpush_url = '/settings/input/0?longpush_url=http://'+ homeyip +'/api/app/cloud.shelly/button_actions/shellybutton1/'+ this.getData().id +'/longpush/'; + + try { + await util.sendCommand(shortpush_url, this.getSetting('address'), this.getSetting('username'), this.getSetting('password')); + await util.sendCommand(double_shortpush_url, this.getSetting('address'), this.getSetting('username'), this.getSetting('password')); + await util.sendCommand(triple_shortpush_url, this.getSetting('address'), this.getSetting('username'), this.getSetting('password')); + await util.sendCommand(longpush_url, this.getSetting('address'), this.getSetting('username'), this.getSetting('password')); + + await util.sendCommand('/reboot', this.getSetting('address'), this.getSetting('username'), this.getSetting('password')); + + return; + } catch (error) { + throw new Error(error); + } + } + +} + +module.exports = ShellyButton1Device; diff --git a/drivers/shellybutton1/driver.js b/drivers/shellybutton1/driver.js new file mode 100644 index 00000000..ae3c34e9 --- /dev/null +++ b/drivers/shellybutton1/driver.js @@ -0,0 +1,122 @@ +"use strict"; + +const Homey = require('homey'); +const util = require('/lib/util.js'); + +class ShellyButton1Driver extends Homey.Driver { + + onPair(socket) { + const discoveryStrategy = this.getDiscoveryStrategy(); + const discoveryResults = discoveryStrategy.getDiscoveryResults(); + let selectedDeviceId; + let deviceArray = {}; + let deviceIcon = 'icon.svg'; + + socket.on('list_devices', (data, callback) => { + const devices = Object.values(discoveryResults).map(discoveryResult => { + return { + name: 'Shelly Button 1 ['+ discoveryResult.address +']', + data: { + id: discoveryResult.id, + } + }; + }); + if (devices.length) { + callback(null, devices); + } else { + socket.showView('select_pairing'); + } + }); + + socket.on('list_devices_selection', (data, callback) => { + callback(); + selectedDeviceId = data[0].data.id; + }); + + socket.on('get_device', (data, callback) => { + const discoveryResult = discoveryResults[selectedDeviceId]; + if(!discoveryResult) return callback(new Error('Something went wrong')); + + util.sendCommand('/shelly', discoveryResult.address, '', '') + .then(result => { + deviceArray = { + name: 'Shelly Button 1 ['+ discoveryResult.address +']', + data: { + id: discoveryResult.id, + }, + settings: { + address : discoveryResult.address, + username : '', + password : '' + }, + store: { + type: result.type + }, + icon: deviceIcon + } + if (result.auth) { + socket.showView('login_credentials'); + } else { + socket.showView('add_device'); + } + }) + .catch(error => { + callback(error, false); + }) + }); + + socket.on('login', (data, callback) => { + deviceArray.settings.username = data.username; + deviceArray.settings.password = data.password; + callback(null, true); + }); + + socket.on('add_device', (data, callback) => { + callback(false, deviceArray); + }); + + socket.on('manual_pairing', function(data, callback) { + util.sendCommand('/settings', data.address, data.username, data.password) + .then(result => { + var hostname = result.device.hostname; + if (hostname.startsWith('shellybutton1-')) { + deviceArray = { + name: 'Shelly Button 1 ['+ data.address +']', + data: { + id: result.device.hostname, + }, + settings: { + address : data.address, + username : data.username, + password : data.password + }, + store: { + type: result.device.type + } + } + callback(null, result); + } else { + callback(null, 'incorrect device'); + } + }) + .catch(error => { + callback(error, null); + }) + }); + + socket.on('save_icon', (data, callback) => { + util.uploadIcon(data, selectedDeviceId) + .then(result => { + deviceIcon = "../../../userdata/"+ selectedDeviceId +".svg"; + callback(null, 'success'); + }) + .catch(error => { + callback(error, null); + }) + }); + + } + +} + +module.exports = ShellyButton1Driver; diff --git a/drivers/shellybutton1/pair/add_device.html b/drivers/shellybutton1/pair/add_device.html new file mode 100644 index 00000000..de7484f9 --- /dev/null +++ b/drivers/shellybutton1/pair/add_device.html @@ -0,0 +1,18 @@ + diff --git a/drivers/shellybutton1/pair/get_device.html b/drivers/shellybutton1/pair/get_device.html new file mode 100644 index 00000000..a8bb405f --- /dev/null +++ b/drivers/shellybutton1/pair/get_device.html @@ -0,0 +1,9 @@ + diff --git a/drivers/shellybutton1/pair/icon_select.html b/drivers/shellybutton1/pair/icon_select.html new file mode 120000 index 00000000..2d757f77 --- /dev/null +++ b/drivers/shellybutton1/pair/icon_select.html @@ -0,0 +1 @@ +../../../pair_templates/icon_select.html \ No newline at end of file diff --git a/drivers/shellybutton1/pair/manual_pairing.html b/drivers/shellybutton1/pair/manual_pairing.html new file mode 100644 index 00000000..2b27e95d --- /dev/null +++ b/drivers/shellybutton1/pair/manual_pairing.html @@ -0,0 +1,121 @@ + + + + +

Enter the IP address and, if confugured, your username and password for your Shelly device.

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ +
+

Connection test succesfull

+

Shelly device added succesfully

+

+
diff --git a/drivers/shellybutton1/pair/select_pairing.html b/drivers/shellybutton1/pair/select_pairing.html new file mode 100644 index 00000000..c5bbb740 --- /dev/null +++ b/drivers/shellybutton1/pair/select_pairing.html @@ -0,0 +1,42 @@ + + + + +

No devices have been discovered. You can try again or use manual pairing if you know the IP address of your Shelly device.

+
+
+ + +
+
diff --git a/drivers/shellybutton1/pair/start.html b/drivers/shellybutton1/pair/start.html new file mode 100644 index 00000000..980022bf --- /dev/null +++ b/drivers/shellybutton1/pair/start.html @@ -0,0 +1,10 @@ + + + + +
+ +
First pair the device with the Shelly smartphone app. Connect a USB cable to the button to ensure it's powered and connected with your WiFi before continuing.
+
diff --git a/drivers/shellygas/assets/icon.svg b/drivers/shellygas/assets/icon.svg new file mode 100644 index 00000000..12a66d0f --- /dev/null +++ b/drivers/shellygas/assets/icon.svg @@ -0,0 +1,9 @@ + + + + Shelly gas + Created with Sketch. + + + + \ No newline at end of file diff --git a/drivers/shellygas/assets/images/large.jpg b/drivers/shellygas/assets/images/large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a246fb1489db9b638f38e8a1b52b6a6d88c2612d GIT binary patch literal 92850 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 RY;gbk7Wn`D3HHB}{{bD2+~@!R literal 0 HcmV?d00001 diff --git a/drivers/shellygas/assets/images/small.jpg b/drivers/shellygas/assets/images/small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..131b9d39afe0176e4fe5f22f440f31a0dc52e63b GIT binary patch literal 14991 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 literal 0 HcmV?d00001 diff --git a/drivers/shellygas/device.js b/drivers/shellygas/device.js new file mode 100644 index 00000000..c2a3b6cc --- /dev/null +++ b/drivers/shellygas/device.js @@ -0,0 +1,121 @@ +'use strict'; + +const Homey = require('homey'); +const util = require('/lib/util.js'); + +class ShellyGasDevice extends Homey.Device { + + onInit() { + new Homey.FlowCardTriggerDevice('triggerGasConcentration').register(); + + this.pollDevice(); + this.setAvailable(); + + // LISTENERS FOR UPDATING CAPABILITIES + this.registerCapabilityListener('button.callbackevents', async () => { + var homeyip = await util.getHomeyIp(); + var alarm_off_url = '/settings/alarm_off_url=http://'+ homeyip +'/api/app/cloud.shelly/button_actions/shellygas/'+ this.getData().id +'/alarm_off/'; + var alarm_mild_url = '/settings/alarm_mild_url=http://'+ homeyip +'/api/app/cloud.shelly/button_actions/shellygas/'+ this.getData().id +'/alarm_mild/'; + var alarm_heavy_url = '/settings/alarm_heavy_url=http://'+ homeyip +'/api/app/cloud.shelly/button_actions/shellygas/'+ this.getData().id +'/alarm_heavy/'; + + try { + await util.sendCommand(alarm_off_url, this.getSetting('address'), this.getSetting('username'), this.getSetting('password')); + await util.sendCommand(alarm_mild_url, this.getSetting('address'), this.getSetting('username'), this.getSetting('password')); + await util.sendCommand(alarm_heavy_url, this.getSetting('address'), this.getSetting('username'), this.getSetting('password')); + return; + } catch (error) { + throw new Error(error); + } + }); + + this.registerCapabilityListener('button.removecallbackevents', async () => { + var alarm_off_url = '/settings/alarm_off_url=null'; + var alarm_mild_url = '/settings/alarm_mild_url=null'; + var alarm_heavy_url = '/settings/alarm_heavy_url=null'; + + try { + await util.sendCommand(alarm_off_url, this.getSetting('address'), this.getSetting('username'), this.getSetting('password')); + await util.sendCommand(alarm_mild_url, this.getSetting('address'), this.getSetting('username'), this.getSetting('password')); + await util.sendCommand(alarm_heavy_url, this.getSetting('address'), this.getSetting('username'), this.getSetting('password')); + return; + } catch (error) { + throw new Error(error); + } + }); + + } + + onDeleted() { + clearInterval(this.pollingInterval); + clearInterval(this.pingInterval); + + const iconpath = "/userdata/" + this.getData().id +".svg"; + util.removeIcon(iconpath) + .catch(error => { + this.log(error); + }); + } + + // HELPER FUNCTIONS + pollDevice() { + clearInterval(this.pollingInterval); + clearInterval(this.pingInterval); + + this.pollingInterval = setInterval(() => { + util.sendCommand('/status', this.getSetting('address'), this.getSetting('username'), this.getSetting('password')) + .then(result => { + clearTimeout(this.offlineTimeout); + + if (result.gas_sensor.alarm_state == 'mild' || result.gas_sensor.alarm_state == 'heavy') { + let alarm = true; + } else { + let alarm = false; + } + let gas_concentration = Number(result.concentration.ppm); + + // capability alarm_smoke + if (alarm != this.getCapabilityValue('alarm_smoke')) { + this.setCapabilityValue('alarm_smoke', alarm); + } + + // capability gas_concentration + if (gas_concentration != this.getCapabilityValue('gas_concentration')) { + this.setCapabilityValue('gas_concentration', gas_concentration); + Homey.ManagerFlow.getCard('trigger', 'triggerGasConcentration').trigger(this, {'ppm': gas_concentration}, {}) + } + + }) + .catch(error => { + this.log(error); + this.setUnavailable(Homey.__('Unreachable')); + this.pingDevice(); + + this.offlineTimeout = setTimeout(() => { + let offlineTrigger = new Homey.FlowCardTrigger('triggerDeviceOffline'); + offlineTrigger.register().trigger({"device": this.getName(), "device_error": error.toString() }); + return; + }, 60000 * this.getSetting('offline')); + + }) + }, 1000 * this.getSetting('polling')); + } + + pingDevice() { + clearInterval(this.pollingInterval); + clearInterval(this.pingInterval); + + this.pingInterval = setInterval(() => { + util.sendCommand('/status', this.getSetting('address'), this.getSetting('username'), this.getSetting('password')) + .then(result => { + this.setAvailable(); + this.pollDevice(); + }) + .catch(error => { + this.log('Device is not reachable, pinging every 63 seconds to see if it comes online again.'); + }) + }, 63000); + } + +} + +module.exports = ShellyGasDevice; diff --git a/drivers/shellygas/driver.js b/drivers/shellygas/driver.js new file mode 100644 index 00000000..08e01df9 --- /dev/null +++ b/drivers/shellygas/driver.js @@ -0,0 +1,124 @@ +"use strict"; + +const Homey = require('homey'); +const util = require('/lib/util.js'); + +class ShellyGasDriver extends Homey.Driver { + + onPair(socket) { + const discoveryStrategy = this.getDiscoveryStrategy(); + const discoveryResults = discoveryStrategy.getDiscoveryResults(); + let selectedDeviceId; + let deviceArray = {}; + let deviceIcon = 'icon.svg'; + + socket.on('list_devices', (data, callback) => { + const devices = Object.values(discoveryResults).map(discoveryResult => { + return { + name: 'Shelly Gas ['+ discoveryResult.address +']', + data: { + id: discoveryResult.id, + } + }; + }); + if (devices.length) { + callback(null, devices); + } else { + socket.showView('select_pairing'); + } + }); + + socket.on('list_devices_selection', (data, callback) => { + callback(); + selectedDeviceId = data[0].data.id; + }); + + socket.on('get_device', (data, callback) => { + const discoveryResult = discoveryResults[selectedDeviceId]; + if(!discoveryResult) return callback(new Error('Something went wrong')); + + util.sendCommand('/shelly', discoveryResult.address, '', '') + .then(result => { + deviceArray = { + name: 'Shelly Gas ['+ discoveryResult.address +']', + data: { + id: discoveryResult.id, + }, + settings: { + address : discoveryResult.address, + username : '', + password : '', + polling : 5 + }, + store: { + type: result.type + }, + icon: deviceIcon + } + if (result.auth) { + socket.showView('login_credentials'); + } else { + socket.showView('add_device'); + } + }) + .catch(error => { + callback(error, false); + }) + }); + + socket.on('login', (data, callback) => { + deviceArray.settings.username = data.username; + deviceArray.settings.password = data.password; + callback(null, true); + }); + + socket.on('add_device', (data, callback) => { + callback(false, deviceArray); + }); + + socket.on('manual_pairing', function(data, callback) { + util.sendCommand('/settings', data.address, data.username, data.password) + .then(result => { + var hostname = result.device.hostname; + if (hostname.startsWith('shelly1-')) { + deviceArray = { + name: 'Shelly1 ['+ data.address +']', + data: { + id: result.device.hostname, + }, + settings: { + address : data.address, + username : data.username, + password : data.password, + polling : 5 + }, + store: { + type: result.device.type + } + } + callback(null, result); + } else { + callback(null, 'incorrect device'); + } + }) + .catch(error => { + callback(error, null); + }) + }); + + socket.on('save_icon', (data, callback) => { + util.uploadIcon(data, selectedDeviceId) + .then(result => { + deviceIcon = "../../../userdata/"+ selectedDeviceId +".svg"; + callback(null, 'success'); + }) + .catch(error => { + callback(error, null); + }) + }); + + } + +} + +module.exports = ShellyGasDriver; diff --git a/drivers/shellygas/pair/add_device.html b/drivers/shellygas/pair/add_device.html new file mode 100644 index 00000000..de7484f9 --- /dev/null +++ b/drivers/shellygas/pair/add_device.html @@ -0,0 +1,18 @@ + diff --git a/drivers/shellygas/pair/get_device.html b/drivers/shellygas/pair/get_device.html new file mode 100644 index 00000000..a8bb405f --- /dev/null +++ b/drivers/shellygas/pair/get_device.html @@ -0,0 +1,9 @@ + diff --git a/drivers/shellygas/pair/icon_select.html b/drivers/shellygas/pair/icon_select.html new file mode 100644 index 00000000..ad60916d --- /dev/null +++ b/drivers/shellygas/pair/icon_select.html @@ -0,0 +1,89 @@ + + + +

If you wish to use a custom icon for your device you can upload it here. The icon needs to be in .svg format.

+
+ +
+
+
+ +
+
+
+ + +
diff --git a/drivers/shellygas/pair/manual_pairing.html b/drivers/shellygas/pair/manual_pairing.html new file mode 100644 index 00000000..2b27e95d --- /dev/null +++ b/drivers/shellygas/pair/manual_pairing.html @@ -0,0 +1,121 @@ + + + + +

Enter the IP address and, if confugured, your username and password for your Shelly device.

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ +
+

Connection test succesfull

+

Shelly device added succesfully

+

+
diff --git a/drivers/shellygas/pair/select_pairing.html b/drivers/shellygas/pair/select_pairing.html new file mode 100644 index 00000000..c5bbb740 --- /dev/null +++ b/drivers/shellygas/pair/select_pairing.html @@ -0,0 +1,42 @@ + + + + +

No devices have been discovered. You can try again or use manual pairing if you know the IP address of your Shelly device.

+
+
+ + +
+
diff --git a/lib/util.js b/lib/util.js index 1e710983..39cb6210 100644 --- a/lib/util.js +++ b/lib/util.js @@ -60,6 +60,21 @@ exports.uploadIcon = function (img, id) { }) } +exports.removeIcon = function (iconpath) { + return new Promise(function (resolve, reject) { + try { + if (fs.existsSync(iconpath)) { + fs.unlinkSync(iconpath); + return resolve(true); + } else { + return resolve(true); + } + } catch (error) { + return reject(error); + } + }) +} + function checkStatus(res) { if (res.ok) { return res; diff --git a/locales/en.json b/locales/en.json index f16c9c6f..017c33e9 100644 --- a/locales/en.json +++ b/locales/en.json @@ -21,6 +21,7 @@ "connect": "Connect", "success": "Shelly device added succesfully", "startpairing": "First pair the device with the Shelly smartphone app. Then press the physical button on your Shelly sensor to wake up the device. The LED inside the sensor stops blinking once it has connected to your WiFi and is then ready for pairing. Then you can click the next button below.", + "startpairingbutton": "First pair the device with the Shelly smartphone app. Connect a USB cable to the button to ensure it's powered and connected with your WiFi before continuing.", "titleselection": "What do you want to do?", "nodevices": "No devices have been discovered. You can try again or use manual pairing if you know the IP address of your Shelly device.", "again": "Try Again", diff --git a/locales/nl.json b/locales/nl.json index 24cbc881..4c554fa7 100644 --- a/locales/nl.json +++ b/locales/nl.json @@ -21,6 +21,7 @@ "connect": "Verbind", "success": "Shelly apparaat succesvol toegevoegd", "startpairing": "Koppel het apparaat eerst met de Shelly smartphone app. Druk daarna op de fysieke knop op in je Shelly sensor om het apparaat wakker te maken. Wacht tot de LED aan blijft, de Shelly is dan verbonden met je WiFi netwerk. Klik vervolgens op de volgende knop hieronder.", + "startpairingbutton": "Koppel het apparaat eerst met de Shelly smartphone app. Verbind een USB kabel aan de knop om er zeker van te zijn dat deze stroom heeft en verbonden is met WiFi voordat je verder gaat.", "titleselection": "Wat wil je doen?", "nodevices": "Geen apparaten gevonden. Je kan het nog een keer proberen of je Shelly handmatig toevoegen als je het IP adres weet.", "again": "Probeer opnieuw", diff --git a/package-lock.json b/package-lock.json index 4a04952d..9e87cbed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "cloud.shelly", - "version": "1.23.0", + "version": "1.24.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index c79364e2..d38f4bc2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloud.shelly", - "version": "1.23.0", + "version": "1.24.0", "description": "Homey app for controlling Shelly devices", "main": "app.js", "scripts": { diff --git a/pair_templates/icon_select.html b/pair_templates/icon_select.html new file mode 100644 index 00000000..ad60916d --- /dev/null +++ b/pair_templates/icon_select.html @@ -0,0 +1,89 @@ + + + +

If you wish to use a custom icon for your device you can upload it here. The icon needs to be in .svg format.

+
+ +
+
+
+ +
+
+
+ + +