/** * Controller handling the charts */ Ext.define('FHEM.controller.ChartController', { extend: 'Ext.app.Controller', refs: [ { selector: 'datefield[name=starttimepicker]', ref: 'starttimepicker' //this.getStarttimepicker() }, { selector: 'datefield[name=endtimepicker]', ref: 'endtimepicker' //this.getEndtimepicker() }, { selector: 'button[name=requestchartdata]', ref: 'requestchartdatabtn' //this.getRequestchartdatabtn() }, { selector: 'button[name=savechartdata]', ref: 'savechartdatabtn' //this.getSavechartdatabtn() }, { selector: 'combobox[name=devicecombo]', ref: 'devicecombo' //this.getDevicecombo() }, { selector: 'combobox[name=xaxiscombo]', ref: 'xaxiscombo' //this.getXaxiscombo() }, { selector: 'combobox[name=yaxiscombo]', ref: 'yaxiscombo' //this.getYaxiscombo() }, { selector: 'linechartview', ref: 'linechartview' //this.getLinechartview() }, { selector: 'linechartpanel', ref: 'linechartpanel' //this.getLinechartpanel() }, { selector: 'linechartpanel toolbar', ref: 'linecharttoolbar' //this.getLinecharttoolbar() }, { selector: 'grid[name=savedchartsgrid]', ref: 'savedchartsgrid' //this.getSavedchartsgrid() } ], /** * init function to register listeners */ init: function() { this.control({ 'combobox[name=devicecombo]': { select: this.deviceSelected }, 'button[name=requestchartdata]': { click: this.requestChartData }, 'button[name=savechartdata]': { click: this.saveChartData }, 'button[name=stepback]': { click: this.stepchange }, 'button[name=stepforward]': { click: this.stepchange }, 'linechartview': { afterrender: this.enableZoomInChart }, 'grid[name=savedchartsgrid]': { cellclick: this.loadsavedchart }, 'actioncolumn[name=savedchartsactioncolumn]': { click: this.deletechart } }); }, /** * loads data for the readingsstore after device has been selected */ deviceSelected: function(combo){ var device = combo.getValue(), store = this.getYaxiscombo().getStore(), proxy = store.getProxy(); if (proxy) { proxy.url = '../../../fhem?cmd=get+' + FHEM.dblogname + '+-+webchart+""+""+' + device + '+getreadings&XHR=1'; store.load(); } }, /** * Triggers a request to FHEM Module to get the data from Database */ requestChartData: function() { var me = this; //getting the necessary values var device = me.getDevicecombo().getValue(), xaxis = me.getXaxiscombo().getValue(), yaxis = me.getYaxiscombo().getValue(), starttime = me.getStarttimepicker().getValue(), dbstarttime = Ext.Date.format(starttime, 'Y-m-d_H:i:s'), endtime = me.getEndtimepicker().getValue(), dbendtime = Ext.Date.format(endtime, 'Y-m-d_H:i:s'), view = me.getLinechartview(), store = me.getLinechartview().getStore(), proxy = store.getProxy(); //register store listeners store.on("beforeload", function() { me.getLinechartview().setLoading(true); }); store.on("load", function() { me.getLinechartview().setLoading(false); }); if (proxy) { var url = '../../../fhem?cmd=get+' + FHEM.dblogname + '+-+webchart+' + dbstarttime + '+' + dbendtime + '+'; url +=device + '+timerange+' + xaxis + '+' + yaxis + '&XHR=1'; proxy.url = url; store.load(); } //remove the old max values of y axis to get a dynamic range delete view.axes.get(0).maximum; view.axes.get(0).setTitle(yaxis); view.axes.get(1).setTitle(xaxis); // set the x axis range dependent on user given timerange view.axes.get(1).fromDate = starttime; view.axes.get(1).toDate = endtime; view.axes.get(1).processView(); me.getLinechartview().redraw(); }, /** * perpare zooming */ enableZoomInChart: function() { var view = this.getLinechartview(); view.mon(view.getEl(), 'mousewheel', this.zoomInChart, this); }, /** * zoom in chart with mousewheel */ zoomInChart: function(e) { var wheeldelta = e.getWheelDelta(), view = this.getLinechartview(), currentmax = view.axes.get(0).prevMax, newmax; if (wheeldelta == 1) { //zoomin case: if (currentmax > 1) { newmax = currentmax - 1; view.axes.get(0).maximum = newmax; view.redraw(); } } else if (wheeldelta == -1) { //zoomout case newmax = currentmax + 1; view.axes.get(0).maximum = newmax; view.redraw(); } }, /** * jump one step back / forward in timerange */ stepchange: function(btn) { var me = this; var starttime = me.getStarttimepicker().getValue(), dbstarttime = Ext.Date.format(starttime, 'Y-m-d H:i:s'), endtime = me.getEndtimepicker().getValue(), dbendtime = Ext.Date.format(endtime, 'Y-m-d H:i:s'); if(!Ext.isEmpty(starttime) && !Ext.isEmpty(endtime)) { var timediff = Ext.Date.getElapsed(starttime, endtime); if(btn.name === "stepback") { me.getEndtimepicker().setValue(starttime); var newstarttime = Ext.Date.add(starttime, Ext.Date.MILLI, -timediff); me.getStarttimepicker().setValue(newstarttime); me.requestChartData(); } else if (btn.name === "stepforward") { me.getStarttimepicker().setValue(endtime); var newendtime = Ext.Date.add(endtime, Ext.Date.MILLI, timediff); me.getEndtimepicker().setValue(newendtime); me.requestChartData(); } } }, /** * save the current chart to database */ saveChartData: function() { var me = this; Ext.Msg.prompt("Select a name", "Enter a name to save the Chart", function(action, savename) { if (action === "ok" && !Ext.isEmpty(savename)) { //getting all devices, check for same name var store = me.getSavedchartsgrid().getStore(), storednames = []; store.each(function(record){ var name = record.get('VALUE'); storednames.push(name); }); if (Ext.Array.contains(storednames, savename)) { Ext.Msg.alert("Error", "There already is a chart with the name: " + savename); } else { var device = this.getDevicecombo().getValue(), xaxis = this.getXaxiscombo().getValue(), yaxis = this.getYaxiscombo().getValue(), starttime = this.getStarttimepicker().getValue(), dbstarttime = Ext.Date.format(starttime, 'Y-m-d_H:i:s'), endtime = this.getEndtimepicker().getValue(), dbendtime = Ext.Date.format(endtime, 'Y-m-d_H:i:s'), view = this.getLinechartview(); var url = '../../../fhem?cmd=get+' + FHEM.dblogname + '+-+webchart+' + dbstarttime + '+' + dbendtime + '+'; url +=device + '+savechart+' + xaxis + '+' + yaxis + '+' + savename + '&XHR=1'; view.setLoading(true); Ext.Ajax.request({ method: 'GET', disableCaching: false, url: url, success: function(response){ view.setLoading(false); var json = Ext.decode(response.responseText); if (json.success === true) { me.getSavedchartsgrid().getStore().load(); Ext.Msg.alert("Success", "Chart successfully saved!"); } else if (json.msg) { Ext.Msg.alert("Error", "The Chart could not be saved, error Message is:

" + json.msg); } else { Ext.Msg.alert("Error", "The Chart could not be saved!"); } }, failure: function() { view.setLoading(false); if (json && json.msg) { Ext.Msg.alert("Error", "The Chart could not be saved, error Message is:

" + json.msg); } else { Ext.Msg.alert("Error", "The Chart could not be saved!"); } } }); } } }, this); }, /** * loading saved chart data and trigger the load of the chart */ loadsavedchart: function(grid, td, cellIndex, record) { if (cellIndex === 0) { var name = record.get('VALUE'); var chartdata = Ext.decode(record.get('EVENT'))[0]; if (chartdata && !Ext.isEmpty(chartdata)) { this.getDevicecombo().setValue(chartdata.device); // load storedata for readings after device has been selected this.deviceSelected(this.getDevicecombo()); this.getXaxiscombo().setValue(chartdata.x); this.getYaxiscombo().setValue(chartdata.y); this.getStarttimepicker().setValue(chartdata.starttime); this.getEndtimepicker().setValue(chartdata.endtime); this.requestChartData(); this.getLinechartpanel().setTitle(name); } else { Ext.Msg.alert("Error", "The Chart could not be loaded!"); } } }, /** * Delete a chart by its name from the database */ deletechart: function(grid, td, cellIndex, par, evt, record) { var me = this, chartname = record.get('VALUE'), view = this.getLinechartview(); if (Ext.isDefined(chartname) && chartname !== "") { Ext.create('Ext.window.Window', { width: 250, layout: 'fit', title:'Delete?', modal: true, items: [ { xtype: 'displayfield', value: 'Do you really want to delete this chart?' } ], buttons: [{ text: "Ok", handler: function(btn){ var url = '../../../fhem?cmd=get+' + FHEM.dblogname + '+-+webchart+""+""+""+deletechart+""+""+' + chartname + '&XHR=1'; view.setLoading(true); Ext.Ajax.request({ method: 'GET', disableCaching: false, url: url, success: function(response){ view.setLoading(false); var json = Ext.decode(response.responseText); if (json && json.success === true) { me.getSavedchartsgrid().getStore().load(); Ext.Msg.alert("Success", "Chart successfully deleted!"); } else if (json && json.msg) { Ext.Msg.alert("Error", "The Chart could not be deleted, error Message is:

" + json.msg); } else { Ext.Msg.alert("Error", "The Chart could not be deleted!"); } btn.up().up().destroy(); }, failure: function() { view.setLoading(false); if (json && json.msg) { Ext.Msg.alert("Error", "The Chart could not be deleted, error Message is:

" + json.msg); } else { Ext.Msg.alert("Error", "The Chart could not be deleted!"); } btn.up().up().destroy(); } }); } }, { text: "Cancel", handler: function(btn){ btn.up().up().destroy(); } }] }).show(); } } });