iobroker.lovelace
Version:
With this adapter you can build visualization for ioBroker with Home Assistant Lovelace UI
2 lines • 16.8 kB
JavaScript
export const __webpack_ids__=["51229"];export const __webpack_modules__={6371:function(e,t,i){var s=i(44249),n=i(72621),a=(i(92745),i(26200),i(25754),i(22246),i(9359),i(70104),i(71375),i(15524),i(20267),i(21917),i(56193),i(25020),i(86913),i(57243)),o=i(15093),r=i(35359),d=i(38495),l=i(75278),c=i(42740),h=i(92364),u=(i(99426),i(83166),i(73192)),p=i(76131);(0,s.Z)([(0,o.Mo)("ha-assist-chat")],(function(e,t){class i extends t{constructor(...t){super(...t),e(this)}}return{F:i,d:[{kind:"field",decorators:[(0,o.Cb)({attribute:!1})],key:"hass",value:void 0},{kind:"field",decorators:[(0,o.Cb)({attribute:!1})],key:"pipeline",value:void 0},{kind:"field",decorators:[(0,o.Cb)({type:Boolean,attribute:"disable-speech"})],key:"disableSpeech",value:()=>!1},{kind:"field",decorators:[(0,o.Cb)({type:Boolean,attribute:!1})],key:"startListening",value:void 0},{kind:"field",decorators:[(0,o.IO)("#message-input")],key:"_messageInput",value:void 0},{kind:"field",decorators:[(0,o.IO)("#scroll-container")],key:"_scrollContainer",value:void 0},{kind:"field",decorators:[(0,o.SB)()],key:"_conversation",value:()=>[]},{kind:"field",decorators:[(0,o.SB)()],key:"_showSendButton",value:()=>!1},{kind:"field",decorators:[(0,o.SB)()],key:"_processing",value:()=>!1},{kind:"field",key:"_conversationId",value:()=>null},{kind:"field",key:"_audioRecorder",value:void 0},{kind:"field",key:"_audioBuffer",value:void 0},{kind:"field",key:"_audio",value:void 0},{kind:"field",key:"_stt_binary_handler_id",value:void 0},{kind:"method",key:"willUpdate",value:function(e){this.hasUpdated&&!e.has("pipeline")||(this._conversation=[{who:"hass",text:this.hass.localize("ui.dialogs.voice_command.how_can_i_help")}])}},{kind:"method",key:"firstUpdated",value:function(e){(0,n.Z)(i,"firstUpdated",this,3)([e]),this.startListening&&this.pipeline&&this.pipeline.stt_engine&&h.h.isSupported&&this._toggleListening(),setTimeout((()=>this._messageInput.focus()),0)}},{kind:"method",key:"updated",value:function(e){(0,n.Z)(i,"updated",this,3)([e]),e.has("_conversation")&&this._scrollMessagesBottom()}},{kind:"method",key:"disconnectedCallback",value:function(){(0,n.Z)(i,"disconnectedCallback",this,3)([]),this._audioRecorder?.close(),this._audioRecorder=void 0,this._audio?.pause(),this._conversation=[],this._conversationId=null}},{kind:"method",key:"render",value:function(){const e=!!this.pipeline&&(this.pipeline.prefer_local_intents||!this.hass.states[this.pipeline.conversation_engine]||(0,l.e)(this.hass.states[this.pipeline.conversation_engine],c.zt.CONTROL)),t=h.h.isSupported,i=this.pipeline?.stt_engine&&!this.disableSpeech;return a.dy` ${e?a.Ld:a.dy` <ha-alert> ${this.hass.localize("ui.dialogs.voice_command.conversation_no_control")} </ha-alert> `} <div class="messages"> <div class="messages-container" id="scroll-container"> ${this._conversation.map((e=>a.dy` <div class="message ${(0,r.$)({error:!!e.error,[e.who]:!0})}">${e.text}</div> `))} </div> </div> <div class="input" slot="primaryAction"> <ha-textfield id="message-input" ="${this._handleKeyUp}" ="${this._handleInput}" .label="${this.hass.localize("ui.dialogs.voice_command.input_label")}" .iconTrailing="${!0}"> <div slot="trailingIcon"> ${this._showSendButton||!i?a.dy` <ha-icon-button class="listening-icon" .path="${"M2,21L23,12L2,3V10L17,12L2,14V21Z"}" ="${this._handleSendMessage}" .disabled="${this._processing}" .label="${this.hass.localize("ui.dialogs.voice_command.send_text")}"> </ha-icon-button> `:a.dy` ${this._audioRecorder?.active?a.dy` <div class="bouncer"> <div class="double-bounce1"></div> <div class="double-bounce2"></div> </div> `:a.Ld} <div class="listening-icon"> <ha-icon-button .path="${"M12,2A3,3 0 0,1 15,5V11A3,3 0 0,1 12,14A3,3 0 0,1 9,11V5A3,3 0 0,1 12,2M19,11C19,14.53 16.39,17.44 13,17.93V21H11V17.93C7.61,17.44 5,14.53 5,11H7A5,5 0 0,0 12,16A5,5 0 0,0 17,11H19Z"}" ="${this._handleListeningButton}" .disabled="${this._processing}" .label="${this.hass.localize("ui.dialogs.voice_command.start_listening")}"> </ha-icon-button> ${t?null:a.dy` <ha-svg-icon .path="${"M13,13H11V7H13M13,17H11V15H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z"}" class="unsupported"></ha-svg-icon> `} </div> `} </div> </ha-textfield> </div> `}},{kind:"method",key:"_scrollMessagesBottom",value:function(){const e=this._scrollContainer;e&&e.scrollTo(0,e.scrollHeight)}},{kind:"method",key:"_handleKeyUp",value:function(e){const t=e.target;!this._processing&&"Enter"===e.key&&t.value&&(this._processText(t.value),t.value="",this._showSendButton=!1)}},{kind:"method",key:"_handleInput",value:function(e){const t=e.target.value;t&&!this._showSendButton?this._showSendButton=!0:!t&&this._showSendButton&&(this._showSendButton=!1)}},{kind:"method",key:"_handleSendMessage",value:function(){this._messageInput.value&&(this._processText(this._messageInput.value.trim()),this._messageInput.value="",this._showSendButton=!1)}},{kind:"method",key:"_handleListeningButton",value:function(e){e.stopPropagation(),e.preventDefault(),this._toggleListening()}},{kind:"method",key:"_toggleListening",value:async function(){h.h.isSupported?this._audioRecorder?.active?this._stopListening():this._startListening():this._showNotSupportedMessage()}},{kind:"method",key:"_addMessage",value:function(e){this._conversation=[...this._conversation,e]}},{kind:"method",key:"_showNotSupportedMessage",value:async function(){this._addMessage({who:"hass",text:a.dy`${this.hass.localize("ui.dialogs.voice_command.not_supported_microphone_browser")} ${this.hass.localize("ui.dialogs.voice_command.not_supported_microphone_documentation",{documentation_link:a.dy`<a target="_blank" rel="noopener noreferrer" href="${(0,u.R)(this.hass,"/docs/configuration/securing/#remote-access")}">${this.hass.localize("ui.dialogs.voice_command.not_supported_microphone_documentation_link")}</a>`})}`})}},{kind:"method",key:"_startListening",value:async function(){this._processing=!0,this._audio?.pause(),this._audioRecorder||(this._audioRecorder=new h.h((e=>{this._audioBuffer?this._audioBuffer.push(e):this._sendAudioChunk(e)}))),this._stt_binary_handler_id=void 0,this._audioBuffer=[];const e={who:"user",text:"…"};await this._audioRecorder.start(),this._addMessage(e),this.requestUpdate("_audioRecorder");let t=!1,i={who:"hass",text:"…",error:!1},s="";try{const n=await(0,d.Xp)(this.hass,(a=>{if("run-start"===a.type&&(this._stt_binary_handler_id=a.data.runner_data.stt_binary_handler_id),"stt-start"===a.type&&this._audioBuffer){for(const e of this._audioBuffer)this._sendAudioChunk(e);this._audioBuffer=void 0}if("stt-end"===a.type&&(this._stt_binary_handler_id=void 0,this._stopListening(),e.text=a.data.stt_output.text,this.requestUpdate("_conversation"),this._addMessage(i)),"intent-progress"===a.type){const e=a.data.chat_log_delta;e.role&&(s&&e.role&&"…"!==i.text&&(i.text=i.text.substring(0,i.text.length-1),i={who:"hass",text:"…",error:!1},this._addMessage(i)),s=e.role),"assistant"===s&&"content"in e&&e.content&&(i.text=i.text.substring(0,i.text.length-1)+e.content+"…",this.requestUpdate("_conversation"))}if("intent-end"===a.type){this._conversationId=a.data.intent_output.conversation_id,t=a.data.intent_output.continue_conversation;const e=a.data.intent_output.response.speech?.plain;e&&(i.text=e.speech),this.requestUpdate("_conversation")}if("tts-end"===a.type){const e=a.data.tts_output.url;this._audio=new Audio(e),this._audio.play(),this._audio.addEventListener("ended",(()=>{this._unloadAudio(),t&&this._startListening()})),this._audio.addEventListener("pause",this._unloadAudio),this._audio.addEventListener("canplaythrough",this._playAudio),this._audio.addEventListener("error",this._audioError)}"run-end"===a.type&&(this._stt_binary_handler_id=void 0,n()),"error"===a.type&&(this._stt_binary_handler_id=void 0,"…"===e.text?(e.text=a.data.message,e.error=!0):(i.text=a.data.message,i.error=!0),this._stopListening(),this.requestUpdate("_conversation"),n())}),{start_stage:"stt",end_stage:this.pipeline?.tts_engine?"tts":"intent",input:{sample_rate:this._audioRecorder.sampleRate},pipeline:this.pipeline?.id,conversation_id:this._conversationId})}catch(e){await(0,p.showAlertDialog)(this,{title:"Error starting pipeline",text:e.message||e}),this._stopListening()}finally{this._processing=!1}}},{kind:"method",key:"_stopListening",value:function(){if(this._audioRecorder?.stop(),this.requestUpdate("_audioRecorder"),this._stt_binary_handler_id){if(this._audioBuffer)for(const e of this._audioBuffer)this._sendAudioChunk(e);this._sendAudioChunk(new Int16Array),this._stt_binary_handler_id=void 0}this._audioBuffer=void 0}},{kind:"method",key:"_sendAudioChunk",value:function(e){if(this.hass.connection.socket.binaryType="arraybuffer",null==this._stt_binary_handler_id)return;const t=new Uint8Array(1+2*e.length);t[0]=this._stt_binary_handler_id,t.set(new Uint8Array(e.buffer),1),this.hass.connection.socket.send(t)}},{kind:"field",key:"_playAudio",value(){return()=>{this._audio?.play()}}},{kind:"field",key:"_audioError",value(){return()=>{(0,p.showAlertDialog)(this,{title:"Error playing audio."}),this._audio?.removeAttribute("src")}}},{kind:"field",key:"_unloadAudio",value(){return()=>{this._audio?.removeAttribute("src"),this._audio=void 0}}},{kind:"method",key:"_processText",value:async function(e){this._processing=!0,this._audio?.pause(),this._addMessage({who:"user",text:e});let t={who:"hass",text:"…",error:!1},i="";this._addMessage(t);try{const s=await(0,d.Xp)(this.hass,(e=>{if("intent-progress"===e.type){const s=e.data.chat_log_delta;s.role&&(i&&"assistant"===s.role&&"…"!==t.text&&(t.text=t.text.substring(0,t.text.length-1),t={who:"hass",text:"…",error:!1},this._addMessage(t)),i=s.role),"assistant"===i&&"content"in s&&s.content&&(t.text=t.text.substring(0,t.text.length-1)+s.content+"…",this.requestUpdate("_conversation"))}if("intent-end"===e.type){this._conversationId=e.data.intent_output.conversation_id;const i=e.data.intent_output.response.speech?.plain;i&&(t.text=i.speech),this.requestUpdate("_conversation"),s()}"error"===e.type&&(t.text=e.data.message,t.error=!0,this.requestUpdate("_conversation"),s())}),{start_stage:"intent",input:{text:e},end_stage:"intent",pipeline:this.pipeline?.id,conversation_id:this._conversationId})}catch{t.text=this.hass.localize("ui.dialogs.voice_command.error"),t.error=!0,this.requestUpdate("_conversation")}finally{this._processing=!1}}},{kind:"field",static:!0,key:"styles",value:()=>a.iv`:host{flex:1;display:flex;flex-direction:column}ha-textfield{display:block}.messages{flex:1;display:block;box-sizing:border-box;position:relative}.messages-container{position:absolute;bottom:0px;right:0px;left:0px;padding:0px 10px 16px;box-sizing:border-box;overflow-y:auto;max-height:100%}.message{white-space:pre-line;font-size:18px;clear:both;margin:8px 0;padding:8px;border-radius:15px} all and (max-width:450px),all and (max-height:500px){.message{font-size:16px}}.message p{margin:0}.message p:not(:last-child){margin-bottom:8px}.message.user{margin-left:24px;margin-inline-start:24px;margin-inline-end:initial;float:var(--float-end);text-align:right;border-bottom-right-radius:0px;background-color:var(--chat-background-color-user,var(--primary-color));color:var(--text-primary-color);direction:var(--direction)}.message.hass{margin-right:24px;margin-inline-end:24px;margin-inline-start:initial;float:var(--float-start);border-bottom-left-radius:0px;background-color:var(--chat-background-color-hass,var(--secondary-background-color));color:var(--primary-text-color);direction:var(--direction)}.message.user a{color:var(--text-primary-color)}.message.hass a{color:var(--primary-text-color)}.message.error{background-color:var(--error-color);color:var(--text-primary-color)}.bouncer{width:48px;height:48px;position:absolute}.double-bounce1,.double-bounce2{width:48px;height:48px;border-radius:50%;background-color:var(--primary-color);opacity:.2;position:absolute;top:0;left:0;-webkit-animation:sk-bounce 2s infinite ease-in-out;animation:sk-bounce 2s infinite ease-in-out}.double-bounce2{-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes sk-bounce{0%,100%{-webkit-transform:scale(0)}50%{-webkit-transform:scale(1)}} sk-bounce{0%,100%{transform:scale(0);-webkit-transform:scale(0)}50%{transform:scale(1);-webkit-transform:scale(1)}}.listening-icon{position:relative;color:var(--secondary-text-color);margin-right:-24px;margin-inline-end:-24px;margin-inline-start:initial;direction:var(--direction);transform:scaleX(var(--scale-direction))}.listening-icon[active]{color:var(--primary-color)}.unsupported{color:var(--error-color);position:absolute;--mdc-icon-size:16px;right:5px;inset-inline-end:5px;inset-inline-start:initial;top:0px}`}]}}),a.oi)},38495:function(e,t,i){i.d(t,{AI:()=>o,Dy:()=>_,GV:()=>u,I2:()=>n,PA:()=>l,SC:()=>d,Vg:()=>g,XT:()=>p,Xp:()=>a,_v:()=>r,af:()=>h,eP:()=>s,jZ:()=>c});const s=(e,t,i)=>"run-start"===t.type?e={init_options:i,stage:"ready",run:t.data,events:[t]}:e?((e="wake_word-start"===t.type?{...e,stage:"wake_word",wake_word:{...t.data,done:!1}}:"wake_word-end"===t.type?{...e,wake_word:{...e.wake_word,...t.data,done:!0}}:"stt-start"===t.type?{...e,stage:"stt",stt:{...t.data,done:!1}}:"stt-end"===t.type?{...e,stt:{...e.stt,...t.data,done:!0}}:"intent-start"===t.type?{...e,stage:"intent",intent:{...t.data,done:!1}}:"intent-end"===t.type?{...e,intent:{...e.intent,...t.data,done:!0}}:"tts-start"===t.type?{...e,stage:"tts",tts:{...t.data,done:!1}}:"tts-end"===t.type?{...e,tts:{...e.tts,...t.data,done:!0}}:"run-end"===t.type?{...e,stage:"done"}:"error"===t.type?{...e,stage:"error",error:t.data}:{...e}).events=[...e.events,t],e):void console.warn("Received unexpected event before receiving session",t),n=(e,t,i)=>{let n;const o=a(e,(e=>{n=s(n,e,i),"run-end"!==e.type&&"error"!==e.type||o.then((e=>e())),n&&t(n)}),i);return o},a=(e,t,i)=>e.connection.subscribeMessage(t,{...i,type:"assist_pipeline/run"}),o=(e,t)=>e.callWS({type:"assist_pipeline/pipeline_debug/list",pipeline_id:t}),r=(e,t,i)=>e.callWS({type:"assist_pipeline/pipeline_debug/get",pipeline_id:t,pipeline_run_id:i}),d=e=>e.callWS({type:"assist_pipeline/pipeline/list"}),l=(e,t)=>e.callWS({type:"assist_pipeline/pipeline/get",pipeline_id:t}),c=(e,t)=>e.callWS({type:"assist_pipeline/pipeline/create",...t}),h=(e,t,i)=>e.callWS({type:"assist_pipeline/pipeline/update",pipeline_id:t,...i}),u=(e,t)=>e.callWS({type:"assist_pipeline/pipeline/set_preferred",pipeline_id:t}),p=(e,t)=>e.callWS({type:"assist_pipeline/pipeline/delete",pipeline_id:t}),_=e=>e.callWS({type:"assist_pipeline/language/list"}),g=e=>e.callWS({type:"assist_pipeline/device/list"})},42740:function(e,t,i){if(i.d(t,{KH:()=>r,T1:()=>o,rM:()=>a,zt:()=>n}),99387==i.j)var s=i(95262);let n=function(e){return e[e.CONTROL=1]="CONTROL",e}({});const a=(e,t,i)=>e.callWS({type:"conversation/agent/list",language:t,country:i}),o=(e,t,i,n)=>e.callWS({type:"conversation/agent/homeassistant/debug",sentences:(0,s.r)(t),language:i,device_id:n}),r=(e,t,i)=>e.callWS({type:"conversation/agent/homeassistant/language_scores",language:t,country:i})},92364:function(e,t,i){i.d(t,{h:()=>s});i(75656),i(50100),i(18084);class s{constructor(e){this._active=!1,this._callback=void 0,this._context=void 0,this._stream=void 0,this._source=void 0,this._recorder=void 0,this._callback=e}get active(){return this._active}get sampleRate(){return this._context?.sampleRate}static get isSupported(){return window.isSecureContext&&(window.AudioContext||window.webkitAudioContext)}async start(){if(this._context&&this._stream&&this._source&&this._recorder)this._stream.getTracks()[0].enabled=!0,await this._context.resume(),this._active=!0;else try{await this._createContext()}catch(e){console.error(e),this._active=!1}}async stop(){this._active=!1,this._stream&&(this._stream.getTracks()[0].enabled=!1),await(this._context?.suspend())}close(){this._active=!1,this._stream?.getTracks()[0].stop(),this._recorder&&(this._recorder.port.onmessage=null),this._source?.disconnect(),this._context?.close(),this._stream=void 0,this._source=void 0,this._recorder=void 0,this._context=void 0}async _createContext(){const e=new(AudioContext||webkitAudioContext);this._stream=await navigator.mediaDevices.getUserMedia({audio:!0}),await e.audioWorklet.addModule(new URL(i.p+i.u("36961"),i.b)),this._context=e,this._source=this._context.createMediaStreamSource(this._stream),this._recorder=new AudioWorkletNode(this._context,"recorder-worklet"),this._recorder.port.onmessage=e=>{this._active&&this._callback(e.data)},this._active=!0,this._source.connect(this._recorder)}}},73192:function(e,t,i){i.d(t,{R:()=>s});const s=(e,t)=>`https://www.iobroker.net/#${e.language&&e.language.split("-")[0]||"en"}/adapters/adapterref/iobroker.lovelace/README.md#`}};
//# sourceMappingURL=51229.6cf03d138b17efb3.js.map