publish trigger action and completion status

This commit is contained in:
technyon
2022-03-27 19:29:47 +02:00
parent 9a2dd19f63
commit 8f803cf61c
5 changed files with 94 additions and 10 deletions

View File

@@ -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"

View File

@@ -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)

View File

@@ -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));

View File

@@ -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;

3
Nuki.h
View File

@@ -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;