From 1600cc9469e5c3d2bf3cc1b14206d8073a6c41c4 Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Wed, 25 Apr 2018 13:05:28 +0200 Subject: [PATCH] TwoLedSignal stuff --- dist/TwoLedSignal.js | 78 +++++++++++++++++++++++++++++++++++++++++ dist/main.js | 39 +++++++++++++++++++++ homekit.json | 17 --------- openhab.items | 1 - src/TwoLedSignal.ts | 82 ++++++++++++++++++++++++++++++++++++-------- src/UrlSwitchItem.ts | 2 +- src/main.ts | 36 +++++++++++++++++-- 7 files changed, 218 insertions(+), 37 deletions(-) create mode 100644 dist/TwoLedSignal.js diff --git a/dist/TwoLedSignal.js b/dist/TwoLedSignal.js new file mode 100644 index 0000000..1a059a4 --- /dev/null +++ b/dist/TwoLedSignal.js @@ -0,0 +1,78 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const AItem_1 = require("./AItem"); +const MqttDispatcher_1 = require("./MqttDispatcher"); +const logger = require("./log"); +var SignalState; +(function (SignalState) { + SignalState[SignalState["SIGNAL_RED"] = 0] = "SIGNAL_RED"; + SignalState[SignalState["SIGNAL_GREEN"] = 1] = "SIGNAL_GREEN"; + SignalState[SignalState["SIGNAL_UNKNOWN"] = 2] = "SIGNAL_UNKNOWN"; +})(SignalState || (SignalState = {})); +class SignalItem { + constructor(item, redToken, greenToken) { + this.item = item; + this.signalState = SignalState.SIGNAL_UNKNOWN; + this.redToken = redToken; + this.greenToken = greenToken; + } + getSignalState() { + return this.signalState; + } + processMessage(topic, payload) { + if (topic == this.item.getStateFeedbackTopic()) { + logger.info(`${topic}, ${payload}`); + if (payload == this.greenToken) { + this.signalState = SignalState.SIGNAL_GREEN; + } + else if (payload == this.redToken) { + this.signalState = SignalState.SIGNAL_RED; + } + else { + this.signalState = SignalState.SIGNAL_UNKNOWN; + } + // logger.info(`DBG: SignalItem: ${topic}, ${payload}, ${this.signalState}`) + } + } +} +class TwoLedSignal extends AItem_1.AItem { + constructor(floor, room, item, label, led1Items, led1GreenToken, led1RedToken, led2Items, led2GreenToken, led2RedToken) { + super(floor, room, item, label); + this.led1Items = []; + this.led2Items = []; + this.subscribeTopics = []; + led1Items.forEach((item) => { + this.led1Items.push(new SignalItem(item, led1RedToken, led1GreenToken)); + this.subscribeTopics.push(item.getStateFeedbackTopic()); + }); + led2Items.forEach((item) => { + this.led2Items.push(new SignalItem(item, led2RedToken, led2GreenToken)); + this.subscribeTopics.push(item.getStateFeedbackTopic()); + }); + } + processMessage(topic, payload) { + let reds = 0; + const RED_VALUES = [SignalState.SIGNAL_RED, SignalState.SIGNAL_UNKNOWN]; + this.led1Items.forEach((item) => { + item.processMessage(topic, payload); + if (RED_VALUES.indexOf(item.getSignalState()) != -1) { + reds++; + } + // logger.info(`DBG: TwoLedSignal ${item.getSignalState()}, ${reds}`) + }); + let msg = (reds > 0) ? "RED" : "GREEN"; + MqttDispatcher_1.mqttHandler.send(`${this.topicFirstPart}/led1`, msg); + reds = 0; + this.led2Items.forEach((item) => { + item.processMessage(topic, payload); + if (RED_VALUES.indexOf(item.getSignalState()) != -1) { + reds++; + } + // logger.info(`DBG: TwoLedSignal ${item.getSignalState()}, ${reds}`) + }); + msg = (reds > 0) ? "RED" : "GREEN"; + MqttDispatcher_1.mqttHandler.send(`${this.topicFirstPart}/led2`, msg); + } +} +exports.TwoLedSignal = TwoLedSignal; +//# sourceMappingURL=TwoLedSignal.js.map \ No newline at end of file diff --git a/dist/main.js b/dist/main.js index 987b1f9..cd4dc55 100644 --- a/dist/main.js +++ b/dist/main.js @@ -21,9 +21,12 @@ const HueColorBulbItem_1 = require("./HueColorBulbItem"); const TouchSwitchMultiButtonThing_1 = require("./TouchSwitchMultiButtonThing"); const RelayBox_1 = require("./RelayBox"); const HeatingScene_1 = require("./HeatingScene"); +const TwoLedSignal_1 = require("./TwoLedSignal"); logger.info("Dispatcher starting"); let allLabeledItems = new Array(); let allThermostatItems = new Array(); +let allWindows = new Array(); +let allRelevantLights = new Array(); // Anna ----------------------------------------------------------------------------------------------------- // Anna Aquarium 14665044 24 1 14665041 24 1 let aquariumLight = new M433SwitchItem_1.M433SwitchItem('1st', 'Anna', 'AquariumLight', 'Aquariumlicht', '14665044 24 1', '14665041 24 1'); @@ -41,9 +44,11 @@ aquariumLightCron.start(); let annaBedLight = new M433SwitchItem_1.M433SwitchItem('1st', 'Anna', 'BedLight', 'Bettlicht Anna', '14668116 24 1', '14668113 24 1'); annaBedLight.start(); allLabeledItems.push(annaBedLight); +allRelevantLights.push(annaBedLight); let windowContactAnna1st = new MaxWindowContact_1.MaxWindowContact('1st', 'Anna', 'WindowContact', 'Fenster Anna', 20); windowContactAnna1st.start(); allLabeledItems.push(windowContactAnna1st); +allWindows.push(windowContactAnna1st); let thermostatAnna1st = new MaxThermostat_1.MaxThermostat('1st', 'Anna', 'Thermostat', 'Thermostat Anna', 21, [windowContactAnna1st]); thermostatAnna1st.start(); thermostatAnna1st.setPresetTemperature(21.0); @@ -65,84 +70,104 @@ thermostatAnna1stCron.start(); let matthiasStandLights = new M433SwitchItem_1.M433SwitchItem('1st', 'Matthias', 'StandLight', 'Stehlampen Matthias', '7 24 1', '6 24 1'); matthiasStandLights.start(); allLabeledItems.push(matthiasStandLights); +allRelevantLights.push(matthiasStandLights); // Matthias Bett 15 24 1 14 24 1 let matthiasBedLight = new M433SwitchItem_1.M433SwitchItem('1st', 'Matthias', 'BedLight', 'Bettlicht Matthias', '15 24 1', '14 24 1'); matthiasBedLight.start(); allLabeledItems.push(matthiasBedLight); +allRelevantLights.push(matthiasBedLight); // Matthias Lautsprecher 11 24 1 10 24 1 let matthiasSpeaker = new M433SwitchItem_1.M433SwitchItem('1st', 'Matthias', 'Speaker', 'Lautsprecher Matthias', '11 24 1', '10 24 1', 'outlet'); matthiasSpeaker.start(); allLabeledItems.push(matthiasSpeaker); +allRelevantLights.push(matthiasSpeaker); let windowContactMatthias = new MaxWindowContact_1.MaxWindowContact('1st', 'Matthias', 'WindowContact', 'Fenster', 24); windowContactMatthias.start(); allLabeledItems.push(windowContactMatthias); +allWindows.push(windowContactMatthias); // Esszimmer ------------------------------------------------------------------------------------------------ // Esszimmer kleine Lampe 69653 24 1 69652 24 1 let diningRoomSmallLight = new M433SwitchItem_1.M433SwitchItem('Gnd', 'DiningRoom', 'SmallLight', 'kleine Lampe Esszimmer', '69653 24 1', '69652 24 1'); diningRoomSmallLight.start(); allLabeledItems.push(diningRoomSmallLight); +allRelevantLights.push(diningRoomSmallLight); // Esszimmer Stehlampe 86037 24 1 86036 24 1 let diningRoomStandLight = new M433SwitchItem_1.M433SwitchItem('Gnd', 'DiningRoom', 'StandLight', 'Stehlampe Esszimmer', '86037 24 1', '86036 24 1'); diningRoomStandLight.start(); allLabeledItems.push(diningRoomStandLight); +allRelevantLights.push(diningRoomStandLight); // Esszimmer Schranklicht 65813 24 1 65812 24 1 let diningRoomCupboardLight = new M433SwitchItem_1.M433SwitchItem('Gnd', 'DiningRoom', 'CupboardLight', 'Schranklicht Esszimmer', '65813 24 1', '65812 24 1'); diningRoomCupboardLight.start(); allLabeledItems.push(diningRoomCupboardLight); +allRelevantLights.push(diningRoomCupboardLight); // Esszimmer Regallicht let diningRoomShelfLight = new UrlSwitchItem_1.UrlSwitchItem('Gnd', 'DiningRoom', 'ShelfLight', 'Regallicht Esszimmer', 'http://regallampe/dv?dv=1023', 'http://regallampe/dv?dv=0'); diningRoomShelfLight.start(); allLabeledItems.push(diningRoomShelfLight); +allRelevantLights.push(diningRoomShelfLight); let diningRoomNaehkaestchenLight = new HueColorBulbItem_1.HueColorBulbItem('Gnd', 'DiningRoom', 'NaehkaestchenLight', 'Lampe Naehkaestchen', 15); diningRoomNaehkaestchenLight.start(); allLabeledItems.push(diningRoomNaehkaestchenLight); +allRelevantLights.push(diningRoomNaehkaestchenLight); // Wohnzimmer ----------------------------------------------------------------------------------------------- // Wohnzimmer grosse Lampe 65557 24 1 65556 24 1 let livingRoomLargeLight = new M433SwitchItem_1.M433SwitchItem('Gnd', 'LivingRoom', 'LargeLight', 'große Lampe Wohnzimmer', '65557 24 1', '65556 24 1'); livingRoomLargeLight.start(); allLabeledItems.push(livingRoomLargeLight); +allRelevantLights.push(livingRoomLargeLight); // Wohnzimmer kleine Lampe 87061 24 1 87060 24 1 let livingRoomSmallLight = new M433SwitchItem_1.M433SwitchItem('Gnd', 'LivingRoom', 'SmallLight', 'kleine Lampe Wohnzimmer', '87061 24 1', '87060 24 1'); livingRoomSmallLight.start(); allLabeledItems.push(livingRoomSmallLight); +allRelevantLights.push(livingRoomSmallLight); // Wohnzimmer Sterne 69909 24 1 69908 24 1 let livingRoomStars = new M433SwitchItem_1.M433SwitchItem('Gnd', 'LivingRoom', 'Stars', 'Sterne Wohnzimmer', '69909 24 1', '69908 24 1'); livingRoomStars.start(); allLabeledItems.push(livingRoomStars); +allRelevantLights.push(livingRoomStars); // Wohnzimmer kleine Stehlampe 81941 24 1 81940 24 1 let livingRoomStandLight = new M433SwitchItem_1.M433SwitchItem('Gnd', 'LivingRoom', 'StandLight', 'Stehlampe Wohnzimmer', '81941 24 1', '81940 24 1'); livingRoomStandLight.start(); allLabeledItems.push(livingRoomStandLight); +allRelevantLights.push(livingRoomStandLight); // Flur ----------------------------------------------------------------------------------------------------- // Flur Schreibtisch 83221 24 1 83220 24 1 let hallwayDeskLight = new M433SwitchItem_1.M433SwitchItem('Gnd', 'Hallway', 'DeskLight', 'Schreibtischlampe Flur', '83221 24 1', '83220 24 1'); hallwayDeskLight.start(); allLabeledItems.push(hallwayDeskLight); +allRelevantLights.push(hallwayDeskLight); // Flur Stehlampe 8704914 24 5 8793154 24 5 let hallwayStandLight = new M433SwitchItem_1.M433SwitchItem('Gnd', 'Hallway', 'StandLight', 'Stehlampe Flur', '8704914 24 5', '8793154 24 5'); hallwayStandLight.start(); allLabeledItems.push(hallwayStandLight); +allRelevantLights.push(hallwayStandLight); // Flur Schranklicht 66581 24 1 66580 24 1 let hallwayWardrobeLight = new M433SwitchItem_1.M433SwitchItem('Gnd', 'Hallway', 'WardrobeLight', 'Schranklicht Flur', '66581 24 1', '66580 24 1'); hallwayWardrobeLight.start(); allLabeledItems.push(hallwayWardrobeLight); +allRelevantLights.push(hallwayWardrobeLight); // Küche ---------------------------------------------------------------------------------------------------- // Küche Fensterbank 66837 24 1 66836 24 1 let kitchenWindowLight = new M433SwitchItem_1.M433SwitchItem('Gnd', 'Kitchen', 'WindowLight', 'Fensterbanklicht Küche', '66837 24 1', '66836 24 1'); kitchenWindowLight.start(); allLabeledItems.push(kitchenWindowLight); +allRelevantLights.push(kitchenWindowLight); // Küche Deckenlampe 82197 24 1 82196 24 1 let kitchenCeilingLight = new M433SwitchItem_1.M433SwitchItem('Gnd', 'Kitchen', 'CeilingLight', 'Deckenlampe Küche', '82197 24 1', '82196 24 1'); kitchenCeilingLight.start(); allLabeledItems.push(kitchenCeilingLight); +allRelevantLights.push(kitchenCeilingLight); // Schlafzimmer --------------------------------------------------------------------------------------------- // Schlafzimmer Wolfgangs Seite 13976916 24 1 13976913 24 1 let bedRoomWolfgangsSide = new M433SwitchItem_1.M433SwitchItem('1st', 'BedRoom', 'WolfgangsSide', 'Wolfgangs Seite Schlafzimmer', '13976916 24 1', '13976913 24 1'); bedRoomWolfgangsSide.start(); allLabeledItems.push(bedRoomWolfgangsSide); +allRelevantLights.push(bedRoomWolfgangsSide); let bedRoomWolfgangBedLight = new HueColorBulbItem_1.HueColorBulbItem('1st', 'BedRoom', 'WolfgangBedLight', 'Bettlicht', 16); bedRoomWolfgangBedLight.start(); allLabeledItems.push(bedRoomWolfgangBedLight); +allRelevantLights.push(bedRoomWolfgangBedLight); let bedRoomWolfgangBedLightDimmerAdaptor = new DimmerAdaptor_1.DimmerAdaptor('1st', 'BedRoom', 'WolfgangBedLight'); bedRoomWolfgangBedLightDimmerAdaptor.start(); let touchSwitchMultiButtonThing = new TouchSwitchMultiButtonThing_1.TouchSwitchMultiButtonThing('1st', 'Bedroom', 'Wolfgang', [new TouchSwitchMultiButtonThing_1.TouchSwitchButtonSingleItem(bedRoomWolfgangBedLightDimmerAdaptor.getInTopic())]); @@ -151,19 +176,24 @@ touchSwitchMultiButtonThing.start(); let bedRoomPattysSide = new M433SwitchItem_1.M433SwitchItem('1st', 'BedRoom', 'PattysSide', 'Pattys Seite Schlafzimmer', '13980756 24 1', '13980753 24 1'); bedRoomPattysSide.start(); allLabeledItems.push(bedRoomPattysSide); +allRelevantLights.push(bedRoomPattysSide); // Schlafzimmer Fensterbank 13979988 24 1 13979985 24 1 let bedRoomWindowLight = new M433SwitchItem_1.M433SwitchItem('1st', 'BedRoom', 'WindowLight', 'Fensterbanklicht Schlafzimmer', '13979988 24 1', '13979985 24 1'); bedRoomWindowLight.start(); allLabeledItems.push(bedRoomWindowLight); +allRelevantLights.push(bedRoomWindowLight); let windowContactBedroomStreet1st = new MaxWindowContact_1.MaxWindowContact('1st', 'Bedroom', 'WindowContactStreet', 'Fenster Schlafzimmer Strasse', 17); windowContactBedroomStreet1st.start(); allLabeledItems.push(windowContactBedroomStreet1st); +allWindows.push(windowContactBedroomStreet1st); let windowContact1BedroomGarden1st = new MaxWindowContact_1.MaxWindowContact('1st', 'Bedroom', 'WindowContact1Garden', 'Fenster Schlafzimmer 1 Garten', 18); windowContact1BedroomGarden1st.start(); allLabeledItems.push(windowContact1BedroomGarden1st); +allWindows.push(windowContact1BedroomGarden1st); let windowContact2BedroomGarden1st = new MaxWindowContact_1.MaxWindowContact('1st', 'Bedroom', 'WindowContact2Garden', 'Fenster Schlafzimmer 2 Garten', 22); windowContact2BedroomGarden1st.start(); allLabeledItems.push(windowContact2BedroomGarden1st); +allWindows.push(windowContact2BedroomGarden1st); let thermostatBedroom1st = new MaxThermostat_1.MaxThermostat('1st', 'Bedroom', 'Thermostat', 'Thermostat Schlafzimmer', 19, [windowContact1BedroomGarden1st, windowContact2BedroomGarden1st, windowContactBedroomStreet1st]); thermostatBedroom1st.start(); thermostatBedroom1st.setPresetTemperature(20.0); @@ -211,6 +241,7 @@ allLabeledItems.push(morningLightScene); let windowContactBathroomGnd = new MaxWindowContact_1.MaxWindowContact('Gnd', 'Bathroom', 'WindowContact', 'Fenster Bad unten', 7); windowContactBathroomGnd.start(); allLabeledItems.push(windowContactBathroomGnd); +allWindows.push(windowContactBathroomGnd); let thermostatBathroomGnd = new MaxThermostat_1.MaxThermostat('Gnd', 'Bathroom', 'Thermostat', 'Thermostat Bad unten', 4, [windowContactBathroomGnd]); thermostatBathroomGnd.start(); thermostatBathroomGnd.setPresetTemperature(20.0); @@ -227,6 +258,7 @@ thermostatBathroomGndCron.start(); let windowContactBathroom1st = new MaxWindowContact_1.MaxWindowContact('1st', 'Bathroom', 'WindowContact', 'Fenster Bad oben', 2); windowContactBathroom1st.start(); allLabeledItems.push(windowContactBathroom1st); +allWindows.push(windowContactBathroom1st); let thermostatBathroom1st = new MaxThermostat_1.MaxThermostat('1st', 'Bathroom', 'Thermostat', 'Thermostat Bad oben', 3, [windowContactBathroom1st]); thermostatBathroom1st.start(); thermostatBathroom1st.setPresetTemperature(20.0); @@ -243,15 +275,19 @@ thermostatBathroom1stCron.start(); let windowContactKitchen1 = new MaxWindowContact_1.MaxWindowContact('Gnd', 'Kitchen', 'WindowContact1', 'Fenster Küche Garten', 11); windowContactKitchen1.start(); allLabeledItems.push(windowContactKitchen1); +allWindows.push(windowContactKitchen1); let windowContactKitchen2 = new MaxWindowContact_1.MaxWindowContact('Gnd', 'Kitchen', 'WindowContact2', 'Fenster Küche Terassentür Garten', 10); windowContactKitchen2.start(); allLabeledItems.push(windowContactKitchen2); +allWindows.push(windowContactKitchen2); let windowContactKitchen3 = new MaxWindowContact_1.MaxWindowContact('Gnd', 'Kitchen', 'WindowContact3', 'Fenster Küche Straße 1', 12); windowContactKitchen3.start(); allLabeledItems.push(windowContactKitchen3); +allWindows.push(windowContactKitchen3); let windowContactKitchen4 = new MaxWindowContact_1.MaxWindowContact('Gnd', 'Kitchen', 'WindowContact4', 'Fenster Küche Straße 2', 13); windowContactKitchen4.start(); allLabeledItems.push(windowContactKitchen4); +allWindows.push(windowContactKitchen4); let thermostatKitchen = new MaxThermostat_1.MaxThermostat('Gnd', 'Kitchen', 'Thermostat', 'Thermostat Küche', 14, [ windowContactKitchen1, windowContactKitchen2, windowContactKitchen3, windowContactKitchen4 ]); @@ -281,6 +317,9 @@ allLabeledItems.push(relayBox); let heatingSceneAll = new HeatingScene_1.HeatingScene('Gnd', 'House', 'Heatings', 'Alle Heizungen', allThermostatItems); heatingSceneAll.start(); // ---------------------------------------------------------------------------------------------------------- +let twoLedSignal1 = new TwoLedSignal_1.TwoLedSignal('Gnd', 'Hallway', 'TwoLedSignal1', 'Licht- und Fenster-Anzeiger', allRelevantLights, "OFF", "ON", allWindows, "CLOSED", "OPEN"); +twoLedSignal1.start(); +// ---------------------------------------------------------------------------------------------------------- let testFourButton = new HomematicFourButtonThing_1.HomematicFourButtonThing('Gnd', 'Hallway', 'TestButton', 9, [ new HomematicFourButtonThing_1.HomematicFourButtonSingleItem('dispatcher_ng/items/Gnd/Hallway/Testlight/dimmerIn'), new HomematicFourButtonThing_1.HomematicFourButtonSingleItem('dispatcher_ng/items/Gnd/Hallway/DeskLight/timerIn'), diff --git a/homekit.json b/homekit.json index 971cf1f..2625b76 100644 --- a/homekit.json +++ b/homekit.json @@ -165,23 +165,6 @@ }, "config": {} }, - "Gnd_DiningRoom_ShelfLight": { - "id": "Gnd_DiningRoom_ShelfLight", - "name": "Regallicht Esszimmer", - "service": "Lightbulb", - "topic": { - "setOn": "dispatcher_ng/items/Gnd/DiningRoom/ShelfLight/state", - "statusOn": "dispatcher_ng/items/Gnd/DiningRoom/ShelfLight/state/feedback" - }, - "payload": { - "onTrue": "ON", - "onFalse": "OFF", - "brightnessFactor": "", - "hueFactor": "", - "saturationFactor": "" - }, - "config": {} - }, "Gnd_DiningRoom_NaehkaestchenLight": { "id": "Gnd_DiningRoom_NaehkaestchenLight", "name": "Lampe Naehkaestchen", diff --git a/openhab.items b/openhab.items index 5700882..97fac32 100644 --- a/openhab.items +++ b/openhab.items @@ -10,7 +10,6 @@ Contact 1st_Matthias_WindowContact "Fenster" {mqtt="<[localbroker:dispatcher_ng/ Switch Gnd_DiningRoom_SmallLight "kleine Lampe Esszimmer"{mqtt=">[localbroker:dispatcher_ng/items/Gnd/DiningRoom/SmallLight/state:command:*:default],<[localbroker:dispatcher_ng/items/Gnd/DiningRoom/SmallLight/state/feedback:state:default]"} Switch Gnd_DiningRoom_StandLight "Stehlampe Esszimmer"{mqtt=">[localbroker:dispatcher_ng/items/Gnd/DiningRoom/StandLight/state:command:*:default],<[localbroker:dispatcher_ng/items/Gnd/DiningRoom/StandLight/state/feedback:state:default]"} Switch Gnd_DiningRoom_CupboardLight "Schranklicht Esszimmer"{mqtt=">[localbroker:dispatcher_ng/items/Gnd/DiningRoom/CupboardLight/state:command:*:default],<[localbroker:dispatcher_ng/items/Gnd/DiningRoom/CupboardLight/state/feedback:state:default]"} -Switch Gnd_DiningRoom_ShelfLight "Regallicht Esszimmer"{mqtt=">[localbroker:dispatcher_ng/items/Gnd/DiningRoom/ShelfLight/state:command:*:default],<[localbroker:dispatcher_ng/items/Gnd/DiningRoom/ShelfLight/state/feedback:state:default]"} Switch Gnd_LivingRoom_LargeLight "große Lampe Wohnzimmer"{mqtt=">[localbroker:dispatcher_ng/items/Gnd/LivingRoom/LargeLight/state:command:*:default],<[localbroker:dispatcher_ng/items/Gnd/LivingRoom/LargeLight/state/feedback:state:default]"} Switch Gnd_LivingRoom_SmallLight "kleine Lampe Wohnzimmer"{mqtt=">[localbroker:dispatcher_ng/items/Gnd/LivingRoom/SmallLight/state:command:*:default],<[localbroker:dispatcher_ng/items/Gnd/LivingRoom/SmallLight/state/feedback:state:default]"} diff --git a/src/TwoLedSignal.ts b/src/TwoLedSignal.ts index 56b08f7..1edfca0 100644 --- a/src/TwoLedSignal.ts +++ b/src/TwoLedSignal.ts @@ -1,12 +1,48 @@ import { AItem, HasFeedbackTopic } from './AItem' +import { mqttHandler } from './MqttDispatcher' +import * as logger from './log' -export class HeatingScene extends AItem { - private led1Topics: string[] = [] - private led2Topics: string[] = [] - private led1GreenToken: string - private led1RedToken: string - private led2GreenToken: string - private led2RedToken: string +enum SignalState { + SIGNAL_RED, + SIGNAL_GREEN, + SIGNAL_UNKNOWN, +} + +class SignalItem { + private item: HasFeedbackTopic + private signalState: SignalState + private redToken: string + private greenToken: string + + constructor(item: HasFeedbackTopic, redToken: string, greenToken: string) { + this.item = item + this.signalState = SignalState.SIGNAL_UNKNOWN + this.redToken = redToken + this.greenToken = greenToken + } + + getSignalState() : SignalState { + return this.signalState + } + + processMessage(topic: string, payload: string): void { + if (topic == this.item.getStateFeedbackTopic()) { + logger.info(`${topic}, ${payload}`) + if (payload == this.greenToken) { + this.signalState = SignalState.SIGNAL_GREEN + } else if (payload == this.redToken) { + this.signalState = SignalState.SIGNAL_RED + } else { + this.signalState = SignalState.SIGNAL_UNKNOWN + } + // logger.info(`DBG: SignalItem: ${topic}, ${payload}, ${this.signalState}`) + } + } +} + +export class TwoLedSignal extends AItem { + private led1Items: SignalItem[] = [] + private led2Items: SignalItem[] = [] constructor(floor: string, room: string, item: string, label: string, led1Items: HasFeedbackTopic[], led1GreenToken: string, led1RedToken: string, @@ -16,23 +52,39 @@ export class HeatingScene extends AItem { this.subscribeTopics = [] led1Items.forEach((item: HasFeedbackTopic) => { - this.led1Topics.push(item.getStateFeedbackTopic()) + this.led1Items.push(new SignalItem(item, led1RedToken, led1GreenToken)) this.subscribeTopics.push(item.getStateFeedbackTopic()) }) led2Items.forEach((item: HasFeedbackTopic) => { - this.led2Topics.push(item.getStateFeedbackTopic()) + this.led2Items.push(new SignalItem(item, led2RedToken, led2GreenToken)) this.subscribeTopics.push(item.getStateFeedbackTopic()) }) - - this.led1GreenToken = led1GreenToken - this.led1RedToken = led1RedToken - this.led2GreenToken = led2GreenToken - this.led2RedToken = led2RedToken - } processMessage(topic: string, payload: string) : void { + let reds : number = 0 + const RED_VALUES : SignalState[] = [SignalState.SIGNAL_RED, SignalState.SIGNAL_UNKNOWN] + this.led1Items.forEach((item: SignalItem) => { + item.processMessage(topic, payload) + if (RED_VALUES.indexOf(item.getSignalState()) != -1) { + reds++ + } + // logger.info(`DBG: TwoLedSignal ${item.getSignalState()}, ${reds}`) + }) + let msg = (reds > 0) ? "RED" : "GREEN" + mqttHandler.send(`${this.topicFirstPart}/led1`, msg) + + reds = 0 + this.led2Items.forEach((item: SignalItem) => { + item.processMessage(topic, payload) + if (RED_VALUES.indexOf(item.getSignalState()) != -1) { + reds++ + } + // logger.info(`DBG: TwoLedSignal ${item.getSignalState()}, ${reds}`) + }) + msg = (reds > 0) ? "RED" : "GREEN" + mqttHandler.send(`${this.topicFirstPart}/led2`, msg) } } diff --git a/src/UrlSwitchItem.ts b/src/UrlSwitchItem.ts index bd9fa46..74a255d 100644 --- a/src/UrlSwitchItem.ts +++ b/src/UrlSwitchItem.ts @@ -45,7 +45,7 @@ export class UrlSwitchItem extends AItem implements HasStateAndFeedbackTopic { mqttHandler.send(this.stateFeedbackTopic, this.state); if (this.state != this.oldState) { if (this.state == 'ON') { - http.get(this.onUrl) + http.get(this.onUrl,) } else { http.get(this.offUrl) } diff --git a/src/main.ts b/src/main.ts index c0c6a49..e20dbc2 100644 --- a/src/main.ts +++ b/src/main.ts @@ -23,13 +23,14 @@ import { HueColorBulbItem } from './HueColorBulbItem' import { TouchSwitchMultiButtonThing, TouchSwitchButtonSingleItem } from './TouchSwitchMultiButtonThing' import { RelayBoxThing } from './RelayBox' import { HeatingScene } from './HeatingScene' - +import { TwoLedSignal } from './TwoLedSignal' logger.info("Dispatcher starting") let allLabeledItems : Array = new Array() let allThermostatItems : Array = new Array() let allWindows : Array = new Array() +let allRelevantLights: Array = new Array() // Anna ----------------------------------------------------------------------------------------------------- @@ -53,7 +54,7 @@ aquariumLightCron.start() let annaBedLight = new M433SwitchItem('1st', 'Anna', 'BedLight', 'Bettlicht Anna', '14668116 24 1', '14668113 24 1') annaBedLight.start() allLabeledItems.push(annaBedLight) - +allRelevantLights.push(annaBedLight) let windowContactAnna1st = new MaxWindowContact('1st', 'Anna', 'WindowContact', 'Fenster Anna', 20) windowContactAnna1st.start() @@ -84,16 +85,20 @@ thermostatAnna1stCron.start() let matthiasStandLights = new M433SwitchItem('1st', 'Matthias', 'StandLight', 'Stehlampen Matthias', '7 24 1', '6 24 1') matthiasStandLights.start() allLabeledItems.push(matthiasStandLights) +allRelevantLights.push(matthiasStandLights) + // Matthias Bett 15 24 1 14 24 1 let matthiasBedLight = new M433SwitchItem('1st', 'Matthias', 'BedLight', 'Bettlicht Matthias', '15 24 1', '14 24 1') matthiasBedLight.start() allLabeledItems.push(matthiasBedLight) +allRelevantLights.push(matthiasBedLight) // Matthias Lautsprecher 11 24 1 10 24 1 let matthiasSpeaker = new M433SwitchItem('1st', 'Matthias', 'Speaker', 'Lautsprecher Matthias', '11 24 1', '10 24 1', 'outlet') matthiasSpeaker.start() allLabeledItems.push(matthiasSpeaker) +allRelevantLights.push(matthiasSpeaker) let windowContactMatthias = new MaxWindowContact('1st', 'Matthias', 'WindowContact', 'Fenster', 24) windowContactMatthias.start() @@ -107,46 +112,55 @@ allWindows.push(windowContactMatthias) let diningRoomSmallLight = new M433SwitchItem('Gnd', 'DiningRoom', 'SmallLight', 'kleine Lampe Esszimmer', '69653 24 1', '69652 24 1') diningRoomSmallLight.start() allLabeledItems.push(diningRoomSmallLight) +allRelevantLights.push(diningRoomSmallLight) // Esszimmer Stehlampe 86037 24 1 86036 24 1 let diningRoomStandLight = new M433SwitchItem('Gnd', 'DiningRoom', 'StandLight', 'Stehlampe Esszimmer', '86037 24 1', '86036 24 1') diningRoomStandLight.start() allLabeledItems.push(diningRoomStandLight) +allRelevantLights.push(diningRoomStandLight) // Esszimmer Schranklicht 65813 24 1 65812 24 1 let diningRoomCupboardLight = new M433SwitchItem('Gnd', 'DiningRoom', 'CupboardLight', 'Schranklicht Esszimmer', '65813 24 1', '65812 24 1') diningRoomCupboardLight.start() allLabeledItems.push(diningRoomCupboardLight) +allRelevantLights.push(diningRoomCupboardLight) // Esszimmer Regallicht let diningRoomShelfLight = new UrlSwitchItem('Gnd', 'DiningRoom', 'ShelfLight', 'Regallicht Esszimmer', 'http://regallampe/dv?dv=1023', 'http://regallampe/dv?dv=0') diningRoomShelfLight.start() allLabeledItems.push(diningRoomShelfLight) +allRelevantLights.push(diningRoomShelfLight) let diningRoomNaehkaestchenLight = new HueColorBulbItem('Gnd', 'DiningRoom', 'NaehkaestchenLight', 'Lampe Naehkaestchen', 15) diningRoomNaehkaestchenLight.start() allLabeledItems.push(diningRoomNaehkaestchenLight) +allRelevantLights.push(diningRoomNaehkaestchenLight) // Wohnzimmer ----------------------------------------------------------------------------------------------- // Wohnzimmer grosse Lampe 65557 24 1 65556 24 1 let livingRoomLargeLight = new M433SwitchItem('Gnd', 'LivingRoom', 'LargeLight', 'große Lampe Wohnzimmer', '65557 24 1', '65556 24 1') livingRoomLargeLight.start() allLabeledItems.push(livingRoomLargeLight) +allRelevantLights.push(livingRoomLargeLight) // Wohnzimmer kleine Lampe 87061 24 1 87060 24 1 let livingRoomSmallLight = new M433SwitchItem('Gnd', 'LivingRoom', 'SmallLight', 'kleine Lampe Wohnzimmer', '87061 24 1', '87060 24 1') livingRoomSmallLight.start() allLabeledItems.push(livingRoomSmallLight) +allRelevantLights.push(livingRoomSmallLight) // Wohnzimmer Sterne 69909 24 1 69908 24 1 let livingRoomStars = new M433SwitchItem('Gnd', 'LivingRoom', 'Stars', 'Sterne Wohnzimmer', '69909 24 1', '69908 24 1') livingRoomStars.start() allLabeledItems.push(livingRoomStars) +allRelevantLights.push(livingRoomStars) // Wohnzimmer kleine Stehlampe 81941 24 1 81940 24 1 let livingRoomStandLight = new M433SwitchItem('Gnd', 'LivingRoom', 'StandLight', 'Stehlampe Wohnzimmer', '81941 24 1', '81940 24 1') livingRoomStandLight.start() allLabeledItems.push(livingRoomStandLight) +allRelevantLights.push(livingRoomStandLight) // Flur ----------------------------------------------------------------------------------------------------- @@ -154,16 +168,19 @@ allLabeledItems.push(livingRoomStandLight) let hallwayDeskLight = new M433SwitchItem('Gnd', 'Hallway', 'DeskLight', 'Schreibtischlampe Flur', '83221 24 1', '83220 24 1') hallwayDeskLight.start() allLabeledItems.push(hallwayDeskLight) +allRelevantLights.push(hallwayDeskLight) // Flur Stehlampe 8704914 24 5 8793154 24 5 let hallwayStandLight = new M433SwitchItem('Gnd', 'Hallway', 'StandLight', 'Stehlampe Flur', '8704914 24 5', '8793154 24 5') hallwayStandLight.start() allLabeledItems.push(hallwayStandLight) +allRelevantLights.push(hallwayStandLight) // Flur Schranklicht 66581 24 1 66580 24 1 let hallwayWardrobeLight = new M433SwitchItem('Gnd', 'Hallway', 'WardrobeLight', 'Schranklicht Flur', '66581 24 1', '66580 24 1') hallwayWardrobeLight.start() allLabeledItems.push(hallwayWardrobeLight) +allRelevantLights.push(hallwayWardrobeLight) // Küche ---------------------------------------------------------------------------------------------------- @@ -171,11 +188,13 @@ allLabeledItems.push(hallwayWardrobeLight) let kitchenWindowLight = new M433SwitchItem('Gnd', 'Kitchen', 'WindowLight', 'Fensterbanklicht Küche', '66837 24 1', '66836 24 1') kitchenWindowLight.start() allLabeledItems.push(kitchenWindowLight) +allRelevantLights.push(kitchenWindowLight) // Küche Deckenlampe 82197 24 1 82196 24 1 let kitchenCeilingLight = new M433SwitchItem('Gnd', 'Kitchen', 'CeilingLight', 'Deckenlampe Küche', '82197 24 1', '82196 24 1') kitchenCeilingLight.start() allLabeledItems.push(kitchenCeilingLight) +allRelevantLights.push(kitchenCeilingLight) // Schlafzimmer --------------------------------------------------------------------------------------------- @@ -183,10 +202,12 @@ allLabeledItems.push(kitchenCeilingLight) let bedRoomWolfgangsSide = new M433SwitchItem('1st', 'BedRoom', 'WolfgangsSide', 'Wolfgangs Seite Schlafzimmer', '13976916 24 1', '13976913 24 1') bedRoomWolfgangsSide.start() allLabeledItems.push(bedRoomWolfgangsSide) +allRelevantLights.push(bedRoomWolfgangsSide) let bedRoomWolfgangBedLight = new HueColorBulbItem('1st', 'BedRoom', 'WolfgangBedLight', 'Bettlicht', 16) bedRoomWolfgangBedLight.start() allLabeledItems.push(bedRoomWolfgangBedLight) +allRelevantLights.push(bedRoomWolfgangBedLight) let bedRoomWolfgangBedLightDimmerAdaptor = new DimmerAdaptor('1st', 'BedRoom', 'WolfgangBedLight') bedRoomWolfgangBedLightDimmerAdaptor.start() @@ -199,11 +220,13 @@ touchSwitchMultiButtonThing.start() let bedRoomPattysSide = new M433SwitchItem('1st', 'BedRoom', 'PattysSide', 'Pattys Seite Schlafzimmer', '13980756 24 1', '13980753 24 1') bedRoomPattysSide.start() allLabeledItems.push(bedRoomPattysSide) +allRelevantLights.push(bedRoomPattysSide) // Schlafzimmer Fensterbank 13979988 24 1 13979985 24 1 let bedRoomWindowLight = new M433SwitchItem('1st', 'BedRoom', 'WindowLight', 'Fensterbanklicht Schlafzimmer', '13979988 24 1', '13979985 24 1') bedRoomWindowLight.start() allLabeledItems.push(bedRoomWindowLight) +allRelevantLights.push(bedRoomWindowLight) @@ -375,6 +398,14 @@ allLabeledItems.push(relayBox) let heatingSceneAll = new HeatingScene('Gnd', 'House', 'Heatings', 'Alle Heizungen', allThermostatItems) heatingSceneAll.start() + +// ---------------------------------------------------------------------------------------------------------- +let twoLedSignal1 = new TwoLedSignal('Gnd', 'Hallway', 'TwoLedSignal1', 'Licht- und Fenster-Anzeiger', + allRelevantLights, "OFF", "ON", + allWindows, "CLOSED", "OPEN") +twoLedSignal1.start() + + // ---------------------------------------------------------------------------------------------------------- let testFourButton = new HomematicFourButtonThing('Gnd', 'Hallway', 'TestButton', 9, [ new HomematicFourButtonSingleItem('dispatcher_ng/items/Gnd/Hallway/Testlight/dimmerIn'), @@ -450,4 +481,3 @@ fs.writeFileSync(config.dict.openhabItemFile, openhabList.join('\n')) mqttHandler.exec() logger.info("Dispatcher running") -