• phildunlap

    Hi Kevin,

    The /ui/administration/import-export page would be what you're looking for.

    0_1550255780502_import.png

    posted in User help read more
  • phildunlap

    Have you figured out a way to have events that originate at the client level propagate to the server using PTCP?

    Only point values are sent over PTCP, so you could use an event handler to set the relevant information to an alphanumeric point, and have a change detector on the receiving end. Unfortunately there's not a simple way to handle all events, so you'd have to create a fair number of event handlers probably. This feature exists in a branch, but hasn't been brought into the scope of the next release AFAIK.

    posted in User help read more
  • phildunlap

    Hi Antonio,

    This thread has some related information, but using the serial data source instead of the TCP/IP data source: https://forum.infiniteautomation.com/topic/2517/chinese-brand-psu_monitoring-rs485-and-mango

    You could do similar things with either, meaning passing messages off to a script to be parsed. Or, if the protocol is simple enough and doesn't have any sort of handshake or exchange, the TCP/IP data source may be sufficient for the custom protocol.

    Edit: this thread also refers to a few others: https://forum.infiniteautomation.com/topic/3337/integration-with-other-scada-system

    posted in Mango Automation general Discussion read more
  • phildunlap

    I do not believe 4.1.7 was formally released. 4.1.7 is bundled in the latest BACnet module release in Mango, but it's a timestamped version meaning it was not released as 4.1.7 at that time.

    posted in BACnet4J general discussion read more
  • phildunlap

    I am saying the only way to detect a spontaneous disconnection, which I think it what you're asking, is to send a request of some sort and have it time out.

    posted in BACnet4J general discussion read more
  • phildunlap

    Hi cenk,

    Your COV subscription needs to be resent periodically to be in conformance to the spec. Is failure to receive an ACK to the COV subscription sufficient, or do you need to know sooner than your COV resubscribe period? If more often, you'll probably need to make additional requests to the remote device, to see if it is responding.

    posted in BACnet4J general discussion read more
  • phildunlap

    Mango\override\properties or Mango\overrides\properties ?

    If you change the port set in Mango/overrides/properties/env.properties does Mango start? Have you tried navigating to that port in your browser?

    posted in User help read more
  • phildunlap

    Hi Rowen,

    Why are there three copies of that property? There should only be one entry for any given property in an env.properties file.

    posted in User help read more
  • phildunlap

    Hi Rowen,

    That would suggest Mango or another application is already using the web.port set in your Mango/overrides/properties/env.properties file. If it's not there copy it over from Mango/classes/env.properties

    You can try tp navigate to http://localhost:8080 in your browser (8080 is the default port, but you may have changed it in the env.properties file).

    posted in User help read more
  • phildunlap

    Hi psysak,

    Any ideas on what I could do to try and figure out just what it is that's taking so long?

    I know it can be worse if there are lot of cells defined in a way that your spreadsheet is very large when being processed. We mitigated the consequence of having lots of empty cells at the end of a named range, but in the past some users certainly hit shift+end when defining their named range and blanking out a couple million cells in their case made their report very slow. Perhaps there is still an existent issue with very large formula columns? Couldn't say.

    Something else on this topic guys, is there a way that I can preprocess some of the data before I dump it into an excel report?

    Yes! If you're up to date you should see the Excel Reports has a "Post processing script." It can fill in cells in the Excel Report either by location or by named range. This occurs after data is written in the normal Excel Reporting process, but before Formula cells are evaluated. The help has a list of available functions, or you can print(ExcelReportUtility); in the script. For optimal efficiency, you would want to do the calls to the ExcelReportUtility (only in context in Excel Reports post processing scripts) in the callback function to a PointValueQuery so that values are streamed from the database.


    Also to the original question of downloading, I'm not sure what limit you're hitting but you can find the completed report on the filesystem at Mango/web/modules/excelReports/web/report-data/

    posted in User help read more
  • phildunlap

    Someone recently inquired about how they could use this thread if their goal was to give the user the ability to easily create and send a BACnet schedule. This post provides a means of converting an advanced scheduler schedule into a BACnet schedule via a script like,

    //Lightly tested
    var schedule = JSON.parse(scheduleJson.value).schedule;
    var scheduleToSend = new com.serotonin.bacnet4j.type.constructed.BACnetArray(7, 
        new com.serotonin.bacnet4j.type.constructed.DailySchedule(
            new com.serotonin.bacnet4j.type.constructed.SequenceOf()));
            
            
    function convertToDailySchedule(timeStrings) {
        var times = [];
        var active;
        if(timeStrings.length > 0 && timeStrings[0] == "00:00") {
            times.push(
                new com.serotonin.bacnet4j.type.constructed.TimeValue(
                    new com.serotonin.bacnet4j.type.primitive.Time(0, 0, 0, 0),
                    new com.serotonin.bacnet4j.type.primitive.Double(active.value))
                );
            active = true;
            timeStrings.shift(); //remove first element
        } else {
            times.push(
                new com.serotonin.bacnet4j.type.constructed.TimeValue(
                    new com.serotonin.bacnet4j.type.primitive.Time(0, 0, 0, 0),
                    new com.serotonin.bacnet4j.type.primitive.Double(inactive.value))
                );
            active = false;
        }
        
        for(var k in timeStrings) {
            var timeString = timeStrings[k];
            times.push(
                new com.serotonin.bacnet4j.type.constructed.TimeValue(
                convertTimeStringToTime(timeString),
                active ? 
                  new com.serotonin.bacnet4j.type.primitive.Double(inactive.value) :
                  new com.serotonin.bacnet4j.type.primitive.Double(active.value))
            );
            active = !active;
        }
        
        return new com.serotonin.bacnet4j.type.constructed.SequenceOf(times);
    }
    
    function convertTimeStringToTime(timeString) {
        var parts = timeString.split(":");
        return new com.serotonin.bacnet4j.type.primitive.Time(parseInt(parts[0]), parseInt(parts[1]), 0, 0);
    }
            
    for(var d=0; d<7; d+=1) { //0-6
        if(d < schedule.length)
            scheduleToSend.putBase1(d+1, convertToDailySchedule( schedule[d] ));
        else
            scheduleToSend.putBase1(d+1, convertToDailySchedule( [] ));
    }
    
    print(scheduleToSend);
    

    the active and inactive values are gotten from numeric context points. If you wanted more than two values, you could encode a list into an alphanumeric point and have the script work with that. The scheduleJson is from an SQL data source doing a row-based:

    select xid, defaultSchedule from advancedSchedules

    Here's the JSON from my testing. I didn't actually set the schedule out to a weekly schedule on a BACnet device, though. Should work the same as the previous example.

    {
      "advancedSchedules": [
        {
          "xid": "ADVSCH_1",
          "defaultSchedule": {
            "dailySchedules": [
              {
                "changes": [
                  "05:20",
                  "15:40"
                ]
              },
              {
                "changes": [
                  "05:20",
                  "15:40",
                  "16:50",
                  "22:40"
                ]
              },
              {
                "changes": [
                  "05:20",
                  "15:40",
                  "16:50",
                  "22:40"
                ]
              },
              {
                "changes": [
                  "05:20",
                  "15:40",
                  "16:50",
                  "22:40"
                ]
              },
              {
                "changes": [
                  "05:20",
                  "15:40",
                  "16:50",
                  "22:40"
                ]
              },
              {
                "changes": [
                  "05:20",
                  "15:40",
                  "16:50",
                  "22:40"
                ]
              },
              {
                "changes": [
                  "05:20",
                  "15:40"
                ]
              }
            ],
            "offsetCount": 24
          },
          "readPermission": "",
          "name": "bacnet",
          "alarmLevel": "DO_NOT_LOG",
          "errorAlarmLevel": "DO_NOT_LOG",
          "user": "admin",
          "editPermission": "",
          "enabled": false,
          "exceptions": []
        }
      ],
      "dataSources":[
          {
             "xid":"DS_f580c6c5-af80-45d6-b06b-ad6daf54a027",
             "name":"Values To Send BACnet",
             "enabled":true,
             "type":"VIRTUAL",
             "alarmLevels":{
                "POLL_ABORTED":"URGENT"
             },
             "purgeType":"YEARS",
             "updatePeriodType":"MINUTES",
             "polling":false,
             "updatePeriods":5,
             "editPermission":"",
             "purgeOverride":false,
             "purgePeriod":1
          },
          {
             "xid":"DS_e05d8adf-e887-4822-94f1-fe4c51187576",
             "name":"ScheduleSelector",
             "enabled":false,
             "type":"SQL",
             "alarmLevels":{
                "POLL_ABORTED":"URGENT",
                "STATEMENT_EXCEPTION":"URGENT",
                "DATA_SOURCE_EXCEPTION":"URGENT"
             },
             "purgeType":"YEARS",
             "updatePeriodType":"MINUTES",
             "connectionUrl":"jdbc:h2:C:\\\\IA\\\\Mangoes\\\\enterprise-m2m2-core-3.5.0-2\\\\databases\/mah2",
             "driverClassname":"org.h2.Driver",
             "password":"",
             "rowBasedQuery":true,
             "selectStatement":"select xid, defaultSchedule from advancedSchedules",
             "updatePeriods":5,
             "username":"",
             "editPermission":"",
             "purgeOverride":false,
             "purgePeriod":1
          },
          {
             "xid":"DS_dcc24ccc-988c-41ba-a2a0-07478f6b3817",
             "name":"Send Bacnet Schedules",
             "enabled":false,
             "type":"META",
             "alarmLevels":{
                "SCRIPT_ERROR":"URGENT",
                "CONTEXT_POINT_DISABLED":"URGENT",
                "RESULT_TYPE_ERROR":"URGENT"
             },
             "purgeType":"YEARS",
             "editPermission":"",
             "purgeOverride":false,
             "purgePeriod":1
          }
       ],
       "dataPoints":[
          {
             "xid":"DP_9baad447-7fca-415e-bd52-671f09b66f6a",
             "name":"Send Schedule 1",
             "enabled":false,
             "loggingType":"ON_CHANGE",
             "intervalLoggingPeriodType":"MINUTES",
             "intervalLoggingType":"INSTANT",
             "purgeType":"YEARS",
             "pointLocator":{
                "dataType":"BINARY",
                "updateEvent":"NONE",
                "contextUpdateEvent":"CONTEXT_CHANGE",
                "context":[
                   {
                      "varName":"scheduleJson",
                      "dataPointXid":"DP_200a62c6-3788-445d-ad71-52c443328447",
                      "updateContext":true
                   },
                   {
                      "varName":"active",
                      "dataPointXid":"DP_ff4a9197-c12d-466e-a725-f739b31e594f",
                      "updateContext":false
                   },
                   {
                      "varName":"inactive",
                      "dataPointXid":"DP_9bb7dff1-9482-4053-90e7-5e8fe7b688e4",
                      "updateContext":false
                   }
                ],
                "logLevel":"NONE",
                "variableName":"my",
                "executionDelaySeconds":0,
                "logCount":5,
                "logSize":1.0,
                "script":"\/\/Lightly tested\nvar schedule = JSON.parse(scheduleJson.value).schedule;\nvar scheduleToSend = new com.serotonin.bacnet4j.type.constructed.BACnetArray(7, \n    new com.serotonin.bacnet4j.type.constructed.DailySchedule(\n        new com.serotonin.bacnet4j.type.constructed.SequenceOf()));\n        \n        \nfunction convertToDailySchedule(timeStrings) {\n    var times = [];\n    var active;\n    if(timeStrings.length > 0 && timeStrings[0] == \"00:00\") {\n        times.push(\n            new com.serotonin.bacnet4j.type.constructed.TimeValue(\n                new com.serotonin.bacnet4j.type.primitive.Time(0, 0, 0, 0),\n                new com.serotonin.bacnet4j.type.primitive.Double(active.value))\n            );\n        active = true;\n        timeStrings.shift(); //remove first element\n    } else {\n        times.push(\n            new com.serotonin.bacnet4j.type.constructed.TimeValue(\n                new com.serotonin.bacnet4j.type.primitive.Time(0, 0, 0, 0),\n                new com.serotonin.bacnet4j.type.primitive.Double(inactive.value))\n            );\n        active = false;\n    }\n    \n    for(var k in timeStrings) {\n        var timeString = timeStrings[k];\n        times.push(\n            new com.serotonin.bacnet4j.type.constructed.TimeValue(\n            convertTimeStringToTime(timeString),\n            active ? \n              new com.serotonin.bacnet4j.type.primitive.Double(inactive.value) :\n              new com.serotonin.bacnet4j.type.primitive.Double(active.value))\n        );\n        active = !active;\n    }\n    \n    return new com.serotonin.bacnet4j.type.constructed.SequenceOf(times);\n}\n\nfunction convertTimeStringToTime(timeString) {\n    var parts = timeString.split(\":\");\n    return new com.serotonin.bacnet4j.type.primitive.Time(parseInt(parts[0]), parseInt(parts[1]), 0, 0);\n}\n        \nfor(var d=0; d<7; d+=1) { \/\/0-6\n    if(d < schedule.length)\n        scheduleToSend.putBase1(d+1, convertToDailySchedule( schedule[d] ));\n    else\n        scheduleToSend.putBase1(d+1, convertToDailySchedule( [] ));\n}\n\nprint(scheduleToSend);",
                "scriptPermissions":{
                   "customPermissions":"",
                   "dataPointReadPermissions":"superadmin,reallycool",
                   "dataPointSetPermissions":"superadmin,reallycool",
                   "dataSourcePermissions":"superadmin,reallycool"
                },
                "settable":false,
                "updateCronPattern":""
             },
             "eventDetectors":[
             ],
             "plotType":"STEP",
             "rollup":"NONE",
             "unit":"",
             "templateXid":"Binary_Default",
             "simplifyType":"NONE",
             "chartColour":"",
             "chartRenderer":{
                "type":"TABLE",
                "limit":10
             },
             "dataSourceXid":"DS_dcc24ccc-988c-41ba-a2a0-07478f6b3817",
             "defaultCacheSize":1,
             "deviceName":"Send Bacnet Schedules",
             "discardExtremeValues":false,
             "discardHighLimit":1.7976931348623157E308,
             "discardLowLimit":-1.7976931348623157E308,
             "intervalLoggingPeriod":15,
             "intervalLoggingSampleWindowSize":0,
             "overrideIntervalLoggingSamples":false,
             "preventSetExtremeValues":false,
             "purgeOverride":false,
             "purgePeriod":1,
             "readPermission":"",
             "setExtremeHighLimit":1.7976931348623157E308,
             "setExtremeLowLimit":-1.7976931348623157E308,
             "setPermission":"",
             "tags":{
             },
             "textRenderer":{
                "type":"BINARY",
                "oneColour":"black",
                "oneLabel":"one",
                "zeroColour":"blue",
                "zeroLabel":"zero"
             },
             "tolerance":0.0
          },
          {
             "xid":"DP_ff4a9197-c12d-466e-a725-f739b31e594f",
             "name":"Active Value",
             "enabled":true,
             "loggingType":"ALL",
             "intervalLoggingPeriodType":"MINUTES",
             "intervalLoggingType":"AVERAGE",
             "purgeType":"YEARS",
             "pointLocator":{
                "dataType":"NUMERIC",
                "changeType":{
                   "type":"NO_CHANGE",
                   "startValue":"10"
                },
                "settable":true
             },
             "eventDetectors":[
             ],
             "plotType":"SPLINE",
             "rollup":"NONE",
             "unit":"",
             "templateXid":"Numeric_Default",
             "simplifyType":"NONE",
             "chartColour":"",
             "chartRenderer":{
                "type":"IMAGE",
                "timePeriodType":"DAYS",
                "numberOfPeriods":1
             },
             "dataSourceXid":"DS_f580c6c5-af80-45d6-b06b-ad6daf54a027",
             "defaultCacheSize":1,
             "deviceName":"Values To Send BACnet",
             "discardExtremeValues":false,
             "discardHighLimit":1.7976931348623157E308,
             "discardLowLimit":-1.7976931348623157E308,
             "intervalLoggingPeriod":1,
             "intervalLoggingSampleWindowSize":0,
             "overrideIntervalLoggingSamples":false,
             "preventSetExtremeValues":false,
             "purgeOverride":false,
             "purgePeriod":1,
             "readPermission":"",
             "setExtremeHighLimit":1.7976931348623157E308,
             "setExtremeLowLimit":-1.7976931348623157E308,
             "setPermission":"",
             "tags":{
             },
             "textRenderer":{
                "type":"ANALOG",
                "useUnitAsSuffix":true,
                "unit":"",
                "renderedUnit":"",
                "format":"0.00"
             },
             "tolerance":0.0
          },
          {
             "xid":"DP_9bb7dff1-9482-4053-90e7-5e8fe7b688e4",
             "name":"Inactive Value",
             "enabled":true,
             "loggingType":"ALL",
             "intervalLoggingPeriodType":"MINUTES",
             "intervalLoggingType":"AVERAGE",
             "purgeType":"YEARS",
             "pointLocator":{
                "dataType":"NUMERIC",
                "changeType":{
                   "type":"NO_CHANGE",
                   "startValue":"20"
                },
                "settable":true
             },
             "eventDetectors":[
             ],
             "plotType":"SPLINE",
             "rollup":"NONE",
             "unit":"",
             "templateXid":"Numeric_Default",
             "simplifyType":"NONE",
             "chartColour":"",
             "chartRenderer":{
                "type":"IMAGE",
                "timePeriodType":"DAYS",
                "numberOfPeriods":1
             },
             "dataSourceXid":"DS_f580c6c5-af80-45d6-b06b-ad6daf54a027",
             "defaultCacheSize":1,
             "deviceName":"Values To Send BACnet",
             "discardExtremeValues":false,
             "discardHighLimit":1.7976931348623157E308,
             "discardLowLimit":-1.7976931348623157E308,
             "intervalLoggingPeriod":1,
             "intervalLoggingSampleWindowSize":0,
             "overrideIntervalLoggingSamples":false,
             "preventSetExtremeValues":false,
             "purgeOverride":false,
             "purgePeriod":1,
             "readPermission":"",
             "setExtremeHighLimit":1.7976931348623157E308,
             "setExtremeLowLimit":-1.7976931348623157E308,
             "setPermission":"",
             "tags":{
             },
             "textRenderer":{
                "type":"ANALOG",
                "useUnitAsSuffix":true,
                "unit":"",
                "renderedUnit":"",
                "format":"0.00"
             },
             "tolerance":0.0
          },
    	  {
             "xid":"DP_200a62c6-3788-445d-ad71-52c443328447",
             "name":"BNS_1",
             "enabled":true,
             "loggingType":"ON_CHANGE",
             "intervalLoggingPeriodType":"MINUTES",
             "intervalLoggingType":"INSTANT",
             "purgeType":"YEARS",
             "pointLocator":{
                "dataType":"ALPHANUMERIC",
                "parameters":[
                ],
                "dateParameterFormat":"yyyy-MM-dd'T'HH:mm:ss",
                "fieldName":"ADVSCH_1",
                "tableModifier":false,
                "timeOverrideName":"",
                "updateStatement":""
             },
             "eventDetectors":[
             ],
             "plotType":"STEP",
             "rollup":"NONE",
             "unit":"",
             "templateXid":"Alphanumeric_Default",
             "simplifyType":"NONE",
             "chartColour":"",
             "chartRenderer":{
                "type":"TABLE",
                "limit":10
             },
             "dataSourceXid":"DS_e05d8adf-e887-4822-94f1-fe4c51187576",
             "defaultCacheSize":1,
             "deviceName":"ScheduleSelector",
             "discardExtremeValues":false,
             "discardHighLimit":1.7976931348623157E308,
             "discardLowLimit":-1.7976931348623157E308,
             "intervalLoggingPeriod":15,
             "intervalLoggingSampleWindowSize":0,
             "overrideIntervalLoggingSamples":false,
             "preventSetExtremeValues":false,
             "purgeOverride":false,
             "purgePeriod":1,
             "readPermission":"",
             "setExtremeHighLimit":1.7976931348623157E308,
             "setExtremeLowLimit":-1.7976931348623157E308,
             "setPermission":"",
             "tags":{
             },
             "textRenderer":{
                "type":"PLAIN",
                "useUnitAsSuffix":true,
                "unit":"",
                "renderedUnit":"",
                "suffix":""
             },
             "tolerance":0.0
          }
       ]
    }
    

    The Meta point is set up to run whenever the SQL point's value changes (when there is a new default weekly schedule set for the schedule), but would also run if one pressed refresh value (which you may wish to do if the inactive or active values change).

    posted in User help read more
  • phildunlap

    Yeah, the JSON receiver has two receive types, one for legacy support and one for the more intuitive way it works. The legacy (Parameter receive type) use is presented here: https://forum.infiniteautomation.com/topic/2642/how-to-use-http-json-receiever-to-receive-the-data-with-is-by-json-format

    For the more intuitive format, where the whole POST body is JSON for instance and the content type is application/json, then the "HTTP parameter name" field needs to be a JSON pointer. Someone linked in this thread to a tool to help craft JSON pointers: https://forum.infiniteautomation.com/topic/3029/json-retriever-documentation-missing/5

    But in short it's like a path, like
    / on an alphanumeric point should catch the whole JSON object.
    /key should get whatever is at {"key":...}
    /keyToArray/5 should get the fifth index of the array at {"keyToArray":[...]}

    posted in How-To read more
  • phildunlap

    Also note that you may want to create IP whitelist entries on the data source if any important control is going through an HTTP Receiver, as that is not authenticated. You can also white list devices, and then include parameters for that device as specified in the contextual help for the HTTP receiver data sources.

    posted in How-To read more
  • phildunlap

    You would use a Point Link, or you could use a script or meta point if you need to parse apart the value (they have the .set() function for context points, or in a meta point you could return the extracted value to store it in the meta point).

    posted in How-To read more
  • phildunlap

    Hi MarcBudie,

    I just updated the thread Craig linked to so that it's swagger URL also includes detail that as of Core 3.5 swagger moved to /swagger-ui.html if enabled before starting Mango.

    I am going to assume that you are writing your own dashboard from scratch, since a few of the angular components are capable of setting values to the point. But, there is also the HTTP Receiver (and JSON receiver), which would be the simplest was to get values into a data point via HTTP POST or GET. And there are /rest/v1/point-values endpoints that support using PUT to set values to one or more points, which you could explore via swagger.

    posted in How-To read more
  • phildunlap

    Hi Ava2018,

    Is this a fairly new point? It looks like it's set to log on change, but all the record in the table seem like the same value? So, is there one record at the top of the point value time history? That would be because only the changed value was logged, but the polling updates would be pushed out to the open pages and update the most recent PointValueTime for the point's cache.

    posted in Scripting general Discussion read more
  • phildunlap

    Hi Fox,

    Looking at your script I notice a few things,

    1. events seems to be the point you're setting the JSON to with the initial event, but IE is the point it is being parsed back from. Perhaps this should be my.value ? Is IE for completed events only?
    2. It is not clear how you got the values array, but I've noticed in certain situations you'll need to use values[n].doubleValue instead to explicitly get a double instead of a DataValue. If you used the .last(n) function then I think the list ordering is right for what you're trying to do. I would expect the type checking in the === to fail, for instance.
    3. Not sure your need to parseInt the .time, that should be a long already.

    Hope that helps!

    posted in How-To read more
  • phildunlap

    Hmm... Might you have restarted or something? Your original post has an error about the column not existing, but that has an error about it existing. Something has changed!

    posted in User help read more
  • phildunlap

    Method is only allowed for a query.

    You are using the SQL console? Use the submit update button, not the submit query button.

    As far as your second point, we are connecting via IP.
    I searched all of the ma.log files (older rotated ones) and could not find anything with "exception" and "PersistentSenderRT " in the same line (with grep).

    Hmm. You could try to restart Mango and see.

    I guess the only long term set-it-and-forget-it solution that occurs to me would be an email event handler on that event to restart the publisher.

    var publisher = com.serotonin.m2m2.db.dao.PublisherDao.getInstance().getByXid("PUB_12345")
    publisher.setEnabled(false);
    com.serotonin.m2m2.Common.runtimeManager.savePublisher(publisher);
    RuntimeManager.sleep(15000); //take a break in case we trigger the event again...
    publisher.setEnabled(true);
    com.serotonin.m2m2.Common.runtimeManager.savePublisher(publisher);
    return CANCEL;
    

    posted in User help read more
  • phildunlap

    Hi gquiroz,

    It is not currently simple to do.

    The way to do it now would involve something like manually starting the data source on the quantized period, which a script on a cron pattern may be able to achieve. If it were guaranteed they would not subsequently be stopped and started (like being saved), then a script on an event handler on the system startup event could use the RuntimeManager script object to start appropriate data sources at appropriate times and sleep in between. But, it does take time to start data sources so the alignment would be imperfect.

    I would tend to encourage someone who wanted such a value to record all sampled data in the sampling point, and use a meta point on a cron to compute the intervals you want with something like p.past(MINUTE, 15).average, then set the purge period of the sampled point lower if you're worried about the data's size on disk.

    One advantage is being able to see later on if a 15 minute period that seems anomalous had a reduced number of samples in it, and not having to wait up to 14:59 for the data source to start sampling at the right time.

    posted in User help read more