NEWS
JavaScript 8.3.0 - Log-Trigger, File-Events und Warnungen
-
Aktuelle Test Version 8.3.0 Veröffentlichungsdatum 09.05.2024 Github Link https://github.com/ioBroker/ioBroker.javascript/releases/tag/v8.3.0 Auch in dieser Version gibt es wieder viele neue Blöcke, Bugfixes und Features. Das wichtigste zuerst:
Besten Dank an alle Teilnehmer des ioBroker-Master-Kurses. Ihr habt die vielen Stunden Entwicklung und Support (wie immer) finanziert. Natürlich werden die neuen Bausteine und Feature auch im Kurs ausführlich gezeigt und erklärt.
Blockly-Trigger für Logs
Das Thema ist in JavaScript nicht neu. Es gab nur keine Blockly-Bausteine dafür. Also habe ich diese nun nachgereicht.
Damit kann man einen Trigger auf Log-Meldungen registrieren und ein Log-Level vorgeben. Das heißt, dass man z.B. alle Meldungen vom Level
errorbekommen kann und dann z.B. prüfen, welche Instanz (Quelle) die Meldung ausgelöst hat.
Blockly File-Events (Temporärer Dateipfad)
Das Datei-Thema kommt ja hier immer wieder auf - und viele schreiben und lesen direkt aus
/opt/iobroker/iobroker-data/files/. Das man das nicht tun sollte und dafür IMMER die ioBroker-Funktionen nutzen sollte, habe ich ja mittlerweile rauf und runter erklärt.Wenn man als Datenbank nicht
jsonlsondernredisnutzt, dann liegen die Dateien ja nichtmal an dieser Stelle im Dateisystem, sondern in der Redis-Datenbank. Das Problem ist nun: Wenn sich eine Datei ändert, dann kann man damit in Blockly noch nicht viel machen. Bausteine wie Pushover, Mail, Telegram usw. wollen einen Pfad zu einer Datei haben. Das Thema habe ich auf GitHub auch schon platziert.Nun gibt es aber bei einer Redis-Datenbank keinen Pfad im Dateisystem. Also habe ich eine neue Funktion gebaut, welche die Datei aus dem "ioBroker-Speicher" in das Temp-Verzeichnis des Betriebssystems (unter Linux
/tmp) speichert und einen Pfad zurückgibt.Sobald das Script gestoppt wird, wird in diesem Pfad wieder aufgeräumt und die temporären Dateien werden gelöscht!
Jedenfalls kann man auf diesem Weg aktuell weiterhin Bausteine wie Telegram bedienen und jedes Mal wenn sich eine Datei ändert diesen Pfad generieren und an andere Bausteine weiterreichen. Beispiel:

Warnungen
Eigentlich gibt es jetzt an jeder Stelle ein Ausrufezeichen im Block, wenn man etwas zusammenbaut, was so nicht gedacht ist (z.B. Trigger in Trigger). So sollte man eigentlich direkt während der "Programmierung" merken, dass da etwas falsch ist.
Solltet ihr noch Vorschläge für Validierungen haben (wo darf ein Block nicht in einem anderen enthalten sein): Her damit.

Request-Paket is deprecated
Request wird seit Jahren im Adapter genutzt und der Blockly-Baustein "request" nutzt ja genau dieses Paket. Der Block wurde ja bereits in den vorigen Versionen durch "http (GET)" ersetzt. Solltest Du noch die älteren Blöcke nutzen, bekommst Du eine Warnung im Log.
Ich möchte das Paket jetzt langsam aber sicher loswerden. Daher generiert jedes
require('request');im Log jetzt auch eine Warnung. Scheinbar werden die Changelogs ja nicht gelesen, weswegen man am Ende wohl in überraschte Gesichter schauen wird, warum ein Script nicht mehr läuft. Also: Migriert eure Scripts! Und wenn ihr hier im Forum jemanden seht, der Code mitrequire('request');teilt: Bitte entsprechend darauf hinweisen.In der Zukunft wird das Paket dann endlich aus dem Standard entfernt und nicht mehr mitinstalliert. Man kann es zwar in den Instanzeinstellungen dann manuell noch hinzufügen, aber das ist nicht zu empfehlen. request ist seit über 4 Jahren deprecated und wird nicht mehr weiter entwickelt! Einfach nicht mehr nutzen...
System-Variablen
Seit Version v8.0.0 gibt es unter "System" außerdem noch ein neuen Baustein. Über diese kann der Name des Scripts, der Standard-Verzeichnispfad oder der Status des Verbose-Modus des Scripts ausgegeben werden.

Damit könnte man z.B. verbose-Nachrichten schreiben oder Log-Meldungen ändern, wenn der verbose-Modus aktiv ist (hab ich im ioBroker-Master-Kurs auch erklärt, ...):


Vorbereitung auf js-controller 6.x
Das Abhängigkeitsmanagement (für zusätzliche Pakte in den Instanzeinstellungen) bringt in der aktuellen npm-Version ein paar Probleme mit sich. Diese werden im js-controller 6.x adressiert und es gibt auch schon die erste Implementierung der neuen Funktionen. Mehr dazu, sobald der js-controller 6 in einer beta verfügbar ist.
Oberfläche
Die Darstellung des Logs hat sich nun auch leicht geändert und wurde an den Admin angepasst. Die erste Spalte (Quelle) ist neu. Dafür wird in der Meldung selbst die Instanz nicht mehr angezeigt (wie im Admin halt).

Ansonsten habe ich aus den pixeligen Grafiken zum Umschalten von Blockly/JS und Rules/JS mal Vektorgrafiken gemacht die auch skalieren. Auf Retina-Displays sah das vorher ja schlimm aus :)

jetzt habe ich doch was - hat meinen javascript adapter lahmgelegt und auch den ganzen iob so verlangsamt, dass er fast nicht mehr reagiert hat - evtl knn man da was abfangen ?
hatte vorher was getestet und eine variable angelegt - tttest

die variable hatte ich vorher deklariert und dann nach dem löschen dieser deklaration hatte ich vergessen diese varible wieder rauszumachen (siehe pfeil) - danach war dann das log voll - ich musste die javascript instanz stoppen. hier ein auszug aus dem log:
-
jetzt habe ich doch was - hat meinen javascript adapter lahmgelegt und auch den ganzen iob so verlangsamt, dass er fast nicht mehr reagiert hat - evtl knn man da was abfangen ?
hatte vorher was getestet und eine variable angelegt - tttest

die variable hatte ich vorher deklariert und dann nach dem löschen dieser deklaration hatte ich vergessen diese varible wieder rauszumachen (siehe pfeil) - danach war dann das log voll - ich musste die javascript instanz stoppen. hier ein auszug aus dem log:
@liv-in-sky sagte in JavaScript 8.3.0 - Log-Trigger, File-Events und Warnungen:
evtl knn man da was abfangen ?
Schwierig. Die Blöcke (im Text suche ...) kommen ja direkt von Google. Und der Trigger wird halt bei jeder Log-Meldung aufgerufen. Dadurch wird das sehr oft ausgewertet und entsprechen viele Fehler generiert.
Noch schlimmer könnte es werden, wenn der Block auf die selbst generierte Meldung wieder reagiert. Das könnte ich versuchen zu unterbinden.
-
@liv-in-sky sagte in JavaScript 8.3.0 - Log-Trigger, File-Events und Warnungen:
evtl knn man da was abfangen ?
Schwierig. Die Blöcke (im Text suche ...) kommen ja direkt von Google. Und der Trigger wird halt bei jeder Log-Meldung aufgerufen. Dadurch wird das sehr oft ausgewertet und entsprechen viele Fehler generiert.
Noch schlimmer könnte es werden, wenn der Block auf die selbst generierte Meldung wieder reagiert. Das könnte ich versuchen zu unterbinden.
@haus-automatisierung sagte in JavaScript 8.3.0 - Log-Trigger, File-Events und Warnungen:
jeder Log-Meldung aufgerufen. Dadurch wird das sehr oft ausgewertet
das würde erklären, warum so viele meldungen - sind quasi in einer endlos-schleife - zuerst der fehler und dann die reaktion auf den fehler, auf den fehler, auf den fehler ..........
-
@liv-in-sky sagte in JavaScript 8.3.0 - Log-Trigger, File-Events und Warnungen:
evtl knn man da was abfangen ?
Schwierig. Die Blöcke (im Text suche ...) kommen ja direkt von Google. Und der Trigger wird halt bei jeder Log-Meldung aufgerufen. Dadurch wird das sehr oft ausgewertet und entsprechen viele Fehler generiert.
Noch schlimmer könnte es werden, wenn der Block auf die selbst generierte Meldung wieder reagiert. Das könnte ich versuchen zu unterbinden.
evtl. den trigger disablen, wenn in kurzer zeit immer wieder der selbe trigger kommt ?
-
evtl. den trigger disablen, wenn in kurzer zeit immer wieder der selbe trigger kommt ?
@haus-automatisierung
@Homoran
@paul53
@liv-in-sky
@DJMarc75Huhu,
wollte nun auch mal den Request Block loswerden, auch weil das Log nervt :)
Tja. Was soll ich sagen. Ist nicht so einfach :grin:Ausgangsblockly

Läuft tadellos. Wenn da nicht die Logeinträge wären :)
Mit dem gefährlichen Halbwissen umgestellt:

Das steht nun im DP

Das sollte normal drinstehen:

-
@haus-automatisierung
@Homoran
@paul53
@liv-in-sky
@DJMarc75Huhu,
wollte nun auch mal den Request Block loswerden, auch weil das Log nervt :)
Tja. Was soll ich sagen. Ist nicht so einfach :grin:Ausgangsblockly

Läuft tadellos. Wenn da nicht die Logeinträge wären :)
Mit dem gefährlichen Halbwissen umgestellt:

Das steht nun im DP

Das sollte normal drinstehen:

müßte am result baustein liegen - nimm den Data-baustein
-
@haus-automatisierung
@Homoran
@paul53
@liv-in-sky
@DJMarc75Huhu,
wollte nun auch mal den Request Block loswerden, auch weil das Log nervt :)
Tja. Was soll ich sagen. Ist nicht so einfach :grin:Ausgangsblockly

Läuft tadellos. Wenn da nicht die Logeinträge wären :)
Mit dem gefährlichen Halbwissen umgestellt:

Das steht nun im DP

Das sollte normal drinstehen:

-
@haus-automatisierung
@Homoran
@paul53
@liv-in-sky
@DJMarc75Huhu,
wollte nun auch mal den Request Block loswerden, auch weil das Log nervt :)
Tja. Was soll ich sagen. Ist nicht so einfach :grin:Ausgangsblockly

Läuft tadellos. Wenn da nicht die Logeinträge wären :)
Mit dem gefährlichen Halbwissen umgestellt:

Das steht nun im DP

Das sollte normal drinstehen:

@haselchen sagte in JavaScript 8.3.0 - Log-Trigger, File-Events und Warnungen:
Mit dem gefährlichen Halbwissen umgestellt:

- Das ganze arbeitet wie vorher auch mit Callbacks. Also bitte die anderen Blöcke auch wieder da rein (wie bei Request).
- Und deine
resultVariable löschen. Das war schon immer unschön gelöst, gerade wenn man mehrere Request-Bausteine im gleichen Script hatte (siehe Scope vonvar). Jedenfalls gibts dafür jetzt andere Bausteine, welche das Ergebnis direkt enthalten (so wie bei den Triggern). Keine Variablen mehr manuell anlegen! Und die merken dann auch, wenn sie falsch genutzt werden und sich gar nicht innerhalb eines httpGet oder Post Bausteines befinden.
-
@haselchen sagte in JavaScript 8.3.0 - Log-Trigger, File-Events und Warnungen:
Mit dem gefährlichen Halbwissen umgestellt:

- Das ganze arbeitet wie vorher auch mit Callbacks. Also bitte die anderen Blöcke auch wieder da rein (wie bei Request).
- Und deine
resultVariable löschen. Das war schon immer unschön gelöst, gerade wenn man mehrere Request-Bausteine im gleichen Script hatte (siehe Scope vonvar). Jedenfalls gibts dafür jetzt andere Bausteine, welche das Ergebnis direkt enthalten (so wie bei den Triggern). Keine Variablen mehr manuell anlegen! Und die merken dann auch, wenn sie falsch genutzt werden und sich gar nicht innerhalb eines httpGet oder Post Bausteines befinden.
Wenn doch im Leben alles so einfach wäre :)

Das ist die Lösung.
Dankeschön an Alle!Edit: eine kleeeeeeine Frage ist da noch.
Ich habe bei einem Blocky eine Variable gesetzt.
Result.Nun gibt es ja den Data Baustein , wie muss dieser Block jetzt aussehen?

-
Wenn doch im Leben alles so einfach wäre :)

Das ist die Lösung.
Dankeschön an Alle!Edit: eine kleeeeeeine Frage ist da noch.
Ich habe bei einem Blocky eine Variable gesetzt.
Result.Nun gibt es ja den Data Baustein , wie muss dieser Block jetzt aussehen?

@haselchen sagte: Ich habe bei einem Blocky eine Variable gesetzt.
Wozu?
-
Wenn doch im Leben alles so einfach wäre :)

Das ist die Lösung.
Dankeschön an Alle!Edit: eine kleeeeeeine Frage ist da noch.
Ich habe bei einem Blocky eine Variable gesetzt.
Result.Nun gibt es ja den Data Baustein , wie muss dieser Block jetzt aussehen?

@haselchen verstehe das auch nicht ganz
vermutung - so rein theoretisch - du fragst beim resultat(data) nur auf ungleich null
wenn aber daten kommen, die inverter.ts_lastsuccess nicht enthalten, wird "blödsinn" in deinen datenpunkt geschrieben (falls das überhaupt vorkommen kann) bzw wird ein script fehler kommen
evtl müßte man das anders abfragen - eben nicht nach null und dann reagieren
das result zu setzen, macht hier keinen sinn
-
@haselchen verstehe das auch nicht ganz
vermutung - so rein theoretisch - du fragst beim resultat(data) nur auf ungleich null
wenn aber daten kommen, die inverter.ts_lastsuccess nicht enthalten, wird "blödsinn" in deinen datenpunkt geschrieben (falls das überhaupt vorkommen kann) bzw wird ein script fehler kommen
evtl müßte man das anders abfragen - eben nicht nach null und dann reagieren
das result zu setzen, macht hier keinen sinn
Das steht da noch drin , weil ich ja nicht weiß wie ich es ändern muss .
Die anderen Variabeln waren ja result.
Jetzt geändert auf Data.Das Ganze ist schon länger her.
Ich vermute auch , wenn keine Daten mehr kommen das da Blödsinn im DP steht . Deswegen hatte ich es so gelöst. -
Das steht da noch drin , weil ich ja nicht weiß wie ich es ändern muss .
Die anderen Variabeln waren ja result.
Jetzt geändert auf Data.Das Ganze ist schon länger her.
Ich vermute auch , wenn keine Daten mehr kommen das da Blödsinn im DP steht . Deswegen hatte ich es so gelöst.@haselchen sagte: Ich vermute auch , wenn keine Daten mehr kommen
Die Variable wird nur einmal bei Skriptstart mit dem JSON gefüllt.
-
@haselchen sagte: Ich vermute auch , wenn keine Daten mehr kommen
Die Variable wird nur einmal bei Skriptstart mit dem JSON gefüllt.
-
Wird ja alle 2 min gestartet , siehe Cron Baustein
Edit : okay, sieht man nur wenn man drauf klickt
Aber es sind alle 2 min@haselchen sagte: Wird ja alle 2 min gestartet
Die Variable wird außerhalb des Zeitplanes gefüllt.
-
@haselchen sagte: Wird ja alle 2 min gestartet
Die Variable wird außerhalb des Zeitplanes gefüllt.
-
Das steht da noch drin , weil ich ja nicht weiß wie ich es ändern muss .
Die anderen Variabeln waren ja result.
Jetzt geändert auf Data.Das Ganze ist schon länger her.
Ich vermute auch , wenn keine Daten mehr kommen das da Blödsinn im DP steht . Deswegen hatte ich es so gelöst.@haselchen sagte in JavaScript 8.3.0 - Log-Trigger, File-Events und Warnungen:
keine Daten mehr kommen das da Blödsinn im DP
das wird so nicht mehr funktionieren - außerhalb der httpget function existiert data nicht bzw, wenn du es anlegst wird es innerhalb trotzdem neu gesetzt (wäre dann doppelt im script) (ist jetzt anders als mit dem result wert - soweit ich das verstanden habe)
wenn dann könntest du innerhalb von httpget noch ein sonst einfügen (im falls) dann dp direkt mit einem wert setzen - setstate ...HM-600_Rohdaten ist ...... - z.b. könntest du 999999 setzen und wenn das gesetzt wird durch einen anderen trigger einen alarm senden - dann weißt du, dass was nicht stimmt
-
@haselchen sagte in JavaScript 8.3.0 - Log-Trigger, File-Events und Warnungen:
keine Daten mehr kommen das da Blödsinn im DP
das wird so nicht mehr funktionieren - außerhalb der httpget function existiert data nicht bzw, wenn du es anlegst wird es innerhalb trotzdem neu gesetzt (wäre dann doppelt im script) (ist jetzt anders als mit dem result wert - soweit ich das verstanden habe)
wenn dann könntest du innerhalb von httpget noch ein sonst einfügen (im falls) dann dp direkt mit einem wert setzen - setstate ...HM-600_Rohdaten ist ...... - z.b. könntest du 999999 setzen und wenn das gesetzt wird durch einen anderen trigger einen alarm senden - dann weißt du, dass was nicht stimmt

Und das kommt nun raus :(
Muss gestehen, Skripte, Variablen, Javascript und dergleichen sind nicht so meins :worried: -

Und das kommt nun raus :(
Muss gestehen, Skripte, Variablen, Javascript und dergleichen sind nicht so meins :worried:@haselchen genau das meinte ich mit fehler wird erzeugt :-)
probiermal den timeout im httpget auf 4000 zu setzen
ich bekomme auch öfter mal einen timeout, wenn ich mit 2000 arbeite - verstehe ich zwar nicht, aber evt ist der traffic im netz so hoch (backup), dass es länger wie 2 sekunden dauert, bis eine antwort kommt ???ich nehme mal an, dass "data" nicht null war aber eben auch keine brauchbaren werte drin sind - wenn du den data baustein mal anklickst gibt es darunte die auswahl status-code

man müßte anstatt nach null abzufragen, den statuscode abfragen - mach mal in dein blockly noch ein debug mit rein

dann siehst du, was da kommt, wenn alles ok ist oder ein fehler kommt - und dann kannst du die abfrage ändern (lass dabei den timeout wieder klein gestellt, damit auch mal ein fehler kommt
-

Und das kommt nun raus :(
Muss gestehen, Skripte, Variablen, Javascript und dergleichen sind nicht so meins :worried:habe es mal ausprobiert - wenn du einen timeout hast, kommt als statuscode null bei mir zurück - dann versucht dein script einen wert aus null (für den datenpunkt) zu generieren - dann kommt der fehler cannot get rx_.......
mit dieser abfrage

sollte das verhindert werden können

