Improved thread safety
This commit is contained in:
		
							parent
							
								
									ae9ffb65c1
								
							
						
					
					
						commit
						39f727206f
					
				@ -3,6 +3,7 @@ import logging
 | 
			
		||||
from homeassistant.components.websocket_api import event_message
 | 
			
		||||
from homeassistant.helpers import device_registry, entity_registry
 | 
			
		||||
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
 | 
			
		||||
from homeassistant.core import callback
 | 
			
		||||
 | 
			
		||||
from .const import DATA_BROWSERS, DOMAIN, DATA_ADDERS
 | 
			
		||||
from .sensor import BrowserSensor
 | 
			
		||||
@ -130,11 +131,14 @@ class BrowserModBrowser:
 | 
			
		||||
            er.async_remove(self.entities["camera"].entity_id)
 | 
			
		||||
            del self.entities["camera"]
 | 
			
		||||
 | 
			
		||||
        self.send(
 | 
			
		||||
            None, browserEntities={k: v.entity_id for k, v in self.entities.items()}
 | 
			
		||||
        hass.create_task(
 | 
			
		||||
            self.send(
 | 
			
		||||
                None, browserEntities={k: v.entity_id for k, v in self.entities.items()}
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    def send(self, command, **kwargs):
 | 
			
		||||
    @callback
 | 
			
		||||
    async def send(self, command, **kwargs):
 | 
			
		||||
        """Send a command to this browser."""
 | 
			
		||||
        if self.connection is None:
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@ -9,6 +9,8 @@ from homeassistant.components.websocket_api import (
 | 
			
		||||
 | 
			
		||||
from homeassistant.components import websocket_api
 | 
			
		||||
 | 
			
		||||
from homeassistant.core import callback
 | 
			
		||||
 | 
			
		||||
from .const import (
 | 
			
		||||
    BROWSER_ID,
 | 
			
		||||
    DATA_STORE,
 | 
			
		||||
@ -40,6 +42,7 @@ async def async_setup_connection(hass):
 | 
			
		||||
        browserID = msg[BROWSER_ID]
 | 
			
		||||
        store = hass.data[DOMAIN][DATA_STORE]
 | 
			
		||||
 | 
			
		||||
        @callback
 | 
			
		||||
        def send_update(data):
 | 
			
		||||
            connection.send_message(event_message(msg["id"], {"result": data}))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -27,7 +27,7 @@ async def async_setup_services(hass):
 | 
			
		||||
            if target not in browsers:
 | 
			
		||||
                continue
 | 
			
		||||
            browser = browsers[target]
 | 
			
		||||
            browser.send(service, **data)
 | 
			
		||||
            hass.create_task(browser.send(service, **data))
 | 
			
		||||
 | 
			
		||||
    def handle_service(call):
 | 
			
		||||
        service = call.service
 | 
			
		||||
 | 
			
		||||
@ -13,7 +13,7 @@ export const ConnectionMixin = (SuperClass) => {
 | 
			
		||||
    public browserEntities = {};
 | 
			
		||||
 | 
			
		||||
    LOG(...args) {
 | 
			
		||||
      return;
 | 
			
		||||
      if (window.browser_mod_log === undefined) return;
 | 
			
		||||
      const dt = new Date();
 | 
			
		||||
      console.log(`${dt.toLocaleTimeString()}`, ...args);
 | 
			
		||||
 | 
			
		||||
@ -37,6 +37,7 @@ export const ConnectionMixin = (SuperClass) => {
 | 
			
		||||
        this.update_config(msg.result);
 | 
			
		||||
      }
 | 
			
		||||
      this._connectionResolve?.();
 | 
			
		||||
      this._connectionResolve = undefined;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private update_config(cfg) {
 | 
			
		||||
 | 
			
		||||
@ -32,6 +32,7 @@ interface FullyKiosk {
 | 
			
		||||
declare global {
 | 
			
		||||
  interface Window {
 | 
			
		||||
    browser_mod?: BrowserMod;
 | 
			
		||||
    browser_mod_log?: any;
 | 
			
		||||
    fully?: FullyKiosk;
 | 
			
		||||
    hassConnection?: Promise<any>;
 | 
			
		||||
    customCards?: [{}?];
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "browser_mod",
 | 
			
		||||
  "version": "2.0.0b2",
 | 
			
		||||
  "version": "2.0.0b4",
 | 
			
		||||
  "lockfileVersion": 1,
 | 
			
		||||
  "requires": true,
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										31
									
								
								test/automations.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								test/automations.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,31 @@
 | 
			
		||||
- id: "1660669793583"
 | 
			
		||||
  alias: Toggle bed light
 | 
			
		||||
  description: ""
 | 
			
		||||
  trigger:
 | 
			
		||||
    - platform: time_pattern
 | 
			
		||||
      seconds: /3
 | 
			
		||||
  condition: []
 | 
			
		||||
  action:
 | 
			
		||||
    - type: toggle
 | 
			
		||||
      device_id: 98861bdf58b3c79183c03be06da14f27
 | 
			
		||||
      entity_id: light.bed_light
 | 
			
		||||
      domain: light
 | 
			
		||||
  mode: single
 | 
			
		||||
 | 
			
		||||
- alias: Popup when kitchen light togggled
 | 
			
		||||
  trigger:
 | 
			
		||||
    - platform: state
 | 
			
		||||
      entity_id: light.kitchen_lights
 | 
			
		||||
  action:
 | 
			
		||||
    - service: browser_mod.sequence
 | 
			
		||||
      data:
 | 
			
		||||
        sequence:
 | 
			
		||||
          - service: delay
 | 
			
		||||
            data:
 | 
			
		||||
              time: 5000
 | 
			
		||||
          - service: browser_mod.popup
 | 
			
		||||
            data:
 | 
			
		||||
              title: automation
 | 
			
		||||
              content:
 | 
			
		||||
                type: markdown
 | 
			
		||||
                content: "{%raw%}{{states('light.bed_light')}}{%endraw%}"
 | 
			
		||||
@ -1,5 +1,7 @@
 | 
			
		||||
default_config:
 | 
			
		||||
 | 
			
		||||
automation: !include test/automations.yaml
 | 
			
		||||
 | 
			
		||||
demo:
 | 
			
		||||
 | 
			
		||||
http:
 | 
			
		||||
@ -12,6 +14,8 @@ logger:
 | 
			
		||||
  logs:
 | 
			
		||||
    custom_components.browser_mod: info
 | 
			
		||||
 | 
			
		||||
# debugpy:
 | 
			
		||||
 | 
			
		||||
# browser_mod:
 | 
			
		||||
#   devices:
 | 
			
		||||
#     camdevice:
 | 
			
		||||
 | 
			
		||||
@ -32,6 +32,7 @@ views:
 | 
			
		||||
          action: more-info
 | 
			
		||||
 | 
			
		||||
  - !include views/popup.yaml
 | 
			
		||||
  - !include views/frontend-backend.yaml
 | 
			
		||||
 | 
			
		||||
  - title: Popup card
 | 
			
		||||
    popup_cards:
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										30
									
								
								test/views/frontend-backend.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								test/views/frontend-backend.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,30 @@
 | 
			
		||||
title: frontend vs backend
 | 
			
		||||
 | 
			
		||||
cards:
 | 
			
		||||
  - type: entities
 | 
			
		||||
    entities:
 | 
			
		||||
      - light.bed_light
 | 
			
		||||
      - light.kitchen_lights
 | 
			
		||||
 | 
			
		||||
  - type: button
 | 
			
		||||
    name: fire-dom-event
 | 
			
		||||
    tap_action:
 | 
			
		||||
      action: fire-dom-event
 | 
			
		||||
      browser_mod:
 | 
			
		||||
        service: browser_mod.popup
 | 
			
		||||
        data:
 | 
			
		||||
          title: fire-dom-event
 | 
			
		||||
          content:
 | 
			
		||||
            type: markdown
 | 
			
		||||
            content: "{{states('light.bed_light')}}"
 | 
			
		||||
 | 
			
		||||
  - type: button
 | 
			
		||||
    name: call-service
 | 
			
		||||
    tap_action:
 | 
			
		||||
      action: call-service
 | 
			
		||||
      service: browser_mod.popup
 | 
			
		||||
      data:
 | 
			
		||||
        title: call-service
 | 
			
		||||
        content:
 | 
			
		||||
          type: markdown
 | 
			
		||||
          content: "{{states('light.bed_light')}}"
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user