Hackster is hosting Hackster Holidays, Ep. 5: Livestream & Giveaway Drawing. Watch previous episodes or stream live on Friday!Stream Hackster Holidays, Ep. 5 on Friday!
Jerry Zhang
Created August 6, 2020 © CC BY-NC-SA

City Data Tracker

Collect air quality, weather, road, and other data using a low power device mounted to your vehicle

AdvancedFull instructions provided20 hours892
City Data Tracker

Things used in this project

Hardware components

Helium Developer Kit
Helium Developer Kit
×1

Software apps and online services

AWS IoT
Amazon Web Services AWS IoT
Helium Console
AWS Lambda
Amazon Web Services AWS Lambda
MongoDB

Story

Read more

Code

AWS Lambda Script

Python
import json
import base64
import os
import math
import pymongo
from datetime import datetime

# from botocore.vendored import requests
mongoURL = "mongodb+srv://" + os.environ['MONGO_USERNAME'] + ":" + os.environ['MONGO_PWD'] + "@" + os.environ['MONGO_URL'] + "?retryWrites=true&w=majority"
client = pymongo.MongoClient(mongoURL)
db = client["test"]
collection = db["sensor"]

def lambda_handler(event, context):
    print(event['payload'])
    decoded = base64.b64decode(event['payload'])
    print(decoded)
    print(list(decoded))
    data = list(decoded)
    count = 0
    outDict = {}
    while count+2 < len(data):
        dataID = str(data[count])
        dataType = data[count+1]
        if dataType == 3: # Analog output
            dataNum = data[count+2] + data[count+3] * 0.01
            print(dataNum)
            count = count + 4
            outDict[dataID] = {"type": "ANALOG", "data": dataNum}
        elif dataType == 136: # GPS Loc
            parta, neg = process_hex(str(hex(data[count+2]))[-2:], partA=True)
            partb, throwaway = process_hex(str(hex(data[count+3]))[-2:])
            partc, throwaway = process_hex(str(hex(data[count+4]))[-2:])
            total = parta + partb + partc
            print(total)
            lat = int(total, 16)
            if neg:
                print(neg)
                lat = lat - int(neg, 16)*math.pow(16, 5)
                # DO STUFF
            lat = lat/10000
            print(lat)

            parta, neg = process_hex(str(hex(data[count+5]))[-2:], partA=True)
            partb, throwaway = process_hex(str(hex(data[count+6]))[-2:])
            partc, throwaway = process_hex(str(hex(data[count+7]))[-2:])
            total = parta + partb + partc
            lon = int(total, 16)
            if neg:
                print(neg)
                lon = lon - int(neg, 16)*math.pow(16, 5) + (int(neg, 16) - 16)*math.pow(16, 5)
            lon = lon/10000
            print(lon)

            parta, throwaway = process_hex(str(hex(data[count+8]))[-2:])
            partb, throwaway = process_hex(str(hex(data[count+9]))[-2:])
            partc, throwaway = process_hex(str(hex(data[count+10]))[-2:])
            total = parta + partb + partc
            # print(total)
            alt = int(total, 16)/100
            outDict[dataID] = {"type": "GPS", "data": {"lat": lat, "lon": lon, "alt": alt}}
            count = count + 11
        elif event['payload'] == 'VGltZXIA': # Heartbeat
            print("Heartbeat")
            break
    print(outDict)
    if outDict:
        outDict['time'] = datetime.utcnow()
        collection.insert_one({"data": outDict, "time": datetime.utcnow(), "deviceID": "1"}) # TODO FIX DEVICE ID
    return 0

def process_hex(hexVal, partA=False):
    print(hexVal)
    if hexVal[0] == 'x':
        print("A", hexVal)
        return '0' + hexVal[1], 0
    elif partA and int(hexVal[0], 16) > 7:
        print("B", hexVal)
        return hexVal, hexVal[0]
    else:
        print("C", hexVal)
        return hexVal, 0

Credits

Jerry Zhang

Jerry Zhang

11 projects • 15 followers

Comments