iobroker.sbfspot 4.0.8 → 4.1.2
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/.github/workflows/test-and-release.yml +6 -5
- package/LICENSE +18 -4
- package/README.md +8 -1
- package/io-package.json +13 -1
- package/lib/tools.js +2 -2
- package/main.js +119 -312
- package/package.json +16 -17
- package/sbfspot.njsproj +9 -4
- package/widgets/sbfspot/lib/js/flot/jquery.canvaswrapper.js +0 -2
- package/widgets/sbfspot/lib/js/flot/jquery.flot.axislabels.js +1 -4
- package/widgets/sbfspot/lib/js/flot/jquery.flot.hover.js +2 -0
- package/widgets/sbfspot/lib/js/flot/jquery.flot.js +19 -17
- package/widgets/sbfspot/lib/js/flot/jquery.flot.time.js +6 -7
- package/widgets/sbfspot/lib/js/lib/globalize.culture.en-US.js +33 -0
- package/widgets/sbfspot/lib/js/lib/globalize.js +1601 -0
- package/widgets/sbfspot/lib/js/lib/jquery.event.drag.js +145 -0
- package/widgets/sbfspot/lib/js/lib/jquery.mousewheel.js +86 -0
- package/widgets/sbfspot.html +123 -18
- package/lib/support_tools.js +0 -371
- package/widgets/sbfspot/lib/js/flot/jquery.flot.axislabels_V2.js +0 -469
- package/widgets/sbfspot/lib/js/flot/jquery.flot.axislabels_V3.js +0 -221
package/main.js
CHANGED
|
@@ -15,8 +15,12 @@ Copyright(C)[2016-2020][René Glaß]
|
|
|
15
15
|
"use strict";
|
|
16
16
|
|
|
17
17
|
const utils = require("@iobroker/adapter-core");
|
|
18
|
+
//const { json } = require("stream/consumers");
|
|
18
19
|
const SunCalc = require("suncalc2");
|
|
19
20
|
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
20
24
|
let adapter;
|
|
21
25
|
function startAdapter(options) {
|
|
22
26
|
options = options || {};
|
|
@@ -57,7 +61,7 @@ async function main() {
|
|
|
57
61
|
adapter.terminate ? adapter.terminate(11) : process.exit(11);
|
|
58
62
|
}
|
|
59
63
|
|
|
60
|
-
await CheckInverterVariables();
|
|
64
|
+
//await CheckInverterVariables();
|
|
61
65
|
|
|
62
66
|
killTimer = setTimeout(function () {
|
|
63
67
|
//adapter.stop();
|
|
@@ -110,6 +114,7 @@ async function main() {
|
|
|
110
114
|
|
|
111
115
|
await GetInverter(i, rows);
|
|
112
116
|
|
|
117
|
+
await DB_CheckLastUploads(serial);
|
|
113
118
|
|
|
114
119
|
let rows1 = await DB_GetInvertersData(serial);
|
|
115
120
|
|
|
@@ -151,12 +156,8 @@ async function main() {
|
|
|
151
156
|
}
|
|
152
157
|
|
|
153
158
|
}
|
|
154
|
-
|
|
155
159
|
}
|
|
156
|
-
|
|
157
|
-
|
|
158
160
|
}
|
|
159
|
-
|
|
160
161
|
}
|
|
161
162
|
} else {
|
|
162
163
|
//
|
|
@@ -165,8 +166,6 @@ async function main() {
|
|
|
165
166
|
}
|
|
166
167
|
}
|
|
167
168
|
DB_Disconnect();
|
|
168
|
-
|
|
169
|
-
|
|
170
169
|
}
|
|
171
170
|
else {
|
|
172
171
|
adapter.log.info("nothing to do, because no daylight ... ");
|
|
@@ -185,18 +184,23 @@ async function main() {
|
|
|
185
184
|
}
|
|
186
185
|
|
|
187
186
|
async function GetSystemDateformat() {
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
187
|
+
try {
|
|
188
|
+
const ret = await adapter.getForeignObjectAsync("system.config");
|
|
189
|
+
|
|
190
|
+
if (typeof ret != undefined && ret != null) {
|
|
191
|
+
//dateformat = ret.common.dateFormat;
|
|
192
|
+
longitude = ret.common.longitude;
|
|
193
|
+
latitude = ret.common.latitude;
|
|
194
|
+
adapter.log.debug("system: longitude " + longitude + " latitude " + latitude);
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
adapter.log.error("system.config not available. longitude and latitude set to Berlin");
|
|
198
|
+
longitude = 52.520008;
|
|
199
|
+
latitude = 13.404954;
|
|
200
|
+
}
|
|
195
201
|
}
|
|
196
|
-
|
|
197
|
-
adapter.log.error("
|
|
198
|
-
longitude = 52.520008;
|
|
199
|
-
latitude = 13.404954;
|
|
202
|
+
catch (e) {
|
|
203
|
+
adapter.log.error("exception in GetSystemDateformat [" + e + "]");
|
|
200
204
|
}
|
|
201
205
|
}
|
|
202
206
|
|
|
@@ -324,16 +328,53 @@ async function AddInverterVariables(serial) {
|
|
|
324
328
|
await AddObject(serial.toString() + ".history.last12Months", "state", "SMA inverter history last 12 Months (JSON)", "string", "value", "", true, false);
|
|
325
329
|
await AddObject(serial.toString() + ".history.years", "state", "SMA inverter history years (JSON)", "string", "value", "", true, false);
|
|
326
330
|
|
|
331
|
+
await AddObject(serial.toString() + ".sbfspot.LastUpload", "state", "date/time of last upload to sbfspot", "string", "value", "", true, false);
|
|
332
|
+
await AddObject(serial.toString() + ".sbfspot.notUploaded", "state", "number of datapoints waiting for upload", "number", "value", "", true, false);
|
|
333
|
+
|
|
327
334
|
|
|
328
335
|
adapter.log.debug("AddInverterVariables done " );
|
|
329
336
|
}
|
|
330
337
|
|
|
331
338
|
|
|
339
|
+
async function CreateObject(key, obj) {
|
|
340
|
+
|
|
341
|
+
const obj_new = await adapter.getObjectAsync(key);
|
|
342
|
+
//adapter.log.warn("got object " + JSON.stringify(obj_new));
|
|
343
|
+
|
|
344
|
+
if (obj_new != null) {
|
|
345
|
+
|
|
346
|
+
if ((obj_new.common.role != obj.common.role
|
|
347
|
+
|| obj_new.common.type != obj.common.type
|
|
348
|
+
|| (obj_new.common.unit != obj.common.unit && obj.common.unit != null)
|
|
349
|
+
|| obj_new.common.read != obj.common.read
|
|
350
|
+
|| obj_new.common.write != obj.common.write
|
|
351
|
+
|| obj_new.common.name != obj.common.name)
|
|
352
|
+
&& obj.type === "state"
|
|
353
|
+
) {
|
|
354
|
+
adapter.log.warn("change object " + JSON.stringify(obj) + " " + JSON.stringify(obj_new));
|
|
355
|
+
await adapter.extendObject(key, {
|
|
356
|
+
common: {
|
|
357
|
+
name: obj.common.name,
|
|
358
|
+
role: obj.common.role,
|
|
359
|
+
type: obj.common.type,
|
|
360
|
+
unit: obj.common.unit,
|
|
361
|
+
read: obj.common.read,
|
|
362
|
+
write: obj.common.write
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
await adapter.setObjectNotExistsAsync(key, obj);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
|
|
332
373
|
async function AddObject(key, type, common_name, common_type, common_role, common_unit, common_read, common_write) {
|
|
333
374
|
|
|
334
375
|
adapter.log.debug("addObject " + key);
|
|
335
376
|
|
|
336
|
-
|
|
377
|
+
let obj= {
|
|
337
378
|
type: type,
|
|
338
379
|
common: {
|
|
339
380
|
name: common_name,
|
|
@@ -346,37 +387,9 @@ async function AddObject(key, type, common_name, common_type, common_role, commo
|
|
|
346
387
|
native: {
|
|
347
388
|
location: key
|
|
348
389
|
}
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
const obj = await adapter.getObjectAsync(key);
|
|
352
|
-
|
|
353
|
-
if (obj != null) {
|
|
354
|
-
//adapter.log.debug(" got Object " + JSON.stringify(obj));
|
|
355
|
-
if (obj.type != type
|
|
356
|
-
|| obj.common.name != common_name
|
|
357
|
-
|| obj.common.type != common_type
|
|
358
|
-
|| obj.common.role != common_role
|
|
359
|
-
|| obj.common.unit != common_unit
|
|
360
|
-
|| obj.common.read != common_read
|
|
361
|
-
|| obj.common.write != common_write ) {
|
|
362
|
-
adapter.log.debug(" !!! need to extend for " + key);
|
|
363
|
-
await adapter.extendObject(key, {
|
|
364
|
-
type: type,
|
|
365
|
-
common: {
|
|
366
|
-
name: common_name,
|
|
367
|
-
type: common_type,
|
|
368
|
-
role: common_role,
|
|
369
|
-
unit: common_unit,
|
|
370
|
-
read: common_read,
|
|
371
|
-
write: common_write
|
|
372
|
-
},
|
|
373
|
-
native: {
|
|
374
|
-
location: key
|
|
375
|
-
}
|
|
376
|
-
});
|
|
377
|
-
}
|
|
390
|
+
};
|
|
378
391
|
|
|
379
|
-
|
|
392
|
+
await CreateObject(key, obj);
|
|
380
393
|
}
|
|
381
394
|
|
|
382
395
|
|
|
@@ -387,11 +400,11 @@ sbfspot.0 2021-07-08 19:30:13.024 info State value to set for "sbfspot.0.2000562
|
|
|
387
400
|
sbfspot.0 2021-07-08 19:30:12.888 info State value to set for "sbfspot.0.2000562095.history.last30Days" has to be type "number" but received type "string"
|
|
388
401
|
*/
|
|
389
402
|
|
|
390
|
-
|
|
403
|
+
/*
|
|
391
404
|
async function CheckInverterVariables() {
|
|
392
405
|
|
|
393
406
|
}
|
|
394
|
-
|
|
407
|
+
*/
|
|
395
408
|
|
|
396
409
|
|
|
397
410
|
async function DB_Connect() {
|
|
@@ -467,49 +480,78 @@ async function DB_Connect() {
|
|
|
467
480
|
return ret;
|
|
468
481
|
}
|
|
469
482
|
|
|
483
|
+
async function DB_Query(query) {
|
|
470
484
|
|
|
485
|
+
adapter.log.debug(query);
|
|
486
|
+
let retRows;
|
|
471
487
|
|
|
488
|
+
if (adapter.config.databasetype == "mySQL" || adapter.config.databasetype == "MariaDB") {
|
|
472
489
|
|
|
490
|
+
const [rows, fields] = await mysql_connection.execute(query);
|
|
491
|
+
retRows = rows;
|
|
473
492
|
|
|
474
|
-
|
|
493
|
+
} else {
|
|
494
|
+
const stmt = sqlite_db.prepare(query);
|
|
495
|
+
|
|
496
|
+
const rows = stmt.all();
|
|
497
|
+
retRows = rows;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
adapter.log.debug(JSON.stringify(retRows));
|
|
501
|
+
|
|
502
|
+
return retRows;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
async function DB_CheckLastUploads(serial) {
|
|
475
506
|
|
|
476
|
-
let retRows;
|
|
477
507
|
try {
|
|
478
|
-
|
|
479
|
-
//numOfInverters = 0;
|
|
480
|
-
adapter.log.debug(query);
|
|
508
|
+
let query = "SELECT `TimeStamp` FROM `DayData` WHERE `PVoutput` is null ";
|
|
481
509
|
|
|
510
|
+
let rows = await DB_Query(query);
|
|
482
511
|
|
|
512
|
+
let notUploaded = rows.length;
|
|
483
513
|
|
|
484
|
-
|
|
514
|
+
await adapter.setStateAsync(serial + ".sbfspot.notUploaded", { ack: true, val: notUploaded });
|
|
485
515
|
|
|
486
|
-
|
|
516
|
+
query = "SELECT `TimeStamp` FROM `DayData` WHERE `PVoutput` = 1 ORDER BY TimeStamp DESC LIMIT 1 ";
|
|
487
517
|
|
|
488
|
-
|
|
518
|
+
rows = await DB_Query(query);
|
|
489
519
|
|
|
490
|
-
|
|
520
|
+
if (rows.length > 0) {
|
|
521
|
+
let updateTimestamp = rows[0].TimeStamp;
|
|
522
|
+
const oDate = new Date(updateTimestamp * 1000);
|
|
523
|
+
const oDateNow = new Date();
|
|
491
524
|
|
|
492
|
-
|
|
493
|
-
} else {
|
|
525
|
+
oDateNow.setDate(oDateNow.getDate() - 1);
|
|
494
526
|
|
|
495
|
-
const stmt = sqlite_db.prepare(query);
|
|
496
527
|
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
528
|
+
if (oDate < oDateNow) {
|
|
529
|
+
adapter.log.error("no upload to sbfspot since " + oDate.toLocaleString());
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
let lastUpload = oDate.toLocaleString();
|
|
500
533
|
|
|
501
|
-
|
|
534
|
+
await adapter.setStateAsync(serial + ".sbfspot.LastUpload", { ack: true, val: lastUpload });
|
|
502
535
|
}
|
|
536
|
+
}
|
|
537
|
+
catch (e) {
|
|
538
|
+
adapter.log.error("exception in DB_CheckLastUploads [" + e + "]");
|
|
539
|
+
}
|
|
540
|
+
}
|
|
503
541
|
|
|
504
|
-
|
|
505
542
|
|
|
506
543
|
|
|
544
|
+
async function DB_GetInverters() {
|
|
545
|
+
|
|
546
|
+
let retRows;
|
|
547
|
+
try {
|
|
548
|
+
const query = "SELECT * from Inverters";
|
|
549
|
+
retRows = await DB_Query(query);
|
|
507
550
|
}
|
|
508
551
|
catch (e) {
|
|
509
552
|
adapter.log.error("exception in DB_GetInverters [" + e + "]");
|
|
510
553
|
}
|
|
511
554
|
|
|
512
|
-
|
|
513
555
|
return retRows;
|
|
514
556
|
}
|
|
515
557
|
|
|
@@ -574,28 +616,7 @@ async function DB_GetInvertersData(serial) {
|
|
|
574
616
|
try {
|
|
575
617
|
//SELECT * from SpotData where Serial ='2000562095' ORDER BY TimeStamp DESC LIMIT 1
|
|
576
618
|
const query = "SELECT * from SpotData where Serial =" + serial + " ORDER BY TimeStamp DESC LIMIT 1";
|
|
577
|
-
|
|
578
|
-
if (adapter.config.databasetype == "mySQL" || adapter.config.databasetype == "MariaDB") {
|
|
579
|
-
//we only get one row = last one
|
|
580
|
-
|
|
581
|
-
const [rows, fields] = await mysql_connection.execute(query);
|
|
582
|
-
|
|
583
|
-
retRows = rows;
|
|
584
|
-
//await GetInverterData(0, rows, serial);
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
} else {
|
|
588
|
-
|
|
589
|
-
const stmt = sqlite_db.prepare(query);
|
|
590
|
-
|
|
591
|
-
const rows = stmt.all();
|
|
592
|
-
|
|
593
|
-
retRows = rows;
|
|
594
|
-
|
|
595
|
-
//await GetInverterData(0, rows, serial);
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
}
|
|
619
|
+
retRows = await DB_Query(query);
|
|
599
620
|
}
|
|
600
621
|
catch (e) {
|
|
601
622
|
adapter.log.error("exception in DB_GetInvertersData [" + e + "]");
|
|
@@ -701,25 +722,7 @@ async function DB_CalcHistory_LastMonth(serial) {
|
|
|
701
722
|
} else {
|
|
702
723
|
query = "SELECT strftime('%Y-%m-%d', datetime(TimeStamp, 'unixepoch')) as date, Max(`EToday`) as ertrag FROM `SpotData` WHERE `Serial` = '" + serial + "' AND TimeStamp>= " + datefrom.getTime() / 1000 + " AND TimeStamp<= " + dateto.getTime() / 1000 + " Group By strftime('%Y-%m-%d', datetime(TimeStamp, 'unixepoch'))";
|
|
703
724
|
}
|
|
704
|
-
|
|
705
|
-
if (adapter.config.databasetype == "mySQL" || adapter.config.databasetype == "MariaDB") {
|
|
706
|
-
|
|
707
|
-
const [rows, fields] = await mysql_connection.execute(query);
|
|
708
|
-
|
|
709
|
-
retRows = rows;
|
|
710
|
-
//await calcHistory_LastMonth(0, rows, serial);
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
} else {
|
|
714
|
-
|
|
715
|
-
const stmt = sqlite_db.prepare(query);
|
|
716
|
-
|
|
717
|
-
const rows = stmt.all();
|
|
718
|
-
retRows = rows;
|
|
719
|
-
//await CalcHistory_LastMonth(0, rows, serial);
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
}
|
|
725
|
+
retRows = await DB_Query(query);
|
|
723
726
|
}
|
|
724
727
|
catch (e) {
|
|
725
728
|
adapter.log.error("exception in DB_CalcHistory_LastMonth [" + e + "]");
|
|
@@ -784,26 +787,7 @@ async function DB_CalcHistory_Prepare(serial) {
|
|
|
784
787
|
} else {
|
|
785
788
|
query = "SELECT strftime('%Y-%m-%d', datetime(TimeStamp, 'unixepoch')) as date, ETotal FROM `SpotData` WHERE `Serial` = '" + serial + "' ORDER by `TimeStamp` ASC LIMIT 1";
|
|
786
789
|
}
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
if (adapter.config.databasetype == "mySQL" || adapter.config.databasetype == "MariaDB") {
|
|
790
|
-
|
|
791
|
-
const [rows, fields] = await mysql_connection.execute(query);
|
|
792
|
-
|
|
793
|
-
retRows = rows;
|
|
794
|
-
//await CalcHistory_Prepare(0, rows, serial);
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
} else {
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
const stmt = sqlite_db.prepare(query);
|
|
801
|
-
|
|
802
|
-
const rows = stmt.all();
|
|
803
|
-
retRows = rows;
|
|
804
|
-
//await CalcHistory_Prepare(0, rows, serial);
|
|
805
|
-
|
|
806
|
-
}
|
|
790
|
+
retRows = await DB_Query(query);
|
|
807
791
|
}
|
|
808
792
|
catch (e) {
|
|
809
793
|
adapter.log.error("exception in DB_CalcHistory_Prepare [" + e + "]");
|
|
@@ -860,25 +844,7 @@ async function DB_CalcHistory_Today(serial) {
|
|
|
860
844
|
} else {
|
|
861
845
|
query = "SELECT strftime('%H:%m', datetime(TimeStamp, 'unixepoch')) as time, Max(`EToday`) as ertrag FROM `SpotData` WHERE `Serial` = '" + serial + "' AND TimeStamp>= " + datefrom.getTime() / 1000 + " AND TimeStamp<= " + dateto.getTime() / 1000 + " Group By strftime('%H-%m', datetime(TimeStamp, 'unixepoch'))";
|
|
862
846
|
}
|
|
863
|
-
|
|
864
|
-
if (adapter.config.databasetype == "mySQL" || adapter.config.databasetype == "MariaDB") {
|
|
865
|
-
|
|
866
|
-
const [rows, fields] = await mysql_connection.execute(query);
|
|
867
|
-
retRows = rows;
|
|
868
|
-
|
|
869
|
-
//await CalcHistory_Today(0, rows, serial);
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
} else {
|
|
873
|
-
|
|
874
|
-
const stmt = sqlite_db.prepare(query);
|
|
875
|
-
|
|
876
|
-
const rows = stmt.all();
|
|
877
|
-
retRows = rows;
|
|
878
|
-
//await CalcHistory_Today(0, rows, serial);
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
}
|
|
847
|
+
retRows = await DB_Query(query);
|
|
882
848
|
}
|
|
883
849
|
catch (e) {
|
|
884
850
|
adapter.log.error("exception in DB_CalcHistory_Today [" + e + "]");
|
|
@@ -908,12 +874,11 @@ async function CalcHistory_Today(err, rows, serial) {
|
|
|
908
874
|
"time": data["time"],
|
|
909
875
|
"value": data["ertrag"]
|
|
910
876
|
});
|
|
911
|
-
|
|
877
|
+
|
|
912
878
|
}
|
|
913
879
|
|
|
914
880
|
await adapter.setStateAsync(serial + ".history.today", { ack: true, val: JSON.stringify(oLastDays) });
|
|
915
881
|
|
|
916
|
-
//await DB_CalcHistory_Years(serial);
|
|
917
882
|
} else {
|
|
918
883
|
adapter.log.error("Error while performing Query in CalcHistory_Today. " + err);
|
|
919
884
|
}
|
|
@@ -937,27 +902,7 @@ async function DB_CalcHistory_Years(serial) {
|
|
|
937
902
|
} else {
|
|
938
903
|
query = "SELECT strftime('%Y', datetime(TimeStamp, 'unixepoch')) as date, Max(`ETotal`) as ertrag, Min(`ETotal`) as startertrag FROM `SpotData` WHERE `Serial` = '" + serial + "' Group By strftime('%Y', datetime(TimeStamp, 'unixepoch'))";
|
|
939
904
|
}
|
|
940
|
-
|
|
941
|
-
if (adapter.config.databasetype == "mySQL" || adapter.config.databasetype == "MariaDB") {
|
|
942
|
-
|
|
943
|
-
const [rows, fields] = await mysql_connection.execute(query);
|
|
944
|
-
|
|
945
|
-
retRows = rows;
|
|
946
|
-
//await CalcHistory_Years(0, rows, serial);
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
} else {
|
|
950
|
-
|
|
951
|
-
const stmt = sqlite_db.prepare(query);
|
|
952
|
-
|
|
953
|
-
const rows = stmt.all();
|
|
954
|
-
retRows = rows;
|
|
955
|
-
|
|
956
|
-
//await CalcHistory_Years(0, rows, serial);
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
}
|
|
905
|
+
retRows = await DB_Query(query);
|
|
961
906
|
}
|
|
962
907
|
catch (e) {
|
|
963
908
|
adapter.log.error("exception in DB_CalcHistory_Years [" + e + "]");
|
|
@@ -1053,7 +998,6 @@ async function CalcHistory_Years(err, rows, serial) {
|
|
|
1053
998
|
adapter.log.debug(JSON.stringify(oLastYears));
|
|
1054
999
|
await adapter.setStateAsync(serial + ".history.years", { ack: true, val: JSON.stringify(oLastYears) });
|
|
1055
1000
|
|
|
1056
|
-
//await DB_CalcHistory_Months(serial);
|
|
1057
1001
|
} else {
|
|
1058
1002
|
adapter.log.error("Error while performing Query in CalcHistory_Years. " + err);
|
|
1059
1003
|
}
|
|
@@ -1086,24 +1030,7 @@ async function DB_CalcHistory_Months(serial) {
|
|
|
1086
1030
|
} else {
|
|
1087
1031
|
query = "SELECT strftime('%Y-%m', datetime(TimeStamp, 'unixepoch')) as date, Max(`ETotal`) as ertrag FROM `SpotData` WHERE `Serial` = '" + serial + "' AND TimeStamp>= " + datefrom.getTime() / 1000 + " AND TimeStamp<= " + dateto.getTime() / 1000 + " Group By strftime('%Y-%m', datetime(TimeStamp, 'unixepoch'))";
|
|
1088
1032
|
}
|
|
1089
|
-
|
|
1090
|
-
if (adapter.config.databasetype == "mySQL" || adapter.config.databasetype == "MariaDB") {
|
|
1091
|
-
|
|
1092
|
-
const [rows, fields] = await mysql_connection.execute(query);
|
|
1093
|
-
retRows = rows;
|
|
1094
|
-
//await CalcHistory_Months(0, rows, serial);
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
} else {
|
|
1098
|
-
|
|
1099
|
-
const stmt = sqlite_db.prepare(query);
|
|
1100
|
-
|
|
1101
|
-
const rows = stmt.all();
|
|
1102
|
-
retRows = rows;
|
|
1103
|
-
//await CalcHistory_Months(0, rows, serial);
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
}
|
|
1033
|
+
retRows = await DB_Query(query);
|
|
1107
1034
|
}
|
|
1108
1035
|
catch (e) {
|
|
1109
1036
|
adapter.log.error("exception in DB_CalcHistory_Months [" + e + "]");
|
|
@@ -1122,7 +1049,6 @@ async function CalcHistory_Months(err, rows, serial) {
|
|
|
1122
1049
|
adapter.log.debug("rows " + JSON.stringify(rows));
|
|
1123
1050
|
|
|
1124
1051
|
const oLastMonth = [];
|
|
1125
|
-
//var monthdata = {};
|
|
1126
1052
|
|
|
1127
1053
|
for (const i in rows) {
|
|
1128
1054
|
|
|
@@ -1132,12 +1058,11 @@ async function CalcHistory_Months(err, rows, serial) {
|
|
|
1132
1058
|
"month": data["date"],
|
|
1133
1059
|
"value": data["ertrag"]
|
|
1134
1060
|
});
|
|
1135
|
-
|
|
1061
|
+
|
|
1136
1062
|
}
|
|
1137
1063
|
|
|
1138
1064
|
await adapter.setStateAsync(serial + ".history.last12Months", { ack: true, val: JSON.stringify(oLastMonth) });
|
|
1139
1065
|
|
|
1140
|
-
//DB_Disconnect();
|
|
1141
1066
|
} else {
|
|
1142
1067
|
adapter.log.error("Error while performing Query in CalcHistory_Months. " + err);
|
|
1143
1068
|
}
|
|
@@ -1189,10 +1114,6 @@ async function DB_AddDummyData() {
|
|
|
1189
1114
|
|
|
1190
1115
|
function DB_Disconnect() {
|
|
1191
1116
|
|
|
1192
|
-
//numOfInverters--;
|
|
1193
|
-
// wait for all data paths... last data path will close connection
|
|
1194
|
-
|
|
1195
|
-
//if (numOfInverters == 0) {
|
|
1196
1117
|
adapter.log.debug("disconnect database");
|
|
1197
1118
|
if (adapter.config.databasetype == "mySQL" || adapter.config.databasetype == "MariaDB") {
|
|
1198
1119
|
if (typeof mysql_connection != undefined && mysql_connection != null) {
|
|
@@ -1205,124 +1126,10 @@ function DB_Disconnect() {
|
|
|
1205
1126
|
}
|
|
1206
1127
|
|
|
1207
1128
|
adapter.log.info("all done ... ");
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
//} else {
|
|
1211
|
-
// adapter.log.debug("need to wait for disconnect");
|
|
1212
|
-
//}
|
|
1213
1129
|
}
|
|
1214
1130
|
|
|
1215
1131
|
|
|
1216
|
-
/**
|
|
1217
|
-
* @param {string} timeVal
|
|
1218
|
-
* @param {string} timeLimit
|
|
1219
|
-
*/
|
|
1220
|
-
/*
|
|
1221
|
-
function IsLater(timeVal, timeLimit) {
|
|
1222
1132
|
|
|
1223
|
-
let ret = false;
|
|
1224
|
-
try {
|
|
1225
|
-
adapter.log.debug("check IsLater : " + timeVal + " " + timeLimit);
|
|
1226
|
-
|
|
1227
|
-
if (typeof timeVal === "string" && typeof timeLimit === "string") {
|
|
1228
|
-
const valIn = timeVal.split(":");
|
|
1229
|
-
const valLimits = timeLimit.split(":");
|
|
1230
|
-
|
|
1231
|
-
if (valIn.length > 1 && valLimits.length > 1) {
|
|
1232
|
-
|
|
1233
|
-
if (parseInt(valIn[0]) > parseInt(valLimits[0])
|
|
1234
|
-
|| (parseInt(valIn[0]) == parseInt(valLimits[0]) && parseInt(valIn[1]) > parseInt(valLimits[1]))) {
|
|
1235
|
-
ret = true;
|
|
1236
|
-
adapter.log.debug("yes, IsLater : " + timeVal + " " + timeLimit);
|
|
1237
|
-
}
|
|
1238
|
-
}
|
|
1239
|
-
else {
|
|
1240
|
-
adapter.log.error("string does not contain : " + timeVal + " " + timeLimit);
|
|
1241
|
-
}
|
|
1242
|
-
}
|
|
1243
|
-
else {
|
|
1244
|
-
adapter.log.error("not a string " + typeof timeVal + " " + typeof timeLimit);
|
|
1245
|
-
}
|
|
1246
|
-
}
|
|
1247
|
-
catch (e) {
|
|
1248
|
-
adapter.log.error("exception in IsLater [" + e + "]");
|
|
1249
|
-
}
|
|
1250
|
-
return ret;
|
|
1251
|
-
}
|
|
1252
|
-
*/
|
|
1253
|
-
/**
|
|
1254
|
-
* @param {string } timeVal
|
|
1255
|
-
* @param {string } [timeLimit]
|
|
1256
|
-
*/
|
|
1257
|
-
/*
|
|
1258
|
-
function IsEarlier(timeVal, timeLimit) {
|
|
1259
|
-
|
|
1260
|
-
let ret = false;
|
|
1261
|
-
try {
|
|
1262
|
-
adapter.log.debug("check IsEarlier : " + timeVal + " " + timeLimit);
|
|
1263
|
-
|
|
1264
|
-
if (typeof timeVal === "string" && typeof timeLimit === "string") {
|
|
1265
|
-
const valIn = timeVal.split(":");
|
|
1266
|
-
const valLimits = timeLimit.split(":");
|
|
1267
|
-
|
|
1268
|
-
if (valIn.length > 1 && valLimits.length > 1) {
|
|
1269
|
-
|
|
1270
|
-
if (parseInt(valIn[0]) < parseInt(valLimits[0])
|
|
1271
|
-
|| (parseInt(valIn[0]) == parseInt(valLimits[0]) && parseInt(valIn[1]) < parseInt(valLimits[1]))) {
|
|
1272
|
-
ret = true;
|
|
1273
|
-
adapter.log.debug("yes, IsEarlier : " + timeVal + " " + timeLimit);
|
|
1274
|
-
}
|
|
1275
|
-
}
|
|
1276
|
-
else {
|
|
1277
|
-
adapter.log.error("string does not contain : " + timeVal + " " + timeLimit);
|
|
1278
|
-
}
|
|
1279
|
-
}
|
|
1280
|
-
else {
|
|
1281
|
-
adapter.log.error("not a string " + typeof timeVal + " " + typeof timeLimit);
|
|
1282
|
-
}
|
|
1283
|
-
}
|
|
1284
|
-
catch (e) {
|
|
1285
|
-
adapter.log.error("exception in IsEarlier [" + e + "]");
|
|
1286
|
-
}
|
|
1287
|
-
return ret;
|
|
1288
|
-
}
|
|
1289
|
-
*/
|
|
1290
|
-
/**
|
|
1291
|
-
* @param {string} timeVal
|
|
1292
|
-
* @param {string} timeLimit
|
|
1293
|
-
*/
|
|
1294
|
-
/*
|
|
1295
|
-
function IsEqual(timeVal, timeLimit) {
|
|
1296
|
-
|
|
1297
|
-
let ret = false;
|
|
1298
|
-
try {
|
|
1299
|
-
adapter.log.debug("check IsEqual : " + timeVal + " " + timeLimit);
|
|
1300
|
-
|
|
1301
|
-
if (typeof timeVal === "string" && typeof timeLimit === "string") {
|
|
1302
|
-
const valIn = timeVal.split(":");
|
|
1303
|
-
const valLimits = timeLimit.split(":");
|
|
1304
|
-
|
|
1305
|
-
if (valIn.length > 1 && valLimits.length > 1) {
|
|
1306
|
-
|
|
1307
|
-
if (parseInt(valIn[0]) === parseInt(valLimits[0]) && parseInt(valIn[1]) === parseInt(valLimits[1])) {
|
|
1308
|
-
ret = true;
|
|
1309
|
-
adapter.log.debug("yes, IsEqual : " + timeVal + " " + timeLimit);
|
|
1310
|
-
}
|
|
1311
|
-
}
|
|
1312
|
-
else {
|
|
1313
|
-
adapter.log.error("string does not contain : " + timeVal + " " + timeLimit);
|
|
1314
|
-
}
|
|
1315
|
-
}
|
|
1316
|
-
else {
|
|
1317
|
-
adapter.log.error("not a string " + typeof timeVal + " " + typeof timeLimit);
|
|
1318
|
-
}
|
|
1319
|
-
}
|
|
1320
|
-
catch (e) {
|
|
1321
|
-
adapter.log.error("exception in IsEqual [" + e + "]");
|
|
1322
|
-
}
|
|
1323
|
-
return ret;
|
|
1324
|
-
}
|
|
1325
|
-
*/
|
|
1326
1133
|
|
|
1327
1134
|
// If started as allInOne/compact mode => return function to create instance
|
|
1328
1135
|
if (module && module.parent) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.sbfspot",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.1.2",
|
|
4
4
|
"description": "sbfspot (SMA inverter) Adapter",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "René G.",
|
|
@@ -18,31 +18,30 @@
|
|
|
18
18
|
"url": "https://github.com/rg-engineering/ioBroker.sbfspot"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@iobroker/adapter-core": "2.
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"mysql2": "2.3.2",
|
|
21
|
+
"@iobroker/adapter-core": "2.6.0",
|
|
22
|
+
"better-sqlite3": "7.6.2",
|
|
23
|
+
"mysql2": "2.3.3",
|
|
25
24
|
"suncalc2": "1.8.1"
|
|
26
25
|
},
|
|
27
26
|
"devDependencies": {
|
|
28
|
-
"@iobroker/testing": "
|
|
29
|
-
"@types/chai": "4.
|
|
30
|
-
"@types/chai-as-promised": "7.1.
|
|
27
|
+
"@iobroker/testing": "3.0.2",
|
|
28
|
+
"@types/chai": "4.3.3",
|
|
29
|
+
"@types/chai-as-promised": "7.1.5",
|
|
31
30
|
"@types/gulp": "4.0.9",
|
|
32
|
-
"@types/mocha": "9.
|
|
33
|
-
"@types/node": "
|
|
31
|
+
"@types/mocha": "9.1.1",
|
|
32
|
+
"@types/node": "18.7.3",
|
|
34
33
|
"@types/proxyquire": "1.3.28",
|
|
35
34
|
"@types/request-promise-native": "1.0.18",
|
|
36
|
-
"@types/sinon": "10.0.
|
|
37
|
-
"@types/sinon-chai": "3.2.
|
|
38
|
-
"axios": "0.
|
|
39
|
-
"chai": "4.3.
|
|
35
|
+
"@types/sinon": "10.0.13",
|
|
36
|
+
"@types/sinon-chai": "3.2.8",
|
|
37
|
+
"axios": "0.27.2",
|
|
38
|
+
"chai": "4.3.6",
|
|
40
39
|
"chai-as-promised": "7.1.1",
|
|
41
|
-
"eslint": "8.
|
|
40
|
+
"eslint": "8.22.0",
|
|
42
41
|
"gulp": "4.0.2",
|
|
43
|
-
"mocha": "
|
|
42
|
+
"mocha": "10.0.0",
|
|
44
43
|
"proxyquire": "2.1.3",
|
|
45
|
-
"sinon": "
|
|
44
|
+
"sinon": "14.0.0",
|
|
46
45
|
"sinon-chai": "3.7.0"
|
|
47
46
|
},
|
|
48
47
|
"main": "main.js",
|