WIP #120 null values handling
This commit is contained in:
@ -19,6 +19,12 @@ class _CombinedHistoryChartWidgetState extends State<CombinedHistoryChartWidget>
|
|||||||
int _selectedId = -1;
|
int _selectedId = -1;
|
||||||
List<charts.Series<CombinedEntityStateHistoryMoment, DateTime>> _parsedHistory;
|
List<charts.Series<CombinedEntityStateHistoryMoment, DateTime>> _parsedHistory;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
// TODO: implement initState
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
_parsedHistory = _parseHistory();
|
_parsedHistory = _parseHistory();
|
||||||
@ -28,11 +34,11 @@ class _CombinedHistoryChartWidgetState extends State<CombinedHistoryChartWidget>
|
|||||||
if ((_selectedId > -1) && (_parsedHistory != null) && (_parsedHistory.first.data.length >= (_selectedId + 1))) {
|
if ((_selectedId > -1) && (_parsedHistory != null) && (_parsedHistory.first.data.length >= (_selectedId + 1))) {
|
||||||
selectedTime = _parsedHistory.first.data[_selectedId].startTime;
|
selectedTime = _parsedHistory.first.data[_selectedId].startTime;
|
||||||
_parsedHistory.where((item) { return item.id == "state"; }).forEach((item) {
|
_parsedHistory.where((item) { return item.id == "state"; }).forEach((item) {
|
||||||
selectedStates.add("${item.data[_selectedId].state}");
|
selectedStates.add(item.data[_selectedId].state);
|
||||||
colorIndexes.add(item.data[_selectedId].colorId);
|
colorIndexes.add(item.data[_selectedId].colorId);
|
||||||
});
|
});
|
||||||
_parsedHistory.where((item) { return item.id == "value"; }).forEach((item) {
|
_parsedHistory.where((item) { return item.id == "value"; }).forEach((item) {
|
||||||
selectedStates.add("${item.data[_selectedId].value}");
|
selectedStates.add("${item.data[_selectedId].value ?? '-'}");
|
||||||
colorIndexes.add(item.data[_selectedId].colorId);
|
colorIndexes.add(item.data[_selectedId].colorId);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -101,10 +107,11 @@ class _CombinedHistoryChartWidgetState extends State<CombinedHistoryChartWidget>
|
|||||||
DateTime endTime;
|
DateTime endTime;
|
||||||
bool hiddenLine;
|
bool hiddenLine;
|
||||||
double value;
|
double value;
|
||||||
|
double previousValue = 0.0;
|
||||||
value = _parseToDouble(stateData["attributes"]["$attrName"]);
|
value = _parseToDouble(stateData["attributes"]["$attrName"]);
|
||||||
bool hiddenDot = (value == null);
|
bool hiddenDot = (value == null);
|
||||||
if (hiddenDot && i > 0) {
|
if (hiddenDot && i > 0) {
|
||||||
value = data[i-1].value;
|
previousValue = data[i-1].value ?? data[i-1].previousValue;
|
||||||
}
|
}
|
||||||
if (i < (widget.rawHistory.length - 1)) {
|
if (i < (widget.rawHistory.length - 1)) {
|
||||||
endTime = DateTime.tryParse(widget.rawHistory[i+1]["last_updated"])?.toLocal();
|
endTime = DateTime.tryParse(widget.rawHistory[i+1]["last_updated"])?.toLocal();
|
||||||
@ -114,9 +121,9 @@ class _CombinedHistoryChartWidgetState extends State<CombinedHistoryChartWidget>
|
|||||||
hiddenLine = hiddenDot;
|
hiddenLine = hiddenDot;
|
||||||
endTime = now;
|
endTime = now;
|
||||||
}
|
}
|
||||||
data.add(CombinedEntityStateHistoryMoment(value, hiddenDot, hiddenLine, stateData["state"], startTime, endTime, i, colorIdCounter));
|
data.add(CombinedEntityStateHistoryMoment(value, previousValue, hiddenDot, hiddenLine, stateData["state"], startTime, endTime, i, colorIdCounter));
|
||||||
}
|
}
|
||||||
data.add(CombinedEntityStateHistoryMoment(data.last.value, data.last.hiddenDot, data.last.hiddenLine, data.last.state, now, null, widget.rawHistory.length, colorIdCounter));
|
data.add(CombinedEntityStateHistoryMoment(data.last.value, data.last.previousValue, data.last.hiddenDot, data.last.hiddenLine, data.last.state, now, null, widget.rawHistory.length, colorIdCounter));
|
||||||
numericDataLists.addAll({attrName: data});
|
numericDataLists.addAll({attrName: data});
|
||||||
colorIdCounter += 1;
|
colorIdCounter += 1;
|
||||||
});
|
});
|
||||||
@ -142,7 +149,7 @@ class _CombinedHistoryChartWidgetState extends State<CombinedHistoryChartWidget>
|
|||||||
},
|
},
|
||||||
strokeWidthPxFn: (CombinedEntityStateHistoryMoment historyMoment, __) => historyMoment.hiddenLine ? 0.0 : 2.0,
|
strokeWidthPxFn: (CombinedEntityStateHistoryMoment historyMoment, __) => historyMoment.hiddenLine ? 0.0 : 2.0,
|
||||||
domainFn: (CombinedEntityStateHistoryMoment historyMoment, _) => historyMoment.startTime,
|
domainFn: (CombinedEntityStateHistoryMoment historyMoment, _) => historyMoment.startTime,
|
||||||
measureFn: (CombinedEntityStateHistoryMoment historyMoment, _) => historyMoment.value ?? 0,
|
measureFn: (CombinedEntityStateHistoryMoment historyMoment, _) => historyMoment.value ?? historyMoment.previousValue,
|
||||||
data: dataList,
|
data: dataList,
|
||||||
/*domainLowerBoundFn: (CombinedEntityStateHistoryMoment historyMoment, _) => historyMoment.time.subtract(Duration(hours: 1)),
|
/*domainLowerBoundFn: (CombinedEntityStateHistoryMoment historyMoment, _) => historyMoment.time.subtract(Duration(hours: 1)),
|
||||||
domainUpperBoundFn: (CombinedEntityStateHistoryMoment historyMoment, _) => historyMoment.time.add(Duration(hours: 1)),*/
|
domainUpperBoundFn: (CombinedEntityStateHistoryMoment historyMoment, _) => historyMoment.time.add(Duration(hours: 1)),*/
|
||||||
@ -254,7 +261,7 @@ class CombinedHistoryControlWidget extends StatelessWidget {
|
|||||||
for (int i = 0; i < selectedStates.length; i++) {
|
for (int i = 0; i < selectedStates.length; i++) {
|
||||||
children.add(
|
children.add(
|
||||||
Text(
|
Text(
|
||||||
"${selectedStates[i]}",
|
"${selectedStates[i] ?? '-'}",
|
||||||
textAlign: TextAlign.right,
|
textAlign: TextAlign.right,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
@ -292,11 +299,12 @@ class CombinedEntityStateHistoryMoment {
|
|||||||
final DateTime startTime;
|
final DateTime startTime;
|
||||||
final DateTime endTime;
|
final DateTime endTime;
|
||||||
final double value;
|
final double value;
|
||||||
|
final double previousValue;
|
||||||
final int id;
|
final int id;
|
||||||
final int colorId;
|
final int colorId;
|
||||||
final String state;
|
final String state;
|
||||||
final bool hiddenDot;
|
final bool hiddenDot;
|
||||||
final bool hiddenLine;
|
final bool hiddenLine;
|
||||||
|
|
||||||
CombinedEntityStateHistoryMoment(this.value, this.hiddenDot, this.hiddenLine, this.state, this.startTime, this.endTime, this.id, this.colorId);
|
CombinedEntityStateHistoryMoment(this.value, this.previousValue, this.hiddenDot, this.hiddenLine, this.state, this.startTime, this.endTime, this.id, this.colorId);
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@ class _NumericStateHistoryChartWidgetState extends State<NumericStateHistoryChar
|
|||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
HistoryControlWidget(
|
HistoryControlWidget(
|
||||||
selectedTimeStart: selectedTime,
|
selectedTimeStart: selectedTime,
|
||||||
selectedState: "$selectedState",
|
selectedState: "${selectedState ?? '-'}",
|
||||||
onPrevTap: () => _selectPrev(),
|
onPrevTap: () => _selectPrev(),
|
||||||
onNextTap: () => _selectNext(),
|
onNextTap: () => _selectNext(),
|
||||||
colorIndex: -1,
|
colorIndex: -1,
|
||||||
@ -72,9 +72,22 @@ class _NumericStateHistoryChartWidgetState extends State<NumericStateHistoryChar
|
|||||||
for (var i = 0; i < widget.rawHistory.length; i++) {
|
for (var i = 0; i < widget.rawHistory.length; i++) {
|
||||||
var stateData = widget.rawHistory[i];
|
var stateData = widget.rawHistory[i];
|
||||||
DateTime time = DateTime.tryParse(stateData["last_updated"])?.toLocal();
|
DateTime time = DateTime.tryParse(stateData["last_updated"])?.toLocal();
|
||||||
data.add(NumericEntityStateHistoryMoment(double.tryParse(stateData["state"]), time, i));
|
double value = double.tryParse(stateData["state"]);
|
||||||
|
double previousValue = 0.0;
|
||||||
|
bool hiddenDot = (value == null);
|
||||||
|
bool hiddenLine;
|
||||||
|
if (hiddenDot && i > 0) {
|
||||||
|
previousValue = data[i-1].value ?? data[i-1].previousValue;
|
||||||
}
|
}
|
||||||
data.add(NumericEntityStateHistoryMoment(data.last.value, now, widget.rawHistory.length));
|
if (i < (widget.rawHistory.length - 1)) {
|
||||||
|
double nextValue = double.tryParse(widget.rawHistory[i+1]["state"]);
|
||||||
|
hiddenLine = (nextValue == null || hiddenDot);
|
||||||
|
} else {
|
||||||
|
hiddenLine = hiddenDot;
|
||||||
|
}
|
||||||
|
data.add(NumericEntityStateHistoryMoment(value, previousValue, hiddenDot, hiddenLine, time, i));
|
||||||
|
}
|
||||||
|
data.add(NumericEntityStateHistoryMoment(data.last.value, data.last.previousValue, data.last.hiddenDot, data.last.hiddenLine, now, widget.rawHistory.length));
|
||||||
if (_selectedId == -1) {
|
if (_selectedId == -1) {
|
||||||
_selectedId = 0;
|
_selectedId = 0;
|
||||||
}
|
}
|
||||||
@ -83,9 +96,18 @@ class _NumericStateHistoryChartWidgetState extends State<NumericStateHistoryChar
|
|||||||
id: 'State',
|
id: 'State',
|
||||||
colorFn: (NumericEntityStateHistoryMoment historyMoment, __) => EntityColors.chartHistoryStateColor("on", -1),
|
colorFn: (NumericEntityStateHistoryMoment historyMoment, __) => EntityColors.chartHistoryStateColor("on", -1),
|
||||||
domainFn: (NumericEntityStateHistoryMoment historyMoment, _) => historyMoment.time,
|
domainFn: (NumericEntityStateHistoryMoment historyMoment, _) => historyMoment.time,
|
||||||
measureFn: (NumericEntityStateHistoryMoment historyMoment, _) => historyMoment.value,
|
measureFn: (NumericEntityStateHistoryMoment historyMoment, _) => historyMoment.value ?? historyMoment.previousValue,
|
||||||
data: data,
|
data: data,
|
||||||
radiusPxFn: (NumericEntityStateHistoryMoment historyMoment, __) => (historyMoment.id == _selectedId) ? 5.0 : 1.0,
|
strokeWidthPxFn: (NumericEntityStateHistoryMoment historyMoment, __) => historyMoment.hiddenLine ? 0.0 : 2.0,
|
||||||
|
radiusPxFn: (NumericEntityStateHistoryMoment historyMoment, __) {
|
||||||
|
if (historyMoment.hiddenDot) {
|
||||||
|
return 0.0;
|
||||||
|
} else if (historyMoment.id == _selectedId) {
|
||||||
|
return 5.0;
|
||||||
|
} else {
|
||||||
|
return 1.0;
|
||||||
|
}
|
||||||
|
},
|
||||||
)
|
)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@ -126,7 +148,10 @@ class _NumericStateHistoryChartWidgetState extends State<NumericStateHistoryChar
|
|||||||
class NumericEntityStateHistoryMoment {
|
class NumericEntityStateHistoryMoment {
|
||||||
final DateTime time;
|
final DateTime time;
|
||||||
final double value;
|
final double value;
|
||||||
|
final double previousValue;
|
||||||
final int id;
|
final int id;
|
||||||
|
final bool hiddenDot;
|
||||||
|
final bool hiddenLine;
|
||||||
|
|
||||||
NumericEntityStateHistoryMoment(this.value, this.time, this.id);
|
NumericEntityStateHistoryMoment(this.value, this.previousValue, this.hiddenDot, this.hiddenLine, this.time, this.id);
|
||||||
}
|
}
|
@ -182,7 +182,7 @@ class HistoryControlWidget extends StatelessWidget {
|
|||||||
child: Padding(
|
child: Padding(
|
||||||
padding: EdgeInsets.only(right: 10.0),
|
padding: EdgeInsets.only(right: 10.0),
|
||||||
child: Text(
|
child: Text(
|
||||||
"$selectedState",
|
"${selectedState ?? '-'}",
|
||||||
textAlign: TextAlign.right,
|
textAlign: TextAlign.right,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
|
Reference in New Issue
Block a user