How to change the http sending value parameter
-
Hi jmatos,
I'm not sure I completely understand, but it sounds like Point Links may work well for you. It sounds like you want to get values from lots of points and publish them all from the same point. Assuming this is for the publisher, a solution could be something like....
- Create a virtual point named 'Alarm Out' with an XID of 'almnr' of type alphanumeric
- Create a global script, having the body:
function getPrefix() { /*So that you may change the prefix for all scripts later if required */ return "4"; }
- Create a point link '1002 Alarm' from source 'CDI1 – LP_SENSOR_MANUAL_1002/1_1/4194279' to target 'Alarm Out', with the script body:
return getPrefix() + "1002" + source.value;
- Create similar point links to 'Alarm Out' from all other points you will publish this way.
Note that the 1002 is hardcoded into the script, since there will be 1 point link from each data point you're publishing here to our 'Alarm Out' point.
If you have only a handful to set up, you can do it by hand. If you have hundreds, I can provide a script to generate the point links for you. A helpful regex for parsing out those DeviceID values could be:
^[^/]+_(\d+)/
-
Hi phidunlap,
Great! That's it. It's working... :-)
Now, please help in a few last questions:
a) - Can this solution be applied to about 2000 points? (We're gonna buy your MangoES to do the work)
b) - I've try this solution with two (2) points with simultaneous alarm and the information toke about 4 minutes to be sent by http
c) - In the Virtual DATASOURCE there is one "update period" that makes the systems send the last alarm in that period time. Is there some way to deactivate it?
d) - When I make (save) a modification to the DATASOURCE the last alarm is sent. I know I can disable the DATASOURCE then save the modification and turn it on again but is there a more "elegant" way to do it?
Thank you very much
-
A) I would expect it to work depending on your update periods. Using JDK8 will make those point links run very very quickly. Of course, knowing a number of points is not the whole picture, since values occur in time. 1 data point updating every millisecond is somewhat like 2000 data points updating every 2 seconds. Update period matters!
B) I will check this, but it should be fairly instantaneous unless the system is bogged down (high load, high CPU, etc)
C) Alas there is not. Perhaps my advisement of using a virtual point for almnr could have been better. You could use a Meta point (alphanumeric) with xid "almnr" that everything sets to. Then you can have the Meta point execute on a cron like '0 0 0 1 1 ? 2099' which won't set a value through a poll for quite some time (January 1st, 2099).
I have also wished I could disable the virtual data source's polling, so I will add that feature to the module at some point.
D) This is a product of the polling. Using the solution in C would prevent that, as would if I implemented the feature to prevent virtual data source polling.
-
With regards to B, I wonder if your server is holding the connection open after it sends the status 200 message?
From my testing,
while [ true ]; do nc -l 8899 <<< "HTTP/1.1 200 OK"; done
will get updates every time a set a value in this setup. This is because the here-string "HTTP/1.1 200 OK" is sent in response and the connection is closed, then the server listens again.
-
Your help in this implementation has been very very useful. In the same "architecture" (BACnet/IP to HTTP) what is the best way to send a like point value time to time to work as a keep-alive. That is instead of sending the 'almnr' based on the actual alarm value will be sending say: '4999' on a time basis.
thank you very much
-
Hi jmatos,
Glad to hear it.
The "Send Regular Snapshot" feature of the publisher will send the latest value for all points in the set at that interval, but it sounds like you want a specific value set periodically. I would use a Scripting Data Source for that. Simply add the almnr point to the context (I will assume its variable name is almnr), run it on the cron you would like regular messages on the interval of, and have a script body:
almnr.set(getPrefix() + "4999" + "0");
But, perhaps as a keep alive you would be better served by adding a different point, 'keepAlive' to the publisher, and setting that to your keep alive value instead. Then your almnr point wouldn't be polluted by the keep alive sets, and you could even disable logging for the keep alive point (if you publisher is publishing all changes)
-
Hi phildunlap,
I'm having troubles implement that last solution, but we what to buy one licence just like the MangoES. We can not order the computer itself because we'll have problems with CE certification. So...
-
- What is the OS recommended by you? (the trial version as been working on Windows 7)
-
- What is the price of the licence (like MangoES) that suits our needs; BACnet I/P to HTTP and all the data sources and script capability that we've talked about in this topic.
Sorry I'm asking this to you. I already send a message to Joel but I'm not getting an answer and we need to step forward with the project.
Thank you,
Jose -
-
Sorry for not responding to your past email. I just sent you information about a special MangoES license.
We highly recommend Linux and use debian based linux on our systems. The MangoES has 2GB of Ram and two quad core processors. What type of embedded computer will you use?
-
Hi Joel,
For the OS we'are thinking about Ubuntu.
What kind of computer may you advise? Solid State Disk is necessary, recommend? 4GB of RAM makes any difference? Intel processor or other?
The limit of the license is to one computer or may we have a replica working with the same license in our office for support purpose?
Thank you very much
-
That all depends on your application, number of data points, users, how much data you will be logging, etc. SSD is definitely nice. The license is for a single computer and you would need a separate license for each computer.
-
Hi phildunlap,
I'm a little bit confused with this implementation .
In fact I want to achieve two goals:
A) - I need to know if the BACnet server (the origin) is alive. For this I reserve a 48888 code to the 'almnr' variable. This have to be checked in a given period. How can I know if the BACnet server is alive (and well)?
B) - In the server that receives the HTTP (the destination) I must receive a 49999 code to the 'almnr' variable to tell that server that MANGO is alive. Is there a way to do this?
Thanks you,
Jose -
Hi jmatos,
Both cases sound like No Update detectors may do the trick.
A) If you create a 'no update' event handler on a BACnet point that you expect to get regular update, then you can go to the event handler page and create a 'Set Point' handler on the no update point event detector for the point. It would be configured to set 'almnr' to a static value, "48888"
B) The script suggestion earlier was to send a regular 49999. If instead it only needs to be sent if other things are not (as obviously Mango is up if it's sending messages at all), then you could put a 'no update' detector on the almnr point, then configure its handler to set almnr to a static value of "49999"
-
Hi phildunlap
Great solution. Thanks.
Now for a twist... I want to sent a value to a BACnet point that is settable. I already set it by hand and it works find. May you please advise witch is the best to to - from another program - set remotely the value of a point?
May you give me an example?
Thank you,
Jose -
Under the event handler you can add a "Set Point" type of hander on your event. Add the BACnet point you want to set when the event is active or inactive.
-
I think I missed something... :(
Point = xyz
When I send a RESET must change xyz_value=3; sending ACK should change xyz_value=2: and SILENCE would change xyz_value=4.
-
Are you saying there is the text string RESET, ACK, or SILENCE in one data point? This is a time to use a Point Link, something like,
//source point: the point getting RESET, ACK, SILENCE //target point: xyz the point to set the value out to on your BACnet device if(source.value == "RESET") return 3; else if(source.value == "ACK") return 2; else if(source.value == "SILENCE") return 4; else throw "Unknown value for xyz set: " + source.value;
-
Hi phildunlap,
Not exactly that. The text string is just my mnemonic.
I have this point that is 'settable' and is already created on MANGO and when I go to Data Point Details to that specific point I can put say the nr 2 in the 'set value box' and set it. This works OK...
Now, from an external program I need to send and set that or other values that point.
Witch will be the best way to do it?
Thanks,
Jose -
Hi Jose,
What sort of program? There are many ways. You probably want to use the HTTP Receiver data source, then you can set values to HTTP Receiver points through an HTTP GET. Here's a thread where I discussed the format: http://infiniteautomation.com/forum/topic/2187/how-to-use-publishers-http-sender/4 but the TLDR is that you'd send values with the parameter names as parameters in the /httpds?parameter=value section of the GET.
Alternatively you could have a server socket in that program that can be interrogated for values, in which case I would look into using the TCP/IP data source.
-
-
Glad to hear it!