NEWS
Skript Temperaturen basierend auf "Feuchtigkeitsscript" funktioniert nicht ganz
-
Guten morgen zusammen,
ich habe basierend auf diesem Skript http://forum.iobroker.net/viewtopic.php?f=21&t=2645 von Solear, Paul, eric und ruhr70 versucht, ein kleineres Skript für Temperaturen zusammen zu schustern.
Insbesondere dabei hat mich das Thema der Raumprüfung bei Änderung eines Sensors angesprochen.
Leider funktioniert mein Skript noch nicht ganz, offenbar habe ich das mit der Zustandsänderung eines Senors nicht verstanden. Der Rest funktioniert, DP werden angelegt, beim Start wird alles eingelesen. Soweit ok, aber eben leider noch nicht ganz.
In dem Skript sind teilweise meine eigenen "für mich" Erklärungen, die ggf sogar falsch sind. Ich lerne noch.
Ich denke, mein Fehler liegt im Bereich der Funktion "findRoom" (die ich auch ehrlich gesagt noch nicht 100% durchstiegen habe). Beim Rest bilde ich mir ein, es zumindest hinsichtlich der Wirkung verstanden zu haben. Bin für jeden Hinweis dankbar, was ich falsch mache.
// ************************************************************************************************** // SKRIPT ZUM AUSWERTEN DER IST-TEMPERATUREN UND SOLL TEMPERATUREN // SCHREIBT WERTE IN ERZEUGTE DATENPUNKTE; DIESE KÖNNEN DANN IN ANDEREN SKRIPTEN GENUTZT WERDEN // zusammengeschustert basierend auf dem Feuchtigkeitsskript von Solear, Paul53, ruhr70, eric2905 // ************************************************************************************************** // *********************************************************************** // Einstellungen // *********************************************************************** var debug = true; // Loggin mit true ein- bzw mit false ausschalten // *********************************************************************** // Parameter Variablen // *********************************************************************** var defaultMinTemp = 18.00; // Default TEMP_Minimum, wenn im Raum nicht angegeben (Auskühlschutz, tiefer soll eine Raumtemperatur durchs lüften nicht sinken) var pfad = "Raumklima.Temperatur.Raum."; var delayRooms = 500; // Zeit in MS Verzögerung zwischen Berechnungen der Räume // *********************************************************************** // Räume anlegen (Räume werden in Array geschrieben und dann für createState genutzt) // *********************************************************************** var raeume = { // Keine Leerzeichen (Name wird als Datenpunktname verwendet!) // Erdgeschoss "FlurEG" : { "Temp_Ist" : "hm-rpc.1.000E57098F208F.1.ACTUAL_TEMPERATURE"/*HmIP Temperatur und Feuchtigkeitsmesser Flur HWR:1.ACTUAL_TEMPERATURE*/, "Temp_Soll" : "hm-rpc.1.000E57098F208F.1.SET_POINT_TEMPERATURE"/*HmIP Temperatur und Feuchtigkeitsmesser Flur HWR:1.SET_POINT_TEMPERATURE*/, "TEMP_Minimum" : defaultMinTemp, // oder Zieltemperatur in Form von: 20.00 angeben }, "Wohnzimmer" : { "Temp_Ist" : "hm-rpc.1.000E57098F207E.1.ACTUAL_TEMPERATURE"/*HmIP Temperatur und Feuchtigkeitsmesser Wohn Ess:1.ACTUAL_TEMPERATURE*/, "Temp_Soll" : "hm-rpc.1.000E57098F207E.1.SET_POINT_TEMPERATURE"/*HmIP Temperatur und Feuchtigkeitsmesser Wohn Ess:1.SET_POINT_TEMPERATURE*/, "TEMP_Minimum" : defaultMinTemp, // oder Zieltemperatur in Form von: 20.00 angeben }, "Gaestebad" : { "Temp_Ist" : "hm-rpc.0.NEQ1640752.4.ACTUAL_TEMPERATURE"/*Gaestebad Thermostat:4.ACTUAL_TEMPERATURE*/, "Temp_Soll" : "hm-rpc.0.NEQ1640752.4.SET_TEMPERATURE"/*Gaestebad Thermostat:4.SET_TEMPERATURE*/, "TEMP_Minimum" : defaultMinTemp, // oder Zieltemperatur in Form von: 20.00 angeben }, // Obergeschoss "Schlafzimmer" : { "Temp_Ist" : "hm-rpc.1.000E57098F20A8.1.ACTUAL_TEMPERATURE", "Temp_Soll" : "hm-rpc.1.000E57098F20A8.1.SET_POINT_TEMPERATURE"/*HmIP Temperatur und Feuchtigkeitsmesser Schlafzimmer:1.SET_POINT_TEMPERATURE*/, "TEMP_Minimum" : defaultMinTemp, // oder Zieltemperatur in Form von: 20.00 angeben }, "BadOG" : { "Temp_Ist" : "hm-rpc.1.000393C99A1CDE.1.ACTUAL_TEMPERATURE"/*Badezimmer oben Thermostat Handtuchhalter:1.ACTUAL_TEMPERATURE*/, "Temp_Soll" : "hm-rpc.1.000393C99A1CDE.1.SET_POINT_TEMPERATURE"/*Badezimmer oben Thermostat Handtuchhalter:1.SET_POINT_TEMPERATURE*/, "TEMP_Minimum" : defaultMinTemp, // oder Zieltemperatur in Form von: 20.00 angeben }, }; // *********************************************************************** // Raumvariablen --> werden als Unterpunkte in die createState geschrieben // *********************************************************************** var raumDatenpunkte = { "tempSoll" : { "DpName" : "Soll_Temperatur", "init": 0, "dp": { "name": 'Soll Temperatur', "desc": 'manuell eingestellt oder via HM', "type": 'number', "role": 'value', "unit": '°C' } }, "tempIst" : { "DpName" : "Ist_Temperatur", "init": 0, "dp": { "name": 'Aktuelle Temperatur', "desc": 'fakt', "type": 'number', "role": 'value', "unit": '°C' } } }; // *********************************************************************** // Funktionen // *********************************************************************** // finde anhand der Sensor ID einen zugeordneten Raum <<<<<<<<<<<<<<<<<< HIER DENKE ICH LIEGT MEIN FEHLER!! function findRoom(sensor) { for (var raum in raeume) { if (raeume[raum].Temp_Ist == sensor) return raum; if (raeume[raum].Temp_Soll == sensor) return raum; } return null; } // Änderung eines Sensors (Temperatur ISt oder Soll) <<<<<<<<<<<<<<<<< oder hier, aber diese benötigt ja die Function findRoom, d.h. wahrscheinlich dort mein Fehler function valChange(obj) { var raumname = findRoom(obj.id); if (raumname) { if(debug) log('**Änderung:' + raumname + ": " + obj.id + ": " + obj.state.val + '**'); calcDelayed(raumname, delayRooms); } } // Berechnung verzögern, damit die Räume nacheinander abgearbeitet werden function calcDelayed(raum, delay) { setTimeout(function () { calc(raum); }, delay || 0); } // Berechnung function calc(raum) { var ist = getState(raeume[raum].Temp_Ist).val; // Temperatur IST auslesen var soll = getState(raeume[raum].Temp_Soll).val; // Temperatur SOLL auslesen if(debug) log("Temperatur IST in "+raum +" beträgt "+ist); if(debug) log("Temperatur Soll in "+raum +" beträgt "+soll); var idSoll = pfad + raum + "."+raumDatenpunkte['tempSoll'].DpName; // Pfad für nachfolgendes setState zusammenbauen var idIst = pfad + raum + "."+raumDatenpunkte['tempIst'].DpName; setState(idSoll, soll); setState(idIst, ist); } // Berechnung function calcAll() { for (var raum in raeume) { calcDelayed(raum,delayRooms); // Räume verzögert nacheinander abarbeiten } } // Anlegen der Datenpunkte --> legt Datenpunkte an mit Raum(name) und den Sub-Dps function createDp() { var name; var init; var forceCreation; var common; for (var raum in raeume) { for (var datenpunktID in raumDatenpunkte) { name = pfad + raum + "." + raumDatenpunkte[datenpunktID].DpName; init = raumDatenpunkte[datenpunktID].init; forceCreation = false; // Init der Datenpunkte wird nur beim ersten Star angelegt. Danach bleiben die Wert auch nach Skritpstart enthalten. common = raumDatenpunkte[datenpunktID].dp; createState(name, init , forceCreation, common); if(debug) log("neuer Datenpunkt: " + name); } } } // START createDp(); // Datenpunkte anlegen setTimeout(calcAll, 3000); // Zum Skriptstart ausführen