• Recent
    • Tags
    • Popular
    • Register
    • Login
    1. Home
    2. MattFox

    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.

    Radix IoT Website Mango 3 Documentation Website Mango 4 Documentation Website Mango 5 Documentation Website
    • Profile
    • Following 1
    • Followers 11
    • Topics 63
    • Posts 1,283
    • Best 93
    • Controversial 0
    • Groups 0

    MattFox

    @MattFox

    Electronics Technologist, Automation Engineer, Programmer, tinkerer, and in some cases miracle worker, as in it's a miracle that it works (haha)

    Need a mango consultant? I do contract dashboard work.

    101
    Reputation
    2.3k
    Profile views
    1.3k
    Posts
    11
    Followers
    1
    Following
    Joined Last Online
    Website foxes.link Location New Zealand

    MattFox Unfollow Follow

    Best posts made by MattFox

    • RE: Publisher don't listen

      @Jérôme-Girard if you're using a non root user you'll need to configure linux to allow non root users to use sub 1024 ports.
      namely
      sudo sysctl net.ipv4.ip_unprivileged_port_start=502
      and
      sudo nano /etc/sysctl.conf
      then set
      net.ipv4.ip_forward=1

      That should enable you to fire the publisher up on 502

      Fox

      posted in Mango General
      MattFoxM
      MattFox
    • RE: Excel Reports Sent at Wrong Time

      This will be a handy post for those who are running cloud hosted solutions as there isn't a mangoES settings section for custom installs.

      posted in User help
      MattFoxM
      MattFox
    • RE: Charts for past 12 hours

      Correct, look under API Docs -> Components -> maSerialChart
      They have a complete guideline of what attribute tags to use to apply values. You will want the series-x-values where the x is the chart number.
      The Chart update rate is affected by the maPointValues components which you can also read about. The realtime="true" attribute will allow datapoints to update into the chart at the rate they change or are updated.
      If you don't want to average, make sure you set the rollup type to NONE. Alternatively, use the rollup-interval to set the interval duration between datapoints in the chart, note that changing from the live updating rate may mean you;ll need to average.

      posted in Dashboard Designer & Custom AngularJS Pages
      MattFoxM
      MattFox
    • Cannot build with maven for custom module

      Hi Radix Team, trying to build a custom dashboard package and I keep getting this error - looks like it's not in your repo anymore - got any suggestions?

      [ERROR] Plugin org.codehaus.mojo:build-helper-maven-plugin:1.9.1 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.codehaus.mojo:build-helper-maven-plugin:jar:1.9.1: Could not transfer artifact org.codehaus.mojo:build-helper-maven-plugin:pom:1.9.1 from/to ias-releases (https://maven.mangoautomation.net/repository/ias-release/): Transfer failed for https://maven.mangoautomation.net/repository/ias-release/org/codehaus/mojo/build-helper-maven-plugin/1.9.1/build-helper-maven-plugin-1.9.1.pom: Network is unreachable (connect failed) -> [Help 1]
      
      

      Fox

      posted in Mango feedback
      MattFoxM
      MattFox
    • RE: Advice on moving components / controllers / services out of userModule

      Fixed, just mixed up the full path of the file with the userModule URL after closer inspection.

      posted in User help
      MattFoxM
      MattFox
    • RE: Removing last edited page from the default load

      @phillip-weeks
      are your referring to this post you made last year?
      https://forum.infiniteautomation.com/topic/3077/is-it-possible-to-roll-back-a-latest-ui-update-to-the-previous-version/5

      Looks like Jared mentions something about wiping your cache....

      0_1557969475663_cb114c78-dc94-48e4-8372-81248930ef06-image.png

      posted in Dashboard Designer & Custom AngularJS Pages
      MattFoxM
      MattFox
    • RE: Pop up window (face plate)

      OK!
      As a starting point to work from. I'll work with you so you learn how it all works as you go...
      (All code is placed in the /opt/mango/overrides/web... directories)
      /modules/mangoUI/web/dev/components/settingsModal.js

      define(['angular', 'require'], function(angular, require) {
      'use strict';
      
      /* Date: 1/9/18
      	   Author: Matt "Fox" Fox
      	   Desc: component written to launch a modal dialog with either a built in template or just spit out a list of points to save one by one.
      	*/
      	settingsModalController.$inject = ['$mdDialog','maJsonStore'];
      		function settingsModalController ($mdDialog,maJsonStore)
      		{
      			var ctrl = this;
      			ctrl.mdDialog = $mdDialog;
      			ctrl.parsedOptions=[];
      			
      			ctrl.values={};
      			
      			this.$onInit = function()
      			{
      				if(this.points && !angular.isArray(this.points))
      				{
      					console.log('Error: points field not an array of point objects');
      				}
      				if(this.pointOptions && !angular.isArray(this.pointOptions) )
      				{
      					console.log('Error: points options field not an array');
      				}
      				ctrl.clickOffClose = ctrl.clickOffClose===true?true:false;
      				
      				
      				
      				
      				
      			};
      			
      			this.$onChanges = function(e)
      			{
      				console.log(e);
      				checkPoints();
      			}
      			
      			function checkPoints()
      			{
      				ctrl.parsedOptions=[];
      				if(ctrl.points && angular.isArray(ctrl.points))
      				{
      					if(ctrl.pointOptions && angular.isArray(ctrl.pointOptions) )
      					{
      						var ptName,ptDesc;
      						for(var i=0; i<ctrl.points.length; i++)
      						{
      							ptName=ctrl.points[ i ].name;
      							ptDesc='';
      							if(ctrl.pointOptions[ i ] && ctrl.pointOptions[ i ].hasOwnProperty('name') )
      							{
      								ptName = ctrl.pointOptions[ i ].name;
      							}
      							if(ctrl.pointOptions[ i ] && ctrl.pointOptions[ i ].hasOwnProperty('desc') )
      							{
      								ptDesc = ctrl.pointOptions[ i ].desc;
      							}
      							ctrl.parsedOptions.push( {name:ptName,desc:ptDesc} );
      						}
      					}
      					else
      					{
      						for(var i=0; i<ctrl.points.length; i++)
      						{
      							ptName=ctrl.points[ i ].name;
      							ptDesc='';
      						
      							ctrl.parsedOptions.push( {name:ptName,desc:ptDesc} );
      						}
      					}
      				}
      				else if(ctrl.pointOptions && angular.isArray(ctrl.pointOptions) && !ctrl.points )
      				{	
      					var ptId, ptName, ptDesc;
      					for(var i=0; i<ctrl.pointOptions.length; i++)
      					{
      						if(ctrl.pointOptions[ i ] && !ctrl.pointOptions[ i ].hasOwnProperty('name') )
      						{
      							// ctrl.pointOptions=[];
      							ctrl.parsedOptions=[];
      							return;
      						}
      						ptId=i;
      						ptDesc='';
      						ptName=ctrl.pointOptions[ i ].name;
      						if(ctrl.pointOptions[ i ] && ctrl.pointOptions[ i ].hasOwnProperty('id') )
      						{
      							ptId = ctrl.pointOptions[ i ].id;
      						}
      						if(ctrl.pointOptions[ i ] && ctrl.pointOptions[ i ].hasOwnProperty('desc') )
      						{
      							ptDesc = ctrl.pointOptions[ i ].desc;
      						}						
      						ctrl.parsedOptions.push( {id:ptId,name:ptName,desc:ptDesc} );
      					}
      				}
      			}
      			
      			/* DIALOG CODE */
      			ctrl.showDialogue = function(ev) {
      			   // ctrl.updateModals();
      			   if( ctrl.altTemplateUrl!==undefined  )
      			   {
      				   try
      				   {
      					   
      					ctrl.mdDialog.show({
      					  templateUrl:ctrl.altTemplateUrl, 
      					  parent: angular.element(document.body),
      					  targetEvent: ev,
      					  clickOutsideToClose: ctrl.clickOffClose
      					}).then(
      						function()
      						{
      							console.log('function if closed/hidden manually'); 
      						},
      						function()
      						{
      							console.log('function to fire if closed from clicking outside/cancelled');
      						}
      					);
      				   }catch(e){console.warn(e);}
      			   }
      			   else
      			   {
      				   try{
      					   
      					ctrl.mdDialog.show({
      					  contentElement: '#settingsModal',
      					  parent: angular.element(document.body),
      					  targetEvent: ev,
      					  clickOutsideToClose: ctrl.clickOffClose
      					}).then(
      						function()
      						{
      							console.log('function if closed manually'); 
      						},
      						function()
      						{
      							console.log('function to fire if closed from clicking outside/cancelled');
      						}
      					);
      				   }catch(e){console.warn(e);}
      				}
      			};
      			
      			ctrl.hideDialogue = function() {
      				ctrl.mdDialog.hide();
      			};
      
      			ctrl.cancel = function() {	  
      				ctrl.mdDialog.cancel();
      			};
      			/* DIALOG CODE END*/
      			
      			/* JSON Store Stuff: */
      			ctrl.saveToStore = function(data=null)
      			{
      				
      				var item = maJsonStore.newItem( ctrl.jsonStore.toLowerCase() );
      				item.jsonData = data===null ? ctrl.values : data;
      				item.readPermission= "user";
      				item.editPermission= "user"; //can change this at your leisure or we can break it out into a setting...
      				
      				var r = item.$save();
      				
      				if(r.status)
      				{ 
      				}
      				else
      				{ 
      				}
      			};
      			
      			ctrl.loadFromStore = function()
      			{
      				maJsonStore.get({xid: ctrl.jsonStore.toLowerCase() }).$promise.then(function(item) {
      				ctrl.values = item.jsonData;
      			});
      			/* JSON Store Stuff END: */
      			};
      			
      			/* Virtual Point Save stuff */
      			ctrl.saveToPoint = function()
      			{
      				if(ctrl.savePoint===undefined)
      				{
      					alert('Point to save to not set as attribute!');
      					return;
      				}
      				ctrl.savePoint.setValue( JSON.stringify(ctrl.values) );
      			};	
      			
      			/* Virtual Point Save stuff END */
      	}
      		
      		
      		
      	
      	var settingsModal={
      		bindings:{
      			jsonStore: '<?', 		//Store name to save settings to
      			savePoint: '<?', 		//alternatively, save my JSON to a virtual pt, MUST BE TYPE DATAPOINT...
      			altTemplateUrl:'=?', 	//If we want to use the popup to show something else: use this template...
      			modalTitle:'=?', 		//seemed like a good idea at the time... will only work if altTemplateUrl is empty
      			clickOffClose:'=?', 	//set to true to click outside modal to shut it
      			pointOptions:'<?', 	//Alternate names for points,  (object array) [{id:'',name:'',desc:''}], id used for key name if using json/virtual point save
      			points: '<?',			 //Array of points to set individually
      		},
      		controller: settingsModalController,
      		templateUrl:'/modules/mangoUI/web/dev/views/modalDemo.html'
      	};
      	
      	return settingsModal;
      });
      

      and the template markup to add:
      /modules/mangoUI/web/dev/views/modalDemo.html

       <ma-button  hue="hue-2" palette="primary" label="Open Dialogue" ng-click="$ctrl.showDialogue()" raised="true"></ma-button>
       <div ng-if="!$ctrl.altTemplateUrl" style="visibility: hidden">
          <div class="md-dialog-container" id="settingsModal">
            <md-dialog layout-padding>
      			<md-dialog-actions><md-button ng-if="!$ctrl.clickOffClose" ng-click="$ctrl.cancel()" class="md-primary">x</md-button></md-dialog-actions>
       <div ng-if="!$ctrl.points && !$ctrl.parsedOptions">
      		Custom markup needed!
      		</div>
      		 
             <h1 ng-if="$ctrl.modalTitle!==undefined">{{$ctrl.modalTitle}}</h1> <small ng-if="$ctrl.clickOffClose">Click outside dialogue to close</small>
      		
      		<div ng-if="$ctrl.points">
      		<md-input-container ng-repeat="(index,point) in $ctrl.points" style="display:block;width:100%;">
      	   {{$ctrl.parsedOptions[index].name}}
      			<br/>	
      	   {{$ctrl.parsedOptions[index].desc}}
      			<br/>	
      			
      		<span style="display:inline-block;">Current Value: <ma-point-value style="display:inline-block;" point="point" ></ma-point-value></span>
      		 <ma-set-point-value  point="point" show-button="true"></ma-set-point-value> 
      		</md-input-container>
      		</div>
      		<div ng-if="!$ctrl.points && $ctrl.parsedOptions.length>0">
      			<md-input-container ng-repeat="input in $ctrl.parsedOptions">
      			{{input.name}}<br/>{{input.desc}}
      			<input ng-model="$ctrl.values[ input.id ]"/>
      			</md-input-container>
      		</div>
      		
            </md-dialog>
          </div>
        </div>
      

      More than happy to help you work through this (it will be a bit of a crash course)
      I've not added the buttons on the template for saving using a virtual point or JSON store, but that can be added quite easily.
      Basically you can generate a popup which will populate with inputs that can be named, given an ID and a description if necessary. This can also be used to override point names to more 'user friendly' equivalents for your users if they're filling out items in the dialogue box.

      inside the userModule.js directory (assuming that's the name of the file you've followed from Jared's tutorial) you'll want this structure:

      /userModule.js
      /components/settingsModal.js
      /views/modalDemo.html

      and inside userModule.js you'll want this:

      define(['angular', 'require','./components/settingsModal.js'], function(angular, require,settingsModal) {
          'use strict';
       var userModule = angular.module('userModule', ['maUiApp']);
      try {	
      	userModule.component('settingsModal', settingsModal);
      }
      catch(e){console.log(e);}	
          return userModule;
      });
      

      Markup in the dashboard page builder will be:

      <settings-modal point-options="[{id:'test',name:'input 1',desc:'input test 1'},{id:'test2',name:'input 2',desc:'input test 2'}]" points="vp" click-off-close="true"></settings-modal>
      

      See if you can get the popup showing for you first. I'm using 3.4.1 so I'm not completely sure if this will be affected in your version of mangoUI...

      Fox

      EDIT: sorry I'll be sure to add some more code comments later...
      New Edit: added data to save to store as an optional argument

      posted in Wishlist
      MattFoxM
      MattFox
    • RE: MQTT Publish

      @Rav-Panchalingam from what I've seen. Mango can only subscribe. Not publish. They've never implemented a publisher despite requests dating back 3+ years

      posted in User help
      MattFoxM
      MattFox
    • RE: How to change date format on chart?
      /ui/docs/ng-mango/ma-serial-chart
      

      Read the docs under API Docs -> components -> maSerialChart

      there's an attribute you can set to alter the format:

      time-format
      (optional)
      string	
      The moment.js time format to be used in displaying timestamps on the X axis.
      

      Put your moment.js format in there and that will let you set the format to 'DD mm' etc

      posted in Mango Automation general Discussion
      MattFoxM
      MattFox
    • RE: Big News! Infinite Automation, Mango and BitBox USA have merged to create Radix IoT

      Congrats for making it through the other side. Would be good to have a chat considering currently our system doesn't scale well with mango. If the merger can help with this that'd be grand. It's the bottleneck in our system and I'm struggling to streamline what we have.

      Fox

      posted in Announcements
      MattFoxM
      MattFox

    Latest posts made by MattFox

    • RE: How do I reset localhost8080: username and password

      @LBryant are you using the H2 database or MySQL?
      One is harder than the other, if mysql, stop mango, make a fresh mango database setting then copy the password from the user generated in the new db and overwrite the password on your user in the original, that will set it to admin. Change back to your old db settings and log in.

      If H2, stop mango, rename database folder and restart, this will cause mango to generate a new h2 db. Stop mango and use the h2 web utility supplied in the mango/bin directory to access the new database, obtain the password from the admin user.

      Close then repeat with the old database and update the password.
      Rename database folder and restore the original folder back to database again.

      Log in with admin password

      Fox

      posted in User help
      MattFoxM
      MattFox
    • RE: Help defining Controller with Custom Dashboard and UserModule

      @mfitzgerald_wavetech sorry, face plate
      https://forum.mango-os.com/post/19718

      posted in Dashboard Designer & Custom AngularJS Pages
      MattFoxM
      MattFox
    • RE: Help defining Controller with Custom Dashboard and UserModule

      @mfitzgerald_wavetech

      var myDashboardModule = angular.module('myDashboardModule', ['maUiApp']);
      
          myDashboardModule.controller(
      

      Looks like you're making the same call twice to me
      Just wrap your controller in a function and return the function itself.

      Check out the component I wrote in the forum for 'faceplate'. Despite it being a component, you'd do it the same way for a controller.

      Hope that gives you something to work with

      Fox

      posted in Dashboard Designer & Custom AngularJS Pages
      MattFoxM
      MattFox
    • RE: Mango V4

      @paulolando91 where have you stored your images?
      It makes the most sense if you store your images in the filestore and use the redt api url to obtain them.
      If you don't want that and want it hard coded, you'll have to make the directory inside

      [Mango_home]/overrides/web/modules/mangoUI/web/store

      Fox

      posted in User help
      MattFoxM
      MattFox
    • RE: NoSQL requires license?

      @Faucon-Ngando sounds like a bug, raise it with radix. Your property settings are correct.
      Assuming you can log in to your MySQL db locally via the mango credentials

      Fox

      posted in User help
      MattFoxM
      MattFox
    • RE: NoSQL requires license?

      @Faucon-Ngando what version of mango?

      Fox

      posted in User help
      MattFoxM
      MattFox
    • RE: NoSQL requires license?

      @Faucon-Ngando he's using a docker-compose file to run both a postgres sql container and mango container inside a single network.
      The volume property maps the directories inside the docker images to real directories on the host system.

      For exporting you'll need to do a sql backup and a complete nosql backup (if applicable)
      These outputs should appear inside you /opt/mango-data/backups directory.
      If you're not using an external sql you should still be able to run using the same configs in that docker-compose file, minus the postgres related entry as all of your data and backups should exist in the mango-data directory...

      Fox

      posted in User help
      MattFoxM
      MattFox
    • RE: Mango 5 - bugs or user non-friendly things

      @ms_brunette happy to help, perhaps you can output your markup into some code blocks </> for me?
      Feel free to PM as well

      Fox

      posted in User help
      MattFoxM
      MattFox
    • RE: Change a data point with condition

      @tungthanh500 get rid of the runtime sleep call. Set the context point related to the data point you are validating and set the script to trigger from one of them for a start.
      Alternatively use a cron timer setting set to 15 seconds.

      Fox

      posted in Scripting general Discussion
      MattFoxM
      MattFox
    • RE: Annotation mode: Cannot add shapes

      @mhaluza yes

      posted in User help
      MattFoxM
      MattFox