Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. [gelöst] SetState schreibt was anderes als übergeben

NEWS

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    5
    1
    43

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.4k

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.3k

[gelöst] SetState schreibt was anderes als übergeben

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
javascript
4 Beiträge 2 Kommentatoren 491 Aufrufe 3 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • M Offline
    M Offline
    miggedy
    schrieb am zuletzt editiert von miggedy
    #1

    Hallo,
    ich habe ein sehr seltsames Problem (wie ich finde) und komme nicht drauf wo das Problem liegt.
    Ich erstelle einen String der ein HTML-Table ist und schreibe diesen dann per SetState in einen state um es dann in der vis anzuzeigen.
    Der Code ist einfach das hier:

      	let json = JSON.parse(getState(JSON_ID).val);
            const TABLE =  `<table width='100%'>\n \
                        <thead>\n \
                            <tr>\n \
                                <td>&#128646;</td><td>&#128034;</td><td>&#127919;</td><td>&#128694;</td>\n \
                            </tr>\n \
                        </thead>\n \
                        <tr>\n \
                            <td>${getDeparture(0,json)}</td><td>${getDelay(0,json)}</td><td>${getArrival(0,json)}</td><td>${getWalktime(0,json)}</td>\n \
                        </tr>\n \
                        <tr>\n \
                            <td>${getDeparture(1,json)}</td><td>${getDelay(1,json)}</td><td>${getArrival(1,json)}</td><td>${getWalktime(1,json)}</td>\n \
                        </tr>\n \
                        <tr>\n \
                            <td>${getDeparture(2,json)}</td><td>${getDelay(2,json)}</td><td>${getArrival(2,json)}</td><td>${getWalktime(2,json)}</td>\n \
                        </tr>\n \
                    </table>`;
            log ("TABLE: " + TABLE);
    	setState(oid, TABLE);
    

    Wie man sieht, schreibe ich am Ende das "Ergbnis" ins log und da steht dann auch der von mir erwartete String:

    TABLE: <table width='100%'> <thead> <tr> <td>&#128646;</td><td>&#128034;</td><td>&#127919;</td><td>&#128694;</td> </tr> </thead> <tr> <td>12:10</td><td><span style='color:red'>2</span></td><td>12:29</td><td><span style='color:red'>12:00 (-7)</span></td> </tr> <tr> <td>12:28</td><td><span style='color:white'>0</span></td><td>12:49</td><td><span style='color:white'>12:18 (10)</span></td> </tr> <tr> <td>12:48</td><td><span style='color:white'>0</span></td><td>13:09</td><td><span style='color:white'>12:38 (30)</span></td> </tr> </table>
    

    Im Objekt-Browser (sowie in der vis die einfach nur diesen state als HTML anzeigt) steht aber folgendes:

    <table width='100%'>
                         <thead>
                             <tr>
                                 <td>&#128646;</td><td>&#128034;</td><td>&#127919;</td><td>&#128694;</td>
                             </tr>
                         </thead>
                         <tr>
                             <td>12:10</td><td><span style='color:red'>2</span></td><td>12:29</td><td><span style='color:red'>12:00 (-7.000216666666667)</span></td>
                         </tr>
                         <tr>
                             <td>12:28</td><td><span style='color:green'>0</span></td><td>12:49</td><td><span style='color:white'>12:18 (10.999766666666666)</span></td>
                         </tr>
                         <tr>
                             <td>12:48</td><td><span style='color:green'>0</span></td><td>13:09</td><td><span style='color:white'>12:38 (30.999766666666666)</span></td>
                         </tr>
                     </table>
    

    Man siehe diese vielen Nachkommastellen rechts in der Tabelle die vorher nicht da waren. Wie kann sowas passieren? Übergebe das ganze Ding doch als String, wie schafft es das JS innerhalb von setState da so einen Rundungsfehler rein zu bekommen? Passiert übrigens nicht immer, in ca. 50% der Fälle passt es, dann sind auch im Objekt die gerundeten Werte.

    Was ich auch schon probiert habe aber mit gleichem Ergebnis, ist dass ich den String vorher kopiert habe, um sicher zu gehen, dass das String replacement nicht doch irgendwie innerhalb von setState noch mal ausgeführt wird und dann was anderes rauskommt. Also auch wenn ich das hier mache, ist es im log richtig, im Objekt aber mit Nachkommastellen:

        let test = JSON.parse(JSON.stringify(TABLE));
        log ("TABLE: " + test);
        setState(oid, test);
    
    AlCalzoneA 1 Antwort Letzte Antwort
    0
    • M miggedy

      Hallo,
      ich habe ein sehr seltsames Problem (wie ich finde) und komme nicht drauf wo das Problem liegt.
      Ich erstelle einen String der ein HTML-Table ist und schreibe diesen dann per SetState in einen state um es dann in der vis anzuzeigen.
      Der Code ist einfach das hier:

        	let json = JSON.parse(getState(JSON_ID).val);
              const TABLE =  `<table width='100%'>\n \
                          <thead>\n \
                              <tr>\n \
                                  <td>&#128646;</td><td>&#128034;</td><td>&#127919;</td><td>&#128694;</td>\n \
                              </tr>\n \
                          </thead>\n \
                          <tr>\n \
                              <td>${getDeparture(0,json)}</td><td>${getDelay(0,json)}</td><td>${getArrival(0,json)}</td><td>${getWalktime(0,json)}</td>\n \
                          </tr>\n \
                          <tr>\n \
                              <td>${getDeparture(1,json)}</td><td>${getDelay(1,json)}</td><td>${getArrival(1,json)}</td><td>${getWalktime(1,json)}</td>\n \
                          </tr>\n \
                          <tr>\n \
                              <td>${getDeparture(2,json)}</td><td>${getDelay(2,json)}</td><td>${getArrival(2,json)}</td><td>${getWalktime(2,json)}</td>\n \
                          </tr>\n \
                      </table>`;
              log ("TABLE: " + TABLE);
      	setState(oid, TABLE);
      

      Wie man sieht, schreibe ich am Ende das "Ergbnis" ins log und da steht dann auch der von mir erwartete String:

      TABLE: <table width='100%'> <thead> <tr> <td>&#128646;</td><td>&#128034;</td><td>&#127919;</td><td>&#128694;</td> </tr> </thead> <tr> <td>12:10</td><td><span style='color:red'>2</span></td><td>12:29</td><td><span style='color:red'>12:00 (-7)</span></td> </tr> <tr> <td>12:28</td><td><span style='color:white'>0</span></td><td>12:49</td><td><span style='color:white'>12:18 (10)</span></td> </tr> <tr> <td>12:48</td><td><span style='color:white'>0</span></td><td>13:09</td><td><span style='color:white'>12:38 (30)</span></td> </tr> </table>
      

      Im Objekt-Browser (sowie in der vis die einfach nur diesen state als HTML anzeigt) steht aber folgendes:

      <table width='100%'>
                           <thead>
                               <tr>
                                   <td>&#128646;</td><td>&#128034;</td><td>&#127919;</td><td>&#128694;</td>
                               </tr>
                           </thead>
                           <tr>
                               <td>12:10</td><td><span style='color:red'>2</span></td><td>12:29</td><td><span style='color:red'>12:00 (-7.000216666666667)</span></td>
                           </tr>
                           <tr>
                               <td>12:28</td><td><span style='color:green'>0</span></td><td>12:49</td><td><span style='color:white'>12:18 (10.999766666666666)</span></td>
                           </tr>
                           <tr>
                               <td>12:48</td><td><span style='color:green'>0</span></td><td>13:09</td><td><span style='color:white'>12:38 (30.999766666666666)</span></td>
                           </tr>
                       </table>
      

      Man siehe diese vielen Nachkommastellen rechts in der Tabelle die vorher nicht da waren. Wie kann sowas passieren? Übergebe das ganze Ding doch als String, wie schafft es das JS innerhalb von setState da so einen Rundungsfehler rein zu bekommen? Passiert übrigens nicht immer, in ca. 50% der Fälle passt es, dann sind auch im Objekt die gerundeten Werte.

      Was ich auch schon probiert habe aber mit gleichem Ergebnis, ist dass ich den String vorher kopiert habe, um sicher zu gehen, dass das String replacement nicht doch irgendwie innerhalb von setState noch mal ausgeführt wird und dann was anderes rauskommt. Also auch wenn ich das hier mache, ist es im log richtig, im Objekt aber mit Nachkommastellen:

          let test = JSON.parse(JSON.stringify(TABLE));
          log ("TABLE: " + test);
          setState(oid, test);
      
      AlCalzoneA Offline
      AlCalzoneA Offline
      AlCalzone
      Developer
      schrieb am zuletzt editiert von
      #2

      @miggedy Ich schätze, das passiert während der Umwandlung in den String mit ${getWalktime(2,json)}. Ich kann mir zwar nicht erklären, warum du die unterschiedlichen Ergebnisse siehst, aber probiers mal so:
      ${getWalktime(2,json).toFixed(0)}.

      Das wandelt die Zahl in einen String um, der garantiert keine Nachkommastellen hat.

      Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

      M 1 Antwort Letzte Antwort
      0
      • AlCalzoneA AlCalzone

        @miggedy Ich schätze, das passiert während der Umwandlung in den String mit ${getWalktime(2,json)}. Ich kann mir zwar nicht erklären, warum du die unterschiedlichen Ergebnisse siehst, aber probiers mal so:
        ${getWalktime(2,json).toFixed(0)}.

        Das wandelt die Zahl in einen String um, der garantiert keine Nachkommastellen hat.

        M Offline
        M Offline
        miggedy
        schrieb am zuletzt editiert von miggedy
        #3

        @AlCalzone said in SetState schreibt was anderes als ihr übergeben wurde:

        .toFixed(0)

        Wenn ich .toFixed(0) anfüge, kommt sogar ein JS error, wil toFixed() nicht auf einen String angewendet werden kann. Ist also bereits ein String. Die Methode baut nämlich auch bereits einen String zusammen:

        function getWalktime(i, json) {
            let departure = json.journeys[i].legs[0].departure;
            departure = moment(departure).subtract(10, "minute");
        
            let departureDiff = moment.duration(departure.diff(moment())).minutes();
            return `<span style='color:${departureDiff < 0 ? "red" : departureDiff < 5 ? "green" : "white"}'>${departure.format(moment.HTML5_FMT.TIME)} (${departureDiff})</span>`;
        }
        

        Hab sicherheitshalber da jetzt auch mal ein .toFixed(0) an das departureDiff gemacht (auch wenn es irgendwie alles keinen Sinn macht), aber auch das resultiert in das gleiche Ergebnis. Log Ausgabe korrekt, im state mit Nachkommastellen.

        Echt verrückt! ;-)

        M 1 Antwort Letzte Antwort
        0
        • M miggedy

          @AlCalzone said in SetState schreibt was anderes als ihr übergeben wurde:

          .toFixed(0)

          Wenn ich .toFixed(0) anfüge, kommt sogar ein JS error, wil toFixed() nicht auf einen String angewendet werden kann. Ist also bereits ein String. Die Methode baut nämlich auch bereits einen String zusammen:

          function getWalktime(i, json) {
              let departure = json.journeys[i].legs[0].departure;
              departure = moment(departure).subtract(10, "minute");
          
              let departureDiff = moment.duration(departure.diff(moment())).minutes();
              return `<span style='color:${departureDiff < 0 ? "red" : departureDiff < 5 ? "green" : "white"}'>${departure.format(moment.HTML5_FMT.TIME)} (${departureDiff})</span>`;
          }
          

          Hab sicherheitshalber da jetzt auch mal ein .toFixed(0) an das departureDiff gemacht (auch wenn es irgendwie alles keinen Sinn macht), aber auch das resultiert in das gleiche Ergebnis. Log Ausgabe korrekt, im state mit Nachkommastellen.

          Echt verrückt! ;-)

          M Offline
          M Offline
          miggedy
          schrieb am zuletzt editiert von
          #4

          Jetzt hatte ich gerade noch einen Geistesblitz: Was ist wenn vielleicht im Hintergrund eine zweite Instanz des Scriptes parallel läuft mit einem älteren Code den ich wärend der Entwicklung gestartet habe und mir ständig meinen korrekten neuen Status überschreibt und ich denke nur, dass mein Script verrückt spielt? Das würde auch erklären, warum ich das Verhalten nicht in 100% der Fälle sehe, sondern nur zu 50%.

          Also mal den ganzen PI neugestartet um sicher zu gehen, dass alle Prozess frisch sind...

          Und Zack: Problem ist weg. :face_palm:

          Danke trotzdem!

          1 Antwort Letzte Antwort
          0
          Antworten
          • In einem neuen Thema antworten
          Anmelden zum Antworten
          • Älteste zuerst
          • Neuste zuerst
          • Meiste Stimmen


          Support us

          ioBroker
          Community Adapters
          Donate

          461

          Online

          32.5k

          Benutzer

          81.7k

          Themen

          1.3m

          Beiträge
          Community
          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
          ioBroker Community 2014-2025
          logo
          • Anmelden

          • Du hast noch kein Konto? Registrieren

          • Anmelden oder registrieren, um zu suchen
          • Erster Beitrag
            Letzter Beitrag
          0
          • Home
          • Aktuell
          • Tags
          • Ungelesen 0
          • Kategorien
          • Unreplied
          • Beliebt
          • GitHub
          • Docu
          • Hilfe