/
MessageHandler.js
1724 lines (1341 loc) · 80.8 KB
/
MessageHandler.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/*******************************************************************************
* Messagehandler
* ----------------------------------------------------
* Protokollierung von Nachrichten für IOBroker.
* Ermöglicht es Nachrichten global in einer Liste zu erfassen und nach Prioritäten visuell anzuzeigen.
* ----------------------------------------------------
* Autor: Github-Name: St0Ma ioBroker-Forum-Name: Tirador
* Source: https://github.com/St0Ma/ioBroker-MessageHandler
* Support: https://forum.iobroker.net/topic/32207/script-messagehandler-nachrichten-protokollieren-vis
* ----------------------------------------------------
* Change Log:
* 0.9 - Lovelace Datenpunkt "messages.markdown" hinzugefügt.
* Damit ist es möglich die "Übersicht aller Nachrichten" als Markdown in Lovelace anzuzeigen.
* - Fix Error "setForeignState: Error: The state property "ack" has the wrong type "number" (should be "boolean")"
*
* 0.8 - Fix Telegram chatId Ausgabe
* 0.7 - Neues Nachrichtenereignis für Pushover, Fix MDCSS Ausgabe (Spaltenbreite)
* 0.6 - MDCSS 2.5 Unterstützung für Swipe-Gesten, neues Nachrichtenereignis LIGHT
* 0.5 - Neues Attribut visView: VIS-Viewname auf dem über die Message verlinkt werden kann.
* 0.4 - Ergänzung, um Nachrichtenereignissse (Telegram und Email)
* - Ergänzung, um Nachrichten in VIS zu quittieren.
* 0.3 - Code Optimierung
* 0.2 - Initiale Veröffentlichung
* ----------------------------------------------------
* (c) 2020 by Tirador, MIT License, no warranty, use on your own risc
******************************************************************************
Protokollierung von zentralen Nachrichten.
Ermöglicht es Nachrichten global in einer Liste zu erfassen und
nach Prioritäten visuell in VIS anzuzeigen.
Es stehen zwei VIS-Ausgaben zur Verfügung:
- HTML-Tabelle
- Material Design CSS 2.0 Ausgabe für Uhula.
Nachrichten können damit als Übersicht in VIS verwendet werden,
um kompakt die wesentlichen relevanten Informationen darzustellen.
Beispiele:
----------
- Alarmanlage ausgelöst!
- Wasseralarm
- Erinnerung Fenster lüften!
- Erinnerung Fenster zu lange geöffnet!
- Aktuell offene Fenster
- Aktuell
- Aktuell offene Türen
- Lichter angeschaltet
- Aktive Steckdosen
- Post im Briefkasten mit Datum letzter Einwurf
- Nächster Müllabfuhrtermin mit Information zur Tonne
- Kühlschrank geöffnet
- Termine des Tages
- Termine morgen
*******************************************************************************
* Installation
*******************************************************************************
1. Den Expertenmodus im Menüpunkt Skripte aktivieren.
Das Javascript "MessageGlobal" als globales Script installieren und starten.
2. Das Javascript "MessageHandler" serverseitiges Script installieren und starten-5 Sek warten-stoppen-starten.
Beim 1.Start werden die notwendigen States unter STATE_PATH = '0_userdata.0.messageHandler.'
erzeugt. Erst beim 2.Start instanziiert das Script die Event-Handler und läuft dann.
3. Das Javascript "MessageStateCreator" installieren und starten (optional)
*******************************************************************************
* Basis-Konfiguration
*******************************************************************************
Zur Konfiguration sind zwei Schritte erforderlich:
1. Die Grundkonfiguration erfolgt über die Festlegung von MESSAGE-IDs (Nachrichten-Ids)
im Javascript "MessageHandler".
Optional kann mit den Nachrichten auch ein sogenannten Nachrichtenereignisse ausgelöst
werden (z.B. Senden einer Email oder TELEGRAM-Pushnachricht).
Hierfür muss den Nachrichten ein sogenanntes msgEvent zugeordnet werden, dass über
die Konstante MESSAGE_EVENT unten im Skript konfiguriert wird.
Optional kann in der Funktion MessageHandler|doInit()
eine Anpassung der KONFIGURATION vorgenommen werden.
2. Über das Javascript "MessageStateCreator" können Datenpunkte überwacht werden
und Nachrichten automatisiert ausgelöst werden. Die Konfiguration erfolgt hierfür im Javascript "MessageStateCreator".
*******************************************************************************
* Definition of MESSAGE-IDs (Nachrichten-Ids)
******************************************************************************
Fehlernachrichten sind die Grundlage der Meldungen, die später aus Skripten ausgelöst werden.
Eine Fehlernachricht trägt eine eindeutige ID und Eigenschaften, die die Verarbeitung der Nachricht oder das Verhalten der Ausgabe steuern.
Die Idee ist es, das Verhalten der Steuerung und Ausgabe zu entkoppeln, vom eigentlichen Logging Prozess!
Die Konfiguration erfolgt über die Konstante MESSAGE_IDS (siehe unten im Skript).
Fehlernachrichten haben die folgenden Eigenschaften:
- Erster Teil (z.B. "MSG_INFO"): Definition der eindeutigen MESSAGE-ID (Nachrichten-ID). Als Konvention sollte diese immer MSG_<ID> tragen.
- logType: ALL = Protokollierung jeder Nachricht einzeln
LAST = Protokollierung nur der letzten Nachricht (vorhergehende Nachrichten mit gleicher MESSAGE_ID werden gelöscht).
Dies eignet sich beispielsweise für die Protokollierung des letzten Briefkasteneinwurfs, des letzten Anrufs etc.
- severity: Einstufung der Nachricht in Zustände (Alarm, Fehler, Warnung, Information).
Es sind folgende Zuordnungen möglich:
ALARM = Alarm
ERROR = Fehler
WARN = Warnung
INFO = Info
Über die Severity können separate Vorgaben aller Eigenschaften einer Nachricht gemacht werden (siehe nächsten Abschnitt).
Somit können Standardeinstellungen auf der Severity-Ebene definiert werden, die für jede Nachricht greifen,
sofern Sie in der Nachricht nicht übersteuert werden.
- priority: Priorität der Nachricht innerhalb aller anderen Nachrichten. Bestimmt die Sortierreihenfolge für die Ausgabe.
Nachrichten gleicher Priorität werden nach Timestamp sortiert (neueste oben).
In der Regel wird die Prorität über die Severitys gesteuert und nicht für jede Nachricht separat festgelegt.
- msgEvent: Definition von Nachrichtenereignissen. Nachrichtenereignissse werden mit einer Nachricht ausgelöst.
Es können mit einer Nachricht mehrere Nachrichtenereignisse ausgelöst werden (z.B. Email und Telegram-Pushnachricht).
Es sind folgende Ereignisse konfigurierbar:
- Telegram (TELEGRAM-Adapter ist Voraussetzung)
- Email (Email-Adapter ist Voraussetzung)
- Pushover (Pushover-Adapter ist Voraussetzung)
- LIGHT (für eine Lichtsteuerung)
Die Konfiguration der Nachrichtenereignisse erfolgt unten im Skript in der Konstante MESSAGE_EVENTS.
- msgHeader: Kopftext der Nachricht. Hier kann ein Standardtext definiert werden.
- msgText: Text der Nachricht. im Nachrichtentext sind variable Parameter &1, &2 etc. möglich, die mit der Ausführung der Nachricht ersetzt werden.
- quit: Die Eigenschaft bestimmt, ob die Nachricht in der VIS-Oberfläche für das Material Design Widget löschbar ist (true).
Dies ist für alle Meldungen sinnvoll, die nicht "automatisch" durch einen Ablauf wieder zurückgesetzt / entfernt werden.
- visView: VIS-Viewname auf dem über die Message verlinkt werden kann.
- mdIcon: Material Design Icon-Name
- mdIconColor: Material Design Farbcode für das Icon
- fontColor: HTML-Farbcode für die Schriftfarbe der HTML-Ausgabe (aktuell nicht in der VIS-Ausgabe implementiert)
- backgroundColor: HTML-Farbcode für die Hintergrundfarbe in der HTML-Ausgabe (aktuell nicht in der VIS-Ausgabe implementiert)
*******************************************************************************
* Definition of MESSAGE_DEFAULTS_BY_SEVERITY (Standardeinstellungen von Nachrichten für SEVERITYs)
******************************************************************************
Über die Severity können separate Vorgaben aller Eigenschaften einer Nachricht gemacht werden.
Somit können Standardeinstellungen auf der Severity-Ebene definiert werden, die für jede Nachricht greifen,
sofern Sie in der Nachrichten-Definition über die Konstante MESSAGE_IDS nicht übersteuert werden.
Die Konfiguration erfolgt über die Konstante MESSAGE_DEFAULTS_BY_SEVERITY (siehe unten im Skript).
Es können prinzipiell die gleichen Eigenschaften gesteuert werden, wie für die Nachrichten-Definition selbst.
*******************************************************************************
* Automatisches Auslösen / Löschen von Nachrichten
*******************************************************************************
Das automatische Auslösen/Löschen von Nachrichten kann über das zusätzliche Skript
"MessageStateCreator" erfolgen. Die Dokumentation diesbezüglich ist dort zu finden.
*******************************************************************************
* Javascript-Funktionen zum Auslösen / Löschen von Nachrichten
*******************************************************************************
Über das globale Javascript "MessageGlobal" stehen zwei Methoden
für das Erzeugen/löschen von Nachrichten zur Verfügung.
Die Funktion postMessage dient dem Erzeugen von Nachrichten
postMessage(msgID, msgText='', countEvents=0, msgHeader='')
Parameter:
- msgID: eindeutige Nachrichten-ID (definiert in der Konstante MESSAGE_IDS unten)
- msgText: Nachrichtentext (optional).
Sofern der Nachrichtentext aus der Nachrichtendefinition stammen
soll ist beim Funktionsaufruf undefined als Parameter vorzugeben.
- countEvents: Information wieviele Ereignisse für die Meldung eingetreten sind.
Beispiele:
- Anzahl der offenen Fenster
- Anzahl der angeschalteten Lichter
- Anzahl der Termine des Tages
Beispiele für das Auslösen von Nachrichten:
postMessage("HOUSE_ALARM", "Bewegung im Haus"); // Alarm: Bewegung im Haus
postMessage("OPEN_WINDOW_INFO", "Badezimmer"); // Fenster geöffnet im Badezimmer
postMessage("WATER_ALARM", "Wasser im Kellerraum."); // Wasseralarm im Kellerraum
postMessage("LIGHTS_ON_INFO", "Wohnzimmer, Flur, Küche", 5); // 5 Lichter im Flur, Wohnzimmer und Küche sind angeschaltet
postMessage("DOOR_ISOPEN_INFO", "Haustür"); // Haustür ist geöffnet.
Die Funktion removeMessage ermöglicht das gezielte entfernen von Nachrichten:
removeMessage(msgID, msgText='')
Dies ist nützlich, wenn ein Zustand zurückgenommen werden soll.
Beispiel:
removeMessage("DOOR_ISOPEN_INFO");
/*******************************************************************************
* States
*******************************************************************************
Unter dem STATE_PATH (Default STATE_PATH ist '0_userdata.0.messageHandler.') werden die folgenden States erzeugt:
version : Script-Version, wird verwendet um Script-Updates zu erkennen
newMessage : Datenpunkt über den neue Nachrichten / Löschnachrichten ausgelöst werden.
removeMsgID : Datenpunkt für das einzelne gezielte Löschen von Nachrichten über das VIS Widget
* messages.table : enthält die table-HTML für ein basic-string (unescaped) Widget
* messages.list : enthält die list-HTML für ein basic-string (unescaped) Widget
* messages.count : Anzahl der Log-Zeilen (wenn das Log mit '/:ERROR:|:WARN:/' gefiltert ist, dann ist es die Anzahl der Fehler/Warnungen)
* messages.filter : Filter, der auch die logCache angewendet wurde im .table/.list zu erzeugen (siehe Filter)
* messages.lastUpdate : Timestamp des letzten Updates
*******************************************************************************
* Filter
******************************************************************************
In den filter-States können sowohl strings (Bsp:'ERROR') als auch RegExp-Strings (Bsp:'/WARN|ERROR/')
hinterlegt werden. RegExp-Strings werden an den einschließenden '/' erkannt. Über den ':' kann der Anfang
eines Feldes mit in den Filter einbezogen werden.
Beispiele:
'/Fenster|Alarm/' (RegExp) zeigt alle Zeilen an, in denen 'Fenster' oder 'Alarm' in irgendeinem Feld vorkommen
':ERROR:' (string) zeigt alle Nachrichten an, mit Typ Fehler
'Fenster' (string) zeigt alle Nachrichten an, in denen 'Fenster' in irgendeinem Feld vorkommt
/*******************************************************************************/
const MESSAGE_IDS = {
//---------------------------------------------
// ALARM-Meldungen
//---------------------------------------------
// Alarmanlage
HOUSE_ALARM_ACTIVE: {msgEvent: [''], logType: 'LAST', severity: 'ALARM', msgHeader: "Alarm im Haus", msgText: "", quit: true, visView: 'pageSicherheit', mdIcon: 'notification_important', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Wasseralarm
WATER_ALARM: {msgEvent: [''], logType: 'LAST', severity: 'ALARM', msgHeader: "Wasseralarm", msgText: "", quit: true, visView: 'pageSicherheit', mdIcon: 'waves', mdIconColor: '', fontColor: '', backgroundColor: ''},
//Internet Down
INTERNET_DOWN: {msgEvent: [''], logType: 'All', severity: 'ALARM', msgHeader: "Internetverbindung Offline", msgText: "", quit: true, mdIcon: 'error', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Offener Gefrierschrank
FREEZER_DOOR_ISOPEN_INFO: {msgEvent: [''], logType: 'LAST', severity: 'ALARM', msgHeader: "Gefrierschrank geöffnet", msgText: "Bitte Gefrierschrank schließen", quit: true, mdIcon: 'ac_unit', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Offener Kühlschrank
FRIDGE_DOOR_ISOPEN_INFO: {msgEvent: [''], logType: 'LAST', severity: 'ALARM', msgHeader: "Kühlschrank Garage offen", msgText: "Bitte Kühlschrank schließen", quit: true, mdIcon: 'ac_unit', mdIconColor: '', fontColor: '', backgroundColor: ''},
//---------------------------------------------
// WARN-Meldungen
//---------------------------------------------
// Offene Fenster Gesamt
WINDOW_ISOPEN_INFO: {msgEvent: [''], logType: 'LAST', severity: 'WARN', msgHeader: "Fenster geöffnet", msgText: "Bitte Fenster schließen", quit: false, visView: 'pageSicherheit', mdIcon: 'tab', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Fenster länger als x Minuten geöffnet
WINDOW_ISLONGEROPEN_GARAGE: {msgEvent: [''], logType: 'LAST', severity: 'WARN', msgHeader: "Garage", msgText: "Bitte Fenster schließen", quit: false, mdIcon: 'tab', mdIconColor: '', fontColor: '', backgroundColor: ''},
WINDOW_ISLONGEROPEN_HAUS: {msgEvent: [''], logType: 'LAST', severity: 'WARN', msgHeader: "Haustür", msgText: "Bitte Fenster schließen", quit: false, mdIcon: 'tab', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Offene Türen
DOOR_ISOPEN_INFO: {msgEvent: [''], logType: 'LAST', severity: 'WARN', msgHeader: "Fenster geöffnet", msgText: "Bitte Fenster schließen", quit: false, mdIcon: 'meeting_room', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Termine des Tages
CALENDAR_EVENTS_TODAY: {msgEvent: [''], logType: 'LAST', severity: 'WARN', msgHeader: "Heutige Termine", msgText: "", quit: false, mdIcon: 'date_range', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Termine von Morgen
CALENDAR_EVENTS_TOMORROW: {msgEvent: [''], logType: 'LAST', severity: 'WARN', msgHeader: "Morgige Termine", msgText: "", quit: false, mdIcon: 'date_range', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Deutscher Wetter Dienst Warnung
DWD_WARN: {msgEvent: [''], logType: 'LAST', severity: 'WARN', msgHeader: "Wetterwarnung", msgText: "", quit: true, visView: 'pageKlima', mdIcon: 'alert-octagon', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Batterie Warnung
BATTERIE_Warning: {msgEvent: [''], logType: 'LAST', severity: 'WARN', msgHeader: "Batterie", msgText: "Bitte Batterie wechseln", quit: false, mdIcon: 'battery_unknown', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Zigbee Warnung
DECONZ_Warning: {msgEvent: [''], logType: 'LAST', severity: 'WARN', msgHeader: "Zigbee", msgText: "Bitte Batterie wechseln", quit: false, mdIcon: 'wifi', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Erinnerung Fenster lüften!
RAUMKLIMA_INFO: {msgEvent: [''], logType: 'LAST', severity: 'WARN', msgHeader: "Lüftungserinnerung", msgText: "Bitte Fenster öffnen", quit: false, mdIcon: 'opacity', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Batterieüberwachung
BATTERIE_WARN: {msgEvent: [''], logType: 'LAST', severity: 'WARN', priority: 300, msgHeader: "Batterie", msgText: "", quit: true, mdIcon: 'battery-unknown', mdIconColor: '', fontColor: '', backgroundColor: ''},
//---------------------------------------------
// INFO-Meldungen
//---------------------------------------------
// Status Alarmanlage
HOUSE_ALARM_STATUS: {msgEvent: [''], logType: 'LAST', severity: 'INFO', msgHeader: "Alarmanlage", msgText: "", quit: false, visView: 'pageSicherheit', mdIcon: 'security', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Offene Fenster
WINDOW_ISCLOSED_INFO: {msgEvent: [''], logType: 'LAST', severity: 'INFO', msgHeader: "Fenster sind zu", msgText: "", quit: false, mdIcon: 'tab', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Erinnerung Fenster lüften!
OPEN_WINDOW_INFO: {msgEvent: [''], logType: 'LAST', severity: 'INFO', msgHeader: "Lüftungserinnerung", msgText: "Bitte Fenster öffnen", quit: false, mdIcon: 'opacity', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Angeschaltete Lichter
LIGHTS_ON_INFO: {msgEvent: [''], logType: 'LAST', severity: 'INFO', msgHeader: "Licht angeschaltet", msgText: "", quit: false, visView: 'pageLichter', mdIcon: 'highlight', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Aktiv Steckdosen
PLUGS_ON_INFO: {msgEvent: [''], logType: 'LAST', severity: 'INFO', msgHeader: "Steckdosen angeschaltet", msgText: "", quit: false, visView: '',mdIcon: '', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Post im Briefkasten
LAST_POSTENTRACE_INFO: {msgEvent: ['PUSHOVER_NORMAL', 'LIGHT'], logType: 'LAST', severity: 'INFO', msgHeader: "Briefkasten", msgText: "Neue Post im Briefkasten!", mdIcon: 'email-variant', quit: true, mdIconColor: '', fontColor: '', backgroundColor: ''},
// Müllabfuhr-Termine
NEXT_GARBAGE_INFO: {msgEvent: [''], logType: 'LAST', severity: 'INFO', msgHeader: "Müll", msgText: "Tonne: &1, am &2 ", quit: true, visView: '', mdIcon: 'delete', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Anwesende Personen
PERSONS_AVAILABLE_INFO: {msgEvent: [''], logType: 'LAST', severity: 'INFO', msgHeader: "Anwesende Personen", msgText: "", quit: false, visView: '', mdIcon: 'account', mdIconColor: '', fontColor: '', backgroundColor: ''},
//Kamera Bewegung erkannt
CAMERA_MOTION: {logType: 'All', severity: 'INFO', msgHeader: "Bewegung erkannt", msgText: "", quit: true, visView: '', mdIcon: 'camera_alt', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Verpasster Anruf (des Tages)
MISSED_CALLS: {msgEvent: [''], logType: 'LAST', severity: 'INFO', msgHeader: "Verpasste Anrufe", msgText: "", quit: true, visView: 'pageKommunikation', mdIcon: 'call-missed', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Verpasster Anruf (des Tages)
LAST_CALL: {msgEvent: [''], logType: 'LAST', severity: 'INFO', msgHeader: "Letzter Anruf", msgText: "", quit: true, visView: 'pageKommunikation', mdIcon: 'call-received', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Corono-Statistic
CORONA_STATS_CASES: {msgEvent: [''], logType: 'LAST', severity: 'INFO', priority: 500, msgHeader: "SARS-coV-2", msgText: "", quit: false, visView: '', mdIcon: 'biohazard', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Temperatur
TEMPERATURE_INFO: {msgEvent: [''], logType: 'LAST', severity: 'INFO', msgHeader: "Temperaturen", msgText: "", mdIcon: 'temperature-celsius', quit: false, visView: 'pageKlima', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Sonos
SONOS_INFO: {msgEvent: [''], logType: 'LAST', severity: 'INFO', msgHeader: "Sonos Küche", msgText: "", mdIcon: 'surround-sound', quit: false, visView: 'pageMultimedia', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Logitech Harmony Info
HARMONY_INFO: {msgEvent: [''], logType: 'LAST', severity: 'INFO', msgHeader: "Wohnzimmer Multimedia", msgText: "", mdIcon: 'play-network-outline', quit: false, visView: 'pageMultimedia', mdIconColor: '', fontColor: '', backgroundColor: ''},
//Spritpreis-Info
TANK_INFO: {logType: 'LAST', severity: 'INFO', priority: 400, msgHeader: "Spritpreis", msgText: "", quit: true, mdIcon: 'gas-station', mdIconColor: '', fontColor: '', backgroundColor: ''},
//Update ioBroker
UPDATE_INFO: {logType: 'LAST', severity: 'INFO', msgHeader: "Update ioBroker", msgText: "", quit: true, mdIcon: 'cached', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Gäste WLAN
GUEST_WIFI: {msgEvent: [''], logType: 'LAST', severity: 'INFO', msgHeader: "WLAN", msgText: "", quit: false, mdIcon: 'wifi', mdIconColor: '', fontColor: '', backgroundColor: ''},
// Batterieüberwachung
BATTERIE_INFO: {msgEvent: [''], logType: 'LAST', severity: 'INFO', priority: 300, msgHeader: "Batterie", msgText: "", quit: true, mdIcon: 'battery-unknown', mdIconColor: '', fontColor: '', backgroundColor: ''},
};
//-----------------------------------------------------------------------
// Sofern in den MESSAGE_IDS nicht alle Attribute vorgegeben sind,
// greifen die nachfolgenden Standardattribute für
// die in den MESSAGE_IDS genutzten SEVERITYs
// Standardmäßig sind dies: INFO, WARN, ERROR und ALARM
//-----------------------------------------------------------------------
const MESSAGE_DEFAULTS_BY_SEVERITY = {
INFO: {msgEvent: [''], logType: 'ALL', severity: 'INFO', priority: 1000, msgHeader: "", msgText: "", quit: false, mdIcon: 'info', mdIconColor: 'mdui-blue', iconColorHtml: '#2E9AFE', fontColor: '', backgroundColor: 'mdui-blue-bg'},
WARN: {msgEvent: ['LIGHT'], logType: 'ALL', severity: 'WARN', priority: 2000, msgHeader: "", msgText: "", quit: false, mdIcon: 'warning', mdIconColor: 'mdui-amber', iconColorHtml: '#FF8000', fontColor: '', backgroundColor: 'mdui-amber-bg'},
ERROR: {msgEvent: ['LIGHT', 'PUSHOVER_NORMAL'], logType: 'ALL', severity: 'ERROR', priority: 3000, msgHeader: "", msgText: "", quit: false, mdIcon: 'error', mdIconColor: 'mdui-orange', iconColorHtml: '#FE2E2E',fontColor: '', backgroundColor: 'mdui-orange-bg'},
ALARM: {msgEvent: ['EMAIL','LIGHT', 'PUSHOVER_EMERGENCY'], logType: 'ALL', severity: 'ALARM', priority: 4000, msgHeader: "", msgText: "", quit: false, mdIcon: 'error', mdIconColor: 'mdui-red', iconColorHtml: '#FE2E2E', fontColor: '', backgroundColor: 'mdui-red-bg'}
};
//-----------------------------------------------------------------------
// Definition von Nachrichtenereignissen:
// - Telegram (TELEGRAM-Adapter ist Voraussetzung)
// - Email (Email-Adapter ist Voraussetzung)
// - LIGHT (Dieses Nachrichtenereignis ermöglicht eine Lichtsteuerung in Abhängigkeit
// der SEVERITY (Info, Warning, Error, Alarm) aller Nachrichten denen das Nachrichtenereignis LIGHT zugeordnet ist.)
// Nachrichtenereignissse werden mit einer Nachricht ausgelöst
//-----------------------------------------------------------------------
const MESSAGE_EVENTS = {
//----------------------
// Telegram-Konfiguration
//----------------------
// - serviceName: 'TELEGRAM' (dieser Wert ist fix und steuert die Skriptlogik)
// - telegramInstanz: 'telegram.0'
// - telegramUser: optionale Vorgabe eines Benutzers. Sofern nicht vorgegeben, wird diese Einstellung vom Adapter übernommen.
// - telegramChatId: optionale Vorgabe einer ChatID. Sofern nicht vorgegeben, wird diese Einstellung vom Adapter übernommen.
//
TELEGRAM: {serviceName: 'TELEGRAM', telegramInstance: 'telegram.0', telegramUser: '', telegramChatId: '', maxChar: 4000},
//----------------------
// Pushover-Konfiguration
//----------------------
// - serviceName: 'PUSHOVER' (dieser Wert ist fix und steuert die Skriptlogik)
// - pushoverInstanz: 'pushover.0'
// - pushoverDevice: optionale Vorgabe eines bestimmten Geräts
// - pushoverSound: optionale Vorgabe eines Sounds siehe: https://pushover.net/api#sounds
// Sofern nicht definiert, wird kein Sound ausgegeben ("none")
// - pushoverPriority: Priorität der Nachricht (siehe: https://pushover.net/api#priority
// Lowest Priority (-2)
// Low Priority (-1)
// Normal Priority (0)
// High Priority (1)
// Emergency Priority (2) - Parameter retry und expire sind vorzugeben!
// - pushoverRetry: The retry parameter specifies how often (in seconds) the Pushover servers will send the same notification to the user.
// Bitte die Hinweise unter https://pushover.net/api#priority beachten!
// - pushoverExpire: The expire parameter specifies how many seconds your notification will continue to be retried for (every retry seconds).
// Bitte die Hinweise unter https://pushover.net/api#priority beachten!
PUSHOVER_NORMAL: {serviceName: 'PUSHOVER', pushoverInstance: 'pushover.0', pushoverDevice: '', pushoverSound: '', pushoverPriority:0, pushoverRetry: 0 , pushoverExpire: 0, maxChar: 4000},
PUSHOVER_EMERGENCY: {serviceName: 'PUSHOVER', pushoverInstance: 'pushover.0', pushoverDevice: '', pushoverSound: '', pushoverPriority:2, pushoverRetry: 0 , pushoverExpire: 3600, maxChar: 4000},
// LoveLace - Benachrichtungen, die direkt im Lovelace Nachrichtensystem ausgegeben werden (experimentell)
LOVELACE: {serviceName: 'LOVELACE', lovelaceInstance: 'lovelace.0', maxChar: 4000},
//----------------------
// Email-Konfiguration
//----------------------
// - serviceName: 'EMAIL' (dieser Wert ist fix und steuert die Skriptlogik)
// - emailInstance: Vorgabe der Email-Instance (in der Regel ist dies 'email.0').
// - emailFrom: optionale Vorgabe einer abweichenden Absenderadresse. Sofern nicht vorgegeben, wird diese Einstellung vom Adapter übernommen.
// - emailTo: optionale Vorgabe von Zieladressen. Sofern nicht vorgegeben, wird diese Einstellung vom Adapter übernommen.
EMAIL: {serviceName: 'EMAIL', emailInstance: 'email.0', emailFrom: '', emailTo: [''] },
//----------------------
// Nachrichtenereignis LIGHT
//
// Dieses Nachrichtenereignis ermöglicht eine Lichtsteuerung in Abhängigkeit der SEVERITY (Info, Warning, Error, Alarm).
// Beispielsweise können in einem weiteren Skript in Abhängigkeit der SEVERITY Lampen in verschiedenen Farben geschaltet werden:
// Severity INFO : Blaues Licht
// Severity Warning: Oranges Licht
// Severity ERROR: Pinkes Licht
// Severity ALARM: Rotes Licht
//
// Dieses Skript ermittelt aus allen erzeugten Nachrichten
// bei denen das Nachrichtenereignis LIGHT definiert ist die maximale Severity.
// Die maximale Light-Severity wird in einen Datenpunkt
// 0_userdata.0.messageHandler.messages.lightSeverity fortgeschrieben.
//
//----------------------
// - serviceName: 'LIGHTSEVERITY' (dieser Wert ist fix und steuert die Skriptlogik)
//
LIGHT: {serviceName: "LIGHTSEVERITY" },
//----------------------
// Steuerung Datenpunkt (experimentell)
//----------------------
// - serviceName: 'ACTION' (dieser Wert ist fix und steuert die Skriptlogik)
// - setDP: Array von Datenpunkten, die mit der Aktion geschaltet werden sollen.
// Im Array sind jeweils die Attribute
// dp: Datenpunkt
// val: zu setzender Wert im Datenpunkt
// zu definieren.
//
// Beispiel Licht Orange Schalten
LIGHTWARN: {serviceName: "ACTION",
setDP: [ {dp: 'deconz.0.Lights.3.xy', val: [0.6115, 0.3684]},
{dp: 'deconz.0.Lights.3.level', val: 100},
{dp: 'deconz.0.Lights.3.transitiontime', val: 5000},
{dp: 'deconz.0.Lights.3.on', val: true},
]
},
// Beispiel Licht Rot Schalten
LIGHTALARM: {serviceName: "ACTION",
setDP: [ {dp: 'deconz.0.Lights.3.xy', val: [0.7285,0.2707]},
{dp: 'deconz.0.Lights.3.level', val: 100},
{dp: 'deconz.0.Lights.3.transitiontime', val: 5000},
{dp: 'deconz.0.Lights.3.on', val: true},
]
},
};
// -------------------------------------------------------------------------------------
// MessageHandler
// -------------------------------------------------------------------------------------
class MessageHandler {
constructor() {
this.init();
// beim 1.Start nur die States erzeugen
if ( !this.existState("version") || (this.getState('version').val!=this.VERSION) ) {
for (let s=0; s<this.states.length; s++) { this.createState( this.states[s].id ); }
this.logWarn('first script start, create states for version '+this.VERSION+', please wait 5 seconds and start script again');
setTimeout( setState, 3000, this.STATE_PATH + 'version', this.VERSION );
}
else this.installed = true;
}
//
init() {
// const
this.DEBUG = false;
this.VERSION = '0.6/2020-04-25';
this.NAME = 'MessageHandler';
// -----------------------
// optional: KONFIGURATION
// -----------------------
// state-Pfad unter dem die States angelegt werden
this.STATE_PATH = '0_userdata.0.messageHandler.';
// Anzahl der Nachrichten für die Ausgabe in VIS
this.MAX_TABLE_ROWS = 9999999;
// siehe: https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#formatdate
this.DATE_FORMAT = 'W DD.MM.YYYY hh:mm';
// -----------------------
// ENDE KONFIGURATION
// -----------------------
// var
this.installed = false;
this.states = [];
this.subscribers = [];
this.schedulers = [];
this.messageList = []; // JSON MessageList in Memory
this.lightSeverity = undefined;
// init der states
this.states.push( { id:'version', common:{name:'installed script-version', write:false, type: 'string', def:this.VERSION} } );
//this.states.push( { id:'updatePressed',common:{name:'update button pressed', write:true, type:'boolean', def:'false', role:'button' }} );
this.states.push( { id:'newMessage', common:{name:'newMessage', write:false, type: 'string', def:""} } );
this.states.push( { id:'messages.json', common:{name:'messages as JSON', write:false, type: 'string', def:JSON.stringify(this.messageList)} } );
this.states.push( { id:'messages.table', common:{name:'messages as table', write:false, type: 'string', role:'html', def:'' }} );
this.states.push( { id:'messages.markdown', common:{name:'messages as markdown', write:false, type: 'string', role:'html', def:'' }} );
this.states.push( { id:'messages.list', common:{name:'messages as list', write:false, type: 'string', role:'html', def:'' }} );
this.states.push( { id:'messages.count', common:{name:'messages count', write:false, type:'number', def:0 }} );
this.states.push( { id:'messages.filter', common:{name:'messages filter', write:true, type: 'string', def:''}} );
this.states.push( { id:'messages.lastUpdate', common:{name:'messages last update', write:false, type: 'number', def:0 }} );
this.states.push( { id:'messages.lastClear', common:{name:'messages last clear', write:false, type: 'number', def:0 }} );
this.states.push( { id:'messages.clearPressed',common:{name:'messages clear table/list', write:true, type:'boolean', def:false, role:'button' }} );
this.states.push( { id:'removeMsgID', common:{name:'Entfernen einer Nachricht über msgID', write:true, type:'string', def:'' }} );
this.states.push( { id:'messages.lightSeverity', common:{name:'maximal light Severity', write:true, type: 'string', def:''}} );
//-----------------------------------------------------------------------
// Definition der Feldattribute, die aus der Nachrichtendefinition vererbt werden für die Ausgabe in VIS/HTML
// Im Regelfall ist an dieser Systemeinstellung nichts zu ändern.
//-----------------------------------------------------------------------
this.MESSAGE_FIELDS_OUTPUT = [
"msgID", "msgHeader", "msgText", "countEvents", "firstDate", "lastDate",
"logType", "severity", "priority", "quit", "visView", "msgEvent", "mdIcon", "mdIconColor", "fontColor", "backgroundColor", "iconColorHtml"
];
//-----------------------------------------------------------------------
// Definition der Feldattribute, die in der JSON-Datenstruktur gespeichert werden
// Hinweis: Alle Felder die nicht in der Liste sind, werden nicht gesichert!
// Im Regelfall ist an dieser Systemeinstellung nichts zu ändern.
//-----------------------------------------------------------------------
this.MESSAGE_FIELDS_DATA = [
"msgID", "msgHeader", "msgText", "countEvents", "firstDate", "lastDate"
];
}
// start the script/class
start() {
if (!this.installed) {
this.logWarn('cant start, states for version '+this.VERSION+' missed, please start script again');
return;
}
if (this.doStart())
this.log('script started');
}
// stop the script/class
stop() {
if (this.doStop()) {
this.log('script stopped');
for (let i=0; i<this.subscribers.length; i++) if (this.subscribers[i] !== undefined) unsubscribe( this.subscribers[i] );
this.subscribers = [];
for (let i=0; i<this.schedulers.length; i++) if (this.schedulers[i] !== undefined) clearSchedule( this.schedulers[i] );
this.schedulers = [];
}
}
// start the script/class
doStart() {
// JSON Array lesen
this.messageList = [];
try {
this.messageList = JSON.parse(this.getState('messages.json').val);
// log("MessageList :" + JSON.stringify(this.messageList));
} catch (ex) {
this.logError("can not read old JSON Format for messageList!");
this.messageList = [];
}
// subscriber erzeugen
this.subscribers.push( on( {id: this.STATE_PATH+'newMessage', change: 'any'}, obj => { this.onNewMessage(obj) } ));
this.subscribers.push( on( this.STATE_PATH+'messages.clearPressed', obj => { this.onClearPressed(obj) } ));
this.subscribers.push( on( new RegExp( this.STATE_PATH+'*.filter' ), obj => { this.onFilter(obj) } ));
this.subscribers.push( on( this.STATE_PATH+'removeMsgID', obj => { this.removeMsgID(obj) } ));
this.setStateDelayed ('removeMsgID', '', 2000);
this.onBuildHTML();
return true;
}
doStop() { return true; }
removeMsgID(obj) {
if(this.DEBUG) log("removeMsgID()");
let instanceID = obj.state.val.toString();
if (instanceID=='') return;
//Filtern alle quittierbaren Nachrichten
for (var i = 0; i < this.messageList.length; i++) {
this.messageList[i] = this.setAttributesInMessage(this.messageList[i], this.MESSAGE_FIELDS_OUTPUT);
}
var indexMsg = 0;
while(indexMsg != -1) {
indexMsg = this.messageList.findIndex(function(a){ return (a.quit == true && a.lastDate == instanceID)});
if (indexMsg != -1) {
if(this.DEBUG) log("Nachricht wurde bereits protokolliert!");
this.messageList.splice(indexMsg,1);
}
}
// Fortschreiben Nachricht in Datenstruktur
for (var i = 0; i < this.messageList.length; i++) {
this.messageList[i] = this.setAttributesInMessage(this.messageList[i], this.MESSAGE_FIELDS_DATA);
}
this.setState('messages.json', JSON.stringify(this.messageList));
//this.setState('messages.lastClear', +new Date() );
//this.setState('messages.count', 0);
//this.setState('messages.clearPressed', false);
this.onBuildHTML();
}
onClearPressed(obj) {
if(this.DEBUG) log("onClearPressed()");
if (obj.state.val===true) {
//Filtern alle quittierbaren Nachrichten
for (var i = 0; i < this.messageList.length; i++) {
this.messageList[i] = this.setAttributesInMessage(this.messageList[i], this.MESSAGE_FIELDS_OUTPUT);
}
var indexMsg = 0;
while(indexMsg != -1) {
indexMsg = this.messageList.findIndex(function(a){ return (a.quit == true)});
if (indexMsg != -1) {
if(this.DEBUG) log("Nachricht wurde bereits protokolliert!");
this.messageList.splice(indexMsg,1);
}
}
// Fortschreiben Nachricht in Datenstruktur
for (var i = 0; i < this.messageList.length; i++) {
this.messageList[i] = this.setAttributesInMessage(this.messageList[i], this.MESSAGE_FIELDS_DATA);
}
this.setState('messages.json', JSON.stringify(this.messageList));
this.setState('messages.lastClear', +new Date() );
this.setState('messages.count', 0);
this.setState('messages.clearPressed', false);
this.onBuildHTML();
}
}
// filter, sort events
onFilter(obj) {
this.onBuildHTML();
}
// Ical table hat sich geändert
onNewMessage(obj) {
// if (!obj.newState.ack && obj.newState.val) {
if(this.DEBUG) this.log('onNewMessage()');
var jsonMsg = JSON.parse(this.getState('newMessage').val);
this.newMessage(jsonMsg);
//}
}
newMessage(jsonMsg) {
if(this.DEBUG) {
log("newMessage(jsonMsg) " + JSON.stringify(jsonMsg));
}
let msgType = jsonMsg.msgType;
//---------------------------------------------------------
// Vererbe Informationen aus definierter Nachricht oder Defaults
//---------------------------------------------------------
jsonMsg = this.setAttributesInMessage(jsonMsg, this.MESSAGE_FIELDS_OUTPUT);
// Set DateTime
jsonMsg.firstDate = +new Date(); // first creation of this messageID
jsonMsg.lastDate = +new Date(); // last log of this messageID
if(this.DEBUG) {
log("newMessage(jsonMsg) - After setting values OUTPUT: " + JSON.stringify(jsonMsg));
}
// Sofern die Nachricht nur einmal geloggt wird, prüfe ob die Nachricht bereits in der Liste ist.
// Ist dies der Fall werden die vorhandenen Nachrichten entfernt!
if(msgType == "INSERT" ) {
if(jsonMsg.logType == "LAST") {
var indexMsg = 0;
while(indexMsg != -1) {
indexMsg = this.messageList.findIndex(function(a){ return (a.msgID == jsonMsg.msgID)});
if (indexMsg != -1) {
if(this.DEBUG) log("Nachricht wurde bereits protokolliert!");
this.messageList.splice(indexMsg,1);
}
}
}
// Auslösen Nachrichtenereignis (sofern definiert)
this.msgEvent(jsonMsg);
// Entfernen aller nicht relevanter Felder im JSON zur Speicherung in der Liste
jsonMsg = this.setAttributesInMessage(jsonMsg, this.MESSAGE_FIELDS_DATA);
if(this.DEBUG) {
log("newMessage(jsonMsg) - After setting values DATA: " + JSON.stringify(jsonMsg));
}
// Einfügen Nachricht in die Liste
this.messageList.push(jsonMsg);
// Fortschreiben Nachricht in Datenstruktur
this.setState('messages.json', JSON.stringify(this.messageList));
// Build HTML
this.onBuildHTML();
} else if(msgType == "DELETE") {
// Entfernen Nachrichten mit gleicher msgID in Liste
var indexMsg = 0;
while(indexMsg != -1) {
indexMsg = this.messageList.findIndex(function(a){ return (a.msgID == jsonMsg.msgID)});
if (indexMsg != -1) {
if(this.DEBUG) log("Nachricht wird entfernt!");
this.messageList.splice(indexMsg,1);
}
}
// Fortschreiben Nachricht in Datenstruktur
this.setState('messages.json', JSON.stringify(this.messageList));
// Build HTML
this.onBuildHTML();
}
}
/*
Aufbereitung einer Nachricht für Ausgabe in VIS / Speicherung
Es werden nur die Felder in der Nachricht aufbereitet, die in messageFields vorhanden sind
*/
setAttributesInMessage(inputJsonMsg, messageFields) {
if(this.DEBUG) log("setAttributesInMessage - input: " + JSON.stringify(inputJsonMsg));
let jsonMsg = {};
for (let msgField of messageFields) {
let msgFieldVal = msgField.valueOf()
//log("msgField:" + msgField + " Value: " + inputJsonMsg[msgFieldVal]);
if(inputJsonMsg[msgFieldVal] !== undefined) {
jsonMsg[msgFieldVal] =inputJsonMsg[msgFieldVal].valueOf();
//log("set JsonMsg[msgField]" + JSON.stringify(jsonMsg));
} else {
//if(this.DEBUG) log("Attribute:" + msgField + " Value: '' ");
jsonMsg[msgFieldVal] ='';
}
}
//log("setAttributesInMessage - 2: " + JSON.stringify(jsonMsg));
for(let defMsgId in MESSAGE_IDS) {
//log("msgId:" + defMsgId + " Value: " + jsonMsg['msgID'].valueOf() + " ValueOF:" + defMsgId.valueOf());
if(jsonMsg['msgID'].valueOf() == defMsgId.valueOf()) {
// log("Found Defined MSG-ID" + defMsgId);
for(let attr in MESSAGE_IDS[defMsgId.valueOf()]) {
if(messageFields.includes(attr)) {
// log("attr:" + attr + " MESSAGE_IDS: " + MESSAGE_IDS[defMsgId][attr] + "jsonMsg[attr]:" + jsonMsg[attr.valueOf()] );
if(MESSAGE_IDS[defMsgId][attr] != "" && jsonMsg[attr] == '') {
// if(this.DEBUG) log("Attribute:" + attr + " Value: "+ MESSAGE_IDS[defMsgId][attr] );
jsonMsg[attr.valueOf()] = MESSAGE_IDS[defMsgId][attr].valueOf();
}
}
}
}
}
//---------------------------------------------------------
// Vererbe sonstige Informationen aus DEFAULT Nachricht
//---------------------------------------------------------
for(let defSeverity in MESSAGE_DEFAULTS_BY_SEVERITY) {
if(jsonMsg['severity'] == defSeverity) {
//if(this.DEBUG) log("Found Default Severity" + defSeverity);
for(let attr in MESSAGE_DEFAULTS_BY_SEVERITY[defSeverity]) {
if(messageFields.includes(attr)) {
if(MESSAGE_DEFAULTS_BY_SEVERITY[defSeverity][attr] != "" && jsonMsg[attr] == "") {
//if(this.DEBUG) log("Attribute:" + attr + " Value: "+ MESSAGE_DEFAULTS_BY_SEVERITY[defSeverity][attr] );
jsonMsg[attr] = MESSAGE_DEFAULTS_BY_SEVERITY[defSeverity][attr];
}
}
}
}
}
if(this.DEBUG) log("setAttributesInMessage - output" + JSON.stringify(jsonMsg));
return jsonMsg;
}
onBuildHTML() { try {
let json = [];
let jsonMsg = {};
let curDateTime = new Date();
this.lightSeverity = undefined;
for (var i = 0; i < this.messageList.length ; i++) {
//---------------------------------------------------------
// Vererbe Informationen aus definierter Nachricht oder Defaults
//---------------------------------------------------------
jsonMsg = this.setAttributesInMessage(this.messageList[i], this.MESSAGE_FIELDS_OUTPUT);
// Formatierung Datum / Zeit
jsonMsg.lastDateTime = formatDate(jsonMsg.lastDate, "SS:mm");
// Formatierung Datum / Zeit
let msgDateTime = new Date(jsonMsg.lastDate);
if(this.isSameDay(msgDateTime, curDateTime)) {
jsonMsg.lastDateDay = "Heute";
} else if(this.isYesterday(curDateTime, msgDateTime)) {
jsonMsg.lastDateDay = "Gestern";
} else if(this.isSameMonth(msgDateTime, curDateTime)) {
jsonMsg.lastDateDay = formatDate(jsonMsg.lastDate, "TT.");
} else {
jsonMsg.lastDateDay = formatDate(jsonMsg.lastDate, "TT.MM.YY");
}
jsonMsg.showCount = jsonMsg.countEvents > 0 ? "flex" : "none";
jsonMsg.countEventsMarkdown = jsonMsg.countEvents > 0 ? "*" + jsonMsg.countEvents +"*" : "";
// Swipe Delete
jsonMsg.mduiSwipeDelete = jsonMsg.quit ?
`mdui-swipe-left?dist:64;background:red;icon:delete;text:Löschen;action:setValue(`+this.STATE_PATH+`removeMsgID,` + jsonMsg.lastDate + `)` : "";
// Delete Button (Nur für "No Swipe"-Geräte)
jsonMsg.mduiNoSwipeDelete = jsonMsg.quit ?
`<div class='mdui-navitem mdui-show-notouch mdui-center
mdui-tooltip?text:Löschen+des+Eintrags
mdui-click?action:setValue(` + this.STATE_PATH+`removeMsgID,` + jsonMsg.lastDate + `)' style='flex:0 0.9em;' >
<i class='mdui-icon'>clear</i>
</div>` : "";
// Swipe Change View
jsonMsg.mduiSwipeChangeView = "";
if(this.clearStr(jsonMsg.visView)) {
jsonMsg.mduiSwipeChangeView =
`mdui-swipe-right?dist:64;background:blue;icon:exit_to_app;action:changeView(` + jsonMsg.visView +`)`;
}
// Sending simple Markdown, because Markdown V2 does not support Unicode Characters?
jsonMsg.msgTextMD = this.clearStr(jsonMsg.msgText);
jsonMsg.msgTextMD = this.htmlToMarkdown(jsonMsg.msgTextMD);
jsonMsg.msgTextMD = this.removeMarkdown(jsonMsg.msgTextMD, null);
jsonMsg.msgHeaderMD = this.clearStr(jsonMsg.msgHeader);
// Touch/Click Change View
jsonMsg.mduiClickChangeView= "";
if(this.clearStr(jsonMsg.visView)) {
jsonMsg.mduiClickChangeView =
`mdui-tooltip?text:View+aufrufen mdui-click?action:changeView(` + jsonMsg.visView +`)`;
}
// No Swipe Change View Button
jsonMsg.mduiNoSwipeChangeView = "";
if(this.clearStr(jsonMsg.visView)) {
jsonMsg.mduiNoSwipeChangeView =
`<div class='mdui-navitem mdui-show-notouch mdui-center
mdui-tooltip?text:View+aufrufen
mdui-click?action:changeView(` + jsonMsg.visView + `)' style='flex:0 0.9em;' >
<i class='mdui-icon'>exit_to_app</i>
</div>`;
}
// Font color
jsonMsg.fontColor = this.getFontColor( '#000000');
if(this.DEBUG) {
log("onBuildHTML(jsonMsg) Message Values: " + JSON.stringify(jsonMsg));
}
// Auslösen Nachrichtenereignis LIGHTSEVERITY
// führt zur Neubestimmung in jedem HTML Aufbau (d.h. bei Skriptstart / Entfernen und einfügen von nachrichten)
this.msgEvent(jsonMsg, 'LIGHTSEVERITY');
json.push( jsonMsg );
}
this.setState('messages.lightSeverity', this.clearStr(this.lightSeverity));
//-----------------------------------------------
// Sort Messages
// First after priority ERROR -> WARNING -> DEBUG -> INFO
// Then Sort Timestamps in priorities
//-----------------------------------------------
// FIXME Sortieren vor Einfügen in der Liste (damit wird nur ein Element sortiert!)
json.sort(this.compareNodesTimestampsAfterPriority.bind(this));
// build table/list HTML
let filter = '';
let ts = 0;
let idState = 'messages';
if (this.existState(idState+'.filter')) filter = this.getState(idState+'.filter').val;
if (this.existState(idState+'.lastClear')) ts = this.getState(idState+'.lastClear').val;
this.convertJSON2HTML(json, idState, filter);
this.convertJSON2Markdown(json, idState, filter);
} catch(err) { this.logError( 'onBuildHTML: '+err.message ); } }
/**
* Convert JSON 2 HTML for Material Design Widget Listview / Listtable
*/
convertJSON2HTML(json, idState, filter) {
const tmpTable = {
header :
`<tr>
<th style='text-align:left;'>Nachricht</th>
<th style='text-align:left;'>Anzahl</th>
<th style='text-align:left;'>Zeit</th>
</tr>`,
row :
`<tr>