Merge PR #383: Add support for the ventilation interface
This commit is contained in:
commit
2cabed12e5
@ -269,6 +269,8 @@ Interfaces::Interfaces(QObject *parent) : QAbstractListModel(parent)
|
|||||||
addInterface("thermostat", tr("Thermostats"));
|
addInterface("thermostat", tr("Thermostats"));
|
||||||
addStateType("thermostat", "targetTemperature", QVariant::Double, true, tr("Target temperature"), tr("Target temperature changed"), tr("Set target temperature"));
|
addStateType("thermostat", "targetTemperature", QVariant::Double, true, tr("Target temperature"), tr("Target temperature changed"), tr("Set target temperature"));
|
||||||
|
|
||||||
|
addInterface("ventilation", tr("Ventilation"), {"power"});
|
||||||
|
|
||||||
addInterface("volumecontroller", tr("Speakers"));
|
addInterface("volumecontroller", tr("Speakers"));
|
||||||
addActionType("volumecontroller", "increaseVolume", tr("Increase volume"), new ParamTypes());
|
addActionType("volumecontroller", "increaseVolume", tr("Increase volume"), new ParamTypes());
|
||||||
addActionType("volumecontroller", "decreaseVolume", tr("Decrease volume"), new ParamTypes());
|
addActionType("volumecontroller", "decreaseVolume", tr("Decrease volume"), new ParamTypes());
|
||||||
|
|||||||
@ -220,5 +220,6 @@
|
|||||||
<file>ui/images/key.svg</file>
|
<file>ui/images/key.svg</file>
|
||||||
<file>ui/images/browser/MediaBrowserIconRadioParadise.svg</file>
|
<file>ui/images/browser/MediaBrowserIconRadioParadise.svg</file>
|
||||||
<file>ui/images/io-connections.svg</file>
|
<file>ui/images/io-connections.svg</file>
|
||||||
|
<file>ui/images/sensors/windspeed.svg</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|||||||
@ -214,5 +214,6 @@
|
|||||||
<file>ui/components/SettingsPageSectionHeader.qml</file>
|
<file>ui/components/SettingsPageSectionHeader.qml</file>
|
||||||
<file>ui/grouping/GroupInterfacesPage.qml</file>
|
<file>ui/grouping/GroupInterfacesPage.qml</file>
|
||||||
<file>ui/connection/CertificateErrorDialog.qml</file>
|
<file>ui/connection/CertificateErrorDialog.qml</file>
|
||||||
|
<file>ui/devicepages/VentilationDevicePage.qml</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|||||||
@ -106,7 +106,32 @@ ApplicationWindow {
|
|||||||
}
|
}
|
||||||
property alias _discovery: discovery
|
property alias _discovery: discovery
|
||||||
|
|
||||||
property var supportedInterfaces: ["light", "weather", "media", "garagegate", "awning", "shutter", "blind", "powersocket", "heating", "doorbell", "sensor", "irrigation", "smartmeter", "evcharger", "fingerprintreader", "smartlock", "button", "notifications", "inputtrigger", "outputtrigger", "gateway", "account"]
|
property var supportedInterfaces: [
|
||||||
|
"light",
|
||||||
|
"weather",
|
||||||
|
"media",
|
||||||
|
"garagegate",
|
||||||
|
"awning",
|
||||||
|
"shutter",
|
||||||
|
"blind",
|
||||||
|
"powersocket",
|
||||||
|
"heating",
|
||||||
|
"doorbell",
|
||||||
|
"sensor",
|
||||||
|
"irrigation",
|
||||||
|
"ventilation",
|
||||||
|
"smartmeter",
|
||||||
|
"evcharger",
|
||||||
|
"fingerprintreader",
|
||||||
|
"smartlock",
|
||||||
|
"button",
|
||||||
|
"notifications",
|
||||||
|
"inputtrigger",
|
||||||
|
"outputtrigger",
|
||||||
|
"gateway",
|
||||||
|
"account"
|
||||||
|
]
|
||||||
|
|
||||||
function interfaceToString(name) {
|
function interfaceToString(name) {
|
||||||
switch(name) {
|
switch(name) {
|
||||||
case "light":
|
case "light":
|
||||||
@ -173,6 +198,8 @@ ApplicationWindow {
|
|||||||
return qsTr("Smartlocks")
|
return qsTr("Smartlocks")
|
||||||
case "irrigation":
|
case "irrigation":
|
||||||
return qsTr("Irrigation");
|
return qsTr("Irrigation");
|
||||||
|
case "ventilation":
|
||||||
|
return qsTr("Ventilation")
|
||||||
case "uncategorized":
|
case "uncategorized":
|
||||||
return qsTr("Uncategorized")
|
return qsTr("Uncategorized")
|
||||||
default:
|
default:
|
||||||
@ -222,6 +249,8 @@ ApplicationWindow {
|
|||||||
return Qt.resolvedUrl("images/sensors/presence.svg")
|
return Qt.resolvedUrl("images/sensors/presence.svg")
|
||||||
case "closablesensor":
|
case "closablesensor":
|
||||||
return Qt.resolvedUrl("images/sensors/closable.svg")
|
return Qt.resolvedUrl("images/sensors/closable.svg")
|
||||||
|
case "windspeedsensor":
|
||||||
|
return Qt.resolvedUrl("images/sensors/windspeed.svg")
|
||||||
case "media":
|
case "media":
|
||||||
case "mediacontroller":
|
case "mediacontroller":
|
||||||
case "mediaplayer":
|
case "mediaplayer":
|
||||||
@ -285,6 +314,8 @@ ApplicationWindow {
|
|||||||
return Qt.resolvedUrl("images/stock_link.svg")
|
return Qt.resolvedUrl("images/stock_link.svg")
|
||||||
case "irrigation":
|
case "irrigation":
|
||||||
return Qt.resolvedUrl("images/irrigation.svg")
|
return Qt.resolvedUrl("images/irrigation.svg")
|
||||||
|
case "ventilation":
|
||||||
|
return Qt.resolvedUrl("images/ventilation.svg")
|
||||||
case "power":
|
case "power":
|
||||||
return Qt.resolvedUrl("images/system-shutdown.svg")
|
return Qt.resolvedUrl("images/system-shutdown.svg")
|
||||||
case "account":
|
case "account":
|
||||||
@ -315,7 +346,9 @@ ApplicationWindow {
|
|||||||
"extendedsmartmeterconsumer": "blue",
|
"extendedsmartmeterconsumer": "blue",
|
||||||
"heating" : "gainsboro",
|
"heating" : "gainsboro",
|
||||||
"thermostat": "dodgerblue",
|
"thermostat": "dodgerblue",
|
||||||
"irrigation": "lightblue"
|
"irrigation": "lightblue",
|
||||||
|
"windspeedsensor": "blue",
|
||||||
|
"ventilation": "lightblue"
|
||||||
}
|
}
|
||||||
|
|
||||||
function interfaceToColor(name) {
|
function interfaceToColor(name) {
|
||||||
@ -351,6 +384,9 @@ ApplicationWindow {
|
|||||||
case "irrigation":
|
case "irrigation":
|
||||||
//: Select ...
|
//: Select ...
|
||||||
return qsTr("irrigation");
|
return qsTr("irrigation");
|
||||||
|
case "ventilation":
|
||||||
|
//: Select ...
|
||||||
|
return qsTr("ventilation");
|
||||||
case "power":
|
case "power":
|
||||||
//: Select ...
|
//: Select ...
|
||||||
return qsTr("switchable thing")
|
return qsTr("switchable thing")
|
||||||
@ -435,6 +471,8 @@ ApplicationWindow {
|
|||||||
page = "DoorbellDevicePage.qml";
|
page = "DoorbellDevicePage.qml";
|
||||||
} else if (interfaceList.indexOf("irrigation") >= 0) {
|
} else if (interfaceList.indexOf("irrigation") >= 0) {
|
||||||
page = "IrrigationDevicePage.qml";
|
page = "IrrigationDevicePage.qml";
|
||||||
|
} else if (interfaceList.indexOf("ventilation") >= 0) {
|
||||||
|
page = "VentilationDevicePage.qml";
|
||||||
} else {
|
} else {
|
||||||
page = "GenericDevicePage.qml";
|
page = "GenericDevicePage.qml";
|
||||||
}
|
}
|
||||||
|
|||||||
@ -350,7 +350,7 @@ Item {
|
|||||||
borderColor: root.color
|
borderColor: root.color
|
||||||
axisX: xAxis
|
axisX: xAxis
|
||||||
axisY: yAxis
|
axisY: yAxis
|
||||||
pointLabelsVisible: true
|
pointLabelsVisible: root.stateType.type.toLowerCase() !== "bool"
|
||||||
pointLabelsColor: app.foregroundColor
|
pointLabelsColor: app.foregroundColor
|
||||||
pointLabelsFont.pixelSize: app.smallFont
|
pointLabelsFont.pixelSize: app.smallFont
|
||||||
pointLabelsFormat: "@yPoint"
|
pointLabelsFormat: "@yPoint"
|
||||||
|
|||||||
@ -106,6 +106,7 @@ CustomViewBase {
|
|||||||
Layout.preferredWidth: app.largeFont * 4
|
Layout.preferredWidth: app.largeFont * 4
|
||||||
Layout.preferredHeight: app.largeFont * 4
|
Layout.preferredHeight: app.largeFont * 4
|
||||||
name: weatherConditionState ? "../images/weathericons/weather-" + weatherConditionState.value + ".svg" : ""
|
name: weatherConditionState ? "../images/weathericons/weather-" + weatherConditionState.value + ".svg" : ""
|
||||||
|
color: "white"
|
||||||
}
|
}
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
@ -128,6 +129,7 @@ CustomViewBase {
|
|||||||
name: "../images/weathericons/wind.svg"
|
name: "../images/weathericons/wind.svg"
|
||||||
width: app.iconSize
|
width: app.iconSize
|
||||||
height: width
|
height: width
|
||||||
|
color: app.interfaceToColor("windspeedsensor")
|
||||||
}
|
}
|
||||||
|
|
||||||
Label {
|
Label {
|
||||||
|
|||||||
@ -35,43 +35,59 @@ import Nymea 1.0
|
|||||||
import "../components"
|
import "../components"
|
||||||
import "../customviews"
|
import "../customviews"
|
||||||
|
|
||||||
ListView {
|
Flickable {
|
||||||
id: listView
|
id: listView
|
||||||
anchors { fill: parent }
|
anchors { fill: parent }
|
||||||
interactive: contentHeight > height
|
interactive: contentHeight > height
|
||||||
model: ListModel {
|
contentHeight: contentGrid.implicitHeight
|
||||||
Component.onCompleted: {
|
|
||||||
var supportedInterfaces = ["temperaturesensor", "humiditysensor", "pressuresensor", "moisturesensor", "lightsensor", "conductivitysensor", "noisesensor", "co2sensor", "presencesensor", "daylightsensor", "closablesensor"]
|
GridLayout {
|
||||||
for (var i = 0; i < supportedInterfaces.length; i++) {
|
id: contentGrid
|
||||||
if (root.deviceClass.interfaces.indexOf(supportedInterfaces[i]) >= 0) {
|
width: parent.width
|
||||||
append({name: supportedInterfaces[i]});
|
columns: width / 300
|
||||||
|
|
||||||
|
Repeater {
|
||||||
|
model: ListModel {
|
||||||
|
Component.onCompleted: {
|
||||||
|
var supportedInterfaces = ["temperaturesensor", "humiditysensor", "pressuresensor", "moisturesensor", "lightsensor", "conductivitysensor", "noisesensor", "co2sensor", "presencesensor", "daylightsensor", "closablesensor"]
|
||||||
|
for (var i = 0; i < supportedInterfaces.length; i++) {
|
||||||
|
if (root.deviceClass.interfaces.indexOf(supportedInterfaces[i]) >= 0) {
|
||||||
|
append({name: supportedInterfaces[i]});
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
delegate: Loader {
|
||||||
|
id: loader
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.preferredHeight: item.implicitHeight
|
||||||
|
|
||||||
|
property StateType stateType: root.deviceClass.stateTypes.findByName(interfaceStateMap[modelData])
|
||||||
|
property string interfaceName: modelData
|
||||||
|
|
||||||
|
// sourceComponent: stateType && stateType.type.toLowerCase() === "bool" ? boolComponent : graphComponent
|
||||||
|
sourceComponent: graphComponent
|
||||||
|
|
||||||
|
property var interfaceStateMap: {
|
||||||
|
"temperaturesensor": "temperature",
|
||||||
|
"humiditysensor": "humidity",
|
||||||
|
"pressuresensor": "pressure",
|
||||||
|
"moisturesensor": "moisture",
|
||||||
|
"lightsensor": "lightIntensity",
|
||||||
|
"conductivitysensor": "conductivity",
|
||||||
|
"noisesensor": "noise",
|
||||||
|
"co2sensor": "co2",
|
||||||
|
"presencesensor": "isPresent",
|
||||||
|
"daylightsensor": "daylight",
|
||||||
|
"closablesensor": "closed"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
delegate: Loader {
|
|
||||||
id: loader
|
|
||||||
width: parent.width
|
|
||||||
|
|
||||||
property StateType stateType: root.deviceClass.stateTypes.findByName(interfaceStateMap[modelData])
|
|
||||||
property string interfaceName: modelData
|
|
||||||
|
|
||||||
sourceComponent: stateType && stateType.type.toLowerCase() === "bool" ? boolComponent : graphComponent
|
|
||||||
|
|
||||||
property var interfaceStateMap: {
|
|
||||||
"temperaturesensor": "temperature",
|
|
||||||
"humiditysensor": "humidity",
|
|
||||||
"pressuresensor": "pressure",
|
|
||||||
"moisturesensor": "moisture",
|
|
||||||
"lightsensor": "lightIntensity",
|
|
||||||
"conductivitysensor": "conductivity",
|
|
||||||
"noisesensor": "noise",
|
|
||||||
"co2sensor": "co2",
|
|
||||||
"presencesensor": "isPresent",
|
|
||||||
"daylightsensor": "daylight",
|
|
||||||
"closablesensor": "closed"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Component {
|
Component {
|
||||||
id: graphComponent
|
id: graphComponent
|
||||||
|
|||||||
@ -38,37 +38,41 @@ import "../customviews"
|
|||||||
DevicePageBase {
|
DevicePageBase {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
ListView {
|
Flickable {
|
||||||
anchors { fill: parent }
|
anchors.fill: parent
|
||||||
model: ListModel {
|
contentHeight: contentGrid.height
|
||||||
Component.onCompleted: {
|
interactive: contentHeight > height
|
||||||
if (root.deviceClass.interfaces.indexOf("extendedsmartmeterproducer") >= 0
|
|
||||||
|| root.deviceClass.interfaces.indexOf("extendedsmartmeterconsumer") >= 0) {
|
GridLayout {
|
||||||
append( {interface: "extendedsmartmeterproducer", stateTypeName: "currentPower" })
|
id: contentGrid
|
||||||
}
|
|
||||||
if (root.deviceClass.interfaces.indexOf("smartmeterproducer") >= 0) {
|
|
||||||
append( {interface: "smartmeterproducer", stateTypeName: "totalEnergyProduced" })
|
|
||||||
}
|
|
||||||
if (root.deviceClass.interfaces.indexOf("smartmeterconsumer") >= 0) {
|
|
||||||
append( {interface: "smartmeterconsumer", stateTypeName: "totalEnergyConsumed" })
|
|
||||||
}
|
|
||||||
print("shown graphs are", count)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
delegate: ColumnLayout {
|
|
||||||
width: parent.width
|
width: parent.width
|
||||||
Label {
|
columns: Math.min(width / 300, contentModel.count)
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.leftMargin: app.margins; Layout.topMargin: app.margins; Layout.rightMargin: app.rightMargins;
|
Repeater {
|
||||||
text: root.deviceClass.stateTypes.findByName(model.stateTypeName).displayName
|
model: ListModel {
|
||||||
}
|
id: contentModel
|
||||||
GenericTypeGraph {
|
Component.onCompleted: {
|
||||||
Layout.fillWidth: true
|
if (root.deviceClass.interfaces.indexOf("extendedsmartmeterproducer") >= 0
|
||||||
device: root.device
|
|| root.deviceClass.interfaces.indexOf("extendedsmartmeterconsumer") >= 0) {
|
||||||
stateType: root.deviceClass.stateTypes.findByName(model.stateTypeName)
|
append( {interface: "extendedsmartmeterproducer", stateTypeName: "currentPower" })
|
||||||
color: app.interfaceToColor(model.interface)
|
}
|
||||||
iconSource: app.interfaceToIcon(model.interface)
|
if (root.deviceClass.interfaces.indexOf("smartmeterproducer") >= 0) {
|
||||||
roundTo: 5
|
append( {interface: "smartmeterproducer", stateTypeName: "totalEnergyProduced" })
|
||||||
|
}
|
||||||
|
if (root.deviceClass.interfaces.indexOf("smartmeterconsumer") >= 0) {
|
||||||
|
append( {interface: "smartmeterconsumer", stateTypeName: "totalEnergyConsumed" })
|
||||||
|
}
|
||||||
|
print("shown graphs are", count)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delegate: GenericTypeGraph {
|
||||||
|
Layout.preferredWidth: contentGrid.width / contentGrid.columns
|
||||||
|
device: root.device
|
||||||
|
stateType: root.deviceClass.stateTypes.findByName(model.stateTypeName)
|
||||||
|
color: app.interfaceToColor(model.interface)
|
||||||
|
iconSource: app.interfaceToIcon(model.interface)
|
||||||
|
roundTo: 5
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
104
nymea-app/ui/devicepages/VentilationDevicePage.qml
Normal file
104
nymea-app/ui/devicepages/VentilationDevicePage.qml
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
|
*
|
||||||
|
* Copyright 2013 - 2020, nymea GmbH
|
||||||
|
* Contact: contact@nymea.io
|
||||||
|
*
|
||||||
|
* This file is part of nymea.
|
||||||
|
* This project including source code and documentation is protected by
|
||||||
|
* copyright law, and remains the property of nymea GmbH. All rights, including
|
||||||
|
* reproduction, publication, editing and translation, are reserved. The use of
|
||||||
|
* this project is subject to the terms of a license agreement to be concluded
|
||||||
|
* with nymea GmbH in accordance with the terms of use of nymea GmbH, available
|
||||||
|
* under https://nymea.io/license
|
||||||
|
*
|
||||||
|
* GNU General Public License Usage
|
||||||
|
* Alternatively, this project may be redistributed and/or modified under the
|
||||||
|
* terms of the GNU General Public License as published by the Free Software
|
||||||
|
* Foundation, GNU version 3. This project is distributed in the hope that it
|
||||||
|
* will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
||||||
|
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
* Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with
|
||||||
|
* this project. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* For any further details and any questions please contact us under
|
||||||
|
* contact@nymea.io or see our FAQ/Licensing Information on
|
||||||
|
* https://nymea.io/license/faq
|
||||||
|
*
|
||||||
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||||
|
|
||||||
|
import QtQuick 2.5
|
||||||
|
import QtQuick.Controls 2.1
|
||||||
|
import QtQuick.Layouts 1.1
|
||||||
|
import QtQuick.Controls.Material 2.1
|
||||||
|
import Nymea 1.0
|
||||||
|
import "../components"
|
||||||
|
|
||||||
|
DevicePageBase {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
readonly property var powerStateType: deviceClass.stateTypes.findByName("power")
|
||||||
|
readonly property var powerState: device.states.getState(powerStateType.id)
|
||||||
|
readonly property var powerActionType: deviceClass.actionTypes.findByName("power");
|
||||||
|
|
||||||
|
GridLayout {
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors.margins: app.margins
|
||||||
|
columns: app.landscape ? 2 : 1
|
||||||
|
rowSpacing: app.margins
|
||||||
|
columnSpacing: app.margins
|
||||||
|
Layout.alignment: Qt.AlignCenter
|
||||||
|
|
||||||
|
Item {
|
||||||
|
Layout.preferredWidth: Math.max(app.iconSize * 6, parent.width / 5)
|
||||||
|
Layout.preferredHeight: width
|
||||||
|
Layout.topMargin: app.margins
|
||||||
|
Layout.bottomMargin: app.landscape ? app.margins : 0
|
||||||
|
Layout.alignment: Qt.AlignCenter
|
||||||
|
Layout.rowSpan: app.landscape ? 4 : 1
|
||||||
|
Layout.fillHeight: true
|
||||||
|
|
||||||
|
AbstractButton {
|
||||||
|
height: Math.min(parent.height, parent.width)
|
||||||
|
width: height
|
||||||
|
anchors.centerIn: parent
|
||||||
|
Rectangle {
|
||||||
|
anchors.fill: parent
|
||||||
|
color: "transparent"
|
||||||
|
border.color: root.powerState.value === true ? app.accentColor : bulbIcon.keyColor
|
||||||
|
border.width: 4
|
||||||
|
radius: width / 2
|
||||||
|
}
|
||||||
|
|
||||||
|
ColorIcon {
|
||||||
|
id: bulbIcon
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors.margins: app.margins * 1.5
|
||||||
|
name: "../images/ventilation.svg"
|
||||||
|
color: root.powerState.value === true ? app.accentColor : keyColor
|
||||||
|
|
||||||
|
PropertyAnimation on rotation {
|
||||||
|
running: root.powerState.value === true
|
||||||
|
duration: 2000
|
||||||
|
from: 0
|
||||||
|
to: 360
|
||||||
|
loops: Animation.Infinite
|
||||||
|
onDurationChanged: {
|
||||||
|
running = false;
|
||||||
|
running = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
onClicked: {
|
||||||
|
var params = []
|
||||||
|
var param = {}
|
||||||
|
param["paramTypeId"] = root.powerActionType.paramTypes.get(0).id;
|
||||||
|
param["value"] = !root.powerState.value;
|
||||||
|
params.push(param)
|
||||||
|
engine.deviceManager.executeAction(root.device.id, root.powerStateType.id, params);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -38,39 +38,55 @@ import "../customviews"
|
|||||||
Flickable {
|
Flickable {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
clip: true
|
clip: true
|
||||||
contentHeight: content.implicitHeight
|
contentHeight: contentColumn.implicitHeight
|
||||||
|
|
||||||
property var device
|
property var device
|
||||||
property var deviceClass
|
property var deviceClass
|
||||||
|
|
||||||
ColumnLayout {
|
ColumnLayout {
|
||||||
id: content
|
id: contentColumn
|
||||||
width: parent.width
|
width: parent.width
|
||||||
|
|
||||||
WeatherView {
|
WeatherView {
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
device: root.device
|
device: root.device
|
||||||
deviceClass: root.deviceClass
|
deviceClass: root.deviceClass
|
||||||
}
|
}
|
||||||
GenericTypeGraph {
|
|
||||||
|
GridLayout {
|
||||||
|
id: content
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
device: root.device
|
columns: Math.min(width / 300, 4)
|
||||||
stateType: root.deviceClass.stateTypes.findByName("temperature")
|
|
||||||
iconSource: app.interfaceToIcon("temperaturesensor")
|
GenericTypeGraph {
|
||||||
color: app.interfaceToColor("temperaturesensor")
|
Layout.fillWidth: true
|
||||||
}
|
device: root.device
|
||||||
GenericTypeGraph {
|
stateType: root.deviceClass.stateTypes.findByName("temperature")
|
||||||
Layout.fillWidth: true
|
iconSource: app.interfaceToIcon("temperaturesensor")
|
||||||
device: root.device
|
color: app.interfaceToColor("temperaturesensor")
|
||||||
stateType: root.deviceClass.stateTypes.findByName("humidity")
|
}
|
||||||
iconSource: app.interfaceToIcon("humiditysensor")
|
GenericTypeGraph {
|
||||||
color: app.interfaceToColor("humiditysensor")
|
Layout.fillWidth: true
|
||||||
}
|
device: root.device
|
||||||
GenericTypeGraph {
|
stateType: root.deviceClass.stateTypes.findByName("humidity")
|
||||||
Layout.fillWidth: true
|
iconSource: app.interfaceToIcon("humiditysensor")
|
||||||
device: root.device
|
color: app.interfaceToColor("humiditysensor")
|
||||||
stateType: root.deviceClass.stateTypes.findByName("pressure")
|
}
|
||||||
iconSource: app.interfaceToIcon("pressuresensor")
|
GenericTypeGraph {
|
||||||
color: app.interfaceToColor("pressuresensor")
|
Layout.fillWidth: true
|
||||||
|
device: root.device
|
||||||
|
stateType: root.deviceClass.stateTypes.findByName("pressure")
|
||||||
|
iconSource: app.interfaceToIcon("pressuresensor")
|
||||||
|
color: app.interfaceToColor("pressuresensor")
|
||||||
|
}
|
||||||
|
GenericTypeGraph {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
device: root.device
|
||||||
|
stateType: root.deviceClass.stateTypes.findByName("windSpeed")
|
||||||
|
iconSource: app.interfaceToIcon("windspeedsensor")
|
||||||
|
color: app.interfaceToColor("windspeedsensor")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
165
nymea-app/ui/images/sensors/windspeed.svg
Normal file
165
nymea-app/ui/images/sensors/windspeed.svg
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="96"
|
||||||
|
height="96"
|
||||||
|
id="svg4874"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.91+devel r"
|
||||||
|
viewBox="0 0 96 96.000001"
|
||||||
|
sodipodi:docname="weather-chance-of-wind.svg">
|
||||||
|
<defs
|
||||||
|
id="defs4876" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="7.0249991"
|
||||||
|
inkscape:cx="-6.612105"
|
||||||
|
inkscape:cy="54.690381"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="g4780"
|
||||||
|
showgrid="false"
|
||||||
|
showborder="true"
|
||||||
|
fit-margin-top="0"
|
||||||
|
fit-margin-left="0"
|
||||||
|
fit-margin-right="0"
|
||||||
|
fit-margin-bottom="0"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
inkscape:bbox-paths="true"
|
||||||
|
inkscape:bbox-nodes="true"
|
||||||
|
inkscape:snap-bbox-edge-midpoints="true"
|
||||||
|
inkscape:snap-bbox-midpoints="true"
|
||||||
|
inkscape:object-paths="true"
|
||||||
|
inkscape:snap-intersection-paths="true"
|
||||||
|
inkscape:object-nodes="true"
|
||||||
|
inkscape:snap-smooth-nodes="true"
|
||||||
|
inkscape:snap-midpoints="true"
|
||||||
|
inkscape:snap-object-midpoints="true"
|
||||||
|
inkscape:snap-center="true"
|
||||||
|
showguides="true"
|
||||||
|
inkscape:guide-bbox="true"
|
||||||
|
inkscape:snap-global="true">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid5451"
|
||||||
|
empspacing="8" />
|
||||||
|
<sodipodi:guide
|
||||||
|
orientation="1,0"
|
||||||
|
position="8,-8.0000001"
|
||||||
|
id="guide4063" />
|
||||||
|
<sodipodi:guide
|
||||||
|
orientation="1,0"
|
||||||
|
position="4,-8.0000001"
|
||||||
|
id="guide4065" />
|
||||||
|
<sodipodi:guide
|
||||||
|
orientation="0,1"
|
||||||
|
position="-8,88.000001"
|
||||||
|
id="guide4067" />
|
||||||
|
<sodipodi:guide
|
||||||
|
orientation="0,1"
|
||||||
|
position="-8,92.000001"
|
||||||
|
id="guide4069" />
|
||||||
|
<sodipodi:guide
|
||||||
|
orientation="0,1"
|
||||||
|
position="104,4"
|
||||||
|
id="guide4071" />
|
||||||
|
<sodipodi:guide
|
||||||
|
orientation="0,1"
|
||||||
|
position="-5,8.0000001"
|
||||||
|
id="guide4073" />
|
||||||
|
<sodipodi:guide
|
||||||
|
orientation="1,0"
|
||||||
|
position="88,-8.0000001"
|
||||||
|
id="guide4077" />
|
||||||
|
<sodipodi:guide
|
||||||
|
orientation="0,1"
|
||||||
|
position="-8,84.000001"
|
||||||
|
id="guide4074" />
|
||||||
|
<sodipodi:guide
|
||||||
|
orientation="1,0"
|
||||||
|
position="12,-8.0000001"
|
||||||
|
id="guide4076" />
|
||||||
|
<sodipodi:guide
|
||||||
|
orientation="1,0"
|
||||||
|
position="84,-8.0000001"
|
||||||
|
id="guide4080" />
|
||||||
|
<sodipodi:guide
|
||||||
|
position="48,-8.0000001"
|
||||||
|
orientation="1,0"
|
||||||
|
id="guide4170" />
|
||||||
|
<sodipodi:guide
|
||||||
|
position="-8,48"
|
||||||
|
orientation="0,1"
|
||||||
|
id="guide4172" />
|
||||||
|
<sodipodi:guide
|
||||||
|
position="92,-8.0000001"
|
||||||
|
orientation="1,0"
|
||||||
|
id="guide4760" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<metadata
|
||||||
|
id="metadata4879">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(67.857146,-78.50504)">
|
||||||
|
<g
|
||||||
|
transform="matrix(0,-1,-1,0,373.50506,516.50504)"
|
||||||
|
id="g4845"
|
||||||
|
style="display:inline">
|
||||||
|
<g
|
||||||
|
inkscape:export-ydpi="90"
|
||||||
|
inkscape:export-xdpi="90"
|
||||||
|
inkscape:export-filename="next01.png"
|
||||||
|
transform="matrix(-0.9996045,0,0,1,575.94296,-611.00001)"
|
||||||
|
id="g4778"
|
||||||
|
inkscape:label="Layer 1">
|
||||||
|
<g
|
||||||
|
transform="matrix(-1,0,0,1,575.99999,611)"
|
||||||
|
id="g4780"
|
||||||
|
style="display:inline">
|
||||||
|
<rect
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:4;marker:none;enable-background:accumulate"
|
||||||
|
id="rect4782"
|
||||||
|
width="96.037987"
|
||||||
|
height="96"
|
||||||
|
x="-438.00244"
|
||||||
|
y="345.36221"
|
||||||
|
transform="scale(-1,1)" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:none;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.00079107;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 409.60352,384.36133 c -3.97616,0 -6.7935,1.6624 -8.15821,3.98242 -1.3647,2.32002 -1.45703,4.90895 -1.45703,7.01758 l 0,24 4,0 0,-24 c 0,-1.90524 0.21419,-3.81372 0.90625,-4.99024 0.69207,-1.17651 1.68238,-2.00781 4.70899,-2.00781 1.87806,0 2.72133,0.70859 3.40625,1.73633 0.68491,1.02774 0.98437,2.49609 0.98437,3.26172 0,2.67583 -2.61914,3.4668 -2.61914,3.46679 l 1.29492,3.78516 c 0,0 5.32422,-1.92778 5.32422,-7.25195 0,-1.56143 -0.39636,-3.58997 -1.65625,-5.48047 -1.25989,-1.8905 -3.61045,-3.51953 -6.73437,-3.51953 z"
|
||||||
|
id="path4194"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:none;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.00079107;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 397.59766,349.36133 c -3.97616,0 -6.79155,1.6624 -8.15625,3.98242 -1.36471,2.32002 -1.45899,4.90895 -1.45899,7.01758 l 0,24 0,42 c 0,2 -0.0823,4.03363 -0.58789,5.21289 -0.5056,1.17926 -0.96832,1.78711 -3.41406,1.78711 -2.44574,0 -2.90651,-0.60785 -3.41211,-1.78711 -0.5056,-1.17926 -0.58984,-3.21289 -0.58984,-5.21289 l 0,-27 0,-24 c 0,-2.10863 -0.0923,-4.69756 -1.45704,-7.01758 -1.3647,-2.32002 -4.18204,-3.98242 -8.1582,-3.98242 -3.12393,0 -5.47448,1.62903 -6.73437,3.51953 -1.2599,1.8905 -1.65625,3.91904 -1.65625,5.48047 0,5.32417 5.32421,7.25195 5.32422,7.25195 l 1.29492,-3.78516 c 0,0 -2.61914,-0.79096 -2.61914,-3.46679 0,-0.76563 0.29945,-2.23398 0.98437,-3.26172 0.68492,-1.02774 1.52819,-1.73633 3.40625,-1.73633 3.0266,0 4.01692,0.8313 4.70899,2.00781 0.69206,1.17652 0.90625,3.085 0.90625,4.99024 l 0,24 0,27 c 0,2 -0.0829,4.46832 0.9121,6.78906 0.995,2.32074 3.53322,4.21289 7.08985,4.21289 3.55663,0 6.0968,-1.89215 7.0918,-4.21289 0.99499,-2.32074 0.9121,-4.78906 0.91211,-6.78906 l 0,-42 0,-24 c 0,-1.90524 0.21223,-3.81372 0.90429,-4.99024 0.69207,-1.17651 1.68238,-2.00781 4.70899,-2.00781 1.87806,0 2.72133,0.70859 3.40625,1.73633 0.68492,1.02774 0.98437,2.49609 0.98437,3.26172 0,2.67583 -2.61914,3.4668 -2.61914,3.46679 l 1.29492,3.78516 c 0,0 5.32617,-1.92778 5.32617,-7.25195 0,-1.56143 -0.39635,-3.58997 -1.65625,-5.48047 -1.25989,-1.8905 -3.61239,-3.51953 -6.73632,-3.51953 z"
|
||||||
|
id="path4196"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 8.8 KiB |
@ -150,6 +150,8 @@ MainPageTile {
|
|||||||
case "awning":
|
case "awning":
|
||||||
case "extendedawning":
|
case "extendedawning":
|
||||||
case "powersocket":
|
case "powersocket":
|
||||||
|
case "irrigation":
|
||||||
|
case "ventilation":
|
||||||
return buttonComponent
|
return buttonComponent
|
||||||
case "media":
|
case "media":
|
||||||
return mediaControlComponent
|
return mediaControlComponent
|
||||||
@ -239,6 +241,8 @@ MainPageTile {
|
|||||||
case "media":
|
case "media":
|
||||||
return devicesProxy.get(0).name;
|
return devicesProxy.get(0).name;
|
||||||
case "light":
|
case "light":
|
||||||
|
case "irrigation":
|
||||||
|
case "ventilation":
|
||||||
case "powersocket":
|
case "powersocket":
|
||||||
var count = 0;
|
var count = 0;
|
||||||
for (var i = 0; i < devicesProxy.count; i++) {
|
for (var i = 0; i < devicesProxy.count; i++) {
|
||||||
@ -294,6 +298,8 @@ MainPageTile {
|
|||||||
switch (iface.name) {
|
switch (iface.name) {
|
||||||
case "media":
|
case "media":
|
||||||
case "light":
|
case "light":
|
||||||
|
case "irrigation":
|
||||||
|
case "ventilation":
|
||||||
return ""
|
return ""
|
||||||
case "garagegate":
|
case "garagegate":
|
||||||
case "blind":
|
case "blind":
|
||||||
@ -314,6 +320,8 @@ MainPageTile {
|
|||||||
switch (iface.name) {
|
switch (iface.name) {
|
||||||
case "light":
|
case "light":
|
||||||
case "media":
|
case "media":
|
||||||
|
case "irrigation":
|
||||||
|
case "ventilation":
|
||||||
break;
|
break;
|
||||||
case "garagegate":
|
case "garagegate":
|
||||||
case "shutter":
|
case "shutter":
|
||||||
@ -350,6 +358,8 @@ MainPageTile {
|
|||||||
switch (iface.name) {
|
switch (iface.name) {
|
||||||
case "media":
|
case "media":
|
||||||
case "light":
|
case "light":
|
||||||
|
case "irrigation":
|
||||||
|
case "ventilation":
|
||||||
return ""
|
return ""
|
||||||
case "garagegate":
|
case "garagegate":
|
||||||
case "blind":
|
case "blind":
|
||||||
@ -370,6 +380,8 @@ MainPageTile {
|
|||||||
switch (iface.name) {
|
switch (iface.name) {
|
||||||
case "light":
|
case "light":
|
||||||
case "media":
|
case "media":
|
||||||
|
case "irrigation":
|
||||||
|
case "ventilation":
|
||||||
break;
|
break;
|
||||||
case "garagegate":
|
case "garagegate":
|
||||||
case "shutter":
|
case "shutter":
|
||||||
@ -414,6 +426,8 @@ MainPageTile {
|
|||||||
""
|
""
|
||||||
case "light":
|
case "light":
|
||||||
case "powersocket":
|
case "powersocket":
|
||||||
|
case "irrigation":
|
||||||
|
case "ventilation":
|
||||||
return "../images/system-shutdown.svg"
|
return "../images/system-shutdown.svg"
|
||||||
case "garagegate":
|
case "garagegate":
|
||||||
case "blind":
|
case "blind":
|
||||||
@ -433,6 +447,8 @@ MainPageTile {
|
|||||||
switch (iface.name) {
|
switch (iface.name) {
|
||||||
case "light":
|
case "light":
|
||||||
case "powersocket":
|
case "powersocket":
|
||||||
|
case "irrigation":
|
||||||
|
case "ventilation":
|
||||||
var allOff = true;
|
var allOff = true;
|
||||||
for (var i = 0; i < devicesProxy.count; i++) {
|
for (var i = 0; i < devicesProxy.count; i++) {
|
||||||
var device = devicesProxy.get(i);
|
var device = devicesProxy.get(i);
|
||||||
|
|||||||
Reference in New Issue
Block a user