Skip to content

Commit

Permalink
add nodes to trigger read states
Browse files Browse the repository at this point in the history
  • Loading branch information
technyon committed Feb 14, 2023
1 parent 0bfeb96 commit 1a6e74e
Show file tree
Hide file tree
Showing 12 changed files with 140 additions and 23 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ file(GLOB SRCFILES
networkDevices/W5500Device.cpp
networkDevices/ClientSyncW5500.cpp
networkDevices/espMqttClientW5500.cpp
QueryCommand.h
NukiWrapper.cpp
NukiOpenerWrapper.cpp
MqttTopics.h
Expand Down
2 changes: 1 addition & 1 deletion Config.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#pragma once

#define NUKI_HUB_VERSION "8.8"
#define NUKI_HUB_VERSION "8.9-pre-1"

#define MQTT_QOS_LEVEL 1
#define MQTT_CLEAN_SESSIONS false
4 changes: 4 additions & 0 deletions MqttTopics.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@
#define mqtt_topic_battery_keypad_critical "/battery/keypadCritical"

#define mqtt_topic_lock_state "/lock/state"
#define mqtt_topic_query_config "/lock/query/config"
#define mqtt_topic_query_lockstate "/lock/query/lockstate"
#define mqtt_topic_query_keypad "/lock/query/keypad"
#define mqtt_topic_query_battery "/lock/query/battery"
#define mqtt_topic_lock_binary_state "/lock/binaryState"
#define mqtt_topic_lock_trigger "/lock/trigger"
#define mqtt_topic_lock_log "/lock/log"
Expand Down
36 changes: 36 additions & 0 deletions NetworkLock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,18 +57,27 @@ void NetworkLock::initialize()
_network->subscribe(_mqttPath, mqtt_topic_reset);
_network->initTopic(_mqttPath, mqtt_topic_reset, "0");

_network->initTopic(_mqttPath, mqtt_topic_query_config, "0");
_network->initTopic(_mqttPath, mqtt_topic_query_lockstate, "0");
_network->initTopic(_mqttPath, mqtt_topic_query_battery, "0");
_network->subscribe(_mqttPath, mqtt_topic_query_config);
_network->subscribe(_mqttPath, mqtt_topic_query_lockstate);
_network->subscribe(_mqttPath, mqtt_topic_query_battery);

if(_preferences->getBool(preference_keypad_control_enabled))
{
_network->subscribe(_mqttPath, mqtt_topic_keypad_command_action);
_network->subscribe(_mqttPath, mqtt_topic_keypad_command_id);
_network->subscribe(_mqttPath, mqtt_topic_keypad_command_name);
_network->subscribe(_mqttPath, mqtt_topic_keypad_command_code);
_network->subscribe(_mqttPath, mqtt_topic_keypad_command_enabled);
_network->subscribe(_mqttPath, mqtt_topic_query_keypad);
_network->initTopic(_mqttPath, mqtt_topic_keypad_command_action, "--");
_network->initTopic(_mqttPath, mqtt_topic_keypad_command_id, "0");
_network->initTopic(_mqttPath, mqtt_topic_keypad_command_name, "--");
_network->initTopic(_mqttPath, mqtt_topic_keypad_command_code, "000000");
_network->initTopic(_mqttPath, mqtt_topic_keypad_command_enabled, "1");
_network->initTopic(_mqttPath, mqtt_topic_query_keypad, "0");
}

_network->addReconnectedCallback([&]()
Expand Down Expand Up @@ -143,6 +152,26 @@ void NetworkLock::onMqttDataReceived(const char* topic, byte* payload, const uns
{
_keypadCommandEnabled = atoi(value);
}
else if(comparePrefixedPath(topic, mqtt_topic_query_config) && strcmp(value, "1") == 0)
{
_queryCommands = _queryCommands | QUERY_COMMAND_CONFIG;
publishString(mqtt_topic_query_config, "0");
}
else if(comparePrefixedPath(topic, mqtt_topic_query_lockstate) && strcmp(value, "1") == 0)
{
_queryCommands = _queryCommands | QUERY_COMMAND_LOCKSTATE;
publishString(mqtt_topic_query_lockstate, "0");
}
else if(comparePrefixedPath(topic, mqtt_topic_query_keypad) && strcmp(value, "1") == 0)
{
_queryCommands = _queryCommands | QUERY_COMMAND_KEYPAD;
publishString(mqtt_topic_query_keypad, "0");
}
else if(comparePrefixedPath(topic, mqtt_topic_query_battery) && strcmp(value, "1") == 0)
{
_queryCommands = _queryCommands | QUERY_COMMAND_BATTERY;
publishString(mqtt_topic_query_battery, "0");
}

for(auto configTopic : _configTopics)
{
Expand Down Expand Up @@ -569,3 +598,10 @@ bool NetworkLock::reconnected()
_reconnected = false;
return r;
}

uint8_t NetworkLock::queryCommands()
{
uint8_t qc = _queryCommands;
_queryCommands = 0;
return qc;
}
3 changes: 3 additions & 0 deletions NetworkLock.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "NukiConstants.h"
#include "NukiLockConstants.h"
#include "Network.h"
#include "QueryCommand.h"

class NetworkLock : public MqttReceiver
{
Expand Down Expand Up @@ -41,6 +42,7 @@ class NetworkLock : public MqttReceiver
void onMqttDataReceived(const char* topic, byte* payload, const unsigned int length) override;

bool reconnected();
uint8_t queryCommands();

private:
bool comparePrefixedPath(const char* fullPath, const char* subPath);
Expand Down Expand Up @@ -74,6 +76,7 @@ class NetworkLock : public MqttReceiver
String _keypadCommandCode = "";
uint _keypadCommandId = 0;
int _keypadCommandEnabled = 1;
uint8_t _queryCommands = 0;

bool (*_lockActionReceivedCallback)(const char* value) = nullptr;
void (*_configUpdateReceivedCallback)(const char* path, const char* value) = nullptr;
Expand Down
38 changes: 37 additions & 1 deletion NetworkOpener.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,18 +43,27 @@ void NetworkOpener::initialize()
_network->subscribe(_mqttPath, topic);
}

_network->initTopic(_mqttPath, mqtt_topic_query_config, "0");
_network->initTopic(_mqttPath, mqtt_topic_query_lockstate, "0");
_network->initTopic(_mqttPath, mqtt_topic_query_battery, "0");
_network->subscribe(_mqttPath, mqtt_topic_query_config);
_network->subscribe(_mqttPath, mqtt_topic_query_lockstate);
_network->subscribe(_mqttPath, mqtt_topic_query_battery);

if(_preferences->getBool(preference_keypad_control_enabled))
{
_network->subscribe(_mqttPath, mqtt_topic_keypad_command_action);
_network->subscribe(_mqttPath, mqtt_topic_keypad_command_id);
_network->subscribe(_mqttPath, mqtt_topic_keypad_command_name);
_network->subscribe(_mqttPath, mqtt_topic_keypad_command_code);
_network->subscribe(_mqttPath, mqtt_topic_keypad_command_enabled);
_network->subscribe(_mqttPath, mqtt_topic_query_keypad);
_network->initTopic(_mqttPath, mqtt_topic_keypad_command_action, "--");
_network->initTopic(_mqttPath, mqtt_topic_keypad_command_id, "0");
_network->initTopic(_mqttPath, mqtt_topic_keypad_command_name, "--");
_network->initTopic(_mqttPath, mqtt_topic_keypad_command_code, "000000");
_network->initTopic(_mqttPath, mqtt_topic_keypad_command_enabled, "1");
_network->initTopic(_mqttPath, mqtt_topic_query_keypad, "0");
}

_network->addReconnectedCallback([&]()
Expand Down Expand Up @@ -134,6 +143,26 @@ void NetworkOpener::onMqttDataReceived(const char* topic, byte* payload, const u
{
_keypadCommandEnabled = atoi(value);
}
else if(comparePrefixedPath(topic, mqtt_topic_query_config) && strcmp(value, "1") == 0)
{
_queryCommands = _queryCommands | QUERY_COMMAND_CONFIG;
publishString(mqtt_topic_query_config, "0");
}
else if(comparePrefixedPath(topic, mqtt_topic_query_lockstate) && strcmp(value, "1") == 0)
{
_queryCommands = _queryCommands | QUERY_COMMAND_LOCKSTATE;
publishString(mqtt_topic_query_lockstate, "0");
}
else if(comparePrefixedPath(topic, mqtt_topic_query_keypad) && strcmp(value, "1") == 0)
{
_queryCommands = _queryCommands | QUERY_COMMAND_KEYPAD;
publishString(mqtt_topic_query_keypad, "0");
}
else if(comparePrefixedPath(topic, mqtt_topic_query_battery) && strcmp(value, "1") == 0)
{
_queryCommands = _queryCommands | QUERY_COMMAND_BATTERY;
publishString(mqtt_topic_query_battery, "0");
}

for(auto configTopic : _configTopics)
{
Expand Down Expand Up @@ -611,4 +640,11 @@ bool NetworkOpener::reconnected()
bool r = _reconnected;
_reconnected = false;
return r;
}
}

uint8_t NetworkOpener::queryCommands()
{
uint8_t qc = _queryCommands;
_queryCommands = 0;
return qc;
}
2 changes: 2 additions & 0 deletions NetworkOpener.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ class NetworkOpener : public MqttReceiver
void onMqttDataReceived(const char* topic, byte* payload, const unsigned int length) override;

bool reconnected();
uint8_t queryCommands();

private:
bool comparePrefixedPath(const char* fullPath, const char* subPath);
Expand Down Expand Up @@ -79,6 +80,7 @@ class NetworkOpener : public MqttReceiver
uint _keypadCommandId = 0;
int _keypadCommandEnabled = 1;
unsigned long _resetLockStateTs = 0;
uint8_t _queryCommands = 0;

bool (*_lockActionReceivedCallback)(const char* value) = nullptr;
void (*_configUpdateReceivedCallback)(const char* path, const char* value) = nullptr;
Expand Down
32 changes: 23 additions & 9 deletions NukiOpenerWrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,8 @@ void NukiOpenerWrapper::update()

unsigned long ts = millis();
unsigned long lastReceivedBeaconTs = _nukiOpener.getLastReceivedBeaconTs();
uint8_t queryCommands = _network->queryCommands();

if(_restartBeaconTimeout > 0 &&
ts > 60000 &&
lastReceivedBeaconTs > 0 &&
Expand All @@ -147,18 +149,18 @@ void NukiOpenerWrapper::update()

_nukiOpener.updateConnectionState();

if(_statusUpdated || _nextLockStateUpdateTs == 0 || ts >= _nextLockStateUpdateTs)
if(_statusUpdated || _nextLockStateUpdateTs == 0 || ts >= _nextLockStateUpdateTs || (queryCommands & QUERY_COMMAND_LOCKSTATE) > 0)
{
_nextLockStateUpdateTs = ts + _intervalLockstate * 1000;
updateKeyTurnerState();
_statusUpdated = false;
}
if(_nextBatteryReportTs == 0 || ts > _nextBatteryReportTs)
if(_nextBatteryReportTs == 0 || ts > _nextBatteryReportTs || (queryCommands & QUERY_COMMAND_BATTERY) > 0)
{
_nextBatteryReportTs = ts + _intervalBattery * 1000;
updateBatteryState();
}
if(_nextConfigUpdateTs == 0 || ts > _nextConfigUpdateTs)
if(_nextConfigUpdateTs == 0 || ts > _nextConfigUpdateTs || (queryCommands & QUERY_COMMAND_CONFIG) > 0)
{
_nextConfigUpdateTs = ts + _intervalConfig * 1000;
updateConfig();
Expand All @@ -183,7 +185,7 @@ void NukiOpenerWrapper::update()
}
}

if(_hasKeypad && _keypadEnabled && (_nextKeypadUpdateTs == 0 || ts > _nextKeypadUpdateTs))
if(_hasKeypad && _keypadEnabled && (_nextKeypadUpdateTs == 0 || ts > _nextKeypadUpdateTs || (queryCommands & QUERY_COMMAND_KEYPAD) > 0))
{
_nextKeypadUpdateTs = ts + _intervalKeypad * 1000;
updateKeypad();
Expand Down Expand Up @@ -267,6 +269,7 @@ void NukiOpenerWrapper::unpair()

void NukiOpenerWrapper::updateKeyTurnerState()
{
Log->print(F("Querying opener state: "));
Nuki::CmdResult result =_nukiOpener.requestOpenerState(&_keyTurnerState);
if(result != Nuki::CmdResult::Success)
{
Expand Down Expand Up @@ -294,13 +297,12 @@ void NukiOpenerWrapper::updateKeyTurnerState()

if(_keyTurnerState.nukiState == NukiOpener::State::ContinuousMode)
{
Log->println(F("Nuki opener state: Continuous Mode"));
Log->println(F("Continuous Mode"));
}
else if(_keyTurnerState.lockState != _lastKeyTurnerState.lockState)
else
{
char lockStateStr[20];
lockstateToString(_keyTurnerState.lockState, lockStateStr);
Log->print(F("Nuki opener state: "));
Log->println(lockStateStr);
}
}
Expand All @@ -315,7 +317,9 @@ void NukiOpenerWrapper::updateKeyTurnerState()

void NukiOpenerWrapper::updateBatteryState()
{
Log->print("Querying opener battery state: ");
Nuki::CmdResult result = _nukiOpener.requestBatteryReport(&_batteryReport);
printCommandResult(result);
if(result == Nuki::CmdResult::Success)
{
_network->publishBatteryReport(_batteryReport);
Expand Down Expand Up @@ -369,8 +373,10 @@ void NukiOpenerWrapper::updateAuthData()

void NukiOpenerWrapper::updateKeypad()
{
Log->print(F("Querying opener keypad: "));
Nuki::CmdResult result = _nukiOpener.retrieveKeypadEntries(0, 0xffff);
if(result == 1)
printCommandResult(result);
if(result == Nuki::CmdResult::Success)
{
std::list<NukiLock::KeypadEntry> entries;
_nukiOpener.getKeypadEntries(&entries);
Expand All @@ -381,7 +387,7 @@ void NukiOpenerWrapper::updateKeypad()
if(keypadCount > _maxKeypadCodeCount)
{
_maxKeypadCodeCount = keypadCount;
_preferences->putUInt(preference_opener_max_keypad_code_count, _maxKeypadCodeCount);
_preferences->putUInt(preference_lock_max_keypad_code_count, _maxKeypadCodeCount);
}

_network->publishKeypad(entries, _maxKeypadCodeCount);
Expand All @@ -393,6 +399,7 @@ void NukiOpenerWrapper::updateKeypad()
_keypadCodeIds.push_back(entry.codeId);
}
}

postponeBleWatchdog();
}

Expand Down Expand Up @@ -653,3 +660,10 @@ void NukiOpenerWrapper::disableHASS()
Log->println(F("Unable to disable HASS. Invalid config received."));
}
}

void NukiOpenerWrapper::printCommandResult(Nuki::CmdResult result)
{
char resultStr[15];
NukiOpener::cmdResultToString(result, resultStr);
Log->println(resultStr);
}
2 changes: 2 additions & 0 deletions NukiOpenerWrapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ class NukiOpenerWrapper : public NukiOpener::SmartlockEventHandler

void setupHASS();

void printCommandResult(Nuki::CmdResult result);

NukiOpener::LockAction lockActionToEnum(const char* str); // char array at least 14 characters

std::string _deviceName;
Expand Down
Loading

0 comments on commit 1a6e74e

Please sign in to comment.