Skip to content

Instantly share code, notes, and snippets.

@deanlyoung
Created August 31, 2020 05:59
Show Gist options
  • Save deanlyoung/9a10e2c7f9f10dd6e4e512881c8a35c9 to your computer and use it in GitHub Desktop.
Save deanlyoung/9a10e2c7f9f10dd6e4e512881c8a35c9 to your computer and use it in GitHub Desktop.

Revisions

  1. deanlyoung created this gist Aug 31, 2020.
    60 changes: 60 additions & 0 deletions awair-scriptable-template.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,60 @@
    // 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
    }
    60 changes: 60 additions & 0 deletions purple-air-scriptable-template.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,60 @@
    // 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
    }