diff --git a/src-admin/package.json b/src-admin/package.json index 10bba407..82b67c8d 100644 --- a/src-admin/package.json +++ b/src-admin/package.json @@ -6,7 +6,7 @@ "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-decorators": "^7.24.7", "@babel/plugin-proposal-private-property-in-object": "^7.21.11", - "@foxriver76/iob-component-lib": "^0.1.3", + "@foxriver76/iob-component-lib": "^0.1.5", "@iobroker/adapter-react-v5": "^6.0.8", "@iobroker/dm-gui-components": "^7.0.18", "@iobroker/type-detector": "^4.0.1", diff --git a/src-admin/src/App.tsx b/src-admin/src/App.tsx index 86461c2b..ba3ff40c 100644 --- a/src-admin/src/App.tsx +++ b/src-admin/src/App.tsx @@ -1,12 +1,10 @@ import { StyledEngineProvider, ThemeProvider } from '@mui/material/styles'; import React from 'react'; -import { AppBar, IconButton, Tab, Tabs } from '@mui/material'; +import { IconButton } from '@foxriver76/iob-component-lib'; +import { AppBar, Tab, Tabs } from '@mui/material'; -import { - SignalWifiConnectedNoInternet4 as IconNoConnection, - SignalCellularOff as IconNotAlive, -} from '@mui/icons-material'; +import { SignalCellularOff as IconNotAlive } from '@mui/icons-material'; import { AdminConnection, @@ -518,12 +516,13 @@ class App extends GenericApp { {this.state.alive ? null : } {this.state.backendRunning ? null : ( { this.refreshBackendSubscription(); }} - > - - + /> )} diff --git a/src-admin/src/Tabs/Controller.tsx b/src-admin/src/Tabs/Controller.tsx index 8683ea6f..9ce7a787 100644 --- a/src-admin/src/Tabs/Controller.tsx +++ b/src-admin/src/Tabs/Controller.tsx @@ -1,26 +1,9 @@ -import { InfoBox } from '@foxriver76/iob-component-lib'; +import { IconButton, InfoBox } from '@foxriver76/iob-component-lib'; import QrScanner from 'qr-scanner'; import React, { Component } from 'react'; -import { - Add, - Bluetooth, - BluetoothDisabled, - SettingsInputHdmi as ChannelIcon, - Close, - TabletAndroid as DeviceIcon, - KeyboardArrowDown, - KeyboardArrowUp, - LeakAdd, - KeyboardBackspace as ReadOnlyStateIcon, - CompareArrows as ReadWriteStateIcon, - Save, - Search, - SearchOff, - Wifi, - WifiOff, - ArrowRightAlt as WriteOnlyStateIcon, -} from '@mui/icons-material'; +import { Add, Bluetooth, BluetoothDisabled, Close, Save, Search, SearchOff } from '@mui/icons-material'; + import { Backdrop, Button, @@ -29,7 +12,6 @@ import { DialogActions, DialogContent, DialogTitle, - IconButton, LinearProgress, MenuItem, Select, @@ -40,16 +22,15 @@ import { TableHead, TableRow, TextField, - Tooltip, Typography, } from '@mui/material'; import type { AdminConnection, IobTheme, ThemeName, ThemeType } from '@iobroker/adapter-react-v5'; -import { I18n, IconClosed, IconOpen } from '@iobroker/adapter-react-v5'; +import { I18n } from '@iobroker/adapter-react-v5'; import DeviceManager from '@iobroker/dm-gui-components'; import type { CommissionableDevice, GUIMessage, MatterConfig } from '../types'; -import { clone, getText, getVendorName } from '../Utils'; +import { clone, getVendorName } from '../Utils'; const styles: Record = { panel: { @@ -143,7 +124,6 @@ interface ComponentState { hideVideo: boolean; nodes: Record; states: Record; - openedNodes: string[]; showQrCodeDialog: CommissionableDevice | null; } @@ -158,17 +138,6 @@ class Controller extends Component { constructor(props: ComponentProps) { super(props); - const openedNodesStr = window.localStorage.getItem('openedNodes'); - let openedNodes: string[]; - if (openedNodesStr) { - try { - openedNodes = JSON.parse(openedNodesStr); - } catch { - openedNodes = []; - } - } else { - openedNodes = []; - } this.state = { discovered: [], @@ -181,7 +150,6 @@ class Controller extends Component { hideVideo: false, nodes: {}, states: {}, - openedNodes, showQrCodeDialog: null, backendProcessingActive: false, bleDialogOpen: false, @@ -721,31 +689,24 @@ class Controller extends Component { {device.deviceIdentifier} {getVendorName(device.V)} - - ({ - color: '#fff', - backgroundColor: theme.palette.primary.main, - '&:hover': { backgroundColor: theme.palette.secondary.main }, - })} - onClick={() => { - this.setState({ - showQrCodeDialog: device, - manualCode: '', - qrCode: '', - }); - setTimeout(async () => { - try { - await this.initQrCode(); - } catch (e) { - console.warn(`Cannot provide QR Code scanning: ${e}`); - } - }, 500); - }} - > - - - + { + this.setState({ + showQrCodeDialog: device, + manualCode: '', + qrCode: '', + }); + setTimeout(async () => { + try { + await this.initQrCode(); + } catch (e) { + console.warn(`Cannot provide QR Code scanning: ${e}`); + } + }, 500); + }} + /> ))} @@ -783,61 +744,6 @@ class Controller extends Component { ); } - renderState(stateId: string) { - let icon: React.JSX.Element; - if (this.state.nodes[stateId].common.write === false && this.state.nodes[stateId].common.read !== false) { - icon = ; - } else if ( - this.state.nodes[stateId].common.write !== false && - this.state.nodes[stateId].common.read === false - ) { - icon = ; - } else { - icon = ; - } - - let state: string; - if (this.state.states[stateId]) { - if (this.state.states[stateId].val === null || this.state.states[stateId].val === undefined) { - state = '--'; - } else { - state = this.state.states[stateId].val?.toString() || '--'; - } - } else { - state = '--'; - } - - return ( - - - - {icon} - {stateId.split('.').pop()} - - {state} - - ); - } - - renderCluster(clusterId: string) { - const _clusterId = `${clusterId}.`; - const states = Object.keys(this.state.nodes).filter( - id => id.startsWith(_clusterId) && this.state.nodes[id].type === 'state', - ); - return [ - - - - - {clusterId.split('.').pop()} -
{states.length}
-
- -
, - states.map(id => this.renderState(id)), - ]; - } - /** * If BLE can be activated */ @@ -850,146 +756,6 @@ class Controller extends Component { ); } - renderDevice(deviceId: string, inBridge?: boolean) { - const _deviceId = `${deviceId}.`; - // get channels - const channels = Object.keys(this.state.nodes).filter( - id => id.startsWith(_deviceId) && this.state.nodes[id].type === 'channel', - ); - let connected: boolean | null = null; - let status: string | null = null; - if (!inBridge) { - connected = this.state.states[`${_deviceId}info.connection`] - ? !!this.state.states[`${_deviceId}info.connection`].val - : null; - const statusVal = this.state.states[`${_deviceId}info.status`]?.val; - if (statusVal !== null && statusVal !== undefined && statusVal !== '') { - status = statusVal.toString(); - const statusObj = this.state.nodes[`${_deviceId}info.status`]; - if (statusObj?.common?.states[status]) { - status = I18n.t(`status_${statusObj.common.states[status]}`).replace(/^status_/, ''); - } - } - } - - return [ - - - { - const openedNodes = [...this.state.openedNodes]; - const index = openedNodes.indexOf(deviceId); - if (index === -1) { - openedNodes.push(deviceId); - openedNodes.sort(); - } else { - openedNodes.splice(index, 1); - } - window.localStorage.setItem('openedNodes', JSON.stringify(openedNodes)); - this.setState({ openedNodes }); - }} - > - {this.state.openedNodes.includes(deviceId) ? : } - - - -
- -
-
-
{getText(this.state.nodes[deviceId].common.name)}
-
{deviceId.split('.').pop()}
-
-
{channels.length}
-
- - {connected !== null ? ( -
- {connected ? : } -
{status || ''}
-
- ) : null} -
-
, - this.state.openedNodes.includes(deviceId) ? channels.map(id => this.renderCluster(id)) : null, - ]; - } - - renderBridge(bridgeId: string) { - // find all devices in this bridge - const _bridgeId = `${bridgeId}.`; - const deviceIds = Object.keys(this.state.nodes).filter( - id => id.startsWith(_bridgeId) && this.state.nodes[id].type === 'device', - ); - - // get status - const connected = this.state.states[`${_bridgeId}info.connection`]?.val; - let status = this.state.states[`${_bridgeId}info.status`]?.val; - if (status !== null && status !== undefined && status !== '') { - status = status.toString(); - const statusObj = this.state.nodes[`${_bridgeId}info.status`]; - if (statusObj?.common?.states[status]) { - status = I18n.t(`status_${statusObj.common.states[status]}`).replace(/^status_/, ''); - } - } - - return [ - - - { - const openedNodes = [...this.state.openedNodes]; - const index = openedNodes.indexOf(bridgeId); - if (index === -1) { - openedNodes.push(bridgeId); - openedNodes.sort(); - } else { - openedNodes.splice(index, 1); - } - window.localStorage.setItem('openedNodes', JSON.stringify(openedNodes)); - this.setState({ openedNodes }); - }} - > - {this.state.openedNodes.includes(bridgeId) ? : } - - - -
{this.state.openedNodes.includes(bridgeId) ? : }
-
-
{getText(this.state.nodes[bridgeId].common.name)}
-
{bridgeId.split('.').pop()}
-
-
{deviceIds.length}
-
- -
- {connected ? : } -
{status || ''}
-
-
-
, - this.state.openedNodes.includes(bridgeId) ? deviceIds.map(id => this.renderDevice(id, true)) : null, - ]; - } - - renderDeviceOrBridge(deviceOrBridgeId: string) { - if (this.state.nodes[deviceOrBridgeId].type === 'device') { - return this.renderDevice(deviceOrBridgeId); - } - return this.renderBridge(deviceOrBridgeId); - } - - // eslint-disable-next-line react/no-unused-class-component-methods - renderDevicesAndBridges() { - // matter.0.controller.2808191892917842060 - const deviceOrBridgeIds = Object.keys(this.state.nodes).filter(id => id.split('.').length === 4); - return deviceOrBridgeIds.map(id => this.renderDeviceOrBridge(id)); - } - renderDeviceManager() { if (!this.state.nodes) { return null; diff --git a/src-admin/src/Tabs/Devices.tsx b/src-admin/src/Tabs/Devices.tsx index f281973b..b2c381b9 100644 --- a/src-admin/src/Tabs/Devices.tsx +++ b/src-admin/src/Tabs/Devices.tsx @@ -2,18 +2,8 @@ import { Types } from '@iobroker/type-detector'; import React from 'react'; import { v4 as uuidv4 } from 'uuid'; -import { - Add, - AutoMode, - Close, - Delete, - DeviceHub, - DomainDisabled, - Edit, - FormatListBulleted, - QuestionMark, - Save, -} from '@mui/icons-material'; +import { IconButton, InfoBox } from '@foxriver76/iob-component-lib'; +import { Add, AutoMode, Close, Delete, DeviceHub, FormatListBulleted, QuestionMark, Save } from '@mui/icons-material'; import { Button, Checkbox, @@ -24,7 +14,6 @@ import { Fab, FormControl, FormControlLabel, - IconButton, InputLabel, MenuItem, Select, @@ -38,8 +27,6 @@ import { } from '@mui/material'; import { I18n, SelectID } from '@iobroker/adapter-react-v5'; - -import { InfoBox } from '@foxriver76/iob-component-lib'; import DeviceDialog, { DEVICE_ICONS, SUPPORTED_DEVICES } from '../components/DeviceDialog'; import type { DetectedDevice, DeviceDescription, MatterConfig } from '../types'; import { clone, detectDevices, getText } from '../Utils'; @@ -863,75 +850,69 @@ class Devices extends BridgesAndDevices { {device.enabled ? ( - - { - this.setState({ - editDeviceDialog: { - type: 'device', - name: getText(device.name), - originalName: getText(device.name), - deviceIndex: index, - auto: !!device.auto, - deviceType: device.type, - originalDeviceType: device.type, - vendorID: device.vendorID || '', - productID: device.productID || '', - originalVendorID: device.vendorID || '', - originalProductID: device.productID || '', - originalNoComposed: !!device.noComposed, - noComposed: !!device.noComposed, - dimmerOnLevel: Number(device.dimmerOnLevel) || 0, - originalDimmerOnLevel: Number(device.dimmerOnLevel) || 0, - dimmerUseLastLevelForOn: !!device.dimmerUseLastLevelForOn, - originalDimmerUseLastLevelForOn: !!device.dimmerUseLastLevelForOn, - actionAllowedByIdentify: !!device.actionAllowedByIdentify, - originalActionAllowedByIdentify: !!device.actionAllowedByIdentify, - hasOnState: !!device.hasOnState, - }, - }); - }} - > - - - - ) : null} - - - {this.props.alive && device.enabled ? ( - - - this.setState({ - showResetDialog: { bridgeOrDevice: device, step: 0 }, - }) - } - > - - - - ) : null} - - - - { this.setState({ - deleteDialog: { + editDeviceDialog: { type: 'device', name: getText(device.name), + originalName: getText(device.name), deviceIndex: index, + auto: !!device.auto, + deviceType: device.type, + originalDeviceType: device.type, + vendorID: device.vendorID || '', + productID: device.productID || '', + originalVendorID: device.vendorID || '', + originalProductID: device.productID || '', + originalNoComposed: !!device.noComposed, + noComposed: !!device.noComposed, + dimmerOnLevel: Number(device.dimmerOnLevel) || 0, + originalDimmerOnLevel: Number(device.dimmerOnLevel) || 0, + dimmerUseLastLevelForOn: !!device.dimmerUseLastLevelForOn, + originalDimmerUseLastLevelForOn: !!device.dimmerUseLastLevelForOn, + actionAllowedByIdentify: !!device.actionAllowedByIdentify, + originalActionAllowedByIdentify: !!device.actionAllowedByIdentify, + hasOnState: !!device.hasOnState, }, }); }} - > - - - + /> + ) : null} + + + {this.props.alive && device.enabled ? ( + + this.setState({ + showResetDialog: { bridgeOrDevice: device, step: 0 }, + }) + } + /> + ) : null} + + + + { + this.setState({ + deleteDialog: { + type: 'device', + name: getText(device.name), + deviceIndex: index, + }, + }); + }} + /> ); diff --git a/src-admin/src/Tabs/Options.tsx b/src-admin/src/Tabs/Options.tsx index 4384ef02..dae879fd 100644 --- a/src-admin/src/Tabs/Options.tsx +++ b/src-admin/src/Tabs/Options.tsx @@ -36,7 +36,7 @@ const styles: Record = { flexDirection: 'column', }, input: { - marginTop: 1, + marginTop: 2, marginBottom: 1, width: '100%', maxWidth: 300, diff --git a/src-admin/src/i18n/de.json b/src-admin/src/i18n/de.json index 81ee1518..4aab2a7d 100644 --- a/src-admin/src/i18n/de.json +++ b/src-admin/src/i18n/de.json @@ -44,6 +44,7 @@ "Delete device": "Gerät löschen", "Device is already commissioned. You cannot change the name or the vendor/product ID.": "Gerät ist bereits in Betrieb genommen. Sie können den Namen oder die Anbieter-/Produkt-ID nicht ändern.", "Device is already commissioning. Show status information": "Gerät wird bereits in Betrieb genommen. Statusinformationen anzeigen", + "Device is not commissioned. Show QR Code for commissioning": "Gerät ist nicht in Betrieb genommen. QR-Code zur Inbetriebnahme anzeigen", "Device names": "Gerätenamen", "Device or bridge will lost all commissioning information and you must reconnect (with PIN or QR code) again.": "Beim Gerät oder der Bridge gehen alle Inbetriebnahmeinformationen verloren und Sie müssen die Verbindung (mit PIN oder QR-Code) erneut herstellen.", "Device type": "Gerätetyp", diff --git a/src-admin/src/i18n/en.json b/src-admin/src/i18n/en.json index 452aefa0..6afea1fa 100644 --- a/src-admin/src/i18n/en.json +++ b/src-admin/src/i18n/en.json @@ -44,6 +44,7 @@ "Delete device": "Delete device", "Device is already commissioned. You cannot change the name or the vendor/product ID.": "Device is already commissioned. You cannot change the name or the vendor/product ID.", "Device is already commissioning. Show status information": "Device is already commissioning. Show status information", + "Device is not commissioned. Show QR Code for commissioning": "Device is not commissioned. Show QR Code for commissioninn", "Device names": "Device names", "Device or bridge will lost all commissioning information and you must reconnect (with PIN or QR code) again.": "Device or bridge will lost all commissioning information and you must reconnect (with PIN or QR code) again.", "Device type": "Device type", diff --git a/src-admin/src/i18n/es.json b/src-admin/src/i18n/es.json index 1b5a7ef4..8e927d97 100644 --- a/src-admin/src/i18n/es.json +++ b/src-admin/src/i18n/es.json @@ -44,6 +44,7 @@ "Delete device": "Eliminar dispositivo", "Device is already commissioned. You cannot change the name or the vendor/product ID.": "El dispositivo ya está en funcionamiento. No puede cambiar el nombre ni el ID del proveedor/producto.", "Device is already commissioning. Show status information": "El dispositivo ya se está poniendo en marcha. Mostrar información de estado", + "Device is not commissioned. Show QR Code for commissioning": "El dispositivo no está en servicio. Mostrar código QR para commissioninn", "Device names": "Nombres de dispositivos", "Device or bridge will lost all commissioning information and you must reconnect (with PIN or QR code) again.": "El dispositivo o puente perderá toda la información de puesta en servicio y deberá volver a conectarse (con PIN o código QR).", "Device type": "Tipo de dispositivo", diff --git a/src-admin/src/i18n/fr.json b/src-admin/src/i18n/fr.json index b81217a7..c14d9ce3 100644 --- a/src-admin/src/i18n/fr.json +++ b/src-admin/src/i18n/fr.json @@ -44,6 +44,7 @@ "Delete device": "Supprimer l'appareil", "Device is already commissioned. You cannot change the name or the vendor/product ID.": "L'appareil est déjà mis en service. Vous ne pouvez pas modifier le nom ou l'ID du fournisseur/produit.", "Device is already commissioning. Show status information": "L'appareil est déjà en cours de mise en service. Afficher les informations d'état", + "Device is not commissioned. Show QR Code for commissioning": "L'appareil n'est pas mis en service. Afficher le code QR pour la mise en service", "Device names": "Noms des appareils", "Device or bridge will lost all commissioning information and you must reconnect (with PIN or QR code) again.": "L'appareil ou le pont perdra toutes les informations de mise en service et vous devrez vous reconnecter (avec code PIN ou QR code).", "Device type": "Type d'appareil", diff --git a/src-admin/src/i18n/it.json b/src-admin/src/i18n/it.json index e4831a10..16a9542c 100644 --- a/src-admin/src/i18n/it.json +++ b/src-admin/src/i18n/it.json @@ -44,6 +44,7 @@ "Delete device": "Elimina dispositivo", "Device is already commissioned. You cannot change the name or the vendor/product ID.": "Il dispositivo è già messo in servizio. Non è possibile modificare il nome o l'ID fornitore/prodotto.", "Device is already commissioning. Show status information": "Il dispositivo è già in fase di messa in servizio. Mostra informazioni sullo stato", + "Device is not commissioned. Show QR Code for commissioning": "Il dispositivo non è in funzione. Mostra il codice QR per la messa in funzione", "Device names": "Nomi dei dispositivi", "Device or bridge will lost all commissioning information and you must reconnect (with PIN or QR code) again.": "Il dispositivo o il bridge perderanno tutte le informazioni di messa in servizio e sarà necessario riconnettersi nuovamente (con PIN o codice QR).", "Device type": "Tipo di dispositivo", diff --git a/src-admin/src/i18n/nl.json b/src-admin/src/i18n/nl.json index 770118a5..ea23b9d1 100644 --- a/src-admin/src/i18n/nl.json +++ b/src-admin/src/i18n/nl.json @@ -44,6 +44,7 @@ "Delete device": "Apparaat verwijderen", "Device is already commissioned. You cannot change the name or the vendor/product ID.": "Apparaat is al in gebruik genomen. U kunt de naam of de leverancier/product-ID niet wijzigen.", "Device is already commissioning. Show status information": "Apparaat is al in bedrijf. Statusinformatie weergeven", + "Device is not commissioned. Show QR Code for commissioning": "Apparaat is niet in bedrijf gesteld. QR-code voor commissioninn weergeven", "Device names": "Apparaatnamen", "Device or bridge will lost all commissioning information and you must reconnect (with PIN or QR code) again.": "Apparaat of bridge verliest alle inbedrijfstellingsinformatie en u moet opnieuw verbinding maken (met pincode of QR-code).", "Device type": "Soort apparaat", diff --git a/src-admin/src/i18n/pl.json b/src-admin/src/i18n/pl.json index bf460b53..9c67d8a2 100644 --- a/src-admin/src/i18n/pl.json +++ b/src-admin/src/i18n/pl.json @@ -44,6 +44,7 @@ "Delete device": "Usuń urządzenie", "Device is already commissioned. You cannot change the name or the vendor/product ID.": "Urządzenie zostało już uruchomione. Nie można zmienić nazwy ani identyfikatora dostawcy/produktu.", "Device is already commissioning. Show status information": "Urządzenie jest już uruchamiane. Pokaż informacje o stanie", + "Device is not commissioned. Show QR Code for commissioning": "Urządzenie nie jest uruchomione. Pokaż kod QR dla commissioninn", "Device names": "Nazwy urządzeń", "Device or bridge will lost all commissioning information and you must reconnect (with PIN or QR code) again.": "Urządzenie lub most utraci wszystkie informacje dotyczące uruchomienia i konieczne będzie ponowne nawiązanie połączenia (za pomocą kodu PIN lub QR).", "Device type": "Rodzaj urządzenia", diff --git a/src-admin/src/i18n/pt.json b/src-admin/src/i18n/pt.json index da5ecf8b..384e78ef 100644 --- a/src-admin/src/i18n/pt.json +++ b/src-admin/src/i18n/pt.json @@ -44,6 +44,7 @@ "Delete device": "Excluir dispositivo", "Device is already commissioned. You cannot change the name or the vendor/product ID.": "O dispositivo já está comissionado. Você não pode alterar o nome ou o ID do fornecedor/produto.", "Device is already commissioning. Show status information": "O dispositivo já está em comissionamento. Mostrar informações de status", + "Device is not commissioned. Show QR Code for commissioning": "O dispositivo não está comissionado. Mostrar QR Code para comissioninn", "Device names": "Nomes de dispositivos", "Device or bridge will lost all commissioning information and you must reconnect (with PIN or QR code) again.": "O dispositivo ou ponte perderá todas as informações de comissionamento e você deverá reconectar (com PIN ou código QR) novamente.", "Device type": "Tipo de dispositivo", diff --git a/src-admin/src/i18n/ru.json b/src-admin/src/i18n/ru.json index a10c571b..192303c5 100644 --- a/src-admin/src/i18n/ru.json +++ b/src-admin/src/i18n/ru.json @@ -44,6 +44,7 @@ "Delete device": "Удалить устройство", "Device is already commissioned. You cannot change the name or the vendor/product ID.": "Устройство уже введено в эксплуатацию. Вы не можете изменить имя или идентификатор поставщика/продукта.", "Device is already commissioning. Show status information": "Устройство уже вводится в эксплуатацию. Показать информацию о статусе", + "Device is not commissioned. Show QR Code for commissioning": "Устройство не введено в эксплуатацию. Показать QR-код для commissioninn", "Device names": "Имена устройств", "Device or bridge will lost all commissioning information and you must reconnect (with PIN or QR code) again.": "Устройство или мост потеряют всю информацию о вводе в эксплуатацию, и вам придется повторно подключиться (с помощью PIN-кода или QR-кода).", "Device type": "Тип устройства", diff --git a/src-admin/src/i18n/uk.json b/src-admin/src/i18n/uk.json index f9b4e567..86548d39 100644 --- a/src-admin/src/i18n/uk.json +++ b/src-admin/src/i18n/uk.json @@ -44,6 +44,7 @@ "Delete device": "Видалити пристрій", "Device is already commissioned. You cannot change the name or the vendor/product ID.": "Апарат вже зданий в експлуатацію. Ви не можете змінити назву чи ідентифікатор постачальника/продукту.", "Device is already commissioning. Show status information": "Пристрій вже введено в експлуатацію. Показати інформацію про стан", + "Device is not commissioned. Show QR Code for commissioning": "Апарат не зданий в експлуатацію. Показати QR-код для комісії", "Device names": "Назви пристроїв", "Device or bridge will lost all commissioning information and you must reconnect (with PIN or QR code) again.": "Пристрій або міст втратить всю інформацію про введення в експлуатацію, і ви повинні знову підключитися (за допомогою PIN-коду або QR-коду).", "Device type": "Тип пристрою", diff --git a/src-admin/src/i18n/zh-cn.json b/src-admin/src/i18n/zh-cn.json index 9f54daad..afdab8c1 100644 --- a/src-admin/src/i18n/zh-cn.json +++ b/src-admin/src/i18n/zh-cn.json @@ -44,6 +44,7 @@ "Delete device": "删除设备", "Device is already commissioned. You cannot change the name or the vendor/product ID.": "设备已投入使用。您无法更改名称或供应商/产品 ID。", "Device is already commissioning. Show status information": "设备已经投入调试。显示状态信息", + "Device is not commissioned. Show QR Code for commissioning": "设备未调试。显示 commissioninn 的二维码", "Device names": "设备名称", "Device or bridge will lost all commissioning information and you must reconnect (with PIN or QR code) again.": "设备或网桥将丢失所有调试信息,您必须再次重新连接(使用 PIN 或 QR 码)。", "Device type": "设备类型",