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