NEWS
UNSOLVED Javascript "offline" bearbeiten? Cannot extract blockly Code
-
@M-A-X Schon komisch, hatte ich gestern und heute beim Arbeiten an Skripten auch...
Hiermit kann der Code angezeigt werden und zumindest als Javascript gespeichert werden:
Wenn jemand noch ne andere Idee hat, immer her damit
-
@FredF sagte in Javascript "offline" bearbeiten? Cannot extract blockly Code:
Wenn jemand noch ne andere Idee hat, immer her damit
Den XML code kann man so einfach extrahieren, den Namen (und Ordner) des Skripts in Zeile 2 anpassen! Diese Daten dann hier posten damit man schauen kann woran es liegt
const fs =require('fs'); let id = 'script.js.common.Extract'; let data = getObject(id).common.source; const pos = data.lastIndexOf('\n'); if (pos !== -1) { data = data.substring(pos + 3); if(data.indexOf('JTNDeG1sJTIweG1') !== -1) { data = decodeURIComponent(Buffer.from(data, 'base64').toString('utf8')); fs.writeFile('Extract.xml', data, err => { if(err) { return console.log(err); } }); } } console.log(data);
Dann die extrahierten Daten so kopieren
Edit: habe den code so angepasst dass das xml als Extract.xml gespeichert wird
-
@fastfoot sagte in Javascript "offline" bearbeiten? Cannot extract blockly Code:
Edit: habe den code so angepasst dass das xml als Extract.xml gespeichert wird
wenn schon, denn schon, hier wird der JS code auch noch mit gespeichert, als Extract.js
const fs =require('fs'); let id = 'script.js.common.Extract'; let data = getObject(id).common.source; const pos = data.lastIndexOf('\n'); if (pos !== -1) { let jscode = data.substring(0,pos-1); data = data.substring(pos + 3); if(data.indexOf('JTNDeG1sJTIweG1') !== -1) { data = decodeURIComponent(Buffer.from(data, 'base64').toString('utf8')); fs.writeFile('Extract.xml', data, err => { if(err) { return console.log(err); } }); fs.writeFile('Extract.js', jscode, err => { if(err) { return console.log(err); } }); } } console.log(data);
-
@fastfoot sagte in Javascript "offline" bearbeiten? Cannot extract blockly Code:
den Namen (und Ordner) des Skripts in Zeile 1 anpassen!
Blicke ich nicht, das musst du mir genauer erklären...
So habe ich es probiert:const fs =require('Alexa.Anrufmonitor');
Das ist der Log dazu
1.10.2020, 17:55:35.165 [info ]: javascript.0 (29260) Stop script script.js.Test.XML_extrahieren 1.10.2020, 17:58:38.222 [info ]: javascript.0 (29260) Stop script script.js.Test.XML_extrahieren 1.10.2020, 17:58:44.619 [info ]: javascript.0 (29260) Start javascript script.js.Test.XML_extrahieren 1.10.2020, 17:58:44.627 [error]: javascript.0 (29260) script.js.Test.XML_extrahieren: Error: Cannot find module '/opt/iobroker/node_modules/iobroker.javascript/lib/../../Alexa.Anrufmonitor' 1.10.2020, 17:58:44.627 [error]: javascript.0 (29260) at script.js.Test.XML_extrahieren:1:11 1.10.2020, 17:58:44.628 [error]: javascript.0 (29260) script.js.Test.XML_extrahieren: script.js.Test.XML_extrahieren:3 1.10.2020, 17:58:44.629 [error]: javascript.0 (29260) at script.js.Test.XML_extrahieren:3:25
Mir fällt gerade ein, das ich gestern beim Spiegeln von Skripten im JS Adapter einen Pfad eingetragen habe. Die Spripte wurden auch gespiegelt... habe aber nichts dran gemacht. Könnte das die Ursache sein?
-
-
@FredF sagte in Javascript "offline" bearbeiten? Cannot extract blockly Code:
Blicke ich nicht, das musst du mir genauer erklären...
So habe ich es probiert:Sorry, den Pfad in Zeile 1 zu ändern galt für die Version ohne speichern.
die id muss geändert werden, script.js. + Ordnername + . + Skriptname -
@fastfoot
Ok, here we go:
-
@FredF sagte in Javascript "offline" bearbeiten? Cannot extract blockly Code:
Ok, here we go:
Nur das Extract.xml zu posten wäre einfacher gewesen, dafür hatte ich es eingebaut! Ansonsten lässt es sich hier einwandfrei importieren
hast du evtl. Sayit deinstalliert?
EDIT: Sehe einen Zugriffsfehler, keine Ahnung wo er das hinspeichern will, bei mir ist es in /opt/iobroker/Extract.xml und funktioniert fehlerfrei. Evtl diesen Pfad im Skript mit angeben
-
@fastfoot
Hey,
Sorry, war mit dem Junior im Schwimmbad, sonst hätte ich mich früher gemeldet
ALso ich blicke es leider auch nicht. Habe die Zeile 2 geändert inlet id = 'script.js.Temperaturen.ZeitZuLüften';
und es kommt beim zweiten "Speicher" Script der Fehler:
javascript.0 2020-10-01 19:23:38.207 info (14925) script.js.SkriptExtract: {'errno':-13,'code':'EACCES','syscall':'open','path':'Extract.js'} javascript.0 2020-10-01 19:23:38.206 info (14925) script.js.SkriptExtract: {'errno':-13,'code':'EACCES','syscall':'open','path':'Extract.xml'} javascript.0 2020-10-01 19:23:38.203 info (14925) script.js.SkriptExtract: registered 0 subscriptions and 0 schedules javascript.0 2020-10-01 19:23:38.202 info (14925) script.js.SkriptExtract: <xml xmlns="https://developers.google.com/blockly/xml"><variables><variable id="NX%n(s|t2x3hUpzX)v}y">BitteLueften</variable><variable id="FN9@lS]H,(__FQq*$d!A">Aussen javascript.0 2020-10-01 19:23:38.141 info (14925) Start javascript script.js.SkriptExtract
Beim ersten Script kommt folgendes (kann nicht mehr kopieren, da hinten abgeschnitten wird...):
<xml xmlns="https://developers.google.com/blockly/xml"><variables><variable id="NX%n(s|t2x3hUpzX)v}y">BitteLueften</variable><variable id="FN9@lS]H,(__FQq*$d!A">AussenImme
Wie bekommt man es so schön hin, dass bei langen Zeilen im Log das untereinander steht bei mir ist die Zeile so lang, dass ich die nächste mit kopieren muss und das Gefühl habe, dass er es trotzdem abschneidet...
Wenn ich auf "log Herunterladen" drücke kommt folgendes:
2020-10-01 19:23:38.141 - info: javascript.0 (14925) Start javascript script.js.SkriptExtract 2020-10-01 19:23:38.202 - info: javascript.0 (14925) script.js.SkriptExtract: BitteLueftenAussenImmernochWaermertimeoutBitteLueftenFALSETriggernedefaultmihome.0.devices.weather_v1_158d00027347cf.temperaturelogtestTemperatur hat sich geändert, Script startet: GTvalzigbee.0.00158d00025efa37.temperaturevalmihome.0.devices.weather_v1_158d00027347cf.temperatureWenn der Innen > Außen für X MinutentimeoutFalls noch kein Timer läuftEQBitteLueftenFALSElogTimer startentimeout10minlogTimer StartTimer erstelltBitteLueftenTRUElogtestMeldung Telegram: Bitte Lüften, die Innentemperatur beträgt: valzigbee.0.00158d00025efa37.temperature\ndie Außentemperatur beträgt: valmihome.0.devices.weather_v1_158d00027347cf.temperatureAussenImmernochWaermerFALSEFALSEdefaulttextBitte Lüften, die Innentemperatur beträgt: valzigbee.0.00158d00025efa37.temperature\ndie Außentemperatur beträgt: valmihome.0.devices.weather_v1_158d00027347cf.temperaturelogtestTimer läuft schonEQAussenImmernochWaermerFALSEBitteLueftenFALSEFALSEdefaultAußen ist es jetzt wieder wärmer. Fenster zu.AussenImmernochWaermerTRUElogtestAußen ist es jetzt wieder wärmer. Fenster Zu!timeout 2020-10-01 19:23:38.203 - info: javascript.0 (14925) script.js.SkriptExtract: registered 0 subscriptions and 0 schedules 2020-10-01 19:23:38.206 - info: javascript.0 (14925) script.js.SkriptExtract: {'errno':-13,'code':'EACCES','syscall':'open','path':'Extract.xml'} 2020-10-01 19:23:38.207 - info: javascript.0 (14925) script.js.SkriptExtract: {'errno':-13,'code':'EACCES','syscall':'open','path':'Extract.js'}
-
@fastfoot sagte in Javascript "offline" bearbeiten? Cannot extract blockly Code:
hast du evtl. Sayit deinstalliert?
Jupp, das wars... schon länger und vergessen das dieses Script das nutzt. Danke dir.
-
- Ändere im Skript zu /opt/iobroker/Extract.xml bzw. /opt/iobroker/Extract.js
- Du musst aus dem LOG-Fenster des Skript-Editors kopieren, nicht aus dem LOG-TAB, falls das Speichern jetzt immer noch nicht klappt.
-
@fastfoot
Mein Iobroker läuft in einer virtuallen Umgebung. Bin mir gerade nicht sicher, wie ich die Dateien da raus bekomme^^ solange schonmal:Hier aus dem Log des ScriptEditors:
19:35:11.862 info javascript.0 (14925) Stop script script.js.SkriptExtract 19:35:11.933 info javascript.0 (14925) Start javascript script.js.SkriptExtract 19:35:11.940 info javascript.0 (14925) script.js.SkriptExtract: <xml xmlns="https://developers.google.com/blockly/xml"><variables><variable id="NX%n(s|t2x3hUpzX)v}y">BitteLueften</variable><variable id="FN9@lS]H,(__FQq*$d!A">AussenImmernochWaermer</variable><variable type="timeout" id="timeout">timeout</variable></variables><block type="variables_set" id=".tAJ.SM#4%C=e$}v!TGK" x="387" y="-213"><field name="VAR" id="NX%n(s|t2x3hUpzX)v}y">BitteLueften</field><value name="VALUE"><block type="logic_boolean" id=":?$IEB3U$WbG){,19P{2"><field name="BOOL">FALSE</field></block></value><next><block type="comment" id="~pbXrcpHb(rW0xJd$Lb]"><field name="COMMENT">Trigger</field><next><block type="on_ext" id="`QAQQ=;Mv-!s8Xisv`Q["><mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation><field name="CONDITION">ne</field><field name="ACK_CONDITION"></field><value name="OID0"><shadow xmlns="http://www.w3.org/1999/xhtml" type="field_oid" id="x3Az;0]0yDfTN#aGm8{3"><field name="oid">default</field></shadow><block type="field_oid" id="fJE1{[S|hKT$]p%?%]p%"><field name="oid">mihome.0.devices.weather_v1_158d00027347cf.temperature</field></block></value><statement name="STATEMENT"><block type="debug" id="oT;n):)AnZ+:xI~rUI1f"><field name="Severity">log</field><value name="TEXT"><shadow xmlns="http://www.w3.org/1999/xhtml" type="text" id="{bu.{n,(L}xf`/~P_54{"><field name="TEXT">test</field></shadow><block type="text" id="}^2MZ${H[EM,3r55F)*v"><field name="TEXT">Temperatur hat sich geändert, Script startet: </field></block></value><next><block type="controls_if" id="o~?pt_u4s*XtqU`Z69`2"><mutation else="1"></mutation><value name="IF0"><block type="logic_compare" id="!dz)#I7Tj(G/:pWOu#op"><field name="OP">GT</field><value name="A"><block type="get_value" id=";{,(+QkU2IA5ahLhC_BW"><field name="ATTR">val</field><field name="OID">zigbee.0.00158d00025efa37.temperature</field></block></value><value name="B"><block type="get_value" id=";KO!3;j?JeTL!mICB.}N"><field name="ATTR">val</field><field name="OID">mihome.0.devices.weather_v1_158d00027347cf.temperature</field></block></value></block></value><statement name="DO0"><block type="comment" id="bFw@l$0Fm!-qk}S{YQ03"><field name="COMMENT">Wenn der Innen > Außen für X Minuten</field><next><block type="controls_if" id="{@9RQR`h3S{^4F,u)*cd"><mutation else="1"></mutation><value name="IF0"><block type="logic_negate" id="G2-k]hm)8`(hmpxVkVRi"><value name="BOOL"><block type="variables_get" id="|gX5jP?PSPld$)zpp5q:"><field name="VAR" id="timeout" variabletype="undefined">timeout</field></block></value></block></value><statement name="DO0"><block type="comment" id="bMz^T%zW)}k_)*jj4Ky1"><field name="COMMENT">Falls noch kein Timer läuft</field><next><block type="controls_if" id=",.@]!HNMEMI6=2/4D)!O"><value name="IF0"><block type="logic_compare" id="C#t.x4*`xL,4$`!sllp)"><field name="OP">EQ</field><value name="A"><block type="variables_get" id="FAvf^;GU26(]G3w/H1Ve"><field name="VAR" id="NX%n(s|t2x3hUpzX)v}y">BitteLueften</field></block></value><value name="B"><block type="logic_boolean" id="3ui]rdh([_lUGBGrJU(e"><field name="BOOL">FALSE</field></block></value></block></value><statement name="DO0"><block type="debug" id="^z00JlMMNMqWC,Y9CEg0"><field name="Severity">log</field><value name="TEXT"><shadow type="text" id="o.hhPSwcRcS#WPV-lTJo"><field name="TEXT">Timer starten</field></shadow></value><next><block type="timeouts_settimeout" id="V5PJ*,eX}qP)$s%TheU~"><field name="NAME">timeout</field><field name="DELAY">10</field><field name="UNIT">min</field><statement name="STATEMENT"><block type="debug" id="WvB9$WY;fB=*qM(JGs8m"><field name="Severity">log</field><value name="TEXT"><shadow xmlns="http://www.w3.org/1999/xhtml" type="text" id="Tz~]w[#}$ZiSGnN0GA:*"><field name="TEXT">Timer Start</field></shadow><block type="text" id="`m+|3DX[$K6^LNnAay{u"><field name="TEXT">Timer erstellt</field></block></value><next><block type="variables_set" id="qBMEMk#9`MHVln^6NaiI"><field name="VAR" id="NX%n(s|t2x3hUpzX)v}y">BitteLueften</field><value name="VALUE"><block type="logic_boolean" id="A[_;W]rc/aqi6cD3HT9+"><field name="BOOL">TRUE</field></block></value><next><block type="debug" id="-]3.I`b6DG]%vWL6%QI="><field name="Severity">log</field><value name="TEXT"><shadow xmlns="http://www.w3.org/1999/xhtml" type="text" id=",dG*QXcM[^)?4#s+Xl!0"><field name="TEXT">test</field></shadow><block type="text_join" id="2vp|$?WeVVMl:RoIN/;G"><mutation items="7"></mutation><value name="ADD0"><block type="text" id="zke^3|w`m5:$Xl1VCMQ)"><field name="TEXT">Meldung Telegram: </field></block></value><value name="ADD1"><block type="text" id="[^K3H1}u~7-8ddZpKJJ{"><field name="TEXT">Bitte Lüften, </field></block></value><value name="ADD2"><block type="text" id="!;cPz?icO035_RtA7KeH"><field name="TEXT">die Innentemperatur beträgt: </field></block></value><value name="ADD3"><block type="get_value" id="*dYKF)6Mf@UFO^]/=ieP"><field name="ATTR">val</field><field name="OID">zigbee.0.00158d00025efa37.temperature</field></block></value><value name="ADD4"><block type="text_newline" id="^#i`-=!y4c.6jSzcN-tk"><field name="Type">\n</field></block></value><value name="ADD5"><block type="text" id="E6r1Pae=c)]?:memjmd9"><field name="TEXT">die Außentemperatur beträgt: </field></block></value><value name="ADD6"><block type="get_value" id="*,r/Cf)KEkYBz;_*w6qn"><field name="ATTR">val</field><field name="OID">mihome.0.devices.weather_v1_158d00027347cf.temperature</field></block></value></block></value><next><block type="variables_set" id="9qI]ul~s2uRa|Z}nIK3z"><field name="VAR" id="FN9@lS]H,(__FQq*$d!A">AussenImmernochWaermer</field><value name="VALUE"><block type="logic_boolean" id="lfo*Enk*sy.AMLs8`y1i"><field name="BOOL">FALSE</field></block></value><next><block type="telegram" id="|/-TIZT/oIb_+as.0:V)"><field name="INSTANCE"></field><field name="LOG"></field><field name="SILENT">FALSE</field><field name="PARSEMODE">default</field><value name="MESSAGE"><shadow xmlns="http://www.w3.org/1999/xhtml" type="text" id="U@hA8(_QTSFaS!0ujq~b"><field name="TEXT">text</field></shadow><block type="text_join" id="S2~-%2clxm)/_Yw[QcN$"><mutation items="6"></mutation><value name="ADD0"><block type="text" id="Z)Mr42-m7vS#RUqYrE`#"><field name="TEXT">Bitte Lüften, </field></block></value><value name="ADD1"><block type="text" id="~XKNIBD9Mk0+1bue?!X#"><field name="TEXT">die Innentemperatur beträgt: </field></block></value><value name="ADD2"><block type="get_value" id="^Wm5yamavgzT,M:YKLzc"><field name="ATTR">val</field><field name="OID">zigbee.0.00158d00025efa37.temperature</field></block></value><value name="ADD3"><block type="text_newline" id="A6nOQUdLG-z^%B:v?{8="><field name="Type">\n</field></block></value><value name="ADD4"><block type="text" id="2K^?WURd@xn5g/D+?O@2"><field name="TEXT">die Außentemperatur beträgt: </field></block></value><value name="ADD5"><block type="get_value" id="warmXe8vM?w1/e`bDzWl"><field name="ATTR">val</field><field name="OID">mihome.0.devices.weather_v1_158d00027347cf.temperature</field></block></value></block></value></block></next></block></next></block></next></block></next></block></statement></block></next></block></statement></block></next></block></statement><statement name="ELSE"><block type="debug" id="7R0Athvq3vh|fA:#0~(L"><field name="Severity">log</field><value name="TEXT"><shadow xmlns="http://www.w3.org/1999/xhtml" type="text" id=",dG*QXcM[^)?4#s+Xl!0"><field name="TEXT">test</field></shadow><block type="text" id="]j^f#+~[;yUk2{,B6Lv}"><field name="TEXT">Timer läuft schon</field></block></value></block></statement></block></next></block></statement><statement name="ELSE"><block type="controls_if" id="_Pd:hgi%}p$9{([(xH*V"><value name="IF0"><block type="logic_compare" id="1:4r$Xa:K!-K:{J5H-NH"><field name="OP">EQ</field><value name="A"><block type="variables_get" id="b5j;N:}fX0h{HH5Lp#t4"><field name="VAR" id="FN9@lS]H,(__FQq*$d!A">AussenImmernochWaermer</field></block></value><value name="B"><block type="logic_boolean" id="T7R6LW*LC^T|j6]wh#H@"><field name="BOOL">FALSE</field></block></value></block></value><statement name="DO0"><block type="variables_set" id="9lYuqps4Uhduuomv/fTU"><field name="VAR" id="NX%n(s|t2x3hUpzX)v}y">BitteLueften</field><value name="VALUE"><block type="logic_boolean" id="WCh]?BUKoRH=Nm%#}[E2"><field name="BOOL">FALSE</field></block></value><next><block type="telegram" id="9]E;$17Tl/7BT$KnLH.("><field name="INSTANCE"></field><field name="LOG"></field><field name="SILENT">FALSE</field><field name="PARSEMODE">default</field><value name="MESSAGE"><shadow type="text" id="Dr1^bIXGNm$#_RKq6`Ok"><field name="TEXT">Außen ist es jetzt wieder wärmer. Fenster zu.</field></shadow></value><next><block type="variables_set" id="4hL!d2h,CP%DAmJ1{wGU"><field name="VAR" id="FN9@lS]H,(__FQq*$d!A">AussenImmernochWaermer</field><value name="VALUE"><block type="logic_boolean" id="tlbz@++Nyihw2u(/m7BY"><field name="BOOL">TRUE</field></block></value><next><block type="debug" id="+?~TFH!VN=_6`-kDCfph"><field name="Severity">log</field><value name="TEXT"><shadow xmlns="http://www.w3.org/1999/xhtml" type="text" id=",dG*QXcM[^)?4#s+Xl!0"><field name="TEXT">test</field></shadow><block type="text_join" id="z~mfjen-.E4R|v~Md5I}"><mutation items="1"></mutation><value name="ADD0"><block type="text" id="0sDKuV6Y7jnxq6bZZXK?"><field name="TEXT">Außen ist es jetzt wieder wärmer. Fenster Zu!</field></block></value></block></value><next><block type="timeouts_cleartimeout" id="|!MS6zf2yP.||Fu8sVm%"><field name="NAME">timeout</field></block></next></block></next></block></next></block></next></block></statement></block></statement></block></next></block></statement></block></next></block></next></block></xml> 19:35:11.941 info javascript.0 (14925) script.js.SkriptExtract: registered 0 subscriptions and 0 schedules
-
@M-A-X Lässt sich einwandfrei importieren, hast du evtl. Telegram deinstalliert?
-
@fastfoot sagte in Javascript "offline" bearbeiten? Cannot extract blockly Code:
@M-A-X Lässt sich einwandfrei importieren, hast du evtl. Telegram deinstalliert?
Du schreibst oben dass du den mihome(??) nicht mehr hast, hast du den deinstalliert? Dann installieren, Skript abändern und wieder löschen
-
@fastfoot nein... Telegram läuft auch noch in anderen Scripten...
kann ich mein Script auch einfach neu importieren?Ja... mihome komplett deinstalliert... sekunde
Nein. Mihome neu installiert (bleibt gelb, da ich das Hub nicht mehr habe). Keine Änderung leiderEDIT3: Habe jetzt "einfach" in meinem eigenen "Code" von <XML.... bis zum letzten XML> alles kopiert und in ein neues Blockly kopiert. Dieses konnte ich bearbeiten und die mihome Verknüpfungen ändern.
Ich finde es seltsam, dass das so einfach geht, ich aber das identische Blockly nicht öffnen konnte Kann man das irgendwie im Javascript Adapter ändern?
Danke @fastfoot für das "ExtractScript". Ich speicher mir das mal gut weg Vielen vielen Dank für die schnelle kompetente Hilfe -
@M-A-X sagte in Javascript "offline" bearbeiten? Cannot extract blockly Code:
@fastfoot nein... Telegram läuft auch noch in anderen Scripten...
kann ich mein Script auch einfach neu importieren?Ja... mihome komplett deinstalliert... sekunde
Nein. Mihome neu installiert (bleibt gelb, da ich das Hub nicht mehr habe). Keine Änderung leiderJa an den Adaptern liegt es nicht, irgendwie hat es deine Variablen zerschossen, umbenennen half da nichts. Ich habe neue erstellt, so sollte es jetzt funktionieren, musst meine Abkürzungen noch umbenennen Die Variable timeout(jetzt TO) wird übrigens nirgends gesetzt aber du prüfst darauf!
-
Wollte gerade schreiben^^ ich konnte es zwar importieren, aber neu laden brachte den selben Fehler. Mit deinem geht es.. Seltsam, dass meine Variablen so kryptische Zeichen haben im DropDown... daran lag es?
Danke fürs fixen -
@M-A-X sagte in Javascript "offline" bearbeiten? Cannot extract blockly Code:
Wollte gerade schreiben^^ ich konnte es zwar importieren, aber neu laden brachte den selben Fehler. Mit deinem geht es.. Seltsam, dass meine Variablen so kryptische Zeichen haben im DropDown... daran lag es?
Danke fürs fixennein, nicht nur, ich hatte die kryptischen gelöscht aber immer noch den Fehler, deshalb alles neu. Denke du kannst die umbenannten jetzt wieder in die Originale umbenennen, durch das Neuerstellen haben sich die (internen) ID's jetzt geändert. Frag aber nicht wie das passieren konnte, darauf habe ich keine Antwort
-
@fastfoot sagte:
Die Variable timeout(jetzt TO) wird übrigens nirgends gesetzt aber du prüfst darauf!
Die Variable timeout wird mit "Ausführen timeout" gesetzt und mit "stop timeout" auf null zurück gesetzt.
-
@paul53 so sollte es sein. Ich muss ganz ehrlich sagen, dass ich es jetzt auch nicht verstehe, wie das gehen soll (habe das skript vor Monaten mit Hilfe hier im Forum erstellt)? Woher weiß die Variable "timeout" "TO" oder ähnlich, dass die Schleife sie betrifft? Weil sie ehemals genau gleich geschrieben war (timeout)?
EDIT: Ah, die Variable "timeout" wird automatisch erstellt, wenn man eine timeout "Schleife" einfügt, richtig^^?