@@ -2411,53 +2411,61 @@ module.exports = function (RED) {
24112411 }
24122412 }
24132413
2414- // OLD
2414+ node . add_item = function ( item ) {
2415+ if ( item ) {
2416+ if ( ! node . items ) {
2417+ node . items = new Array ( ) ;
2418+ }
2419+ node . items . push ( {
2420+ 'item' : item
2421+ } ) ;
2422+ }
2423+ } ;
2424+
2425+ function node_error ( err ) {
2426+ node . error ( "Browse node error!" , err ) ;
2427+ }
2428+
24152429 async function browse_action_input ( msg ) {
24162430 verbose_log ( "browsing" ) ;
2417- let allInOne = [ ] ;
2431+ node . items = [ ] ;
24182432
24192433 if ( node . session ) {
2420- const crawler = new NodeCrawler ( node . session ) ;
2434+ const client = opcua . OPCUAClient . create ( connectionOption ) ;
24212435 set_node_status_to ( "active browsing" ) ;
2422- crawler . on ( "browsed" , function ( element ) {
2423- if ( msg . collect === undefined || ( msg . collect && msg . collect === false ) ) {
2424- let item = { } ;
2425- item . payload = { ...element } ; // Clone element
2426- let dataType = "" ;
2427- item . topic = element . nodeId . toString ( ) ;
2428- if ( element ?. dataType ) {
2429- dataType = opcuaBasics . convertToString ( element . dataType . toString ( ) ) ;
2430- }
2431- if ( dataType && dataType . length > 0 ) {
2432- item . datatype = dataType ;
2433- }
2434- node . send ( [ item , null , null ] ) ;
2435- }
2436- else {
2437- let item = { ...element } ; // Clone element
2438- allInOne . push ( item ) ;
2439- }
2440- } ) ;
2441- // Browse from given topic
2442- const nodeId = msg . topic ;
2443- crawler . read ( nodeId , function ( err , obj ) {
2444- if ( ! err ) {
2445- // Crawling done
2446- if ( msg . collect && msg . collect === true ) {
2447- verbose_log ( "Send all in one, items: " + allInOne . length ) ;
2448- let all = { } ;
2449- all . topic = "AllInOne" ;
2450- all . payload = allInOne ;
2451- all . objects = JSON . stringify ( obj ) ; // Added extra result
2452- set_node_status_to ( "browse done" ) ;
2453- node . send ( [ all , null , null ] ) ;
2454- return ;
2455- }
24562436
2457- set_node_status_to ( "browse done" ) ;
2458- }
2459- crawler . dispose ( ) ;
2460- } ) ;
2437+ const nodeId = msg . topic ;
2438+ node . debug ( "nodeId: " + nodeId ) ;
2439+
2440+ try {
2441+ const browseResult = await node . session . browse ( nodeId ) ;
2442+
2443+ for ( const reference of browseResult . references )
2444+ {
2445+ var ref_obj = Object . assign ( { } , reference ) ;
2446+ const dataValue = await node . session . read ( { nodeId : ref_obj . nodeId , attributeId : opcua . AttributeIds . Value } ) ;
2447+ ref_obj [ "value" ] = dataValue . value . value ;
2448+ ref_obj [ "dataType" ] = opcua . DataType [ dataValue . value . dataType ] ;
2449+ node . add_item ( ref_obj ) ;
2450+ }
2451+ msg . payload = node . items
2452+ node . send ( [ msg , null , null ] ) ;
2453+ node . status ( {
2454+ fill : "green" ,
2455+ shape : "dot" ,
2456+ text : "Items: " + node . items . length ,
2457+ source : { id : node . id , type : node . type , name : "OPC UA Browser" }
2458+ } ) ;
2459+ } catch ( err ) {
2460+ node_error ( "Browse error: " + err . message ) ;
2461+ verbose_log ( err ) ;
2462+ node . status ( {
2463+ fill : "yellow" ,
2464+ shape : "ring" ,
2465+ text : "browse error" ,
2466+ source : { id : node . id , type : node . type , name : "OPC UA Browser" }
2467+ } ) ;
2468+ }
24612469 } else {
24622470 node_error ( "Session is not active!" ) ;
24632471 set_node_status_to ( "invalid session" ) ;
@@ -2696,4 +2704,4 @@ module.exports = function (RED) {
26962704
26972705 RED . nodes . registerType ( "OpcUa-Client" , OpcUaClientNode ) ;
26982706
2699- }
2707+ }
0 commit comments