diff --git a/libnymea-app-core/jsonrpc/jsonrpcclient.cpp b/libnymea-app-core/jsonrpc/jsonrpcclient.cpp
index 91773949..edf18a71 100644
--- a/libnymea-app-core/jsonrpc/jsonrpcclient.cpp
+++ b/libnymea-app-core/jsonrpc/jsonrpcclient.cpp
@@ -279,7 +279,7 @@ void JsonRpcClient::dataReceived(const QByteArray &data)
// qWarning() << "Could not parse json data from nymea" << m_receiveBuffer.left(splitIndex) << error.errorString();
return;
}
-// qDebug() << "received response" << m_receiveBuffer.left(splitIndex);
+// qDebug() << "received response" << qUtf8Printable(jsonDoc.toJson(QJsonDocument::Indented));
m_receiveBuffer = m_receiveBuffer.right(m_receiveBuffer.length() - splitIndex - 1);
if (!m_receiveBuffer.isEmpty()) {
staticMetaObject.invokeMethod(this, "dataReceived", Qt::QueuedConnection, Q_ARG(QByteArray, QByteArray()));
diff --git a/nymea-app/resources.qrc b/nymea-app/resources.qrc
index 7cca24d7..b5fafe89 100644
--- a/nymea-app/resources.qrc
+++ b/nymea-app/resources.qrc
@@ -160,21 +160,21 @@
ui/AboutPage.qml
ui/images/sort-listitem.svg
ui/devicepages/ShutterDevicePage.qml
- ui/images/shutter-1.svg
- ui/images/shutter-2.svg
- ui/images/shutter-3.svg
- ui/images/shutter-4.svg
- ui/images/shutter-5.svg
- ui/images/shutter-6.svg
- ui/images/shutter-7.svg
- ui/images/shutter-8.svg
- ui/images/shutter-9.svg
- ui/images/shutter-10.svg
+ ui/images/shutter/shutter-000.svg
+ ui/images/shutter/shutter-010.svg
+ ui/images/shutter/shutter-020.svg
+ ui/images/shutter/shutter-030.svg
+ ui/images/shutter/shutter-040.svg
+ ui/images/shutter/shutter-050.svg
+ ui/images/shutter/shutter-060.svg
+ ui/images/shutter/shutter-070.svg
+ ui/images/shutter/shutter-080.svg
+ ui/images/shutter/shutter-090.svg
+ ui/images/shutter/shutter-100.svg
ui/images/down.svg
ui/images/up.svg
ui/devicepages/GarageGateDevicePage.qml
ui/images/remove.svg
- ui/images/shutter-0.svg
ui/components/ShutterControls.qml
../LICENSE
ui/images/Built_with_Qt_RGB_logo.svg
@@ -214,5 +214,17 @@
ui/components/FancyHeader.qml
ui/connection/ManualConnectPage.qml
ui/connection/BluetoothDiscoveryPage.qml
+ ui/images/awning/awning-100.svg
+ ui/devicepages/AwningDevicePage.qml
+ ui/images/awning/awning-000.svg
+ ui/images/awning/awning-010.svg
+ ui/images/awning/awning-020.svg
+ ui/images/awning/awning-030.svg
+ ui/images/awning/awning-040.svg
+ ui/images/awning/awning-050.svg
+ ui/images/awning/awning-060.svg
+ ui/images/awning/awning-070.svg
+ ui/images/awning/awning-080.svg
+ ui/images/awning/awning-090.svg
diff --git a/nymea-app/ui/ConnectPage.qml b/nymea-app/ui/ConnectPage.qml
index 61fe1110..9f4d68f2 100644
--- a/nymea-app/ui/ConnectPage.qml
+++ b/nymea-app/ui/ConnectPage.qml
@@ -93,6 +93,7 @@ Page {
break;
case 2:
Engine.connection.connect("nymea://nymea.nymea.io:2222")
+ pageStack.push(connectingPage)
break;
}
}
diff --git a/nymea-app/ui/Nymea.qml b/nymea-app/ui/Nymea.qml
index d7a0e680..dd2da443 100644
--- a/nymea-app/ui/Nymea.qml
+++ b/nymea-app/ui/Nymea.qml
@@ -134,7 +134,7 @@ ApplicationWindow {
}
}
- property var supportedInterfaces: ["light", "weather", "sensor", "media", "garagegate", "shutter", "garagegate", "button", "notifications", "inputtrigger", "outputtrigger", "gateway"]
+ property var supportedInterfaces: ["light", "weather", "sensor", "media", "garagegate", "awning", "extendedawning", "shutter", "extendedshutter", "blind", "extendedblind", "button", "notifications", "inputtrigger", "outputtrigger", "gateway"]
function interfaceToString(name) {
switch(name) {
case "light":
@@ -160,9 +160,14 @@ ApplicationWindow {
case "outputtrigger":
return qsTr("Events");
case "shutter":
+ case "extendedshutter":
return qsTr("Shutters");
case "blind":
+ case "extendedblind":
return qsTr("Blinds");
+ case "awning":
+ case "extendedawning":
+ return qsTr("Awnings");
case "garagegate":
return qsTr("Garage gates");
case "uncategorized":
@@ -214,11 +219,13 @@ ApplicationWindow {
return Qt.resolvedUrl("images/attention.svg")
case "outputtrigger":
return Qt.resolvedUrl("images/send.svg")
- case "shutter":
- case "blind":
+ case "extendedshutter":
+ case "extendedblind":
return Qt.resolvedUrl("images/sort-listitem.svg")
case "garagegate":
- return Qt.resolvedUrl("images/shutter-10.svg")
+ return Qt.resolvedUrl("images/shutter/shutter-100.svg")
+ case "extendedawning":
+ return Qt.resolvedUrl("images/awning/awning-100.svg")
case "battery":
return Qt.resolvedUrl("images/battery/battery-050.svg")
case "uncategorized":
@@ -249,12 +256,14 @@ ApplicationWindow {
page = "SensorDevicePage.qml";
} else if (interfaceList.indexOf("inputtrigger") >= 0) {
page = "InputTriggerDevicePage.qml";
- } else if (interfaceList.indexOf("shutter") >= 0 ) {
- page = "ShutterDevicePage.qml";
} else if (interfaceList.indexOf("garagegate") >= 0 ) {
page = "GarageGateDevicePage.qml";
} else if (interfaceList.indexOf("light") >= 0) {
- page = "ColorLightDevicePage.qml"
+ page = "ColorLightDevicePage.qml";
+ } else if (interfaceList.indexOf("extendedshutter") >= 0 ) {
+ page = "ShutterDevicePage.qml";
+ } else if (interfaceList.indexOf("extendedawning") >= 0) {
+ page = "AwningDevicePage.qml";
} else {
page = "GenericDevicePage.qml";
}
@@ -262,6 +271,11 @@ ApplicationWindow {
return page;
}
+ function pad(num, size) {
+ var s = "000000000" + num;
+ return s.substr(s.length-size);
+ }
+
Component {
id: invalidVersionComponent
Popup {
diff --git a/nymea-app/ui/components/ShutterControls.qml b/nymea-app/ui/components/ShutterControls.qml
index 3751a058..f1a09f81 100644
--- a/nymea-app/ui/components/ShutterControls.qml
+++ b/nymea-app/ui/components/ShutterControls.qml
@@ -14,6 +14,8 @@ RowLayout {
readonly property var deviceClass: device ? Engine.deviceManager.deviceClasses.getDeviceClass(device.deviceClassId) : null
readonly property var openState: device ? device.states.getState(deviceClass.stateTypes.findByName("state").id) : null
+ property bool invert: false
+
Rectangle {
Layout.preferredWidth: app.iconSize * 2
Layout.preferredHeight: width
@@ -23,7 +25,7 @@ RowLayout {
ColorIcon {
anchors.fill: parent
anchors.margins: app.margins
- name: "../images/up.svg"
+ name: root.invert ? "../images/down.svg" : "../images/up.svg"
}
MouseArea {
anchors.fill: parent
@@ -57,7 +59,7 @@ RowLayout {
ColorIcon {
anchors.fill: parent
anchors.margins: app.margins
- name: "../images/down.svg"
+ name: root.invert ? "../images/up.svg" : "../images/down.svg"
}
MouseArea {
anchors.fill: parent
diff --git a/nymea-app/ui/devicepages/AwningDevicePage.qml b/nymea-app/ui/devicepages/AwningDevicePage.qml
new file mode 100644
index 00000000..1b8e38f3
--- /dev/null
+++ b/nymea-app/ui/devicepages/AwningDevicePage.qml
@@ -0,0 +1,82 @@
+import QtQuick 2.5
+import QtQuick.Controls 2.1
+import QtQuick.Controls.Material 2.2
+import QtQuick.Layouts 1.1
+import Nymea 1.0
+import "../components"
+import "../customviews"
+
+DevicePageBase {
+ id: root
+
+ readonly property bool landscape: width > height
+ readonly property bool isExtended: deviceClass.interfaces.indexOf("extendedawning") >= 0
+ readonly property var percentageState: isExtended ? device.states.getState(deviceClass.stateTypes.findByName("percentage").id) : 0
+ readonly property var movingState: isExtended ? device.states.getState(deviceClass.stateTypes.findByName("moving").id) : 0
+
+ GridLayout {
+ anchors.fill: parent
+ columns: root.landscape ? 2 : 1
+
+ ColorIcon {
+ id: shutterImage
+ Layout.preferredWidth: root.landscape ? Math.min(parent.width - shutterControlsContainer.width, parent.height) - app.margins : parent.width
+ Layout.preferredHeight: width
+ name: "../images/awning/awning-" + app.pad(Math.round(root.percentageState.value / 10) * 10, 3) + ".svg"
+ visible: isExtended
+ }
+
+
+ Item {
+ id: shutterControlsContainer
+ Layout.preferredWidth: root.landscape ? Math.max(parent.width / 2, shutterControls.implicitWidth) : parent.width
+ Layout.minimumWidth: shutterControls.implicitWidth
+ Layout.fillHeight: true
+ Layout.minimumHeight: app.iconSize * 2.5
+
+ Column {
+ anchors.centerIn: parent
+ width: parent.width - app.margins * 2
+ spacing: app.margins
+
+ Slider {
+ id: percentageSlider
+ width: parent.width
+ from: 0
+ to: 100
+ stepSize: 1
+ visible: isExtended
+
+ Binding {
+ target: percentageSlider
+ property: "value"
+ value: root.percentageState.value
+ when: root.movingState.value === false
+ }
+
+ onPressedChanged: {
+ if (!pressed) {
+ return
+ }
+
+ var actionType = root.deviceClass.actionTypes.findByName("percentage");
+ var params = [];
+ var percentageParam = {}
+ percentageParam["paramTypeId"] = actionType.paramTypes.findByName("percentage").id;
+ percentageParam["value"] = value
+ params.push(percentageParam);
+ Engine.deviceManager.executeAction(root.device.id, actionType.id, params);
+ }
+ }
+
+ ShutterControls {
+ id: shutterControls
+ device: root.device
+ invert: true
+ anchors.horizontalCenter: parent.horizontalCenter
+ }
+ }
+
+ }
+ }
+}
diff --git a/nymea-app/ui/devicepages/GarageGateDevicePage.qml b/nymea-app/ui/devicepages/GarageGateDevicePage.qml
index 2ae01c55..b82b7011 100644
--- a/nymea-app/ui/devicepages/GarageGateDevicePage.qml
+++ b/nymea-app/ui/devicepages/GarageGateDevicePage.qml
@@ -23,9 +23,9 @@ DevicePageBase {
id: shutterImage
Layout.preferredWidth: root.landscape ? Math.min(parent.width - shutterControlsContainer.width, parent.height) - app.margins : parent.width
Layout.preferredHeight: width
- property int currentImage: root.openState.value === "closed" ? 10 :
- root.openState.value === "open" && root.intermediatePositionState.value === false ? 0 : 5
- name: "../images/shutter-" + currentImage + ".svg"
+ property string currentImage: root.openState.value === "closed" ? "100" :
+ root.openState.value === "open" && root.intermediatePositionState.value === false ? "000" : "050"
+ name: "../images/shutter/shutter-" + currentImage + ".svg"
Item {
id: arrows
diff --git a/nymea-app/ui/devicepages/ShutterDevicePage.qml b/nymea-app/ui/devicepages/ShutterDevicePage.qml
index e4bb5c7c..af9cc202 100644
--- a/nymea-app/ui/devicepages/ShutterDevicePage.qml
+++ b/nymea-app/ui/devicepages/ShutterDevicePage.qml
@@ -1,5 +1,6 @@
import QtQuick 2.5
import QtQuick.Controls 2.1
+import QtQuick.Controls.Material 2.2
import QtQuick.Layouts 1.1
import Nymea 1.0
import "../components"
@@ -8,13 +9,71 @@ import "../customviews"
DevicePageBase {
id: root
+ readonly property bool landscape: width > height
+ readonly property bool isExtended: deviceClass.interfaces.indexOf("extendedshutter") >= 0
+ readonly property var percentageState: isExtended ? device.states.getState(deviceClass.stateTypes.findByName("percentage").id) : 0
+ readonly property var movingState: isExtended ? device.states.getState(deviceClass.stateTypes.findByName("moving").id) : 0
- ShutterControls {
- anchors {
- top: parent.top
- topMargin: app.iconSize
- horizontalCenter: parent.horizontalCenter
+ GridLayout {
+ anchors.fill: parent
+ columns: root.landscape ? 2 : 1
+
+ ColorIcon {
+ id: shutterImage
+ Layout.preferredWidth: root.landscape ? Math.min(parent.width - shutterControlsContainer.width, parent.height) - app.margins : parent.width
+ Layout.preferredHeight: width
+ name: "../images/shutter/shutter-" + app.pad(Math.round(root.percentageState.value / 10) * 10, 3) + ".svg"
+ visible: isExtended
+ }
+
+ Item {
+ id: shutterControlsContainer
+ Layout.preferredWidth: root.landscape ? Math.max(parent.width / 2, shutterControls.implicitWidth) : parent.width
+ Layout.minimumWidth: shutterControls.implicitWidth
+ Layout.fillHeight: true
+ Layout.minimumHeight: app.iconSize * 2.5
+
+ Column {
+ anchors.centerIn: parent
+ width: parent.width - app.margins * 2
+ spacing: app.margins
+
+ Slider {
+ id: percentageSlider
+ width: parent.width
+ from: 0
+ to: 100
+ stepSize: 1
+ visible: isExtended
+
+ Binding {
+ target: percentageSlider
+ property: "value"
+ value: root.percentageState.value
+ when: root.movingState.value === false
+ }
+
+ onPressedChanged: {
+ if (pressed) {
+ return;
+ }
+
+ var actionType = root.deviceClass.actionTypes.findByName("percentage");
+ var params = [];
+ var percentageParam = {}
+ percentageParam["paramTypeId"] = actionType.paramTypes.findByName("percentage").id;
+ percentageParam["value"] = value
+ params.push(percentageParam);
+ Engine.deviceManager.executeAction(root.device.id, actionType.id, params);
+ }
+ }
+
+ ShutterControls {
+ id: shutterControls
+ device: root.device
+ anchors.horizontalCenter: parent.horizontalCenter
+ }
+ }
}
- device: root.device
}
}
diff --git a/nymea-app/ui/images/awning/awning-000.svg b/nymea-app/ui/images/awning/awning-000.svg
new file mode 100644
index 00000000..78f1fce6
--- /dev/null
+++ b/nymea-app/ui/images/awning/awning-000.svg
@@ -0,0 +1,71 @@
+
+
+
+
diff --git a/nymea-app/ui/images/awning/awning-010.svg b/nymea-app/ui/images/awning/awning-010.svg
new file mode 100644
index 00000000..708e9f7f
--- /dev/null
+++ b/nymea-app/ui/images/awning/awning-010.svg
@@ -0,0 +1,125 @@
+
+
+
+
diff --git a/nymea-app/ui/images/awning/awning-020.svg b/nymea-app/ui/images/awning/awning-020.svg
new file mode 100644
index 00000000..f844d3a6
--- /dev/null
+++ b/nymea-app/ui/images/awning/awning-020.svg
@@ -0,0 +1,125 @@
+
+
+
+
diff --git a/nymea-app/ui/images/awning/awning-030.svg b/nymea-app/ui/images/awning/awning-030.svg
new file mode 100644
index 00000000..05c2d822
--- /dev/null
+++ b/nymea-app/ui/images/awning/awning-030.svg
@@ -0,0 +1,125 @@
+
+
+
+
diff --git a/nymea-app/ui/images/awning/awning-040.svg b/nymea-app/ui/images/awning/awning-040.svg
new file mode 100644
index 00000000..1b5a8a97
--- /dev/null
+++ b/nymea-app/ui/images/awning/awning-040.svg
@@ -0,0 +1,125 @@
+
+
+
+
diff --git a/nymea-app/ui/images/awning/awning-050.svg b/nymea-app/ui/images/awning/awning-050.svg
new file mode 100644
index 00000000..1f8b86b3
--- /dev/null
+++ b/nymea-app/ui/images/awning/awning-050.svg
@@ -0,0 +1,125 @@
+
+
+
+
diff --git a/nymea-app/ui/images/awning/awning-060.svg b/nymea-app/ui/images/awning/awning-060.svg
new file mode 100644
index 00000000..ceb376c4
--- /dev/null
+++ b/nymea-app/ui/images/awning/awning-060.svg
@@ -0,0 +1,125 @@
+
+
+
+
diff --git a/nymea-app/ui/images/awning/awning-070.svg b/nymea-app/ui/images/awning/awning-070.svg
new file mode 100644
index 00000000..23880103
--- /dev/null
+++ b/nymea-app/ui/images/awning/awning-070.svg
@@ -0,0 +1,125 @@
+
+
+
+
diff --git a/nymea-app/ui/images/awning/awning-080.svg b/nymea-app/ui/images/awning/awning-080.svg
new file mode 100644
index 00000000..fc4ef304
--- /dev/null
+++ b/nymea-app/ui/images/awning/awning-080.svg
@@ -0,0 +1,125 @@
+
+
+
+
diff --git a/nymea-app/ui/images/awning/awning-090.svg b/nymea-app/ui/images/awning/awning-090.svg
new file mode 100644
index 00000000..57fb2191
--- /dev/null
+++ b/nymea-app/ui/images/awning/awning-090.svg
@@ -0,0 +1,125 @@
+
+
+
+
diff --git a/nymea-app/ui/images/awning/awning-100.svg b/nymea-app/ui/images/awning/awning-100.svg
new file mode 100644
index 00000000..3a470a26
--- /dev/null
+++ b/nymea-app/ui/images/awning/awning-100.svg
@@ -0,0 +1,125 @@
+
+
+
+
diff --git a/nymea-app/ui/images/shutter-0.svg b/nymea-app/ui/images/shutter/shutter-000.svg
similarity index 100%
rename from nymea-app/ui/images/shutter-0.svg
rename to nymea-app/ui/images/shutter/shutter-000.svg
diff --git a/nymea-app/ui/images/shutter-1.svg b/nymea-app/ui/images/shutter/shutter-010.svg
similarity index 100%
rename from nymea-app/ui/images/shutter-1.svg
rename to nymea-app/ui/images/shutter/shutter-010.svg
diff --git a/nymea-app/ui/images/shutter-2.svg b/nymea-app/ui/images/shutter/shutter-020.svg
similarity index 100%
rename from nymea-app/ui/images/shutter-2.svg
rename to nymea-app/ui/images/shutter/shutter-020.svg
diff --git a/nymea-app/ui/images/shutter-3.svg b/nymea-app/ui/images/shutter/shutter-030.svg
similarity index 100%
rename from nymea-app/ui/images/shutter-3.svg
rename to nymea-app/ui/images/shutter/shutter-030.svg
diff --git a/nymea-app/ui/images/shutter-4.svg b/nymea-app/ui/images/shutter/shutter-040.svg
similarity index 100%
rename from nymea-app/ui/images/shutter-4.svg
rename to nymea-app/ui/images/shutter/shutter-040.svg
diff --git a/nymea-app/ui/images/shutter-5.svg b/nymea-app/ui/images/shutter/shutter-050.svg
similarity index 100%
rename from nymea-app/ui/images/shutter-5.svg
rename to nymea-app/ui/images/shutter/shutter-050.svg
diff --git a/nymea-app/ui/images/shutter-6.svg b/nymea-app/ui/images/shutter/shutter-060.svg
similarity index 100%
rename from nymea-app/ui/images/shutter-6.svg
rename to nymea-app/ui/images/shutter/shutter-060.svg
diff --git a/nymea-app/ui/images/shutter-7.svg b/nymea-app/ui/images/shutter/shutter-070.svg
similarity index 100%
rename from nymea-app/ui/images/shutter-7.svg
rename to nymea-app/ui/images/shutter/shutter-070.svg
diff --git a/nymea-app/ui/images/shutter-8.svg b/nymea-app/ui/images/shutter/shutter-080.svg
similarity index 100%
rename from nymea-app/ui/images/shutter-8.svg
rename to nymea-app/ui/images/shutter/shutter-080.svg
diff --git a/nymea-app/ui/images/shutter-9.svg b/nymea-app/ui/images/shutter/shutter-090.svg
similarity index 100%
rename from nymea-app/ui/images/shutter-9.svg
rename to nymea-app/ui/images/shutter/shutter-090.svg
diff --git a/nymea-app/ui/images/shutter-10.svg b/nymea-app/ui/images/shutter/shutter-100.svg
similarity index 100%
rename from nymea-app/ui/images/shutter-10.svg
rename to nymea-app/ui/images/shutter/shutter-100.svg