Still works if I write to array values like you are doing and then update just one element.
# ns=1;s=[sim]_Meta:Writeable/WriteableFloat2
# ns=2;s=CTT/Static/All Profiles/Array/Int16Array
server = "Eclipse Milo OPC UA Demo Server"
NodeID = []
NodeID.append("ns=2;s=CTT/Static/All Profiles/Array/Int16Array")
NodeID.append("ns=2;s=CTT/Static/All Profiles/Array/Int32Array")
NodeID.append("ns=2;s=CTT/Static/All Profiles/Array/Int64Array")
oldQualifiedValue = []
oldQualifiedValue.append(system.opc.readValue(server, NodeID[0]))
oldQualifiedValue.append(system.opc.readValue(server, NodeID[1]))
oldQualifiedValue.append(system.opc.readValue(server, NodeID[2]))
newValue = []
newValue.append(oldQualifiedValue[0].getValue())
newValue.append(oldQualifiedValue[1].getValue())
newValue.append(oldQualifiedValue[2].getValue())
print "newValue before: %s" % newValue
newValue[0][0] = newValue[0][0] + 1
newValue[1][0] = newValue[1][0] + 1
newValue[2][0] = newValue[2][0] + 1
print "newValue after: %s" % newValue
returnQuality = system.opc.writeValues(server, NodeID, newValue)
print "return quality: %s" % returnQuality
print returnQuality[0].isGood()
print returnQuality[1].isGood()
print returnQuality[2].isGood()
Results:
newValue before: [array(java.lang.Short, [2, 0, 0, 0, 0]), array(java.lang.Integer, [2, 0, 0, 0, 0]), array(java.lang.Long, [2L, 0L, 0L, 0L, 0L])]
newValue after: [array(java.lang.Short, [3, 0, 0, 0, 0]), array(java.lang.Integer, [3, 0, 0, 0, 0]), array(java.lang.Long, [3L, 0L, 0L, 0L, 0L])]
return quality: array(com.inductiveautomation.ignition.common.model.values.QualityCode, [Good, Good, Good])
True
True
True