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

  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Probleme mit Variablenabfrage

NEWS

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

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

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.4k

Probleme mit Variablenabfrage

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
4 Beiträge 2 Kommentatoren 471 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.
  • ? Offline
    ? Offline
    Ein ehemaliger Benutzer
    schrieb am zuletzt editiert von
    #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 Antwort Letzte Antwort
    0
    • AlCalzoneA Offline
      AlCalzoneA Offline
      AlCalzone
      Developer
      schrieb am zuletzt editiert von
      #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 Antwort Letzte Antwort
      0
      • ? Offline
        ? Offline
        Ein ehemaliger Benutzer
        schrieb am zuletzt editiert von
        #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 Antwort Letzte Antwort
        0
        • AlCalzoneA Offline
          AlCalzoneA Offline
          AlCalzone
          Developer
          schrieb am zuletzt editiert von
          #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 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

          526

          Online

          32.4k

          Benutzer

          81.4k

          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