Skip to content

Commit

Permalink
Support humidity sensor (cluster 0x0405)
Browse files Browse the repository at this point in the history
  • Loading branch information
manup committed Jun 23, 2017
1 parent f6f971f commit 2308fce
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 8 deletions.
13 changes: 13 additions & 0 deletions bindings.cpp
Expand Up @@ -536,6 +536,14 @@ bool DeRestPluginPrivate::sendConfigureReportingRequest(BindingTask &bt)
maxInterval = 300;
reportableChange16bit = 20;
}
else if (bt.binding.clusterId == RELATIVE_HUMIDITY_CLUSTER_ID)
{
dataType = deCONZ::Zcl16BitUint;
attributeId = 0x0000; // measured value
minInterval = 10;
maxInterval = 300;
reportableChange16bit = 20;
}
else if (bt.binding.clusterId == POWER_CONFIGURATION_CLUSTER_ID)
{
dataType = deCONZ::Zcl8BitUint;
Expand Down Expand Up @@ -755,6 +763,10 @@ void DeRestPluginPrivate::checkSensorBindingsForAttributeReporting(Sensor *senso
{
val = sensor->getZclValue(*i, 0x0000); // measured value
}
else if (*i == RELATIVE_HUMIDITY_CLUSTER_ID)
{
val = sensor->getZclValue(*i, 0x0000); // measured value
}
else if (*i == OCCUPANCY_SENSING_CLUSTER_ID)
{
val = sensor->getZclValue(*i, 0x0000); // occupied state
Expand Down Expand Up @@ -804,6 +816,7 @@ void DeRestPluginPrivate::checkSensorBindingsForAttributeReporting(Sensor *senso
case OCCUPANCY_SENSING_CLUSTER_ID:
case ILLUMINANCE_MEASUREMENT_CLUSTER_ID:
case TEMPERATURE_MEASUREMENT_CLUSTER_ID:
case RELATIVE_HUMIDITY_CLUSTER_ID:
case VENDOR_CLUSTER_ID:
{
DBG_Printf(DBG_INFO, "0x%016llX (%s) create binding for attribute reporting of cluster 0x%04X on endpoint 0x%02X\n",
Expand Down
6 changes: 3 additions & 3 deletions database.cpp
Expand Up @@ -1597,10 +1597,10 @@ static int sqliteLoadAllSensorsCallback(void *user, int ncols, char **colval , c
}
else if (sensor.type().endsWith(QLatin1String("Humidity")))
{
/*if (sensor.fingerPrint().hasInCluster(TEMPERATURE_MEASUREMENT_CLUSTER_ID))
if (sensor.fingerPrint().hasInCluster(RELATIVE_HUMIDITY_CLUSTER_ID))
{
clusterId = TEMPERATURE_MEASUREMENT_CLUSTER_ID;
}*/ // TODO add cluster info
clusterId = RELATIVE_HUMIDITY_CLUSTER_ID;
}
sensor.addItem(DataTypeInt32, RStateHumidity);
}
else if (sensor.type().endsWith(QLatin1String("Presence")))
Expand Down
79 changes: 74 additions & 5 deletions de_web_plugin.cpp
Expand Up @@ -2086,6 +2086,7 @@ void DeRestPluginPrivate::addSensorNode(const deCONZ::Node *node)
SensorFingerprint fpLightSensor;
SensorFingerprint fpPresenceSensor;
SensorFingerprint fpTemperatureSensor;
SensorFingerprint fpHumiditySensor;

{ // scan client clusters of endpoint
QList<deCONZ::ZclCluster>::const_iterator ci = i->outClusters().constBegin();
Expand Down Expand Up @@ -2199,6 +2200,12 @@ void DeRestPluginPrivate::addSensorNode(const deCONZ::Node *node)
}
break;

case RELATIVE_HUMIDITY_CLUSTER_ID:
{
fpHumiditySensor.inClusters.push_back(ci->id());
}
break;

default:
break;
}
Expand Down Expand Up @@ -2275,7 +2282,7 @@ void DeRestPluginPrivate::addSensorNode(const deCONZ::Node *node)
}
}

// ZBTemperature
// ZHATemperature
if (fpTemperatureSensor.hasInCluster(TEMPERATURE_MEASUREMENT_CLUSTER_ID))
{
fpTemperatureSensor.endpoint = i->endpoint();
Expand All @@ -2292,6 +2299,24 @@ void DeRestPluginPrivate::addSensorNode(const deCONZ::Node *node)
checkSensorNodeReachable(sensor);
}
}

// ZHAHumidity
if (fpHumiditySensor.hasInCluster(RELATIVE_HUMIDITY_CLUSTER_ID))
{
fpHumiditySensor.endpoint = i->endpoint();
fpHumiditySensor.deviceId = i->deviceId();
fpHumiditySensor.profileId = i->profileId();

sensor = getSensorNodeForFingerPrint(node->address().ext(), fpHumiditySensor, "ZHAHumidity");
if (!sensor || sensor->deletedState() != Sensor::StateNormal)
{
addSensorNode(node, fpHumiditySensor, "ZHAHumidity", modelId);
}
else
{
checkSensorNodeReachable(sensor);
}
}
}
}

Expand All @@ -2316,11 +2341,20 @@ void DeRestPluginPrivate::addSensorNode(const deCONZ::Node *node, const SensorFi
Sensor *sensor2 = 0;
if (node->endpoints().size() == 1)
{
sensor2 = getSensorNodeForAddressAndEndpoint(node->address(), fingerPrint.endpoint);
quint8 ep = node->endpoints()[0];
std::vector<Sensor>::iterator i = sensors.begin();
std::vector<Sensor>::iterator end = sensors.end();

if (sensor2 && sensor2->deletedState() != Sensor::StateNormal)
for (; i != end; ++i)
{
sensor2 = 0;
if (i->address().ext() == node->address().ext() &&
ep == i->fingerPrint().endpoint &&
i->deletedState() != Sensor::StateDeleted &&
i->type() == type)
{
sensor2 = &*i;
break;
}
}

if (sensor2)
Expand Down Expand Up @@ -2369,6 +2403,14 @@ void DeRestPluginPrivate::addSensorNode(const deCONZ::Node *node, const SensorFi
}
sensorNode.addItem(DataTypeInt32, RStateTemperature);
}
else if (sensorNode.type().endsWith(QLatin1String("Humidity")))
{
if (sensorNode.fingerPrint().hasInCluster(RELATIVE_HUMIDITY_CLUSTER_ID))
{
clusterId = RELATIVE_HUMIDITY_CLUSTER_ID;
}
sensorNode.addItem(DataTypeInt32, RStateHumidity);
}
else if (sensorNode.type().endsWith(QLatin1String("Presence")))
{
if (sensorNode.fingerPrint().hasInCluster(OCCUPANCY_SENSING_CLUSTER_ID))
Expand Down Expand Up @@ -2534,7 +2576,6 @@ void DeRestPluginPrivate::addSensorNode(const deCONZ::Node *node, const SensorFi
}
}


sensorNode.setNeedSaveDatabase(true);

if (sensor2)
Expand Down Expand Up @@ -2710,6 +2751,7 @@ void DeRestPluginPrivate::updateSensorNode(const deCONZ::NodeEvent &event)
{
case ILLUMINANCE_MEASUREMENT_CLUSTER_ID:
case TEMPERATURE_MEASUREMENT_CLUSTER_ID:
case RELATIVE_HUMIDITY_CLUSTER_ID:
case OCCUPANCY_SENSING_CLUSTER_ID:
case POWER_CONFIGURATION_CLUSTER_ID:
case BASIC_CLUSTER_ID:
Expand Down Expand Up @@ -2902,6 +2944,32 @@ void DeRestPluginPrivate::updateSensorNode(const deCONZ::NodeEvent &event)
}
}
}
else if (event.clusterId() == RELATIVE_HUMIDITY_CLUSTER_ID)
{
for (;ia != enda; ++ia)
{
if (ia->id() == 0x0000) // relative humidity
{
if (updateType != NodeValue::UpdateInvalid)
{
i->setZclValue(updateType, event.clusterId(), 0x0000, ia->numericValue());
}

int humidity = ia->numericValue().u16;
ResourceItem *item = i->item(RStateHumidity);

if (item)
{
item->setValue(humidity);
i->updateStateTimestamp();
Event e(RSensors, RStateHumidity, i->id());
enqueueEvent(e);
}

updateSensorEtag(&*i);
}
}
}
else if (event.clusterId() == OCCUPANCY_SENSING_CLUSTER_ID)
{
for (;ia != enda; ++ia)
Expand Down Expand Up @@ -5561,6 +5629,7 @@ void DeRestPluginPrivate::nodeEvent(const deCONZ::NodeEvent &event)
case ILLUMINANCE_MEASUREMENT_CLUSTER_ID:
case ILLUMINANCE_LEVEL_SENSING_CLUSTER_ID:
case TEMPERATURE_MEASUREMENT_CLUSTER_ID:
case RELATIVE_HUMIDITY_CLUSTER_ID:
case OCCUPANCY_SENSING_CLUSTER_ID:
case IAS_ZONE_CLUSTER_ID:
case BASIC_CLUSTER_ID:
Expand Down
1 change: 1 addition & 0 deletions de_web_plugin_private.h
Expand Up @@ -131,6 +131,7 @@
#define ILLUMINANCE_MEASUREMENT_CLUSTER_ID 0x0400
#define ILLUMINANCE_LEVEL_SENSING_CLUSTER_ID 0x0401
#define TEMPERATURE_MEASUREMENT_CLUSTER_ID 0x0402
#define RELATIVE_HUMIDITY_CLUSTER_ID 0x0405
#define OCCUPANCY_SENSING_CLUSTER_ID 0x0406
#define IAS_ZONE_CLUSTER_ID 0x0500
#define OTAU_CLUSTER_ID 0x0019
Expand Down

0 comments on commit 2308fce

Please sign in to comment.