Ich habe folgende Ausgangssituation:
- Eine Wärmepumpe der Firma Waterkotte mit Kühlfunktion, Fußbodenheizung
- Diverse Digitalstrom-Klemmen (blau) zur Regelung der Ventile
- Ein Temperatur-Messer mit Enocean Funktion - mit der Plan44 verbunden
Problemstellung ist, dass die blauen Klemmen über die App von Digitalstrom "Klima Steuerung" im Modus "Kühlen" logischerweise ganz anders reagieren sollen als im Modus "heizen". Dies kann und sollte dort eingestellt werden.
Doch woher weiß das DS System, dass es "heizen" oder "kühlen" soll? Dafür braucht es eine sinnvolle Sensorik.
Eine einfache Auslesung der jeweils aktuellen Temperatur (sei es zeitverzögert) wäre nicht sinnvoll, da viel zu oft umgeschaltet würde.
Daher ist ein 24 Stunden Durchschnitt sinnvoll (so agiert auch die Wärmepumpe mit ihrem eigenen Sensor):
Auf der Plan44 lässt sich das folgende skripted Device anlegen:
Init Message:
{
'message':'init',
'protocol':'simple',
'group':3, /* blue/climate /
'name':'24 Stunden Durchschnittstemperatur Sensor', / initial name /
'sensors':[
/ sensortype = 1 = Temperatur, updateinterval = 3600 = Upate jede Stunde */
{'sensortype':1,'usage':1,'hardwarename':'24 Stunden Durchschnittstemperatur Sensor','min':-40,'max':40,'resolution':0.1,'updateinterval':3600}
]
}
Implementation:
// Konfiguration
var numsamples = 24
var sampleinterval = 1:00
var tempsensor_id = 'HIER DIE ID DES TEMPERATURSENSORS ENOCEAN EINTRAGEN; über das i in Plan44 abrufbar'
// Implementation
var sampleset // die Samples
sampleset = [ ] // anfangs leer
on (every(sampleinterval)) {
// Sliding Window auf festgelegte Anzahl Samples beschränken
while (elements(sampleset)>=numsamples) {
// zuviele Samples belegt, älteste löschen
unset sampleset[0]
}
// Neues Sample aufnehmen
sampleset[elements(sampleset)] = device(tempsensor_id).sensor(0)
// Durchschnitt aller Samples berechnen
var n = 0;
var avg = 0;
while (n<elements(sampleset)) {
avg = avg + sampleset[n]
n = n + 1
}
avg = avg / n
// Als Sensorwert des scripted device ausgeben
message(format("S0=%.1f",avg))
}
return true
Auf diese Weise hat man einen Temperatur-Sensor gebaut, der jeweils den Schnitt der letzten 24 Stunden angibt und stündlich aktualisiert.
Nun braucht man lediglich noch einen Evaluator, der diesen Sensor nutzt, Diesen habe ich nun so konfiguriert, dass als "Condition to switch on"
Input1 < 18 | initial()
und als "condition to switch off"
Input1 > 18
dort eingetragen ist. Der Sensor soll also auf 1 (in DS heißt das "geschlossen" für diesen Sensor im App-Modus) springen, wenn die 24-h-Durchschnitts-Temperatur unter 18° fällt (oder nach einem Neustart des Systems etc.: dafür ist initial() da) und auf 0 (in DS heißt das "offen" für diesen Sensor im App-Modus), wenn die 24-h-Durchschnitts-Temperatur über 18° geht.
In der Wärmepumpe habe ich diese Grenze entsprechend eingestellt.
Diesen Sensor stellt man dann in DS unter Geräteeigenschaften als "Umschalter für heizen / kühlen" fest.