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.components.websocket_api import event_message
|
||||||
from homeassistant.helpers import device_registry, entity_registry
|
from homeassistant.helpers import device_registry, entity_registry
|
||||||
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
|
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
|
||||||
|
from homeassistant.core import callback
|
||||||
|
|
||||||
from .const import DATA_BROWSERS, DOMAIN, DATA_ADDERS
|
from .const import DATA_BROWSERS, DOMAIN, DATA_ADDERS
|
||||||
from .sensor import BrowserSensor
|
from .sensor import BrowserSensor
|
||||||
@ -130,11 +131,14 @@ class BrowserModBrowser:
|
|||||||
er.async_remove(self.entities["camera"].entity_id)
|
er.async_remove(self.entities["camera"].entity_id)
|
||||||
del self.entities["camera"]
|
del self.entities["camera"]
|
||||||
|
|
||||||
self.send(
|
hass.create_task(
|
||||||
None, browserEntities={k: v.entity_id for k, v in self.entities.items()}
|
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."""
|
"""Send a command to this browser."""
|
||||||
if self.connection is None:
|
if self.connection is None:
|
||||||
return
|
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.components import websocket_api
|
||||||
|
|
||||||
|
from homeassistant.core import callback
|
||||||
|
|
||||||
from .const import (
|
from .const import (
|
||||||
BROWSER_ID,
|
BROWSER_ID,
|
||||||
DATA_STORE,
|
DATA_STORE,
|
||||||
@ -40,6 +42,7 @@ async def async_setup_connection(hass):
|
|||||||
browserID = msg[BROWSER_ID]
|
browserID = msg[BROWSER_ID]
|
||||||
store = hass.data[DOMAIN][DATA_STORE]
|
store = hass.data[DOMAIN][DATA_STORE]
|
||||||
|
|
||||||
|
@callback
|
||||||
def send_update(data):
|
def send_update(data):
|
||||||
connection.send_message(event_message(msg["id"], {"result": 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:
|
if target not in browsers:
|
||||||
continue
|
continue
|
||||||
browser = browsers[target]
|
browser = browsers[target]
|
||||||
browser.send(service, **data)
|
hass.create_task(browser.send(service, **data))
|
||||||
|
|
||||||
def handle_service(call):
|
def handle_service(call):
|
||||||
service = call.service
|
service = call.service
|
||||||
|
@ -13,7 +13,7 @@ export const ConnectionMixin = (SuperClass) => {
|
|||||||
public browserEntities = {};
|
public browserEntities = {};
|
||||||
|
|
||||||
LOG(...args) {
|
LOG(...args) {
|
||||||
return;
|
if (window.browser_mod_log === undefined) return;
|
||||||
const dt = new Date();
|
const dt = new Date();
|
||||||
console.log(`${dt.toLocaleTimeString()}`, ...args);
|
console.log(`${dt.toLocaleTimeString()}`, ...args);
|
||||||
|
|
||||||
@ -37,6 +37,7 @@ export const ConnectionMixin = (SuperClass) => {
|
|||||||
this.update_config(msg.result);
|
this.update_config(msg.result);
|
||||||
}
|
}
|
||||||
this._connectionResolve?.();
|
this._connectionResolve?.();
|
||||||
|
this._connectionResolve = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
private update_config(cfg) {
|
private update_config(cfg) {
|
||||||
|
@ -32,6 +32,7 @@ interface FullyKiosk {
|
|||||||
declare global {
|
declare global {
|
||||||
interface Window {
|
interface Window {
|
||||||
browser_mod?: BrowserMod;
|
browser_mod?: BrowserMod;
|
||||||
|
browser_mod_log?: any;
|
||||||
fully?: FullyKiosk;
|
fully?: FullyKiosk;
|
||||||
hassConnection?: Promise<any>;
|
hassConnection?: Promise<any>;
|
||||||
customCards?: [{}?];
|
customCards?: [{}?];
|
||||||
|
2
package-lock.json
generated
2
package-lock.json
generated
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "browser_mod",
|
"name": "browser_mod",
|
||||||
"version": "2.0.0b2",
|
"version": "2.0.0b4",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"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:
|
default_config:
|
||||||
|
|
||||||
|
automation: !include test/automations.yaml
|
||||||
|
|
||||||
demo:
|
demo:
|
||||||
|
|
||||||
http:
|
http:
|
||||||
@ -12,6 +14,8 @@ logger:
|
|||||||
logs:
|
logs:
|
||||||
custom_components.browser_mod: info
|
custom_components.browser_mod: info
|
||||||
|
|
||||||
|
# debugpy:
|
||||||
|
|
||||||
# browser_mod:
|
# browser_mod:
|
||||||
# devices:
|
# devices:
|
||||||
# camdevice:
|
# camdevice:
|
||||||
|
@ -32,6 +32,7 @@ views:
|
|||||||
action: more-info
|
action: more-info
|
||||||
|
|
||||||
- !include views/popup.yaml
|
- !include views/popup.yaml
|
||||||
|
- !include views/frontend-backend.yaml
|
||||||
|
|
||||||
- title: Popup card
|
- title: Popup card
|
||||||
popup_cards:
|
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