diff --git a/MqttTopics.h b/MqttTopics.h index 8793e17..1e86c96 100644 --- a/MqttTopics.h +++ b/MqttTopics.h @@ -7,4 +7,5 @@ #define mqtt_topic_lockstate_state "nuki/lock/state" #define mqtt_topic_lockstate_trigger "nuki/lock/trigger" #define mqtt_topic_lockstate_completionStatus "nuki/lock/completionStatus" -#define mqtt_topic_lockstate_action "nuki/lock/action" \ No newline at end of file +#define mqtt_topic_lockstate_action "nuki/lock/action" +#define mqtt_topic_door_sensor_state_action "nuki/lock/doorSensorState" diff --git a/Network.cpp b/Network.cpp index 1352e3b..7eafc19 100644 --- a/Network.cpp +++ b/Network.cpp @@ -144,6 +144,11 @@ void Network::publishKeyTurnerState(const char* state, const char* trigger, cons _mqttClient.publish(mqtt_topic_lockstate_completionStatus, completionStatus); } +void Network::publishDoorSensorState(const char *state) +{ + _mqttClient.publish(mqtt_topic_door_sensor_state_action, state); +} + void Network::setLockActionReceived(void (*lockActionReceivedCallback)(const char *)) { _lockActionReceivedCallback = lockActionReceivedCallback; diff --git a/Network.h b/Network.h index c9e3778..eeb5072 100644 --- a/Network.h +++ b/Network.h @@ -17,6 +17,7 @@ public: bool isMqttConnected(); void publishKeyTurnerState(const char* state, const char* trigger, const char* completionStatus); + void publishDoorSensorState(const char* state); void publishBatteryReport(const BatteryReport& batteryReport); void setLockActionReceived(void (*lockActionReceivedCallback)(const char* value)); diff --git a/Nuki.cpp b/Nuki.cpp index b54f65f..099216b 100644 --- a/Nuki.cpp +++ b/Nuki.cpp @@ -88,19 +88,26 @@ void Nuki::updateKeyTurnerState() { _nukiBle.requestKeyTurnerState(&_keyTurnerState); - char lockStateStr[20]; - lockstateToString(_keyTurnerState.lockState, lockStateStr); - char triggerStr[20]; - triggerToString(_keyTurnerState.trigger, triggerStr); - char completionStatusStr[20]; - completionStatusToString(_keyTurnerState.lastLockActionCompletionStatus, completionStatusStr); - if(_keyTurnerState.lockState != _lastKeyTurnerState.lockState) { + char lockStateStr[20]; + lockstateToString(_keyTurnerState.lockState, lockStateStr); + char triggerStr[20]; + triggerToString(_keyTurnerState.trigger, triggerStr); + char completionStatusStr[20]; + completionStatusToString(_keyTurnerState.lastLockActionCompletionStatus, completionStatusStr); + _network->publishKeyTurnerState(lockStateStr, triggerStr, completionStatusStr); + Serial.print(F("Nuki lock state: ")); + Serial.println(lockStateStr); + } + + if(_keyTurnerState.doorSensorState != _lastKeyTurnerState.doorSensorState) + { + char doorSensorStateStr[20]; + doorSensorStateToString(_keyTurnerState.doorSensorState, doorSensorStateStr); + _network->publishDoorSensorState(doorSensorStateStr); } - Serial.print(F("Nuki lock state: ")); - Serial.println(lockStateStr); memcpy(&_lastKeyTurnerState, &_keyTurnerState, sizeof(KeyTurnerState)); } @@ -234,6 +241,34 @@ void Nuki::completionStatusToString(const CompletionStatus status, char *str) } } +void Nuki::doorSensorStateToString(const DoorSensorState state, char *str) +{ + switch(state) + { + case DoorSensorState::unavailable: + strcpy(str, "unavailable"); + break; + case DoorSensorState::deactivated: + strcpy(str, "deactivated"); + break; + case DoorSensorState::doorClosed: + strcpy(str, "doorClosed"); + break; + case DoorSensorState::doorOpened: + strcpy(str, "doorOpened"); + break; + case DoorSensorState::doorStateUnknown: + strcpy(str, "doorStateUnknown"); + break; + case DoorSensorState::calibrating: + strcpy(str, "calibrating"); + break; + default: + strcpy(str, "undefined"); + break; + } +} + LockAction Nuki::lockActionToEnum(const char *str) { if(strcmp(str, "unlock") == 0) return LockAction::unlock; diff --git a/Nuki.h b/Nuki.h index a93d478..4de1316 100644 --- a/Nuki.h +++ b/Nuki.h @@ -27,6 +27,7 @@ private: void triggerToString(const NukiTrigger trigger, char* str); // char arry at least 10 characters void completionStatusToString(const CompletionStatus status, char* str); // char arry at least 18 characters + void doorSensorStateToString(const DoorSensorState state, char* str); // char arry at least 17 characters NukiBle _nukiBle; Network* _network;