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.

  • How to Delete Data in Mango (3.7.7)

    3
    0 Votes
    3 Posts
    534 Views
    TurboT
    This.. Is a Spicey MeatBall Solution.. So: (1) The 3.7.7 release has a broken Excel importer, since it's on its way out, anyways. (2) The only way to modify existing points is to use the REST API as an admin and delete point values using XIDs? (3) I really don't want to delete.. I want to export, filter, and re-import. I suppose I could do the filtering on a Meta, and "generate history", but there's no way to move that back into the Active polled point, which is used elsewhere in our system for doing other math-related things. I really think there needs to be some way to do this sort of bulk "export / filter / re-import" way native to Mango.. This, and the benefits of Copy and Paste at the data source level, are two things that have been vanished from the Legacy interface that cause me no small amount of consternation.. I mean, the legacy UI could copy'n'paste data sources, which was a really easy way to roll things out. Now I'm exporting JSON, finding and replacing XIDs, and re-importing, which takes at least a billion times as longer than "copy, paste, rename". Now I have to go whip up another external tool to Mango to do this export / filter / import thing? I mean.. I guess I can write a custom Excel importer using the "data import" thing, and pipe that back into the system... But the "remove" type of excel interface made this so it was a feature we were trying to sell as a benefit to fix this kind of data catastrophe, which happens more often than not.
  • Accessing previous values from data points to work out flow rate

    4
    0 Votes
    4 Posts
    991 Views
    MattFoxM
    Anytime
  • Problem with decimals in DNP3 datapoints

    12
    0 Votes
    12 Posts
    2k Views
    T
    @craigweb Hi! Sorry about late answer. The root cause of the problem was finally tracked to our outstation which was using wrong DNP3 profile and since that we got only integer values through DNP3.
  • Alarming if Persistent Connection fails?

    5
    0 Votes
    5 Posts
    758 Views
    TurboT
    I appreciate your help on this: I've been gradually rolling out Option (1), and it seems to work out ok. Seems to be it would be a Handy and Useful Feature to have an alarm point that would fail within the Persistent publisher itself when the link fails (for any reason). Maybe some people do persistent links that come up and down randomly through the day, but it seems that the persistent link feature is generally intended to be used.. Well, persistently. Anyways, the not changed event detector option for the persistent metrics seems to do the job. Thanks! -Greg
  • Bacnet publisher multistate points

    1
    0 Votes
    1 Posts
    581 Views
    No one has replied
  • Add Fonts

    2
    0 Votes
    2 Posts
    433 Views
    MattFoxM
    copy the /opt/mango/web/modules/mangoUI/web/index.html to /opt/mango/overrides/web/modules/mangoUI/web/index.html and add your stylesheet link. If you are able to pull all of the font files and the font-family stylesheet, put them in here - Just downloading the stylesheet file won't work. /opt/mango/overrides/web/modules/mangoUI/web/fonts/montserrat/style.css the link in the index.html file will look like this: <link rel="stylesheet" href="/modules/mangoUI/web/fonts/montserrat/style.css"/> Fox
  • Forum Search not working?

    15
    1 Votes
    15 Posts
    3k Views
    MattFoxM
    Afraid so - looks like it only works as far back as the upgrade was implemented...
  • Testing out the new Influx DB Line Protocol Data Source

    3
    0 Votes
    3 Posts
    507 Views
    W
    Thank you, Terry. While testing, I am using the following input [[inputs.win_perf_counters.object]] # Processor usage, alternative to native, reports on a per core. ObjectName = "Processor" Instances = [""] Counters = [ "% Idle Time", "% Interrupt Time", "% Privileged Time", "% User Time", "% Processor Time", "% DPC Time", ] Measurement = "win_cpu" # Set to true to include _Total instance when querying for all (). IncludeTotal=true The message to be sent is the following win_cpu,host=LAPTOP,instance=2,objectname=Processor,source=telegraf Percent_DPC_Time=0,Percent_Idle_Time=89.79866790771484,Percent_Interrupt_Time=0,Percent_Privileged_Time=0,Percent_Processor_Time=3.9585533142089844,Percent_User_Time=3.098111152648926 1604960081000000000 What is making it to Mango ends up looking like this [image: uQVQ4v7.png] Along with some additional errors for points that failed to be created. 'test_Influx': Failed creating point with field key ²—‚ œ±þÞÑE€d7ˆF}Ñú¢ªÓU™çœÌâï£ÉŤZ >Mç‹Ów?œýò׳?üã¯gÿŒïß¼Œ&óÅprYžo¯‡ÇÕùɏ‹OÕ¬~`úñ?«ËÅdø¥:ý¹Zü>}>?ùódQÍþ>¼¬óéíì²:]Tãêz6üûÉÙðòsµ˜_|¨&‹‹›j6¯.Oaðí×÷Õe5ú­ººx;š_gWÕÕÆÅ¿Þ.>No'ÍïŸüq6›ÎæMÝ_ùÓ×EµñÄý(V¿?3²oWNÐ@ÒPáÛ¿¨Aœÿ>¼yÅ‹_¦‹áx¹³áõhr}~òÓhÜ€Y5»¬õë|x]zd¶PrvmÊåÍí3¡ƒ˜M/«ù|:kÁý¿Œ¾T§’$T-ƒ‰ßî|{öfuÜÿôç«qµú-¢°cH‚hØú–zÝÌnoŸ because name -> Cannot be longer than 255 characters I do have Treat integers as Numeric types checked but seem to keep getting NumberFormatExceptions and Invalid Line Length errors. Can Mango only handle a single value being sent at a time? Thank you.
  • Event Detector - Created Event with Wrong Timestamp

    10
    0 Votes
    10 Posts
    1k Views
    cmusselmC
    One more bit of information I discovered a couple days ago. For a different reason, we had to reboot the production instance. After the reboot, we were getting warning in the MA.log file about datapoints being too far into the future. Of course it was the data points we were retrieving via the JSON retriever. As a quick fix I updated the data points, removing the Time JSON Pointer so it used the Mango timestamp. Something seems off with how that played out. Why didn't the system start to flag the datapoints with that warning right away after I updated the system to not allow data points that far into the future? Does that setting not take effect until reboot? If so, some warning about that on-screen would be nice. Also, after the reboot it was complaining about every poll having a future date/time stamp. If that's the case, then why didn't the point details screenshot shown above use that future time stamp when the values were being recorded. Seems that some of the date/time functions aren't behaving properly.
  • Question / Possible Issue with Meta Data Source Not Updating

    5
    0 Votes
    5 Posts
    948 Views
    cmusselmC
    Thanks, Terry, that's great info, I'll try that out!
  • Dashboard session expires/logs out

    1
    0 Votes
    1 Posts
    470 Views
    No one has replied
  • Mango Installation to Other than Disk C

    2
    0 Votes
    2 Posts
    376 Views
    MattFoxM
    No problem, just ensure all system path variables are configured to allow it to utilise java.. Fox
  • Lost Dashboard designer

    2
    0 Votes
    2 Posts
    828 Views
    MattFoxM
    Got any logs in the ma.log file? May be better to reinstall the mangoUI module just in case something has gone awry
  • Mango Internal Data Source Points

    2
    0 Votes
    2 Posts
    680 Views
    JoelHaggarJ
    A lot of these are self-explanatory but you will find some additional information if you go to the help section for the Administration > System Status page. <your mango URL>/ui/help/system-status
  • How can I send the SNMP trap with Mango?

    1
    0 Votes
    1 Posts
    480 Views
    No one has replied
  • Correct way to include a jQuery plugin

    2
    0 Votes
    2 Posts
    955 Views
    G
    I know this is old, but I'm working on something similar in SVG. I took a stab at modifying jqSimpleConnect, and it appears to work in a Mango user module. Here's what I did in case @BobDay still needs it or anyone else finds it useful. First, I just put a copy of jqSimpleConnect.js in my public filestore, importing it in the define section of my user module. That let me start playing with it in the Chrome dev console until I could get it working. It defaults to putting the lines in the body, which are hidden behind the Mango UI. I tweaked it to use the Mango UI view area where custom pages are displayed and accounted for relative positioning. Finally, I wrapped it in a service. I won't assert that this is correct way, but on a simple test page I could successfully recreate the basic jqSimpleConnect example. In the user module, reference it in the three locations needed to make it a service. define([ 'angular', 'require', ... './services/simpleConnectService.js', ], function(angular, require, ..., simpleConnectService) { 'use strict'; var yourModule = angular.module('yourModule', []); yourModule.service('simpleConnect', [simpleConnectService]); ... I didn't bother actually testing directives. I just injected it into a random test component I had, logged it to the console, saved as variable, and played with it interactively from there. temp1.connect('#div_a', '#div_b', {radius: 8, color: 'green'}); Now for the wrapped/modified jQuery. I left comments to show what I changed. define([], function() { 'use strict'; // SimpleConnectService wraps jqSimpleConnect as an AngularJS service for Mango. // There are a few tweaks to make it work with the Mango dashboards, see "NOTE:" comments for modifications. function SimpleConnectService() { /* * «Copyright 2012 José F. Maldonado» * * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /** * Declare namespace */ // NOTE: Use the service itself. // jqSimpleConnect = new Object(); let jqSimpleConnect = this; /** * This member is an auxiliary counter used for generate unique identifiers. */ jqSimpleConnect._idGenerator = 0; /** * This member is an associative array which contains all the document's connections. */ jqSimpleConnect._connections = new Object(); /** * Positions a connection, acording to the position of the elements which connects. * * @param {object} connection A connection object. */ jqSimpleConnect._positionConnection = function(connection) { // Calculate the positions of the element's center. // NOTE: Get the position of the Mango UI view for displaying custom pages. let uiOffset = jQuery('div.ma-ui-main-view > div[ui-view]').offset(); let uiPos = jQuery('div.ma-ui-main-view > div[ui-view]').position(); uiPos.left = parseInt(uiOffset.left) - parseInt(uiPos.left); uiPos.top = parseInt(uiOffset.top) - parseInt(uiPos.top); // Calculate the positions of the element's center. var posA = connection.elementA.offset(); // NOTE: Use the UI offset to calculate a relative offset. // posA.left = parseInt(posA.left, 10) + parseInt(connection.elementA.outerWidth()/2, 10); // posA.top = parseInt(posA.top, 10) + parseInt(connection.elementA.outerHeight()/2, 10); posA.left = parseInt(posA.left, 10) - uiPos.left + parseInt(connection.elementA.outerWidth()/2, 10); posA.top = parseInt(posA.top, 10) - uiPos.top + parseInt(connection.elementA.outerHeight()/2, 10); var posB = connection.elementB.offset(); // NOTE: Use the UI offset to calculate a relative offset. // posB.left = parseInt(posB.left, 10) + parseInt(connection.elementB.outerWidth()/2, 10); // posB.top = parseInt(posB.top, 10) + parseInt(connection.elementB.outerHeight()/2, 10); posB.left = parseInt(posB.left, 10) - uiPos.left + parseInt(connection.elementB.outerWidth()/2, 10); posB.top = parseInt(posB.top, 10) - uiPos.top + parseInt(connection.elementB.outerHeight()/2, 10); // Get the line's elements. var line1 = jQuery('#' + connection.id + '_1'); var line2 = jQuery('#' + connection.id + '_2'); var line3 = jQuery('#' + connection.id + '_3'); // Verify if the elements are aligned in a horizontal or vertical line. if(posA.left == posB.left || posA.top == posB.top) { // Uses only one line (hide the other two). line1.show(); line2.hide(); line3.hide(); // Verify if the line must be vertical or horizonal. if(posA.left == posB.left) { // Vertical line. jqSimpleConnect._positionVerticalLine(line1, posA, posB, connection.radius, connection.roundedCorners); } else { // Horizontal line. jqSimpleConnect._positionHorizontalLine(line1, posA, posB, connection.radius, connection.roundedCorners); } } else { // Verify if must use two lines or three. if(connection.anchorA != connection.anchorB) { // Use two lines (hide the third). line1.show(); line2.show(); line3.hide(); // Check the anchors of the elements. var corner = new Object(); if(connection.anchorA == 'vertical') { // Find the corner's position. corner.left = posA.left; corner.top = posB.top; // Draw lines. jqSimpleConnect._positionVerticalLine(line1, posA, corner, connection.radius, connection.roundedCorners); jqSimpleConnect._positionHorizontalLine(line2, posB, corner, connection.radius, connection.roundedCorners); } else { // Find the corner's position. corner.left = posB.left; corner.top = posA.top; // Draw lines. jqSimpleConnect._positionVerticalLine(line1, posB, corner, connection.radius, connection.roundedCorners); jqSimpleConnect._positionHorizontalLine(line2, posA, corner, connection.radius, connection.roundedCorners); } } else { // Use three lines. line1.show(); line2.show(); line3.show(); // Declare connection points. var corner1 = new Object(); var corner2 = new Object(); // Find if the middle's line must be vertical o horizontal. if(connection.anchorA == 'vertical') { // Middle's line must be horizontal. corner1.top = parseInt((posA.top + posB.top)/2, 10); corner2.top = corner1.top; corner1.left = posA.left; corner2.left = posB.left; // Draw lines. jqSimpleConnect._positionVerticalLine(line1, posA, corner1, connection.radius, connection.roundedCorners); jqSimpleConnect._positionVerticalLine(line2, posB, corner2, connection.radius, connection.roundedCorners); jqSimpleConnect._positionHorizontalLine(line3, corner1, corner2, connection.radius, connection.roundedCorners); } else { // Middle's line must be vertical. corner1.left = parseInt((posA.left + posB.left)/2, 10); corner2.left = corner1.left; corner1.top = posA.top; corner2.top = posB.top; // Draw lines. jqSimpleConnect._positionHorizontalLine(line1, posA, corner1, connection.radius, connection.roundedCorners); jqSimpleConnect._positionHorizontalLine(line2, posB, corner2, connection.radius, connection.roundedCorners); jqSimpleConnect._positionVerticalLine(line3, corner1, corner2, connection.radius, connection.roundedCorners); } } } } /** * Draws a vertical line, between the two points, by changing the properties of a HTML element. * *@param {object} jqElement A jQuery object of the HTML element used for represent the line. *@param {object} point1 An object with the properties 'left' and 'top' representing the position of the first point. *@param {object} point2 An object with the properties 'left' and 'top' representing the position of the second point. *@param {integer} radius The line's radius. *@param {boolean} roundedCorners A boolean indicating if the corners are going to be round. */ jqSimpleConnect._positionVerticalLine = function(jqElement, point1, point2, radius, roundedCorners) { var halfRadius = parseInt(radius/2, 10); jqElement.css('left', point1.left - halfRadius); jqElement.css('top', ((point1.top > point2.top)? (point2.top - halfRadius) : (point1.top - halfRadius))); jqElement.css('width', radius + 'px'); jqElement.css('height', ((point1.top > point2.top)? (point1.top - point2.top + radius) : (point2.top - point1.top + radius) ) + 'px'); } /** * Draws a horizontal line, between the two points, by changing the properties of a HTML element. * *@param {object} jqElement A jQuery object of the HTML element used for represent the line. *@param {object} point1 An object with the properties 'left' and 'top' representing the position of the first point. *@param {object} point2 An object with the properties 'left' and 'top' representing the position of the second point. *@param {integer} radius The line's radius. *@param {boolean} roundedCorners A boolean indicating if the corners are going to be round. */ jqSimpleConnect._positionHorizontalLine = function(jqElement, point1, point2, radius, roundedCorners) { var halfRadius = parseInt(radius/2, 10); jqElement.css('top', point1.top - halfRadius); jqElement.css('left', ((point1.left > point2.left)? (point2.left - halfRadius) : (point1.left - halfRadius))); jqElement.css('height', radius + 'px'); jqElement.css('width', ((point1.left > point2.left)? (point1.left - point2.left + radius) : (point2.left - point1.left + radius) ) + 'px'); } /** * Draws a connection between two elements. * * @param {object} elementA A CSS selector or a jQuery's object for select the first element. * @param {object} elementB A CSS selector or a jQuery's object for select the second element. * @param {object} options An associative array with the properties 'color' (which defines the color of the connection), 'radius' (the width of the * connection), 'roundedCorners' (a boolean indicating if the corners must be round), 'anchorA' (the anchor type of the first element, which can be * 'horizontal' or 'vertical') and 'anchorB' (the anchor type of second element). * @returns {string} The connection identifier or 'null' if the connection could not be draw. */ jqSimpleConnect.connect = function(elementA, elementB, options) { // Verify if the element's selector are ok. // NOTE: Use length instead of size(). AngularJS/Mango's jQuery doesn't have size. // if(elementA == null || jQuery(elementA).size() == 0 || // elementB == null || jQuery(elementB).size() == 0) { // return null; // } if(elementA == null || jQuery(elementA).length == 0 || elementB == null || jQuery(elementB).length == 0) { // NOTE: Yell at me when I make a typo. Remove when it's working, or make this more useful. console.warn('failed to locate elements'); return null; } // NOTE: Use length instead of size() here too. elementA = jQuery(elementA); // if(elementA.size() > 1) elementA = elementA.first(); if(elementA.length > 1) elementA = elementA.first(); elementB = jQuery(elementB); // if(elementB.size() > 1) elementB = elementB.first(); if(elementB.length > 1) elementB = elementB.first(); // Create connection object. var connection = new Object(); connection.id = 'jqSimpleConnect_' + jqSimpleConnect._idGenerator++; connection.elementA = elementA; connection.elementB = elementB; connection.color = (options != null && options.color != null)? options.color + '' : '#808080'; connection.radius = (options != null && options.radius != null && !isNaN(options.radius))? parseInt(options.radius, 10) : 5; connection.anchorA = (options != null && options.anchorA != null && (options.anchorA == 'vertical' || options.anchorA == 'horizontal'))? options.anchorA : 'horizontal'; connection.anchorB = (options != null && options.anchorB != null && (options.anchorB == 'vertical' || options.anchorB == 'horizontal'))? options.anchorB : 'horizontal'; connection.roundedCorners = options != null && options.roundedCorners != null && (options.roundedCorners == true || options.roundedCorners == 'true'); connection.click = (options != null && options.click != null)? options.click : null; connection.mouseover = (options != null && options.mouseover != null)? options.mouseover : null; connection.mouseout = (options != null && options.mouseout != null)? options.mouseout : null; // Add connection to the connection's list. jqSimpleConnect._connections[connection.id] = connection; // Create HTML elements. var div = '<div id="divUniqueIdentifier" class="jqSimpleConnect '+connection.id+'" ' + 'style="width:'+connection.radius+'px; ' + 'height:'+connection.radius+'px; ' + 'background-color:'+connection.color+'; ' + (connection.roundedCorners? 'border-radius:'+parseInt(connection.radius/2,10)+'px; -webkit-border-radius:'+parseInt(connection.radius/2,10)+'px; -moz-border-radius:'+parseInt(connection.radius/2,10)+'px; ' : '') + 'position:absolute;"></div>'; // NOTE: 'body' will place elements behind the page. Instead of messing with z-index, use the Mango UI view. // jQuery('body').prepend(div.replace('divUniqueIdentifier', connection.id + '_1')); // jQuery('body').prepend(div.replace('divUniqueIdentifier', connection.id + '_2')); // jQuery('body').prepend(div.replace('divUniqueIdentifier', connection.id + '_3')); jQuery('div.ma-ui-main-view > div[ui-view]').prepend(div.replace('divUniqueIdentifier', connection.id + '_1')); jQuery('div.ma-ui-main-view > div[ui-view]').prepend(div.replace('divUniqueIdentifier', connection.id + '_2')); jQuery('div.ma-ui-main-view > div[ui-view]').prepend(div.replace('divUniqueIdentifier', connection.id + '_3')); jQuery("."+connection.id).click(function() { if(typeof connection.click == "function") { connection.click(connection); } }).on("mouseover", function() { if(typeof connection.mouseover == "function") { connection.mouseover(connection); } }).on("mouseout", function() { if(typeof connection.mouseout == "function") { connection.mouseout(connection); } }); // Position connection. jqSimpleConnect._positionConnection(connection); // Return result. return connection.id; } /** * Repaints a connection. * * @param {string} connectionId The connection identifier. * @returns {boolean} 'true' if the operation was done, 'false' if the connection no exists. */ jqSimpleConnect.repaintConnection = function(connectionId) { var connection = jqSimpleConnect._connections[connectionId]; if(connection != null) { jqSimpleConnect._positionConnection(connection); return true; } return false; } /** * Repaints all the connections. */ jqSimpleConnect.repaintAll = function() { for(var key in jqSimpleConnect._connections) { jqSimpleConnect._positionConnection(jqSimpleConnect._connections[key]); } } /** * Removes a connection. * * @param {string} connectionId The connection identifier. * @returns {boolean} 'true' if the operation was done, 'false' if the connection no exists. */ jqSimpleConnect.removeConnection = function(connectionId) { if(jqSimpleConnect._connections[connectionId] != null) { // Remove HTML element. jQuery('.jqSimpleConnect.'+connectionId).remove(); // Remove connection data. jqSimpleConnect._connections[connectionId] = null; delete jqSimpleConnect._connections[connectionId]; // Return result. return true; } return false; } /** * Removes all the connections. */ jqSimpleConnect.removeAll = function() { // Remove HTML elements. jQuery('.jqSimpleConnect').remove(); // Clear connections list. for(var key in jqSimpleConnect._connections) { jqSimpleConnect._connections[key] = null; delete jqSimpleConnect._connections[key]; } } // End of jqSimpleConnect. } return SimpleConnectService; });
  • Mango v4 - Alarm Acknowledge Permission

    2
    0 Votes
    2 Posts
    485 Views
    terrypackerT
    This is not possible in Mango 4.0 but is a good idea. Currently if you can "see" the event you can acknowledge it.
  • Data points visibility by User

    4
    0 Votes
    4 Posts
    840 Views
    MattFoxM
    Yes, when you set a read permission to a datapoint it removes the implicit "user" permission, pretty sure that's stated in the docs. It's how I prevent users from seeing other users data combined with tags. just to be sure. Fox
  • Data Points Details page edit

    2
    0 Votes
    2 Posts
    846 Views
    BGB
    While digging about, I discovered that in mango 3, the legacy data points details page still works the way we need it to for the charts on the details page. So, which is easier: Make the new Data Points Details page show the limits on the chart like the legacy page does or Change the quick info pop up icons redirect to the legacy data points details page or Hide the quick info icons and make my data point on the dashboard click-able and redirect to the web page for the legacy data points details page. I think with my programming skill level it might have to be option 3 as a down and dirty fix. Your thoughts would be appreciated. Cheers Brian
  • Buffer Overflow

    4
    0 Votes
    4 Posts
    980 Views
    Dave FrazierD
    I'm not able to replicate this issue with the BACnet IP devices I have on my test bench, but based on the error message I think you may need to install the fontconfig package. Log into the unit locally or via SSH (port 2222) and run the following command: sudo apt-get install fontconfig