Weiter zum Inhalt
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Hell
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dunkel
  • 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] mit setState von Zahl auf bool

NEWS

  • Der neue Monatsrückblick für Mai und Juni 2026 ist online!
    BluefoxB
    Bluefox
    8
    1
    1.1k

  • wichtiges UPDATE für controller 7.2.2 im stable
    HomoranH
    Homoran
    10
    1
    3.6k

  • Neues YouTube-Video: Visualisierung im Devices-Adapter
    BluefoxB
    Bluefox
    16
    1
    6.2k

[gelöst] mit setState von Zahl auf bool

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
12 Beiträge 4 Kommentatoren 4.1k Aufrufe
  • Ä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.
  • P Offline
    P Offline
    PrinzEisenherz1
    schrieb am zuletzt editiert von
    #3

    Super, danke Paul.

    Gruß Johnny

    Intel-NUC mit ProxMox: ioBroker,SQL, logging Strom- Gas- u. Wasserzähler;10Zoll Tab im Flur für VIS; weiteres: Homematic CCU2, Homeduino, Kameras, selbstgebaute Wetterstation;

    1 Antwort Letzte Antwort
    0
    • frankjokeF Offline
      frankjokeF Offline
      frankjoke
      schrieb am zuletzt editiert von
      #4

      Hallo mitsammen!

      Hatte auch schon Probleme damit da man ja annimmt wenn ein state als boolean definiert ist dass er nur boolean's speichert (und so ähnlich mit strings und Zahlen).

      Leider wandelt setState aber den Wert nicht um und wenn dann irgend ein Programm 'false' als string hineinschreibt und ein anderes auf false (boolean) prüft dann stimmts nicht zusammen. Leider funktioniert dann auch kein !!val, dies fu8nktioniert aber besser bei Zahlen wo 0 als false und <>0 als true gewandelt wird.

      In meinen Adaptern schau ich dass die Werte richtig gesetzt werden, aber wenn setState das richtig umwandeln und abspeichern würde wäre es weniger Fehleranfällig.

      Frank,

      NUC's, VM's und Raspi's unter Raspian, Ubuntu und Debian zum Testen.
      Adapter die ich selbst beigesteuert habe: BMW, broadlink2, radar2, systeminfo, km200, xs1 und einige im Anmarsch!

      1 Antwort Letzte Antwort
      0
      • paul53P Offline
        paul53P Offline
        paul53
        schrieb am zuletzt editiert von
        #5

        @fsjoke:

        …'false' als string hineinschreibt und ein anderes auf false (boolean) prüft dann stimmts nicht zusammen. `
        Dafür gibt es die (undokumentierte) Funktion toBoolean(val) des Javascript-Adapters.
        @fsjoke:

        In meinen Adaptern schau ich dass die Werte richtig gesetzt werden, … `
        Das sollte jeder Programmierer machen. Wenn direkt angekoppelte Hardware (Homedunio) nicht typgerechte Werte liefert, muss man wandeln. Erfolgt die Ankopplung über einen Adapter, ist dies die Aufgabe des Adapters.

        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
        Produktiv: Asus PN 42 / N100 / 8 GB / 500 GB; Proxmox mit 2 VM (iob / openCCU)

        1 Antwort Letzte Antwort
        0
        • frankjokeF Offline
          frankjokeF Offline
          frankjoke
          schrieb am zuletzt editiert von
          #6

          Paul,

          es geht mir nicht darum ob ich es umwandeln kann, es geht darum dass ich ein ioBroker-Objekt definiere das ein boolean ist (oder ein string oder sonst was) aber trotzdem im was anderes abgespeichert ist/werden kann.

          Das ist einfach falsch da ich dann ja auch keine Objekttypen definieren brauch und bei jeder Abfrage immer zur Vorsicht konvertieren muss.

          Also, wenn schon objekt-typen definiert sind soll die Konvertierung beim Speichern auf diesen Typ vorgenommen werden uund eben nur solche Werte akzeptiert werden.

          Es gibt ja auch den Objekttype wo man alles speichern kann.

          p.s.: Der History-Adapter konvertiert die Daten vorm Abspeichern…

          Frank,

          NUC's, VM's und Raspi's unter Raspian, Ubuntu und Debian zum Testen.
          Adapter die ich selbst beigesteuert habe: BMW, broadlink2, radar2, systeminfo, km200, xs1 und einige im Anmarsch!

          1 Antwort Letzte Antwort
          0
          • paul53P Offline
            paul53P Offline
            paul53
            schrieb am zuletzt editiert von
            #7

            @fsjoke:

            …dass ich ein ioBroker-Objekt definiere das ein boolean ist (oder ein string oder sonst was) aber trotzdem im was anderes abgespeichert ist/werden kann. `
            Mein Vorschlag an Bluefox vor einiger Zeit ging dahin, die Speicherung eines falschen Datentyps zu verhindern und stattdessen eine Fehlermeldung zu erzeugen. Da es aber zu dem Zeitpunkt schon zu viele fehlerhafte Skripte gab, die dann nicht mehr funktioniert hätten, hat Bluefox zwar die Prüfung eingeführt, die bei falschem Datentyp die mittlerweile bekannte Warnmeldung erzeugt, die Speicherung aber (noch) nicht verhindert.

            Außerdem hat Bluefox es nur im Javascript-Adapter realisiert. Mein Vorschlag ging jedoch in Richtung js-controller, damit die Typkontrolle alle Adapter betrifft. Einige Adapter würden dann wohl nicht mehr funktionieren.

            Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
            Produktiv: Asus PN 42 / N100 / 8 GB / 500 GB; Proxmox mit 2 VM (iob / openCCU)

            1 Antwort Letzte Antwort
            0
            • frankjokeF Offline
              frankjokeF Offline
              frankjoke
              schrieb am zuletzt editiert von
              #8

              Oh, hab das schon mal gesehen mit der Warnung.

              Ich würde es ja nicht verbieten, aber halt eben konvertieren!

              Also bei anstatt state.val = newval mal eben state.val = Boolean(newval) ? !!newval : false;

              und bei Zahlen checken ob's Integer ist und dann mit parseInt/parseFloat(newval)

              und strings mit newval.toString()

              Dann kann man auf das Warning verzichten.

              Frank,

              NUC's, VM's und Raspi's unter Raspian, Ubuntu und Debian zum Testen.
              Adapter die ich selbst beigesteuert habe: BMW, broadlink2, radar2, systeminfo, km200, xs1 und einige im Anmarsch!

              1 Antwort Letzte Antwort
              0
              • paul53P Offline
                paul53P Offline
                paul53
                schrieb am zuletzt editiert von
                #9

                Was macht man mit Werten, die sich nicht konvertieren lassen ?

                Beispiel: "mein Text" –> boolean

                oder: "" --> number

                Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                Produktiv: Asus PN 42 / N100 / 8 GB / 500 GB; Proxmox mit 2 VM (iob / openCCU)

                1 Antwort Letzte Antwort
                0
                • G Offline
                  G Offline
                  gst666
                  schrieb am zuletzt editiert von
                  #10

                  Der Type einer Variablen kann sich ändern. Auch wenn man ihn anfangs ausdrücklich festlegt, darf der Typ in Javascript nachträglich geändert werden. Das ist sicherlich nicht schön und birgt Risiken. Dies ist in Javascript so gewollt.

                  Schön fände ich es in der Tat, wenn setState manche falsche Typen verzeihen würde. Trotzdem ist die jetzige Lösung wahrscheinlich nicht die Schlechteste. Gerade umgekehrt gibt es nämlich dieselben Probleme. Stellen wir uns vor, ein getState gibt die Zahl 1 zurück. Wir prüfen dann, ob das Ergebnis true ist. Damit wird dann das Programm nicht mehr so funktionieren wie gewollt.

                  Es bleibt letztendlich keine andere Möglichkeit, als auf den Datentyp zu achten. Übrigens, auch VIS-Widgets können den Datentyp ändern. Hier lauert eine häßliche Falle.

                  1 Antwort Letzte Antwort
                  0
                  • paul53P Offline
                    paul53P Offline
                    paul53
                    schrieb am zuletzt editiert von
                    #11

                    @gst666:

                    Dies ist in Javascript so gewollt. `
                    Ein Datenpunkt ist keine Javascript-Variable, die man nur ohne Typbindung deklarieren kann. Wenn der Datenpunkttyp vorgegeben ist, sollte der Wert auch diesem Typ entsprechen. Will man wechselnde Datentypen erlauben, kann man als Typ 'mixed' vorgeben, was allerdings schlechter Programmierstil wäre.
                    @gst666:

                    Stellen wir uns vor, ein getState gibt die Zahl 1 zurück. Wir prüfen dann, ob das Ergebnis true ist. Damit wird dann das Programm nicht mehr so funktionieren wie gewollt. `
                    Wenn bekannt ist, dass getState(id).val auch Zahlen (0 / 1) liefern kann, testet man mit

                    if(getState(id).val)
                    

                    Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                    Produktiv: Asus PN 42 / N100 / 8 GB / 500 GB; Proxmox mit 2 VM (iob / openCCU)

                    1 Antwort Letzte Antwort
                    0
                    • frankjokeF Offline
                      frankjokeF Offline
                      frankjoke
                      schrieb am zuletzt editiert von
                      #12

                      Übrigens, mein Beispiel von Boolean oben müsste abgeändert werden um für alle Fälle zu gelten.

                      Egal, grundsätzlich erlaubt Javascript selbst beliebige Typen für die Variablen aber wenn man im ioBroker eine Type festlegt dann sollte der Wert auch als solche gespeichert werden (nicht nur im History wo es richtig gemacht wird).

                      Ein Beispiel: Booleans (ein/Aus-states) werden in der Visualisierung als solche behandelt aber eben meist mit Standardabfragen wie

                      if(xxx) oder if(!xxx) behandelt.

                      if('false') erzeugt dabei true!

                      if('true oder sonst was') auch

                      if('') erzeugt hingegen false.

                      Bei Zahlen ist's einfacher, 0 erzeugt false, alles andere true.

                      Umgekehrt ist es schon schwieriger, verschiedene Adapter müssen unterschiedliche Strategien anwenden. Ich habe z.B. ein Gerät bei dem true 100 ist (für 100%) und false 0.

                      Da das Gerät auch Dimmer bedienen kann sind bei diesen 0-100 möglich, bei Schaltern aber nur 0 oder 100. Deshalb muss ich bei Dimmern einen Zahlen-Datentyp mit min/0 ,max/100 und bei Schaltern einen binären Wert vorsehen. Wandelt man nun 'true' auf eine Zahl (z.B. mit 0+'true') ergibt das 1. Mit 1 würde der Dimmer aber nicht eingeschaltet werden.

                      Wird dieser Wert nun in den State als Zahl geschrieben kann er zwar richtig in einen boolean umgewandelt werden, aber wenn wer 'true' hineinschreibt kennt sich das Gerät nicht aus obwohl das script glaubt es ist true.

                      Deshalb ist es wichtig wenigstens zu wissen wie sich ioBroker selbst verhält und Adaptern oder scripts vorzugeben wie sie sich zu verhalten haben.

                      Deswegen sollten auch Default klar definiert sein, wie "" oder "false"== false und "was auch immer" == true genauso wie 0 == false und nicht 0 == true

                      Frank,

                      NUC's, VM's und Raspi's unter Raspian, Ubuntu und Debian zum Testen.
                      Adapter die ich selbst beigesteuert habe: BMW, broadlink2, radar2, systeminfo, km200, xs1 und einige im Anmarsch!

                      1 Antwort Letzte Antwort
                      0

                      Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.

                      Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.

                      Mit deinem Input könnte dieser Beitrag noch besser werden 💗

                      Registrieren Anmelden
                      Antworten
                      • In einem neuen Thema antworten
                      Anmelden zum Antworten
                      • Älteste zuerst
                      • Neuste zuerst
                      • Meiste Stimmen


                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      351

                      Online

                      33.0k

                      Benutzer

                      83.6k

                      Themen

                      1.3m

                      Beiträge
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                      ioBroker Community 2014-2026
                      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