你需要:
首先下载并安装 Xively Python 库。
下载并安装 httplib2 模块。
您可以将“GPIO Sensor”脚本和“Send Data to Xively”脚本结合起来。
这是一个示例代码(适用于 Raspberry Pi 和 DHT 11):
#!/usr/bin/python
# Import required Python libraries
import RPi.GPIO as GPIO
import time
import random
import datetime
import json
import sys
import Adafruit_DHT
# Custom HTTP Library
import httplib2
# Use BCM GPIO references
# instead of physical pin numbers
#GPIO.setmode(GPIO.BCM)
# Define GPIO to use on Pi
# Set pin as input
#GPIO.setup(GPIO_PIR,GPIO.IN)
# Define sensor state (1 by default)
SENSOR_STATE = 1
DHT_TYPE = Adafruit_DHT.DHT11
DHT_PIN = 22
# Define URLs and API key for sending and receiving requests
sensorURL = ""
temperatureURL = ""
humidityURL = ""
API_KEY = ""
# Retrieve latest sensor state from Xively via GET request
def retrieve_sensor_state():
try:
global SENSOR_STATE
print "\nRetrieving from Xively"
h = httplib2.Http(disable_ssl_certificate_validation=True)
(resp_headers, content) = h.request(sensorURL, "GET", headers={'X-ApiKey':API_KEY})
jsonData = json.loads(content)
SENSOR_STATE = jsonData["current_value"]
print "Sensor state: " + SENSOR_STATE
if (SENSOR_STATE == str(1)):
upload_to_xively()
print "continuing!"
else:
print "sensor is disabled!"
except:
print "Error occurred!"
# Upload sensor data to Xively via PUT request
def upload_to_xively():
try:
print "Uploading to Xively"
now = str(datetime.datetime.now())
humidity, value = Adafruit_DHT.read(DHT_TYPE, DHT_PIN)
if humidity is not None and value is not None:
print "temperature value :" + str(value) + " | " + str(now)
print "humidity value :" + str(humidity) + " | " + str(now)
jsonString = {"id":"temperature","tags":[],"unit":{},"current_value":value}
publishString = json.dumps(jsonString)
h = httplib2.Http(disable_ssl_certificate_validation=True)
(resp, content) = h.request(temperatureURL, "PUT", body=publishString, headers={'X-ApiKey':API_KEY})
jsonString1 = {"id":"humidity","tags":[],"unit":{},"current_value":humidity}
publishString1 = json.dumps(jsonString1)
g = httplib2.Http(disable_ssl_certificate_validation=True)
(resp, content) = g.request(humidityURL, "PUT", body=publishString1, headers={'X- ApiKey':API_KEY})
else:
print "failed to read data! Trying again"
except:
print "Error occurred!"
# Callback function from event handler when motion is detected
#def motion_callback(GPIO_PIR):
# global SENSOR_STATE
# Log the sensor data down only if sensor state = 1 (enabled)
# if SENSOR_STATE == str(1):
# if GPIO.input(GPIO_PIR):
# print "\nMotion Detected! @ " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# upload_to_xively()
# time.sleep(1)
# else:
# print "\nBack to Normal"
# Main program
print "DHT Module Test (Ctrl+C to exit)"
time.sleep(2)
print "Ready"
try:
while True:
retrieve_sensor_state()
time.sleep(10)
continue
except KeyboardInterrupt:
print "Quit"
GPIO.cleanup()