214 lines
5.3 KiB
QML
214 lines
5.3 KiB
QML
import QtQuick 1.1
|
|
import com.victron.velib 1.0
|
|
import "utils.js" as Utils
|
|
|
|
|
|
OverviewPage {
|
|
id: root
|
|
|
|
property string solarchargerPrefix: "com.victronenergy.solarcharger.ttyO2"
|
|
property string batteryPrefix: "com.victronenergy.battery.ttyO4"
|
|
property string chargeryBMSPrefix: "com.victronenergy.battery.ttyUSB0"
|
|
|
|
title: qsTr("Overview")
|
|
|
|
function remainingTime(time, returninfinite) {
|
|
|
|
if (!time) {
|
|
if (returninfinite == 1) {
|
|
return "Infinite";
|
|
} else {
|
|
return "--";
|
|
}
|
|
}
|
|
|
|
var secs = Math.round(time)
|
|
var days = Math.floor(secs / 86400);
|
|
var hours = Math.floor((secs - (days * 86400)) / 3600);
|
|
var minutes = Math.floor((secs - (hours * 3600)) / 60);
|
|
var seconds = Math.floor(secs - (minutes * 60));
|
|
|
|
if (days > 0)
|
|
return qsTr("%1d %2h").arg(days).arg(hours);
|
|
if (hours)
|
|
return qsTr("%1h %2m").arg(hours).arg(minutes);
|
|
if (minutes)
|
|
return qsTr("%1m %2s").arg(minutes).arg(seconds);
|
|
|
|
return qsTr("%1s").arg(seconds);
|
|
}
|
|
|
|
function formatTime(minutes)
|
|
{
|
|
if (minutes === undefined)
|
|
return "--:--"
|
|
|
|
return Math.floor(minutes / 60) + ":" + Utils.pad(minutes % 60, 2)
|
|
}
|
|
|
|
|
|
Column {
|
|
|
|
Rectangle {
|
|
id: overviewRectangle
|
|
width: 480
|
|
height: 28
|
|
color: "#4789d0"
|
|
|
|
Timer {
|
|
id: wallClock
|
|
running: true
|
|
repeat: true
|
|
interval: 1000
|
|
triggeredOnStart: true
|
|
onTriggered: time = Qt.formatDateTime(new Date(), "hh:mm:ss")
|
|
property string time
|
|
}
|
|
|
|
MbTextDescriptionTOBO {
|
|
anchors {
|
|
left: overviewRectangle.left; leftMargin: 8
|
|
verticalCenter: parent.verticalCenter
|
|
}
|
|
text: "Overview"
|
|
}
|
|
|
|
Text {
|
|
anchors {
|
|
right: overviewRectangle.right; rightMargin: 8
|
|
verticalCenter: parent.verticalCenter
|
|
}
|
|
color: "#ffffff"
|
|
font.pointSize: 18
|
|
font.bold: true
|
|
text: wallClock.time
|
|
}
|
|
}
|
|
|
|
|
|
Rectangle {
|
|
id: batteryRectangle
|
|
|
|
width: 480
|
|
height: 70
|
|
color: "#2cc36b"
|
|
|
|
VBusItem {
|
|
id: batteryTimeToGo
|
|
bind: Utils.path(batteryPrefix, "/TimeToGo")
|
|
}
|
|
|
|
VBusItem {
|
|
id: batteryTimeLastFullCharge
|
|
bind: Utils.path(batteryPrefix, "/History/TimeSinceLastFullCharge")
|
|
}
|
|
|
|
MbItemRowTOBO {
|
|
id: batterySoc
|
|
description: qsTr("Used|Soc|Time")
|
|
|
|
values: [
|
|
MbTextBlock { item.bind: Utils.path(batteryPrefix, "/ConsumedAmphours"); width: 90; height: 25 },
|
|
MbTextBlock { item.bind: Utils.path(batteryPrefix, "/Soc"); item.unit: "%"; item.decimals: 1; width: 90; height: 25 },
|
|
MbTextBlock { item.text: remainingTime(batteryTimeToGo.value, 1); width: 90; height: 25 }
|
|
]
|
|
}
|
|
|
|
MbItemRowTOBO {
|
|
id: batteryLoad
|
|
anchors.top: batterySoc.bottom
|
|
description: qsTr("Battery Usage")
|
|
values: [
|
|
MbTextBlock { item.bind: Utils.path(batteryPrefix, "/Dc/0/Voltage"); width: 90; height: 25 },
|
|
MbTextBlock { item.bind: Utils.path(batteryPrefix, "/Dc/0/Current"); width: 90; height: 25 },
|
|
MbTextBlock { item.bind: Utils.path(batteryPrefix, "/Dc/0/Power"); width: 90; height: 25 }
|
|
]
|
|
}
|
|
}
|
|
|
|
|
|
Rectangle {
|
|
id: pvRectangle
|
|
|
|
width: 480
|
|
height: 105
|
|
color: "#FF2D2D"
|
|
|
|
MbItemRowTOBO {
|
|
id : pvStateDisplay
|
|
description: qsTr("State|Max V|W")
|
|
|
|
SystemState {
|
|
id: pvState
|
|
bind: Utils.path(solarchargerPrefix, "/State")
|
|
}
|
|
|
|
values: [
|
|
MbTextBlock { item.text: pvState.text; width: 90; height: 25 },
|
|
MbTextBlock { item.bind: Utils.path(solarchargerPrefix, "/History/Daily/0/MaxPvVoltage"); item.decimals: 2; item.unit: "V"; width: 90; height: 25 },
|
|
MbTextBlock { item.bind: Utils.path(solarchargerPrefix, "/History/Daily/0/MaxPower"); item.unit: "W"; width: 90; height: 25 }
|
|
]
|
|
}
|
|
|
|
|
|
MbItemRowTOBO {
|
|
id : pvDisplay
|
|
anchors.top: pvStateDisplay.bottom
|
|
description: qsTr("Panels")
|
|
|
|
values: [
|
|
MbTextBlock { item.bind: Utils.path(solarchargerPrefix, "/Pv/V"); width: 90; visible: true; height: 25 },
|
|
MbTextBlock { item.bind: Utils.path(solarchargerPrefix, "/Pv/I"); width: 90; visible: true; height: 25 },
|
|
MbTextBlock { item.bind: Utils.path(solarchargerPrefix, "/Yield/Power"); width: 90; height: 25 }
|
|
]
|
|
}
|
|
|
|
MbItemRowTOBO {
|
|
id : pvBattery
|
|
anchors.top: pvDisplay.bottom
|
|
description: qsTr("Battery Charge")
|
|
values: [
|
|
MbTextBlock { item.bind: Utils.path(solarchargerPrefix, "/Dc/0/Voltage"); width: 90; height: 25 },
|
|
MbTextBlock { item.bind: Utils.path(solarchargerPrefix, "/Dc/0/Current"); width: 90; height: 25 }
|
|
]
|
|
}
|
|
}
|
|
|
|
Rectangle {
|
|
id: bmsRectangle
|
|
|
|
width: 480
|
|
height: 75
|
|
color: "#404040"
|
|
|
|
|
|
MbItemRowTOBO {
|
|
id : bmsCellView1
|
|
description: qsTr("Cells Min|Max|Diff")
|
|
values: [
|
|
MbTextBlock { item.bind: Utils.path(chargeryBMSPrefix, "/Voltages/Min"); width: 90; height: 25 },
|
|
MbTextBlock { item.bind: Utils.path(chargeryBMSPrefix, "/Voltages/Max"); width: 90; height: 25 },
|
|
MbTextBlock { item.bind: Utils.path(chargeryBMSPrefix, "/Voltages/Diff"); width: 90; height: 25 }
|
|
]
|
|
}
|
|
|
|
MbItemRowTOBO {
|
|
id : bmsCellView2
|
|
anchors.top: bmsCellView1.bottom
|
|
description: qsTr("Current|Temp")
|
|
values: [
|
|
MbTextBlock { item.bind: Utils.path(chargeryBMSPrefix, "/Info/Current"); width: 90; height: 25 },
|
|
MbTextBlock { item.bind: Utils.path(chargeryBMSPrefix, "/Info/Temp/Sensor1"); width: 90; height: 25 },
|
|
MbTextBlock { item.bind: Utils.path(chargeryBMSPrefix, "/Info/Temp/Sensor2"); width: 90; height: 25 }
|
|
]
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|