Add support for dynamic min/max state values

This commit is contained in:
Michael Zanetti 2021-09-30 11:48:45 +02:00
parent 5757cafd90
commit e9a9150ca2
3 changed files with 67 additions and 9 deletions

View File

@ -118,18 +118,26 @@ void ThingManager::notificationReceived(const QVariantMap &data)
{ {
qCDebug(dcThingManager()) << "ThingManager notifications received:" << qUtf8Printable(QJsonDocument::fromVariant(data).toJson()); qCDebug(dcThingManager()) << "ThingManager notifications received:" << qUtf8Printable(QJsonDocument::fromVariant(data).toJson());
QString notification = data.value("notification").toString(); QString notification = data.value("notification").toString();
QVariantMap params = data.value("params").toMap();
if (notification == "Integrations.StateChanged") { if (notification == "Integrations.StateChanged") {
Thing *thing = m_things->getThing(data.value("params").toMap().value("thingId").toUuid()); Thing *thing = m_things->getThing(params.value("thingId").toUuid());
if (!thing) { if (!thing) {
if (!m_fetchingData) { if (!m_fetchingData) {
qCWarning(dcThingManager()) << "Thing state change notification received for an unknown thing"; qCWarning(dcThingManager()) << "Thing state change notification received for an unknown thing";
} }
return; return;
} }
QUuid stateTypeId = data.value("params").toMap().value("stateTypeId").toUuid(); QUuid stateTypeId = params.value("stateTypeId").toUuid();
QVariant value = data.value("params").toMap().value("value"); QVariant value = params.value("value");
// qDebug() << "Thing state changed for:" << dev->name() << "State name:" << dev->thingClass()->stateTypes()->getStateType(stateTypeId) << "value:" << value; // qDebug() << "Thing state changed for:" << dev->name() << "State name:" << dev->thingClass()->stateTypes()->getStateType(stateTypeId) << "value:" << value;
thing->setStateValue(stateTypeId, value); State *state = thing->state(stateTypeId);
state->setValue(value);
if (params.contains("minValue")) {
state->setMinValue(params.value("minValue"));
}
if (params.contains("maxValue")) {
state->setMaxValue(params.value("maxValue"));
}
emit thingStateChanged(thing->id(), stateTypeId, value); emit thingStateChanged(thing->id(), stateTypeId, value);
} else if (notification == "Integrations.ThingAdded") { } else if (notification == "Integrations.ThingAdded") {
Thing *thing = unpackThing(this, data.value("params").toMap().value("thing").toMap(), m_thingClasses); Thing *thing = unpackThing(this, data.value("params").toMap().value("thing").toMap(), m_thingClasses);
@ -967,12 +975,24 @@ Thing* ThingManager::unpackThing(ThingManager *thingManager, const QVariantMap &
states = new States(thing); states = new States(thing);
} }
foreach (const QVariant &stateVariant, thingMap.value("states").toList()) { foreach (const QVariant &stateVariant, thingMap.value("states").toList()) {
State *state = states->getState(stateVariant.toMap().value("stateTypeId").toUuid()); QVariantMap stateMap = stateVariant.toMap();
State *state = states->getState(stateMap.value("stateTypeId").toUuid());
if (!state) { if (!state) {
state = new State(thing->id(), stateVariant.toMap().value("stateTypeId").toUuid(), stateVariant.toMap().value("value"), states); state = new State(thing->id(), stateMap.value("stateTypeId").toUuid(), stateMap.value("value"), states);
states->addState(state); states->addState(state);
} else { } else {
state->setValue(stateVariant.toMap().value("value")); state->setValue(stateMap.value("value"));
}
StateType *stateType = thing->thingClass()->stateTypes()->getStateType(state->stateTypeId());
if (stateMap.contains("minValue")) {
state->setMinValue(stateMap.value("minValue"));
} else {
state->setMinValue(stateType->minValue());
}
if (stateMap.contains("maxValue")) {
state->setMaxValue(stateMap.value("maxValue"));
} else {
state->setMaxValue(stateType->maxValue());
} }
} }
thing->setStates(states); thing->setStates(states);

View File

@ -57,7 +57,33 @@ QVariant State::value() const
void State::setValue(const QVariant &value) void State::setValue(const QVariant &value)
{ {
m_value = value; if (m_value != value) {
emit valueChanged(); m_value = value;
emit valueChanged();
}
} }
QVariant State::minValue() const
{
return m_minValue;
}
void State::setMinValue(const QVariant &minValue) {
if (m_minValue != minValue) {
m_minValue = minValue;
emit minValueChanged();
}
}
QVariant State::maxValue() const
{
return m_maxValue;
}
void State::setMaxValue(const QVariant &maxValue)
{
if (m_maxValue != maxValue) {
m_maxValue = maxValue;
emit maxValueChanged();
}
}

View File

@ -41,6 +41,8 @@ class State : public QObject
Q_PROPERTY(QUuid thingId READ thingId CONSTANT) Q_PROPERTY(QUuid thingId READ thingId CONSTANT)
Q_PROPERTY(QUuid stateTypeId READ stateTypeId CONSTANT) Q_PROPERTY(QUuid stateTypeId READ stateTypeId CONSTANT)
Q_PROPERTY(QVariant value READ value NOTIFY valueChanged) Q_PROPERTY(QVariant value READ value NOTIFY valueChanged)
Q_PROPERTY(QVariant minValue READ minValue NOTIFY minValueChanged)
Q_PROPERTY(QVariant maxValue READ maxValue NOTIFY maxValueChanged)
public: public:
explicit State(const QUuid &thingId, const QUuid &stateTypeId, const QVariant &value, QObject *parent = nullptr); explicit State(const QUuid &thingId, const QUuid &stateTypeId, const QVariant &value, QObject *parent = nullptr);
@ -51,13 +53,23 @@ public:
QVariant value() const; QVariant value() const;
void setValue(const QVariant &value); void setValue(const QVariant &value);
QVariant minValue() const;
void setMinValue(const QVariant &minValue);
QVariant maxValue() const;
void setMaxValue(const QVariant &maxValue);
private: private:
QUuid m_thingId; QUuid m_thingId;
QUuid m_stateTypeId; QUuid m_stateTypeId;
QVariant m_value; QVariant m_value;
QVariant m_minValue;
QVariant m_maxValue;
signals: signals:
void valueChanged(); void valueChanged();
void minValueChanged();
void maxValueChanged();
}; };