Improve thermostat views

This commit is contained in:
Michael Zanetti 2021-01-02 13:04:16 +01:00
parent 51769fc6d1
commit 0e89d62db8
11 changed files with 826 additions and 69 deletions

View File

@ -251,5 +251,7 @@
<file>ui/images/discord.svg</file> <file>ui/images/discord.svg</file>
<file>ui/images/media/equalizer.svg</file> <file>ui/images/media/equalizer.svg</file>
<file>ui/images/media/ambeo.svg</file> <file>ui/images/media/ambeo.svg</file>
<file>ui/images/thermostat/cooling.svg</file>
<file>ui/images/thermostat/heating.svg</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@ -230,5 +230,7 @@
<file>ui/components/ColorTemperaturePicker.qml</file> <file>ui/components/ColorTemperaturePicker.qml</file>
<file>ui/components/ThingContextMenu.qml</file> <file>ui/components/ThingContextMenu.qml</file>
<file>ui/StyleBase.qml</file> <file>ui/StyleBase.qml</file>
<file>ui/customviews/ThermostatController.qml</file>
<file>ui/devicepages/ThermostatDevicePage.qml</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@ -69,6 +69,7 @@ ApplicationWindow {
property int smallFont: 13 property int smallFont: 13
property int mediumFont: 16 property int mediumFont: 16
property int largeFont: 20 property int largeFont: 20
property int hugeFont: 40
property int smallIconSize: 16 property int smallIconSize: 16
property int iconSize: 24 property int iconSize: 24
@ -145,6 +146,7 @@ ApplicationWindow {
"blind", "blind",
"garagedoor", "garagedoor",
"powersocket", "powersocket",
"thermostat",
"heating", "heating",
"smartlock", "smartlock",
"doorbell", "doorbell",
@ -218,6 +220,8 @@ ApplicationWindow {
return qsTr("Smart meters"); return qsTr("Smart meters");
case "heating": case "heating":
return qsTr("Heating"); return qsTr("Heating");
case "thermostat":
return qsTr("Thermostats");
case "evcharger": case "evcharger":
return qsTr("EV-chargers"); return qsTr("EV-chargers");
case "powersocket": case "powersocket":
@ -341,8 +345,9 @@ ApplicationWindow {
case "extendedsmartmeterproducer": case "extendedsmartmeterproducer":
return Qt.resolvedUrl("images/smartmeter.svg") return Qt.resolvedUrl("images/smartmeter.svg")
case "heating": case "heating":
case "extendedheating": return Qt.resolvedUrl("images/thermostat/heating.svg")
return Qt.resolvedUrl("images/radiator.svg") case "cooling":
return Qt.resolvedUrl("images/thermostat/cooling.svg")
case "thermostat": case "thermostat":
return Qt.resolvedUrl("images/dial.svg") return Qt.resolvedUrl("images/dial.svg")
case "evcharger": case "evcharger":

View File

@ -37,7 +37,8 @@ import QtQuick.Controls.Material 2.2
ColumnLayout { ColumnLayout {
id: dial id: dial
property Device device: null property Thing thing: null
property alias device: dial.thing
property StateType stateType: null property StateType stateType: null
property bool showValueLabel: true property bool showValueLabel: true
@ -53,14 +54,14 @@ ColumnLayout {
return (to - from) * angle / maxAngle + from return (to - from) * angle / maxAngle + from
} }
readonly property State deviceState: device && stateType ? device.states.getState(stateType.id) : null readonly property State deviceState: thing && stateType ? thing.states.getState(stateType.id) : null
readonly property double from: dial.stateType ? dial.stateType.minValue : 0 readonly property double from: dial.stateType ? dial.stateType.minValue : 0
readonly property double to: dial.stateType ? dial.stateType.maxValue : 100 readonly property double to: dial.stateType ? dial.stateType.maxValue : 100
readonly property double anglePerStep: maxAngle / dial.steps readonly property double anglePerStep: maxAngle / dial.steps
readonly property double startAngle: -(dial.steps * dial.anglePerStep) / 2 readonly property double startAngle: -(dial.steps * dial.anglePerStep) / 2
readonly property StateType powerStateType: dial.device.deviceClass.stateTypes.findByName("power") readonly property StateType powerStateType: dial.thing.thingClass.stateTypes.findByName("power")
readonly property State powerState: powerStateType ? dial.device.states.getState(powerStateType.id) : null readonly property State powerState: powerStateType ? dial.thing.states.getState(powerStateType.id) : null
QtObject { QtObject {
id: d id: d
@ -93,11 +94,11 @@ ColumnLayout {
param["paramName"] = dial.stateType.name param["paramName"] = dial.stateType.name
param["value"] = value param["value"] = value
params.push(param) params.push(param)
d.pendingActionId = dial.device.executeAction(dial.stateType.name, params) d.pendingActionId = dial.thing.executeAction(dial.stateType.name, params)
} }
} }
Connections { Connections {
target: engine.deviceManager target: engine.thingManager
onExecuteActionReply: { onExecuteActionReply: {
if (d.pendingActionId == commandId) { if (d.pendingActionId == commandId) {
d.pendingActionId = -1 d.pendingActionId = -1
@ -109,7 +110,7 @@ ColumnLayout {
} }
} }
Connections { Connections {
target: dial.device target: dial.thing
onActionExecutionFinished: { onActionExecutionFinished: {
if (id == d.pendingActionId) { if (id == d.pendingActionId) {
d.pendingActionId = -1; d.pendingActionId = -1;
@ -121,12 +122,12 @@ ColumnLayout {
} }
} }
Component.onCompleted: rotationButton.rotation = dial.valueToAngle(dial.deviceState.value) Component.onCompleted: rotationButton.rotation = dial.valueToAngle(dial.thingState.value)
Connections { Connections {
target: dial.deviceState target: dial.thingState
onValueChanged: { onValueChanged: {
if (!d.busy) { if (!d.busy) {
rotationButton.rotation = dial.valueToAngle(dial.deviceState.value) rotationButton.rotation = dial.valueToAngle(dial.thingState.value)
} }
} }
} }
@ -285,7 +286,7 @@ ColumnLayout {
param["paramName"] = "power" param["paramName"] = "power"
param["value"] = !dial.powerState.value param["value"] = !dial.powerState.value
params.push(param) params.push(param)
dial.device.executeAction("power", params) dial.thing.executeAction("power", params)
} }
dragging = false; dragging = false;
} }

View File

@ -0,0 +1,237 @@
import QtQuick 2.9
import Nymea 1.0
import "../utils"
import "../components"
Item {
id: root
property Thing thing: null
property double precision: 0.5
readonly property StateType targetTemperatureStateType: thing.thingClass.stateTypes.findByName("targetTemperature")
readonly property State targetTemperatureState: thing.stateByName("targetTemperature")
readonly property StateType temperatureStateType: thing.thingClass.stateTypes.findByName("temperature")
readonly property State temperatureState: thing.stateByName("temperature")
readonly property State heatingOnState: thing.stateByName("heatingOn")
readonly property State coolingOnState: thing.stateByName("coolingOn")
Connections {
target: targetTemperatureState
onValueChanged: canvas.requestPaint()
}
Connections {
target: temperatureState
onValueChanged: canvas.requestPaint()
}
ActionQueue {
id: actionQueue
thing: root.thing
stateType: targetTemperatureStateType
onPendingValueChanged: canvas.requestPaint();
}
Canvas {
id: canvas
width: Math.min(parent.width, parent.height)
height: width
anchors.centerIn: parent
property int startAngle: 135
property int maxAngle: 270
property int steps: roundToPrecision(root.targetTemperatureStateType.maxValue - root.targetTemperatureStateType.minValue) * (1/root.precision)
property double stepSize: (root.targetTemperatureStateType.maxValue - root.targetTemperatureStateType.minValue) / steps
property double anglePerStep: maxAngle / steps
function angleToValue(angle) {
var from = root.targetTemperatureStateType.minValue
var to = root.targetTemperatureStateType.maxValue
return (to - from) * angle / maxAngle + from
}
onPaint: {
var ctx = canvas.getContext('2d');
ctx.save();
ctx.reset()
var center = { x: canvas.width / 2, y: canvas.height / 2 };
var rotation = 135;
// Background arc
ctx.beginPath()
// ctx.strokeStyle = Style.tileBackgroundColor;
ctx.lineWidth = 0;
ctx.fillStyle = Style.tileBackgroundColor
var innerRadius = canvas.width * 0.4
var outerRadius = canvas.width * 0.5
var endAngle = (maxAngle + startAngle) % 360
var radStart = startAngle * Math.PI/180;
var radEnd = endAngle * Math.PI/180;
ctx.arc(center.x, center.y, outerRadius, radStart, radEnd)
ctx.arc(center.x, center.y, innerRadius, radEnd, radStart, true)
ctx.fill();
ctx.closePath();
// Step lines
var currentValue = actionQueue.pendingValue || root.targetTemperatureState.value
var targetTempStep = roundToPrecision(currentValue - root.targetTemperatureStateType.minValue) * (1/root.precision)
var currentTempStep;
if (root.temperatureState) {
currentTempStep = roundToPrecision(root.temperatureState.value - root.targetTemperatureStateType.minValue) * (1/root.precision)
}
for(var step = 0; step < steps; step += root.precision) {
var angle = step * anglePerStep + startAngle;
var innerRadius = canvas.width * 0.4
var outerRadius = canvas.width * 0.5
if (targetTempStep === step) {
if (currentTempStep && currentTempStep < targetTempStep) {
ctx.strokeStyle = "red";
} else if (currentTempStep && currentTempStep > targetTempStep) {
ctx.strokeStyle = "dodgerblue";
} else {
ctx.strokeStyle = Style.accentColor;
}
innerRadius = canvas.width * 0.38
ctx.lineWidth = 4;
} else if (currentTempStep && currentTempStep === step) {
if (currentTempStep < targetTempStep) {
ctx.strokeStyle = "red";
} else {
ctx.strokeStyle = "dodgerblue";
}
ctx.lineWidth = 3;
} else if (currentTempStep && currentTempStep < step && step < targetTempStep) {
ctx.strokeStyle = "red";
ctx.lineWidth = 2;
} else if (currentTempStep && currentTempStep > step && step > targetTempStep) {
ctx.strokeStyle = "dodgerblue";
ctx.lineWidth = 2;
} else {
ctx.strokeStyle = Style.tileOverlayColor;
ctx.lineWidth = 1;
}
ctx.beginPath();
// rotate
//convert to radians
var rad = angle * Math.PI/180;
var c = Math.cos(rad);
var s = Math.sin(rad);
var innerPointX = center.x + (innerRadius * c);
var innerPointY = center.y + (innerRadius * s);
var outerPointX = center.x + (outerRadius * c);
var outerPointY = center.x + (outerRadius * s);
context.moveTo(innerPointX, innerPointY);
context.lineTo(outerPointX, outerPointY);
ctx.stroke();
ctx.closePath();
}
ctx.beginPath();
ctx.font = "" + app.hugeFont + "px " + Style.fontFamily;
ctx.fillStyle = Style.foregroundColor;
var roundedTargetTemp = Types.toUiValue(root.targetTemperatureState.value, root.targetTemperatureStateType.unit)
roundedTargetTemp = roundToPrecision(roundedTargetTemp).toFixed(1) + "°"
var size = ctx.measureText(roundedTargetTemp)
ctx.text(roundedTargetTemp, center.x - size.width / 2, center.y + app.hugeFont / 2);
ctx.fill();
ctx.closePath();
if (root.temperatureState) {
ctx.beginPath();
ctx.font = "" + app.largeFont + "px " + Style.fontFamily;
var roundedTemp = Types.toUiValue(root.temperatureState.value, root.temperatureStateType.unit)
roundedTemp = roundToPrecision(roundedTemp) + "°"
size = ctx.measureText(roundedTemp)
ctx.text(roundedTemp, center.x - size.width / 2, center.y + app.hugeFont + app.margins);
ctx.fill();
ctx.closePath();
}
ctx.restore();
}
function roundToPrecision(value) {
var tmp = Math.round(value / root.precision) * root.precision;
return tmp;
}
}
ColorIcon {
width: app.largeIconSize
height: width
anchors { bottom: canvas.bottom; horizontalCenter: canvas.horizontalCenter }
name: root.heatingOnState && root.heatingOnState.value === true
? "../images/thermostat/heating.svg"
: root.coolingOnState && root.coolingOnState.value === true
? "../images/thermostat/cooling.svg"
: ""
color: root.heatingOnState && root.heatingOnState.value === true
? "red"
: root.coolingOnState && root.coolingOnState.value === true
? "dodgerblue"
: Style.iconColor
}
MouseArea {
anchors.fill: canvas
property bool dragging: false
property double lastAngle
property double angleDiff
onPressed: {
lastAngle = calculateAngle(mouseX, mouseY)
}
onPositionChanged: {
var angle = calculateAngle(mouseX, mouseY)
var tmpDiff = angle - lastAngle
if (tmpDiff > 300) {
tmpDiff -= 360
}
if (tmpDiff < -300) {
tmpDiff += 360
}
lastAngle = angle;
angleDiff += tmpDiff
var valueDiff = angleDiff / canvas.anglePerStep * canvas.stepSize
valueDiff = canvas.roundToPrecision(valueDiff)
if (Math.abs(valueDiff) > 0) {
var currentValue = actionQueue.pendingValue || root.targetTemperatureState.value
var newValue = currentValue + valueDiff
newValue = Math.min(root.targetTemperatureStateType.maxValue, Math.max(root.targetTemperatureStateType.minValue, newValue))
if (currentValue !== newValue) {
actionQueue.sendValue(newValue)
}
var steps = Math.floor(valueDiff / canvas.stepSize)
angleDiff -= steps * canvas.anglePerStep
}
}
function calculateAngle(mouseX, mouseY) {
// transform coords to center of dial
mouseX -= canvas.width / 2
mouseY -= canvas.height / 2
var rad = Math.atan(mouseY / mouseX);
var angle = rad * 180 / Math.PI
angle += 90;
if (mouseX < 0 && mouseY >= 0) angle = 180 + angle;
if (mouseX < 0 && mouseY < 0) angle = 180 + angle;
return angle;
}
}
}

View File

@ -167,6 +167,7 @@ MainPageTile {
case "extendedsmartmeterconsumer": case "extendedsmartmeterconsumer":
case "extendedsmartmeterproducer": case "extendedsmartmeterproducer":
case "heating": case "heating":
case "thermostat":
return sensorComponent; return sensorComponent;
// return labelComponent; // return labelComponent;

View File

@ -30,84 +30,61 @@
import QtQuick 2.5 import QtQuick 2.5
import QtQuick.Controls 2.1 import QtQuick.Controls 2.1
import QtQuick.Controls.Material 2.2
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import QtQuick.Controls.Material 2.1
import Nymea 1.0 import Nymea 1.0
import "../components" import "../components"
import "../customviews"
DevicePageBase { DevicePageBase {
id: root id: root
readonly property bool landscape: width > height readonly property var powerStateType: deviceClass.stateTypes.findByName("power")
readonly property var powerState: device.states.getState(powerStateType.id)
readonly property StateType targetTemperatureStateType: device.deviceClass.stateTypes.findByName("targetTemperature") readonly property var powerActionType: deviceClass.actionTypes.findByName("power");
readonly property State targetTemperatureState: targetTemperatureStateType ? device.states.getState(targetTemperatureStateType.id) : null
readonly property StateType powerStateType: deviceClass.stateTypes.findByName("power")
readonly property State powerState: powerStateType ? device.states.getState(powerStateType.id) : null
readonly property StateType temperatureStateType: device.deviceClass.stateTypes.findByName("temperature")
readonly property State temperatureState: temperatureStateType ? device.states.getState(temperatureStateType.id) : null
readonly property StateType percentageStateType: device.deviceClass.stateTypes.findByName("percentage")
readonly property State percentageState: percentageStateType ? device.states.getState(percentageStateType.id) : null
// TODO: should this be an interface? e.g. extendedthermostat
readonly property StateType boostStateType: device.deviceClass.stateTypes.findByName("boost")
readonly property State boostState: boostStateType ? device.states.getState(boostStateType.id) : null
Component.onCompleted: {
print("d:", root.device, root.targetTemperatureStateType, root.percentageStateType)
}
GridLayout { GridLayout {
anchors.fill: parent anchors.fill: parent
anchors.margins: app.margins anchors.margins: app.margins
columns: app.landscape ? 2 : 1 columns: app.landscape ? 2 : 1
rowSpacing: app.margins
columnSpacing: app.margins
Layout.alignment: Qt.AlignCenter
Dial { Item {
id: dial Layout.preferredWidth: Math.max(app.iconSize * 6, parent.width / 5)
Layout.fillWidth: true 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 Layout.fillHeight: true
// visible: root.targetTemperatureStateType || root.percentageStateType
device: root.device AbstractButton {
stateType: root.targetTemperatureStateType ? root.targetTemperatureStateType : root.percentageStateType height: Math.min(parent.height, parent.width)
width: height
}
Rectangle {
Layout.preferredWidth: app.landscape ? parent.width / 2 : parent.width
Layout.preferredHeight: 50
visible: root.boostStateType
border.color: boostMouseArea.pressed || root.boostStateType && root.boostState.value === true ? Style.accentColor : Style.foregroundColor
border.width: 1
radius: height / 2
color: root.boostStateType && root.boostState.value === true ? Style.accentColor : "transparent"
Row {
anchors.centerIn: parent anchors.centerIn: parent
spacing: app.margins / 2 Rectangle {
ColorIcon { anchors.fill: parent
height: app.iconSize color: "transparent"
width: app.iconSize border.color: root.powerState.value === true ? Style.accentColor : Style.iconColor
name: "../images/sensors/temperature.svg" border.width: 4
color: root.boostStateType && root.boostState.value === true ? "red" : Style.iconColor radius: width / 2
} }
Label { ColorIcon {
text: qsTr("Boost") id: bulbIcon
anchors.verticalCenter: parent.verticalCenter anchors.fill: parent
anchors.margins: app.margins * 1.5
name: "../images/thermostat/heating.svg"
color: root.powerState.value === true ? Style.accentColor : Style.iconColor
} }
}
MouseArea {
id: boostMouseArea
anchors.fill: parent
onPressedChanged: PlatformHelper.vibrate(PlatformHelper.HapticsFeedbackImpact)
onClicked: { onClicked: {
var params = [] var params = []
var param = {} var param = {}
param["paramTypeId"] = root.boostStateType.id param["paramTypeId"] = root.powerActionType.paramTypes.get(0).id;
param["value"] = !root.boostState.value param["value"] = !root.powerState.value;
params.push(param) params.push(param)
engine.deviceManager.executeAction(root.device.id, root.boostStateType.id, params); engine.deviceManager.executeAction(root.device.id, root.powerStateType.id, params);
} }
} }
} }

View File

@ -0,0 +1,106 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* 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.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 StateType targetTemperatureStateType: thing.thingClass.stateTypes.findByName("targetTemperature")
readonly property State targetTemperatureState: targetTemperatureStateType ? thing.states.getState(targetTemperatureStateType.id) : null
readonly property StateType powerStateType: thingClass.stateTypes.findByName("power")
readonly property State powerState: powerStateType ? thing.states.getState(powerStateType.id) : null
readonly property StateType temperatureStateType: thing.thingClass.stateTypes.findByName("temperature")
readonly property State temperatureState: temperatureStateType ? thing.states.getState(temperatureStateType.id) : null
readonly property StateType percentageStateType: thing.thingClass.stateTypes.findByName("percentage")
readonly property State percentageState: percentageStateType ? thing.states.getState(percentageStateType.id) : null
// TODO: should this be an interface? e.g. extendedthermostat
readonly property StateType boostStateType: thing.thingClass.stateTypes.findByName("boost")
readonly property State boostState: boostStateType ? thing.states.getState(boostStateType.id) : null
GridLayout {
anchors.fill: parent
anchors.margins: app.margins
columns: app.landscape ? 2 : 1
ThermostatController {
Layout.fillWidth: true
Layout.fillHeight: true
thing: root.thing
}
Rectangle {
Layout.preferredWidth: app.landscape ? parent.width / 2 : parent.width
Layout.preferredHeight: 50
visible: root.boostStateType
border.color: boostMouseArea.pressed || root.boostStateType && root.boostState.value === true ? Style.accentColor : Style.foregroundColor
border.width: 1
radius: height / 2
color: root.boostStateType && root.boostState.value === true ? Style.accentColor : "transparent"
Row {
anchors.centerIn: parent
spacing: app.margins / 2
ColorIcon {
height: app.iconSize
width: app.iconSize
name: "../images/sensors/temperature.svg"
color: root.boostStateType && root.boostState.value === true ? "red" : Style.iconColor
}
Label {
text: qsTr("Boost")
anchors.verticalCenter: parent.verticalCenter
}
}
MouseArea {
id: boostMouseArea
anchors.fill: parent
onPressedChanged: PlatformHelper.vibrate(PlatformHelper.HapticsFeedbackImpact)
onClicked: {
var params = []
var param = {}
param["paramTypeId"] = root.boostStateType.id
param["value"] = !root.boostState.value
params.push(param)
engine.thingManager.executeAction(root.thing.id, root.boostStateType.id, params);
}
}
}
}
}

View File

@ -0,0 +1,231 @@
<?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-snow.svg">
<defs
id="defs4876" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6199993"
inkscape:cx="21.788253"
inkscape:cy="54.937708"
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 415.56641,392.05273 -3.22657,2.36524 11.52735,15.71484 3.22656,-2.36719 -11.52734,-15.71289 z"
id="path4236"
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 423.86719,376.54688 -11.52735,15.71484 3.22657,2.36523 11.52734,-15.71289 -3.22656,-2.36718 z"
id="path4238"
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 364.39258,392.05273 -11.52735,15.71289 3.22657,2.36719 11.52734,-15.71484 -3.22656,-2.36524 z"
id="path4240"
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 356.0918,376.54688 -3.22657,2.36718 11.52735,15.71289 3.22656,-2.36523 -11.52734,-15.71484 z"
id="path4242"
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 421.01758,368.4375 -19.37696,2.12305 0.43555,3.97656 19.37695,-2.12305 -0.43554,-3.97656 z"
id="path4172"
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 396.01953,354.01172 -3.66015,1.61133 7.8496,17.83593 3.66211,-1.61132 -7.85156,-17.83594 z"
id="path4174"
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 379.71484,413.25 -3.66015,1.61133 7.84961,17.83594 3.66211,-1.61133 -7.85157,-17.83594 z"
id="path4176"
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 377.84766,412.17188 -19.37696,2.12304 0.43555,3.97656 19.37695,-2.12304 -0.43554,-3.97656 z"
id="path4178"
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 383.9082,354.0332 -7.84961,17.83594 3.66016,1.61328 7.85156,-17.83789 -3.66211,-1.61133 z"
id="path4184"
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 358.91016,368.45898 -0.43555,3.97852 19.37695,2.12305 0.43555,-3.97852 -19.37695,-2.12305 z"
id="path4186"
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 402.08008,412.19336 -0.43555,3.97656 19.37695,2.12305 0.43555,-3.97656 -19.37695,-2.12305 z"
id="path4188"
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 400.21289,413.27148 -7.84961,17.8379 3.66016,1.61132 7.85156,-17.83789 -3.66211,-1.61133 z"
id="path4190"
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;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.00079155;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 345.9668,391.36133 0,4.00195 88.0332,0 0.50007,-4.00195 z"
id="path4217"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<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.00079155;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 410.25977,354.25586 -44.01758,76.21094 3.46484,2.00195 44.01758,-76.21094 -3.46484,-2.00195 z"
id="path4219"
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.00079155;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 369.70703,354.25586 -3.46484,2.00195 44.01758,76.21094 3.46484,-2.00195 -44.01758,-76.21094 z"
id="path4221"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -0,0 +1,193 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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="1.0.1 (1.0.1+r74)"
viewBox="0 0 96 96.000001"
sodipodi:docname="heating.svg">
<defs
id="defs4876" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.245269"
inkscape:cx="90.885132"
inkscape:cy="30.463907"
inkscape:document-units="px"
inkscape:current-layer="g4780"
showgrid="true"
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:locked="false"
inkscape:document-rotation="0"
inkscape:window-width="1380"
inkscape:window-height="873"
inkscape:window-x="60"
inkscape:window-y="27"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid5451"
empspacing="8" />
<sodipodi:guide
orientation="1,0"
position="8,-8.0000001"
id="guide4063"
inkscape:locked="false" />
<sodipodi:guide
orientation="1,0"
position="4,-8.0000001"
id="guide4065"
inkscape:locked="false" />
<sodipodi:guide
orientation="0,1"
position="-8,88.000001"
id="guide4067"
inkscape:locked="false" />
<sodipodi:guide
orientation="0,1"
position="-8,92.000001"
id="guide4069"
inkscape:locked="false" />
<sodipodi:guide
orientation="0,1"
position="104,4"
id="guide4071"
inkscape:locked="false" />
<sodipodi:guide
orientation="0,1"
position="-5,8.0000001"
id="guide4073"
inkscape:locked="false" />
<sodipodi:guide
orientation="1,0"
position="88,-8.0000001"
id="guide4077"
inkscape:locked="false" />
<sodipodi:guide
orientation="0,1"
position="-8,84.000001"
id="guide4074"
inkscape:locked="false" />
<sodipodi:guide
orientation="1,0"
position="12,-8.0000001"
id="guide4076"
inkscape:locked="false" />
<sodipodi:guide
orientation="1,0"
position="84,-8.0000001"
id="guide4080"
inkscape:locked="false" />
<sodipodi:guide
position="48,-8.0000001"
orientation="1,0"
id="guide4170"
inkscape:locked="false" />
<sodipodi:guide
position="-8,48"
orientation="0,1"
id="guide4172"
inkscape:locked="false" />
<sodipodi:guide
position="92,-8.0000001"
orientation="1,0"
id="guide4760"
inkscape:locked="false" />
<sodipodi:guide
position="115,12"
orientation="0,1"
id="guide4269"
inkscape:locked="false" />
</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;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;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;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:35.0587;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 353.8481,375.62826 c 4.51127,-4.50011 10.73477,-7.28703 17.61131,-7.30539 18.52405,1.03935 26.52722,17.03935 58.53988,24.91256 -1.1e-4,0.003 -0.005,0.0108 -0.008,0.0135 -0.002,0.003 -0.0108,0.008 -0.0135,0.0163 l -0.0163,0.0162 c -0.002,0.003 -0.008,0.0108 -0.008,0.0135 -31.96686,8.06729 -41.25206,24.68467 -58.3512,25.11489 -9.16872,0.0244 -17.19864,-4.88762 -21.58349,-12.22706 2.7374,2.44304 6.26672,3.92073 10.11771,3.91046 1.72033,-0.005 3.37088,-0.32156 4.91812,-0.87026 0.15735,-0.0558 0.31961,-0.10129 0.47482,-0.16223 1.31752,-0.42764 11.44887,-9.69851 27.79203,-15.6935 l 0.0934,-0.003 0.005,-0.0108 0.0135,-0.0108 0.008,-0.008 0.008,-0.008 c -0.008,-0.005 -0.019,-0.0135 -0.0301,-0.0217 0.0108,-0.005 0.019,-0.008 0.0303,-0.0135 l -0.008,-0.008 -0.008,-0.008 -0.0108,-0.0135 -0.003,-0.0108 -0.0934,-0.005 c -17.34846,-5.88391 -26.56285,-15.12908 -27.88283,-15.54974 -0.15573,-0.0598 -0.31801,-0.10427 -0.47558,-0.15952 -1.55041,-0.54039 -3.20262,-0.83993 -4.92291,-0.83536 -3.85099,0.0108 -7.36894,1.49781 -10.09199,3.95553 1.08552,-1.84068 2.3961,-3.53054 3.89995,-5.03048 z"
id="path4339"
sodipodi:nodetypes="cccccccccscccccccccccccccccsccc" />
<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;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;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;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:22.784;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 376.50844,359.07051 c 2.9318,-2.92454 6.97633,-4.73571 11.44527,-4.74764 12.03844,0.67545 17.23956,11.07356 38.044,16.19022 -7e-5,0.002 -0.003,0.007 -0.005,0.009 -10e-4,0.002 -0.007,0.005 -0.009,0.0106 l -0.0106,0.0105 c -0.001,0.002 -0.005,0.007 -0.005,0.009 -20.77468,5.24278 -26.80896,16.04211 -37.92138,16.3217 -5.95859,0.0159 -11.17708,-3.17637 -14.02672,-7.94614 1.77899,1.58769 4.07263,2.54801 6.57532,2.54134 1.11801,-0.003 2.19067,-0.20898 3.19619,-0.56557 0.10226,-0.0363 0.20771,-0.0658 0.30858,-0.10543 0.85623,-0.27792 7.44041,-6.30288 18.06153,-10.19892 l 0.0607,-0.002 0.003,-0.007 0.009,-0.007 0.005,-0.005 0.005,-0.005 c -0.005,-0.003 -0.0123,-0.009 -0.0196,-0.0141 0.007,-0.003 0.0124,-0.005 0.0197,-0.009 l -0.005,-0.005 -0.005,-0.005 -0.007,-0.009 -0.002,-0.007 -0.0607,-0.003 c -11.27445,-3.82384 -17.26271,-9.83211 -18.12055,-10.10549 -0.1012,-0.0389 -0.20666,-0.0678 -0.30907,-0.10367 -1.00758,-0.35119 -2.08132,-0.54586 -3.19931,-0.54289 -2.50268,0.007 -4.78893,0.9734 -6.55859,2.57063 0.70545,-1.19622 1.55718,-2.29443 2.5345,-3.26922 z"
id="path852"
sodipodi:nodetypes="cccccccccscccccccccccccccccsccc" />
<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;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;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;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:22.784;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 376.50844,403.07051 c 2.9318,-2.92454 6.97633,-4.73571 11.44527,-4.74764 12.03844,0.67545 17.23956,11.07356 38.044,16.19022 -7e-5,0.002 -0.003,0.007 -0.005,0.009 -10e-4,0.002 -0.007,0.005 -0.009,0.0106 l -0.0106,0.0105 c -0.001,0.002 -0.005,0.007 -0.005,0.009 -20.77468,5.24278 -26.80896,16.04211 -37.92138,16.3217 -5.95859,0.0159 -11.17708,-3.17637 -14.02672,-7.94614 1.77899,1.58769 4.07263,2.54801 6.57532,2.54134 1.11801,-0.003 2.19067,-0.20898 3.19619,-0.56557 0.10226,-0.0363 0.20771,-0.0658 0.30858,-0.10543 0.85623,-0.27792 7.44041,-6.30288 18.06153,-10.19892 l 0.0607,-0.002 0.003,-0.007 0.009,-0.007 0.005,-0.005 0.005,-0.005 c -0.005,-0.003 -0.0123,-0.009 -0.0196,-0.0141 0.007,-0.003 0.0124,-0.005 0.0197,-0.009 l -0.005,-0.005 -0.005,-0.005 -0.007,-0.009 -0.002,-0.007 -0.0607,-0.003 c -11.27445,-3.82384 -17.26271,-9.83211 -18.12055,-10.10549 -0.1012,-0.0389 -0.20666,-0.0678 -0.30907,-0.10367 -1.00758,-0.35119 -2.08132,-0.54586 -3.19931,-0.54289 -2.50268,0.007 -4.78893,0.9734 -6.55859,2.57063 0.70545,-1.19622 1.55718,-2.29443 2.5345,-3.26922 z"
id="path854"
sodipodi:nodetypes="cccccccccscccccccccccccccccsccc" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -27,8 +27,10 @@ Item {
page = "ButtonDevicePage.qml"; page = "ButtonDevicePage.qml";
} else if (interfaceList.indexOf("weather") >= 0) { } else if (interfaceList.indexOf("weather") >= 0) {
page = "WeatherDevicePage.qml"; page = "WeatherDevicePage.qml";
} else if (interfaceList.indexOf("heating") >= 0 || interfaceList.indexOf("thermostat") >= 0) { } else if (interfaceList.indexOf("heating") >= 0) {
page = "HeatingDevicePage.qml"; page = "HeatingDevicePage.qml";
} else if (interfaceList.indexOf("thermostat") >= 0) {
page = "ThermostatDevicePage.qml";
} else if (interfaceList.indexOf("sensor") >= 0) { } else if (interfaceList.indexOf("sensor") >= 0) {
page = "SensorDevicePage.qml"; page = "SensorDevicePage.qml";
} else if (interfaceList.indexOf("inputtrigger") >= 0) { } else if (interfaceList.indexOf("inputtrigger") >= 0) {