2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-15 22:26:04 +00:00

added table to show chartdata together with chart

- rendering of charts more efficient

git-svn-id: https://svn.fhem.de/fhem/trunk@3092 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
johannnes 2013-04-20 14:57:55 +00:00
parent 195a472c7e
commit 92c7af3b08
7 changed files with 441 additions and 211 deletions

View File

@ -1,3 +1,6 @@
Update vom 20.4.2013
* Über dem CHart wird nun eine interaktive Tabelle mit den zugehörigen Daten angezeigt
* Chartrendering effizienter
Update vom 14.4.2013
* Multiple Y-Skalen hinzugefügt (linke + rechte Achse)
* Bug in Stepansicht behoben

View File

@ -76,12 +76,13 @@ UPD 2013-04-03_07:27:17 345 www/frontend/app/resources/icons/arrow_left.png
UPD 2013-04-03_07:27:17 733 www/frontend/app/resources/icons/add.png
UPD 2013-04-03_07:27:17 389 www/frontend/app/resources/icons/resultset_previous.png
UPD 2013-04-01_07:05:33 2154 www/frontend/app/app.js
UPD 2013-04-14_05:52:20 27637 www/frontend/app/view/LineChartPanel.js
UPD 2013-04-20_04:52:50 20318 www/frontend/app/view/LineChartPanel.js
UPD 2013-04-20_04:52:50 1202 www/frontend/app/view/ChartGridPanel.js
UPD 2013-04-03_07:26:40 15793 www/frontend/app/view/DevicePanel.js
UPD 2013-04-09_07:08:49 8588 www/frontend/app/view/Viewport.js
UPD 2013-04-20_04:52:50 8669 www/frontend/app/view/Viewport.js
UPD 2013-04-01_07:05:14 2476 www/frontend/app/view/TableDataGridPanel.js
UPD 2013-04-14_05:52:09 49258 www/frontend/app/controller/ChartController.js
UPD 2013-04-14_05:52:09 13004 www/frontend/app/controller/MainController.js
UPD 2013-04-20_04:52:30 62546 www/frontend/app/controller/ChartController.js
UPD 2013-04-20_04:52:31 13004 www/frontend/app/controller/MainController.js
UPD 2013-04-01_07:04:35 202 www/frontend/app/model/ReadingsModel.js
UPD 2013-04-01_07:04:36 338 www/frontend/app/model/SavedChartsModel.js
UPD 2013-04-01_07:04:34 11535 www/frontend/app/model/ChartModel.js

View File

@ -48,6 +48,10 @@ Ext.define('FHEM.controller.ChartController', {
selector: 'chart',
ref: 'chart' //this.getChart()
},
{
selector: 'chartformpanel',
ref: 'panel[name=chartformpanel]' //this.getChartformpanel()
},
{
selector: 'linechartpanel',
ref: 'linechartpanel' //this.getLinechartpanel()
@ -59,6 +63,10 @@ Ext.define('FHEM.controller.ChartController', {
{
selector: 'grid[name=savedchartsgrid]',
ref: 'savedchartsgrid' //this.getSavedchartsgrid()
},
{
selector: 'grid[name=chartdata]',
ref: 'chartdatagrid' //this.getChartdatagrid()
}
],
@ -88,6 +96,22 @@ Ext.define('FHEM.controller.ChartController', {
},
'actioncolumn[name=savedchartsactioncolumn]': {
click: this.deletechart
},
'grid[name=chartdata]': {
// itemmouseenter: this.highlightRecordInChart
itemclick: this.highlightRecordInChart
},
'panel[name=chartpanel]': {
collapse: this.resizeChart,
expand: this.resizeChart
},
'panel[name=chartformpanel]': {
collapse: this.resizeChart,
expand: this.resizeChart
},
'panel[name=chartgridpanel]': {
collapse: this.resizeChart,
expand: this.resizeChart
}
});
@ -99,6 +123,13 @@ Ext.define('FHEM.controller.ChartController', {
requestChartData: function(stepchangecalled) {
var me = this;
//show loadmask
me.getLinechartpanel().setLoading(true);
//collapse chart settings
me.getChartformpanel().collapse();
//getting the necessary values
var devices = Ext.ComponentQuery.query('combobox[name=devicecombo]'),
yaxes = Ext.ComponentQuery.query('combobox[name=yaxiscombo]'),
@ -114,24 +145,37 @@ Ext.define('FHEM.controller.ChartController', {
dbendtime = Ext.Date.format(endtime, 'Y-m-d_H:i:s'),
dynamicradio = Ext.ComponentQuery.query('radiogroup[name=dynamictime]')[0],
chartpanel = me.getLinechartpanel(),
chart = me.getChart(),
store = chart.getStore(),
proxy = store.getProxy();
chart = me.getChart();
//show loadmask
chart.setLoading(true);
//cleanup store
store.removeAll();
//cleanup chart
for (var i = chart.series.length -1; i >= 0; i--) {
chart.series.removeAt(i);
//cleanup chartpanel
var existingchartgrid = Ext.ComponentQuery.query('panel[name=chartgridpanel]')[0];
if (!existingchartgrid) {
var chartdatagrid = Ext.create('FHEM.view.ChartGridPanel', {
name: 'chartgridpanel',
height: 200,
maxHeight: 200
});
chartpanel.add(chartdatagrid);
} else {
existingchartgrid.down('grid').getStore().removeAll();
}
var existingchart = Ext.ComponentQuery.query('panel[name=chartpanel]')[0];
if (!existingchart) {
var store = Ext.create('FHEM.store.ChartStore'),
proxy = store.getProxy();
chart = me.createChart(store);
chartpanel.add(chart);
} else {
chart.getStore().removeAll();
chart.getStore().destroy();
//removes the store completely from chart
chart.bindStore();
var chartstore = Ext.create('FHEM.store.ChartStore');
chart.bindStore(chartstore);
chart.series.removeAll();
chart.axes.get(0).setTitle("");
}
//Reset axis titles
chart.axes.get(0).setTitle("");
chart.axes.get(1).setTitle("");
//reset zoomValues
chartpanel.setLastYmax(null);
@ -206,7 +250,7 @@ Ext.define('FHEM.controller.ChartController', {
});
var i = 0;
Ext.each(yaxes, function(yaxis) {
Ext.each(yaxes, function(y) {
var device = devices[i].getValue(),
yaxis = yaxes[i].getValue(),
yaxiscolorcombo = yaxescolorcombos[i].getValue(),
@ -217,12 +261,179 @@ Ext.define('FHEM.controller.ChartController', {
if(yaxis === "" || yaxis === null) {
yaxis = yaxes[i].getRawValue();
}
me.populateAxis(i, yaxes.length, device, yaxis, yaxiscolorcombo, yaxisfillcheck, yaxisstepcheck, axisside, yaxisstatistics, dbstarttime, dbendtime);
i++;
});
},
/**
* resize the chart to fit the centerpanel
*/
resizeChart: function() {
var lcp = Ext.ComponentQuery.query('linechartpanel')[0];
var lcv = Ext.ComponentQuery.query('chart')[0];
var cfp = Ext.ComponentQuery.query('form[name=chartformpanel]')[0];
var cdg = Ext.ComponentQuery.query('panel[name=chartgridpanel]')[0];
if (lcp && lcv && cfp && cdg) {
var chartheight = lcp.getHeight() - cfp.getHeight() - cdg.getHeight() - 95;
var chartwidth = lcp.getWidth() - 25;
lcv.setHeight(chartheight);
lcv.setWidth(chartwidth);
}
},
/**
* create the base chart
*/
createChart: function(store) {
var me = this;
var chart = Ext.create('Ext.panel.Panel', {
title: 'Chart',
name: 'chartpanel',
collapsible: true,
titleCollapse: true,
items: [
{
xtype: 'toolbar',
items: [
{
xtype: 'button',
width: 100,
text: 'Step back',
name: 'stepback',
icon: 'app/resources/icons/resultset_previous.png'
},
{
xtype: 'button',
width: 100,
text: 'Step forward',
name: 'stepforward',
icon: 'app/resources/icons/resultset_next.png'
},
{
xtype: 'button',
width: 100,
text: 'Reset Zoom',
name: 'resetzoom',
icon: 'app/resources/icons/delete.png',
scope: me,
handler: function(btn) {
var chart = btn.up().up().down('chart');
chart.restoreZoom();
chart.axes.get(0).minimum = chart.up().up().getLastYmin();
chart.axes.get(0).maximum = chart.up().up().getLastYmax();
chart.axes.get(1).minimum = chart.up().up().getLastY2min();
chart.axes.get(1).maximum = chart.up().up().getLastY2max();
chart.axes.get(2).minimum = chart.up().up().getLastXmin();
chart.axes.get(2).maximum = chart.up().up().getLastXmax();
chart.redraw();
//helper to reshow the hidden items after zooming back out
if (chart.up().up().artifactSeries && chart.up().up().artifactSeries.length > 0) {
Ext.each(chart.up().up().artifactSeries, function(serie) {
serie.showAll();
Ext.each(serie.group.items, function(item) {
if (item.type === "circle") {
item.show();
item.redraw();
}
});
});
chart.up().up().artifactSeries = [];
}
}
}
]
},
{
xtype: 'chart',
legend: {
position: 'right'
},
axes: [
{
type : 'Numeric',
name : 'yaxe',
position : 'left',
fields : [],
title : '',
grid : {
odd : {
opacity : 1,
fill : '#ddd',
stroke : '#bbb',
'stroke-width' : 0.5
}
}
},
{
type : 'Numeric',
name : 'yaxe2',
position : 'right',
fields : [],
title : ''
},
{
type : 'Time',
name : 'xaxe',
position : 'bottom',
fields : [ 'TIMESTAMP' ],
dateFormat : "Y-m-d H:i:s",
title : 'Time'
}
],
animate: true,
store: store,
enableMask: true,
mask: true,//'vertical',//true, //'horizontal',
listeners: {
mousedown: function(evt) {
// fix for firefox, not dragging images
evt.preventDefault();
},
select: {
fn: function(chart, zoomConfig, evt) {
delete chart.axes.get(2).fromDate;
delete chart.axes.get(2).toDate;
chart.up().up().setLastYmax(chart.axes.get(0).maximum);
chart.up().up().setLastYmin(chart.axes.get(0).minimum);
chart.up().up().setLastY2max(chart.axes.get(1).maximum);
chart.up().up().setLastY2min(chart.axes.get(1).minimum);
chart.up().up().setLastXmax(chart.axes.get(2).maximum);
chart.up().up().setLastXmin(chart.axes.get(2).minimum);
chart.setZoom(zoomConfig);
chart.mask.hide();
//helper hiding series and items which are out of scope
Ext.each(chart.series.items, function(serie) {
if (serie.items.length === 0) {
chart.up().up().artifactSeries.push(serie);
Ext.each(serie.group.items, function(item) {
item.hide();
item.redraw();
});
serie.hideAll();
}
});
}
}
}
}
]
});
return chart;
},
/**
* creating baselines
*/
@ -288,13 +499,14 @@ Ext.define('FHEM.controller.ChartController', {
chart = me.getChart(),
store = chart.getStore(),
proxy = store.getProxy(),
yseries,
generalization = Ext.ComponentQuery.query('radio[boxLabel=active]')[0],
generalizationfactor = Ext.ComponentQuery.query('combobox[name=genfactor]')[0].getValue();
if (i > 0) {
var yseries = me.createSeries('VALUE' + (i + 1), yaxis, yaxisfillcheck, yaxiscolorcombo, axisside);
yseries = me.createSeries('VALUE' + (i + 1), yaxis, yaxisfillcheck, yaxiscolorcombo, axisside);
} else {
var yseries = me.createSeries('VALUE', yaxis, yaxisfillcheck, yaxiscolorcombo, axisside);
yseries = me.createSeries('VALUE', yaxis, yaxisfillcheck, yaxiscolorcombo, axisside);
}
var url;
@ -400,6 +612,10 @@ Ext.define('FHEM.controller.ChartController', {
}
}
//as we have the valuetext, we can fill the grid
//fill the grid with the data
me.fillChartGrid(json.data, valuetext);
var timestamptext;
if (i === 0) {
timestamptext = 'TIMESTAMP';
@ -484,19 +700,19 @@ Ext.define('FHEM.controller.ChartController', {
//check if we have added the last dataset
if ((i + 1) === axeslength) {
//add baselines
var i = 0,
var j = 0,
basesstart = Ext.ComponentQuery.query('numberfield[name=basestart]'),
basesend = Ext.ComponentQuery.query('numberfield[name=baseend]'),
basescolors = Ext.ComponentQuery.query('combobox[name=baselinecolorcombo]'),
basesfills = Ext.ComponentQuery.query('checkboxfield[name=baselinefillcheck]');
Ext.each(basesstart, function(base) {
var basestart = basesstart[i].getValue(),
baseend = basesend[i].getValue(),
basecolor = basescolors[i].getValue(),
basefill = basesfills[i].checked;
var basestart = basesstart[j].getValue(),
baseend = basesend[j].getValue(),
basecolor = basescolors[j].getValue(),
basefill = basesfills[j].checked;
me.createBaseLine(i + 1, basestart, baseend, basefill, basecolor);
me.createBaseLine(j + 1, basestart, baseend, basefill, basecolor);
//adjust min and max on y axis
if (me.maxYValue < basestart) {
@ -521,7 +737,6 @@ Ext.define('FHEM.controller.ChartController', {
* do the final layout of chart after all data is loaded
*/
doFinalChartLayout: function(chart) {
var me = this;
//remove the old max values of y axis to get a dynamic range
@ -554,9 +769,7 @@ Ext.define('FHEM.controller.ChartController', {
// set the x axis range dependent on user given timerange
var chart = me.getChart(),
store = chart.getStore(),
starttime = new Date(me.getStarttimepicker().getValue()),
var starttime = new Date(me.getStarttimepicker().getValue()),
endtime = new Date(me.getEndtimepicker().getValue());
chart.axes.get(2).fromDate = starttime;
@ -564,7 +777,9 @@ Ext.define('FHEM.controller.ChartController', {
chart.axes.get(2).processView();
chart.redraw();
chart.setLoading(false);
me.resizeChart();
me.getLinechartpanel().setLoading(false);
},
@ -834,16 +1049,16 @@ Ext.define('FHEM.controller.ChartController', {
jsonConfig += '"generalizationfactor":"' + generalizationfactor + '",';
}
var i = 0;
var j = 0;
Ext.each(basesstart, function(base) {
var basestart = basesstart[i].getValue(),
baseend = basesend[i].getValue(),
basecolor = basescolors[i].getDisplayValue(),
basefill = basesfills[i].checked;
var basestart = basesstart[j].getValue(),
baseend = basesend[j].getValue(),
basecolor = basescolors[j].getDisplayValue(),
basefill = basesfills[j].checked;
i++;
jsonConfig += '"base' + i + 'start":"' + basestart + '","base' + i + 'end":"' + baseend + '",';
jsonConfig += '"base' + i + 'color":"' + basecolor + '","base' + i + 'fill":"' + basefill + '",';
j++;
jsonConfig += '"base' + j + 'start":"' + basestart + '","base' + j + 'end":"' + baseend + '",';
jsonConfig += '"base' + j + 'color":"' + basecolor + '","base' + j + 'fill":"' + basefill + '",';
});
jsonConfig += '"starttime":"' + dbstarttime + '","endtime":"' + dbendtime + '"}';
@ -983,8 +1198,7 @@ Ext.define('FHEM.controller.ChartController', {
//handling baselines
var basesstart = Ext.ComponentQuery.query('numberfield[name=basestart]'),
baselinecount = 0,
i = 1;
baselinecount = 0;
Ext.iterate(chartdata, function(key, value) {
if (key.indexOf("base") >= 0 && key.indexOf("start") >= 0 && value != "null") {
@ -998,8 +1212,8 @@ Ext.define('FHEM.controller.ChartController', {
renderedbaselines++;
}
var i = 0,
j = 1;
i = 0;
var j = 1;
basesstart = Ext.ComponentQuery.query('numberfield[name=basestart]'),
basesend = Ext.ComponentQuery.query('numberfield[name=baseend]'),
basescolors = Ext.ComponentQuery.query('combobox[name=baselinecolorcombo]'),
@ -1123,6 +1337,114 @@ Ext.define('FHEM.controller.ChartController', {
Ext.Msg.alert("Error", "The Chart could not be deleted, no record id has been found");
}
}
},
/**
* fill the charts grid with data
*/
fillChartGrid: function(jsondata, valuetext) {
if (jsondata && jsondata[0]) {
this.getChartformpanel().collapse();
var store = this.getChartdatagrid().getStore(),
columnwidth = 0,
storefields = [],
gridcolumns = [];
if (store.model.fields && store.model.fields.length > 0) {
Ext.each(store.model.getFields(), function(field) {
storefields.push(field.name);
});
}
var i = 0;
Ext.each(jsondata, function(dataset) {
Ext.iterate(dataset, function(key, value) {
if (!Ext.Array.contains(storefields, key)) {
storefields.push(key);
}
});
// we add each dataset a new key for the valuetext
jsondata[i].valuetext = valuetext;
i++;
});
store.model.setFields(storefields);
columnwidth = 99 / storefields.length + "%";
Ext.each(storefields, function(key) {
var column;
if (key != "TIMESTAMP") {
column = {
header: key,
dataIndex: key,
// xtype: 'numbercolumn',
// format:'0.000',
// renderer: function(value){
// return parseFloat(value, 10);
// },
width: columnwidth
};
} else {
column = {
header: key,
dataIndex: key,
width: columnwidth
};
}
gridcolumns.push(column);
});
this.getChartdatagrid().reconfigure(store, gridcolumns);
store.add(jsondata);
}
},
/**
* highlight hoverered record from grid in chart
*/
highlightRecordInChart: function(gridview, record) {
var recdate = new Date(Ext.Date.parse(record.get("TIMESTAMP"), 'Y-m-d H:i:s')),
chartstore = this.getChart().getStore(),
chartrecord,
found = false,
highlightSprite;
chartstore.each(function(rec) {
if (Ext.Date.isEqual(new Date(rec.get("TIMESTAMP")), recdate)) {
var valuematcher = record.raw.valuetext,
gridvaluematcher = valuematcher.replace(/[0-9]/g, '');
var chartrec = rec.get(valuematcher);
var gridrec = record.get(gridvaluematcher);
if (parseInt(chartrec, 10) === parseInt(gridrec, 10)) {
chartrecord = rec;
return false;
}
}
});
if (chartrecord && !Ext.isEmpty(chartrecord)) {
Ext.each(this.getChart().series.items, function(serie) {
Ext.each(serie.items, function(sprite) {
if (sprite.storeItem === chartrecord) {
highlightSprite = sprite;
found = true;
}
if (found) {
return;
}
});
if (found) {
return;
}
});
if (highlightSprite && !Ext.isEmpty(highlightSprite)) {
highlightSprite.sprite.attr.radius = 10;
this.getChart().redraw();
}
}
}
});

View File

@ -93,7 +93,7 @@ Ext.define('FHEM.controller.MainController', {
if (Ext.isDefined(FHEM.version)) {
var sp = this.getStatustextfield();
sp.setText(FHEM.version + "; Frontend Version: 0.5 - 2013-04-14");
sp.setText(FHEM.version + "; Frontend Version: 0.6 - 2013-04-20");
}
//setup west accordion / treepanel

View File

@ -0,0 +1,64 @@
/**
* A Panel containing device specific information
*/
Ext.define('FHEM.view.ChartGridPanel', {
extend: 'Ext.panel.Panel',
alias : 'widget.chartgridpanel',
requires: [
'Ext.form.FieldSet',
'Ext.layout.container.Column',
'Ext.form.field.ComboBox'
],
/**
*
*/
title: 'Chart data',
/**
*
*/
jsonrecords: null,
/**
*
*/
collapsible: true,
titleCollapse: true,
collapsed: false,
/**
* init function
*/
initComponent: function() {
var me = this;
var chartdatastore = Ext.create('Ext.data.Store', {
fields: [],
data: [],
proxy: {
type: 'memory',
reader: {
type: 'json'
}
}
});
var chartdatagrid = {
xtype: 'grid',
height: 170,
name: 'chartdata',
columns: [
],
store: chartdatastore
};
me.items = [chartdatagrid];
me.callParent(arguments);
}
});

View File

@ -8,6 +8,7 @@ Ext.define('FHEM.view.LineChartPanel', {
'FHEM.store.ChartStore',
'FHEM.store.DeviceStore',
'FHEM.store.ReadingsStore',
'FHEM.view.ChartGridPanel',
'Ext.form.Panel',
'Ext.form.field.Radio',
'Ext.form.field.Date',
@ -79,10 +80,6 @@ Ext.define('FHEM.view.LineChartPanel', {
autoScroll: true,
collapsible: true,
titleCollapse: true,
listeners: {
collapse: me.layoutChart,
expand: me.layoutChart
},
items: [
{
xtype: 'fieldset',
@ -240,171 +237,12 @@ Ext.define('FHEM.view.LineChartPanel', {
//add the first yaxis line
me.createNewYAxis();
//creating the chart
var chartstore = Ext.create('FHEM.store.ChartStore');
var linechartview = Ext.create('Ext.panel.Panel', {
title: 'Chart',
autoScroll: true,
collapsible: true,
titleCollapse: true,
items: [
{
xtype: 'toolbar',
items: [
{
xtype: 'button',
width: 100,
text: 'Step back',
name: 'stepback',
icon: 'app/resources/icons/resultset_previous.png'
},
{
xtype: 'button',
width: 100,
text: 'Step forward',
name: 'stepforward',
icon: 'app/resources/icons/resultset_next.png'
},
{
xtype: 'button',
width: 100,
text: 'Reset Zoom',
name: 'resetzoom',
icon: 'app/resources/icons/delete.png',
scope: me,
handler: function(btn) {
var chart = me.down('chart');
chart.restoreZoom();
chart.axes.get(0).minimum = me.getLastYmin();
chart.axes.get(0).maximum = me.getLastYmax();
chart.axes.get(1).minimum = me.getLastY2min();
chart.axes.get(1).maximum = me.getLastY2max();
chart.axes.get(2).minimum = me.getLastXmin();
chart.axes.get(2).maximum = me.getLastXmax();
chart.redraw();
//helper to reshow the hidden items after zooming back out
if (me.artifactSeries && me.artifactSeries.length > 0) {
Ext.each(me.artifactSeries, function(serie) {
serie.showAll();
Ext.each(serie.group.items, function(item) {
if (item.type === "circle") {
item.show();
item.redraw();
}
});
});
me.artifactSeries = [];
}
}
}
]
},
{
xtype: 'chart',
legend: {
position: 'right'
},
axes: [
{
type : 'Numeric',
name : 'yaxe',
position : 'left',
fields : [],
title : '',
grid : {
odd : {
opacity : 1,
fill : '#ddd',
stroke : '#bbb',
'stroke-width' : 0.5
}
}
},
{
type : 'Numeric',
name : 'yaxe2',
position : 'right',
fields : [],
title : ''
},
{
type : 'Time',
name : 'xaxe',
position : 'bottom',
fields : [ 'TIMESTAMP' ],
dateFormat : "Y-m-d H:i:s",
title : 'Time'
}
],
animate: true,
store: chartstore,
enableMask: true,
mask: true,//'vertical',//true, //'horizontal',
listeners: {
mousedown: function(evt) {
// fix for firefox, not dragging images
evt.preventDefault();
},
select: {
fn: function(chart, zoomConfig, evt) {
delete chart.axes.get(2).fromDate;
delete chart.axes.get(2).toDate;
me.setLastYmax(chart.axes.get(0).maximum);
me.setLastYmin(chart.axes.get(0).minimum);
me.setLastY2max(chart.axes.get(1).maximum);
me.setLastY2min(chart.axes.get(1).minimum);
me.setLastXmax(chart.axes.get(2).maximum);
me.setLastXmin(chart.axes.get(2).minimum);
chart.setZoom(zoomConfig);
chart.mask.hide();
//helper hiding series and items which are out of scope
//var me = this;
Ext.each(chart.series.items, function(serie) {
if (serie.items.length === 0) {
me.artifactSeries.push(serie);
Ext.each(serie.group.items, function(item) {
item.hide();
item.redraw();
});
serie.hideAll();
}
});
}
}
}
}
]
});
me.items = [
chartSettingPanel,
linechartview
chartSettingPanel
];
me.callParent(arguments);
me.on("resize", me.layoutChart);
},
/**
* helper function to relayout the chartview dependent on free space
*/
layoutChart: function() {
var lcp = Ext.ComponentQuery.query('linechartpanel')[0];
var lcv = Ext.ComponentQuery.query('chart')[0];
var cfp = Ext.ComponentQuery.query('form[name=chartformpanel]')[0];
var chartheight = lcp.getHeight() - cfp.getHeight() - 85;
var chartwidth = lcp.getWidth() - 25;
lcv.setHeight(chartheight);
lcv.setWidth(chartwidth);
},
/**

View File

@ -194,6 +194,8 @@ Ext.define('FHEM.view.Viewport', {
xtype: 'text',
name: 'statustextfield',
padding: '50 0 0 20',
width: 400,
height: 130,
html: '<br>Welcome to the new FHEM Frontend.<br>For Informations, Problems and discussion, visit the <a href="http://forum.fhem.de/index.php?t=msg&th=10439&start=0&rid=0">FHEM Forums</a>'
}
],