This commit is contained in:
iranl
2024-02-17 22:56:02 +01:00
parent 8ba8bf36fc
commit 533296878f
8 changed files with 80 additions and 33 deletions

View File

@@ -74,6 +74,14 @@ void Gpio::init()
pinMode(entry.pin, INPUT_PULLUP); pinMode(entry.pin, INPUT_PULLUP);
attachInterrupt(entry.pin, isrDeactivateRtoCm, FALLING); attachInterrupt(entry.pin, isrDeactivateRtoCm, FALLING);
break; break;
case PinRole::InputDeactivateRTO:
pinMode(entry.pin, INPUT_PULLUP);
attachInterrupt(entry.pin, isrDeactivateRTO, FALLING);
break;
case PinRole::InputDeactivateCM:
pinMode(entry.pin, INPUT_PULLUP);
attachInterrupt(entry.pin, isrDeactivateCM, FALLING);
break;
case PinRole::OutputHighLocked: case PinRole::OutputHighLocked:
case PinRole::OutputHighUnlocked: case PinRole::OutputHighUnlocked:
case PinRole::OutputHighMotorBlocked: case PinRole::OutputHighMotorBlocked:
@@ -199,6 +207,10 @@ String Gpio::getRoleDescription(PinRole role) const
return "Input: Activate CM"; return "Input: Activate CM";
case PinRole::InputDeactivateRtoCm: case PinRole::InputDeactivateRtoCm:
return "Input: Deactivate RTO/CM"; return "Input: Deactivate RTO/CM";
case PinRole::InputDeactivateRTO:
return "Input: Deactivate RTO";
case PinRole::InputDeactivateCM:
return "Input: Deactivate CM";
case PinRole::OutputHighLocked: case PinRole::OutputHighLocked:
return "Output: High when locked"; return "Output: High when locked";
case PinRole::OutputHighUnlocked: case PinRole::OutputHighUnlocked:
@@ -327,6 +339,20 @@ void Gpio::isrDeactivateRtoCm()
_debounceTs = millis() + _debounceTime; _debounceTs = millis() + _debounceTime;
} }
void Gpio::isrDeactivateRTO()
{
if(millis() < _debounceTs) return;
_inst->notify(GpioAction::DeactivateRTO, -1);
_debounceTs = millis() + _debounceTime;
}
void Gpio::isrDeactivateCM()
{
if(millis() < _debounceTs) return;
_inst->notify(GpioAction::DeactivateCM, -1);
_debounceTs = millis() + _debounceTime;
}
void Gpio::setPinOutput(const uint8_t& pin, const uint8_t& state) void Gpio::setPinOutput(const uint8_t& pin, const uint8_t& state)
{ {
digitalWrite(pin, state); digitalWrite(pin, state);

8
Gpio.h
View File

@@ -16,6 +16,8 @@ enum class PinRole
InputActivateRTO, InputActivateRTO,
InputActivateCM, InputActivateCM,
InputDeactivateRtoCm, InputDeactivateRtoCm,
InputDeactivateRTO,
InputDeactivateCM,
OutputHighLocked, OutputHighLocked,
OutputHighUnlocked, OutputHighUnlocked,
OutputHighMotorBlocked, OutputHighMotorBlocked,
@@ -38,6 +40,8 @@ enum class GpioAction
ActivateRTO, ActivateRTO,
ActivateCM, ActivateCM,
DeactivateRtoCm, DeactivateRtoCm,
DeactivateRTO,
DeactivateCM,
GeneralInput GeneralInput
}; };
@@ -88,6 +92,8 @@ private:
PinRole::InputActivateRTO, PinRole::InputActivateRTO,
PinRole::InputActivateCM, PinRole::InputActivateCM,
PinRole::InputDeactivateRtoCm, PinRole::InputDeactivateRtoCm,
PinRole::InputDeactivateRTO,
PinRole::InputDeactivateCM,
PinRole::OutputHighLocked, PinRole::OutputHighLocked,
PinRole::OutputHighUnlocked, PinRole::OutputHighUnlocked,
PinRole::OutputHighRtoActive, PinRole::OutputHighRtoActive,
@@ -110,6 +116,8 @@ private:
static void IRAM_ATTR isrActivateRTO(); static void IRAM_ATTR isrActivateRTO();
static void IRAM_ATTR isrActivateCM(); static void IRAM_ATTR isrActivateCM();
static void IRAM_ATTR isrDeactivateRtoCm(); static void IRAM_ATTR isrDeactivateRtoCm();
static void IRAM_ATTR isrDeactivateRTO();
static void IRAM_ATTR isrDeactivateCM();
std::vector<std::function<void(const GpioAction&, const int&)>> _callbacks; std::vector<std::function<void(const GpioAction&, const int&)>> _callbacks;

View File

@@ -18,7 +18,7 @@
#define mqtt_topic_query_battery "/lock/query/battery" #define mqtt_topic_query_battery "/lock/query/battery"
#define mqtt_topic_query_lockstate_command_result "/lock/query/lockstateCommandResult" #define mqtt_topic_query_lockstate_command_result "/lock/query/lockstateCommandResult"
#define mqtt_topic_lock_binary_state "/lock/binaryState" #define mqtt_topic_lock_binary_state "/lock/binaryState"
#define mqtt_topic_lock_continous_mode "/lock/continousMode" #define mqtt_topic_lock_continuous_mode "/lock/continuousMode"
#define mqtt_topic_lock_trigger "/lock/trigger" #define mqtt_topic_lock_trigger "/lock/trigger"
#define mqtt_topic_lock_last_lock_action "/lock/lastLockAction" #define mqtt_topic_lock_last_lock_action "/lock/lastLockAction"
#define mqtt_topic_lock_log "/lock/log" #define mqtt_topic_lock_log "/lock/log"

View File

@@ -1166,21 +1166,24 @@ void Network::publishHASSConfigContinuousMode(char *deviceType, const char *base
if (discoveryTopic != "") if (discoveryTopic != "")
{ {
publishHassTopic("binary_sensor", publishHassTopic("switch",
"continuous_mode", "continuous_mode",
uidString, uidString,
"_continuous_mode", "_continuous_mode",
"Continuous mode", "Continuous mode",
name, name,
baseTopic, baseTopic,
String("~") + mqtt_topic_lock_continous_mode, String("~") + mqtt_topic_lock_continuous_mode,
deviceType, deviceType,
"lock", "lock",
"", "",
"", "",
"", String("~") + mqtt_topic_lock_action,
{{"pl_on", "on"}, {{ "enabled_by_default", "false" },
{"pl_off", "off"}}); {"state_on", "on"},
{"state_on", "off"},
{"pl_on", "activateCM"},
{"pl_off", "deactivateCM"}});
} }
} }

View File

@@ -210,14 +210,7 @@ void NetworkOpener::publishKeyTurnerState(const NukiOpener::OpenerState& keyTurn
if((_firstTunerStatePublish || keyTurnerState.lockState != lastKeyTurnerState.lockState || keyTurnerState.nukiState != lastKeyTurnerState.nukiState) && keyTurnerState.lockState != NukiOpener::LockState::Undefined) if((_firstTunerStatePublish || keyTurnerState.lockState != lastKeyTurnerState.lockState || keyTurnerState.nukiState != lastKeyTurnerState.nukiState) && keyTurnerState.lockState != NukiOpener::LockState::Undefined)
{ {
if(keyTurnerState.nukiState == NukiOpener::State::ContinuousMode) publishString(mqtt_topic_lock_state, str);
{
publishString(mqtt_topic_lock_state, "ContinuousMode");
}
else
{
publishString(mqtt_topic_lock_state, str);
}
if(_haEnabled) if(_haEnabled)
{ {
@@ -229,8 +222,10 @@ void NetworkOpener::publishKeyTurnerState(const NukiOpener::OpenerState& keyTurn
if(keyTurnerState.nukiState == NukiOpener::State::ContinuousMode) if(keyTurnerState.nukiState == NukiOpener::State::ContinuousMode)
{ {
publishString(mqtt_topic_lock_continuous_mode, "on");
json["continuous_mode"] = 1; json["continuous_mode"] = 1;
} else { } else {
publishString(mqtt_topic_lock_continuous_mode, "off");
json["continuous_mode"] = 0; json["continuous_mode"] = 0;
} }
@@ -291,12 +286,9 @@ void NetworkOpener::publishState(NukiOpener::OpenerState lockState)
{ {
publishString(mqtt_topic_lock_ha_state, "unlocked"); publishString(mqtt_topic_lock_ha_state, "unlocked");
publishString(mqtt_topic_lock_binary_state, "unlocked"); publishString(mqtt_topic_lock_binary_state, "unlocked");
publishString(mqtt_topic_lock_continous_mode, "on");
} }
else else
{ {
publishString(mqtt_topic_lock_continous_mode, "off");
switch (lockState.lockState) switch (lockState.lockState)
{ {
case NukiOpener::LockState::Locked: case NukiOpener::LockState::Locked:

View File

@@ -291,6 +291,16 @@ void NukiOpenerWrapper::deactivateRtoCm()
} }
} }
void NukiOpenerWrapper::deactivateRTO()
{
_nextLockAction = NukiOpener::LockAction::DeactivateRTO;
}
void NukiOpenerWrapper::deactivateCM()
{
_nextLockAction = NukiOpener::LockAction::DeactivateCM;
}
bool NukiOpenerWrapper::isPinSet() bool NukiOpenerWrapper::isPinSet()
{ {
return _nukiOpener.getSecurityPincode() != 0; return _nukiOpener.getSecurityPincode() != 0;
@@ -347,12 +357,10 @@ void NukiOpenerWrapper::updateKeyTurnerState()
{ {
Log->println(F("Continuous Mode")); Log->println(F("Continuous Mode"));
} }
else
{ char lockStateStr[20];
char lockStateStr[20]; lockstateToString(_keyTurnerState.lockState, lockStateStr);
lockstateToString(_keyTurnerState.lockState, lockStateStr); Log->println(lockStateStr);
Log->println(lockStateStr);
}
} }
if(_publishAuthData) if(_publishAuthData)
@@ -535,6 +543,12 @@ void NukiOpenerWrapper::gpioActionCallback(const GpioAction &action, const int&
case GpioAction::DeactivateRtoCm: case GpioAction::DeactivateRtoCm:
nukiOpenerInst->deactivateRtoCm(); nukiOpenerInst->deactivateRtoCm();
break; break;
case GpioAction::DeactivateRTO:
nukiOpenerInst->deactivateRTO();
break;
case GpioAction::DeactivateCM:
nukiOpenerInst->deactivateCM();
break;
} }
} }

View File

@@ -22,6 +22,8 @@ public:
void activateRTO(); void activateRTO();
void activateCM(); void activateCM();
void deactivateRtoCm(); void deactivateRtoCm();
void deactivateRTO();
void deactivateCM();
bool isPinSet(); bool isPinSet();
void setPin(const uint16_t pin); void setPin(const uint16_t pin);

View File

@@ -199,7 +199,9 @@ can be configured for a specific role:
- Input: Electric strike actuation: When connect to Ground, an electric strike actuation command is sent to the opener (open door for configured amount of time) - Input: Electric strike actuation: When connect to Ground, an electric strike actuation command is sent to the opener (open door for configured amount of time)
- Input: Activate RTO: When connect to Ground, Ring-to-open is activated (opener) - Input: Activate RTO: When connect to Ground, Ring-to-open is activated (opener)
- Input: Activate CM: When connect to Ground, Continuous mode is activated (opener) - Input: Activate CM: When connect to Ground, Continuous mode is activated (opener)
- Input: Deactivate RTO/CM: Disable RTO or CM, depending on which is active - Input: Deactivate RTO/CM: Disable RTO or CM, depending on which is active (opener)
- Input: Dectivate RTO: When connect to Ground, Ring-to-open is deactivated (opener)
- Input: Dectivate CM: When connect to Ground, Continuous mode is deactivated (opener)
- Output: High when locked: Outputs a high signal when the door is locked - Output: High when locked: Outputs a high signal when the door is locked
- Output: High when unlocked: Outputs a high signal when the door is unlocked - Output: High when unlocked: Outputs a high signal when the door is unlocked
- Output: High when motor blocked: Outputs a high signal when the motor is blocked (lock) - Output: High when motor blocked: Outputs a high signal when the motor is blocked (lock)