2023-02-07 08:49:20 -05:00
|
|
|
import urequests
|
|
|
|
|
|
|
|
from . import logging
|
|
|
|
from .config import config
|
|
|
|
from .config import secrets
|
|
|
|
|
|
|
|
|
|
|
|
class AdafruitIO:
|
|
|
|
def __init__(self):
|
2023-02-09 12:05:49 -05:00
|
|
|
self.hostname = config['hostname']
|
2023-02-07 08:49:20 -05:00
|
|
|
|
|
|
|
self.headers = {
|
|
|
|
'x-aio-key': secrets['adafruit_io_key'],
|
|
|
|
'content-type': 'application/json'
|
|
|
|
}
|
|
|
|
|
|
|
|
group = config['adafruit_io_group']
|
|
|
|
username = secrets['adafruit_io_username']
|
|
|
|
self.url = f'https://io.adafruit.com/api/v2/{username}/groups/{group}/data'
|
|
|
|
|
|
|
|
def upload(self, reading):
|
2023-02-08 08:30:26 -05:00
|
|
|
result = self.uploadReading(reading)
|
2023-02-07 08:49:20 -05:00
|
|
|
|
|
|
|
try:
|
|
|
|
if result.status_code != 200:
|
|
|
|
self.logError(result)
|
|
|
|
return False
|
|
|
|
|
|
|
|
return True
|
|
|
|
finally:
|
|
|
|
result.close()
|
|
|
|
|
2023-02-08 08:30:26 -05:00
|
|
|
def uploadReading(self, reading):
|
|
|
|
return urequests.post(
|
|
|
|
self.url,
|
|
|
|
json=self.createPayload(reading),
|
|
|
|
headers=self.headers
|
|
|
|
)
|
|
|
|
|
2023-02-07 08:49:20 -05:00
|
|
|
def createPayload(self, reading):
|
|
|
|
payload = {
|
|
|
|
'created_at': reading['timestamp'],
|
|
|
|
'feeds': []
|
|
|
|
}
|
|
|
|
|
|
|
|
for key, value in reading['readings'].items():
|
|
|
|
payload['feeds'].append({
|
2023-02-09 12:05:49 -05:00
|
|
|
'key': f'{self.hostname}-{key}',
|
2023-02-07 08:49:20 -05:00
|
|
|
'value': str(value)
|
|
|
|
})
|
|
|
|
|
|
|
|
return payload
|
|
|
|
|
|
|
|
def logError(self, result):
|
2023-02-08 08:30:26 -05:00
|
|
|
status = result.status_code
|
2023-02-10 10:52:14 -05:00
|
|
|
reason = result.reason.decode('utf-8')
|
2023-02-07 08:49:20 -05:00
|
|
|
error_message = self.getErrorMessage(result)
|
|
|
|
|
2023-02-08 08:30:26 -05:00
|
|
|
logging.debug(f'Adafruit IO upload issue: {status} {reason} - "{error_message}"')
|
2023-02-07 08:49:20 -05:00
|
|
|
|
|
|
|
def getErrorMessage(self, result):
|
|
|
|
try:
|
|
|
|
return result.json()['error']
|
|
|
|
except (TypeError, KeyError):
|
|
|
|
return ''
|