HomeMatic Tutorial

HomeMatic – CCU Abstürze durch zu viele Skriptvariablen verhindern

WebUI

Mittlerweile wurde bekannt und auch vom Hersteller eingeräumt, dass auf einer HomeMatic-Zentrale maximal 200 Variablen deklariert werden können. Hierbei sind die in den Skripten intern genutzten Variablen gemeint, nicht die Systemvariablen. Die Zahl 200 markiert dabei die Gesamtanzahl von Skriptvariablen in allen verwendeten Skripten. Bei Überschreiten dieser Zahl kommt es nach einiger Zeit dazu, dass Programme nicht mehr laufen oder die CCU abstürzt.


Update Juli 2017

Mit der CCU2 Firmware 2.29.18 wurde dieser Fehler (in den Logikschicht Versionen „Standard“ und „Community“) offensichtlich behoben. Ab dieser Version sollte man auf die temporären Skript-Variablen verzichten können.

Die 200 Skriptvariablen erreicht man bei intensiver Nutzung des Systems recht schnell, so führten auch bei mir zuletzt 234 Skriptvariablen regelmäßig zu den genannten Phänomenen.

Falls sich die eigene Installation dieser Größe nähert oder sie gar bereits überschritten hat, ist es an der Zeit zu handeln. Die herstellerseitige Lösung des Problems im Rahmen eines Firmwareupdates wurde nicht wirklich in Aussicht gestellt. So sollte man sich anderweitig behelfen.

Im HomeMatic Forum gibt es hierzu mehrere Ansätze. Ich habe mich für die Variante entschieden, die internen Skriptvariablen in allen genutzten Skripten durch „temporäre Variablen“ zu ersetzen und zwar nach dem Schema…


tmpA bis tmpZ

…und falls das noch nicht reicht, zusätzlich noch…


tmpA1 bis tmpZ1

…, sodass bei konsequenter Nutzung maximal 52 Skriptvariablen benötigt werden. Dort sind auch einige gängige Skripte nach der Methode angepasst hinterlegt.

Man kann die Skripte zwar nahezu nicht mehr verstehen aber wenn es der Sache dient 😉 . Ich empfehle, eventuelle Anpassungen und Versuche mit den Original-Skripten anzustellen und diese dann anzupassen, wenn alles klappt.


Übrigens hat es offensichtlich keine negativen Auswirkungen, wenn man ein Skript in der „Skript testen“-Funktion des WebUI oder im erweiterten Skript Parser ausführt. Erst bei Erstellen eines neuen Skriptes bzw. Benutzen der „Fehlerprüfung“ werden die Variablen in den Cache geschrieben und bis zum nächsten Reboot der CCU nicht mehr gelöscht.

Die entsprechend umgestellten wesentlichen Skripte aus meinen Tutorials habe ich nachfolgend zusammengefasst. Falls jemand diesen Lösungsansatz verwenden möchte, spart er sich somit die eigenhändige Umstellung. Die Skripte brauchen – sofern sie nicht verändert wurden – nur eins zu eins ersetzt zu werden.

Derzeit habe ich so insgesamt auf gut 100 Skriptvariablen reduzieren können und es läuft wieder ganz stabil.

HomeMatic – Stromzähler auswerten Version 2 mit HM-EM-TX-WM

Auswerteskript:

object tmpA = dom.GetObject("BidCos-RF.MEQ00XXXXX:1.POWER");
object tmpB = dom.GetObject("BidCos-RF.MEQ00XXXXX:1.ENERGY_COUNTER");
var tmpC = dom.GetObject("Strom ENERGY_COUNTER");
var tmpD = dom.GetObject("Strom Referenz Zaehlerstand");
var tmpE = dom.GetObject("Strom Zaehlerstand");
var tmpF = dom.GetObject("Strom Leistungsaufnahme aktuell");
var tmpG = dom.GetObject("Strom Referenz Verbrauch seit letzter Ablesung");
var tmpH = dom.GetObject("Strom Verbrauch seit letzter Ablesung");
var tmpI = dom.GetObject("Strom Referenz Verbrauch heute");
var tmpJ = dom.GetObject("Strom Verbrauch heute");
var tmpK = dom.GetObject("Strom Referenz Verbrauch laufende Woche");
var tmpL = dom.GetObject("Strom Verbrauch laufende Woche");
var tmpM = dom.GetObject("Strom Referenz Verbrauch laufender Monat");
var tmpN = dom.GetObject("Strom Verbrauch laufender Monat");
var tmpO = dom.GetObject("Strom Referenz Verbrauch laufendes Kalenderjahr");
var tmpP = dom.GetObject("Strom Verbrauch laufendes Kalenderjahr");
	if ((tmpB.State() + 0.001) < tmpC.State()) {
	tmpD.State(tmpD.State() + 838.8607);
	}
tmpC.State(tmpB.State());
tmpE.State(tmpD.State() + (tmpB.State()/1000));
tmpF.State(tmpA.State());
tmpH.State(tmpE.State() - tmpG.State());
tmpJ.State(tmpE.State() - tmpI.State());
tmpL.State(tmpE.State() - tmpK.State());
tmpN.State(tmpE.State() - tmpM.State());
tmpP.State(tmpE.State() - tmpO.State());

Rücksetzskripte:

var tmpA = dom.GetObject("Strom Verbrauch heute");
var tmpB = dom.GetObject("Strom Referenz Verbrauch heute");
tmpB.State(tmpA.State() + tmpB.State());
var tmpA = dom.GetObject("Strom Verbrauch laufende Woche");
var tmpB = dom.GetObject("Strom Referenz Verbrauch laufende Woche");
tmpB.State(tmpA.State() + tmpB.State());
var tmpA = dom.GetObject("Strom Verbrauch laufender Monat");
var tmpB = dom.GetObject("Strom Referenz Verbrauch laufender Monat");
tmpB.State(tmpA.State() + tmpB.State());
var tmpA = dom.GetObject("Strom Verbrauch laufendes Kalenderjahr");
var tmpB = dom.GetObject("Strom Referenz Verbrauch laufendes Kalenderjahr");
tmpB.State(tmpA.State() + tmpB.State());
var tmpA = dom.GetObject("Strom Verbrauch seit letzter Ablesung");
var tmpB = dom.GetObject("Strom Referenz Verbrauch seit letzter Ablesung");
tmpB.State(tmpA.State() + tmpB.State());

 

HomeMatic – Gaszähler auswerten mit HM-EM-TX-WM

Auswerteskript:

object tmpA = dom.GetObject("BidCos-RF.MEQ00XXXXX:1.GAS_POWER");
object tmpB = dom.GetObject("BidCos-RF.MEQ00XXXXX:1.GAS_ENERGY_COUNTER");
var tmpC = dom.GetObject("Gas ENERGY_COUNTER");
var tmpD = dom.GetObject("Gas Referenz Zaehlerstand");
var tmpE = dom.GetObject("Gas Zaehlerstand");
var tmpF = dom.GetObject("Gas Leistungsaufnahme aktuell");
var tmpG = dom.GetObject("Gas Referenz Verbrauch seit letzter Ablesung");
var tmpH = dom.GetObject("Gas Verbrauch seit letzter Ablesung");
var tmpI = dom.GetObject("Gas Referenz Verbrauch heute");
var tmpJ = dom.GetObject("Gas Verbrauch heute");
var tmpK = dom.GetObject("Gas Referenz Verbrauch laufende Woche");
var tmpL = dom.GetObject("Gas Verbrauch laufende Woche");
var tmpM = dom.GetObject("Gas Referenz Verbrauch laufender Monat");
var tmpN = dom.GetObject("Gas Verbrauch laufender Monat");
var tmpO = dom.GetObject("Gas Referenz Verbrauch laufendes Kalenderjahr");
var tmpP = dom.GetObject("Gas Verbrauch laufendes Kalenderjahr");
	if ((tmpB.State() + 0.001) < tmpC.State()) {
	tmpD.State(tmpD.State() + 838.8607);
	}
tmpC.State(tmpB.State());
tmpE.State(tmpD.State() + (tmpB.State()/1000));
tmpF.State(tmpA.State());
tmpH.State(tmpE.State() - tmpG.State());
tmpJ.State(tmpE.State() - tmpI.State());
tmpL.State(tmpE.State() - tmpK.State());
tmpN.State(tmpE.State() - tmpM.State());
tmpP.State(tmpE.State() - tmpO.State());

Rücksetzskripte:

var tmpA = dom.GetObject("Gas Verbrauch heute");
var tmpB = dom.GetObject("Gas Referenz Verbrauch heute");
tmpB.State(tmpA.State() + tmpB.State());
var tmpA = dom.GetObject("Gas Verbrauch laufende Woche");
var tmpB = dom.GetObject("Gas Referenz Verbrauch laufende Woche");
tmpB.State(tmpA.State() + tmpB.State());
var tmpA = dom.GetObject("Gas Verbrauch laufender Monat");
var tmpB = dom.GetObject("Gas Referenz Verbrauch laufender Monat");
tmpB.State(tmpA.State() + tmpB.State());
var tmpA = dom.GetObject("Gas Verbrauch laufendes Kalenderjahr");
var tmpB = dom.GetObject("Gas Referenz Verbrauch laufendes Kalenderjahr");
tmpB.State(tmpA.State() + tmpB.State());
var tmpA = dom.GetObject("Gas Verbrauch seit letzter Ablesung");
var tmpB = dom.GetObject("Gas Referenz Verbrauch seit letzter Ablesung");
tmpB.State(tmpA.State() + tmpB.State());

 

HomeMatic – Zähler mit Hilfe der FAST EnergyCam auswerten

Auswerteskript:

object tmpA = dom.GetObject("CUxD.CUX2500001:1.METER");
var tmpB = dom.GetObject("Gas tmpBehlerstand");
var tmpC = dom.GetObject("Gas Referenz Verbrauch seit letzter Ablesung");
var tmpD = dom.GetObject("Gas Verbrauch seit letzter Ablesung");
var tmpE = dom.GetObject("Gas Referenz Verbrauch heute");
var tmpF = dom.GetObject("Gas Verbrauch heute");
var tmpG = dom.GetObject("Gas Referenz Verbrauch laufende Woche");
var tmpH = dom.GetObject("Gas Verbrauch laufende Woche");
var tmpI = dom.GetObject("Gas Referenz Verbrauch laufender Monat");
var tmpJ = dom.GetObject("Gas Verbrauch laufender Monat");
var tmpK = dom.GetObject("Gas Referenz Verbrauch laufendes Kalenderjahr");
var tmpL = dom.GetObject("Gas Verbrauch laufendes Kalenderjahr");
tmpB.State(tmpA.State());
tmpD.State(tmpB.State() - tmpC.State());
tmpF.State(tmpB.State() - tmpE.State());
tmpH.State(tmpB.State() - tmpG.State());
tmpB.State(tmpB.State() - tmpI.State());
tmpL.State(tmpB.State() - tmpK.State());

Rücksetzskripte:

var tmpA = dom.GetObject("Gas Referenz Verbrauch heute");
var tmpB = dom.GetObject("Gas Verbrauch heute");
tmpA.State(tmpB.State() + tmpA.State());
var tmpA = dom.GetObject("Gas Referenz Verbrauch laufende Woche");
var tmpB = dom.GetObject("Gas Verbrauch laufende Woche");
tmpA.State(tmpB.State() + tmpA.State());
var tmpA = dom.GetObject("Gas Referenz Verbrauch laufender Monat");
var tmpB = dom.GetObject("Gas Verbrauch laufender Monat");
tmpA.State(tmpB.State() + tmpA.State());
var tmpA = dom.GetObject("Gas Referenz Verbrauch laufendes Kalenderjahr");
var tmpB = dom.GetObject("Gas Verbrauch laufendes Kalenderjahr");
tmpA.State(tmpB.State() + tmpA.State());
var tmpA = dom.GetObject("Gas Referenz Verbrauch seit letzter Ablesung");
var tmpB = dom.GetObject("Gas Verbrauch seit letzter Ablesung");
tmpA.State(tmpB.State() + tmpA.State());

 

HomeMatic – Verbrauchs- und Betriebsstundenzähler für Ölheizungen

Einschaltskript:

var tmpA= dom.GetObject("Brenner letzte Einschaltzeit");
tmpA.State(system.Date("%F %T")); !Speichern der Einschaltzeit

Ausschaltskript:

var tmpB= dom.GetObject("Brenner letzte Ausschaltzeit");
var tmpA= dom.GetObject("Brenner letzte Einschaltzeit");
var tmpC= dom.GetObject("Brenner Tankinhalt bei letzter Fuellung").Value();
var tmpD= dom.GetObject("Brenner Tankinhalt aktuell");
var tmpE= dom.GetObject("Brenner Betriebsstunden seit letzter Fuellung");
var tmpF= dom.GetObject("Brenner Verbrauch seit letzter Fuellung");
var tmpG= dom.GetObject("Brenner Betriebsstunden laufendes Kalenderjahr");
var tmpH= dom.GetObject("Brenner Verbrauch laufendes Kalenderjahr");
var tmpI= dom.GetObject("Brenner Betriebsstunden laufender Monat");
var tmpJ= dom.GetObject("Brenner Verbrauch laufender Monat");
var tmpK= dom.GetObject("Brenner Betriebsstunden laufende Woche");
var tmpL= dom.GetObject("Brenner Verbrauch laufende Woche");
var tmpM= dom.GetObject("Brenner Betriebsstunden heute");
var tmpN= dom.GetObject("Brenner Verbrauch heute");

! Speichern der Ausschaltzeit
tmpB.State(system.Date("%F %T"));

! Den Einschaltzeit String aus der Systemvariablen in ein Zeitobjekt umwandeln
time tmpO = tmpA.State().ToTime();

! Die aktuelle (Ausschalt)Zeit String erzeugen und in ein Zeitobjekt umwandeln
time tmpP = system.Date("%F %T").ToTime();

! Das Zeitobjekt Einschaltzeit in Sekunden seit 1.1.1970 umwandeln
var tmpQ = tmpO.ToInteger();

! Das Zeitobjekt aktuelle Zeit in Sekunden seit 1.1.1970 umwandeln
var tmpR = tmpP.ToInteger();

!Die Differenz ist die Einschaltdauer in Stunden umgerechnet
var tmpS = 0.01*(tmpR-tmpQ)/36;

! Die Einschaltdauer seit der letzten Füllung kumulieren = Betriebsstunden seit der letzten Füllung
var tmpT = tmpS + tmpE.State();

! Die Betriebsstunden seit der letzten Füllung in die Systemvariable einstellen
tmpE.State (tmpT);

! Berechnung von Verbrauch in Liter mit 1,87 kg/h seit der letzten Füllung
var tmpU = tmpT * 1.87 * 1.197;

! Verbrauch seit der letzten Füllung in die Systemvariable einstellen
tmpF.State (tmpU);

! Berechnung Tankinhalts in Litern
var tmpV = tmpC - tmpU;

! Tankinhalt in die Systemvariable einstellen
tmpD.State (tmpV);

! Die Einschaltdauer im laufenden Kalenderjahr kumulieren = Betriebsstunden
var tmpW = tmpS + tmpG.State();

! Die Betriebsstunden im laufenden Kalenderjahr in die Systemvariable einstellen
tmpG.State (tmpW);

! Berechnung von Verbrauch in Liter mit 1,87 kg/h im laufenden Kalenderjahr
var tmpX = tmpW * 1.87 * 1.197;

! Verbrauch im laufenden Kalenderjahr in die Systemvariable einstellen
tmpH.State (tmpX);

! Die Einschaltdauer im laufenden Kalendermonat kumulieren = Betriebsstunden
var tmpY = tmpS + tmpI.State();

! Die Betriebsstunden im laufenden Kalendermonat in die Systemvariable einstellen
tmpI.State (tmpY);

! Berechnung von Verbrauch in Liter mit 1,87 kg/h im laufenden Kalendermonat
var tmpZ = tmpY * 1.87 * 1.197;

! Verbrauch im laufenden Kalendermonat in die Systemvariable einstellen
tmpJ.State (tmpZ);

! Die Einschaltdauer in der laufenden Kalenderwoche kumulieren = Betriebsstunden
var tmpA1 = tmpS + tmpK.State();

! Die Betriebsstunden in der laufenden Kalenderwoche in die Systemvariable einstellen
tmpK.State (tmpA1);

! Berechnung von Verbrauch in Liter mit 1,87 kg/h in der laufenden Kalenderwoche
var tmpB1 = tmpA1 * 1.87 * 1.197;

! Verbrauch in der laufenden Kalenderwoche in die Systemvariable einstellen
tmpL.State (tmpB1);

! Die Einschaltdauer heute kumulieren = Betriebsstunden
var tmpC1 = tmpS + tmpM.State();

! Die Betriebsstunden heute in die Systemvariable einstellen
tmpM.State (tmpC1);

! Berechnung von Verbrauch in Liter mit 1,87 kg/h heute
var tmpD1 = tmpC1 * 1.87 * 1.197;

! Verbrauch in der laufenden Kalenderwoche in die Systemvariable einstellen
tmpN.State (tmpD1);

 

HomeMatic – Alle Zähler zusammen zurücksetzen

Stromzähler

!Tageszaehler
var tmpA = dom.GetObject("Strom Referenz Verbrauch heute");
var tmpB = dom.GetObject("Strom Verbrauch heute");
tmpA.State(tmpB.State() + tmpA.State());
tmpB.State(0.00);
!Wochenzaehler
if (system.Date("%u") == 7) {
	var tmpC = dom.GetObject("Strom Referenz Verbrauch laufende Woche");
	var tmpD = dom.GetObject("Strom Verbrauch laufende Woche");
	tmpC.State(tmpD.State() + tmpC.State());
	tmpD.State(0.00);
}
!Monatszaehler
time tmpE = (system.Date("%F %X").ToTime().ToInteger() + 120).ToTime();
if (tmpE.Day() == 1) {
	var tmpF = dom.GetObject("Strom Referenz Verbrauch laufender Monat");
	var tmpG = dom.GetObject("Strom Verbrauch laufender Monat");
    tmpF.State(tmpG.State() + tmpF.State());
	tmpG.State(0.00);
}
!Jahreszaehler:
if ((system.Date("%m") == 12) && (system.Date("%d") == 31)) {
	var tmpH = dom.GetObject("Strom Referenz Verbrauch laufendes Kalenderjahr");
	var tmpI = dom.GetObject("Strom Verbrauch laufendes Kalenderjahr");
    tmpH.State(tmpI.State() + tmpH.State());
    tmpI.State(0.00);
}

 

Gaszähler

!Tageszaehler
var vTz = dom.GetObject("Gas Referenz Verbrauch heute");
var vTg = dom.GetObject("Gas Verbrauch heute");
vTz.State(vTg.State() + vTz.State());
vTg.State(0.00);
!Wochenzaehler
if (system.Date("%u") == 7) {
    var vWz = dom.GetObject("Gas Referenz Verbrauch laufende Woche");
    var vWg = dom.GetObject("Gas Verbrauch laufende Woche");
    vWz.State(vWg.State() + vWz.State());
    vWg.State(0.00);
}
!Monatszaehler
time morgen = (system.Date("%F %X").ToTime().ToInteger() + 120).ToTime();
if (morgen.Day() == 1) {
    var vMz = dom.GetObject("Gas Referenz Verbrauch laufender Monat");
    var vMg = dom.GetObject("Gas Verbrauch laufender Monat");
    vMz.State(vMg.State() + vMz.State());
    vMg.State(0.00);
}
!Jahreszaehler:
if ((system.Date("%m") == 12) && (system.Date("%d") == 31)) {
    var vJz = dom.GetObject("Gas Referenz Verbrauch laufendes Kalenderjahr");
    var vJg = dom.GetObject("Gas Verbrauch laufendes Kalenderjahr");
    vJz.State(vJg.State() + vJz.State());
    vJg.State(0.00);
}

 

Ölzähler

!Tageszaehler
var tmpA = dom.GetObject("Brenner Betriebsstunden heute");
var tmpB = dom.GetObject("Brenner Verbrauch heute");
tmpA.State(0.00);
tmpB.State(0.00);
!Wochenzaehler
if (system.Date("%u") == 7) {
	var tmpC = dom.GetObject("Brenner Betriebsstunden laufende Woche");
	var tmpD = dom.GetObject("Brenner Verbrauch laufende Woche");
	tmpC.State(0.00);
	tmpD.State(0.00);
}
!Monatszaehler
time tmpE = (system.Date("%F %X").ToTime().ToInteger() + 120).ToTime();
if (tmpE.Day() == 1) {
	var tmpF = dom.GetObject("Brenner Betriebsstunden laufender Monat");
	var tmpG = dom.GetObject("Brenner Verbrauch laufender Monat");
	tmpF.State(0.00);
	tmpG.State(0.00);	
}
!Jahreszaehler:
if ((system.Date("%m") == 12) && (system.Date("%d") == 31)) {
	var tmpH = dom.GetObject("Brenner Betriebsstunden laufendes Kalenderjahr");
	var tmpI = dom.GetObject("Brenner Verbrauch laufendes Kalenderjahr");
	tmpH.State(0.00);
	tmpI.State(0.00);
}

 

Strom- und Ölzähler

!Tageszaehler
var tmpA = dom.GetObject("Strom Referenz Verbrauch heute");
var tmpB = dom.GetObject("Strom Verbrauch heute");
var tmpC = dom.GetObject("Brenner Betriebsstunden heute");
var tmpD = dom.GetObject("Brenner Verbrauch heute");
tmpA.State(tmpB.State() + tmpA.State());
tmpB.State(0.00);
tmpC.State(0.00);
tmpD.State(0.00);
!Wochenzaehler
if (system.Date("%u") == 7) {
	var tmpE = dom.GetObject("Strom Referenz Verbrauch laufende Woche");
	var tmpF = dom.GetObject("Strom Verbrauch laufende Woche");
	var tmpG = dom.GetObject("Brenner Betriebsstunden laufende Woche");
	var tmpH = dom.GetObject("Brenner Verbrauch laufende Woche");
	tmpE.State(tmpF.State() + tmpE.State());
	tmpF.State(0.00);
	tmpG.State(0.00);
	tmpH.State(0.00);
}
!Monatszaehler
time tmpI = (system.Date("%F %X").ToTime().ToInteger() + 120).ToTime();
if (tmpI.Day() == 1) {
	var tmpJ = dom.GetObject("Strom Referenz Verbrauch laufender Monat");
	var tmpK = dom.GetObject("Strom Verbrauch laufender Monat");
	var tmpL = dom.GetObject("Brenner Betriebsstunden laufender Monat");
	var tmpM = dom.GetObject("Brenner Verbrauch laufender Monat");
    tmpJ.State(tmpK.State() + tmpJ.State());
	tmpK.State(0.00);
	tmpL.State(0.00);
	tmpM.State(0.00);	
}
!Jahreszaehler:
if ((system.Date("%m") == 12) && (system.Date("%d") == 31)) {
	var tmpN = dom.GetObject("Strom Referenz Verbrauch laufendes Kalenderjahr");
	var tmpO = dom.GetObject("Strom Verbrauch laufendes Kalenderjahr");
	var tmpP = dom.GetObject("Brenner Betriebsstunden laufendes Kalenderjahr");
	var tmpQ = dom.GetObject("Brenner Verbrauch laufendes Kalenderjahr");
    tmpN.State(tmpO.State() + tmpN.State());
    tmpO.State(0.00);
	tmpP.State(0.00);
	tmpQ.State(0.00);
}

 

HomeMatic – Raumklimaüberwachung und Entfeuchtung

Beispiel 1: Schimmelgefahranalyse in einem unisolierten Kellerraum mit manueller Lüftung (Fenster) und einem elektrischen Luftentfeuchter

Auswertung:

    object tmpA = dom.GetObject("RaumXY_Raumregler:1");
    object tmpB = tmpA.DPByHssDP("TEMPERATURE");
    object tmpC = tmpA.DPByHssDP("HUMIDITY");
    object tmpD = dom.GetObject("RaumXY_Schimmel");
	object tmpE = dom.GetObject("RaumXY_Lueften");
    object tmpF = dom.GetObject("Aussen_TempFeuSens:1");
    object tmpG = tmpF.DPByHssDP("TEMPERATURE");
    object tmpH = tmpF.DPByHssDP("HUMIDITY");
	! Programmteil Lüftungsempfehlung
	! Lokale Variablen
    real tmpI = tmpB.Value(); ! Temperatur in °C innen
    integer tmpJ = tmpC.Value(); ! relative Feuchte in % innen
	real tmpK;  ! absolute feuchte in g/kg innen
	real tmpL = tmpG.Value(); ! Temperatur in °C außen
    integer tmpM = tmpH.Value(); ! relative Feuchte in % außen
 	real tmpN; ! absolute feuchte in g/kg außen
	! Berechnung der absoluten Feuchte innen
    if (tmpI < 0.0) {tmpI = 0.0;}
    if (tmpI < 10.0)
    { tmpK = (3.78 + (0.285 * tmpI) + (0.0052 * tmpI * tmpI) + (0.0005 * tmpI * tmpI * tmpI));
    }
    else
    { tmpK = (7.62 + (0.524 * (tmpI-10.0)) + (0.0131 * (tmpI-10.0) * (tmpI-10.0)) + (0.00048 * (tmpI-10.0) * (tmpI-10.0) * (tmpI-10.0)));
    }
	tmpK = (tmpK * tmpJ) / (100.0 + tmpK * (100.0 - tmpJ) / 622);
	! Berechnung der absoluten Feuchte außen
	if (tmpL < 0.0) {tmpL = 0.0;}
    if (tmpL < 10.0)
    { tmpN = (3.78 + (0.285 * tmpL) + (0.0052 * tmpL * tmpL) + (0.0005 * tmpL * tmpL * tmpL));
    }
    else
    { tmpN = (7.62 + (0.524 * (tmpL-10.0)) + (0.0131 * (tmpL-10.0) * (tmpL-10.0)) + (0.00048 * (tmpL-10.0) * (tmpL-10.0) * (tmpL-10.0)));
    }
	tmpN = (tmpN * tmpM) / (100.0 + tmpN * (100.0 - tmpM) / 622);
	! Berechnung der Lüftungsempfehlung mit 0,5 g/kg und 0,7 K Hysterese
	if ((tmpN <= (tmpK - 0.8)) && (tmpL <= (tmpI - 1.0)) && (tmpI > XX.X))
	{tmpE.State(true);}
	else
	{ if ((tmpN >= (tmpK - 0.3)) || (tmpL >= (tmpI - 0.3)) || (tmpI <= YY.Y))
	{tmpE.State(false);}
	}
	! Programmteil Schimmelwarnung
	! Berechnung der Oberflächentemperatur der Außenwandecke
    real tmpO; ! Oberfächentemperatur der Außenwandecke in °C
    real tmpP = tmpG.Value(); ! Außentemperatur in °C
    real tmpQ = tmpB.Value(); ! Raumtemperatur in °C
    tmpO = tmpQ + ((0.13 / Z.ZZZ) * (tmpP - tmpQ)); ! Rges = Z.ZZZ empirisch ermittelt
	! Lokale Variablen
    real    tmpR;    ! Temperatur in °C
    integer tmpS; ! relative Feuchte in %
    real    tmpT;  ! Schimmelwarn-Grenzfeuchte in g/kg
    real    tmpU;  ! Schimmelalarm-Grenzfeuchte in g/kg
    tmpR = tmpO;
    ! Berechnung Warn-Grenzfeuchte
    tmpS = 70;
    if (tmpR < 0.0) {tmpR = 0.0;}
    if (tmpR < 10.0)
    { tmpT = (3.78 + (0.285 * tmpR) + (0.0052 * tmpR * tmpR) + (0.0005 * tmpR * tmpR * tmpR));
    }
    else
    { tmpT = (7.62 + (0.524 * (tmpR-10.0)) + (0.0131 * (tmpR-10.0) * (tmpR-10.0)) + (0.00048 * (tmpR-10.0) * (tmpR-10.0) * (tmpR-10.0)));
    }
	tmpT = (tmpT * tmpS) / (100.0 + tmpT * (100.0 - tmpS) / 622);
    ! Berechnung Alarm-Grenzfeuchte
    tmpS = 80;
    if (tmpR < 0.0) {tmpR = 0.0;}
    if (tmpR < 10.0)
    { tmpU = (3.78 + (0.285 * tmpR) + (0.0052 * tmpR * tmpR) + (0.0005 * tmpR * tmpR * tmpR));
    }
    else
    { tmpU = (7.62 + (0.524 * (tmpR-10.0)) + (0.0131 * (tmpR-10.0) * (tmpR-10.0)) + (0.00048 * (tmpR-10.0) * (tmpR-10.0) * (tmpR-10.0)));
    }
	tmpU = (tmpU * tmpS) / (100.0 + tmpU * (100.0 - tmpS) / 622);
 	! Schimmelwarnung
	! 0 - keine Gefahr
	! 1 - Warnung
	! 2 - Alarm
	if ((tmpK > tmpU) && (tmpJ > 64 )) {tmpD.State(2);}
        else {
            if ((tmpK > tmpU) || (tmpK > tmpT)) {tmpD.State(1);}
            else {tmpD.State(0);}
        }

 

Entfeuchter:

object tmpA = dom.GetObject("BidCos-RF.FEQ0XXXXXX:1.HUMIDITY");
object tmpB = dom.GetObject("BidCos-RF.FEQ0XXXXXX:1.STATE");
object tmpC = dom.GetObject("UG-Werkstatt_Schimmel");
time tmpD = tmpB.Timestamp();
time tmpE = system.Date("%Y-%m-%d %H:%M:%S").ToTime();
integer tmpF = tmpE.ToInteger() - tmpD.ToInteger();
if (tmpF > 2700) {
  if ((tmpA.Value() > 64) && (tmpB.Value() == 0) && (tmpC.Value() > 1)) {
     tmpB.State(1);
  }
  if ((tmpA.Value() < 64) && (tmpB.Value() == 1)) {
     tmpB.State(0);
  }
}

 

Beispiel 2: Schimmelgefahranalyse in einem isolierten Badezimmer mit Sauna und einem einfachen Wandlüfter

    object tmpA = dom.GetObject("RaumXY_Raumregler:1");
    object tmpB = tmpA.DPByHssDP("TEMPERATURE");
    object tmpC = tmpA.DPByHssDP("HUMIDITY");
    object tmpD = dom.GetObject("RaumXY_Schimmel");
	object tmpE = dom.GetObject("RaumXY_Lueften");
    object tmpF = dom.GetObject("Aussen_TempFeuSens:1");
    object tmpG = tmpF.DPByHssDP("TEMPERATURE");
    object tmpH = tmpF.DPByHssDP("HUMIDITY");
	object tmpI = dom.GetObject("BidCos-RF.HEQ0XXXXXX:2.STATE");
	object tmpJ = dom.GetObject("BidCos-RF.HEQ0XXXXXX:1.STATE");
	! Programmteil Lüftungsempfehlung
	! Lokale Variablen
    real tmpK = tmpB.Value(); ! Temperatur in °C innen
    integer tmpL = tmpC.Value(); ! relative Feuchte in % innen
	real tmpM;  ! absolute feuchte in g/kg innen
	real tmpN = tmpG.Value(); ! Temperatur in °C außen
    integer tmpO = tmpH.Value(); ! relative Feuchte in % außen
 	real    tmpP; ! absolute feuchte in g/kg außen
	! Berechnung der absoluten Feuchte innen
    if (tmpK < 0.0) {tmpK = 0.0;}
    if (tmpK < 10.0)
    { tmpM = (3.78 + (0.285 * tmpK) + (0.0052 * tmpK * tmpK) + (0.0005 * tmpK * tmpK * tmpK));
    }
    else
    { tmpM = (7.62 + (0.524 * (tmpK-10.0)) + (0.0131 * (tmpK-10.0) * (tmpK-10.0)) + (0.00048 * (tmpK-10.0) * (tmpK-10.0) * (tmpK-10.0)));
    }
	tmpM = (tmpM * tmpL) / (100.0 + tmpM * (100.0 - tmpL) / 622);
	! Berechnung der absoluten Feuchte außen
	if (tmpN < 0.0) {tmpN = 0.0;}
    if (tmpN < 10.0)
    { tmpP = (3.78 + (0.285 * tmpN) + (0.0052 * tmpN * tmpN) + (0.0005 * tmpN * tmpN * tmpN));
    }
    else
    { tmpP = (7.62 + (0.524 * (tmpN-10.0)) + (0.0131 * (tmpN-10.0) * (tmpN-10.0)) + (0.00048 * (tmpN-10.0) * (tmpN-10.0) * (tmpN-10.0)));
    }
	tmpP = (tmpP * tmpO) / (100.0 + tmpP * (100.0 - tmpO) / 622);
	! Berechnung der Lüftungsempfehlung mit 0,5 g/kg und 0,7 K Hysterese
	if ((tmpP <= (tmpM - 0.8)) && (tmpN <= (tmpK - 1.0)) && (tmpK > XX.X))
	{tmpE.State(true);}
	else
	{ if ((tmpP >= (tmpM - 0.3)) || (tmpN >= (tmpK - 0.3)) || (tmpK <= YY.Y))
	{tmpE.State(false);}
	}
	! Programmteil Schimmelwarnung
	! Berechnung der Oberflächentemperatur der Außenwandecke
    real tmpQ; ! Oberfächentemperatur der Außenwandecke in °C
    real tmpR = tmpG.Value(); ! Außentemperatur in °C
    real tmpS = tmpB.Value(); ! Raumtemperatur in °C
    tmpQ = tmpS + ((0.13 / Z.ZZZ) * (tmpR - tmpS)); ! Rges = Z.ZZZ empirisch ermittelt
	! Lokale Variablen
    real    tmpT;    ! Temperatur in °C
    integer tmpU; ! relative Feuchte in %
    real    tmpV;  ! Schimmelwarn-Grenzfeuchte in g/kg
    real    tmpW;  ! Schimmelalarm-Grenzfeuchte in g/kg
    tmpT = tmpQ;
    ! Berechnung Warn-Grenzfeuchte
    tmpU = 70;
    if (tmpT < 0.0) {tmpT = 0.0;}
    if (tmpT < 10.0)
    { tmpV = (3.78 + (0.285 * tmpT) + (0.0052 * tmpT * tmpT) + (0.0005 * tmpT * tmpT * tmpT));
    }
    else
    { tmpV = (7.62 + (0.524 * (tmpT-10.0)) + (0.0131 * (tmpT-10.0) * (tmpT-10.0)) + (0.00048 * (tmpT-10.0) * (tmpT-10.0) * (tmpT-10.0)));
    }
	tmpV = (tmpV * tmpU) / (100.0 + tmpV * (100.0 - tmpU) / 622);
    ! Berechnung Alarm-Grenzfeuchte
    tmpU = 80;
    if (tmpT < 0.0) {tmpT = 0.0;}
    if (tmpT < 10.0)
    { tmpW = (3.78 + (0.285 * tmpT) + (0.0052 * tmpT * tmpT) + (0.0005 * tmpT * tmpT * tmpT));
    }
    else
    { tmpW = (7.62 + (0.524 * (tmpT-10.0)) + (0.0131 * (tmpT-10.0) * (tmpT-10.0)) + (0.00048 * (tmpT-10.0) * (tmpT-10.0) * (tmpT-10.0)));
	}
	tmpW = (tmpW * tmpU) / (100.0 + tmpW * (100.0 - tmpU) / 622);
 	! Schimmelwarnung
	! 0 - keine Gefahr
	! 1 - Warnung
	! 2 - Alarm
	if ((tmpM > tmpW) && (tmpL > 64 )) {tmpD.State(2);}
        else {
            if ((tmpM > tmpW) || (tmpM > tmpV)) {tmpD.State(1);}
            else {tmpD.State(0);}
        }
	! Programmteil Ventilatorsteuerung
    ! Prüfen, ob Raum schon zu kalt
	if (tmpS > 20.0)
		{ if ((tmpP <= (tmpM - 0.8)) && (tmpR <= (tmpS - 1.0)) && (tmpJ.Value() == 0) && (tmpD.Value() == 2))
			{tmpI.State(1);}
			else
			{ if ((tmpP >= (tmpM - 0.3)) || (tmpR >= (tmpS - 0.3)) || (tmpJ.Value() == 1) || (tmpD.Value() == 1) || (tmpD.Value() == 0))
			{tmpI.State(0);}
			}
		}
	else
		{ if (tmpS <= 19.5)
		{tmpI.State(0);}
		}

 

HomeMatic – Sonnenstandberechnung

Auswerteskript:

! Sonnenstand Analemma

real tmpA = system.Date("%j").ToInteger();
real tmpB = (0.01 * system.Date("%M").ToInteger()) + system.Date("%H").ToInteger();
real tmpC = (0.01 * system.SunriseTime("%M").ToInteger()) + system.SunriseTime("%H").ToInteger();
real tmpD = (0.01 * system.SunsetTime("%M").ToInteger()) + system.SunsetTime("%H").ToInteger();
integer tmpE = 0; ! Sonne unter Horizont
 
! Analemma 23.12. bis 10.02.
if ((tmpA > 356) || ((tmpA > 0) && (tmpA < 41)))
{
	if (tmpB < tmpD) {
		tmpE = 4; ! Süd/West
	}
	if (tmpB < tmpD - 2) {
		tmpE = 3; ! Süd
	}
	if (tmpB < tmpC + 2) {
		tmpE = 2; ! Süd/Ost
	}
	if (tmpB < tmpC -1) {
		tmpE = 0; ! Sonne unter Horizont
	}
}
! Analemma 11.02. bis 07.03. und 01.11. bis 22.12.
if (((tmpA > 304) && (tmpA < 357)) || ((tmpA > 40) && (tmpA < 67)))
{
	if (tmpB < tmpD) {
		tmpE = 4; ! Süd/West
	}
	if (tmpB < tmpD - 3) {
		tmpE = 3; ! Süd
	}
	if (tmpB < tmpC + 3) {
		tmpE = 2; ! Süd/Ost
	}
	if (tmpB < tmpC -1) {
		tmpE = 0; ! Sonne unter Horizont
	}
}
! Analemma 08.03. bis 12.04. und 05.10. bis 31.10.
if (((tmpA > 277) && (tmpA < 305)) || ((tmpA > 66) && (tmpA < 103)))
{
	if (tmpB < tmpD) {
		tmpE = 5; ! West
	}
	if (tmpB < tmpD - 1) {
		tmpE = 4; ! Süd/West
	}
	if (tmpB < tmpD - 4) {
		tmpE = 3; ! Süd
	}
	if (tmpB < tmpC + 4) {
		tmpE = 2; ! Süd/Ost
	}
	if (tmpB < tmpC + 1) {
		tmpE = 1; ! Ost
	}	
	if (tmpB < tmpC -1) {
		tmpE = 0; ! Sonne unter Horizont
	}
}
! Analemma 13.04. bis 30.04. und 30.08. bis 04.10.
if (((tmpA > 241) && (tmpA < 278)) || ((tmpA > 102) && (tmpA < 121)))
{
	if (tmpB < tmpD) {
		tmpE = 5; ! West
	}
	if (tmpB < tmpD - 3) {
		tmpE = 4; ! Süd/West
	}
	if (tmpB < tmpD - 5) {
		tmpE = 3; ! Süd
	}
	if (tmpB < tmpC + 5) {
		tmpE = 2; ! Süd/Ost
	}
	if (tmpB < tmpC + 3) {
		tmpE = 1; ! Ost
	}	
	if (tmpB < tmpC -1) {
		tmpE = 0; ! Sonne unter Horizont
	}
}
! Analemma 01.05. bis 09.06. und 12.08. bis 29.08.
if (((tmpA > 192) && (tmpA < 242)) || ((tmpA > 120) && (tmpA < 161)))
{
	if (tmpB < tmpD) {
		tmpE = 5; ! West
	}
	if (tmpB < tmpD - 4) {
		tmpE = 4; ! Süd/West
	}
	if (tmpB < tmpD - 6) {
		tmpE = 3; ! Süd
	}
	if (tmpB < tmpC + 6) {
		tmpE = 2; ! Süd/Ost
	}
	if (tmpB < tmpC + 4) {
		tmpE = 1; ! Ost
	}	
	if (tmpB < tmpC -1) {
		tmpE = 0; ! Sonne unter Horizont
	}
}
! Analemma 10.06. bis 11.08. und 01.11. bis 22.12.
if ((tmpA > 160) && (tmpA < 193))
{
	if (tmpB < tmpD) {
		tmpE = 5; ! West
	}
	if (tmpB < tmpD - 5) {
		tmpE = 4; ! Süd/West
	}
	if (tmpB < tmpD - 7) {
		tmpE = 3; ! Süd
	}
	if (tmpB < tmpC + 7) {
		tmpE = 2; ! Süd/Ost
	}
	if (tmpB < tmpC + 5) {
		tmpE = 1; ! Ost
	}	
	if (tmpB < tmpC -1) {
		tmpE = 0; ! Sonne unter Horizont
	}
}
dom.GetObject("Sonnenstand").State(tmpE);

 

Bitte beachten...

Die Verwendung meiner Hinweise, Anleitungen, Schaltungen und Software erfolgt auf eigenes Risiko. Ich übernehme hierfür keinerlei Gewährleistung bzw. Haftung.
Creative Commons Lizenzvertrag
Copyright © Jens-Peter Stern | SMART WOHNEN by sTeRn AV | smart-wohnen.org
  1. rUmtifUsel

    Dank des Prüfscripts aus dem HomeMatic Forum weiß ich nun, dass ich mit 150 Scriptvariablen unterwegs bin. Es ist also noch etwas Platz.
    In diesem Zusammenhang bin ich schon seit einiger Zeit am Überlegen, eine zweite CCU anzuschaffen um die Last etwas zu verteilen.
    Hast Du hierbei schon Erfahrungen?

    Gruß

    rUmti

  2. Hallo rUmti,
    ich selbst nutze nur eine CCU, mehrere Zentralen parallel zu betreiben ist aber offensichtlich problemlos möglich, solange man die Komponeneten jeweils nur an eine der Zentralen anlernt. Hierzu gibt es im HomeMatic-Forum einiges an Erfahrungswerten.
    Aber der zusätzliche Aufwand mit Updates und dergleichen sollte man bei der Entscheidung auch berücksichtigen. Fehler muss man dann möglicheweise über zwei (oder mehr) CCUs suchen. Mehr ist nicht immer besser.
    Liebe Grüße Jens

  3. rUmtifUsel

    Wohl war.

    Um den Performaceproblemen zu entgehen ist es sicherlich ratsam für manche AddOns und Scripte nicht die CCU zu bemühen, sondern einen RasPi.
    Kannst Du da ggf. eine Empfehlung aussprechen?

    • Hallo rUmti,
      ich nutze z.B. überhaupt keine CCU-internen Diagramme und auch keine von CUxD-Highcharts sondern dafür den CCU-Historian auf einem RasPi. Außerdem deaktiviere ich meist den Java HM-Server (geht mit CUxD-Maintenance), weil der nur für die CCU-Diagramme, Gruppen (bei Heizungsthermostaten), die Erstinitialisierung der SD-Karte und den Gerätefirmwareupdate über das WebUI benötigt wird.
      Liebe Grüße Jens

  4. Hallo Herr Stern,

    ich benutze seit fast 2 Jahren das Skript und bedanke mich dafür!
    Bin vor ja 4 Monaten auf diese Variante mit den reduzierten Systemvariablen umgestiegen.
    Lief alles bis vor 2 Tagen gut, bis ich auf die aktuelle Firmware von der CCU aktualisiert hatte.
    Seit dem wird wird die Brennerlaufzeit (Tag Woche Monat Jahr) auf 0 gerechnet somit auch der Verbrauch. Haben Sie schon auf die neuste FW gewechselt und ähnliche Erfahrungen gesammelt? Hoffe ich finde den Fehler bald, da sonst die Highchart unschön aussehen.

    Hoffe auf Feedback.
    Viele Grüße aus Franken
    Fruehwi

  5. Bevor ich mir eine 2. CCU2 zulegen würde, würde ich mir einen Raspberry zulegen, um darauf IObroker zu installieren..
    Danach erst mal alle unwichtigen Programme auf IObroker zu portieren.
    Nein, die Programme werden auf der CCU2 nicht gelöscht, sondern nur deaktiviert. Sollte es zu Problemen kommen, kann man die Programme einfach wieder aktivieren und gut is.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

* Die Checkbox für die Zustimmung zur Speicherung ist nach DSGVO zwingend.

Ich stimme zu.