Integrating Multiple Grove Sensors with an IoT Service

Here is the code with the combined UV / Temp & Humidity sensors. Needs to include Air Quality Sensor logic which I already posted.

#!/usr/bin/env python
#
# This is the code for Grove - UV Sensor
# (https://www.seeedstudio.com/Grove-UV-Sensor-p-1540.html)
#
# This is the library used with Grove Base Hat for RPi.

from __future__ import print_function
import time, sys, signal, atexit, json, seeed_dht
from upm import pyupm_veml6070 as veml6070
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTShadowClient

#thingName = 'UVSensor'
#clientId = 'UVSensor'
#endpoint = 'a3pujgfo1m12iq-ats.iot.us-west-2.amazonaws.com'
#rootCA = '/usr/local/lib/python3.7/dist-packages/grove/Certs/AmazonRootCA1.pem'
#cert = '/usr/local/lib/python3.7/dist-packages/grove/Certs/b4f241635b-certificate.pem.crt'
#key = '/usr/local/lib/python3.7/dist-packages/grove/Certs/b4f241635b-private.pem.key'
#port = 8883

thingName = 'RaspberryPi001'
clientId = 'RaspberryPi001'
endpoint = 'a3pujgfo1m12iq-ats.iot.us-west-2.amazonaws.com'
 rootCA = '/usr/local/lib/python3.7/dist-packages/grove/Certs/AmazonRootCA1.pem'
 cert = '/usr/local/lib/python3.7/dist-packages/grove/Certs/96c23c7d37-certificate.pem.crt'
 key = '/usr/local/lib/python3.7/dist-packages/grove/Certs/96c23c7d37-private.pem.key'
 port = 8883


def main():
    

# Instantiate a Vishay UV Sensor on the I2C bus 0

veml6070_sensor = veml6070.VEML6070(0)

 # for DHT11/DHT22

sensor = seeed_dht.DHT("22", 12)

# for DHT10

# sensor = seeed_dht.DHT("10")

## Exit handlers ##

# This function stops python from printing a stacktrace when you hit control-C

def SIGINTHandler(signum, frame):

    raise SystemExit

# This function lets you run code on exit, including functions from abpdrrt005pg2a5

def exitHandler():

    print("Exiting")

    sys.exit(0)

# Register exit handlers

atexit.register(exitHandler)

signal.signal(signal.SIGINT, SIGINTHandler)

# Read the value every second and detect the pressure
while(1):
    humi, temp = sensor.read()
    if not humi is None:
        print('DHT{0}, humidity {1:.1f}%, temperature {2:.1f}*'.format(sensor.dht_type, humi, temp))
    else:
        print('DHT{0}, humidity & temperature: {1}'.format(sensor.dht_type, temp))
    #deviceShadowHandler.shadowUpdate(json.dumps(payload), customShadowCallback_Update, 5)
    time.sleep(1)

    UVLevel = veml6070_sensor.getUVIntensity()
    #print("UVLevel: " + str(UVLevel))
    print("UV* Value: {0}".format(veml6070_sensor.getUVIntensity()))
    # Create message payload with dht and uv
    payload = {"state":{"reported":{"UVIntensity":int(UVLevel),"humidity":int(humi),"temperature":int(temp)}}}
    # Update shadow
    deviceShadowHandler.shadowUpdate(json.dumps(payload),customShadowCallback_Update, 5)
    time.sleep(10)

# Function called when a shadow is updated

def customShadowCallback_Update(payload, responseStatus, token):

# Display status and data from update request

if responseStatus == "timeout":

    print("Update request " + token + " time out!")

if responseStatus == "accepted":

    payloadDict = json.loads(payload)

    print("~~~~~~~~~~~~~~~~~~~~~~~")

    print("Update request with token: " + token + " accepted!")

    print("UV Level: " + str(payloadDict["state"]["reported"]["UVIntensity"]))

    print("~~~~~~~~~~~~~~~~~~~~~~~\n\n")

if responseStatus == "rejected":

    print("Update request " + token + " rejected!")

# Function called when a shadow is deleted

def customShadowCallback_Delete(payload, responseStatus, token):

   # Display status and data from delete request

 if responseStatus == "timeout":

    print("Delete request " + token + " time out!")

 if responseStatus == "accepted":

    print("~~~~~~~~~~~~~~~~~~~~~~~")

    print("Delete request with token: " + token + " accepted!")

    print("~~~~~~~~~~~~~~~~~~~~~~~\n\n")

 if responseStatus == "rejected":

    print("Delete request " + token + " rejected!")

# Configure logging

# AWSIoTMQTTShadowClient writes data to the log

def configureLogging():
      logger = logging.getLogger("AWSIoTPythonSDK.core")
      logger.setLevel(logging.DEBUG)
      streamHandler = logging.StreamHandler()
      formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
     streamHandler.setFormatter(formatter)
     logger.addHandler(streamHandler)

# Init AWSIoTMQTTShadowClient

myAWSIoTMQTTShadowClient = None

myAWSIoTMQTTShadowClient = AWSIoTMQTTShadowClient(clientId)

myAWSIoTMQTTShadowClient.configureEndpoint(endpoint, port)

myAWSIoTMQTTShadowClient.configureCredentials(rootCA, key, cert)

# AWSIoTMQTTShadowClient connection configuration

myAWSIoTMQTTShadowClient.configureAutoReconnectBackoffTime(1, 32, 20)

myAWSIoTMQTTShadowClient.configureConnectDisconnectTimeout(10) # 10 sec

myAWSIoTMQTTShadowClient.configureMQTTOperationTimeout(5) # 5 sec

# Connect to AWS IoT

myAWSIoTMQTTShadowClient.connect()

# Create a device shadow handler, use this to update and delete shadow document

deviceShadowHandler = myAWSIoTMQTTShadowClient.createShadowHandlerWithName(thingName, True)

# Delete current shadow JSON doc

# deviceShadowHandler.shadowDelete(customShadowCallback_Delete, 5)

if __name__ == '__main__':

main()