HASS iOS Widget - WITHOUT Images
unknown
javascript
3 years ago
5.3 kB
337
No Index
Never
let widget = await createWidget(); if (!config.runsInWidget) { await widget.presentSmall(); } Script.setWidget(widget); Script.complete(); async function createWidget(items) { /* Get data from API */ let req = new Request("https://<HASS IP>/api/states") req.headers = { "Authorization": "Bearer <HASS Long-Lived Access Token at https://<HASS IP>/profile", "content-type": "application/json" } let json = await req.loadJSON(); /* Parse data received from API */ let data = {outdoor: {}, child: {}, office: {}, bedroom: {}, livingroom: {}, kitchen: {}, hallway: {}, bathroom: {}, wc: {}} data.outdoor = addData(json, data.outdoor, ['sensor.ble_temperature_aabbccddeeff', 'sensor.ble_humidity_aabbccddeeff']); data.child = addData(json, data.child, ['sensor.ble_temperature_aabbccddeeff', 'sensor.ble_humidity_aabbccddeeff']); data.office = addData(json, data.office, ['sensor.ble_temperature_aabbccddeeff', 'sensor.ble_humidity_aabbccddeeff']); data.bedroom = addData(json, data.bedroom, ['sensor.ble_temperature_aabbccddeeff', 'sensor.ble_humidity_aabbccddeeff']); data.livingroom = addData(json, data.livingroom, ['sensor.ble_temperature_aabbccddeeff', 'sensor.ble_humidity_aabbccddeeff']); data.kitchen = addData(json, data.kitchen, ['sensor.ble_temperature_aabbccddeeff', 'sensor.ble_humidity_aabbccddeeff']); data.hallway = addData(json, data.hallway, ['sensor.ble_temperature_aabbccddeeff', 'sensor.ble_humidity_aabbccddeeff']); data.bathroom = addData(json, data.bathroom, ['sensor.ble_temperature_aabbccddeeff', 'sensor.ble_humidity_aabbccddeeff']); data.wc = addData(json, data.wc, ['sensor.ble_temperature_aabbccddeeff', 'sensor.ble_humidity_aabbccddeeff']); /* Create the widget */ const widget = new ListWidget(); widget.backgroundColor = new Color("#03a9f4", 1.0); /* Design the widget header */ let headerStack = widget.addStack(); const logoStack = headerStack.addStack(); headerStack.addSpacer(2); const titleStack = headerStack.addStack(); headerStack.addSpacer(7); const tempImageStack = headerStack.addStack(); headerStack.addSpacer(14); const humidImageStack = headerStack.addStack(); widget.addSpacer(5) /* Add the sensor entries */ const bodyStack = widget.addStack(); /* First, the label column */ const labelStack = bodyStack.addStack(); labelStack.setPadding(0, 0, 0, 0); labelStack.borderWidth = 0; labelStack.layoutVertically(); addLabel(labelStack, " Outdoor:") addLabel(labelStack, " Child:") addLabel(labelStack, " Office:") addLabel(labelStack, " Bedroom:") addLabel(labelStack, " Living:") addLabel(labelStack, " Kitchen:") addLabel(labelStack, " Hallway:") addLabel(labelStack, " Bathroom:") addLabel(labelStack, " WC:") /* Second, the temperature column */ const tempStack = bodyStack.addStack(); tempStack.setPadding(0, 3, 0, 0); tempStack.borderWidth = 0; tempStack.layoutVertically(); addTemp(tempStack, data.outdoor) addTemp(tempStack, data.child) addTemp(tempStack, data.office) addTemp(tempStack, data.bedroom) addTemp(tempStack, data.livingroom) addTemp(tempStack, data.kitchen) addTemp(tempStack, data.hallway) addTemp(tempStack, data.bathroom) addTemp(tempStack, data.wc) /* Third, the humidity column */ const humidStack = bodyStack.addStack(); humidStack.setPadding(0, 5, 0, 0); humidStack.borderWidth = 0; humidStack.layoutVertically(); addHumid(humidStack, data.outdoor) addHumid(humidStack, data.child) addHumid(humidStack, data.office) addHumid(humidStack, data.bedroom) addHumid(humidStack, data.livingroom) addHumid(humidStack, data.kitchen) addHumid(humidStack, data.hallway) addHumid(humidStack, data.bathroom) addHumid(humidStack, data.wc) /* Done: Widget is now ready to be displayed */ return widget; } /* Adds the entries to the label column */ async function addLabel(labelStack, label) { const mytext = labelStack.addText(label); mytext.font = Font.semiboldSystemFont(10); mytext.textColor = Color.black(); } /* Adds the entries to the temperature column */ async function addTemp(tempStack, data) { const mytext = tempStack.addText(data.temp + "°C"); mytext.font = Font.heavyMonospacedSystemFont(10); mytext.textColor = Color.white(); } /* Adds the entries to the humidity column */ async function addHumid(humidStack, data) { const mytext = humidStack.addText("(" + data.humid + "%)"); mytext.font = Font.mediumMonospacedSystemFont(10); mytext.textColor = Color.white(); mytext.textOpacity = 0.8; } /* Searches for the respective sensor values ('state') in the API response of Home Assistant */ function addData(json, room, sensors) { room.temp = "N/A"; room.humid = "N/A"; var i; for (i = 0; i < json.length; i++) { if (json[i]['entity_id'] == sensors[0]) { room.temp = Math.round(json[i]['state']); } if (json[i]['entity_id'] == sensors[1]) { room.humid = Math.round(json[i]['state']); } } return room; }