Read a encodable value in a array
-
Hello ,
I try to read encodable value in a array withReadPropertyRequest(ObjectIdentifier objectIdentifier, PropertyIdentifier propertyIdentifier, UnsignedInteger propertyArrayIndex)
For an ack requred in notification class i get
[list]
com.serotonin.bacnet4j.exception.ErrorAPDUException: ErrorAPDU(choice=12, errorClass=Property, errorCode=Property is not an array)
at com.serotonin.bacnet4j.LocalDevice.send(LocalDevice.java:434)
at com.serotonin.bacnet4j.LocalDevice.send(LocalDevice.java:415)
at com.serotonin.bacnet4j.LocalDevice.send(LocalDevice.java:408)
at com.sauter_controls.jbacnet.Test.read(Test.java:432)
at com.sauter_controls.jbacnet.Test.startTest(Test.java:312)
at com.sauter_controls.jbacnet.Test.<init>(Test.java:94)
at com.sauter_controls.jbacnet.Test.main(Test.java:75)
Exception in thread "main" java.lang.NullPointerException
at com.sauter_controls.jbacnet.Test.read(Test.java:445)
at com.sauter_controls.jbacnet.Test.startTest(Test.java:312)
at com.sauter_controls.jbacnet.Test.<init>(Test.java:94)
at com.sauter_controls.jbacnet.Test.main(Test.java:75)
[/list]For an priority array in Analog output i get
[list]
com.serotonin.bacnet4j.exception.BACnetErrorException: Property: Property is not a list
at com.serotonin.bacnet4j.type.Encodable.readEncodable(Encodable.java:307)
at com.serotonin.bacnet4j.service.acknowledgement.ReadPropertyAck.<init>(ReadPropertyAck.java:88)
at com.serotonin.bacnet4j.service.acknowledgement.AcknowledgementService.createAcknowledgementService(AcknowledgementService.java:46)
at com.serotonin.bacnet4j.apdu.ComplexACK.parseServiceData(ComplexACK.java:191)
at com.serotonin.bacnet4j.npdu.ip.IpMessageControl.waitForAck(IpMessageControl.java:681)
at com.serotonin.bacnet4j.npdu.ip.IpMessageControl.send(IpMessageControl.java:300)
at com.serotonin.bacnet4j.npdu.ip.IpMessageControl.send(IpMessageControl.java:280)
at com.serotonin.bacnet4j.npdu.ip.IpMessageControl.send(IpMessageControl.java:237)
at com.serotonin.bacnet4j.LocalDevice.send(LocalDevice.java:425)
at com.serotonin.bacnet4j.LocalDevice.send(LocalDevice.java:415)
at com.serotonin.bacnet4j.LocalDevice.send(LocalDevice.java:408)
at com.sauter_controls.jbacnet.Test.read(Test.java:432)
at com.sauter_controls.jbacnet.Test.startTest(Test.java:312)
at com.sauter_controls.jbacnet.Test.<init>(Test.java:94)
at com.sauter_controls.jbacnet.Test.main(Test.java:75)[/list]
In the class encodable is that ok ?
if (propertyArrayIndex != null && !def.isSequence()) //return readWrapped(queue, def.getClazz(), contextId); throw new BACnetErrorException(ErrorClass.property, ErrorCode.propertyIsNotAList);
My code :
int deviceID = dataForTestAliases.getDev().getInstanceNumber(); int objectID = dataForTestAliases.getRo().getObjectIdentifier().getInstanceNumber(); int property = dataForTestAliases.getProperty(); String index = dataForTestAliases.getIndex(); PropertyIdentifier pid = new PropertyIdentifier(property); Encodable value ; ReadPropertyAck readAck = null; try { if (!index.equals("NONE")){ readAck = (ReadPropertyAck) bnet.getLocalDevice().send(dataForTestAliases.getDev(), new ReadPropertyRequest(dataForTestAliases.getRo().getObjectIdentifier(), pid, new UnsignedInteger(Integer.parseInt(dataForTestAliases.getIndex())))); } else { readAck = (ReadPropertyAck) bnet.getLocalDevice().send(dataForTestAliases.getDev(), new ReadPropertyRequest(dataForTestAliases.getRo().getObjectIdentifier(), pid)); } } catch (BACnetException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } value = readAck.getValue();
Thanks for your help
-
I can't tell what properties you are trying to read, so i can't validate what you are trying to do. Can you provide object types (you said one was AnalogOutput), property identifiers, and property indices?
-
#alias device device ip obj-type instance property index format priority dp1 525 192.168.10.149:47808 0 1019 85 NONE real 8 dp2 525 192.168.10.149:47808 0 1113 85 NONE real 8 dp3 525 192.168.10.149:47808 1 1000 85 NONE real 8 dp3_prio8 525 192.168.10.149:47808 1 1000 87 8 real 8 noti1_size 525 192.168.10.149:47808 15 1 1 0 unsigned 8 noti1_1 525 192.168.10.149:47808 15 1 1 1 unsigned 8 noti1_2 525 192.168.10.149:47808 15 1 1 2 unsigned 8 noti1_3 525 192.168.10.149:47808 15 1 1 3 unsigned 8
dp3_prio8 is the analog output index 8
noti1 the notification class (all index) -
For "dp3_prio8", a priority array is an object, not a sequence. It's a tricky thing i guess because the object happens to be a type of a sequence (accessed as an array), but i suppose you need to request the object without an index, cast to a PriorityArray, and then pull the value you want out of it.
For "noti1", similar problem. The property is a bit string, not a sequence. Solution is similar to above.
-
but i suppose you need to request the object without an index
I need just one value , the value Priorityarray.get(index)
Bacnet4j should be able to do that ?
-
Like this:
ReadPropertyRequest req = new ReadPropertyRequest(new ObjectIdentifier(ObjectType.analogOutput, 1234), PropertyIdentifier.priorityArray); ReadPropertyAck ack = localDevice.send(remoteDevice, req); PriorityArray priorityArray = (PriorityArray) ack.getValue(); int priority = priorityArray.get(16).getIntegerValue().intValue();
-
Note that it is the remote device that is imposing this, not BACnet4J (unless BACnet4J is the implementation in the remote device). The error message about "Property is not an array/list" is being returned by the equipment, which is why you need to do it this way.
-
Please see the attached file that show the equipement answer.
The error is created by the stack, because of the PriorityArray is not a sequence
add(ObjectType.analogOutput, PropertyIdentifier.priorityArray, PriorityArray.class, false, true, new PriorityArray());
Attachment: download link
-
Ah, i see. Can you send me the full byte stream and i'll take a look.
-
Yes Monday (or tomorrow) i can send you the full byte stream (I have not the station here sorry)
Thanks for help and good week-end !
-
No problem. If you can please include the request byte stream as well, that may be useful.
-
-
K. I think it should be better now. This was an issue only with PriorityArray i believe. Changes have been checked into CVS. Please let me know if it helps.
-
Thanks it's help !