Skip to content

JavaScript

Hilfe für Skripterstellung mit JavaScript

2.5k Topics 48.9k Posts

NEWS

  • Zykl. getState-Aufrufe vs. eigenes "Cache-Dictionary"

    18
    0 Votes
    18 Posts
    1k Views
    F
    Ich bin selbst leicht "erstaunt", das es funktioniert, weil eigentlich darf die gecachte Instanz nur die default 1000 setState pro Minute triggern, aber der callback in den subscriptions läßt sich evtl. nicht auf die zurückverfolgen, oder ist so schnell rum, das noch kein Limiter anspricht? Und weil ich es in meiner "leeren" Instanz.1 getestet habe, läuft da auch sonst gar nix "use strict"; const loops=5000; let start=0; let end=0; async function test_asyncStartPingPong() { // short delay, to let everything register... await new Promise(r => setTimeout(r, 2000)); console.log("Start "+loops+".loops PingPong now!"); start=Date.now(); // start ping pong await setStateAsync('0_userdata.0.test1',loops); } on({id: '0_userdata.0.test1', change:'any'}, function (obj) { setState('0_userdata.0.test2', obj.state.val-1); }); on({id: '0_userdata.0.test2', change:'any'}, function (obj) { if (obj.state.val>0) setState('0_userdata.0.test1', obj.state.val-1); else { end=Date.now(); console.log(loops+".loops PingPong, received .val "+obj.state.val+" in " + obj.id + ", delta " + (end-start) + "ms"); } }); test_asyncStartPingPong(); Ohne "Caching" geht gar nix, obwohl in meinem Script keine getStates sind, werden welche angemosert, und globale/common Files habe ich keine expliziten in Instanz.1. Und die Werte schwanken "stark", der erste Wert ist direkt nach dem ich die Instanz neu gestartet habe, da ist die aber im Hintergrund evtl. noch dabei, den Cache zu füllen, nach 5 min Wartezeit ist das ganze 10x schneller, dann sogar nochmal etwas schneller, und dann ist es deutlich langsamer, da kann halt auch noch sonstwas auf dem ioBroker los sein, oder auch die anderen VMs auf dem esxi könnten "sonstwas" treiben... 21:59:15.800 info javascript.1 (327919) Start javascript script.js.TestInstanz1.PerformanceTests 21:59:15.813 info javascript.1 (327919) script.js.TestInstanz1.PerformanceTests: registered 4 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions 21:59:17.813 info javascript.1 (327919) script.js.TestInstanz1.PerformanceTests: Start 5000.loops PingPong now! 22:00:00.194 info javascript.1 (327919) script.js.TestInstanz1.PerformanceTests: 5000.loops PingPong, received .val -1 in 0_userdata.0.test2, delta 42380ms 22:05:12.407 info javascript.0 (327870) Stop script script.js.TestInstanz1.PerformanceTests 22:05:12.413 info javascript.1 (327919) Stop script script.js.TestInstanz1.PerformanceTests 22:05:12.416 info javascript.1 (327919) Start javascript script.js.TestInstanz1.PerformanceTests 22:05:12.422 info javascript.1 (327919) script.js.TestInstanz1.PerformanceTests: registered 4 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions 22:05:14.422 info javascript.1 (327919) script.js.TestInstanz1.PerformanceTests: Start 5000.loops PingPong now! 22:05:19.332 info javascript.1 (327919) script.js.TestInstanz1.PerformanceTests: 5000.loops PingPong, received .val -1 in 0_userdata.0.test2, delta 4910ms 22:05:42.881 info javascript.0 (327870) Stop script script.js.TestInstanz1.PerformanceTests 22:05:42.885 info javascript.1 (327919) Stop script script.js.TestInstanz1.PerformanceTests 22:05:42.931 info javascript.1 (327919) Start javascript script.js.TestInstanz1.PerformanceTests 22:05:42.934 info javascript.1 (327919) script.js.TestInstanz1.PerformanceTests: registered 4 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions 22:05:44.934 info javascript.1 (327919) script.js.TestInstanz1.PerformanceTests: Start 5000.loops PingPong now! 22:05:49.415 info javascript.1 (327919) script.js.TestInstanz1.PerformanceTests: 5000.loops PingPong, received .val -1 in 0_userdata.0.test2, delta 4481ms 22:06:04.647 info javascript.1 (327919) Stop script script.js.TestInstanz1.PerformanceTests 22:06:04.646 info javascript.0 (327870) Stop script script.js.TestInstanz1.PerformanceTests 22:06:04.650 info javascript.1 (327919) Start javascript script.js.TestInstanz1.PerformanceTests 22:06:04.653 info javascript.1 (327919) script.js.TestInstanz1.PerformanceTests: registered 4 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions 22:06:06.653 info javascript.1 (327919) script.js.TestInstanz1.PerformanceTests: Start 5000.loops PingPong now! 22:06:17.941 info javascript.1 (327919) script.js.TestInstanz1.PerformanceTests: 5000.loops PingPong, received .val -1 in 0_userdata.0.test2, delta 11287ms Ich danke, man kann so eine ungefähre Aussage zur RoundTrip-Zeit machen, im Optimalfall ist es ca. 1 ms, die es vom setState bis zur Ankunft im subscribe-Callback braucht (auf meinem 3,7GHz-Xeon). Christian
  • WARN deprecated npm "Bitte um Hilfe"

    4
    0 Votes
    4 Posts
    985 Views
    OliverIOO
    @pat Zur Information warum request deprecated ist kannst du hier lesen https://github.com/request/request/issues/3142 Grundsätzlich ist Request immer noch eine hervorragende Bibliothek, welche durch Iobroker ebenfalls noch verwendet wird. Daher musst du eigentlich nichts umstellen. Wenn dich diese Warnmeldungen wirklich stören, musst du die verwendete Bibliothek von Request auf beispielsweise Axios umstellen https://www.npmjs.com/package/axios
  • [gelöst] Script setzt keine states

    4
    0 Votes
    4 Posts
    129 Views
    jmeister79J
    @gaspode danke @Ro75 Danke Ich bin sooo dumm. Hatte mich über die Roten einträge geärgert... 1000 Dank
  • Gelöst: Trigger mit mehreren Auslösern

    5
    0 Votes
    5 Posts
    399 Views
    S
    @paul53 Vielen Dank, du hast Recht, so ist es wirklich besser. Bei nur einem Code hatte es gut geklappt. Ich hatte dann noch ein paar andere RFCodes mit anderen Aktionen in das Script aufgenommen und nur mit der "dp.state.val == " Variante klappt das wirklich sauber.
  • Comparetime mit GMT Zeiten

    3
    0 Votes
    3 Posts
    131 Views
    W
    @liv-in-sky Danke für den Tipp mit dem umrechnen in GMT, ich bin aber ehrlich gesagt ein Freund von Programmcode, bei dem ich auch nach einem halben Jahr noch auf den ersten Blick sehe, was da eigentlich passiert. Ich habe das jetzt wie folgt gelöst (könnte man natürlich auch als Einzeiler screiben): var Now = new Date(); console.log("GMT " + formatDate(GMT(Now), "YYYY.MM.DD_hh:mm")); console.log("MEZ " + formatDate(Now, "YYYY.MM.DD_hh:mm")); var CompareMEZ = compareTime("12:00", "14:00", "between") var CompareGMT = CompareTimeGMT("12:00", "14:00", "between"); console.log("CompareGMT " + CompareGMT + " CompareMEZ " + CompareMEZ); function GMT(Time){ var TimeNumber = Number(Time); var TimeOffset = Time.getTimezoneOffset(); // Minuten, negativ: -60 Winter, -120 Sommer return new Date(TimeNumber + TimeOffset * 60 * 1000); } function CompareTimeGMT(startTime, endTime, operation){ var NowGMT = GMT(new Date()); return(compareTime(startTime, endTime, operation, NowGMT)); } Das Ergebnis ist: 14:47:27.957 info javascript.0 (1498) script.js.Programmieren.Zeiten.gmt: GMT 2023.04.07_12:47 14:47:27.957 info javascript.0 (1498) script.js.Programmieren.Zeiten.gmt: MEZ 2023.04.07_14:47 14:47:27.958 info javascript.0 (1498) script.js.Programmieren.Zeiten.gmt: CompareGMT true CompareMEZ false
  • Trigger zum einschalten -nur 1x

    11
    0 Votes
    11 Posts
    661 Views
    O
    @codierknecht :+1: Versuch ich, alles zum gleichen Thema an einen Platz, z.B. alles was beim sonnenuntergang passieren soll. einiges davon soll aber vorher schon durch Mensch oder andere Einflüsse ausgeschaltet werden können. und die Scripte sollen ja auch nicht zu riesig werden und lesbar bleiben. Werd mir mal überlegen doch einige zusammenzulegen. Alternativ mach ich shift -10 Minuten schedule({astro: "solarNoon", shift: -10}, async function () {
  • nspanel script: state im alias bleibt 0

    10
    0 Votes
    10 Posts
    676 Views
    M
    @tt-tom hier nochmal das Ergebnis vom log: javascript.0 2023-04-03 21:30:03.740 info script.js.NSPanel.Muell_JS: Bio = true javascript.0 2023-04-03 21:30:03.740 info script.js.NSPanel.Muell_JS: Event2 = %Bioabfallbehaelter % javascript.0 2023-04-03 21:30:03.739 info script.js.NSPanel.Muell_JS: Wert = true javascript.0 2023-04-03 21:30:03.739 info script.js.NSPanel.Muell_JS: Event2 = %Wertstoffbehaelter % javascript.0 2023-04-03 21:30:03.738 info script.js.NSPanel.Muell_JS: Rest = true javascript.0 2023-04-03 21:30:03.738 info script.js.NSPanel.Muell_JS: Event2 = %Restabfallbehaelter % javascript.0 2023-04-03 21:30:03.737 info script.js.NSPanel.Muell_JS: Papier = true javascript.0 2023-04-03 21:30:03.735 info script.js.NSPanel.Muell_JS: Event2 = %Papierbehaelter %
  • [gelöst] Wer hat Inhalt eines Datenpunkt geändert

    9
    0 Votes
    9 Posts
    502 Views
    O
    @ostseeskipper Ich hab das jetzt so gelöst, das jedes Event(Script) das diesen Datenpunkt ändert auch einen zweiten Datenpunkt beschreibt und drin steht wer geändert hat.
  • Emails auswerten, Adapter stürzt ab

    5
    0 Votes
    5 Posts
    386 Views
    M
    @djmarc75 aaah, ich hatte das als Frage verstanden 😅 Das schaue ich mir mal an!
  • Schalter switch über CCU 3 steuern bzw. an / aus schalten

    11
    1
    0 Votes
    11 Posts
    266 Views
    paul53P
    @sk-koeln sagte: Es wird immer wieder auto von Off auf on gesetzt. Mit der Quelle "system.adapter.javascript.0" oder einer anderen Quelle?
  • Variablenverhalten in Funktionen

    javascript
    3
    0 Votes
    3 Posts
    280 Views
    PlasmachefP
    @oliverio Danke für deine Antwort auf meine Anfrage! Ich bin zu 95% in Blockly unterwegs und das deklariert sehr früh die Variablen, was wahrscheinlich auch zu dem Problem führt. Werde mich einlesen in den beigefügten Link und auch mal versuchen mit reinem Skript zu arbeiten um die Deklaration besser beeinflussen zu können. Jetzt habe ich einen roten Faden :-) Du hast mir sehr geholfen ... Danke dir!
  • [Vorlage] Flexibles Timerskript + Vis

    javascript template
    500
    1
    7 Votes
    500 Posts
    124k Views
    D
    Ich werde doch auf mehrfachen :face_with_rolling_eyes: Wunsch meine Änderungen am Timer-Script hochladen. Es ist für mich (maß)geschneidert und auch von mir nur in den Funktionen getestet, die mich interessieren. Ich kann deshalb keine Verantwortung dafür übernehmen, wenn was nicht mehr funktioniert. Angepasst wurde: Einfügen eines Sortier-DP als String, sortiert wird nach dem Eintrag des Feldes, danach nach Zeit Mit Klick auf eine Zeile in der Tabelle wird automatisch der Timer zum Editieren ausgewählt. Ich bekam bei Neuzuordnung des TimerTarget zu einem DP den Eintrag in die Target-Liste erst nach einem Restart des Skripts, das habe ich auch angepasst. Sollte es bei anderen immer schon funktioniert haben, dann habe ich wohl ein Problem gelöst, das ich mir selbst geschaffen habe. In meinem Fall sieht die Timer-Liste jetzt so aus: [image: 1679827530265-cf3f68de-a911-47a1-94c8-0f3d720f6d2d-grafik.png] Allerdings sind zwei Anpassungen notwendig: Einfügen von Code in die View unter Skripte: function selectTimer(idTimer) { var sel = document.getElementById("w00024_multiselect"); sel.value = idTimer; $(sel).change(); } Aber der Code muss an die View angepasst werden: Selektieren des Timer-Select-Elementes im Editierbereich. Dann sieht man die ID des Elementes. Der Name muss in den Code übernommen werden. [image: 1679827915385-89eaae80-5419-4862-9024-beda34bdbd33-grafik.png] Timerskript.zip Widgets.zip Zu den Widgets: Irgendwie bekomme ich die Größe des Zeit-Elemente nicht so schön hin, wie ich es bei anderen hier gesehen habe. Also prüft bitte vorher (und sichert alles), bevor eine Übernahme was zerstört. Das war es dann eigentlich. PS: Ich möchte hier auch auf eine Frage hinweisen, die gestellt habe, weil ich diese "SubView" nicht so in mein System bringe wie ich es mir wünsche. Vielleicht kann mir einer von Euch dabei helfen. https://forum.iobroker.net/topic/63977/viewbackground-in-widged8?_=1679157863135
  • Script funktioniert manchmal nur nach Script Neustart

    4
    0 Votes
    4 Posts
    334 Views
    C
    @bahnuhr Wie gesagt "ne" hab ich auch schon drin gehabt, funktioniert auch. Die "1002" ist eine Zahl, sozusagen der Status für einmal kurz drücken - der springt dann wieder zurück auf "0". Es stimmt was du sagst....die Variable "sender" hat am Anfang "0", ich wollte hier nur eine Ausgabe machen ob er hier im Programm durchkommt bzw ob Sender "0" hat abfragen. Das unten mit dem sender == 6 ist natürlich quatsch, sollte heissen sender > 6. @GombersIOB Das mit der Klammer probiere ich mal..... Komisch ist nur das der Code einwandfrei funktioniert und spätestens nach einem Tag passiert hier gar nix mehr. Script Pause und wieder Play und dann läuft er wieder ohne zu murren für einen weiteren Tag. Hab den Codeteil mit dem "on id" vom Bad mal in der Küche reingenommen....wenns im anderen Raum funktioniert muss es hier ja auch gehen.
  • Mehrere Variablen übergeben (Stapelverarbeitung)

    javascript
    8
    0 Votes
    8 Posts
    634 Views
    paul53P
    @blackforst sagte: Ch0 sind die Werte des Wechselrichters Also "ch1" bis "ch4"? Ohne das kleine "i" in der Ziel-ID wäre es sehr einfach mit einem $-Selektor und replace(): const idsSrc = $('mqtt.0.inverter.HM1500.ch*'); idsSrc.on(function(dp) { if(!dp.id.includes('.ch0.')) { let idDst = dp.id.replace('mqtt.0.inverter.HM1500.ch', 'beckhoff.0.plc.GVL_iobroker.stPhotovoltaik.stPhotoZelle'); setState(idDst, dp.state.val); } }); Mit dem kleinen "i" erstelle zwei Arrays mit je 24 Datenpunkt-IDs in gleicher Reihenfolge. EDIT: Oder verwende für jedes Panel einen eigenen Trigger: $('mqtt.0.inverter.HM1500.ch1.*').on(function(dp) { let idDst = dp.id.replace('mqtt.0.inverter.HM1500.ch1.', 'beckhoff.0.plc.GVL_iobroker.stPhotovoltaik.stPhotoZelle1.i'); setState(idDst, dp.state.val); }); $('mqtt.0.inverter.HM1500.ch2.*').on(function(dp) { let idDst = dp.id.replace('mqtt.0.inverter.HM1500.ch2.', 'beckhoff.0.plc.GVL_iobroker.stPhotovoltaik.stPhotoZelle2.i'); setState(idDst, dp.state.val); }); $('mqtt.0.inverter.HM1500.ch3.*').on(function(dp) { let idDst = dp.id.replace('mqtt.0.inverter.HM1500.ch3.', 'beckhoff.0.plc.GVL_iobroker.stPhotovoltaik.stPhotoZelle3.i'); setState(idDst, dp.state.val); }); $('mqtt.0.inverter.HM1500.ch4.*').on(function(dp) { let idDst = dp.id.replace('mqtt.0.inverter.HM1500.ch4.', 'beckhoff.0.plc.GVL_iobroker.stPhotovoltaik.stPhotoZelle4.i'); setState(idDst, dp.state.val); });
  • Script trigger alle 5 minuten nach wechsel Bewegungsmelder

    3
    3
    0 Votes
    3 Posts
    160 Views
    wendy2702W
    @emil70 danke für deine Antwort. Jetzt wird es spannend, letzte Nacht hat es irgendwann aufgehört und jetzt scheint es wieder wie vorher zu funktionieren.
  • Python3 Skript in Iobroker einbinden

    30
    0 Votes
    30 Posts
    4k Views
    rrov1R
    @fibs Das Python-Skript passt nicht. Zum einen fehlen an verschiedenen Stellen die Einrückungen, wobei ich vermute mal das liegt ein der Einbettung des Codes hier im Forum, zum anderen sind wieder die input()-Funktionsaufrufe drinnen, welche dazu führen, dass das Skript stehen bleibt und auf Eingabe wartet. Ich habe dir noch mal eine Version mit Parametern hier beigelegt: Main.py . Was mir noch aufgefallen ist, du hast jetzt einen vierten Wert den du per input() Abfragst, den habe ich gleich mit als jetzt 4 Parameter eingebaut. Damit brauchst du jetzt auch einen vierten Datenpunkt in ioBroker + einen vierten Parameter im Javascript. Nicht vergessen, sonst geht das nicht.
  • Flexibler Schedule für Rolladensteuerung über Jarvis steuern

    10
    1
    0 Votes
    10 Posts
    749 Views
    M
    @paul53 Danke dir für deine Unterstütztung! Ich werde jetzt deinen Vorschlag so weiterverwenden. :)
  • Was will mir diese Meldung sagen ?

    3
    3
    0 Votes
    3 Posts
    268 Views
    paul53P
    @griessbx sagte: Bekomme aber eine Warnmeldung Im Tab "Protokolle" erhält man weitere Informationen zu den Warnungen. Vermutung: Datenpunkt-Typ passt nicht?
  • $-Selector und Objekte vom Typ: host/instance

    javascript
    1
    0 Votes
    1 Posts
    146 Views
    No one has replied
  • Skript läuft doppelt - wie Zombie abschalten

    10
    0 Votes
    10 Posts
    279 Views
    W
    @bahnuhr Bei mir läut nur eine JS Instanz.

429

Online

32.6k

Users

82.3k

Topics

1.3m

Posts