Add activity tracker
This commit is contained in:
		
							parent
							
								
									8fe408bcc6
								
							
						
					
					
						commit
						f12cc164b6
					
				@ -16,7 +16,8 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class BrowserBinarySensor(BrowserModEntity, BinarySensorEntity):
 | 
					class BrowserBinarySensor(BrowserModEntity, BinarySensorEntity):
 | 
				
			||||||
    def __init__(self, coordinator, browserID, parameter, name):
 | 
					    def __init__(self, coordinator, browserID, parameter, name):
 | 
				
			||||||
        super().__init__(coordinator, browserID, name)
 | 
					        BrowserModEntity.__init__(self, coordinator, browserID, name)
 | 
				
			||||||
 | 
					        BinarySensorEntity.__init__(self)
 | 
				
			||||||
        self.parameter = parameter
 | 
					        self.parameter = parameter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
@ -25,3 +26,27 @@ class BrowserBinarySensor(BrowserModEntity, BinarySensorEntity):
 | 
				
			|||||||
        data = data.get("browser", {})
 | 
					        data = data.get("browser", {})
 | 
				
			||||||
        data = data.get(self.parameter, None)
 | 
					        data = data.get(self.parameter, None)
 | 
				
			||||||
        return data
 | 
					        return data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ActivityBinarySensor(BrowserModEntity, BinarySensorEntity):
 | 
				
			||||||
 | 
					    def __init__(self, coordinator, browserID):
 | 
				
			||||||
 | 
					        BrowserModEntity.__init__(self, coordinator, browserID, None)
 | 
				
			||||||
 | 
					        BinarySensorEntity.__init__(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def unique_id(self):
 | 
				
			||||||
 | 
					        return f"{self.browserID}-activity"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def entity_registry_visible_default(self):
 | 
				
			||||||
 | 
					        return True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def device_class(self):
 | 
				
			||||||
 | 
					        return "motion"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def is_on(self):
 | 
				
			||||||
 | 
					        data = self._data
 | 
				
			||||||
 | 
					        data = data.get("activity", False)
 | 
				
			||||||
 | 
					        return data
 | 
				
			||||||
 | 
				
			|||||||
@ -7,7 +7,7 @@ from .const import DATA_BROWSERS, DOMAIN, DATA_ADDERS
 | 
				
			|||||||
from .coordinator import Coordinator
 | 
					from .coordinator import Coordinator
 | 
				
			||||||
from .sensor import BrowserSensor
 | 
					from .sensor import BrowserSensor
 | 
				
			||||||
from .light import BrowserModLight
 | 
					from .light import BrowserModLight
 | 
				
			||||||
from .binary_sensor import BrowserBinarySensor
 | 
					from .binary_sensor import BrowserBinarySensor, ActivityBinarySensor
 | 
				
			||||||
from .media_player import BrowserModPlayer
 | 
					from .media_player import BrowserModPlayer
 | 
				
			||||||
from .camera import BrowserModCamera
 | 
					from .camera import BrowserModCamera
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -68,6 +68,12 @@ class BrowserModBrowser:
 | 
				
			|||||||
        if self.data.get("browser", {}).get("charging", None) is not None:
 | 
					        if self.data.get("browser", {}).get("charging", None) is not None:
 | 
				
			||||||
            _assert_browser_sensor("binary_sensor", "charging", "Browser charging")
 | 
					            _assert_browser_sensor("binary_sensor", "charging", "Browser charging")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if "activity" not in self.entities:
 | 
				
			||||||
 | 
					            adder = hass.data[DOMAIN][DATA_ADDERS]["binary_sensor"]
 | 
				
			||||||
 | 
					            new = ActivityBinarySensor(coordinator, browserID)
 | 
				
			||||||
 | 
					            adder([new])
 | 
				
			||||||
 | 
					            self.entities["activity"] = new
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if "screen" not in self.entities:
 | 
					        if "screen" not in self.entities:
 | 
				
			||||||
            adder = hass.data[DOMAIN][DATA_ADDERS]["light"]
 | 
					            adder = hass.data[DOMAIN][DATA_ADDERS]["light"]
 | 
				
			||||||
            new = BrowserModLight(coordinator, browserID, self)
 | 
					            new = BrowserModLight(coordinator, browserID, self)
 | 
				
			||||||
 | 
				
			|||||||
@ -909,6 +909,41 @@ const ServicesMixin = (SuperClass) => {
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const ActivityMixin = (SuperClass) => {
 | 
				
			||||||
 | 
					    return class ActivityMixinClass extends SuperClass {
 | 
				
			||||||
 | 
					        constructor() {
 | 
				
			||||||
 | 
					            super();
 | 
				
			||||||
 | 
					            this.activityTriggered = false;
 | 
				
			||||||
 | 
					            this._activityCooldown = 15000;
 | 
				
			||||||
 | 
					            for (const ev of ["pointerdown", "pointermove", "keydown"]) {
 | 
				
			||||||
 | 
					                window.addEventListener(ev, () => this.activityTrigger());
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            this.addEventListener("fully-update", () => {
 | 
				
			||||||
 | 
					                this.activityTrigger();
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        activityTrigger() {
 | 
				
			||||||
 | 
					            if (!this.activityTriggered) {
 | 
				
			||||||
 | 
					                this.sendUpdate({
 | 
				
			||||||
 | 
					                    activity: true,
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            this.activityTriggered = true;
 | 
				
			||||||
 | 
					            clearTimeout(this._activityTimeout);
 | 
				
			||||||
 | 
					            this._activityTimeout = setTimeout(() => this.activityReset(), this._activityCooldown);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        activityReset() {
 | 
				
			||||||
 | 
					            clearTimeout(this._activityTimeout);
 | 
				
			||||||
 | 
					            if (this.activityTriggered) {
 | 
				
			||||||
 | 
					                this.sendUpdate({
 | 
				
			||||||
 | 
					                    activity: false,
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            this.activityTriggered = false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @license
 | 
					 * @license
 | 
				
			||||||
 * Copyright 2017 Google LLC
 | 
					 * Copyright 2017 Google LLC
 | 
				
			||||||
@ -1301,7 +1336,7 @@ var pjson = {
 | 
				
			|||||||
  - Media_seek
 | 
					  - Media_seek
 | 
				
			||||||
  - Screensavers
 | 
					  - Screensavers
 | 
				
			||||||
  */
 | 
					  */
 | 
				
			||||||
class BrowserMod extends ServicesMixin(PopupMixin(BrowserStateMixin(CameraMixin(MediaPlayerMixin(ScreenSaverMixin(FullyMixin(RequireInteractMixin(ConnectionMixin(EventTarget))))))))) {
 | 
					class BrowserMod extends ServicesMixin(PopupMixin(ActivityMixin(BrowserStateMixin(CameraMixin(MediaPlayerMixin(ScreenSaverMixin(FullyMixin(RequireInteractMixin(ConnectionMixin(EventTarget)))))))))) {
 | 
				
			||||||
    constructor() {
 | 
					    constructor() {
 | 
				
			||||||
        super();
 | 
					        super();
 | 
				
			||||||
        this.connect();
 | 
					        this.connect();
 | 
				
			||||||
 | 
				
			|||||||
@ -24,7 +24,8 @@ class BrowserSensor(BrowserModEntity, SensorEntity):
 | 
				
			|||||||
        unit_of_measurement=None,
 | 
					        unit_of_measurement=None,
 | 
				
			||||||
        device_class=None,
 | 
					        device_class=None,
 | 
				
			||||||
    ):
 | 
					    ):
 | 
				
			||||||
        super().__init__(coordinator, browserID, name)
 | 
					        BrowserModEntity.__init__(self, coordinator, browserID, name)
 | 
				
			||||||
 | 
					        SensorEntity.__init__(self)
 | 
				
			||||||
        self.parameter = parameter
 | 
					        self.parameter = parameter
 | 
				
			||||||
        self._device_class = device_class
 | 
					        self._device_class = device_class
 | 
				
			||||||
        self._unit_of_measurement = unit_of_measurement
 | 
					        self._unit_of_measurement = unit_of_measurement
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										40
									
								
								js/plugin/activity.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								js/plugin/activity.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					export const ActivityMixin = (SuperClass) => {
 | 
				
			||||||
 | 
					  return class ActivityMixinClass extends SuperClass {
 | 
				
			||||||
 | 
					    activityTriggered = false;
 | 
				
			||||||
 | 
					    _activityCooldown = 15000;
 | 
				
			||||||
 | 
					    _activityTimeout;
 | 
				
			||||||
 | 
					    constructor() {
 | 
				
			||||||
 | 
					      super();
 | 
				
			||||||
 | 
					      for (const ev of ["pointerdown", "pointermove", "keydown"]) {
 | 
				
			||||||
 | 
					        window.addEventListener(ev, () => this.activityTrigger());
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      this.addEventListener("fully-update", () => {
 | 
				
			||||||
 | 
					        this.activityTrigger();
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    activityTrigger() {
 | 
				
			||||||
 | 
					      if (!this.activityTriggered) {
 | 
				
			||||||
 | 
					        this.sendUpdate({
 | 
				
			||||||
 | 
					          activity: true,
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      this.activityTriggered = true;
 | 
				
			||||||
 | 
					      clearTimeout(this._activityTimeout);
 | 
				
			||||||
 | 
					      this._activityTimeout = setTimeout(
 | 
				
			||||||
 | 
					        () => this.activityReset(),
 | 
				
			||||||
 | 
					        this._activityCooldown
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    activityReset() {
 | 
				
			||||||
 | 
					      clearTimeout(this._activityTimeout);
 | 
				
			||||||
 | 
					      if (this.activityTriggered) {
 | 
				
			||||||
 | 
					        this.sendUpdate({
 | 
				
			||||||
 | 
					          activity: false,
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      this.activityTriggered = false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@ -9,6 +9,7 @@ import { RequireInteractMixin } from "./require-interact";
 | 
				
			|||||||
import { FullyMixin } from "./fullyKiosk";
 | 
					import { FullyMixin } from "./fullyKiosk";
 | 
				
			||||||
import { BrowserStateMixin } from "./browser";
 | 
					import { BrowserStateMixin } from "./browser";
 | 
				
			||||||
import { ServicesMixin } from "./services";
 | 
					import { ServicesMixin } from "./services";
 | 
				
			||||||
 | 
					import { ActivityMixin } from "./activity";
 | 
				
			||||||
import "./popups";
 | 
					import "./popups";
 | 
				
			||||||
import { PopupMixin } from "./popups";
 | 
					import { PopupMixin } from "./popups";
 | 
				
			||||||
import pjson from "../../package.json";
 | 
					import pjson from "../../package.json";
 | 
				
			||||||
@ -59,11 +60,13 @@ import pjson from "../../package.json";
 | 
				
			|||||||
  */
 | 
					  */
 | 
				
			||||||
export class BrowserMod extends ServicesMixin(
 | 
					export class BrowserMod extends ServicesMixin(
 | 
				
			||||||
  PopupMixin(
 | 
					  PopupMixin(
 | 
				
			||||||
    BrowserStateMixin(
 | 
					    ActivityMixin(
 | 
				
			||||||
      CameraMixin(
 | 
					      BrowserStateMixin(
 | 
				
			||||||
        MediaPlayerMixin(
 | 
					        CameraMixin(
 | 
				
			||||||
          ScreenSaverMixin(
 | 
					          MediaPlayerMixin(
 | 
				
			||||||
            FullyMixin(RequireInteractMixin(ConnectionMixin(EventTarget)))
 | 
					            ScreenSaverMixin(
 | 
				
			||||||
 | 
					              FullyMixin(RequireInteractMixin(ConnectionMixin(EventTarget)))
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
          )
 | 
					          )
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user