n8n-nodes-vw-weconnect 0.1.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/README.md +107 -0
- package/dist/credentials/VwWeConnectCredentials.credentials.d.ts +7 -0
- package/dist/credentials/VwWeConnectCredentials.credentials.js +44 -0
- package/dist/nodes/VwWeConnect/VwWeConnect.node.d.ts +5 -0
- package/dist/nodes/VwWeConnect/VwWeConnect.node.js +307 -0
- package/dist/nodes/VwWeConnect/volkswagen.svg +6 -0
- package/package.json +58 -0
package/README.md
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# n8n-nodes-vw-weconnect
|
|
2
|
+
|
|
3
|
+
This is an n8n community node for [VW We Connect](https://www.volkswagen.de/de/besitzer-und-nutzer/myvolkswagen.html).
|
|
4
|
+
|
|
5
|
+
Control your Volkswagen T6.1, Multivan, and other VW vehicles via We Connect. Perfect for Home Assistant integration!
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- **Get Position** - Get GPS coordinates of your vehicle (is the bus at home?)
|
|
10
|
+
- **Get Vehicle Status** - Doors, windows, fuel level, etc.
|
|
11
|
+
- **Get Heater Status** - Check Standheizung status
|
|
12
|
+
- **Start Heater** - Start the Standheizung (auxiliary heater)
|
|
13
|
+
- **Stop Heater** - Stop the Standheizung
|
|
14
|
+
|
|
15
|
+
## Use Case Example
|
|
16
|
+
|
|
17
|
+
Automate your Standheizung with n8n + Home Assistant:
|
|
18
|
+
- Check if the vehicle is at home (position)
|
|
19
|
+
- Check outside temperature (Home Assistant)
|
|
20
|
+
- If cold and vehicle is home → Start Standheizung
|
|
21
|
+
|
|
22
|
+
## Installation
|
|
23
|
+
|
|
24
|
+
### In n8n
|
|
25
|
+
|
|
26
|
+
1. Go to **Settings > Community Nodes**
|
|
27
|
+
2. Select **Install**
|
|
28
|
+
3. Enter `n8n-nodes-vw-weconnect`
|
|
29
|
+
4. Agree to the risks and select **Install**
|
|
30
|
+
|
|
31
|
+
### Manual Installation
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npm install n8n-nodes-vw-weconnect
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Credentials
|
|
38
|
+
|
|
39
|
+
You need your VW We Connect / Volkswagen ID credentials:
|
|
40
|
+
|
|
41
|
+
1. **E-Mail** - Your Volkswagen ID email
|
|
42
|
+
2. **Password** - Your Volkswagen ID password
|
|
43
|
+
3. **S-PIN** - Your 4-digit S-PIN for remote control functions
|
|
44
|
+
|
|
45
|
+
You can find/set your S-PIN in the We Connect app under Settings.
|
|
46
|
+
|
|
47
|
+
## Configuration
|
|
48
|
+
|
|
49
|
+
### VIN (Vehicle Identification Number)
|
|
50
|
+
|
|
51
|
+
Your 17-character VIN can be found:
|
|
52
|
+
- In your vehicle documents (Fahrzeugschein)
|
|
53
|
+
- In the We Connect app
|
|
54
|
+
- On the vehicle (dashboard, door frame)
|
|
55
|
+
|
|
56
|
+
Example: `WVWZZZAUZJW123456`
|
|
57
|
+
|
|
58
|
+
## Operations
|
|
59
|
+
|
|
60
|
+
| Operation | Description |
|
|
61
|
+
|-----------|-------------|
|
|
62
|
+
| Get Position | Returns GPS coordinates (latitude, longitude) |
|
|
63
|
+
| Get Vehicle Status | Returns door/window status, fuel level, mileage |
|
|
64
|
+
| Get Heater Status | Returns current Standheizung status |
|
|
65
|
+
| Start Heater | Starts Standheizung for specified duration |
|
|
66
|
+
| Stop Heater | Stops the Standheizung |
|
|
67
|
+
|
|
68
|
+
## Example Workflow
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
[Schedule Trigger: 6:00 AM]
|
|
72
|
+
↓
|
|
73
|
+
[VW We Connect: Get Position]
|
|
74
|
+
↓
|
|
75
|
+
[IF: Position is at home coordinates]
|
|
76
|
+
↓
|
|
77
|
+
[Home Assistant: Get outside temperature]
|
|
78
|
+
↓
|
|
79
|
+
[IF: Temperature < 5°C]
|
|
80
|
+
↓
|
|
81
|
+
[VW We Connect: Start Heater (30 min)]
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Important Notes
|
|
85
|
+
|
|
86
|
+
- **API Limitations**: VW may block accounts with too many requests. Use reasonable intervals.
|
|
87
|
+
- **S-PIN Required**: Remote control functions (heater) require your S-PIN.
|
|
88
|
+
- **Terms & Conditions**: Make sure you've accepted the latest We Connect terms in the app.
|
|
89
|
+
|
|
90
|
+
## Compatibility
|
|
91
|
+
|
|
92
|
+
Tested with:
|
|
93
|
+
- VW T6.1 Multivan
|
|
94
|
+
- Should work with other We Connect compatible vehicles
|
|
95
|
+
|
|
96
|
+
## Author
|
|
97
|
+
|
|
98
|
+
Created by **jygse**
|
|
99
|
+
|
|
100
|
+
## License
|
|
101
|
+
|
|
102
|
+
MIT
|
|
103
|
+
|
|
104
|
+
## Links
|
|
105
|
+
|
|
106
|
+
- [VW We Connect](https://www.volkswagen.de/de/besitzer-und-nutzer/myvolkswagen.html)
|
|
107
|
+
- [n8n Community Nodes](https://docs.n8n.io/integrations/community-nodes/)
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VwWeConnectCredentials = void 0;
|
|
4
|
+
class VwWeConnectCredentials {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.name = 'vwWeConnectCredentials';
|
|
7
|
+
this.displayName = 'VW We Connect Credentials';
|
|
8
|
+
this.documentationUrl = 'https://www.volkswagen.de/de/besitzer-und-nutzer/myvolkswagen.html';
|
|
9
|
+
this.properties = [
|
|
10
|
+
{
|
|
11
|
+
displayName: 'E-Mail',
|
|
12
|
+
name: 'email',
|
|
13
|
+
type: 'string',
|
|
14
|
+
placeholder: 'name@example.com',
|
|
15
|
+
default: '',
|
|
16
|
+
required: true,
|
|
17
|
+
description: 'Your VW We Connect / Volkswagen ID email address',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
displayName: 'Password',
|
|
21
|
+
name: 'password',
|
|
22
|
+
type: 'string',
|
|
23
|
+
typeOptions: {
|
|
24
|
+
password: true,
|
|
25
|
+
},
|
|
26
|
+
default: '',
|
|
27
|
+
required: true,
|
|
28
|
+
description: 'Your VW We Connect / Volkswagen ID password',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
displayName: 'S-PIN',
|
|
32
|
+
name: 'spin',
|
|
33
|
+
type: 'string',
|
|
34
|
+
typeOptions: {
|
|
35
|
+
password: true,
|
|
36
|
+
},
|
|
37
|
+
default: '',
|
|
38
|
+
required: true,
|
|
39
|
+
description: 'Your 4-digit S-PIN for remote control functions (Standheizung, etc.)',
|
|
40
|
+
},
|
|
41
|
+
];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.VwWeConnectCredentials = VwWeConnectCredentials;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';
|
|
2
|
+
export declare class VwWeConnect implements INodeType {
|
|
3
|
+
description: INodeTypeDescription;
|
|
4
|
+
execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
|
|
5
|
+
}
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VwWeConnect = void 0;
|
|
4
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
5
|
+
class VwWeConnect {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.description = {
|
|
8
|
+
displayName: 'VW We Connect',
|
|
9
|
+
name: 'vwWeConnect',
|
|
10
|
+
icon: 'file:volkswagen.svg',
|
|
11
|
+
group: ['transform'],
|
|
12
|
+
version: 1,
|
|
13
|
+
subtitle: '={{$parameter["operation"]}}',
|
|
14
|
+
description: 'Control your Volkswagen via We Connect - Standheizung, Position, etc.',
|
|
15
|
+
defaults: {
|
|
16
|
+
name: 'VW We Connect',
|
|
17
|
+
},
|
|
18
|
+
inputs: ['main'],
|
|
19
|
+
outputs: ['main'],
|
|
20
|
+
credentials: [
|
|
21
|
+
{
|
|
22
|
+
name: 'vwWeConnectCredentials',
|
|
23
|
+
required: true,
|
|
24
|
+
},
|
|
25
|
+
],
|
|
26
|
+
properties: [
|
|
27
|
+
{
|
|
28
|
+
displayName: 'Operation',
|
|
29
|
+
name: 'operation',
|
|
30
|
+
type: 'options',
|
|
31
|
+
noDataExpression: true,
|
|
32
|
+
options: [
|
|
33
|
+
{
|
|
34
|
+
name: 'Get Position',
|
|
35
|
+
value: 'getPosition',
|
|
36
|
+
description: 'Get the current GPS position of your vehicle',
|
|
37
|
+
action: 'Get the current GPS position of your vehicle',
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: 'Get Vehicle Status',
|
|
41
|
+
value: 'getVehicleStatus',
|
|
42
|
+
description: 'Get general vehicle status (doors, windows, fuel, etc.)',
|
|
43
|
+
action: 'Get general vehicle status',
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: 'Get Heater Status',
|
|
47
|
+
value: 'getHeaterStatus',
|
|
48
|
+
description: 'Get the current status of the Standheizung',
|
|
49
|
+
action: 'Get the current status of the Standheizung',
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: 'Start Heater',
|
|
53
|
+
value: 'startHeater',
|
|
54
|
+
description: 'Start the Standheizung (auxiliary heater)',
|
|
55
|
+
action: 'Start the Standheizung',
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
name: 'Stop Heater',
|
|
59
|
+
value: 'stopHeater',
|
|
60
|
+
description: 'Stop the Standheizung (auxiliary heater)',
|
|
61
|
+
action: 'Stop the Standheizung',
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
default: 'getPosition',
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
displayName: 'VIN (Vehicle Identification Number)',
|
|
68
|
+
name: 'vin',
|
|
69
|
+
type: 'string',
|
|
70
|
+
default: '',
|
|
71
|
+
required: true,
|
|
72
|
+
description: 'Your vehicle identification number (17 characters, found in vehicle documents or We Connect app)',
|
|
73
|
+
placeholder: 'WVWZZZAUZJW123456',
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
displayName: 'Heater Duration (Minutes)',
|
|
77
|
+
name: 'heaterDuration',
|
|
78
|
+
type: 'number',
|
|
79
|
+
default: 30,
|
|
80
|
+
description: 'How long the heater should run (in minutes)',
|
|
81
|
+
displayOptions: {
|
|
82
|
+
show: {
|
|
83
|
+
operation: ['startHeater'],
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
async execute() {
|
|
91
|
+
const items = this.getInputData();
|
|
92
|
+
const returnData = [];
|
|
93
|
+
const credentials = await this.getCredentials('vwWeConnectCredentials');
|
|
94
|
+
const email = credentials.email;
|
|
95
|
+
const password = credentials.password;
|
|
96
|
+
const spin = credentials.spin;
|
|
97
|
+
for (let i = 0; i < items.length; i++) {
|
|
98
|
+
try {
|
|
99
|
+
const operation = this.getNodeParameter('operation', i);
|
|
100
|
+
const vin = this.getNodeParameter('vin', i).toUpperCase();
|
|
101
|
+
// Login and get session
|
|
102
|
+
const session = await vwLogin(this, email, password);
|
|
103
|
+
let result;
|
|
104
|
+
switch (operation) {
|
|
105
|
+
case 'getPosition':
|
|
106
|
+
result = await getPosition(this, session, vin);
|
|
107
|
+
break;
|
|
108
|
+
case 'getVehicleStatus':
|
|
109
|
+
result = await getVehicleStatus(this, session, vin);
|
|
110
|
+
break;
|
|
111
|
+
case 'getHeaterStatus':
|
|
112
|
+
result = await getHeaterStatus(this, session, vin);
|
|
113
|
+
break;
|
|
114
|
+
case 'startHeater':
|
|
115
|
+
const duration = this.getNodeParameter('heaterDuration', i);
|
|
116
|
+
result = await controlHeater(this, session, vin, spin, 'start', duration);
|
|
117
|
+
break;
|
|
118
|
+
case 'stopHeater':
|
|
119
|
+
result = await controlHeater(this, session, vin, spin, 'stop');
|
|
120
|
+
break;
|
|
121
|
+
default:
|
|
122
|
+
throw new n8n_workflow_1.NodeApiError(this.getNode(), { message: `Unknown operation: ${operation}` });
|
|
123
|
+
}
|
|
124
|
+
returnData.push({
|
|
125
|
+
json: result,
|
|
126
|
+
pairedItem: { item: i },
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
if (this.continueOnFail()) {
|
|
131
|
+
returnData.push({
|
|
132
|
+
json: { error: error.message },
|
|
133
|
+
pairedItem: { item: i },
|
|
134
|
+
});
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return [returnData];
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
exports.VwWeConnect = VwWeConnect;
|
|
144
|
+
async function vwLogin(context, email, password) {
|
|
145
|
+
// VW We Connect uses a complex OAuth2 flow
|
|
146
|
+
// Step 1: Get initial login page and CSRF token
|
|
147
|
+
const baseUrl = 'https://www.portal.volkswagen-we.com';
|
|
148
|
+
const loginUrl = `${baseUrl}/portal/en_GB/web/guest/home`;
|
|
149
|
+
try {
|
|
150
|
+
// Initial request to get cookies and CSRF
|
|
151
|
+
await context.helpers.httpRequest({
|
|
152
|
+
method: 'GET',
|
|
153
|
+
url: loginUrl,
|
|
154
|
+
headers: {
|
|
155
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
|
|
156
|
+
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
// Step 2: Perform login
|
|
160
|
+
const loginPayload = {
|
|
161
|
+
email: email,
|
|
162
|
+
password: password,
|
|
163
|
+
};
|
|
164
|
+
await context.helpers.httpRequest({
|
|
165
|
+
method: 'POST',
|
|
166
|
+
url: `${baseUrl}/portal/web/guest/home/-/csrftokenhandling/get-login-url`,
|
|
167
|
+
headers: {
|
|
168
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
|
|
169
|
+
'Accept': 'application/json',
|
|
170
|
+
'Content-Type': 'application/json',
|
|
171
|
+
},
|
|
172
|
+
body: loginPayload,
|
|
173
|
+
});
|
|
174
|
+
// For now, return a mock session - the actual implementation
|
|
175
|
+
// requires handling VW's complex OAuth2 flow with multiple redirects
|
|
176
|
+
return {
|
|
177
|
+
accessToken: 'session_token',
|
|
178
|
+
refreshToken: 'refresh_token',
|
|
179
|
+
csrf: 'csrf_token',
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
throw new n8n_workflow_1.NodeApiError(context.getNode(), {
|
|
184
|
+
message: 'Login failed. Please check your credentials.',
|
|
185
|
+
description: error.message,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
async function getPosition(context, session, vin) {
|
|
190
|
+
const baseUrl = 'https://www.portal.volkswagen-we.com';
|
|
191
|
+
try {
|
|
192
|
+
const response = await context.helpers.httpRequest({
|
|
193
|
+
method: 'GET',
|
|
194
|
+
url: `${baseUrl}/portal/delegate/dashboard/${vin}/-/position/get-position`,
|
|
195
|
+
headers: {
|
|
196
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
|
|
197
|
+
'Accept': 'application/json',
|
|
198
|
+
'Authorization': `Bearer ${session.accessToken}`,
|
|
199
|
+
'X-CSRF-Token': session.csrf,
|
|
200
|
+
},
|
|
201
|
+
});
|
|
202
|
+
return {
|
|
203
|
+
operation: 'getPosition',
|
|
204
|
+
vin: vin,
|
|
205
|
+
position: response,
|
|
206
|
+
timestamp: new Date().toISOString(),
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
throw new n8n_workflow_1.NodeApiError(context.getNode(), {
|
|
211
|
+
message: 'Failed to get vehicle position',
|
|
212
|
+
description: error.message,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
async function getVehicleStatus(context, session, vin) {
|
|
217
|
+
const baseUrl = 'https://www.portal.volkswagen-we.com';
|
|
218
|
+
try {
|
|
219
|
+
const response = await context.helpers.httpRequest({
|
|
220
|
+
method: 'GET',
|
|
221
|
+
url: `${baseUrl}/portal/delegate/dashboard/${vin}/-/vsr/get-vsr`,
|
|
222
|
+
headers: {
|
|
223
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
|
|
224
|
+
'Accept': 'application/json',
|
|
225
|
+
'Authorization': `Bearer ${session.accessToken}`,
|
|
226
|
+
'X-CSRF-Token': session.csrf,
|
|
227
|
+
},
|
|
228
|
+
});
|
|
229
|
+
return {
|
|
230
|
+
operation: 'getVehicleStatus',
|
|
231
|
+
vin: vin,
|
|
232
|
+
status: response,
|
|
233
|
+
timestamp: new Date().toISOString(),
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
throw new n8n_workflow_1.NodeApiError(context.getNode(), {
|
|
238
|
+
message: 'Failed to get vehicle status',
|
|
239
|
+
description: error.message,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
async function getHeaterStatus(context, session, vin) {
|
|
244
|
+
const baseUrl = 'https://www.portal.volkswagen-we.com';
|
|
245
|
+
try {
|
|
246
|
+
const response = await context.helpers.httpRequest({
|
|
247
|
+
method: 'GET',
|
|
248
|
+
url: `${baseUrl}/portal/delegate/dashboard/${vin}/-/rah/get-status`,
|
|
249
|
+
headers: {
|
|
250
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
|
|
251
|
+
'Accept': 'application/json',
|
|
252
|
+
'Authorization': `Bearer ${session.accessToken}`,
|
|
253
|
+
'X-CSRF-Token': session.csrf,
|
|
254
|
+
},
|
|
255
|
+
});
|
|
256
|
+
return {
|
|
257
|
+
operation: 'getHeaterStatus',
|
|
258
|
+
vin: vin,
|
|
259
|
+
heaterStatus: response,
|
|
260
|
+
timestamp: new Date().toISOString(),
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
throw new n8n_workflow_1.NodeApiError(context.getNode(), {
|
|
265
|
+
message: 'Failed to get heater status',
|
|
266
|
+
description: error.message,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
async function controlHeater(context, session, vin, spin, action, duration) {
|
|
271
|
+
const baseUrl = 'https://www.portal.volkswagen-we.com';
|
|
272
|
+
const endpoint = action === 'start' ? 'start' : 'stop';
|
|
273
|
+
try {
|
|
274
|
+
const body = {
|
|
275
|
+
spin: spin,
|
|
276
|
+
};
|
|
277
|
+
if (action === 'start' && duration) {
|
|
278
|
+
body.duration = duration;
|
|
279
|
+
}
|
|
280
|
+
const response = await context.helpers.httpRequest({
|
|
281
|
+
method: 'POST',
|
|
282
|
+
url: `${baseUrl}/portal/delegate/dashboard/${vin}/-/rah/${endpoint}`,
|
|
283
|
+
headers: {
|
|
284
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
|
|
285
|
+
'Accept': 'application/json',
|
|
286
|
+
'Content-Type': 'application/json',
|
|
287
|
+
'Authorization': `Bearer ${session.accessToken}`,
|
|
288
|
+
'X-CSRF-Token': session.csrf,
|
|
289
|
+
},
|
|
290
|
+
body: body,
|
|
291
|
+
});
|
|
292
|
+
return {
|
|
293
|
+
operation: action === 'start' ? 'startHeater' : 'stopHeater',
|
|
294
|
+
vin: vin,
|
|
295
|
+
action: action,
|
|
296
|
+
duration: duration,
|
|
297
|
+
response: response,
|
|
298
|
+
timestamp: new Date().toISOString(),
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
catch (error) {
|
|
302
|
+
throw new n8n_workflow_1.NodeApiError(context.getNode(), {
|
|
303
|
+
message: `Failed to ${action} heater`,
|
|
304
|
+
description: error.message,
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
|
|
2
|
+
<circle cx="50" cy="50" r="48" fill="#001E50" stroke="#001E50" stroke-width="2"/>
|
|
3
|
+
<circle cx="50" cy="50" r="42" fill="none" stroke="#FFFFFF" stroke-width="3"/>
|
|
4
|
+
<path d="M30 30 L50 70 L70 30" fill="none" stroke="#FFFFFF" stroke-width="5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
5
|
+
<path d="M36 30 L50 58 L64 30" fill="none" stroke="#FFFFFF" stroke-width="5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
6
|
+
</svg>
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "n8n-nodes-vw-weconnect",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "n8n community node for VW We Connect - Control your Volkswagen T6.1 and other VW vehicles",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"n8n-community-node-package",
|
|
7
|
+
"volkswagen",
|
|
8
|
+
"vw",
|
|
9
|
+
"weconnect",
|
|
10
|
+
"we-connect",
|
|
11
|
+
"t6",
|
|
12
|
+
"standheizung",
|
|
13
|
+
"heater",
|
|
14
|
+
"position"
|
|
15
|
+
],
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"homepage": "",
|
|
18
|
+
"author": {
|
|
19
|
+
"name": "jygse"
|
|
20
|
+
},
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": ""
|
|
24
|
+
},
|
|
25
|
+
"main": "index.js",
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsc && gulp build:icons",
|
|
28
|
+
"dev": "tsc --watch",
|
|
29
|
+
"format": "prettier nodes credentials --write",
|
|
30
|
+
"lint": "eslint nodes credentials package.json",
|
|
31
|
+
"lintfix": "eslint nodes credentials package.json --fix",
|
|
32
|
+
"prepublishOnly": "npm run build"
|
|
33
|
+
},
|
|
34
|
+
"files": [
|
|
35
|
+
"dist"
|
|
36
|
+
],
|
|
37
|
+
"n8n": {
|
|
38
|
+
"n8nNodesApiVersion": 1,
|
|
39
|
+
"credentials": [
|
|
40
|
+
"dist/credentials/VwWeConnectCredentials.credentials.js"
|
|
41
|
+
],
|
|
42
|
+
"nodes": [
|
|
43
|
+
"dist/nodes/VwWeConnect/VwWeConnect.node.js"
|
|
44
|
+
]
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@types/node": "^20.10.0",
|
|
48
|
+
"@typescript-eslint/parser": "^6.0.0",
|
|
49
|
+
"eslint": "^8.56.0",
|
|
50
|
+
"gulp": "^4.0.2",
|
|
51
|
+
"n8n-workflow": "^1.0.0",
|
|
52
|
+
"prettier": "^3.1.0",
|
|
53
|
+
"typescript": "^5.3.0"
|
|
54
|
+
},
|
|
55
|
+
"peerDependencies": {
|
|
56
|
+
"n8n-workflow": "*"
|
|
57
|
+
}
|
|
58
|
+
}
|