<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	    <channel>
        <title>Prosys Forum - All Forums</title>
        <link>https://forum.prosysopc.com/forum/</link>
        <description><![CDATA[Prosys OPC &#038; OPC UA related discussion]]></description>
        <generator>Simple:Press Version 6.11.15</generator>
        <atom:link href="https://forum.prosysopc.com/forum/rss/" rel="self" type="application/rss+xml"/>
		                <item>
                    <title>Bjarne Boström on Observations when "triggering" Alarms</title>
                    <link>https://forum.prosysopc.com/forum/opc-ua-java-sdk/observations-when-triggering-alarms/#p7658</link>
                    <category>OPC UA SDK for Java</category>
                    <guid isPermaLink="true">https://forum.prosysopc.com/forum/opc-ua-java-sdk/observations-when-triggering-alarms/#p7658</guid>
					                        <description><![CDATA[<p>Hi,</p>
<p>Sorry, answers are very long..</p>
<p>1.<br />
Based on the error and our code, the AlarmConditionTypeNodeBase.getActiveStateNode() did return TwoStateVariableTypeNodeBase whose getIdNode is non-null UaProperty, but the Value of the property itself is null. In general this scenario should not happen. SDK assumes there is always a non-null Value in the Id node, because AlarmConditionTypeNode.afterCreate() forces there to be false. So, probably the afterCreate() was never run by the SDK. Thus SDK fails when it tries to use 'null' as 'boolean' (and not 'Boolean'). We could maybe treat null as false, but similar things exists elsewhere thus it is more important to know why afterCreate never ran as it does other things as well.</p>
<p>Each generated XXXTypeNodeBase.afterCreate has logic that first does 'super.afterCreate();' Then it calls internal .callAfterCreateIfExists(UaNode) for all of the components (that are defined in this typedefinition i.e. all for which it has a generated getXXXNode()). Thus an .afterCreate() on a "top-lvl-node" propagates to all of the components. Generated XXXTypeNode.afterCreate() also contain call 'super.afterCreate();' (so it calls the XXXTypeNodeBase.afterCreate() of that type, which then calls the XXXTypeNode of the super type) , thus one possibility is that this call would have been removed if 'XXXTypeNode' was edited manually (no 'super.afterCreate();'). Another is that our heuristic for determining "top-lvl-node" failed during model loading.</p>
<p>Whenever NodeManagerUaNode.createInstance/NodeBuilder makes instances, it knows the top-lvl node as it creates it (it is the one returned and it just makes one top-lvl at a time). However, when loading an information model we use a heuristic: nodes that have 0 inverse Aggregate (or subtypes) references are considered as top-lvl nodes and .afterCreate is called for each of them. It is important that it is only called for the top-lvl ones, since the logic in XXXTypeNode(s) might rely on the order, with effectively the top-lvl instance having the last say in the XXXTypeNode.afterCreate that is designed to be edited (i.e. after 'super.afterCreate();' SDK has finalized initializing all components and custom logic can be added so that the SDK does not override it). </p>
<p>Maybe this heuristic fails for your model? For example, if the model attaches instances with HasComponent instead of Organizes to some folder structure then it would fail.</p>
<p>2.<br />
There is potential confusion, as some of the methods are from Codegen and others are what we have added manually (or existed from the era before we had Codegen). Also, some of the Codegen methods are for doing an UA Method call (or partially simulating one in the server) or setting the data of a component.</p>
<p>For example, the ConditionTypeNodeBase.disable() is related to the interface, ConditionType.disable(), which is actually used to Call the 'Disable' Method of the ConditionType. It exist for both sides, client and server. It might not make that much sense here for the server side, but this is general logic for all generated types (and we do Codegen the core information model in the SDK). Note that this ConditionTypeNodeBase.disable() specifically calls the implementation of ConditionTypeNode.onDisable, it bypasses the EventManager logic as it is done directly in the nodes, i.e. no CallRequest is made).</p>
<p>The AlarmConditionTypeNode.setActive(boolean) on the other hand is a manually created helper (or probably this existed before we had Codegen), since doing interaction alarmNode.getActiveStateNode().setId(..). Plus in addition it has custom logic if the Optional ShelvingState exists for the instance.</p>
<p>And as an example AcknowledgeableConditionTypeNodeBase.setEnabledState(LocalizedText) is a Codegen setter for setting the Value of the EnabledState component (just as an example, in practice this should not be used directly, but instead ConditionTypeNode.setEnabled(boolean) as it properly sets the Id to the given value and then that interaction flows to overriden logic in TwoStateVariableTypeNode.setId(Boolean) (not TwoStateVariableTypeNodeBase) which sets the value of the EnabledState to the proper LocalizedText which are set by ConditionTypeNode.afterCreate())</p>
<p>In general I would say it is best to call methods named setXXX and then trigger manually (yes, the above kinda conflicts with this one, for the ones having LocalizedText, see if we have a related method with boolean and use that instead). This could probably use a lot of improvements ... some day. </p>
<p>The ConditionTypeNode Disable Method implementation does send the event because <a href="https://reference.opcfoundation.org/specs/OPC-10000-9/5.5.2" rel="nofollow" target="_blank"><a href="https://reference.opcfoundatio" rel="nofollow">https://reference.opcfoundatio</a>.....00-9/5.5.2</a> "When the Condition instance enters the Disabled state, the Retain Property of this Condition shall be set to False by the Server to indicate to the Client that the Condition instance is currently not of interest to Clients."<br />
in addition it says "In normal processing when a Client receives an Event with the Retain flag set to False, the Client should consider this as a ConditionBranch that is no longer of interest, in the case of a "current Alarm display" the ConditionBranch would be removed from the display." Thus when a Client calls Disable this information must be relayed to all subscribers of the event. Though this logic is ... very old.</p>
<p>P.S.<br />
I am aware that best would be if the Codegen versions had some specific qualifier e.g. callXXX instead of just xXX as the method name so they would be easier to differentiate. Wont happen in SDK 5.x, but not sure can we make this in 6.0.0 either, but we will have to discuss internally (it would resolve some other issues as well with naming conflicts, but the API breakage might be too much).</p>
]]></description>
					                    <pubDate>Mon, 21 Sep 2026 19:29:46 +0300</pubDate>
                </item>
				                <item>
                    <title>Bjarne Boström on Event MonitoredItem with ConditionId in WhereClause</title>
                    <link>https://forum.prosysopc.com/forum/opc-ua-java-sdk/event-monitoreditem-with-conditionid-in-whereclause/#p7655</link>
                    <category>OPC UA SDK for Java</category>
                    <guid isPermaLink="true">https://forum.prosysopc.com/forum/opc-ua-java-sdk/event-monitoreditem-with-conditionid-in-whereclause/#p7655</guid>
					                        <description><![CDATA[<p>Hi,</p>
<p>The same clause-logic should work for both selecting and filtering, though separately.</p>
<p>Assuming you use the ContentFilterBuilder, e.g. following should work as an example</p>
<p>ContentFilterBuilder fb = new ContentFilterBuilder();<br />
NodeId expectedConditionId = ...<br />
fb.add(FilterOperator.Equals, new SimpleAttributeOperand(Identifiers.ConditionType, null, Attributes.NodeId, null), new LiteralOperand(expectedConditionId));<br />
ContentFilter contentFilter = fb.getContentFilter()<br />
EventFilter filter = ...<br />
filter.setWhereClause(contentFilter);</p>
<p>That SimpleAttributeOperand is listed at the end of <a href="https://reference.opcfoundation.org/specs/OPC-10000-9/5.5.2" rel="nofollow" target="_blank"><a href="https://reference.opcfoundatio" rel="nofollow">https://reference.opcfoundatio</a>.....00-9/5.5.2</a>. Per my interpretation, it shouldn't be ...  anything special as it just follows the normal rules of the SimpleAttributeOperand. A null/empty browsePath selects the alarm node itself and then it is attribute selection for that node. Though, note that in general servers (including our SDK) only support Attributes.NodeId for a null/empty path and then only the Attributes.Value for all others. It is also possible some server specifically wants the Identifiers.ConditionType as the typeId. In my opinion e.g. Identifiers.BaseEventType should work as well since it is just an inheritance check (though, in general only ConditionType and subtypes are real nodes in the address space and all other Events are "one-shot" and not present; even though temporarily they do in our impl before triggering)</p>
]]></description>
					                    <pubDate>Mon, 21 Sep 2026 18:27:55 +0300</pubDate>
                </item>
				                <item>
                    <title>hbrackel on Observations when "triggering" Alarms</title>
                    <link>https://forum.prosysopc.com/forum/opc-ua-java-sdk/observations-when-triggering-alarms/#p7654</link>
                    <category>OPC UA SDK for Java</category>
                    <guid isPermaLink="true">https://forum.prosysopc.com/forum/opc-ua-java-sdk/observations-when-triggering-alarms/#p7654</guid>
					                        <description><![CDATA[<p>Hi,</p>
<p>I created a couple of Alarms (subtype of AlarmConditionType) using UaModeler. I am only using objects/variables/properties with ModelingRule==Mandatory.<br />
All alarm instances are created in UaModeler as part of custom object definitions as instance declarations, not directly in the instance tree underneath the objects folder. Only an instance of the custom root application objectType is added to the objects folder.</p>
<p>Code has been generated and the model has been registered and nodesets have been loaded. SDK version is 5.8.0</p>
<p>1. when calling alarm.setActive(true) in the server code, the SDK throws an exception</p>
<p></p>
<div class="sfcode" id="sfcode5305">
Cannot invoke &#034;java.lang.Boolean.booleanValue()&#034; because the return value of &#034;com.prosysopc.ua.types.opcua.server.TwoStateVariableTypeNode.isId()&#034; is null
</div>
<p>After setting the ActiveState/Id value directly once (or, in UaModeler, uncheck the "null" checkbox for the value), subsequent calls succeed. This indicates, that the ActiveState/Id property is created only after writing a value directly to it</p>
<p>2. upon calling alarm.disable(), the toolkit triggers an event on its own. This came unexpected, because, if unaware of this behaviour, other alarm properties need to be adjusted before calling disable(). It looks like method calls are routed through the event manager. A little note in the Server tutorial could help to make this behaviour more explicit.<br />
Is the recommendation to use the methods enable(), disable(); setActive() etc or to set the properties manually and then trigger in code?</p>
<p>I'd appreciate your comments on these observations.</p>
<p>Thanks, HU</p>
]]></description>
					                    <pubDate>Sun, 20 Sep 2026 23:26:03 +0300</pubDate>
                </item>
				                <item>
                    <title>hbrackel on Event MonitoredItem with ConditionId in WhereClause</title>
                    <link>https://forum.prosysopc.com/forum/opc-ua-java-sdk/event-monitoreditem-with-conditionid-in-whereclause/#p7653</link>
                    <category>OPC UA SDK for Java</category>
                    <guid isPermaLink="true">https://forum.prosysopc.com/forum/opc-ua-java-sdk/event-monitoreditem-with-conditionid-in-whereclause/#p7653</guid>
					                        <description><![CDATA[<p>Hello,</p>
<p>I'd like to subscribe to condition based events and create a monitoredItem and listener per event. Is there a possibility to create a WhereClause including the conditionTypeId (already included) and the conditionId? While the conditionId is part of the returned eventProperty array (last item), there is no explicit condition property that can be used for whereclause..</p>
<p>Thanks, HU</p>
]]></description>
					                    <pubDate>Sun, 20 Sep 2026 17:16:39 +0300</pubDate>
                </item>
				                <item>
                    <title>Bjarne Boström on "NullPointerException: nodeId" in AddressSpace.getNode() </title>
                    <link>https://forum.prosysopc.com/forum/opc-ua-java-sdk/nullpointerexception-nodeid-in-addressspace-getnode/#p7652</link>
                    <category>OPC UA SDK for Java</category>
                    <guid isPermaLink="true">https://forum.prosysopc.com/forum/opc-ua-java-sdk/nullpointerexception-nodeid-in-addressspace-getnode/#p7652</guid>
					                        <description><![CDATA[<p>Hi,</p>
<p>That version is over 4 years old. Could you please try again with the latest version, 5.8.0?</p>
<p>The .getNode does read the Attributes of the node. In 4.x that also did re-read the NodeId Attribute, with basically assuming it gets the same NodeId back. This was changed during 5.x (around 5.4.0) that the NodeId of an UaNode is final and wont be re-read anymore.</p>
<p>Can you show what client.readAttribute(expandedNodeId, Attributes.NodeId) returns or throws?<br />
The expandedNodeId being the same as what you used for addressSpace().getNode(expandedNodeId). If the result is anything, but the expandedNodeId (in NodeId format that is; depending on things the ExpandedNodeId format could have been with the namespaceuri as well), then that is probably the issue and the server must be fixed. In practice to in this case I would expect a null value with bad status be returned in the DataValue for the theory to be proven. IF this was the case, then 5.8.0 should avoid the issue (but let us know if not), though the server should still be fixed.</p>
]]></description>
					                    <pubDate>Fri, 11 Sep 2026 15:45:20 +0300</pubDate>
                </item>
				                <item>
                    <title>devaskim on "NullPointerException: nodeId" in AddressSpace.getNode() </title>
                    <link>https://forum.prosysopc.com/forum/opc-ua-java-sdk/nullpointerexception-nodeid-in-addressspace-getnode/#p7651</link>
                    <category>OPC UA SDK for Java</category>
                    <guid isPermaLink="true">https://forum.prosysopc.com/forum/opc-ua-java-sdk/nullpointerexception-nodeid-in-addressspace-getnode/#p7651</guid>
					                        <description><![CDATA[<p>Hello, team<br />
Have NPE in 4.8.0. Any thougths on that?<br />
======<br />
Here is stacktrace.</p>
<p>java.lang.NullPointerException: nodeId<br />
    at com.prosysopc.ua.client.AddressSpace.browse(SourceFile:1862)<br />
    at com.prosysopc.ua.client.AddressSpace.browse(SourceFile:367)<br />
    at com.prosysopc.ua.client.AddressSpace.readReferences(SourceFile:1404)<br />
    at com.prosysopc.ua.client.AddressSpace.getNode(SourceFile:977)<br />
    at com.prosysopc.ua.client.AddressSpace.getNode(SourceFile:854)<br />
    at<br />
======<br />
The simplified code:</p>
<p>List references = addressSpace().browse(nodeId, BrowseDirection.Forward, NodeId.NULL, true, NodeClass.Variable);<br />
ExpandedNodeId expandedNodeId = references.get(0).getNodeId();<br />
UaNode uaNode = addressSpace().getNode(expandedNodeId);</p>
]]></description>
					                    <pubDate>Fri, 11 Sep 2026 12:12:17 +0300</pubDate>
                </item>
				                <item>
                    <title>Bjarne Boström on PubSub: Only a Single DataSet per PubSubUdpUadpConnectionNetworkMessage</title>
                    <link>https://forum.prosysopc.com/forum/opc-ua-java-sdk/pubsub-only-a-single-dataset-per-pubsubudpuadpconnectionnetworkmessage/#p7611</link>
                    <category>OPC UA SDK for Java</category>
                    <guid isPermaLink="true">https://forum.prosysopc.com/forum/opc-ua-java-sdk/pubsub-only-a-single-dataset-per-pubsubudpuadpconnectionnetworkmessage/#p7611</guid>
					                        <description><![CDATA[<p>Hi,</p>
<p>Well ... so far basically there has been no demand to do it differently. Do you have a use-case where it would be of use?</p>
<p>Currently the logic is shared with MQTT-UADP. In MQTT it is likely that each Writer has a different Topic. It is not possible to publish to multiple topics in a single MQTT network message. Thus, at the moment the WriterGroup simply does loop all Writers and each Writer will produce the NetworkMessages related to it. The only scenario where multiple DataSetMessages would exist in a single NetworkMessage at the moment are for Event-DataSets.</p>
<p>P.S.<br />
It is not related to the sequence number issue.</p>
]]></description>
					                    <pubDate>Mon, 06 Jul 2026 19:21:36 +0300</pubDate>
                </item>
				                <item>
                    <title>Bjarne Boström on PubSub: SDK warns about old sequenceNumbers across multiple WriterGroups</title>
                    <link>https://forum.prosysopc.com/forum/opc-ua-java-sdk/pubsub-sdk-warns-about-old-sequencenumbers-across-multiple-writergroups/#p7610</link>
                    <category>OPC UA SDK for Java</category>
                    <guid isPermaLink="true">https://forum.prosysopc.com/forum/opc-ua-java-sdk/pubsub-sdk-warns-about-old-sequencenumbers-across-multiple-writergroups/#p7610</guid>
					                        <description><![CDATA[<p>Hi,</p>
<p>As far as I remember the U(A)DP logic didn't yet properly support wildcards, though it mostly appears to do so via common logic. A proper wildcard-supporting version would need to keep track of the numbers for each PublisherId+WriterId combination it sees. Though in reality probably something like last 100 seen to avoid memory leaks.</p>
]]></description>
					                    <pubDate>Mon, 06 Jul 2026 18:21:27 +0300</pubDate>
                </item>
				                <item>
                    <title>Bjarne Boström on PubSub: Multiple PubSubSystems with 1 ea. connection vs.1 PubSubSystem with multiple connections</title>
                    <link>https://forum.prosysopc.com/forum/opc-ua-java-sdk/pubsub-multiple-pubsubsystems-with-1-ea-connection-vs-1-pubsubsystem-with-multiple-connections/#p7609</link>
                    <category>OPC UA SDK for Java</category>
                    <guid isPermaLink="true">https://forum.prosysopc.com/forum/opc-ua-java-sdk/pubsub-multiple-pubsubsystems-with-1-ea-connection-vs-1-pubsubsystem-with-multiple-connections/#p7609</guid>
					                        <description><![CDATA[<p>Hi,</p>
<p>Adding few extra notes, though mostly it is as said above.</p>
<p>The configuration can be changed via PubSubSystem.updateConfiguration(..). That method will take a function, which receives the current live configuration as input (PubSubSystemConf) and it must output the desired new configuration (PubSubSystemConf) or throw PubSubException to abort. Once the function outputs the desired state, PubSubSystem will internally create/modify/remove connections/groups/writers/readers to match the new configuration (or throws PubSubException, if that fails for some reason).</p>
<p>The design was to allow multiple concurrent update operations from multiple threads. Due to intentional synchronizations, only one of the update-functions runs at a time, but they would always see the result of the previous function output as their input. This would have been a need for making an address space -based configuration, since each Write/Call operation happens on the blocking-work threads. Though, nowadays it mostly enables SDK itself updating the configuration as that is used to store received metadatas.</p>
<p>Thus, in general one PubSubSystem should be enough. If for some reason the updating doesn't work, let us know.</p>
<p>P.S.<br />
Since the PubSubSystem takes the UaApplication (UaClient/UaServer), if you have multiples in a single application, then you would need a PubSubSystem for each. Skipping some details regarding Subscriber side for now. Skipping also some details regarding MQTT.</p>
]]></description>
					                    <pubDate>Mon, 06 Jul 2026 17:38:13 +0300</pubDate>
                </item>
				                <item>
                    <title>rocket science on org.bouncycastle.util.encoders.DecoderException when trying to create UserIdenty with .der and .pem file</title>
                    <link>https://forum.prosysopc.com/forum/opc-ua-java-sdk/org-bouncycastle-util-encoders-decoderexception-when-trying-to-create-useridenty-with-der-and-pem-file/#p7608</link>
                    <category>OPC UA SDK for Java</category>
                    <guid isPermaLink="true">https://forum.prosysopc.com/forum/opc-ua-java-sdk/org-bouncycastle-util-encoders-decoderexception-when-trying-to-create-useridenty-with-der-and-pem-file/#p7608</guid>
					                        <description><![CDATA[<p>Thanks for taking care of this.</p>
<p>In the meantime I'm using the workaround above.</p>
]]></description>
					                    <pubDate>Mon, 29 Jun 2026 16:36:24 +0300</pubDate>
                </item>
				                <item>
                    <title>Lusetti on org.bouncycastle.util.encoders.DecoderException when trying to create UserIdenty with .der and .pem file</title>
                    <link>https://forum.prosysopc.com/forum/opc-ua-java-sdk/org-bouncycastle-util-encoders-decoderexception-when-trying-to-create-useridenty-with-der-and-pem-file/#p7607</link>
                    <category>OPC UA SDK for Java</category>
                    <guid isPermaLink="true">https://forum.prosysopc.com/forum/opc-ua-java-sdk/org-bouncycastle-util-encoders-decoderexception-when-trying-to-create-useridenty-with-der-and-pem-file/#p7607</guid>
					                        <description><![CDATA[<p>Unfortunately the SDK doesn't have helpers to parse private key/cert bundled PEM files. The easiest way would be the workaround provided above.</p>
<p>I'll make an issue on this as a possible future improvement.</p>
]]></description>
					                    <pubDate>Thu, 25 Jun 2026 14:47:29 +0300</pubDate>
                </item>
				                <item>
                    <title>Jouni Aro on Apple Silicon Problem: Prosys OPC UA Browser 2026.1.2-38 is bundled with Intel only Java Runtime which will not be supported in the future</title>
                    <link>https://forum.prosysopc.com/forum/opc-ua-client/apple-silicon-problem-prosys-opc-ua-browser-2026-1-2-38-is-bundled-with-intel-only-java-runtime-which-will-not-be-supported-in-the-future/#p7606</link>
                    <category>OPC UA Browser</category>
                    <guid isPermaLink="true">https://forum.prosysopc.com/forum/opc-ua-client/apple-silicon-problem-prosys-opc-ua-browser-2026-1-2-38-is-bundled-with-intel-only-java-runtime-which-will-not-be-supported-in-the-future/#p7606</guid>
					                        <description><![CDATA[<p>Hi Matthias,</p>
<p>It actually sounds like you have picked the wrong installer. Look for the separate macOS installer for Apple Silicon on the download page 🙂</p>
<p>BR, Jouni</p>
]]></description>
					                    <pubDate>Wed, 24 Jun 2026 20:03:33 +0300</pubDate>
                </item>
				                <item>
                    <title>DrMatthiasArnold on Apple Silicon Problem: Prosys OPC UA Browser 2026.1.2-38 is bundled with Intel only Java Runtime which will not be supported in the future</title>
                    <link>https://forum.prosysopc.com/forum/opc-ua-client/apple-silicon-problem-prosys-opc-ua-browser-2026-1-2-38-is-bundled-with-intel-only-java-runtime-which-will-not-be-supported-in-the-future/#p7605</link>
                    <category>OPC UA Browser</category>
                    <guid isPermaLink="true">https://forum.prosysopc.com/forum/opc-ua-client/apple-silicon-problem-prosys-opc-ua-browser-2026-1-2-38-is-bundled-with-intel-only-java-runtime-which-will-not-be-supported-in-the-future/#p7605</guid>
					                        <description><![CDATA[<p>Hi dev team,</p>
<p>I am running Prosys OPC UA Browser 2026.1.2-38 on Apple Silicon macOS 26.5.1.</p>
<p>macOS reports that the application will not be supported in a future macOS version. Inspection shows that both the bundled Java runtime and launcher are Intel-only:</p>
<p>/Applications/Prosys OPC UA Browser.app/Contents/PlugIns/jre.bundle/Contents/Home/bin/java: Mach-O 64-bit executable x86_64<br />
/Applications/Prosys OPC UA Browser.app/Contents/MacOS/JavaApplicationStub: Mach-O 64-bit executable x86_64</p>
<p>My system Java is already native arm64 OpenJDK 21.0.8, but the app uses its bundled Intel runtime.</p>
<p>Do you provide, or plan to provide, a macOS Apple Silicon / Universal build with an arm64 bundled JRE and native launcher?</p>
<p>Best,</p>
<p>Matthias</p>
]]></description>
					                    <pubDate>Wed, 24 Jun 2026 17:06:07 +0300</pubDate>
                </item>
				                <item>
                    <title>rocket science on org.bouncycastle.util.encoders.DecoderException when trying to create UserIdenty with .der and .pem file</title>
                    <link>https://forum.prosysopc.com/forum/opc-ua-java-sdk/org-bouncycastle-util-encoders-decoderexception-when-trying-to-create-useridenty-with-der-and-pem-file/#p7604</link>
                    <category>OPC UA SDK for Java</category>
                    <guid isPermaLink="true">https://forum.prosysopc.com/forum/opc-ua-java-sdk/org-bouncycastle-util-encoders-decoderexception-when-trying-to-create-useridenty-with-der-and-pem-file/#p7604</guid>
					                        <description><![CDATA[<p>Thanks for clarification.</p>
<p>Is there any way to accept a .pem file which contains both using the SDK?</p>
]]></description>
					                    <pubDate>Wed, 24 Jun 2026 15:52:50 +0300</pubDate>
                </item>
				    </channel>
	</rss>
