mirror of
https://github.com/adrianjagielak/home-assistant-futurehome.git
synced 2025-10-04 18:57:10 +00:00
Compare commits
13 Commits
7e3d56cec1
...
31d293974c
Author | SHA1 | Date | |
---|---|---|---|
|
31d293974c | ||
|
e09f84058e | ||
|
a76ebf360b | ||
|
aa74ff9f10 | ||
|
0c64d5e2da | ||
|
c611be58de | ||
|
f25c437ed3 | ||
|
e9caeb3656 | ||
|
4948d2abbe | ||
|
57124f6b4c | ||
|
d57edc66b2 | ||
|
2681761a69 | ||
|
785864ae03 |
8
.github/workflows/builder.yaml
vendored
8
.github/workflows/builder.yaml
vendored
@ -21,7 +21,7 @@ jobs:
|
|||||||
changed: ${{ steps.changed_addons.outputs.changed }}
|
changed: ${{ steps.changed_addons.outputs.changed }}
|
||||||
steps:
|
steps:
|
||||||
- name: Check out the repository
|
- name: Check out the repository
|
||||||
uses: actions/checkout@v4.2.2
|
uses: actions/checkout@v5.0.0
|
||||||
|
|
||||||
- name: Get changed files
|
- name: Get changed files
|
||||||
id: changed_files
|
id: changed_files
|
||||||
@ -71,7 +71,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Check out repository
|
- name: Check out repository
|
||||||
uses: actions/checkout@v4.2.2
|
uses: actions/checkout@v5.0.0
|
||||||
|
|
||||||
- name: Get information
|
- name: Get information
|
||||||
id: info
|
id: info
|
||||||
@ -98,7 +98,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Login to GitHub Container Registry
|
- name: Login to GitHub Container Registry
|
||||||
if: env.BUILD_ARGS != '--test'
|
if: env.BUILD_ARGS != '--test'
|
||||||
uses: docker/login-action@v3.4.0
|
uses: docker/login-action@v3.5.0
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.repository_owner }}
|
username: ${{ github.repository_owner }}
|
||||||
@ -106,7 +106,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Build ${{ matrix.addon }} add-on
|
- name: Build ${{ matrix.addon }} add-on
|
||||||
if: steps.check.outputs.build_arch == 'true'
|
if: steps.check.outputs.build_arch == 'true'
|
||||||
uses: home-assistant/builder@2025.03.0
|
uses: home-assistant/builder@2025.09.0
|
||||||
with:
|
with:
|
||||||
args: |
|
args: |
|
||||||
${{ env.BUILD_ARGS }} \
|
${{ env.BUILD_ARGS }} \
|
||||||
|
4
.github/workflows/lint.yaml
vendored
4
.github/workflows/lint.yaml
vendored
@ -18,7 +18,7 @@ jobs:
|
|||||||
addons: ${{ steps.addons.outputs.addons_list }}
|
addons: ${{ steps.addons.outputs.addons_list }}
|
||||||
steps:
|
steps:
|
||||||
- name: ⤵️ Check out code from GitHub
|
- name: ⤵️ Check out code from GitHub
|
||||||
uses: actions/checkout@v4.2.2
|
uses: actions/checkout@v5.0.0
|
||||||
|
|
||||||
- name: 🔍 Find add-on directories
|
- name: 🔍 Find add-on directories
|
||||||
id: addons
|
id: addons
|
||||||
@ -33,7 +33,7 @@ jobs:
|
|||||||
path: ${{ fromJson(needs.find.outputs.addons) }}
|
path: ${{ fromJson(needs.find.outputs.addons) }}
|
||||||
steps:
|
steps:
|
||||||
- name: ⤵️ Check out code from GitHub
|
- name: ⤵️ Check out code from GitHub
|
||||||
uses: actions/checkout@v4.2.2
|
uses: actions/checkout@v5.0.0
|
||||||
|
|
||||||
- name: 🚀 Run Home Assistant Add-on Lint
|
- name: 🚀 Run Home Assistant Add-on Lint
|
||||||
uses: frenck/action-addon-linter@v2.18
|
uses: frenck/action-addon-linter@v2.18
|
||||||
|
@ -7,6 +7,8 @@ Futurehome add-on for Home Assistant. Designed to be a complete drop-in replacem
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
[Watch the official add-on demo video](https://www.youtube.com/watch?v=dmEy6R49CC0)
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
This add-on:
|
This add-on:
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
4. **Enable MQTT Integration**
|
4. **Enable MQTT Integration**
|
||||||
|
|
||||||
In Home Assistant, go to **Settings > Devices & Services > Integrations** and enable **MQTT**.
|
Add the MQTT integration by going to **Settings → Devices & Services → Integrations → Add integration**, search for and select **MQTT → MQTT**, then choose **"Use the official Mosquitto MQTT Broker add-on"**.
|
||||||
|
|
||||||
5. **Install the Futurehome Add-on**
|
5. **Install the Futurehome Add-on**
|
||||||
|
|
||||||
|
@ -1,5 +1,20 @@
|
|||||||
<!-- https://developers.home-assistant.io/docs/add-ons/presentation#keeping-a-changelog -->
|
<!-- https://developers.home-assistant.io/docs/add-ons/presentation#keeping-a-changelog -->
|
||||||
|
|
||||||
|
## 1.1.2 (24.09.2025)
|
||||||
|
|
||||||
|
- Bumped dependencies (#1, #2, #6).
|
||||||
|
|
||||||
|
## 1.1.1 (24.09.2025)
|
||||||
|
|
||||||
|
- Added error handling for invalid FIMP messages.
|
||||||
|
- Updated installation.md - clarified that users must select the MQTT Integration instead of the hub’s MQTT server, with step-by-step guidance provided (@Andbli).
|
||||||
|
|
||||||
|
## 1.1.0 (24.09.2025)
|
||||||
|
|
||||||
|
- Stop inclusion/exclusion after the first device is added/removed, just like in the official app.
|
||||||
|
- Add configuration checkbox for allowing empty Thingsplex credentials (#3).
|
||||||
|
- Improved GUI security by hiding passwords by default (#4, #5) (thanks @Andbli !).
|
||||||
|
|
||||||
## 1.0.2 (16.09.2025)
|
## 1.0.2 (16.09.2025)
|
||||||
|
|
||||||
- Added logging the initial devices response.
|
- Added logging the initial devices response.
|
||||||
|
@ -6,6 +6,8 @@ Futurehome add-on for Home Assistant. Designed to be a complete drop-in replacem
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
[Watch the official add-on demo video](https://www.youtube.com/watch?v=dmEy6R49CC0)
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
This add-on:
|
This add-on:
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# https://developers.home-assistant.io/docs/add-ons/configuration#add-on-config
|
# https://developers.home-assistant.io/docs/add-ons/configuration#add-on-config
|
||||||
name: Futurehome
|
name: Futurehome
|
||||||
version: '1.0.2'
|
version: '1.1.2'
|
||||||
slug: futurehome
|
slug: futurehome
|
||||||
description: Local Futurehome Smarthub integration
|
description: Local Futurehome Smarthub integration
|
||||||
url: 'https://github.com/adrianjagielak/home-assistant-futurehome'
|
url: 'https://github.com/adrianjagielak/home-assistant-futurehome'
|
||||||
@ -21,15 +21,17 @@ options:
|
|||||||
fh_password: ''
|
fh_password: ''
|
||||||
tp_username: ''
|
tp_username: ''
|
||||||
tp_password: ''
|
tp_password: ''
|
||||||
|
tp_allow_empty: false
|
||||||
demo_mode: false
|
demo_mode: false
|
||||||
show_debug_log: false
|
show_debug_log: false
|
||||||
|
|
||||||
schema:
|
schema:
|
||||||
hub_ip: 'str?'
|
hub_ip: 'str?'
|
||||||
fh_username: 'str?'
|
fh_username: 'str?'
|
||||||
fh_password: 'str?'
|
fh_password: 'password?'
|
||||||
tp_username: 'str?'
|
tp_username: 'str?'
|
||||||
tp_password: 'str?'
|
tp_password: 'password?'
|
||||||
|
tp_allow_empty: 'bool?'
|
||||||
demo_mode: 'bool?'
|
demo_mode: 'bool?'
|
||||||
show_debug_log: 'bool?'
|
show_debug_log: 'bool?'
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@ export FH_USERNAME=$(bashio::config 'fh_username')
|
|||||||
export FH_PASSWORD=$(bashio::config 'fh_password')
|
export FH_PASSWORD=$(bashio::config 'fh_password')
|
||||||
export TP_USERNAME=$(bashio::config 'tp_username')
|
export TP_USERNAME=$(bashio::config 'tp_username')
|
||||||
export TP_PASSWORD=$(bashio::config 'tp_password')
|
export TP_PASSWORD=$(bashio::config 'tp_password')
|
||||||
|
export TP_ALLOW_EMPTY=$(bashio::config 'tp_allow_empty')
|
||||||
export DEMO_MODE=$(bashio::config 'demo_mode')
|
export DEMO_MODE=$(bashio::config 'demo_mode')
|
||||||
export SHOW_DEBUG_LOG=$(bashio::config 'show_debug_log')
|
export SHOW_DEBUG_LOG=$(bashio::config 'show_debug_log')
|
||||||
|
|
||||||
|
@ -82,7 +82,24 @@ export async function sendFimpMsg({
|
|||||||
}, timeoutMs);
|
}, timeoutMs);
|
||||||
|
|
||||||
const onResponse = (topic: string, buffer: any) => {
|
const onResponse = (topic: string, buffer: any) => {
|
||||||
const msg = JSON.parse(buffer.toString());
|
let bufferToString;
|
||||||
|
try {
|
||||||
|
bufferToString = buffer.toString();
|
||||||
|
} catch (e) {
|
||||||
|
log.warn('Invalid message received from hub MQTT broker', e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let msg;
|
||||||
|
try {
|
||||||
|
msg = JSON.parse(bufferToString);
|
||||||
|
} catch (e) {
|
||||||
|
log.warn(
|
||||||
|
`Invalid FIMP message received from hub MQTT broker\nMessage: ${bufferToString}`,
|
||||||
|
e,
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (msg.corid === uid) {
|
if (msg.corid === uid) {
|
||||||
if (msg.type === 'evt.error.report') {
|
if (msg.type === 'evt.error.report') {
|
||||||
|
@ -400,12 +400,150 @@ export function handleExclusionStatusReport(hubId: string, msg: FimpResponse) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function handleInclusionReport() {
|
export async function handleInclusionReport(parameters: {
|
||||||
|
hubId: string;
|
||||||
|
demoMode: boolean;
|
||||||
|
hubIp: string;
|
||||||
|
thingsplexUsername: string;
|
||||||
|
thingsplexPassword: string;
|
||||||
|
thingsplexAllowEmpty: boolean;
|
||||||
|
}) {
|
||||||
|
const topicPrefix = `homeassistant/device/futurehome_${parameters.hubId}_hub`;
|
||||||
|
|
||||||
pollVinculum('device').catch((e) => log.warn('Failed to request devices', e));
|
pollVinculum('device').catch((e) => log.warn('Failed to request devices', e));
|
||||||
pollVinculum('state').catch((e) => log.warn('Failed to request state', e));
|
pollVinculum('state').catch((e) => log.warn('Failed to request state', e));
|
||||||
|
|
||||||
|
if (parameters.demoMode) {
|
||||||
|
ha?.publish(`${topicPrefix}/inclusion_exclusion_status/state`, 'Done', {
|
||||||
|
retain: true,
|
||||||
|
qos: 2,
|
||||||
|
});
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function handleExclusionReport() {
|
if (
|
||||||
|
!parameters.thingsplexAllowEmpty &&
|
||||||
|
!parameters.thingsplexUsername &&
|
||||||
|
!parameters.thingsplexPassword
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const token = await loginToThingsplex({
|
||||||
|
host: parameters.hubIp,
|
||||||
|
username: parameters.thingsplexUsername,
|
||||||
|
password: parameters.thingsplexPassword,
|
||||||
|
});
|
||||||
|
await connectThingsplexWebSocketAndSend(
|
||||||
|
{
|
||||||
|
host: parameters.hubIp,
|
||||||
|
token: token,
|
||||||
|
},
|
||||||
|
[
|
||||||
|
{
|
||||||
|
address: 'pt:j1/mt:cmd/rt:ad/rn:zigbee/ad:1',
|
||||||
|
service: 'zigbee',
|
||||||
|
cmd: 'cmd.thing.inclusion',
|
||||||
|
val: false,
|
||||||
|
val_t: 'bool',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
address: 'pt:j1/mt:cmd/rt:ad/rn:zw/ad:1',
|
||||||
|
service: 'zwave-ad',
|
||||||
|
cmd: 'cmd.thing.inclusion',
|
||||||
|
val: false,
|
||||||
|
val_t: 'bool',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
);
|
||||||
|
ha?.publish(`${topicPrefix}/inclusion_exclusion_status/state`, 'Done', {
|
||||||
|
retain: true,
|
||||||
|
qos: 2,
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
log.error('Failed trying to stop inclusion/exclusion', e);
|
||||||
|
ha?.publish(
|
||||||
|
`${topicPrefix}/inclusion_exclusion_status/state`,
|
||||||
|
'Failed trying to stop inclusion/exclusion.',
|
||||||
|
{
|
||||||
|
retain: true,
|
||||||
|
qos: 2,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function handleExclusionReport(parameters: {
|
||||||
|
hubId: string;
|
||||||
|
demoMode: boolean;
|
||||||
|
hubIp: string;
|
||||||
|
thingsplexUsername: string;
|
||||||
|
thingsplexPassword: string;
|
||||||
|
thingsplexAllowEmpty: boolean;
|
||||||
|
}) {
|
||||||
|
const topicPrefix = `homeassistant/device/futurehome_${parameters.hubId}_hub`;
|
||||||
|
|
||||||
pollVinculum('device').catch((e) => log.warn('Failed to request devices', e));
|
pollVinculum('device').catch((e) => log.warn('Failed to request devices', e));
|
||||||
pollVinculum('state').catch((e) => log.warn('Failed to request state', e));
|
pollVinculum('state').catch((e) => log.warn('Failed to request state', e));
|
||||||
|
|
||||||
|
if (parameters.demoMode) {
|
||||||
|
ha?.publish(`${topicPrefix}/inclusion_exclusion_status/state`, 'Done', {
|
||||||
|
retain: true,
|
||||||
|
qos: 2,
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
!parameters.thingsplexAllowEmpty &&
|
||||||
|
!parameters.thingsplexUsername &&
|
||||||
|
!parameters.thingsplexPassword
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const token = await loginToThingsplex({
|
||||||
|
host: parameters.hubIp,
|
||||||
|
username: parameters.thingsplexUsername,
|
||||||
|
password: parameters.thingsplexPassword,
|
||||||
|
});
|
||||||
|
await connectThingsplexWebSocketAndSend(
|
||||||
|
{
|
||||||
|
host: parameters.hubIp,
|
||||||
|
token: token,
|
||||||
|
},
|
||||||
|
[
|
||||||
|
{
|
||||||
|
address: 'pt:j1/mt:cmd/rt:ad/rn:zigbee/ad:1',
|
||||||
|
service: 'zigbee',
|
||||||
|
cmd: 'cmd.thing.exclusion',
|
||||||
|
val: false,
|
||||||
|
val_t: 'bool',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
address: 'pt:j1/mt:cmd/rt:ad/rn:zw/ad:1',
|
||||||
|
service: 'zwave-ad',
|
||||||
|
cmd: 'cmd.thing.exclusion',
|
||||||
|
val: false,
|
||||||
|
val_t: 'bool',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
);
|
||||||
|
ha?.publish(`${topicPrefix}/inclusion_exclusion_status/state`, 'Done', {
|
||||||
|
retain: true,
|
||||||
|
qos: 2,
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
log.error('Failed trying to stop inclusion/exclusion', e);
|
||||||
|
ha?.publish(
|
||||||
|
`${topicPrefix}/inclusion_exclusion_status/state`,
|
||||||
|
'Failed trying to stop inclusion/exclusion.',
|
||||||
|
{
|
||||||
|
retain: true,
|
||||||
|
qos: 2,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -208,6 +208,7 @@ export function haPublishDevice(parameters: {
|
|||||||
deviceInclusionReport: InclusionReport | undefined;
|
deviceInclusionReport: InclusionReport | undefined;
|
||||||
thingsplexUsername: string;
|
thingsplexUsername: string;
|
||||||
thingsplexPassword: string;
|
thingsplexPassword: string;
|
||||||
|
thingsplexAllowEmpty: boolean;
|
||||||
}): { commandHandlers: CommandHandlers } {
|
}): { commandHandlers: CommandHandlers } {
|
||||||
const components: { [key: string]: HaMqttComponent } = {};
|
const components: { [key: string]: HaMqttComponent } = {};
|
||||||
const handlers: CommandHandlers = {};
|
const handlers: CommandHandlers = {};
|
||||||
@ -261,8 +262,8 @@ export function haPublishDevice(parameters: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
parameters.thingsplexUsername &&
|
(parameters.thingsplexAllowEmpty ||
|
||||||
parameters.thingsplexPassword &&
|
(parameters.thingsplexUsername && parameters.thingsplexPassword)) &&
|
||||||
parameters.vinculumDeviceData.fimp?.address &&
|
parameters.vinculumDeviceData.fimp?.address &&
|
||||||
parameters.vinculumDeviceData.fimp?.adapter
|
parameters.vinculumDeviceData.fimp?.adapter
|
||||||
) {
|
) {
|
||||||
|
@ -22,6 +22,7 @@ import { pollVinculum } from './fimp/vinculum';
|
|||||||
const localApiPassword = process.env.FH_PASSWORD || '';
|
const localApiPassword = process.env.FH_PASSWORD || '';
|
||||||
const thingsplexUsername = process.env.TP_USERNAME || '';
|
const thingsplexUsername = process.env.TP_USERNAME || '';
|
||||||
const thingsplexPassword = process.env.TP_PASSWORD || '';
|
const thingsplexPassword = process.env.TP_PASSWORD || '';
|
||||||
|
const thingsplexAllowEmpty = (process.env.TP_ALLOW_EMPTY || '').toLowerCase().includes('true');
|
||||||
const demoMode = (process.env.DEMO_MODE || '').toLowerCase().includes('true');
|
const demoMode = (process.env.DEMO_MODE || '').toLowerCase().includes('true');
|
||||||
const showDebugLog = (process.env.SHOW_DEBUG_LOG || '')
|
const showDebugLog = (process.env.SHOW_DEBUG_LOG || '')
|
||||||
.toLowerCase()
|
.toLowerCase()
|
||||||
@ -166,6 +167,7 @@ import { pollVinculum } from './fimp/vinculum';
|
|||||||
deviceInclusionReport,
|
deviceInclusionReport,
|
||||||
thingsplexUsername,
|
thingsplexUsername,
|
||||||
thingsplexPassword,
|
thingsplexPassword,
|
||||||
|
thingsplexAllowEmpty,
|
||||||
});
|
});
|
||||||
await delay(50);
|
await delay(50);
|
||||||
|
|
||||||
@ -189,7 +191,7 @@ import { pollVinculum } from './fimp/vinculum';
|
|||||||
log.error('Failed publishing device', device, e);
|
log.error('Failed publishing device', device, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (demoMode || (thingsplexUsername && thingsplexPassword)) {
|
if (demoMode || thingsplexAllowEmpty || (thingsplexUsername && thingsplexPassword)) {
|
||||||
Object.assign(
|
Object.assign(
|
||||||
commandHandlers,
|
commandHandlers,
|
||||||
exposeSmarthubTools({
|
exposeSmarthubTools({
|
||||||
@ -280,12 +282,26 @@ import { pollVinculum } from './fimp/vinculum';
|
|||||||
}
|
}
|
||||||
|
|
||||||
case 'evt.thing.inclusion_report': {
|
case 'evt.thing.inclusion_report': {
|
||||||
handleInclusionReport();
|
handleInclusionReport({
|
||||||
|
hubId,
|
||||||
|
demoMode,
|
||||||
|
hubIp,
|
||||||
|
thingsplexUsername,
|
||||||
|
thingsplexPassword,
|
||||||
|
thingsplexAllowEmpty,
|
||||||
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'evt.thing.exclusion_report': {
|
case 'evt.thing.exclusion_report': {
|
||||||
handleExclusionReport();
|
handleExclusionReport({
|
||||||
|
hubId,
|
||||||
|
demoMode,
|
||||||
|
hubIp,
|
||||||
|
thingsplexUsername,
|
||||||
|
thingsplexPassword,
|
||||||
|
thingsplexAllowEmpty,
|
||||||
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ export function parameters__components(
|
|||||||
const commandHandlers: CommandHandlers = {};
|
const commandHandlers: CommandHandlers = {};
|
||||||
const stateTopic = `${topicPrefix}/state`;
|
const stateTopic = `${topicPrefix}/state`;
|
||||||
|
|
||||||
// Fetch cached state for this service to discover known parameters :contentReference[oaicite:2]{index=2}
|
// Fetch cached state for this service to discover known parameters
|
||||||
const currentState = haGetCachedState({ topic: stateTopic })?.[svc.addr];
|
const currentState = haGetCachedState({ topic: stateTopic })?.[svc.addr];
|
||||||
const paramMap = currentState?.param;
|
const paramMap = currentState?.param;
|
||||||
if (!paramMap) {
|
if (!paramMap) {
|
||||||
@ -31,7 +31,7 @@ export function parameters__components(
|
|||||||
// Single MQTT topic for setting any parameter
|
// Single MQTT topic for setting any parameter
|
||||||
const setParamTopic = `${topicPrefix}${svc.addr}/set_param/command`;
|
const setParamTopic = `${topicPrefix}${svc.addr}/set_param/command`;
|
||||||
|
|
||||||
// Iterate over each parameter in the cached state :contentReference[oaicite:3]{index=3}
|
// Iterate over each parameter in the cached state
|
||||||
for (const [paramId, param] of Object.entries(paramMap)) {
|
for (const [paramId, param] of Object.entries(paramMap)) {
|
||||||
const valueType = (param as any).value_type as string;
|
const valueType = (param as any).value_type as string;
|
||||||
const uniqueId = `${svc.addr}_${paramId}`;
|
const uniqueId = `${svc.addr}_${paramId}`;
|
||||||
|
@ -14,6 +14,9 @@ configuration:
|
|||||||
tp_password:
|
tp_password:
|
||||||
name: Пароль Thingsplex (неабавязкова)
|
name: Пароль Thingsplex (неабавязкова)
|
||||||
description: Ваш пароль для Thingsplex.
|
description: Ваш пароль для Thingsplex.
|
||||||
|
tp_allow_empty:
|
||||||
|
name: Дазволіць пустыя ўліковыя дадзеныя Thingsplex
|
||||||
|
description: Дазволіць пустое імя карыстальніка і/або пароль Thingsplex.
|
||||||
demo_mode:
|
demo_mode:
|
||||||
name: Дэманстрацыйны рэжым
|
name: Дэманстрацыйны рэжым
|
||||||
description: Выкарыстоўвайце запісаны стан з рэальнага Futurehome Smarthub для мадэлявання прылад.
|
description: Выкарыстоўвайце запісаны стан з рэальнага Futurehome Smarthub для мадэлявання прылад.
|
||||||
|
@ -14,6 +14,9 @@ configuration:
|
|||||||
tp_password:
|
tp_password:
|
||||||
name: Пароль Thingsplex (неабавязкова)
|
name: Пароль Thingsplex (неабавязкова)
|
||||||
description: Ваш пароль для Thingsplex.
|
description: Ваш пароль для Thingsplex.
|
||||||
|
tp_allow_empty:
|
||||||
|
name: Дазволіць пустыя ўліковыя дадзеныя Thingsplex
|
||||||
|
description: Дазволіць пустое імя карыстальніка і/або пароль Thingsplex.
|
||||||
demo_mode:
|
demo_mode:
|
||||||
name: Дэманстрацыйны рэжым
|
name: Дэманстрацыйны рэжым
|
||||||
description: Выкарыстоўвайце запісаны стан з рэальнага Futurehome Smarthub для мадэлявання прылад.
|
description: Выкарыстоўвайце запісаны стан з рэальнага Futurehome Smarthub для мадэлявання прылад.
|
||||||
|
@ -14,6 +14,9 @@ configuration:
|
|||||||
tp_password:
|
tp_password:
|
||||||
name: Heslo Thingsplex (volitelné)
|
name: Heslo Thingsplex (volitelné)
|
||||||
description: Vaše heslo pro Thingsplex.
|
description: Vaše heslo pro Thingsplex.
|
||||||
|
tp_allow_empty:
|
||||||
|
name: Povolit prázdné přihlašovací údaje Thingsplex
|
||||||
|
description: Povolit prázdné uživatelské jméno a/nebo heslo Thingsplex.
|
||||||
demo_mode:
|
demo_mode:
|
||||||
name: Demo režim
|
name: Demo režim
|
||||||
description: Použijte uložený stav ze skutečného Futurehome Smarthubu pro simulaci zařízení.
|
description: Použijte uložený stav ze skutečného Futurehome Smarthubu pro simulaci zařízení.
|
||||||
|
@ -14,6 +14,9 @@ configuration:
|
|||||||
tp_password:
|
tp_password:
|
||||||
name: Heslo Thingsplex (volitelné)
|
name: Heslo Thingsplex (volitelné)
|
||||||
description: Vaše heslo pro Thingsplex.
|
description: Vaše heslo pro Thingsplex.
|
||||||
|
tp_allow_empty:
|
||||||
|
name: Povolit prázdné přihlašovací údaje Thingsplex
|
||||||
|
description: Povolit prázdné uživatelské jméno a/nebo heslo Thingsplex.
|
||||||
demo_mode:
|
demo_mode:
|
||||||
name: Demo režim
|
name: Demo režim
|
||||||
description: Použijte uložený stav ze skutečného Futurehome Smarthubu pro simulaci zařízení.
|
description: Použijte uložený stav ze skutečného Futurehome Smarthubu pro simulaci zařízení.
|
||||||
|
@ -14,6 +14,9 @@ configuration:
|
|||||||
tp_password:
|
tp_password:
|
||||||
name: Thingsplex-adgangskode (valgfri)
|
name: Thingsplex-adgangskode (valgfri)
|
||||||
description: Din Thingsplex-adgangskode.
|
description: Din Thingsplex-adgangskode.
|
||||||
|
tp_allow_empty:
|
||||||
|
name: Tillad tomme Thingsplex-legitimationsoplysninger
|
||||||
|
description: Tillad tomt Thingsplex-brugernavn og/eller adgangskode.
|
||||||
demo_mode:
|
demo_mode:
|
||||||
name: Demotilstand
|
name: Demotilstand
|
||||||
description: Brug en optaget prøvetilstand fra en rigtig Futurehome Smarthub til at simulere enheder.
|
description: Brug en optaget prøvetilstand fra en rigtig Futurehome Smarthub til at simulere enheder.
|
||||||
|
@ -14,6 +14,9 @@ configuration:
|
|||||||
tp_password:
|
tp_password:
|
||||||
name: Thingsplex-Passwort (optional)
|
name: Thingsplex-Passwort (optional)
|
||||||
description: Dein Thingsplex-Passwort.
|
description: Dein Thingsplex-Passwort.
|
||||||
|
tp_allow_empty:
|
||||||
|
name: Leere Thingsplex-Anmeldedaten zulassen
|
||||||
|
description: Leeren Thingsplex-Benutzernamen und/oder Passwort zulassen.
|
||||||
demo_mode:
|
demo_mode:
|
||||||
name: Demo-Modus
|
name: Demo-Modus
|
||||||
description: Verwende einen aufgezeichneten Beispielzustand eines echten Futurehome Smarthubs, um Geräte zu simulieren.
|
description: Verwende einen aufgezeichneten Beispielzustand eines echten Futurehome Smarthubs, um Geräte zu simulieren.
|
||||||
|
@ -14,6 +14,9 @@ configuration:
|
|||||||
tp_password:
|
tp_password:
|
||||||
name: Thingsplex-adgangskode (valgfri)
|
name: Thingsplex-adgangskode (valgfri)
|
||||||
description: Din Thingsplex-adgangskode.
|
description: Din Thingsplex-adgangskode.
|
||||||
|
tp_allow_empty:
|
||||||
|
name: Tillad tomme Thingsplex-legitimationsoplysninger
|
||||||
|
description: Tillad tomt Thingsplex-brugernavn og/eller adgangskode.
|
||||||
demo_mode:
|
demo_mode:
|
||||||
name: Demotilstand
|
name: Demotilstand
|
||||||
description: Brug en optaget prøvetilstand fra en rigtig Futurehome Smarthub til at simulere enheder.
|
description: Brug en optaget prøvetilstand fra en rigtig Futurehome Smarthub til at simulere enheder.
|
||||||
|
@ -14,6 +14,9 @@ configuration:
|
|||||||
tp_password:
|
tp_password:
|
||||||
name: Thingsplexi parool (valikuline)
|
name: Thingsplexi parool (valikuline)
|
||||||
description: Sinu Thingsplexi parool.
|
description: Sinu Thingsplexi parool.
|
||||||
|
tp_allow_empty:
|
||||||
|
name: Luba tühjad Thingsplexi mandaadid
|
||||||
|
description: Luba tühi Thingsplexi kasutajanimi ja/või parool.
|
||||||
demo_mode:
|
demo_mode:
|
||||||
name: Demorežiim
|
name: Demorežiim
|
||||||
description: Kasuta päris Futurehome Smarthubist salvestatud näidisseisu seadmete simuleerimiseks.
|
description: Kasuta päris Futurehome Smarthubist salvestatud näidisseisu seadmete simuleerimiseks.
|
||||||
|
@ -14,6 +14,9 @@ configuration:
|
|||||||
tp_password:
|
tp_password:
|
||||||
name: Thingsplex Password (Optional)
|
name: Thingsplex Password (Optional)
|
||||||
description: Your Thingsplex password.
|
description: Your Thingsplex password.
|
||||||
|
tp_allow_empty:
|
||||||
|
name: Allow Empty Thingsplex Credentials
|
||||||
|
description: Allow empty Thingsplex username and/or password.
|
||||||
demo_mode:
|
demo_mode:
|
||||||
name: Demo Mode
|
name: Demo Mode
|
||||||
description: Use a sample recorded state from a real Futurehome Smarthub to simulate devices.
|
description: Use a sample recorded state from a real Futurehome Smarthub to simulate devices.
|
||||||
|
@ -14,6 +14,9 @@ configuration:
|
|||||||
tp_password:
|
tp_password:
|
||||||
name: Thingsplexi parool (valikuline)
|
name: Thingsplexi parool (valikuline)
|
||||||
description: Sinu Thingsplexi parool.
|
description: Sinu Thingsplexi parool.
|
||||||
|
tp_allow_empty:
|
||||||
|
name: Luba tühjad Thingsplexi mandaadid
|
||||||
|
description: Luba tühi Thingsplexi kasutajanimi ja/või parool.
|
||||||
demo_mode:
|
demo_mode:
|
||||||
name: Demorežiim
|
name: Demorežiim
|
||||||
description: Kasuta päris Futurehome Smarthubist salvestatud näidisseisu seadmete simuleerimiseks.
|
description: Kasuta päris Futurehome Smarthubist salvestatud näidisseisu seadmete simuleerimiseks.
|
||||||
|
@ -14,6 +14,9 @@ configuration:
|
|||||||
tp_password:
|
tp_password:
|
||||||
name: Thingsplex-salasana (valinnainen)
|
name: Thingsplex-salasana (valinnainen)
|
||||||
description: Thingsplex-salasanasi.
|
description: Thingsplex-salasanasi.
|
||||||
|
tp_allow_empty:
|
||||||
|
name: Salli tyhjät Thingsplex-tunnistetiedot
|
||||||
|
description: Salli tyhjä Thingsplex-käyttäjätunnus ja/tai salasana.
|
||||||
demo_mode:
|
demo_mode:
|
||||||
name: Demotila
|
name: Demotila
|
||||||
description: Käytä tallennettua tilanäytettä oikeasta Futurehome Smarthubista laitteiden simuloimiseen.
|
description: Käytä tallennettua tilanäytettä oikeasta Futurehome Smarthubista laitteiden simuloimiseen.
|
||||||
|
@ -14,6 +14,9 @@ configuration:
|
|||||||
tp_password:
|
tp_password:
|
||||||
name: Thingsplex lykilorð (valkvætt)
|
name: Thingsplex lykilorð (valkvætt)
|
||||||
description: Lykilorðið þitt fyrir Thingsplex.
|
description: Lykilorðið þitt fyrir Thingsplex.
|
||||||
|
tp_allow_empty:
|
||||||
|
name: Leyfa tómar Thingsplex-auðkenningar
|
||||||
|
description: Leyfa tómt Thingsplex-notandanafn og/eða lykilorð.
|
||||||
demo_mode:
|
demo_mode:
|
||||||
name: Sýnishamur
|
name: Sýnishamur
|
||||||
description: Notaðu upptaka af raunverulegu ástandi úr Futurehome Smarthub til að herma eftir tækjum.
|
description: Notaðu upptaka af raunverulegu ástandi úr Futurehome Smarthub til að herma eftir tækjum.
|
||||||
|
@ -14,6 +14,9 @@ configuration:
|
|||||||
tp_password:
|
tp_password:
|
||||||
name: Thingsplex slaptažodis (pasirinktinai)
|
name: Thingsplex slaptažodis (pasirinktinai)
|
||||||
description: Jūsų Thingsplex slaptažodis.
|
description: Jūsų Thingsplex slaptažodis.
|
||||||
|
tp_allow_empty:
|
||||||
|
name: Leisti tuščius „Thingsplex“ prisijungimo duomenis
|
||||||
|
description: Leisti tuščią „Thingsplex“ vartotojo vardą ir (arba) slaptažodį.
|
||||||
demo_mode:
|
demo_mode:
|
||||||
name: Demonstracinis režimas
|
name: Demonstracinis režimas
|
||||||
description: Naudokite įrašytą būsena iš tikro Futurehome Smarthub, kad imituotumėte įrenginius.
|
description: Naudokite įrašytą būsena iš tikro Futurehome Smarthub, kad imituotumėte įrenginius.
|
||||||
|
@ -14,6 +14,9 @@ configuration:
|
|||||||
tp_password:
|
tp_password:
|
||||||
name: Thingsplex parole (pēc izvēles)
|
name: Thingsplex parole (pēc izvēles)
|
||||||
description: Tava Thingsplex parole.
|
description: Tava Thingsplex parole.
|
||||||
|
tp_allow_empty:
|
||||||
|
name: Atļaut tukšus Thingsplex akreditācijas datus
|
||||||
|
description: Atļaut tukšu Thingsplex lietotājvārdu un/vai paroli.
|
||||||
demo_mode:
|
demo_mode:
|
||||||
name: Demonstrācijas režīms
|
name: Demonstrācijas režīms
|
||||||
description: Izmanto ierakstītu stāvokli no īsta Futurehome Smarthub, lai simulētu ierīces.
|
description: Izmanto ierakstītu stāvokli no īsta Futurehome Smarthub, lai simulētu ierīces.
|
||||||
|
@ -14,6 +14,9 @@ configuration:
|
|||||||
tp_password:
|
tp_password:
|
||||||
name: Thingsplex-passord (valgfritt)
|
name: Thingsplex-passord (valgfritt)
|
||||||
description: Ditt passord for Thingsplex.
|
description: Ditt passord for Thingsplex.
|
||||||
|
tp_allow_empty:
|
||||||
|
name: Tillat tomme Thingsplex-legitimasjoner
|
||||||
|
description: Tillat tomt Thingsplex-brukernavn og/eller passord.
|
||||||
demo_mode:
|
demo_mode:
|
||||||
name: Demomodus
|
name: Demomodus
|
||||||
description: Bruk en forhåndsopptatt tilstand fra en ekte Futurehome Smarthub for å simulere enheter.
|
description: Bruk en forhåndsopptatt tilstand fra en ekte Futurehome Smarthub for å simulere enheter.
|
||||||
|
@ -14,6 +14,9 @@ configuration:
|
|||||||
tp_password:
|
tp_password:
|
||||||
name: Thingsplex-passord (valfritt)
|
name: Thingsplex-passord (valfritt)
|
||||||
description: Ditt passord for Thingsplex.
|
description: Ditt passord for Thingsplex.
|
||||||
|
tp_allow_empty:
|
||||||
|
name: Tillat tomme Thingsplex-legitimasjonar
|
||||||
|
description: Tillat tomt Thingsplex-brukarnamn og/eller passord.
|
||||||
demo_mode:
|
demo_mode:
|
||||||
name: Demomodus
|
name: Demomodus
|
||||||
description: Bruk ein førehandsopptak frå ein ekte Futurehome Smarthub for å simulere einingar.
|
description: Bruk ein førehandsopptak frå ein ekte Futurehome Smarthub for å simulere einingar.
|
||||||
|
@ -14,6 +14,9 @@ configuration:
|
|||||||
tp_password:
|
tp_password:
|
||||||
name: Thingsplex-passord (valgfritt)
|
name: Thingsplex-passord (valgfritt)
|
||||||
description: Ditt passord for Thingsplex.
|
description: Ditt passord for Thingsplex.
|
||||||
|
tp_allow_empty:
|
||||||
|
name: Tillat tomme Thingsplex-legitimasjoner
|
||||||
|
description: Tillat tomt Thingsplex-brukernavn og/eller passord.
|
||||||
demo_mode:
|
demo_mode:
|
||||||
name: Demomodus
|
name: Demomodus
|
||||||
description: Bruk en forhåndsopptatt tilstand fra en ekte Futurehome Smarthub for å simulere enheter.
|
description: Bruk en forhåndsopptatt tilstand fra en ekte Futurehome Smarthub for å simulere enheter.
|
||||||
|
@ -14,6 +14,9 @@ configuration:
|
|||||||
tp_password:
|
tp_password:
|
||||||
name: Hasło do Thingsplex (opcjonalne)
|
name: Hasło do Thingsplex (opcjonalne)
|
||||||
description: Twoje hasło do Thingsplex.
|
description: Twoje hasło do Thingsplex.
|
||||||
|
tp_allow_empty:
|
||||||
|
name: Zezwól na puste dane logowania Thingsplex
|
||||||
|
description: Zezwól na puste nazwy użytkownika i/lub hasła Thingsplex.
|
||||||
demo_mode:
|
demo_mode:
|
||||||
name: Tryb demonstracyjny
|
name: Tryb demonstracyjny
|
||||||
description: Użyj zapisanego stanu z prawdziwego Futurehome Smarthub, aby symulować urządzenia.
|
description: Użyj zapisanego stanu z prawdziwego Futurehome Smarthub, aby symulować urządzenia.
|
||||||
|
@ -14,6 +14,9 @@ configuration:
|
|||||||
tp_password:
|
tp_password:
|
||||||
name: Пароль Thingsplex (необязательно)
|
name: Пароль Thingsplex (необязательно)
|
||||||
description: Ваш пароль Thingsplex.
|
description: Ваш пароль Thingsplex.
|
||||||
|
tp_allow_empty:
|
||||||
|
name: Разрешить пустые учетные данные Thingsplex
|
||||||
|
description: Разрешить пустое имя пользователя и/или пароль Thingsplex.
|
||||||
demo_mode:
|
demo_mode:
|
||||||
name: Демонстрационный режим
|
name: Демонстрационный режим
|
||||||
description: Используйте сохранённое состояние от настоящего Futurehome Smarthub для имитации устройств.
|
description: Используйте сохранённое состояние от настоящего Futurehome Smarthub для имитации устройств.
|
||||||
|
@ -14,6 +14,9 @@ configuration:
|
|||||||
tp_password:
|
tp_password:
|
||||||
name: Thingsplex-lösenord (valfritt)
|
name: Thingsplex-lösenord (valfritt)
|
||||||
description: Ditt lösenord för Thingsplex.
|
description: Ditt lösenord för Thingsplex.
|
||||||
|
tp_allow_empty:
|
||||||
|
name: Tillåt tomma Thingsplex-uppgifter
|
||||||
|
description: Tillåt tomt Thingsplex-användarnamn och/eller lösenord.
|
||||||
demo_mode:
|
demo_mode:
|
||||||
name: Demoläge
|
name: Demoläge
|
||||||
description: Använd ett inspelat exempel från en riktig Futurehome Smarthub för att simulera enheter.
|
description: Använd ett inspelat exempel från en riktig Futurehome Smarthub för att simulera enheter.
|
||||||
|
@ -14,6 +14,9 @@ configuration:
|
|||||||
tp_password:
|
tp_password:
|
||||||
name: Heslo Thingsplex (voliteľné)
|
name: Heslo Thingsplex (voliteľné)
|
||||||
description: Vaše heslo pre Thingsplex.
|
description: Vaše heslo pre Thingsplex.
|
||||||
|
tp_allow_empty:
|
||||||
|
name: Povoliť prázdne prihlasovacie údaje Thingsplex
|
||||||
|
description: Povoliť prázdne používateľské meno a/alebo heslo Thingsplex.
|
||||||
demo_mode:
|
demo_mode:
|
||||||
name: Demo režim
|
name: Demo režim
|
||||||
description: Použite uložený stav zo skutočného Futurehome Smarthubu na simuláciu zariadení.
|
description: Použite uložený stav zo skutočného Futurehome Smarthubu na simuláciu zariadení.
|
||||||
|
@ -14,6 +14,9 @@ configuration:
|
|||||||
tp_password:
|
tp_password:
|
||||||
name: Thingsplex-lösenord (valfritt)
|
name: Thingsplex-lösenord (valfritt)
|
||||||
description: Ditt lösenord för Thingsplex.
|
description: Ditt lösenord för Thingsplex.
|
||||||
|
tp_allow_empty:
|
||||||
|
name: Tillåt tomma Thingsplex-uppgifter
|
||||||
|
description: Tillåt tomt Thingsplex-användarnamn och/eller lösenord.
|
||||||
demo_mode:
|
demo_mode:
|
||||||
name: Demoläge
|
name: Demoläge
|
||||||
description: Använd ett inspelat exempel från en riktig Futurehome Smarthub för att simulera enheter.
|
description: Använd ett inspelat exempel från en riktig Futurehome Smarthub för att simulera enheter.
|
||||||
|
@ -14,6 +14,9 @@ configuration:
|
|||||||
tp_password:
|
tp_password:
|
||||||
name: Пароль Thingsplex (необов’язково)
|
name: Пароль Thingsplex (необов’язково)
|
||||||
description: Ваш пароль для Thingsplex.
|
description: Ваш пароль для Thingsplex.
|
||||||
|
tp_allow_empty:
|
||||||
|
name: Дозволити порожні облікові дані Thingsplex
|
||||||
|
description: Дозволити порожнє ім’я користувача та/або пароль Thingsplex.
|
||||||
demo_mode:
|
demo_mode:
|
||||||
name: Демонстраційний режим
|
name: Демонстраційний режим
|
||||||
description: Використовуйте записаний стан із реального Futurehome Smarthub для імітації пристроїв.
|
description: Використовуйте записаний стан із реального Futurehome Smarthub для імітації пристроїв.
|
||||||
|
@ -14,6 +14,9 @@ configuration:
|
|||||||
tp_password:
|
tp_password:
|
||||||
name: Пароль Thingsplex (необов’язково)
|
name: Пароль Thingsplex (необов’язково)
|
||||||
description: Ваш пароль для Thingsplex.
|
description: Ваш пароль для Thingsplex.
|
||||||
|
tp_allow_empty:
|
||||||
|
name: Дозволити порожні облікові дані Thingsplex
|
||||||
|
description: Дозволити порожнє ім’я користувача та/або пароль Thingsplex.
|
||||||
demo_mode:
|
demo_mode:
|
||||||
name: Демонстраційний режим
|
name: Демонстраційний режим
|
||||||
description: Використовуйте записаний стан із реального Futurehome Smarthub для імітації пристроїв.
|
description: Використовуйте записаний стан із реального Futurehome Smarthub для імітації пристроїв.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user