Чтение последнего значения из канала xively с использованием python

Я пытался найти способ правильно читать данные с канала, используя библиотеку 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 канала так же часто, как обновляются данные, или, по крайней мере, на полурегулярной основе, чтобы разрешить отправку и выполнение команд.


person user3574526    schedule 25.04.2014    source источник
comment
Было бы здорово, если бы вы предоставили небольшой фрагмент кода, воспроизводящий проблему. Похоже, это может быть ошибка в библиотеке Python, возможно, вы также можете попробовать воспроизвести это без использования библиотеки и просто делать запросы REST вручную...   -  person errordeveloper    schedule 26.04.2014
comment
Я не могу опубликовать свой код до вторника, а пока вот структура кода. Я добавил --- чтобы указать нерелевантный раздел кода (т.е. работать до реализации чтения) #объявить переменные, установить соединения с потоками данных и т. д. --- command = open_connection(command) #функции для вызова --- --- --- def pull(datastream): return datstream.current_value --- --- #Setup --- #Вход в основной цикл while status: operator = pull(command) print(operator) --- --- --- #закрыть соединение   -  person user3574526    schedule 26.04.2014
comment
Пожалуйста, отредактируйте вопрос и поместите туда код всякий раз, когда он у вас есть, его невозможно прочитать в комментарии.   -  person errordeveloper    schedule 26.04.2014
comment
Код теперь находится в исходном сообщении с объяснением того, как далеко я продвинулся на сегодняшний день, спасибо за любую помощь !!!   -  person user3574526    schedule 29.04.2014
comment
Кто-нибудь может помочь решить эту проблему? Я не слишком горжусь, чтобы признать, что у меня осталось около 4 часов, чтобы исправить это, и мои усилия, похоже, ни к чему не приводят.   -  person user3574526    schedule 06.05.2014


Ответы (1)


Я пробовал это в REPL и не понимаю, почему у вас возникла проблема.

[xively-python] 0 %> python
requPython 2.7.5 (default, Aug 25 2013, 00:04:04) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import xively
>>> FEED_ID = "1032676103"
>>> API_KEY = "FZ2IOZkDW5ZXAITh6kqqUVkZEIBfNk6y2SKxgx4DDDVLxi46"
>>> api = xively.XivelyAPIClient(API_KEY)
>>> f = api.feeds.get(FEED_ID)
>>> d = f.datastreams.get('Command')
>>> print(d.current_value)
Exit

Затем я изменил значение на рабочем столе Xively на Exit2, и это сработало:

>>> d = f.datastreams.get('Command')
>>> print(d.current_value)
Exit2

Теперь я возвращаю значение обратно к Exit, и это тоже выглядит хорошо:

>>> d = f.datastreams.get('Command')
>>> print(d.current_value)
Exit
person errordeveloper    schedule 06.05.2014
comment
Может ли это быть проблемой с реализацией библиотеки Python? Я не вижу разницы между вашим методом и моим или вашим процессом тестирования. Я попробую еще раз и посмотрю, работает ли это. - person user3574526; 06.05.2014