Please Note This forum exists for community support for the Mango product family and the Radix IoT Platform. Although Radix IoT employees participate in this forum from time to time, there is no guarantee of a response to anything posted here, nor can Radix IoT, LLC guarantee the accuracy of any information expressed or conveyed. Specific project questions from customers with active support contracts are asked to send requests to support@radixiot.com.

  • Editing point tags

    3
    0 Votes
    3 Posts
    1k Views
    Jared WiltshireJ
    @psysak This will be a lot easier in Mango 3.6, stay tuned.
  • Offset for rollups

    5
    0 Votes
    5 Posts
    2k Views
    phildunlapP
    Yes. The only thing to add to be fully correct is that start times are inclusive, end times are exclusive (at the millisecond level).
  • Possible bug with Scripting data source editor

    7
    0 Votes
    7 Posts
    1k Views
    I
    Whew! Glad that you were able to reproduce it. heh Edit: I see that having the space after the "<" prevents the chopping. Very odd... As I mentioned above, I have only seen this behaviour in the scripting data source editor.
  • Persistent TCP not Automatically Reconnecting after Reboot

    8
    0 Votes
    8 Posts
    2k Views
    M
    After today's reboot (for OS and module updates) everything is working well. It could also have been the previous time the modules were updated, as we only reboot these for updates.
  • Publisher Slave Error

    3
    0 Votes
    3 Posts
    1k Views
    R
    Hi, Thanks for your prompt reply. I restored the database , and all good now. The times on the logs were out, as I just "grep ERROR *ma.log" and cut/paste the interesting ones. Thanks again - Its the fastest SCADA support I have seen.
  • Unexpected date/time display behavior

    4
    0 Votes
    4 Posts
    2k Views
    phildunlapP
    to your third point, actually on GMT-08:00, which does explain that! Wait, there aren't 22 hours in a day? Whoops :P The offsets are right - still trying to sort why the epoch value is off by a couple of days +/-. Will keep mucking about here. How did you know the value in the register before reading it? Perhaps it's not sync'ed to the right time. The bit banging to decode registers into data types can be found here, but it's quite unlikely there's an issue there: https://github.com/infiniteautomation/modbus4j/blob/master/src/com/serotonin/modbus4j/locator/NumericLocator.java
  • TCP DataSource Configuration

    3
    0 Votes
    3 Posts
    1k Views
    J
    Phil! thanks for show me the light at the tunnel end hehe, with the virtual serial server i was able to get the data from the gateway, i think the magic is in the regex both in the datasource and datapoint. Now i can listen the raw data and digest it through an Scripting DS. Regards!.
  • Stopping Mango

    2
    0 Votes
    2 Posts
    968 Views
    CraigWebC
    Hi Smaland and welcome back to MA. I think you will find all your answers in the getting started section of the mango help page. Let us know if you still have answers after going through those documents, https://help.infiniteautomation.com/documentation
  • This topic is deleted!

    1
    0 Votes
    1 Posts
    5 Views
    No one has replied
  • Errors with current Google Maps/ng-maps library

    3
    0 Votes
    3 Posts
    2k Views
    I
    No worries. I had a brief moment of panic that my new markup wasn't working when I had copied from a "working" version. heh I look forward to the next release.
  • Heartbeat for Cloud Connect Clients

    10
    0 Votes
    10 Posts
    2k Views
    phildunlapP
    Hi Wingnut2.0, Maybe someone else can think of a way to go through the API (I think it may be possible with some serious HTTP / WS encoding shenanigans through a Serial Data source connected to the API via a serial-tcp virtual port... not straightforward!), but through a scripting data source...... Write a wrapper for the UserEventListener interface that we can instantiate and pass functions to from the script, package com.infiniteautomation.forumexample; import com.serotonin.m2m2.rt.event.UserEventListener; import com.serotonin.m2m2.rt.event.EventInstance; /* * @author Phillip Dunlap * This class exists because Nashorn JavaScript functions can be implicitly cast to interfaces with one * method. So, we need to separate the one UserEventListener interface into four interfaces. */ public class ScriptableUserEventListener implements UserEventListener { private RaisedHandler raisedHandler = null; private RtnHandler rtnHandler = null; private DeactivatedHandler deactivatedHandler = null; private AckHandler ackHandler = null; @Override public int getUserId() { //Because not all events go to all users, we need to pretend to be a part of the message relay structure // so that we get all the messages // TODO permit script to set the user id //private, but the value we want to return //return com.serotonin.m2m2.rt.event.UserEventMulticaster.MULTICASTER_ID; // == -100 //This will make it hard / impossible to remove this listener, which means we should hit validate with // care. Probably the right thing to do here would be create a new superadmin user (or lesser privilege I guess) // for the script to present the ID of, and just never let anyone log in as that user. Then we can mash the remove // for that ID without worrying about messing things up for anyone (not like with -100 !!!) return -100; } @Override public void raised(EventInstance evt) { if(raisedHandler != null) raisedHandler.raised(evt); } public interface RaisedHandler { public void raised(EventInstance evt); } public void registerRaisedHandler(RaisedHandler raisedHandler) { this.raisedHandler = raisedHandler; } @Override public void returnToNormal(EventInstance evt) { if(rtnHandler != null) rtnHandler.rtn(evt); } public interface RtnHandler { public void rtn(EventInstance evt); } public void registerRtnHandler(RtnHandler rtnHandler) { this.rtnHandler = rtnHandler; } @Override public void deactivated(EventInstance evt) { if(deactivatedHandler != null) deactivatedHandler.deactivated(evt); } public interface DeactivatedHandler { public void deactivated(EventInstance evt); } public void registerDeactivatedHandler(DeactivatedHandler deactivatedHandler) { this.deactivatedHandler = deactivatedHandler; } @Override public void acknowledged(EventInstance evt) { if(ackHandler != null) ackHandler.ack(evt); } public interface AckHandler { public void ack(EventInstance evt); } public void registerAckHandler(AckHandler ackHandler) { this.ackHandler = ackHandler; } } Compile. I found this easiest to do by placing the ScriptableUserEventListener.java file into Mango/web/modules/dataFile/web/CompilingGrounds/Poll directory, then create a new data file data source and hit the compile button. Now you should have a com/infiniteautomation/forumexample set of directories in Mango/web/modules/dataFile/web/templates/Poll. Copy the com directory and the folders / files beneath it to Mango/overrides/classes/ (no need to restart) Write a scripting data source to register the listener, like, if(typeof registered === 'undefined') { var scriptableUserEventListener = new com.infiniteautomation.forumexample.ScriptableUserEventListener(); var raisedFunc = function(event) { p.set(event.getMessage().translate(com.serotonin.m2m2.Common.getTranslations())); }; var rtnFunc = function(event) { p.set(event.getRtnMessage().translate(com.serotonin.m2m2.Common.getTranslations())); }; scriptableUserEventListener.registerRaisedHandler(raisedFunc); scriptableUserEventListener.registerRtnHandler(rtnFunc); //could also register for deactivated or acknowledged events com.serotonin.m2m2.Common.eventManager.addUserEventListener(scriptableUserEventListener); registered = true; //print("registered"); } //The big flaw here is that the listener cannot be removed because we // will lose the object when the script is disabled. To prevent that, we could // make the script try to load the listener from the attributes map of the alphanumeric // point. And then only create it if the listener doesn't already exist. If it does // exist, the script need not do anything! And, if one wished to remove the listener, // one could pass the object returned from getting the attribute to the // com.serotonin.m2m2.Common.eventManager.removeUserEventListener( CONTEXT_POINTS.p.getAttribute("scriptableListener" ) ); // but for this example c'est la vie. I can fix / test that if need be. And voila! Some clumsiness is that the alphanumeric point couldn't store values for two events at the same time, but it should still generate updates/events even if there are two values at the same millisecond. Also there are comments about the potential clumsiness in the solution. I could do another pass and clean that up if need be...
  • Problem downloading Excel report

    10
    0 Votes
    10 Posts
    2k Views
    phildunlapP
    Phil, is there a resource I can refer to for documentation on the available methods? Jared showed me the API docs for the front end, I'd love to have something similar for backend. There are certainly many documents about the backend, but the depth of those certainly does leave some questions unanswered. I guess to that hole I try to be the best resource I can to expand that here on the forum for intrepid searchers, but the code is open source which is of course the definitive documentation. https://github.com/infiniteautomation/ma-core-public/blob/main/Core/src/com/serotonin/m2m2/rt/script/PointValueTimeStreamScriptUtility.java perhaps find via https://github.com/infiniteautomation/ma-core-public/search?q=PointValueQuery&unscoped_q=PointValueQuery Definitely a lot easier if cloned into an IDE so that you can easily follow any particular class to its definition (which for some reason I think github willfully will never support). I use eclipse. Kind of on that same note, is there a way to setup something like MS Code for Mango dev and code in that? I'm always just using like a Scripting DS which is frustrating cause there's no auto completion or anything like that. Unfortunately I do not know a way to get code completion to our script edit boxes, but it would be awesome. I have a somewhat skewed perspective of how challenging this issue is since I've committed a lot of class names and package paths and whatnot to memory at this point. The editor is the "ace" editor, and it looks like custom autocompletion does have some amount of support, but I'm not familiar with what's truly possible: https://github.com/ajaxorg/ace/issues/110 I think that combined with being able to print out would be gold. Not sure what you mean print out. Some things do have useful toString methods defined, but others will still give you the classname, which is still useful if you have the source code. Because it's Java, one could write a global scripts function that does the necessary reflection to print out all the method names, for instance (perhaps one is trying to call some of the classes / modules that are not open source!). But, at that point it's maybe easier to ask on the forum!
  • No pop-up link to data_point_details.shtm in graphical view

    15
    0 Votes
    15 Posts
    3k Views
    phildunlapP
    All the sweeter!
  • Single Datapoint Import from JSON

    3
    0 Votes
    3 Posts
    2k Views
    K
    Sweet got it, thanks @phildunlap!
  • Can't open ma-start.bat

    16
    0 Votes
    16 Posts
    4k Views
    R
    Hi Phil, So I changed the port 8090 and after a restart all is running again. Thanks!! Cheers, Rick
  • Values not showing up in v3 pages but will in v2

    7
    0 Votes
    7 Posts
    2k Views
    Jared WiltshireJ
    @gordoe said in Values not showing up in v3 pages but will in v2: /rest/v2/data-points/DP_Site99_CB2-breakerStatus:1 Failed to load resource: the server responded with a status of 404 (Not Found) This indicates that the data point with XID DP_Site99_CB2-breakerStatus doesn't exist but that doesn't seem to be the data point you are looking at. @gordoe said in Values not showing up in v3 pages but will in v2: The server is running with a dual nic. Think that might have an impact? Not unless your routing is setup incorrectly. @gordoe said in Values not showing up in v3 pages but will in v2: WebSocket connection to 'ws://172.30.0.5/rest/v1/websocket/json-data' failed: Error during WebSocket handshake: net::ERR_CONNECTION_RESET WebSocket issues normally indicate that there is a transparent proxy between the client and the server. We always recommend to use HTTPS for security and reliability of WebSocket connections. The old UI pages use a long polling technique not WebSockets so this does not affect them.
  • BACnet scheduler

    8
    0 Votes
    8 Posts
    4k Views
    phildunlapP
    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).
  • Slow launch for UI after upgrading to 3.5.6

    2
    0 Votes
    2 Posts
    870 Views
    Jared WiltshireJ
    Since you did not provide any sort of logs, screenshots or metrics I cannot really comment. I would suggest looking at the network tab of the chrome debugger (ensure that "Disable cache" is not checked). The first load after upgrading a module will take longer as it has to fetch the new versions of resources. After that it should be cached.
  • Exporting Excel reports to csv

    11
    0 Votes
    11 Posts
    3k Views
    MattFoxM
    @iperry said in Exporting Excel reports to csv: The part I was missing was using the subclass FileAttachment. doh Yep, having the EmailAttachment class as an abstract class means it cannot be instantiated. Gotta use the public child classes.
  • Excel resport: Timestamps format

    4
    0 Votes
    4 Posts
    2k Views
    F
    thanks for the answers, @CraigWeb @iperry it work!