mirror of
https://github.com/Koenkk/zigbee2mqtt.git
synced 2026-07-02 18:11:36 +00:00
310 lines
8.2 KiB
TypeScript
310 lines
8.2 KiB
TypeScript
import fs from 'node:fs';
|
|
import path from 'node:path';
|
|
|
|
import stringify from 'json-stable-stringify-without-jsonify';
|
|
import tmp from 'tmp';
|
|
|
|
import yaml from '../../lib/util/yaml';
|
|
|
|
export const mockDir: string = tmp.dirSync().name;
|
|
const stateFile = path.join(mockDir, 'state.json');
|
|
|
|
export const DEFAULT_CONFIGURATION = {
|
|
homeassistant: {enabled: false},
|
|
frontend: {enabled: false},
|
|
availability: {enabled: false},
|
|
mqtt: {
|
|
base_topic: 'zigbee2mqtt',
|
|
server: 'mqtt://localhost',
|
|
},
|
|
serial: {
|
|
port: '/dev/dummy',
|
|
},
|
|
devices: {
|
|
'0x18fc2600000d7ae2': {
|
|
friendly_name: 'bosch_radiator',
|
|
},
|
|
'0x000b57fffec6a5b2': {
|
|
retain: true,
|
|
friendly_name: 'bulb',
|
|
description: 'this is my bulb',
|
|
},
|
|
'0x0017880104e45517': {
|
|
retain: true,
|
|
friendly_name: 'remote',
|
|
},
|
|
'0x0017880104e45520': {
|
|
retain: false,
|
|
friendly_name: 'button',
|
|
},
|
|
'0x0017880104e45521': {
|
|
retain: false,
|
|
friendly_name: 'button_double_key',
|
|
},
|
|
'0x0017880104e45522': {
|
|
qos: 1,
|
|
retain: false,
|
|
friendly_name: 'weather_sensor',
|
|
},
|
|
'0x0017880104e45523': {
|
|
retain: false,
|
|
friendly_name: 'occupancy_sensor',
|
|
},
|
|
'0x0017880104e45524': {
|
|
retain: false,
|
|
friendly_name: 'power_plug',
|
|
},
|
|
'0x0017880104e45530': {
|
|
retain: false,
|
|
friendly_name: 'button_double_key_interviewing',
|
|
},
|
|
'0x0017880104e45540': {
|
|
friendly_name: 'ikea_onoff',
|
|
},
|
|
'0x000b57fffec6a5b7': {
|
|
retain: false,
|
|
friendly_name: 'bulb_2',
|
|
},
|
|
'0x000b57fffec6a5b3': {
|
|
retain: false,
|
|
friendly_name: 'bulb_color',
|
|
},
|
|
'0x000b57fffec6a5b4': {
|
|
retain: false,
|
|
friendly_name: 'bulb_color_2',
|
|
},
|
|
'0x0017880104e45541': {
|
|
retain: false,
|
|
friendly_name: 'wall_switch',
|
|
},
|
|
'0x0017880104e45542': {
|
|
retain: false,
|
|
friendly_name: 'wall_switch_double',
|
|
},
|
|
'0x0017880104e45543': {
|
|
retain: false,
|
|
friendly_name: 'led_controller_1',
|
|
},
|
|
'0x0017880104e45544': {
|
|
retain: false,
|
|
friendly_name: 'led_controller_2',
|
|
},
|
|
'0x0017880104e45545': {
|
|
retain: false,
|
|
friendly_name: 'dimmer_wall_switch',
|
|
},
|
|
'0x0017880104e45547': {
|
|
retain: false,
|
|
friendly_name: 'curtain',
|
|
},
|
|
'0x0017880104e45548': {
|
|
retain: false,
|
|
friendly_name: 'fan',
|
|
},
|
|
'0x0017880104e45549': {
|
|
retain: false,
|
|
friendly_name: 'siren',
|
|
},
|
|
'0x0017880104e45529': {
|
|
retain: false,
|
|
friendly_name: 'unsupported2',
|
|
},
|
|
'0x0017880104e45550': {
|
|
retain: false,
|
|
friendly_name: 'thermostat',
|
|
},
|
|
'0x0017880104e45551': {
|
|
retain: false,
|
|
friendly_name: 'smart vent',
|
|
},
|
|
'0x0017880104e45552': {
|
|
retain: false,
|
|
friendly_name: 'j1',
|
|
},
|
|
'0x0017880104e45553': {
|
|
retain: false,
|
|
friendly_name: 'bulb_enddevice',
|
|
},
|
|
'0x0017880104e45559': {
|
|
retain: false,
|
|
friendly_name: 'cc2530_router',
|
|
},
|
|
'0x0017880104e45560': {
|
|
retain: false,
|
|
friendly_name: 'livolo',
|
|
},
|
|
'0x90fd9ffffe4b64ae': {
|
|
retain: false,
|
|
friendly_name: 'tradfri_remote',
|
|
},
|
|
'0x90fd9ffffe4b64af': {
|
|
friendly_name: 'roller_shutter',
|
|
},
|
|
'0x90fd9ffffe4b64ax': {
|
|
friendly_name: 'ZNLDP12LM',
|
|
},
|
|
'0x90fd9ffffe4b64aa': {
|
|
friendly_name: 'SP600_OLD',
|
|
},
|
|
'0x90fd9ffffe4b64ab': {
|
|
friendly_name: 'SP600_NEW',
|
|
},
|
|
'0x90fd9ffffe4b64ac': {
|
|
friendly_name: 'MKS-CM-W5',
|
|
},
|
|
'0x0017880104e45526': {
|
|
friendly_name: 'GL-S-007ZS',
|
|
},
|
|
'0x0017880104e43559': {
|
|
friendly_name: 'U202DST600ZB',
|
|
},
|
|
'0xf4ce368a38be56a1': {
|
|
retain: false,
|
|
friendly_name: 'zigfred_plus',
|
|
front_surface_enabled: 'true',
|
|
dimmer_1_enabled: 'true',
|
|
dimmer_1_dimming_enabled: 'true',
|
|
dimmer_2_enabled: 'true',
|
|
dimmer_2_dimming_enabled: 'true',
|
|
dimmer_3_enabled: 'true',
|
|
dimmer_3_dimming_enabled: 'true',
|
|
dimmer_4_enabled: 'true',
|
|
dimmer_4_dimming_enabled: 'true',
|
|
cover_1_enabled: 'true',
|
|
cover_1_tilt_enabled: 'true',
|
|
cover_2_enabled: 'true',
|
|
cover_2_tilt_enabled: 'true',
|
|
},
|
|
'0x0017880104e44559': {
|
|
friendly_name: '3157100_thermostat',
|
|
},
|
|
'0x0017880104a44559': {
|
|
friendly_name: 'J1_cover',
|
|
},
|
|
'0x0017882104a44559': {
|
|
friendly_name: 'TS0601_thermostat',
|
|
},
|
|
'0x0017882104a44560': {
|
|
friendly_name: 'TS0601_switch',
|
|
},
|
|
'0x0017882104a44562': {
|
|
friendly_name: 'TS0601_cover_switch',
|
|
},
|
|
'0x0017882194e45543': {
|
|
friendly_name: 'QS-Zigbee-D02-TRIAC-2C-LN',
|
|
},
|
|
'0x0017880104e45724': {
|
|
friendly_name: 'GLEDOPTO_2ID',
|
|
},
|
|
'0x0017880104e45561': {
|
|
friendly_name: 'temperature_sensor',
|
|
},
|
|
'0x0017880104e45562': {
|
|
friendly_name: 'heating_actuator',
|
|
},
|
|
'0x000b57cdfec6a5b3': {
|
|
friendly_name: 'hue_twilight',
|
|
},
|
|
'0x00124b00cfcf3298': {
|
|
friendly_name: 'fanbee',
|
|
retain: true,
|
|
},
|
|
},
|
|
groups: {
|
|
1: {
|
|
friendly_name: 'group_1',
|
|
retain: false,
|
|
},
|
|
2: {
|
|
friendly_name: 'group_2',
|
|
retain: false,
|
|
},
|
|
15071: {
|
|
friendly_name: 'group_tradfri_remote',
|
|
retain: false,
|
|
},
|
|
11: {
|
|
friendly_name: 'group_with_tradfri',
|
|
retain: false,
|
|
},
|
|
12: {
|
|
friendly_name: 'thermostat_group',
|
|
retain: false,
|
|
},
|
|
14: {
|
|
friendly_name: 'switch_group',
|
|
retain: false,
|
|
},
|
|
21: {
|
|
friendly_name: 'gledopto_group',
|
|
},
|
|
9: {
|
|
friendly_name: 'ha_discovery_group',
|
|
},
|
|
19: {
|
|
friendly_name: 'hue_twilight_group',
|
|
},
|
|
},
|
|
};
|
|
|
|
export function writeDefaultConfiguration(config: unknown = undefined): void {
|
|
config = config || DEFAULT_CONFIGURATION;
|
|
|
|
yaml.writeIfChanged(path.join(mockDir, 'configuration.yaml'), config);
|
|
}
|
|
|
|
export function writeEmptyState(): void {
|
|
fs.writeFileSync(stateFile, stringify({}));
|
|
}
|
|
|
|
export function removeState(): void {
|
|
if (stateExists()) {
|
|
fs.unlinkSync(stateFile);
|
|
}
|
|
}
|
|
|
|
export function stateExists(): boolean {
|
|
return fs.existsSync(stateFile);
|
|
}
|
|
|
|
const defaultState = {
|
|
'0x000b57fffec6a5b2': {
|
|
state: 'ON',
|
|
brightness: 50,
|
|
color_temp: 370,
|
|
linkquality: 99,
|
|
},
|
|
'0x0017880104e45517': {
|
|
brightness: 255,
|
|
},
|
|
1: {
|
|
state: 'ON',
|
|
},
|
|
};
|
|
|
|
export function getDefaultState(): typeof defaultState {
|
|
return defaultState;
|
|
}
|
|
|
|
export function writeDefaultState(): void {
|
|
fs.writeFileSync(path.join(mockDir, 'state.json'), stringify(defaultState));
|
|
}
|
|
|
|
export function read(): ReturnType<typeof yaml.read> {
|
|
return yaml.read(path.join(mockDir, 'configuration.yaml'));
|
|
}
|
|
|
|
vi.mock('../../lib/util/data', async () => {
|
|
const nodePath = await vi.importActual<typeof import('node:path')>('node:path');
|
|
|
|
return {
|
|
default: {
|
|
joinPath: (file: string): string => nodePath.join(mockDir, file),
|
|
getPath: (): string => mockDir,
|
|
},
|
|
};
|
|
});
|
|
|
|
writeDefaultConfiguration();
|
|
writeDefaultState();
|