NEWS
[Skript] Absolute Feuchte berechnen
- 
					
					
					
					
 Heute Abend baue ich noch eine JSON-Ausgabe ein. Erleichtert die Ausgabe in VIS. Gruß, Eric 
- 
					
					
					
					
 Geschafft  Datenpunkt "JSON" eingebaut Datenpunkt "Aktualisierung" eingebaut Hier der Code ! ```` 
 // Berechnet Taupunkt, absolute Luftfeuchtigkeit, Enthalpie, Lüftungsempfehlung,
 //gemessene Temperatur & Luftfeuctigkeit inkl. Offset zwecks Kalibrierung
 // -----------------------------------------------------------------------------
 // benötigt in der Javascript das Modul "dewpoint"
 // (in der Javascript-Instanz Einstellungen unter "Zusätzliche NPM-Module")
 // -----------------------------------------------------------------------------
 // von paul53 übernommen und angepasst
 // http://forum.iobroker.net/viewtopic.php?f=20&t=2437&hilit=Lüftung*#p21476
 // und Solear: http://forum.iobroker.net/viewtopic.php?f=21&t=2645&p=23381#p23282
 // -----------------------------------------------------------------------------
 // 05.06.2015 Anpassung ericc2905
 // Boolean "anyLueften", Datenpunkt "Lueften", Datenpunkt "Aktualisierung" und JSON-Ausgabe eingebaut
 ! var nn = 273; // eigene Höhe nn (normalnull), z.B. über http://de.mygeoposition.com zu ermitteln
 var pfad = "Raumklima" +"."; // Pfad unter dem die Datenpunkte in der Javascript-Instanz angelegt werden
 var controlPfad = "CONTROL" +"."; // Pfad innerhalb des Raums
 var skriptConf = true; // true: Raumwerte werden über das Skript geändert / false: Raumwerte werden über Objekte (oder VIS) geändert
 var defaultTemp = 21; // Default TEMP_Zielwert, wenn im Raum nicht angegeben
 ! // eric2905 Zusätzliche Variablen definieren
 // --------------------------------------------------------------------
 var anyLueften = false; // false: Nirgendwo lüften notwendig / true: Lüften notwendig
 var strJSONfinal = ""; // Fertiges JSON (zum Schreiben in Datenpunkt)
 var strJSONtemp = ""; // Bastel-JSON (wird suksessive gefüllt)
 var strDatum = ""; // Datums der Aktualisierung
 // eric2905 Ende -------------------------------------------------------
 ! // -----------------------------------------------------------------------------
 // Räume mit Sensoren
 // -----------------------------------------------------------------------------
 var raeume = { // Keine Leerzeichen (Name wird als Datenpunktname verwendet!)
 // Sensoren Aussen
 "Aussen" : {
 "Sensor_TEMP" : "hm-rpc.0.IEQ1234560.1.TEMPERATURE" /Aussenthermometer:1.TEMPERATURE/,
 "Sensor_HUM" : "hm-rpc.0.IEQ1234560.1.HUMIDITY" /Aussenthermometer:1.HUMIDITY/,
 "Sensor_TEMP_OFFSET" : 0.0,
 "Sensor_HUM_OFFSET" : 0
 },
 // Sensoren Innen
 "Raum1" : {
 "Sensor_TEMP" : "hm-rpc.0.IEQ1234561.1.TEMPERATURE",
 "Sensor_HUM" : "hm-rpc.0.IEQ1234561.1.HUMIDITY",
 "Sensor_TEMP_OFFSET" : 0.0,
 "Sensor_HUM_OFFSET" : 0,
 "TEMP_Zielwert" : 21,
 "Aussensensor" : "Aussen"
 },
 "Raum2" : {
 "Sensor_TEMP" : "hm-rpc.0.IEQ1234562.1.TEMPERATURE",
 "Sensor_HUM" : "hm-rpc.0.IEQ1234562.1.HUMIDITY",
 "Sensor_TEMP_OFFSET" : 0.0,
 "Sensor_HUM_OFFSET" : 0,
 "TEMP_Zielwert" : 21,
 "Aussensensor" : "Aussen"
 },
 "Raum3" : {
 "Sensor_TEMP" : "hm-rpc.0.IEQ1234563.1.TEMPERATURE",
 "Sensor_HUM" : "hm-rpc.0.IEQ1234563.1.HUMIDITY",
 "Sensor_TEMP_OFFSET" : 0.0,
 "Sensor_HUM_OFFSET" : 0,
 "TEMP_Zielwert" : 21,
 "Aussensensor" : "Aussen"
 }
 };
 ! // =============================================================================
 // Skriptbereich. Ab hier muss nichts mehr eingestellt / verändert werden.
 // =============================================================================
 var raumDatenpunkte = {
 "x" : {
 "DpName" : "Feuchtegehalt_Absolut",
 "init": 0,
 "dp": {
 "name": 'absoluter Feuchtegehalt',
 "desc": 'absoluter Feuchtegehalt, errechnet',
 "type": 'number',
 "role": 'value',
 "unit": 'g/kg'
 }
 },
 "rh" : {
 "DpName" : "relative_Luftfeuchtigkeit",
 "init": 0,
 "dp": {
 "name": 'gemessene relative Luftfeuchtigkeit (inkl. Offset)',
 "desc": 'relative Luftfeuchtigkeit, vom Sensor + Offset zum Ausgleich von Messungenauigkeiten des Geräts',
 "type": 'number',
 "role": 'value',
 "unit": '%'
 }
 },
 "dp" : {
 "DpName" : "Taupunkt",
 "init": 0,
 "dp": {
 "name": 'Taupunkt',
 "desc": 'Taupunkt. Temperatur von Wänden, Fenstern, usw. ab der sich die Feuchtigkeit niederschlägt.',
 "type": 'number',
 "role": 'value',
 "unit": '°C'
 }
 },
 "t" : {
 "DpName" : "Temperatur",
 "init": 0,
 "dp": {
 "name": 'gemessene Temperatur (inkl. Offset)',
 "desc": 'gemessene Temperatur vom Sensor zzgl. eines Offsets um Geräteungenauigkeiten auszugleichen',
 "type": 'number',
 "role": 'value',
 "unit": '°C'
 }
 },
 "h" : {
 "DpName" : "Enthalpie",
 "init": 0,
 "dp": {
 "name": 'Enthalpie',
 "desc": 'Enthalpie',
 "type": 'number',
 "role": 'value',
 "unit": 'kJ/kg'
 }
 },
 "lüften" : {
 "DpName" : "Lüftungsempfehlung",
 //"init": false,
 "dp": {
 "name": 'Lüftungsempfehlung',
 "desc": 'Lüftungsempfehlung',
 "type" : 'boolean',
 "role": 'value'
 }
 }
 };
 ! var raumControl = {
 "Sensor_TEMP_OFFSET" : {
 "DpName" : "Sensor_TEMP_OFFSET",
 "init": 0,
 "dp": {
 "name": 'Offset Temperatur zum Sensormesswert (Ausgleich von Ungenauigkeiten)',
 "desc": 'Offset Temperatur zum Sensormesswert (Ausgleich von Ungenauigkeiten)',
 "type": 'number',
 "role": 'control.value',
 "unit": '°C'
 }
 },
 "Sensor_HUM_OFFSET" : {
 "DpName" : "Sensor_HUM_OFFSET",
 "init": 0,
 "dp": {
 "name": 'Offset Luftfeuchtigkeit zum Sensormesswert (Ausgleich von Ungenauigkeiten)',
 "desc": 'Offset Luftfeuchtigkeit zum Sensormesswert (Ausgleich von Ungenauigkeiten)',
 "type": 'number',
 "role": 'control.value',
 "unit": '%'
 }
 },
 "TEMP_Zielwert" : {
 "DpName" : "TEMP_Zielwert",
 "init": 0,
 "dp": {
 "name": 'Temperatursteuerwert zum lüften',
 "desc": 'Temperatursteuerwert zum lüften',
 "type": 'number',
 "role": 'control.value',
 "unit": '°C'
 }
 },
 "Aussensensor" : {
 "DpName" : "Aussensensor",
 "init": "",
 "dp": {
 "name": 'Aussensensor, der zum Vergleich genommen wird',
 "desc": 'Aussensensor, der zum Vergleich genommen wird',
 "type": 'string',
 "role": 'control.value'
 }
 }
 };
 ! var DP = require('dewpoint'); // Das Modul dewpoint einlesen
 var xdp = new DP(nn);
 ! function createDp() {
 var name;
 var init;
 var forceCreation;
 var common;//eric2905 Datenpunkt "Lüften" erzeugen 
 // --------------------------------------------------------------------
 createState(pfad + 'Lüften', "", {
 name: 'Muss irgendwo gelüftet werden',
 desc: 'Muss irgendwo gelüftet werden',
 type: 'boolean',
 unit: '',
 role: 'value'
 });
 // eric2905 Ende -------------------------------------------------------! //eric2905 Datenpunkt "JSON" erzeugen 
 // --------------------------------------------------------------------
 createState(pfad + 'JSON', "", {
 name: 'JSON-Ausgabe aller Werte',
 desc: 'JSON-Ausgabe aller Werte',
 type: 'string',
 unit: '',
 role: 'value'
 });
 // eric2905 Ende -------------------------------------------------------
 ! //eric2905 Datenpunkt "Aktualsierung" erzeugen
 // --------------------------------------------------------------------
 createState(pfad + 'Aktualsierung', "", {
 name: 'Aktualisierungszeitpunkt der JSON-Ausgabe',
 desc: 'Aktualisierungszeitpunkt der JSON-Ausgabe',
 type: 'string',
 unit: '',
 role: 'value'
 });
 // eric2905 Ende -------------------------------------------------------
 !
 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);
 log("neuer Datenpunkt: " + name,"debug");
 }
 for (var control in raumControl) {
 name = pfad + raum + "." + controlPfad + raumControl[control].DpName;
 //init = raumControl[control].init;
 forceCreation = skriptConf;
 common = raumControl[control].dp;
 if (typeof raeume[raum][raumControl[control].DpName] !=="undefined") {
 init = raeume[raum][raumControl[control].DpName];
 createState(name, init , forceCreation, common);
 }
 }
 }
 }
 ! function runden(wert,stellen) {
 var gerundet = Math.round(wert10stellen)/(10*stellen);
 return gerundet;
 }
 ! //eric2905 JSON erzeuen
 // --------------------------------------------------------------------
 function createJSON() {
 var temppfad = "";
 var tempVal = "";
 strJSONfinal = "[";
 strJSONtemp = "";
 for (var raum in raeume) {
 if (raum != "Aussen") {
 strJSONtemp = strJSONtemp + "{";
 strJSONtemp = strJSONtemp + ""Raum":"" + raum + "",";
 for (var datenpunktID in raumDatenpunkte) {
 temppfad = pfad + raum + "." + raumDatenpunkte[datenpunktID].DpName;
 tempVal = getState(temppfad).val;
 if(raumDatenpunkte[datenpunktID].DpName != "Lüftungsempfehlung") {
 tempVal = parseFloat(tempVal);
 tempVal = tempVal.toFixed(2);
 }
 strJSONtemp = strJSONtemp + """ + raumDatenpunkte[datenpunktID].DpName + "":"" + tempVal + "",";
 }
 strJSONtemp = strJSONtemp.substr(0, strJSONtemp.length - 1);
 strJSONtemp = strJSONtemp + "},";
 }
 }
 strJSONtemp = strJSONtemp.substr(0, strJSONtemp.length - 1);
 strJSONfinal = strJSONfinal + strJSONtemp + "]";
 // log("strJSONfinal : " + strJSONfinal);
 }
 // eric2905 Ende -------------------------------------------------------
 ! function calc(raum) { // Über Modul Dewpoint absolute Feuchte berechnen
 var t = getState(raeume[raum].Sensor_TEMP).val; // Temperatur auslesen
 var rh = getState(raeume[raum].Sensor_HUM).val; // Feuchtigkeit relativ auslesen
 var y = xdp.Calc(t, rh);
 var toffset = 0.0; // Offset in °C
 var rhoffset = 0; // Offset in %
 if(typeof raeume[raum].Sensor_TEMP_OFFSET !=="undefined") {
 var idtoffset = pfad + raum + "." + controlPfad + "Sensor_TEMP_OFFSET";
 toffset = getState(idtoffset).val; // Offset aus den Objekten/Datenpunkt auslesen
 }
 if(typeof raeume[raum].Sensor_HUM_OFFSET !=="undefined") {
 var idrhoffset = pfad + raum + "." + controlPfad + "Sensor_HUM_OFFSET";
 rhoffset = getState(idrhoffset).val; // Offset aus den Objekten/Datenpunkt auslesen
 }
 ! t = t + toffset;
 rh = rh + rhoffset;
 ! var x = y.x; // Zu errechnende Variable für Feuchtegehalt in g/kg
 var dp = y.dp; // Zu errechnende Variable für Taupunkt in °C
 ! var h = 1.00545 * t + (2.500827 + 0.00185894 * t) * x;
 ! var idx = pfad + raum + "." + raumDatenpunkte["x"].DpName;
 var iddp = pfad + raum + "." + raumDatenpunkte["dp"].DpName;
 var idt = pfad + raum + "." + raumDatenpunkte["t"].DpName;
 var idrh = pfad + raum + "." + raumDatenpunkte["rh"].DpName;
 var ih = pfad + raum + "." + raumDatenpunkte["h"].DpName;setState(idx , runden(x,2)); // errechnete absolute Feuchte in Variable schreiben setState(iddp , runden(dp,1)); // errechneter Taupunkt in Variable schreiben setState(idt , t); // Sensor Temperatur inkl. Offset setState(idrh , rh); // Sensor Relative Feuchte inkl. Offset setState(ih , runden(h,2)); // Enthalpie! // Lüften 
 if(typeof raeume[raum].Aussensensor !=="undefined") {
 var aussen = raeume[raum].Aussensensor;
 var idta = pfad + aussen + "." + raumDatenpunkte["t"].DpName;
 var idxa = pfad + aussen + "." + raumDatenpunkte["rh"].DpName;
 } else {
 return;
 }
 ! var ti = t; // Raumtemperatur in °C
 var xi = rh; // Raumfeuchtegehalt in g/kg
 var ta = getState(idta).val; // Aussentemperatur in °C
 var xa = getState(idxa).val; // Aussenfeuchtegehalt in g/kg
 if (xa == 0) return;var mi = defaultTemp; // Temperaturmittelwert auf Default! if(typeof raeume[raum].TEMP_Zielwert !=="undefined") { 
 mi = raeume[raum].TEMP_Zielwert;
 }
 var mih = mi + 0.25; // Temperaturmittelwert hoch
 var mit = mi - 0.25; // Temperaturmittelwert tief
 ! var idLueften = pfad + raum + "." + raumDatenpunkte["lüften"].DpName;// Lüftungsempfehlung steuern mit 0,3 g/kg und 0,5 K Hysterese//eric2905 Originalblock 
 // ---------------------------------------------------------------------
 //if (xa <= (xi - 0.4) && ta <= (ti - 0.6) && ti >= mih) setState(idLueften, true);
 //else if (xa >= (xi - 0.1) || ta >= (ti - 0.1) || ti <= mit) setState(idLueften, false);
 // eric2905 Ende -------------------------------------------------------if (xa <= (xi - 0.4) && ta <= (ti - 0.6) && ti >= mih) { setState(idLueften, true); anyLueften = true; } else if (xa >= (xi - 0.1) || ta >= (ti - 0.1) || ti <= mit) setState(idLueften, false);! // log("Raum: " + raum+", ti:"+ti+", ta: "+ta+", xi:"+xi+", xa: "+xa+", mih:"+mih+", mit:"+mit,"debug"); 
 }
 ! function calcAll () {
 for (var raum in raeume) {
 calc(raum);
 }
 }
 ! function Datum() {
 var jetzt = new Date();
 var jahr = String(jetzt.getFullYear());
 var monat = jetzt.getMonth() + 1;
 if(monat<10) {
 monat = "0" + String(jetzt.getMonth() + 1);
 } else {
 monat = String(jetzt.getMonth() + 1);
 }
 var tag = jetzt.getDate();
 if(tag<10) {
 tag = "0" + String(jetzt.getDate());
 } else {
 tag = String(jetzt.getDate());
 }
 var stunden = jetzt.getHours();
 if(stunden<10) {
 stunden = "0" + String(jetzt.getHours());
 } else {
 stunden = String(jetzt.getHours());
 }
 var minuten = jetzt.getMinutes();
 if(minuten<10) {
 minuten = "0" + String(jetzt.getMinutes());
 } else {
 minuten = String(jetzt.getMinutes());
 }
 var sekunden = jetzt.getSeconds();
 if(sekunden<10) {
 sekunden = "0" + String(jetzt.getSeconds());
 } else {
 sekunden = String(jetzt.getSeconds());
 }
 strDatum = tag + "."+ monat + "." + jahr + " - " + stunden + ":" + minuten + ":" + sekunden;
 }
 ! // alle zwei Minuten neu berechnen
 schedule("*/2 * * * *", function () {
 calcAll();
 // eric2905 Aufruf eingebaut und Datenpunkt befüllen
 // ---------------------------------------------------------------------
 createJSON();
 Datum();
 setState(pfad + 'Lüften', anyLueften);
 setState(pfad + 'JSON', strJSONfinal);
 setState(pfad + 'Aktualsierung', strDatum);
 // eric2905 Ende -------------------------------------------------------
 });
 ! function main() {
 calcAll();// eric2905 Aufruf eingebaut und Datenpunkt befüllen 
 // ---------------------------------------------------------------------
 createJSON();
 Datum();
 setState(pfad + 'Lüften', anyLueften);
 setState(pfad + 'JSON', strJSONfinal);
 setState(pfad + 'Aktualsierung', strDatum);
 // eric2905 Ende -------------------------------------------------------! } 
 ! createDp(); // Datenpunkte anlegen
 setTimeout(main, 500); // Zum Skriptstart ausführen
 ! ````Und hier ein Widget-Export für die JSON-Anzeige (den Datenpunkt "Enthalpie" habe ich ausgeblendet) ! ```` 
 [{"tpl":"tplTableBody","data":{"visibility-cond":"==","visibility-val":1,"static_value":"","gestures-offsetX":0,"gestures-offsetY":0,"signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"colCount":"6","hide_header":false,"colWidth1":"20%","colName1":"Raum","colAttr1":"Raum","colWidth2":"20%","colName2":"Abs. Feuchte (g/kg)","colName3":"Rel. Feuchte (%)","colWidth3":"15","colWidth4":"15%","colWidth5":"15%","colWidth7":"10%","colName7":"Lüften","colAttr6":"Lüftungsempfehlung","colName6":"Lüften","colWidth6":"15%","table_oid":"javascript.0.Raumklima.JSON","colName4":"Taupunkt (ºC)","colName5":"Temperatur (ºC)"},"style":{"left":"45px","top":"85px","width":"921px","height":"540px","z-index":"20","text-align":"center","font-family":"Arial, Helvetica, sans-serif","font-size":"medium"},"widgetSet":"basic"}]Schaut Euch mal an - Rückmeldungen sind absolut erwünscht !!! Gruß, Eric
- 
					
					
					
					
 Rückmeldung: Wahnsinn, was Paul und du da getippt haben! Ich hatte ja schon beim erweitern der Räume und Eintragen der Seriennummern zu tun  Aber der Rest ist ja Wahnsinn. So! Läuft! <size size="50">(nicht ganz)</size> Die JSON-Datei wird wohl nicht angelegt. 
  
 Habe ich erst gemerkt, als das Widget leer blieb.Gruß Rainer 
- 
					
					
					
					
 Bei mir ist das JSON Objekt gefüllt, hab aber das Script neu in meine Sammlung aufgenommen! Super Arbeit, danke dafür [emoji1360] Gesendet von meinem iPhone mit Tapatalk 
- 
					
					
					
					
 Hmmm, wird der Datenpunkt "Aktualisierung" angefasst? Sollte ja alle 2 Minuten laufen. [Edit]Leg erst mal mind. das Außenthermometer und einen Raum an. Ich filtere das Außenthermometer aus. Wenn es dann keinen Raum gibt, kann ja auch nichts geschrieben werden. Gruß, Eric 
- 
					
					
					
					
 Nope! ich sehe gerade eine Fehlermeldung: 19:43:43.628 [error] TypeError: Cannot read property 'val' of null at calc (script.js.Klima.Feuchteberechnung:450:57) at calcAll (script.js.Klima.Feuchteberechnung:530:9) at Object.main (script.js.Klima.Feuchteberechnung:590:5) at null. (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:1800:44) at ontimeout [as _onTimeout] (timers.js:209:34) at Timer.listOnTimeout (timers.js:92:15)Muss ich für später bereits angelegte Räume (die allerdiings existente Datenpunkte aus anderen Räumen haben) löschen? Gruß Raiiner 
- 
					
					
					
					
 Poste mal bitte den Block mit den Raum-Definitionen. Hast Du in dem Block die IDs der Thermostate angepasst (da stehen Demowerte drin)? Gruß, Eric 
- 
					
					
					
					
 Gerne: ! // ----------------------------------------------------------------------------- // Räume mit Sensoren // ----------------------------------------------------------------------------- var raeume = { // Keine Leerzeichen (Name wird als Datenpunktname verwendet!) // Sensoren Aussen "Aussen" : { "Sensor_TEMP" : "hm-rpc.1.JEQ0140901.1.TEMPERATURE" /*Aussenthermometer:1.TEMPERATURE*/, "Sensor_HUM" : "hm-rpc.1.JEQ0140901.1.HUMIDITY" /*Aussenthermometer:1.HUMIDITY*/, "Sensor_TEMP_OFFSET" : 0.0, "Sensor_HUM_OFFSET" : 0 }, // Sensoren Innen "Werkstatt" : { "Sensor_TEMP" : "hm.rpc.1.JEQ0046663.1.TEMPERATURE", "Sensor_HUM" : "hm-rpc.1.JEQ0046663.1.HUMIDITY", "Sensor_TEMP_OFFSET" : 0.0, "Sensor_HUM_OFFSET" : 0, "TEMP_Zielwert" : 21, "Aussensensor" : "Aussen" }, "Bad" : { "Sensor_TEMP" : "hm-rpc.1.JEQ0064523.1.TEMPERATURE", "Sensor_HUM" : "hm-rpc.1.JEQ0064523.1.HUMIDITY", "Sensor_TEMP_OFFSET" : 0.0, "Sensor_HUM_OFFSET" : 0, "TEMP_Zielwert" : 21, "Aussensensor" : "Aussen" }, "Dachstudio" : { "Sensor_TEMP" : "hm-rpc.1.JEQ0267518.1.TEMPERATURE", "Sensor_HUM" : "hm-rpc.1.JEQ0267518.1.HUMIDITY", "Sensor_TEMP_OFFSET" : 0.0, "Sensor_HUM_OFFSET" : 0, "TEMP_Zielwert" : 21, "Aussensensor" : "Aussen" }, "Schlafzimmer" : { "Sensor_TEMP" : "hm-rpc.1.LEQ0080851.1.TEMPERATURE", "Sensor_HUM" : "hm-rpc.1.LEQ0080851.1.HUMIDITY", "Sensor_TEMP_OFFSET" : 0.0, "Sensor_HUM_OFFSET" : 0, "TEMP_Zielwert" : 21, "Aussensensor" : "Aussen" }, "Esszimmer" : { "Sensor_TEMP" : "hm-rpc.1.LEQ0081020.1.TEMPERATURE", "Sensor_HUM" : "hm-rpc.1.LEQ0081020.1.HUMIDITY", "Sensor_TEMP_OFFSET" : 0.0, "Sensor_HUM_OFFSET" : 0, "TEMP_Zielwert" : 21, "Aussensensor" : "Aussen" }, "Bureau" : { "Sensor_TEMP" : "hm-rpc.1.LEQ0440620.1.TEMPERATURE", "Sensor_HUM" : "hm-rpc.1.LEQ0440620.1.HUMIDITY", "Sensor_TEMP_OFFSET" : 0.0, "Sensor_HUM_OFFSET" : 0, "TEMP_Zielwert" : 21, "Aussensensor" : "Aussen" }, "Sauna" : { "Sensor_TEMP" : "hm-rpc.1.MEQ0180889.1.TEMPERATURE", "Sensor_HUM" : "hm-rpc.1.MEQ0180889.1.HUMIDITY", "Sensor_TEMP_OFFSET" : 0.0, "Sensor_HUM_OFFSET" : 0, "TEMP_Zielwert" : 21, "Aussensensor" : "Aussen" }, "Gast" : { "Sensor_TEMP" : "hm-rpc.1.MEQ0479049.1.TEMPERATURE", "Sensor_HUM" : "hm-rpc.1.MEQ0479049.1.HUMIDITY", "Sensor_TEMP_OFFSET" : 0.0, "Sensor_HUM_OFFSET" : 0, "TEMP_Zielwert" : 21, "Aussensensor" : "Aussen" }, "Bureau2" : { "Sensor_TEMP" : "hm-rpc.1.LEQ0440620.1.TEMPERATURE", "Sensor_HUM" : "hm-rpc.1.LEQ0440620.1.HUMIDITY", "Sensor_TEMP_OFFSET" : 0.0, "Sensor_HUM_OFFSET" : 0, "TEMP_Zielwert" : 21, "Aussensensor" : "Aussen" }, "Bureau3" : { "Sensor_TEMP" : "hm-rpc.1.LEQ0440620.1.TEMPERATURE", "Sensor_HUM" : "hm-rpc.1.LEQ0440620.1.HUMIDITY", "Sensor_TEMP_OFFSET" : 0.0, "Sensor_HUM_OFFSET" : 0, "TEMP_Zielwert" : 21, "Aussensensor" : "Aussen" } }; !
- 
					
					
					
					
 Sieht erst mal ok aus. Kurze Frage : "hm-rpc.1" ist korrekt? Was sagt denn das Log? Gruß, Eric 
- 
					
					
					
					
 
- 
					
					
					
					
 Seltsam. Versuche es bitte mal nur mit dem Aussenthermometer und einem Raum. Zumindest dieRäume müssen als Datenpunkte usw. angelegt werden. Wie sieht der Datenbaum aus? Gruß, Eric 
- 
					
					
					
					
 Achtung Missverständnis! ich glaube wir reden aneinander vorbei. Zumindest dieRäume müssen als Datenpunkte usw. angelegt werden. ` 
 sind si ja auch!Wie sieht der Datenbaum aus? ` 
 Der ist IMHO komplett in Ordnung.Nur die Datenpunkte json und Aktualisiereung sind leer. Gruß Rainer 
- 
					
					
					
					
 Lösch mal bitte den Datenbaum ab "Raumklima" und dann starte das Script mal neu (bitte 2-3 mal das Script neu starten). Dann bitte einen Screenshot des Datenbaums mit einem aufgeklappten Raum-Ordner aber sichtbaren Aktualisierungs- und JSON-Datenpunkt. Gruß, Eric [Nachtrag] Das NPM-Modul "dewpoint" hast Du aber drin? 
- 
					
					
					
					
 Bitte, wie gewünscht: 
  Habe sogar die javascript Instanz neu gestartet. Dewpoint hatte ich beim ersten Schuss vergessen - wer liest schon die ersten Zeilen im Skript :lol: Ist jetzt aber schon lange drin. Nicht dass wir uns Missverstehen: Bis auf json und dessen Aktualisierung scheint alles drin zu sein, der alte Screenshot war nur gefiltert. Gruß rainer 
- 
					
					
					
					
 Habe jetzt doch noch eine Error, weiß aber nicht, ob der mit dir zu tun hat: hm-rega-1 05 21:03:33.811 error runScriptFile Error: ENOENT: no such file or directory, open '/opt/iobroker/node_modules/iobroker.hm-rega/lib/../regascripts/alarms.fn'EDIT: Das Skript hat auf jeden Fall immer wieder meinen javascript Adapter ins aus gekickt. Der Adapter brauchte nachher immer >70% CPU un dann war er weg. Adapter neu starten uund das gleiche Spiel von vorne. Habe jetzt erst festgestellt, dass ALLE berechneten Werte fehlen. Nur die nativen Werte sind drin: 
  Ich finde aber auch den Fehler nicht. Gruß Rainer 
- 
					
					
					
					
 Moin Rainer, Das Skript hat auf jeden Fall immer wieder meinen javascript Adapter ins aus gekickt. Der Adapter brauchte nachher immer >70% CPU un dann war er weg. Adapter neu starten uund das gleiche Spiel von vorne. ` 
 das verstehe ich nicht.Bei mir (Cubietruck) läuft der Prozess io.javascript.0 im Durchschnitt mit 3 - 8 % CPU-Last (laut TOP). Wenn ich das Raumklima-Script manuell anstoße, geht die CPU-Last für einen ganz kurzen Moment auf max. 35% hoch - aber nur für ein Messintervall, danach ist er sofort wieder unten. {edit} Ich habe den Code nochmals etwas angepasst: - 
Wartezeit nach Anlegend er Datenpunkt von 500ms auf 5000ms erhöht (500ms war zu kurz und hat Fehler erzeugt) 
- 
Bool "logging" eingeabut. Wenn auf true gesetzt, werden im Log einige Infos erzeugt 
 Hier der neue Code (Demo-Raumdaten !!!) ! ```` 
 // Berechnet Taupunkt, absolute Luftfeuchtigkeit, Enthalpie, Lüftungsempfehlung,
 //gemessene Temperatur & Luftfeuctigkeit inkl. Offset zwecks Kalibrierung
 // -----------------------------------------------------------------------------
 // benötigt in der Javascript das Modul "dewpoint"
 // (in der Javascript-Instanz Einstellungen unter "Zusätzliche NPM-Module")
 // -----------------------------------------------------------------------------
 // von paul53 übernommen und angepasst
 // http://forum.iobroker.net/viewtopic.php?f=20&t=2437&hilit=Lüftung*#p21476
 // und Solear: http://forum.iobroker.net/viewtopic.php?f=21&t=2645&p=23381#p23282
 // -----------------------------------------------------------------------------
 // 05.06.2015 Anpassung ericc2905
 // Boolean "anyLueften", Datenpunkt "Lueften", Datenpunkt "Aktualisierung" und JSON-Ausgabe eingebaut
 // -----------------------------------------------------------------------------
 // 06.06.2015 Anpassung ericc2905
 // Logging (über Bool "logging" eingebaut)
 ! var nn = 273; // eigene Höhe nn (normalnull), z.B. über http://de.mygeoposition.com zu ermitteln
 var pfad = "Raumklima" +"."; // Pfad unter dem die Datenpunkte in der Javascript-Instanz angelegt werden
 var controlPfad = "CONTROL" +"."; // Pfad innerhalb des Raums
 var skriptConf = true; // true: Raumwerte werden über das Skript geändert / false: Raumwerte werden über Objekte (oder VIS) geändert
 var defaultTemp = 21; // Default TEMP_Zielwert, wenn im Raum nicht angegeben
 ! // eric2905 Zusätzliche Variablen definieren
 // --------------------------------------------------------------------
 var anyLueften = false; // false: Nirgendwo lüften notwendig / true: Lüften notwendig
 var strJSONfinal = ""; // Fertiges JSON (zum Schreiben in Datenpunkt)
 var strJSONtemp = ""; // Bastel-JSON (wird suksessive gefüllt)
 var strDatum = ""; // Datums der Aktualisierung
 var logging = false; // Sollen Log-Infos ausgegeben werden? [ja/nein]
 // eric2905 Ende -------------------------------------------------------
 ! // -----------------------------------------------------------------------------
 // Räume mit Sensoren
 // -----------------------------------------------------------------------------
 var raeume = { // Keine Leerzeichen (Name wird als Datenpunktname verwendet!)
 // Sensoren Aussen
 "Aussen" : {
 "Sensor_TEMP" : "hm-rpc.0.IEQ1234560.1.TEMPERATURE",
 "Sensor_HUM" : "hm-rpc.0.IEQ1234560.1.HUMIDITY",
 "Sensor_TEMP_OFFSET" : 0.0,
 "Sensor_HUM_OFFSET" : 0
 },
 // Sensoren Innen
 "Raum1" : {
 "Sensor_TEMP" : "hm-rpc.0.IEQ1234561.1.TEMPERATURE",
 "Sensor_HUM" : "hm-rpc.0.IEQ1234561.1.HUMIDITY",
 "Sensor_TEMP_OFFSET" : 0.0,
 "Sensor_HUM_OFFSET" : 0,
 "TEMP_Zielwert" : 21,
 "Aussensensor" : "Aussen"
 },
 "Raum2" : {
 "Sensor_TEMP" : "hm-rpc.0.IEQ1234562.1.TEMPERATURE",
 "Sensor_HUM" : "hm-rpc.0.IEQ1234562.1.HUMIDITY",
 "Sensor_TEMP_OFFSET" : 0.0,
 "Sensor_HUM_OFFSET" : 0,
 "TEMP_Zielwert" : 21,
 "Aussensensor" : "Aussen"
 },
 "Raum3" : {
 "Sensor_TEMP" : "hm-rpc.0.IEQ1234563.1.TEMPERATURE",
 "Sensor_HUM" : "hm-rpc.0.IEQ1234563.1.HUMIDITY",
 "Sensor_TEMP_OFFSET" : 0.0,
 "Sensor_HUM_OFFSET" : 0,
 "TEMP_Zielwert" : 21,
 "Aussensensor" : "Aussen"
 }
 };
 ! // =============================================================================
 // Skriptbereich. Ab hier muss nichts mehr eingestellt / verändert werden.
 // =============================================================================
 var raumDatenpunkte = {
 "x" : {
 "DpName" : "Feuchtegehalt_Absolut",
 "init": 0,
 "dp": {
 "name": 'absoluter Feuchtegehalt',
 "desc": 'absoluter Feuchtegehalt, errechnet',
 "type": 'number',
 "role": 'value',
 "unit": 'g/kg'
 }
 },
 "rh" : {
 "DpName" : "relative_Luftfeuchtigkeit",
 "init": 0,
 "dp": {
 "name": 'gemessene relative Luftfeuchtigkeit (inkl. Offset)',
 "desc": 'relative Luftfeuchtigkeit, vom Sensor + Offset zum Ausgleich von Messungenauigkeiten des Geräts',
 "type": 'number',
 "role": 'value',
 "unit": '%'
 }
 },
 "dp" : {
 "DpName" : "Taupunkt",
 "init": 0,
 "dp": {
 "name": 'Taupunkt',
 "desc": 'Taupunkt. Temperatur von Wänden, Fenstern, usw. ab der sich die Feuchtigkeit niederschlägt.',
 "type": 'number',
 "role": 'value',
 "unit": '°C'
 }
 },
 "t" : {
 "DpName" : "Temperatur",
 "init": 0,
 "dp": {
 "name": 'gemessene Temperatur (inkl. Offset)',
 "desc": 'gemessene Temperatur vom Sensor zzgl. eines Offsets um Geräteungenauigkeiten auszugleichen',
 "type": 'number',
 "role": 'value',
 "unit": '°C'
 }
 },
 "h" : {
 "DpName" : "Enthalpie",
 "init": 0,
 "dp": {
 "name": 'Enthalpie',
 "desc": 'Enthalpie',
 "type": 'number',
 "role": 'value',
 "unit": 'kJ/kg'
 }
 },
 "lüften" : {
 "DpName" : "Lüftungsempfehlung",
 //"init": false,
 "dp": {
 "name": 'Lüftungsempfehlung',
 "desc": 'Lüftungsempfehlung',
 "type" : 'boolean',
 "role": 'value'
 }
 }
 };
 ! var raumControl = {
 "Sensor_TEMP_OFFSET" : {
 "DpName" : "Sensor_TEMP_OFFSET",
 "init": 0,
 "dp": {
 "name": 'Offset Temperatur zum Sensormesswert (Ausgleich von Ungenauigkeiten)',
 "desc": 'Offset Temperatur zum Sensormesswert (Ausgleich von Ungenauigkeiten)',
 "type": 'number',
 "role": 'control.value',
 "unit": '°C'
 }
 },
 "Sensor_HUM_OFFSET" : {
 "DpName" : "Sensor_HUM_OFFSET",
 "init": 0,
 "dp": {
 "name": 'Offset Luftfeuchtigkeit zum Sensormesswert (Ausgleich von Ungenauigkeiten)',
 "desc": 'Offset Luftfeuchtigkeit zum Sensormesswert (Ausgleich von Ungenauigkeiten)',
 "type": 'number',
 "role": 'control.value',
 "unit": '%'
 }
 },
 "TEMP_Zielwert" : {
 "DpName" : "TEMP_Zielwert",
 "init": 0,
 "dp": {
 "name": 'Temperatursteuerwert zum lüften',
 "desc": 'Temperatursteuerwert zum lüften',
 "type": 'number',
 "role": 'control.value',
 "unit": '°C'
 }
 },
 "Aussensensor" : {
 "DpName" : "Aussensensor",
 "init": "",
 "dp": {
 "name": 'Aussensensor, der zum Vergleich genommen wird',
 "desc": 'Aussensensor, der zum Vergleich genommen wird',
 "type": 'string',
 "role": 'control.value'
 }
 }
 };
 ! var DP = require('dewpoint'); // Das Modul dewpoint einlesen
 var xdp = new DP(nn);
 ! function createDp() {
 var name;
 var init;
 var forceCreation;
 var common;if (logging) log("Start Erzeugung Datenpunkte");//eric2905 Datenpunkt "Lüften" erzeugen 
 // --------------------------------------------------------------------
 createState(pfad + 'Lüften', "", {
 name: 'Muss irgendwo gelüftet werden',
 desc: 'Muss irgendwo gelüftet werden',
 type: 'boolean',
 unit: '',
 role: 'value'
 });
 if (logging) log("Datenpunkt Lüften erzeugt");
 // eric2905 Ende -------------------------------------------------------! //eric2905 Datenpunkt "JSON" erzeugen 
 // --------------------------------------------------------------------
 createState(pfad + 'JSON', "", {
 name: 'JSON-Ausgabe aller Werte',
 desc: 'JSON-Ausgabe aller Werte',
 type: 'string',
 unit: '',
 role: 'value'
 });
 if (logging === true) log("Datenpunkt JSON erzeugt")
 // eric2905 Ende -------------------------------------------------------
 ! //eric2905 Datenpunkt "Aktualsierung" erzeugen
 // --------------------------------------------------------------------
 createState(pfad + 'Aktualsierung', "", {
 name: 'Aktualisierungszeitpunkt der JSON-Ausgabe',
 desc: 'Aktualisierungszeitpunkt der JSON-Ausgabe',
 type: 'string',
 unit: '',
 role: 'value'
 });
 if (logging) log("Datenpunkt Aktualisierung erzeugt");
 // eric2905 Ende -------------------------------------------------------
 !
 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);
 log("neuer Datenpunkt: " + name,"debug");
 }
 for (var control in raumControl) {
 name = pfad + raum + "." + controlPfad + raumControl[control].DpName;
 //init = raumControl[control].init;
 forceCreation = skriptConf;
 common = raumControl[control].dp;
 if (typeof raeume[raum][raumControl[control].DpName] !=="undefined") {
 init = raeume[raum][raumControl[control].DpName];
 createState(name, init , forceCreation, common);
 }
 }
 }
 }
 ! function runden(wert,stellen) {
 var gerundet = Math.round(wert10stellen)/(10*stellen);
 return gerundet;
 }
 ! //eric2905 JSON erzeuen
 // --------------------------------------------------------------------
 function createJSON() {
 var temppfad = "";
 var tempVal = "";
 strJSONfinal = "[";
 strJSONtemp = "";
 if (logging) log("Erzeugung JSON gestartet");
 for (var raum in raeume) {
 if (raum != "Aussen") {
 strJSONtemp = strJSONtemp + "{";
 strJSONtemp = strJSONtemp + ""Raum":"" + raum + "",";
 for (var datenpunktID in raumDatenpunkte) {
 temppfad = pfad + raum + "." + raumDatenpunkte[datenpunktID].DpName;
 tempVal = getState(temppfad).val;
 if(raumDatenpunkte[datenpunktID].DpName != "Lüftungsempfehlung") {
 tempVal = parseFloat(tempVal);
 tempVal = tempVal.toFixed(2);
 }
 strJSONtemp = strJSONtemp + """ + raumDatenpunkte[datenpunktID].DpName + "":"" + tempVal + "",";
 }
 strJSONtemp = strJSONtemp.substr(0, strJSONtemp.length - 1);
 strJSONtemp = strJSONtemp + "},";
 }
 }
 strJSONtemp = strJSONtemp.substr(0, strJSONtemp.length - 1);
 strJSONfinal = strJSONfinal + strJSONtemp + "]";
 if (logging) log("strJSONfinal : " + strJSONfinal);
 }
 // eric2905 Ende -------------------------------------------------------
 ! function calc(raum) { // Über Modul Dewpoint absolute Feuchte berechnen
 var t = getState(raeume[raum].Sensor_TEMP).val; // Temperatur auslesen
 var rh = getState(raeume[raum].Sensor_HUM).val; // Feuchtigkeit relativ auslesen
 var y = xdp.Calc(t, rh);
 var toffset = 0.0; // Offset in °C
 var rhoffset = 0; // Offset in %
 if (logging) log("Function CALC gestartet");
 if(typeof raeume[raum].Sensor_TEMP_OFFSET !=="undefined") {
 var idtoffset = pfad + raum + "." + controlPfad + "Sensor_TEMP_OFFSET";
 toffset = getState(idtoffset).val; // Offset aus den Objekten/Datenpunkt auslesen
 }
 if(typeof raeume[raum].Sensor_HUM_OFFSET !=="undefined") {
 var idrhoffset = pfad + raum + "." + controlPfad + "Sensor_HUM_OFFSET";
 rhoffset = getState(idrhoffset).val; // Offset aus den Objekten/Datenpunkt auslesen
 }
 ! t = t + toffset;
 rh = rh + rhoffset;
 ! var x = y.x; // Zu errechnende Variable für Feuchtegehalt in g/kg
 var dp = y.dp; // Zu errechnende Variable für Taupunkt in °C
 ! var h = 1.00545 * t + (2.500827 + 0.00185894 * t) * x;
 ! var idx = pfad + raum + "." + raumDatenpunkte["x"].DpName;
 var iddp = pfad + raum + "." + raumDatenpunkte["dp"].DpName;
 var idt = pfad + raum + "." + raumDatenpunkte["t"].DpName;
 var idrh = pfad + raum + "." + raumDatenpunkte["rh"].DpName;
 var ih = pfad + raum + "." + raumDatenpunkte["h"].DpName;setState(idx , runden(x,2)); // errechnete absolute Feuchte in Variable schreiben setState(iddp , runden(dp,1)); // errechneter Taupunkt in Variable schreiben setState(idt , t); // Sensor Temperatur inkl. Offset setState(idrh , rh); // Sensor Relative Feuchte inkl. Offset setState(ih , runden(h,2)); // Enthalpie! // Lüften 
 if(typeof raeume[raum].Aussensensor !=="undefined") {
 var aussen = raeume[raum].Aussensensor;
 var idta = pfad + aussen + "." + raumDatenpunkte["t"].DpName;
 var idxa = pfad + aussen + "." + raumDatenpunkte["rh"].DpName;
 } else {
 return;
 }
 ! var ti = t; // Raumtemperatur in °C
 var xi = rh; // Raumfeuchtegehalt in g/kg
 var ta = getState(idta).val; // Aussentemperatur in °C
 var xa = getState(idxa).val; // Aussenfeuchtegehalt in g/kg
 if (xa == 0) return;var mi = defaultTemp; // Temperaturmittelwert auf Default! if(typeof raeume[raum].TEMP_Zielwert !=="undefined") { 
 mi = raeume[raum].TEMP_Zielwert;
 }
 var mih = mi + 0.25; // Temperaturmittelwert hoch
 var mit = mi - 0.25; // Temperaturmittelwert tief
 ! var idLueften = pfad + raum + "." + raumDatenpunkte["lüften"].DpName;// Lüftungsempfehlung steuern mit 0,3 g/kg und 0,5 K Hysterese//eric2905 Originalblock 
 // ---------------------------------------------------------------------
 //if (xa <= (xi - 0.4) && ta <= (ti - 0.6) && ti >= mih) setState(idLueften, true);
 //else if (xa >= (xi - 0.1) || ta >= (ti - 0.1) || ti <= mit) setState(idLueften, false);
 // eric2905 Ende -------------------------------------------------------if (xa <= (xi - 0.4) && ta <= (ti - 0.6) && ti >= mih) { setState(idLueften, true); anyLueften = true; } else if (xa >= (xi - 0.1) || ta >= (ti - 0.1) || ti <= mit) setState(idLueften, false); if (logging) log("Raumwete : " + raum+", ti:"+ti+", ta: "+ta+", xi:"+xi+", xa: "+xa+", mih:"+mih+", mit:"+mit,"debug");} ! function calcAll () { 
 for (var raum in raeume) {
 calc(raum);
 }
 }
 ! function Datum() {
 var jetzt = new Date();
 var jahr = String(jetzt.getFullYear());
 var monat = jetzt.getMonth() + 1;
 if(monat<10) {
 monat = "0" + String(jetzt.getMonth() + 1);
 } else {
 monat = String(jetzt.getMonth() + 1);
 }
 var tag = jetzt.getDate();
 if(tag<10) {
 tag = "0" + String(jetzt.getDate());
 } else {
 tag = String(jetzt.getDate());
 }
 var stunden = jetzt.getHours();
 if(stunden<10) {
 stunden = "0" + String(jetzt.getHours());
 } else {
 stunden = String(jetzt.getHours());
 }
 var minuten = jetzt.getMinutes();
 if(minuten<10) {
 minuten = "0" + String(jetzt.getMinutes());
 } else {
 minuten = String(jetzt.getMinutes());
 }
 var sekunden = jetzt.getSeconds();
 if(sekunden<10) {
 sekunden = "0" + String(jetzt.getSeconds());
 } else {
 sekunden = String(jetzt.getSeconds());
 }
 strDatum = tag + "."+ monat + "." + jahr + " - " + stunden + ":" + minuten + ":" + sekunden;
 }
 ! // alle zwei Minuten neu berechnen
 schedule("*/2 * * * *", function () {
 calcAll();
 // eric2905 Aufruf eingebaut und Datenpunkt befüllen
 // ---------------------------------------------------------------------
 createJSON();
 Datum();
 setState(pfad + 'Lüften', anyLueften);
 setState(pfad + 'JSON', strJSONfinal);
 setState(pfad + 'Aktualsierung', strDatum);
 // eric2905 Ende -------------------------------------------------------
 });
 ! function main() {
 calcAll();// eric2905 Aufruf eingebaut und Datenpunkt befüllen 
 // ---------------------------------------------------------------------
 createJSON();
 Datum();
 setState(pfad + 'Lüften', anyLueften);
 setState(pfad + 'JSON', strJSONfinal);
 setState(pfad + 'Aktualsierung', strDatum);
 // eric2905 Ende -------------------------------------------------------! } 
 ! if (logging) {
 log("----------------------------------------------------------");
 log("Script-Start");
 log("----------------------------------------------------------");
 }
 createDp(); // Datenpunkte anlegen
 if (logging) log("Datenpunkte angelegt");
 setTimeout(main, 5000); // Zum Skriptstart ausführen
 ! ````
 {/edit}Hat sonst noch jemand ähnliche Phänomene? Gruß, Eric 
- 
- 
					
					
					
					
 Hallo Eric, hilft nicht, der Fehler schein woanders: TypeError: Cannot read property 'val' of null at calc (script.js.Klima.Feuchteberechnung:458:57) at calcAll (script.js.Klima.Feuchteberechnung:538:9) at Object.main (script.js.Klima.Feuchteberechnung:598:5) at null. (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:1800:44) at ontimeout [as _onTimeout] (timers.js:209:34) at Timer.listOnTimeout (timers.js:92:15)script.js.Klima.Feuchteberechnung:458:57 
 ` > var tag = jetzt.getDate();if(tag<10) { tag = "0" + String(jetzt.getDate()); } else { tag = "0" + String(jetzt.getDate()); ` script.js.Klima.Feuchteberechnung:538:9 Sind das nicht Zeilennummern? Diese Zeile gibt es nicht. EDIT: Habe alle Skripte deaktiviert, javascript auf debug gestellt, und Instanz neu gestartet. Jetzt gerade eine Fehlermeldung: javascript-0 2016-06-06 08:24:12.430 warn State "hm.rpc.1.JEQ0046663.1.TEMPERATURE" not foundMuss mal sehen, wo der Wurm drin ist. ****EDIT2: Läuft!!! da war ein Punkt, statt eines Bindestrichs! Das muss man erst mal sehen. DANKE nochmal.**** Danke erst mal Rainer 
- 
					
					
					
					
 Läuft!!! ` 
 Das ließt man doch gerne Dafür ist jetzt ein Logging mit drin, das man per Bool ein-/ausschalten kann. Ich baue die Funktion "createJSON" noch dahin um, das auch die Aussenwerte mit aufgenommen werden - das sieht dann einfach schöner aus. Noch eine Frage an die ursprünglichen Script-Ersteller: Ist die Einheit für die absolute Feuchte tatsächlich "g/kg" (ist so in der Datenpunkt-Definition angegeben)? Ich lese immer nur von "g/m3". Gruß, Eric 
- 
					
					
					
					
 Der Begriff "absolute Luftfeuchte" wird sowohl für g Wasser pro kg trockene Luft (auch Feuchtegehalt oder Mischungsverhältnis genannt) als auch für g Wasser pro m³ feuchte Luft verwendet, wobei g/m³ häufiger ist. Deshalb bevorzuge ich die Bezeichnung "Feuchtegehalt" für g/kg. Bei der Auslegung von Luftaufbereitungsanlagen wird mit dem https://de.wikipedia.org/wiki/Mollier-h-x-Diagramm gearbeitet und der Feuchtegehalt x verwendet. 
- 
					
					
					
					
 Hi paul53, danke für die Info. Was hast Du denn eingesetzt / verwendet? Sofern ich verstanden habe, ist das ursprüngliche Berechnungs-Script ja von Dir. Dann passe ich später die Ausgaben so an, das dort eine eindeutige Bezeichnung steht. Danke und Gruß, Eric 
 
		
	 
		
	 
			
		 
			
		