mirror of
https://github.com/adrianjagielak/home-assistant-futurehome.git
synced 2025-11-18 17:19:02 +00:00
Compare commits
15 Commits
7e3d56cec1
...
dependabot
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
50a2dcd636 | ||
|
|
ce36669587 | ||
|
|
dac16b0fd4 | ||
|
|
45182a6416 | ||
|
|
9f2feea8c1 | ||
|
|
a38e441c9b | ||
|
|
afbfd1d1c7 | ||
|
|
729c6c839f | ||
|
|
b937f90340 | ||
|
|
4a3eb07464 | ||
|
|
5732c70d4e | ||
|
|
16a4fb3181 | ||
|
|
fdc65a0bd5 | ||
|
|
91c33b33cd | ||
|
|
6ca05e95b9 |
2
.github/workflows/lint.yaml
vendored
2
.github/workflows/lint.yaml
vendored
@@ -36,6 +36,6 @@ jobs:
|
|||||||
uses: actions/checkout@v5.0.0
|
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.20
|
||||||
with:
|
with:
|
||||||
path: "./${{ matrix.path }}"
|
path: "./${{ matrix.path }}"
|
||||||
@@ -42,7 +42,7 @@ Some services are more common than others; some are deprecated entirely.
|
|||||||
| Media player | [media_player](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/media_player.ts) | | ✅ | [Select](https://www.home-assistant.io/integrations/select/), [Number](https://www.home-assistant.io/integrations/number/), [Switch](https://www.home-assistant.io/integrations/switch/), [Image](https://www.home-assistant.io/integrations/image/), [Sensor](https://www.home-assistant.io/integrations/sensor/) |
|
| Media player | [media_player](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/media_player.ts) | | ✅ | [Select](https://www.home-assistant.io/integrations/select/), [Number](https://www.home-assistant.io/integrations/number/), [Switch](https://www.home-assistant.io/integrations/switch/), [Image](https://www.home-assistant.io/integrations/image/), [Sensor](https://www.home-assistant.io/integrations/sensor/) |
|
||||||
| Meter | [meter_elec](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_meter.ts), [meter_gas](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_meter.ts), [meter_water](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_meter.ts), [meter_heating](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_meter.ts), [meter_cooling](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_meter.ts) | [HAN-Sensor](https://www.futurehome.io/en/shop/han-sensor) | ✅ | [Sensor](https://www.home-assistant.io/integrations/sensor/), [Button](https://www.home-assistant.io/integrations/button/) |
|
| Meter | [meter_elec](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_meter.ts), [meter_gas](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_meter.ts), [meter_water](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_meter.ts), [meter_heating](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_meter.ts), [meter_cooling](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_meter.ts) | [HAN-Sensor](https://www.futurehome.io/en/shop/han-sensor) | ✅ | [Sensor](https://www.home-assistant.io/integrations/sensor/), [Button](https://www.home-assistant.io/integrations/button/) |
|
||||||
| Binary switch | [out_bin_switch](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/out_bin_switch.ts) | [16A Puck Relé](https://www.futurehome.io/en_no/shop/puck-relay-16a) | ✅ | [Switch](https://www.home-assistant.io/integrations/switch/) |
|
| Binary switch | [out_bin_switch](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/out_bin_switch.ts) | [16A Puck Relé](https://www.futurehome.io/en_no/shop/puck-relay-16a) | ✅ | [Switch](https://www.home-assistant.io/integrations/switch/) |
|
||||||
| Level switch | [out_lvl_switch](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/out_lvl_switch.ts) | [Smart LED Dimmer](https://www.futurehome.io/en_no/shop/smart-led-dimmer-polar-white) | ✅ | [Number](https://www.home-assistant.io/integrations/number/) |
|
| Level switch | [out_lvl_switch](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/out_lvl_switch.ts) | [Smart LED Dimmer](https://www.futurehome.io/en_no/shop/smart-led-dimmer-polar-white) | ✅ | [Light](https://www.home-assistant.io/integrations/light/), [Number](https://www.home-assistant.io/integrations/number/) |
|
||||||
| Button | [scene_ctrl](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/scene_ctrl.ts) | [Modusbryter](https://www.futurehome.io/en_no/shop/modeswitch-white) | ✅ | [Sensor](https://www.home-assistant.io/integrations/sensor/), [Select](https://www.home-assistant.io/integrations/select/) |
|
| Button | [scene_ctrl](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/scene_ctrl.ts) | [Modusbryter](https://www.futurehome.io/en_no/shop/modeswitch-white) | ✅ | [Sensor](https://www.home-assistant.io/integrations/sensor/), [Select](https://www.home-assistant.io/integrations/select/) |
|
||||||
| Schedule entry | [schedule_entry](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/schedule_entry.ts) | | ✅ | [Number](https://www.home-assistant.io/integrations/number/), [Button](https://www.home-assistant.io/integrations/button/), [Binary sensor](https://www.home-assistant.io/integrations/binary_sensor/), [Sensor](https://www.home-assistant.io/integrations/sensor/) |
|
| Schedule entry | [schedule_entry](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/schedule_entry.ts) | | ✅ | [Number](https://www.home-assistant.io/integrations/number/), [Button](https://www.home-assistant.io/integrations/button/), [Binary sensor](https://www.home-assistant.io/integrations/binary_sensor/), [Sensor](https://www.home-assistant.io/integrations/sensor/) |
|
||||||
| Binary sensor | [sensor_contact](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_sensor_binary.ts), [sensor_presence](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_sensor_binary.ts) | | ✅ | [Binary sensor](https://www.home-assistant.io/integrations/binary_sensor/) |
|
| Binary sensor | [sensor_contact](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_sensor_binary.ts), [sensor_presence](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_sensor_binary.ts) | | ✅ | [Binary sensor](https://www.home-assistant.io/integrations/binary_sensor/) |
|
||||||
|
|||||||
@@ -1,5 +1,30 @@
|
|||||||
<!-- 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.6.1 (16.10.2025)
|
||||||
|
|
||||||
|
- Tweaked 'Ignore Availability Reports' setting.
|
||||||
|
|
||||||
|
## 1.6.0 (16.10.2025)
|
||||||
|
|
||||||
|
- Added setting to always treat all devices as up.
|
||||||
|
|
||||||
|
## 1.5.0 (16.10.2025)
|
||||||
|
|
||||||
|
- Reverted: Add ability to specify a custom MQTT broker.
|
||||||
|
|
||||||
|
## 1.4.0 (13.10.2025)
|
||||||
|
|
||||||
|
- Added ability to specify a custom MQTT broker.
|
||||||
|
|
||||||
|
## 1.3.1 (28.09.2025)
|
||||||
|
|
||||||
|
- Revert upgrading dependencies.
|
||||||
|
|
||||||
|
## 1.3.0 (28.09.2025)
|
||||||
|
|
||||||
|
- Upgrade dependencies.
|
||||||
|
- Use proper `light` entity for out_lvl_switch if the device type is "light", instead of generic `number` level switch (thanks @Andbli for help!).
|
||||||
|
|
||||||
## 1.2.1 (26.09.2025)
|
## 1.2.1 (26.09.2025)
|
||||||
|
|
||||||
- Revert 'Use `light` entity for out_lvl_switch if the device type is "light"'.
|
- Revert 'Use `light` entity for out_lvl_switch if the device type is "light"'.
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ Some services are more common than others; some are deprecated entirely.
|
|||||||
| Media player | [media_player](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/media_player.ts) | | ✅ | [Select](https://www.home-assistant.io/integrations/select/), [Number](https://www.home-assistant.io/integrations/number/), [Switch](https://www.home-assistant.io/integrations/switch/), [Image](https://www.home-assistant.io/integrations/image/), [Sensor](https://www.home-assistant.io/integrations/sensor/) |
|
| Media player | [media_player](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/media_player.ts) | | ✅ | [Select](https://www.home-assistant.io/integrations/select/), [Number](https://www.home-assistant.io/integrations/number/), [Switch](https://www.home-assistant.io/integrations/switch/), [Image](https://www.home-assistant.io/integrations/image/), [Sensor](https://www.home-assistant.io/integrations/sensor/) |
|
||||||
| Meter | [meter_elec](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_meter.ts), [meter_gas](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_meter.ts), [meter_water](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_meter.ts), [meter_heating](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_meter.ts), [meter_cooling](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_meter.ts) | [HAN-Sensor](https://www.futurehome.io/en/shop/han-sensor) | ✅ | [Sensor](https://www.home-assistant.io/integrations/sensor/), [Button](https://www.home-assistant.io/integrations/button/) |
|
| Meter | [meter_elec](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_meter.ts), [meter_gas](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_meter.ts), [meter_water](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_meter.ts), [meter_heating](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_meter.ts), [meter_cooling](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_meter.ts) | [HAN-Sensor](https://www.futurehome.io/en/shop/han-sensor) | ✅ | [Sensor](https://www.home-assistant.io/integrations/sensor/), [Button](https://www.home-assistant.io/integrations/button/) |
|
||||||
| Binary switch | [out_bin_switch](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/out_bin_switch.ts) | [16A Puck Relé](https://www.futurehome.io/en_no/shop/puck-relay-16a) | ✅ | [Switch](https://www.home-assistant.io/integrations/switch/) |
|
| Binary switch | [out_bin_switch](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/out_bin_switch.ts) | [16A Puck Relé](https://www.futurehome.io/en_no/shop/puck-relay-16a) | ✅ | [Switch](https://www.home-assistant.io/integrations/switch/) |
|
||||||
| Level switch | [out_lvl_switch](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/out_lvl_switch.ts) | [Smart LED Dimmer](https://www.futurehome.io/en_no/shop/smart-led-dimmer-polar-white) | ✅ | [Number](https://www.home-assistant.io/integrations/number/) |
|
| Level switch | [out_lvl_switch](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/out_lvl_switch.ts) | [Smart LED Dimmer](https://www.futurehome.io/en_no/shop/smart-led-dimmer-polar-white) | ✅ | [Light](https://www.home-assistant.io/integrations/light/), [Number](https://www.home-assistant.io/integrations/number/) |
|
||||||
| Button | [scene_ctrl](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/scene_ctrl.ts) | [Modusbryter](https://www.futurehome.io/en_no/shop/modeswitch-white) | ✅ | [Sensor](https://www.home-assistant.io/integrations/sensor/), [Select](https://www.home-assistant.io/integrations/select/) |
|
| Button | [scene_ctrl](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/scene_ctrl.ts) | [Modusbryter](https://www.futurehome.io/en_no/shop/modeswitch-white) | ✅ | [Sensor](https://www.home-assistant.io/integrations/sensor/), [Select](https://www.home-assistant.io/integrations/select/) |
|
||||||
| Schedule entry | [schedule_entry](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/schedule_entry.ts) | | ✅ | [Number](https://www.home-assistant.io/integrations/number/), [Button](https://www.home-assistant.io/integrations/button/), [Binary sensor](https://www.home-assistant.io/integrations/binary_sensor/), [Sensor](https://www.home-assistant.io/integrations/sensor/) |
|
| Schedule entry | [schedule_entry](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/schedule_entry.ts) | | ✅ | [Number](https://www.home-assistant.io/integrations/number/), [Button](https://www.home-assistant.io/integrations/button/), [Binary sensor](https://www.home-assistant.io/integrations/binary_sensor/), [Sensor](https://www.home-assistant.io/integrations/sensor/) |
|
||||||
| Binary sensor | [sensor_contact](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_sensor_binary.ts), [sensor_presence](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_sensor_binary.ts) | | ✅ | [Binary sensor](https://www.home-assistant.io/integrations/binary_sensor/) |
|
| Binary sensor | [sensor_contact](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_sensor_binary.ts), [sensor_presence](https://github.com/adrianjagielak/home-assistant-futurehome/blob/master/futurehome/src/services/_sensor_binary.ts) | | ✅ | [Binary sensor](https://www.home-assistant.io/integrations/binary_sensor/) |
|
||||||
|
|||||||
@@ -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.2.0'
|
version: '1.6.1'
|
||||||
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'
|
||||||
@@ -22,6 +22,7 @@ options:
|
|||||||
tp_username: ''
|
tp_username: ''
|
||||||
tp_password: ''
|
tp_password: ''
|
||||||
tp_allow_empty: false
|
tp_allow_empty: false
|
||||||
|
ignore_availability_reports: false
|
||||||
demo_mode: false
|
demo_mode: false
|
||||||
show_debug_log: false
|
show_debug_log: false
|
||||||
|
|
||||||
@@ -32,6 +33,7 @@ schema:
|
|||||||
tp_username: 'str?'
|
tp_username: 'str?'
|
||||||
tp_password: 'password?'
|
tp_password: 'password?'
|
||||||
tp_allow_empty: 'bool?'
|
tp_allow_empty: 'bool?'
|
||||||
|
ignore_availability_reports: 'bool?'
|
||||||
demo_mode: 'bool?'
|
demo_mode: 'bool?'
|
||||||
show_debug_log: 'bool?'
|
show_debug_log: 'bool?'
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ 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 TP_ALLOW_EMPTY=$(bashio::config 'tp_allow_empty')
|
||||||
|
export IGNORE_AVAILABILITY_REPORTS=$(bashio::config 'ignore_availability_reports')
|
||||||
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')
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,14 @@ 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 thingsplexAllowEmpty = (process.env.TP_ALLOW_EMPTY || '')
|
||||||
|
.toLowerCase()
|
||||||
|
.includes('true');
|
||||||
|
const ignoreAvailabilityReports = (
|
||||||
|
process.env.IGNORE_AVAILABILITY_REPORTS || ''
|
||||||
|
)
|
||||||
|
.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()
|
||||||
@@ -80,9 +87,7 @@ import { pollVinculum } from './fimp/vinculum';
|
|||||||
const hubId = house.val.param.house.hubId;
|
const hubId = house.val.param.house.hubId;
|
||||||
|
|
||||||
const devices = await pollVinculum('device');
|
const devices = await pollVinculum('device');
|
||||||
log.debug(
|
log.debug(`FIMP devices:\n${JSON.stringify(devices, null, 0)}`);
|
||||||
`FIMP devices:\n${JSON.stringify(devices, null, 0)}`,
|
|
||||||
);
|
|
||||||
|
|
||||||
const haConfig = retainedMessages.filter((msg) =>
|
const haConfig = retainedMessages.filter((msg) =>
|
||||||
msg.topic.endsWith('/config'),
|
msg.topic.endsWith('/config'),
|
||||||
@@ -191,7 +196,11 @@ import { pollVinculum } from './fimp/vinculum';
|
|||||||
log.error('Failed publishing device', device, e);
|
log.error('Failed publishing device', device, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (demoMode || thingsplexAllowEmpty || (thingsplexUsername && thingsplexPassword)) {
|
if (
|
||||||
|
demoMode ||
|
||||||
|
thingsplexAllowEmpty ||
|
||||||
|
(thingsplexUsername && thingsplexPassword)
|
||||||
|
) {
|
||||||
Object.assign(
|
Object.assign(
|
||||||
commandHandlers,
|
commandHandlers,
|
||||||
exposeSmarthubTools({
|
exposeSmarthubTools({
|
||||||
@@ -265,6 +274,9 @@ import { pollVinculum } from './fimp/vinculum';
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (const deviceAvailability of devicesAvailability) {
|
for (const deviceAvailability of devicesAvailability) {
|
||||||
|
if (ignoreAvailabilityReports) {
|
||||||
|
deviceAvailability.status = 'UP';
|
||||||
|
}
|
||||||
haUpdateAvailability({ hubId, deviceAvailability });
|
haUpdateAvailability({ hubId, deviceAvailability });
|
||||||
await delay(50);
|
await delay(50);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2518,5 +2518,128 @@
|
|||||||
"props": { "sup_units": ["km/h"] }
|
"props": { "sup_units": ["km/h"] }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"client": { "name": "Spisestue" },
|
||||||
|
"fimp": { "adapter": "zwave-ad", "address": "6", "group": "ch_0" },
|
||||||
|
"functionality": "lighting",
|
||||||
|
"id": 1011,
|
||||||
|
"lrn": true,
|
||||||
|
"model": "zw_411_4_8705",
|
||||||
|
"param": {
|
||||||
|
"dimValue": 3,
|
||||||
|
"energy": 49.6100006103516,
|
||||||
|
"power": "off",
|
||||||
|
"timestamp": "2025-09-26 18:32:21 +0200",
|
||||||
|
"wattage": 0,
|
||||||
|
"zwaveConfigParameters": []
|
||||||
|
},
|
||||||
|
"problem": false,
|
||||||
|
"room": 1,
|
||||||
|
"services": {
|
||||||
|
"dev_sys": {
|
||||||
|
"addr": "/rt:dev/rn:zw/ad:1/sv:dev_sys/ad:1011_0",
|
||||||
|
"enabled": true,
|
||||||
|
"intf": [
|
||||||
|
"cmd.config.get_report",
|
||||||
|
"cmd.config.set",
|
||||||
|
"cmd.group.add_members",
|
||||||
|
"cmd.group.delete_members",
|
||||||
|
"cmd.group.get_members",
|
||||||
|
"cmd.ping.send",
|
||||||
|
"evt.config.report",
|
||||||
|
"evt.group.members_report",
|
||||||
|
"evt.ping.report"
|
||||||
|
],
|
||||||
|
"props": { "is_secure": false, "is_unsecure": true }
|
||||||
|
},
|
||||||
|
"indicator_ctrl": {
|
||||||
|
"addr": "/rt:dev/rn:zw/ad:1/sv:indicator_ctrl/ad:1011_0",
|
||||||
|
"enabled": true,
|
||||||
|
"intf": [
|
||||||
|
"cmd.indicator.identify",
|
||||||
|
"cmd.indicator.set_visual_element"
|
||||||
|
],
|
||||||
|
"props": { "is_secure": false, "is_unsecure": true }
|
||||||
|
},
|
||||||
|
"meter_elec": {
|
||||||
|
"addr": "/rt:dev/rn:zw/ad:1/sv:meter_elec/ad:1011_0",
|
||||||
|
"enabled": true,
|
||||||
|
"intf": [
|
||||||
|
"cmd.meter.get_report",
|
||||||
|
"cmd.meter.reset",
|
||||||
|
"evt.meter.report"
|
||||||
|
],
|
||||||
|
"props": {
|
||||||
|
"is_secure": false,
|
||||||
|
"is_unsecure": true,
|
||||||
|
"sup_export_units": [],
|
||||||
|
"sup_units": ["kWh", "W"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"out_lvl_switch": {
|
||||||
|
"addr": "/rt:dev/rn:zw/ad:1/sv:out_lvl_switch/ad:1011_0",
|
||||||
|
"enabled": true,
|
||||||
|
"intf": [
|
||||||
|
"cmd.binary.set",
|
||||||
|
"cmd.lvl.get_report",
|
||||||
|
"cmd.lvl.set",
|
||||||
|
"cmd.lvl.start",
|
||||||
|
"cmd.lvl.stop",
|
||||||
|
"evt.binary.report",
|
||||||
|
"evt.lvl.report"
|
||||||
|
],
|
||||||
|
"props": {
|
||||||
|
"is_secure": false,
|
||||||
|
"is_unsecure": true,
|
||||||
|
"max_lvl": 100,
|
||||||
|
"min_lvl": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"scene_ctrl": {
|
||||||
|
"addr": "/rt:dev/rn:zw/ad:1/sv:scene_ctrl/ad:1011_0",
|
||||||
|
"enabled": true,
|
||||||
|
"intf": ["evt.scene.report"],
|
||||||
|
"props": {
|
||||||
|
"is_secure": false,
|
||||||
|
"is_unsecure": true,
|
||||||
|
"sup_scenes": [
|
||||||
|
"1.key_pressed_1_time",
|
||||||
|
"1.key_released",
|
||||||
|
"1.key_held_down",
|
||||||
|
"1.key_pressed_2_times",
|
||||||
|
"1.key_pressed_3_times",
|
||||||
|
"1.key_pressed_4_times",
|
||||||
|
"1.key_pressed_5_times",
|
||||||
|
"2.key_pressed_1_time",
|
||||||
|
"2.key_released",
|
||||||
|
"2.key_held_down",
|
||||||
|
"2.key_pressed_2_times",
|
||||||
|
"2.key_pressed_3_times",
|
||||||
|
"2.key_pressed_4_times",
|
||||||
|
"2.key_pressed_5_times"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"version": {
|
||||||
|
"addr": "/rt:dev/rn:zw/ad:1/sv:version/ad:1011_0",
|
||||||
|
"enabled": true,
|
||||||
|
"intf": ["cmd.version.get_report", "evt.version.report"],
|
||||||
|
"props": { "is_secure": false, "is_unsecure": true }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"supports": ["clear", "poll"],
|
||||||
|
"thing": 1,
|
||||||
|
"type": {
|
||||||
|
"subtype": null,
|
||||||
|
"supported": {
|
||||||
|
"appliance": [],
|
||||||
|
"blinds": [],
|
||||||
|
"fan": [],
|
||||||
|
"heater": [],
|
||||||
|
"light": []
|
||||||
|
},
|
||||||
|
"type": "light"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -2380,5 +2380,79 @@
|
|||||||
"name": "sensor_wind"
|
"name": "sensor_wind"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1011,
|
||||||
|
"services": [
|
||||||
|
{
|
||||||
|
"addr": "/rt:dev/rn:zw/ad:1/sv:out_lvl_switch/ad:1011_0",
|
||||||
|
"attributes": [
|
||||||
|
{
|
||||||
|
"name": "lvl",
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"ts": "2025-09-26 12:39:19 +0200",
|
||||||
|
"val": 22,
|
||||||
|
"val_t": "int"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "binary",
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"ts": "2025-09-26 12:39:19 +0200",
|
||||||
|
"val": true,
|
||||||
|
"val_t": "bool"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "out_lvl_switch"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"addr": "/rt:dev/rn:zw/ad:1/sv:dev_sys/ad:1011_0",
|
||||||
|
"attributes": [
|
||||||
|
{
|
||||||
|
"name": "state",
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"ts": "2025-09-08 21:06:32 +0200",
|
||||||
|
"val": "UP",
|
||||||
|
"val_t": "string"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "dev_sys"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"addr": "/rt:dev/rn:zw/ad:1/sv:meter_elec/ad:1011_0",
|
||||||
|
"attributes": [
|
||||||
|
{
|
||||||
|
"name": "meter",
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"props": {
|
||||||
|
"delta_t": "774",
|
||||||
|
"prv_data": "31.290001",
|
||||||
|
"unit": "kWh"
|
||||||
|
},
|
||||||
|
"ts": "2025-09-26 18:32:21 +0200",
|
||||||
|
"val": 49.6100006103516,
|
||||||
|
"val_t": "float"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"props": { "unit": "W" },
|
||||||
|
"ts": "2025-09-26 18:32:21 +0200",
|
||||||
|
"val": 0,
|
||||||
|
"val_t": "float"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "meter_elec"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import {
|
|||||||
VinculumPd7Service,
|
VinculumPd7Service,
|
||||||
} from '../fimp/vinculum_pd7_device';
|
} from '../fimp/vinculum_pd7_device';
|
||||||
import { ServiceComponentsCreationResult } from '../ha/publish_device';
|
import { ServiceComponentsCreationResult } from '../ha/publish_device';
|
||||||
|
import { haGetCachedState } from '../ha/update_state';
|
||||||
|
|
||||||
export function out_lvl_switch__components(
|
export function out_lvl_switch__components(
|
||||||
topicPrefix: string,
|
topicPrefix: string,
|
||||||
@@ -11,11 +12,92 @@ export function out_lvl_switch__components(
|
|||||||
svc: VinculumPd7Service,
|
svc: VinculumPd7Service,
|
||||||
_svcName: string,
|
_svcName: string,
|
||||||
): ServiceComponentsCreationResult | undefined {
|
): ServiceComponentsCreationResult | undefined {
|
||||||
const commandTopic = `${topicPrefix}${svc.addr}/command`;
|
const lvlCommandTopic = `${topicPrefix}${svc.addr}/command`;
|
||||||
|
const binaryCommandTopic = `${topicPrefix}${svc.addr}/binary/command`;
|
||||||
|
const stateTopic = `${topicPrefix}/state`;
|
||||||
|
|
||||||
const minLvl = svc.props?.min_lvl ?? 0;
|
const minLvl = svc.props?.min_lvl ?? 0;
|
||||||
const maxLvl = svc.props?.max_lvl ?? 100;
|
const maxLvl = svc.props?.max_lvl ?? 100;
|
||||||
|
|
||||||
|
const isLightDevice = device.type?.type === 'light';
|
||||||
|
|
||||||
|
if (isLightDevice) {
|
||||||
|
// Use light component for light devices
|
||||||
|
return {
|
||||||
|
components: {
|
||||||
|
[`${svc.addr}_light`]: {
|
||||||
|
unique_id: `${svc.addr}_light`,
|
||||||
|
platform: 'light',
|
||||||
|
name: 'Light',
|
||||||
|
brightness: true,
|
||||||
|
brightness_scale: maxLvl,
|
||||||
|
command_topic: binaryCommandTopic,
|
||||||
|
brightness_command_topic: lvlCommandTopic,
|
||||||
|
optimistic: false,
|
||||||
|
state_topic: stateTopic,
|
||||||
|
state_value_template: `{{ (value_json['${svc.addr}'].lvl > 0) | iif('ON', 'OFF') }}`,
|
||||||
|
brightness_state_topic: stateTopic,
|
||||||
|
brightness_value_template: `{{ value_json['${svc.addr}'].lvl }}`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
commandHandlers: {
|
||||||
|
[lvlCommandTopic]: async (payload: string) => {
|
||||||
|
const lvl = parseInt(payload, 10);
|
||||||
|
if (Number.isNaN(lvl)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await sendFimpMsg({
|
||||||
|
address: svc.addr!,
|
||||||
|
service: 'out_lvl_switch',
|
||||||
|
cmd: 'cmd.lvl.set',
|
||||||
|
val: lvl,
|
||||||
|
val_t: 'int',
|
||||||
|
});
|
||||||
|
},
|
||||||
|
[binaryCommandTopic]: async (payload: string) => {
|
||||||
|
if (payload === 'ON') {
|
||||||
|
// Skip setting to max brightness if the device is already on, because Home Assistant also sends "ON" when only changing brightness.
|
||||||
|
const currentState = haGetCachedState({
|
||||||
|
topic: `${topicPrefix}/state`,
|
||||||
|
})?.[svc.addr];
|
||||||
|
if (currentState.lvl > 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (svc.intf?.includes('cmd.binary.set')) {
|
||||||
|
// Set level to the last known non-zero value (not supported in add-on demo mode)
|
||||||
|
await sendFimpMsg({
|
||||||
|
address: svc.addr!,
|
||||||
|
service: 'out_lvl_switch',
|
||||||
|
cmd: 'cmd.binary.set',
|
||||||
|
val: payload === 'ON',
|
||||||
|
val_t: 'bool',
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// Set level to max brightness
|
||||||
|
await sendFimpMsg({
|
||||||
|
address: svc.addr!,
|
||||||
|
service: 'out_lvl_switch',
|
||||||
|
cmd: 'cmd.lvl.set',
|
||||||
|
val: maxLvl,
|
||||||
|
val_t: 'int',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
await sendFimpMsg({
|
||||||
|
address: svc.addr!,
|
||||||
|
service: 'out_lvl_switch',
|
||||||
|
cmd: 'cmd.lvl.set',
|
||||||
|
val: minLvl,
|
||||||
|
val_t: 'int',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
// Use number component for non-light devices
|
||||||
return {
|
return {
|
||||||
components: {
|
components: {
|
||||||
[svc.addr]: {
|
[svc.addr]: {
|
||||||
@@ -25,14 +107,14 @@ export function out_lvl_switch__components(
|
|||||||
min: minLvl,
|
min: minLvl,
|
||||||
max: maxLvl,
|
max: maxLvl,
|
||||||
step: 1,
|
step: 1,
|
||||||
command_topic: commandTopic,
|
command_topic: lvlCommandTopic,
|
||||||
optimistic: false,
|
optimistic: false,
|
||||||
value_template: `{{ value_json['${svc.addr}'].lvl }}`,
|
value_template: `{{ value_json['${svc.addr}'].lvl }}`,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
commandHandlers: {
|
commandHandlers: {
|
||||||
[commandTopic]: async (payload: string) => {
|
[lvlCommandTopic]: async (payload: string) => {
|
||||||
const lvl = parseInt(payload, 10);
|
const lvl = parseInt(payload, 10);
|
||||||
if (Number.isNaN(lvl)) {
|
if (Number.isNaN(lvl)) {
|
||||||
return;
|
return;
|
||||||
@@ -49,3 +131,4 @@ export function out_lvl_switch__components(
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -17,6 +17,9 @@ configuration:
|
|||||||
tp_allow_empty:
|
tp_allow_empty:
|
||||||
name: Allow Empty Thingsplex Credentials
|
name: Allow Empty Thingsplex Credentials
|
||||||
description: Allow empty Thingsplex username and/or password.
|
description: Allow empty Thingsplex username and/or password.
|
||||||
|
ignore_availability_reports:
|
||||||
|
name: Ignore Availability Reports
|
||||||
|
description: Sometimes the hub incorrectly reports some devices as down. This setting forces all devices to always be treated as up.
|
||||||
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.
|
||||||
|
|||||||
Reference in New Issue
Block a user