Skip to content

Commit

Permalink
Update structs
Browse files Browse the repository at this point in the history
  • Loading branch information
iranl committed Jan 10, 2025
1 parent a7673b4 commit 8f5bacc
Show file tree
Hide file tree
Showing 10 changed files with 290 additions and 228 deletions.
4 changes: 2 additions & 2 deletions src/NukiBle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1572,7 +1572,7 @@ void NukiBle::handleReturnMessage(Command returnCode, unsigned char* data, uint1
case Command::AuthorizationEntry : {
printBuffer((byte*)data, dataLen, false, "authorizationEntry", debugNukiHexData, logger);
AuthorizationEntry authEntry;
memcpy(&authEntry, data, sizeof(authEntry));
memcpy(&authEntry, data, dataLen);
listOfAuthorizationEntries.push_back(authEntry);
if (debugNukiReadableData) {
NukiLock::logAuthorizationEntry(authEntry, true, logger);
Expand Down Expand Up @@ -1667,7 +1667,7 @@ void NukiBle::handleReturnMessage(Command returnCode, unsigned char* data, uint1
}
case Command::KeypadCode : {
KeypadEntry keypadEntry;
memcpy(&keypadEntry, data, sizeof(KeypadEntry));
memcpy(&keypadEntry, data, dataLen);
listOfKeyPadEntries.push_back(keypadEntry);
nrOfReceivedKeypadCodes++;

Expand Down
6 changes: 4 additions & 2 deletions src/NukiConstants.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,16 @@ enum class DoorSensorState : uint8_t {
enum class BatteryType : uint8_t {
Alkali = 0x00,
Accumulators = 0x01,
Lithium = 0x02
Lithium = 0x02,
Unknown = 0xFF
};

enum class AdvertisingMode : uint8_t {
Automatic = 0x00,
Normal = 0x01,
Slow = 0x02,
Slowest = 0x03
Slowest = 0x03,
Unknown = 0xFF
};

enum class CommandType {
Expand Down
37 changes: 27 additions & 10 deletions src/NukiLock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -623,18 +623,35 @@ Nuki::CmdResult NukiLock::retrieveLogEntries(const uint32_t startIndex, const ui
}

bool NukiLock::isBatteryCritical() {
return ((keyTurnerState.criticalBatteryState & (1 << 0)) != 0);
if(keyTurnerState.criticalBatteryState != 255) {
return ((keyTurnerState.criticalBatteryState & 1) == 1);
}
return false;
}

bool NukiLock::isKeypadBatteryCritical() {
if ((keyTurnerState.accessoryBatteryState & (1 << 7)) != 0) {
return ((keyTurnerState.accessoryBatteryState & (1 << 6)) != 0);
if(keyTurnerState.accessoryBatteryState != 255) {
if ((keyTurnerState.accessoryBatteryState & 1) == 1) {
return ((keyTurnerState.accessoryBatteryState & 3) == 3);
}
}
return false;
}

bool NukiLock::isDoorSensorBatteryCritical() {
if(keyTurnerState.accessoryBatteryState != 255) {
if ((keyTurnerState.accessoryBatteryState & 4) == 4) {
return ((keyTurnerState.accessoryBatteryState & 12) == 12);
}
}
return false;
}

bool NukiLock::isBatteryCharging() {
return ((keyTurnerState.criticalBatteryState & (1 << 1)) != 0);
if(keyTurnerState.criticalBatteryState != 255) {
return ((keyTurnerState.criticalBatteryState & 2) == 2);
}
return false;
}

uint8_t NukiLock::getBatteryPerc() {
Expand Down Expand Up @@ -734,30 +751,30 @@ void NukiLock::handleReturnMessage(Command returnCode, unsigned char* data, uint
switch (returnCode) {
case Command::KeyturnerStates : {
printBuffer((byte*)data, dataLen, false, "keyturnerStates", debugNukiHexData, logger);
memcpy(&keyTurnerState, data, sizeof(keyTurnerState));
memcpy(&keyTurnerState, data, dataLen);
if (debugNukiReadableData) {
logKeyturnerState(keyTurnerState, true, logger);
}
break;
}
case Command::BatteryReport : {
printBuffer((byte*)data, dataLen, false, "batteryReport", debugNukiHexData, logger);
memcpy(&batteryReport, data, sizeof(batteryReport));
memcpy(&batteryReport, data, dataLen);
if (debugNukiReadableData) {
logBatteryReport(batteryReport, true, logger);
}
break;
}
case Command::Config : {
memcpy(&config, data, sizeof(config));
memcpy(&config, data, dataLen);
if (debugNukiReadableData) {
logConfig(config, true, logger);
}
printBuffer((byte*)data, dataLen, false, "config", debugNukiHexData, logger);
break;
}
case Command::AdvancedConfig : {
memcpy(&advancedConfig, data, sizeof(advancedConfig));
memcpy(&advancedConfig, data, dataLen);
if (debugNukiReadableData) {
logAdvancedConfig(advancedConfig, true, logger);
}
Expand All @@ -767,14 +784,14 @@ void NukiLock::handleReturnMessage(Command returnCode, unsigned char* data, uint
case Command::TimeControlEntry : {
printBuffer((byte*)data, dataLen, false, "timeControlEntry", debugNukiHexData, logger);
TimeControlEntry timeControlEntry;
memcpy(&timeControlEntry, data, sizeof(timeControlEntry));
memcpy(&timeControlEntry, data, dataLen);
listOfTimeControlEntries.push_back(timeControlEntry);
break;
}
case Command::LogEntry : {
printBuffer((byte*)data, dataLen, false, "logEntry", debugNukiHexData, logger);
LogEntry logEntry;
memcpy(&logEntry, data, sizeof(logEntry));
memcpy(&logEntry, data, dataLen);
listOfLogEntries.push_back(logEntry);
if (debugNukiReadableData) {
logLogEntry(logEntry, true, logger);
Expand Down
9 changes: 9 additions & 0 deletions src/NukiLock.h
Original file line number Diff line number Diff line change
Expand Up @@ -435,6 +435,15 @@ class NukiLock : public Nuki::NukiBle {
* @return true if critical
*/
bool isBatteryCritical();

/**
* @brief Returns door sensor battery critical state in case this is supported
*
* Note that `retrieveOpenerState()` needs to be called first to retrieve the needed data
*
* @return true if critical
*/
bool isDoorSensorBatteryCritical();

/**
* @brief Returns keypad battery critical state in case this is supported
Expand Down
96 changes: 54 additions & 42 deletions src/NukiLockConstants.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,8 @@ enum class Trigger : uint8_t {
Automatic = 0x03,
AutoLock = 0x06,
HomeKit = 0xAB,
MQTT = 0xAC
MQTT = 0xAC,
Undefined = 0xFF
};


Expand All @@ -118,12 +119,14 @@ enum class LockAction : uint8_t {
ButtonNoAction = 0x5A,
FobAction1 = 0x81,
FobAction2 = 0x82,
FobAction3 = 0x83
FobAction3 = 0x83,
Undefined = 0xFF
};

enum class KeypadActionSource : uint8_t {
ArrowKey = 0x00,
Code = 0x01
ArrowKey = 0x00,
Code = 0x01,
Fingerprint = 0x02
};

enum class KeypadAction : uint8_t {
Expand All @@ -141,7 +144,8 @@ enum class ButtonPressAction : uint8_t {
Lock = 0x03,
Unlatch = 0x04,
LockNgo = 0x05,
ShowStatus = 0x06
ShowStatus = 0x06,
Unknown = 0xFF
};

enum class CompletionStatus : uint8_t {
Expand Down Expand Up @@ -172,14 +176,20 @@ struct __attribute__((packed)) KeyTurnerState {
uint8_t currentTimeSecond;
int16_t timeZoneOffset;
uint8_t criticalBatteryState;
uint8_t configUpdateCount;
bool lockNgoTimer;
LockAction lastLockAction;
Trigger lastLockActionTrigger;
CompletionStatus lastLockActionCompletionStatus;
uint8_t configUpdateCount = 255;
uint8_t lockNgoTimer = 255;
LockAction lastLockAction = LockAction::Undefined;
Trigger lastLockActionTrigger = Trigger::Undefined;
CompletionStatus lastLockActionCompletionStatus = CompletionStatus::Unknown;
DoorSensorState doorSensorState = DoorSensorState::Unavailable;
uint16_t nightModeActive;
uint8_t accessoryBatteryState;
uint8_t nightModeActive = 255;
uint8_t accessoryBatteryState = 255;
uint8_t network = 255;
uint8_t bleConnectionStrength = 255;
uint8_t wifiConnectionStrength = 255;
uint8_t wifi = 255;
uint8_t mqtt = 255;
uint8_t thread = 255;
};

struct __attribute__((packed)) Config {
Expand All @@ -204,18 +214,18 @@ struct __attribute__((packed)) Config {
uint8_t fobAction1;
uint8_t fobAction2;
uint8_t fobAction3;
uint8_t singleLock;
AdvertisingMode advertisingMode;
uint8_t hasKeypad;
unsigned char firmwareVersion[3];
unsigned char hardwareRevision[2];
uint8_t homeKitStatus;
TimeZoneId timeZoneId;
uint8_t deviceType;
uint8_t network;
uint8_t hasKeypadV2;
uint8_t matterStatus;
uint8_t productVariant;
uint8_t singleLock = 255;
AdvertisingMode advertisingMode = AdvertisingMode::Unknown;
uint8_t hasKeypad = 255;
unsigned char firmwareVersion[3] = {0, 0 , 0};
unsigned char hardwareRevision[2] = {0, 0};
uint8_t homeKitStatus = 255;
TimeZoneId timeZoneId = TimeZoneId::None;
uint8_t deviceType = 255;
uint8_t network = 255;
uint8_t hasKeypadV2 = 255;
uint8_t matterStatus = 255;
uint8_t productVariant = 255;
};

struct __attribute__((packed)) NewConfig {
Expand Down Expand Up @@ -243,24 +253,26 @@ struct __attribute__((packed)) AdvancedConfig {
int16_t lockedPositionOffsetDegrees;
int16_t singleLockedPositionOffsetDegrees;
int16_t unlockedToLockedTransitionOffsetDegrees;
uint8_t lockNgoTimeout;
ButtonPressAction singleButtonPressAction;
ButtonPressAction doubleButtonPressAction;
uint8_t detachedCylinder;
BatteryType batteryType;
uint8_t automaticBatteryTypeDetection;
uint8_t unlatchDuration;
uint16_t autoLockTimeOut;
uint8_t autoUnLockDisabled;
uint8_t nightModeEnabled;
unsigned char nightModeStartTime[2];
unsigned char nightModeEndTime[2];
uint8_t nightModeAutoLockEnabled;
uint8_t nightModeAutoUnlockDisabled;
uint8_t nightModeImmediateLockOnStart;
uint8_t autoLockEnabled;
uint8_t immediateAutoLockEnabled;
uint8_t autoUpdateEnabled;
uint8_t lockNgoTimeout = 255;
ButtonPressAction singleButtonPressAction = ButtonPressAction::Unknown;
ButtonPressAction doubleButtonPressAction = ButtonPressAction::Unknown;
uint8_t detachedCylinder = 255;
BatteryType batteryType = BatteryType::Unknown;
uint8_t automaticBatteryTypeDetection = 255;
uint8_t unlatchDuration = 255;
uint16_t autoLockTimeOut = -1;
uint8_t autoUnLockDisabled = 255;
uint8_t nightModeEnabled = 255;
unsigned char nightModeStartTime[2] = {0, 0};
unsigned char nightModeEndTime[2] = {0, 0};
uint8_t nightModeAutoLockEnabled = 255;
uint8_t nightModeAutoUnlockDisabled = 255;
uint8_t nightModeImmediateLockOnStart = 255;
uint8_t autoLockEnabled = 255;
uint8_t immediateAutoLockEnabled = 255;
uint8_t autoUpdateEnabled = 255;
uint8_t speedMode = 255;
uint8_t slowSpeedDuringNightMode = 255;
};

struct __attribute__((packed)) NewAdvancedConfig {
Expand Down
34 changes: 32 additions & 2 deletions src/NukiLockUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -557,15 +557,43 @@ void logKeyturnerState(KeyTurnerState keyTurnerState, bool debug, Print* Log) {
logMessageVar("currentTimeSecond: %d", (unsigned int)keyTurnerState.currentTimeSecond, Log, 4);
logMessageVar("timeZoneOffset: %d", (unsigned int)keyTurnerState.timeZoneOffset, Log, 4);
logMessageVar("criticalBatteryState composed value: %d", (unsigned int)keyTurnerState.criticalBatteryState, Log, 4);
logMessageVar("criticalBatteryState: %d", (unsigned int)(((unsigned int)keyTurnerState.criticalBatteryState) == 1 ? 1 : 0), Log, 4);
logMessageVar("batteryCharging: %d", (unsigned int)(((unsigned int)keyTurnerState.criticalBatteryState & 2) == 2 ? 1 : 0), Log, 4);
logMessageVar("batteryPercent: %d", (unsigned int)((keyTurnerState.criticalBatteryState & 0b11111100) >> 1), Log, 4);
logMessageVar("configUpdateCount: %d", (unsigned int)keyTurnerState.configUpdateCount, Log, 4);
logMessageVar("lockNgoTimer: %d", (unsigned int)keyTurnerState.lockNgoTimer, Log, 4);
logLockAction((LockAction)keyTurnerState.lastLockAction, debug, Log);
logMessageVar("lastLockActionTrigger: %d", (unsigned int)keyTurnerState.lastLockActionTrigger, Log, 4);
logCompletionStatus(keyTurnerState.lastLockActionCompletionStatus, debug, Log);
logMessageVar("doorSensorState: %d", (unsigned int)keyTurnerState.doorSensorState, Log, 4);
logMessageVar("nightModeActive: %d", (unsigned int)keyTurnerState.nightModeActive, Log, 4);
logMessageVar("Keypad bat critical feature supported: %d", (unsigned int)keyTurnerState.accessoryBatteryState & 1, Log, 4);
logMessageVar("Keypad Battery Critical: %d", (unsigned int)keyTurnerState.accessoryBatteryState & 2, Log, 4);
logMessageVar("accessoryBatteryState composed value: %d", (unsigned int)keyTurnerState.accessoryBatteryState, Log, 4);
logMessageVar("Keypad bat critical feature supported: %d", (unsigned int)(((unsigned int)keyTurnerState.accessoryBatteryState & 1) == 1 ? 1 : 0), Log, 4);
logMessageVar("Keypad Battery Critical: %d", (unsigned int)(((unsigned int)keyTurnerState.accessoryBatteryState & 3) == 3 ? 1 : 0), Log, 4);
logMessageVar("Doorsensor bat critical feature supported: %d", (unsigned int)(((unsigned int)keyTurnerState.accessoryBatteryState & 4) == 4 ? 1 : 0), Log, 4);
logMessageVar("Doorsensor Battery Critical: %d", (unsigned int)(((unsigned int)keyTurnerState.accessoryBatteryState & 12) == 12 ? 1 : 0), Log, 4);
logMessageVar("network composed value: %d", (unsigned int)keyTurnerState.network, Log, 4);
logMessageVar("remoteAccessEnabled: %d", (unsigned int)(((keyTurnerState.network & 1) == 1) ? 1 : 0), Log, 4);
logMessageVar("bridgePaired: %d", (unsigned int)((((keyTurnerState.network >> 1) & 1) == 1) ? 1 : 0), Log, 4);
logMessageVar("sseConnectedViaWifi: %d", (unsigned int)((((keyTurnerState.network >> 2) & 1) == 1) ? 1 : 0), Log, 4);
logMessageVar("sseConnectionEstablished: %d", (unsigned int)((((keyTurnerState.network >> 3) & 1) == 1) ? 1 : 0), Log, 4);
logMessageVar("isSseConnectedViaThread: %d", (unsigned int)((((keyTurnerState.network >> 4) & 1) == 1) ? 1 : 0), Log, 4);
logMessageVar("threadSseUplinkEnabledByUser: %d", (unsigned int)((((keyTurnerState.network >> 5) & 1) == 1) ? 1 : 0), Log, 4);
logMessageVar("nat64AvailableViaThread: %d", (unsigned int)((((keyTurnerState.network >> 6) & 1) == 1) ? 1 : 0), Log, 4);
logMessageVar("bleConnectionStrength: %d", (unsigned int)keyTurnerState.bleConnectionStrength, Log, 4);
logMessageVar("wifiConnectionStrength: %d", (unsigned int)keyTurnerState.wifiConnectionStrength, Log, 4);
logMessageVar("wifi composed value: %d", (unsigned int)keyTurnerState.wifi, Log, 4);
logMessageVar("wifiStatus: %d", (unsigned int)(keyTurnerState.wifi & 3), Log, 4);
logMessageVar("sseStatus: %d", (unsigned int)((keyTurnerState.wifi >> 2) & 3), Log, 4);
logMessageVar("wifiQuality: %d", (unsigned int)((keyTurnerState.wifi >> 4) & 15), Log, 4);
logMessageVar("mqtt composed value: %d", (unsigned int)keyTurnerState.mqtt, Log, 4);
logMessageVar("mqttStatus: %d", (unsigned int)(keyTurnerState.mqtt & 3), Log, 4);
logMessageVar("mqttConnectionChannel: %d", (unsigned int)((keyTurnerState.mqtt >> 2) & 1), Log, 4);
logMessageVar("thread composed value: %d", (unsigned int)keyTurnerState.thread, Log, 4);
logMessageVar("threadConnectionStatus: %d", (unsigned int)(keyTurnerState.thread & 3), Log, 4);
logMessageVar("threadSseStatus: %d", (unsigned int)((keyTurnerState.thread >> 2) & 3), Log, 4);
logMessageVar("isCommissioningModeActive: %d", (unsigned int)(((unsigned int)keyTurnerState.thread & 16) != 0 ? 1 : 0), Log, 4);
logMessageVar("isWifiDisabledBecauseOfThread: %d", (unsigned int)(((unsigned int)keyTurnerState.thread & 32) != 0 ? 1 : 0), Log, 4);
}
}

Expand Down Expand Up @@ -666,6 +694,8 @@ void logAdvancedConfig(AdvancedConfig advancedConfig, bool debug, Print* Log) {
logMessageVar("autoLockEnabled :%d", (unsigned int)advancedConfig.autoLockEnabled, Log, 4);
logMessageVar("immediateAutoLockEnabled :%d", (unsigned int)advancedConfig.immediateAutoLockEnabled, Log, 4);
logMessageVar("autoUpdateEnabled :%d", (unsigned int)advancedConfig.autoUpdateEnabled, Log, 4);
logMessageVar("speedMode :%d", (unsigned int)advancedConfig.speedMode, Log, 4);
logMessageVar("slowSpeedDuringNightMode :%d", (unsigned int)advancedConfig.slowSpeedDuringNightMode, Log, 4);
}
}

Expand Down
Loading

0 comments on commit 8f5bacc

Please sign in to comment.