Я пытался найти способ правильно читать данные с канала, используя библиотеку xively-python. Я попытался получить current_value, но кажется, что он извлекает только начальное значение, даже после изменения значения в канале в интерфейсе Xively. Например, начальное значение в «команде» канала — «Выход». Это правильно извлекается и выполняется моей программой. Однако, если я завершу программу, обновлю значение канала «команда» до «AA», а затем перезапущу свою программу, она все равно выдаст «Выход». Я тестировал это в течение 10-15 минут и обеспечил более 20 секунд, чтобы убедиться, что оно обновляется правильно.
Глядя на API, я не могу понять, как это сделать. Я хочу получить последнее значение для данного канала. Я использую канал как способ передачи команд между неподключенными устройствами. Я бы хотел регулярно читать канал.
Небольшое примечание, я видел похожую проблему, которая была опубликована год назад, но на нее нет ответа.
РЕДАКТИРОВАТЬ: кажется, что я читаю current_value только один раз в начале программы на основе канала HTTP-запросов Xively, код, который я использую, таков:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#import serial library and sleep from the time library
import serial
from time import sleep
import xively
import requests
from datetime import datetime
#declare port and baud rate then open conn
port = '/dev/ttyAMA0'
baud = 9600
ser = serial.Serial(port=port, baudrate = baud)
#xively variables
FEED_ID = "1032676103"
API_KEY = "FZ2IOZkDW5ZXAITh6kqqUVkZEIBfNk6y2SKxgx4DDDVLxi46"
#xively connection function reutrning a datastream handle
def open_connection(feed,target):
try:
datastream = feed.datastreams.get(target)
print("Channel " + target + " found!")
return datastream
except:
datastream = feed.datastreams.create(target)
print("Channel " + target + " not found,new channel created!")
return datastream
#push function
def push(target,value):
target.current_value = value
target.at = datetime.utcnow()
try:
target.update()
except requests.HTTPError as e:
print "HTTPError({0}): {1}".format(e.errno,e.strerror)
#pop function
def pull():
command = open_connection(feed,"Command")
command.at = datetime.utcnow()
sleep(0.2)
#return target.get(datetime.utcnow())
return command.current_value
#check status of board 1 relay A
def status_one():
ser.write('aAARELAYA---')
sleep(0.2)
reply = ser.read(12)
sleep(0.2)
relayAA = reply[9:]
relayAA = relayAA.strip('-')
return relayAA
#check status of board 2 relay A
def status_two():
ser.write('aBBRELAYA---')
sleep(0.2)
reply = ser.read(12)
relayBA = reply[9:]
relayBA = relayBA.strip('-')
return relayBA
#toggle boardAA relay A function
def toggle_aa():
ser.write('aAARELAYATOG')
sleep(0.2)
reply = ser.read(12)
print(reply)
sleep(0.2)
#toggle boardBB relay A function
def toggle_bb():
ser.write('aBBRELAYATOG')
sleep(0.2)
reply = ser.read(12)
print(reply)
sleep(0.2)
#setup and initial push to Xively
ser.flushInput()
api = xively.XivelyAPIClient(API_KEY)
feed = api.feeds.get(FEED_ID)
oneastatus = open_connection(feed,"Relay_1A")
twoastatus = open_connection(feed,"Relay_2A")
hubstatus = open_connection(feed,"Relay_Data")
#command = open_connection(feed,"Command")
hub = 1
push(hubstatus,hub)
relayAA = status_one()
print(relayAA)
push(oneastatus,relayAA)
relayBA = status_two()
print(relayBA)
push(twoastatus,relayBA)
#loop section - command handling
while hub:
#operator = pull(command)
operator = pull()
sleep(0.2)
print(operator)
#command to toggle AA
if operator == 'AA':
toggle_aa()
sleep(0.2)
relayAA = status_one()
push(oneastatus,relayAA)
sleep(0.2)
#command to toggle BA
if operator == 'BA':
toggle_bb()
sleep(0.2)
relayBA = status_two()
push(twoastatus,relayBA)
sleep(0.2)
#command to shutdown
if operator == 'Exit':
hub = 0
#close conn
push(hubstatus,hub)
ser.close
Как вы можете видеть, я сначала попытался создать соединение с переменной «команда» один раз, а затем попытался создать его внутри цикла, чтобы посмотреть, изменило ли это что-то. Мне нужно, чтобы он читал current_value канала так же часто, как обновляются данные, или, по крайней мере, на полурегулярной основе, чтобы разрешить отправку и выполнение команд.