diff --git a/MqttTopics.h b/MqttTopics.h index 43ed33a..8793e17 100644 --- a/MqttTopics.h +++ b/MqttTopics.h @@ -4,5 +4,7 @@ #define mqtt_topic_battery_drain "nuki/battery/drain" #define mqtt_topic_battery_max_turn_current "nuki/battery/maxTurnCurrent" -#define mqtt_topic_lockstate "nuki/lock/state" +#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 diff --git a/Network.cpp b/Network.cpp index 763d06e..0178916 100644 --- a/Network.cpp +++ b/Network.cpp @@ -135,9 +135,11 @@ void Network::onMqttDataReceived(char *&topic, byte *&payload, unsigned int &len } } -void Network::publishKeyTurnerState(const char* state) +void Network::publishKeyTurnerState(const char* state, const char* trigger, const char* completionStatus) { - _mqttClient.publish(mqtt_topic_lockstate, state); + _mqttClient.publish(mqtt_topic_lockstate_state, state); + _mqttClient.publish(mqtt_topic_lockstate_trigger, trigger); + _mqttClient.publish(mqtt_topic_lockstate_completionStatus, completionStatus); } void Network::setLockActionReceived(void (*lockActionReceivedCallback)(const char *)) @@ -148,8 +150,8 @@ void Network::setLockActionReceived(void (*lockActionReceivedCallback)(const cha void Network::publishBatteryReport(const BatteryReport& batteryReport) { publishFloat(mqtt_topic_battery_voltage, (float)batteryReport.batteryVoltage / 1000.0); - publishFloat(mqtt_topic_battery_drain, (float)batteryReport.batteryDrain / 1000.0); // milliwatt seconds - publishInt(mqtt_topic_battery_max_turn_current, batteryReport.maxTurnCurrent); + publishInt(mqtt_topic_battery_drain, batteryReport.batteryDrain); // milliwatt seconds + publishFloat(mqtt_topic_battery_max_turn_current, (float)batteryReport.maxTurnCurrent / 1000.0); } void Network::publishFloat(const char* topic, const float value, const uint8_t precision) diff --git a/Network.h b/Network.h index e6abdfd..2f3929d 100644 --- a/Network.h +++ b/Network.h @@ -14,7 +14,7 @@ public: void initialize(); void update(); - void publishKeyTurnerState(const char* state); + void publishKeyTurnerState(const char* state, const char* trigger, const char* completionStatus); void publishBatteryReport(const BatteryReport& batteryReport); void setLockActionReceived(void (*lockActionReceivedCallback)(const char* value)); diff --git a/Nuki.cpp b/Nuki.cpp index 97024a4..be21335 100644 --- a/Nuki.cpp +++ b/Nuki.cpp @@ -84,14 +84,18 @@ void Nuki::updateKeyTurnerState() { _nukiBle.requestKeyTurnerState(&_keyTurnerState); - char str[20]; - lockstateToString(_keyTurnerState.lockState, str); + 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) { - _network->publishKeyTurnerState(str); + _network->publishKeyTurnerState(lockStateStr, triggerStr, completionStatusStr); Serial.print(F("Nuki lock state: ")); - Serial.println(str); + Serial.println(lockStateStr); } memcpy(&_lastKeyTurnerState, &_keyTurnerState, sizeof(KeyTurnerState)); @@ -153,6 +157,79 @@ void Nuki::lockstateToString(const LockState state, char* str) } } + +void Nuki::triggerToString(const NukiTrigger trigger, char *str) +{ + switch(trigger) + { + case NukiTrigger::autoLock: + strcpy(str, "autoLock"); + break; + case NukiTrigger::automatic: + strcpy(str, "automatic"); + break; + case NukiTrigger::button: + strcpy(str, "button"); + break; + case NukiTrigger::manual: + strcpy(str, "autoLock"); + break; + case NukiTrigger::system: + strcpy(str, "system"); + break; + default: + strcpy(str, "undefined"); + break; + } +} + +void Nuki::completionStatusToString(const CompletionStatus status, char *str) +{ + switch (status) + { + case CompletionStatus::success: + strcpy(str, "success"); + break; + case CompletionStatus::busy: + strcpy(str, "busy"); + break; + case CompletionStatus::canceled: + strcpy(str, "canceled"); + break; + case CompletionStatus::clutchFailure: + strcpy(str, "clutchFailure"); + break; + case CompletionStatus::incompleteFailure: + strcpy(str, "incompleteFailure"); + break; + case CompletionStatus::invalidCode: + strcpy(str, "invalidCode"); + break; + case CompletionStatus::lowMotorVoltage: + strcpy(str, "lowMotorVoltage"); + break; + case CompletionStatus::motorBlocked: + strcpy(str, "motorBlocked"); + break; + case CompletionStatus::motorPowerFailure: + strcpy(str, "motorPowerFailure"); + break; + case CompletionStatus::otherError: + strcpy(str, "otherError"); + break; + case CompletionStatus::tooRecent: + strcpy(str, "tooRecent"); + break; + case CompletionStatus::unknown: + strcpy(str, "unknown"); + 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 41c3ef7..7cf9742 100644 --- a/Nuki.h +++ b/Nuki.h @@ -21,6 +21,9 @@ private: void lockstateToString(const LockState state, char* str); // char array at least 14 characters LockAction lockActionToEnum(const char* str); // char array at least 14 characters + 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 + NukiBle _nukiBle; Network* _network; Preferences* _preferences;