add code to query authorization data

This commit is contained in:
technyon
2022-05-06 21:53:55 +02:00
parent a76874d54a
commit b2f8d9806f
7 changed files with 80 additions and 3 deletions

View File

@@ -7,7 +7,7 @@ project(nuki_hub CXX)
# ARDUHAL_LOG_LEVEL_NONE, define ARDUHAL_LOG_LEVEL_ERROR, define ARDUHAL_LOG_LEVEL_WARN, define ARDUHAL_LOG_LEVEL_INFO, # ARDUHAL_LOG_LEVEL_NONE, define ARDUHAL_LOG_LEVEL_ERROR, define ARDUHAL_LOG_LEVEL_WARN, define ARDUHAL_LOG_LEVEL_INFO,
# define ARDUHAL_LOG_LEVEL_DEBUG, define ARDUHAL_LOG_LEVEL_VERBOSE # define ARDUHAL_LOG_LEVEL_DEBUG, define ARDUHAL_LOG_LEVEL_VERBOSE
set(LOG_LEVEL ARDUHAL_LOG_LEVEL_NONE) set(LOG_LEVEL ARDUHAL_LOG_LEVEL_DEBUG)
include_directories(${PROJECT_NAME} include_directories(${PROJECT_NAME}
PRIVATE PRIVATE

View File

@@ -10,6 +10,8 @@
#define mqtt_topic_lock_state "/lock/state" #define mqtt_topic_lock_state "/lock/state"
#define mqtt_topic_lock_trigger "/lock/trigger" #define mqtt_topic_lock_trigger "/lock/trigger"
#define mqtt_topic_lock_auth_id "/lock/authorizationId"
#define mqtt_topic_lock_auth_name "/lock/authorizationName"
#define mqtt_topic_lock_completionStatus "/lock/completionStatus" #define mqtt_topic_lock_completionStatus "/lock/completionStatus"
#define mqtt_topic_lock_action_command_result "/lock/commandResult" #define mqtt_topic_lock_action_command_result "/lock/commandResult"
#define mqtt_topic_door_sensor_state "/lock/doorSensorState" #define mqtt_topic_door_sensor_state "/lock/doorSensorState"

View File

@@ -286,6 +286,12 @@ void Network::publishKeyTurnerState(const Nuki::KeyTurnerState& keyTurnerState,
_firstTunerStatePublish = false; _firstTunerStatePublish = false;
} }
void Network::publishAuthorizationInfo(const uint32_t authId, const char *authName)
{
publishUInt(mqtt_topic_lock_auth_id, authId);
publishString(mqtt_topic_lock_auth_name, authName);
}
void Network::publishCommandResult(const char *resultStr) void Network::publishCommandResult(const char *resultStr)
{ {
publishString(mqtt_topic_lock_action_command_result, resultStr); publishString(mqtt_topic_lock_action_command_result, resultStr);
@@ -338,7 +344,6 @@ void Network::publishFloat(const char* topic, const float value, const uint8_t p
void Network::publishInt(const char *topic, const int value) void Network::publishInt(const char *topic, const int value)
{ {
char str[30]; char str[30];
itoa(value, str, 10); itoa(value, str, 10);
char path[200] = {0}; char path[200] = {0};
@@ -346,6 +351,15 @@ void Network::publishInt(const char *topic, const int value)
_device->mqttClient()->publish(path, str); _device->mqttClient()->publish(path, str);
} }
void Network::publishUInt(const char *topic, const unsigned int value)
{
char str[30];
utoa(value, str, 10);
char path[200] = {0};
buildMqttPath(topic, path);
_device->mqttClient()->publish(path, str);
}
void Network::publishBool(const char *topic, const bool value) void Network::publishBool(const char *topic, const bool value)
{ {
char str[2] = {0}; char str[2] = {0};

View File

@@ -29,6 +29,7 @@ public:
bool isMqttConnected(); bool isMqttConnected();
void publishKeyTurnerState(const Nuki::KeyTurnerState& keyTurnerState, const Nuki::KeyTurnerState& lastKeyTurnerState); void publishKeyTurnerState(const Nuki::KeyTurnerState& keyTurnerState, const Nuki::KeyTurnerState& lastKeyTurnerState);
void publishAuthorizationInfo(const uint32_t authId, const char* authName);
void publishCommandResult(const char* resultStr); void publishCommandResult(const char* resultStr);
void publishBatteryReport(const Nuki::BatteryReport& batteryReport); void publishBatteryReport(const Nuki::BatteryReport& batteryReport);
void publishConfig(const Nuki::Config& config); void publishConfig(const Nuki::Config& config);
@@ -47,6 +48,7 @@ private:
void publishFloat(const char* topic, const float value, const uint8_t precision = 2); void publishFloat(const char* topic, const float value, const uint8_t precision = 2);
void publishInt(const char* topic, const int value); void publishInt(const char* topic, const int value);
void publishUInt(const char* topic, const unsigned int value);
void publishBool(const char* topic, const bool value); void publishBool(const char* topic, const bool value);
void publishString(const char* topic, const char* value); void publishString(const char* topic, const char* value);

View File

@@ -101,6 +101,11 @@ void NukiWrapper::update()
_nextConfigUpdateTs = ts + _intervalConfig * 1000; _nextConfigUpdateTs = ts + _intervalConfig * 1000;
updateConfig(); updateConfig();
} }
if(_nextLogUpdateTs == 0 || ts > _nextLogUpdateTs)
{
_nextLogUpdateTs = ts + 10 * 1000;
updateAuthInfo();
}
if(_nextLockAction != (Nuki::LockAction)0xff) if(_nextLockAction != (Nuki::LockAction)0xff)
{ {
@@ -141,6 +146,8 @@ void NukiWrapper::updateKeyTurnerState()
Serial.print(F("Nuki lock state: ")); Serial.print(F("Nuki lock state: "));
Serial.println(lockStateStr); Serial.println(lockStateStr);
} }
updateAuthInfo();
} }
void NukiWrapper::updateBatteryState() void NukiWrapper::updateBatteryState()
@@ -167,6 +174,54 @@ void NukiWrapper::updateConfig()
_network->publishAdvancedConfig(_nukiAdvancedConfig); _network->publishAdvancedConfig(_nukiAdvancedConfig);
} }
void NukiWrapper::updateAuthInfo()
{
return;
Nuki::CmdResult result = _nukiBle.retrieveLogEntries(0, 0, 0, true);
if(result != Nuki::CmdResult::Success)
{
return;
}
vTaskDelay( 100 / portTICK_PERIOD_MS);
result = _nukiBle.retrieveLogEntries(_nukiBle.getLogEntryCount() - 2, 1, 0, false);
if(result != Nuki::CmdResult::Success)
{
return;
}
vTaskDelay( 200 / portTICK_PERIOD_MS);
std::list<Nuki::LogEntry> log;
_nukiBle.getLogEntries(&log);
if(log.size() > 0)
{
const Nuki::LogEntry& entry = log.front();
// log_d("Log: %d-%d-%d %d:%d:%d %s", entry.timeStampYear, entry.timeStampMonth, entry.timeStampDay,
// entry.timeStampHour, entry.timeStampMinute, entry.timeStampSecond, entry.name);
if(entry.authId != _lastAuthId)
{
_network->publishAuthorizationInfo(entry.authId, (char *) entry.name);
_lastAuthId = entry.authId;
}
}
}
//struct __attribute__((packed)) LogEntry {
// uint32_t index;
// uint16_t timeStampYear;
// uint8_t timeStampMonth;
// uint8_t timeStampDay;
// uint8_t timeStampHour;
// uint8_t timeStampMinute;
// uint8_t timeStampSecond;
// uint32_t authId;
// uint8_t name[32];
// LoggingType loggingType;
// uint8_t data[5];
//};
Nuki::LockAction NukiWrapper::lockActionToEnum(const char *str) Nuki::LockAction NukiWrapper::lockActionToEnum(const char *str)
{ {
if(strcmp(str, "unlock") == 0) return Nuki::LockAction::Unlock; if(strcmp(str, "unlock") == 0) return Nuki::LockAction::Unlock;

View File

@@ -32,6 +32,7 @@ private:
void updateKeyTurnerState(); void updateKeyTurnerState();
void updateBatteryState(); void updateBatteryState();
void updateConfig(); void updateConfig();
void updateAuthInfo();
void readConfig(); void readConfig();
void readAdvancedConfig(); void readAdvancedConfig();
@@ -50,6 +51,8 @@ private:
Nuki::KeyTurnerState _lastKeyTurnerState; Nuki::KeyTurnerState _lastKeyTurnerState;
Nuki::KeyTurnerState _keyTurnerState; Nuki::KeyTurnerState _keyTurnerState;
uint32_t _lastAuthId = 0xffff;
Nuki::BatteryReport _batteryReport; Nuki::BatteryReport _batteryReport;
Nuki::BatteryReport _lastBatteryReport; Nuki::BatteryReport _lastBatteryReport;
@@ -63,6 +66,7 @@ private:
unsigned long _nextLockStateUpdateTs = 0; unsigned long _nextLockStateUpdateTs = 0;
unsigned long _nextBatteryReportTs = 0; unsigned long _nextBatteryReportTs = 0;
unsigned long _nextConfigUpdateTs = 0; unsigned long _nextConfigUpdateTs = 0;
unsigned long _nextLogUpdateTs = 0;
unsigned long _nextPairTs = 0; unsigned long _nextPairTs = 0;
Nuki::LockAction _nextLockAction = (Nuki::LockAction)0xff; Nuki::LockAction _nextLockAction = (Nuki::LockAction)0xff;
}; };