iobroker.metermaster 0.9.1
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 +21 -0
- package/README.md +280 -0
- package/admin/i18n/de.json +14 -0
- package/admin/i18n/en.json +14 -0
- package/admin/i18n/es.json +14 -0
- package/admin/i18n/fr.json +14 -0
- package/admin/i18n/it.json +14 -0
- package/admin/i18n/nl.json +14 -0
- package/admin/i18n/pl.json +14 -0
- package/admin/i18n/pt.json +14 -0
- package/admin/i18n/ru.json +14 -0
- package/admin/i18n/uk.json +14 -0
- package/admin/i18n/zh-cn.json +14 -0
- package/admin/jsonConfig.json +77 -0
- package/admin/metermaster.svg +41 -0
- package/io-package.json +228 -0
- package/main.js +2479 -0
- package/package.json +52 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024-2026 MPunktBPunkt
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
# ioBroker MeterMaster Adapter
|
|
2
|
+
|
|
3
|
+
[](https://github.com/MPunktBPunkt/ioBroker.metermaster)
|
|
4
|
+
|
|
5
|
+
[](https://github.com/MPunktBPunkt/ioBroker.metermaster)
|
|
6
|
+
[](https://github.com/MPunktBPunkt/ioBroker.metermaster/blob/main/LICENSE)
|
|
7
|
+
[](https://nodejs.org)
|
|
8
|
+
|
|
9
|
+
Receives meter readings from the **[MeterMaster Android app](https://play.google.com/store/apps/details?id=com.propertymanagement.metermaster)**, stores them as ioBroker data points, and manages **ESP32 display nodes** for showing meter values on OLED displays. Source code: [GitHub](https://github.com/MPunktBPunkt/MeterMaster).
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Features
|
|
14
|
+
|
|
15
|
+
- **HTTP receiver** – accepts readings directly from the app
|
|
16
|
+
- **Automatic data points** – states are created automatically on first sync
|
|
17
|
+
- **Correct timestamps** – state `ts` reflects the actual reading date
|
|
18
|
+
- **History** – each meter keeps a full `readings.history` array
|
|
19
|
+
- **Basic Auth** – optional username/password protection
|
|
20
|
+
- **Web UI** – built-in browser viewer with 5 tabs (Data, Nodes, Import, Logs, System)
|
|
21
|
+
- **Charts & CSV** – history charts, monthly consumption, and CSV export per meter
|
|
22
|
+
- **DE/EN** – language switch in the Web UI
|
|
23
|
+
- **Import** – app backup (schema 2.0) via the Web UI
|
|
24
|
+
- **ESP32 node management** – view and configure registered display nodes
|
|
25
|
+
- **Remote control** – control meter selection and LED of ESP32 nodes from the Web UI
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Screenshots
|
|
30
|
+
|
|
31
|
+
The built-in Web UI offers five tabs — overview:
|
|
32
|
+
|
|
33
|
+
| | |
|
|
34
|
+
|---|---|
|
|
35
|
+
| **Data** – meter cards with consumption KPI, history, chart & CSV |  |
|
|
36
|
+
| **Chart modal** – meter reading (linear time axis) & monthly consumption |  |
|
|
37
|
+
| **Nodes** – ESP32 status, IP, firmware |  |
|
|
38
|
+
| **Import** – app backup via drag & drop |  |
|
|
39
|
+
| **Logs** – real-time log with filter & export |  |
|
|
40
|
+
| **System** – statistics & version check |  |
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Installation
|
|
45
|
+
|
|
46
|
+
Install the adapter from the official ioBroker adapter list:
|
|
47
|
+
|
|
48
|
+
1. Open **ioBroker Admin** → **Adapters**
|
|
49
|
+
2. Search for **MeterMaster**
|
|
50
|
+
3. Click **Install** and create an instance
|
|
51
|
+
|
|
52
|
+
From the command line on the ioBroker host:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
iobroker add metermaster
|
|
56
|
+
iobroker start metermaster
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Open the firewall if needed: `sudo ufw allow 8089/tcp`
|
|
60
|
+
|
|
61
|
+
More details: [INSTALLATION.md](INSTALLATION.md)
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Instance configuration
|
|
66
|
+
|
|
67
|
+
After installation → ioBroker Admin → **Adapters → MeterMaster** → create instance:
|
|
68
|
+
|
|
69
|
+
| Setting | Default | Description |
|
|
70
|
+
|---|---|---|
|
|
71
|
+
| HTTP port | `8089` | Port the adapter listens on |
|
|
72
|
+
| Username | `metermaster` | Basic auth username |
|
|
73
|
+
| Password | – | Basic auth password |
|
|
74
|
+
| Verbose logging | enabled | Show DEBUG entries in log viewer |
|
|
75
|
+
| Log buffer | `500` | Max. stored log entries |
|
|
76
|
+
| Keep history | `0` | 0 = unlimited |
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## MeterMaster Android app
|
|
81
|
+
|
|
82
|
+
Capture meters and sync with ioBroker:
|
|
83
|
+
|
|
84
|
+
| | |
|
|
85
|
+
|---|---|
|
|
86
|
+
| **Google Play** | [**MeterMaster**](https://play.google.com/store/apps/details?id=com.propertymanagement.metermaster) – install the app, read meters, and send to the adapter |
|
|
87
|
+
| **GitHub** | [**MPunktBPunkt/MeterMaster**](https://github.com/MPunktBPunkt/MeterMaster) – source code, APK build, and documentation |
|
|
88
|
+
|
|
89
|
+
[](https://play.google.com/store/apps/details?id=com.propertymanagement.metermaster)
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Configure the MeterMaster app
|
|
94
|
+
|
|
95
|
+
**Settings → ioBroker → MeterMaster adapter:**
|
|
96
|
+
|
|
97
|
+
| Field | Value |
|
|
98
|
+
|---|---|
|
|
99
|
+
| Enable ioBroker | on |
|
|
100
|
+
| IP / hostname | IP of the ioBroker server |
|
|
101
|
+
| Adapter port | `8089` |
|
|
102
|
+
| Username | as configured in the adapter |
|
|
103
|
+
| Password | as configured in the adapter |
|
|
104
|
+
|
|
105
|
+
"Test connection" should return `MeterMaster adapter reachable ✓`.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Web UI
|
|
110
|
+
|
|
111
|
+
Accessible without password:
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
http://{ioBroker-IP}:8089/
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
| Tab | Content |
|
|
118
|
+
|---|---|
|
|
119
|
+
| **Data** | All received meters grouped by house/apartment, with history, chart modal, and CSV export |
|
|
120
|
+
| **Nodes** | Registered ESP32 nodes: status, IP link, firmware, meter dropdown, LED control |
|
|
121
|
+
| **Import** | App backup (JSON schema 2.0) via drag & drop |
|
|
122
|
+
| **Logs** | Real-time log with filter, auto-scroll, export |
|
|
123
|
+
| **System** | Statistics, GitHub version check, one-click update |
|
|
124
|
+
|
|
125
|
+
Screenshots: see [Screenshots](#screenshots) above.
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## ESP32 display node
|
|
130
|
+
|
|
131
|
+
The adapter supports the [MeterMaster ESP32 node](https://github.com/MPunktBPunkt/esp32.MeterMaster) as an OLED display companion.
|
|
132
|
+
|
|
133
|
+
### Flow
|
|
134
|
+
1. ESP32 sends heartbeat every 60 s: `POST :8089/api/register`
|
|
135
|
+
2. Adapter creates `metermaster.0.nodes.{MAC}.*` states automatically
|
|
136
|
+
3. ESP32 polls every 15 s: `GET :8089/api/nodes/{MAC}/config`
|
|
137
|
+
4. Adapter returns config and optional immediate commands (cmd)
|
|
138
|
+
|
|
139
|
+
### Nodes tab
|
|
140
|
+
- Online/offline badge (green if heartbeat < 120 s)
|
|
141
|
+
- IP as clickable link → opens ESP32 Web UI
|
|
142
|
+
- Meter dropdown: assign meter → ESP32 picks it up on next poll
|
|
143
|
+
- LED buttons: on/off → immediate command via cmd state
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Created data points
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
metermaster.0.
|
|
151
|
+
├── info.connection bool Adapter connected
|
|
152
|
+
├── info.lastSync number Timestamp of last sync (ms)
|
|
153
|
+
├── info.readingsReceived number Total readings received
|
|
154
|
+
│
|
|
155
|
+
├── {House}/{Apartment}/{Meter}/
|
|
156
|
+
│ ├── readings.latest number Latest value (ts = reading date)
|
|
157
|
+
│ ├── readings.latestDate string ISO-8601 date
|
|
158
|
+
│ ├── readings.history string JSON array of all readings
|
|
159
|
+
│ ├── name string
|
|
160
|
+
│ ├── unit string
|
|
161
|
+
│ └── typeName string
|
|
162
|
+
│
|
|
163
|
+
└── nodes/{MAC}/
|
|
164
|
+
├── ip string ESP32 IP address
|
|
165
|
+
├── name string Device name
|
|
166
|
+
├── version string Firmware version
|
|
167
|
+
├── lastSeen number Timestamp of last heartbeat (ms)
|
|
168
|
+
├── config string JSON config (adapter writes, ESP32 reads)
|
|
169
|
+
├── configAck string Acknowledgement by ESP32
|
|
170
|
+
└── cmd string Immediate command (adapter writes, ESP32 reads+clears)
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## HTTP API
|
|
176
|
+
|
|
177
|
+
### Without authentication
|
|
178
|
+
|
|
179
|
+
| Method | Path | Description |
|
|
180
|
+
|---|---|---|
|
|
181
|
+
| GET | `/` | Web UI |
|
|
182
|
+
| GET | `/api/version` | Version + GitHub check |
|
|
183
|
+
| GET | `/api/stats` | Statistics (readings, uptime, nodes) |
|
|
184
|
+
| GET | `/api/data` | All cached readings |
|
|
185
|
+
| GET | `/api/logs` | Log buffer (with `?level=&category=&text=` filter) |
|
|
186
|
+
| GET | `/api/nodes` | All registered ESP32 nodes |
|
|
187
|
+
| GET | `/api/discover` | Known meter state IDs |
|
|
188
|
+
| POST | `/api/register` | ESP32 heartbeat (no auth required) |
|
|
189
|
+
| POST | `/api/update` | Start adapter update |
|
|
190
|
+
|
|
191
|
+
### With Basic Auth
|
|
192
|
+
|
|
193
|
+
| Method | Path | Description |
|
|
194
|
+
|---|---|---|
|
|
195
|
+
| GET | `/api/ping` | Connection test |
|
|
196
|
+
| POST | `/api/reading` | Store single reading |
|
|
197
|
+
| POST | `/api/readings` | Store batch readings |
|
|
198
|
+
| POST | `/api/import` | Import app backup |
|
|
199
|
+
| GET | `/api/nodes/{MAC}/config` | Get config for ESP32 |
|
|
200
|
+
| POST | `/api/nodes/{MAC}/config` | Set config for ESP32 |
|
|
201
|
+
| POST | `/api/nodes/{MAC}/configAck` | Receive config acknowledgement |
|
|
202
|
+
| POST | `/api/nodes/{MAC}/cmd` | Send immediate command (LED, meter) |
|
|
203
|
+
|
|
204
|
+
### Example: single reading
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
POST http://host:8089/api/reading
|
|
208
|
+
Authorization: Basic base64(user:password)
|
|
209
|
+
Content-Type: application/json
|
|
210
|
+
|
|
211
|
+
{
|
|
212
|
+
"house": "MyHouse",
|
|
213
|
+
"apartment": "West",
|
|
214
|
+
"meter": "HotWater",
|
|
215
|
+
"value": 128.75,
|
|
216
|
+
"unit": "m³",
|
|
217
|
+
"typeName": "HotWater",
|
|
218
|
+
"readingDate": "2024-02-12T09:30:00.000Z"
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Example: immediate command to ESP32
|
|
223
|
+
|
|
224
|
+
```
|
|
225
|
+
POST http://host:8089/api/nodes/C8C9A3CB7B08/cmd
|
|
226
|
+
Authorization: Basic base64(user:password)
|
|
227
|
+
Content-Type: application/json
|
|
228
|
+
|
|
229
|
+
{ "ledOn": true }
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## Update
|
|
235
|
+
|
|
236
|
+
### Via Web UI (recommended)
|
|
237
|
+
`http://IP:8089/` → **System** tab → "Check for updates" → "Install update"
|
|
238
|
+
|
|
239
|
+
### Command line
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
iobroker upgrade metermaster
|
|
243
|
+
iobroker restart metermaster.0
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
## Changelog
|
|
249
|
+
|
|
250
|
+
### 0.9.1
|
|
251
|
+
- Lowered admin dependency to >=7.6.20 (fixes startup when admin 7.7.x is installed)
|
|
252
|
+
|
|
253
|
+
### 0.9.0
|
|
254
|
+
- Finalized for ioBroker repository: CI/CD testing, adapter checker compliance
|
|
255
|
+
- English README, updated dependencies (Node.js >= 22, adapter-core 3.4.x)
|
|
256
|
+
- Admin config i18n, encrypted password storage
|
|
257
|
+
- Requires js-controller >= 6.0.11 and admin >= 7.6.20
|
|
258
|
+
|
|
259
|
+
### 0.8.3
|
|
260
|
+
- Chart: linear time axis, yearly consumption projection toggle, README screenshots
|
|
261
|
+
|
|
262
|
+
### 0.8.2
|
|
263
|
+
- Bugfix: chart modal close button and range filters
|
|
264
|
+
|
|
265
|
+
### 0.8.1
|
|
266
|
+
- Bugfix: literal newline in CSV export JS broke Web UI
|
|
267
|
+
|
|
268
|
+
### 0.8.0
|
|
269
|
+
- Charts per meter, consumption KPI, CSV export, DE/EN language switch
|
|
270
|
+
|
|
271
|
+
See [io-package.json](io-package.json) `common.news` for full history. Older entries: [CHANGELOG_OLD.md](CHANGELOG_OLD.md).
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## License
|
|
276
|
+
|
|
277
|
+
Copyright (c) 2026 MPunktBPunkt
|
|
278
|
+
|
|
279
|
+
MIT License – see [LICENSE](LICENSE) for the full license text.
|
|
280
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"port": "HTTP-Port",
|
|
3
|
+
"port_help": "Port auf dem der Adapter lauscht. Standard: 8089",
|
|
4
|
+
"user": "Benutzername",
|
|
5
|
+
"user_help": "Basic-Auth Benutzername (muss in der MeterMaster App identisch eingetragen sein)",
|
|
6
|
+
"password": "Passwort",
|
|
7
|
+
"password_help": "Basic-Auth Passwort",
|
|
8
|
+
"verboseLogging": "Ausführliches Logging",
|
|
9
|
+
"verboseLogging_help": "DEBUG-Einträge im Web-UI Log-Viewer anzeigen",
|
|
10
|
+
"logBufferSize": "Log-Puffer (Einträge)",
|
|
11
|
+
"logBufferSize_help": "Maximale Anzahl gespeicherter Log-Einträge im Web-UI",
|
|
12
|
+
"keepHistory": "Historie aufbewahren",
|
|
13
|
+
"keepHistory_help": "0 = unbegrenzt; sonst max. Anzahl Einträge pro Zähler in readings.history"
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"port": "HTTP port",
|
|
3
|
+
"port_help": "Port the adapter listens on. Default: 8089",
|
|
4
|
+
"user": "Username",
|
|
5
|
+
"user_help": "Basic auth username (must match the MeterMaster app configuration)",
|
|
6
|
+
"password": "Password",
|
|
7
|
+
"password_help": "Basic auth password",
|
|
8
|
+
"verboseLogging": "Verbose logging",
|
|
9
|
+
"verboseLogging_help": "Show DEBUG entries in the Web-UI log viewer",
|
|
10
|
+
"logBufferSize": "Log buffer (entries)",
|
|
11
|
+
"logBufferSize_help": "Maximum number of stored log entries in the Web-UI",
|
|
12
|
+
"keepHistory": "Keep history",
|
|
13
|
+
"keepHistory_help": "0 = unlimited; otherwise max. number of entries per meter in readings.history"
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"port": "Puerto HTTP",
|
|
3
|
+
"port_help": "Puerto en el que escucha el adaptador. Predeterminado: 8089",
|
|
4
|
+
"user": "Nombre de usuario",
|
|
5
|
+
"user_help": "Usuario Basic Auth (debe coincidir con la configuración de la app MeterMaster)",
|
|
6
|
+
"password": "Contraseña",
|
|
7
|
+
"password_help": "Contraseña Basic Auth",
|
|
8
|
+
"verboseLogging": "Registro detallado",
|
|
9
|
+
"verboseLogging_help": "Mostrar entradas DEBUG en el visor de logs de la Web-UI",
|
|
10
|
+
"logBufferSize": "Búfer de logs (entradas)",
|
|
11
|
+
"logBufferSize_help": "Número máximo de entradas de log almacenadas en la Web-UI",
|
|
12
|
+
"keepHistory": "Conservar historial",
|
|
13
|
+
"keepHistory_help": "0 = ilimitado; de lo contrario, máx. entradas por contador en readings.history"
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"port": "Port HTTP",
|
|
3
|
+
"port_help": "Port sur lequel l'adaptateur écoute. Par défaut : 8089",
|
|
4
|
+
"user": "Nom d'utilisateur",
|
|
5
|
+
"user_help": "Nom d'utilisateur Basic Auth (doit correspondre à la configuration de l'app MeterMaster)",
|
|
6
|
+
"password": "Mot de passe",
|
|
7
|
+
"password_help": "Mot de passe Basic Auth",
|
|
8
|
+
"verboseLogging": "Journalisation détaillée",
|
|
9
|
+
"verboseLogging_help": "Afficher les entrées DEBUG dans la visionneuse de logs Web-UI",
|
|
10
|
+
"logBufferSize": "Tampon de logs (entrées)",
|
|
11
|
+
"logBufferSize_help": "Nombre maximal d'entrées de log stockées dans la Web-UI",
|
|
12
|
+
"keepHistory": "Conserver l'historique",
|
|
13
|
+
"keepHistory_help": "0 = illimité ; sinon max. entrées par compteur dans readings.history"
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"port": "Porta HTTP",
|
|
3
|
+
"port_help": "Porta su cui l'adapter è in ascolto. Predefinita: 8089",
|
|
4
|
+
"user": "Nome utente",
|
|
5
|
+
"user_help": "Nome utente Basic Auth (deve corrispondere alla configurazione dell'app MeterMaster)",
|
|
6
|
+
"password": "Password",
|
|
7
|
+
"password_help": "Password Basic Auth",
|
|
8
|
+
"verboseLogging": "Logging dettagliato",
|
|
9
|
+
"verboseLogging_help": "Mostra voci DEBUG nel visualizzatore log della Web-UI",
|
|
10
|
+
"logBufferSize": "Buffer log (voci)",
|
|
11
|
+
"logBufferSize_help": "Numero massimo di voci di log memorizzate nella Web-UI",
|
|
12
|
+
"keepHistory": "Conserva cronologia",
|
|
13
|
+
"keepHistory_help": "0 = illimitato; altrimenti max. voci per contatore in readings.history"
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"port": "HTTP-poort",
|
|
3
|
+
"port_help": "Poort waarop de adapter luistert. Standaard: 8089",
|
|
4
|
+
"user": "Gebruikersnaam",
|
|
5
|
+
"user_help": "Basic Auth gebruikersnaam (moet overeenkomen met de MeterMaster app-configuratie)",
|
|
6
|
+
"password": "Wachtwoord",
|
|
7
|
+
"password_help": "Basic Auth wachtwoord",
|
|
8
|
+
"verboseLogging": "Uitgebreide logging",
|
|
9
|
+
"verboseLogging_help": "DEBUG-items tonen in de Web-UI logviewer",
|
|
10
|
+
"logBufferSize": "Logbuffer (items)",
|
|
11
|
+
"logBufferSize_help": "Maximaal aantal opgeslagen logitems in de Web-UI",
|
|
12
|
+
"keepHistory": "Geschiedenis bewaren",
|
|
13
|
+
"keepHistory_help": "0 = onbeperkt; anders max. aantal items per meter in readings.history"
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"port": "Port HTTP",
|
|
3
|
+
"port_help": "Port, na którym nasłuchuje adapter. Domyślnie: 8089",
|
|
4
|
+
"user": "Nazwa użytkownika",
|
|
5
|
+
"user_help": "Nazwa użytkownika Basic Auth (musi być zgodna z konfiguracją aplikacji MeterMaster)",
|
|
6
|
+
"password": "Hasło",
|
|
7
|
+
"password_help": "Hasło Basic Auth",
|
|
8
|
+
"verboseLogging": "Szczegółowe logowanie",
|
|
9
|
+
"verboseLogging_help": "Pokazuj wpisy DEBUG w podglądzie logów Web-UI",
|
|
10
|
+
"logBufferSize": "Bufor logów (wpisy)",
|
|
11
|
+
"logBufferSize_help": "Maksymalna liczba przechowywanych wpisów logów w Web-UI",
|
|
12
|
+
"keepHistory": "Zachowaj historię",
|
|
13
|
+
"keepHistory_help": "0 = bez limitu; w przeciwnym razie maks. wpisów na licznik w readings.history"
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"port": "Porta HTTP",
|
|
3
|
+
"port_help": "Porta em que o adaptador escuta. Padrão: 8089",
|
|
4
|
+
"user": "Nome de usuário",
|
|
5
|
+
"user_help": "Nome de usuário Basic Auth (deve corresponder à configuração do app MeterMaster)",
|
|
6
|
+
"password": "Senha",
|
|
7
|
+
"password_help": "Senha Basic Auth",
|
|
8
|
+
"verboseLogging": "Registro detalhado",
|
|
9
|
+
"verboseLogging_help": "Mostrar entradas DEBUG no visualizador de logs da Web-UI",
|
|
10
|
+
"logBufferSize": "Buffer de log (entradas)",
|
|
11
|
+
"logBufferSize_help": "Número máximo de entradas de log armazenadas na Web-UI",
|
|
12
|
+
"keepHistory": "Manter histórico",
|
|
13
|
+
"keepHistory_help": "0 = ilimitado; caso contrário, máx. entradas por medidor em readings.history"
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"port": "Порт HTTP",
|
|
3
|
+
"port_help": "Порт, на котором работает адаптер. По умолчанию: 8089",
|
|
4
|
+
"user": "Имя пользователя",
|
|
5
|
+
"user_help": "Имя пользователя Basic Auth (должно совпадать с настройками приложения MeterMaster)",
|
|
6
|
+
"password": "Пароль",
|
|
7
|
+
"password_help": "Пароль Basic Auth",
|
|
8
|
+
"verboseLogging": "Подробное логирование",
|
|
9
|
+
"verboseLogging_help": "Показывать записи DEBUG в просмотрщике логов Web-UI",
|
|
10
|
+
"logBufferSize": "Буфер логов (записи)",
|
|
11
|
+
"logBufferSize_help": "Максимальное количество сохранённых записей логов в Web-UI",
|
|
12
|
+
"keepHistory": "Хранить историю",
|
|
13
|
+
"keepHistory_help": "0 = без ограничений; иначе макс. количество записей на счётчик в readings.history"
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"port": "HTTP-порт",
|
|
3
|
+
"port_help": "Порт, на якому працює адаптер. За замовчуванням: 8089",
|
|
4
|
+
"user": "Ім'я користувача",
|
|
5
|
+
"user_help": "Ім'я користувача Basic Auth (має збігатися з налаштуваннями додатку MeterMaster)",
|
|
6
|
+
"password": "Пароль",
|
|
7
|
+
"password_help": "Пароль Basic Auth",
|
|
8
|
+
"verboseLogging": "Докладне логування",
|
|
9
|
+
"verboseLogging_help": "Показувати записи DEBUG у переглядачі логів Web-UI",
|
|
10
|
+
"logBufferSize": "Буфер логів (записи)",
|
|
11
|
+
"logBufferSize_help": "Максимальна кількість збережених записів логів у Web-UI",
|
|
12
|
+
"keepHistory": "Зберігати історію",
|
|
13
|
+
"keepHistory_help": "0 = без обмежень; інакше макс. записів на лічильник у readings.history"
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"port": "HTTP 端口",
|
|
3
|
+
"port_help": "适配器监听的端口。默认:8089",
|
|
4
|
+
"user": "用户名",
|
|
5
|
+
"user_help": "Basic Auth 用户名(须与 MeterMaster 应用配置一致)",
|
|
6
|
+
"password": "密码",
|
|
7
|
+
"password_help": "Basic Auth 密码",
|
|
8
|
+
"verboseLogging": "详细日志",
|
|
9
|
+
"verboseLogging_help": "在 Web-UI 日志查看器中显示 DEBUG 条目",
|
|
10
|
+
"logBufferSize": "日志缓冲区(条目)",
|
|
11
|
+
"logBufferSize_help": "Web-UI 中存储的最大日志条目数",
|
|
12
|
+
"keepHistory": "保留历史",
|
|
13
|
+
"keepHistory_help": "0 = 无限制;否则每个表计在 readings.history 中的最大条目数"
|
|
14
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
{
|
|
2
|
+
"i18n": true,
|
|
3
|
+
"type": "panel",
|
|
4
|
+
"items": {
|
|
5
|
+
"port": {
|
|
6
|
+
"type": "number",
|
|
7
|
+
"label": "port",
|
|
8
|
+
"min": 1024,
|
|
9
|
+
"max": 65535,
|
|
10
|
+
"default": 8089,
|
|
11
|
+
"help": "port_help",
|
|
12
|
+
"xs": 12,
|
|
13
|
+
"sm": 6,
|
|
14
|
+
"md": 4,
|
|
15
|
+
"lg": 3,
|
|
16
|
+
"xl": 3
|
|
17
|
+
},
|
|
18
|
+
"user": {
|
|
19
|
+
"type": "text",
|
|
20
|
+
"label": "user",
|
|
21
|
+
"default": "metermaster",
|
|
22
|
+
"help": "user_help",
|
|
23
|
+
"xs": 12,
|
|
24
|
+
"sm": 6,
|
|
25
|
+
"md": 4,
|
|
26
|
+
"lg": 3,
|
|
27
|
+
"xl": 3
|
|
28
|
+
},
|
|
29
|
+
"password": {
|
|
30
|
+
"type": "password",
|
|
31
|
+
"label": "password",
|
|
32
|
+
"default": "",
|
|
33
|
+
"help": "password_help",
|
|
34
|
+
"xs": 12,
|
|
35
|
+
"sm": 6,
|
|
36
|
+
"md": 4,
|
|
37
|
+
"lg": 3,
|
|
38
|
+
"xl": 3
|
|
39
|
+
},
|
|
40
|
+
"verboseLogging": {
|
|
41
|
+
"type": "checkbox",
|
|
42
|
+
"label": "verboseLogging",
|
|
43
|
+
"default": true,
|
|
44
|
+
"help": "verboseLogging_help",
|
|
45
|
+
"xs": 12,
|
|
46
|
+
"sm": 6,
|
|
47
|
+
"md": 4,
|
|
48
|
+
"lg": 3,
|
|
49
|
+
"xl": 3
|
|
50
|
+
},
|
|
51
|
+
"logBufferSize": {
|
|
52
|
+
"type": "number",
|
|
53
|
+
"label": "logBufferSize",
|
|
54
|
+
"min": 50,
|
|
55
|
+
"max": 5000,
|
|
56
|
+
"default": 500,
|
|
57
|
+
"help": "logBufferSize_help",
|
|
58
|
+
"xs": 12,
|
|
59
|
+
"sm": 6,
|
|
60
|
+
"md": 4,
|
|
61
|
+
"lg": 3,
|
|
62
|
+
"xl": 3
|
|
63
|
+
},
|
|
64
|
+
"keepHistory": {
|
|
65
|
+
"type": "number",
|
|
66
|
+
"label": "keepHistory",
|
|
67
|
+
"min": 0,
|
|
68
|
+
"default": 0,
|
|
69
|
+
"help": "keepHistory_help",
|
|
70
|
+
"xs": 12,
|
|
71
|
+
"sm": 6,
|
|
72
|
+
"md": 4,
|
|
73
|
+
"lg": 3,
|
|
74
|
+
"xl": 3
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<svg viewBox="0 0 108 108" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="lbg" x1="0" y1="0" x2="1" y2="1">
|
|
4
|
+
<stop offset="0%" stop-color="#3b1fa8"/>
|
|
5
|
+
<stop offset="100%" stop-color="#1a0e5a"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<linearGradient id="larc" x1="0" y1="1" x2="1" y2="0">
|
|
8
|
+
<stop offset="0%" stop-color="#7c3aed"/>
|
|
9
|
+
<stop offset="100%" stop-color="#a78bfa"/>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
<filter id="lglow">
|
|
12
|
+
<feGaussianBlur stdDeviation="1.2" result="blur"/>
|
|
13
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
14
|
+
</filter>
|
|
15
|
+
</defs>
|
|
16
|
+
<rect width="108" height="108" rx="24" fill="url(#lbg)"/>
|
|
17
|
+
<circle cx="54" cy="56" r="37" fill="none" stroke="#512BD4" stroke-width="2.5" opacity="0.6"/>
|
|
18
|
+
<circle cx="54" cy="56" r="33" fill="#1e1252"/>
|
|
19
|
+
<path d="M 37.5 84.6 A 33 33 0 1 1 70.5 84.6" fill="none" stroke="#2d1b80" stroke-width="5.5" stroke-linecap="round"/>
|
|
20
|
+
<path d="M 37.5 84.6 A 33 33 0 0 1 54 23" fill="none" stroke="url(#larc)" stroke-width="5.5" stroke-linecap="round" filter="url(#lglow)"/>
|
|
21
|
+
<g stroke="#6d4fc4" stroke-linecap="round">
|
|
22
|
+
<line x1="54" y1="25" x2="54" y2="30" stroke-width="2" transform="rotate(-120 54 56)"/>
|
|
23
|
+
<line x1="54" y1="25" x2="54" y2="28" stroke-width="1.2" transform="rotate(-96 54 56)"/>
|
|
24
|
+
<line x1="54" y1="25" x2="54" y2="28" stroke-width="1.2" transform="rotate(-72 54 56)"/>
|
|
25
|
+
<line x1="54" y1="25" x2="54" y2="30" stroke-width="2" transform="rotate(-48 54 56)"/>
|
|
26
|
+
<line x1="54" y1="25" x2="54" y2="28" stroke-width="1.2" transform="rotate(-24 54 56)"/>
|
|
27
|
+
<line x1="54" y1="25" x2="54" y2="30" stroke-width="2" transform="rotate(0 54 56)"/>
|
|
28
|
+
<line x1="54" y1="25" x2="54" y2="28" stroke-width="1.2" transform="rotate(24 54 56)"/>
|
|
29
|
+
<line x1="54" y1="25" x2="54" y2="30" stroke-width="2" transform="rotate(48 54 56)"/>
|
|
30
|
+
<line x1="54" y1="25" x2="54" y2="28" stroke-width="1.2" transform="rotate(72 54 56)"/>
|
|
31
|
+
<line x1="54" y1="25" x2="54" y2="28" stroke-width="1.2" transform="rotate(96 54 56)"/>
|
|
32
|
+
<line x1="54" y1="25" x2="54" y2="30" stroke-width="2" transform="rotate(120 54 56)"/>
|
|
33
|
+
</g>
|
|
34
|
+
<g transform="rotate(0 54 56)">
|
|
35
|
+
<line x1="54" y1="56" x2="54" y2="29" stroke="white" stroke-width="2.2" stroke-linecap="round" filter="url(#lglow)"/>
|
|
36
|
+
<line x1="54" y1="56" x2="54" y2="63" stroke="#512BD4" stroke-width="2.2" stroke-linecap="round"/>
|
|
37
|
+
</g>
|
|
38
|
+
<circle cx="54" cy="56" r="5" fill="#2d1b80" stroke="#7c3aed" stroke-width="1.5"/>
|
|
39
|
+
<circle cx="54" cy="56" r="2" fill="#c4b5fd"/>
|
|
40
|
+
<text x="54" y="93" font-family="Arial,sans-serif" font-weight="700" font-size="10" fill="#a78bfa" text-anchor="middle" letter-spacing="1.5">MM</text>
|
|
41
|
+
</svg>
|