add thermostat and media rule templates
This commit is contained in:
parent
4441b458c6
commit
01277053f9
@ -21,10 +21,7 @@ RuleTemplates::RuleTemplates(QObject *parent) : QAbstractListModel(parent)
|
||||
RuleTemplate* t;
|
||||
EventDescriptorTemplate* evt;
|
||||
ParamDescriptor* evpt;
|
||||
StateEvaluatorTemplate* set;
|
||||
RuleActionTemplate* rat;
|
||||
RuleActionTemplate* reat; // exit
|
||||
RuleActionParamTemplate* rapt;
|
||||
RuleActionParamTemplates* rapts;
|
||||
|
||||
QDir ruleTemplatesDir(":/ruletemplates");
|
||||
@ -77,20 +74,7 @@ RuleTemplates::RuleTemplates(QObject *parent) : QAbstractListModel(parent)
|
||||
|
||||
// StateEvaluatorTemplate
|
||||
if (ruleTemplate.contains("stateEvaluatorTemplate")) {
|
||||
QVariantMap stateEvaluatorTemplate = 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
|
||||
t->setStateEvaluatorTemplate(loadStateEvaluatorTemplate(ruleTemplate.value("stateEvaluatorTemplate").toMap()));
|
||||
}
|
||||
|
||||
// RuleActionTemplates
|
||||
@ -190,6 +174,35 @@ RuleTemplate *RuleTemplates::get(int index) const
|
||||
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
|
||||
{
|
||||
Q_UNUSED(source_parent)
|
||||
@ -212,7 +225,7 @@ bool RuleTemplatesFilterModel::filterAcceptsRow(int source_row, const QModelInde
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -28,6 +28,9 @@ public:
|
||||
signals:
|
||||
void countChanged();
|
||||
|
||||
private:
|
||||
StateEvaluatorTemplate* loadStateEvaluatorTemplate(const QVariantMap &stateEvaluatorTemplate) const;
|
||||
|
||||
private:
|
||||
QList<RuleTemplate*> m_list;
|
||||
|
||||
@ -65,6 +68,8 @@ signals:
|
||||
void filterInterfaceNamesChanged();
|
||||
void filterByDevicesChanged();
|
||||
void countChanged();
|
||||
|
||||
|
||||
private:
|
||||
RuleTemplates* m_ruleTemplates = nullptr;
|
||||
QStringList m_filterInterfaceNames;
|
||||
|
||||
@ -17,7 +17,7 @@ public:
|
||||
QVariant data(const QModelIndex &index, int role) 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;
|
||||
|
||||
// Caller takes ownership, is responsible for deleting
|
||||
|
||||
@ -6,7 +6,8 @@
|
||||
<file>ruletemplates/smartmetertemplates.json</file>
|
||||
<file>ruletemplates/presencesensortemplates.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>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
{
|
||||
}
|
||||
|
||||
69
nymea-app/ruletemplates/mediatemplates.json
Normal file
69
nymea-app/ruletemplates/mediatemplates.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
38
nymea-app/ruletemplates/thermostattemplates.json
Normal file
38
nymea-app/ruletemplates/thermostattemplates.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@ -277,6 +277,9 @@ ApplicationWindow {
|
||||
function interfaceToDisplayName(name) {
|
||||
switch (name) {
|
||||
case "light":
|
||||
case "dimmablelight":
|
||||
case "colorlight":
|
||||
case "colortemperaturelight":
|
||||
return qsTr("light")
|
||||
case "button":
|
||||
return "button";
|
||||
|
||||
@ -265,10 +265,14 @@ Page {
|
||||
return true;
|
||||
}
|
||||
stateEvaluator.stateOperator = stateEvaluatorTemplate.stateOperator;
|
||||
print("Added stateOperator", stateEvaluator.stateOperator)
|
||||
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 more = fillStateEvaluatorFromTemplate(rule, ruleTemplate, childEvaluator, stateEvaluatorTemplate.childEvaluatorTemplates.get(stateEvaluator.childEvaluators.count))
|
||||
stateEvaluator.childEvaluators.addStateEvaluator(childEvaluator);
|
||||
var more = fillStateEvaluatorFromTemplate(rule, ruleTemplate, childEvaluator, stateEvaluatorTemplate.childEvaluatorTemplates.get(stateEvaluator.childEvaluators.count-1))
|
||||
return more;
|
||||
}
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user