Add support for the ventilation interface

This commit is contained in:
Michael Zanetti 2020-05-27 11:33:42 +02:00
parent 1682405447
commit 81bc57aff6
5 changed files with 160 additions and 2 deletions

View File

@ -269,6 +269,8 @@ Interfaces::Interfaces(QObject *parent) : QAbstractListModel(parent)
addInterface("thermostat", tr("Thermostats"));
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"));
addActionType("volumecontroller", "increaseVolume", tr("Increase volume"), new ParamTypes());
addActionType("volumecontroller", "decreaseVolume", tr("Decrease volume"), new ParamTypes());

View File

@ -214,5 +214,6 @@
<file>ui/components/SettingsPageSectionHeader.qml</file>
<file>ui/grouping/GroupInterfacesPage.qml</file>
<file>ui/connection/CertificateErrorDialog.qml</file>
<file>ui/devicepages/VentilationDevicePage.qml</file>
</qresource>
</RCC>

View File

@ -106,7 +106,32 @@ ApplicationWindow {
}
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) {
switch(name) {
case "light":
@ -173,6 +198,8 @@ ApplicationWindow {
return qsTr("Smartlocks")
case "irrigation":
return qsTr("Irrigation");
case "ventilation":
return qsTr("Ventilation")
case "uncategorized":
return qsTr("Uncategorized")
default:
@ -287,6 +314,8 @@ ApplicationWindow {
return Qt.resolvedUrl("images/stock_link.svg")
case "irrigation":
return Qt.resolvedUrl("images/irrigation.svg")
case "ventilation":
return Qt.resolvedUrl("images/ventilation.svg")
case "power":
return Qt.resolvedUrl("images/system-shutdown.svg")
case "account":
@ -318,7 +347,8 @@ ApplicationWindow {
"heating" : "gainsboro",
"thermostat": "dodgerblue",
"irrigation": "lightblue",
"windspeedsensor": "blue"
"windspeedsensor": "blue",
"ventilation": "lightblue"
}
function interfaceToColor(name) {
@ -354,6 +384,9 @@ ApplicationWindow {
case "irrigation":
//: Select ...
return qsTr("irrigation");
case "ventilation":
//: Select ...
return qsTr("ventilation");
case "power":
//: Select ...
return qsTr("switchable thing")
@ -438,6 +471,8 @@ ApplicationWindow {
page = "DoorbellDevicePage.qml";
} else if (interfaceList.indexOf("irrigation") >= 0) {
page = "IrrigationDevicePage.qml";
} else if (interfaceList.indexOf("ventilation") >= 0) {
page = "VentilationDevicePage.qml";
} else {
page = "GenericDevicePage.qml";
}

View 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);
}
}
}
}
}

View File

@ -150,6 +150,8 @@ MainPageTile {
case "awning":
case "extendedawning":
case "powersocket":
case "irrigation":
case "ventilation":
return buttonComponent
case "media":
return mediaControlComponent
@ -239,6 +241,8 @@ MainPageTile {
case "media":
return devicesProxy.get(0).name;
case "light":
case "irrigation":
case "ventilation":
case "powersocket":
var count = 0;
for (var i = 0; i < devicesProxy.count; i++) {
@ -294,6 +298,8 @@ MainPageTile {
switch (iface.name) {
case "media":
case "light":
case "irrigation":
case "ventilation":
return ""
case "garagegate":
case "blind":
@ -314,6 +320,8 @@ MainPageTile {
switch (iface.name) {
case "light":
case "media":
case "irrigation":
case "ventilation":
break;
case "garagegate":
case "shutter":
@ -350,6 +358,8 @@ MainPageTile {
switch (iface.name) {
case "media":
case "light":
case "irrigation":
case "ventilation":
return ""
case "garagegate":
case "blind":
@ -370,6 +380,8 @@ MainPageTile {
switch (iface.name) {
case "light":
case "media":
case "irrigation":
case "ventilation":
break;
case "garagegate":
case "shutter":
@ -414,6 +426,8 @@ MainPageTile {
""
case "light":
case "powersocket":
case "irrigation":
case "ventilation":
return "../images/system-shutdown.svg"
case "garagegate":
case "blind":
@ -433,6 +447,8 @@ MainPageTile {
switch (iface.name) {
case "light":
case "powersocket":
case "irrigation":
case "ventilation":
var allOff = true;
for (var i = 0; i < devicesProxy.count; i++) {
var device = devicesProxy.get(i);