add thermostat and media rule templates

This commit is contained in:
Michael Zanetti 2019-08-31 04:13:30 +02:00
parent 4441b458c6
commit 01277053f9
9 changed files with 154 additions and 24 deletions

View File

@ -21,10 +21,7 @@ RuleTemplates::RuleTemplates(QObject *parent) : QAbstractListModel(parent)
RuleTemplate* t; RuleTemplate* t;
EventDescriptorTemplate* evt; EventDescriptorTemplate* evt;
ParamDescriptor* evpt; ParamDescriptor* evpt;
StateEvaluatorTemplate* set;
RuleActionTemplate* rat; RuleActionTemplate* rat;
RuleActionTemplate* reat; // exit
RuleActionParamTemplate* rapt;
RuleActionParamTemplates* rapts; RuleActionParamTemplates* rapts;
QDir ruleTemplatesDir(":/ruletemplates"); QDir ruleTemplatesDir(":/ruletemplates");
@ -77,20 +74,7 @@ RuleTemplates::RuleTemplates(QObject *parent) : QAbstractListModel(parent)
// StateEvaluatorTemplate // StateEvaluatorTemplate
if (ruleTemplate.contains("stateEvaluatorTemplate")) { if (ruleTemplate.contains("stateEvaluatorTemplate")) {
QVariantMap stateEvaluatorTemplate = ruleTemplate.value("stateEvaluatorTemplate").toMap(); t->setStateEvaluatorTemplate(loadStateEvaluatorTemplate(ruleTemplate.value("stateEvaluatorTemplate").toMap()));
QVariantMap stateDescriptorTemplate = stateEvaluatorTemplate.value("stateDescriptorTemplate").toMap();
QMetaEnum selectionModeEnum = QMetaEnum::fromType<StateDescriptorTemplate::SelectionMode>();
QMetaEnum operatorEnum = QMetaEnum::fromType<StateDescriptorTemplate::ValueOperator>();
set = new StateEvaluatorTemplate(
new StateDescriptorTemplate(
stateDescriptorTemplate.value("interfaceName").toString(),
stateDescriptorTemplate.value("interfaceState").toString(),
stateDescriptorTemplate.value("selectionId").toInt(),
static_cast<StateDescriptorTemplate::SelectionMode>(selectionModeEnum.keyToValue(stateDescriptorTemplate.value("selectionMode", "SelectionModeAny").toByteArray().data())),
static_cast<StateDescriptorTemplate::ValueOperator>(operatorEnum.keyToValue(stateDescriptorTemplate.value("operator").toByteArray().data())),
stateDescriptorTemplate.value("value")));
t->setStateEvaluatorTemplate(set);
// TODO: Child evaluators not supported yet
} }
// RuleActionTemplates // RuleActionTemplates
@ -190,6 +174,35 @@ RuleTemplate *RuleTemplates::get(int index) const
return m_list.at(index); return m_list.at(index);
} }
StateEvaluatorTemplate *RuleTemplates::loadStateEvaluatorTemplate(const QVariantMap &stateEvaluatorTemplate) const
{
QVariantMap stateDescriptorTemplate = stateEvaluatorTemplate.value("stateDescriptorTemplate").toMap();
QMetaEnum selectionModeEnum = QMetaEnum::fromType<StateDescriptorTemplate::SelectionMode>();
QMetaEnum stateOperatorEnum = QMetaEnum::fromType<StateEvaluatorTemplate::StateOperator>();
QMetaEnum valueOperatorEnum = QMetaEnum::fromType<StateDescriptorTemplate::ValueOperator>();
StateEvaluatorTemplate::StateOperator stateOperator = StateEvaluatorTemplate::StateOperatorAnd;
if (stateEvaluatorTemplate.contains("stateOperatorTemplate")) {
stateOperator = static_cast<StateEvaluatorTemplate::StateOperator>(stateOperatorEnum.keyToValue(stateEvaluatorTemplate.value("stateOperatorTemplate").toByteArray().data()));
}
StateEvaluatorTemplate *set = new StateEvaluatorTemplate(
new StateDescriptorTemplate(
stateDescriptorTemplate.value("interfaceName").toString(),
stateDescriptorTemplate.value("interfaceState").toString(),
stateDescriptorTemplate.value("selectionId").toInt(),
static_cast<StateDescriptorTemplate::SelectionMode>(selectionModeEnum.keyToValue(stateDescriptorTemplate.value("selectionMode", "SelectionModeAny").toByteArray().data())),
static_cast<StateDescriptorTemplate::ValueOperator>(valueOperatorEnum.keyToValue(stateDescriptorTemplate.value("operator").toByteArray().data())),
stateDescriptorTemplate.value("value")),
stateOperator
);
foreach (const QVariant &childVariant, stateEvaluatorTemplate.value("childEvaluatorTemplates").toList()) {
QVariantMap childMap = childVariant.toMap();
set->childEvaluatorTemplates()->addStateEvaluatorTemplate(loadStateEvaluatorTemplate(childMap.value("stateEvaluatorTemplate").toMap()));
}
return set;
}
bool RuleTemplatesFilterModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const bool RuleTemplatesFilterModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{ {
Q_UNUSED(source_parent) Q_UNUSED(source_parent)
@ -212,7 +225,7 @@ bool RuleTemplatesFilterModel::filterAcceptsRow(int source_row, const QModelInde
} }
} }
if (!found) { if (!found) {
qDebug() << "Filtering out" << t->description() << "because required devices are not provided in filter proxy"; qDebug() << "Filtering out" << t->description() << "because required no device in the provided filter proxy implements" << toBeFound;
return false; return false;
} }
} }

View File

@ -28,6 +28,9 @@ public:
signals: signals:
void countChanged(); void countChanged();
private:
StateEvaluatorTemplate* loadStateEvaluatorTemplate(const QVariantMap &stateEvaluatorTemplate) const;
private: private:
QList<RuleTemplate*> m_list; QList<RuleTemplate*> m_list;
@ -65,6 +68,8 @@ signals:
void filterInterfaceNamesChanged(); void filterInterfaceNamesChanged();
void filterByDevicesChanged(); void filterByDevicesChanged();
void countChanged(); void countChanged();
private: private:
RuleTemplates* m_ruleTemplates = nullptr; RuleTemplates* m_ruleTemplates = nullptr;
QStringList m_filterInterfaceNames; QStringList m_filterInterfaceNames;

View File

@ -17,7 +17,7 @@ public:
QVariant data(const QModelIndex &index, int role) const override; QVariant data(const QModelIndex &index, int role) const override;
QHash<int, QByteArray> roleNames() const override; QHash<int, QByteArray> roleNames() const override;
void addStateEvaluator(StateEvaluator* stateEvaluator); Q_INVOKABLE void addStateEvaluator(StateEvaluator* stateEvaluator);
Q_INVOKABLE StateEvaluator* get(int index) const; Q_INVOKABLE StateEvaluator* get(int index) const;
// Caller takes ownership, is responsible for deleting // Caller takes ownership, is responsible for deleting

View File

@ -6,7 +6,8 @@
<file>ruletemplates/smartmetertemplates.json</file> <file>ruletemplates/smartmetertemplates.json</file>
<file>ruletemplates/presencesensortemplates.json</file> <file>ruletemplates/presencesensortemplates.json</file>
<file>ruletemplates/daylightsensor.json</file> <file>ruletemplates/daylightsensor.json</file>
<file>ruletemplates/lighttemplates.json</file> <file>ruletemplates/thermostattemplates.json</file>
<file>ruletemplates/mediatemplates.json</file>
<file>ruletemplates/doorbellruletemplates.json</file> <file>ruletemplates/doorbellruletemplates.json</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@ -1,3 +0,0 @@
{
}

View File

@ -0,0 +1,69 @@
{
"templates": [
{
"description": "Dim light while watching TV",
"ruleNameTemplate": "%0 dims %1 for movie time",
"stateEvaluatorTemplate": {
"stateDescriptorTemplate": {
"interfaceName": "mediaplayer",
"interfaceState": "playbackStatus",
"selectionId": 0,
"operator": "ValueOperatorEquals",
"value": "Playing"
},
"stateOperatorTemplate": "StateOperatorAnd",
"childEvaluatorTemplates": [
{
"stateEvaluatorTemplate": {
"stateDescriptorTemplate": {
"interfaceName": "mediaplayer",
"interfaceState": "playerType",
"selectionId": 0,
"operator": "ValueOperatorEquals",
"value": "video"
}
}
}
]
},
"ruleActionTemplates": [
{
"interfaceName": "dimmablelight",
"interfaceAction": "power",
"selectionId": 1,
"params": [
{
"name": "power",
"value": false
}
]
}
],
"ruleExitActionTemplates": [
{
"interfaceName": "dimmablelight",
"interfaceAction": "power",
"selectionId": 1,
"params": [
{
"name": "power",
"value": true
}
]
},
{
"interfaceName": "dimmablelight",
"interfaceAction": "brightness",
"selectionId": 1,
"params": [
{
"name": "brightness",
"value": "50"
}
]
}
]
}
]
}

View File

@ -0,0 +1,38 @@
{
"templates": [
{
"description": "Set temperature while I'm home",
"ruleNameTemplate": "Set temperature while I'm home",
"stateEvaluatorTemplate": {
"stateDescriptorTemplate": {
"interfaceName": "presencesensor",
"interfaceState": "isPresent",
"selectionId": 0,
"operator": "ValueOperatorEquals",
"value": true
}
},
"ruleActionTemplates": [
{
"interfaceName": "thermostat",
"interfaceAction": "targetTemperature",
"selectionId": 1
}
],
"ruleExitActionTemplates": [
{
"interfaceName": "thermostat",
"interfaceAction": "targetTemperature",
"selectionId": 1,
"params": [
{
"name": "targetTemperature",
"value": "16"
}
]
}
]
}
]
}

View File

@ -277,6 +277,9 @@ ApplicationWindow {
function interfaceToDisplayName(name) { function interfaceToDisplayName(name) {
switch (name) { switch (name) {
case "light": case "light":
case "dimmablelight":
case "colorlight":
case "colortemperaturelight":
return qsTr("light") return qsTr("light")
case "button": case "button":
return "button"; return "button";

View File

@ -265,10 +265,14 @@ Page {
return true; return true;
} }
stateEvaluator.stateOperator = stateEvaluatorTemplate.stateOperator; stateEvaluator.stateOperator = stateEvaluatorTemplate.stateOperator;
print("Added stateOperator", stateEvaluator.stateOperator)
if (stateEvaluatorTemplate.childEvaluatorTemplates.count > stateEvaluator.childEvaluators.count) { if (stateEvaluatorTemplate.childEvaluatorTemplates.count > stateEvaluator.childEvaluators.count) {
print("Adding more child evaluators. Have:", stateEvaluator.childEvaluators.count, "need:", stateEvaluatorTemplate.childEvaluatorTemplates.count)
print("getting", stateEvaluator.childEvaluators.count)
print("getting", stateEvaluatorTemplate.childEvaluatorTemplates.get(stateEvaluator.childEvaluators.count))
var childEvaluator = rule.createStateEvaluator(); var childEvaluator = rule.createStateEvaluator();
var more = fillStateEvaluatorFromTemplate(rule, ruleTemplate, childEvaluator, stateEvaluatorTemplate.childEvaluatorTemplates.get(stateEvaluator.childEvaluators.count))
stateEvaluator.childEvaluators.addStateEvaluator(childEvaluator); stateEvaluator.childEvaluators.addStateEvaluator(childEvaluator);
var more = fillStateEvaluatorFromTemplate(rule, ruleTemplate, childEvaluator, stateEvaluatorTemplate.childEvaluatorTemplates.get(stateEvaluator.childEvaluators.count-1))
return more; return more;
} }
return false; return false;