Clean up if setup failes for nuki

master
Simon Stürz 2021-03-22 09:53:30 +01:00
parent c1da14fd55
commit 7b1b5620e1
4 changed files with 42 additions and 43 deletions

View File

@ -129,7 +129,6 @@ void IntegrationPluginNuki::discoverThings(ThingDiscoveryInfo *info)
m_bluetoothAdapter->startDiscovering();
QTimer::singleShot(5000, info, [this, info]() { onBluetoothDiscoveryFinished(info); });
}
void IntegrationPluginNuki::startPairing(ThingPairingInfo *info)
@ -159,14 +158,48 @@ void IntegrationPluginNuki::confirmPairing(ThingPairingInfo *info, const QString
return info->finish(Thing::ThingErrorThingNotFound);
}
// Create a temporary nuki for authentication
BluetoothDevice *bluetoothDevice = m_bluetoothAdapter->getDevice(address);
m_asyncSetupNuki = new Nuki(nullptr, bluetoothDevice, this);
connect(m_asyncSetupNuki, &Nuki::authenticationProcessFinished, this, &IntegrationPluginNuki::onNukiAuthenticationProcessFinished);
connect(m_asyncSetupNuki, &Nuki::availableChanged, this, &IntegrationPluginNuki::onAsyncSetupNukiAvailableChanged);
connect(m_asyncSetupNuki, &Nuki::authenticationProcessFinished, this, [=](const PairingTransactionId &pairingId, bool success){
if (m_asyncSetupNuki) {
qCDebug(dcNuki()) << "Deleting the temporary pairing device";
m_asyncSetupNuki->deleteLater();
m_asyncSetupNuki = nullptr;
}
if (!m_pairingInfo) {
qCWarning(dcNuki()) << "Authentication process finished, but have not valid pairing translaction id";
return;
}
if (m_pairingInfo->transactionId() != pairingId) {
qCWarning(dcNuki()) << "Authentication process finished, but have not valid pairing translaction id";
return;
}
m_pairingInfo->finish(success ? Thing::ThingErrorNoError : Thing::ThingErrorHardwareFailure);
m_pairingInfo = nullptr;
});
connect(m_asyncSetupNuki, &Nuki::availableChanged, this, [=](bool available){
// Remove possibly running Nuki setup devices on disconnected
if (m_asyncSetupNuki && !available) {
qCDebug(dcNuki()) << "Deleting the temporary pairing device";
m_asyncSetupNuki->deleteLater();
m_asyncSetupNuki = nullptr;
// Lost connection during authentication
if (m_pairingInfo) {
qCWarning(dcNuki()) << "Device disconnected during pairing.";
m_pairingInfo->finish(Thing::ThingErrorHardwareFailure);
m_pairingInfo = nullptr;
}
}
});
m_asyncSetupNuki->startAuthenticationProcess(info->transactionId());
m_pairingInfo = info;
m_asyncSetupNuki->startAuthenticationProcess(info->transactionId());
connect(info, &ThingPairingInfo::destroyed, this, [this] { m_pairingInfo = nullptr; });
}
@ -225,7 +258,7 @@ void IntegrationPluginNuki::thingRemoved(Thing *thing)
Nuki *nuki = m_nukiDevices.key(thing);
nuki->clearSettings();
// FIXME: deauthenticate nymea from nuki thing
// TODO: deauthenticate nymea from nuki
qCDebug(dcNuki()) << "Delete pairing information from bluez" << nuki->bluetoothDevice();
m_bluetoothAdapter->removeDevice(nuki->bluetoothDevice()->address());
@ -298,35 +331,3 @@ void IntegrationPluginNuki::onBluetoothDiscoveryFinished(ThingDiscoveryInfo *inf
info->finish(Thing::ThingErrorNoError);
}
void IntegrationPluginNuki::onAsyncSetupNukiAvailableChanged(bool available)
{
// Remove possibly running Nuki setup devices on disconnected
if (!available && m_asyncSetupNuki) {
qCDebug(dcNuki()) << "Deleting the temporary pairing device";
m_asyncSetupNuki->deleteLater();
m_asyncSetupNuki = nullptr;
}
}
void IntegrationPluginNuki::onNukiAuthenticationProcessFinished(const PairingTransactionId &pairingTransactionId, bool success)
{
if (m_asyncSetupNuki) {
qCDebug(dcNuki()) << "Deleting the temporary pairing device";
m_asyncSetupNuki->deleteLater();
m_asyncSetupNuki = nullptr;
}
if (!m_pairingInfo) {
qCWarning(dcNuki()) << "Authentication process finished, but have not valid pairing translaction id";
return;
}
if (m_pairingInfo->transactionId() != pairingTransactionId) {
qCWarning(dcNuki()) << "Authentication process finished, but have not valid pairing translaction id";
return;
}
m_pairingInfo->finish(success ? Thing::ThingErrorNoError : Thing::ThingErrorHardwareFailure);
m_pairingInfo = nullptr;
}

View File

@ -76,10 +76,6 @@ private slots:
void onBluetoothEnabledChanged(const bool &enabled);
void onBluetoothDiscoveryFinished(ThingDiscoveryInfo *info);
void onAsyncSetupNukiAvailableChanged(bool available);
void onNukiAuthenticationProcessFinished(const PairingTransactionId &pairingTransactionId, bool success);
};
#endif // INTEGRATIONPLUGINNUKI_H

View File

@ -153,6 +153,7 @@ void Nuki::printServices()
void Nuki::readDeviceInformationCharacteristics()
{
qCDebug(dcNuki()) << "Start reading device information";
m_initUuidsToRead.append(QBluetoothUuid::SerialNumberString);
m_initUuidsToRead.append(QBluetoothUuid::HardwareRevisionString);
m_initUuidsToRead.append(QBluetoothUuid::FirmwareRevisionString);

View File

@ -312,7 +312,8 @@ void NukiController::processUserDataNotification(const QByteArray nonce, quint32
if (command == NukiUtils::CommandNukiStates) {
processNukiStatesData(payload);
emit readNukiStatesFinished(true);
setState(NukiControllerStateReadingConfigurationRequestChallange);
// TODO: read configuration
setState(NukiControllerStateIdle);
return;
}
break;