NEWS
[Vorlage] Betriebsstundenzähler & Verbrauchsrechner
-
@looxer01: Gibt es neue Erkenntnisse? Benötigst Du weitere Unterstützung? `
Hi,Ich komme erst am WE dazu, weil ich zur analyse etwas mehr Zeit brauche.
ggf brauche ich deine Hilfe. Am Besten ist aber immer mal selber ins System zu schauen. Jedenfalls für den BSZ.
Ich melde mich.
vG Looxer
-
Hi,
Ich komme erst am WE dazu, weil ich zur analyse etwas mehr Zeit brauche.
ggf brauche ich deine Hilfe. Am Besten ist aber immer mal selber ins System zu schauen. Jedenfalls für den BSZ. `
Danke kein Stress, wollte nur mal wieder reinhören, nicht das es unter geht. Ich hatte schon versucht den Fehler selber zu lokalisieren, was mir aber nicht gelang. Daher meine Rückfrage.
vg
Falk
-
Danke kein Stress, wollte nur mal wieder reinhören, `
Danke für die Geduld.Ich konnte das Problem nachvollziehen.
Es gibt da wohl im IoBroker eine Verhaltensänderung bei subscriptions.
Das heisst in diesem Fall, dass bei allen Datenpunkten ohne Verbuchungsbestätigung die subscription nicht ausgeführt wird.
Das ist z.B der Fall bei Javascript objekten.
Ich kann euch einen quick fix anbieten direkt im coding bis ich das gelöst habe.
Dazu müsstet ihr bei den Javascript Objekten folgende Code Aenderungen durchführen (nur bei bei den javascript objekten bitte
und zwar alle Zeilen betreffend javascript :
on({id: OnIdTAB[0 ], valNe: 1000 }, function(obj) { if(special[0][7] === true) { if (obj.state.ack) { if(special[0][10] === "0 5 31 2 *") { GeraetUpdate( 0); } } } else { if(obj.state.ack === false) { GeraetUpdate( 0 ); } } }); // ende on id on({id: OnIdTAB[1 ], valNe: 1000 }, function(obj) { if(special[1][7] === true) { if (obj.state.ack) { if(special[1][10] === "0 5 31 2 *") { GeraetUpdate( 1); } } } else { if(obj.state.ack === false) { GeraetUpdate( 1 ); } } }); // ende on id on({id: OnIdTAB[2 ], valNe: 1000 }, function(obj) { if(special[2][7] === true) { if (obj.state.ack) { if(special[2][10] === "0 5 31 2 *") { GeraetUpdate( 2); } } } else { if(obj.state.ack === false) { GeraetUpdate( 2 ); } } }); // ende on id on({id: OnIdTAB[3 ], valNe: 1000 }, function(obj) { if(special[3][7] === true) { if (obj.state.ack) { if(special[3][10] === "0 5 31 2 *") { GeraetUpdate( 3); } } } else { if(obj.state.ack === false) { GeraetUpdate( 3 ); } } }); // ende on id on({id: OnIdTAB[4 ], valNe: 1000 }, function(obj) { if(special[4][7] === true) { if (obj.state.ack) { if(special[4][10] === "0 5 31 2 *") { GeraetUpdate( 4); } } } else { if(obj.state.ack === false) { GeraetUpdate( 4 ); } } }); // ende on id on({id: OnIdTAB[5 ], valNe: 1000 }, function(obj) { if(special[5][7] === true) { if (obj.state.ack) { if(special[5][10] === "0 5 31 2 *") { GeraetUpdate( 5); } } } else { if(obj.state.ack === false) { GeraetUpdate( 5 ); } } }); // ende on id on({id: OnIdTAB[6 ], valNe: 1000 }, function(obj) { if(special[6][7] === true) { if (obj.state.ack) { if(special[6][10] === "0 5 31 2 *") { GeraetUpdate( 6); } } } else { if(obj.state.ack === false) { GeraetUpdate( 6 ); } } }); // ende on id on({id: OnIdTAB[7 ], valNe: 1000 }, function(obj) { if(special[7][7] === true) { if (obj.state.ack) { if(special[7][10] === "0 5 31 2 *") { GeraetUpdate( 7); } } } else { if(obj.state.ack === false) { GeraetUpdate( 7 ); } } }); // ende on id on({id: OnIdTAB[8 ], valNe: 1000 }, function(obj) { if(special[8][7] === true) { if (obj.state.ack) { if(special[8][10] === "0 5 31 2 *") { GeraetUpdate( 8); } } } else { if(obj.state.ack === false) { GeraetUpdate( 8 ); } } }); // ende on id on({id: OnIdTAB[9 ], valNe: 1000 }, function(obj) { if(special[9][7] === true) { if (obj.state.ack) { if(special[9][10] === "0 5 31 2 *") { GeraetUpdate( 9); } } } else { if(obj.state.ack === false) { GeraetUpdate( 9 ); } } }); // ende on id on({id: OnIdTAB[10], valNe: 1000 }, function(obj) { if(special[10][7] === true) { if (obj.state.ack) { if(special[10][10] === "0 5 31 2 *") { GeraetUpdate(10); } } } else { if(obj.state.ack === false) { GeraetUpdate(10); } } }); // ende on id on({id: OnIdTAB[11], valNe: 1000 }, function(obj) { if(special[11][7] === true) { if (obj.state.ack) { if(special[11][10] === "0 5 31 2 *") { GeraetUpdate(11); } } } else { if(obj.state.ack === false) { GeraetUpdate(11); } } }); // ende on id on({id: OnIdTAB[12], valNe: 1000 }, function(obj) { if(special[12][7] === true) { if (obj.state.ack) { if(special[12][10] === "0 5 31 2 *") { GeraetUpdate(12); } } } else { if(obj.state.ack === false) { GeraetUpdate(12); } } }); // ende on id on({id: OnIdTAB[13], valNe: 1000 }, function(obj) { if(special[13][7] === true) { if (obj.state.ack) { if(special[13][10] === "0 5 31 2 *") { GeraetUpdate(13); } } } else { if(obj.state.ack === false) { GeraetUpdate(13); } } }); // ende on id on({id: OnIdTAB[14], valNe: 1000 }, function(obj) { if(special[14][7] === true) { if (obj.state.ack) { if(special[14][10] === "0 5 31 2 *") { GeraetUpdate(14); } } } else { if(obj.state.ack === false) { GeraetUpdate(14); } } }); // ende on id on({id: OnIdTAB[15], valNe: 1000 }, function(obj) { if(special[15][7] === true) { if (obj.state.ack) { if(special[15][10] === "0 5 31 2 *") { GeraetUpdate(15); } } } else { if(obj.state.ack === false) { GeraetUpdate(15); } } }); // ende on id on({id: OnIdTAB[16], valNe: 1000 }, function(obj) { if(special[16][7] === true) { if (obj.state.ack) { if(special[16][10] === "0 5 31 2 *") { GeraetUpdate(16); } } } else { if(obj.state.ack === false) { GeraetUpdate(16); } } }); // ende on id on({id: OnIdTAB[17], valNe: 1000 }, function(obj) { if(special[17][7] === true) { if (obj.state.ack) { if(special[17][10] === "0 5 31 2 *") { GeraetUpdate(17); } } } else { if(obj.state.ack === false) { GeraetUpdate(17); } } }); // ende on id on({id: OnIdTAB[18], valNe: 1000 }, function(obj) { if(special[18][7] === true) { if (obj.state.ack) { if(special[18][10] === "0 5 31 2 *") { GeraetUpdate(18); } } } else { if(obj.state.ack === false) { GeraetUpdate(18); } } }); // ende on id on({id: OnIdTAB[19], valNe: 1000 }, function(obj) { if(special[19][7] === true) { if (obj.state.ack) { if(special[19][10] === "0 5 31 2 *") { GeraetUpdate(19); } } } else { if(obj.state.ack === false) { GeraetUpdate(19); } } }); // ende on id on({id: OnIdTAB[20], valNe: 1000 }, function(obj) { if(special[20][7] === true) { if (obj.state.ack) { if(special[20][10] === "0 5 31 2 *") { GeraetUpdate(20); } } } else { if(obj.state.ack === false) { GeraetUpdate(20); } } }); // ende on id on({id: OnIdTAB[21], valNe: 1000 }, function(obj) { if(special[21][7] === true) { if (obj.state.ack) { if(special[21][10] === "0 5 31 2 *") { GeraetUpdate(21); } } } else { if(obj.state.ack === false) { GeraetUpdate(21); } } }); // ende on id on({id: OnIdTAB[22], valNe: 1000 }, function(obj) { if(special[22][7] === true) { if (obj.state.ack) { if(special[22][10] === "0 5 31 2 *") { GeraetUpdate(22); } } } else { if(obj.state.ack === false) { GeraetUpdate(22); } } }); // ende on id on({id: OnIdTAB[23], valNe: 1000 }, function(obj) { if(special[23][7] === true) { if (obj.state.ack) { if(special[23][10] === "0 5 31 2 *") { GeraetUpdate(23); } } } else { if(obj.state.ack === false) { GeraetUpdate(23); } } }); // ende on id on({id: OnIdTAB[24], valNe: 1000 }, function(obj) { if(special[24][7] === true) { if (obj.state.ack) { if(special[24][10] === "0 5 31 2 *") { GeraetUpdate(24); } } } else { if(obj.state.ack === false) { GeraetUpdate(24); } } }); // ende on id on({id: OnIdTAB[25], valNe: 1000 }, function(obj) { if(special[25][7] === true) { if (obj.state.ack) { if(special[25][10] === "0 5 31 2 *") { GeraetUpdate(25); } } } else { if(obj.state.ack === false) { GeraetUpdate(25); } } }); // ende on id
austauschen mit beispielhaft für eine Zeile:
on({id: OnIdTAB[25], valNe: 1000 }, function(obj) { GeraetUpdate(25); }); // ende on id
vG Looxer
-
Hi,
so, habe noch ein wenig mehr gebastelt. Damit fällt der Fix einfacher und zugleich variabler aus.
Wie zuvor bitte diese Codingzeilen austauschen: In dieser Variante aber alle Zeilen austauschen.
on({id: OnIdTAB[0 ], valNe: 1000 }, function(obj) { if(special[0][7] === true) { if (obj.state.ack) { if(special[0][10] === "0 5 31 2 *") { GeraetUpdate( 0); } } } else { if(obj.state.ack === false) { GeraetUpdate( 0 ); } } }); // ende on id on({id: OnIdTAB[1 ], valNe: 1000 }, function(obj) { if(special[1][7] === true) { if (obj.state.ack) { if(special[1][10] === "0 5 31 2 *") { GeraetUpdate( 1); } } } else { if(obj.state.ack === false) { GeraetUpdate( 1 ); } } }); // ende on id on({id: OnIdTAB[2 ], valNe: 1000 }, function(obj) { if(special[2][7] === true) { if (obj.state.ack) { if(special[2][10] === "0 5 31 2 *") { GeraetUpdate( 2); } } } else { if(obj.state.ack === false) { GeraetUpdate( 2 ); } } }); // ende on id on({id: OnIdTAB[3 ], valNe: 1000 }, function(obj) { if(special[3][7] === true) { if (obj.state.ack) { if(special[3][10] === "0 5 31 2 *") { GeraetUpdate( 3); } } } else { if(obj.state.ack === false) { GeraetUpdate( 3 ); } } }); // ende on id on({id: OnIdTAB[4 ], valNe: 1000 }, function(obj) { if(special[4][7] === true) { if (obj.state.ack) { if(special[4][10] === "0 5 31 2 *") { GeraetUpdate( 4); } } } else { if(obj.state.ack === false) { GeraetUpdate( 4 ); } } }); // ende on id on({id: OnIdTAB[5 ], valNe: 1000 }, function(obj) { if(special[5][7] === true) { if (obj.state.ack) { if(special[5][10] === "0 5 31 2 *") { GeraetUpdate( 5); } } } else { if(obj.state.ack === false) { GeraetUpdate( 5 ); } } }); // ende on id on({id: OnIdTAB[6 ], valNe: 1000 }, function(obj) { if(special[6][7] === true) { if (obj.state.ack) { if(special[6][10] === "0 5 31 2 *") { GeraetUpdate( 6); } } } else { if(obj.state.ack === false) { GeraetUpdate( 6 ); } } }); // ende on id on({id: OnIdTAB[7 ], valNe: 1000 }, function(obj) { if(special[7][7] === true) { if (obj.state.ack) { if(special[7][10] === "0 5 31 2 *") { GeraetUpdate( 7); } } } else { if(obj.state.ack === false) { GeraetUpdate( 7 ); } } }); // ende on id on({id: OnIdTAB[8 ], valNe: 1000 }, function(obj) { if(special[8][7] === true) { if (obj.state.ack) { if(special[8][10] === "0 5 31 2 *") { GeraetUpdate( 8); } } } else { if(obj.state.ack === false) { GeraetUpdate( 8 ); } } }); // ende on id on({id: OnIdTAB[9 ], valNe: 1000 }, function(obj) { if(special[9][7] === true) { if (obj.state.ack) { if(special[9][10] === "0 5 31 2 *") { GeraetUpdate( 9); } } } else { if(obj.state.ack === false) { GeraetUpdate( 9 ); } } }); // ende on id on({id: OnIdTAB[10], valNe: 1000 }, function(obj) { if(special[10][7] === true) { if (obj.state.ack) { if(special[10][10] === "0 5 31 2 *") { GeraetUpdate(10); } } } else { if(obj.state.ack === false) { GeraetUpdate(10); } } }); // ende on id on({id: OnIdTAB[11], valNe: 1000 }, function(obj) { if(special[11][7] === true) { if (obj.state.ack) { if(special[11][10] === "0 5 31 2 *") { GeraetUpdate(11); } } } else { if(obj.state.ack === false) { GeraetUpdate(11); } } }); // ende on id on({id: OnIdTAB[12], valNe: 1000 }, function(obj) { if(special[12][7] === true) { if (obj.state.ack) { if(special[12][10] === "0 5 31 2 *") { GeraetUpdate(12); } } } else { if(obj.state.ack === false) { GeraetUpdate(12); } } }); // ende on id on({id: OnIdTAB[13], valNe: 1000 }, function(obj) { if(special[13][7] === true) { if (obj.state.ack) { if(special[13][10] === "0 5 31 2 *") { GeraetUpdate(13); } } } else { if(obj.state.ack === false) { GeraetUpdate(13); } } }); // ende on id on({id: OnIdTAB[14], valNe: 1000 }, function(obj) { if(special[14][7] === true) { if (obj.state.ack) { if(special[14][10] === "0 5 31 2 *") { GeraetUpdate(14); } } } else { if(obj.state.ack === false) { GeraetUpdate(14); } } }); // ende on id on({id: OnIdTAB[15], valNe: 1000 }, function(obj) { if(special[15][7] === true) { if (obj.state.ack) { if(special[15][10] === "0 5 31 2 *") { GeraetUpdate(15); } } } else { if(obj.state.ack === false) { GeraetUpdate(15); } } }); // ende on id on({id: OnIdTAB[16], valNe: 1000 }, function(obj) { if(special[16][7] === true) { if (obj.state.ack) { if(special[16][10] === "0 5 31 2 *") { GeraetUpdate(16); } } } else { if(obj.state.ack === false) { GeraetUpdate(16); } } }); // ende on id on({id: OnIdTAB[17], valNe: 1000 }, function(obj) { if(special[17][7] === true) { if (obj.state.ack) { if(special[17][10] === "0 5 31 2 *") { GeraetUpdate(17); } } } else { if(obj.state.ack === false) { GeraetUpdate(17); } } }); // ende on id on({id: OnIdTAB[18], valNe: 1000 }, function(obj) { if(special[18][7] === true) { if (obj.state.ack) { if(special[18][10] === "0 5 31 2 *") { GeraetUpdate(18); } } } else { if(obj.state.ack === false) { GeraetUpdate(18); } } }); // ende on id on({id: OnIdTAB[19], valNe: 1000 }, function(obj) { if(special[19][7] === true) { if (obj.state.ack) { if(special[19][10] === "0 5 31 2 *") { GeraetUpdate(19); } } } else { if(obj.state.ack === false) { GeraetUpdate(19); } } }); // ende on id on({id: OnIdTAB[20], valNe: 1000 }, function(obj) { if(special[20][7] === true) { if (obj.state.ack) { if(special[20][10] === "0 5 31 2 *") { GeraetUpdate(20); } } } else { if(obj.state.ack === false) { GeraetUpdate(20); } } }); // ende on id on({id: OnIdTAB[21], valNe: 1000 }, function(obj) { if(special[21][7] === true) { if (obj.state.ack) { if(special[21][10] === "0 5 31 2 *") { GeraetUpdate(21); } } } else { if(obj.state.ack === false) { GeraetUpdate(21); } } }); // ende on id on({id: OnIdTAB[22], valNe: 1000 }, function(obj) { if(special[22][7] === true) { if (obj.state.ack) { if(special[22][10] === "0 5 31 2 *") { GeraetUpdate(22); } } } else { if(obj.state.ack === false) { GeraetUpdate(22); } } }); // ende on id on({id: OnIdTAB[23], valNe: 1000 }, function(obj) { if(special[23][7] === true) { if (obj.state.ack) { if(special[23][10] === "0 5 31 2 *") { GeraetUpdate(23); } } } else { if(obj.state.ack === false) { GeraetUpdate(23); } } }); // ende on id on({id: OnIdTAB[24], valNe: 1000 }, function(obj) { if(special[24][7] === true) { if (obj.state.ack) { if(special[24][10] === "0 5 31 2 *") { GeraetUpdate(24); } } } else { if(obj.state.ack === false) { GeraetUpdate(24); } } }); // ende on id on({id: OnIdTAB[25], valNe: 1000 }, function(obj) { if(special[25][7] === true) { if (obj.state.ack) { if(special[25][10] === "0 5 31 2 *") { GeraetUpdate(25); } } } else { if(obj.state.ack === false) { GeraetUpdate(25); } } }); // ende on id
mit diesen Codingzeilen:
for (var x in Gruppen ) { on({id: OnIdTAB[x], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(x); } }); // ende on id }
Bitte Testen ob noch alles wie gewünscht läuft. Feedback wäre super.
vG looxer
-
Bitte Testen ob noch alles wie gewünscht läuft. Feedback wäre super. `
Danke für die Korrektur. Habe es gerade mal umgestellt und beobachte das. Melde mich wieder ob es funktioniert.vg Falk
-
Erste Erkenntnisse. Per VIS mit
for (var x in Gruppen ) { on({id: OnIdTAB[x], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(x); } }); // ende on id }
funktioniert gar nix mehr. Sowohl für javascript bzw. auch z.B. hm-rpc Datenpunkte. Daher habe testweise ich nur die einzelne "Javascript" Gruppe geändert von:
on({id: OnIdTAB[13], valNe: 1000 }, function(obj) { if(special[13][7] === true) { if (obj.state.ack) { if(special[13][10] === "0 5 31 2 *") { GeraetUpdate(13); } } } else { if(obj.state.ack === false) { GeraetUpdate(13); } } }); // ende on id
nach:
on({id: OnIdTAB[13], change: 'any' }, function(obj) { GeraetUpdate(13); }); // ende on id
geändert und da funktioniert es per VIS.
vg
Falk
-
funktioniert gar nix mehr. Sowohl für javascript bzw. auch z.B. hm-rpc Datenpunkte. `
mmmh, muss ich nochmal nachschauen am nächsten WE.
Bei mir schien es zu funktionieren.
Ich würde gerne die Tabellen dynamisch halten und die Vorgabe auf 26 Zeilen aufgeben.
Mal sehen was ich finde.
vG Looxer
-
Hi,
@schittl:funktioniert gar nix mehr. Sowohl für javascript bzw. auch z.B. hm-rpc Datenpunkte. Daher habe testweise ich nur die einzelne "Javascript" Gruppe geändert von: `
ja, Fehler gefunden.Ich habe den Fix etwas ausgebaut. Damit sollte es funktionieren. Die Tabellengroessen sind damit flexibel anzupassen.
Sie dürfen also genau die Anzahl der notwendingen Eintragungen enthalten aber auch mehr als 25.
Kannst du mal ausprobieren ?
vG Looxer
Edit: ich habe nun doch noch eine neue Version erstellt und hier eingestellt.
Die Tabellengroessen sind jetzt wieder fix auf 25 eingestellt. Die Einschränkung nur eine ID einzutragen ist nicht praktikabel.
vielleicht fällt mir da noch was anderes ein.
Das Coding enthält nicht den Einstellungsbereich, da dort keine Änderungen vorgenommen wurden.
-
Bin leider unterwegs, aber sobald ich wieder daheim bin (morgen Abend) mach ich das. Danke Dir und schönes WE.
VG
Falk
-
Bin leider unterwegs, aber sobald ich wieder daheim bin (morgen Abend) mach ich das. Danke Dir und schönes WE. `
Hi,
vielleicht hast du ja noch nicht getestet, wobei ich sicher bin, dass die letzte Version funktioniert.
Allerdings habe ich jetzt nun eine neue Version und bin zuversichtlich, dass jetzt die Zeilenbeschränkung aufgehoben ist.
Es funktioniert mit weniger Konfigzeilen oder eben auch mehr. Man kann also Konfigurationszeilen hinzufügen und mehr als 26.
vG Looxer
-
Moin,
habe es eingebunden und es scheint im Schnelltest für beide zu funktionieren. Danke Dir. Gute Arbeit.
vg
Falk
PS: Habe die letztere Version ausprobiert:
const ONSub = []; for (let x = 0; x < Gruppen.length; x++) { // const IDNR = OnIdTAB[x]; const GRPNummer = x ; ONSub.push(on(OnIdTAB[x], (obj) => GeraetUpdate(GRPNummer))); schedule(special[x][10], function(obj) { log("BSZ-Schedule aufgerufen","info"); GeraetUpdate(GRPNummer); }); // end of schedule }
-
Hallo,
ich bin noch ganz neu bei euch und bin aufgrund einer idee auf den Betriebstundenzahler gestoßen und habe leider Schwierigkeiten diesen in iobroker einzubinden.
Ich habe bis jetzt einfach ein neues javascript mit den Betriebstundenzahler.txt gefühlt und gestartet aber ich sehe die ganzen untermenus nicht die hier in diesen Thread oberall zu sehen sind.
mfg
Leon
-
Hi Leon,
na, dann willikommen im Forum
also, zunächst solltest du das Script nehmen, dass ich vor ein paar Tagen hier gepostet habe.
Es enthält einen wichtigen Fix und eine erhebliche Verbesserung. Werde ich demnächst auch im ersten Post hochladen.
Das Script muss 1:1 in den Editor als Javascript angelegt werden. (also reinkopieren). Wichtig ist den Bereich Common zu verwenden und nicht als"globales" script anzulegen.
Dann musst du noch den Datenpunkt, den du loggen willst eintragen. Datenpunkte , die nicht existieren werden warnmeldungen erzeugen.
Die kannst du entweder löschen (in allen 3 Tabellen" oder in der Gruppentabelle statt des Datenpunktes einfach "initial" eintragen.
Ganz besonders einfach ist das SetUp für einen Datenpunkt den du auf "true" loggen willst. Dann reicht es wirklich den Datenpunkt einzutragen und dann werden auch die notwendigen Datenpunkte angelegt.
Die weitere Konfiguration hängt von dem ab was du loggen willst.
vG Looxer
-
Vielen danke für die Antwort looxer01
Ich habe das Script von oben in den Ordner common eingefügt und es hat auch ohne fehler gestartet.
Aber ich finde unter Objekte unter javascript nur den Dateinamen BSZ mehr nicht. Wenn ich euere Screenshots so anschaue müsste dort eine menge stehen.
zu verdeutlichung 2 Screenshots von meiner Oberfläche
9473_skript1.jpg
9473_skript2.jpg -
Aber ich finde unter Objekte unter javascript nur den Dateinamen BSZ mehr nicht. Wenn ich euere Screenshots so anschaue müsste dort eine menge stehen. `
Hi,kannst du dein Programm posten oder per PN schicken ? Ich schaue es mir an.
vG looxer
-
Hallo looxer01
ich kann leider dir nicht das komplette Script zuschicken weil das Board nicht mehr als 100T Zeichen zuläßt und ich noch zu neu bin um PNs zu schreieben.
Ich hoffe das der auszug ausreicht. Ich habe das Script von unten gekürzt und von oben die Erklärung für die einstellungen.
! /….......Betriebsstundenzaehler BSZ Extended Version 0.99
! /
! var Gruppen = [];
! // 1.Homematic ID, 2.Thema(no spaces) 3.History 4.DAY 5.Week 6.Month 7.Year 8.Switch 9 - 18 Status to log 19.stop 20.Loesch
! Gruppen[ 0] = ['sonoff.0.Sonoff Dual-Schlafzimmer.POWER1' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! Gruppen[ 1] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! Gruppen[ 2] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! Gruppen[ 3] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! Gruppen[ 4] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! Gruppen[ 5] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! Gruppen[ 6] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! Gruppen[ 7] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! Gruppen[ 8] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! Gruppen[ 9] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! Gruppen[10] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! Gruppen[11] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! Gruppen[12] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! Gruppen[13] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! Gruppen[14] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! Gruppen[15] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! Gruppen[16] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! Gruppen[17] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! Gruppen[18] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! Gruppen[19] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! Gruppen[20] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! Gruppen[21] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! Gruppen[22] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! Gruppen[23] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! Gruppen[24] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! Gruppen[25] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
! /–-----------------------------------------------------------------------------
! Die folgende Tabelle dient zur Vergabe von Statusnamen zur besseren Lesbarkeit. Standard ist EIN
! Die ziffern im Array z.B. [0] korrespondieren mit der Gruppentabelle also Gruppen[0] gehört zu logname[0]
! Wird hier kein Feldname vergeben, dann wird Spalte 9-18 der Gruppentabelle als Feldname verwendet
! Beispiel: Zustand Lampe = EIN ,
! Beispiel: Status 1 =Start, 2 = Heizung_Zuendung,3 = Softstart 4 = Heizung_Brennen, 5 = Heizung_Nachlauf etc
! ACHTUNG- keine spaces verwenden /
! var logname = [];
! // Stat1 Stat2 Stat3 Stat4 Stat5 Stat6 Stat7 Stat8 Stat9 Stat10
! logname[0] = ['EinAus0' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! logname[1] = ['EinAus1' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! logname[2] = ['EinAus2' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! logname[3] = ['EinAus3' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! logname[4] = ['EinAus4' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! logname[5] = ['EinAus5' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! logname[6] = ['EinAus6' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! logname[7] = ['EinAus7' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! logname[8] = ['EinAus8' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! logname[9] = ['EinAus9' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! logname[10] = ['EinAus10' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! logname[11] = ['EinAus11' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! logname[12] = ['EinAus12' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! logname[13] = ['EinAus13' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! logname[14] = ['EinAus14' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! logname[15] = ['EinAus15' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! logname[16] = ['EinAus16' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! logname[17] = ['EinAus17' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! logname[18] = ['EinAus18' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! logname[19] = ['EinAus19' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! logname[20] = ['EinAus20' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! logname[21] = ['EinAus21' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! logname[22] = ['EinAus22' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! logname[23] = ['EinAus23' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! logname[24] = ['EinAus24' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! logname[25] = ['EinAus25' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,''];
! var special = [];
! // 1.Round 2.add1 3.Faktor 4. Divisor 5.add2 6.Individuallogik 7: DELTA(M)Grenze 8.Warten auf Bestaetigung 9.Durchschnitt - 10.Zaehlschwelle 11 Schedule 12. Min/MAX 13. MehrfachStatus 14. Selektives Logging
! special[0] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' , '' ];
! special[1] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ];
! special[2] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ];
! special[3] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ];
! special[4] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ];
! special[5] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' , '' ];
! special[6] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ];
! special[7] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ];
! special[8] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ];
! special[9] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ];
! special[10] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ];
! special[11] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ];
! special[12] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ];
! special[13] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ];
! special[14] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ];
! special[15] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ];
! special[16] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ];
! special[17] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ];
! special[18] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ];
! special[19] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' , '' ];
! special[20] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ];
! special[21] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ];
! special[22] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ];
! special[23] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ];
! special[24] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ];
! special[25] = ['' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ];
! // Es werden zur angegebenen Uhrzeit die Kumulationsvariablen bei beginn einer neuen Periode genullt (DAY,WEEK,MONTH,YEAR)
! // Zu dieser Zeit werden auch die Monatswerte und Jahreswerte gesichert falls History auf true steht
! var TimeSetStunde = "00"; // Bitte Uhrzeit - hier Stunde eingeben im 24 Stunden Format z.B. 00 für Mitternacht
! var TimeSetMinute = "04"; // Bitte Minuten eingeben z.B. 10 - = 00:10 für Null Uhr Zehn
! // logging in eine exterene EXCEL Datei - hier werden alle updates gesichert - wird vor allem zum debugging benoetigt Empfehlung false fuer produktiven Betrieb
! var logflag = false; // wenn auf true dann wird das logging in Datei /opt/iobroker/iobroker-data/BSZLog.csv eingeschaltet bei false vice versa
! // logging in eine exterene EXCEL Datei - hier werden alle Zeitabschnitte vor der Nullung gesichert - Empfehlung true fuer produktiven Betrieb
! var Timelogflag = false; // wenn auf true dann wird das logging in Datei /opt/iobroker/iobroker-data/BSZTimeLog.csv eingeschaltet bei false vice versa
! // fuer OSX und Windows MUSS der volle Pfad eingestellt werden (wenn die log flags auf true stehen)
! // Beispiel: /Users/looxer01/Documents/iobroker/iobroker-data/BSZLog.csv
! var LogPath = "C:\Users\Leon\Documents\BSZExtLog.csv"; // Pfad und Dateiname des externen Logs
! var TimeLogPath = "C:\Users\Leon\Documents\BSZExtTimeLog.csv"; // Pfad und Dateiname des externen Logs für die Zeitabschnitte täglich, wöchentlich monatlich jährlich
! // Ende Einstellungen …....................................................................................................
! // Experten-Einstellungen .......................................................................................................
! // die beiden Variablen regeln das abspeichern der ioBroker Variablen. Unter diesem Pfad sind sie in ioBroker javascript.0. zu finden
! var sysLocation = "BSZ.System"; // Speicherort der Systemvariablen
! var countLocation = "BSZ.Counter"; // Speicherort der Counter Variablen (Klartext Betriebszeiten)#
! // Die Periodenwerte werden damit im Text angeplasst , Achtung - damit werden zusätzliche Elemente angelegt - Vorhandene Elemente werden NICHT geändert
! // Die Ziffern sorgen für die richtige Sortierung
! var PeriodeDay = "1-DAY"; // Benennung der Perioden in der Datenstruktur
! var PeriodeWeek = "2-WEEK"; // Benennung der Perioden in der Datenstruktur
! var PeriodeMonth = "3-MONTH"; // Benennung der Perioden in der Datenstruktur
! var PeriodeYear = "4-YEAR"; // Benennung der Perioden in der Datenstruktur
! / Ende Experten-Einstellungen .......................................................................................................
! --------------------------------------------------------------------------------------------------------------------------------------/
! // Part 1.2 Allgemeine Variablen
! // Start des Programmablaufs bevor Trigger aufgerufen werden
! var SpaceChk = new RegExp(/\s/); // pattern um zu pruefen ob eine IDGruppe blanks enthaelt
! var fs = require('fs'); // enable write fuer externes log
! var string = " "; // Logstring
! var logtext=" " ; // Kommentar im log
! var FormTimeKum = "000:00:00:00"; // kumulierte Betriebsstunden im Format ddd:hh:mm:ss
! var FormTimeSingle = "000:00:00:00"; // kumulierte Betriebsstunden im Format ddd:hh:mm:ss
! var currSec = 0; // aktuelle Zeit in Millisekunden
! var GeraeteName = " "; // Bezeichnung des Geraetes
! var GeraeteStatus = " "; // Geraetestatus z.B. true / false
! var timediff = 0; // Variable Betriebszeit in MSec von letzter Einschaltzeit bis curren Ausschaltzeit
! var newkumtime = 0; // Variable neue berechnete kumulirete Zeit in MSec
! var LastMSec = 0; // Variable letzte Einschaltzeit in MSec
! var LastKumSec = 0; // Variable letzte kumulierte Zeit in MSec
! var DayKum = 0; // Rechenvariable taegliche kumulierte Werte
! var WeekKum = 0; // Rechenvariable woechentliche kumulierte Werte
! var MonthKum = 0; // Rechenvariable monatliche kumulierte Werte
! var YearKum = 0; // Rechenvariable jaehrliche kumulierte Werte
! var FormTimeDAY = "000:00:00:00"; // Rechenvariable taegliche formatierte Werte
! var FormTimeWEEK = "000:00:00:00"; // Rechenvariable woechentliche formatierte Werte
! var FormTimeMONTH = "000:00:00:00"; // Rechenvariable moantliche formatierte Werte
! var FormTimeYEAR = "000:00:00:00"; // Rechenvariable jaehrliche formatierte Werte
! var cronjob = TimeSetMinute + " " + TimeSetStunde +" * * *"; // Cron Schedule setzen
! var action = " "; // actiontext fuer Log
! var objGruppe = " "; // die iobroker bwz. HM object ID
! var objMSec = " "; // BSZ.SystemGrp00.MSec
! var objKum = " "; // BSZ.SystemGrp00.Kum
! var objTime = " "; // BSZ.Counter.Feldname
! var objSwitch = " "; // BSZ.Counter.Feldname
! var OnIdTAB = new Array([Gruppen.length]); // onID Tabelle fuer die Auslösung bei Änderung (wurde benötigt, um die schedule funktion zum Laufen zu bringen)
! // Part 1.2 Aufbereitung der Tabellen mit Plausibilitaetspruefung, Default Werten, Umwandlungen von Werten von Char to Num etc
! // Aufbauen der Variablentabellen zur Übergabe and die Berechnungsfunktion (Geraetupdate)
! // umwandeln von bool txt in real bool
! // umwandeln von zahlen txt in real zahlen
! // dient zur sicheren Behandlung von "false " versus false und delta versus DELTA
! var GrpSystem = [];
! var zaehler2 = 0;
! var spaltenzaehler;
! var compare;
! for (var zaehler = 0, // Loop über das Array
! zaehler_array = Gruppen.length; // entsprechend der Anzahl der Eintragungen
! zaehler < zaehler_array;
! zaehler++) { // addiere eins für jeden Druchgang
! zaehler2 = addZero(zaehler).zero2; // fuehrende Null
! // zusammenbauen von
! // /BSZ/SYSTEM/GRP00KUM = Kumulierte nicht umgerechnete Werte
! // /BSZ/SYSTEM/GRP00MSEC = Letzter Wert (z.B. einschaltzeit)
! // /BSZ/SYSTEM/GRP00AKU = Kumulierter Wert für Durchschnittsberechnung
! // /BSZ/SYSTEM/GRP00ASW = Anzahl Schaltungen für Durchschnittsberechnung
! GrpSystem[zaehler] = [sysLocation + '.Grp' + zaehler2 + 'MSec', // Eintrag Systemstruktur Zeitstempel oder uvneränderte Werte
! sysLocation + '.Grp' + zaehler2 + 'Kum', // Eintrag Systemstruktur Kumulationswerte
! countLocation + "." + Gruppen[zaehler][1], // Eintrag Counterstruktur
! sysLocation + '.Grp' + zaehler2 + 'AKU', // Eintrag Systemstruktur Durchschnittsfunktion
! sysLocation + '.Grp' + zaehler2 + 'ASW', // Eintrag Systemstruktur Durchschnittsfunktion
! sysLocation + '.Grp' + zaehler2 + 'MIN', // Eintrag Systemstruktur Minimumfuntion
! sysLocation + '.Grp' + zaehler2 + 'MAX', // Eintrag Systemstruktur Maximumfunktion
! ]; // Erzeuge Eintragung ins Array
! if(Gruppen[zaehler][0] === '') { // in Gruppen Pos1 ist nichts eingetragen
! Gruppen[zaehler][0] = "INITIAL";
! }
! if(Gruppen[zaehler][0].toUpperCase() === "INITIAL") {
! Gruppen[zaehler][0] = Gruppen[zaehler][0].toUpperCase();
! } else {
! if (ObjectExists(Gruppen[zaehler][0]) === false) {
! Gruppen[zaehler][0]= "INITIAL"; // Objekt existiert nicht, dann auf INITIAL setzen
! } // endif nicht INITIAL
! } // endif es ist INITIAL
! if(Gruppen[zaehler][0].toUpperCase() !== "INITIAL" && Gruppen[zaehler][1] === '') { // nicht initial und kein Thema vergeben
! Gruppen[zaehler][1] = getObject(objGruppe).common.name; // Auslesen der Bezeichnung des Geraetes und ersetzen als Thema (default)
! }
! if(Gruppen[zaehler][18] === true && Gruppen[zaehler][19] === false) { // updates ist off geschaltet
! Gruppen[zaehler][0] = "INITIAL";
! }
! compare = Gruppen[zaehler][8].toUpperCase();
! if(compare !== "DELTA" && compare !== "DELTAM" && compare !== "CALC") {
! special[zaehler][10] = ''; // Bei Methode TIME ist kein schedule zulässig
! }
! OnIdTAB[zaehler] = Gruppen[zaehler][0]; // ab in die onID Tabelle
! if(special[zaehler][10] === '') {
! special[zaehler][10]= "0 5 31 2 "; // Verhindern, dass der Job jemals ausgeführt wird. oder am 31.02.
! } else {
! OnIdTAB[zaehler] = "INITIAL";
! }
! if(Gruppen[zaehler][8] === '' && Gruppen[zaehler][0] !== "INITIAL") { // Wenn Datenpunkt nicht INITIAL ist und nichts im ersten Status (8) steht, dann wird true angenommen
! Gruppen[zaehler][8] = true;
! } // endif true setzen fuer time methode
! if(special[zaehler][6] === '') { // Wenn keine fluktuationstoleranz gesetzt ist, dann wird 100 angenommen (wird nur verwendet für delta und deltam)
! special[zaehler][6] = 100;
! }
! if(special[zaehler][8] === '') { // Durchschnittsbildung aktiv ?
! special[zaehler][8] = false;
! } else {
! special[zaehler][8] = true;
! }
! if(special[zaehler][9] !== '') {
! special[zaehler][9] = Number(special[zaehler][9]); // Umwandeln des Schwellwertes für die Durchschnittsbildung in eine Zahl
! }
! if(special[zaehler][11] === '') { // Minimum / Maximum aktiv ?
! special[zaehler][11] = false;
! } else {
! special[zaehler][11] = true;
! }
! if(special[zaehler][12] === '') { // DoppelstatusMeldungen ignorieren aktiv ?
! special[zaehler][12] = false;
! } else {
! special[zaehler][12] = true;
! }
! if(special[zaehler][13] === '') { // selective logging aktiv ?
! special[zaehler][13] = false; // kein Eintrag, dann kein logging
! } else {
! if(Number(special[zaehler][13]) > 0) { // ist eine Zahl eingetragen worden =
! } else { // wenn keine Zahl, dann sollen Logs nicht zusammengefasst werden
! special[zaehler][13] = true;
! }
! }
! for ( spaltenzaehler = 2; spaltenzaehler < 20; spaltenzaehler++) { // alle true und false texte in boolean umwandeln fr die Gruppentabelle
! compare = Gruppen[zaehler][spaltenzaehler];
! if( typeof(compare) == "string") {
! compare = compare.toUpperCase();
! if(compare === "TRUE") {
! Gruppen[zaehler][spaltenzaehler] = true;
! } // endif true
! if(compare === "FALSE") {
! Gruppen[zaehler][spaltenzaehler] = false;
! } // endif true
! if(compare === "DELTA" || compare === "DELTAM" || compare === "CALC") {
! Gruppen[zaehler][spaltenzaehler] = Gruppen[zaehler][spaltenzaehler].toUpperCase();
! } // endif compare
! // log("Gruppentabelle " + zaehler + " " + spaltenzaehler + " " + Gruppen[zaehler][spaltenzaehler],"info");
! } // endif type ist string
! } // endfor spaltenzaehler Gruppen
! for ( spaltenzaehler = 0; spaltenzaehler < 8; spaltenzaehler++) { // alle nummern als text in zahlen umwandeln falsch wert nicht INITIAL
! if(spaltenzaehler === 5) { continue; } // Spalte 5 ist text
! if(spaltenzaehler === 7) { // Soll onID auch ohne ack aufgerufen werden ?
! if(special[zaehler][7] === 'false' || special[zaehler][7] === false) { // ist es false ?
! special[zaehler][7] = false;
! continue;
! } else { // sonst ist es true
! special[zaehler][7] = true;
! continue;
! } //endif ermittlung des boolean
! } // endif es spalte 8 der special tabelle
! if( special[zaehler][spaltenzaehler] !== '') {
! special[zaehler][spaltenzaehler] = Number(special[zaehler][spaltenzaehler]);
! }
! } // endfor spaltenzaehler special
! // log("nummer " + zaehler + " Gruppe20 " + Gruppen[zaehler][20] + " Gruppe0 " + Gruppen[zaehler][0] + " special " + special[zaehler][10] + " onidvar " + OnIdTAB[zaehler],"info");
! } // Ende FOR
! // Part 1.3 Anlegen oder Loeschen von Datenpunkten
! // Anlegen der Variablen falls notwendig und loeschen wenn eingestellt
! CreateDelStates(); // Anlegen der Variablen in ioBroker
! // Part 1.4 Definition der Trigger und schedule aufgrund der Einstellungstabellen
! // –----------------------T R I G G E R -------------------------------------------------------
! /
! for (var x in Gruppen ) {
! on({id: OnIdTAB[x], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(obj.id); } }); // ende on id
! schedule(special[x][10], function() { log("BSZ-Schedule aufgerufen","info");GeraetUpdate(Gruppen[x][0]); }); // end of schedule
! }
! /
! on({id: OnIdTAB[0], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(0); } }); // ende on id
! on({id: OnIdTAB[1], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(1); } }); // ende on id
! on({id: OnIdTAB[2], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(2); } }); // ende on id
! on({id: OnIdTAB[3], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(3); } }); // ende on id
! on({id: OnIdTAB[4], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(4); } }); // ende on id
! on({id: OnIdTAB[5], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(5); } }); // ende on id
! on({id: OnIdTAB[6], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(6); } }); // ende on id
! on({id: OnIdTAB[7], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(7); } }); // ende on id
! on({id: OnIdTAB[8], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(8); } }); // ende on id
! on({id: OnIdTAB[9], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(9); } }); // ende on id
! on({id: OnIdTAB[10], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(10); } }); // ende on id
! on({id: OnIdTAB[11], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(11); } }); // ende on id
! on({id: OnIdTAB[12], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(12); } }); // ende on id
! on({id: OnIdTAB[13], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(13); } }); // ende on id
! on({id: OnIdTAB[14], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(14); } }); // ende on id
! on({id: OnIdTAB[15], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(15); } }); // ende on id
! on({id: OnIdTAB[16], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(16); } }); // ende on id
! on({id: OnIdTAB[17], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(17); } }); // ende on id
! on({id: OnIdTAB[18], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(18); } }); // ende on id
! on({id: OnIdTAB[19], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(19); } }); // ende on id
! on({id: OnIdTAB[20], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(20); } }); // ende on id
! on({id: OnIdTAB[21], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(21); } }); // ende on id
! on({id: OnIdTAB[22], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(22); } }); // ende on id
! on({id: OnIdTAB[23], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(23); } }); // ende on id
! on({id: OnIdTAB[24], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(24); } }); // ende on id
! on({id: OnIdTAB[25], change: 'any' }, function(obj) { if (obj.state.val !== obj.oldState.val) { GeraetUpdate(25); } }); // ende on id
! schedule(special[0][10], function() { log("schedule 0 aufgerufen","info");GeraetUpdate(0); }); // end of schedule
! schedule(special[1][10], function() { log("schedule 1 aufgerufen","info"); GeraetUpdate(1); }); // end of schedule
! schedule(special[2][10], function() { log("schedule 2 aufgerufen","info"); GeraetUpdate(2); }); // end of schedule
! schedule(special[3][10], function() { log("schedule 3 aufgerufen","info"); GeraetUpdate(3); }); // end of schedule
! schedule(special[4][10], function() { log("schedule 4 aufgerufen","info"); GeraetUpdate(4); }); // end of schedule
! schedule(special[5][10], function() { log("schedule 5 aufgerufen","info");GeraetUpdate(5); }); // end of schedule
! schedule(special[6][10], function() { log("schedule 6 aufgerufen","info");GeraetUpdate(6); }); // end of schedule
! schedule(special[7][10], function() { log("schedule 7 aufgerufen","info");GeraetUpdate(7); }); // end of schedule
! schedule(special[8][10], function() { log("schedule 8 aufgerufen","info");GeraetUpdate(8); }); // end of schedule
! schedule(special[9][10], function() { log("schedule 9 aufgerufen","info");GeraetUpdate(9); }); // end of schedule
! schedule(special[10][10], function() { log("schedule 10 aufgerufen","info"); GeraetUpdate(10); }); // end of schedule
! schedule(special[11][10], function() { log("schedule 11 aufgerufen","info"); GeraetUpdate(11); }); // end of schedule
! schedule(special[12][10], function() { log("schedule 12 aufgerufen","info"); GeraetUpdate(12); }); // end of schedule
! schedule(special[13][10], function() { log("schedule 13 aufgerufen","info"); GeraetUpdate(13); }); // end of schedule
! schedule(special[14][10], function() { log("schedule 14 aufgerufen","info"); GeraetUpdate(14); }); // end of schedule
! schedule(special[15][10], function() { log("schedule 15 aufgerufen","info");GeraetUpdate(15); }); // end of schedule
! schedule(special[16][10], function() { log("schedule 16 aufgerufen","info"); GeraetUpdate(16); }); // end of schedule
! schedule(special[17][10], function() { log("schedule 17 aufgerufen","info"); GeraetUpdate(17); }); // end of schedule
! schedule(special[18][10], function() { log("schedule 18 aufgerufen","info"); GeraetUpdate(18); }); // end of schedule
! schedule(special[19][10], function() { log("schedule 19 aufgerufen","info");GeraetUpdate(19); }); // end of schedule
! schedule(special[20][10], function() { log("schedule 20 aufgerufen","info");GeraetUpdate(20); }); // end of schedule
! schedule(special[21][10], function() { log("schedule 21 aufgerufen","info");GeraetUpdate(21); }); // end of schedule
! schedule(special[22][10], function() { log("schedule 22 aufgerufen","info");GeraetUpdate(22); }); // end of schedule
! schedule(special[23][10], function() { log("schedule 23 aufgerufen","info"); GeraetUpdate(23); }); // end of schedule
! schedule(special[24][10], function() { log("schedule 24 aufgerufen","info"); GeraetUpdate(24); }); // end of schedule
! schedule(special[25][10], function() { log("schedule 25 aufgerufen","info");GeraetUpdate(25); }); // end of schedule
! // Part 3 Taegliches Zuruecksetzen der Datenpunkte aufgrund von Periodenwechsel DAY,WEEK,MONTH,YEAR
! // –----------------------Aenderung des Status des Geraetes------------------------------------
! //-------------------------Beim Einschalten wird die Zeit festgehalten -------------------------
! //-------------------------Beim Ausschalten wird die Zeitdifferenz berechnet und gespeichert----
! schedule(cronjob, function() { PeriodChange(); });
! // ------------------------ F U N K T I O N E N -------------------------------------------------------
! // Part 1.4.1 Vorbereiten zum Anlegen/Löschen von Datenpunkten
! //-----------------------------------------------------------------------------------------------------
! // Funktion zum Anlegen der Variablen im System
! //-----------------------------------------------------------------------------------------------------
! function CreateDelStates(){
! var zaehlerstatus = 0;
! var method = "TIME";
! for (var zaehler = 0,
! zaehler_array = Gruppen.length;
! zaehler < zaehler_array;
! zaehler++) {
! zaehler2 = addZero(zaehler).zero2;
! if (Gruppen[zaehler][0] === "INITIAL") { continue; } // Check Gueltigkeit object
! for ( zaehlerstatus = 8; zaehlerstatus < 18; zaehlerstatus++) { // Spalte 8 - 18 fuer die Gruppentabelle entspriche logname -8
! if (Gruppen[zaehler][zaehlerstatus] === '') { continue; } //Status is INITIAL
! if (method !== "TIME" && zaehlerstatus > {
! break; // Multiple Status werden nur gebraucht fuer TIME Objekte
! }
! method = "TIME";
! if (Gruppen[zaehler][8] === 'DELTA') {
! method = "DELTA";
! }
! if (Gruppen[zaehler][8] === 'DELTAM') {
! method = "DELTAM";
! }
! if (Gruppen[zaehler][8] === 'CALC') {
! method = "CALC";
! }
! // Status fuer die Methoden anlegen
! CreateDelStateSingle(zaehler,zaehlerstatus,method,"none","none"); // anlegen fuer alle methods (ausser hostory und switch ) bis zum statuslevel
! // Status fuer die system struktur anlegen
! if (Gruppen[zaehler][3] === true) { // soll eine DAY kumulations Variable angelegt werden ?
! CreateDelStateSingle(zaehler,zaehlerstatus,method,"SYSTEM","day"); // anlegen fuer die System Struktur Periode
! } // endif Summierung soll angelegt werden
! if (Gruppen[zaehler][4] === true) { // soll eine week kumulations Variable angelegt werden ?
! CreateDelStateSingle(zaehler,zaehlerstatus,method,"SYSTEM","week"); // anlegen fuer die System Struktur Periode
! } // endif Summierung soll angelegt werden
! if (Gruppen[zaehler][5] === true) { // soll eine month kumulations Variable angelegt werden ?
! CreateDelStateSingle(zaehler,zaehlerstatus,method,"SYSTEM","month"); // anlegen fuer die System Struktur Periode
! } // endif Summierung soll angelegt werden
! if (Gruppen[zaehler][6] === true) { // soll eine year kumulations Variable angelegt werden ?
! CreateDelStateSingle(zaehler,zaehlerstatus,method,"SYSTEM","year"); // anlegen fuer die System Struktur Periode
! } // endif Summierung soll angelegt werden
! // Methoden Struktur (ausser history und Status anlegen / loeschen)
! if (Gruppen[zaehler][3] === true) { // soll eine DAY kumulations Variable angelegt werden ?
! CreateDelStateSingle(zaehler,zaehlerstatus,method,"none","day");
! } // endif Summierung soll angelegt werde
! if (Gruppen[zaehler][4] === true) { // soll eine week kumulations Variable angelegt werden ?
! CreateDelStateSingle(zaehler,zaehlerstatus,method,"none","week");
! } // endif Summierung soll angelegt werde
! if (Gruppen[zaehler][5] === true) { // soll eine month kumulations Variable angelegt werden ?
! CreateDelStateSingle(zaehler,zaehlerstatus,method,"none","month");
! } // endif Summierung soll angelegt werde
! if (Gruppen[zaehler][6] === true) { // soll eine year kumulations Variable angelegt werden ?
! CreateDelStateSingle(zaehler,zaehlerstatus,method,"none","year");
! } // endif Summierung soll angelegt werde
! // Switch Stuktur anlengen / loeschen
! if (Gruppen[zaehler][7] === true ) { // Soll auch eine Switch Variable angelegt werden
! CreateDelStateSingle(zaehler,zaehlerstatus,"none","SWITCH","none");
! if (Gruppen[zaehler][3] === true) { // soll eine DAY kumulations Variable angelegt werden ?
! CreateDelStateSingle(zaehler,zaehlerstatus,"none","SWITCH","day");
! }
! if (Gruppen[zaehler][4] === true) { // soll eine week kumulations Variable angelegt werden ?
! CreateDelStateSingle(zaehler,zaehlerstatus,"none","SWITCH","week");
! }
! if (Gruppen[zaehler][5] === true) { // soll eine month kumulations Variable angelegt werden ?
! CreateDelStateSingle(zaehler,zaehlerstatus,"none","SWITCH","month");
! }
! if (Gruppen[zaehler][6] === true) { // soll eine year kumulations Variable angelegt werden ?
! CreateDelStateSingle(zaehler,zaehlerstatus,"none","SWITCH","year");
! }
! } // endif Switch Variablen anzulegen ?
! // Durchschnittsberechnung - Struktur anlegen
! if (special[zaehler][8] === true ) { // Anlegen der Day Average
! CreateDelStateSingle(zaehler,zaehlerstatus,"none","AVERAGE","none");
! if (Gruppen[zaehler][3] === true) { // Anlegen der Day Average
! CreateDelStateSingle(zaehler,zaehlerstatus,"none","AVERAGE","day");
! }
! if (Gruppen[zaehler][4] === true) { // Anlegen der Day Average
! CreateDelStateSingle(zaehler,zaehlerstatus,"none","AVERAGE","week");
! }
! if (Gruppen[zaehler][5] === true) { // Anlegen der Day Average
! CreateDelStateSingle(zaehler,zaehlerstatus,"none","AVERAGE","month");
! }
! if (Gruppen[zaehler][6] === true) { // Anlegen der Day Average
! CreateDelStateSingle(zaehler,zaehlerstatus,"none","AVERAGE","year");
! }
! } // endif Durschnittsbewertung aktiv
! // Min/MAX - Struktur anlegen
! if (special[zaehler][11] === true ) { // Anlegen MINMAX
! CreateDelStateSingle(zaehler,zaehlerstatus,"none","MINMAX","none");
! if (Gruppen[zaehler][3] === true) { // Anlegen der Day MINMAX
! CreateDelStateSingle(zaehler,zaehlerstatus,"none","MINMAX","day");
! }
! if (Gruppen[zaehler][4] === true) { // Anlegen der Week MINMAX
! CreateDelStateSingle(zaehler,zaehlerstatus,"none","MINMAX","week");
! }
! if (Gruppen[zaehler][5] === true) { // Anlegen der Month MINMAX
! CreateDelStateSingle(zaehler,zaehlerstatus,"none","MINMAX","month");
! }
! if (Gruppen[zaehler][6] === true) { // Anlegen der Year MINMAX
! CreateDelStateSingle(zaehler,zaehlerstatus,"none","MINMAX","year");
! }
! } // endif MINMAX aktiv
! // History Struktur anlegen/ loeschen
! if (Gruppen[zaehler][2] === true && Gruppen[zaehler][5] === true) { // Anlegen der Monats History Werte das laufende Jahr wenn Monatskumulation und Historie angeschaltet
! CreateDelStateSingle(zaehler,zaehlerstatus,method,"HISTORY","month");
! if(special[zaehler][8] === true) { // Durchschnittsfunktion ist aktiv
! CreateDelStateSingle(zaehler,zaehlerstatus,"AVERAGE","HISTORY","month");
! }
! if(special[zaehler][11] === true) { // MINMAX ist aktiv
! CreateDelStateSingle(zaehler,zaehlerstatus,"MINMAX","MINMAX","month");
! }
! }
! if (Gruppen[zaehler][2] === true && Gruppen[zaehler][6] === true) { // Anlegen der Jahres History Werte das laufende Jahr wenn Jahreskumulation und Historie angeschaltet
! CreateDelStateSingle(zaehler,zaehlerstatus,method,"HISTORY","year");
! if(special[zaehler][8] === true) { // Durchschnittsfunktion ist aktiv
! CreateDelStateSingle(zaehler,zaehlerstatus,"AVERAGE","HISTORY","year");
! }
! if(special[zaehler][11] === true) { // MINMAX ist aktiv
! CreateDelStateSingle(zaehler,zaehlerstatus,"AVERAGE","HISTORY","year");
! }
! }
! } // Ende FOR Statuszaheler
! } // Ende FOR Gruppenzaehler
! } // ende Funktion
! // Part 1.4.2 Ausführen Anlegen/Löschen von Datenpunkten
! //–---------------------------------------------------------------------------------------------------
! // Funktion zum Anlegen der Variablen im System - hier Statusinformationen
! //-----------------------------------------------------------------------------------------------------
! function CreateDelStateSingle(zeile,spalte,method,funktion,periode) {
! // Zeile = Zeile der Gruppentabelle
! // spalte = spalte der Gruppentabelle (status)
! // method = alle Methoden
! // funktion = Funktionen Switch, Average, history
! // periode = day week month year oder none
! var actionDel = false;
! if (Gruppen[zeile][19] === true && Gruppen[zeile][18] === true) { // wenn actionDel = true dann soll geloescht werden
! actionDel = true;
! }
! if (actionDel === false && Gruppen[zeile][18] === true) { // kein loeschen aber auch nicht anlegen da Refresh auf gestoppt gesetzt
! return;
! }
! var statusname = Gruppen[zeile][spalte];
! if (logname[zeile][spalte-8] !== '') { // Gibt es einen Status in der logname tabelle ? wenn ja merken mit vorrang
! statusname = logname[zeile][spalte-8];
! }
! if (statusname === '' ) { return; }
! var pathCount = countLocation + '.' + Gruppen[zeile][1]; // BSZ.Counter.Thema
! var pathSysM = sysLocation + '.Grp' + addZero(zeile).zero2 + 'MSec.' + statusname;
! var pathSysK = sysLocation + '.Grp' + addZero(zeile).zero2 + 'Kum.' + statusname;
! var pathCLevel3; //BSZ.Counter.Thema.Type.Status
! var pathHistM; // BSZ.Counter.Thema.Status.History.Month
! var pathHistY; // BSZ.Counter.Thema.Status.History.Year
! var pathCLevel4;
! var pathCLevel4b;
! var pathsysaku;
! var pathsysasw;
! var pathsysmin; // Minimum path
! var pathsysmax; // Maximum path
! var year = new Date().getFullYear();
! var month = addZero(new Date().getMonth()+1).zero2; // aktueller Monat
! var yearvor =new Date().getFullYear()-1; // Jahr fuer die Historyfortschreibung - also Vorjahr
! // die Methodenstuktur und systemstruktur anlegen
! if(funktion === "none" && periode === "none" ) { // Hier werden nur die Status der types angelegt (ohne perioden)
! pathCLevel3 = pathCount + "." + method + "." + statusname; //BSZ.Counter.Thema.Type.Status
! if (actionDel === false) {
! createState(pathSysM , 0); // Anlegen systemeintrag msec
! createState(pathSysK , 0); // anlegen systemeintrag kum
! createState(pathCLevel3 , 0);
! } else {
! ObjectExistsDelState(pathSysM ); // loeschen systemeintrag msec
! ObjectExistsDelState(pathSysK ); // loeschen systemeintrag kum
! ObjectExistsDelState(pathCLevel3); // loeschen counteintrag oberster level
! } // endif del
! }
! // die perioden der methodenstruktur anlegen
! if(periode === 'day' && funktion === "none") {
! pathCLevel4 = pathCount + "." + method + "." + statusname + "."+PeriodeDay; //BSZ.Counter.Thema.Type.Status
! pathCLevel4b = pathCount + "." + method + "." + statusname + "."+PeriodeDay+".BEFORE"; //BSZ.Counter.Thema.Type.Status
! if (actionDel === false) {
! createState(pathCLevel4 , 0);
! createState(pathCLevel4b, 0);
! } else {
! ObjectExistsDelState(pathCLevel4 );
! ObjectExistsDelState(pathCLevel4b);
! } // endif del
! } // endif periode
! if(periode === 'week' && funktion === "none") {
! pathCLevel4 = pathCount + "." + method + "." + statusname + "."+PeriodeWeek; //BSZ.Counter.Thema.Type.Status
! pathCLevel4b = pathCount + "." + method + "." + statusname + "."+PeriodeWeek+".BEFORE"; //BSZ.Counter.Thema.Type.Status
! if (actionDel === false) {
! createState(pathCLevel4 , 0);
! createState(pathCLevel4b, 0);
! } else {
! ObjectExistsDelState(pathCLevel4);
! ObjectExistsDelState(pathCLevel4b);
! } // endif del
! } // endif periode
! if(periode === 'month' && funktion === "none") {
! pathCLevel4 = pathCount + "." + method + "." + statusname + "."+PeriodeMonth; //BSZ.Counter.Thema.Type.Status
! pathCLevel4b = pathCount + "." + method + "." + statusname + "."+PeriodeMonth+".BEFORE"; //BSZ.Counter.Thema.Type.Status
! if (actionDel === false) {
! createState(pathCLevel4 , 0);
! createState(pathCLevel4b, 0);
! } else {
! ObjectExistsDelState(pathCLevel4 );
! ObjectExistsDelState(pathCLevel4b);
! } // endif del
! } // endif periode
! if(periode === 'year' && funktion === "none") {
! pathCLevel4 = pathCount + "." + method + "." + statusname + "."+PeriodeYear; //BSZ.Counter.Thema.Type.Status
! pathCLevel4b = pathCount + "." + method + "." + statusname + "."+PeriodeYear+".BEFORE"; //BSZ.Counter.Thema.Type.Status
! if (actionDel === false) {
! createState(pathCLevel4 , 0);
! createState(pathCLevel4b, 0);
! } else {
! ObjectExistsDelState(pathCLevel4 );
! ObjectExistsDelState(pathCLevel4b);
! } // endif del
! } // endif periode
! // die perioden der systemstrktur anlegen
! if(funktion === "SYSTEM" && periode === "day" ) { // Anlegen der Perioden fuer die Systemstruktur- hier day
! pathSysK = pathSysK + "."+PeriodeDay;
! if (actionDel === false) {
! createState(pathSysK , 0);
! } else {
! ObjectExistsDelState(pathSysK );
! } // endif del
! }
! if(funktion === "SYSTEM" && periode === "week" ) {
! pathSysK = pathSysK + "."+PeriodeWeek;
! if (actionDel === false) {
! createState(pathSysK , 0);
! } else {
! ObjectExistsDelState(pathSysK );
! } // endif del
! }
! if(funktion === "SYSTEM" && periode === "month" ) {
! pathSysK = pathSysK + "."+PeriodeMonth;
! if (actionDel === false) {
! createState(pathSysK , 0);
! } else {
! ObjectExistsDelState(pathSysK );
! } // endif del
! }
! if(funktion === "SYSTEM" && periode === "year" ) {
! pathSysK = pathSysK + "."+PeriodeYear;
! if (actionDel === false) {
! createState(pathSysK , 0);
! } else {
! ObjectExistsDelState(pathSysK );
! } // endif del
! }
! // Switch Struktur anlegen inkl Perioden
! if(funktion === "SWITCH" && periode === "none") {
! pathCLevel3 = pathCount + "." + "SWITCH" + "." + statusname; //BSZ.Counter.Thema.Type.Status
! if (actionDel === false) {
! createState(pathCLevel3 , 0);
! } else {
! ObjectExistsDelState(pathCLevel3); // loeschen counteintrag oberster level
! } // endif del
! }
! if(funktion === "SWITCH" && periode === "day") {
! pathCLevel4 = pathCount + "." + "SWITCH" + "." + statusname + "."+PeriodeDay; //BSZ.Counter.Thema.Type.Status
! pathCLevel4b = pathCount + "." + "SWITCH" + "." + statusname + "."+PeriodeDay+".BEFORE"; //BSZ.Counter.Thema.Type.Status
! if (actionDel === false) {
! createState(pathCLevel4 , 0);
! createState(pathCLevel4b, 0);
! } else {
! ObjectExistsDelState(pathCLevel4); // loeschen counteintrag oberster level
! ObjectExistsDelState(pathCLevel4b);
! } // endif del
! }
! if(funktion === "SWITCH" && periode === "week") {
! pathCLevel4 = pathCount + "." + "SWITCH" + "." + statusname + "."+PeriodeWeek; //BSZ.Counter.Thema.Type.Status
! pathCLevel4b = pathCount + "." + "SWITCH" + "." + statusname + "."+PeriodeWeek+".BEFORE"; //BSZ.Counter.Thema.Type.Status
! if (actionDel === false) {
! createState(pathCLevel4 , 0);
! createState(pathCLevel4b, 0);
! } else {
! ObjectExistsDelState(pathCLevel4); // loeschen counteintrag oberster level
! ObjectExistsDelState(pathCLevel4b);
! } // endif del
! }
! if(funktion === "SWITCH" && periode === "month") {
! pathCLevel4 = pathCount + "." + "SWITCH" + "." + statusname + "."+PeriodeMonth; //BSZ.Counter.Thema.Type.Status
! pathCLevel4b = pathCount + "." + "SWITCH" + "." + statusname + "."+PeriodeMonth+".BEFORE"; //BSZ.Counter.Thema.Type.Status
! if (actionDel === false) {
! createState(pathCLevel4 , 0);
! createState(pathCLevel4b, 0);
! } else {
! ObjectExistsDelState(pathCLevel4); // loeschen counteintrag oberster level
! ObjectExistsDelState(pathCLevel4b);
! } // endif del
! }
! if(funktion === "SWITCH" && periode === "year") {
! pathCLevel4 = pathCount + "." + "SWITCH" + "." + statusname + "."+PeriodeYear; //BSZ.Counter.Thema.Type.Status
! pathCLevel4b = pathCount + "." + "SWITCH" + "." + statusname + "."+PeriodeYear+".BEFORE"; //BSZ.Counter.Thema.Type.Status
! if (actionDel === false) {
! createState(pathCLevel4 , 0);
! createState(pathCLevel4b, 0);
! } else {
! ObjectExistsDelState(pathCLevel4); // loeschen counteintrag oberster level
! ObjectExistsDelState(pathCLevel4b);
! } // endif del
! }
! // Anlegen der History Stuktur unterhalb der Methoden
! if(funktion === "HISTORY") {
! pathHistM = pathCount + "." + method + "." + statusname + ".HISTORY"+ "."+PeriodeMonth +"."; // BSZ.Counter.Thema.Status.History.Month
! pathHistY = pathCount + "." + method + "." + statusname + ".HISTORY"+ "."+PeriodeYear +"."; // BSZ.Counter.Thema.Status.History.Month
! if (periode === "month") {
! for ( i = 1; i <= 12; i++) {
! month = addZero(i).zero2; // Monat mit führender null
! if (actionDel === false) {
! createState(pathHistM + year + month, 0); // alle Monate des jahres anlegen
! } else {
! ObjectExistsDelState(pathHistM + year + month); // alle Monate des jahres loeschen
! } // endif del
! } // endfor
! if (actionDel === false) {
! createState(pathHistM + yearvor + "12", 0); // letzten Monat vor Jahreswechsel anlegen
! } else {
! ObjectExistsDelState(pathHistM + yearvor + "12"); //letzten Monat vor Jahreswechsel loeschen
! } // endif del
! } // endif month
! if (periode === "year") {
! if (actionDel === false) {
! createState(pathHistY + year, 0); //Jahr anlegen
! createState(pathHistY + yearvor, 0); //Vorjahr anlegen
! } else {
! ObjectExistsDelState(pathHistY + year); //Jahr loeschen
! ObjectExistsDelState(pathHistY + yearvor); //Vorjahr loeschen
! } // endif del
! } // endif year
! } // endif history
! // Anlegen der Struktur AVERAGE - Durchschnittsberechnung
! if(funktion === "AVERAGE" && periode === "none") {
! pathCLevel3 = pathCount + "." + "AVERAGE" + "." + statusname; //BSZ.Counter.Thema.Type.Status
! pathsysaku = GrpSystem[zeile][3]+ "." + statusname;
! pathsysasw = GrpSystem[zeile][4]+ "." + statusname;
! if (actionDel === false) {
! createState(pathCLevel3 , 0);
! createState(pathsysaku , 0);
! createState(pathsysasw , 0);
! } else {
! ObjectExistsDelState(pathCLevel3); // loeschen counteintrag oberster level
! ObjectExistsDelState(pathsysaku); // loeschen durchschnitt system oberster level
! ObjectExistsDelState(pathsysasw); // loeschen durchschnitt oberster level
! } // endif del
! }
! if(funktion === "AVERAGE" && periode === "day") {
! pathCLevel4 = pathCount + "." + "AVERAGE" + "." + statusname+ "."+PeriodeDay; //BSZ.Counter.Thema.Type.Status
! pathCLevel4b = pathCount + "." + "AVERAGE" + "." + statusname + "."+PeriodeDay+".BEFORE"; //BSZ.Counter.Thema.Type.Status
! pathsysaku = GrpSystem[zeile][3]+ "." + statusname+ "."+PeriodeDay;
! pathsysasw = GrpSystem[zeile][4]+ "." + statusname+ "."+PeriodeDay;
! if (actionDel === false) {
! createState(pathCLevel4 , 0);
! createState(pathCLevel4b, 0);
! createState(pathsysaku , 0);
! createState(pathsysasw , 0);
! } else {
! ObjectExistsDelState(pathCLevel4); // loeschen counteintrag oberster level
! ObjectExistsDelState(pathCLevel4b);
! ObjectExistsDelState(pathsysaku); // loeschen durchschnitt system oberster level
! ObjectExistsDelState(pathsysasw); // loeschen durchschnitt oberster level
! } // endif del
! }
! if(funktion === "AVERAGE" && periode === "week") {
! pathCLevel4 = pathCount + "." + "AVERAGE" + "." + statusname+ "."+PeriodeWeek; //BSZ.Counter.Thema.Type.Status
! pathCLevel4b = pathCount + "." + "AVERAGE" + "." + statusname + "."+PeriodeWeek+".BEFORE"; //BSZ.Counter.Thema.Type.Status
! pathsysaku = GrpSystem[zeile][3]+ "." + statusname+ "."+PeriodeWeek;
! pathsysasw = GrpSystem[zeile][4]+ "." + statusname+ "."+PeriodeWeek;
! if (actionDel === false) {
! createState(pathCLevel4 , 0);
! createState(pathCLevel4b, 0);
! createState(pathsysaku , 0);
! createState(pathsysasw , 0);
! } else {
! ObjectExistsDelState(pathCLevel4); // loeschen counteintrag oberster level
! ObjectExistsDelState(pathCLevel4b);
! ObjectExistsDelState(pathsysaku); // loeschen durchschnitt system oberster level
! ObjectExistsDelState(pathsysasw); // loeschen durchschnitt oberster level
! } // endif del
! }
! if(funktion === "AVERAGE" && periode === "month") {
! pathCLevel4 = pathCount + "." + "AVERAGE" + "." + statusname+ "."+PeriodeMonth; //BSZ.Counter.Thema.Type.Status
! pathCLevel4b = pathCount + "." + "AVERAGE" + "." + statusname + "."+PeriodeMonth+".BEFORE"; //BSZ.Counter.Thema.Type.Status
! pathsysaku = GrpSystem[zeile][3]+ "." + statusname+ "."+PeriodeMonth;
! pathsysasw = GrpSystem[zeile][4]+ "." + statusname+ "."+PeriodeMonth;
! if (actionDel === false) {
! createState(pathCLevel4 , 0);
! createState(pathCLevel4b, 0);
! createState(pathsysaku , 0);
! createState(pathsysasw , 0);
! } else {
! ObjectExistsDelState(pathCLevel4); // loeschen counteintrag oberster level
! ObjectExistsDelState(pathCLevel4b);
! ObjectExistsDelState(pathsysaku); // loeschen durchschnitt system oberster level
! ObjectExistsDelState(pathsysasw); // loeschen durchschnitt oberster level
! } // endif del
! }
! if(funktion === "AVERAGE" && periode === "year") {
! pathCLevel4 = pathCount + "." + "AVERAGE" + "." + statusname+ "."+PeriodeYear; //BSZ.Counter.Thema.Type.Status
! pathCLevel4b = pathCount + "." + "AVERAGE" + "." + statusname + "."+PeriodeYear+".BEFORE"; //BSZ.Counter.Thema.Type.Status
! pathsysaku = GrpSystem[zeile][3]+ "." + statusname+ "."+PeriodeYear;
! pathsysasw = GrpSystem[zeile][4]+ "." + statusname+ "."+PeriodeYear;
! if (actionDel === false) {
! createState(pathCLevel4 , 0);
! createState(pathCLevel4b, 0);
! createState(pathsysaku , 0);
! createState(pathsysasw , 0);
! } else {
! ObjectExistsDelState(pathCLevel4); // loeschen counteintrag oberster level
! ObjectExistsDelState(pathCLevel4b);
! ObjectExistsDelState(pathsysaku); // loeschen durchschnitt system oberster level
! ObjectExistsDelState(pathsysasw); // loeschen durchschnitt oberster level
! } // endif del
! }
! // Anlegen der Struktur MINMAX - Minimum Maximum
! if(funktion === "MINMAX" && periode === "none") {
! pathCLevel3 = pathCount + "." + "MINIMUM" + "." + statusname; //BSZ.Counter.Thema.Type.Status
! pathsysmin = GrpSystem[zeile][5]+ "." + statusname;
! pathsysmax = GrpSystem[zeile][6]+ "." + statusname;
! if (actionDel === false) {
! createState(pathCLevel3, 0);
! createState(pathsysmin);
! } else {
! ObjectExistsDelState(pathCLevel3); // loeschen counteintrag oberster level
! ObjectExistsDelState(pathsysmin); // loeschen durchschnitt system oberster level
! } // endif del
! pathCLevel3 = pathCount + "." + "MAXIMUM" + "." + statusname; //BSZ.Counter.Thema.Type.Status
! if (actionDel === false) {
! createState(pathCLevel3 , 0);
! createState(pathsysmax);
! } else {
! ObjectExistsDelState(pathCLevel3); // loeschen counteintrag oberster level
! ObjectExistsDelState(pathsysmax); // loeschen durchschnitt oberster level
! } // endif del
! }
! if(funktion === "MINMAX" && periode === "day") {
! pathCLevel4 = pathCount + "." + "MINIMUM" + "." + statusname+ "."+PeriodeDay; //BSZ.Counter.Thema.Type.Status
! pathCLevel4b = pathCount + "." + "MINIMUM" + "." + statusname + "."+PeriodeDay+".BEFORE"; //BSZ.Counter.Thema.Type.Status
! pathsysmin = GrpSystem[zeile][5]+ "." + statusname+ "."+PeriodeDay;
! pathsysmax = GrpSystem[zeile][6]+ "." + statusname+ "."+PeriodeDay;
! if (actionDel === false) {
! createState(pathCLevel4 , 0);
! createState(pathCLevel4b, 0);
! createState(pathsysmin);
! } else {
! ObjectExistsDelState(pathCLevel4); // loeschen counteintrag oberster level
! ObjectExistsDelState(pathCLevel4b);
! ObjectExistsDelState(pathsysmin); // loeschen durchschnitt system oberster level
! } // endif del
! pathCLevel4 = pathCount + "." + "MAXIMUM" + "." + statusname+ "."+PeriodeDay; //BSZ.Counter.Thema.Type.Status
! pathCLevel4b = pathCount + "." + "MAXIMUM" + "." + statusname + "."+PeriodeDay+".BEFORE"; //BSZ.Counter.Thema.Type.Status
! if (actionDel === false) {
! createState(pathCLevel4 , 0);
! createState(pathCLevel4b, 0);
! createState(pathsysmax);
! } else {
! ObjectExistsDelState(pathCLevel4); // loeschen counteintrag oberster level
! ObjectExistsDelState(pathCLevel4b);
! ObjectExistsDelState(pathsysmax); // loeschen durchschnitt oberster level
! } // endif del
! }
! if(funktion === "MINMAX" && periode === "week") {
! pathCLevel4 = pathCount + "." + "MINIMUM" + "." + statusname+ "."+PeriodeWeek; //BSZ.Counter.Thema.Type.Status
! pathCLevel4b = pathCount + "." + "MINIMUM" + "." + statusname + "."+PeriodeWeek+".BEFORE"; //BSZ.Counter.Thema.Type.Status
! pathsysmin = GrpSystem[zeile][5]+ "." + statusname+ "."+PeriodeWeek;
! pathsysmax = GrpSystem[zeile][6]+ "." + statusname+ "."+PeriodeWeek;
! if (actionDel === false) {
! createState(pathCLevel4 , 0);
! createState(pathCLevel4b, 0);
! createState(pathsysmin);
! } else {
! ObjectExistsDelState(pathCLevel4); // loeschen counteintrag oberster level
! ObjectExistsDelState(pathCLevel4b);
! ObjectExistsDelState(pathsysmin); // loeschen durchschnitt system oberster level
! } // endif del
! pathCLevel4 = pathCount + "." + "MAXIMUM" + "." + statusname+ "."+PeriodeWeek; //BSZ.Counter.Thema.Type.Status
! pathCLevel4b = pathCount + "." + "MAXIMUM" + "." + statusname + "."+PeriodeWeek+".BEFORE"; //BSZ.Counter.Thema.Type.Status
! if (actionDel === false) {
! createState(pathCLevel4 , 0);
! createState(pathCLevel4b, 0);
! createState(pathsysmax);
! } else {
! ObjectExistsDelState(pathCLevel4); // loeschen counteintrag oberster level
! ObjectExistsDelState(pathCLevel4b);
! ObjectExistsDelState(pathsysmax); // loeschen durchschnitt oberster level
! } // endif del
! }
! if(funktion === "MINMAX" && periode === "month") {
! pathCLevel4 = pathCount + "." + "MINIMUM" + "." + statusname+ "."+PeriodeMonth; //BSZ.Counter.Thema.Type.Status
! pathCLevel4b = pathCount + "." + "MINIMUM" + "." + statusname + "."+PeriodeMonth+".BEFORE"; //BSZ.Counter.Thema.Type.Status
! pathsysmin = GrpSystem[zeile][5]+ "." + statusname+ "."+PeriodeMonth;
! pathsysmax = GrpSystem[zeile][6]+ "." + statusname+ "."+PeriodeMonth;
! if (actionDel === false) {
! createState(pathCLevel4 , 0);
! createState(pathCLevel4b, 0);
! createState(pathsysmin);
! } else {
! ObjectExistsDelState(pathCLevel4); // loeschen counteintrag oberster level
! ObjectExistsDelState(pathCLevel4b);
! ObjectExistsDelState(pathsysmin); // loeschen durchschnitt system oberster level
! } // endif del
! pathCLevel4 = pathCount + "." + "MAXIMUM" + "." + statusname+ "."+PeriodeMonth; //BSZ.Counter.Thema.Type.Status
! pathCLevel4b = pathCount + "." + "MAXIMUM" + "." + statusname + "."+PeriodeMonth+".BEFORE"; //BSZ.Counter.Thema.Type.Status
! if (actionDel === false) {
! createState(pathCLevel4 , 0);
! createState(pathCLevel4b, 0);
! createState(pathsysmax);
! } else {
! ObjectExistsDelState(pathCLevel4); // loeschen counteintrag oberster level
! ObjectExistsDelState(pathCLevel4b);
! ObjectExistsDelState(pathsysmax); // loeschen durchschnitt oberster level
! } // endif del
! }
! if(funktion === "MINMAX" && periode === "year") {
! pathCLevel4 = pathCount + "." + "MINIMUM" + "." + statusname+ "."+PeriodeYear; //BSZ.Counter.Thema.Type.Status
! pathCLevel4b = pathCount + "." + "MINIMUM" + "." + statusname + "."+PeriodeYear+".BEFORE"; //BSZ.Counter.Thema.Type.Status
! pathsysmin = GrpSystem[zeile][5]+ "." + statusname+ "."+PeriodeYear;
! pathsysmax = GrpSystem[zeile][6]+ "." + statusname+ "."+PeriodeYear;
! if (actionDel === false) {
! createState(pathCLevel4 , 0);
! createState(pathCLevel4b, 0);
! createState(pathsysmin);
! } else {
! ObjectExistsDelState(pathCLevel4); // loeschen counteintrag oberster level
! ObjectExistsDelState(pathCLevel4b);
! ObjectExistsDelState(pathsysmin); // loeschen durchschnitt system oberster level
! } // endif Del
! pathCLevel4 = pathCount + "." + "MAXIMUM" + "." + statusname+ "."+PeriodeYear; //BSZ.Counter.Thema.Type.Status
! pathCLevel4b = pathCount + "." + "MAXIMUM" + "." + statusname + "."+PeriodeYear+".BEFORE"; //BSZ.Counter.Thema.Type.Status
! if (actionDel === false) {
! createState(pathCLevel4 , 0);
! createState(pathCLevel4b, 0);
! createState(pathsysmax);
! } else {
! ObjectExistsDelState(pathCLevel4); // loeschen counteintrag oberster level
! ObjectExistsDelState(pathCLevel4b);
! ObjectExistsDelState(pathsysmax); // loeschen durchschnitt oberster level
! } // endif del
! }
! } // ende Funktion
! // Part2. Update
! // Part2.1 Core Update fuer Methoden TIME, DELTA, DELTAM und CALC
! //–---------------------------------------------------------------------------------------------------
! // Core Update Funktion
! //-----------------------------------------------------------------------------------------------------
! function GeraetUpdate(nummer) {
! //variablen auslesen
! /
! var y = Gruppen.length;
! for (y in Gruppen ) {
! if ( Gruppen[y][0] === UebergabeID ) {
! nummer = y; // nummer ist das Tabellenobjekt, das gerade den Status gewechselt hat
! break;
! }
! }
! */
! var objGruppe = Gruppen[nummer][0]; // die iobroker bwz. HM object ID
! var objMSec = GrpSystem[nummer][0]; // BSZ.SystemGrp00.MSec
! var objKum = GrpSystem[nummer][1]; // BSZ.SystemGrp00.Kum
! var objTime = GrpSystem[nummer][2]; // BSZ.Counter.Feldname
! var objSwitch = GrpSystem[nummer][2]; // BSZ.Counter.Feldname
! var day = Gruppen[nummer][3]; // soll die tages statistik geführt werden ?
! var week = Gruppen[nummer][4]; // soll die wochen statistik geführt werden ?
! var month = Gruppen[nummer][5]; // soll die Monats statistik geführt werden ?
! var year = Gruppen[nummer][6]; // soll die Jahres statistik geführt werden ?
! var zaehler = 0; // zaehler für for schleifen
! var zaehler2 = 0; // zaehlerumwandlung mit führender Null
! var statusname = ''; // statustext aus der logname tabelle
! var GeraeteStatus = " "; // augenblickler status der gelesenen HM ID
! var geraetestatusC = "true"; // character als status als hilfsvariable (für Status des Geaetes/objektes)
! var gruppenstatusC = "true"; // character als status als hilfsvariable (für Gruppenstatus)
! var switchdiff; // Rechenvariable um eine Schaltung hinzuzufügen
! var LastKumSwitch; // letzte Anzahl von Schaltungen
! var rundung; // Rechnen fuer alle Methoden
! var faktor; // Rechnen fuer alle Methoden
! var divisor; // Rechnen fuer alle Methoden
! var lastvalue; // Rechnen fuer alle Methoden
! var newvalue; // Rechnen fuer alle Methoden
! var lastkumvalue;
! var lastkumvalueobj;
! var newkumvalue;
! var newkumvalueobj;
! var diffvalraw;
! var diffval; // Rechnen für alle Methoden
! var addition1; // Rechnen fuer alle Methoden
! var addition2; // Rechnen fuer alle Methoden
! var switchupdate = Gruppen[nummer][7]; // sollen switch updates gezaehlt werden ?
! var statusoverrule = false; // spezialfall wenn Geraete beim einschalten auf false statt auf true stehen
! var DeltaToleranz = special[nummer][6]; // fuer Delta und DeltaM bei Tanksensoren schwanken die Messwerte. Ab diesem Wert wird ein Tankvorgang angenommen, Ruecksetzen von Energiesensoren
! var individualFunc = false; // flag Individualfunktion anwenden
! var timeformat = false; // Zeitformat fuer methode TIME = ddd.hh.mm.ss ?
! var LogCurrSec; // Hilfsvariable fuer Methode TIME - Specialzfalle Status war schon auf gestartet gesetzt
! var KumCALK = false; // Variable um fuer die Individualfunktion die Kumulation fuer CALC zuzulassen
! if(special[nummer][0] === '' && special[nummer][1] === '' && special[nummer][2] === '' && special[nummer][3] === '' && special[nummer][4] === '' && special[nummer][5] === '') { // keine Urechnungslogik hinterlegt
! timeformat = true;
! }
! log("update ausgefuehrt fuer nummer " + nummer + " ID " + Gruppen[nummer][0] + " –-schedule " + special[nummer][10],"info");
! if (Gruppen[nummer][18] === true) { return; } // es ist auf keine updates engestellt
! if (Gruppen[nummer][19] === true) { return; } // alle datenpunkte sollen genullt werden
! if (Gruppen[nummer][0] === 'INITIAL') { return; } // bei INITIAL - return
! GeraeteName = getObject(objGruppe).common.name; // Auslesen der Bezeichnung des Geraetes
! currSec = new Date().getTime(); // Aktuelle Zeit millisekunden seit 01.01.1970
! if (ObjectExists(objGruppe) === false) { // Objekt falsch definiert oder nicht angelegt
! return; // Abbruch
! }
! statusname = Gruppen[nummer][8];
! if (logname[nummer][0] !== '') { // Gibt es einen Status in der logname tabelle ? wenn ja merken mit vorrang
! statusname = logname[nummer][0];
! } // endif logname tabelle
! rundung = special[nummer][0]; // lesen Einstellung zur Rundung
! if(rundung === '') { rundung = 16; } else { // Wenn keine Rundung angegeben ist dann 16
! rundung = Number(rundung); // Rundung umwandeln in Zahl
! } // endif rundung
! addition1 = Number(special[nummer][1]); // lesen Einstellung addition1
! faktor = Number(special[nummer][2]); // lesen Einstellung Faktor
! if(faktor === 0) { faktor = 1; } // Null ist nicht erlaubt
! divisor = Number(special[nummer][3]); // lesen Einstellung Divisor
! if(divisor === 0) { divisor = 1; } // Null ist nicht erlabut
! faktor = faktor / divisor; // neuer Faktor
! addition2 = Number(special[nummer][4]); // lesen Einstellung addition2
! objKum = objKum + "." + statusname;
! objMSec = objMSec + "." + statusname;
! objSwitch = objSwitch+ '.SWITCH.' + statusname;
! GeraeteStatus = getState(objGruppe).val; // Neuer Status des Geraetes
! geraetestatusC = GeraeteStatus.toString(); //wandle in character = z.B. "9" statt 9
! statusoverrule = false; // zunächst mal overrule auf false (false heisst hier, dass es einen Einschaltpunkt nicht braucht)
! if (GeraeteStatus === true) { // ist der aktuelle Status = true
! if (Gruppen[nummer][9] === false ) { // ist true overruled mit false ?
! statusoverrule = false; // dann reverse die logik
! }
! if (Gruppen[nummer][9] === true || Gruppen[nummer][9] === '') { // ist false overruled mit true ?
! statusoverrule = true; // dann reverse die logik
! }
! } //endif Status ist true
! if (GeraeteStatus === false) { // ist der aktuelle Status = false
! if (Gruppen[nummer][9] === false ) { // ist false overruled mit true ?
! statusoverrule = true; // dann reverse die logik
! }
! if (Gruppen[nummer][9] === true ) { // ist true overruled mit false ?
! statusoverrule = false; // dann reverse die logik
! }
! } //endif Status ist false
! if (typeof GeraeteStatus != "boolean") { // aktueller Gerätestatus ist nicht boolean
! if (Gruppen[nummer][9] === geraetestatusC) {
! statusoverrule = true; // wenn es nicht boolean ist und der Gerätestatus = dem eingetragenen dann gilt das Gerät als eingeschaltet
! } else {
! statusoverrule = false;
! }
! } // endif - es ist kein boolean
! if (typeof statusoverrule != "boolean") { // Problem aufgetreten ?
! log("hier ist ein Problem. Der Status haette boolean sein sollen, ist aber " + statusoverrule, "info"); // sollte nicht vorkommen
! }
9473_bsz.txt -
Habe das Script jetzt als Dateianhang mit angehängt.
-
Servus,
auch ich bin neu hier und habe das Script getestet. Ich bekomme nach Start des Scripts folgende Fehlermeldung:
` > 22:00:25.854 [info] javascript.0 Start javascript script.js.common.BSZ22:00:25.855 [info] javascript.0 script.js.common.BSZ: getState(id=hm-rpc.1.0001D3C99C90FD.6.ENERGY_COUNTER, timerId=0) => {"val":59975,"ack":true,"ts":1541624414180,"q":0,"from":"system.adapter.hm-rpc.1","lc":1541624414180}
22:00:25.855 [info] javascript.0 script.js.common.BSZ: getObject(id= , enumName=undefined) => does not exist
22:00:25.855 [error] javascript.0 script.js.common.BSZ: script.js.common.BSZ:327
22:00:25.855 [error] javascript.0 at script.js.common.BSZ:327:47
22:00:28.563 [info] javascript.0 Stop script script.js.common.BSZ `
Die Gruppe sieht so aus:
` > var Gruppen = [];// 1.Homematic ID, 2.Thema(no spaces) 3.History 4.DAY 5.Week 6.Month 7.Year 8.Switch 9 - 18 Status to log 19.stop 20.Loesch
Gruppen[ 0] = ['hm-rpc.1.0001D3C99C90FD.6.ENERGY_COUNTER' ,'' ,true ,true ,true ,true ,true ,true ,'delta' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
Gruppen[ 1] = ['hm-rpc.1.0001D3C99C9101.6.ENERGY_COUNTER' ,'' ,true ,true ,true ,true ,true ,true ,'delta' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
Gruppen[ 2] = ['hm-rpc.1.0001D3C99C913B.6.ENERGY_COUNTER' ,'' ,true ,true ,true ,true ,true ,true ,'delta' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
Gruppen[ 3] = ['hm-rpc.1.0001D3C99C9EEC.6.ENERGY_COUNTER' ,'' ,true ,true ,true ,true ,true ,true ,'delta' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
Gruppen[ 4] = ['hm-rpc.1.0001D3C99C9F14.6.ENERGY_COUNTER' ,'' ,true ,true ,true ,true ,true ,true ,'delta' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
Gruppen[ 5] = ['hm-rpc.1.0001D8A9910EE5.6.ENERGY_COUNTER' ,'' ,true ,true ,true ,true ,true ,true ,'delta' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
Gruppen[ 6] = ['hm-rpc.1.0001D8A9910EFD.6.ENERGY_COUNTER' ,'' ,true ,true ,true ,true ,true ,true ,'delta' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
Gruppen[ 7] = ['hm-rpc.1.0001D8A9910F00.6.ENERGY_COUNTER' ,'' ,true ,true ,true ,true ,true ,true ,'delta' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
Gruppen[ 8] = ['hm-rpc.1.0001D8A991117F.6.ENERGY_COUNTER' ,'' ,true ,true ,true ,true ,true ,true ,'delta' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
Gruppen[ 9] = ['hm-rpc.1.0001D8A991119F.6.ENERGY_COUNTER' ,'' ,true ,true ,true ,true ,true ,true ,'delta' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
Gruppen[10] = ['hm-rpc.1.0001D8A99111C4.6.ENERGY_COUNTER' ,'' ,true ,true ,true ,true ,true ,true ,'delta' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
Gruppen[11] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
Gruppen[12] = ['initial' ,'' ,false ,false ,false ,false ,false ,false ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,false ,false]; //
Gruppen[13] = `
In Zeile 325-327 steht das:
` > if(Gruppen[zaehler][0].toUpperCase() !== "INITIAL" && Gruppen[zaehler][1] === '') { // nicht initial und kein Thema vergebenGruppen[zaehler][1] = getObject(objGruppe).common.name; // Auslesen der Bezeichnung des Geraetes und ersetzen als Thema (default)
} `
Wo habe ich hier eine Fehler gemacht?Danke
Update: Ich habe es geschafft, läuft alles. Die Firewall an der CCU3 wollte die Anfragen auf den Ports nicht durchlassen, dager der Scriptfehler. Ports geöffnet und Script läuft tadellos
-
Kann hier mal jemand kurz einen Ausschnitt posten wie er seine Sonoff Geräte zB den POW eingebunden hat?
Also die Zeilen in den eigenen Datenpunkten
-
Guten Tage werte Forumsmitglieder,
ich habe mich kurzerhand heute angemeldet, da ich ein Problem habe mit dem ich nicht weiterkomme. Ich nutze seit ca. 1 Jahr den IOBroker mit VIS auf einem Wandtablet. Die komplette Materie habe ich mir bisher allein "zurecht gegoogelt" und bin auch ohne Vorkenntnisse bisher immer zum Ziel gekommen. Ich bin total begeistert von den Möglichkeiten und von der ganzen Arbeit die Leute da unentgeldlich da reinstecken. So wurde "Smarthome" jetzt zu einem (besessenen) Hobby für mich.
Auf der Suche nach einer Auswertung für meine Energiezähler (Homematic und Fritz Dect) bin auf den BSZ gestossen. An dieser Stelle ein riesiges Lob und Dankeschön an den Entwickler. Selbst als totaler Laie und ohne Ahnung von Scripten habe ich das zum Laufen gekriegt.
Leider hat mir der Fritz Dect Adapter meiner Poolheizung vor 2 Tagen einen irrationalen Wert von 453 kWh geliefert, der sich nun auf die ganze Statistik auswirkt.
Ich habe beim BSZ in der Tabelle special einen Minuswert (-453) in Spalte 5 eingetragen um das zu korrigieren. Sieht aber in der Grafik nicht gut aus.
Gibt es eine Möglichkeit das in der Datenbank (sqllite) zu korregieren? Ich habe redlich versucht einen Turbo Einstieg in sqlite hinzukriegen, aber es überfordert leider meine Fähigkeiten.
Für einen kleinen Hilfsanstoss wäre ich sehr dankbar.
MfG
Ronny