diff --git a/config.schema.json b/config.schema.json index b8c39af..738f89f 100644 --- a/config.schema.json +++ b/config.schema.json @@ -61,6 +61,22 @@ } ] }, + "ipProvider": { + "title": "IP Provider", + "type": "string", + "required": true, + "default": "default", + "oneOf": [ + { + "title": "ipify.org", + "enum": ["ipify"] + }, + { + "title": "ipinfo.io", + "enum": ["ipinfo"] + } + ] + }, "hostname": { "title": "Hostname", "type": "string" @@ -155,6 +171,7 @@ "devices[].username", "devices[].password", "devices[].ipv4or6", + "devices[].ipProvider", "devices[].firmware", "devices[].refreshRate", "devices[].logging" diff --git a/src/devices/contactsensor.ts b/src/devices/contactsensor.ts index 7a1ad06..41797ef 100644 --- a/src/devices/contactsensor.ts +++ b/src/devices/contactsensor.ts @@ -84,8 +84,9 @@ export class ContactSensor extends deviceBase { */ async refreshStatus() { try { - const ip = this.device.ipv4or6 === 'ipv6' ? this.platform.publicIPv6 : this.platform.publicIPv4 + const ip = this.device.ipv4or6 === 'ipv6' ? await this.platform.publicIPv6(this.device) : await this.platform.publicIPv4(this.device) const ipv4or6 = this.device.ipv4or6 === 'ipv6' ? 'IPv6' : 'IPv4' + const ipProvider = this.device.ipProvider === 'ipify' ? 'ipify.org' : 'ipinfo.io' const { body, statusCode } = await request('https://dynupdate.no-ip.com/nic/update', { method: 'GET', query: { @@ -99,7 +100,7 @@ export class ContactSensor extends deviceBase { }) const response = await body.text() await this.debugWarnLog(`statusCode: ${JSON.stringify(statusCode)}`) - await this.debugLog(`${ipv4or6} respsonse: ${JSON.stringify(response)}`) + await this.debugLog(`${ipProvider} ${ipv4or6} respsonse: ${JSON.stringify(response)}`) // this.response = await this.platform.axios.get('https://dynupdate.no-ip.com/nic/update', this.options); const data = response.trim() diff --git a/src/platform.ts b/src/platform.ts index 5178a84..e242f12 100644 --- a/src/platform.ts +++ b/src/platform.ts @@ -72,8 +72,7 @@ export class NoIPPlatform implements DynamicPlatformPlugin { await this.verifyConfig() await this.debugLog('Config OK') } catch (e: any) { - await this.errorLog(`Verify Config, Error Message: ${e.message}, Submit Bugs Here: https://bit.ly/homebridge-noip-bug-report`) - this.debugErrorLog(`Verify Config, Error: ${e}`) + await this.errorLog(`Verify Config, Error Message: ${e.message ?? e}, Submit Bugs Here: https://bit.ly/homebridge-noip-bug-report`) } })() @@ -87,8 +86,7 @@ export class NoIPPlatform implements DynamicPlatformPlugin { try { await this.discoverDevices() } catch (e: any) { - await this.errorLog(`Failed to Discover Devices ${JSON.stringify(e.message)}`) - this.debugErrorLog(`Failed to Discover, Error: ${e}`) + await this.errorLog(`Failed to Discover Devices ${JSON.stringify(e.message ?? e)}`) } }) } @@ -175,7 +173,7 @@ export class NoIPPlatform implements DynamicPlatformPlugin { ? await this.validateAndCleanDisplayName(device.configDeviceName, 'configDeviceName', device.userDefinedDeviceName) : await this.validateAndCleanDisplayName(hostname, 'hostname', hostname) - existingAccessory.context.serialNumber = device.ipv4or6 === 'ipv6' ? this.publicIPv6 : this.publicIPv4 + existingAccessory.context.serialNumber = device.ipv4or6 === 'ipv6' ? await this.publicIPv6(device) : await this.publicIPv4(device) existingAccessory.context.model = 'DUC' existingAccessory.context.version = await this.getVersion() this.api.updatePlatformAccessories([existingAccessory]) @@ -199,7 +197,7 @@ export class NoIPPlatform implements DynamicPlatformPlugin { accessory.displayName = device.configDeviceName ? await this.validateAndCleanDisplayName(device.configDeviceName, 'configDeviceName', device.userDefinedDeviceName) : await this.validateAndCleanDisplayName(hostname, 'hostname', hostname) - accessory.context.serialNumber = device.ipv4or6 === 'ipv6' ? this.publicIPv6 : this.publicIPv4 + accessory.context.serialNumber = device.ipv4or6 === 'ipv6' ? await this.publicIPv6(device) : await this.publicIPv4(device) accessory.context.model = 'DUC' accessory.context.version = await this.getVersion() // the accessory does not yet exist, so we need to create it @@ -223,17 +221,14 @@ export class NoIPPlatform implements DynamicPlatformPlugin { await this.warnLog(`Removing existing accessory from cache: ${existingAccessory.displayName}`) } - async publicIPv4() { + async publicIPv4(device: devicesConfig) { try { - const { body, statusCode, headers } = await request('https://ipinfo.io/json', { + const { body, statusCode } = await request(device.ipProvider === 'ipify' ? 'https://api.ipify.org?format=json' : 'https://ipinfo.io/json', { method: 'GET', }) const pubIp: any = await body.json() - this.debugWarnLog(`IPv4 Address: ${JSON.stringify(pubIp.ip)}`) - this.debugWarnLog(`Status Code: ${JSON.stringify(statusCode)}`) - this.debugWarnLog(`Headers: ${JSON.stringify(headers)}`) - // const pubIp = (await axios.get('https://ipinfo.io/json')).data; - // await this.debugLog(JSON.stringify(pubIp)); + this.debugSuccessLog(`IPv4 Address: ${JSON.stringify(pubIp.ip)}`) + this.debugSuccessLog(`Status Code: ${JSON.stringify(statusCode)}`) const IPv4 = pubIp.ip return IPv4 } catch { @@ -241,17 +236,14 @@ export class NoIPPlatform implements DynamicPlatformPlugin { } } - async publicIPv6() { + async publicIPv6(device: devicesConfig) { try { - const { body, statusCode, headers } = await request('https://v6.ipinfo.io/json', { + const { body, statusCode } = await request(device.ipProvider === 'ipify' ? 'https://api64.ipify.org?format=json' : 'https://v6.ipinfo.io/json', { method: 'GET', }) const pubIp: any = await body.json() - this.debugWarnLog(`IPv6 Address: ${JSON.stringify(pubIp.ip)}`) - this.debugWarnLog(`Status Code: ${JSON.stringify(statusCode)}`) - this.debugWarnLog(`Headers: ${JSON.stringify(headers)}`) - // const pubIp = (await axios.get('https://ipinfo.io/json')).data; - // await this.debugLog(JSON.stringify(pubIp)); + this.debugSuccessLog(`IPv6 Address: ${JSON.stringify(pubIp.ip)}`) + this.debugSuccessLog(`Status Code: ${JSON.stringify(statusCode)}`) const IPv6 = pubIp.ip return IPv6 } catch { diff --git a/src/settings.ts b/src/settings.ts index 1c0143f..d46814a 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -26,6 +26,7 @@ export interface devicesConfig { username?: string password?: string ipv4or6?: string + ipProvider?: string firmware: string refreshRate?: number updateRate?: number