iobroker.loxone 3.0.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +425 -402
- package/admin/i18n/de.json +15 -0
- package/admin/i18n/en.json +15 -0
- package/admin/i18n/es.json +18 -0
- package/admin/i18n/fr.json +18 -0
- package/admin/i18n/it.json +18 -0
- package/admin/i18n/nl.json +18 -0
- package/admin/i18n/pl.json +18 -0
- package/admin/i18n/pt.json +18 -0
- package/admin/i18n/ru.json +18 -0
- package/admin/i18n/uk.json +18 -0
- package/admin/i18n/zh-cn.json +18 -0
- package/admin/jsonConfig.json +96 -0
- package/io-package.json +309 -349
- package/package.json +42 -46
- package/src/controls/AalEmergency.ts +90 -0
- package/src/controls/AalSmartAlarm.ts +99 -0
- package/src/controls/Alarm.ts +146 -0
- package/src/controls/AlarmClock.ts +137 -0
- package/src/controls/Application.ts +13 -0
- package/src/controls/AudioZone.ts +227 -0
- package/src/controls/AudioZoneV2.ts +135 -0
- package/src/controls/CentralAlarm.ts +59 -0
- package/src/controls/CentralAudioZone.ts +41 -0
- package/src/controls/CentralGate.ts +53 -0
- package/src/controls/CentralJalousie.ts +67 -0
- package/src/controls/CentralLightController.ts +45 -0
- package/src/controls/ColorPickerV2.ts +34 -0
- package/src/controls/Colorpicker.ts +30 -0
- package/src/controls/ColorpickerBase.ts +326 -0
- package/src/controls/Daytimer.ts +201 -0
- package/src/controls/Dimmer.ts +64 -0
- package/src/controls/EIBDimmer.ts +61 -0
- package/src/controls/Fronius.ts +217 -0
- package/src/controls/Gate.ts +150 -0
- package/src/controls/Hourcounter.ts +115 -0
- package/src/controls/IRCDaytimer.ts +4 -0
- package/src/controls/IRCV2Daytimer.ts +4 -0
- package/src/controls/IRoomControllerV2.ts +595 -0
- package/src/controls/InfoOnlyAnalog.ts +56 -0
- package/src/controls/InfoOnlyDigital.ts +95 -0
- package/src/controls/InfoOnlyText.ts +52 -0
- package/{build/controls/Intercom.js → src/controls/Intercom.ts} +27 -11
- package/src/controls/Jalousie.ts +219 -0
- package/src/controls/LightController.ts +112 -0
- package/src/controls/LightControllerV2.ts +246 -0
- package/src/controls/MailBox.ts +92 -0
- package/src/controls/Meter.ts +94 -0
- package/src/controls/None.ts +29 -0
- package/src/controls/PresenceDetector.ts +47 -0
- package/src/controls/Pushbutton.ts +55 -0
- package/src/controls/Radio.ts +61 -0
- package/src/controls/Remote.ts +44 -0
- package/src/controls/Slider.ts +78 -0
- package/src/controls/SmokeAlarm.ts +163 -0
- package/src/controls/Switch.ts +46 -0
- package/src/controls/SystemScheme.ts +13 -0
- package/src/controls/TextInput.ts +96 -0
- package/src/controls/TextState.ts +37 -0
- package/src/controls/TimedSwitch.ts +75 -0
- package/src/controls/Tracker.ts +30 -0
- package/{build/controls/Unknown.js → src/controls/Unknown.ts} +19 -13
- package/src/controls/UpDownAnalog.ts +78 -0
- package/{build/controls/ValueSelector.js → src/controls/ValueSelector.ts} +21 -9
- package/src/controls/WindowMonitor.ts +139 -0
- package/src/controls/all-controls.ts +99 -0
- package/src/controls/control-base.ts +28 -0
- package/src/lib/adapter-config.d.ts +22 -0
- package/src/loxone-handler-base.ts +285 -0
- package/src/lxcommunicator.d.ts +1 -0
- package/src/main.test.ts +24 -0
- package/src/main.ts +1178 -0
- package/src/structure-file.d.ts +154 -0
- package/src/weather-server-handler.ts +266 -0
- package/admin/admin.d.ts +0 -58
- package/admin/index_m.html +0 -126
- package/admin/style.css +0 -32
- package/admin/words.js +0 -25
- package/build/controls/AalEmergency.js +0 -45
- package/build/controls/AalEmergency.js.map +0 -1
- package/build/controls/AalSmartAlarm.js +0 -48
- package/build/controls/AalSmartAlarm.js.map +0 -1
- package/build/controls/Alarm.js +0 -81
- package/build/controls/Alarm.js.map +0 -1
- package/build/controls/AlarmClock.js +0 -59
- package/build/controls/AlarmClock.js.map +0 -1
- package/build/controls/Application.js +0 -11
- package/build/controls/Application.js.map +0 -1
- package/build/controls/AudioZone.js +0 -116
- package/build/controls/AudioZone.js.map +0 -1
- package/build/controls/CentralAlarm.js +0 -30
- package/build/controls/CentralAlarm.js.map +0 -1
- package/build/controls/CentralAudioZone.js +0 -22
- package/build/controls/CentralAudioZone.js.map +0 -1
- package/build/controls/CentralGate.js +0 -30
- package/build/controls/CentralGate.js.map +0 -1
- package/build/controls/CentralJalousie.js +0 -39
- package/build/controls/CentralJalousie.js.map +0 -1
- package/build/controls/CentralLightController.js +0 -27
- package/build/controls/CentralLightController.js.map +0 -1
- package/build/controls/ColorPickerV2.js +0 -24
- package/build/controls/ColorPickerV2.js.map +0 -1
- package/build/controls/Colorpicker.js +0 -20
- package/build/controls/Colorpicker.js.map +0 -1
- package/build/controls/ColorpickerBase.js +0 -263
- package/build/controls/ColorpickerBase.js.map +0 -1
- package/build/controls/Daytimer.js +0 -119
- package/build/controls/Daytimer.js.map +0 -1
- package/build/controls/Dimmer.js +0 -34
- package/build/controls/Dimmer.js.map +0 -1
- package/build/controls/EIBDimmer.js +0 -31
- package/build/controls/EIBDimmer.js.map +0 -1
- package/build/controls/Fronius.js +0 -64
- package/build/controls/Fronius.js.map +0 -1
- package/build/controls/Gate.js +0 -109
- package/build/controls/Gate.js.map +0 -1
- package/build/controls/Hourcounter.js +0 -46
- package/build/controls/Hourcounter.js.map +0 -1
- package/build/controls/IRCDaytimer.js +0 -9
- package/build/controls/IRCDaytimer.js.map +0 -1
- package/build/controls/IRoomControllerV2.js +0 -272
- package/build/controls/IRoomControllerV2.js.map +0 -1
- package/build/controls/InfoOnlyAnalog.js +0 -38
- package/build/controls/InfoOnlyAnalog.js.map +0 -1
- package/build/controls/InfoOnlyDigital.js +0 -65
- package/build/controls/InfoOnlyDigital.js.map +0 -1
- package/build/controls/InfoOnlyText.js +0 -35
- package/build/controls/InfoOnlyText.js.map +0 -1
- package/build/controls/Intercom.js.map +0 -1
- package/build/controls/Jalousie.js +0 -156
- package/build/controls/Jalousie.js.map +0 -1
- package/build/controls/LightController.js +0 -68
- package/build/controls/LightController.js.map +0 -1
- package/build/controls/LightControllerV2.js +0 -195
- package/build/controls/LightControllerV2.js.map +0 -1
- package/build/controls/MailBox.js +0 -41
- package/build/controls/MailBox.js.map +0 -1
- package/build/controls/Meter.js +0 -52
- package/build/controls/Meter.js.map +0 -1
- package/build/controls/None.js +0 -23
- package/build/controls/None.js.map +0 -1
- package/build/controls/PresenceDetector.js +0 -29
- package/build/controls/PresenceDetector.js.map +0 -1
- package/build/controls/Pushbutton.js +0 -38
- package/build/controls/Pushbutton.js.map +0 -1
- package/build/controls/Radio.js +0 -42
- package/build/controls/Radio.js.map +0 -1
- package/build/controls/Slider.js +0 -44
- package/build/controls/Slider.js.map +0 -1
- package/build/controls/SmokeAlarm.js +0 -85
- package/build/controls/SmokeAlarm.js.map +0 -1
- package/build/controls/Switch.js +0 -34
- package/build/controls/Switch.js.map +0 -1
- package/build/controls/SystemScheme.js +0 -11
- package/build/controls/SystemScheme.js.map +0 -1
- package/build/controls/TextInput.js +0 -55
- package/build/controls/TextInput.js.map +0 -1
- package/build/controls/TextState.js +0 -20
- package/build/controls/TextState.js.map +0 -1
- package/build/controls/TimedSwitch.js +0 -36
- package/build/controls/TimedSwitch.js.map +0 -1
- package/build/controls/Tracker.js +0 -20
- package/build/controls/Tracker.js.map +0 -1
- package/build/controls/Unknown.js.map +0 -1
- package/build/controls/UpDownAnalog.js +0 -44
- package/build/controls/UpDownAnalog.js.map +0 -1
- package/build/controls/ValueSelector.js.map +0 -1
- package/build/controls/WindowMonitor.js +0 -84
- package/build/controls/WindowMonitor.js.map +0 -1
- package/build/controls/control-base.js +0 -12
- package/build/controls/control-base.js.map +0 -1
- package/build/loxone-handler-base.js +0 -186
- package/build/loxone-handler-base.js.map +0 -1
- package/build/main.js +0 -643
- package/build/main.js.map +0 -1
- package/build/weather-server-handler.js +0 -120
- package/build/weather-server-handler.js.map +0 -1
- package/doc/details-missing-control-type.png +0 -0
- package/doc/log-missing-control-type.png +0 -0
- package/doc/loxone-config-display-diagnostics.png +0 -0
- package/doc/loxone-config-info-only-digital.png +0 -0
- package/doc/loxone-config-use-in-visualization.png +0 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/* eslint-disable jsdoc/require-jsdoc */
|
|
2
|
+
|
|
3
|
+
export interface StructureFile {
|
|
4
|
+
lastModified: string;
|
|
5
|
+
msInfo: MSInfo;
|
|
6
|
+
globalStates: GlobalStates;
|
|
7
|
+
operatingModes: OperatingModes;
|
|
8
|
+
rooms: { [key: string]: Room };
|
|
9
|
+
cats: { [key: string]: CatValue };
|
|
10
|
+
controls: { [key: string]: Control };
|
|
11
|
+
weatherServer: WeatherServer;
|
|
12
|
+
times: { [key: string]: FieldType };
|
|
13
|
+
mediaServer: { [key: string]: MediaServer };
|
|
14
|
+
autopilot: { [key: string]: Autopilot };
|
|
15
|
+
messageCenter: MessageCenter;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface MSInfo {
|
|
19
|
+
serialNr: string;
|
|
20
|
+
msName: string;
|
|
21
|
+
projectName: string;
|
|
22
|
+
localUrl: string;
|
|
23
|
+
remoteUrl: string;
|
|
24
|
+
tempUnit: number;
|
|
25
|
+
currency: string;
|
|
26
|
+
squareMeasure: string;
|
|
27
|
+
location: string;
|
|
28
|
+
languageCode: string;
|
|
29
|
+
heatPeriodStart: string;
|
|
30
|
+
heatPeriodEnd: string;
|
|
31
|
+
coolPeriodStart: string;
|
|
32
|
+
coolPeriodEnd: string;
|
|
33
|
+
catTitle: string;
|
|
34
|
+
roomTitle: string;
|
|
35
|
+
miniserverType: number;
|
|
36
|
+
deviceMonitor: string;
|
|
37
|
+
currentUser: CurrentUser;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export type GlobalStates = { [key: string]: string };
|
|
41
|
+
|
|
42
|
+
export type OperatingModes = { [key: string]: string };
|
|
43
|
+
|
|
44
|
+
export type Controls = { [key: string]: Control };
|
|
45
|
+
|
|
46
|
+
export interface CurrentUser {
|
|
47
|
+
name: string;
|
|
48
|
+
uuid: string;
|
|
49
|
+
isAdmin: boolean;
|
|
50
|
+
changePassword: boolean;
|
|
51
|
+
userRights: number;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface CatValue {
|
|
55
|
+
uuid: string;
|
|
56
|
+
name: string;
|
|
57
|
+
image: string;
|
|
58
|
+
defaultRating: number;
|
|
59
|
+
isFavorite: boolean;
|
|
60
|
+
type: string;
|
|
61
|
+
color: string;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface Room {
|
|
65
|
+
uuid: string;
|
|
66
|
+
name: string;
|
|
67
|
+
image: string;
|
|
68
|
+
defaultRating: number;
|
|
69
|
+
isFavorite: boolean;
|
|
70
|
+
type: number;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export interface FieldType {
|
|
74
|
+
id: number;
|
|
75
|
+
name: string;
|
|
76
|
+
analog: boolean;
|
|
77
|
+
format?: string;
|
|
78
|
+
unit?: string;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export interface WeatherServer {
|
|
82
|
+
states: WeatherServerStates;
|
|
83
|
+
format: Format;
|
|
84
|
+
weatherTypeTexts: { [key: string]: string };
|
|
85
|
+
weatherFieldTypes: { [key: string]: FieldType };
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export interface Format {
|
|
89
|
+
relativeHumidity: string;
|
|
90
|
+
temperature: string;
|
|
91
|
+
windSpeed: string;
|
|
92
|
+
precipitation: string;
|
|
93
|
+
barometricPressure: string;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface WeatherServerStates {
|
|
97
|
+
actual: string;
|
|
98
|
+
forecast: string;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export interface MediaServer {
|
|
102
|
+
name: string;
|
|
103
|
+
type: number;
|
|
104
|
+
host: string;
|
|
105
|
+
mac: string;
|
|
106
|
+
uuidAction: string;
|
|
107
|
+
useTriggerCard: boolean;
|
|
108
|
+
states: MediaServerStates;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export interface MediaServerStates {
|
|
112
|
+
audioEvents: string;
|
|
113
|
+
apiVersion: string;
|
|
114
|
+
serverState: string;
|
|
115
|
+
grouping: string;
|
|
116
|
+
connState: string;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export interface Autopilot {
|
|
120
|
+
name: string;
|
|
121
|
+
uuidAction: string;
|
|
122
|
+
states: AutopilotStates;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export interface AutopilotStates {
|
|
126
|
+
changed: string;
|
|
127
|
+
history: string;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export interface MessageCenter {
|
|
131
|
+
name: string;
|
|
132
|
+
uuidAction: string;
|
|
133
|
+
states: MessageCenterStates;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export interface MessageCenterStates {
|
|
137
|
+
changed: string;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export interface Control {
|
|
141
|
+
name: string;
|
|
142
|
+
type: string;
|
|
143
|
+
uuidAction: string;
|
|
144
|
+
room: string;
|
|
145
|
+
cat: string;
|
|
146
|
+
defaultRating: number;
|
|
147
|
+
isFavorite: boolean;
|
|
148
|
+
isSecured: boolean;
|
|
149
|
+
details: { [key: string]: unknown };
|
|
150
|
+
states: ControlStates;
|
|
151
|
+
subControls?: Controls;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export type ControlStates = { [key: string]: string };
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { sprintf } from 'sprintf-js';
|
|
2
|
+
import { LoxoneHandlerBase } from './loxone-handler-base';
|
|
3
|
+
import type { Loxone } from './main';
|
|
4
|
+
import type { Format, WeatherServer } from './structure-file';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Handler for Weather Server information.
|
|
8
|
+
*/
|
|
9
|
+
export class WeatherServerHandler extends LoxoneHandlerBase {
|
|
10
|
+
private readonly deviceName = 'WeatherServer';
|
|
11
|
+
private format!: Format;
|
|
12
|
+
private weatherTypeTexts: Record<string, string> = {};
|
|
13
|
+
private forecastChannelsCount = 0;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Creates an instance of WeatherServerHandler.
|
|
17
|
+
*
|
|
18
|
+
* @param adapter The Loxone adapter instance.
|
|
19
|
+
*/
|
|
20
|
+
public constructor(protected readonly adapter: Loxone) {
|
|
21
|
+
super(adapter);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Loads the weather server data and sets up state objects and event handlers.
|
|
26
|
+
*
|
|
27
|
+
* @param data The WeatherServer data from the structure file.
|
|
28
|
+
* @param filter The filter for forecast data ('current', '1day', or 'all').
|
|
29
|
+
* @returns A promise that resolves when loading is complete.
|
|
30
|
+
*/
|
|
31
|
+
public async loadAsync(data: WeatherServer, filter: 'current' | '1day' | 'all'): Promise<void> {
|
|
32
|
+
if (data === undefined || !('states' in data) || !('actual' in data.states)) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
this.format = data.format;
|
|
37
|
+
this.weatherTypeTexts = data.weatherTypeTexts;
|
|
38
|
+
|
|
39
|
+
const deviceName = 'WeatherServer';
|
|
40
|
+
await this.updateObjectAsync(deviceName, {
|
|
41
|
+
type: 'device',
|
|
42
|
+
common: {
|
|
43
|
+
name: deviceName,
|
|
44
|
+
role: 'weather',
|
|
45
|
+
},
|
|
46
|
+
native: { data: data as any },
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
await this.setWeatherObjectsAsync('Actual');
|
|
50
|
+
|
|
51
|
+
this.addStateEventHandler(data.states.actual, async (value: any) => {
|
|
52
|
+
await this.setWeatherStates(`${deviceName}.Actual`, value.entries[0]);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
if (filter === 'current') {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
this.addStateEventHandler(data.states.forecast, async (value: any) => {
|
|
60
|
+
const hourCount = Math.min(value.entries.length, filter === '1day' ? 24 : Number.MAX_VALUE);
|
|
61
|
+
for (let i = 0; i < hourCount; i++) {
|
|
62
|
+
const channelName = `Hour${sprintf('%02d', i + 1)}`;
|
|
63
|
+
if (i >= this.forecastChannelsCount) {
|
|
64
|
+
await this.setWeatherObjectsAsync(channelName);
|
|
65
|
+
this.forecastChannelsCount++;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
await this.setWeatherStates(`${deviceName}.${channelName}`, value.entries[i]);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
private async setWeatherStates(parent: string, values: any): Promise<void> {
|
|
74
|
+
if (values === undefined) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
await this.setStateAck(`${parent}.barometricPressure`, values.barometricPressure);
|
|
79
|
+
await this.setFormattedStateAck(
|
|
80
|
+
`${parent}.barometricPressure-formatted`,
|
|
81
|
+
values.barometricPressure,
|
|
82
|
+
this.format.barometricPressure,
|
|
83
|
+
);
|
|
84
|
+
await this.setStateAck(`${parent}.dewPoint`, values.dewPoint);
|
|
85
|
+
await this.setFormattedStateAck(`${parent}.dewPoint-formatted`, values.dewPoint, this.format.temperature);
|
|
86
|
+
await this.setStateAck(`${parent}.perceivedTemperature`, values.perceivedTemperature);
|
|
87
|
+
await this.setFormattedStateAck(
|
|
88
|
+
`${parent}.perceivedTemperature-formatted`,
|
|
89
|
+
values.perceivedTemperature,
|
|
90
|
+
this.format.temperature,
|
|
91
|
+
);
|
|
92
|
+
await this.setStateAck(`${parent}.precipitation`, values.precipitation);
|
|
93
|
+
await this.setFormattedStateAck(
|
|
94
|
+
`${parent}.precipitation-formatted`,
|
|
95
|
+
values.precipitation,
|
|
96
|
+
this.format.precipitation,
|
|
97
|
+
);
|
|
98
|
+
await this.setStateAck(`${parent}.relativeHumidity`, values.relativeHumidity);
|
|
99
|
+
await this.setFormattedStateAck(
|
|
100
|
+
`${parent}.relativeHumidity-formatted`,
|
|
101
|
+
values.relativeHumidity,
|
|
102
|
+
this.format.relativeHumidity,
|
|
103
|
+
);
|
|
104
|
+
await this.setStateAck(`${parent}.solarRadiation`, values.solarRadiation);
|
|
105
|
+
await this.setStateAck(`${parent}.temperature`, values.temperature);
|
|
106
|
+
await this.setFormattedStateAck(`${parent}.temperature-formatted`, values.temperature, this.format.temperature);
|
|
107
|
+
await this.setTimeStateAck(`${parent}.timestamp`, values.timestamp);
|
|
108
|
+
await this.setStateAck(`${parent}.weatherType`, values.weatherType);
|
|
109
|
+
await this.setStateAck(`${parent}.weatherType-text`, this.weatherTypeTexts[values.weatherType]);
|
|
110
|
+
await this.setStateAck(`${parent}.windDirection`, values.windDirection);
|
|
111
|
+
await this.setStateAck(`${parent}.windSpeed`, values.windSpeed);
|
|
112
|
+
await this.setFormattedStateAck(`${parent}.windSpeed-formatted`, values.windSpeed, this.format.windSpeed);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
private async setTimeStateAck(id: string, miniserverTime: number): Promise<void> {
|
|
116
|
+
const value = miniserverTime * 1000 + new Date(2009, 0, 1).getTime();
|
|
117
|
+
await this.setStateAck(id, value);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
private async setWeatherObjectsAsync(channelName: string): Promise<void> {
|
|
121
|
+
await this.updateObjectAsync(`${this.deviceName}.${channelName}`, {
|
|
122
|
+
type: 'channel',
|
|
123
|
+
common: {
|
|
124
|
+
name: channelName,
|
|
125
|
+
role: 'weather.current',
|
|
126
|
+
},
|
|
127
|
+
native: {},
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
await this.setWeatherObjectAsync(
|
|
131
|
+
channelName,
|
|
132
|
+
'barometricPressure',
|
|
133
|
+
`${channelName}: Barometric pressure`,
|
|
134
|
+
'number',
|
|
135
|
+
'value',
|
|
136
|
+
);
|
|
137
|
+
await this.setWeatherObjectAsync(
|
|
138
|
+
channelName,
|
|
139
|
+
'barometricPressure-formatted',
|
|
140
|
+
`${channelName}: Barometric pressure: formatted`,
|
|
141
|
+
'string',
|
|
142
|
+
'text',
|
|
143
|
+
);
|
|
144
|
+
await this.setWeatherObjectAsync(
|
|
145
|
+
channelName,
|
|
146
|
+
'dewPoint',
|
|
147
|
+
`${channelName}: Dew point`,
|
|
148
|
+
'number',
|
|
149
|
+
'value.temperature',
|
|
150
|
+
);
|
|
151
|
+
await this.setWeatherObjectAsync(
|
|
152
|
+
channelName,
|
|
153
|
+
'dewPoint-formatted',
|
|
154
|
+
`${channelName}: Dew point: formatted`,
|
|
155
|
+
'string',
|
|
156
|
+
'text',
|
|
157
|
+
);
|
|
158
|
+
await this.setWeatherObjectAsync(
|
|
159
|
+
channelName,
|
|
160
|
+
'perceivedTemperature',
|
|
161
|
+
`${channelName}: Perceived temperature`,
|
|
162
|
+
'number',
|
|
163
|
+
'value.temperature',
|
|
164
|
+
);
|
|
165
|
+
await this.setWeatherObjectAsync(
|
|
166
|
+
channelName,
|
|
167
|
+
'perceivedTemperature-formatted',
|
|
168
|
+
`${channelName}: Perceived temperature: formatted`,
|
|
169
|
+
'string',
|
|
170
|
+
'text',
|
|
171
|
+
);
|
|
172
|
+
await this.setWeatherObjectAsync(
|
|
173
|
+
channelName,
|
|
174
|
+
'precipitation',
|
|
175
|
+
`${channelName}: Precipitation`,
|
|
176
|
+
'number',
|
|
177
|
+
'value',
|
|
178
|
+
);
|
|
179
|
+
await this.setWeatherObjectAsync(
|
|
180
|
+
channelName,
|
|
181
|
+
'precipitation-formatted',
|
|
182
|
+
`${channelName}: Precipitation: formatted`,
|
|
183
|
+
'string',
|
|
184
|
+
'text',
|
|
185
|
+
);
|
|
186
|
+
await this.setWeatherObjectAsync(
|
|
187
|
+
channelName,
|
|
188
|
+
'relativeHumidity',
|
|
189
|
+
`${channelName}: Relative humidity`,
|
|
190
|
+
'number',
|
|
191
|
+
'value.humidity',
|
|
192
|
+
);
|
|
193
|
+
await this.setWeatherObjectAsync(
|
|
194
|
+
channelName,
|
|
195
|
+
'relativeHumidity-formatted',
|
|
196
|
+
`${channelName}: Relative humidity: formatted`,
|
|
197
|
+
'string',
|
|
198
|
+
'text',
|
|
199
|
+
);
|
|
200
|
+
await this.setWeatherObjectAsync(
|
|
201
|
+
channelName,
|
|
202
|
+
'solarRadiation',
|
|
203
|
+
`${channelName}: Solar radiation`,
|
|
204
|
+
'number',
|
|
205
|
+
'value',
|
|
206
|
+
);
|
|
207
|
+
await this.setWeatherObjectAsync(
|
|
208
|
+
channelName,
|
|
209
|
+
'temperature',
|
|
210
|
+
`${channelName}: Temperature`,
|
|
211
|
+
'number',
|
|
212
|
+
'value.temperature',
|
|
213
|
+
);
|
|
214
|
+
await this.setWeatherObjectAsync(
|
|
215
|
+
channelName,
|
|
216
|
+
'temperature-formatted',
|
|
217
|
+
`${channelName}: Temperature: formatted`,
|
|
218
|
+
'string',
|
|
219
|
+
'text',
|
|
220
|
+
);
|
|
221
|
+
await this.setWeatherObjectAsync(channelName, 'timestamp', `${channelName}: Timestamp`, 'number', 'value.time');
|
|
222
|
+
await this.setWeatherObjectAsync(channelName, 'weatherType', `${channelName}: Weather type`, 'number', 'value');
|
|
223
|
+
await this.setWeatherObjectAsync(
|
|
224
|
+
channelName,
|
|
225
|
+
'weatherType-text',
|
|
226
|
+
`${channelName}: Weather type: text`,
|
|
227
|
+
'string',
|
|
228
|
+
'text',
|
|
229
|
+
);
|
|
230
|
+
await this.setWeatherObjectAsync(
|
|
231
|
+
channelName,
|
|
232
|
+
'windDirection',
|
|
233
|
+
`${channelName}: Wind direction`,
|
|
234
|
+
'number',
|
|
235
|
+
'value',
|
|
236
|
+
);
|
|
237
|
+
await this.setWeatherObjectAsync(channelName, 'windSpeed', `${channelName}: Wind speed`, 'number', 'value');
|
|
238
|
+
await this.setWeatherObjectAsync(
|
|
239
|
+
channelName,
|
|
240
|
+
'windSpeed-formatted',
|
|
241
|
+
`${channelName}: Wind speed: formatted`,
|
|
242
|
+
'string',
|
|
243
|
+
'text',
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
private async setWeatherObjectAsync(
|
|
248
|
+
channelName: string,
|
|
249
|
+
id: string,
|
|
250
|
+
name: string,
|
|
251
|
+
type: ioBroker.CommonType,
|
|
252
|
+
role: string,
|
|
253
|
+
): Promise<void> {
|
|
254
|
+
await this.updateObjectAsync(`${this.deviceName}.${channelName}.${id}`, {
|
|
255
|
+
type: 'state',
|
|
256
|
+
common: {
|
|
257
|
+
name: name,
|
|
258
|
+
read: true,
|
|
259
|
+
write: false,
|
|
260
|
+
type: type,
|
|
261
|
+
role: role,
|
|
262
|
+
},
|
|
263
|
+
native: {},
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
}
|
package/admin/admin.d.ts
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
declare let systemDictionary: Record<string, Record<string, string>>;
|
|
2
|
-
|
|
3
|
-
declare let load: (settings: Record<string, unknown>, onChange: (hasChanges: boolean) => void) => void;
|
|
4
|
-
declare let save: (callback: (settings: Record<string, unknown>) => void) => void;
|
|
5
|
-
|
|
6
|
-
// make load and save exist on the window object
|
|
7
|
-
interface Window {
|
|
8
|
-
load: typeof load;
|
|
9
|
-
save: typeof save;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
declare const instance: number;
|
|
13
|
-
declare const adapter: string;
|
|
14
|
-
/** Translates text */
|
|
15
|
-
declare function _(text: string): string;
|
|
16
|
-
declare const socket: ioBrokerSocket;
|
|
17
|
-
declare function sendTo(
|
|
18
|
-
instance: any | null,
|
|
19
|
-
command: string,
|
|
20
|
-
message: any,
|
|
21
|
-
callback: (result: SendToResult) => void | Promise<void>,
|
|
22
|
-
): void;
|
|
23
|
-
|
|
24
|
-
interface SendToResult {
|
|
25
|
-
error?: string | Error;
|
|
26
|
-
result?: any;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
// tslint:disable-next-line:class-name
|
|
30
|
-
interface ioBrokerSocket {
|
|
31
|
-
emit(command: 'subscribeObjects', pattern: string, callback?: (err?: string) => void | Promise<void>): void;
|
|
32
|
-
emit(command: 'subscribeStates', pattern: string, callback?: (err?: string) => void | Promise<void>): void;
|
|
33
|
-
emit(command: 'unsubscribeObjects', pattern: string, callback?: (err?: string) => void | Promise<void>): void;
|
|
34
|
-
emit(command: 'unsubscribeStates', pattern: string, callback?: (err?: string) => void | Promise<void>): void;
|
|
35
|
-
|
|
36
|
-
emit(
|
|
37
|
-
event: 'getObjectView',
|
|
38
|
-
view: 'system',
|
|
39
|
-
type: 'device',
|
|
40
|
-
options: ioBroker.GetObjectViewParams,
|
|
41
|
-
callback: (err: string | undefined, result?: any) => void | Promise<void>,
|
|
42
|
-
): void;
|
|
43
|
-
emit(event: 'getStates', callback: (err: string | undefined, result?: Record<string, any>) => void): void;
|
|
44
|
-
emit(event: 'getState', id: string, callback: (err: string | undefined, result?: ioBroker.State) => void): void;
|
|
45
|
-
emit(
|
|
46
|
-
event: 'setState',
|
|
47
|
-
id: string,
|
|
48
|
-
state: unknown,
|
|
49
|
-
callback: (err: string | undefined, result?: any) => void,
|
|
50
|
-
): void;
|
|
51
|
-
|
|
52
|
-
on(event: 'objectChange', handler: ioBroker.ObjectChangeHandler): void;
|
|
53
|
-
on(event: 'stateChange', handler: ioBroker.StateChangeHandler): void;
|
|
54
|
-
removeEventHandler(event: 'objectChange', handler: ioBroker.ObjectChangeHandler): void;
|
|
55
|
-
removeEventHandler(event: 'stateChange', handler: ioBroker.StateChangeHandler): void;
|
|
56
|
-
|
|
57
|
-
// TODO: other events
|
|
58
|
-
}
|
package/admin/index_m.html
DELETED
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
<html>
|
|
2
|
-
<head>
|
|
3
|
-
<!-- Load ioBroker scripts and styles-->
|
|
4
|
-
<link rel="stylesheet" type="text/css" href="../../css/adapter.css" />
|
|
5
|
-
<link rel="stylesheet" type="text/css" href="../../lib/css/materialize.css" />
|
|
6
|
-
|
|
7
|
-
<script type="text/javascript" src="../../lib/js/jquery-3.2.1.min.js"></script>
|
|
8
|
-
<script type="text/javascript" src="../../socket.io/socket.io.js"></script>
|
|
9
|
-
|
|
10
|
-
<script type="text/javascript" src="../../js/translate.js"></script>
|
|
11
|
-
<script type="text/javascript" src="../../lib/js/materialize.js"></script>
|
|
12
|
-
<script type="text/javascript" src="../../js/adapter-settings.js"></script>
|
|
13
|
-
|
|
14
|
-
<!-- Load our own files -->
|
|
15
|
-
<link rel="stylesheet" type="text/css" href="style.css" />
|
|
16
|
-
<script type="text/javascript" src="words.js"></script>
|
|
17
|
-
|
|
18
|
-
<script type="text/javascript">
|
|
19
|
-
// This will be called by the admin adapter when the settings page loads
|
|
20
|
-
function load(settings, onChange) {
|
|
21
|
-
// example: select elements with id=key and class=value and insert value
|
|
22
|
-
if (!settings) return;
|
|
23
|
-
|
|
24
|
-
// set defaults for newly added parameters
|
|
25
|
-
settings.weatherServer = settings.weatherServer || 'all';
|
|
26
|
-
|
|
27
|
-
$('.value').each(function () {
|
|
28
|
-
var $key = $(this);
|
|
29
|
-
var id = $key.attr('id');
|
|
30
|
-
if ($key.attr('type') === 'checkbox') {
|
|
31
|
-
// do not call onChange direct, because onChange could expect some arguments
|
|
32
|
-
$key.prop('checked', settings[id]).on('change', () => onChange());
|
|
33
|
-
} else {
|
|
34
|
-
// do not call onChange direct, because onChange could expect some arguments
|
|
35
|
-
$key.val(settings[id])
|
|
36
|
-
.on('change', () => onChange())
|
|
37
|
-
.on('keyup', () => onChange());
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
onChange(false);
|
|
41
|
-
// reinitialize all the Materialize labels on the page if you are dynamically adding inputs:
|
|
42
|
-
if (M) M.updateTextFields();
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// This will be called by the admin adapter when the user presses the save button
|
|
46
|
-
function save(callback) {
|
|
47
|
-
// example: select elements with class=value and build settings object
|
|
48
|
-
var obj = {};
|
|
49
|
-
$('.value').each(function () {
|
|
50
|
-
var $this = $(this);
|
|
51
|
-
if ($this.attr('type') === 'checkbox') {
|
|
52
|
-
obj[$this.attr('id')] = $this.prop('checked');
|
|
53
|
-
} else {
|
|
54
|
-
obj[$this.attr('id')] = $this.val();
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
callback(obj);
|
|
58
|
-
}
|
|
59
|
-
</script>
|
|
60
|
-
</head>
|
|
61
|
-
|
|
62
|
-
<body>
|
|
63
|
-
<div class="m adapter-container">
|
|
64
|
-
<div class="row">
|
|
65
|
-
<div class="col s12 m4 l2">
|
|
66
|
-
<img src="loxone.png" class="logo" />
|
|
67
|
-
</div>
|
|
68
|
-
</div>
|
|
69
|
-
|
|
70
|
-
<div class="row">
|
|
71
|
-
<div class="col s6 input-field">
|
|
72
|
-
<input type="text" class="value" id="host" />
|
|
73
|
-
<label for="host" class="translate">Miniserver Hostname / IP</label>
|
|
74
|
-
</div>
|
|
75
|
-
|
|
76
|
-
<div class="col s6 input-field">
|
|
77
|
-
<input type="text" class="value" id="port" />
|
|
78
|
-
<label for="port" class="translate">Miniserver Port</label>
|
|
79
|
-
</div>
|
|
80
|
-
</div>
|
|
81
|
-
|
|
82
|
-
<div class="row">
|
|
83
|
-
<div class="col s6 input-field">
|
|
84
|
-
<input type="text" class="value" id="username" />
|
|
85
|
-
<label for="username" class="translate">Miniserver Username</label>
|
|
86
|
-
</div>
|
|
87
|
-
|
|
88
|
-
<div class="col s6 input-field">
|
|
89
|
-
<input type="password" autocomplete="off" class="value" id="password" />
|
|
90
|
-
<label for="password" class="translate">Miniserver Password</label>
|
|
91
|
-
</div>
|
|
92
|
-
</div>
|
|
93
|
-
|
|
94
|
-
<div class="row">
|
|
95
|
-
<div class="col s3 translate">Synchronize</div>
|
|
96
|
-
|
|
97
|
-
<div class="col s3 input-field">
|
|
98
|
-
<input type="checkbox" class="value" id="syncNames" />
|
|
99
|
-
<label for="syncNames" class="translate">Names</label>
|
|
100
|
-
</div>
|
|
101
|
-
|
|
102
|
-
<div class="col s3 input-field">
|
|
103
|
-
<input type="checkbox" class="value" id="syncRooms" />
|
|
104
|
-
<label for="syncRooms" class="translate">Rooms</label>
|
|
105
|
-
</div>
|
|
106
|
-
|
|
107
|
-
<div class="col s3 input-field">
|
|
108
|
-
<input type="checkbox" class="value" id="syncFunctions" />
|
|
109
|
-
<label for="syncFunctions" class="translate">Functions</label>
|
|
110
|
-
</div>
|
|
111
|
-
</div>
|
|
112
|
-
|
|
113
|
-
<div class="row">
|
|
114
|
-
<div class="col s6 input-field">
|
|
115
|
-
<select id="weatherServer" class="value">
|
|
116
|
-
<option value="off" class="translate">Don't synchronize weather data</option>
|
|
117
|
-
<option value="current" class="translate">Synchronize current weather only</option>
|
|
118
|
-
<option value="1day" class="translate">Synchronize 24 hours of weather forcast</option>
|
|
119
|
-
<option value="all" class="translate">Synchronize entire weather forcast</option>
|
|
120
|
-
</select>
|
|
121
|
-
<label for="weatherServer" class="translate">Weather Server</label>
|
|
122
|
-
</div>
|
|
123
|
-
</div>
|
|
124
|
-
</div>
|
|
125
|
-
</body>
|
|
126
|
-
</html>
|
package/admin/style.css
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/* You can delete those if you want. I just found them very helpful */
|
|
2
|
-
* {
|
|
3
|
-
box-sizing: border-box
|
|
4
|
-
}
|
|
5
|
-
.m {
|
|
6
|
-
/* Don't cut off dropdowns! */
|
|
7
|
-
overflow: initial;
|
|
8
|
-
}
|
|
9
|
-
.m.adapter-container,
|
|
10
|
-
.m.adapter-container > div.App {
|
|
11
|
-
/* Fix layout/scrolling issues with tabs */
|
|
12
|
-
height: 100%;
|
|
13
|
-
width: 100%;
|
|
14
|
-
position: relative;
|
|
15
|
-
}
|
|
16
|
-
.m .select-wrapper + label {
|
|
17
|
-
/* The positioning for dropdown labels is messed up */
|
|
18
|
-
transform: none !important;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
label > i[title] {
|
|
22
|
-
/* Display the help cursor for the tooltip icons and fix their positioning */
|
|
23
|
-
cursor: help;
|
|
24
|
-
margin-left: 0.25em;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
.dropdown-content {
|
|
28
|
-
/* Don't wrap text in dropdowns */
|
|
29
|
-
white-space: nowrap;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/* Add your styles here */
|
package/admin/words.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/*global systemDictionary:true */
|
|
2
|
-
/*
|
|
3
|
-
+===================== DO NOT MODIFY ======================+
|
|
4
|
-
| This file was generated by translate-adapter, please use |
|
|
5
|
-
| `translate-adapter adminLanguages2words` to update it. |
|
|
6
|
-
+===================== DO NOT MODIFY ======================+
|
|
7
|
-
*/
|
|
8
|
-
'use strict';
|
|
9
|
-
|
|
10
|
-
systemDictionary = {
|
|
11
|
-
"Don't synchronize weather data": { "en": "Don't synchronize weather data", "de": "Wetterdaten nicht synchronisieren", "ru": "Не синхронизировать данные о погоде", "pt": "Não sincronize dados meteorológicos", "nl": "Synchroniseer geen weergegevens", "fr": "Ne pas synchroniser les données météorologiques", "it": "Non sincronizzare i dati meteorologici", "es": "No sincronice los datos meteorológicos", "pl": "Nie synchronizuj danych pogodowych", "zh-cn": "不同步天气数据"},
|
|
12
|
-
"Functions": { "en": "Functions", "de": "Funktionen", "ru": "Функции", "pt": "Funções", "nl": "Functies", "fr": "Les fonctions", "it": "Funzioni", "es": "Funciones", "pl": "Funkcje", "zh-cn": "职能"},
|
|
13
|
-
"Loxone Miniserver adapter settings": { "en": "Loxone Miniserver adapter settings", "de": "Loxone Miniserver Adapter-Einstellungen", "ru": "Настройки драйвера Loxone Miniserver", "pt": "Configurações do adaptador do Miniserver Loxone", "nl": "Loxone Miniserver adapter instellingen", "fr": "Paramètres de l'adaptateur Loxone Miniserver", "it": "Impostazioni dell'adattatore Loxone Miniserver", "es": "Configuración del adaptador Loxone Miniserver", "pl": "Ustawienia adaptera Loxone Miniserver", "zh-cn": "Loxone Miniserver适配器设置"},
|
|
14
|
-
"Miniserver Hostname / IP": { "en": "Miniserver host name / IP", "de": "Hostname / IP des Miniservers", "ru": "IP / Hostname Минисервера", "pt": "Nome do host / IP do miniservidor", "nl": "Miniserver hostnaam / IP", "fr": "Nom d'hôte / IP du miniserver", "it": "Nome host / IP Miniserver", "es": "IP / nombre de host del Miniserver", "pl": "Nazwa / adres IP hosta Miniserver", "zh-cn": "小型服务器主机名/ IP"},
|
|
15
|
-
"Miniserver Password": { "en": "Miniserver password", "de": "Kennwort des Miniservers", "ru": "Пароль", "pt": "Senha do Miniserver", "nl": "Miniserver wachtwoord", "fr": "Mot de passe Miniserver", "it": "Password Miniserver", "es": "Contraseña de Miniserver", "pl": "Hasło miniservera", "zh-cn": "小型服务器密码"},
|
|
16
|
-
"Miniserver Port": { "en": "Miniserver port", "de": "Port des Miniservers", "ru": "Порт Минисервера", "pt": "Porta do Miniserver", "nl": "Miniserver poort", "fr": "Port Miniserver", "it": "Porta Miniserver", "es": "Puerto miniserver", "pl": "Port Miniserver", "zh-cn": "小型服务器端口"},
|
|
17
|
-
"Miniserver Username": { "en": "Miniserver username", "de": "Benutzername des Miniservers", "ru": "Имя пользователя", "pt": "Nome de usuário do Miniserver", "nl": "Miniserver gebruikersnaam", "fr": "Nom d'utilisateur Miniserver", "it": "Nome utente Miniserver", "es": "Nombre de usuario de Miniserver", "pl": "Nazwa użytkownika Miniserver", "zh-cn": "小型服务器用户名"},
|
|
18
|
-
"Names": { "en": "Names", "de": "Namen", "ru": "Имена", "pt": "Nomes", "nl": "Namen", "fr": "Noms", "it": "Nomi", "es": "Nombres", "pl": "Nazwy", "zh-cn": "名字"},
|
|
19
|
-
"Rooms": { "en": "Rooms", "de": "Räume", "ru": "Комнаты", "pt": "quartos", "nl": "Ruimtes", "fr": "Pièces", "it": "Camere", "es": "Habitaciones", "pl": "Pokoje", "zh-cn": "房间数"},
|
|
20
|
-
"Synchronize": { "en": "Synchronize", "de": "Synchronisieren", "ru": "Синхронизация", "pt": "Sincronizar", "nl": "Syncroniseer", "fr": "Synchroniser", "it": "Sincronizzare", "es": "Sincronizar", "pl": "Synchronizować", "zh-cn": "同步化"},
|
|
21
|
-
"Synchronize 24 hours of weather forcast": { "en": "Synchronize 24 hours of weather forcast", "de": "24 Stunden Wettervorhersage synchronisieren", "ru": "Синхронизация 24-часового прогноза погоды", "pt": "Sincronizar 24 horas de previsão do tempo", "nl": "Synchroniseer 24 uur weersvoorspelling", "fr": "Synchroniser 24 heures de prévisions météo", "it": "Sincronizza 24 ore di previsione meteo", "es": "Sincronizar 24 horas de previsión meteorológica", "pl": "Synchronizuj 24-godzinne prognozy pogody", "zh-cn": "同步24小时天气预报"},
|
|
22
|
-
"Synchronize current weather only": { "en": "Synchronize current weather only", "de": "Nur aktuelles Wetter synchronisieren", "ru": "Синхронизировать только текущую погоду", "pt": "Sincronizar apenas o clima atual", "nl": "Synchroniseer alleen het huidige weer", "fr": "Synchroniser uniquement la météo actuelle", "it": "Sincronizza solo il tempo corrente", "es": "Sincronizar solo el clima actual", "pl": "Synchronizuj tylko aktualną pogodę", "zh-cn": "仅同步当前天气"},
|
|
23
|
-
"Synchronize entire weather forcast": { "en": "Synchronize entire weather forcast", "de": "Gesamte Wettervorhersage synchronisieren", "ru": "Синхронизировать весь прогноз погоды", "pt": "Sincronizar previsão do tempo inteiro", "nl": "Synchroniseer de volledige weersvoorspelling", "fr": "Synchroniser toutes les prévisions météorologiques", "it": "Sincronizza l'intera previsione meteo", "es": "Sincronizar todo el pronóstico del tiempo", "pl": "Synchronizuj całą prognozę pogody", "zh-cn": "同步整个天气预报"},
|
|
24
|
-
"Weather Server": { "en": "Weather Server", "de": "Wetterserver", "ru": "Сервер погоды", "pt": "Servidor Meteorológico", "nl": "Weer Server", "fr": "Serveur météo", "it": "Weather Server", "es": "Servidor meteorológico", "pl": "Serwer pogody", "zh-cn": "天气服务器"},
|
|
25
|
-
};
|