Skip to content
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • 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

  • Default (No Skin)
  • No Skin
Collapse
Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Probleme mit Variablenabfrage

NEWS

  • Wartung am 15.11. – Forum ab 22:00 Uhr nicht erreichbar
    BluefoxB
    Bluefox
    12
    2
    254

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

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.7k

Probleme mit Variablenabfrage

Probleme mit Variablenabfrage

Scheduled Pinned Locked Moved Skripten / Logik
4 Posts 2 Posters 471 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • ? Offline
    ? Offline
    A Former User
    wrote on last edited by
    #1

    Hallo zusammen,

    bin noch recht neu bei ioBroker, versuche mich aber gerade etwas einzuarbeiten. Hier ein Auszug aus meinem Code:

    ! var datenpunkte = {
    ! "Aussen" : {
    ! "Objekt_DP" : "fhem.0.Fuehler_Aussen.temperature",
    ! "Objekt_Timeout" : 20
    ! },
    ! };
    ! var neuedatenpunkte = {
    ! "Timeout" : {
    ! "DpName" : "Timeout",
    ! "init" : 0,
    ! "dp" : {
    ! "name" : 'Timeout',
    ! "desc" : 'Timeout',
    ! "type" : 'number',
    ! "role" : 'value',
    ! "unit" : 'Minuten'
    ! }
    ! },
    ! "Warnung" : {
    ! "DpName" : "Warnung",
    ! "init" : false,
    ! "dp" : {
    ! "name" : 'Warnung',
    ! "desc" : 'Warnung',
    ! "type" : 'boolean',
    ! "role" : 'value'
    ! }
    ! },
    ! };
    ! function runden(wert,stellen) { // rundet einen Float auf eine bestimmte Anzahl Nachkommastellen
    ! return Math.round(wert * Math.pow(10,stellen)) / Math.pow(10,stellen);
    ! }
    ! function calc(raum) {
    ! var change = getState(datenpunkte[raum].Objekt_DP).lc; // letzte Änderung
    ! var date = new Date();
    ! date = date.getTime(); // ms seit 1.1.1970
    ! var diff = (date - change) / 60000; // Differenz in Minuten
    ! var IDTime = pfad + raum + "." + neuedatenpunkte["Timeout"].DpName; // DP-ID Timeout
    ! setState(IDTime, runden(diff,0)); // Timeout-Wert in Datenpunkt schreiben
    ! var idTimeout = getState(datenpunkte[raum].Objekt_Timeout).var; // Timeout-Wert lesen
    ! var idWarnung = pfad + raum + "." + neuedatenpunkte["Warnung"].DpName; // DP-ID Warnung
    ! if (IDTime >= idTimeout) setState(idWarnung, true);
    ! if (IDTime < idTimeout) setState(idWarnung, false);
    ! }

    Es funktioniert soweit alles bis auf ein Problem in der Anweisung

    var idTimeout = getState(datenpunkte[raum].Objekt_Timeout).var; // Timeout-Wert lesen
    

    da bringt er mir einen Fehler im LogFenster. Ich denke die Abfrage ist wahrscheinlich falsch da der Wert "20" nicht als State vorliegt, kann aber auch sein das ich da total falsch liege.

    Es geht darum einen Datenpunkt zu überwachen (natürlich mehrere ansonsten wäre das Skript nicht so kompliziert) und wenn dieser sich nicht innerhalb einer bestimmten Zeit ändert eine Warnung zu generieren. Sobald er sich wieder geändert hat wird die Warnung wieder zurückgesetzt.

    Hat von euch jemand eine Idee wie ich den Fehler im Skript beheben kann?

    Danke schon mal

    Gruß

    Markus

    1 Reply Last reply
    0
    • AlCalzoneA Offline
      AlCalzoneA Offline
      AlCalzone
      Developer
      wrote on last edited by
      #2

      @meier81:

      Es funktioniert soweit alles bis auf ein Problem in der Anweisung

      var idTimeout = getState(datenpunkte[raum].Objekt_Timeout).var; // Timeout-Wert lesen
      ```` `  
      

      Ja die Zeile macht IMO auch keinen Sinn. Warum willst du den State "20" (der logischerweise nicht existiert) lesen? Wenn du an den Inhalt deines Konfigurationsobjekts kommen willst, reicht

      var idTimeout = datenpunkte[raum].Objekt_Timeout
      

      wobei der Variablenname "idTimeout" irreführend ist.

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

      1 Reply Last reply
      0
      • ? Offline
        ? Offline
        A Former User
        wrote on last edited by
        #3

        @AlCalzone:

        @meier81:

        Es funktioniert soweit alles bis auf ein Problem in der Anweisung

        var idTimeout = getState(datenpunkte[raum].Objekt_Timeout).var; // Timeout-Wert lesen
        ```` `  
        

        Ja die Zeile macht IMO auch keinen Sinn. Warum willst du den State "20" (der logischerweise nicht existiert) lesen? Wenn du an den Inhalt deines Konfigurationsobjekts kommen willst, reicht

        var idTimeout = datenpunkte[raum].Objekt_Timeout
        

        wobei der Variablenname "idTimeout" irreführend ist. `

        Hab die Änderung mal eingebaut, hatte ich mir auch schon fast gedacht, auf jeden Fall ist der Fehler im Log jetzt weg.

        Allerdings habe ich nun das Problem das im Skript alles soweit funktioniert außer das die Anweisung für das setzen und rücksetzen der Warnmeldung nicht funktioniert:

        if (IDTime >= idTimeout) setState(idWarnung, true);
        if (IDTime < idTimeout) setState(idWarnung, false);
        

        Das Skript läuft und wird alle Minuten bearbeitet, ich habe als Timeout 20 Minuten eingestellt und habe Sensoren mit einer Änderungszeit von über 60 Minuten aber die Warnung wird einfach nicht gesetzt.

        Hat da von euch jemand noch einen Tipp?

        Hier noch einmal mein gesamter Skript der Vollständigkeit halber…

        ! //
        ! // DeviceMonitor - v0.0.1
        ! //
        ! // Berechnet die Zeit zwischen letzter Wertänderung und jetzt und erzeugt eine
        ! // Warnung wenn die eingestellte Timeoutzeit überschritten wird.
        ! // –---------------------------------------------------------------------------
        ! // Autor des Skripts:
        ! // -----------------------------------------------------------------------------
        ! // - Meier81:
        ! // Formeln, Idee, Optimierungen, Korrekturen
        ! // TODO:
        ! // -----------------------------------------------------------------------------
        ! // - Auswahl zwischen letzter Änderung oder letzter Aktualisierung
        ! // - Zeit für die Berechnung noch fertig einbauen
        ! // -----------------------------------------------------------------------------
        ! // Einstellungen Skriptverhalten, eigene Parameter - !! bitte anpassen !!
        ! // -----------------------------------------------------------------------------
        ! // Cron-Parameter:
        ! var cronStr = "* * * * "; // Zeit, in der alle Datenpunkte aktualisiert werden
        ! // Skriptverhalten
        ! var delay = 500; // Zeit in ms als Verzögerung, wie die Datenpunkte abgearbeitet werden
        ! // Pfad für die Datenpunkte:
        ! var pfad = "DeviceMonitor" + "."; // Pfad unter dem die Datenpunkte in der Javascript-Instanz angelegt werden
        ! // -----------------------------------------------------------------------------
        ! // Datenpunkte zur Überwachung, Parametisierung - !! bitte anpassen !!
        ! // -----------------------------------------------------------------------------
        ! // jeder Datenpunkt darf nur einmal verwendet werden!
        ! // Beispiel:
        ! /

        ! "Objekt_DP" : "hm-rpc.0.KEQ0175977.1.TEMPERATURE", // Datenpunkt der überwacht wird
        ! "Objekt_Timeout" : 180 // Zeit (in Minuten) in der eine Wertänderung erwartet wird
        ! }
        ! */
        ! var datenpunkte = { // Keine Leerzeichen (Name wird als Datenpunktname verwendet!)
        ! // Datenpunkte
        ! "Aussen" : {
        ! "Objekt_DP" : "fhem.0.Fuehler_Aussen.temperature",
        ! "Objekt_Timeout" : 20
        ! },
        ! "Wohnzimmer" : {
        ! "Objekt_DP" : "fhem.0.Fuehler_Wohnzimmer.temperature",
        ! "Objekt_Timeout" : 20
        ! },
        ! "Kueche" : {
        ! "Objekt_DP" : "fhem.0.Fuehler_Kueche.temperature",
        ! "Objekt_Timeout" : 20
        ! },
        ! "Bad" : {
        ! "Objekt_DP" : "fhem.0.Fuehler_Bad.temperature",
        ! "Objekt_Timeout" : 20
        ! },
        ! "Elias" : {
        ! "Objekt_DP" : "fhem.0.Fuehler_Elias.temperature",
        ! "Objekt_Timeout" : 20
        ! },
        ! "Schlafzimmer" : {
        ! "Objekt_DP" : "fhem.0.Fuehler_Schlafzimmer.temperature",
        ! "Objekt_Timeout" : 20
        ! },
        ! "Arbeitszimmer" : {
        ! "Objekt_DP" : "fhem.0.Fuehler_Arbeitszimmer.temperature",
        ! "Objekt_Timeout" : 20
        ! },
        ! "Dachgeschoss" : {
        ! "Objekt_DP" : "fhem.0.Fuehler_Dachgeschoss.temperature",
        ! "Objekt_Timeout" : 20
        ! },
        ! };
        ! // -----------------------------------------------------------------------------
        ! // Skriptbereich. Ab hier muss nichts mehr eingestellt / verändert werden.
        ! // -----------------------------------------------------------------------------
        ! var neuedatenpunkte = {
        ! "Timeout" : {
        ! "DpName" : "Timeout",
        ! "init" : 0,
        ! "dp" : {
        ! "name" : 'Timeout',
        ! "desc" : 'Timeout',
        ! "type" : 'number',
        ! "role" : 'value',
        ! "unit" : 'Minuten'
        ! }
        ! },
        ! "Warnung" : {
        ! "DpName" : "Warnung",
        ! "init" : false,
        ! "dp" : {
        ! "name" : 'Warnung',
        ! "desc" : 'Warnung',
        ! "type" : 'boolean',
        ! "role" : 'value'
        ! }
        ! },
        ! };
        ! //------------------------------------------------------------------------------
        ! // Funktionen
        ! //------------------------------------------------------------------------------
        ! function createDp() {
        ! var name;
        ! var init;
        ! var forceCreation;
        ! var common;
        ! for (var raum in datenpunkte) {
        ! for (var datenpunktID in neuedatenpunkte) {
        ! name = pfad + raum + "." + neuedatenpunkte[datenpunktID].DpName;
        ! init = neuedatenpunkte[datenpunktID].init;
        ! forceCreation = false; // Init der Datenpunkte wird nur beim ersten Start angelegt. Danach bleiben die Werte auch nach Skritpstart enthalten.
        ! common = neuedatenpunkte[datenpunktID].dp;
        ! createState(name, init , forceCreation, common);
        ! }
        ! }
        ! log("Datenpunkte angelegt");
        ! }
        ! function runden(wert,stellen) { // rundet einen Float auf eine bestimmte Anzahl Nachkommastellen
        ! return Math.round(wert * Math.pow(10,stellen)) / Math.pow(10,stellen);
        ! }
        ! function calc(raum) { // Zeiten berechnen und Warnung erzeugen
        ! var act = getState(datenpunkte[raum].Objekt_DP).ts; // letzte Aktualisierung
        ! var change = getState(datenpunkte[raum].Objekt_DP).lc; // letzte Änderung
        ! var date = new Date();
        ! date = date.getTime(); // ms seit 1.1.1970
        ! var diff = (date - change) / 60000; // Differenz in Minuten
        ! var time = pfad + raum + "." + neuedatenpunkte["Timeout"].DpName; // DP Timeout
        ! setState(time, runden(diff,0)); // Timeout-Wert in Datenpunkt schreiben
        ! var to = datenpunkte[raum].Objekt_Timeout; // Timeout-Wert lesen
        ! var warn = pfad + raum + "." + neuedatenpunkte["Warnung"].DpName; // DP Warnung
        ! if (time >= to) setState(warn, true);
        ! if (time < to) setState(warn, false);
        ! }
        ! function calcDelayed(raum, delay) {
        ! setTimeout(function () {
        ! calc(raum);
        ! }, delay || 0);
        ! }
        ! function calcAll() { // Zeiten aller Datenpunkte berechnen
        ! for (var raum in datenpunkte) {
        ! calcDelayed(raum,delay); // Datenpunkte verzögert nacheinander abarbeiten
        ! }
        ! }
        ! // Schedule
        ! // =============================================================================
        ! schedule(cronStr, function () { // Nach Zeit alle Datenpunkte abfragen
        ! calcAll();
        ! });
        ! // main()
        ! // =============================================================================
        ! function main() {
        ! calcAll();
        ! setTimeout(calcAll,2000);
        ! }
        ! // Skriptstart
        ! // =============================================================================
        ! createDp(); // Datenpunkte anlegen
        ! setTimeout(main, 4000); // Zum Skriptstart ausführen

        Gruß

        Markus

        1 Reply Last reply
        0
        • AlCalzoneA Offline
          AlCalzoneA Offline
          AlCalzone
          Developer
          wrote on last edited by
          #4

          time ist ein String mit dem Namen des Datenpunkts

          var time = pfad + raum + "." + neuedatenpunkte["Timeout"].DpName; // DP Timeout
          

          to ist der konfigurierte Timeout (Zahl)

          var to = datenpunkte[raum].Objekt_Timeout; // Timeout-Wert lesen
          

          Und hier vergleichst du, ob der Name des Datenpunkts (String) größer oder kleiner als der Timeoutwert (Zahl) ist:

          if (time >= to) setState(warn, true);
          if (time < to) setState(warn, false);
          

          Das kann nicht funktionieren. Wenn du den Inhalt eines Datenpunkts vergleichen willst, musst du diesen vorher mit getState(datenpunktID) auslesen.

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

          1 Reply Last reply
          0
          Reply
          • Reply as topic
          Log in to reply
          • Oldest to Newest
          • Newest to Oldest
          • Most Votes


          Support us

          ioBroker
          Community Adapters
          Donate

          110

          Online

          32.4k

          Users

          81.3k

          Topics

          1.3m

          Posts
          Community
          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
          ioBroker Community 2014-2025
          logo
          • Login

          • Don't have an account? Register

          • Login or register to search.
          • First post
            Last post
          0
          • Recent
          • Tags
          • Unread 0
          • Categories
          • Unreplied
          • Popular
          • GitHub
          • Docu
          • Hilfe