diff --git a/admin/build/index.js b/admin/build/index.js
index dff7e3e8..a50f65ef 100644
--- a/admin/build/index.js
+++ b/admin/build/index.js
@@ -895,7 +895,7 @@ module.exports={ra_filter_func:"功能",ra_filter_id:"ID",ra_filter_name:"名称
},{"@babel/runtime/helpers/interopRequireDefault":"IKAG","@babel/runtime/helpers/interopRequireWildcard":"uVGF","react":"ccIB","./utils/createSvgIcon":"B77j"}],"sSJ6":[function(require,module,exports) {
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=t;var e={"":["",""],_:["",""],"*":["",""],"~":["",""],"\n":["
"]," ":["
"],"-":["
"+n(r(u).replace(/^\n+|\n+$/g,""))+"
":(u=l[6])?(u.match(/\./)&&(l[5]=l[5].replace(/^\d+/gm,"")),g=t(n(l[5].replace(/^\s*[>*+.-]/gm,""))),">"==u?u="blockquote":(u=u.match(/\./)?"ol":"ul",g=g.replace(/^(.*)(\n|$)/gm,""+r(l[16])+"
":(l[17]||l[1])&&(c=f(l[17]||"--"))),m+=s,m+=c;return(m+a.substring(h)+$()).replace(/^\n+|\n+$/g,"")}
},{}],"Y6jv":[function(require,module,exports) {
-"use strict";function t(e){return(t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(e)}function e(){for(var t="",e=0;e<32;e++){var o=16*Math.random()|0;8!=e&&12!=e&&16!=e&&20!=e||(t+="-"),t+=(12==e?4:16==e?3&o|8:o).toString(16)}return t}function o(e,r){if(e===r)return!0;if("object"!==t(e)||"object"!==t(r)||null===e||null===r)return!1;var n=Object.keys(e),i=Object.keys(r);if(n.length!==i.length)return!1;for(var u=0,s=n;utrue
","true
")}})),n.default.createElement(o.InputCheckbox,{sm:12,md:6,lg:3,label:i.default.t("Boolean invert"),value:this.state.booleanInvert,disabled:this.props.readonly,onChange:function(t){return e.handleChange("booleanInvert",t)}},i.default.t("Invert the boolean value"))),"custom"===this.state.dataType&&n.default.createElement(s.default,{container:!0,spacing:3},n.default.createElement(r.InputText,{sm:12,md:6,label:i.default.t("Custom script read"),multiline:!0,value:this.state.customScriptRead,disabled:this.props.readonly,onChange:function(t){return e.handleChange("customScriptRead",t)},placeholder:"// example:\nvalue = buffer[0] + buffer[1];"},n.default.createElement("span",{dangerouslySetInnerHTML:{__html:i.default.t("Script to read the value from the buffer. The buffer is available as %s and the value has to be written into %s.","buffer
","value
")}})),n.default.createElement(r.InputText,{sm:12,md:6,label:i.default.t("Custom script write"),multiline:!0,value:this.state.customScriptWrite,disabled:this.props.readonly,onChange:function(t){return e.handleChange("customScriptWrite",t)},placeholder:"// example:\nbuffer[0] = value & 0xff;\nbuffer[1] = (value >> 8);"},n.default.createElement("span",{dangerouslySetInnerHTML:{__html:i.default.t("Script to write the value to the buffer. The buffer is available as %s and the value as %s.","buffer
","value
")}}))))},p.prototype.onChange=function(){this.props.onChange(this.props.uuid,{id:this.state.id,name:this.state.name,dataType:this.state.dataType,dataLength:this.state.dataLength,dataOffset:this.state.dataOffset,dataUnit:this.state.dataUnit,dataEncoding:this.state.dataEncoding,booleanMask:this.state.booleanMask,booleanInvert:this.state.booleanInvert,customScriptRead:this.state.customScriptRead,customScriptWrite:this.state.customScriptWrite,customDataType:this.state.customDataType})},p.prototype.handleChange=function(e,t){var a,n=this,s=((a={})[e]=t,a);this.updateDependedElements(s),this.validateState(s),this.setState(s,function(){n.onChange()})},p.prototype.updateDependedElements=function(e){var t;switch(e.dataType||(null===(t=this.state)||void 0===t?void 0:t.dataType)||"uint8"){case"boolean":e.disabledDataOffsets=[],e.disabledDataLengths=["2","3","4","5","6","7","8"],e.dataLength=1,e.disabledDataEncoding=!0,e.disabledDataUnit=!0,e.disabledDataOffsetAndLength=!1,e.dataUnit="";break;case"int8":case"uint8":e.disabledDataOffsets=[],e.disabledDataLengths=["2","3","4","5","6","7","8"],e.dataLength=1,e.disabledDataEncoding=!0,e.disabledDataUnit=!1,e.disabledDataOffsetAndLength=!1;break;case"int16_be":case"int16_le":case"uint16_be":case"uint16_le":e.disabledDataOffsets=["7"],e.disabledDataLengths=["1","3","4","5","6","7","8"],e.dataLength=2,e.disabledDataEncoding=!0,e.disabledDataUnit=!1,e.disabledDataOffsetAndLength=!1;break;case"int32_be":case"int32_le":case"uint32_be":case"uint32_le":case"float32_be":case"float32_le":e.disabledDataOffsets=["5","6","7"],e.disabledDataLengths=["1","2","3","5","6","7","8"],e.dataLength=4,e.disabledDataEncoding=!0,e.disabledDataUnit=!1,e.disabledDataOffsetAndLength=!1;break;case"double64_be":case"double64_le":e.disabledDataOffsets=["1","2","3","4","5","6","7"],e.disabledDataLengths=["1","2","3","4","5","6","7"],e.dataLength=8,e.disabledDataEncoding=!0,e.disabledDataUnit=!1,e.disabledDataOffsetAndLength=!1;break;case"string":e.disabledDataOffsets=[],e.disabledDataLengths=[],e.disabledDataEncoding=!1,e.disabledDataUnit=!0,e.disabledDataOffsetAndLength=!1,e.dataUnit="";var a=void 0!==e.dataOffset?e.dataOffset:this.state.dataOffset;(void 0!==e.dataLength?e.dataLength:this.state.dataLength)+a>8&&(e.dataLength=8-a);for(var n=1;n<=8;n++)n+a>8&&e.disabledDataLengths.push(n.toString());break;case"custom":e.disabledDataOffsets=[],e.disabledDataLengths=[],e.dataOffset=0,e.dataLength=8,e.disabledDataEncoding=!0,e.disabledDataUnit=!1,e.disabledDataOffsetAndLength=!0}return e},p.prototype.validateState=function(e){var t,a=!0;return void 0!==e.id?f.PARSER_ID_RESERVED.includes(e.id)?(e.idError=i.default.t("This ID is reserved and can't be used"),a=!1):e.id.match(f.PARSER_ID_REGEXP)?e.idError=null:(e.idError=i.default.t("Only allowed chars: %s","0-9a-z-_"),a=!1):null!==(null===(t=this.state)||void 0===t?void 0:t.idError)&&(a=!1),this.props.onValidate(this.props.uuid,a),e},p}(n.default.PureComponent);exports.Parser=p;
-},{"react":"ccIB","@material-ui/core/Grid":"VBQ5","@material-ui/core/Fab":"DWLa","@material-ui/icons/Delete":"rpRp","@iobroker/adapter-react/i18n":"viI9","./input-text":"FBys","./input-checkbox":"d7bC","./input-select":"U69G","./input-bitmask":"xgaO","../../../src/consts":"QYCC"}],"vrwo":[function(require,module,exports) {
-"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}var t=this&&this.__extends||function(){var e=function(t,a){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var a in t)Object.prototype.hasOwnProperty.call(t,a)&&(e[a]=t[a])})(t,a)};return function(t,a){if("function"!=typeof a&&null!==a)throw new TypeError("Class extends value "+String(a)+" is not a constructor or null");function r(){this.constructor=t}e(t,a),t.prototype=null===a?Object.create(a):(r.prototype=a.prototype,new r)}}(),a=this&&this.__assign||function(){return(a=Object.assign||function(e){for(var t,a=1,r=arguments.length;atrue
","true
")}})),l.default.createElement(h.InputCheckbox,{sm:12,md:6,lg:3,label:u.default.t("Boolean invert"),value:this.state.booleanInvert,disabled:this.props.readonly,onChange:function(e){return t.handleChange("booleanInvert",e)}},u.default.t("Invert the boolean value"))),"custom"===this.state.dataType&&l.default.createElement(o.default,{container:!0,spacing:3},l.default.createElement(p.InputText,{sm:12,md:6,label:u.default.t("Custom script read"),multiline:!0,value:this.state.customScriptRead,disabled:this.props.readonly,onChange:function(e){return t.handleChange("customScriptRead",e)},placeholder:"// example:\nvalue = buffer[0] + buffer[1];"},l.default.createElement("span",{dangerouslySetInnerHTML:{__html:u.default.t("Script to read the value from the buffer. The buffer is available as %s and the value has to be written into %s.","buffer
","value
")}})),l.default.createElement(p.InputText,{sm:12,md:6,label:u.default.t("Custom script write"),multiline:!0,value:this.state.customScriptWrite,disabled:this.props.readonly,onChange:function(e){return t.handleChange("customScriptWrite",e)},placeholder:"// example:\nbuffer[0] = value & 0xff;\nbuffer[1] = (value >> 8);"},l.default.createElement("span",{dangerouslySetInnerHTML:{__html:u.default.t("Script to write the value to the buffer. The buffer is available as %s and the value as %s.","buffer
","value
")}}))))},s.prototype.onChange=function(){this.props.onChange(this.props.uuid,{id:this.state.id,name:this.state.name,dataType:this.state.dataType,dataLength:this.state.dataLength,dataOffset:this.state.dataOffset,dataUnit:this.state.dataUnit,dataEncoding:this.state.dataEncoding,booleanMask:this.state.booleanMask,booleanInvert:this.state.booleanInvert,customScriptRead:this.state.customScriptRead,customScriptWrite:this.state.customScriptWrite,customDataType:this.state.customDataType})},s.prototype.handleChange=function(t,e){var a,n=this,s=((a={})[t]=e,a);this.updateDependedElements(s),this.validateState(s),this.setState(s,function(){n.onChange()})},s.prototype.updateDependedElements=function(t){var e;switch(t.dataType||(null===(e=this.state)||void 0===e?void 0:e.dataType)||"uint8"){case"boolean":t.disabledDataOffsets=[],t.disabledDataLengths=["2","3","4","5","6","7","8"],t.dataLength=1,t.disabledDataEncoding=!0,t.disabledDataUnit=!0,t.disabledDataOffsetAndLength=!1,t.dataUnit="";break;case"int8":case"uint8":t.disabledDataOffsets=[],t.disabledDataLengths=["2","3","4","5","6","7","8"],t.dataLength=1,t.disabledDataEncoding=!0,t.disabledDataUnit=!1,t.disabledDataOffsetAndLength=!1;break;case"int16_be":case"int16_le":case"uint16_be":case"uint16_le":t.disabledDataOffsets=["7"],t.disabledDataLengths=["1","3","4","5","6","7","8"],t.dataLength=2,t.disabledDataEncoding=!0,t.disabledDataUnit=!1,t.disabledDataOffsetAndLength=!1;break;case"int32_be":case"int32_le":case"uint32_be":case"uint32_le":case"float32_be":case"float32_le":t.disabledDataOffsets=["5","6","7"],t.disabledDataLengths=["1","2","3","5","6","7","8"],t.dataLength=4,t.disabledDataEncoding=!0,t.disabledDataUnit=!1,t.disabledDataOffsetAndLength=!1;break;case"double64_be":case"double64_le":t.disabledDataOffsets=["1","2","3","4","5","6","7"],t.disabledDataLengths=["1","2","3","4","5","6","7"],t.dataLength=8,t.disabledDataEncoding=!0,t.disabledDataUnit=!1,t.disabledDataOffsetAndLength=!1;break;case"string":t.disabledDataOffsets=[],t.disabledDataLengths=[],t.disabledDataEncoding=!1,t.disabledDataUnit=!0,t.disabledDataOffsetAndLength=!1,t.dataUnit="";var a=void 0!==t.dataOffset?t.dataOffset:this.state.dataOffset;(void 0!==t.dataLength?t.dataLength:this.state.dataLength)+a>8&&(t.dataLength=8-a);for(var n=1;n<=8;n++)n+a>8&&t.disabledDataLengths.push(n.toString());break;case"custom":t.disabledDataOffsets=[],t.disabledDataLengths=[],t.dataOffset=0,t.dataLength=8,t.disabledDataEncoding=!0,t.disabledDataUnit=!1,t.disabledDataOffsetAndLength=!0}return t},s.prototype.validateState=function(t){var e,a=!0;return void 0!==t.id?m.PARSER_ID_RESERVED.includes(t.id)?(t.idError=u.default.t("This ID is reserved and can't be used"),a=!1):t.id.match(m.PARSER_ID_REGEXP)?t.idError=null:(t.idError=u.default.t("Only allowed chars: %s","0-9a-z-_"),a=!1):null!==(null===(e=this.state)||void 0===e?void 0:e.idError)&&(a=!1),this.props.onValidate(this.props.uuid,a),t},s.prototype.copy=function(){f.internalClipboard.parser=JSON.stringify(this.state),this.props.showToast&&this.props.showToast(u.default.t("Parser configuration copied. Use the paste button to paste this configuration to an other parser."))},s.prototype.paste=function(){var t=this;if(f.internalClipboard.parser)try{var e=JSON.parse(f.internalClipboard.parser);this.setState(this.validateState(a({},e)),function(){t.onChange(),t.props.showToast&&t.props.showToast(u.default.t("Pasted"))})}catch(n){this.props.showToast&&this.props.showToast(u.default.t("Error while pasting: %s",n.toString()))}else this.props.showToast&&this.props.showToast(u.default.t("Nothing to paste. Please use the copy button first."))},n([i.autobind],s.prototype,"copy",null),n([i.autobind],s.prototype,"paste",null),s}(l.default.PureComponent);exports.Parser=E;
+},{"react":"ccIB","core-decorators":"Maor","@material-ui/core/Grid":"VBQ5","@material-ui/core/Fab":"DWLa","@material-ui/icons/Delete":"rpRp","@iobroker/adapter-react/i18n":"viI9","../lib/icons":"jAwG","../lib/helpers":"Y6jv","./input-text":"FBys","./input-checkbox":"d7bC","./input-select":"U69G","./input-bitmask":"xgaO","../../../src/consts":"QYCC"}],"vrwo":[function(require,module,exports) {
+"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}var t=this&&this.__extends||function(){var e=function(t,a){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var a in t)Object.prototype.hasOwnProperty.call(t,a)&&(e[a]=t[a])})(t,a)};return function(t,a){if("function"!=typeof a&&null!==a)throw new TypeError("Class extends value "+String(a)+" is not a constructor or null");function r(){this.constructor=t}e(t,a),t.prototype=null===a?Object.create(a):(r.prototype=a.prototype,new r)}}(),a=this&&this.__assign||function(){return(a=Object.assign||function(e){for(var t,a=1,r=arguments.length;a>(\n WrappedComponent: React.ComponentType
,\n // We do not want to have `updateProps` given in options, it is instead filled through the HOC.\n options?: Pick {\n const componentDisplayName =\n (options && options.name) || WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;\n\n const Wrapped: React.FC = (props: P) => (\n >(\n WrappedComponent: React.ComponentType ,\n errorBoundaryOptions: ErrorBoundaryProps,\n): React.FC {\n const componentDisplayName = WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;\n\n const Wrapped: React.FC = (props: P) => (\n >(\n Route: React.ComponentType ,\n): React.FC {\n const componentDisplayName = Route.displayName || Route.name;\n\n const WrappedRoute: React.FC = (props: P) => {\n if (activeTransaction && props && props.computedMatch && props.computedMatch.isExact) {\n activeTransaction.setName(props.computedMatch.path);\n }\n return = (state: S | undefined, action: A) => S;\n\ntype Dispatch = > {\n dispatch: Dispatch;\n getState(): S;\n subscribe(listener: () => void): Unsubscribe;\n replaceReducer = { readonly [$CombinedState]?: undefined } & S;\n\ntype PreloadedState = Required extends {\n [$CombinedState]: undefined;\n}\n ? S extends CombinedState };\n\ntype StoreEnhancerStoreCreator,\n preloadedState?: PreloadedState,\n) => Store {\n /**\n * Transforms the state before attaching it to an event.\n * Use this to remove any private data before sending it to Sentry.\n * Return null to not attach the state.\n */\n stateTransformer(state: S | undefined): (S & any) | null;\n /**\n * Transforms the action before sending it as a breadcrumb.\n * Use this to remove any private data before sending it to Sentry.\n * Return null to not send the breadcrumb.\n */\n actionTransformer(action: AnyAction): AnyAction | null;\n /**\n * Called on every state update, configure the Sentry Scope with the redux state.\n */\n configureScopeWithState?(scope: Scope, state: S): void;\n}\n\nconst ACTION_BREADCRUMB_CATEGORY = 'redux.action';\nconst ACTION_BREADCRUMB_TYPE = 'info';\nconst STATE_CONTEXT_KEY = 'redux.state';\n\nconst defaultOptions: SentryEnhancerOptions = {\n actionTransformer: action => action,\n stateTransformer: state => state || null,\n};\n\n/**\n * Creates an enhancer that would be passed to Redux's createStore to log actions and the latest state to Sentry.\n *\n * @param enhancerOptions Options to pass to the enhancer\n */\nfunction createReduxEnhancer(enhancerOptions?: Partial(\n reducer: Reducer,\n initialState?: PreloadedState,\n ) => {\n const sentryReducer: Reducer = (state, action): S => {\n const newState = reducer(state, action);\n\n configureScope(scope => {\n /* Action breadcrumbs */\n const transformedAction = options.actionTransformer(action);\n if (typeof transformedAction !== 'undefined' && transformedAction !== null) {\n scope.addBreadcrumb({\n category: ACTION_BREADCRUMB_CATEGORY,\n data: transformedAction,\n type: ACTION_BREADCRUMB_TYPE,\n });\n }\n\n /* Set latest state to scope */\n const transformedState = options.stateTransformer(newState);\n if (typeof transformedState !== 'undefined' && transformedState !== null) {\n scope.setContext(STATE_CONTEXT_KEY, transformedState);\n } else {\n scope.setContext(STATE_CONTEXT_KEY, null);\n }\n\n /* Allow user to configure scope with latest state */\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const { configureScopeWithState } = options;\n if (typeof configureScopeWithState === 'function') {\n configureScopeWithState(scope, newState);\n }\n });\n\n return newState;\n };\n\n return next(sentryReducer, initialState);\n };\n}\n\nexport { createReduxEnhancer };\n","import { Primitive, Transaction, TransactionContext } from '@sentry/types';\nimport { getGlobalObject } from '@sentry/utils';\n\nimport { Location, ReactRouterInstrumentation } from './types';\n\n// Many of the types below had to be mocked out to prevent typescript issues\n// these types are required for correct functionality.\n\ntype HistoryV3 = {\n location?: Location;\n listen?(cb: (location: Location) => void): void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n} & Record