Merge pull request #301 from iranl/mqtt-json-keyturner
MQTT JSON Lock/Opener and keypad
This commit is contained in:
@@ -10,6 +10,7 @@
|
||||
#define mqtt_topic_battery_keypad_critical "/battery/keypadCritical"
|
||||
|
||||
#define mqtt_topic_lock_state "/lock/state"
|
||||
#define mqtt_topic_lock_json "/lock/json"
|
||||
#define mqtt_topic_query_config "/lock/query/config"
|
||||
#define mqtt_topic_query_lockstate "/lock/query/lockstate"
|
||||
#define mqtt_topic_query_keypad "/lock/query/keypad"
|
||||
@@ -51,6 +52,7 @@
|
||||
#define mqtt_topic_keypad_command_code "/keypad/command/code"
|
||||
#define mqtt_topic_keypad_command_enabled "/keypad/command/enabled"
|
||||
#define mqtt_topic_keypad_command_result "/keypad/command/commandResult"
|
||||
#define mqtt_topic_keypad_json "/keypad/json"
|
||||
|
||||
#define mqtt_topic_presence "/presence/devices"
|
||||
|
||||
|
||||
@@ -209,11 +209,15 @@ void NetworkLock::onMqttDataReceived(const char* topic, byte* payload, const uns
|
||||
void NetworkLock::publishKeyTurnerState(const NukiLock::KeyTurnerState& keyTurnerState, const NukiLock::KeyTurnerState& lastKeyTurnerState)
|
||||
{
|
||||
char str[50];
|
||||
memset(&str, 0, sizeof(str));
|
||||
|
||||
DynamicJsonDocument json(_bufferSize);
|
||||
|
||||
lockstateToString(keyTurnerState.lockState, str);
|
||||
|
||||
if((_firstTunerStatePublish || keyTurnerState.lockState != lastKeyTurnerState.lockState) && keyTurnerState.lockState != NukiLock::LockState::Undefined)
|
||||
{
|
||||
memset(&str, 0, sizeof(str));
|
||||
lockstateToString(keyTurnerState.lockState, str);
|
||||
|
||||
publishString(mqtt_topic_lock_state, str);
|
||||
|
||||
if(_haEnabled)
|
||||
@@ -222,34 +226,48 @@ void NetworkLock::publishKeyTurnerState(const NukiLock::KeyTurnerState& keyTurne
|
||||
}
|
||||
}
|
||||
|
||||
if(_firstTunerStatePublish || keyTurnerState.trigger != lastKeyTurnerState.trigger)
|
||||
{
|
||||
json["lock_state"] = str;
|
||||
|
||||
memset(&str, 0, sizeof(str));
|
||||
triggerToString(keyTurnerState.trigger, str);
|
||||
|
||||
if(_firstTunerStatePublish || keyTurnerState.trigger != lastKeyTurnerState.trigger)
|
||||
{
|
||||
publishString(mqtt_topic_lock_trigger, str);
|
||||
}
|
||||
|
||||
if(_firstTunerStatePublish || keyTurnerState.lastLockAction != lastKeyTurnerState.lastLockAction)
|
||||
{
|
||||
json["trigger"] = str;
|
||||
|
||||
memset(&str, 0, sizeof(str));
|
||||
lockactionToString(keyTurnerState.lastLockAction, str);
|
||||
|
||||
if(_firstTunerStatePublish || keyTurnerState.lastLockAction != lastKeyTurnerState.lastLockAction)
|
||||
{
|
||||
publishString(mqtt_topic_lock_last_lock_action, str);
|
||||
}
|
||||
|
||||
if(_firstTunerStatePublish || keyTurnerState.lastLockActionCompletionStatus != lastKeyTurnerState.lastLockActionCompletionStatus)
|
||||
{
|
||||
json["last_lock_action"] = str;
|
||||
|
||||
memset(&str, 0, sizeof(str));
|
||||
NukiLock::completionStatusToString(keyTurnerState.lastLockActionCompletionStatus, str);
|
||||
|
||||
if(_firstTunerStatePublish || keyTurnerState.lastLockActionCompletionStatus != lastKeyTurnerState.lastLockActionCompletionStatus)
|
||||
{
|
||||
publishString(mqtt_topic_lock_completionStatus, str);
|
||||
}
|
||||
|
||||
if(_firstTunerStatePublish || keyTurnerState.doorSensorState != lastKeyTurnerState.doorSensorState)
|
||||
{
|
||||
json["lock_completion_status"] = str;
|
||||
|
||||
memset(&str, 0, sizeof(str));
|
||||
NukiLock::doorSensorStateToString(keyTurnerState.doorSensorState, str);
|
||||
|
||||
if(_firstTunerStatePublish || keyTurnerState.doorSensorState != lastKeyTurnerState.doorSensorState)
|
||||
{
|
||||
publishString(mqtt_topic_lock_door_sensor_state, str);
|
||||
}
|
||||
|
||||
json["door_sensor_state"] = str;
|
||||
|
||||
if(_firstTunerStatePublish || keyTurnerState.criticalBatteryState != lastKeyTurnerState.criticalBatteryState)
|
||||
{
|
||||
bool critical = (keyTurnerState.criticalBatteryState & 0b00000001) > 0;
|
||||
@@ -273,6 +291,12 @@ void NetworkLock::publishKeyTurnerState(const NukiLock::KeyTurnerState& keyTurne
|
||||
}
|
||||
}
|
||||
|
||||
json["auth_id"] = authId;
|
||||
json["auth_name"] = authName;
|
||||
|
||||
serializeJson(json, _buffer, _bufferSize);
|
||||
publishString(mqtt_topic_lock_json, _buffer);
|
||||
|
||||
_firstTunerStatePublish = false;
|
||||
}
|
||||
|
||||
@@ -301,8 +325,6 @@ void NetworkLock::publishAuthorizationInfo(const std::list<NukiLock::LogEntry>&
|
||||
char str[50];
|
||||
|
||||
bool authFound = false;
|
||||
uint32_t authId = 0;
|
||||
char authName[33];
|
||||
memset(authName, 0, sizeof(authName));
|
||||
|
||||
DynamicJsonDocument json(_bufferSize);
|
||||
@@ -457,6 +479,9 @@ void NetworkLock::publishBleAddress(const std::string &address)
|
||||
void NetworkLock::publishKeypad(const std::list<NukiLock::KeypadEntry>& entries, uint maxKeypadCodeCount)
|
||||
{
|
||||
uint index = 0;
|
||||
|
||||
DynamicJsonDocument json(_bufferSize);
|
||||
|
||||
for(const auto& entry : entries)
|
||||
{
|
||||
String basePath = mqtt_topic_keypad;
|
||||
@@ -464,8 +489,25 @@ void NetworkLock::publishKeypad(const std::list<NukiLock::KeypadEntry>& entries,
|
||||
basePath.concat(std::to_string(index).c_str());
|
||||
publishKeypadEntry(basePath, entry);
|
||||
|
||||
auto jsonEntry = json.add();
|
||||
|
||||
jsonEntry["id"] = entry.codeId;
|
||||
jsonEntry["enabled"] = entry.enabled;
|
||||
jsonEntry["name"] = entry.name;
|
||||
jsonEntry["createdYear"] = entry.dateCreatedYear;
|
||||
jsonEntry["createdMonth"] = entry.dateCreatedMonth;
|
||||
jsonEntry["createdDay"] = entry.dateCreatedDay;
|
||||
jsonEntry["createdHour"] = entry.dateCreatedHour;
|
||||
jsonEntry["createdMin"] = entry.dateCreatedMin;
|
||||
jsonEntry["createdSec"] = entry.dateCreatedSec;
|
||||
jsonEntry["lockCount"] = entry.lockCount;
|
||||
|
||||
++index;
|
||||
}
|
||||
|
||||
serializeJson(json, _buffer, _bufferSize);
|
||||
publishString(mqtt_topic_keypad_json, _buffer);
|
||||
|
||||
while(index < maxKeypadCodeCount)
|
||||
{
|
||||
NukiLock::KeypadEntry entry;
|
||||
|
||||
@@ -73,7 +73,7 @@ private:
|
||||
|
||||
bool _firstTunerStatePublish = true;
|
||||
unsigned long _lastMaintenanceTs = 0;
|
||||
bool _haEnabled= false;
|
||||
bool _haEnabled = false;
|
||||
bool _reconnected = false;
|
||||
|
||||
String _keypadCommandName = "";
|
||||
@@ -81,6 +81,8 @@ private:
|
||||
uint _keypadCommandId = 0;
|
||||
int _keypadCommandEnabled = 1;
|
||||
uint8_t _queryCommands = 0;
|
||||
uint32_t authId = 0;
|
||||
char authName[33];
|
||||
|
||||
char* _buffer;
|
||||
size_t _bufferSize;
|
||||
|
||||
@@ -202,18 +202,20 @@ void NetworkOpener::publishKeyTurnerState(const NukiOpener::OpenerState& keyTurn
|
||||
_currentLockState = keyTurnerState.lockState;
|
||||
|
||||
char str[50];
|
||||
memset(&str, 0, sizeof(str));
|
||||
|
||||
DynamicJsonDocument json(_bufferSize);
|
||||
|
||||
lockstateToString(keyTurnerState.lockState, str);
|
||||
|
||||
if((_firstTunerStatePublish || keyTurnerState.lockState != lastKeyTurnerState.lockState || keyTurnerState.nukiState != lastKeyTurnerState.nukiState) && keyTurnerState.lockState != NukiOpener::LockState::Undefined)
|
||||
{
|
||||
memset(&str, 0, sizeof(str));
|
||||
|
||||
if(keyTurnerState.nukiState == NukiOpener::State::ContinuousMode)
|
||||
{
|
||||
publishString(mqtt_topic_lock_state, "ContinuousMode");
|
||||
}
|
||||
else
|
||||
{
|
||||
lockstateToString(keyTurnerState.lockState, str);
|
||||
publishString(mqtt_topic_lock_state, str);
|
||||
}
|
||||
|
||||
@@ -223,34 +225,57 @@ void NetworkOpener::publishKeyTurnerState(const NukiOpener::OpenerState& keyTurn
|
||||
}
|
||||
}
|
||||
|
||||
if(_firstTunerStatePublish || keyTurnerState.trigger != lastKeyTurnerState.trigger)
|
||||
json["lock_state"] = str;
|
||||
|
||||
if(keyTurnerState.nukiState == NukiOpener::State::ContinuousMode)
|
||||
{
|
||||
json["continuous_mode"] = 1;
|
||||
} else {
|
||||
json["continuous_mode"] = 0;
|
||||
}
|
||||
|
||||
memset(&str, 0, sizeof(str));
|
||||
triggerToString(keyTurnerState.trigger, str);
|
||||
|
||||
if(_firstTunerStatePublish || keyTurnerState.trigger != lastKeyTurnerState.trigger)
|
||||
{
|
||||
publishString(mqtt_topic_lock_trigger, str);
|
||||
}
|
||||
|
||||
json["trigger"] = str;
|
||||
|
||||
memset(&str, 0, sizeof(str));
|
||||
completionStatusToString(keyTurnerState.lastLockActionCompletionStatus, str);
|
||||
|
||||
if(_firstTunerStatePublish || keyTurnerState.lastLockActionCompletionStatus != lastKeyTurnerState.lastLockActionCompletionStatus)
|
||||
{
|
||||
memset(&str, 0, sizeof(str));
|
||||
completionStatusToString(keyTurnerState.lastLockActionCompletionStatus, str);
|
||||
publishString(mqtt_topic_lock_completionStatus, str);
|
||||
}
|
||||
|
||||
if(_firstTunerStatePublish || keyTurnerState.doorSensorState != lastKeyTurnerState.doorSensorState)
|
||||
{
|
||||
json["lock_completion_status"] = str;
|
||||
|
||||
memset(&str, 0, sizeof(str));
|
||||
NukiOpener::doorSensorStateToString(keyTurnerState.doorSensorState, str);
|
||||
|
||||
if(_firstTunerStatePublish || keyTurnerState.doorSensorState != lastKeyTurnerState.doorSensorState)
|
||||
{
|
||||
publishString(mqtt_topic_lock_door_sensor_state, str);
|
||||
}
|
||||
|
||||
json["door_sensor_state"] = str;
|
||||
|
||||
if(_firstTunerStatePublish || keyTurnerState.criticalBatteryState != lastKeyTurnerState.criticalBatteryState)
|
||||
{
|
||||
bool critical = (keyTurnerState.criticalBatteryState & 0b00000001) > 0;
|
||||
publishBool(mqtt_topic_battery_critical, critical);
|
||||
}
|
||||
|
||||
json["auth_id"] = authId;
|
||||
json["auth_name"] = authName;
|
||||
|
||||
serializeJson(json, _buffer, _bufferSize);
|
||||
publishString(mqtt_topic_lock_json, _buffer);
|
||||
|
||||
_firstTunerStatePublish = false;
|
||||
}
|
||||
|
||||
@@ -289,8 +314,6 @@ void NetworkOpener::publishAuthorizationInfo(const std::list<NukiOpener::LogEntr
|
||||
char str[50];
|
||||
|
||||
bool authFound = false;
|
||||
uint32_t authId = 0;
|
||||
char authName[33];
|
||||
memset(authName, 0, sizeof(authName));
|
||||
|
||||
DynamicJsonDocument json(_bufferSize);
|
||||
@@ -513,6 +536,9 @@ void NetworkOpener::removeHASSConfig(char* uidString)
|
||||
void NetworkOpener::publishKeypad(const std::list<NukiLock::KeypadEntry>& entries, uint maxKeypadCodeCount)
|
||||
{
|
||||
uint index = 0;
|
||||
|
||||
DynamicJsonDocument json(_bufferSize);
|
||||
|
||||
for(const auto& entry : entries)
|
||||
{
|
||||
String basePath = mqtt_topic_keypad;
|
||||
@@ -520,8 +546,25 @@ void NetworkOpener::publishKeypad(const std::list<NukiLock::KeypadEntry>& entrie
|
||||
basePath.concat(std::to_string(index).c_str());
|
||||
publishKeypadEntry(basePath, entry);
|
||||
|
||||
auto jsonEntry = json.add();
|
||||
|
||||
jsonEntry["id"] = entry.codeId;
|
||||
jsonEntry["enabled"] = entry.enabled;
|
||||
jsonEntry["name"] = entry.name;
|
||||
jsonEntry["createdYear"] = entry.dateCreatedYear;
|
||||
jsonEntry["createdMonth"] = entry.dateCreatedMonth;
|
||||
jsonEntry["createdDay"] = entry.dateCreatedDay;
|
||||
jsonEntry["createdHour"] = entry.dateCreatedHour;
|
||||
jsonEntry["createdMin"] = entry.dateCreatedMin;
|
||||
jsonEntry["createdSec"] = entry.dateCreatedSec;
|
||||
jsonEntry["lockCount"] = entry.lockCount;
|
||||
|
||||
++index;
|
||||
}
|
||||
|
||||
serializeJson(json, _buffer, _bufferSize);
|
||||
publishString(mqtt_topic_keypad_json, _buffer);
|
||||
|
||||
while(index < maxKeypadCodeCount)
|
||||
{
|
||||
NukiLock::KeypadEntry entry;
|
||||
|
||||
@@ -82,6 +82,9 @@ private:
|
||||
int _keypadCommandEnabled = 1;
|
||||
unsigned long _resetLockStateTs = 0;
|
||||
uint8_t _queryCommands = 0;
|
||||
uint32_t authId = 0;
|
||||
char authName[33];
|
||||
|
||||
NukiOpener::LockState _currentLockState = NukiOpener::LockState::Undefined;
|
||||
|
||||
char* _buffer;
|
||||
|
||||
@@ -324,8 +324,14 @@ void NukiWrapper::updateKeyTurnerState()
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
_retryLockstateCount = 0;
|
||||
|
||||
if(_publishAuthData)
|
||||
{
|
||||
updateAuthData();
|
||||
}
|
||||
|
||||
_network->publishKeyTurnerState(_keyTurnerState, _lastKeyTurnerState);
|
||||
updateGpioOutputs();
|
||||
|
||||
@@ -333,11 +339,6 @@ void NukiWrapper::updateKeyTurnerState()
|
||||
lockstateToString(_keyTurnerState.lockState, lockStateStr);
|
||||
Log->println(lockStateStr);
|
||||
|
||||
if(_publishAuthData)
|
||||
{
|
||||
updateAuthData();
|
||||
}
|
||||
|
||||
postponeBleWatchdog();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user