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")); 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());

View File

@ -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>

View File

@ -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:
@ -287,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":
@ -318,7 +347,8 @@ ApplicationWindow {
"heating" : "gainsboro", "heating" : "gainsboro",
"thermostat": "dodgerblue", "thermostat": "dodgerblue",
"irrigation": "lightblue", "irrigation": "lightblue",
"windspeedsensor": "blue" "windspeedsensor": "blue",
"ventilation": "lightblue"
} }
function interfaceToColor(name) { function interfaceToColor(name) {
@ -354,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")
@ -438,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";
} }

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 "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);