const w = require("weather"); const locale = require("locale"); // Weather icons from https://icons8.com/icon/set/weather/color function getSun() { return require("heatshrink").decompress(atob("kEggILIgOAAZkDAYPAgeBwPAgIFBBgPhw4TBp/yAYMcnADBnEcAYMwhgDBsEGgE/AYP8AYYLDCYgbDEYYrD8fHIwI7CIYZLDL54AHA==")); } function getPartSun() { return require("heatshrink").decompress(atob("kcjwIVSgOAAgUwAYUGAYVgBoQHBkAIBocIDIX4CIcOAYMYg/wgECgODgE8oFAmEDxEYgYZBgQLBGYNAg/ggcYgANBAIIxBsPAG4MYsAIBoQ3ChAQCgI4BHYUEBgUADIIPBh///4GBv//8Cda")); } //function getPartRain() { // return require("heatshrink").decompress(atob("kEggIHEmADJjEwsEAjkw8EAh0B4EAg35wEAgP+CYMDwv8AYMDBAP2g8HgH+g0DBYMMgPwAYX8gOMEwMG3kAg8OvgSBjg2BgcYGQIcBAY5CBg0Av//HAM///4MYgNBEIMOCoUMDoUAnBwGkEA")); //} function getCloud() { return require("heatshrink").decompress(atob("kEggIfcj+AAYM/8ADBuFwAYPAmADCCAMBwEf8ADBhFwg4aBnEPAYMYjAVBhgDDDoQDHCYc4jwDB+EP///FYIDBMTgA==")); } function getSnow() { return require("heatshrink").decompress(atob("kEggITQj/AAYM98ADBsEwAYPAjADCj+AgOAj/gAYMIuEHwEAjEPAYQVChk4AYQhCAYcYBYQTDnEPgEB+EH///IAQACE4IAB8EICIPghwDB4EeBYNAjgDBg8EAYQYCg4bCgZuFA==")); } function getRain() { return require("heatshrink").decompress(atob("kEggIPMh+AAYM/8ADBuFwAYPgmADB4EbAYOAj/ggOAhnwg4aBnAeCjEcCIMMjADCDoQDHjAPCnAXCuEP///8EDAYJECAAXBwkAgPDhwDBwUMgEEhkggEOjFgFgMQLYQAOA==")); } function getStorm() { return require("heatshrink").decompress(atob("kcjwIROgfwAYMB44ICsEwAYMYgYQCgAICoEHCwMYgFDwEHCYfgEAMA4AIBmAXCgUGFIVAwADBhEQFIQtCGwNggPgjAVBngCBv8Oj+AgfjwYpCGAIABn4kBgOBBAVwjBHBD4IdBgYNBGwUAkCdbA=")); } // err icon - https://icons8.com/icons/set/error function getErr() { return require("heatshrink").decompress(atob("kEggILIgOAAYsD4ADBg/gAYMGsADBhkwAYsYjADCjgDBmEMAYNxxwDBsOGAYPBwYDEgOBwOAgYDB4EDHYPAgwDBsADDhgDBFIcwjAHBjE4AYMcmADBhhNCKIcG/4AGOw4A==")); } //function getDummy() { // return require("heatshrink").decompress(atob("gMBwMAwA")); //} /** Choose weather icon to display based on condition. Based on function from the Bangle weather app so it should handle all of the conditions sent from gadget bridge. */ function chooseIcon(condition) { condition = condition.toLowerCase(); if (condition.includes("thunderstorm") || condition.includes("squalls") || condition.includes("tornado")) return getStorm; else if (condition.includes("freezing") || condition.includes("snow") || condition.includes("sleet")) { return getSnow; } else if (condition.includes("drizzle") || condition.includes("shower") || condition.includes("rain")) return getRain; else if (condition.includes("clear")) return getSun; else if (condition.includes("clouds")) return getCloud; else if (condition.includes("few clouds") || condition.includes("scattered clouds") || condition.includes("mist") || condition.includes("smoke") || condition.includes("haze") || condition.includes("sand") || condition.includes("dust") || condition.includes("fog") || condition.includes("overcast") || condition.includes("partly cloudy") || condition.includes("ash")) { return getPartSun; } else return getErr; } /* * Choose weather icon to display based on weather conditition code * https://openweathermap.org/weather-conditions#Weather-Condition-Codes-2 */ function chooseIconByCode(code) { const codeGroup = Math.round(code / 100); switch (codeGroup) { case 2: return getStorm; case 3: return getRain; case 5: switch (code) { case 511: return getSnow; default: return getRain; } case 6: return getSnow; case 7: return getPartSun; case 8: switch (code) { case 800: return getSun; case 804: return getCloud; default: return getPartSun; } default: return getCloud; } } /*function condenseWeather(condition) { condition = condition.toLowerCase(); if (condition.includes("thunderstorm") || condition.includes("squalls") || condition.includes("tornado")) return "storm"; if (condition.includes("freezing") || condition.includes("snow") || condition.includes("sleet")) { return "snow"; } if (condition.includes("drizzle") || condition.includes("shower") || condition.includes("rain")) return "rain"; if (condition.includes("clear")) return "clear"; if (condition.includes("clouds")) return "clouds"; if (condition.includes("few clouds") || condition.includes("scattered clouds") || condition.includes("mist") || condition.includes("smoke") || condition.includes("haze") || condition.includes("sand") || condition.includes("dust") || condition.includes("fog") || condition.includes("overcast") || condition.includes("partly cloudy") || condition.includes("ash")) { return "scattered"; } else { return "N/A"; } return "N/A"; } */ // copied from: https://gist.github.com/IamSilviu/5899269#gistcomment-3035480 function ISO8601_week_no(date) { var tdt = new Date(date.valueOf()); var dayn = (date.getDay() + 6) % 7; tdt.setDate(tdt.getDate() - dayn + 3); var firstThursday = tdt.valueOf(); tdt.setMonth(0, 1); if (tdt.getDay() !== 4) { tdt.setMonth(0, 1 + ((4 - tdt.getDay()) + 7) % 7); } return 1 + Math.ceil((firstThursday - tdt) / 604800000); } function format(value) { return ("0" + value).substr(-2); } const ClockFace = require("ClockFace"); const clock = new ClockFace({ init: function () { const appRect = Bangle.appRect; this.viewport = { width: appRect.w, height: appRect.h }; this.center = { x: this.viewport.width / 2, y: Math.round((this.viewport.height / 2) + appRect.y) }; this.scale = g.getWidth() / this.viewport.width; this.centerTimeScaleX = this.center.x + 32 * this.scale; this.centerDatesScaleX = this.center.x + 40 * this.scale; }, draw: function (date) { const hour = date.getHours() - (this.is12Hour && date.getHours() > 12 ? 12 : 0); const month = date.getMonth() + 1; // const monthName = require("date_utils").month(month, 1); // const dayName = require("date_utils").dow(date.getDay(), 1); let steps = Bangle.getHealthStatus("day").steps; let curr = (w.get() === undefined ? "no data" : w.get()); // Get weather from weather app. //let cWea =(curr === "no data" ? "no data" : curr.txt); let cTemp= (curr === "no data" ? 273 : curr.temp); // const temp = locale.temp(curr.temp - 273.15).match(/^(\D*\d*)(.*)$/); let w_icon = getErr; if (locale.name === "en" || locale.name === "en_GB" || locale.name === "en_US") { w_icon = chooseIcon(curr.txt === undefined ? "no data" : curr.txt); } else { // cannot use condition string to determine icon if language is not English; use weather code instead const code = curr.code || -1; if (code > 0) { w_icon = chooseIconByCode(curr.code); } } g.setFontAlign(1, 0).setFont("Vector", 90 * this.scale); g.drawString(format(hour), this.centerTimeScaleX, this.center.y - 31 * this.scale); g.drawString(format(date.getMinutes()), this.centerTimeScaleX, this.center.y + 46 * this.scale); g.fillRect(this.center.x + 30 * this.scale, this.center.y - 72 * this.scale, this.center.x + 32 * this.scale, this.center.y + 74 * this.scale); g.setFontAlign(-1, 0).setFont("Vector", 16 * this.scale); g.drawString(format(date.getDate()), this.centerDatesScaleX, this.center.y - 62 * this.scale); //26 g.drawString("." + format(month) + ".", this.centerDatesScaleX + 20, this.center.y - 62 * this.scale); //44 g.drawString(date.getFullYear(date), this.centerDatesScaleX, this.center.y - 44 * this.scale); //62 if (this.showWeekNum) g.drawString("CW" + format(ISO8601_week_no(date)), this.centerDatesScaleX, this.center.y + -26 * this.scale); //15 // print(w_icon()); if (this.showWeather) { g.drawImage(w_icon(), this.centerDatesScaleX, this.center.y - 8 * this.scale); // g.drawString(condenseWeather(curr.txt), this.centerDatesScaleX, this.center.y + 24 * this.scale); g.drawString((cTemp === undefined ? 273 : cTemp ) - 273 + "°C", this.centerDatesScaleX, this.center.y + 44 * this.scale); //48 } if (this.showSteps) g.drawString(steps, this.centerDatesScaleX, this.center.y + 66 * this.scale); }, settingsFile: "ffcniftyapp.json" }); clock.start();