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;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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) {
|
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";
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user