2014-01-23 6 views
1

меня Дэвис Vantagepro 2 метеостанции, и я использую pyvantagepro (пункта установить pyvantagepro/GitHub), чтобы получить текущие данные из терминального устройства. Все хорошо работает, когда температура наружного воздуха выше 0 градусов по Фаренгейту, но, к сожалению, в Финляндии это похоже только на июль. Когда температура опускается ниже 0 градусов по Фаренгейту, pyvantagepro возвращает значение TempOut примерно 6549.098 (3620.61 ° C).Python + Pyvantagepro: TempOut «переворачивается», когда ниже 0 Фаренгейт

Кто-то предположил, что проблема может заключаться в том, что температура является неподписанным 16-битным целым числом, и именно поэтому она переворачивается в этой точке.

У меня нет знаний о том, как исправить это. Я попытался изменить LOOP_FORMAT на файл parser.py pyvantagepro из («TempOut», «H») на «TempOut», «I») в надежде на то, что более крупные значения будут вписываться, но тогда ничего не работает.

Любые предложения о том, как заставить это работать? У меня нет особых оснований использовать эту и только эту библиотеку, поэтому не стесняйтесь предлагать лучшие библиотеки (лучше, так как они удобны в использовании и подтверждают правильность возврата температуры ниже 0 градусов по Фаренгейту).

Я бы разместил это на трекерах по проектам, если был один (404).

Спасибо.

[Edit].

Он фиксируется на текущей версии, и теперь есть проблема трекер.

ответ

0

Согласно python struct documentation формату спецификаторам H и I оба для неподписанных типов данных. Что происходит, так это то, что по мере того, как число опускается ниже нуля, переменные unsigned обертываются вокруг числовой линии и становятся очень большими положительные номера.

Скорее всего, вы можете попробовать использовать нижний регистр h в формате parser.py строке для подписанного 16 битного междунара, однако можно заметить некоторые странные значения:

val = struct.pack('H', 100) 
struct.unpack('h', val)[0] 
# 100, YAY! 

val = struct.pack('H', 32768) 
struct.unpack('h', val)[0] 
# -32768, UMMM? 

Конечно, это, вероятно, не будет проблема в Финляндии, поскольку в большинстве дней недели температура, вероятно, будет ниже 3,276.7 farenheit, однако ее немного уродливая модификация клиентской библиотеки, поскольку это означает, что вы должны делать это каждый раз, когда они предоставляют обновления.

Возможно, вам лучше применить некоторые базовые исправления в своем собственном коде - проверить, завершена ли переменная и вычитает правильную сумму. Например, посмотрите на следующее:

struct.unpack('H', struct.pack('h', -1))[0] 
# 65535 

struct.unpack('H', struct.pack('h', -1))[0] - 65536 
# -1 

Конечно, мы только хотим, чтобы вычесть 65000, когда мы знаем, что наша ценность завязал. Как клиентская библиотека, как представляется, разделить полученное значение на 10, чтобы получить десятичную точку, вы могли бы сделать что-то вроде этого:

if temp_value > 3276.7: 
    temp_value -= 6553.5 

Постоянных значений здесь на основе максимального значения без знака короткого (65535) и подписанный короткий (половина этого значения). В долгосрочной перспективе также может быть полезно связаться с прибором, чтобы описать вашу проблему и посмотреть, что они предлагают.