Skip to content

Skripten / Logik

Hilfe zu JavaScript, Blockly, TypeScript, Node-RED, Scenes und text2command

16.6k Themen 213.8k Beiträge

NEWS

Unterkategorien


  • Hilfe für Skripterstellung mit JavaScript

    2k 49k
    2k Themen
    49k Beiträge
    OliverIOO
    @BertDerKleine Am besten zeigst du mal dein Script, dann kann man bessere Empfehlungen abgeben. Bitte auch mal schreiben warum du aufteilen möchtest obwohl es so funktioniert.
  • Hilfe für Skripterstellung mit Blockly

    7k 79k
    7k Themen
    79k Beiträge
    KPTK
    Hat leider in ioBroker nicht funktioniert. Musste leider auf HomeAssistant umsteigen. Lokale Integration sehr einfach und voll funktionsfähig.
  • Hilfe für Skripterstellung mit Node-RED

    953 13k
    953 Themen
    13k Beiträge
    Marc BergM
    Es gibt in der Verson 1.3.0 einen neuen Node: iob-setObject (Stand 10.02.26 noch beta) Mit dem neuen Node kann man ioBroker-Objektdefinitionen (Metadaten) direkt schreiben und ändern. Hauptfunktionen: Instanz-Konfigurationen ändern - z.B. MQTT publish-Pattern, Intervalle, etc. Objekt-Eigenschaften aktualisieren - Namen, Rollen, Einheiten, Min/Max-Werte ändern es gibt zwei Modi: Merge-Modus : Ändert nur die angegebenen Eigenschaften, alle anderen bleiben erhalten Replace-Modus: Überschreibt das komplette Objekt Typischer Workflow: Objekt mit iob-getobject holen Mit Change-Node gewünschte Properties ändern Mit iob-setobject zurückschreiben
  • Alarm Ansage mit Wiederholung per Script

    Verschoben
    9
    0 Stimmen
    9 Beiträge
    1k Aufrufe
    S
    Hallo Paul, das wars, nachdem ich die variable "count" noch deklariert habe, lauft es. Vielen leiben Dank ….. Gruß Stephan :D
  • Vorschlag: Sammlung von SQL Statements (als Funktionen)

    Verschoben
    13
    0 Stimmen
    13 Beiträge
    4k Aufrufe
    P
    Ehm, wie läuft ne dein Query ohne Wrapper? Kann ich auch nur den DAtenpunktpfad angeben oder muss ich die ID vom SQL Datenpunkt angeben. Oder ist es einfacher den Wrapper zu installieren, nur den hab ich bisher noch nicht gefunden. Gruß und Danke Update: Ich hab es soweit hinbekommen, dass ich Daten vom SQL bekomme. ich musste auf Mysql noch was in der Config ändern, damit die Abfrage lief. wurde das Script eventuel noch erweitert? Von meinen Wärmezähler kommen leider nur Wh, kein kWh. Bei den Geräten müsste man noch einen Parameter übergeben, ob noch mal ein Teiler genommen wird oder nicht. Gruß
  • Beispiel Blockly Szene Kinoabend

    Verschoben
    53
    0 Stimmen
    53 Beiträge
    8k Aufrufe
    dslraserD
    @maverickmu: Vielen Dank für deine ausführlichen Blockly und Beschreibungen, für uns lausige Anfänger ist das TOP. Welchen Bewegungsmelder nutzt du denn mit Helligkeitssensor? Irgendwelche Empfehlungen? Besten Dank ` Ich nutze einen Homematic IP Bewegungsmelder. Nochmal zum Blockly. Das habe ich mir nochmal deutlich vereinfacht und nun alles in einem Script mit nur einem Datenpunkt bzw Trigger. Stelle ich Dir dann hier nochmal zur Verfügung wenn Du willst. In diesem Beispiel wird z.B. die activitie Fernsehen (Harmony Hub) eingeschaltet und 4 Lampen dazu eingeschaltet. Wenn es draussen noch hell genug ist werden die 4 Lampen langsam runter gedimmt und ausgeschaltet. Ist es fast dunkel bleiben die Lampen an. Beim ausschalten lasse ich alle Lampen nochmal kurz anschalten und dann gleichzeitig langsam runter dimmen bis es aus geht. Funktioniert dann über diese Variante mit Alexa und der Fernbedienung. Blockly Export ! ```` <xml xmlns="http://www.w3.org/1999/xhtml"><block type="on_ext" id="55@yN/Bd.4.Zl:.QX]zj" x="-1463" y="-713"><mutation items="1"></mutation> <field name="CONDITION">any</field> <value name="OID0"><shadow type="field_oid" id="W^r22S90au(LBao+qr~s"><field name="oid">harmony.0.Wohnzimmer.activities.currentActivity</field></shadow></value> <statement name="STATEMENT"><block type="controls_if" id="BHRn[yZNyldRzla7iWi7"><mutation elseif="1"></mutation> <value name="IF0"><block type="logic_operation" id="h%Dxc4+M54+:Y,ZSS!*K" inline="false"><field name="OP">OR</field> <value name="A"><block type="logic_operation" id="zurUC)rk{`P`7/7dxFyR" inline="false"><field name="OP">OR</field> <value name="A"><block type="logic_operation" id="2`[;wc8`kHJlgt/2Za[i" inline="false"><field name="OP">OR</field> <value name="A"><block type="logic_compare" id="xj!*G`B.;)@@I^.VIQr!"><field name="OP">EQ</field> <value name="A"><block type="get_value" id="PinJXaZljMe?g,F|^]E{"><field name="ATTR">val</field> <field name="OID">harmony.0.Wohnzimmer.activities.currentActivity</field></block></value> <value name="B"><block type="text" id="51kxO(lGG8,.N0A6^@Rv"><field name="TEXT">BluRay</field></block></value></block></value> <value name="B"><block type="logic_compare" id="4@@0H/HRU6sfS9G*W^}E"><field name="OP">EQ</field> <value name="A"><block type="get_value" id="j[Q[;G#%(tu4KA~[x7r%"><field name="ATTR">val</field> <field name="OID">harmony.0.Wohnzimmer.activities.currentActivity</field></block></value> <value name="B"><block type="text" id="3P5#TeYK[-xPSz3cV^aF"><field name="TEXT">Fernsehen</field></block></value></block></value></block></value> <value name="B"><block type="logic_compare" id="Fb5kAxo|eKv)P]|S72RS"><field name="OP">EQ</field> <value name="A"><block type="get_value" id="_0Ayg286*}@iK@@WN%dk"><field name="ATTR">val</field> <field name="OID">harmony.0.Wohnzimmer.activities.currentActivity</field></block></value> <value name="B"><block type="text" id="woz(;%so1[)7d60NAqQX"><field name="TEXT">Kino</field></block></value></block></value></block></value> <value name="B"><block type="logic_operation" id="Gh`=0F4U%hf~~l7er{(;" inline="false"><field name="OP">OR</field> <value name="A"><block type="logic_compare" id="|uMJ#1pX=_4[jy(5qyaE"><field name="OP">EQ</field> <value name="A"><block type="get_value" id="m)G%c1yy6skVfbi9F74q"><field name="ATTR">val</field> <field name="OID">harmony.0.Wohnzimmer.activities.currentActivity</field></block></value> <value name="B"><block type="text" id="#kMhr(+(Mk+A@v9rU]^_"><field name="TEXT">Musik</field></block></value></block></value> <value name="B"><block type="logic_compare" id="z[/k,V7bq~gnLCkdvD9y"><field name="OP">EQ</field> <value name="A"><block type="get_value" id="|8pT+HunZKa+,BjpF7x1"><field name="ATTR">val</field> <field name="OID">harmony.0.Wohnzimmer.activities.currentActivity</field></block></value> <value name="B"><block type="text" id="k04791`EPUsVdtW?tvkM"><field name="TEXT">Musik mit Verstaerker</field></block></value></block></value></block></value></block></value> <statement name="DO0"><block type="comment" id="]ihiXM{AQ1n4Zd@JWyzJ"><field name="COMMENT">TV System an</field> <next><block type="control" id="*M]#SFj-0gE[Q}k9M(l~"><mutation delay_input="false"></mutation> <field name="OID">hue.0.HueBridge.Fernsehlampe_links.command</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="text" id="w8Q^kn0`oY}}^i,=!cIy"><field name="TEXT">{"on":true,"transitiontime":15}</field></block></value> <next><block type="control" id="-6jM*M75?XM{5+2/5h|F"><mutation delay_input="false"></mutation> <field name="OID">hue.0.HueBridge.Fernsehlampe_rechts.command</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="text" id="/0QMpv*(8@RA2ga43kNj"><field name="TEXT">{"on":true,"transitiontime":15}</field></block></value> <next><block type="control" id="QI.sI|sL5+1]S=g~G:-n"><mutation delay_input="false"></mutation> <field name="OID">hue.0.HueBridge.Sofalampe_links.command</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="text" id="Uh+t..^C2@N_cLtZjx8m"><field name="TEXT">{"on":true,"transitiontime":15}</field></block></value> <next><block type="control" id="wPHLZaP[(AXjY+p/ks.,"><mutation delay_input="false"></mutation> <field name="OID">hue.0.HueBridge.Sofalampe_rechts.command</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="text" id="hz@4Qy1hsL:dc@7fz-^D"><field name="TEXT">{"on":true,"transitiontime":15}</field></block></value> <next><block type="timeouts_settimeout" id="9}K1iD.IuUq[0v`r`)(d"><field name="NAME">timeout2</field> <field name="DELAY">5</field> <field name="UNIT">sec</field> <statement name="STATEMENT"><block type="controls_if" id="@2oGEG@cl2vPv0e+Nsnu"><value name="IF0"><block type="logic_compare" id="0[5bk{tnjNZdIYRCeW%!"><field name="OP">GTE</field> <value name="A"><block type="get_value" id="(3bh%:b04Ay##=#`-Q`="><field name="ATTR">val</field> <field name="OID">hm-rpc.0.000BD5699D50BB.1.ILLUMINATION</field></block></value> <value name="B"><block type="math_number" id="pTgYfGx*?Q;@a`U((IO?"><field name="NUM">325</field></block></value></block></value> <statement name="DO0"><block type="control" id="Qg**c3=*R4mFm;!=dR61"><mutation delay_input="false"></mutation> <field name="OID">hue.0.HueBridge.Wohnzimmer.command</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="text" id="781zFJxu6A`x4]fKs_@8"><field name="TEXT">{"on":false,"transitiontime":70}</field></block></value></block></statement></block></statement></block></next></block></next></block></next></block></next></block></next></block></statement> <value name="IF1"><block type="logic_compare" id="mZ(e!y%u;zBr`EDNt^eA"><field name="OP">EQ</field> <value name="A"><block type="get_value" id="ee4@`gm#qB1`kCGgN5kS"><field name="ATTR">val</field> <field name="OID">harmony.0.Wohnzimmer.activities.currentActivity</field></block></value> <value name="B"><block type="text" id="2`knFCf/j_/RI`idAwYS"><field name="TEXT">PowerOff</field></block></value></block></value> <statement name="DO1"><block type="comment" id="C!d.+KxPoVc}6PEb?lc5"><field name="COMMENT">TV System aus</field> <next><block type="control" id="5NW?MelU:lm#u;7+/y@o"><mutation delay_input="false"></mutation> <field name="OID">hue.0.HueBridge.Fernsehlampe_links.command</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="text" id="B0oAEC6VWkuF(MOgz5%k"><field name="TEXT">{"on":true,"transitiontime":0}</field></block></value> <next><block type="control" id="ESG35IA9ly_DLj-Z,sU%"><mutation delay_input="false"></mutation> <field name="OID">hue.0.HueBridge.Fernsehlampe_rechts.command</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="text" id="6R8IzJ{op;_6K|!.*m+Z"><field name="TEXT">{"on":true,"transitiontime":0}</field></block></value> <next><block type="control" id="{/_0wt!fj4Au:%WOizeh"><mutation delay_input="false"></mutation> <field name="OID">hue.0.HueBridge.Sofalampe_links.command</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="text" id="R_unlu-BXF+}f_5D-H99"><field name="TEXT">{"on":true,"transitiontime":0}</field></block></value> <next><block type="control" id="GMz|Wd~Du0B1{.SC+N#%"><mutation delay_input="false"></mutation> <field name="OID">hue.0.HueBridge.Sofalampe_rechts.command</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="text" id="9icEJ4,c(|i~/?qb}UzR"><field name="TEXT">{"on":true,"transitiontime":0}</field></block></value> <next><block type="timeouts_settimeout" id="O7soMdFm1cRHdi6T=E|W"><field name="NAME">timeout</field> <field name="DELAY">1</field> <field name="UNIT">sec</field> <statement name="STATEMENT"><block type="control" id="`iYsh+k5FEf#Ms@d99Y("><mutation delay_input="false"></mutation> <field name="OID">hue.0.HueBridge.Fernsehlampe_links.command</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="text" id="70gqv-YoRf_F0cH@)?}I"><field name="TEXT">{"on":false,"transitiontime":70}</field></block></value> <next><block type="control" id="!/?03pV_t`2d;CoL=g*2"><mutation delay_input="false"></mutation> <field name="OID">hue.0.HueBridge.Fernsehlampe_rechts.command</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="text" id="8cQWrM+t(qB}V~9W})O*"><field name="TEXT">{"on":false,"transitiontime":70}</field></block></value> <next><block type="control" id="uSf,-cjj0RWH^tAT}@lo"><mutation delay_input="false"></mutation> <field name="OID">hue.0.HueBridge.Sofalampe_links.command</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="text" id="2RT^y;I#)yn_4ccMW)_Q"><field name="TEXT">{"on":false,"transitiontime":70}</field></block></value> <next><block type="control" id="iqTSvh]]_KBO+;=ku%;w"><mutation delay_input="false"></mutation> <field name="OID">hue.0.HueBridge.Sofalampe_rechts.command</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="text" id="Jb%eId72Bm)wU98,Thta"><field name="TEXT">{"on":false,"transitiontime":70}</field></block></value></block></next></block></next></block></next></block></statement></block></next></block></next></block></next></block></next></block></next></block></statement></block></statement></block></xml> Sieht dann so aus… ![3822_bildschirmfoto_2018-10-06_um_08.30.10.png](/assets/uploads/files/3822_bildschirmfoto_2018-10-06_um_08.30.10.png) Einfach die eigenen activities in den CloudAdapter einfügen und im Blockly so benennen wie die eigenen.![](https://uploads.tapatalk-cdn.com/20181005/c333cf731ba1f7f5dd508f1d93a9cc94.jpg)~~![](</s><URL url=)<link_text text="https://uploads.tapatalk-cdn.com/201810 ... a9cc94.jpg">https://uploads.tapatalk-cdn.com/20181005/c333cf731ba1f7f5dd508f1d93a9cc94.jpg</link_text>" />![](https://uploads.tapatalk-cdn.com/20181005/020f3e6cee18f81b4ac66faaa7f899f0.jpg)~~![](</s><URL url=)<link_text text="https://uploads.tapatalk-cdn.com/201810 ... f899f0.jpg">https://uploads.tapatalk-cdn.com/20181005/020f3e6cee18f81b4ac66faaa7f899f0.jpg</link_text>" />~~~~
  • Scripte zeigt andere Werte an bei Objektauswahl

    Verschoben
    2
    2
    0 Stimmen
    2 Beiträge
    308 Aufrufe
    DutchmanD
    Ja leider, das Pop-up zeigt nicht immer den aktuellen Wert. Wen du wissen möchtest was das Script auslöst am besten den Wert im Log ausspucken Dan sieht das das Script den richtigen Sent from my iPhone using Tapatalk
  • [Erledigt] Anfängerhilfe: Zeitsteuerung aus CCU nachbauen

    Verschoben
    7
    0 Stimmen
    7 Beiträge
    700 Aufrufe
    Z
    Super, danke für Eure Hilfe. Wieder etliches dazu gelernt
  • [gelöst] shedule starten und stoppen

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    739 Aufrufe
    smartboartS
    Habs korrigiert… Im ersten Lauf hat es gut geklappt... Denke das wars auch... Gute Idee den clear schedule nach oben zu nehmen um ihn sofort auszulösen... Die Aufzählung nach der Else war natürlich auch unnötig... Danke nochmal... Gesendet von meinem CLT-L09 mit Tapatalk
  • [gelöst] Schleife - alle Geräte eines Adapters "erwischen"

    Verschoben
    10
    1
    0 Stimmen
    10 Beiträge
    2k Aufrufe
    S
    Super, habe genau das gleiche gesucht, werde das heute Abend mal testen.
  • [gelöst] Blockly - hilfe beim Timeout setzen

    Verschoben
    7
    1
    0 Stimmen
    7 Beiträge
    618 Aufrufe
    L
    @paul53: @ltsalvatore: jetzt passt es 100% Bitte das Thema im Betreff des ersten Beitrags als [gelöst] markieren. erledigt ;)
  • [Gelöst] Blockly - Rollo Steuerung Abhängigkeit Tür

    Verschoben
    28
    1
    0 Stimmen
    28 Beiträge
    3k Aufrufe
    B
    Da ja bei mir der Teil mit "nicht zwischen Sonnenaufgang und Sonnenuntergang" warum auch immer nicht funktionierte. Habe ich es jetzt mit einem Datenpunkt "AstroNacht" gelöst. Welcher von einem Extra BLockly aktualisert wird. viewtopic.php?f=21&t=2757&start=220#p181881 Thread ist gelöst ;)
  • [gelöst] Blocky falls aktuelle Zeit zwischen 22 und 6 Uhr

    Verschoben
    14
    0 Stimmen
    14 Beiträge
    3k Aufrufe
    OstfrieseUnterwegsO
    @paul53: @OstfrieseUnterwegs: dass "zwischen 22 - 6 Uhr" nicht klappt. Wirklich ? das war ich nicht :shock: Egal… Hauptsache es funktioniert. Ich hab gefunden, woher die Verwirrung kam. Es gab mal einen https://forum.iobroker.net/viewtopic.php?f=21&t=17431&p=182405&hilit=blockly+zeit+zwischen#p182405 in dem Zeit zwischen Sonnenuntergang und Sonnenaufgang abgefragt werden sollte. Damals hat paul53 den Hinweis mit der Umkehr gegeben.
  • Blockly zwischen Sonnenuntergang und Sonnenaufgang schalten

    Verschoben
    4
    1
    0 Stimmen
    4 Beiträge
    9k Aufrufe
    M
    @paul53: Die Suche im Forum funktioniert wohl nicht ? Lösung: Aktuelle Zeit ist <u>nicht zwischen</u> Aktuelle Zeit von Sonnenaufgang-Ende und Aktuelle Zeit von Sonnenuntergang-Anfang ` Doch, da bin ich auch schon drüber gestolpert. Jetzt habe ich es aber erst mit der Begründung von homecineplexx verstanden. Zuvor dachte ich ich hätte die Themen der anderen Topics falsch verstanden. Danke!!
  • (Gelöst)Warnmeldung im Logfile bezüglich HM Heizkörperthermostat

    Verschoben
    7
    0 Stimmen
    7 Beiträge
    396 Aufrufe
    A
    So! Titel geändert! Ich hoffe das ist jetzt richtig so? Danke auch für die Info zum Verhalten bezüglich Skripteinbindung. Hab das Problem nun gelöst, auf Grund des Tips von dna909 @dna909: Poste mal bitte Dein Script, eigentlich sollte der Datenpunkt vom Typ "Zahl" sein. ` Der Fehler lag am "Text" Baustein. Wollte nur nochmal Danke sagen.
  • [gelöst] http request

    Verschoben
    29
    0 Stimmen
    29 Beiträge
    8k Aufrufe
    Lenny.CBL
    @homecineplexx: mal was anderes. siehst du auf dem 192.168.2.37:8091, den du steuern möchtest, irgendwelche logs? ` Logs in dem Sinne sind da nicht zu holen. ABER, ich habe jetzt was gefunden was auch klappt. var request = require('request'), username = "admin", password = "admin", url = 'http://192.168.2.37:8091/SetState.pl?R16=0&RT16=0', auth = "Basic " + new Buffer(username + ":" + password).toString("base64"); request({ url : url, headers : {'Authorization' : auth} }, function (error, response, body) { log('error: ' + error); log('response: ' + JSON.stringify(response)); log('body: ' + body); } ); erzeugt dann dieses LOG und schaltet auch das Relais im Controler: 08:23:02.308 [info] javascript.0 script.js.Testscripte.Skript1: error: null 08:23:02.310 [info] javascript.0 script.js.Testscripte.Skript1: response: {"statusCode":200,"body":"0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0\n","headers":{"server":"PoolController V.1.6.8","connection":"close","content-type":"text/plain; charset=ISO-8859-1"},"request":{"uri":{"protocol":"http:","slashes":true,"auth":null,"host":"192.168.2.37:8091","port":"8091","hostname":"192.168.2.37","hash":null,"search":"?R16=0&RT16=0","query":"R16=0&RT16=0","pathname":"/SetState.pl","path":"/SetState.pl?R16=0&RT16=0","href":"http://192.168.2.37:8091/SetState.pl?R16=0&RT16=0"},"method":"GET","headers":{"Authorization":"Basic YWxxxx46xxxxaWxxxx=="}}} 08:23:02.310 [info] javascript.0 script.js.Testscripte.Skript1: body: 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0 nochmal danke an alle die so geduldig waren. :D
  • Suche Tipps: Adapter ohne "connected" überprüfen

    Verschoben
    6
    0 Stimmen
    6 Beiträge
    364 Aufrufe
    apollon77A
    Ja, Obj.state.ts - aktueller Zeitstempel letztes Update Obj.state.lc - last changed Zeitstempel Gesendet vom Handy …
  • [gelöst] Philips Hue Lampen Gruppieren

    Verschoben
    9
    0 Stimmen
    9 Beiträge
    2k Aufrufe
    AxelF1977A
    Über den Umweg des Alexa2 Adapters konnte ich es lösen. Danke
  • Wert eines Objektes als Text ausgeben

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    2k Aufrufe
    H
    Es gibt einen Node namens "debug", dieser ist grün. Davon kannst du zwei in deinen Flow ziehen, doppelt draufklicken und dann dort alle Kästchen anhaken. Danach kannst du direkt im Flow sehen welcher aktuelle Status sich entlang des Flows bewegt. Generell sollte dein Flow so aber funktionieren, sofern der Change Node richtig ist.
  • [gelöst]Zufälliges schalten nach Sonnenuntegang

    Verschoben
    16
    0 Stimmen
    16 Beiträge
    2k Aufrufe
    paul53P
    @etproject: Es funktioniert!!! ` Dann markiere bitte das Thema im Betreff des ersten Beitrags als [gelöst].
  • Datenpunkt für die Cloud ohne AN/AUS

    Verschoben
    7
    0 Stimmen
    7 Beiträge
    626 Aufrufe
    padrinoP
    Hi, ich glaube, verschiedene Sätze gehen nur, wenn man IFTTT benutzt. CU, padrino
  • [gelöst]Funktion nur für bestimmten Zeitraum ausführen (Timer)

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    434 Aufrufe
    ChaotC
    Danke! Wieder etwas schlauer :D
  • JSON Tabelle für vis erstellen

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    2k Aufrufe
    D
    Ja, naja, danke scon einmal. Daraus kann man einiges zeihen. Aber so ne richtige Erklärung bzw. ne Art Tutorial ist da nicht enthalten… VG drdoener

544

Online

32.7k

Benutzer

82.4k

Themen

1.3m

Beiträge