I agree that using the “persistent” network object for the present use case
could speed up things, see
<https://pyownet.readthedocs.io/en/latest/protocol.html#persistent-vs-non-persistent-proxy-objects
<https://pyownet.readthedocs.io/en/latest/protocol.html#persistent-vs-non-persistent-proxy-objects>>
However the correct call to obtain a persistent object is
owp = pyownet.protocol.proxy(persistent=True)
Stefano
PS
In the example code provided there is no need to close the connection, but the
typical usage pattern is
with owp:
# loop reading sensors, persistent connection is open
# do some work, persistent connection is closed
which ensures that the persistent connection is closed upon exit of the `with`
block and does not remain open when the program is not querying owserver.
E.g.
def main():
sen_lst = [
"Solar_Pnl_1A",
"Solar_Pnl_2A",
"Solar_Pnl_1B",
"Pool_Sol_X",
"Pool_CH_X",
"DHW_Mid_Top",
"DHW_Mid_Btm",
"DHW_Top",
"Temp5",
"Temp19",
"Temp20",
"Temp21",
"Temp22",
"Temp23",
"Temp25",
"Temp26",
"Temp27",
"Temp29",
"Temp30",
]
prop_lst = ["/type", "/power", "/latesttemp"]
owp = pyownet.protocol.proxy(persistent=True)
while True:
start = time.time()
with owp:
# persistent socket is open!
owp.write("/simultaneous/temperature", b"1")
time.sleep(1)
print("start of sensor_read.py")
for p in prop_lst:
print("%s " % p, end="")
print("")
for sen in sen_lst:
print("\n%s " % sen, end="")
for prop in prop_lst:
try:
print(
"%s " % (owp.read("/uncached/" + sen +
prop).decode()), end=""
)
except:
print("failed! ", end="")
endt = time.time() - start
print("\nTime = %f" % endt)
# out of with block persistent socket is closed
sleep(30) # do some other work, and then start again
> On 6 Aug 2020, at 13:31, Martin Patzak <[email protected]> wrote:
>
> I read the CRC16 attribute from /statistics
>
> CRC16_error = op.read('/statistics/errors/CRC16_errors')
>
> where op is the persistent(!) pyownet object, created like this:
>
> from pyownet import protocol
>
> op = protocol.proxy(server,port=port)
>
> On 06.08.20 11:23, Mick Sulley wrote:
>> OK I will log read times and see what that shows.
>>
>> You say 'I also log if the error of the 1wire bus changes.' how do you do
>> that?
>>
>> No I don't really need to read that fast, this is just a test setup to get a
>> better understanding so I can hopefully fine tune my main system.
>>
>> There should not be anything else running. I just tried running top at the
>> same time, I monitored it at the point of the slow scan and didn't see
>> anything else significant.
>>
>> Mick
>>
>> On 06/08/2020 09:06, Martin Patzak wrote:
>>> It looks like your timing has improved after all!
>>>
>>> in your original Python-code you could time every read for each sensor.
>>> I have also powered sensors and a read is usually faster than 0.1 seconds.
>>> I log in a file if the read took longer than 0.3 seconds, which is almost
>>> never the case.
>>> I also log in the file if the whole reading loop took longer than 3
>>> seconds, which again is almost never the case.
>>>
>>> I also log if the error of the 1wire bus changes.
>>>
>>> I read 25 sensors every full and every half minute, so maybe you could
>>> implement a delay as well and see if things get more consistent.
>>> Do you need to read so fast in a loop for you application?
>>>
>>> What else is running on your machine? You could run top in parallel to your
>>> python loop.
>>>
>>>
>>
>>
>>
>> _______________________________________________
>> Owfs-developers mailing list
>> [email protected]
>> <mailto:[email protected]>
>> https://lists.sourceforge.net/lists/listinfo/owfs-developers
>> <https://lists.sourceforge.net/lists/listinfo/owfs-developers>
>
> _______________________________________________
> Owfs-developers mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/owfs-developers
_______________________________________________
Owfs-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/owfs-developers