publish door sensor state via mqtt

This commit is contained in:
technyon
2022-03-31 17:56:30 +02:00
parent f3de3c75df
commit 1efd8157e2
5 changed files with 53 additions and 10 deletions

View File

@@ -7,4 +7,5 @@
#define mqtt_topic_lockstate_state "nuki/lock/state" #define mqtt_topic_lockstate_state "nuki/lock/state"
#define mqtt_topic_lockstate_trigger "nuki/lock/trigger" #define mqtt_topic_lockstate_trigger "nuki/lock/trigger"
#define mqtt_topic_lockstate_completionStatus "nuki/lock/completionStatus" #define mqtt_topic_lockstate_completionStatus "nuki/lock/completionStatus"
#define mqtt_topic_lockstate_action "nuki/lock/action" #define mqtt_topic_lockstate_action "nuki/lock/action"
#define mqtt_topic_door_sensor_state_action "nuki/lock/doorSensorState"

View File

@@ -144,6 +144,11 @@ void Network::publishKeyTurnerState(const char* state, const char* trigger, cons
_mqttClient.publish(mqtt_topic_lockstate_completionStatus, completionStatus); _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 *)) void Network::setLockActionReceived(void (*lockActionReceivedCallback)(const char *))
{ {
_lockActionReceivedCallback = lockActionReceivedCallback; _lockActionReceivedCallback = lockActionReceivedCallback;

View File

@@ -17,6 +17,7 @@ public:
bool isMqttConnected(); bool isMqttConnected();
void publishKeyTurnerState(const char* state, const char* trigger, const char* completionStatus); void publishKeyTurnerState(const char* state, const char* trigger, const char* completionStatus);
void publishDoorSensorState(const char* state);
void publishBatteryReport(const BatteryReport& batteryReport); void publishBatteryReport(const BatteryReport& batteryReport);
void setLockActionReceived(void (*lockActionReceivedCallback)(const char* value)); void setLockActionReceived(void (*lockActionReceivedCallback)(const char* value));

View File

@@ -88,19 +88,26 @@ void Nuki::updateKeyTurnerState()
{ {
_nukiBle.requestKeyTurnerState(&_keyTurnerState); _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) 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); _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)); 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) LockAction Nuki::lockActionToEnum(const char *str)
{ {
if(strcmp(str, "unlock") == 0) return LockAction::unlock; if(strcmp(str, "unlock") == 0) return LockAction::unlock;

1
Nuki.h
View File

@@ -27,6 +27,7 @@ private:
void triggerToString(const NukiTrigger trigger, char* str); // char arry at least 10 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 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; NukiBle _nukiBle;
Network* _network; Network* _network;