I have no experience with the DS2413, but if I understand correctly the manual,
here is a list of valid commands:
owproxy.write('device_id' + '/PIO.A, b'1’) # A on
owproxy.write('device_id' + '/PIO.A, b’0’) # A off
owproxy.write('device_id' + '/PIO.B, b'1’) # B on
owproxy.write('device_id' + '/PIO.B, b’0’) # B off
owproxy.write('device_id' + '/PIO.ALL, b’1,1’) # both on
owproxy.write('device_id' + '/PIO.ALL, b’0,0’) # both off
owproxy.write('device_id' + ‘/PIO.BYTE', b’\x03’) # both on
owproxy.write('device_id' + ‘/PIO.BYTE', b’\x00’) # both off
In fact from the Manual page DS2413(3):
PIO.A PIO.B PIO.ALL PIO.BYTE
read-write, yes-no
State of the open-drain output ( PIO ) pin. 0 = non-conducting (off), 1
= conducting (on).
Writing zero will turn off the switch, non-zero will turn on the
switch. Reading the PIO state will return the switch setting. To deter-
mine the actual logic level at the switch, refer to the sensed prop-
erty.
ALL references both channels simultaneously, comma separated.
BYTE references both channels simultaneously as a single byte, with
channel A in bit 0.
If I got this right, then owserver on PIO.A is expecting a single byte, with
character ‘1’ or ‘0’, ascii encoded ( python literals b’1’ or b’0’). PIO.BYTE
instead is a single byte in which bit 0 is channel A, and bit 1 is channel B,
so here I have to transmit a byte with integer values 0, 1, 2, or 3, (python
literals b’\x00’, b’\x01’, b’\x03’, b’\x03’). PIO.ALL should be 3 bytes, e.g.
b’0,1’.
Just to clarify the python3 literals:
>>> b'1' == b'\x31'
True
>>> b'0' == b'\x30'
True
>>> bytes.fromhex('00')
b'\x00'
>>> bytes.fromhex('deadbeef')
b'\xde\xad\xbe\xef'
>>> bytes(range(8))
b'\x00\x01\x02\x03\x04\x05\x06\x07'
Hope this helps.
Stefano
> On 27 Aug 2020, at 19:47, Mick Sulley <[email protected]> wrote:
>
> Yes I have struggled with that as well. I have discovered how to do it, but
> I don't really understand why.
>
> The answer seems to be that to write a 1 you need
>
> owproxy.write('device_id' + '/PIO.BYTE, b'1')
>
> so you need to write the byte value of the string 1, not the byte value of
> the integer 1. As I say, I don't understand why that is so, I dabble with
> Python, I'm far from expert :)
>
> Hope that helps
>
> Mick
>
> On 27/08/2020 15:18, Dennis Putnam wrote:
>> Hi Martin,
>>
>> See embedded comments.
>>
>> On 8/27/2020 2:56 AM, Martin Patzak wrote:
>>>
>>> what does onOff.to_bytes(1,byteorder=sys.byteorder)) evaluate to? Is that
>>> resulting in a byte-value? I am not familiar with this...
>> This seems to be the crux of the problem. After a lot of testing it appears
>> to be a python 3 issue converting an integer to a byte string. I am
>> convinced that passing a byte string to the write function is the problem.
>> Thanks for everyone's help but this is not an owfs problem.
>>>
>>> Things you could try:
>>> In the path use the fully qualifying path and add /uncached and write a
>>> byte-value like this
>>> owproxy.write('/uncached/3A.0BE14D000000/PIO.BYTE',b'0')
>>> write to the individual outputs PIO.A or PIO.B directly
>>> try reading the sensed values print('sensed.BYTE = ',
>>> owp.read('/uncached/3A.0BE14D000000/sensed.BYTE')
>>>
>>> On 26.08.20 21:05, Dennis Putnam wrote:
>>>> I have rewritten my code to use pyownet but am now nearly back where I
>>>> started. I have the following code:
>>>>
>>>> owproxy.write('/3A.'+blower.id_+'/PIO.BYTE',onOff.to_bytes(1,byteorder=sys.byteorder))
>>>>
>>>> That statement gives me the following error:
>>>>
>>>> pyownet.protocol.OwnetError: [Errno 22] legacy - Invalid transaction:
>>>> '/3A.0BE14D000000/PIO.BYTE'
>>>>
>>>> The error is meaningless to me. The path is not wrong so is it complaining
>>>> about writing a single byte?
>>>>
>>>> Thanks again.
>>>>
>>>> On 8/24/2020 4:33 PM, Dennis Putnam wrote:
>>>>> Thanks to everyone that replied. I was not aware of pyownet. I will look
>>>>> into that and rewrite my code to use it.
>>>>>
>>>>> On 8/24/2020 11:47 AM, Martin Patzak wrote:
>>>>>> For python I would highly recommend you use the library pyownet by
>>>>>> Stefano Miccoli
>>>>>> https://github.com/miccoli/pyownet/ <https://github.com/miccoli/pyownet/>
>>>>>>
>>>>>> using Fuse can lead to weird problems... (not saying that it is the
>>>>>> reason in your specific case)
>>>>>>
>>>>>> or you can use the buil-in functions in owserver owread/owwrite/owdir
>>>>>> instead.
>>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient&utm_term=icon>
>>>> Virus-free. www.avast.com
>>>> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient&utm_term=link>
>>>> <x-msg://4/#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2>
>>
>>
>>
>>
>> _______________________________________________
>> 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