Skip to content

Instantly share code, notes, and snippets.

@deanlyoung
Created August 31, 2020 05:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save deanlyoung/9a10e2c7f9f10dd6e4e512881c8a35c9 to your computer and use it in GitHub Desktop.
Save deanlyoung/9a10e2c7f9f10dd6e4e512881c8a35c9 to your computer and use it in GitHub Desktop.
// change these
const token = ""
const device_type = ""
const device_id = ""
// instantiate widget
const data = await fetchData()
const widget = createWidget(data)
Script.setWidget(widget)
Script.complete()
function createWidget(data) {
console.log(data)
const lw = new ListWidget()
const bgColor = new LinearGradient()
bgColor.colors = [new Color("#000"), new Color("#000")]
bgColor.locations = [0.0, 1.0]
lw.backgroundGradient = bgColor
lw.centerAlignContent()
const datetime = new Date()
const dfTime = new DateFormatter()
dfTime.locale = "gb"
dfTime.useShortDateStyle()
dfTime.useShortTimeStyle()
const datetimeLine = lw.addText(`${dfTime.string(datetime)}`)
datetimeLine.textSize = 12
datetimeLine.textColor = new Color("#ccc")
const temperatureLine = lw.addText(`[🌡] ${Number(data.temp).toFixed(2)}°F`)
temperatureLine.textSize = 12
temperatureLine.textColor = new Color("#ccc")
const humidityLine = lw.addText(`[️☔️] ${Number(data.humid).toFixed(2)}%`)
humidityLine.textSize = 12
humidityLine.textColor = new Color("#ccc")
const co2Line = lw.addText(`[🌬] ${Number(data.co2).toFixed(0)} ppm`)
co2Line.textSize = 12
co2Line.textColor = new Color("#ccc")
const tvocLine = lw.addText(`[♨️] ${Number(data.voc).toFixed(0)} ppb`)
tvocLine.textSize = 12
tvocLine.textColor = new Color("#ccc")
const pm25Line = lw.addText(`[🚬] ${Number(data.pm25).toFixed(0)} μg/m³`)
pm25Line.textSize = 12
pm25Line.textColor = new Color("#ccc")
return lw
}
async function fetchData() {
const bearer_token = "Bearer " + token
const headers = {"Authorization": bearer_token}
const url = `https://developer-apis.awair.is/v1/users/self/devices/${device_type}/${device_id}/air-data/raw?limit=12&desc=true&fahrenheit=true`
const request = new Request(url)
request.headers = headers
const resp = await request.loadJSON()
const data = resp.data
const sensors = data
.map(sensor => sensor.sensors)
.reduce((a, b) => a.concat(b))
.reduce((a, b) => {a[b.comp] = a[b.comp] ? 0.5*(a[b.comp] + b.value) : b.value; return a}, {});
// const score = data.reduce((a, b) => {return a + b.score}, 0) / data.length;
return sensors
}
// change this
const station_id = ""
const purple_air_url = "https://www.purpleair.com/json?show=" + station_id
// instantiate widget
const data = await fetchData()
const widget = createWidget(data)
Script.setWidget(widget)
Script.complete()
function createWidget(data) {
console.log(data)
const lw = new ListWidget()
const bgColor = new LinearGradient()
bgColor.colors = [new Color("#000"), new Color("#000")]
bgColor.locations = [0.0, 1.0]
lw.backgroundGradient = bgColor
lw.centerAlignContent()
const datetimeLine = lw.addText(`${data.last_seen}`)
datetimeLine.textSize = 12
datetimeLine.textColor = new Color("#ccc")
const temperatureLine = lw.addText(`[🌡] ${Number(data.temp).toFixed(0)}°F`)
temperatureLine.textSize = 12
temperatureLine.textColor = new Color("#ccc")
const humidityLine = lw.addText(`[️☔️] ${Number(data.humid).toFixed(0)}%`)
humidityLine.textSize = 12
humidityLine.textColor = new Color("#ccc")
const co2Line = lw.addText(`[🌬] `)
co2Line.textSize = 12
co2Line.textColor = new Color("#ccc")
const tvocLine = lw.addText(`[♨️] `)
tvocLine.textSize = 12
tvocLine.textColor = new Color("#ccc")
const pm25Line = lw.addText(`[🚬] ${Number(data.pm25).toFixed(2)} μg/m³`)
pm25Line.textSize = 12
pm25Line.textColor = new Color("#ccc")
const pressureLine = lw.addText(`[🚩] ${Number(data.pressure).toFixed(2)} mbar`)
pressureLine.textSize = 12
pressureLine.textColor = new Color("#ccc")
return lw
}
async function fetchData() {
const request = new Request(purple_air_url)
const resp = await request.loadJSON()
const data = resp.results[0]
const sensors = {}
sensors.pm25 = data.PM2_5Value
sensors.temp = data.temp_f
sensors.humid = data.humidity
sensors.pressure = data.pressure
const datetime = new Date(data.LastSeen * 1000)
const dfTime = new DateFormatter()
dfTime.locale = "gb"
dfTime.useShortDateStyle()
dfTime.useShortTimeStyle()
sensors.last_seen = dfTime.string(datetime)
return sensors
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment