i am working on a project where i make a get request to a server which returns me the connection state of systems and machines as JSON. i use this return value to visualize the connection states in node red:
the next step is to query the status of each machine. for this i have an endpoint, which gives me this. in node-red i now want to make a query to this endpoint every 10 seconds to visualize the status, if the health is ok or not. the response will look like this:
for this i do NOT want to use an inject node, because i have to follow a certain rule regarding structure. this is to look like obove.
so i will modify the "mtconnect" and "opc ua" node like the http request node, only with the except that the nodes will make http request for every 10 seconds instead of only one time as the core node http request.
is there a way to implement a modified version of the HTTP REQUEST NODE that makes me a request every 10 seconds instead of just once?
Unless I am missing something, I can see no reason to modify the core node when what you are asking is 100% possible using either an inject node or a Cron type node.
Firstly, thanks for answering!!
So after visualization the configuration, we have a lot of machines and devices as nodes on Node-RED. So only this machines should be seen. It would be really messy if i would put a inject node for each of the machines, becuase they all have different endpoints to make a request.
Yo don't need to use a preprogrammed inject per request. You can use change nodes to set-up the payload from any source, even an array populated dynamically if necessary.
In general, i will make a request to the endpont, it will returns me a json string with all connection states of the machines. i will convert this json to a node red compatible json-string and will put this json to flows.json, where node-red reads the configuration of the flows. after rebooting the node red docker container, the page will refresh and we will see the connection state as shown above. now each of this "device" nodes should make a http request for a endpont, which will return ONLY the status of the device by id and not for the whole devices. and for this, i will turn the "device" to something like the http request node, only with the except that these will make a request to the specific endpont every 10 seconds.
the nodes you can see here (i will them call device-nodes) are created by me. but for now they are only dummies. that means, that these have no funcionality:
the idea is, to modify these device nodes, that they will make a http request to this endpoint:
. the id will represent the id of the node. so that each node will make a http request every 10 seconds. the response will look like this:
after receiving the JSON Object, the status object witihn the respone (see obove) should be processed. if the "health" and "state" key are "ok" and "running", then the node status should be green. if not it should be red like described in the docs:
for this i only want to modify the device nodes. i had the idea, to copy the source code of the "http request" node (the js and html file) and push it into the js and html file of the device node. in addition i will the feature, that the device nodes make a http request every 10 seconds automatically without using a switch node, inject node,....
Sounds like you just want the first "node" in the flow to look like a single block, but have it do multiple things repeatedly... for that, you can use a subflow.
In the parent flow, it looks like a single node, but when you edit the subflow, it can have many nodes inside it (e.g. inject -> http request -> json).
I would start by making a single flow that works as you expect, then select all the upstream nodes and use the Menu > Subflows > Selection to Subflow option to put them all into one displayed node.
Another nice feature of a subflow is that it can have environment vars that are used by the nodes running inside. For instance, the http request node in the subflow could use env string syntax to substitute the target url like this: ${DEVICE_URL}
Thanks a lot, its really good idea! Firstly i also had this idea but the feature with the env var are new for me. I will try it like you described. Thanks a lot again!!
@shrickus is there a way to call the node_id of the instance of the subflow within the subflow itself? i would set the http request URL like this: URL_ENV_VAR/node_id
The http request node (and many others) can be configured with a blank url -- then, if the incoming msg contains a url field, it will be used in the http request. A good example of how to do it is in this thread
So I would suggest that your subflow includes a change node upstream of the http request node, which builds the target string and a sets it on the msg.url field. The only thing I'm not sure about is how to get the current subflow's id inside a change node... but if that's not available, just use another env var, maybe?
For the benefit of the rest of us, could you show us a bit of how you set up the subflows? Specifically, how did you end up building the url from the env and id vars...