BangleApps/apps/hassio/hassio.boot.js

129 lines
3.0 KiB
JavaScript

var HASSIO;
let hassioRunning = false;
function validateHassio(settings) {
const STR_FIELDS = ["api_key", "host", "id", "friendly_name"];
const INT_FIELDS = ["interval"];
const TEMPLATES = "templates";
if (typeof settings !== "object") {
return false;
}
for (const field of STR_FIELDS) {
if (settings[field] === undefined || typeof settings[field] !== "string") {
return false;
}
}
for (const field of INT_FIELDS) {
if (settings[field] === undefined || typeof settings[field] !== "number") {
return false;
}
}
if (settings[TEMPLATES] === undefined || !(settings[TEMPLATES] instanceof Array)) {
return false;
}
for (const template of settings[TEMPLATES]) {
if (template.name === undefined || typeof template.name !== "string") {
return false;
}
if (template.temp === undefined || typeof template.temp !== "string") {
return false;
}
}
return true;
}
const loadHassio = () => {
let hassioSettings = require("Storage").read("hassio.json");
let tmp = HASSIO;
HASSIO = undefined;
if (hassioSettings !== undefined) {
try {
HASSIO = JSON.parse(hassioSettings);
} catch(e) {
}
if (HASSIO !== undefined && !validateHassio(HASSIO)) {
HASSIO = undefined;
}
}
if (HASSIO === undefined) {
HASSIO = tmp;
}
};
loadHassio();
const runHassio = () => {
if (HASSIO !== undefined) {
let hassioAttributes = {
state_class: "measurement",
friendly_name: HASSIO.friendly_name,
unit_of_measurement: "%"
};
const postSensor = (data) => {
const url = `${HASSIO.host}/api/states/sensor.${HASSIO.id}`;
Bangle.http(url, {
method: "POST",
body: JSON.stringify(data),
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${HASSIO.api_key}`,
}
});
};
const getBattery = () => {
const b = E.getBattery(),
c = Bangle.isCharging();
return {
state: c ? "charging" : "discharging",
level: b
};
};
Bangle.on("GPS", (fix) => {
hassioAttributes.gps = fix;
});
const updateSensor = () => {
hassioAttributes.health = Bangle.getHealthStatus("day");
hassioAttributes.accel = Bangle.getAccel();
hassioAttributes.battery = getBattery();
hassioAttributes.compass = Bangle.getCompass();
postSensor({
state: hassioAttributes.battery.level,
attributes: hassioAttributes
});
};
const log = () => {
Bangle.setCompassPower(true, "hassio");
Bangle.setHRMPower(true, "hassio");
setTimeout(() => {
updateSensor();
Bangle.setCompassPower(false, "hassio");
Bangle.setHRMPower(false, "hassio");
}, 30 * 1000);
};
log();
}
};
(function () {
if (!hassioRunning) {
hassioRunning = true;
setTimeout(() => {
runHassio();
setInterval(runHassio, HASSIO.interval);
}, 5000);
}
})();