zigbee2mqtt-frontend 0.6.40 → 0.6.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.html CHANGED
@@ -1 +1 @@
1
- <!doctype html><html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width,initial-scale=1"><title>Zigbee2MQTT</title><link rel="shortcut icon" type="image/x-icon" href="favicon.ico"/><link rel="subresource" href="./css/light.css"/><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.2/css/all.min.css" integrity="sha512-HK5fgLBL+xu6dm/Ii3z4xhlSUyZgTT9tuc/hSrtw6uzJOvgRr2a9jyxxT1ely+B+xFAmJKVSTbpM/CuL7qxO8w==" crossorigin="anonymous"/><link rel="apple-touch-icon" href="apple-touch-icon.png" sizes="150x150"><script defer="defer" src="runtime.3296ac9a5caef629c7d6.js"></script><script defer="defer" src="scripts/vendor.fe0460b81c107166f365.js"></script><script defer="defer" src="main.6b396bb99c238368484b.js"></script><link href="scripts/vendor.109be7bda8112bf971cc.css" rel="stylesheet"><link href="main.ac25730e30bfe2874d71.css" rel="stylesheet"></head><body><div id="root" class="wrapper"></div></body></html>
1
+ <!doctype html><html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width,initial-scale=1"><title>Zigbee2MQTT</title><link rel="shortcut icon" type="image/x-icon" href="favicon.ico"/><link rel="subresource" href="./css/light.css"/><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.2/css/all.min.css" integrity="sha512-HK5fgLBL+xu6dm/Ii3z4xhlSUyZgTT9tuc/hSrtw6uzJOvgRr2a9jyxxT1ely+B+xFAmJKVSTbpM/CuL7qxO8w==" crossorigin="anonymous"/><link rel="apple-touch-icon" href="apple-touch-icon.png" sizes="150x150"><script defer="defer" src="runtime.3296ac9a5caef629c7d6.js"></script><script defer="defer" src="scripts/vendor.fe0460b81c107166f365.js"></script><script defer="defer" src="main.34bd7830a3129d1cb8c9.js"></script><link href="scripts/vendor.109be7bda8112bf971cc.css" rel="stylesheet"><link href="main.7379448ff31d4e2a65b8.css" rel="stylesheet"></head><body><div id="root" class="wrapper"></div></body></html>
@@ -253,10 +253,6 @@ const getStarShape = (innerCircleArms, innerRadius, outerRadius) => {
253
253
  }
254
254
  return points;
255
255
  };
256
- const offlineTimeout = (/* unused pure expression or super */ null && (3600 * 2));
257
- const isOnline = (device) => {
258
- return true;
259
- };
260
256
  class Node extends react.Component {
261
257
  constructor() {
262
258
  super(...arguments);
@@ -298,10 +294,10 @@ class Node extends react.Component {
298
294
  }
299
295
  render() {
300
296
  const { hasBeenUpdated } = this.state;
301
- const { node, deviceState, device } = this.props;
297
+ const { node, deviceState, device, avalilability } = this.props;
302
298
  const { onMouseOver, onMouseOut, onDblClick } = this;
303
299
  const deviceType = node.type;
304
- const cn = classnames_default()(map.node, map[deviceType]);
300
+ const cn = classnames_default()(map.node, map[deviceType], { [map.offline]: avalilability === "offline" });
305
301
  return (react.createElement("g", { className: cn, ref: this.ref, onMouseOver: onMouseOver, onMouseOut: onMouseOut, onDoubleClick: onDblClick },
306
302
  node.type === "Coordinator" ? (react.createElement(react.Fragment, null,
307
303
  react.createElement("circle", { cx: 15, cy: 16, r: 24, fill: "#fff", stroke: "blue", strokeWidth: 1 }),
@@ -350,8 +346,8 @@ class Nodes extends react.Component {
350
346
  this.updateDrag();
351
347
  }
352
348
  render() {
353
- const { nodes, onMouseOut, onMouseOver, deviceStates, devices } = this.props;
354
- return (react.createElement("g", { className: map.nodes }, nodes.map((node) => (react.createElement(Node, { onMouseOut: onMouseOut, onMouseOver: onMouseOver, key: node.ieeeAddr, node: node, deviceState: deviceStates[node.friendlyName], device: devices[node.ieeeAddr] })))));
349
+ const { nodes, onMouseOut, onMouseOver, deviceStates, devices, avalilability } = this.props;
350
+ return (react.createElement("g", { className: map.nodes }, nodes.map((node) => (react.createElement(Node, { onMouseOut: onMouseOut, onMouseOver: onMouseOver, key: node.ieeeAddr, node: node, deviceState: deviceStates[node.friendlyName], device: devices[node.ieeeAddr], avalilability: avalilability[node.friendlyName] })))));
355
351
  }
356
352
  }
357
353
 
@@ -374,7 +370,7 @@ var unistore_es = __webpack_require__(72720);
374
370
  // EXTERNAL MODULE: ./node_modules/unistore/devtools.js
375
371
  var devtools = __webpack_require__(12512);
376
372
  ;// CONCATENATED MODULE: ./src/initialState.json
377
- const initialState_namespaceObject = JSON.parse('{"devices":{},"deviceStates":{},"touchlinkDevices":[],"touchlinkScanInProgress":false,"touchlinkIdentifyInProgress":false,"touchlinkResetInProgress":false,"networkGraph":{"links":[],"nodes":[]},"networkGraphIsLoading":false,"groups":[],"bridgeState":"online","bridgeConfig":{},"bridgeInfo":{"configSchema":{"properties":{},"required":[]},"config":{"advanced":{}}},"logs":[],"extensions":[],"theme":"light","missingTranslations":{}}');
373
+ const initialState_namespaceObject = JSON.parse('{"devices":{},"deviceStates":{},"touchlinkDevices":[],"touchlinkScanInProgress":false,"touchlinkIdentifyInProgress":false,"touchlinkResetInProgress":false,"networkGraph":{"links":[],"nodes":[]},"networkGraphIsLoading":false,"groups":[],"bridgeState":"online","bridgeConfig":{},"bridgeInfo":{"configSchema":{"properties":{},"required":[]},"config":{"advanced":{}}},"logs":[],"extensions":[],"theme":"light","missingTranslations":{},"avalilability":{}}');
378
374
  ;// CONCATENATED MODULE: ./src/store.ts
379
375
 
380
376
 
@@ -397,6 +393,7 @@ const MAX_LOGS_RECORDS_IN_BUFFER = 100;
397
393
  const TOKEN_LOCAL_STORAGE_ITEM_NAME = "z2m-token";
398
394
  const AUTH_FLAG_LOCAL_STORAGE_ITEM_NAME = "z2m-auth";
399
395
  const UNAUTHORIZED_ERROR_CODE = 4401;
396
+ const AVALIABILITY_FEATURE_TOPIC_ENDING = "/availability";
400
397
  const notyf = new notyf_es/* Notyf */.Iq();
401
398
  const blacklistedMessages = [
402
399
  /MQTT publish/
@@ -463,6 +460,11 @@ class Api {
463
460
  }
464
461
  return url.toString();
465
462
  };
463
+ this.processDeviceStateMessage = (data) => {
464
+ let { deviceStates } = src_store.getState();
465
+ deviceStates = { ...deviceStates, ...{ [data.topic]: { ...deviceStates[data.topic], ...data.payload } } };
466
+ src_store.setState({ deviceStates });
467
+ };
466
468
  this.procsessBridgeMessage = (data) => {
467
469
  switch (data.topic) {
468
470
  case "bridge/config":
@@ -556,6 +558,12 @@ class Api {
556
558
  this.resolvePromises(data.payload);
557
559
  }
558
560
  };
561
+ this.processAvailabilityMessage = (data) => {
562
+ let { avalilability } = src_store.getState();
563
+ const friendlyName = data.topic.split(AVALIABILITY_FEATURE_TOPIC_ENDING, 1)[0];
564
+ avalilability = { ...avalilability, ...{ [friendlyName]: data.payload } };
565
+ src_store.setState({ avalilability });
566
+ };
559
567
  this.onClose = (e) => {
560
568
  if (e.code === UNAUTHORIZED_ERROR_CODE) {
561
569
  localStorage.setItem(AUTH_FLAG_LOCAL_STORAGE_ITEM_NAME, "true");
@@ -575,13 +583,14 @@ class Api {
575
583
  notyf.error(e.message);
576
584
  notyf.error(event.data);
577
585
  }
578
- if (data.topic.startsWith("bridge/")) {
586
+ if (data.topic.endsWith(AVALIABILITY_FEATURE_TOPIC_ENDING)) {
587
+ this.processAvailabilityMessage(data);
588
+ }
589
+ else if (data.topic.startsWith("bridge/")) {
579
590
  this.procsessBridgeMessage(data);
580
591
  }
581
592
  else {
582
- let { deviceStates } = src_store.getState();
583
- deviceStates = { ...deviceStates, ...{ [data.topic]: { ...deviceStates[data.topic], ...data.payload } } };
584
- src_store.setState({ deviceStates });
593
+ this.processDeviceStateMessage(data);
585
594
  }
586
595
  };
587
596
  this.url = url;
@@ -978,32 +987,37 @@ const MODAL_COMPONENTS = {
978
987
  [MODAL_TYPES.DIALOG_CONFIRMATION]: DialogConfirmationModal,
979
988
  };
980
989
  const initalState = {
981
- showModal: () => { },
982
- hideModal: () => { },
990
+ showModal: () => {
991
+ },
992
+ hideModal: () => {
993
+ },
983
994
  store: {},
984
995
  };
985
996
  const GlobalModalContext = (0,react.createContext)(initalState);
986
997
  const useGlobalModalContext = () => (0,react.useContext)(GlobalModalContext);
987
998
  const GlobalModal = ({ children }) => {
988
- const [store, setStore] = (0,react.useState)();
989
- const { modalType, modalProps } = store || {};
990
- const showModal = (modalType, modalProps = {}) => {
999
+ const [store, setStore] = (0,react.useState)({});
1000
+ const { modalType, modalProps } = store;
1001
+ const showModal = (t, p = {}) => {
991
1002
  setStore({
992
1003
  ...store,
993
- modalType,
994
- modalProps,
1004
+ modalType: t,
1005
+ modalProps: p,
995
1006
  });
996
1007
  };
997
1008
  const hideModal = () => {
998
1009
  setStore({
999
1010
  ...store,
1000
- modalType: null,
1011
+ modalType: "",
1001
1012
  modalProps: {},
1002
1013
  });
1003
1014
  };
1004
1015
  const renderComponent = () => {
1016
+ if (!modalType) {
1017
+ return null;
1018
+ }
1005
1019
  const ModalComponent = MODAL_COMPONENTS[modalType];
1006
- if (!modalType || !ModalComponent) {
1020
+ if (!ModalComponent) {
1007
1021
  return null;
1008
1022
  }
1009
1023
  return react.createElement(ModalComponent, { id: "global-modal", ...modalProps });
@@ -1247,12 +1261,12 @@ class MapComponent extends react.Component {
1247
1261
  }
1248
1262
  renderMap() {
1249
1263
  const { width, height, visibleLinks } = this.state;
1250
- const { networkGraph, deviceStates, devices } = this.props;
1264
+ const { networkGraph, deviceStates, devices, avalilability } = this.props;
1251
1265
  const links = networkGraph.links.filter(l => intersection_default()(visibleLinks, l.relationships).length > 0);
1252
1266
  return (react.createElement("svg", { ref: this.svgRef, viewBox: `0 0 ${width} ${height}` },
1253
1267
  react.createElement("g", { className: "everything" },
1254
1268
  react.createElement(map_links, { links: links }),
1255
- react.createElement(Nodes, { root: this.svgRef.current, nodes: networkGraph.nodes, simulation: this.simulation, deviceStates: deviceStates, devices: devices }))));
1269
+ react.createElement(Nodes, { root: this.svgRef.current, nodes: networkGraph.nodes, simulation: this.simulation, deviceStates: deviceStates, devices: devices, avalilability: avalilability }))));
1256
1270
  }
1257
1271
  renderMessage() {
1258
1272
  const { networkGraphIsLoading, t } = this.props;
@@ -1296,7 +1310,7 @@ class MapComponent extends react.Component {
1296
1310
  this.renderHelp()));
1297
1311
  }
1298
1312
  }
1299
- const mappedProps = ["networkGraph", "networkGraphIsLoading", "deviceStates", "devices"];
1313
+ const mappedProps = ["networkGraph", "networkGraphIsLoading", "deviceStates", "devices", "avalilability"];
1300
1314
  const ConnectedMap = (0,withTranslation/* withTranslation */.Z)("map")((0,unistore_react/* connect */.$)(mappedProps, actions_actions)(MapComponent));
1301
1315
  /* harmony default export */ const components_map = (ConnectedMap);
1302
1316
 
@@ -1520,6 +1534,216 @@ function DisplayValue(props) {
1520
1534
  }
1521
1535
  }
1522
1536
 
1537
+ ;// CONCATENATED MODULE: ./src/components/zigbee/style.css
1538
+ // extracted by mini-css-extract-plugin
1539
+ /* harmony default export */ const zigbee_style = ({"action-column":"GDDPje7BU_a2CqHQQeRS","device-pic":"V7dffAiFpKHihMzFsuev","device-image":"NBzXAYfJkobb1Zfroqnt"});
1540
+ // EXTERNAL MODULE: ./node_modules/react-table/index.js
1541
+ var react_table = __webpack_require__(79521);
1542
+ // EXTERNAL MODULE: ./node_modules/local-storage/local-storage.js
1543
+ var local_storage = __webpack_require__(42222);
1544
+ // EXTERNAL MODULE: ./node_modules/lodash/debounce.js
1545
+ var debounce = __webpack_require__(23279);
1546
+ var debounce_default = /*#__PURE__*/__webpack_require__.n(debounce);
1547
+ ;// CONCATENATED MODULE: ./src/components/grid/ReactTableCom.tsx
1548
+
1549
+
1550
+
1551
+
1552
+
1553
+
1554
+ function GlobalFilter({ globalFilter, setGlobalFilter, }) {
1555
+ const [value, setValue] = react.useState(globalFilter);
1556
+ const onChange = (0,react_table.useAsyncDebounce)(v => {
1557
+ setGlobalFilter(v || undefined);
1558
+ }, 200);
1559
+ const { t } = (0,useTranslation/* useTranslation */.$)(['common']);
1560
+ return (react.createElement("span", null,
1561
+ react.createElement("input", { value: value || "", onChange: e => {
1562
+ setValue(e.target.value);
1563
+ onChange(e.target.value);
1564
+ }, placeholder: t('common:enter_search_criteria'), className: "form-control" })));
1565
+ }
1566
+ const persist = debounce_default()((key, data) => {
1567
+ (0,local_storage.set)(key, data);
1568
+ });
1569
+ const stateReducer = (newState, action, previousState, instance) => {
1570
+ if (instance) {
1571
+ const { instanceId } = instance;
1572
+ const { sortBy, globalFilter } = newState;
1573
+ persist(instanceId, { sortBy, globalFilter });
1574
+ }
1575
+ return newState;
1576
+ };
1577
+ const Table = ({ columns, data, id }) => {
1578
+ const initialState = (0,local_storage.get)(id) || {};
1579
+ const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow, state, visibleColumns, setGlobalFilter, } = (0,react_table.useTable)({
1580
+ instanceId: id,
1581
+ stateReducer,
1582
+ columns,
1583
+ data,
1584
+ autoResetSortBy: false,
1585
+ autoResetFilters: false,
1586
+ initialState
1587
+ }, react_table.useGlobalFilter, react_table.useSortBy);
1588
+ return (react.createElement("table", { ...getTableProps(), className: "table responsive" },
1589
+ react.createElement("thead", null,
1590
+ react.createElement("tr", null,
1591
+ react.createElement("th", { colSpan: visibleColumns.length },
1592
+ react.createElement(GlobalFilter, { globalFilter: state.globalFilter, setGlobalFilter: setGlobalFilter }))),
1593
+ headerGroups.map((headerGroup) => (react.createElement("tr", { ...headerGroup.getHeaderGroupProps() }, headerGroup.headers.map(column => (react.createElement("th", { className: "text-nowrap", ...column.getHeaderProps(column.getSortByToggleProps()) },
1594
+ react.createElement("span", { className: classnames_default()({ 'btn-link mr-1': column.canSort }) }, column.render('Header')),
1595
+ react.createElement("span", null,
1596
+ react.createElement("i", { className: classnames_default()('fa', {
1597
+ 'fa-sort-amount-down invisible': !column.isSorted,
1598
+ 'fa-sort-amount-down-alt': column.isSorted && !column.isSortedDesc,
1599
+ 'fa-sort-amount-down': column.isSorted && column.isSortedDesc,
1600
+ }) }))))))))),
1601
+ react.createElement("tbody", { ...getTableBodyProps() }, rows.map((row, i) => {
1602
+ prepareRow(row);
1603
+ return (react.createElement("tr", { ...row.getRowProps() }, row.cells.map(cell => react.createElement("td", { ...cell.getCellProps() }, cell.render('Cell')))));
1604
+ }))));
1605
+ };
1606
+
1607
+ ;// CONCATENATED MODULE: ./src/components/zigbee/index.tsx
1608
+
1609
+
1610
+
1611
+
1612
+
1613
+
1614
+
1615
+
1616
+
1617
+
1618
+
1619
+
1620
+
1621
+
1622
+
1623
+
1624
+ function Avaliability(props) {
1625
+ const { t } = (0,useTranslation/* useTranslation */.$)(["zigbee"]);
1626
+ const { avaliability, enabled = true } = props;
1627
+ if (enabled) {
1628
+ return react.createElement("span", { className: classnames_default()({
1629
+ "text-danger animation-blinking": avaliability === "offline",
1630
+ 'text-success': avaliability === "online"
1631
+ }) }, t(avaliability));
1632
+ }
1633
+ else {
1634
+ return react.createElement("a", { target: "_blank", rel: "noopener noreferrer", href: "https://www.zigbee2mqtt.io/guide/configuration/device-availability.html#availability-advanced-configuration" }, "N/A");
1635
+ }
1636
+ }
1637
+ function DevicesTable(props) {
1638
+ const { data, lastSeenType, availabilityFeatureEnabled } = props;
1639
+ const { t } = (0,useTranslation/* useTranslation */.$)(["zigbee", "common"]);
1640
+ const columns = [
1641
+ {
1642
+ id: 'rownumber',
1643
+ Header: '#',
1644
+ Cell: ({ row }) => react.createElement("div", { className: "font-weight-bold" }, row.index + 1),
1645
+ disableSortBy: true,
1646
+ },
1647
+ {
1648
+ id: 'pic',
1649
+ Header: t('pic'),
1650
+ Cell: ({ row: { original: { device, state } } }) => react.createElement(device_image, { className: zigbee_style["device-image"], device: device, deviceStatus: state }),
1651
+ accessor: rowData => rowData,
1652
+ disableSortBy: true,
1653
+ },
1654
+ {
1655
+ id: 'friendly_name',
1656
+ Header: t('friendly_name'),
1657
+ accessor: ({ device }) => device.friendly_name,
1658
+ Cell: ({ row: { original: { device } } }) => react.createElement(react_router_dom/* Link */.rU, { to: genDeviceDetailsLink(device.ieee_address) }, device.friendly_name)
1659
+ },
1660
+ {
1661
+ id: 'ieee_address',
1662
+ Header: t('ieee_address'),
1663
+ accessor: ({ device }) => [device.ieee_address, toHex(device.network_address, 4)].join(' '),
1664
+ Cell: ({ row: { original: { device } } }) => react.createElement(react.Fragment, null,
1665
+ device.ieee_address,
1666
+ " (",
1667
+ toHex(device.network_address, 4),
1668
+ ")"),
1669
+ },
1670
+ {
1671
+ id: 'manufacturer',
1672
+ Header: t('manufacturer'),
1673
+ accessor: ({ device }) => { var _a; return [device.manufacturer, (_a = device.definition) === null || _a === void 0 ? void 0 : _a.vendor].join(' '); },
1674
+ Cell: ({ row: { original: { device } } }) => react.createElement(VendorLink, { device: device })
1675
+ },
1676
+ {
1677
+ id: 'model',
1678
+ Header: t('model'),
1679
+ accessor: ({ device }) => { var _a; return [device.model_id, (_a = device.definition) === null || _a === void 0 ? void 0 : _a.model].join(' '); },
1680
+ Cell: ({ row: { original: { device } } }) => react.createElement(ModelLink, { device: device })
1681
+ },
1682
+ {
1683
+ id: 'lqi',
1684
+ Header: t('lqi'),
1685
+ accessor: ({ state }) => state.linkquality,
1686
+ Cell: ({ row: { original: { state } } }) => react.createElement(DisplayValue, { value: state.linkquality, name: "linkquality" }),
1687
+ },
1688
+ ...(lastSeenType !== "disable" ? [{
1689
+ id: 'last_seen',
1690
+ Header: t('last_seen'),
1691
+ accessor: ({ state }) => { var _a; return (_a = lastSeen(state, lastSeenType)) === null || _a === void 0 ? void 0 : _a.getTime(); },
1692
+ Cell: ({ row: { original: { state } } }) => react.createElement(LastSeen, { state: state, lastSeenType: lastSeenType }),
1693
+ }] : []),
1694
+ ...(availabilityFeatureEnabled ? [{
1695
+ id: 'avaliability',
1696
+ Header: t('avaliability'),
1697
+ accessor: ({ avalilabilityState }) => avalilabilityState,
1698
+ Cell: ({ row: { original: { avalilabilityState } } }) => react.createElement(Avaliability, { avaliability: avalilabilityState }),
1699
+ }] : []),
1700
+ {
1701
+ id: 'power',
1702
+ Header: t('power'),
1703
+ accessor: ({ device }) => device.power_source,
1704
+ Cell: ({ row: { original: { state, device } } }) => react.createElement(power_source, { source: device.power_source, battery: state.battery, batteryLow: state.battery_low }),
1705
+ },
1706
+ {
1707
+ id: 'controls',
1708
+ Header: '',
1709
+ Cell: ({ row: { original: { device, state } } }) => react.createElement(device_control_DeviceControlGroup, { device: device, state: state }),
1710
+ disableSortBy: true,
1711
+ }
1712
+ ];
1713
+ return (react.createElement("div", { className: "card" },
1714
+ react.createElement("div", { className: "table-responsive" },
1715
+ react.createElement(Table, { id: "zigbee", columns: columns, data: data }))));
1716
+ }
1717
+ function ZigbeeTable(props) {
1718
+ const { devices, deviceStates, bridgeInfo, avalilability } = props;
1719
+ const availabilityFeatureEnabled = !!bridgeInfo.config.availability;
1720
+ const getDevicesToRender = () => {
1721
+ return Object.values(devices)
1722
+ .filter(device => device.type !== "Coordinator")
1723
+ .map((device) => {
1724
+ var _a, _b;
1725
+ const state = (_a = deviceStates[device.friendly_name]) !== null && _a !== void 0 ? _a : {};
1726
+ return {
1727
+ id: device.friendly_name,
1728
+ device,
1729
+ state,
1730
+ avalilabilityState: (_b = avalilability[device.friendly_name]) !== null && _b !== void 0 ? _b : "offline"
1731
+ };
1732
+ });
1733
+ };
1734
+ const data = react.useMemo(() => getDevicesToRender(), [devices, deviceStates]);
1735
+ if (Object.keys(data).length) {
1736
+ return react.createElement(DevicesTable, { data: data, lastSeenType: bridgeInfo.config.advanced.last_seen, availabilityFeatureEnabled: availabilityFeatureEnabled });
1737
+ }
1738
+ else {
1739
+ return (react.createElement("div", { className: "h-100 d-flex justify-content-center align-items-center" },
1740
+ react.createElement(spinner, null)));
1741
+ }
1742
+ }
1743
+ const zigbee_mappedProps = ["devices", "deviceStates", "bridgeInfo", "avalilability"];
1744
+ const ConnectedZigbeePage = (0,withTranslation/* withTranslation */.Z)(["zigbee", "common"])((0,unistore_react/* connect */.$)(zigbee_mappedProps, actions_actions)(ZigbeeTable));
1745
+ /* harmony default export */ const zigbee = (ConnectedZigbeePage);
1746
+
1523
1747
  ;// CONCATENATED MODULE: ./src/components/device-page/info.tsx
1524
1748
 
1525
1749
 
@@ -1534,6 +1758,7 @@ function DisplayValue(props) {
1534
1758
 
1535
1759
 
1536
1760
 
1761
+
1537
1762
  const markdownLinkRegex = /\[(.*?)\]\((.*?)\)/;
1538
1763
  const displayProps = [
1539
1764
  {
@@ -1546,6 +1771,14 @@ const displayProps = [
1546
1771
  render: (device, state, bridgeInfo) => react.createElement("dd", { className: "col-12 col-md-7" },
1547
1772
  react.createElement(LastSeen, { lastSeenType: bridgeInfo.config.advanced.last_seen, state: state })),
1548
1773
  },
1774
+ {
1775
+ translationKey: 'avaliability',
1776
+ render: (device, state, bridgeInfo, availability) => {
1777
+ const availabilityFeatureEnabled = !!bridgeInfo.config.availability;
1778
+ return react.createElement("dd", { className: "col-12 col-md-7" },
1779
+ react.createElement(Avaliability, { avaliability: availability, enabled: availabilityFeatureEnabled }));
1780
+ },
1781
+ },
1549
1782
  {
1550
1783
  key: 'type',
1551
1784
  translationKey: 'device_type'
@@ -1626,19 +1859,22 @@ const displayProps = [
1626
1859
  class DeviceInfo extends react.Component {
1627
1860
  render() {
1628
1861
  var _a;
1629
- const { device, deviceStates, bridgeInfo, t } = this.props;
1862
+ const { device, deviceStates, bridgeInfo, avalilability, t } = this.props;
1630
1863
  const deviceState = (_a = deviceStates[device.friendly_name]) !== null && _a !== void 0 ? _a : {};
1631
1864
  return (react.createElement(react.Fragment, null,
1632
1865
  react.createElement("div", { className: "d-flex justify-content-center" },
1633
1866
  react.createElement(device_image, { className: `card-img-top w-auto ${device_page_style["device-pic"]}`, device: device, deviceStatus: deviceState })),
1634
- react.createElement("dl", { className: "row" }, displayProps.filter(prop => prop.if === undefined || get_default()(device, prop.if, false)).map(prop => (react.createElement(react.Fragment, { key: prop.translationKey },
1635
- react.createElement("dt", { className: "col-12 col-md-5" }, t(prop.translationKey)),
1636
- prop.render ?
1637
- prop.render(device, deviceState, bridgeInfo) : react.createElement("dd", { className: "col-12 col-md-7" }, get_default()(device, prop.key)))))),
1867
+ react.createElement("dl", { className: "row" }, displayProps.filter(prop => prop.if === undefined || get_default()(device, prop.if, false)).map(prop => {
1868
+ var _a;
1869
+ return (react.createElement(react.Fragment, { key: prop.translationKey },
1870
+ react.createElement("dt", { className: "col-12 col-md-5" }, t(prop.translationKey)),
1871
+ prop.render ?
1872
+ prop.render(device, deviceState, bridgeInfo, (_a = avalilability[device.friendly_name]) !== null && _a !== void 0 ? _a : 'offline') : react.createElement("dd", { className: "col-12 col-md-7" }, get_default()(device, prop.key))));
1873
+ })),
1638
1874
  react.createElement(device_control_DeviceControlGroup, { device: device, state: deviceState })));
1639
1875
  }
1640
1876
  }
1641
- const info_mappedProps = ["deviceStates", "bridgeInfo"];
1877
+ const info_mappedProps = ["deviceStates", "bridgeInfo", "avalilability"];
1642
1878
  const ConnectedDeviceInfoPage = (0,withTranslation/* withTranslation */.Z)("zigbee")((0,unistore_react/* connect */.$)(info_mappedProps)(DeviceInfo));
1643
1879
  /* harmony default export */ const info = (ConnectedDeviceInfoPage);
1644
1880
 
@@ -3444,72 +3680,6 @@ const device_page_mappedProps = ["devices", "deviceStates", "logs", "bridgeInfo"
3444
3680
  const ConnectedDevicePage = (0,withTranslation/* withTranslation */.Z)("devicePage")((0,unistore_react/* connect */.$)(device_page_mappedProps, actions_actions)(devicePageWithRouter));
3445
3681
  /* harmony default export */ const device_page = (ConnectedDevicePage);
3446
3682
 
3447
- // EXTERNAL MODULE: ./node_modules/react-table/index.js
3448
- var react_table = __webpack_require__(79521);
3449
- // EXTERNAL MODULE: ./node_modules/local-storage/local-storage.js
3450
- var local_storage = __webpack_require__(42222);
3451
- // EXTERNAL MODULE: ./node_modules/lodash/debounce.js
3452
- var debounce = __webpack_require__(23279);
3453
- var debounce_default = /*#__PURE__*/__webpack_require__.n(debounce);
3454
- ;// CONCATENATED MODULE: ./src/components/grid/ReactTableCom.tsx
3455
-
3456
-
3457
-
3458
-
3459
-
3460
-
3461
- function GlobalFilter({ globalFilter, setGlobalFilter, }) {
3462
- const [value, setValue] = react.useState(globalFilter);
3463
- const onChange = (0,react_table.useAsyncDebounce)(v => {
3464
- setGlobalFilter(v || undefined);
3465
- }, 200);
3466
- const { t } = (0,useTranslation/* useTranslation */.$)(['common']);
3467
- return (react.createElement("span", null,
3468
- react.createElement("input", { value: value || "", onChange: e => {
3469
- setValue(e.target.value);
3470
- onChange(e.target.value);
3471
- }, placeholder: t('common:enter_search_criteria'), className: "form-control" })));
3472
- }
3473
- const persist = debounce_default()((key, data) => {
3474
- (0,local_storage.set)(key, data);
3475
- });
3476
- const stateReducer = (newState, action, previousState, instance) => {
3477
- if (instance) {
3478
- const { instanceId } = instance;
3479
- const { sortBy, globalFilter } = newState;
3480
- persist(instanceId, { sortBy, globalFilter });
3481
- }
3482
- return newState;
3483
- };
3484
- const Table = ({ columns, data, id }) => {
3485
- const initialState = (0,local_storage.get)(id) || {};
3486
- const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow, state, visibleColumns, setGlobalFilter, } = (0,react_table.useTable)({
3487
- instanceId: id,
3488
- stateReducer,
3489
- columns,
3490
- data,
3491
- autoResetSortBy: false,
3492
- autoResetFilters: false,
3493
- initialState
3494
- }, react_table.useGlobalFilter, react_table.useSortBy);
3495
- return (react.createElement("table", { ...getTableProps(), className: "table responsive" },
3496
- react.createElement("thead", null,
3497
- react.createElement("tr", null,
3498
- react.createElement("th", { colSpan: visibleColumns.length },
3499
- react.createElement(GlobalFilter, { globalFilter: state.globalFilter, setGlobalFilter: setGlobalFilter }))),
3500
- headerGroups.map((headerGroup) => (react.createElement("tr", { ...headerGroup.getHeaderGroupProps() }, headerGroup.headers.map(column => (react.createElement("th", { className: "text-nowrap", ...column.getHeaderProps(column.getSortByToggleProps()) },
3501
- react.createElement("span", { className: classnames_default()({ 'btn-link mr-1': column.canSort }) }, column.render('Header')),
3502
- react.createElement("span", null, column.isSorted
3503
- ? column.isSortedDesc
3504
- ? react.createElement("i", { className: `fa fa-sort-amount-down-alt` })
3505
- : react.createElement("i", { className: `fa fa-sort-amount-down` })
3506
- : react.createElement("i", { className: `fa fa-sort-amount-down invisible` }))))))))),
3507
- react.createElement("tbody", { ...getTableBodyProps() }, rows.map((row, i) => {
3508
- prepareRow(row);
3509
- return (react.createElement("tr", { ...row.getRowProps() }, row.cells.map(cell => react.createElement("td", { ...cell.getCellProps() }, cell.render('Cell')))));
3510
- }))));
3511
- };
3512
-
3513
3683
  ;// CONCATENATED MODULE: ./src/components/touchlink-page/index.tsx
3514
3684
 
3515
3685
 
@@ -3784,7 +3954,7 @@ class SettingsPage extends react.Component {
3784
3954
  zigbee2mqttCommit) },
3785
3955
  { translationKey: 'coordinator_type', content: react.createElement(react.Fragment, null, (_c = (_b = bridgeInfo.coordinator) === null || _b === void 0 ? void 0 : _b.type) !== null && _c !== void 0 ? _c : t('common:unknown')) },
3786
3956
  { translationKey: 'coordinator_revision', content: react.createElement(react.Fragment, null, (_f = (_e = (_d = bridgeInfo.coordinator) === null || _d === void 0 ? void 0 : _d.meta) === null || _e === void 0 ? void 0 : _e.revision) !== null && _f !== void 0 ? _f : t('common:unknown')) },
3787
- { translationKey: 'frontend_version', content: "0.6.40" },
3957
+ { translationKey: 'frontend_version', content: "0.6.41" },
3788
3958
  { translationKey: 'stats', content: react.createElement(Stats, { devices: devices }) },
3789
3959
  ];
3790
3960
  return react.createElement("div", { className: "p-3" }, rows.map(row => react.createElement("dl", { key: row.translationKey, className: "row" },
@@ -4270,127 +4440,6 @@ const groups_mappedProps = ["groups", "devices", "deviceStates", "bridgeInfo"];
4270
4440
  const ConnectedGroupsPage = (0,withTranslation/* withTranslation */.Z)("groups")((0,unistore_react/* connect */.$)(groups_mappedProps, actions_actions)(GroupsPage));
4271
4441
  /* harmony default export */ const groups = (ConnectedGroupsPage);
4272
4442
 
4273
- ;// CONCATENATED MODULE: ./src/components/zigbee/style.css
4274
- // extracted by mini-css-extract-plugin
4275
- /* harmony default export */ const zigbee_style = ({"action-column":"GDDPje7BU_a2CqHQQeRS","device-pic":"V7dffAiFpKHihMzFsuev","device-image":"NBzXAYfJkobb1Zfroqnt"});
4276
- ;// CONCATENATED MODULE: ./src/components/zigbee/index.tsx
4277
-
4278
-
4279
-
4280
-
4281
-
4282
-
4283
-
4284
-
4285
-
4286
-
4287
-
4288
-
4289
-
4290
-
4291
-
4292
- function DevicesTable(props) {
4293
- const { data, lastSeenType } = props;
4294
- const { t } = (0,useTranslation/* useTranslation */.$)(["zigbee", "common"]);
4295
- const columns = [
4296
- {
4297
- id: 'rownumber',
4298
- Header: '#',
4299
- Cell: ({ row }) => react.createElement("div", { className: "font-weight-bold" }, row.index + 1),
4300
- disableSortBy: true,
4301
- },
4302
- {
4303
- id: 'pic',
4304
- Header: t('pic'),
4305
- Cell: ({ row: { original: { device, state } } }) => react.createElement(device_image, { className: zigbee_style["device-image"], device: device, deviceStatus: state }),
4306
- accessor: rowData => rowData,
4307
- disableSortBy: true,
4308
- },
4309
- {
4310
- id: 'friendly_name',
4311
- Header: t('friendly_name'),
4312
- accessor: ({ device }) => device.friendly_name,
4313
- Cell: ({ row: { original: { device } } }) => react.createElement(react_router_dom/* Link */.rU, { to: genDeviceDetailsLink(device.ieee_address) }, device.friendly_name)
4314
- },
4315
- {
4316
- id: 'ieee_address',
4317
- Header: t('ieee_address'),
4318
- accessor: ({ device }) => [device.ieee_address, toHex(device.network_address, 4)].join(' '),
4319
- Cell: ({ row: { original: { device } } }) => react.createElement(react.Fragment, null,
4320
- device.ieee_address,
4321
- " (",
4322
- toHex(device.network_address, 4),
4323
- ")"),
4324
- },
4325
- {
4326
- id: 'manufacturer',
4327
- Header: t('manufacturer'),
4328
- accessor: ({ device }) => { var _a; return [device.manufacturer, (_a = device.definition) === null || _a === void 0 ? void 0 : _a.vendor].join(' '); },
4329
- Cell: ({ row: { original: { device } } }) => react.createElement(VendorLink, { device: device })
4330
- },
4331
- {
4332
- id: 'model',
4333
- Header: t('model'),
4334
- accessor: ({ device }) => { var _a; return [device.model_id, (_a = device.definition) === null || _a === void 0 ? void 0 : _a.model].join(' '); },
4335
- Cell: ({ row: { original: { device } } }) => react.createElement(ModelLink, { device: device })
4336
- },
4337
- {
4338
- id: 'lqi',
4339
- Header: t('lqi'),
4340
- accessor: ({ state }) => state.linkquality,
4341
- Cell: ({ row: { original: { state } } }) => react.createElement(DisplayValue, { value: state.linkquality, name: "linkquality" }),
4342
- },
4343
- ...(lastSeenType !== "disable" ? [{
4344
- id: 'last_seen',
4345
- Header: t('last_seen'),
4346
- accessor: ({ state }) => { var _a; return (_a = lastSeen(state, lastSeenType)) === null || _a === void 0 ? void 0 : _a.getTime(); },
4347
- Cell: ({ row: { original: { state } } }) => react.createElement(LastSeen, { state: state, lastSeenType: lastSeenType }),
4348
- }] : []),
4349
- {
4350
- id: 'power',
4351
- Header: t('power'),
4352
- accessor: ({ device }) => device.power_source,
4353
- Cell: ({ row: { original: { state, device } } }) => react.createElement(power_source, { source: device.power_source, battery: state.battery, batteryLow: state.battery_low }),
4354
- },
4355
- {
4356
- id: 'controls',
4357
- Header: '',
4358
- Cell: ({ row: { original: { device, state } } }) => react.createElement(device_control_DeviceControlGroup, { device: device, state: state }),
4359
- disableSortBy: true,
4360
- }
4361
- ];
4362
- return (react.createElement("div", { className: "card" },
4363
- react.createElement("div", { className: "table-responsive" },
4364
- react.createElement(Table, { id: "zigbee", columns: columns, data: data }))));
4365
- }
4366
- function ZigbeeTable(props) {
4367
- const { devices, deviceStates, bridgeInfo } = props;
4368
- const getDevicesToRender = () => {
4369
- return Object.values(devices)
4370
- .filter(device => device.type !== "Coordinator")
4371
- .map((device) => {
4372
- var _a;
4373
- const state = (_a = deviceStates[device.friendly_name]) !== null && _a !== void 0 ? _a : {};
4374
- return {
4375
- id: device.friendly_name,
4376
- device,
4377
- state
4378
- };
4379
- });
4380
- };
4381
- const data = react.useMemo(() => getDevicesToRender(), [devices, deviceStates]);
4382
- if (Object.keys(data).length) {
4383
- return react.createElement(DevicesTable, { data: data, lastSeenType: bridgeInfo.config.advanced.last_seen });
4384
- }
4385
- else {
4386
- return (react.createElement("div", { className: "h-100 d-flex justify-content-center align-items-center" },
4387
- react.createElement(spinner, null)));
4388
- }
4389
- }
4390
- const zigbee_mappedProps = ["devices", "deviceStates", "bridgeInfo"];
4391
- const ConnectedZigbeePage = (0,withTranslation/* withTranslation */.Z)(["zigbee", "common"])((0,unistore_react/* connect */.$)(zigbee_mappedProps, actions_actions)(ZigbeeTable));
4392
- /* harmony default export */ const zigbee = (ConnectedZigbeePage);
4393
-
4394
4443
  ;// CONCATENATED MODULE: ./src/components/ota-page/index.tsx
4395
4444
 
4396
4445
 
@@ -4932,7 +4981,7 @@ var context = __webpack_require__(68718);
4932
4981
  // EXTERNAL MODULE: ./node_modules/i18next-browser-languagedetector/dist/esm/i18nextBrowserLanguageDetector.js
4933
4982
  var i18nextBrowserLanguageDetector = __webpack_require__(26071);
4934
4983
  ;// CONCATENATED MODULE: ./src/i18n/locales/en.json
4935
- const en_namespaceObject = JSON.parse('{"common":{"action":"Action","actions":"Actions","apply":"Apply","attribute":"Attribute","bind":"Bind","check_all":"Check all","clear":"Clear","close":"Close","cluster":"Cluster","clusters":"Clusters","confirmation":"Confirmation prompt","delete":"Delete","destination":"Destination","devices":"Devices","dialog_confirmation_prompt":"Are you sure?","disable":"Disable","enter_search_criteria":"Enter search criteria","groups":"Groups","loading":"Loading...","none":"None","ok":"Ok","read":"Read","save":"Save","select_device":"Select device","select_endpoint":"Select endpoint","source_endpoint":"Source endpoint","the_only_endpoint":"The only endpoint","unbind":"Unbind","write":"Write"},"devicePage":{"about":"About","bind":"Bind","clusters":"Clusters","dev_console":"Dev console","exposes":"Exposes","reporting":"Reporting","settings":"Settings","settings_specific":"Settings (specific)","state":"State","scene":"Scene","unknown_device":"Unknown device"},"exposes":{"action":"Action","auto_off":"Auto off","away_mode":"Away mode","away_preset_days":"Away preset days","away_preset_temperature":"Away preset temperature","backlight_mode":"Backlight mode","battery":"Battery","battery_low":"Battery low","boost_time":"Boost time","brightness":"Brightness","calibration":"Calibration","carbon_monoxide":"Carbon monoxide","color_hs":"Color (HS)","color_temp":"Color temperature","color_temp_startup":"Startup color temp","color_xy":"Color (XY)","comfort_temperature":"Comfort temperature","consumer_connected":"Consumer connected","consumer_overload":"Consumer overload","contact":"Contact","current":"Current","current_heating_setpoint":"Current heating setpoint","eco_temperature":"Eco temperature","effect":"Effect","empty_exposes_definition":"Empty exposes definition","energy":"Energy","force":"Force","humidity":"Humidity","illuminance":"Illuminance","illuminance_lux":"Illuminance","led_disabled_night":"Led disabled night","linkquality":"Linkquality","local_temperature":"Local temperature","local_temperature_calibration":"Local temperature calibration","max_temperature":"Max temperature","min_temperature":"Min temperature","motor_reversal":"Motor reversal","moving":"Moving","occupancy":"Occupancy","operation_mode":"Operation mode","options":"Options","position":"Position","power":"Power","power_on_behavior":"Power on behavior","power_outage_memory":"Power outage memory","preset":"Preset","pressure":"Pressure","sensivity":"Sensivity","smoke":"Smoke","state":"State","strength":"Strength","system_mode":"System mode","tamper":"Tamper","temperature":"Temperature","voltage":"Voltage","water_leak":"Water leak","week":"Week"},"extensions":{"create_new_extension":"Create new extension","extension_name_propmt":"Enter new extension name","select_extension_to_edit":"Select extension to edit"},"featureDescriptions":{"Auto off after specific time.":"Auto off after specific time.","Away mode":"Away mode","Away preset days":"Away preset days","Away preset temperature":"Away preset temperature","Boost time":"Boost time","Brightness of this light":"Brightness of this light","Calibration time":"Calibration time","Color of this light expressed as hue/saturation":"Color of this light expressed as hue/saturation","Color of this light in the CIE 1931 color space (x/y)":"Color of this light in the CIE 1931 color space (x/y)","Color temperature after cold power on of this light":"Color temperature after cold power on of this light","Color temperature of this light":"Color temperature of this light","Comfort temperature":"Comfort temperature","Controls the behavior when the device is powered on":"Controls the behavior when the device is powered on","Controls the behaviour when the device is powered on":"Controls the behaviour when the device is powered on","Current temperature measured on the device":"Current temperature measured on the device","Decoupled mode for center button":"Decoupled mode for center button","Decoupled mode for left button":"Decoupled mode for left button","Decoupled mode for right button":"Decoupled mode for right button","Eco temperature":"Eco temperature","Enable/disable auto lock":"Enable/disable auto lock","Enable/disable away mode":"Enable/disable away mode","Enables/disables physical input on the device":"Enables/disables physical input on the device","Enables/disables window detection on the device":"Enables/disables window detection on the device","Enabling prevents both relais being on at the same time":"Enabling prevents both relais being on at the same time","Force the valve position":"Force the valve position","Indicates if CO (carbon monoxide) is detected":"Indicates if CO (carbon monoxide) is detected","Indicates if the battery of this device is almost empty":"Indicates if the battery of this device is almost empty","Indicates if the contact is closed (= true) or open (= false)":"Indicates if the contact is closed (= true) or open (= false)","Indicates whether the device detected a water leak":"Indicates whether the device detected a water leak","Indicates whether the device detected occupancy":"Indicates whether the device detected occupancy","Indicates whether the device detected smoke":"Indicates whether the device detected smoke","Indicates whether the device is tampered":"Indicates whether the device is tampered","Instantaneous measured electrical current":"Instantaneous measured electrical current","Instantaneous measured power":"Instantaneous measured power","Link quality (signal strength)":"Link quality (signal strength)","Maximum temperature":"Maximum temperature","Measured electrical potential value":"Measured electrical potential value","Measured illuminance in lux":"Measured illuminance in lux","Measured relative humidity":"Measured relative humidity","Measured temperature value":"Measured temperature value","Minimum temperature":"Minimum temperature","Mode of this device (similar to system_mode)":"Mode of this device (similar to system_mode)","Mode of this device":"Mode of this device","Motor speed":"Motor speed","Offset to be used in the local_temperature":"Offset to be used in the local_temperature","On/off state of the switch":"On/off state of the switch","On/off state of this light":"On/off state of this light","Position of this cover":"Position of this cover","Position":"Position","Raw measured illuminance":"Raw measured illuminance","Recover state after power outage":"Recover state after power outage","Remaining battery in %":"Remaining battery in %","Side of the cube":"Side of the cube","Sum of consumed energy":"Sum of consumed energy","Temperature setpoint":"Temperature setpoint","The measured atmospheric pressure":"The measured atmospheric pressure","Triggered action (e.g. a button click)":"Triggered action (e.g. a button click)","Triggers an effect on the light (e.g. make light blink for a few seconds)":"Triggers an effect on the light (e.g. make light blink for a few seconds)","Voltage of the battery in millivolts":"Voltage of the battery in millivolts","Week format user for schedule":"Week format user for schedule"},"featureNames":{"action":"Action","angle_x":"Angle X","angle_y":"Angle Y","angle_z":"Angle Z","brightness":"Brightness","co2":"CO2","color_temp":"Color Temp","color_xy":"Color Xy","contact":"Contact","humidity":"Humidity","illuminance":"Illuminance","occupancy":"Occupancy","pressure":"Pressure","soil_moisture":"Soil Moisture","state":"State","temperature":"Temperature","tamper":"Tamper"},"groups":{"add_to_group":"Add to group","create_group":"Create group","new_group_id":"New group id","new_group_id_placeholder":"Specify group id if necessary","new_group_name":"New group name","new_group_name_placeholder":"example: my_bedroom_lights","remove_group":"Remove group","group_id":"Group ID","group_name":"Group Name","group_members":"Group members","group_scenes":"Group scenes"},"logs":{"empty_logs_message":"Nothing to display","filter_by_text":"Filter by text","show_only":"Show only"},"map":{"help_coordinator_link_description":"Solid lines are the link to the Coordinator","help_end_device_description":"Green means End Device","help_is_coordinator":"is Coordinator","help_lqi_description":"Link quality is between 0 - 255 (higher is better), values with / represents multiple types of links","help_router_description":"Blue means Router","help_router_links_description":"Dashed lines are the link with Routes","hide":"Click on me to hide","load":"Load map","loading":"Depending on the size of your network this can take somewhere between 10 seconds and 2 minutes."},"navbar":{"all":"All","dashboard":"Dashboard","devices":"Devices","disable_join":"Disable join","extensions":"Extensions","groups":"Groups","logs":"Logs","map":"Map","ota":"OTA","permit_join":"Permit join","restart":"Restart","settings":"Settings","toggle_dropdown":"Toggle dropdown","touchlink":"Touchlink"},"ota":{"check":"Check for new updates","check_all":"Check all","empty_ota_message":"You don\'t have any devices that support OTA","remaining_time":"Remaining time {{- remaining}}","update":"Update device firmware"},"settings":{"about":"About","advanced":"Advanced","availability":"Availability","blocklist":"Blocklist","coordinator_revision":"Coordinator revision","coordinator_type":"Coordinator type","donate":"Donate","donation_text":["Hello, %username%, here you can thank us for hardworking","Don\'t hesitate to say something nice as well ;)"],"download_state":"Download state","experimental":"Experimental","external_converters":"External converters","frontend":"Frontend","frontend_version":"Frontend version","main":"Main","mqtt":"MQTT","ota":"OTA updates","passlist":"Passlist","raw":"Raw","restart_zigbee2mqtt":"Restart Zigbee2MQTT","serial":"Serial","settings":"Settings","tools":"Tools","zigbee2mqtt_version":"Zigbee2MQTT version","translate":"Translate","stats":"Stats"},"settingsSchemaTranslations":{"advanced-title":"Advanced","advanced_availability_blacklist__title":"Availability blacklist (deprecated, use availability_blocklist)","advanced_availability_blocklist__description":"Prevent devices from being checked for availability","advanced_availability_blocklist__title":"Availability Blocklist","advanced_availability_passlist__description":"Only enable availability check for certain devices","advanced_availability_passlist__title":"Availability passlist","advanced_availability_whitelist__title":"Availability whitelist (deprecated, use passlist)","advanced_ext_pan_id__description":"Zigbee extended pan ID, changing requires repairing all devices!","advanced_ext_pan_id__title":"Ext Pan ID","advanced_log_output__description":"Output location of the log, leave empty to supress logging","advanced_log_output__title":"Log output","advanced_log_syslog-title":"syslog","blocklist__description":"Block devices from the network (by ieeeAddr)","blocklist__title":"Blocklist","experimental-title":"Experimental","external_converters__description":"You can define external converters to e.g. add support for a DiY device","external_converters__title":"External converters","frontend-title":"Frontend","mqtt-title":"MQTT","ota-title":"OTA updates","passlist__description":"Allow only certain devices to join the network (by ieeeAddr). Note that all devices not on the passlist will be removed from the network!","passlist__title":"Passlist","root__description":"Allow only certain devices to join the network (by ieeeAddr). Note that all devices not on the passlist will be removed from the network!","root_availability_blacklist__title":"Availability blacklist (deprecated, use availability_blocklist)","root_availability_blocklist__description":"Prevent devices from being checked for availability","root_availability_blocklist__title":"Availability Blocklist","root_availability_passlist__description":"Only enable availability check for certain devices","root_availability_passlist__title":"Availability passlist","root_availability_whitelist__title":"Availability whitelist (deprecated, use passlist)","root_debounce_ignore__description":"Protects unique payload values of specified payload properties from overriding within debounce time","root_debounce_ignore__title":"Ignore debounce","root_ext_pan_id__description":"Zigbee extended pan ID, changing requires repairing all devices!","root_ext_pan_id__title":"Ext Pan ID","root_filtered_attributes__description":"Allows to prevent certain attributes from being published","root_filtered_attributes__title":"Filtered attributes","root_filtered_optimistic__description":"Filter attributes from optimistic publish payload when calling /set. (This has no effect if optimistic is set to false).","root_filtered_optimistic__title":"Filtered optimistic attributes","root_log_output__description":"Output location of the log, leave empty to supress logging","root_log_output__title":"Log output","root_log_syslog-title":"syslog","serial-title":"Serial"},"touchlink":{"detected_devices_message":"Detected {{count}} touchlink devices.","rescan":"Scan again","scan":"Scan"},"values":{"clear":"Clear","closed":"Closed","false":"False","not_supported":"Not supported","occupied":"Occupied","open":"Open","supported":"Supported","true":"True","empty_string":"Empty string(\\"\\")","leaking":"Leaking","tampered":"Tampered"},"zigbee":{"actions":"Actions","attribute":"Attribute","battery":"Battery","block_join":"Block from joining again","cluster":"Cluster","dc_source":"DC Source","description":"Description","device_type":"Device type","endpoint":"Endpoint","firmware_build_date":"Firmware build date","firmware_version":"Firmware version","force_remove":"Force remove","friendly_name":"Friendly name","ieee_address":"IEEE Address","input_clusters":"Input clusters","interview_completed":"Interview completed","interview_failed":"Interview failed","interviewing":"Interviewing","last_seen":"Last seen","lqi":"LQI","mains_single_phase":"Mains (single phase)","manufacturer":"Manufacturer","max_rep_interval":"max rep interval","min_rep_change":"Min rep change","min_rep_interval":"Min rep interval","model":"Model","network_address":"Network address","none":"None","output_clusters":"Output clusters","pic":"Pic","power":"Power","power_level":"power level","reconfigure":"Reconfigure","remove_device":"Remove device","rename_device":"Rename device","select_attribute":"Select attribute","select_cluster":"Select cluster","support_status":"Support status","unsupported":"Unsupported","updating_firmware":"Updating firmware","update_Home_assistant_entity_id":"Update Home Assistant entity ID","zigbee_manufacturer":"Zigbee Manufacturer","zigbee_model":"Zigbee Model","device":"Device","channel":"Channel"},"scene":{"scene_id":"Scene ID","recall":"Recall","store":"Store","remove":"Remove","remove_all":"Remove all","add":"Add","select_scene":"Select Scene","scene_name":"Scene Name"},"stats":{"byType":"By device type","byPowerSource":"By power source","byVendor":"By vendor","byModel":"By model","total":"Total"}}');
4984
+ const en_namespaceObject = JSON.parse('{"common":{"action":"Action","actions":"Actions","apply":"Apply","attribute":"Attribute","bind":"Bind","check_all":"Check all","clear":"Clear","close":"Close","cluster":"Cluster","clusters":"Clusters","confirmation":"Confirmation prompt","delete":"Delete","destination":"Destination","devices":"Devices","dialog_confirmation_prompt":"Are you sure?","disable":"Disable","enter_search_criteria":"Enter search criteria","groups":"Groups","loading":"Loading...","none":"None","ok":"Ok","read":"Read","save":"Save","select_device":"Select device","select_endpoint":"Select endpoint","source_endpoint":"Source endpoint","the_only_endpoint":"The only endpoint","unbind":"Unbind","write":"Write"},"devicePage":{"about":"About","bind":"Bind","clusters":"Clusters","dev_console":"Dev console","exposes":"Exposes","reporting":"Reporting","settings":"Settings","settings_specific":"Settings (specific)","state":"State","scene":"Scene","unknown_device":"Unknown device"},"exposes":{"action":"Action","auto_off":"Auto off","away_mode":"Away mode","away_preset_days":"Away preset days","away_preset_temperature":"Away preset temperature","backlight_mode":"Backlight mode","battery":"Battery","battery_low":"Battery low","boost_time":"Boost time","brightness":"Brightness","calibration":"Calibration","carbon_monoxide":"Carbon monoxide","color_hs":"Color (HS)","color_temp":"Color temperature","color_temp_startup":"Startup color temp","color_xy":"Color (XY)","comfort_temperature":"Comfort temperature","consumer_connected":"Consumer connected","consumer_overload":"Consumer overload","contact":"Contact","current":"Current","current_heating_setpoint":"Current heating setpoint","eco_temperature":"Eco temperature","effect":"Effect","empty_exposes_definition":"Empty exposes definition","energy":"Energy","force":"Force","humidity":"Humidity","illuminance":"Illuminance","illuminance_lux":"Illuminance","led_disabled_night":"Led disabled night","linkquality":"Linkquality","local_temperature":"Local temperature","local_temperature_calibration":"Local temperature calibration","max_temperature":"Max temperature","min_temperature":"Min temperature","motor_reversal":"Motor reversal","moving":"Moving","occupancy":"Occupancy","operation_mode":"Operation mode","options":"Options","position":"Position","power":"Power","power_on_behavior":"Power on behavior","power_outage_memory":"Power outage memory","preset":"Preset","pressure":"Pressure","sensivity":"Sensivity","smoke":"Smoke","state":"State","strength":"Strength","system_mode":"System mode","tamper":"Tamper","temperature":"Temperature","voltage":"Voltage","water_leak":"Water leak","week":"Week"},"extensions":{"create_new_extension":"Create new extension","extension_name_propmt":"Enter new extension name","select_extension_to_edit":"Select extension to edit"},"featureDescriptions":{"Auto off after specific time.":"Auto off after specific time.","Away mode":"Away mode","Away preset days":"Away preset days","Away preset temperature":"Away preset temperature","Boost time":"Boost time","Brightness of this light":"Brightness of this light","Calibration time":"Calibration time","Color of this light expressed as hue/saturation":"Color of this light expressed as hue/saturation","Color of this light in the CIE 1931 color space (x/y)":"Color of this light in the CIE 1931 color space (x/y)","Color temperature after cold power on of this light":"Color temperature after cold power on of this light","Color temperature of this light":"Color temperature of this light","Comfort temperature":"Comfort temperature","Controls the behavior when the device is powered on":"Controls the behavior when the device is powered on","Controls the behaviour when the device is powered on":"Controls the behaviour when the device is powered on","Current temperature measured on the device":"Current temperature measured on the device","Decoupled mode for center button":"Decoupled mode for center button","Decoupled mode for left button":"Decoupled mode for left button","Decoupled mode for right button":"Decoupled mode for right button","Eco temperature":"Eco temperature","Enable/disable auto lock":"Enable/disable auto lock","Enable/disable away mode":"Enable/disable away mode","Enables/disables physical input on the device":"Enables/disables physical input on the device","Enables/disables window detection on the device":"Enables/disables window detection on the device","Enabling prevents both relais being on at the same time":"Enabling prevents both relais being on at the same time","Force the valve position":"Force the valve position","Indicates if CO (carbon monoxide) is detected":"Indicates if CO (carbon monoxide) is detected","Indicates if the battery of this device is almost empty":"Indicates if the battery of this device is almost empty","Indicates if the contact is closed (= true) or open (= false)":"Indicates if the contact is closed (= true) or open (= false)","Indicates whether the device detected a water leak":"Indicates whether the device detected a water leak","Indicates whether the device detected occupancy":"Indicates whether the device detected occupancy","Indicates whether the device detected smoke":"Indicates whether the device detected smoke","Indicates whether the device is tampered":"Indicates whether the device is tampered","Instantaneous measured electrical current":"Instantaneous measured electrical current","Instantaneous measured power":"Instantaneous measured power","Link quality (signal strength)":"Link quality (signal strength)","Maximum temperature":"Maximum temperature","Measured electrical potential value":"Measured electrical potential value","Measured illuminance in lux":"Measured illuminance in lux","Measured relative humidity":"Measured relative humidity","Measured temperature value":"Measured temperature value","Minimum temperature":"Minimum temperature","Mode of this device (similar to system_mode)":"Mode of this device (similar to system_mode)","Mode of this device":"Mode of this device","Motor speed":"Motor speed","Offset to be used in the local_temperature":"Offset to be used in the local_temperature","On/off state of the switch":"On/off state of the switch","On/off state of this light":"On/off state of this light","Position of this cover":"Position of this cover","Position":"Position","Raw measured illuminance":"Raw measured illuminance","Recover state after power outage":"Recover state after power outage","Remaining battery in %":"Remaining battery in %","Side of the cube":"Side of the cube","Sum of consumed energy":"Sum of consumed energy","Temperature setpoint":"Temperature setpoint","The measured atmospheric pressure":"The measured atmospheric pressure","Triggered action (e.g. a button click)":"Triggered action (e.g. a button click)","Triggers an effect on the light (e.g. make light blink for a few seconds)":"Triggers an effect on the light (e.g. make light blink for a few seconds)","Voltage of the battery in millivolts":"Voltage of the battery in millivolts","Week format user for schedule":"Week format user for schedule"},"featureNames":{"action":"Action","angle_x":"Angle X","angle_y":"Angle Y","angle_z":"Angle Z","brightness":"Brightness","co2":"CO2","color_temp":"Color Temp","color_xy":"Color Xy","contact":"Contact","humidity":"Humidity","illuminance":"Illuminance","occupancy":"Occupancy","pressure":"Pressure","soil_moisture":"Soil Moisture","state":"State","temperature":"Temperature","tamper":"Tamper"},"groups":{"add_to_group":"Add to group","create_group":"Create group","new_group_id":"New group id","new_group_id_placeholder":"Specify group id if necessary","new_group_name":"New group name","new_group_name_placeholder":"example: my_bedroom_lights","remove_group":"Remove group","group_id":"Group ID","group_name":"Group Name","group_members":"Group members","group_scenes":"Group scenes"},"logs":{"empty_logs_message":"Nothing to display","filter_by_text":"Filter by text","show_only":"Show only"},"map":{"help_coordinator_link_description":"Solid lines are the link to the Coordinator","help_end_device_description":"Green means End Device","help_is_coordinator":"is Coordinator","help_lqi_description":"Link quality is between 0 - 255 (higher is better), values with / represents multiple types of links","help_router_description":"Blue means Router","help_router_links_description":"Dashed lines are the link with Routes","hide":"Click on me to hide","load":"Load map","loading":"Depending on the size of your network this can take somewhere between 10 seconds and 2 minutes."},"navbar":{"all":"All","dashboard":"Dashboard","devices":"Devices","disable_join":"Disable join","extensions":"Extensions","groups":"Groups","logs":"Logs","map":"Map","ota":"OTA","permit_join":"Permit join","restart":"Restart","settings":"Settings","toggle_dropdown":"Toggle dropdown","touchlink":"Touchlink"},"ota":{"check":"Check for new updates","check_all":"Check all","empty_ota_message":"You don\'t have any devices that support OTA","remaining_time":"Remaining time {{- remaining}}","update":"Update device firmware"},"settings":{"about":"About","advanced":"Advanced","availability":"Availability","blocklist":"Blocklist","coordinator_revision":"Coordinator revision","coordinator_type":"Coordinator type","donate":"Donate","donation_text":["Hello, %username%, here you can thank us for hardworking","Don\'t hesitate to say something nice as well ;)"],"download_state":"Download state","experimental":"Experimental","external_converters":"External converters","frontend":"Frontend","frontend_version":"Frontend version","main":"Main","mqtt":"MQTT","ota":"OTA updates","passlist":"Passlist","raw":"Raw","restart_zigbee2mqtt":"Restart Zigbee2MQTT","serial":"Serial","settings":"Settings","tools":"Tools","zigbee2mqtt_version":"Zigbee2MQTT version","translate":"Translate","stats":"Stats"},"settingsSchemaTranslations":{"advanced-title":"Advanced","advanced_availability_blacklist__title":"Availability blacklist (deprecated, use availability_blocklist)","advanced_availability_blocklist__description":"Prevent devices from being checked for availability","advanced_availability_blocklist__title":"Availability Blocklist","advanced_availability_passlist__description":"Only enable availability check for certain devices","advanced_availability_passlist__title":"Availability passlist","advanced_availability_whitelist__title":"Availability whitelist (deprecated, use passlist)","advanced_ext_pan_id__description":"Zigbee extended pan ID, changing requires repairing all devices!","advanced_ext_pan_id__title":"Ext Pan ID","advanced_log_output__description":"Output location of the log, leave empty to supress logging","advanced_log_output__title":"Log output","advanced_log_syslog-title":"syslog","blocklist__description":"Block devices from the network (by ieeeAddr)","blocklist__title":"Blocklist","experimental-title":"Experimental","external_converters__description":"You can define external converters to e.g. add support for a DiY device","external_converters__title":"External converters","frontend-title":"Frontend","mqtt-title":"MQTT","ota-title":"OTA updates","passlist__description":"Allow only certain devices to join the network (by ieeeAddr). Note that all devices not on the passlist will be removed from the network!","passlist__title":"Passlist","root__description":"Allow only certain devices to join the network (by ieeeAddr). Note that all devices not on the passlist will be removed from the network!","root_availability_blacklist__title":"Availability blacklist (deprecated, use availability_blocklist)","root_availability_blocklist__description":"Prevent devices from being checked for availability","root_availability_blocklist__title":"Availability Blocklist","root_availability_passlist__description":"Only enable availability check for certain devices","root_availability_passlist__title":"Availability passlist","root_availability_whitelist__title":"Availability whitelist (deprecated, use passlist)","root_debounce_ignore__description":"Protects unique payload values of specified payload properties from overriding within debounce time","root_debounce_ignore__title":"Ignore debounce","root_ext_pan_id__description":"Zigbee extended pan ID, changing requires repairing all devices!","root_ext_pan_id__title":"Ext Pan ID","root_filtered_attributes__description":"Allows to prevent certain attributes from being published","root_filtered_attributes__title":"Filtered attributes","root_filtered_optimistic__description":"Filter attributes from optimistic publish payload when calling /set. (This has no effect if optimistic is set to false).","root_filtered_optimistic__title":"Filtered optimistic attributes","root_log_output__description":"Output location of the log, leave empty to supress logging","root_log_output__title":"Log output","root_log_syslog-title":"syslog","serial-title":"Serial"},"touchlink":{"detected_devices_message":"Detected {{count}} touchlink devices.","rescan":"Scan again","scan":"Scan"},"values":{"clear":"Clear","closed":"Closed","false":"False","not_supported":"Not supported","occupied":"Occupied","open":"Open","supported":"Supported","true":"True","empty_string":"Empty string(\\"\\")","leaking":"Leaking","tampered":"Tampered"},"zigbee":{"actions":"Actions","attribute":"Attribute","battery":"Battery","block_join":"Block from joining again","cluster":"Cluster","dc_source":"DC Source","description":"Description","device_type":"Device type","endpoint":"Endpoint","firmware_build_date":"Firmware build date","firmware_version":"Firmware version","force_remove":"Force remove","friendly_name":"Friendly name","ieee_address":"IEEE Address","input_clusters":"Input clusters","interview_completed":"Interview completed","interview_failed":"Interview failed","interviewing":"Interviewing","last_seen":"Last seen","lqi":"LQI","mains_single_phase":"Mains (single phase)","manufacturer":"Manufacturer","max_rep_interval":"max rep interval","min_rep_change":"Min rep change","min_rep_interval":"Min rep interval","model":"Model","network_address":"Network address","none":"None","output_clusters":"Output clusters","pic":"Pic","power":"Power","power_level":"power level","reconfigure":"Reconfigure","remove_device":"Remove device","rename_device":"Rename device","select_attribute":"Select attribute","select_cluster":"Select cluster","support_status":"Support status","unsupported":"Unsupported","updating_firmware":"Updating firmware","update_Home_assistant_entity_id":"Update Home Assistant entity ID","zigbee_manufacturer":"Zigbee Manufacturer","zigbee_model":"Zigbee Model","device":"Device","channel":"Channel","avaliability":"Avaliability","offline":"Offline","online":"Online"},"scene":{"scene_id":"Scene ID","recall":"Recall","store":"Store","remove":"Remove","remove_all":"Remove all","add":"Add","select_scene":"Select Scene","scene_name":"Scene Name"},"stats":{"byType":"By device type","byPowerSource":"By power source","byVendor":"By vendor","byModel":"By model","total":"Total"}}');
4936
4985
  ;// CONCATENATED MODULE: ./src/i18n/locales/fr.json
4937
4986
  const locales_fr_namespaceObject = JSON.parse('{"common":{"action":"Action","actions":"Actions","apply":"Appliquer","attribute":"Attribut","bind":"Lier","check_all":"Cocher tout","clear":"Vider","close":"Fermer","cluster":"Cluster","clusters":"Clusters","confirmation":"Confirmation","delete":"Effacer","destination":"Destination","devices":"Périphériques","dialog_confirmation_prompt":"Êtes-vous sûr ?","disable":"Désactiver","enter_search_criteria":"Entrez le critère de recherche","groups":"Groupes","loading":"Chargement...","none":"Aucun(e)","ok":"Ok","read":"Lecture","save":"Sauver","select_device":"Choix Périph","select_endpoint":"Choix endpoint","source_endpoint":"Endpoint Source","the_only_endpoint":"Le seul endpoint","unbind":"Délier","unknown":"Inconnu","write":"Ecriture"},"devicePage":{"about":"À propos","bind":"Lien","clusters":"Clusters","dev_console":"Console dev","exposes":"Expose","reporting":"Rapports","settings":"Paramètres","settings_specific":"Paramètres (Spécifiques)","state":"Etat","scene":"Scène","unknown_device":"Périphérique inconnu"},"exposes":{"action":"Action","auto_off":"Arrêt automatique","away_mode":"Mode absent","away_preset_days":"Préréglage jours d\'absence","away_preset_temperature":"Préréglage température d\'absence","backlight_mode":"Mode Rétroéclairage","battery":"Batterie","battery_low":"Batterie faible","boost_time":"Temp de boost","brightness":"Luminosité","calibration":"Calibration","carbon_monoxide":"Monoxyde de carbone","co2":"Dioxyde de carbone","color_hs":"Couleur (HS)","color_temp":"Temp Couleur","color_temp_startup":"Temp Couleur à l\'allumage","color_xy":"Couleur (XY)","comfort_temperature":"Température de confort","consumer_connected":"Consommateur connecté","consumer_overload":"Consommateur surchargé","contact":"Contact","current":"Courant","current_heating_setpoint":"Consigne chauffage actuelle","device_temperature":"Température Périph","eco_temperature":"Température éco","effect":"Effet","empty_exposes_definition":"Vider définition d\'expositions","energy":"Energie","force":"Force","humidity":"Humidité","illuminance":"Éclairement","illuminance_lux":"Éclairement","led_disabled_night":"Désactivation LED en nuit","linkquality":"Qualité du lien","local_temperature":"Température locale","local_temperature_calibration":"Calibration température locale","max_temperature":"Température max","min_temperature":"Température min","motion":"Mouvement","motion_direction":"Direction Mouvement","motion_speed":"Vitesse Mouvement","motor_reversal":"Inversion moteur","moving":"Déplacement","occupancy":"Occupation","operation_mode":"Mode d\'opération","options":"Options","position":"Position","power":"Puissance","power_on_behavior":"Comportement d\'allumage","power_outage_memory":"Mémoire Panne de courant","presence":"Présence","preset":"Préréglage","pressure":"Pression","Pressure":"Pression","sensivity":"Sensibilité","smoke":"Fumée","state":"Etat","strength":"Force","system_mode":"Mode du système","tamper":"Sabotage","temperature":"Temperature","voltage":"Voltage","water_leak":"Fuite d\'eau","week":"Semaine"},"extensions":{"create_new_extension":"Créer une nouvelle extension","extension_name_propmt":"Entrez le nom de l\'extension","select_extension_to_edit":"Choisir l\'extension à modifier"},"featureNames":{"action":"Action","action_angle":"Angle d\'action","action_from_side":"Action venant de la face","action_side":"Face active","action_to_side":"Action vers la face","alarm":"Alarme","angle_x":"Angle X","angle_y":"Angle Y","angle_z":"Angle Z","auto_lock":"Verrouillage automatique","brightness":"Luminosité","calibration_time":"Temps de calibration","carbon_monoxide":"Monoxyde de carbone","child_lock":"Verrouillage Enfant","co2":"Dioxyde de carbone","color_hs":"Couleur Hue/Sat","color_temp":"Temp Couleur","color_temp_startup":"Temp Couleur au démarrage","color_xy":"Couleur Xy","consumer_connected":"Consommateur connecté","contact":"Contact","current":"Actuel","humidity":"Humidité","illuminance":"Éclairement","occupancy":"Occupation","on_off_transition_time":"Temps de transition allumé/éteint","options":"Options","pressure":"Pression","soil_moisture":"Humidité Sol","state":"État","temperature":"Température","tamper":"Sabotage","current_heating_setpoint":"Consigne de chauffe actuelle","current_level_startup":"Niveau actuel au démarrage","device_temperature":"Température du périph","energy":"Energie","local_temperature":"Température Locale","level_config":"Configuration du niveau","system_mode":"Mode du Système","local_temperature_calibration":"Calibration Température Locale","motion":"Mouvement","motion_direction":"Direction du mouvement","motion_speed":"Vitesse du mouvement","motor_speed":"Vitesse moteur","moving":"En mouvement","away_mode":"Mode Absence","position":"Position","power":"Puissance","presence":"Présence","preset":"Préréglage","programming_mode":"Mode Programmé","program_weekday":"Programme Jours de semaine","program_saturday":"Programme Samedi","program_sunday":"Programme Dimanche","smoke":"Fumée","smoke_density":"Densité de fumée","state_l1":"Etat L 1","state_l2":"Etat L 2","state_l3":"Etat L 3","state_l4":"Etat L 4","valve_detection":"Détection valve","voltage":"Voltage","water_leak":"Fuite d\'eau","window_detection":"Détection fenêtre","window":"Fenêtre"},"featureDescriptions":{"Auto off after specific time.":"Extinction automatique après un temps défini.","On/off state of this light":"Etat Allumé/Eteint de cette lumière","Brightness of this light":"Luminosité de cette lumière","Triggers an effect on the light (e.g. make light blink for a few seconds)":"Exécute un effet sur la lumière (ex : faire clignoter quelques secondes)","Controls the behavior when the device is powered on":"Contrôle le comportement lorsque le périphérique est allumé","Controls the behaviour when the device is powered on":"Contrôle le comportement lorsque le périphérique est allumé","Link quality (signal strength)":"Qualité du lien (force du signal)","Calibrates the humidity value (absolute offset), takes into effect on next report of device.":"Calibration de la valeur d\'humidité (décalage absolu), pris en compte au prochain rapport du périph.","Calibrates the illuminance value (percentual offset), takes into effect on next report of device.":"Calibration de la valeur d\'éclairement (décalage en pourcent), pris en compte au prochain rapport du périph.","Calibrates the illuminance_lux value (percentual offset), takes into effect on next report of device.":"Calibration de la valeur d\'éclairement (lux) (décalage en pourcent), pris en compte au prochain rapport du périph.","Calibrates the pressure value (absolute offset), takes into effect on next report of device.":"Calibration de la pression (décalage absolu), pris en compte au prochain rapport du périph.","Calibrates the temperature value (absolute offset), takes into effect on next report of device.":"Calibration de la température (décalage absolu), pris en compte au prochain rapport du périph.","Calibration time":"Temps de calibration","Color of this light expressed as hue/saturation":"Couleur de cette lumière exprimée en hue/saturation","Color temperature after cold power on of this light":"Température couleur après un allumage à froid de cette lumière","direction of movement from the point of view of the radar":"Direction du mouvement du point de vue du radar","Enabling prevents both relais being on at the same time":"Activer ceci permet d\'éviter que les deux relais soient activés ensemble","Indicates if CO (carbon monoxide) is detected":"Indique si du CO (monoxyde de carbone) est détecté","Remaining battery in %":"Batterie restante en %","Triggered action (e.g. a button click)":"Action déclenchée (ex : un clic bouton)","Measured temperature value":"Valeur de température mesurée","Measured relative humidity":"Valeur d\'humidité relative mesurée","The measured atmospheric pressure":"Valeur de pression atmosphérique mesurée","Voltage of the battery in millivolts":"Voltage de la batterie en millivolts","Indicates if the contact is closed (= true) or open (= false)":"Indique si le contact est fermé (= vrai) ou ouvert (= faux)","Indicates whether the device detected occupancy":"Indique si le périphérique a détecté une occupation","Indicates whether the device detected a water leak":"Indique si le périphérique a détecté une fuite d\'eau","Indicates whether the device detected presence":"Indique si le périphérique a détecté une présence","Indicates whether the device detected smoke":"Indique si le périphérique a détecté de la fumée","Instantaneous measured electrical current":"Mesure instantanée du courant électrique","Instantaneous measured power":"Mesure instantanée de la puissance électrique","Measured electrical potential value":"Valeur de Potentiel électrique mesurée","Motor speed":"Vitesse moteur","moving inside the range of the sensor":"Indique si un mouvement a été détecté dans le rayon du radar.","Number of digits after decimal point for humidity, takes into effect on next report of device.":"Nombre de décimales pour l\'humidité, pris en compte au prochain rapport du périph.","Number of digits after decimal point for illuminance_lux, takes into effect on next report of device.":"Nombre de décimales pour l\'éclairement (lux), pris en compte au prochain rapport du périph.","Number of digits after decimal point for illuminance, takes into effect on next report of device.":"Nombre de décimales pour l\'éclairement, pris en compte au prochain rapport du périph.","Number of digits after decimal point for pressure, takes into effect on next report of device.":"Nombre de décimales pour la pression, pris en compte au prochain rapport du périph.","Number of digits after decimal point for temperature, takes into effect on next report of device.":"Nombre de décimales pour la température, pris en compte au prochain rapport du périph.","Measured illuminance in lux":"Valeur d\'éclairement mesurée en lux","Indicates if the battery of this device is almost empty":"Indique si la batterie du périphérique est presque vide","Indicates whether the device is tampered":"Indique si le périphérique a été saboté","Color temperature of this light":"Température de couleur de cette lumière","Color of this light in the CIE 1931 color space (x/y)":"Couleur de cette lumière dans l\'espace couleur CIE 1931 (x/y)","Enables/disables physical input on the device":"Active/Désactive le verrouillage du périphérique","Enables/disables window detection on the device":"Active/Désactive la détection de fenêtre du périphérique","Position":"Position","Position of this cover":"Position du couvercle","presets for sensivity for presence and movement":"préréglage de sensibilité pour la présence et le mouvement","Raw measured illuminance":"Eclairement brut mesuré","Recover state after power outage":"Etat récupéré après coupure de courant","Sends a message the last time occupancy was detected. When setting this for example to [10, 60] a `{\\"no_occupancy_since\\": 10}` will be send after 10 seconds and a `{\\"no_occupancy_since\\": 60}` after 60 seconds.":"Envoi un message la dernière fois qu\'une occupation a été détectée. Si vous configurez par exemple [10, 60] , un `{\\"no_occupancy_since\\": 10}` sera envoyé après 10 secondes et un `{\\"no_occupancy_since\\": 60}` après 60 secondes.","sensitivity of the radar":"sensibilité du radar","Set to false to disable the legacy integration (highly recommended), will change structure of the published payload (default true).":"Mettre à Faux pour désactiver l\'ancienne intégration (fortement recommandé), changera la structure du payload publié (Vrai par défaut).","Side of the cube":"Face du cube","Speed of movement":"Vitesse du mouvement","Sum of consumed energy":"Somme d\'énergie consommée en kW/h","Time in seconds after which occupancy is cleared after detecting it (default 90 seconds).":"Temps en seconde après lequel l\'occupation est à nouveau vide après detection (90 secondes par défaut).","Temperature setpoint":"Consigne Température","Current temperature measured on the device":"Température Actuelle mesurée sur le périphérique","Mode of this device":"Mode du périphérique","Offset to be used in the local_temperature":"Décalage à appliquer sur la local_temperature","Away mode":"Mode absence","Mode of this device (similar to system_mode)":"Mode du périphérique (similaire à system_mode)","Enable/disable auto lock":"Active/Désactive auto-verrouillage","Enable/disable away mode":"Active/Désactive mode absent","Away preset days":"Jours d\'absence pré-définis","Boost time":"Durée de Boost","Comfort temperature":"Température Confort","Eco temperature":"Température Eco","Force the valve position":"Forcer la position de la valve","Maximum temperature":"Température Max","Minimum temperature":"Température Min","Week format user for schedule":"Format semaine du calendrier","Away preset temperature":"Température Absent pré-définie","On/off state of the switch":"Etat Allumé/Eteint de l\'interrupteur","ECO mode (energy saving mode)":"Mode éco (mode d\'économie d\'énergie)","Window status closed or open ":"Statut Fenêtre fermée ou ouverte ","MANUAL MODE ☝ - In this mode, the device executes manual temperature setting. When the set temperature is lower than the \\"minimum temperature\\", the valve is closed (forced closed). PROGRAMMING MODE ⏱ - In this mode, the device executes a preset week programming temperature time and temperature. HOLIDAY MODE ⛱ - In this mode, for example, the vacation mode is set for 10 days and the temperature is setto 15 degrees Celsius. After 10 days, the device will automatically switch to programming mode. TEMPORARY MANUAL MODE - In this mode, ☝ icon will flash. At this time, the device executes the manually set temperature and returns to the weekly programming mode in the next time period. ":"MODE PROGRAMMING ⏱ - Dans ce mode, la vanne utilise un horaire prédéfini d\'heures et de température pour la semaine. MODE MANUAL ☝ - Dans ce mode, la vanne utilise le paramètre de température manuelle. Lorsque la température définie est plus basse que la \\"température minimale\\", la vanne est fermée (de manière forcée). MODE TEMPORARY MANUAL - Dans ce mode, l\'icone ☝ clignottera. À ce moment, la vanne utilisera la température définie manuellement et reviendra au mode Programming à la prochaine période de temps. MODE HOLIDAY ⛱ - Dans ce mode, si par exemple le mode vacance est mis pour 10 jours et la température à 15°C. Après 10 jours, la vanne repassera en mode Programming. ","PROGRAMMING MODE ⏱ - In this mode, the device executes a preset week programming temperature time and temperature. ":"MODE PROGRAMMING ⏱ - Dans ce mode, la vanne utilise un horaire prédéfini d\'heures et de température pour la semaine. ","Boost Heating: press and hold \\"+\\" for 3 seconds, the device will enter the boost heating mode, and the ▷╵◁ will flash. The countdown will be displayed in the APP":"Boost Chauffage: appuyez et maintenez \\"+\\" pour 3 secondes, la vanne entrera en mode Boost Chauffage, et l\'icone ▷╵◁ clignottera. Le décompte sera affiché dans l\'app","Countdown in minutes":"Décompte en minutes","Boost Time Setting 100 sec - 900 sec, (default = 300 sec)":"Paramètre du temp de Boost 100 sec - 900 sec, (defaut = 300 sec)"},"groups":{"add_to_group":"Ajouter au groupe","create_group":"Créer groupe","new_group_id":"Nouvel ID groupe","new_group_id_placeholder":"Spécifiez l\'ID groupe si nécessaire","new_group_name":"Nouveau nom de groupe","new_group_name_placeholder":"exemple: mes_lumières_chambre","remove_group":"Supprimer groupe","group_id":"ID Groupe","group_name":"Nom Groupe","group_members":"Membres Groupe","group_scenes":"Scènes Groupe"},"logs":{"empty_logs_message":"Rien à afficher","filter_by_text":"Filtrer sur le texte","show_only":"Niveau"},"map":{"help_coordinator_link_description":"Les lignes pleines sont les liens avec le Coordinateur","help_end_device_description":"Les Périphérique Terminaux sont en vert","help_is_coordinator":"est le Coordinateur","help_lqi_description":"La qualité de lien est entre 0 - 255 (plus c\'est haut mieux c\'est), les valeurs avec un / représentent plusieurs types de liens","help_router_description":"Les Routeurs sont en bleu","help_router_links_description":"Les lignes en pointillés sont les liens avec les Routeurs","hide":"Cliquez-moi pour me cacher","load":"Charger le schéma","loading":"En fonction de la taille de votre réseau, ceci peut prendre entre 10 secondes et 2 minutes."},"navbar":{"all":"Tout","dashboard":"Tableau de bord","devices":"Périphériques","disable_join":"Désactiver Appairage","extensions":"Extensions","groups":"Groupes","logs":"Journaux","map":"Schéma","ota":"MàJ OTA","permit_join":"Activer Appairage","restart":"Redémarrer","settings":"Paramètres","toggle_dropdown":"Bascule menu","touchlink":"Touchlink"},"ota":{"check":"Vérifier nouvelles MàJ","check_all":"Vérifier tout","empty_ota_message":"Vous n\'avez aucun périphérique supportant les MàJ OTA","remaining_time":"Temps restant {{- remaining}}","update":"MàJ firmware des périphériques"},"settings":{"about":"À propos","advanced":"Avancé","availability":"Disponibilité","blocklist":"Liste de blocage","coordinator_revision":"Révision du Coordinateur","coordinator_type":"Type de Coordinateur","donate":"Don","donation_text":["Salut, %username%, vous pouvez ici nous remercier pour notre dur labeur","N\'hésitez pas à nous laisser un petit mot gentil ;)"],"download_state":"Téléchargement de l\'état","experimental":"Expérimental","external_converters":"Convertisseurs Externes","frontend":"Interface","frontend_version":"Version Interface","main":"Principal","mqtt":"MQTT","ota":"MàJ OTA","passlist":"Autorisés","raw":"Brut","restart_zigbee2mqtt":"Redémarrer Zigbee2MQTT","serial":"Port Série","settings":"Paramètres","tools":"Outils","zigbee2mqtt_version":"Version Zigbee2MQTT","translate":"Traduire"},"settingsSchemaTranslations":{"advanced-title":"Avancé","advanced_availability_blacklist__title":"Liste noire disponibilité (déprécié, utilisez Liste blocage disponibilité)","advanced_availability_blocklist__description":"Empèche que certains périphériques soient vérifiés pour la disponibilité","advanced_availability_blocklist__title":"Liste blocage disponibilité","advanced_availability_passlist__description":"Activer la disponibilité seulement sur certains périphériques","advanced_availability_passlist__title":"Liste autorisation disponibilité","advanced_availability_whitelist__title":"Liste blanche disponibilité (déprécié, utilisez Liste autorisation disponibilité)","advanced_ext_pan_id__description":"ID pan étendu zigbee, tout changement imposera un ré-appairage de tous les périphériques!","advanced_ext_pan_id__title":"ID Pan étendu","advanced_log_output__description":"Localisation des journaux de sorties, laissez vide pour supprimer la journalisation","advanced_log_output__title":"Journaux de Sortie","advanced_log_syslog-title":"syslog","blocklist__description":"Bloquer les périphériques sur le réseau (par adresse IEEE)","blocklist__title":"Liste blocage","experimental-title":"Expérimental","external_converters__description":"Vous pouvez définir des convertisseurs externes pour par exemple ajouter un support pour un périphérique fait maison","external_converters__title":"Convertisseurs externes","frontend-title":"Interface","mqtt-title":"MQTT","ota-title":"MàJ OTA","passlist__description":"Autorise seulement certains périphériques à joindre le réseau (par adresse ieee). Notez que tous les périphériques qui ne sont pas dans cette liste seront retirés du réseau !","passlist__title":"Liste autorisation","root-title":"Port Série","root__description":"Autoriser seulement certains périphériques à joindre le réseau (par adresse IEEE). Notez que tous les périphériques absents de la liste seront retirés du réseau!","root__title":"Liste Autorisation","root_availability_blacklist__title":"Liste noire disponibilité (déprécié, utilisez Liste blocage disponibilité)","root_availability_blocklist__description":"Empèche que certains périphériques soient vérifiés pour la disponibilité","root_availability_blocklist__title":"Liste blocage disponibilité","root_availability_passlist__description":"Activer la disponibilité seulement sur certains périphériques","root_availability_passlist__title":"Liste autorisation disponibilité","root_availability_whitelist__title":"Liste blanche disponibilité (déprécié, utilisez Liste autorisation disponibilité)","root_debounce_ignore__description":"Protège les valeurs des propriétés spécifiées d\'être remplacées pendant le temps d\'anti-rebond","root_debounce_ignore__title":"Ignorer anti-rebond","root_ext_pan_id__description":"ID pan étendu zigbee, tout changement imposera un ré-appairage de tous les périphériques!","root_ext_pan_id__title":"ID Pan étendu","root_filtered_attributes__description":"Permet d\'empêcher la publication de certains attributs","root_filtered_attributes__title":"Attributs filtrés","root_log_output__description":"Localisation des journaux de sorties, laissez vide pour supprimer la journalisation","root_log_output__title":"Journaux de Sortie","root_log_syslog-title":"syslog","serial-title":"Port Série","root_filtered_optimistic__title":"Attibuts optimistes filtrés","root_filtered_optimistic__description":"Attributs filtrés de la publication optimiste lors de l\'appel de /set. (Aucun effet si optimiste est à faux)."},"touchlink":{"detected_devices_message":"{{count}} périphériques Touchlink détectés.","rescan":"Rescanner","scan":"Scanner"},"values":{"clear":"RàS","Clear":"Inactif","closed":"Fermé","Closed":"Fermé","occupied":"Occupé","Occupied":"Occupé","open":"Ouvert","Open":"Ouvert","shake":"Secoué","slide":"Glissé","true":"Vrai","leaking":"Fuite","tampered":"Saboté","supported":"Supporté","not_supported":"Non supporté","null":"Nul","false":"Faux","empty_string":"Chaîne vide (\\"\\")","tap":"Tappé","wakeup":"Réveillé","fall":"Tombé"},"zigbee":{"actions":"Actions","attribute":"Attribut","battery":"Batterie","block_join":"Bloquer tout nouvel appairage","cluster":"Cluster","dc_source":"Source DC","description":"Description","device_type":"Type de Périph","device":"Périphérique","endpoint":"Endpoint","firmware_build_date":"Date Firmware","firmware_version":"Version Firmware","force_remove":"Forcer la suppression","friendly_name":"Nom Simplifié","ieee_address":"Adresse IEEE","input_clusters":"Clusters Entrants","interview_completed":"Interview terminé","interview_failed":"Echec de l\'Interview","interviewing":"Interview en cours","last_seen":"Vu il y a","lqi":"LQI","mains_single_phase":"Réseau (phase simple)","manufacturer":"Constructeur","max_rep_interval":"Interval max réponse","min_rep_change":"Changement min réponse","min_rep_interval":"Interval min réponse","model":"Modèle","network_address":"Adresse réseau","none":"Aucun(e)","output_clusters":"Clusters Sortants","pic":"Img","power":"Alim","power_level":"Niveau de charge","reconfigure":"Reconfigurer","remove_device":"Supprimer le périph","rename_device":"Renommer le périph","select_attribute":"Choisir Attribut","select_cluster":"Choisir Cluster","support_status":"Supporté","unsupported":"Non Supporté","updating_firmware":"Firmware en cours de MàJ","update_Home_assistant_entity_id":"MàJ de l\'ID d\'entité Home Assistant","zigbee_model":"Modèle Zigbee","zigbee_manufacturer":"Constructeur Zigbee"},"scene":{"scene_id":"ID Scène","scene_name":"Nom Scène","recall":"Rappeler","select_scene":"Choisir Scène","store":"Stocker","remove":"Supprimer","remove_all":"Supprimer tout","add":"Ajouter"}}');
4938
4987
  ;// CONCATENATED MODULE: ./src/i18n/locales/pl.json
@@ -5295,4 +5344,4 @@ module.exports = "class MyExampleExtension_TS_ {\n constructor(zigbee, mqtt,
5295
5344
  /******/ var __webpack_exports__ = __webpack_require__.O();
5296
5345
  /******/ }
5297
5346
  ]);
5298
- //# sourceMappingURL=main.6b396bb99c238368484b.js.map
5347
+ //# sourceMappingURL=main.34bd7830a3129d1cb8c9.js.map
@@ -109,7 +109,7 @@
109
109
  }
110
110
 
111
111
  .WHCV9Yv8f3TVvfb73Hvp {
112
- opacity: 0.5;
112
+ opacity: 0.5 !important;
113
113
  stroke: gray;
114
114
  }
115
115
 
@@ -139,6 +139,24 @@
139
139
  padding-right: .5rem;
140
140
  }
141
141
 
142
+ .GDDPje7BU_a2CqHQQeRS span {
143
+ padding: 0;
144
+ }
145
+
146
+ .GDDPje7BU_a2CqHQQeRS i {
147
+ margin-left: 5px;
148
+ }
149
+ .V7dffAiFpKHihMzFsuev {
150
+ padding-top: 0 !important;
151
+ padding-bottom: 0 !important;
152
+ min-height: 56px;
153
+ }
154
+
155
+ .NBzXAYfJkobb1Zfroqnt img {
156
+ max-height: 2em;
157
+ }
158
+
159
+
142
160
  .xuLtgp30Xq3hNVI418MV {
143
161
  margin-left: 4px;
144
162
  }
@@ -214,23 +232,5 @@
214
232
  }
215
233
 
216
234
  .ySsEqVUR4fG8GsO0H54r i{right:0}.ySsEqVUR4fG8GsO0H54r img{max-height:2em}
217
- .GDDPje7BU_a2CqHQQeRS span {
218
- padding: 0;
219
- }
220
-
221
- .GDDPje7BU_a2CqHQQeRS i {
222
- margin-left: 5px;
223
- }
224
- .V7dffAiFpKHihMzFsuev {
225
- padding-top: 0 !important;
226
- padding-bottom: 0 !important;
227
- min-height: 56px;
228
- }
229
-
230
- .NBzXAYfJkobb1Zfroqnt img {
231
- max-height: 2em;
232
- }
233
-
234
-
235
235
 
236
- /*# sourceMappingURL=main.ac25730e30bfe2874d71.css.map*/
236
+ /*# sourceMappingURL=main.7379448ff31d4e2a65b8.css.map*/
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "*.css"
9
9
  ],
10
10
  "name": "zigbee2mqtt-frontend",
11
- "version": "0.6.40",
11
+ "version": "0.6.41",
12
12
  "license": "GPL-3.0",
13
13
  "scripts": {
14
14
  "build": "npm run clean && webpack --config ./webpack.config.js --mode production",