From 91f8dd929e833dd4842d06f59cb61ca85fa26206 Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Wed, 10 Jan 2018 15:06:58 +0100 Subject: [PATCH] openhab export added --- dispatcher_ng.conf | 3 ++- dist/AItem.js | 4 ++-- dist/Export.js | 17 +++++++++++------ dist/HomematicSwitchItem.js | 4 ++-- dist/M433SwitchItem.js | 4 ++-- dist/main.js | 11 ++++++++--- openhab.items | 20 ++++++++++++++++++++ src/AItem.ts | 6 +++--- src/Export.ts | 26 ++++++++++++++++++++------ src/HomematicSwitchItem.ts | 6 +++--- src/M433SwitchItem.ts | 6 +++--- src/main.ts | 14 +++++++++----- 12 files changed, 85 insertions(+), 36 deletions(-) create mode 100644 openhab.items diff --git a/dispatcher_ng.conf b/dispatcher_ng.conf index b6cff04..ec03aa9 100644 --- a/dispatcher_ng.conf +++ b/dispatcher_ng.conf @@ -7,5 +7,6 @@ "smtpPort": 25, "smtpSender": "dispatcher@hottis.de", "smtpReceiver": "woho@hottis.de", - "homekitFile": "homekit.json" + "homekitFile": "homekit.json", + "openhabItemFile": "openhab.items" } diff --git a/dist/AItem.js b/dist/AItem.js index fd750c8..bb267dd 100644 --- a/dist/AItem.js +++ b/dist/AItem.js @@ -16,8 +16,8 @@ class AItem { } this.topicFirstPart = `dispatcher_ng/items/${this.floor}/${this.room}/${this.item}`; } - exportHomekit() { - return { 'id': this.itemId, 'object': null }; + exportItem() { + return null; } start() { MqttDispatcher_1.mqttHandler.register(this.subscribeTopics, (topic, payload) => { diff --git a/dist/Export.js b/dist/Export.js index 7d71932..f1768b0 100644 --- a/dist/Export.js +++ b/dist/Export.js @@ -1,20 +1,21 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -function SwitchHomekitExport(itemId, label, stateTopic, stateFeedbackTopic, type) { - let out; +function SwitchExport(itemId, label, stateTopic, stateFeedbackTopic, type) { + let homekitOut; switch (type) { case 'bulb': - out = SwitchHomekitBulbExport(itemId, label, stateTopic, stateFeedbackTopic); + homekitOut = SwitchHomekitBulbExport(itemId, label, stateTopic, stateFeedbackTopic); break; case 'outlet': - out = SwitchHomekitOutletExport(itemId, label, stateTopic, stateFeedbackTopic); + homekitOut = SwitchHomekitOutletExport(itemId, label, stateTopic, stateFeedbackTopic); break; default: throw new Error(`no homekit export function for type ${type}`); } - return out; + let openhabOut = SwitchOpenHABExport(itemId, label, stateTopic, stateFeedbackTopic); + return { 'homekit': homekitOut, 'openhab': openhabOut }; } -exports.SwitchHomekitExport = SwitchHomekitExport; +exports.SwitchExport = SwitchExport; function SwitchHomekitBulbExport(id, label, setOn, statusOn) { let o = { "id": id, @@ -52,4 +53,8 @@ function SwitchHomekitOutletExport(id, label, setOn, statusOn) { }; return { 'id': id, 'object': o }; } +function SwitchOpenHABExport(id, label, setOn, statusOn) { + // Switch windowLightKitchen {mqtt=">[localbroker:nodered/items/windowLightKitchen:command:*:default]", mqtt="<[localbroker:nodered/items/windowLightKitchen/feedback:state:default]"} + return `Switch ${id} {mqtt=">[localbroker:${setOn}:command:*:default]", mqtt="<[localbroker:${statusOn}:state:default]"}`; +} //# sourceMappingURL=Export.js.map \ No newline at end of file diff --git a/dist/HomematicSwitchItem.js b/dist/HomematicSwitchItem.js index 0ea1d82..6287f0e 100644 --- a/dist/HomematicSwitchItem.js +++ b/dist/HomematicSwitchItem.js @@ -18,8 +18,8 @@ class HomematicSwitchItem extends AHomematicItem_1.AHomematicItem { this.oldState = undefined; this.type = type; } - exportHomekit() { - return Export_1.SwitchHomekitExport(this.itemId, this.label, this.stateTopic, this.stateFeedbackTopic, this.type); + exportItem() { + return Export_1.SwitchExport(this.itemId, this.label, this.stateTopic, this.stateFeedbackTopic, this.type); } processMessage(topic, payload) { switch (topic) { diff --git a/dist/M433SwitchItem.js b/dist/M433SwitchItem.js index da355a8..32bbe01 100644 --- a/dist/M433SwitchItem.js +++ b/dist/M433SwitchItem.js @@ -16,8 +16,8 @@ class M433SwitchItem extends AItem_1.AItem { this.offCode = offCode; this.type = type; } - exportHomekit() { - return Export_1.SwitchHomekitExport(this.itemId, this.label, this.stateTopic, this.stateFeedbackTopic, this.type); + exportItem() { + return Export_1.SwitchExport(this.itemId, this.label, this.stateTopic, this.stateFeedbackTopic, this.type); } processMessage(topic, payload) { this.state = payload; diff --git a/dist/main.js b/dist/main.js index 7ea8cdc..e11d08f 100644 --- a/dist/main.js +++ b/dist/main.js @@ -124,13 +124,18 @@ testForwarder.start(); // ---------------------------------------------------------------------------------------------------------- // Homekit export let homekitObject = {}; +let openhabList = []; allLabeledItems.forEach((item) => { - let homekitExport = item.exportHomekit(); - if ('id' in homekitExport) { - homekitObject[homekitExport['id']] = homekitExport['object']; + let exportData = item.exportItem(); + if (exportData != null) { + if ('id' in exportData['homekit']) { + homekitObject[exportData['homekit']['id']] = exportData['homekit']['object']; + } + openhabList.push(exportData['openhab']); } }); fs.writeFileSync(config.dict.homekitFile, JSON.stringify(homekitObject, null, 4)); +fs.writeFileSync(config.dict.openhabItemFile, openhabList.join('\n')); // ---------------------------------------------------------------------------------------------------------- MqttDispatcher_1.mqttHandler.exec(); logger.info("Dispatcher running"); diff --git a/openhab.items b/openhab.items new file mode 100644 index 0000000..b8d64b0 --- /dev/null +++ b/openhab.items @@ -0,0 +1,20 @@ +Switch 1st.Anna.AquariumLight {mqtt=">[localbroker:dispatcher_ng/items/1st/Anna/AquariumLight/state:command:*:default]", mqtt="<[localbroker:dispatcher_ng/items/1st/Anna/AquariumLight/state/feedback:state:default]"} +Switch 1st.Anna.BedLight {mqtt=">[localbroker:dispatcher_ng/items/1st/Anna/BedLight/state:command:*:default]", mqtt="<[localbroker:dispatcher_ng/items/1st/Anna/BedLight/state/feedback:state:default]"} +Switch 1st.Matthias.Stehlampen Matthias {mqtt=">[localbroker:dispatcher_ng/items/1st/Matthias/Stehlampen Matthias/state:command:*:default]", mqtt="<[localbroker:dispatcher_ng/items/1st/Matthias/Stehlampen Matthias/state/feedback:state:default]"} +Switch 1st.Matthias.BedLight {mqtt=">[localbroker:dispatcher_ng/items/1st/Matthias/BedLight/state:command:*:default]", mqtt="<[localbroker:dispatcher_ng/items/1st/Matthias/BedLight/state/feedback:state:default]"} +Switch 1st.Matthias.Speaker {mqtt=">[localbroker:dispatcher_ng/items/1st/Matthias/Speaker/state:command:*:default]", mqtt="<[localbroker:dispatcher_ng/items/1st/Matthias/Speaker/state/feedback:state:default]"} +Switch Gnd.DiningRoom.SmallLight {mqtt=">[localbroker:dispatcher_ng/items/Gnd/DiningRoom/SmallLight/state:command:*:default]", mqtt="<[localbroker:dispatcher_ng/items/Gnd/DiningRoom/SmallLight/state/feedback:state:default]"} +Switch Gnd.DiningRoom.StandLight {mqtt=">[localbroker:dispatcher_ng/items/Gnd/DiningRoom/StandLight/state:command:*:default]", mqtt="<[localbroker:dispatcher_ng/items/Gnd/DiningRoom/StandLight/state/feedback:state:default]"} +Switch Gnd.DiningRoom.CupboardLight {mqtt=">[localbroker:dispatcher_ng/items/Gnd/DiningRoom/CupboardLight/state:command:*:default]", mqtt="<[localbroker:dispatcher_ng/items/Gnd/DiningRoom/CupboardLight/state/feedback:state:default]"} +Switch Gnd.LivingRoom.LargeLight {mqtt=">[localbroker:dispatcher_ng/items/Gnd/LivingRoom/LargeLight/state:command:*:default]", mqtt="<[localbroker:dispatcher_ng/items/Gnd/LivingRoom/LargeLight/state/feedback:state:default]"} +Switch Gnd.LivingRoom.SmallLight {mqtt=">[localbroker:dispatcher_ng/items/Gnd/LivingRoom/SmallLight/state:command:*:default]", mqtt="<[localbroker:dispatcher_ng/items/Gnd/LivingRoom/SmallLight/state/feedback:state:default]"} +Switch Gnd.LivingRoom.Stars {mqtt=">[localbroker:dispatcher_ng/items/Gnd/LivingRoom/Stars/state:command:*:default]", mqtt="<[localbroker:dispatcher_ng/items/Gnd/LivingRoom/Stars/state/feedback:state:default]"} +Switch Gnd.LivingRoom.StandLight {mqtt=">[localbroker:dispatcher_ng/items/Gnd/LivingRoom/StandLight/state:command:*:default]", mqtt="<[localbroker:dispatcher_ng/items/Gnd/LivingRoom/StandLight/state/feedback:state:default]"} +Switch Gnd.Hallway.DeskLight {mqtt=">[localbroker:dispatcher_ng/items/Gnd/Hallway/DeskLight/state:command:*:default]", mqtt="<[localbroker:dispatcher_ng/items/Gnd/Hallway/DeskLight/state/feedback:state:default]"} +Switch Gnd.Hallway.StandLight {mqtt=">[localbroker:dispatcher_ng/items/Gnd/Hallway/StandLight/state:command:*:default]", mqtt="<[localbroker:dispatcher_ng/items/Gnd/Hallway/StandLight/state/feedback:state:default]"} +Switch Gnd.Hallway.StandLight {mqtt=">[localbroker:dispatcher_ng/items/Gnd/Hallway/StandLight/state:command:*:default]", mqtt="<[localbroker:dispatcher_ng/items/Gnd/Hallway/StandLight/state/feedback:state:default]"} +Switch Gnd.Kitchen.WindowLight {mqtt=">[localbroker:dispatcher_ng/items/Gnd/Kitchen/WindowLight/state:command:*:default]", mqtt="<[localbroker:dispatcher_ng/items/Gnd/Kitchen/WindowLight/state/feedback:state:default]"} +Switch Gnd.Kitchen.CeilingLight {mqtt=">[localbroker:dispatcher_ng/items/Gnd/Kitchen/CeilingLight/state:command:*:default]", mqtt="<[localbroker:dispatcher_ng/items/Gnd/Kitchen/CeilingLight/state/feedback:state:default]"} +Switch 1st.BedRoom.WolfgangsSide {mqtt=">[localbroker:dispatcher_ng/items/1st/BedRoom/WolfgangsSide/state:command:*:default]", mqtt="<[localbroker:dispatcher_ng/items/1st/BedRoom/WolfgangsSide/state/feedback:state:default]"} +Switch 1st.BedRoom.PattysSide {mqtt=">[localbroker:dispatcher_ng/items/1st/BedRoom/PattysSide/state:command:*:default]", mqtt="<[localbroker:dispatcher_ng/items/1st/BedRoom/PattysSide/state/feedback:state:default]"} +Switch 1st.BedRoom.WindowLight {mqtt=">[localbroker:dispatcher_ng/items/1st/BedRoom/WindowLight/state:command:*:default]", mqtt="<[localbroker:dispatcher_ng/items/1st/BedRoom/WindowLight/state/feedback:state:default]"} \ No newline at end of file diff --git a/src/AItem.ts b/src/AItem.ts index 51e13ec..cd710de 100644 --- a/src/AItem.ts +++ b/src/AItem.ts @@ -1,6 +1,6 @@ import * as logger from './log' import { mqttHandler } from './MqttDispatcher' -import { HomekitExportType } from './Export' +import { ExportType } from './Export' export abstract class AItem { @@ -28,8 +28,8 @@ export abstract class AItem { abstract processMessage(topic: string, payload: string) : void - exportHomekit() : HomekitExportType { - return {'id': this.itemId, 'object': null } + exportItem() : ExportType|null { + return null } start() : void { diff --git a/src/Export.ts b/src/Export.ts index a819be3..fabdeeb 100644 --- a/src/Export.ts +++ b/src/Export.ts @@ -1,22 +1,30 @@ +export type ExportType = { + 'homekit': HomekitExportType, + 'openhab': string +} + export type HomekitExportType = { 'id': string, 'object': any } -export function SwitchHomekitExport(itemId: string, label: string, stateTopic: string, stateFeedbackTopic: string, type: string) : HomekitExportType { - let out: HomekitExportType +export function SwitchExport(itemId: string, label: string, stateTopic: string, stateFeedbackTopic: string, type: string) : ExportType { + let homekitOut: HomekitExportType switch (type) { case 'bulb': - out = SwitchHomekitBulbExport(itemId, label, stateTopic, stateFeedbackTopic) + homekitOut = SwitchHomekitBulbExport(itemId, label, stateTopic, stateFeedbackTopic) break case 'outlet': - out = SwitchHomekitOutletExport(itemId, label, stateTopic, stateFeedbackTopic) + homekitOut = SwitchHomekitOutletExport(itemId, label, stateTopic, stateFeedbackTopic) break default: throw new Error(`no homekit export function for type ${type}`) } - return out + + let openhabOut : string = SwitchOpenHABExport(itemId, label, stateTopic, stateFeedbackTopic) + + return { 'homekit': homekitOut, 'openhab': openhabOut } } @@ -57,4 +65,10 @@ function SwitchHomekitOutletExport(id: string, label: string, setOn: string, sta "config": {} } return { 'id': id, 'object': o } -} \ No newline at end of file +} + + +function SwitchOpenHABExport(id: string, label: string, setOn: string, statusOn: string): string { + // Switch windowLightKitchen {mqtt=">[localbroker:nodered/items/windowLightKitchen:command:*:default]", mqtt="<[localbroker:nodered/items/windowLightKitchen/feedback:state:default]"} + return `Switch ${id} {mqtt=">[localbroker:${setOn}:command:*:default]", mqtt="<[localbroker:${statusOn}:state:default]"}` +} \ No newline at end of file diff --git a/src/HomematicSwitchItem.ts b/src/HomematicSwitchItem.ts index 8dd46da..bff6eb3 100644 --- a/src/HomematicSwitchItem.ts +++ b/src/HomematicSwitchItem.ts @@ -1,7 +1,7 @@ import * as logger from './log' import { mqttHandler } from './MqttDispatcher' import { AHomematicItem } from './AHomematicItem' -import { SwitchHomekitExport, HomekitExportType } from './Export' +import { SwitchExport, ExportType } from './Export' export class HomematicSwitchItem extends AHomematicItem { private oldState: string|undefined @@ -27,8 +27,8 @@ export class HomematicSwitchItem extends AHomematicItem { this.type = type } - exportHomekit() : HomekitExportType { - return SwitchHomekitExport(this.itemId, this.label, this.stateTopic, this.stateFeedbackTopic, this.type) + exportItem() : ExportType|null { + return SwitchExport(this.itemId, this.label, this.stateTopic, this.stateFeedbackTopic, this.type) } processMessage(topic: string, payload: string) : void { diff --git a/src/M433SwitchItem.ts b/src/M433SwitchItem.ts index 755223f..7c35cea 100644 --- a/src/M433SwitchItem.ts +++ b/src/M433SwitchItem.ts @@ -1,7 +1,7 @@ import * as logger from './log' import { mqttHandler } from './MqttDispatcher' import { AItem } from './AItem' -import { SwitchHomekitExport, HomekitExportType } from './Export' +import { SwitchExport, ExportType } from './Export' export class M433SwitchItem extends AItem { @@ -27,8 +27,8 @@ export class M433SwitchItem extends AItem { this.type = type } - exportHomekit() : HomekitExportType { - return SwitchHomekitExport(this.itemId, this.label, this.stateTopic, this.stateFeedbackTopic, this.type) + exportItem() : ExportType|null { + return SwitchExport(this.itemId, this.label, this.stateTopic, this.stateFeedbackTopic, this.type) } processMessage(topic: string, payload: string) { diff --git a/src/main.ts b/src/main.ts index 4db9fa3..e812153 100644 --- a/src/main.ts +++ b/src/main.ts @@ -5,7 +5,7 @@ import * as logger from './log' import { mqttHandler } from './MqttDispatcher' import { AItem } from './AItem' -import { HomekitExportType } from './Export' +import { HomekitExportType, ExportType } from './Export' import { M433SwitchItem } from './M433SwitchItem' import { HomematicFourButtonThing, HomematicFourButtonSingleItem } from './HomematicFourButtonThing' import { DimmerAdaptor } from './DimmerAdaptor' @@ -164,15 +164,19 @@ testForwarder.start() // ---------------------------------------------------------------------------------------------------------- // Homekit export let homekitObject : { [key:string]:{} } = {} +let openhabList : string[] = [] allLabeledItems.forEach((item: AItem) => { - let homekitExport : HomekitExportType = item.exportHomekit() - if ('id' in homekitExport) { - homekitObject[homekitExport['id']] = homekitExport['object'] + let exportData : ExportType|null = item.exportItem() + if (exportData != null) { + if ('id' in exportData['homekit']) { + homekitObject[exportData['homekit']['id']] = exportData['homekit']['object'] + } + openhabList.push(exportData['openhab']) } }) fs.writeFileSync(config.dict.homekitFile, JSON.stringify(homekitObject, null, 4)) - +fs.writeFileSync(config.dict.openhabItemFile, openhabList.join('\n')) // ---------------------------------------------------------------------------------------------------------- mqttHandler.exec()