Merge branch 'gpio' of github.com:technyon/nuki_hub into gpio

This commit is contained in:
technyon
2023-06-03 21:20:33 +02:00
24 changed files with 338 additions and 108 deletions

View File

@@ -7,15 +7,20 @@
#include <NukiOpenerUtils.h>
NukiOpenerWrapper* nukiOpenerInst;
AccessLevel NukiOpenerWrapper::_accessLevel = AccessLevel::ReadOnly;
NukiOpenerWrapper::NukiOpenerWrapper(const std::string& deviceName, uint32_t id, BleScanner::Scanner* scanner, NetworkOpener* network, Gpio* gpio, Preferences* preferences)
NukiOpenerWrapper::NukiOpenerWrapper(const std::string& deviceName, NukiDeviceId* deviceId, BleScanner::Scanner* scanner, NetworkOpener* network, Gpio* gpio, Preferences* preferences)
: _deviceName(deviceName),
_nukiOpener(deviceName, id),
_deviceId(deviceId),
_nukiOpener(deviceName, _deviceId->get()),
_bleScanner(scanner),
_network(network),
_gpio(gpio),
_preferences(preferences)
{
Log->print("Device id opener: ");
Log->println(_deviceId->get());
nukiOpenerInst = this;
memset(&_lastKeyTurnerState, sizeof(NukiLock::KeyTurnerState), 0);
@@ -55,6 +60,7 @@ void NukiOpenerWrapper::initialize()
_nrOfRetries = _preferences->getInt(preference_command_nr_of_retries);
_retryDelay = _preferences->getInt(preference_command_retry_delay);
_rssiPublishInterval = _preferences->getInt(preference_rssi_publish_interval) * 1000;
_accessLevel = (AccessLevel)_preferences->getInt(preference_access_level);
if(_retryDelay <= 100)
{
@@ -298,6 +304,7 @@ void NukiOpenerWrapper::setPin(const uint16_t pin)
void NukiOpenerWrapper::unpair()
{
_nukiOpener.unPairNuki();
_deviceId->assignNewId();
_paired = false;
}
@@ -465,11 +472,33 @@ NukiOpener::LockAction NukiOpenerWrapper::lockActionToEnum(const char *str)
return (NukiOpener::LockAction)0xff;
}
bool NukiOpenerWrapper::onLockActionReceivedCallback(const char *value)
LockActionResult NukiOpenerWrapper::onLockActionReceivedCallback(const char *value)
{
NukiOpener::LockAction action = nukiOpenerInst->lockActionToEnum(value);
nukiOpenerInst->_nextLockAction = action;
return (int)action != 0xff;
if((int)action == 0xff)
{
return LockActionResult::UnknownAction;
}
switch(_accessLevel)
{
case AccessLevel::Full:
nukiOpenerInst->_nextLockAction = action;
return LockActionResult::Success;
break;
case AccessLevel::LockOnly:
if(action == NukiOpener::LockAction::DeactivateRTO || action == NukiOpener::LockAction::DeactivateCM)
{
nukiOpenerInst->_nextLockAction = action;
return LockActionResult::Success;
}
return LockActionResult::AccessDenied;
break;
case AccessLevel::ReadOnly:
default:
return LockActionResult::AccessDenied;
break;
}
}
void NukiOpenerWrapper::onConfigUpdateReceivedCallback(const char *topic, const char *value)
@@ -503,6 +532,8 @@ void NukiOpenerWrapper::gpioActionCallback(const GpioAction &action, const int&
void NukiOpenerWrapper::onConfigUpdateReceived(const char *topic, const char *value)
{
if(_accessLevel != AccessLevel::Full) return;
if(strcmp(topic, mqtt_topic_config_button_enabled) == 0)
{
bool newValue = atoi(value) > 0;
@@ -528,6 +559,8 @@ void NukiOpenerWrapper::onConfigUpdateReceived(const char *topic, const char *va
void NukiOpenerWrapper::onKeypadCommandReceived(const char *command, const uint &id, const String &name, const String &code, const int& enabled)
{
if(_accessLevel != AccessLevel::Full) return;
if(!_hasKeypad)
{
if(_configRead)