From ee994e027fe21fd94041ec73bbe795787bfbacca Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 27 Jun 2022 16:12:26 +0200 Subject: [PATCH 1/6] Version 0.02 of "Info" app including weather data --- apps/info/ChangeLog | 3 +- apps/info/info.app.js | 144 ++++++++++++++++++++++++------------- apps/info/metadata.json | 2 +- apps/info/screenshot_1.png | Bin 3552 -> 3399 bytes apps/info/screenshot_2.png | Bin 3334 -> 3825 bytes apps/info/screenshot_3.png | Bin 3455 -> 3620 bytes 6 files changed, 98 insertions(+), 51 deletions(-) diff --git a/apps/info/ChangeLog b/apps/info/ChangeLog index 07afedd21..400e7a119 100644 --- a/apps/info/ChangeLog +++ b/apps/info/ChangeLog @@ -1 +1,2 @@ -0.01: Release \ No newline at end of file +0.01: Release +0.02: Recfactoring and show weather data. \ No newline at end of file diff --git a/apps/info/info.app.js b/apps/info/info.app.js index c61a88045..9de80affc 100644 --- a/apps/info/info.app.js +++ b/apps/info/info.app.js @@ -1,27 +1,90 @@ -var s = require("Storage"); +const storage = require("Storage"); const locale = require('locale'); var ENV = process.env; var W = g.getWidth(), H = g.getHeight(); var screen = 0; -const maxScreen = 2; + + +var screens = [ + { + name: "General", + items: [ + {name: "Steps", fun: () => getSteps()}, + {name: "HRM", fun: () => getBpm()}, + {name: "", fun: () => ""}, + {name: "Temp.", fun: () => getWeatherTemp()}, + {name: "Humidity", fun: () => getWeatherHumidity()}, + {name: "Wind", fun: () => getWeatherWind()}, + ] + }, + { + name: "Hardware", + items: [ + {name: "Battery", fun: () => E.getBattery() + "%"}, + {name: "Charge?", fun: () => Bangle.isCharging() ? "Yes" : "No"}, + {name: "TempInt.", fun: () => locale.temp(parseInt(E.getTemperature()))}, + {name: "Bluetooth", fun: () => NRF.getSecurityStatus().connected ? "Conn" : "NoConn"}, + {name: "GPS", fun: () => Bangle.isGPSOn() ? "On" : "Off"}, + {name: "Compass", fun: () => Bangle.isCompassOn() ? "On" : "Off"}, + ] + }, + { + name: "Software", + items: [ + {name: "Firmw.", fun: () => ENV.VERSION}, + {name: "Boot.", fun: () => getVersion("boot.info")}, + {name: "Settings.", fun: () => getVersion("setting.info")}, + {name: "Storage.", fun: () => ""}, + {name: " Total", fun: () => ENV.STORAGE>>10}, + {name: " Free", fun: () => require("Storage").getFree()>>10}, + ] + } +]; + + +function getWeatherTemp(){ + try { + var weather = storage.readJSON('weather.json').weather; + return locale.temp(weather.temp-273.15); + } catch(ex) { } + + return "?"; +} + + +function getWeatherHumidity(){ + try { + var weather = storage.readJSON('weather.json').weather; + return weather.hum = weather.hum + "%"; + } catch(ex) { } + + return "?"; +} + + +function getWeatherWind(){ + try { + var weather = storage.readJSON('weather.json').weather; + var speed = locale.speed(weather.wind).replace("mph", ""); + return Math.round(speed * 1.609344) + "kph"; + } catch(ex) { } + + return "?"; +} + function getVersion(file) { - var j = s.readJSON(file,1); + var j = storage.readJSON(file,1); var v = ("object"==typeof j)?j.version:false; return v?((v?"v"+v:"Unknown")):"NO "; } -function drawData(name, value, y){ - g.drawString(name, 5, y); - g.drawString(value, 100, y); -} - function getSteps(){ try{ return Bangle.getHealthStatus("day").steps; } catch(e) { - return ">= 2v12"; + return ">2v12"; } } @@ -29,53 +92,36 @@ function getBpm(){ try{ return Math.round(Bangle.getHealthStatus("day").bpm) + "bpm"; } catch(e) { - return ">= 2v12"; + return ">2v12"; } } +function drawData(name, value, y){ + g.drawString(name, 10, y); + g.drawString(value, 100, y); +} + function drawInfo() { g.reset().clearRect(Bangle.appRect); var h=18, y = h;//-h; // Header - g.setFont("Vector", h+2).setFontAlign(0,-1); - g.drawString("--==|| INFO ||==--", W/2, 0); + g.drawLine(0,25,W,25); + g.drawLine(0,26,W,26); + + // Info body depending on screen g.setFont("Vector",h).setFontAlign(-1,-1); + screens[screen].items.forEach(function (item, index){ + drawData(item.name, item.fun(), y+=h); + }); - // Dynamic data - if(screen == 0){ - drawData("Steps", getSteps(), y+=h); - drawData("HRM", getBpm(), y+=h); - drawData("Battery", E.getBattery() + "%", y+=h); - drawData("Voltage", E.getAnalogVRef().toFixed(2) + "V", y+=h); - drawData("IntTemp.", locale.temp(parseInt(E.getTemperature())), y+=h); - } - - if(screen == 1){ - drawData("Charging?", Bangle.isCharging() ? "Yes" : "No", y+=h); - drawData("Bluetooth", NRF.getSecurityStatus().connected ? "Conn." : "Disconn.", y+=h); - drawData("GPS", Bangle.isGPSOn() ? "On" : "Off", y+=h); - drawData("Compass", Bangle.isCompassOn() ? "On" : "Off", y+=h); - drawData("HRM", Bangle.isHRMOn() ? "On" : "Off", y+=h); - } - - // Static data - if(screen == 2){ - drawData("Firmw.", ENV.VERSION, y+=h); - drawData("Boot.", getVersion("boot.info"), y+=h); - drawData("Settings", getVersion("setting.info"), y+=h); - drawData("Storage", "", y+=h); - drawData(" Total", ENV.STORAGE>>10, y+=h); - drawData(" Free", require("Storage").getFree()>>10, y+=h); - } - - if(Bangle.isLocked()){ - g.setFont("Vector",h-2).setFontAlign(-1,-1); - g.drawString("Locked", 0, H-h+2); - } - + // Bottom + g.drawLine(0,H-h-3,W,H-h-3); + g.drawLine(0,H-h-2,W,H-h-2); + g.setFont("Vector",h-2).setFontAlign(-1,-1); + g.drawString(screens[screen].name, 2, H-h+2); g.setFont("Vector",h-2).setFontAlign(1,-1); - g.drawString((screen+1) + "/3", W, H-h+2); + g.drawString((screen+1) + "/" + screens.length, W, H-h+2); } drawInfo(); @@ -88,14 +134,15 @@ Bangle.on('touch', function(btn, e){ var isRight = e.x > right; if(isRight){ - screen = (screen + 1) % (maxScreen+1); + screen = (screen + 1) % screens.length; } if(isLeft){ screen -= 1; - screen = screen < 0 ? maxScreen : screen; + screen = screen < 0 ? screens.length-1 : screen; } + Bangle.buzz(40, 0.6); drawInfo(); }); @@ -104,5 +151,4 @@ Bangle.on('lock', function(isLocked) { }); Bangle.loadWidgets(); -for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} -// Bangle.drawWidgets(); \ No newline at end of file +Bangle.drawWidgets(); \ No newline at end of file diff --git a/apps/info/metadata.json b/apps/info/metadata.json index f05f0e134..97aeb687a 100644 --- a/apps/info/metadata.json +++ b/apps/info/metadata.json @@ -1,7 +1,7 @@ { "id": "info", "name": "Info", - "version": "0.01", + "version": "0.02", "description": "An application that displays information such as battery level, steps etc.", "icon": "info.png", "type": "app", diff --git a/apps/info/screenshot_1.png b/apps/info/screenshot_1.png index 97d42a89636e01437a6397075db1dc453ca22fe8..25f5b0a8bea17a3edd50da81e9196af01a22756b 100644 GIT binary patch literal 3399 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 BcGmy^ literal 3552 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 diff --git a/apps/info/screenshot_2.png b/apps/info/screenshot_2.png index 2d25dd4e6ce4166d5a6b48ad7f50231bf643cc95..517a83299fe937020cdbd4e427cc4e7de98ae6e0 100644 GIT binary patch literal 3825 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 C7%aU2 literal 3334 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 diff --git a/apps/info/screenshot_3.png b/apps/info/screenshot_3.png index 782e4a1952f1dc3205f20852edf88e9493edd6d8..6802495f5edb75442a3b7e397ddc19bfe8a4710a 100644 GIT binary patch literal 3620 zcmb7HX*ARg`<}&?HEA$pDNEU&cMRDLl_i-h#V|aU8f*5*62=fsWM5*kX6dOI%#5uv z{48(EjIFYabx2akJP(GF{JkIk=l%SCxbN%S=ej@L*SXHQ?sNw`YY{;iK@bQeVsqKz z+7UMYrv&(pdQnKLo-emB7;3Xi{F5sx;# zIIT*4w69>!mwC{V7=U>m9>wyK0!I3p@D?FlpX3dC09aH}64+UcZ@1Kll+TDoxWh4^ z?$R1}tA$HM>aBP>(N(2i>vTfcUy_{|$*e0Gl1u%ncIP?qlzQ2h#fh|m8}s)^|8_bb z?jhj&{7N#J>zp`Vlq}E@$>?LkR^)=UqK5H?K7~f z{dgCdQ_=5X)$>Mfhw(cvi-l`R;fF(Farn>}Q>eQ8tyP=ZjT?zMP;nsmn7C=HlIMye zA6_hUM`;IC!J1XkkAQTb8a64?;{aWdbYiJPzr$J#Ie(AksU$LZf8lJ{o-B?&+U2tP zIi!l<86YL^uAxY17p*Ki{C%UVy1?$5w<9kPr#d;$y$qs$+MxX7t^dxDk`FdyNoRA= zzhtCe{##9vVEDh#x&Tu{Vj%vp^~|b%qrvX{+>7zfYmCe}^o((}3SrYhZX2%h5T46A zj9L0Lk3~5#%K2igfLmWG14bCJwED;VwXhLdf`O7JWKY=Ho@xk)qI7R-j>~j~skv!1Jkv`Bo@jf=~SRT_dQwT%6(= zLVPl*Ks5S;@A1R4khpyf$(!7PhO+;SPALFEc^2*}mIdf~F?2Uxho3 zfK_1{ECtRWEycIds#+xSNoCl5$^QC)T|vSOGl~aS1lm5H0~C?3J1PXIZ0iwY&|GWC zDJ`-%faV$*UuIfGFZ-Mh(!bUHemO}5(E8{J;^FWUlYR@ZSA_FE|g{sEu2RjbX1i$@uKf?CGreS|r z6_~3Bc9G<21XKNZ&DQWyZH#Tkl=n0u(YckxXD|(SF=TB%Xe!ek$31IviJOJ>U|IHc ze1U{9hECD&PFrDelExBPzxuk^vpYU4g|V#d>q7&&fC8~m=B@LA)5C;E^vgM!m{rFp zXEXm*MZ$=~&Y4n}_YQWJiX9ul=A)sR89xI8Z}F#1lbh2`Gz2O{1K>@d`u0T@GbJ$% zlXOLfYjf)E$#hRdAb;VH!ePOnMCrGZ|g5MsvOUDeHd9)1r=phLP3Vl>=ohta;| zL}xDN=Z&7nV1w7-%o9@>Pz_o(5$SWGV^ zd3+@#3Ma%y#DX5#CNbZ9tuy>GqS5+W6Dj?sTV3k7i_%gGZn(2-j+h zM5wd<{kzX+&a2MwKk_M;6b2^xv-PHFl)=5Iw0vE_#h?aNYmNbf%bd|0#n+Bp2NN|c zIC7sq?D~G)Nohz2HP^bdi8N4WtCmRBfob0eMugbOfBV;#8iA!Vzy$GxTamkGFmIGo zXw=G=;)h+Od{eTgAjb_Kez%^?J2>mrl$pLuSgrB$H5>o?GBk5ooF;n4d~7E;$^Mp? zvnQ5SbO5V;{YiQp@r$oLH6O$=tjtW%O8kDKyV-ljc`qjEZRO{lJ^!_gdr-_R&nuBFP4Oegn6-?7h<*vU8X!7q%P9i`X(!f+DDq{>PH-giIckSP&G4 z@lozzc7q6b_Ls{GmOaVu-|gQONCeU~!bU;)asPl^%1bRki6mHF*C>pDWYFb(S@>TX zkAzKU-9gNm!^fNFxKJ&x8_%!I zIdy64^!7gf*WuovH5>i!cU)5#x4(u7U#I5tLR4 zBzBGSE)J~8*M>P#h-Pi(UT@6))qo24G+BAOYDgLv=3V03F2F{r1qqiQL&Rr3G90Xj z?{pN+fUICFC|KV&S7MlB;T8u23X^QcgwMu8tXR!{&F~0!eh}e=v2as z_lY46l&|KS9rE~wd`C?WDts)+>xqA%^mkC4ETKj!q(S)nR#*(rnQsN){O2*e;TL?y z{QBL#IYwJp+fT$dG6fwFvw;$5ZkEx7%{{6F-OTNhHc8$fkliNC6aaevARGkfG(Di6 zj}p?BFw5_G?w13RP9L;;pk^r)W>u=+RL|to90Zt?vT1#C$Q=Q~{%5V}5-dw5*{n9W z=W2~a_H$DF?$l7DUWA!hQVXu?9Z#<5ZQKluqaSic2k*C8b#*rCa#!zRd$qpV33IM| zn@3MB5zX8qejh4SCAD3GmUn*r=futTUUPr&;*Sy^Z~ug#0Gr%*_6u*b^pqPI+<9kj zxf3J_{r?y#1>E!wI!cfeiv?Q{SK(kX0W@!vaN85~FqwRmHr$E!!$RKL&8?6Hv(@-A zGV$z}%0>bRe>YVDg(^BOCdT5(x(*P)n3$(4!)9A3k7@r` z_V0vqAHs4N-^^Ah(D}^!HJr!ry{#Pa*a^*m!y(%pYgx%!yu<1yG12MXleIj#BBNi0 z?}C?I2}-4$lhsX0rd1BF1K^xSY_`r{G860mst{v6RM}?GI|#EkNCguq;cqiU7>x!r zw>dtWi$Q^YAp`YKvV47~b&a56wQS-OWO ze4}Mc*Z<~X-1~)6lohU+_0~q0AfT)vi$py^jn&qRY|t7kedQ#Y&ZUnH1YpQxVE|HA zjtAY+Z&CNKy)1rI$BYs-&YqvDO!J%z$o-8;e{k17xc6#VJGALp1QIKARUi!F2mZdX z$^*Hul?=CfKohPoo5SS0Hd?&O|ADxlP1NY4m3 Qdiy{&mUb467rj&d5BxC2SO5S3 literal 3455 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 Xk+%_!CsMW>72tTx)$W-M?(+Wt^h|>m From eee3a8c0af31ee14697696143f1cf9087ad49624 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 27 Jun 2022 16:36:26 +0200 Subject: [PATCH 2/6] Export a library for other apps --- apps/ha/ChangeLog | 3 +- apps/ha/README.md | 29 +++++++++++++- apps/ha/ha.app.js | 84 +++++----------------------------------- apps/ha/ha.lib.js | 90 +++++++++++++++++++++++++++++++++++++++++++ apps/ha/metadata.json | 3 +- 5 files changed, 132 insertions(+), 77 deletions(-) create mode 100644 apps/ha/ha.lib.js diff --git a/apps/ha/ChangeLog b/apps/ha/ChangeLog index 07afedd21..e78b4ccd0 100644 --- a/apps/ha/ChangeLog +++ b/apps/ha/ChangeLog @@ -1 +1,2 @@ -0.01: Release \ No newline at end of file +0.01: Release +0.02: Includeas the ha.lib.js library that can be used by other apps or clocks. \ No newline at end of file diff --git a/apps/ha/README.md b/apps/ha/README.md index 8005421f1..654a262c8 100644 --- a/apps/ha/README.md +++ b/apps/ha/README.md @@ -1,13 +1,15 @@ # Home Assistant This app integrates your BangleJs into the HomeAssistant. + # How to use Click on the left and right side of the screen to select the triggers that you configured. Click in the middle of the screen to send the trigger to HomeAssistant. ![](screenshot.png) -# First Setup + +# Initial Setup 1.) First of all, make sure that HomeAssistant and the HomeAssistant Android App works. 2.) Open your BangleJs Gadgetbridge App, click on the Settings icon of your BangleJs and enable "Allow Intent Access" @@ -22,6 +24,7 @@ configured. Click in the middle of the screen to send the trigger to HomeAssista This setup must be done only once -- now you are ready to configure your BangleJS to control some devices or entities in your HomeAssistant :) + # Setup Trigger 1.) Upload the app and all corresponding triggers through the AppStore UI. You must specify the display name, the trigger as well as an icon. @@ -38,12 +41,36 @@ The following icons are currently supported: 3.) Don't forget to select the action that should be executed at the bottom of each automation. + # Default Trigger This app also implements two default trigger that can always be used: - APP_STARTED -- Will be sent whenever the app is started. So you could do some actions already when the app is sarted without the need of any user interaction. - TRIGGER -- Will be sent whenever some trigger is executed. So you could generically listen to that. +# How to use the library (ha.lib.js) in my own app/clk +This app inlcludes a library that can be used by other apps or clocks +to read all configured intents or to send a trigger. Example code: + +```js +// First of all impport the library +var ha = require("ha.lib.js"); + +// You can read all triggers that a user configured simply via +var triggers = ha.getTriggers(); + +// Get display name and icon of trigger +var display = triggers[0].display; +var icon = triggers[0].getIcon(); + +// Trigger the first configured trigger +ha.sendTrigger(triggers[0].trigger); + +// Send a custom trigger that is not configured by a user +ha.sendTrigger("MY_CUSTOM_TRIGGER"); +``` + + # FAQ ## Sometimes the trigger is not executed diff --git a/apps/ha/ha.app.js b/apps/ha/ha.app.js index 85f926138..9ad8db8fa 100644 --- a/apps/ha/ha.app.js +++ b/apps/ha/ha.app.js @@ -1,72 +1,10 @@ -var storage = require("Storage"); +/** + * This app uses the ha library to send trigger to HomeAssistant. + */ +var ha = require("ha.lib.js"); var W = g.getWidth(), H = g.getHeight(); var position=0; - - -// Note: All icons should have 48x48 pixels -function getIcon(icon){ - if(icon == "light"){ - return { - width : 48, height : 48, bpp : 1, - transparent : 0, - buffer : require("heatshrink").decompress(atob("AAMBwAFE4AFDgYFJjgFBnAFBjwXBvAFBh4jBuAFCAQPwAQMHAQPgEQQCBEgcf/AvDn/8Aof//5GDAoJOBh+BAoOB+EP8YFB4fwgfnAoPnGANHAoPjHYQFBHYQFd44pDg47C4/gh/DIIZNFLIplGgF//wFIgZ9BRIUHRII7Ch4FBUIUOAoKzCjwFEhgCBmDpIVooFFh4oCAA4LFC5b7BAob1BAYI=")) - }; - } else if(icon == "door"){ - return { - width : 48, height : 48, bpp : 1, - transparent : 0, - buffer : require("heatshrink").decompress(atob("AAM4Aok/4AED///Aov4Aon8DgQGBAv4FpnIFKJv4FweAQFFAgQFB8AFDnADC")) - }; - } else if (icon == "fire"){ - return { - width : 48, height : 48, bpp : 1, - transparent : 0, - buffer : require("heatshrink").decompress(atob("ABsDAokBwAFE4AFE8AFE+AFE/AFJgf8Aon+AocHAokP/8QAokYAoUfAok//88ApF//4kDAo//AgMQAgIFCjgFEjwFCOYIFFHQIFDn/+AoJ/BAoIqBAoN//xCBAoI5BDIPAgP//gFB8AFChYFBgf//EJAogOBAoSgBAoMHAQIFEFgXAAoJEBv4FCNoQFGVYd/wAFEYYIFIvwCBDoV8UwQCBcgUPwDwDfQMBaIYADA")) - }; - } - - // Default is always the HA icon - return { - width : 48, height : 48, bpp : 1, - transparent : 0, - buffer : require("heatshrink").decompress(atob("AD8BwAFDg/gAocP+AFDj4FEn/8Aod//wFD/1+FAf4j+8AoMD+EPDAUH+OPAoUP+fPAoUfBYk/C4l/EYIwC//8n//FwIFEgYFD4EH+E8nkP8BdBAonjjk44/wj/nzk58/4gAFDF4PgCIMHAoPwhkwh4FB/EEkEfIIWAHwIFC4A+BAoXgg4FDL4IFDL4IFDLIYFkAEQA==")) - }; -} - -// Try to read custom actions, otherwise use default -var triggers = [ - {display: "Not found.", trigger: "NOP", icon: "ha"}, -]; - -try{ - triggers = storage.read("ha.trigger.json"); - triggers = JSON.parse(triggers); -} catch(e) { - // In case there are no user triggers yet, we show the default... -} - - -function sendIntent(trigger){ - var retries=3; - - while(retries > 0){ - try{ - // Send a startup trigger such that we could also execute - // an action when the app is started :) - Bluetooth.println(JSON.stringify({ - t:"intent", - action:"com.espruino.gadgetbridge.banglejs.HA", - extra:{ - trigger: trigger - }}) - ); - retries = -1; - - } catch(e){ - retries--; - } - } -} +var triggers = ha.getTriggers(); function draw() { @@ -78,7 +16,7 @@ function draw() { var w = g.stringWidth(trigger.display); g.setFontAlign(-1,-1); - var icon = getIcon(trigger.icon); + var icon = ha.getIcon(trigger.getIcon()); g.setColor(g.theme.fg).drawImage(icon, 12, H/5-2); g.drawString("Home", icon.width + 20, H/5); g.drawString("Assistant", icon.width + 18, H/5+24); @@ -112,13 +50,9 @@ Bangle.on('touch', function(btn, e){ } if(!isRight && !isLeft){ - - // Send a default intent that we triggered something. - sendIntent("TRIGGER"); - // Now send the selected trigger Bangle.buzz(80, 0.6).then(()=>{ - sendIntent(triggers[position].trigger); + ha.sendTrigger(triggers[position].trigger); setTimeout(()=>{ Bangle.buzz(80, 0.6); }, 250); @@ -126,12 +60,14 @@ Bangle.on('touch', function(btn, e){ } }); + // Send intent that the we started the app. -sendIntent("APP_STARTED"); +ha.sendTrigger("APP_STARTED"); // Next load the widgets and draw the app Bangle.loadWidgets(); Bangle.drawWidgets(); +// Draw app draw(); setWatch(_=>load(), BTN1); diff --git a/apps/ha/ha.lib.js b/apps/ha/ha.lib.js new file mode 100644 index 000000000..0de98d62a --- /dev/null +++ b/apps/ha/ha.lib.js @@ -0,0 +1,90 @@ +/** + * This library can be used to read all triggers that a user + * configured and send a trigger to homeassistant. + */ +function _getIcon(trigger){ + icon = trigger.icon; + if(icon == "light"){ + return { + width : 48, height : 48, bpp : 1, + transparent : 0, + buffer : require("heatshrink").decompress(atob("AAMBwAFE4AFDgYFJjgFBnAFBjwXBvAFBh4jBuAFCAQPwAQMHAQPgEQQCBEgcf/AvDn/8Aof//5GDAoJOBh+BAoOB+EP8YFB4fwgfnAoPnGANHAoPjHYQFBHYQFd44pDg47C4/gh/DIIZNFLIplGgF//wFIgZ9BRIUHRII7Ch4FBUIUOAoKzCjwFEhgCBmDpIVooFFh4oCAA4LFC5b7BAob1BAYI=")) + }; + } else if(icon == "door"){ + return { + width : 48, height : 48, bpp : 1, + transparent : 0, + buffer : require("heatshrink").decompress(atob("AAM4Aok/4AED///Aov4Aon8DgQGBAv4FpnIFKJv4FweAQFFAgQFB8AFDnADC")) + }; + } else if (icon == "fire"){ + return { + width : 48, height : 48, bpp : 1, + transparent : 0, + buffer : require("heatshrink").decompress(atob("ABsDAokBwAFE4AFE8AFE+AFE/AFJgf8Aon+AocHAokP/8QAokYAoUfAok//88ApF//4kDAo//AgMQAgIFCjgFEjwFCOYIFFHQIFDn/+AoJ/BAoIqBAoN//xCBAoI5BDIPAgP//gFB8AFChYFBgf//EJAogOBAoSgBAoMHAQIFEFgXAAoJEBv4FCNoQFGVYd/wAFEYYIFIvwCBDoV8UwQCBcgUPwDwDfQMBaIYADA")) + }; + } + + // Default is always the HA icon + return { + width : 48, height : 48, bpp : 1, + transparent : 0, + buffer : require("heatshrink").decompress(atob("AD8BwAFDg/gAocP+AFDj4FEn/8Aod//wFD/1+FAf4j+8AoMD+EPDAUH+OPAoUP+fPAoUfBYk/C4l/EYIwC//8n//FwIFEgYFD4EH+E8nkP8BdBAonjjk44/wj/nzk58/4gAFDF4PgCIMHAoPwhkwh4FB/EEkEfIIWAHwIFC4A+BAoXgg4FDL4IFDL4IFDLIYFkAEQA==")) + }; +} + +exports.getTriggers = function(){ + var triggers = [ + {display: "Empty", trigger: "NOP", icon: "ha"}, + ]; + + try{ + triggers = require("Storage").read("ha.trigger.json"); + triggers = JSON.parse(triggers); + + // We lazy load all icons, otherwise, we have to keep + // all the icons n times in memory which can be + // problematic for embedded devices. Therefore, + // we lazy load icons only if needed using the getIcon + // method of each trigger... + triggers.forEach(trigger => { + trigger.getIcon = function(){ + return _getIcon(trigger); + } + }) + } catch(e) { + // In case there are no user triggers yet, we show the default... + } + + return triggers; +} + +exports.sendTrigger = function(triggerName){ + var retries=3; + + while(retries > 0){ + try{ + // First send a generic trigger which can be used + // to listen to all trigger send. + Bluetooth.println(JSON.stringify({ + t:"intent", + action:"com.espruino.gadgetbridge.banglejs.HA", + extra:{ + trigger: "TRIGGER" + }}) + ); + + // Now lets send the trigger that we sould send. + Bluetooth.println(JSON.stringify({ + t:"intent", + action:"com.espruino.gadgetbridge.banglejs.HA", + extra:{ + trigger: triggerName + }}) + ); + retries = -1; + + } catch(e){ + retries--; + } + } +} \ No newline at end of file diff --git a/apps/ha/metadata.json b/apps/ha/metadata.json index 0f9929d8c..63308b933 100644 --- a/apps/ha/metadata.json +++ b/apps/ha/metadata.json @@ -1,7 +1,7 @@ { "id": "ha", "name": "HomeAssistant", - "version": "0.01", + "version": "0.02", "description": "Integrates your BangleJS into HomeAssistant.", "icon": "ha.png", "type": "app", @@ -19,6 +19,7 @@ ], "storage": [ {"name":"ha.app.js","url":"ha.app.js"}, + {"name":"ha.lib.js","url":"ha.lib.js"}, {"name":"ha.img","url":"ha.icon.js","evaluate":true} ] } From 69f4aa13957035305a1f7067cc04bc212a22598c Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 27 Jun 2022 16:46:40 +0200 Subject: [PATCH 3/6] Minor fixes --- apps/ha/ha.app.js | 4 +++- apps/ha/ha.lib.js | 10 ---------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/apps/ha/ha.app.js b/apps/ha/ha.app.js index 9ad8db8fa..d9199fb0e 100644 --- a/apps/ha/ha.app.js +++ b/apps/ha/ha.app.js @@ -16,7 +16,7 @@ function draw() { var w = g.stringWidth(trigger.display); g.setFontAlign(-1,-1); - var icon = ha.getIcon(trigger.getIcon()); + var icon = trigger.getIcon(); g.setColor(g.theme.fg).drawImage(icon, 12, H/5-2); g.drawString("Home", icon.width + 20, H/5); g.drawString("Assistant", icon.width + 18, H/5+24); @@ -50,6 +50,8 @@ Bangle.on('touch', function(btn, e){ } if(!isRight && !isLeft){ + ha.sendTrigger("TRIGGER"); + // Now send the selected trigger Bangle.buzz(80, 0.6).then(()=>{ ha.sendTrigger(triggers[position].trigger); diff --git a/apps/ha/ha.lib.js b/apps/ha/ha.lib.js index 0de98d62a..b09cbeab2 100644 --- a/apps/ha/ha.lib.js +++ b/apps/ha/ha.lib.js @@ -63,16 +63,6 @@ exports.sendTrigger = function(triggerName){ while(retries > 0){ try{ - // First send a generic trigger which can be used - // to listen to all trigger send. - Bluetooth.println(JSON.stringify({ - t:"intent", - action:"com.espruino.gadgetbridge.banglejs.HA", - extra:{ - trigger: "TRIGGER" - }}) - ); - // Now lets send the trigger that we sould send. Bluetooth.println(JSON.stringify({ t:"intent", From 5c6952a26012c4991b5c9a888cc48589098ef6d5 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 27 Jun 2022 17:41:43 +0200 Subject: [PATCH 4/6] Integrate HomeAssistant into BW Clock --- apps/bwclk/ChangeLog | 3 +- apps/bwclk/README.md | 1 + apps/bwclk/app.js | 71 +++++++++++++++++++++++++++++------- apps/bwclk/metadata.json | 4 +- apps/bwclk/screenshot_4.png | Bin 0 -> 3389 bytes 5 files changed, 63 insertions(+), 16 deletions(-) create mode 100644 apps/bwclk/screenshot_4.png diff --git a/apps/bwclk/ChangeLog b/apps/bwclk/ChangeLog index ecd0c355f..f9bc5e65a 100644 --- a/apps/bwclk/ChangeLog +++ b/apps/bwclk/ChangeLog @@ -6,4 +6,5 @@ 0.06: Design and usability improvements. 0.07: Improved positioning. 0.08: Select the color of widgets correctly. Additional settings to hide colon. -0.09: Larger font size if colon is hidden to improve readability further. \ No newline at end of file +0.09: Larger font size if colon is hidden to improve readability further. +0.10: HomeAssistant integration if HomeAssistant is installed. \ No newline at end of file diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index f6a1c6522..190488d6b 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -7,6 +7,7 @@ - Tab left/right of screen to show steps, temperature etc. - Enable / disable lock icon in the settings. - If the "sched" app is installed tab top / bottom of the screen to set the timer. +- If HomeAssistant is installed, triggers are shown. Simple select the trigger and touch the middle of the screen to send the trigger to HomeAssistant. - The design is adapted to the theme of your bangle. - The colon (e.g. 7:35 = 735) can be hidden now in the settings. diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 5bfec4097..73cd6c35f 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -62,7 +62,12 @@ Graphics.prototype.setMediumFont = function(scale) { Graphics.prototype.setSmallFont = function(scale) { // Actual height 28 (27 - 0) - this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//84D//zgP/+GAAAAAAAAAAAAAAAAAAAD4AAAPgAAA+AAAAAAAAAAAAA+AAAD4AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAg4AAHDgAAcOCABw54AHD/gAf/8AD/8AB//gAP8OAA9w4YCHD/gAcf+AB//gAf/gAP/uAA/w4ADnDgAAcOAABw4AAHAAAAcAAAAAAAAAAAAAAAIAA+A4AH8HwA/4PgHjgOAcHAcBwcBw/BwH78DgfvwOB8HA4HAOBw8A+HngB4P8ADgfgAAAYAAAAAAAAAAB4AAAf4AQB/gDgOHAeA4cDwDhweAOHDwA88eAB/nwAD88AAAHgAAA8AAAHn4AA8/wAHnvgA8cOAHhg4A8GDgHgcOA8B74BgD/AAAH4AAAAAAAAAAAAAAAAAMAAAH8AD8/4Af/3wB/8HgODwOA4HA4DgODgOAcOA4A44DwDzgHAH8AMAPwAQP+AAA/8AAAB4AAADAAAAAA+AAAD4AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AD//+A/+/+H4AD98AAB3gAADIAAAAAAAAAAAAAIAAABwAAAXwAAHPwAB8P8D/gP//4AH/8AAAAAAAAAAAAAAAAAAAAAAAAGAAAA4gAAB/AAAH8AAD/AAAP8AAAH4AAAfwAADiAAAOAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAD/+AAP/4AABgAAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAAAADkAAAPwAAA/AAAAAAAAAAAAAAAAAAAAAAAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAAAAAAAAAAAAADgAAAOAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAA4AAA/gAA/+AA//AA//AAP/AAA/AAADAAAAAAAAAAAAAAAAAAA//gAP//gB///AHgA8A8AB4DgADgOAAOA4AA4DgADgPAAeAeADwB///AD//4AD/+AAAAAAAAAAAAAAAA4AAAHgAAAcAAADwAAAP//+A///4D///gAAAAAAAAAAAAAAAAAAAAAAYAeADgD4AeAfAD4DwAfgOAD+A4Ae4DgDzgOAeOA4Dw4DweDgH/wOAP+A4AfwDgAAAAAAAAAAAAIAOAA4A4ADwDggHAOHgOA48A4DnwDgO/AOA7uA4D84HgPh/8A8H/gDgH8AAACAAAAAAAAAAAAAHgAAB+AAA/4AAP7gAD+OAA/g4AP4DgA+AOADAA4AAB/+AAH/4AAf/gAADgAAAOAAAAAAAAAAAAAAAAD4cAP/h4A/+HwDw4HgOHAOA4cA4DhwDgOHAOA4cA4Dh4HAOD58A4H/gAAP8AAAGAAAAAAAAAAAAAAAAD/+AAf/8AD//4AePDwDw4HgOHAOA4cA4DhwDgOHAOA4cB4Bw8PAHD/8AIH/gAAH4AAAAAAAAAADgAAAOAAAA4AAYDgAHgOAD+A4B/wDgf4AOP+AA7/AAD/gAAP4AAA8AAAAAAAAAAAAAAAAAAeH8AD+/4Af//wDz8HgOHgOA4OA4Dg4DgODgOA4eA4Dz8HgH//8AP7/gAeH8AAAAAAAAAAAAAAAA+AAAH+AgB/8HAHh4cA8Dg4DgODgOAcOA4Bw4DgODgPA4eAeHDwB///AD//4AD/+AAAAAAAAAAAAAAAAAAAAAAAAAAODgAA4OAADg4AAAAAAAAAAAAAAAAAAAAAAAAAAAAABwA5AHAD8AcAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAB8AAAP4AAB5wAAPDgAB4HAAHAOAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAEAAcA4AB4HAADw4AADnAAAH4AAAPAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAB8AAAHgAAA4AAADgDzgOA/OA4D84DgeAAPHwAAf+AAA/wAAB8AAAAAAAAAAAAAAAAAAD+AAB/+AAP/8AB4B4AOABwBwADgHB8OA4P4cDhxxwMGDDAwYMMDBgwwOHHHA4f4cDh/xwHAHCAcAMAA8AwAB8PAAD/4AAD/AAAAAAAAAAAAAACAAAB4AAB/gAA/8AAf+AAP/wAH/nAA/gcADwBwAPwHAA/4cAA/9wAAf/AAAP/AAAD/gAAB+AAAA4AAAAAAAAAAAAAAD///gP//+A///4DgcDgOBwOA4HA4DgcDgOBwOA4HA4Dg8DgPHwOAf/h4A///AB8f4AAAfAAAAAAAP+AAD/+AAf/8AD4D4AeADwBwAHAOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOAcABwB4APAD4D4AHgPAAOA4AAAAAAAAAAAAAAAP//+A///4D///gOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOA8AB4BwAHAHwB8AP//gAP/4AAP+AAAAAAAAAAAAAAAA///4D///gP//+A4HA4DgcDgOBwOA4HA4DgcDgOBwOA4HA4DgcDgOBgOA4AA4AAAAAAAAAAAAAAD///gP//+A///4DgcAAOBwAA4HAADgcAAOBwAA4HAADgcAAOAwAA4AAAAAAAAAf+AAD/+AA//+ADwB4AeADwDwAHgOAAOA4AA4DgADgOAAOA4AA4DgMDgPAweAcDBwB8MfADw/4AHD/AAAPwAAAAAAAAAAAAAAAP//+A///4D///gABwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAHAAAAcAAABwAA///4D///gP//+AAAAAAAAAAAAAAAAAAAD///gP//+A///4AAAAAAAAAAAADgAAAPAAAA+AAAA4AAADgAAAOAAAA4AAAHgP//8A///wD//8AAAAAAAAAAAAAAAAAAAA///4D///gP//+AAHAAAA+AAAP8AAB54AAPDwAB4HgAPAPAB4AfAPAA+A4AA4DAABgAAACAAAAAAAAAAP//+A///4D///gAAAOAAAA4AAADgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAAAAAAAAAAAAP//+A///4D///gD+AAAD+AAAB+AAAB/AAAB/AAAB/AAAB+AAAH4AAB+AAA/gAAP4AAD+AAA/AAAfwAAD///gP//+A///4AAAAAAAAAAAAAAAAAAAP//+A///4D///gHwAAAPwAAAPgAAAfgAAAfAAAAfAAAA/AAAA+AAAB+AAAB8A///4D///gP//+AAAAAAAAAAAP+AAD/+AAf/8AD4D4AeADwBwAHAOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOAcABwB4APAD4D4AH//AAP/4AAP+AAAAAAAAAAAP//+A///4D///gOAcAA4BwADgHAAOAcAA4BwADgHAAOAcAA4DgAD4eAAH/wAAP+AAAPgAAAAAAAA/4AAP/4AB//wAPgPgB4APAHAAcA4AA4DgADgOAAOA4AA4DgADgOAAOA4AO4BwA/AHgB8APgPwAf//gA//uAA/4QAAAAAAAAAA///4D///gP//+A4BwADgHAAOAcAA4BwADgHAAOAcAA4B8ADgP8APh/8Af/H4A/4HgA+AGAAAAAAAAAAAABgAHwHAA/g+AH/A8A8cBwDg4DgODgOA4OA4DgcDgOBwOA4HA4DwODgHg4cAPh/wAcH+AAwPwAAAAADgAAAOAAAA4AAADgAAAOAAAA4AAAD///gP//+A///4DgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAAAAAAAAAAAAAAAP//AA///AD//+AAAB8AAABwAAADgAAAOAAAA4AAADgAAAOAAAA4AAAHgAAA8A///gD//8AP//gAAAAAAAAAAIAAAA8AAAD+AAAH/AAAD/wAAB/4AAA/8AAAf4AAAPgAAB+AAA/4AAf+AAP/AAH/gAD/wAAP4AAA4AAAAAAAAPAAAA/gAAD/4AAA/+AAAf/AAAH/gAAB+AAAf4AAf/AAf/AAP/gAD/gAAPwAAA/4AAA/+AAAf/AAAH/wAAB/gAAB+AAB/4AA/+AA/+AA/+AAD/AAAPAAAAgAAAAAAAAMAAGA4AA4D4APgHwB8APwfAAPn4AAf+AAAfwAAB/AAAf+AAD4+AA/B8AHwB8A+AD4DgADgMAAGAwAAADwAAAPwAAAPwAAAfgAAAfgAAAf/4AAf/gAH/+AB+AAAPwAAD8AAA/AAADwAAAMAAAAgAAAAAAAAMAACA4AA4DgAPgOAD+A4Af4DgH7gOB+OA4Pw4Dj8DgO/AOA/4A4D+ADgPgAOA4AA4DAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////////gAAAOAAAA4AAADAAAAAAAAAAAAAAAAAAAAAAA4AAAD+AAAP/gAAH/4AAB/+AAAf+AAAH4AAABgAAAAAAAAADAAAAOAAAA4AAADgAAAP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADgAAAcAAADgAAAcAAADgAAAcAAAB4AAADwAAADgAAAHAAAAOAAAAYAAAAAAAAAAAAAAAAAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAHH8AA8/4AHzjgAcMOABxwYAHHBgAccOABxwwAHGHAAP/4AA//4AA//gAAAAAAAAAAAAAAAAAAA///4D///gP//+AA4BwAHADgAcAOABwA4AHADgAcAOAB4B4ADwPAAP/8AAf/AAAf4AAAAAAAAAAAAPwAAD/wAAf/gADwPAAeAeABwA4AHADgAcAOABwA4AHADgAeAeAA8DwABwOAADAwAAAAAAAAAAAA/AAAP/AAD//AAPA8AB4B4AHADgAcAOABwA4AHADgAcAOAA4BwD///gP//+A///4AAAAAAAAAAAAAAAAPwAAD/wAAf/gAD2PAAeYeABxg4AHGDgAcYOABxg4AHGDgAeYeAA/jwAB+OAAD4wAABgAAAAAAAAAAABgAAAGAAAB//+Af//4D///gPcAAA5gAADGAAAMYAAAAAAAAAPwAAD/wMA//w4DwPHgeAePBwA4cHADhwcAOHBwA4cHADhwOAcPB///4H///Af//wAAAAAAAAAAAAAAAAAAD///gP//+AA//4ADgAAAcAAABwAAAHAAAAcAAABwAAAHgAAAP/+AAf/4AA//gAAAAAAAAAAAAAAMf/+A5//4Dn//gAAAAAAAAAAAAAAAAAAHAAAAfn///+f//+5///wAAAAAAAAAAAAAAAAAAP//+A///4D///gAAcAAAD8AAAf4AADzwAAeHgAHwPAAeAeABgA4AEABgAAAAAAAAAD///gP//+A///4AAAAAAAAAAAAAAAAAAAAf/+AB//4AH//gAOAAABwAAAHAAAAcAAABwAAAHgAAAP/+AA//4AB//gAOAAABwAAAHAAAAcAAABwAAAHgAAAf/+AA//4AA//gAAAAAAAAAAAAAAAf/+AB//4AD//gAOAAABwAAAHAAAAcAAABwAAAHAAAAeAAAA//4AB//gAD/+AAAAAAAAAAAAAAAAD8AAA/8AAH/4AA8DwAHgHgAcAOABwA4AHADgAcAOABwA4AHgHgAPh8AAf/gAA/8AAA/AAAAAAAAAAAAAAAAB///8H///wf///A4BwAHADgAcAOABwA4AHADgAcAOAB4B4ADwPAAP/8AAf/AAAf4AAAAAAAAAAAAPwAAD/wAA//wADwPAAeAeABwA4AHADgAcAOABwA4AHADgAOAcAB///8H///wf///AAAAAAAAAAAAAAAAAAAH//gAf/+AB//4ADwAAAcAAABwAAAHAAAAcAAAAAAAAAAMAAHw4AA/jwAH+HgAcYOABxw4AHHDgAcMOABw44AHjjgAPH+AA8fwAAw+AAAAAABgAAAGAAAAcAAAf//wB///AH//+ABgA4AGADgAYAOABgA4AAAAAAAAAAAAAAAH/AAAf/wAB//wAAB/AAAAeAAAA4AAADgAAAOAAAA4AAADgAAAcAB//4AH//gAf/+AAAAAAAAAAAAAAABwAAAH4AAAf8AAAP8AAAH+AAAD+AAAD4AAA/gAAf8AAP+AAH/AAAfgAABwAAAAAAAAAAAABwAAAH8AAAf+AAAP/gAAD/gAAB+AAAf4AAP8AAP+AAB/AAAH4AAAf8AAAP+AAAD/gAAB+AAAf4AAf/AAP/AAB/gAAHgAAAQAAABAAIAHADgAeAeAA8HwAB8+AAD/gAAD8AAAPwAAD/gAAfPgADwfAAeAeABwA4AEAAgAAAAABAAAAHgAAAfwAAA/wAAAf4BwAP4/AAP/8AAP+AAD/AAB/wAA/4AAP8AAB+AAAHAAAAQAAAAAAIAHADgAcAeABwD4AHA/gAcHuABx84AHPDgAf4OAB/A4AHwDgAeAOABgA4AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAH4Af//////n//AAAA4AAADgAAAAAAAAAAAAAAAAAP//+A///4D///gAAAAAAAAAAAAAAAAAAA4AAADgAAAOAAAA//5/9////wAH4AAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAeAAAD4AAAOAAAA4AAADgAAAHAAAAcAAAA4AAADgAAAOAAAD4AAAPAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"), 32, atob("BgkMGhEZEgYMDAwQCAwICxILEBAREBEOEREJCREVEQ8ZEhEUExAOFBQHDREPGBMUERQSEhEUERsREBIMCwwTEg4QERAREQoREQcHDgcYEREREQoPDBEPFg8PDwwIDBMc"), 28+(scale<<8)+(1<<16)); + this.setFontCustom( + E.toString(require('heatshrink').decompress(atob('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'))), + 32, + atob("BgkMGhEZEgYMDAwQCAwICxILEBAREBEOEREJCREVEQ8ZEhEUExAOFBQHDREPGBMUERQSEhEUERsREBIMCwwTEg4QERAREQoREQcHDgcYEREREQoPDBEPFg8PDwwIDBMcCgoAAAAAAAAAAAAAACERESEAAAAAAAAAAAAAAAAhIQAGCRAQEhAIDw8XCQ8RABIODRELCw4REwcLCQoPHBscDxISEhISEhoUEBAQEAcHBwcTExQUFBQUDhQUFBQUEBEREBAQEBAQGhARERERBwcHBxAREREREREPEREREREPEQ8="), + 28+(scale<<8)+(1<<16) + ); return this; }; @@ -123,25 +128,43 @@ var imgWatch = { /* * INFO ENTRIES + * List of [Data, Icon, left/right, HomeAssistant Trigger] */ var infoArray = [ - function(){ return [ null, null, "left" ] }, - function(){ return [ "Bangle", imgWatch, "right" ] }, - function(){ return [ E.getBattery() + "%", imgBattery, "left" ] }, - function(){ return [ getSteps(), imgSteps, "left" ] }, - function(){ return [ Math.round(Bangle.getHealthStatus("last").bpm) + " bpm", imgBpm, "left"] }, - function(){ return [ getWeather().temp, imgTemperature, "left" ] }, - function(){ return [ getWeather().wind, imgWind, "left" ] }, + function(){ return [ null, null, "left", null ] }, + function(){ return [ "Bangle", imgWatch, "right", null ] }, + function(){ return [ E.getBattery() + "%", imgBattery, "left", null ] }, + function(){ return [ getSteps(), imgSteps, "left", null ] }, + function(){ return [ Math.round(Bangle.getHealthStatus("last").bpm) + " bpm", imgBpm, "left", null] }, + function(){ return [ getWeather().temp, imgTemperature, "left", null ] }, + function(){ return [ getWeather().wind, imgWind, "left", null ] }, ]; + +/* + * We append the HomeAssistant integrations if HomeAssistant is available + */ +try{ + var triggers = require("ha.lib.js").getTriggers(); + triggers.forEach(trigger => { + infoArray.push(function(){ + return [trigger.display, trigger.getIcon(), "left", trigger.trigger] + }); + }) +} catch(ex){ + // Nothing to do if HomeAssistant is not available... +} const NUM_INFO=infoArray.length; function getInfoEntry(){ if(isAlarmEnabled()){ - return [getAlarmMinutes() + " min.", imgTimer, "left"] + return [getAlarmMinutes() + " min.", imgTimer, "left", null] } else if(Bangle.isCharging()){ - return [E.getBattery() + "%", imgCharging, "left"] + return [E.getBattery() + "%", imgCharging, "left", null] } else{ + // In case the user removes HomeAssistant entries, showInfo + // could be larger than infoArray.length... + settings.showInfo = settings.showInfo % infoArray.length; return infoArray[settings.showInfo](); } } @@ -351,12 +374,14 @@ function drawTime(){ g.setSmallFont(); var imgWidth = 0; if(infoImg !== undefined){ - imgWidth = infoImg.width; + imgWidth = 26.0; var strWidth = g.stringWidth(infoStr); + var scale = imgWidth / infoImg.width; g.drawImage( infoImg, - W/2 + (printImgLeft ? -strWidth/2-2 : strWidth/2+2) - infoImg.width/2, - y - infoImg.height/2 + W/2 + (printImgLeft ? -strWidth/2-2 : strWidth/2+2) - parseInt(imgWidth/2), + y - parseInt(imgWidth/2), + { scale: scale } ); } g.drawString(infoStr, printImgLeft ? W/2 + imgWidth/2 + 2 : W/2 - imgWidth/2 - 2, y+3); @@ -429,6 +454,7 @@ Bangle.on('touch', function(btn, e){ var is_right = e.x > right; var is_upper = e.y < upper; var is_lower = e.y > lower; + var is_center = !is_upper && !is_lower && !is_left && !is_right; if(is_upper){ Bangle.buzz(40, 0.6); @@ -454,6 +480,25 @@ Bangle.on('touch', function(btn, e){ settings.showInfo = settings.showInfo < 0 ? NUM_INFO-1 : settings.showInfo; drawTime(); } + + if(is_center){ + var infoEntry = getInfoEntry(); + var trigger = infoEntry[3]; + if(trigger != null){ + try{ + require("ha.lib.js").sendTrigger("TRIGGER_BW"); + Bangle.buzz(80, 0.6).then(()=>{ + require("ha.lib.js").sendTrigger(trigger); + setTimeout(()=>{ + Bangle.buzz(80, 0.6); + }, 250); + }); + }catch(ex){ + print(ex); + // Without ha -> nop. + } + } + } }); diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index eba1449a6..95fb7e608 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -1,11 +1,11 @@ { "id": "bwclk", "name": "BW Clock", - "version": "0.09", + "version": "0.10", "description": "BW Clock.", "readme": "README.md", "icon": "app.png", - "screenshots": [{"url":"screenshot.png"}, {"url":"screenshot_2.png"}, {"url":"screenshot_3.png"}], + "screenshots": [{"url":"screenshot.png"}, {"url":"screenshot_2.png"}, {"url":"screenshot_3.png"}, {"url":"screenshot_4.png"}], "type": "clock", "tags": "clock", "supports": ["BANGLEJS2"], diff --git a/apps/bwclk/screenshot_4.png b/apps/bwclk/screenshot_4.png new file mode 100644 index 0000000000000000000000000000000000000000..3807d47ada1c1ba4019334828a2212f03dfc0ccf GIT binary patch literal 3389 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 T`UAS(00000NkvXXu0mjfqzXj@ literal 0 HcmV?d00001 From 0a3222eae34b229b79e25bba0a8bad7cfa21c65b Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 27 Jun 2022 17:45:42 +0200 Subject: [PATCH 5/6] Improved stability --- apps/bwclk/app.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 73cd6c35f..60898dbe0 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -503,7 +503,11 @@ Bangle.on('touch', function(btn, e){ E.on("kill", function(){ - storage.write(SETTINGS_FILE, settings); + try{ + storage.write(SETTINGS_FILE, settings); + } catch(ex){ + // If this fails, we still kill the app... + } }); From 86af82dd068404ab2094bdfc90537c4f442cc548 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 27 Jun 2022 17:59:15 +0200 Subject: [PATCH 6/6] Lazy load images to improve memory consumption. --- apps/bwclk/app.js | 126 ++++++++++++++++++++++++++-------------------- 1 file changed, 72 insertions(+), 54 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 60898dbe0..4b7deb21e 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -71,59 +71,77 @@ Graphics.prototype.setSmallFont = function(scale) { return this; }; -var imgLock = { - width : 16, height : 16, bpp : 1, - transparent : 0, - buffer : E.toArrayBuffer(atob("A8AH4A5wDDAYGBgYP/w//D/8Pnw+fD58Pnw//D/8P/w=")) -}; +function imgLock(){ + return { + width : 16, height : 16, bpp : 1, + transparent : 0, + buffer : E.toArrayBuffer(atob("A8AH4A5wDDAYGBgYP/w//D/8Pnw+fD58Pnw//D/8P/w=")) + } +} -var imgSteps = { - width : 24, height : 24, bpp : 1, - transparent : 1, - buffer : require("heatshrink").decompress(atob("/H///wv4CBn4CD8ACCj4IBj8f+Eeh/wjgCBngCCg/4nEH//4h/+jEP/gRBAQX+jkf/wgB//8GwP4FoICDHgICCBwIA==")) -}; +function imgSteps(){ + return { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/H///wv4CBn4CD8ACCj4IBj8f+Eeh/wjgCBngCCg/4nEH//4h/+jEP/gRBAQX+jkf/wgB//8GwP4FoICDHgICCBwIA==")) + } +} -var imgBattery = { - width : 24, height : 24, bpp : 1, - transparent : 1, - buffer : require("heatshrink").decompress(atob("/4AN4EAg4TBgd///9oEAAQv8ARQRDDQQgCEwQ4OA")) -}; +function imgBattery(){ + return { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/4AN4EAg4TBgd///9oEAAQv8ARQRDDQQgCEwQ4OA")) + } +} -var imgBpm = { - width : 24, height : 24, bpp : 1, - transparent : 1, - buffer : require("heatshrink").decompress(atob("/4AOn4CD/wCCjgCCv/8jF/wGYgOA5MB//BC4PDAQnjAQPnAQgANA")) -}; +function imgBpm() { + return { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/4AOn4CD/wCCjgCCv/8jF/wGYgOA5MB//BC4PDAQnjAQPnAQgANA")) + } +} -var imgTemperature = { - width : 24, height : 24, bpp : 1, - transparent : 1, - buffer : require("heatshrink").decompress(atob("//D///wICBjACBngCNkgCP/0kv/+s1//nDn/8wICEBAIOC/08v//IYJECA==")) -}; +function imgTemperature() { + return { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("//D///wICBjACBngCNkgCP/0kv/+s1//nDn/8wICEBAIOC/08v//IYJECA==")) + } +} -var imgWind = { - width : 24, height : 24, bpp : 1, - transparent : 1, - buffer : require("heatshrink").decompress(atob("/0f//8h///Pn//zAQXzwf/88B//mvGAh18gEevn/DIICB/PwgEBAQMHBAIADFwM/wEAGAP/54CD84CE+eP//wIQU/A==")) -}; +function imgWind () { + return { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/0f//8h///Pn//zAQXzwf/88B//mvGAh18gEevn/DIICB/PwgEBAQMHBAIADFwM/wEAGAP/54CD84CE+eP//wIQU/A==")) + } +} -var imgTimer = { - width : 24, height : 24, bpp : 1, - transparent : 1, - buffer : require("heatshrink").decompress(atob("/+B/4CD84CEBAPygFP+F+h/x/+P+fz5/n+HnAQNn5/wuYCBmYCC5kAAQfOgFz80As/ngHn+fD54mC/F+j/+gF/HAQA==")) -}; +function imgTimer() { + return { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/+B/4CD84CEBAPygFP+F+h/x/+P+fz5/n+HnAQNn5/wuYCBmYCC5kAAQfOgFz80As/ngHn+fD54mC/F+j/+gF/HAQA==")) + } +} -var imgCharging = { - width : 24, height : 24, bpp : 1, - transparent : 1, - buffer : require("heatshrink").decompress(atob("//+v///k///4AQPwBANgBoMxBoMb/P+h/w/kH8H4gfB+EBwfggHH4EAt4CBn4CBj4CBh4FCCIO/8EB//Agf/wEH/8Gh//x////fAQIA=")) -}; +function imgCharging() { + return { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("//+v///k///4AQPwBANgBoMxBoMb/P+h/w/kH8H4gfB+EBwfggHH4EAt4CBn4CBj4CBh4FCCIO/8EB//Agf/wEH/8Gh//x////fAQIA=")) + } +} -var imgWatch = { - width : 24, height : 24, bpp : 1, - transparent : 1, - buffer : require("heatshrink").decompress(atob("/8B//+ARANB/l4//5/1/+f/n/n5+fAQnf9/P44CC8/n7/n+YOB/+fDQQgCEwQsCHBBEC")) -}; +function imgWatch() { + return { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/8B//+ARANB/l4//5/1/+f/n/n5+fAQnf9/P44CC8/n7/n+YOB/+fDQQgCEwQsCHBBEC")) + } +} /* @@ -132,12 +150,12 @@ var imgWatch = { */ var infoArray = [ function(){ return [ null, null, "left", null ] }, - function(){ return [ "Bangle", imgWatch, "right", null ] }, - function(){ return [ E.getBattery() + "%", imgBattery, "left", null ] }, - function(){ return [ getSteps(), imgSteps, "left", null ] }, - function(){ return [ Math.round(Bangle.getHealthStatus("last").bpm) + " bpm", imgBpm, "left", null] }, - function(){ return [ getWeather().temp, imgTemperature, "left", null ] }, - function(){ return [ getWeather().wind, imgWind, "left", null ] }, + function(){ return [ "Bangle", imgWatch(), "right", null ] }, + function(){ return [ E.getBattery() + "%", imgBattery(), "left", null ] }, + function(){ return [ getSteps(), imgSteps(), "left", null ] }, + function(){ return [ Math.round(Bangle.getHealthStatus("last").bpm) + " bpm", imgBpm(), "left", null] }, + function(){ return [ getWeather().temp, imgTemperature(), "left", null ] }, + function(){ return [ getWeather().wind, imgWind(), "left", null ] }, ]; /* @@ -158,9 +176,9 @@ const NUM_INFO=infoArray.length; function getInfoEntry(){ if(isAlarmEnabled()){ - return [getAlarmMinutes() + " min.", imgTimer, "left", null] + return [getAlarmMinutes() + " min.", imgTimer(), "left", null] } else if(Bangle.isCharging()){ - return [E.getBattery() + "%", imgCharging, "left", null] + return [E.getBattery() + "%", imgCharging(), "left", null] } else{ // In case the user removes HomeAssistant entries, showInfo // could be larger than infoArray.length... @@ -391,7 +409,7 @@ function drawTime(){ function drawLock(){ if(settings.showLock && Bangle.isLocked()){ g.setColor(g.theme.fg); - g.drawImage(imgLock, W-16, 2); + g.drawImage(imgLock(), W-16, 2); } }