Write Image to ThingSpeak from Raspberry Pi with Python
This example shows how to write an image to a ThingSpeak® image channel from a Raspberry Pi™ board using Python.
This example uses a Raspberry Pi to capture an image from a camera and write a file locally. Then the image file is sent to ThingSpeak each time a new image is taken. You can use this example for a Raspberry Pi connected to a web cam or a Pi Camera, depending on the lines selected in the provided code.
For a Pi camera, you can use the
raspistill
command. To use this code with a webcam, use fswebcam
, which you can get using
sudo apt-get install fswebcam
Your Pi must have internet access to run this example.
Setup
1) Create a new ThingSpeak image channel as described in Create an Image Channel.
2) Create a new ThingSpeak data channel as described in Collect Data in a New Channel.
3) Add an Image Display widget to the view of your data channel, as described in Image Display.
Code
1) Include the following libraries in your Python code.
#!/usr/bin/python from time import sleep import os import requests import sys
2) Define the variables to specify your Thingspeak channels, credentials, and image file location.
# Update this section with your ThingSpeak Image Channel ID and Image Channel API Key thingspeakImageChannelID = 'YOUR_THINGSPEAK_IMAGE_CHANNEL_ID' thingSpeakImageChannelAPIKey = 'YOUR_THINGSPEAK_IMAGE_CHANNEL_API_KEY' localFileName = '/home/pi/snapshot.jpg' thingSpeakURL = 'https://data.thingspeak.com/channels/' + thingspeakImageChannelID + '/images'
3) Save a snapshot from your Raspberry Pi camera board.
def getSnapshotBytes(): # Use FSWEBCAM to save a screenshot from a webcam. This requires the FSWEBCAM package. # Use raspistill to save a screenshot from a Pi Cam. # Alternatively, you can use OpenCV to directly get the bytestream from the camera. imageByteStream = None returnCode = os.system('fswebcam -r 1024x768 -S 1 -q ' + localFileName) # Use this line for webcam. # returnCode = os.system(‘raspistill -o ‘ + localFileName) # Use this line for a pi cam. if returnCode == 0: fh = open(localFileName, 'rb') imageByteStream = fh.read() fh.close() return imageByteStream
4) Run a loop to capture a snapshot and write it to your ThingSpeak image channel.
def main(): # Loop infinitely while True: # Get image bytes imData = getSnapshotBytes() # POST image to ThingSpeak if there is a valid image if imData is not None: x = requests.post(url = thingSpeakURL, data = imData, headers = {'Content-Type': 'image/jpeg', 'thingspeak-image-channel-api-key': thingSpeakImageChannelAPIKey, 'Content-Length' : str(sys.getsizeof(imData))}) print(x) # Sleep so we do not get locked out of ThingSpeak for posting too fast sleep(30) if __name__=="__main__": main()
Write the Image
Run the code while monitoring the Image Display widget in your page view.