Add support for state based rule action params

This commit is contained in:
Michael Zanetti 2019-04-01 10:46:34 +02:00
parent aaa52e0359
commit d7d06eb84a
8 changed files with 65 additions and 13 deletions

View File

@ -372,7 +372,11 @@ void NymeaConnection::onDisconnected()
// Try to reconnect, only if we're not waiting for SSL certs to be trusted.
if (m_connectionStatus != ConnectionStatusSslUntrusted) {
connectInternal(m_currentHost);
QTimer::singleShot(1000, this, [this](){
if (m_currentHost) {
connectInternal(m_currentHost);
}
});
}
}

View File

@ -318,14 +318,8 @@ void JsonRpcClient::onInterfaceConnectedChanged(bool connected)
emit connectedChanged(false);
}
} else {
QVariantMap request;
request.insert("id", 0);
qDebug() << "Connected. Starting JSONRPC Handshake";
request.insert("method", "JSONRPC.Hello");
QVariantMap params;
params.insert("locale", QLocale().name());
request.insert("params", params);
// sendRequest(request);
sendCommand("JSONRPC.Hello", params, this, "helloReply");
}
}

View File

@ -304,11 +304,14 @@ QVariantList JsonTypes::packRuleActions(RuleActions *ruleActions)
} else {
ruleActionParam.insert("paramName", rap->paramName());
}
if (!rap->eventTypeId().isEmpty() && !rap->eventParamTypeId().isEmpty()) {
if (rap->isValueBased()) {
ruleActionParam.insert("value", rap->value());
} else if (rap->isEventParamBased()) {
ruleActionParam.insert("eventTypeId", rap->eventTypeId());
ruleActionParam.insert("eventParamTypeId", rap->eventParamTypeId());
} else {
ruleActionParam.insert("value", rap->value());
ruleActionParam.insert("stateDeviceId", rap->stateDeviceId());
ruleActionParam.insert("stateTypeId", rap->stateTypeId());
}
ruleActionParams.append(ruleActionParam);
}

View File

@ -297,6 +297,8 @@ RuleAction *RuleManager::parseRuleAction(const QVariantMap &ruleAction)
param->setValue(ruleActionParamVariant.toMap().value("value"));
param->setEventTypeId(ruleActionParamVariant.toMap().value("eventTypeId").toString());
param->setEventParamTypeId(ruleActionParamVariant.toMap().value("eventParamTypeId").toString());
param->setStateDeviceId(ruleActionParamVariant.toMap().value("stateDeviceId").toString());
param->setStateTypeId(ruleActionParamVariant.toMap().value("stateTypeId").toString());
ret->ruleActionParams()->addRuleActionParam(param);
}
return ret;

View File

@ -7,6 +7,8 @@ RuleActionParam::RuleActionParam(const QString &paramName, const QVariant &value
m_paramName(paramName)
{
setValue(value);
connect(this, &Param::valueChanged, this, &RuleActionParam::isValueBasedChanged);
}
RuleActionParam::RuleActionParam(QObject *parent) : Param(parent)
@ -37,6 +39,7 @@ void RuleActionParam::setEventTypeId(const QString &eventTypeId)
if (m_eventTypeId != eventTypeId) {
m_eventTypeId = eventTypeId;
emit eventTypeIdChanged();
emit isEventParamBasedChanged();
}
}
@ -50,6 +53,7 @@ void RuleActionParam::setEventParamTypeId(const QString &eventParamTypeId)
if (m_eventParamTypeId != eventParamTypeId) {
m_eventParamTypeId = eventParamTypeId;
emit eventParamTypeIdChanged();
emit isEventParamBasedChanged();
}
}
@ -63,6 +67,7 @@ void RuleActionParam::setStateDeviceId(const QString &stateDeviceId)
if (m_stateDeviceId != stateDeviceId) {
m_stateDeviceId = stateDeviceId;
emit stateDeviceIdChanged();
emit isStateValueBasedChanged();
}
}
@ -76,9 +81,25 @@ void RuleActionParam::setStateTypeId(const QString &stateTypeId)
if (m_stateTypeId != stateTypeId) {
m_stateTypeId = stateTypeId;
emit stateTypeIdChanged();
emit isStateValueBasedChanged();
}
}
bool RuleActionParam::isValueBased() const
{
return !m_value.isNull();
}
bool RuleActionParam::isEventParamBased() const
{
return !m_eventTypeId.isNull() && !m_eventParamTypeId.isNull();
}
bool RuleActionParam::isStateValueBased() const
{
return !m_stateDeviceId.isNull() && !m_stateTypeId.isNull();
}
RuleActionParam *RuleActionParam::clone() const
{
RuleActionParam *ret = new RuleActionParam();

View File

@ -15,6 +15,11 @@ class RuleActionParam : public Param
Q_PROPERTY(QString eventParamTypeId READ eventParamTypeId WRITE setEventParamTypeId NOTIFY eventParamTypeIdChanged)
Q_PROPERTY(QString stateDeviceId READ stateDeviceId WRITE setStateDeviceId NOTIFY stateDeviceIdChanged)
Q_PROPERTY(QString stateTypeId READ stateTypeId WRITE setStateTypeId NOTIFY stateTypeIdChanged)
Q_PROPERTY(bool isValueBased READ isValueBased NOTIFY isValueBasedChanged)
Q_PROPERTY(bool isEventParamBased READ isEventParamBased NOTIFY isEventParamBasedChanged)
Q_PROPERTY(bool isStateValueBased READ isStateValueBased NOTIFY isStateValueBasedChanged)
public:
explicit RuleActionParam(const QString &paramName, const QVariant &value, QObject *parent = nullptr);
explicit RuleActionParam(QObject *parent = nullptr);
@ -34,6 +39,10 @@ public:
QString stateTypeId() const;
void setStateTypeId(const QString &stateTypeId);
bool isValueBased() const;
bool isEventParamBased() const;
bool isStateValueBased() const;
RuleActionParam* clone() const;
bool operator==(RuleActionParam *other) const;
signals:
@ -43,6 +52,10 @@ signals:
void stateDeviceIdChanged();
void stateTypeIdChanged();
void isValueBasedChanged();
void isEventParamBasedChanged();
void isStateValueBasedChanged();
protected:
QString m_paramName;
QString m_eventTypeId;

View File

@ -28,10 +28,22 @@ MeaListItemDelegate {
var ret = [];
for (var i = 0; i < root.ruleAction.ruleActionParams.count; i++) {
var ruleActionParam = root.ruleAction.ruleActionParams.get(i)
print("populating subtext:", ruleActionParam.eventTypeId, ruleActionParam.eventParamTypeId)
var paramString = qsTr("%1: %2")
.arg(root.actionType.paramTypes.getParamType(ruleActionParam.paramTypeId).displayName)
.arg(ruleActionParam.eventParamTypeId.length > 0 ? qsTr("value from event") : ruleActionParam.value)
print("populating subtext:", ruleActionParam.eventTypeId, ruleActionParam.eventParamTypeId, ruleActionParam.stateDeviceId, ruleActionParam.stateTypeId, ruleActionParam.isValueBased, ruleActionParam.isEventParamBased, ruleActionParam.isStateValueBased)
var paramString = qsTr("%1: %2").arg(root.actionType.paramTypes.getParamType(ruleActionParam.paramTypeId).displayName)
if (ruleActionParam.isValueBased) {
paramString = paramString.arg(ruleActionParam.value)
} else if (ruleActionParam.isEventParamBased) {
paramString = paramString.arg(qsTr("value from event"))
} else if (ruleActionParam.isStateValueBased) {
var stateDevice = engine.deviceManager.devices.getDevice(ruleActionParam.stateDeviceId)
var stateType = stateDevice.deviceClass.stateTypes.getStateType(ruleActionParam.stateTypeId)
print("have state value based param:", stateDevice.name)
paramString = paramString.arg(stateDevice.name + "." + stateType.displayName)
}
ret.push(paramString)
}
return ret.join(', ')

View File

@ -147,6 +147,9 @@ Page {
statePickerDelegate.stateTypeId = stateTypeId;
})
})
page.backPressed.connect(function() {
pageStack.pop();
})
}
}
}