Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,7 @@ package-lock.json
.idea
/node_modules/
/cli/homeymatic-cli


# Added by Homey CLI
/.homeybuild/
5 changes: 4 additions & 1 deletion .homeycompose/app.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,5 +48,8 @@
"path": "/bridges/delete/",
"public": false
}
}
},
"platforms": [
"local"
]
}
148 changes: 82 additions & 66 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,30 +6,46 @@ const HomeMaticCCUMQTT = require('./lib/HomeMaticCCUMQTT');
const HomeMaticCCURPC = require('./lib/HomeMaticCCURPC');
const HomeMaticCCUJack = require('./lib/HomeMaticCCUJack');
const Constants = require('./lib/constants');
const Logger = require('./lib/logger')
const Logger = require('./lib/logger');

const connTypeRPC = 'use_rpc'
const connTypeMQTT = 'use_mqtt'
const connTypeCCUJack = 'use_ccu_jack'
const connTypeRPC = 'use_rpc';
const connTypeMQTT = 'use_mqtt';
const connTypeCCUJack = 'use_ccu_jack';

class Homematic extends Homey.App {

async onInit() {
this.logger = new Logger(this.homey);
this.logger.log('info', 'Started homematic...');
var self = this;
let address = await this.homey.cloud.getLocalAddress()
self.homeyIP = address.split(':')[0]
self.settings = self.getSettings();
self.discovery = new HomeMaticDiscovery(this.logger, this.homey);
self.bridges = {};
if (this.homey.app.settings.use_stored_bridges) {
self.initializeStoredBridges();
} else {
await self.discovery.discover()

try {
const address = await this.homey.cloud.getLocalAddress();
this.homeyIP = address.split(':')[0];
this.settings = this.getSettings();
this.discovery = new HomeMaticDiscovery(this.logger, this.homey);
this.bridges = {};

const storedBridges = this.getStoredBridges();
if (Object.keys(storedBridges).length > 0) {
this.logger.log('info', 'Initializing stored bridges...');
this.initializeStoredBridges(storedBridges);
} else {
await this.discovery.discover();
}
} catch (err) {
this.logger.log('error', 'Initialization failed:', err);
}
}

async onUninit() {
this.logger.log('info', 'Unloading homematic app...');
Object.keys(this.bridges).forEach(serial => {
if (this.bridges[serial].cleanup) {
this.bridges[serial].cleanup();
}
});
}

getSettings() {
return {
"use_mqtt": this.homey.settings.get('use_mqtt'),
Expand All @@ -38,91 +54,91 @@ class Homematic extends Homey.App {
"ccu_jack_user": this.homey.settings.get('ccu_jack_user'),
"ccu_jack_password": this.homey.settings.get('ccu_jack_password'),
"use_stored_bridges": this.homey.settings.get('use_stored_bridges'),
}
};
}

getStoredBridges() {
var self = this;
var bridges = {};
const bridges = {};
this.homey.settings.getKeys().forEach((key) => {
if (key.startsWith(Constants.SETTINGS_PREFIX_BRIDGE)) {
let bridge = this.homey.settings.get(key);
bridges[bridge.serial] = bridge
bridges[bridge.serial] = bridge;
}
})

return bridges
});
return bridges;
}

initializeStoredBridges() {
var self = this;
var bridges = this.getStoredBridges();
initializeStoredBridges(bridges) {
Object.keys(bridges).forEach((serial) => {
let bridge = bridges[serial];
self.logger.log('info', "Initializing stored ccu:", "Type", bridge.type, "Serial", bridge.serial, "IP", bridge.address);
self.initializeBridge(bridge)
this.logger.log('info', "Initializing stored CCU:", "Type", bridge.type, "Serial", bridge.serial, "IP", bridge.address);
this.initializeBridge(bridge);
});
}

getConnectionType() {
if (this.homey.app.settings.connection_type) {
return this.homey.app.settings.connection_type
if (this.settings.connection_type) {
return this.settings.connection_type;
}
if (this.homey.app.settings.use_mqtt === true) {
return connTypeMQTT
if (this.settings.use_mqtt) {
return connTypeMQTT;
}
return connTypeRPC
return connTypeRPC;
}

initializeBridge(bridge) {
let self = this;
let connType = self.getConnectionType()
self.logger.log('info', 'Connection type:', connType)
switch (connType) {
case connTypeRPC:
self.logger.log('info', "Initializing RPC CCU");
self.bridges[bridge.serial] = new HomeMaticCCURPC(self.logger, self.homey, bridge.type, bridge.serial, bridge.address);
break;
case connTypeMQTT:
self.logger.log('info', "Initializing MQTT CCU ");
self.bridges[bridge.serial] = new HomeMaticCCUMQTT(self.logger, self.homey, bridge.type, bridge.serial, bridge.address);
break;
case connTypeCCUJack:
self.logger.log('info', "Initializing CCU Jack");
self.bridges[bridge.serial] = new HomeMaticCCUJack(
self.logger,
self.homey,
bridge.type,
bridge.serial,
bridge.address,
this.homey.app.settings.ccu_jack_mqtt_port,
this.homey.app.settings.ccu_jack_user,
this.homey.app.settings.ccu_jack_password,
);
break;
try {
const connType = this.getConnectionType();
this.logger.log('info', 'Connection type:', connType);
switch (connType) {
case connTypeRPC:
this.logger.log('info', "Initializing RPC CCU");
this.bridges[bridge.serial] = new HomeMaticCCURPC(this.logger, this.homey, bridge.type, bridge.serial, bridge.address);
break;
case connTypeMQTT:
this.logger.log('info', "Initializing MQTT CCU ");
this.bridges[bridge.serial] = new HomeMaticCCUMQTT(this.logger, this.homey, bridge.type, bridge.serial, bridge.address);
break;
case connTypeCCUJack:
this.logger.log('info', "Initializing CCU Jack");
this.bridges[bridge.serial] = new HomeMaticCCUJack(
this.logger,
this.homey,
bridge.type,
bridge.serial,
bridge.address,
this.settings.ccu_jack_mqtt_port,
this.settings.ccu_jack_user,
this.settings.ccu_jack_password,
);
break;
default:
throw new Error(`Unsupported connection type: ${connType}`);
}
return this.bridges[bridge.serial];
} catch (err) {
this.logger.log('error', `Failed to initialize bridge ${bridge.serial}:`, err);
}

return self.bridges[bridge.serial]
}

setBridgeAddress(serial, address) {
var self = this;
self.bridges[serial].address = address;
if (this.bridges[serial]) {
this.bridges[serial].address = address;
} else {
this.logger.log('error', `No bridge found for serial: ${serial}`);
}
}

deleteStoredBridges() {
var self = this;
var bridges = this.getStoredBridges()
const bridges = this.getStoredBridges();
Object.keys(bridges).forEach((serial) => {
this.homey.settings.unset(Constants.SETTINGS_PREFIX_BRIDGE + serial)
})
this.homey.settings.unset(Constants.SETTINGS_PREFIX_BRIDGE + serial);
});
}

getLogLines() {
return this.logger.getLogLines();
}

}


module.exports = Homematic;
91 changes: 91 additions & 0 deletions app.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@
"public": false
}
},
"platforms": [
"local"
],
"drivers": [
{
"id": "HM-CC-RT-DN",
Expand Down Expand Up @@ -9147,6 +9150,94 @@
}
]
},
{
"id": "HmIP-SWO-B",
"name": {
"en": "HmIP-SWO-B"
},
"class": "sensor",
"capabilities": [],
"images": {
"large": "/drivers/HmIP-SWO-B/assets/images/large.png",
"small": "/drivers/HmIP-SWO-B/assets/images/small.png"
},
"pair": [
{
"id": "list_bridges",
"template": "list_devices",
"options": {
"singular": true
},
"navigation": {
"next": "list_devices"
}
},
{
"id": "list_devices",
"template": "list_devices",
"navigation": {
"next": "add_devices"
}
},
{
"id": "add_devices",
"template": "add_devices"
}
],
"settings": [
{
"type": "group",
"label": {
"en": "Device data"
},
"children": [
{
"id": "app",
"type": "label",
"label": {
"en": "App"
},
"value": "Homematic"
},
{
"id": "driver",
"type": "label",
"label": {
"en": "Driver"
},
"value": "",
"hint": {
"en": "In most cases the driver name is the same as the device type, but some drivers support multiple device types. In those cases they might not match."
}
},
{
"id": "address",
"type": "label",
"label": {
"en": "Device Address"
},
"value": ""
},
{
"id": "ccuIP",
"type": "label",
"label": {
"en": "CCU IP"
},
"value": ""
},
{
"id": "ccuSerial",
"type": "text",
"label": {
"en": "CCU Serial"
},
"value": ""
}
]
}
]
},
{
"id": "HmIP-SWO-PR",
"name": {
Expand Down
Loading