External algorithm function example
This example selects two data points tag1 and tag2 from the neuronStream data source, sends them to the external HTTP service through HTTP POST, and returns the result after addition.
Start an external service
Start an external service locally through the following Python code. The port is 9876 and provide an API interface /api/test1 to receive the POST method. The external service obtains the a and b fields in the requested JSON data. The result is returned after addition.
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/api/test1', methods=['POST'])
def test1():
try:
data = request.get_json()
a = data['a']
b = data['b']
result = a + b
return jsonify({'result': result}), 200
except Exception as e:
return jsonify({'error': str(e)}), 400
if __name__ == '__main__':
app.run(host='0.0.0.0', port=9876)Create an external service in NeuronEX
Click Data Processing -> Extensions, on the External Service tab, click Add External Service.
- Name: ex_service
- Address:
http://127.0.0.1:9876 - Headers: Leave blank

TIP
Ensure that NeuronEX’s network and the Python external service’s network are connected.
Using external service in rules
Enter the following in the rule:

Among them, the neuronStream used in the rules, the data input is as follows:
{
"timestamp": 1701134996987,
"node_name": "modbus1",
"group_name": "group1",
"values": {
"tag1": 1,
"tag2": 2,
"tag3": 3,
"tag4": 4,
},
"errors": {},
"metas": {},
}ex_service("post","/api/test1", object_construct("a",values.tag1 ,"b", values.tag2)) means that the function object_construct("a", values.tag1, "b", values.tag2) results are sent to the HTTP Server address http://127.0.0.1:9876/api/test1, and the processing result of the external service are sent to the Sink.
The reason why we choose to use the built-in function object_construct here is that the data format of the original stream neuronStream do not match the input parameter requirements of the external function. The calculation result of object_construct("a",values.tag1 ,"b", values.tag2) is {"a":1,"b":2}, and the result is passed to the external service.
View result
Enable rule test and check that the output result is correct {"ex_service":{"result":3}}.
