From 350ff22ced73d94a76d97638c2193ee28b33fd5b Mon Sep 17 00:00:00 2001 From: Christian Weimann Date: Wed, 8 Nov 2023 07:17:10 +0100 Subject: [PATCH] Add EnergyMeter --- equipmentMgr.js | 79 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 78 insertions(+), 1 deletion(-) diff --git a/equipmentMgr.js b/equipmentMgr.js index f41abe1..f94f59c 100644 --- a/equipmentMgr.js +++ b/equipmentMgr.js @@ -134,6 +134,65 @@ class Car extends Equipment { } } +class EnergyMeter extends Equipment { + constructor(equipmentItem) { + super(equipmentItem); + + + if (this.hasProperty('ConsumptionTotal')) { + console.log(`Create rule to trigger calculateConsumption function`); + + this.consumptionTotalItem = items[this.getPropertyItemName('ConsumptionTotal')]; + rules.JSRule({ + id: String(utils.randomUUID()), + name: 'Trigger calculateConsumption function for ' + this.equipmentItem.name, + triggers: [triggers.ItemStateChangeTrigger(this.consumptionTotalItem)], + execute: (event) => { this.#calculateConsumptionValues(event) }, + }); + } else { + console.info(`Item ${this.equipmentItem.name} has no consumptionTotal item`) + } + } + + #calculateConsumptionValues() { + console.log('Calculate consumption values'); + + let startOfHour = time.toZDT().withMinute(0).withSecond(0).withNano(0); + let startOfDay = startOfHour.withHour(0); + let startOfWeek = startOfDay.minusDays(time.toZDT().dayOfWeek().value() - 1); + let startOfMonth = startOfDay.withDayOfMonth(1); + let startOfYear = startOfDay.withMonth(1).withDayOfMonth(1); + + let consumptionTotal = Quantity(this.consumptionTotalItem.state); + + if (this.hasProperty('ConsumptionHour')) { + let consumptionHour = consumptionTotal.subtract((this.consumptionTotalItem.history.minimumSince(startOfHour).state)); + items[this.getPropertyItemName('ConsumptionHour')].postUpdate(consumptionHour); + } + + if (this.hasProperty('ConsumptionToday')) { + let consumptionToday = consumptionTotal.subtract((this.consumptionTotalItem.history.minimumSince(startOfDay).state)); + items[this.getPropertyItemName('ConsumptionToday')].postUpdate(consumptionToday); + } + + if (this.hasProperty('ConsumptionWeek')) { + let consumptionWeek = consumptionTotal.subtract((this.consumptionTotalItem.history.minimumSince(startOfWeek).state)); + items[this.getPropertyItemName('ConsumptionWeek')].postUpdate(consumptionWeek); + } + + if (this.hasProperty('ConsumptionMonth')) { + let consumptionMonth = consumptionTotal.subtract((this.consumptionTotalItem.history.minimumSince(startOfMonth).state)); + items[this.getPropertyItemName('ConsumptionMonth')].postUpdate(consumptionMonth); + } + + if (this.hasProperty('ConsumptionYear')) { + let consumptionYear = consumptionTotal.subtract((this.consumptionTotalItem.history.minimumSince(startOfYear).state)); + items[this.getPropertyItemName('ConsumptionYear')].postUpdate(consumptionYear); + } + } + +} + class Doorbell extends Equipment { constructor(equipmentItem) { super(equipmentItem); @@ -264,6 +323,18 @@ class IrrigationValve extends Equipment { } } +class Light extends Equipment { + constructor(equipmentItem) { + super(equipmentItem); + } +} + +class Lightbulb extends Light { + constructor(equipmentItem) { + super(equipmentItem); + } +} + class PresenceSensor extends Equipment { constructor(equipmentItem) { super(equipmentItem); @@ -294,6 +365,12 @@ class WeatherService extends Equipment { } } +class Window extends Equipment { + constructor(equipmentItem) { + super(equipmentItem); + } +} + const eMgr = new Object(); @@ -325,4 +402,4 @@ require('@runtime').lifecycleTracker.addDisposeHook(() => { for (let equipmentItemName of Object.keys(eMgr)) { eMgr[equipmentItemName].gc(); } -}); \ No newline at end of file +});