2022-06-27 14:36:26 +00:00
|
|
|
/**
|
|
|
|
* This app uses the ha library to send trigger to HomeAssistant.
|
|
|
|
*/
|
|
|
|
var ha = require("ha.lib.js");
|
2022-06-20 11:36:49 +00:00
|
|
|
var W = g.getWidth(), H = g.getHeight();
|
|
|
|
var position=0;
|
2022-06-27 14:36:26 +00:00
|
|
|
var triggers = ha.getTriggers();
|
2024-04-21 18:35:14 +00:00
|
|
|
var slider;
|
2022-06-24 10:45:11 +00:00
|
|
|
|
2022-06-20 11:36:49 +00:00
|
|
|
function draw() {
|
|
|
|
g.reset().clearRect(Bangle.appRect);
|
|
|
|
|
2022-06-23 18:32:39 +00:00
|
|
|
var h = 22;
|
2022-06-24 06:33:14 +00:00
|
|
|
g.setFont("Vector", h);
|
2022-06-24 06:59:51 +00:00
|
|
|
var trigger = triggers[position];
|
|
|
|
var w = g.stringWidth(trigger.display);
|
2022-06-20 11:36:49 +00:00
|
|
|
|
2022-06-24 06:33:14 +00:00
|
|
|
g.setFontAlign(-1,-1);
|
2022-06-27 14:46:40 +00:00
|
|
|
var icon = trigger.getIcon();
|
2024-04-21 18:35:14 +00:00
|
|
|
var iconY = H / 5 - 2 - 5;
|
|
|
|
g.setColor(g.theme.fg).drawImage(icon, 12, iconY);
|
|
|
|
|
|
|
|
if (trigger.value) {
|
|
|
|
if (!slider) {
|
|
|
|
const R = Bangle.appRect;
|
|
|
|
console.log("R", R);
|
|
|
|
const w = 50;
|
|
|
|
|
|
|
|
slider = require("Slider").create(onSlide, {
|
|
|
|
initLevel: 0, // TODO: fetch this?
|
|
|
|
|
|
|
|
mode: "map",
|
|
|
|
steps: 100,
|
|
|
|
timeout: false,
|
|
|
|
|
|
|
|
width: w,
|
|
|
|
xStart: R.w / 2 - w / 2,
|
|
|
|
yStart: R.y,
|
|
|
|
height: R.h - 24,
|
|
|
|
|
|
|
|
dragRect: {
|
|
|
|
x: R.w * 0.3,
|
|
|
|
x2: R.w * 0.6,
|
|
|
|
y: R.y,
|
|
|
|
y2: R.h,
|
|
|
|
},
|
|
|
|
});
|
2024-04-21 17:44:23 +00:00
|
|
|
Bangle.prependListener('drag', slider.f.dragSlider);
|
2024-04-21 18:35:14 +00:00
|
|
|
}
|
2022-06-23 18:06:53 +00:00
|
|
|
|
2024-04-21 18:35:14 +00:00
|
|
|
const r = slider.c.borderRect;
|
|
|
|
g.setColor(g.theme.fg)
|
|
|
|
.setFontAlign(0, 0)
|
|
|
|
.drawString("HA", (r.x + r.w + W) / 2, iconY + g.imageMetrics(icon).height / 2)
|
|
|
|
.setFontAlign(0, 1)
|
|
|
|
.drawString(trigger.display, W / 2, H);
|
|
|
|
|
|
|
|
slider.f.draw(slider.v.level);
|
|
|
|
}else{
|
2024-04-22 07:38:17 +00:00
|
|
|
if (slider) {
|
|
|
|
slider.f.remove();
|
|
|
|
slider = undefined;
|
|
|
|
}
|
|
|
|
|
2024-04-21 18:35:14 +00:00
|
|
|
g.drawString("Home", icon.width + 20, H/5-5);
|
|
|
|
g.drawString("Assistant", icon.width + 18, H/5+24-5);
|
|
|
|
|
|
|
|
g.setFontAlign(0,0);
|
|
|
|
var ypos = H/5*3+23;
|
|
|
|
g.drawRect(W/2-w/2-8, ypos-h/2-8, W/2+w/2+5, ypos+h/2+5);
|
|
|
|
g.fillRect(W/2-w/2-6, ypos-h/2-6, W/2+w/2+3, ypos+h/2+3);
|
|
|
|
g.setColor(g.theme.bg).drawString(trigger.display, W/2, ypos);
|
|
|
|
}
|
2023-01-10 18:54:50 +00:00
|
|
|
|
|
|
|
// draw arrows
|
|
|
|
g.setColor(g.theme.fg);
|
|
|
|
if (position > 0) {
|
|
|
|
g.drawLine(10, H/2, 20, H/2 - 10);
|
|
|
|
g.drawLine(10, H/2, 20, H/2 + 10);
|
|
|
|
}
|
|
|
|
if (position < triggers.length -1) {
|
|
|
|
g.drawLine(W - 10, H/2, W - 20, H/2 - 10);
|
|
|
|
g.drawLine(W - 10, H/2, W - 20, H/2 + 10);
|
|
|
|
}
|
2022-06-20 11:36:49 +00:00
|
|
|
}
|
|
|
|
|
2024-04-21 17:44:23 +00:00
|
|
|
var lastLevel;
|
2024-04-21 18:26:26 +00:00
|
|
|
var lastTouch;
|
2024-04-21 17:44:23 +00:00
|
|
|
|
|
|
|
function onSlide(mode, level, e) {
|
2024-04-21 18:26:26 +00:00
|
|
|
lastTouch = Date.now();
|
|
|
|
|
2024-04-22 07:38:17 +00:00
|
|
|
if (!e) return;
|
|
|
|
|
2024-04-21 17:44:23 +00:00
|
|
|
if (e.b !== 0) {
|
|
|
|
if (lastLevel == null)
|
|
|
|
lastLevel = level;
|
|
|
|
} else {
|
|
|
|
if (lastLevel != null && lastLevel !== level) {
|
|
|
|
// we've had a drag and level has changed
|
|
|
|
ha.sendValue(triggers[position].trigger, level);
|
|
|
|
lastLevel = null;
|
|
|
|
}
|
|
|
|
}
|
2024-04-21 18:35:14 +00:00
|
|
|
}
|
|
|
|
|
2023-01-10 12:45:14 +00:00
|
|
|
function toLeft() {
|
2022-06-23 18:06:53 +00:00
|
|
|
Bangle.buzz(40, 0.6);
|
2022-06-20 11:36:49 +00:00
|
|
|
position -= 1;
|
2022-06-24 06:59:51 +00:00
|
|
|
position = position < 0 ? triggers.length-1 : position;
|
2022-06-25 08:52:42 +00:00
|
|
|
draw();
|
2023-01-10 12:45:14 +00:00
|
|
|
}
|
|
|
|
function toRight() {
|
|
|
|
Bangle.buzz(40, 0.6);
|
|
|
|
position += 1;
|
|
|
|
position = position >= triggers.length ? 0 : position;
|
|
|
|
draw();
|
|
|
|
}
|
|
|
|
function sendTrigger() {
|
2022-06-27 14:46:40 +00:00
|
|
|
ha.sendTrigger("TRIGGER");
|
|
|
|
|
2022-06-25 08:52:42 +00:00
|
|
|
// Now send the selected trigger
|
2022-06-23 18:06:53 +00:00
|
|
|
Bangle.buzz(80, 0.6).then(()=>{
|
2022-06-27 14:36:26 +00:00
|
|
|
ha.sendTrigger(triggers[position].trigger);
|
2022-06-23 18:06:53 +00:00
|
|
|
setTimeout(()=>{
|
|
|
|
Bangle.buzz(80, 0.6);
|
|
|
|
}, 250);
|
|
|
|
});
|
2023-01-10 12:45:14 +00:00
|
|
|
}
|
|
|
|
|
2024-04-21 18:33:00 +00:00
|
|
|
Bangle.on('touch', (btn, e) => {
|
2024-04-21 18:26:26 +00:00
|
|
|
if (Date.now() - lastTouch < 250) return;
|
|
|
|
lastTouch = Date.now();
|
|
|
|
|
2024-04-21 18:32:53 +00:00
|
|
|
var left = g.getWidth() * 0.3;
|
2023-01-10 12:45:14 +00:00
|
|
|
var right = g.getWidth() - left;
|
|
|
|
var isLeft = e.x < left;
|
|
|
|
var isRight = e.x > right;
|
|
|
|
|
|
|
|
if(isLeft){
|
|
|
|
toLeft();
|
2024-04-21 18:32:44 +00:00
|
|
|
}else if (isRight){
|
2023-01-10 12:45:14 +00:00
|
|
|
toRight();
|
2024-04-21 18:32:44 +00:00
|
|
|
}else{
|
2023-01-10 12:45:14 +00:00
|
|
|
sendTrigger();
|
2022-06-20 11:36:49 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2023-01-10 12:45:14 +00:00
|
|
|
Bangle.on("swipe", (lr,ud) => {
|
2024-04-22 07:38:58 +00:00
|
|
|
if (slider) return; // "disable" swiping on sliders
|
2024-04-22 07:39:18 +00:00
|
|
|
if (Date.now() - lastTouch < 250) return;
|
|
|
|
lastTouch = Date.now();
|
2024-04-22 07:38:58 +00:00
|
|
|
|
2024-04-21 18:32:44 +00:00
|
|
|
if (lr == -1) {
|
|
|
|
toLeft();
|
|
|
|
} else if (lr == 1) {
|
|
|
|
toRight();
|
|
|
|
}
|
2024-04-22 07:38:58 +00:00
|
|
|
E.stopEventPropagation && E.stopEventPropagation();
|
2024-04-21 18:32:44 +00:00
|
|
|
});
|
2023-01-10 12:45:14 +00:00
|
|
|
|
2022-06-27 14:36:26 +00:00
|
|
|
|
2022-06-24 10:45:11 +00:00
|
|
|
// Send intent that the we started the app.
|
2022-06-27 14:36:26 +00:00
|
|
|
ha.sendTrigger("APP_STARTED");
|
2022-06-24 06:33:14 +00:00
|
|
|
|
|
|
|
// Next load the widgets and draw the app
|
2022-06-20 11:36:49 +00:00
|
|
|
Bangle.loadWidgets();
|
2022-06-24 06:33:14 +00:00
|
|
|
Bangle.drawWidgets();
|
|
|
|
|
2022-06-27 14:36:26 +00:00
|
|
|
// Draw app
|
2022-06-24 06:33:14 +00:00
|
|
|
draw();
|
|
|
|
setWatch(_=>load(), BTN1);
|