
    :j                         d Z ddlmZ ddlmZ ddlZddlZddlmZ ddl	m
Z
 ddlmZ dd	lmZ dd
lmZ ddlmZmZ dZdZdZdZdZdZdZdZdZdZ ej        e          Z  G d de          Z!dS )z-
Controller to interface with Home Assistant
    )Callable)partialN)Any   )APP_HOMEASSISTANT_LOVELACE)PyChromecastError)CastMessage)chain_on_success   )CallbackTypeBaseControllerzurn:x-cast:com.nabucasa.hast                     c                   P    e Zd ZdZeeeddedededz  dedeg df         d	ed
ede	ddf fdZ
edefd            ZddZddZdededefdZdeddfdZdeddfdZddZdddedz  ddfdZ	 d dddeez  dz  dedz  dedz  ddfdZdeeef         dedz  ddfdZ xZS )!HomeAssistantControllerz+Controller to interact with Home Assistant.)app_namespaceapp_idhass_connect_timeouthass_url	hass_uuid	client_idNrefresh_token
unregisterr   r   r   returnc                R   t                               d           t                                          ||           || _        || _        || _        || _        || _        || _	        d | _
        t          j                    | _        | j                                         g | _        d S )Nz HomeAssistantController.__init__)_LOGGERdebugsuper__init__r   r   r   r   r   r   status	threadingEvent_hass_connecting_eventset_on_connect)
selfr   r   r   r   r   r   r   r   	__class__s
            \/home/user/adhan/venv/lib/python3.11/site-packages/pychromecast/controllers/homeassistant.pyr$   z HomeAssistantController.__init__'   s     	8999/// ""*$$8! $(&/o&7&7##'')))/1    c                     | j         duo8| j         d         o+| j         d         | j        k    o| j         d         | j        k    S )z&Return if connected to Home Assistant.N	connectedhassUrlhassUUID)r%   r   r   r+   s    r-   hass_connectedz&HomeAssistantController.hass_connectedG   sP     Kt# :K(:I&$-7: J'4>9		
r.   c                 b    t                               d           |                                  dS )z^Called when a channel has been openend that supports the
        namespace of this controller.z)HomeAssistantController.channel_connectedN)r!   r"   
get_statusr3   s    r-   channel_connectedz)HomeAssistantController.channel_connectedQ   s-     	ABBBr.   c                 z    t                               d           d| _        | j                                         dS )z&Called when a channel is disconnected.z,HomeAssistantController.channel_disconnectedN)r!   r"   r%   r(   r)   r3   s    r-   channel_disconnectedz,HomeAssistantController.channel_disconnectedW   s7    DEEE#'')))))r.   _messagedatac                    |                     d          dk    rt                              d|           |d         | j        k    s|d         | j        k    r0| j                            d           |                                  dS | j        }|| _	        |s| j        st                              d           dS | j
                                         |                     d           dS |                     d          d	k    rit                              d|           |                     d
          t          k    r.| j                            d           |                                  dS dS )z"Called when a message is received.typereceiver_statusz*HomeAssistantController.receive_message %sr1   r2   z$Received status for another instanceTz9HomeAssistantController.receive_message already connectedreceiver_error
error_codezReceived ERR_WRONG_INSTANCEF)getr!   r"   r   r   loggerinfor   r4   r%   r(   r)   _call_on_connect_callbacksERR_WRONG_INSTANCE)r+   r:   r;   was_connecteds       r-   receive_messagez'HomeAssistantController.receive_message]   sd   88F000MMFMMMI$-//4
3Ct~3U3U  !GHHH!!!t /MDK D$7 O   t '++---++D111488F///MMFMMMxx%%);;;  !>???!!!4ur.   msg_sentc                     t                               d|           | j        r, | j                                        |d           | j        *dS dS )zCall on connect callbacks.z5HomeAssistantController._call_on_connect_callbacks %sN)r!   r"   r*   pop)r+   rH   s     r-   rD   z2HomeAssistantController._call_on_connect_callbacks}   sd    MxXXX 	3"D  ""8T222  	3 	3 	3 	3 	3r.   callback_functionc                    t                               d           | j                            |           | j                                        st                               d           dS | j                                         	 |                     d| j        | j	        | j
        | j        d           nW# t          $ rJ t                               d           | j                                         |                     d            w xY w| j                            | j                   	 | j                                        sC| j                            d| j
                   |                     d           t'                      	 | j                                         dS # | j                                         w xY w)	z9Connect to Home Assistant and call the provided callback.z%HomeAssistantController._connect_hasszDHomeAssistantController._connect_hass _hass_connecting_event not setNconnect)r=   refreshTokenclientIdr1   r2   zDHomeAssistantController._connect_hass failed to send connect messageFz_connect_hass failed for %s)r!   r"   r*   appendr(   is_setclearsend_messager   r   r   r   	Exceptionr)   rD   waitr   rB   warningr   r+   rK   s     r-   _connect_hassz%HomeAssistantController._connect_hass   s   =>>> 1222*1133 	MMV   F#))+++	%$($6 $#} $      	 	 	MMV   '++---++E222	 	#(()BCCC	..5577 *##$A4=QQQ//666')))*
 '++-----D'++----s   /B4 4AD+AF# #F>c                 4    |                      ddi           dS )zShow the demo.r=   	show_demoN)rS   r3   s    r-   rZ   z!HomeAssistantController.show_demo   s!    6;/00000r.   rK   c                    t                               d           |                     d| j        | j        d|           dS )z"Get status of Home Assistant Cast.z"HomeAssistantController.get_statusr6   )r=   r1   r2   r[   Nr!   r"   _send_connected_messager   r   rW   s     r-   r6   z"HomeAssistantController.get_status   sX    :;;;$$$= N 
 0 	% 	
 	
 	
 	
 	
r.   	view_pathurl_pathc                    t                               d           |                     d| j        | j        ||d|           dS )zShow a Lovelace UI.z*HomeAssistantController.show_lovelace_viewshow_lovelace_view)r=   r1   r2   viewPathurlPathr[   Nr]   )r+   r_   r`   rK   s       r-   rb   z*HomeAssistantController.show_lovelace_view   s`     	BCCC$$,= N%#  0 	% 		
 		
 		
 		
 		
r.   c                 P   t                               d|           | j        r3t                               d           |                     ||           dS t                               d           |                     t          t          | j        |          |                     dS )z1Send a message to a connected Home Assistant Castz2HomeAssistantController._send_connected_message %szAHomeAssistantController._send_connected_message already connectedr[   NzAHomeAssistantController._send_connected_message not yet connected)r!   r"   r4   send_message_nocheckrX   r
   r   )r+   r;   rK   s      r-   r^   z/HomeAssistantController._send_connected_message   s     	JDQQQ 	MMS   %%d>O%PPPFO	
 	
 	
 	1488:K 	
 	
 	
 	
 	
r.   )r   N)N)__name__
__module____qualname____doc__APP_NAMESPACEr   DEFAULT_HASS_CONNECT_TIMEOUTstrr   floatr$   propertyboolr4   r7   r9   r	   dictrG   rD   r   rX   rZ   r6   intrb   r   r^   __classcell__)r,   s   @r-   r   r   $   sh       55 +0&B2 2 2 2 	2
 :2 2 RX&2 2 2 $2 
2 2 2 2 2 2@ 
 
 
 
 X
   * * * * 4 D    @34 3D 3 3 3 3%.| %. %. %. %. %.N1 1 1 1 FJ 

 

 

|d/B 

d 

 

 

 

  $

 26
 
 
9t#
 *

 ($.
 

 
 
 
(
cN
7Cd7J
	
 
 
 
 
 
 
 
r.   r   )"rj   collections.abcr   	functoolsr   loggingr&   typingr   configr   errorr   generated.cast_channel_pb2r	   response_handlerr
    r   r   rk   rl   ERR_CONNECTION_FAILEDERR_AUTHENTICATION_FAILEDERR_CONNECTION_LOSTERR_HASS_URL_MISSINGERR_NO_HTTPSrE   ERR_NOT_CONNECTEDERR_FETCH_CONFIG_FAILED	getLoggerrg   r!   r    r.   r-   <module>r      sX    % $ $ $ $ $                  / / / / / / % % % % % %      0 / / / / / * * * * * * * * /!         
'
H
%
%}
 }
 }
 }
 }
n }
 }
 }
 }
 }
r.   