Add activity tracker

This commit is contained in:
Thomas Lovén 2022-07-18 23:46:55 +00:00
parent 8fe408bcc6
commit f12cc164b6
6 changed files with 119 additions and 9 deletions

View File

@ -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

View File

@ -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)

View File

@ -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();

View File

@ -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
View 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;
}
};
};

View File

@ -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,6 +60,7 @@ import pjson from "../../package.json";
*/ */
export class BrowserMod extends ServicesMixin( export class BrowserMod extends ServicesMixin(
PopupMixin( PopupMixin(
ActivityMixin(
BrowserStateMixin( BrowserStateMixin(
CameraMixin( CameraMixin(
MediaPlayerMixin( MediaPlayerMixin(
@ -69,6 +71,7 @@ export class BrowserMod extends ServicesMixin(
) )
) )
) )
)
) { ) {
constructor() { constructor() {
super(); super();