2017-08-11 1 views
0

OWFS permet de lire les périphériques 1 fil via d'autres interfaces, I2C (DS2484) dans mon cas. Je peux lire avec succès une température (DS18B20 s) à la fois via l'interface owhttpd au http://localhost:4305/28.2F3915060000. Je peux aussi les lire en utilisant l'interface python:owfs - lire tous les capteurs simultanément

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

Cependant, j'ai 30 capteurs. Cette méthode lit un à la fois. Chacun prend 500-750ms, donc tout le processus prend peut-être 17s. L'une des choses les plus intéressantes à propos de 1 fil est que vous pouvez demander à tous les capteurs de lire en parallèle en même temps, ce qui est l'étape lente, puis de les signaler séquentiellement, ce qui est assez rapide. Est-ce que l'OWFS peut les lire de cette manière?

Répondre

1

J'ai trouvé une solution très inélégante, mais cela fonctionne. This old discussion board message suggère que le pseudofichier simultaneous/temperature d'OWFS est le bon début. Le message ne résout pas ce qu'il faut faire après cela et il semble que toutes les fonctions de température demandent une nouvelle lecture de la température. Mais vous pouvez lire le bloc-notes sans demander une nouvelle lecture.

Voici le code que je suis travail:

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)) 

je serais intéressé à voir si quelqu'un a une solution qui ne nécessite pas des conversions de température manuelles. Je pense toujours que c'est possible, je ne trouve tout simplement pas la documentation.