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.
