Reschi: Funktionsaufruf html + javascript

Blutiger Anfänger... geht los :

<html>
<head>
.
.
.
<title>myAVR-Server</title>

<script src="allg.js" type="text/javascript"></script>

<script language="JavaScript" type="text/javascript">
.
.
.
function setStatus(inp)
{
	checkTimeout();
	if (inp)
	{
		myEth.readState(inp);
		setIdocTextAdd(lang["setStatusOK"]);
	}
}
</script>

</head>
<body onLoad="onloadDo();">
.
.
.
</body>

</html>

Habe hier nur einen Auszug der html-Datei reinkopiert. Mein Problem : Die Funktion setStatus(inp) wird hier definiert, wird aber NIRGENDWO aufgerufen ??? Wenn ich die Funktion rauslösche, funktioniert die Anwendung aber nicht. Vielleicht kann mir jemand auf die Sprünge helfen. Bin eher bei C-Anwendungen zu Hause...hier aber ist momentan Ende. Danke für Antworten.

  1. Hallo Reschi,

    ein Hinweis vorab: Codeblöcke beginnt und beendet man hier im Forum mit einer ~~~ Zeile. Hinter der ersten Zeile gibt man die Sprache an, das ist hier html. Ich habe das für Dich geändert.

    Ich nehme an, dass Du in allg.js bereits gesucht hast?

    Wenn Du setStatus in den Dateien des Projekts nirgends findest, dann könntest Du einmal die Entwicklerwerkzeuge deines Browsers öffnen und es mit Debugging versuchen. Als C-Entwickler weißt Du sicher, was ein Breakpoint ist - das kannst Du in den Entwicklertools auch tun. In Chrome heißt der entsprechende Tab "Quellcode", im Firefox "Debugger". Auf der linken Seite dieses Tabs ist ein Navigator für die Quellcodedateien, suche die HTML-Datei heraus, darin die setStatus-Methode und setze auf der ersten Zeile der Methode einen Breakpoint.

    Wenn Du den Quellcode editieren darfst, kannst Du es Dir auch einfacher machen und als erste Zeile in setStatus das debugger-Statement einfügen. So:

    function setStatus(inp)
    {
       debugger;
       checkTimeout();
       ...
    }
    

    Wenn die Entwicklerwerkzeuge offen sind, wirkt dieses Statement wie ein Breakpoint, dass das Script anhält und Du den Zustand inspizieren kannst. Insbesondere findest Du dann den Aufrufstack (oder Aufrufliste) und kannst schauen, wo der Aufruf herkommt.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Danke für die Antwort... auch in allg.js findet sich ein solcher Aufruf nicht. Beim debugging statement zeigt mir der callstack die Zeile

      
      idoc.document.open();
      
      

      Dort stoppt der script, ich verstehe trotzdem nicht wer und wo mir diese Funktion aufruft ? Es gibt auch noch so eine Funktionsdefinition Funktion setOK(); mit der habe ich genau das gleiche Problem.

      Ich vermute den Fehler bei MIR im grundlegenden Verständnis von js+html. Ablauf und Aufruf wie in C helfen da wahrscheinlich nicht viel weiter. Gruß Reschi

      1. Hallo Reschi,

        willst du mir sagen, dass der Callstack zeigt, dass eine open-Methode aufgerufen wird und diese setStatus aufruft?

        Es gibt im Document-Interface (Teil der JS-Schnittstelle zum Browser) eine open-Methode, die ist aber veraltet und es ist auch nicht bekannt, dass die implizit eine setStatus-Funktion sucht und aufruft. Allerdings steht in deinem Code-Snippet auch das uralte language-Attribut, man muss also mit allen möglichen historischen Relikten rechnen.

        Gehört die open-Methode, deren Aufruf du da findest, zu deinem Projekt? Hat sie Sourcecode oder wird sie als native code angezeigt?

        Was übrigens auch sein kann (ist aber gruseliger Stil): da baut sich irgendwer einen Funktionsnamen als String zusammen und ruft setStatus darüber auf.

        setGlobalProperty("Status", 47);
        ...
        function setGlobalProperty(name, value) {
           const setter = window["set"+name];
           if (setter)
              setter(value)
        }
        

        Das ist eine von vielen ekligen Möglichkeiten.

        Ist deine Seite öffentlich zugänglich? Oder bastelst du im stillen Kämmerlein mit myAVR herum?

        Rolf

        --
        sumpsi - posui - obstruxi
  2. @@Reschi

    Blutiger Anfänger... geht los :

    <html>
    

    Da fehlt was: Als erstes <!DOCTYPE html>, um die Seite im Standard-Modus und nicht im Quirks-Modus zu rendern.

    Außerdem die notwendige Angabe der Sprache des Seiteninhalts: <html lang="de"> für Deutsch; <html lang="en"> für Englisch.

    <head>
    .
    .
    .
    <title>myAVR-Server</title>
    

    In den drei Punkten ist die Angabe <meta name="viewport" content="width=device-width, initial-scale=1.0"/> enthalten, damit die Seite auch auf Smartphones lesbar ist?

    Und auch die Angabe der Zeichencodierung <meta charset="UTF-8"/>?

    <script src="allg.js" type="text/javascript"></script>
    
    <script language="JavaScript" type="text/javascript">
    .
    .
    .
    

    Die Scripte sollten nicht an dieser Stelle stehen, weil sie so das Rendern der Seite verzögern. Gut aufgehoben sind sie ganz unten am Ende des body.

    function setStatus(inp)
    

    Das ist unleserlicher Code. Was bedeutet inp?

    <body onLoad="onloadDo();">
    

    Damit läuft das Script vermutlich erst später als nötig, nämlich erst nach dem Laden sämtlicher Ressourcen auf der Seite, einschließlich Bilder.

    Das Script kann sicher schon früher ausgeführt werden: beim DOMContentLoaded-Event. Dafür gibt’s kein on…-Attribut. Den Eventhandler braucht man aber gar nicht, wenn man das Script am Ende des body notiert, was sowieso ein guter Platz dafür ist, s.o.

    🖖 Live long and prosper

    --
    In our chants of “ICE out now”
    Our city’s heart and soul persists
    Through broken glass and bloody tears
    On the streets of Minneapolis

    — Bruce Springsteen, Streets of Minneapolis
    1. Hallo Gunnar,

      nicht mein Minus, und ich finde das als Tipps für einen Anfänger durchaus in Ordnung.

      Rolf

      --
      sumpsi - posui - obstruxi
    2. @@Gunnar Bittersmann

      <script src="allg.js" type="text/javascript"></script>
      
      <script language="JavaScript" type="text/javascript">
      .
      .
      .
      

      Die Scripte sollten nicht an dieser Stelle stehen, weil sie so das Rendern der Seite verzögern. Gut aufgehoben sind sie ganz unten am Ende des body.

      Und noch vergessen zu erwähnen: type="text/javascript" ist der Default fürs type-Attribut beim script-Element. Kann man also weglassen.

      language="JavaScript" war noch nie zu was gut, sollte man also weglassen.

      🖖 Live long and prosper

      --
      In our chants of “ICE out now”
      Our city’s heart and soul persists
      Through broken glass and bloody tears
      On the streets of Minneapolis

      — Bruce Springsteen, Streets of Minneapolis
      1. Hallo Gunnar,

        language="JavaScript" war noch nie zu was gut

        das nicht, aber language="VBScript" schon. Nämlich um Minenfelder im Browserkrieg anzulegen, indem man im Internet Explorer VBScript als Scriptsprache aktiviert. Das ging vom IE 3 bis zum IE 10 generell und im IE11 immerhin noch, sofern die Seite nicht in der Internet Zone war.

        Ob es jemals eine Internet-Website gab, die VBScript statt JavaScript als Scriptsprache verwendete, ist eine andere Frage. Aber ich wette, dass es Firmen mit Microsoft Monokultur gibt, die seit August 1996 (Einführung von IE 3, der VBScript unterstützte) in ihrem Intranet ein riesiges Ökosystem mit VBScript aufgebaut haben. Bis Oktober 2026 müssen sie es los sein, dann ist End-Of-Life für Windows Server 2022, der den IE11 noch unterstützt.

        Ich weiß, wovon ich rede, so eine Monokultur hatten wir auch, aber immerhin waren wir schlau genug, die Finger von VBScript-Webseiten zu lassen.

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Hi,

          Ich weiß, wovon ich rede, so eine Monokultur hatten wir auch, aber immerhin waren wir schlau genug, die Finger von VBScript-Webseiten zu lassen.

          Ihr habt stattdessen voll auf .hta gesetzt?!!! 😀

          cu,
          Andreas a/k/a MudGuard

          1. Hallo MudGuard,

            der Punkt und das t stimmen…

            Rolf

            --
            sumpsi - posui - obstruxi
            1. Danke für die vielen Ratschläge....Ja mit myavr bin ich im stillen Kämmerlein zu Hause. Über myavr habe ich einen Webserver mit Mikrocontrolleranbindung gekauft. Dort sind Beispielanwendungen mit dazu. Damit will ich übers Internet auf Mikrocontrolleranwendungen zu Hause zugreifen. Das funktioniert mit den Beispielanwendungen auch wie gewünscht. Jetzt wollte ich über Kopieren/Einfügen die html/Javascript-Beispielanwendung für mich modifizieren (ohne Bilder oder bunten Schickimicki). Wollte mich also nicht tiefgründig mit der html/javascript-Programmierung befassen. Jetzt muss ich feststellen, dass dies doch nicht so einfach ist. Eine Funktionsdefinition deren Aufruf ich dann in sämtlichen Datein nicht finde...ist da eben ein solches Problem.

              1. Hi there,

                Wollte mich also nicht tiefgründig mit der html/javascript-Programmierung befassen. Jetzt muss ich feststellen, dass dies doch nicht so einfach ist.

                Ja, das ist das Teuflische. Javascript sieht halt über weite Strecken nur aus wie C. Wobei man sagen muß, eine Funktion, von der sich nicht feststellen lässt, woher sie aufgerufen wird, wäre auch in C ein ziemliches Problem.

                Naja, dafür hast Du ja hier erfahren, daß wie wichtig ein DOCTYPE ist und dass das Language-Attribut bei einer Microcontrollerprogrammierung wahnsinnig wichtig ist versteht sich auch von selbst. Ganz zu schweigen davon, wie wichtig ein Viewport ist für den Fall, daß der Microcontroller einmal von einem Handy aus programmiert wird. Und daß ein Code komplett unleserlich wird, wenn ein Parameter "inp" heisst (was könnte denn das auch heissen, hm hm?), das hättest Du wirklich auch von der C-Programmierung her wissen können.

                Jetzt mal im Ernst - kann man sich das irgendwo anschauen? Ich vermute eher nicht, oder?

                1. Hier ist mal der komplette Code:

                  <html>
                  <head>
                  <title>myAVR-Server</title>
                  <meta name="author" content="www.myAVR.de">
                  <meta http-equiv="expires" content="8640000">
                  <link rel="stylesheet" href="../allg/myweb.css" type="text/css">
                  <script src="../allg/allg.js" type="text/javascript"></script>
                  <script language="JavaScript" type="text/javascript">
                  //### Translation Array for JS-Script functions ###
                  var lang=new Array();
                  lang["setStatusOK"]			="aktuelle Daten anzeigen";
                  lang["setStatusERR"]		="Fehler beim Abfragen!";
                  lang["verifyCFG"]			="Verifiziere Konfiguration";
                  lang["plsWait"]				="Bitte warten...";
                  lang["sendRequest"]			="Sende Abfrage";
                  lang["timeoutRequest"]		="Timeout beim Abfragen!";
                  //### JS-Script ###
                  var leds = new Array(0,0);
                  //iframe object
                  var idoc = 0;
                  var idocTmp='<html><body style="font-family:monospace;font-size:10pt;padding-left:2px;margin:0;">text</body></html>';
                  var idocTxt="";
                  
                  var aktiv = 0;	//timeout check
                  
                  function checkTimeout(typ)
                  {
                  	if (typ)
                  	{
                  		if (aktiv==0)
                  			aktiv = window.setTimeout("iframeTimeout()",10000);
                  	}
                  	else
                  	{
                  		window.clearTimeout(aktiv);
                  		aktiv=0;
                  	}
                  }
                  function setStatus(inp)
                  {
                  	checkTimeout();
                  	if (inp)
                  	{
                  		myEth.readState(inp);
                  		setIdocTextAdd(lang["setStatusOK"]);
                  	}
                  	else
                  	{
                  		setIdocText(lang["setStatusERR"]);
                  		showButtons();
                  		return;
                  	}
                  	//gruene led an?
                      if (myEth.pin[20].aVal==1)
                      {
                          $("imgledg").style.zIndex="2";
                          leds[0]=1;
                      }
                      else
                      {
                          $("imgledg").style.zIndex="0";
                          leds[0]=0;
                      }
                      //rote led an?
                      if (myEth.pin[21].aVal==1)
                      {
                          $("imgledr").style.zIndex="2";
                          leds[1]=1;
                      }
                      else
                      {
                      	$("imgledr").style.zIndex="0";
                          leds[1]=0;
                      }
                  	showButtons();
                  }
                  function setOK()
                  {
                  	checkTimeout();
                  	setIdocTextAdd(lang["verifyCFG"]);
                  	checkTimeout(1);
                  	setTimeout('setIdocSrc("exethled/eth_leds.htm")',500);
                  }
                  function switchLED(pinnr,id)
                  {
                  	showButtons(1);
                  	setIdocText(lang["plsWait"]);
                  	if(leds[pinnr-20]==0)
                  		leds[pinnr-20]=1;
                  	else
                  		leds[pinnr-20]=0;
                      var led="../allg/setpin.htm?myChangeCmd=%B0o"+pinnr+"%7E"+leds[pinnr-20]+"%B0";
                  	showButtons(1);
                  	checkTimeout(1);
                  	setTimeout('setIdocSrc("'+led+'")',500);
                  }
                  //buttons anzeigen/ausblenden
                  function showButtons(typ)
                  {
                  	switch(typ)
                  	{
                  		case 1:
                  			onoff("btnGreen");onoff("btnGreenDisabled",1);onoff("btnRed");onoff("btnRedDisabled",1);		
                  			break;
                  		default:
                  			onoff("btnGreen",1);onoff("btnGreenDisabled");onoff("btnRed",1);onoff("btnRedDisabled");		
                  			break;
                  	}
                  }
                  //globales idoc obj
                  function setIdocSrc(url)
                  {
                  	setIdocTextAdd(lang["sendRequest"],1);
                  	$("statusframe").src=url+"&"+(Math.round(Math.random()*1000000));
                  }
                  function setIdocText(text)
                  {
                  	text=idocTmp.replace(/text/,text);
                  	idoc.document.open();
                  	idoc.document.write(text);
                      idoc.document.close();
                  }
                  function setIdocTextAdd(text,clear)
                  {
                  	if (clear)
                  		idocTxt="";
                  	idocTxt+=text+"<br>";
                  	text=idocTmp.replace(/text/,idocTxt);
                  	idoc.document.open();
                  	idoc.document.write(text);
                      idoc.document.close();
                  }
                  function iframeTimeout()
                  {
                  	window.clearTimeout(aktiv);
                  	setIdocText('<span style="color:red;">'+lang["timeoutRequest"]+'</span>');
                  	showButtons();
                  }
                  
                  var test="°c0°";
                  function onloadDo()
                  {
                  	if (!idoc)
                  		idoc=$F("statusframe");
                      initmyEth();
                      myEth.checkWeb();
                      if (myEth.active)
                      {
                  		showButtons(1);
                  		setIdocText(lang["plsWait"]);
                  		checkTimeout(1);
                          setTimeout('setIdocSrc("exethled/eth_leds.htm")',50);
                      }else
                          onoff("noethweb",1);
                      var test="";
                      doRequest(test);
                  }
                  </script>
                  <style type="text/css">
                  button {padding:3px;margin:5px;}
                  </style>
                  </head>
                  
                  <body onLoad="onloadDo();">
                  
                  <table cellpadding="0" cellspacing="0" id="main">
                      <tr valign="top"><td class="bordl logo">
                          <a href="index.htm" class="logoa" title="Zur Startseite">
                          <span class="logo1">myAVR</span><br><span class="logo2">myEthernet</span>
                          </a>
                      </td><td class="bordr headline">
                          <span class="mainhl">LED Ansteuerung</span>
                          <span id="noethweb" class="warn"><br>Es konnte kein aktiver myEthernet-Webserver gefunden werden!</span>
                      </td></tr>
                      <tr style="height:10px;"><td></td><td></td></tr>
                      <tr valign="top"><td class="navi bordl">
                          <a href="mystate.htm" title="Aktueller Status myEthernet">Status</a>
                          <a href="setup.htm" title="myEthernet konfigurieren">Konfiguration</a>
                          <a href="techdoc.htm" title="Technische Dokumentation zum myEthernet">Technische Doku</a>
                          <a href="example.htm" title="Bilder und Anwendungsbeispiele">Bsp-Anwendungen mit:</a>
                          <a style="margin-left:25px;" href="exusb.htm">myAVR Board MK 2</a>
                          <a style="margin-left:25px;" href="extemps.htm">Temperatursensor</a>
                          <a class="curr" style="margin-left:25px;" href="exethled.htm">Status-LEDs</a>
                          <a style="margin-left:25px;" href="exledmat.htm">LED-Matrix</a>
                          <a style="margin-left:25px;" href="exrameep.htm">Ram und Eeprom</a>
                          <a href="kontakt.htm" title="Kontakt" style="margin-top:2em;">Kontakt</a>
                          <a href="shinweis.htm" title="Allgemeine Sicherheitshinweise">Sicherheitshinweise</a>
                      </td><td class="page bordr">
                      <h4>Steuerung der Status-LEDs</h4>
                      <p>
                          <img src="../pic/led_aus.jpg" alt="Anwendungsbeispiel LEDs schalten" title="Anwendungsbeispiel LEDs schalten"
                              width="280" height="160" style="z-index:1;position:relative;left:0;">
                          <img src="../pic/led_r.jpg" alt="" title="LED rot" id="imgledr"
                              style="z-index:0;position:relative;left:-127px;top:-65px;">
                          <img src="../pic/led_g.jpg" alt="" title="LED gr&uuml;n" id="imgledg"
                              style="z-index:0;position:relative;left:-194px;top:-65px;">
                          <span class="plcom">myEthernet Status-LEDs</span><span id="stathqload1" class="plstat"></span>
                          <br style="clear:both;"><br>
                          Die Status-LEDs werden durch die Firmware des myEthernet-Webservers in der Initialisierungsphase benutzt.
                          Die gr&uuml;ne LED signalisiert Betriebsbereitschaft und die rote LED Fehler beim Hochfahren des Webservers.
                          Nach der Initialisierung k&ouml;nnen die LEDs durch den Anwender benutzt werden. Sollten Betriebsfehler durch
                          die Firmware erkannt werden, ist die Firmware dominant und schaltet die rote LED zu.
                          <br><br>
                          <a id="btnGreen" href="javascript:switchLED(20);" class="zoom" style="padding:4px;" title="Gr&uuml;ne LED schalten">Gr&uuml;n</a>
                          <a id="btnGreenDisabled" class="zoom" style="padding:4px;display:none;background-color:#CCC" title="Gr&uuml;ne LED schalten">Gr&uuml;n</a>
                          <a id="btnRed" href="javascript:switchLED(21);" class="zoom" style="padding:4px;" title="Rote LED schalten">Rot</a>
                          <a id="btnRedDisabled" class="zoom" style="padding:4px;display:none;background-color:#CCC" title="Rote LED schalten">Rot</a><br><br>
                  		<iframe class="statusframe" id="statusframe" name="statusframe" frameborder="0" style="border:0;height:35px;"></iframe>
                      </p>
                      </td></tr>
                  </table>
                  
                  </body>
                  </html>
                  

                  Wo wird hier setStatus(inp) und setOK() aufgerufen ???

                  1. Hier mal noch ein Link, wo man frei auch sämtliche Dateien runterladen kann : https://shop.myavr.de/Systemboards und Programmer/myEthernet 64k.htm?sp=article.sp.php&artID=100065

                    1. Hallo Reschi,

                      das hat geholfen.

                      Das Konstrukt, was AVM da baut, ist (a) ziemlich wild und (b) verwendet steinalte Techniken. Sie binden einen iframe auf der Seite ein (damit lädt man ein HTML Dokument in einen isolierten Unterbereich der Seite) und dieser iframe ruft setStatus auf.

                      Welches HTML Dokument darin geladen wird, ist nicht direkt erkennbar, dazu muss man den Aufruf der setIdocSrc-Funktion finden und schauen, welche URL ihr übergeben wird. Es sieht so aus, als passiere das nicht nur einmal, sondern für jede Aktion mit dem Mikrocontroller erneut. Brrrrr.

                      Jedenfalls führt das Beispiel-HTML mit dem iframe einen lebhaften Dialog.

                      Beispiel: exethled.htm enthält in onLoadDo:

                      function setOK()
                      {
                          setIdocText(lang["plsWait"]);
                      		checkTimeout(1);
                          setTimeout('setIdocSrc("exethled/eth_leds.htm")',50);}
                      

                      Der iframe hat initial keinen Inhalt, das macht aber nichts. setIdocText baut ein minimales HTML-Fragment zusammen, besteht aus dem Template in idocTpl und dem String in lang['plsWait'], und schreibt das mit document.write in den iframe. Brr. Dafür gibt's seit 2012 das srcdoc-Attribut.

                      Die checkTimeout-Funktion ist eklig, sie verhält sich unterschiedlich, ob sie mit einem falsy- oder truthy-Wert aufgerufen wird (falsy und truthy kennst Du aus C - 0 oder NULL ist wie false, alles andere ist wie true). Ohne explizte Parameterübergabe ist der Parameterwert undefined, das ist falsy, und in dem Fall wird ein existierender Timeout gelöscht. Übergibt man 1, wird ein Timer mit 10s Laufzeit gestartet.

                      Danach wird mit setTimeout ein 50ms Timer gestartet und wenn der abgelaufen ist, wird 'setIdocSrc("exethled/eth_leds.htm")' ausgeführt. Ebenfalls Code von 1999 - heute würde man die Funktion übergeben und die Parameter von setTimeout durchreichen lassen:

                      setTimeout(setIdocSrc, 50, "exethled/eth_leds.htm");
                      

                      Die setIdocSrc-Funktion setzt das src-Attribut des iframe, lädt also ein neues Dokument: "exethled/eth_leds.htm".

                      Und wenn Du da hinein schaust, findest Du

                      parent.setStatus(test)
                      

                      wobei test dieser komische PPin-String ist, der vermutlich nur vom Controller verstanden wird.

                      Da iframe und Beispielseite vom gleichen Origin kommen, ist der Zugriff mit parent auf das Elterndokument erlaubt und es wird setStatus aufgerufen.

                      Mann mann mann, und für so einen obsoleten Dreck bezahlt man Geld 😕 Aber um es modern neu zu schreiben, muss man erstmal ordentlich Zeit investieren, um alles zu verstehen.

                      Rolf

                      --
                      sumpsi - posui - obstruxi
                    2. Hallo Reschi,

                      und jetzt habe ich nach einem Blick in die tb_myeth.pdf auch verstanden, warum ich bisher nichts verstanden habe.

                      Der Webserver reagiert auf das ° Zeichen in Requests und Responses und führt dementsprechend Aktionen auf dem Controller aus oder stellt Informationen bereit. Ob das jetzt gutes Design ist oder ob man besser eine explizte URL für Get- und Set-Operationen erstellt hätte, bleibe dahingestellt.

                      Aber wenn man sich die Fußleiste des PDF anschaut und dort "© Laser & Co. Solutions GmbH – 11/2008" findet, dann bin ich beeindruckt, dass das Teil 18 Jahre auf dem Markt überlebt hat.

                      Beispielsweise findet man in exethlet.htm dies

                      var led="../allg/setpin.htm?myChangeCmd=%B0o"+pinnr+"%7E"+leds[pinnr-20]+"%B0";
                      

                      Wenn man setpin.htm anschaut, steht da nur

                      <html><head>
                      <script language="JavaScript" type="text/javascript">
                      function onloadDo()
                      {
                      	parent.setOK();
                      }
                      </script>
                      </head><body onLoad="onloadDo();" style="background-color:green"></body></html>
                      

                      setpin.htm tut nichts weiter als setOK im Parent-Dokument aufzurufen und ihm damit zu bestätigen, dass die Aktion durch ist.

                      Und dann folgt ein Abruf von exethled/eth_leds.htm. Schaut man sich das an, findet man obskures:

                      <html><head>
                      <script language="JavaScript" type="text/javascript">
                      var test="PPIN=20=°v20°;°c20°;°C20°\n"
                      +"PPIN=21=°v21°;°c21°;°C21°\n";
                      function onloadDo()
                      {
                      	parent.setStatus(test);
                      }
                      </script>
                      </head><body onLoad="onloadDo();" style="background-color:green"></body></html>
                      

                      Was passiert, ist, dass der Webserver beim Ausliefern dieser Miniseite die diversen °...°-Sequenzen durch Werte des Controllers ersetzt und dadurch die setStatus-Methode der Webseite mit sinnvollen Werten aufgerufen wird.

                      Ich bin sicher, dass sich dieses krude iframe-Pingpong-Design durch moderne fetch-Techniken ersetzen lässt. Was für einen Anfänger kein Spaß ist. Oder gerade doch? Was AVM da gebaut hat, ist Material für Uralt-Browser.

                      Aber vermutlich sind die Wartezeiten, die in den Beispielen eincodiert sind, aber kein Zufall, der Mikrocontroller wird Zeit brauchen, um die Befehle zu verarbeiten und die Ersetzungen durchzuführen.

                      Rolf

                      --
                      sumpsi - posui - obstruxi
                  2. Hi there,

                    Hier ist mal der komplette Code:

                    Inhalt deleted...
                    

                    </html>

                    Wo wird hier setStatus(inp) und setOK() aufgerufen ???
                    

                    Vermutlich in einem skript, das von allg.js geladen wird. Das was Du da gepostet hast ist ja nur ein kleiner Ausschnitt der "vordersten Front", also das, was der Anwender zu sehen bekommt. Der obige Code wird ja bereits dynamisch erzeugt. sonst würde die Zeile: <span id="noethweb" class="warn"><br>Es konnte kein aktiver myEthernet-Webserver;gefunden werden!</span> keinen Sinn machen. Das ist einfach die HTML-Ausgabe die generiert wird, wenn eben kein myEthernet-Webserver gefunden werden kann. Mein Künstlicher Intelligenzler des geringsten Mißtrauens ist der gleichen Meinung - hier seine vollständige Antwort:

                    Die myAVR‑„Steuerungs- und Programmierumgebung“ (insbesondere die alten myAVR Workpad / mySmartUSB Webserver‑Interfaces) hat eine extrem primitive, proprietäre Skriptumgebung. Dort läuft kein normales Browser‑JavaScript, sondern eine Art eingebettete Skriptmaschine, die:

                    bestimmte Funktionsnamen automatisch bereitstellt,

                    diese Funktionen implizit aufruft, wenn bestimmte Ereignisse passieren,

                    und die Skripte aus Dateien wie allg.js, allg.htm, steuerung.js, etc. lädt.

                    Das heißt:

                    setStatus() und setOK() werden nicht vom sichtbaren Code aufgerufen, sondern vom myAVR‑Server selbst.

                    Das ist der Grund, warum sie „nirgends“ im Code auftauchen und trotzdem zwingend benötigt werden.

                    🧭 Warum sieht man die Aufrufe nicht? Weil die myAVR‑Umgebung intern so funktioniert:

                    1. Der Server lädt das Skript und sucht nach bestimmten Funktionsnamen Beispiele aus alten Dokumentationen:

                    setStatus(text)

                    setOK()

                    setError(code)

                    setData(data)

                    setReady()

                    Wenn diese Funktionen existieren, werden sie automatisch aufgerufen, sobald der Server:

                    eine Antwort an den Client schickt,

                    einen Statuswechsel meldet,

                    eine OK‑Rückmeldung gibt,

                    oder ein Gerät eine Aktion abgeschlossen hat.

                    1. Die Aufrufe passieren in der Firmware, nicht im JavaScript Das ist der Grund, warum du im Code keinen einzigen setStatus(...)‑Aufruf findest.

                    2. Fehlen die Funktionen, bricht die Umgebung ab Weil die Skriptmaschine erwartet, dass sie existieren. Wenn nicht, kommt es zu:

                    „undefined function“

                    „script error“

                    oder die Anwendung bleibt einfach stehen.

                    🧨 Warum wirkt der Code „grottenschlecht“? Weil er nicht für einen Browser geschrieben wurde, sondern für eine Pseudo‑JavaScript‑Engine aus ca. 2004–2008, die:

                    kein DOM kennt,

                    kein echtes Event‑System hat,

                    keine Module unterstützt,

                    und nur ein paar primitive Funktionen bereitstellt.

                    Viele dieser Skripte wurden damals aus C‑Code heraus generiert oder von Leuten geschrieben, die eigentlich Mikrocontroller programmiert haben, nicht Web‑UIs.

                    • was hast Du eigentlich vor damit...?
                    1. Danke für die Ausführungen...habe es so in etwa verstanden und muss feststellen, dass DIESE Programmierung meinen Horizont übersteigt....

                      Was ich eigentlich im Sinn hatte, wurde weiter oben bereits gesagt. Mikrocontroller in C zu programmieren nenne ich mal ziemlich "Hardware-nah". Auf Signalzustände von solchen Steuerungen über das Internet zuzugreifen und auch zu ändern war mein Wunsch. Der oben genannte recht kostengünstige (wenn auch nach eurer Meinung veralteter) Webserver schien mir dafür die Lösung. Vielleicht kann mir ja hier in der Runde jemand einen völlig anderen Ansatz nennen, über den es sich lohnt reinzuarbeiten ?

                      1. Hi there,

                        Danke für die Ausführungen...habe es so in etwa verstanden und muss feststellen, dass DIESE Programmierung meinen Horizont übersteigt....

                        das kann ich mir nicht vorstellen. Ungewohnt vielleicht aber im Prinzip eigentlich simpel.

                        Was ich eigentlich im Sinn hatte, wurde weiter oben bereits gesagt. Mikrocontroller in C zu programmieren nenne ich mal ziemlich "Hardware-nah". Auf Signalzustände von solchen Steuerungen über das Internet zuzugreifen und auch zu ändern war mein Wunsch. Der oben genannte recht kostengünstige (wenn auch nach eurer Meinung veralteter) Webserver schien mir dafür die Lösung. Vielleicht kann mir ja hier in der Runde jemand einen völlig anderen Ansatz nennen, über den es sich lohnt reinzuarbeiten ?

                        Naja, ich frage, welche Funktionen Du da benötigst. Wenn's nur um die Signalzustände geht, dann könnte man sich ja einen Wrapper vorstellen, den man einfach zusätzlich einbindet und der die paar Funktionen mit den entsprechnden Parametern aufruft. Wobei das mit dem "Einbinden" etwas "tricky" werden könnte, wenn das alles, was da daherkommt, vom Server kommt, dann wären alle Änderungen, und "etwas "Einbinden" wäre eine solche Änderung, beim nächsten Aufruf wieder weg.

                        Ich hab mit dieser Hardware nie etwas zu tun gehabt, aber vielleicht wird da ja noch eine zusätzliche Schnittstelle zur Verfügung gestellt, dann könnte man die grottenschlechte eingebaute Javascriptprogrammierung auf andere Art und Weise umgehen. Ich meine, der vorinstalliertem Webserver muß ja auf irgendetwas "lauschen".

                        Ich hab mir mal die Doku überblättert, da steht ja, wie Du auf den Webserver einen Request machen kannst. Mit "http://192.168.20.98/?myChangeCmd=%B0o21%7E0%B" bspw. kannst Du die rote LED an PIN 21 ausschalten. Theoretisch könntest Du vermutlich Deine Befehle sogar mit einem Tool wie Postman Deine Befehle an den Server schicken. Oder, wenn Du Dich da auskennst, Du kannst ja auch ein C-Programm schreiben, das diese Befehle an den Server schickt. Oder eine HTML-Oberfläche mit eigenem Javascript, das mit dem grottigen Javascriptbeispielen gar nichts zu tun hat, Du mußt halt nur darauf achten, daß Du die gleichen gewünschten Befehle an die Adresse des Webservers schickst.

                        Möglichkeiten gibt's viele, aber eines ist auch klar, wenn Du das über einen Browser steuern willst (was wie gesagt beileibe nicht die einzige Möglichkeit der Steuerung über das Internet wäre) dann wirst um profundere Kenntnisse webbasierter Sprachen, vor allem Javascript, vermutlich wirklich nicht herumkommen...

                        1. Hallo klawischnigg,

                          lol, gleichzeitig gepostet.

                          Der Wrapper um die Webserver-Schnittstelle ist vermutlich wirklich simpel. Und dabei können wir defintiv helfen.

                          Die Frage ist: Möchte Reschi auch mit seinen eigenen C-Programmen auf dem Controller interagieren? In dem Fall müsste es ein API zum myAVB Webserver geben, über das das C-Programm Schnittstellenkommandos annimmt oder Daten ausgibt. Dabei können wir leider nicht helfen.

                          Rolf

                          --
                          sumpsi - posui - obstruxi
                          1. Hi there,

                            lol, gleichzeitig gepostet.

                            Das sieht nur so aus - ich war schneller...;))

                            Der Wrapper um die Webserver-Schnittstelle ist vermutlich wirklich simpel. Und dabei können wir defintiv helfen.

                            Ja, es ist einfach ein Request an eine bestimmte Adresse.

                            Die Frage ist: Möchte Reschi auch mit seinen eigenen C-Programmen auf dem Controller interagieren? In dem Fall müsste es ein API zum myAVB Webserver geben, über das das C-Programm Schnittstellenkommandos annimmt oder Daten ausgibt. Dabei können wir leider nicht helfen.

                            Seh ich auch so. In dem Fall muß man sich dann auch Gedanken über die Plattform machen, auf der das laufen soll und und und...

                          2. Ich hab mir mal die Doku überblättert, da steht ja, wie Du auf den Webserver einen Request machen kannst. Mit "http://192.168.20.98/?myChangeCmd=%B0o21%7E0%B" bspw. kannst Du die rote LED an PIN 21 ausschalten. Theoretisch könntest Du vermutlich Deine Befehle sogar mit einem Tool wie Postman Deine Befehle an den Server schicken. Oder, wenn Du Dich da auskennst, Du kannst ja auch ein C-Programm schreiben, das diese Befehle an den Server schickt. Oder eine HTML-Oberfläche mit eigenem Javascript, das mit dem grottigen Javascriptbeispielen gar nichts zu tun hat, Du mußt halt nur darauf achten, daß Du die gleichen gewünschten Befehle an die Adresse des Webservers schickst.

                            Genau hier sehe ich nochmal meinen Einstieg. Anhand der Doku werde ich mich nochmal Stück für Stück ranarbeiten ohne zu sehr an den Beispielen festzuhalten.

                            Danke euch nochmal, großes Lob an die sofortige Unterstützung hier.

                            Edit Rolf B: Zitat als Zitat ausgezeichnet (">" davor gesetzt)

                      2. Hallo Reschi,

                        Auf Signalzustände von solchen Steuerungen über das Internet zuzugreifen und auch zu ändern war mein Wunsch.

                        Internet ist mehr als HTTP zum Austausch von Text und/oder HTML.

                        Du kannst - sofern dein Know How das zulässt, auch ein C Programm schreiben, das auf dem Controller läuft und auf IP-Sockets lauscht. Diese Sockets kannst Du von einem anderen C-Programm, das zur Fernsteuerung dienen soll, ansprechen und Messages austauschen, die Du selbst festlegst und die die gewünschten Daten vom Controller liefern bzw. Aktionen auslösen.

                        Dazu müsstest Du das nötige C- und Socket-Knowhow haben, und zwar für 2 Plattformen: Der Controller und das steuernde Gerät (d.h. Windows, Mac, Linux, Android, oder anderes). Hast Du das? Oder siehst Du die Lernkurve dorthin als geschmeidiger an? Dann mach das, aber dabei können wir hier nicht helfen.

                        Beim Erklären von HTML und JavaScript hingegen schon.

                        Rolf

                        --
                        sumpsi - posui - obstruxi