UNPKG

iobroker.lovelace

Version:

With this adapter you can build visualization for ioBroker with Home Assistant Lovelace UI

2 lines 18.7 kB
"use strict";(self.webpackChunkhome_assistant_frontend=self.webpackChunkhome_assistant_frontend||[]).push([["51229"],{6371:function(e,t,i){var s=i(61701),n=i(72621),a=(i(71695),i(92745),i(55751),i(26200),i(25754),i(22246),i(9359),i(70104),i(40251),i(81804),i(52629),i(92789),i(36810),i(14953),i(58402),i(31503),i(16440),i(2213),i(57385),i(71375),i(15524),i(20267),i(21917),i(56193),i(25020),i(86913),i(47021),i(57243)),o=i(50778),r=i(35359),d=i(38495),l=i(75278),c=i(42740),u=i(92364),h=(i(99426),i(83166),i(73192)),p=i(76131);let _,g,v,b,y,m,k,f,x,w,O=e=>e;(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(){return!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(){return[]}},{kind:"field",decorators:[(0,o.SB)()],key:"_showSendButton",value(){return!1}},{kind:"field",decorators:[(0,o.SB)()],key:"_processing",value(){return!1}},{kind:"field",key:"_conversationId",value(){return 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&&u.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(){var e,t;(0,n.Z)(i,"disconnectedCallback",this,3)([]),null===(e=this._audioRecorder)||void 0===e||e.close(),this._audioRecorder=void 0,null===(t=this._audio)||void 0===t||t.pause(),this._conversation=[],this._conversationId=null}},{kind:"method",key:"render",value:function(){var e,t;const i=!!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)),s=u.h.isSupported,n=(null===(e=this.pipeline)||void 0===e?void 0:e.stt_engine)&&!this.disableSpeech;return(0,a.dy)(_||(_=O` ${0} <div class="messages"> <div class="messages-container" id="scroll-container"> ${0} </div> </div> <div class="input" slot="primaryAction"> <ha-textfield id="message-input" @keyup="${0}" @input="${0}" .label="${0}" .iconTrailing="${0}"> <div slot="trailingIcon"> ${0} </div> </ha-textfield> </div> `),i?a.Ld:(0,a.dy)(g||(g=O` <ha-alert> ${0} </ha-alert> `),this.hass.localize("ui.dialogs.voice_command.conversation_no_control")),this._conversation.map((e=>(0,a.dy)(v||(v=O` <div class="message ${0}">${0}</div> `),(0,r.$)({error:!!e.error,[e.who]:!0}),e.text))),this._handleKeyUp,this._handleInput,this.hass.localize("ui.dialogs.voice_command.input_label"),!0,this._showSendButton||!n?(0,a.dy)(b||(b=O` <ha-icon-button class="listening-icon" .path="${0}" @click="${0}" .disabled="${0}" .label="${0}"> </ha-icon-button> `),"M2,21L23,12L2,3V10L17,12L2,14V21Z",this._handleSendMessage,this._processing,this.hass.localize("ui.dialogs.voice_command.send_text")):(0,a.dy)(y||(y=O` ${0} <div class="listening-icon"> <ha-icon-button .path="${0}" @click="${0}" .disabled="${0}" .label="${0}"> </ha-icon-button> ${0} </div> `),null!==(t=this._audioRecorder)&&void 0!==t&&t.active?(0,a.dy)(m||(m=O` <div class="bouncer"> <div class="double-bounce1"></div> <div class="double-bounce2"></div> </div> `)):a.Ld,"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,this._processing,this.hass.localize("ui.dialogs.voice_command.start_listening"),s?null:(0,a.dy)(k||(k=O` <ha-svg-icon .path="${0}" class="unsupported"></ha-svg-icon> `),"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")))}},{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(){var e;u.h.isSupported?null!==(e=this._audioRecorder)&&void 0!==e&&e.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:(0,a.dy)(f||(f=O`${0} ${0}`),this.hass.localize("ui.dialogs.voice_command.not_supported_microphone_browser"),this.hass.localize("ui.dialogs.voice_command.not_supported_microphone_documentation",{documentation_link:(0,a.dy)(x||(x=O`<a target="_blank" rel="noopener noreferrer" href="${0}">${0}</a>`),(0,h.R)(this.hass,"/docs/configuration/securing/#remote-access"),this.hass.localize("ui.dialogs.voice_command.not_supported_microphone_documentation_link"))}))})}},{kind:"method",key:"_startListening",value:async function(){var e;this._processing=!0,null===(e=this._audio)||void 0===e||e.pause(),this._audioRecorder||(this._audioRecorder=new u.h((e=>{this._audioBuffer?this._audioBuffer.push(e):this._sendAudioChunk(e)}))),this._stt_binary_handler_id=void 0,this._audioBuffer=[];const t={who:"user",text:"…"};await this._audioRecorder.start(),this._addMessage(t),this.requestUpdate("_audioRecorder");let i=!1,s={who:"hass",text:"…",error:!1},n="";try{var a,o;const e=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(),t.text=a.data.stt_output.text,this.requestUpdate("_conversation"),this._addMessage(s)),"intent-progress"===a.type){const e=a.data.chat_log_delta;e.role&&(n&&e.role&&"…"!==s.text&&(s.text=s.text.substring(0,s.text.length-1),s={who:"hass",text:"…",error:!1},this._addMessage(s)),n=e.role),"assistant"===n&&"content"in e&&e.content&&(s.text=s.text.substring(0,s.text.length-1)+e.content+"…",this.requestUpdate("_conversation"))}if("intent-end"===a.type){var o;this._conversationId=a.data.intent_output.conversation_id,i=a.data.intent_output.continue_conversation;const e=null===(o=a.data.intent_output.response.speech)||void 0===o?void 0:o.plain;e&&(s.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(),i&&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,e()),"error"===a.type&&(this._stt_binary_handler_id=void 0,"…"===t.text?(t.text=a.data.message,t.error=!0):(s.text=a.data.message,s.error=!0),this._stopListening(),this.requestUpdate("_conversation"),e())}),{start_stage:"stt",end_stage:null!==(a=this.pipeline)&&void 0!==a&&a.tts_engine?"tts":"intent",input:{sample_rate:this._audioRecorder.sampleRate},pipeline:null===(o=this.pipeline)||void 0===o?void 0:o.id,conversation_id:this._conversationId})}catch(r){await(0,p.showAlertDialog)(this,{title:"Error starting pipeline",text:r.message||r}),this._stopListening()}finally{this._processing=!1}}},{kind:"method",key:"_stopListening",value:function(){var e;if(null===(e=this._audioRecorder)||void 0===e||e.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()=>{var e;null===(e=this._audio)||void 0===e||e.play()}}},{kind:"field",key:"_audioError",value(){return()=>{var e;(0,p.showAlertDialog)(this,{title:"Error playing audio."}),null===(e=this._audio)||void 0===e||e.removeAttribute("src")}}},{kind:"field",key:"_unloadAudio",value(){return()=>{var e;null===(e=this._audio)||void 0===e||e.removeAttribute("src"),this._audio=void 0}}},{kind:"method",key:"_processText",value:async function(e){var t;this._processing=!0,null===(t=this._audio)||void 0===t||t.pause(),this._addMessage({who:"user",text:e});let i={who:"hass",text:"…",error:!1},s="";this._addMessage(i);try{var n;const t=await(0,d.Xp)(this.hass,(e=>{if("intent-progress"===e.type){const t=e.data.chat_log_delta;t.role&&(s&&"assistant"===t.role&&"…"!==i.text&&(i.text=i.text.substring(0,i.text.length-1),i={who:"hass",text:"…",error:!1},this._addMessage(i)),s=t.role),"assistant"===s&&"content"in t&&t.content&&(i.text=i.text.substring(0,i.text.length-1)+t.content+"…",this.requestUpdate("_conversation"))}if("intent-end"===e.type){var n;this._conversationId=e.data.intent_output.conversation_id;const s=null===(n=e.data.intent_output.response.speech)||void 0===n?void 0:n.plain;s&&(i.text=s.speech),this.requestUpdate("_conversation"),t()}"error"===e.type&&(i.text=e.data.message,i.error=!0,this.requestUpdate("_conversation"),t())}),{start_stage:"intent",input:{text:e},end_stage:"intent",pipeline:null===(n=this.pipeline)||void 0===n?void 0:n.id,conversation_id:this._conversationId})}catch(a){i.text=this.hass.localize("ui.dialogs.voice_command.error"),i.error=!0,this.requestUpdate("_conversation")}finally{this._processing=!1}}},{kind:"field",static:!0,key:"styles",value(){return(0,a.iv)(w||(w=O`: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}@media 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)}}@keyframes 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:()=>h,I2:()=>n,PA:()=>l,SC:()=>d,Vg:()=>g,XT:()=>p,Xp:()=>a,_v:()=>r,af:()=>u,eP:()=>s,jZ:()=>c});i(71695),i(19423),i(47021);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?Object.assign(Object.assign({},e),{},{stage:"wake_word",wake_word:Object.assign(Object.assign({},t.data),{},{done:!1})}):"wake_word-end"===t.type?Object.assign(Object.assign({},e),{},{wake_word:Object.assign(Object.assign(Object.assign({},e.wake_word),t.data),{},{done:!0})}):"stt-start"===t.type?Object.assign(Object.assign({},e),{},{stage:"stt",stt:Object.assign(Object.assign({},t.data),{},{done:!1})}):"stt-end"===t.type?Object.assign(Object.assign({},e),{},{stt:Object.assign(Object.assign(Object.assign({},e.stt),t.data),{},{done:!0})}):"intent-start"===t.type?Object.assign(Object.assign({},e),{},{stage:"intent",intent:Object.assign(Object.assign({},t.data),{},{done:!1})}):"intent-end"===t.type?Object.assign(Object.assign({},e),{},{intent:Object.assign(Object.assign(Object.assign({},e.intent),t.data),{},{done:!0})}):"tts-start"===t.type?Object.assign(Object.assign({},e),{},{stage:"tts",tts:Object.assign(Object.assign({},t.data),{},{done:!1})}):"tts-end"===t.type?Object.assign(Object.assign({},e),{},{tts:Object.assign(Object.assign(Object.assign({},e.tts),t.data),{},{done:!0})}):"run-end"===t.type?Object.assign(Object.assign({},e),{},{stage:"done"}):"error"===t.type?Object.assign(Object.assign({},e),{},{stage:"error",error:t.data}):Object.assign({},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,Object.assign(Object.assign({},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(Object.assign({type:"assist_pipeline/pipeline/create"},t)),u=(e,t,i)=>e.callWS(Object.assign({type:"assist_pipeline/pipeline/update",pipeline_id:t},i)),h=(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(71695),i(40251),i(47021),i(72700),i(8038),i(71513),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(){var e;return null===(e=this._context)||void 0===e?void 0:e.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(){var e;this._active=!1,this._stream&&(this._stream.getTracks()[0].enabled=!1),await(null===(e=this._context)||void 0===e?void 0:e.suspend())}close(){var e,t,i;this._active=!1,null===(e=this._stream)||void 0===e||e.getTracks()[0].stop(),this._recorder&&(this._recorder.port.onmessage=null),null===(t=this._source)||void 0===t||t.disconnect(),null===(i=this._context)||void 0===i||i.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.22e5ba9205d233d6.js.map