// SPDX-License-Identifier: GPL-3.0-or-later /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2013 - 2024, nymea GmbH * Copyright (C) 2024 - 2025, chargebyte austria GmbH * * This file is part of nymea-plugins. * * nymea-plugins is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * nymea-plugins is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with nymea-plugins. If not, see . * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #ifndef NUKIUTILS_H #define NUKIUTILS_H #include #include #include #include class NukiUtils { Q_GADGET public: enum StatusCode { StatusCodeCompeted = 0x00, StatusCodeAccepted = 0x01 }; Q_ENUM(StatusCode) enum ErrorCode { ErrorCodeNoError = 0x00, // Pairing service error codes ErrorCodeNotInPairingMode = 0x10, ErrorCodeBadAuthenticator = 0x11, ErrorCodeBadPairingParameter = 0x12, ErrorCodeMaxUsersReached = 0x13, // Key turner service error codes ErrorCodeNotAuthorized = 0x20, ErrorCodeBadPin = 0x21, ErrorCodeBadNonce = 0x22, ErrorCodeBadParameter = 0x23, ErrorCodeInvalidAuthId = 0x24, ErrorCodeDisabled = 0x25, ErrorCodeRemoteNotAllowed = 0x26, ErrorCodeTimeNotAllowed = 0x27, ErrorCodeTooManyPinAttempts = 0x28, ErrorCodeAutoUnlockTooRecent = 0x40, ErrorCodePositionUnknown = 0x41, ErrorCodeMotorBlocked = 0x42, ErrorCodeClutchFailure = 0x43, ErrorCodeMotorTimeout = 0x44, ErrorCodeBusy = 0x45, // General error codes ErrorCodeBadCrc = 0xFD, ErrorCodeBadLength = 0xFE, ErrorCodeUnknown = 0xFF }; Q_ENUM(ErrorCode) enum LockState { LockStateUncalibrated = 0x00, LockStateLocked = 0x01, LockStateUnlocking = 0x02, LockStateUnlocked = 0x03, LockStateLocking = 0x04, LockStateUnlatched = 0x05, LockStateUnlockedLocknGoActive = 0x06, LockStateUnlatching = 0x07, LockStateMotorBlocked = 0xfe, LockStateUndefined = 0xff }; Q_ENUM(LockState) enum LockAction { LockActionUnlock = 0x01, LockActionLock = 0x02, LockActionUnlatch = 0x03, LockActionLockNGo = 0x04, LockActionLockNGoWithUnlatch = 0x05, LockActionFobAction1 = 0x81, LockActionFobAction2 = 0x82, LockActionFobAction3 = 0x83 }; Q_ENUM(LockAction) enum LockTrigger { LockTriggerBluetooth = 0x00, LockTriggerManual = 0x01, LockTriggerButton = 0x02 }; Q_ENUM(LockTrigger) enum NukiState { NukiStateUninitialized = 0x00, NukiStatePairingMode = 0x01, NukiStateDoorMode = 0x02 }; Q_ENUM(NukiState) enum Command { CommandRequestData = 0x0001, CommandPublicKey = 0x0003, CommandChallenge = 0x0004, CommandAuthorizationAuthenticator = 0x0005, CommandAuthorizationData = 0x0006, CommandAuthorizationId = 0x0007, CommandRemoveUserAuthorization = 0x0008, CommandRequestAuthorizationEntries = 0x0009, CommandAuthorizationEntry = 0x000A, CommandAuthorizationDataInvite = 0x000B, CommandNukiStates = 0x000C, CommandLockAction = 0x000D, CommandStatus = 0x000E, CommandMostRecentCommand = 0x000F, CommandOpeningsClosingsSummary = 0x0010, CommandBatteryReport = 0x0011, CommandErrorReport = 0x0012, CommandSetConfig = 0x0013, CommandRequestConfig = 0x0014, CommandConfig = 0x0015, CommandSetSecurityPIN = 0x0019, CommandRequestCalibration = 0x001A, CommandRequestReboot = 0x001D, CommandAuthorizationIdConfirmation = 0x001E, CommandAuthorizationIdInvite = 0x001F, CommandVerifySecurityPIN = 0x0020, CommandUpdateTime = 0x0021, CommandUpdateUserAuthorization = 0x0025, CommandAuthorizationEntryCount = 0x0027, CommandRequestDisconnect = 0x0030, CommandRequestLogEntries = 0x0031, CommandLogEntry = 0x0032, CommandLogEntryCount = 0x0033, CommandEnableLogging = 0x0034, CommandSetAdvancedConG = 0x0035, CommandRequestAdvancedConG = 0x0036, CommandAdvancedConG = 0x0037, CommandAddTimeControlEntry = 0x0039, CommandTimeControlEntryId = 0x003A, CommandRemoveTimeControlEntry = 0x003B, CommandRequestTimeControlEntries = 0x003C, CommandTimeControlEntryCount = 0x003D, CommandTimeControlEntry = 0x003E, CommandUpdateTimeControlEntry = 0x003F }; Q_ENUM(Command) // Data helpers static QString convertByteToHexString(const quint8 &byte); static QString convertByteArrayToHexString(const QByteArray &byteArray); static QString convertByteArrayToHexStringCompact(const QByteArray &byteArray); static QString convertUint16ToHexString(const quint16 &value); static QByteArray converUint32ToByteArrayLittleEndian(const quint32 &value); static QByteArray converUint16ToByteArrayLittleEndian(const quint16 &value); static quint16 convertByteArrayToUint16BigEndian(const QByteArray &littleEndianByteArray); static quint32 convertByteArrayToUint32BigEndian(const QByteArray &littleEndianByteArray); // Crc calculation static quint16 calculateCrc(const QByteArray &data); static bool validateMessageCrc(const QByteArray &message); // Message helper static QByteArray createRequestMessageForUnencrypted(NukiUtils::Command command, const QByteArray &payload); static QByteArray createRequestMessageForUnencryptedForEncryption(quint32 authenticationId, NukiUtils::Command command, const QByteArray &payload = QByteArray()); }; #endif // NUKIUTILS_H