How to change the http sending value parameter
-
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!
-
@phildunlap said in How to change the http sending value parameter:
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,
I have tried to bring this code to the final solution with no success. :-(
(I have make a "workaround" with http receiver, but this is not the real need)Objective:
Send commands (a value) to a BACnet point by reading a string in a MySQL table.A) Get the string (word) after 'FNC="#' from the table logging column info.
examples: FNC="#SILENCE SIRENES
FNC="#RESET
FNC="#SILENCE BUZZERB) Only send the command to a BACnet point IF the id changes
'till now I have created a datasource SQL with the following statement:
SELECT * FROM logging WHERE origin=4 AND type=8 AND info LIKE '%FNC="#%' ORDER BY id DESC LIMIT 1;
and the result is:
Column name Value ID 512407 Origin 4 Type 8 TimeStamp 2017-02-10 10:14:36.0 Info (other infos) FNC="#SILENCE SIRENES" (other infos)
Now I having difficulty getting the value of the string and transfer it to a point only when the ID changes. Then date point will trigger the BACnet command translate the string as you first say in your code...
Thanks in advance,
Jose -
Hi Jose,
If I understand correctly, you have already gotten the ID and the Info into SQL data points. You could try a change detector on the ID point, has a Set Point event handler setting a new Alphanumeric point (probably a meta point would be best, one that executes on a cron with no context update, a cron like 0 0 0 1 1 ? 2099 ). The set point event handler will "Set to point value" and use the Info SQL point as the source point. Now you can create a point link from that new Alphanumeric Meta point to the outgoing BACnet point, and put whatever transformation logic you want in the point link.
Alternatively (and perhaps more straightforwardly), you could use a scripting data source. Add the ID point to the context varName 'sqlMaxId', add the Info point to the context varName 'info', create a numeric (or multistate, I suppose) Scripting data point, varName 'lastHandledId', add the BACnet point to the context that you'd like to set varName 'dataOut' . Script executes on cron "0/1 * * * * ?" with a script body like....
/* It looks like the strings in your info point aren't exactly these, so do be sure to modify this function as needed */ function transformInfoToValue( infoValue ) { if(infoValue == "RESET") return 3; else if(infoValue == "ACK") return 2; else if(infoValue == "SILENCE") return 4; else throw "Unknown value for xyz set: " + source.value; } if( sqlMaxId.value != lastHandledId.value ) { lastHandledId.set( sqlMaxId.value ); dataOut.set( transformInfoToValue( info.value ) ); }
This scripting solution won't work so well if your poll times for the SQL are less than two seconds, possibly.
-
Almost there... but, no I can not get the ID and the Info into SQL data points... :-(
As you can notice, the info that I need to extract in among other alfanumeric characters in the field info.
So, how can I get those into the SQL data points?
Thanks in advance,
Jose -
Hi Jose,
Data source settings;
Row based query: unchecked, false
(you'll have to handle the connection settings yourself using the in-Mango help, but it looks like this is already working for you)ID data point:
data type numeric, column name "ID"info data point
data type alphanumeric, column name "info"As for parsing what you're after out of the info field, I would do that in the script's "transformInfoToValue" function, and not try to do it in the SQL data source. Here's another possible version of that function:
function transformInfoToValue( infoValue ) { //We'll use a regex group to get that part of the string var fnc = /FNC="([^"]*)"/.exec( infoValue ); if( fnc === null ) throw "FNC regex did not match text in info field"; if( fnc[1]== "RESET" ) return 3; else if( fnc[1]== "ACK" ) return 2; else if( fnc[1] == "SILENCE" ) return 4; else throw "Unknown value for xyz set: " + source.value; }
-
The scripts senses one error in line 17
dataOut.set( transformInfoToValue( info.value ) );
What could it be?
-
This is a scripting data source that this script is in, yes? Only the scripting data source can call
set()
I would check...
- That we're not hitting the throw condition in the transformInfoToValue function. You could change it to
return -1;
in the else clause and instead do something like...
var transformedValue = transformInfoToValue( info.value ); if( transformedValue >= 0 ) dataOut.set( transformedValue );
- That the variable name for dataOut is the same in the context and the script body. Same for info.
- That dataOut and info are settable.
- That dataOut and info are enabled.
- That we're not hitting the throw condition in the transformInfoToValue function. You could change it to
-
@phildunlap said in 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 Phildunlap,
Following this solution I have tried to change the code of one of the point link to send two alarmOut upon a condition. No success... :-(
Is something like this - wrong code - that I need on the specific point link:
if(source.value == 6) return getPrefix() + "0101" + source.value; return getPrefix() + "1002" + source.value; else return getPrefix() + "1002" + source.value;
The objective is to send two different alarm out when the source.value meets the condition. In any other cases only sends one alarm out.
It's possible?
Thank you
Jose -
Hi Jose,
If you need to do something like that you'll want to use the scripting data source as i described in the paragraph starting with "Alternatively (and perhaps more straightforwardly)" as you could simply call 'dataOut.set( )' twice
Alternatively, you could have a second point link which only returns a value in that special case that you need to set two values.