NEWS
Probleme mit Variablenabfrage
-
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
-
@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.
-
@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ührenGruß
Markus
-
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.