NEWS
Object.<anonymous> finden?
-
Hallo,
wie finde ich folgenden Fehler:
javascript.0 08:58:53.560 warn at Object.<anonymous> (script.js.Küche.Siemens_Spülmaschine:64:3)
Ich hätte jetzt gedacht das in Zeile 64 ein Fehler ist, aber in Zeile 64 finde ich nichts:
on({ id: [].concat(['0_userdata.0.Küche.Siemens_Spülmaschine_Auto_ein_bei']), change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; if ((obj.state ? obj.state.val : '') == 1) { Auto_Ein_bei = 1500; } else if ((obj.state ? obj.state.val : '') == 2) { Auto_Ein_bei = 2000; } else if ((obj.state ? obj.state.val : '') == 3) { Auto_Ein_bei = 3000; } else if ((obj.state ? obj.state.val : '') == 4) { Auto_Ein_bei = 4000; } else if ((obj.state ? obj.state.val : '') == 0) { Auto_Ein_bei = false; } setState('0_userdata.0.Küche.Auto_ein_bei' /* Auto ein bei */, Auto_Ein_bei, true); }); on({ id: [].concat(['0_userdata.0.Küche.Spülmaschine_Ein/Aus']), change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; Uhrzeit = false; setState('0_userdata.0.Küche.Siemens_Spülmaschine_Auto' /* Siemens Spülmaschine Auto */, false, true); Hand = false;
Danke!
-
@sms sagte in Object.<anonymous> finden?:
aber in Zeile 64 finde ich nichts:
Um die Scripts wird vom Adapter noch etwas Code gepackt, bevor dieser ausgeführt wird. Daher stimmen die Zeilennummern im Callstack nicht.
Wie genau lautet denn die Fehlermeldung bzw. wie sieht der gesamte Stack des Fehlers aus?
-
@sms
Javascript ist untypisiert. Das heißt: Der Typ einer Variablen ergibt sich aus seiner Verwendung.
Du mixt hier aber Number (Zahlenwerte) mit Boolean (wahr/falsch).
Letztlich schreibst Du damit im Fall der Fälle auch den falschen Typ in den Datenpunkt, denn der wird ja auch entweder Boolean oder Number sein.Statt "Falsch" sollte bei 'ner
0
also etwas anderes in den DP geschrieben werden. z.B. eine0
oder-1
.
Das ganze soll wohl dazu dienen, dass die Spülmaschine nicht automatisch (per Timer) gestartet wird, oder?Apropos Spülmachine: Früher oder später (meist früher) wird sich die Verwendung von Umlauten (und anderer Sonderzeichen) in Variablen und ID's rächen.
Außerdem gibt es für die Prüfung auf verschiedene Werte effizientere Möglichkeiten:
-
@haus-automatisierung meinst du das:
javascript.0 09:00:34.141 info Stopping script script.js.Küche.Siemens_Spülmaschine javascript.0 09:01:09.265 info Start JavaScript script.js.Küche.Siemens_Spülmaschine (Blockly) javascript.0 09:01:09.300 info script.js.Küche.Siemens_Spülmaschine: registered 13 subscriptions, 2 schedules, 0 messages, 0 logs and 0 file subscriptions homeconnect.0 09:10:21.528 silly States user redis pmessage homeconnect.0.*/homeconnect.0.013060393307000289.programs.active.BSH_Common_Root_ActiveProgram:{"val":"Dishcare.Dishwasher.Program.Eco50","ack":false,"ts":1745392221521,"q":0,"c":"script.js.Küche.Siemens_Spülmaschine","from":"system.adapter.javascript.0","user":"system.user.admin","lc":1745391503639} homeconnect.0 09:10:21.531 silly States user redis pmessage homeconnect.0.*/homeconnect.0.013060393307000289.settings.BSH_Common_Setting_PowerState:{"val":"BSH.Common.EnumType.OperationState.On","ack":false,"ts":1745392221521,"q":0,"c":"script.js.Küche.Siemens_Spülmaschine","from":"system.adapter.javascript.0","user":"system.user.admin","lc":1745392221521} javascript.0 09:10:51.521 warn at Object.<anonymous> (script.js.Küche.Siemens_Spülmaschine:64:3)
-
@sms
Ist es gewollt, dass Du Dir mit der Logstufesilly
für den Homeconnect das Log vollballerst?Wenn das nur übergangsweise zu Debug-Zwecken so ist, habe ich nix gesagt
-
@codierknecht Ich habe das Objekt deshalb extra auf "gemischt" gestellt, dachte das funktioniert so.
Die Spülmaschine soll angehen, je nachdem welchen Wert ich einstelle und meine PV-Produktion diesen Wert überschreitet.
Das Ganze sieht so aus:
0 bedeutet = AUS
Die Umlaute werde ich nach und nach elemenieren.
-
@codierknecht Da ich davon keine Ahnung habe, ... , nein es ist nicht gewollt. Wo ändere ich das?
-
@sms sagte in Object.<anonymous> finden?:
Wo ändere ich das?
In den Instanzeinstellungen (Expertenmodus)
-
@codierknecht was bedeutet debug?
-
@sms sagte in Object.<anonymous> finden?:
was bedeutet debug?
Das ist nur ein Beispiel aus meinem Testsystem. Auch damit werden jede Menge Infos ins Log geschrieben, die im stabilen Betrieb nicht wirklich nötig sind.
Üblich ist die Einstellung "Info". Wäre hier erstmal meine Empfehlung.
Ich gehe noch einen Schritt weiter und stelle die Adapter, die wirklich stabil ihren Dienst verrichten, aber zu viel Zeug ins Log schreiben, auf "Warning".
Und wer dann noch zu viel unnützes Zeug plappert, bekommt "Error" und darf damit nur noch bei Fehlern etwas ins Log schreiben. So ist das am Ende des Tages nur noch < 100 kB groß. -
@codierknecht OK, danke!
Das eigentliche Problem liegt jetzt aber hier?
@codierknecht Ich habe das Objekt deshalb extra auf "gemischt" gestellt, dachte das funktioniert so.
Die Spülmaschine soll angehen, je nachdem welchen Wert ich einstelle und meine PV-Produktion diesen Wert überschreitet.
Das Ganze sieht so aus:
0 bedeutet = AUS
-
Kannst Du mal bitte das komplette Script zeigen? Da fehlt ja definitiv noch Code. Im Screenshot erkennt man ja einen weiteren Trigger usw.
@sms sagte in Object.<anonymous> finden?:
@codierknecht Ich habe das Objekt deshalb extra auf "gemischt" gestellt, dachte das funktioniert so.
Das kann man schon so machen, aber schön/sauber ist das nicht. Ist zumindest nicht das Problem hier für die Fehlermeldung.
-
var Uhrzeit, Auto_Ein_bei, Steckdose_Dauerein, Hand, Wartezeit_Verbindungsaufbau, Wartezeit, Wartezeit3, Wartezeit2; on({ id: [].concat(['homeconnect.0.013060393307000289.programs.active.options.BSH_Common_Option_StartInRelative']), change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; setState('0_userdata.0.Küche.Siemens_Spülmaschine_Startzeit_Stunden' /* Siemens Spülmaschine Startzeit Stunden */, (getState('homeconnect.0.013060393307000289.programs.active.options.BSH_Common_Option_StartInRelative').val / 3600), true); setState('0_userdata.0.Küche.Siemens_Spülmaschine_Startzeit_Minuten' /* Siemens Spülmaschine Startzeit Minuten */, (getState('homeconnect.0.013060393307000289.programs.active.options.BSH_Common_Option_StartInRelative').val / 60), true); }); on({ id: [].concat(['sonoff.0.Spülmaschine.alive']), change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; if ((obj.state ? obj.state.val : '') == false) { setState('0_userdata.0.Küche.SD_Spülmaschine_am_Leben' /* SD Spülmaschine am Leben */, false, true); } else { setState('0_userdata.0.Küche.SD_Spülmaschine_am_Leben' /* SD Spülmaschine am Leben */, true, true); } }); schedule("0,30 * * * *", async () => { setState('0_userdata.0.Küche.Siemens_Spülmaschine_Verbrauch' /* Siemens_Spülmaschine_Verbrauch */, (getState('sonoff.0.Spülmaschine.ENERGY_Total').val - 405.155), true); }); on({ id: [].concat(['homeconnect.0.013060393307000289.status.BSH_Common_Status_OperationState']), change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; if ((obj.state ? obj.state.val : '') == 'BSH.Common.EnumType.OperationState.Run') { setState('0_userdata.0.Küche.Spülgänge' /* Spülgänge */, (getState('0_userdata.0.Küche.Spülgänge').val + 1), true); } }); on({ id: [].concat(['homeconnect.0.013060393307000289.status.BSH_Common_Status_OperationState']), change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; if ((obj.state ? obj.state.val : '') == 'BSH.Common.EnumType.OperationState.Ready') { setStateDelayed('0_userdata.0.Küche.Siemens_Spülmaschine_Durchnittskosten' /* Siemens Spülmaschine Durchnittskosten */, (getState('0_userdata.0.Küche.Spülmaschine_Verbrauchskosten').val / getState('0_userdata.0.Küche.Spülgänge').val), true, 60000, false); } }); schedule("0,30 * * * *", async () => { setState('0_userdata.0.Küche.Spülmaschine_Verbrauchskosten' /* Spülmaschine Verbrauchskosten */, (getState('0_userdata.0.Küche.Siemens_Spülmaschine_Verbrauch').val * getState('javascript.0.Meine_Datenpunkte.Strom.Kosten.Arbeitspreis_/kWh_Bezug_Energieversorger').val), true); }); on({ id: [].concat(['homeconnect.0.013060393307000289.programs.active.options.BSH_Common_Option_RemainingProgramTime']), change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; setState('0_userdata.0.Küche.Siemens_Spülmaschine_Restlaufzeit' /* Siemens Spülmaschine Restlaufzeit */, (getState('homeconnect.0.013060393307000289.programs.active.options.BSH_Common_Option_RemainingProgramTime').val / 60), true); }); scheduleById('0_userdata.0.Haushaltsgeraete.01_Uhrzeit_Spuelmaschine' /* 01_Uhrzeit Spuelmaschine */, async () => { if (Uhrzeit) { setState('alias.0.Küche.Spülmaschine.SET' /* Set-Spülmaschine */, true); } }); on({ id: [].concat(['0_userdata.0.Küche.Siemens_Spülmaschine_Auto_ein_bei']), change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; if ((obj.state ? obj.state.val : '') == 1) { Auto_Ein_bei = 1500; } else if ((obj.state ? obj.state.val : '') == 2) { Auto_Ein_bei = 2000; } else if ((obj.state ? obj.state.val : '') == 3) { Auto_Ein_bei = 3000; } else if ((obj.state ? obj.state.val : '') == 4) { Auto_Ein_bei = 4000; } else if ((obj.state ? obj.state.val : '') == 0) { Auto_Ein_bei = false; } setState('0_userdata.0.Küche.Auto_ein_bei' /* Auto ein bei */, Auto_Ein_bei, true); }); on({ id: [].concat(['0_userdata.0.Küche.Spülmaschine_Ein/Aus']), change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; Uhrzeit = false; setState('0_userdata.0.Küche.Siemens_Spülmaschine_Auto' /* Siemens Spülmaschine Auto */, false, true); Hand = false; if ((obj.state ? obj.state.val : '') == 3) { Uhrzeit = true; } else if ((obj.state ? obj.state.val : '') == 2) { setState('0_userdata.0.Küche.Siemens_Spülmaschine_Auto' /* Siemens Spülmaschine Auto */, true, true); } else if ((obj.state ? obj.state.val : '') == 1) { Hand = true; (() => { if (Auto_Ein_bei) { clearInterval(Auto_Ein_bei); Auto_Ein_bei = null; }})(); setState('alias.0.Küche.Spülmaschine.SET' /* Set-Spülmaschine */, true); } else if ((obj.state ? obj.state.val : '') == 0) { setState('alias.0.Küche.Spülmaschine.SET' /* Set-Spülmaschine */, false); } }); on({ id: [].concat(['0_userdata.0.Küche.Spülmaschine_Ein/Aus']), change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; Steckdose_Dauerein = false; if ((obj.state ? obj.state.val : '') == 4) { Steckdose_Dauerein = true; setState('alias.0.Küche.Spülmaschine.SET' /* Set-Spülmaschine */, true); } }); on({ id: '0_userdata.0.Strom.Stromerzeugung_gesamt' /* Stromerzeugung gesamt */, change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; if (getState('0_userdata.0.Küche.Siemens_Spülmaschine_Auto').val == true) { if ((obj.state ? obj.state.val : '') >= getState('0_userdata.0.Küche.Auto_ein_bei').val && getState('0_userdata.0.Strom.Batterie.Batterie___60%').val == true) { setState('alias.0.Küche.Spülmaschine.SET' /* Set-Spülmaschine */, true); setStateDelayed('0_userdata.0.Küche.Siemens_Spülmaschine_Auto_ein_bei' /* Siemens Spülmaschine Auto ein bei */, false, true, 120000, false); } } }); on({ id: [].concat(['alias.0.Küche.Spülmaschine.SET']), change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; if ((obj.state ? obj.state.val : '') && getState('0_userdata.0.Küche.Spülmaschine_Ein/Aus').val != 1 && getState('0_userdata.0.Küche.Spülmaschine_Ein/Aus').val != 4) { (() => { if (Wartezeit) { clearInterval(Wartezeit); Wartezeit = null; }})(); Wartezeit_Verbindungsaufbau = 90; setState('0_userdata.0.Küche.Siemens_Spülmaschine_Verbindungszeit' /* Siemens Spülmaschine Verbindungszeit */, Wartezeit_Verbindungsaufbau, true); Wartezeit = setInterval(async () => { Wartezeit_Verbindungsaufbau = (typeof Wartezeit_Verbindungsaufbau === 'number' ? Wartezeit_Verbindungsaufbau : 0) + -1; setState('0_userdata.0.Küche.Siemens_Spülmaschine_Verbindungszeit' /* Siemens Spülmaschine Verbindungszeit */, Wartezeit_Verbindungsaufbau, true); if (Wartezeit_Verbindungsaufbau <= 0 && getState('alias.0.Küche.Spülmaschine.SET').val == true) { (() => { if (Wartezeit) { clearInterval(Wartezeit); Wartezeit = null; }})(); setState('homeconnect.0.013060393307000289.programs.active.BSH_Common_Root_ActiveProgram' /* BSH_Common_Root_ActiveProgram */, 'Dishcare.Dishwasher.Program.Eco50'); setState('homeconnect.0.013060393307000289.settings.BSH_Common_Setting_PowerState' /* Energiezustand */, 'BSH.Common.EnumType.OperationState.On'); if (obj.id && obj?.state && !obj.state.ack) { await setStateAsync(obj.id, { val: obj.state.val, ack: true }); } } }, 1000); } if ((obj.state ? obj.state.val : '') && getState('0_userdata.0.Küche.Spülmaschine_Ein/Aus').val == 1) { (() => { if (Wartezeit3) { clearInterval(Wartezeit3); Wartezeit3 = null; }})(); Wartezeit_Verbindungsaufbau = 90; setState('0_userdata.0.Küche.Siemens_Spülmaschine_Verbindungszeit' /* Siemens Spülmaschine Verbindungszeit */, Wartezeit_Verbindungsaufbau, true); Wartezeit3 = setInterval(async () => { Wartezeit_Verbindungsaufbau = (typeof Wartezeit_Verbindungsaufbau === 'number' ? Wartezeit_Verbindungsaufbau : 0) + -1; setState('0_userdata.0.Küche.Siemens_Spülmaschine_Verbindungszeit' /* Siemens Spülmaschine Verbindungszeit */, Wartezeit_Verbindungsaufbau, true); if (Wartezeit_Verbindungsaufbau <= 0) { (() => { if (Wartezeit3) { clearInterval(Wartezeit3); Wartezeit3 = null; }})(); } }, 1000); } if ((obj.state ? obj.state.val : '') && getState('0_userdata.0.Küche.Spülmaschine_Ein/Aus').val == 4) { (() => { if (Wartezeit2) { clearInterval(Wartezeit2); Wartezeit2 = null; }})(); Wartezeit_Verbindungsaufbau = 90; setState('0_userdata.0.Küche.Siemens_Spülmaschine_Verbindungszeit' /* Siemens Spülmaschine Verbindungszeit */, Wartezeit_Verbindungsaufbau, true); Wartezeit2 = setInterval(async () => { Wartezeit_Verbindungsaufbau = (typeof Wartezeit_Verbindungsaufbau === 'number' ? Wartezeit_Verbindungsaufbau : 0) + -1; setState('0_userdata.0.Küche.Siemens_Spülmaschine_Verbindungszeit' /* Siemens Spülmaschine Verbindungszeit */, Wartezeit_Verbindungsaufbau, true); if (Wartezeit_Verbindungsaufbau <= 0) { (() => { if (Wartezeit2) { clearInterval(Wartezeit2); Wartezeit2 = null; }})(); } }, 1000); } }); on({ id: [].concat(['homeconnect.0.013060393307000289.status.BSH_Common_Status_OperationState']), change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; if ((obj.state ? obj.state.val : '') == 'BSH.Common.EnumType.OperationState.Run' || (obj.state ? obj.state.val : '') == 'BSH.Common.EnumType.OperationState.Ready') { setStateDelayed('0_userdata.0.Küche.Siemens_Spülmaschine_läuft' /* Siemens_Spülmaschine_läuft */, true, true, 30000, false); } }); on({ id: [].concat(['0_userdata.0.Küche.Siemens_Spülmaschine_Restlaufzeit']), change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; if ((obj.state ? obj.state.val : '') <= 0 && getState('0_userdata.0.Küche.Siemens_Spülmaschine_läuft').val == true && getState('0_userdata.0.Küche.Siemens_Spülmaschine_Restlaufzeit').val <= 0) { setState('0_userdata.0.Küche.Siemens_Spülmaschine_läuft' /* Siemens_Spülmaschine_läuft */, false, true); setState('0_userdata.0.Küche.Spülmaschine_Ein/Aus' /* Spülmaschine Ein/Aus */, 0, true); setStateDelayed('alias.0.Küche.Spülmaschine.SET' /* Set-Spülmaschine */, false, 300000, false); } });
-
@haus-automatisierung sagte in Object.<anonymous> finden?:
Das kann man schon so machen
OT: Ich hatte mal einen Kollegen, der seinen Code eher so "hingerotzt" hat.
Für den hatte ich mir Spezialkleidung besorgt:
Was soll ich sagen ... der war nicht mehr lange "Kollege" -
@codierknecht Ich habe ja nicht gesagt das es perfekt ist. Das war für mich die Lösung damit da nicht 0 steht. Ich könnte natürlich auch einen Zahlenwert reinschreiben, den ich eh nie erreichen werde.
-
@sms sagte: Das war für mich die Lösung damit da nicht 0 steht.
Wie wäre es mit Strings?
-
@paul53 Wie müsste es dann aussehen? Trotzdem Zahlenwerte und true und false gemischt?
-
@sms sagte in Object.<anonymous> finden?:
Ich habe ja nicht gesagt das es perfekt ist
Deswegen ja auch "OT". War nicht an Dich adressiert.
Ich könnte natürlich auch einen Zahlenwert reinschreiben, den ich eh nie erreichen werde.
Wäre eine Möglichkeit.
Das Problem ist ja hier, dass eine rein Logische Aussage zusammen mit quantitativen Aussagen in einem einzigen DP zusammen abgebildet werden sollen.@paul53 sagte in Object.<anonymous> finden?:
Wie wäre es mit Strings?
Fände ich fast noch unschöner.
Ich würde einen bestimmten - unter normalen Umständen niemals erreichbaren - Zahlenwert bevorzugen.Oder aber z.B.
-1
und diesen Sonderfall nochmal explizit prüfen, bevor da etwas losgetreten wird.
Alternative wäre ein Objekt. Mit "On/Off" als Bool und den Zahlenwerten als Number. Fände ich am saubersten. -
-
@paul53 werde ich mal ausprobieren