@@ -4326,6 +4326,11 @@ void DeRestPluginPrivate::addSensorNode(const deCONZ::Node *node, const SensorFi
43264326 clusterId = MULTISTATE_INPUT_CLUSTER_ID;
43274327 }
43284328 sensorNode.addItem(DataTypeInt32, RStateButtonEvent);
4329+
4330+ if (modelId.startsWith(QLatin1String("lumi.sensor_cube")))
4331+ {
4332+ sensorNode.addItem(DataTypeInt32, RStateGesture);
4333+ }
43294334 }
43304335 else if (sensorNode.type().endsWith(QLatin1String("LightLevel")))
43314336 {
@@ -6196,6 +6201,7 @@ void DeRestPluginPrivate::updateSensorNode(const deCONZ::NodeEvent &event)
61966201 }
61976202
61986203 qint32 buttonevent = -1;
6204+ qint32 gesture = -1; //
61996205 ResourceItem *item = i->item(RStateButtonEvent);
62006206 int rawValue = ia->numericValue().u16;
62016207
@@ -6205,13 +6211,17 @@ void DeRestPluginPrivate::updateSensorNode(const deCONZ::NodeEvent &event)
62056211 static const int sideMap[] = {1, 3, 5, 6, 4, 2};
62066212 int side = sideMap[rawValue & 0x0007];
62076213 int previousSide = sideMap[(rawValue & 0x0038) >> 3];
6208- if (rawValue == 0x0002) { buttonevent = 7000; } // wakeup
6209- else if (rawValue == 0x0000) { buttonevent = 7007; } // shake
6210- else if (rawValue == 0x0003) { buttonevent = 7008; } // drop
6211- else if (rawValue & 0x0040) { buttonevent = side * 1000 + previousSide; } // flip 90°
6212- else if (rawValue & 0x0080) { buttonevent = side * 1000 + 7 - side; } // flip 180°
6213- else if (rawValue & 0x0100) { buttonevent = side * 1000; } // push
6214- else if (rawValue & 0x0200) { buttonevent = side * 1000 + side; } // double tap
6214+ if (rawValue == 0x0002) { buttonevent = 7000; } // wakeup
6215+ else if (rawValue == 0x0000) { buttonevent = 7007; gesture = GESTURE_SHAKE; } // shake
6216+ else if (rawValue == 0x0003) { buttonevent = 7008; gesture = GESTURE_DROP; } // drop
6217+ else if (rawValue & 0x0040) { buttonevent = side * 1000 + previousSide; // flip 90°
6218+ gesture = GESTURE_FLIP_90; }
6219+ else if (rawValue & 0x0080) { buttonevent = side * 1000 + 7 - side; // flip 180°
6220+ gesture = GESTURE_FLIP_180; }
6221+ else if (rawValue & 0x0100) { buttonevent = side * 1000; // push
6222+ gesture = GESTURE_PUSH; }
6223+ else if (rawValue & 0x0200) { buttonevent = side * 1000 + side; // double tap
6224+ gesture = GESTURE_DOUBLE_TAP; }
62156225 }
62166226 else if (i->modelId() == QLatin1String("lumi.sensor_switch.aq3"))
62176227 {
@@ -6262,13 +6272,28 @@ void DeRestPluginPrivate::updateSensorNode(const deCONZ::NodeEvent &event)
62626272 }
62636273 }
62646274 }
6275+
62656276 if (item && buttonevent != -1)
62666277 {
62676278 item->setValue(buttonevent);
62686279 i->updateStateTimestamp();
62696280 i->setNeedSaveDatabase(true);
62706281 Event e(RSensors, RStateButtonEvent, i->id(), item);
62716282 enqueueEvent(e);
6283+ }
6284+
6285+ item = (gesture != -1) ? i->item(RStateGesture) : nullptr;
6286+ if (item && gesture != -1)
6287+ {
6288+ item->setValue(gesture);
6289+ i->updateStateTimestamp();
6290+ i->setNeedSaveDatabase(true);
6291+ Event e(RSensors, RStateGesture, i->id(), item);
6292+ enqueueEvent(e);
6293+ }
6294+
6295+ if (gesture != -1 || buttonevent != -1) // something was updated
6296+ {
62726297 enqueueEvent(Event(RSensors, RStateLastUpdated, i->id()));
62736298 }
62746299
0 commit comments