Skip to content

Commit

Permalink
only 6 places after decimal
Browse files Browse the repository at this point in the history
  • Loading branch information
donavanbecker committed Sep 23, 2024
1 parent 92f3a8b commit 380f1c4
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 39 deletions.
18 changes: 9 additions & 9 deletions config.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,28 +51,28 @@
"type": "email"
}
},
"latitude": {
"title": "Latitude",
"city": {
"title": "City",
"type": "string",
"required": false,
"condition": {
"functionBody": "return !(model.devices && model.devices[arrayIndices].city && model.devices[arrayIndices].state && model.devices[arrayIndices].zipCode);"
"functionBody": "return (model.devices && model.devices[arrayIndices].apiKey);"
}
},
"longitude": {
"title": "Longitude",
"latitude": {
"title": "Latitude",
"type": "string",
"required": false,
"condition": {
"functionBody": "return !(model.devices && model.devices[arrayIndices].city && model.devices[arrayIndices].state && model.devices[arrayIndices].zipCode);"
}
},
"city": {
"title": "City",
"longitude": {
"title": "Longitude",
"type": "string",
"required": false,
"condition": {
"functionBody": "return !(model.devices && model.devices[arrayIndices].latitude && model.devices[arrayIndices].longitude);"
"functionBody": "return !(model.devices && model.devices[arrayIndices].city && model.devices[arrayIndices].state && model.devices[arrayIndices].zipCode);"
}
},
"state": {
Expand Down Expand Up @@ -216,9 +216,9 @@
"items": [
"devices[].provider",
"devices[].apiKey",
"devices[].city",
"devices[].latitude",
"devices[].longitude",
"devices[].city",
"devices[].state",
"devices[].zipCode",
"devices[].distance",
Expand Down
45 changes: 16 additions & 29 deletions src/devices/airqualitysensor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import type { AirNowAirQualityDataArray, AqicnData, devicesConfig } from '../set
import { interval } from 'rxjs'
import { skipWhile } from 'rxjs/operators'
import striptags from 'striptags'
// import { request } from 'undici'
import { request } from 'undici'

import { AirNowUrl, AqicnUrl, HomeKitAQI } from '../settings.js'
import { deviceBase } from './device.js'
Expand Down Expand Up @@ -138,38 +138,25 @@ export class AirQualitySensor extends deviceBase {
const AqicnCurrentObservationBy = this.device.latitude && this.device.longitude ? `geo:${this.device.latitude};${this.device.longitude}` : this.device.city
const AirNowCurrentObservationByValue = this.device.latitude && this.device.longitude ? `latitude=${this.device.latitude}&longitude=${this.device.longitude}` : `zipCode=${this.device.zipCode}`
const providerUrls = {
airnow: `${AirNowUrl}&${AirNowCurrentObservationBy}/current/?format=application/json&${AirNowCurrentObservationByValue}&distance=${this.device.distance}&API_KEY=${this.device.apiKey}`,
airnow: `${AirNowUrl}${AirNowCurrentObservationBy}/current/?format=application/json&${AirNowCurrentObservationByValue}&distance=${this.device.distance}&API_KEY=${this.device.apiKey}`,
aqicn: `${AqicnUrl}${AqicnCurrentObservationBy}/?token=${this.device.apiKey}`,
}
const url = providerUrls[this.device.provider]
await this.debugSuccessLog(`url: ${JSON.stringify(url)}`)
if (url) {
try {
const response = await fetch(url)
const statusCode = response.status
let responseBody: any
let rawBody: string = ''
try {
rawBody = await response.text() // Read the raw response body as text
responseBody = JSON.parse(rawBody) // Parse the raw response body as JSON
} catch (jsonError: any) {
this.errorLog(`Failed to parse JSON response: ${jsonError.message}`)
this.errorLog(`Raw response body: ${rawBody}`)
throw jsonError
}
await this.debugWarnLog(`statusCode: ${JSON.stringify(statusCode)}`)
await this.debugLog(`response: ${JSON.stringify(responseBody)}`)

if (statusCode !== 200) {
this.errorLog(`${this.device.provider === 'airnow' ? 'AirNow' : 'World Air Quality Index'} air quality Network or Unknown Error from %s.`, this.device.provider)
this.AirQualitySensor.StatusFault = this.hap.Characteristic.StatusFault.GENERAL_FAULT
await this.debugLog(`Error: ${JSON.stringify(responseBody)}`)
await this.apiError(responseBody)
} else {
this.deviceStatus = this.device.provider === 'aqicn' ? (responseBody as AqicnData).data : responseBody as AirNowAirQualityDataArray
await this.parseStatus()
}
} catch (error: any) {
this.errorLog(`Request failed: ${error.message}`)
const { body, statusCode } = await request(url)
const response = await body.json()
await this.debugWarnLog(`statusCode: ${JSON.stringify(statusCode)}`)
await this.debugLog(`response: ${JSON.stringify(response)}`)

if (statusCode !== 200) {
this.errorLog(`${this.device.provider === 'airnow' ? 'AirNow' : 'World Air Quality Index'} air quality Network or Unknown Error from %s.`, this.device.provider)
this.AirQualitySensor.StatusFault = this.hap.Characteristic.StatusFault.GENERAL_FAULT
await this.debugLog(`Error: ${JSON.stringify(response)}`)
await this.apiError(response)
} else {
this.deviceStatus = this.device.provider === 'aqicn' ? (response as AqicnData).data : response as AirNowAirQualityDataArray
await this.parseStatus()
}
} else {
await this.errorLog('Unknown air quality provider: %s.', this.device.provider)
Expand Down
10 changes: 9 additions & 1 deletion src/platform.ts
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,14 @@ export class AirPlatform implements DynamicPlatformPlugin {
device.city = device.city ?? 'Unknown'
device.zipCode = device.zipCode ?? '00000'
device.provider = device.provider ?? 'Unknown'
if (device.latitude && device.longitude) {
try {
device.latitude = Number.parseFloat(Number.parseFloat(device.latitude.toString()).toFixed(6))
device.longitude = Number.parseFloat(Number.parseFloat(device.longitude.toString()).toFixed(6))
} catch {
await this.errorLog('Latitude and Longitude must be a number')
}
}
await this.infoLog(`Discovered ${device.city}`)
this.createAirQualitySensor(device)
}
Expand All @@ -158,7 +166,7 @@ export class AirPlatform implements DynamicPlatformPlugin {

private async createAirQualitySensor(device: any) {
// generate a unique id for the accessory
const uuidString = (device.latitude && device.longitude) ? (device.latitude + device.longitude) : (device.zipCode + device.city)
const uuidString = (device.latitude && device.longitude) ? (`${device.latitude}` + `${device.longitude}` + `${device.provider}`) : (`${device.zipCode}` + `${device.city}` + `${device.provider}`)
const uuid = this.api.hap.uuid.generate(uuidString)

// see if an accessory with the same uuid has already been registered and restored from
Expand Down

0 comments on commit 380f1c4

Please sign in to comment.