NEWS
Skript: TypeError: Converting circular structure to JSON
-
Systemdata Bitte Ausfüllen Hardwaresystem: NUC Arbeitsspeicher: 4GB Festplattenart: HDD Betriebssystem: Ubuntu / Docker Node-Version: 10.x.x Nodejs-Version: 14.18.3 NPM-Version: 6.14.15 Installationsart: Docker Image genutzt: Nein Ort/Name der Imagedatei: Link Zur Steuerung meines AV Receivers nutze ich dieses Skript.
var host, port, message; let socketClient; host = '10.10.21.14'; port = 84; // PowerON on({id: 'fakeroku.0.lyngdorf.keys.Select', change: "any"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (getState("fakeroku.0.lyngdorf.keys.Select").val) { await Send_mesage_via_TCP(host, port, '!POWERONMAIN\r'); } }); // PowerOFF on({id: 'fakeroku.0.lyngdorf.keys.Home', change: "any"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (getState("fakeroku.0.lyngdorf.keys.Home").val) { await Send_mesage_via_TCP(host, port, '!POWEROFFMAIN\r'); } }); // Vol+ on({id: 'fakeroku.0.lyngdorf.keys.Up', change: "any"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (getState("fakeroku.0.lyngdorf.keys.Up").val) { await Send_mesage_via_TCP(host, port, '!VOL+\r!VOL+\r'); } }); // Vol- on({id: 'fakeroku.0.lyngdorf.keys.Down', change: "any"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (getState("fakeroku.0.lyngdorf.keys.Down").val) { await Send_mesage_via_TCP(host, port, '!VOL-\r!VOL-\r'); } }); ... async function Send_mesage_via_TCP(host, port, message) { // Create the socket client if it was not already created if (!socketClient) { console.log('create new connection.'); var net = require('net'); socketClient = net.connect({ host: host, port: port }); // On disconnect socketClient.on("end", () => { console.log("Disconnected from API"); socketClient.destroy(); socketClient = null; }); // Wait until connection is established await once(socketClient, "connect"); } // Send the message socketClient.write(message); // Listen for the response const data = await once(socketClient, "data"); //const response = JSON.parse(data).result; };
Das Skript steuert den AV Receiver via TCP Befehlen. Das klappt soweit seit Monaten bestens. Seit einigen Tagen erhalte ich im Log diese Fehler:
2022-03-13 19:33:30.286 - [32minfo[39m: javascript.0 (135) script.js.common.Lyngdorf.Fernbedienung: getState(id=fakeroku.0.lyngdorf.keys.Down, timerId=undefined) => {"val":true,"ack":true,"ts":1647196410285,"q":0,"from":"system.adapter.fakeroku.0","user":"system.user.admin","lc":1647196410285} 2022-03-13 19:33:30.287 - [31merror[39m: javascript.0 (135) script.js.common.Lyngdorf.Fernbedienung: TypeError: Converting circular structure to JSON 2022-03-13 19:33:30.287 - [31merror[39m: javascript.0 (135) --> starting at object with constructor 'Socket' 2022-03-13 19:33:30.287 - [31merror[39m: javascript.0 (135) | property '_writableState' -> object with constructor 'WritableState' 2022-03-13 19:33:30.287 - [31merror[39m: javascript.0 (135) | property 'afterWriteTickInfo' -> object with constructor 'Object' 2022-03-13 19:33:30.287 - [31merror[39m: javascript.0 (135) --- property 'stream' closes the circle 2022-03-13 19:33:30.288 - [31merror[39m: javascript.0 (135) at JSON.stringify (<anonymous>) 2022-03-13 19:33:30.288 - [31merror[39m: javascript.0 (135) at Object.subscribe (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1109:65) 2022-03-13 19:33:30.288 - [31merror[39m: javascript.0 (135) at _once (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1191:46) 2022-03-13 19:33:30.288 - [31merror[39m: javascript.0 (135) at /opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1199:47 2022-03-13 19:33:30.288 - [31merror[39m: javascript.0 (135) at new Promise (<anonymous>) 2022-03-13 19:33:30.288 - [31merror[39m: javascript.0 (135) at once (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1199:24) 2022-03-13 19:33:30.288 - [31merror[39m: javascript.0 (135) at Send_mesage_via_TCP (script.js.common.Lyngdorf.Fernbedienung:155:24) 2022-03-13 19:33:30.288 - [31merror[39m: javascript.0 (135) at Object.<anonymous> (script.js.common.Lyngdorf.Fernbedienung:39:11) 2022-03-13 19:33:30.288 - [31merror[39m: javascript.0 (135) at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1082:38) 2022-03-13 19:33:30.288 - [31merror[39m: javascript.0 (135) at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/main.js:530:29) 2022-03-13 19:33:30.288 - [31merror[39m: javascript.0 (135) at Immediate.<anonymous> (/opt/iobroker/node_modules/@iobroker/js-controller-adapter/src/lib/adapter/adapter.js:5909:56) 2022-03-13 19:33:30.288 - [31merror[39m: javascript.0 (135) at processImmediate (internal/timers.js:464:21)
Ich kann es nicht mit Gewissheit sagen. Ich denke aber, dass Fehler erstmalig mit dem Update auf js-controller 4 aufgetreten ist. Sicher bin ich aber nicht.
Der Fehler im Log wird mit jedem Lauf des Skripts geschrieben. Hat jemand eine Idee?
Ergänzung: Ich habe noch etwas getestet und festgestellt, dass die Fehlermeldung mit der "verbose" Option im Skript Editor im Zusammenhang steht. Ist diese aktiviert, erscheinen die Fehler im Protokoll.
Danke und Grüße
Michael
-
@abcklaus sagte in Skript: TypeError: Converting circular structure to JSON:
dass die Fehlermeldung mit der "verbose" Option im Skript Editor im Zusammenhang steht
Die Option verbose, erweitert nur die Log Ausgabe. Ich denke der meckert über die doppelte VAR Deklaration.
Einmal am Anfang:
var host, port, message; // Die VAR message ist hier überflüssig
und bei :
async function Send_mesage_via_TCP(host, port, message)
Das sind unterschiedliche Variablen auch wenn sie gleich heißen.
Du kannst das auch so schreiben:
'use strict'; let socketClient; let host = '10.10.21.14'; let port = 84; // PowerON on({id: 'fakeroku.0.lyngdorf.keys.Select', val: true}, async function (obj) { await Send_mesage_via_TCP('!POWERONMAIN\r'); }); // PowerOFF on({id: 'fakeroku.0.lyngdorf.keys.Home', val: true}, async function (obj) { await Send_mesage_via_TCP('!POWEROFFMAIN\r'); }); // Vol+ on({id: 'fakeroku.0.lyngdorf.keys.Up', val: true}, async function (obj) { await Send_mesage_via_TCP('!VOL+\r!VOL+\r'); }); // Vol- on({id: 'fakeroku.0.lyngdorf.keys.Down', val: true}, async function (obj) { await Send_mesage_via_TCP('!VOL-\r!VOL-\r'); }); async function Send_mesage_via_TCP(message) { // Create the socket client if it was not already created if (!socketClient) { console.log('create new connection.'); const net = require('net'); socketClient = net.connect({ host: host, port: port }); // On disconnect socketClient.on("end", () => { console.log("Disconnected from API"); socketClient.destroy(); socketClient = null; }); // Wait until connection is established await once(socketClient, "connect"); } // Send the message socketClient.write(message); // Listen for the response const data = await once(socketClient, "data"); //const response = JSON.parse(data).result; };
tschuess
-
@abcklaus sagte in Skript: TypeError: Converting circular structure to JSON:
Also meiner Meinung nach liegt es nicht an dem was @Sokomoto schreibt.
Gemäß Stack trace passiert der Fehler bei der Verarbeitung der Rückmeldung per once (Zeile 12 des logs).
Die Rückmeldung wird dann per JSON.stringify (Zeile 7) versucht in einen String umzuwandeln.
Allerdings scheint das ein Objekt zu sein, welches auf sich selber verweist und daher nicht umgewandelt werden kann.
Interessant wäre es, was da enthalten ist.
Evtl könntest du die Rückmeldung mal in einen Buffer speichern und da mal reinschauen. Buffer sind meist ein Array mit 8bit Werten, die den jeweiligen zeichencode darstellen. etwas aufpassen muss man bei utf8 kodierten Zeichenketten
die net-Bibliothek kann die daten als string und als Buffer zurückgeben
https://nodejs.org/api/buffer.html