owfs- читать все датчики одновременно

OWFS позволяет нам считывать однопроводные устройства через другие интерфейсы, в моем случае I2C ( DS2484). Я могу успешно прочитать одну температуру ( DS18B20 с) за раз через интерфейс owhttpd в http://localhost:4305/28.2F3915060000, Я также могу прочитать их, используя интерфейс Python:

import pyownet
ow = pyownet.protocol.proxy(host='localhost', port=4304)
for ts in ow.dir():
    print(ow.read(ts + 'temperature12'))

Тем не менее, у меня есть 30 датчиков. Этот метод читает по одному. Каждый занимает 500-750 мс, поэтому весь процесс занимает, возможно, 17 с.

Одна из приятных вещей, связанных с 1 проводом, заключается в том, что вы можете запросить одновременное считывание всех датчиков одновременно, что является медленным шагом, а затем сделать так, чтобы они сообщали последовательно, что довольно быстро. OWFS как-то поддерживает их чтение?

1 ответ

Я нашел очень не элегантное решение, но оно работает. Это старое сообщение на форуме предполагает, что использование OWFS simultaneous/temperature псевдофайл является правильным началом. Сообщение не решает, что делать после этого, и кажется, что все температурные функции запрашивают новое показание температуры. Но вы можете читать блокнот, не запрашивая новое чтение.

Вот код, который я получил, работая:

import pyownet
from time import sleep


ow = pyownet.protocol.proxy(host='localhost', port=4304)
ow.write('simultaneous/temperature', data=b'1')    # begin conversions
sleep(0.75)                                        # need to wait for conversion
for ts in ow.dir():
    sp = ow.read(ts + 'scratchpad')
    b = sp[:2]                                     # first two bytes are temp
    if b[1] <= 0x01:
        t = ((b[1] << 8) + b[0]) * 0.0625          # positive temps
    else:
        t = 4096. - ((b[1] << 8) + b[0]) * 0.0625  # negative temps
    addr = ow.read(ts + 'address')
    print((addr, sp, t))

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

Другие вопросы по тегам