Steuerung Dachrinnenheizung

Begonnen von DerTom, 21 Dezember 2013, 15:15:50

Vorheriges Thema - Nächstes Thema

DerTom

Hallo,

Vielleicht hat einer eine Idee. Ich habe eine Dachrinnenheizung, welche bei einer Aussentemperatur < 0°C die Dachrinne soweit aufheizen soll, daß sie > 3 °C hat und dann abschaltet. Bei <  3°C soll sie dann wieder einschalten. So weit so gut und auch nicht tragisch.  Dies soll aber nur geschehen, wenn mein Regensensor sagt, daß es regnet (also HOF_Regen1 - state:on) und die Aussentemperatur weiterhin < 0°C bleibt. Wenn es nicht mehr regnet (bei den Temperaturen wohl eher schneit) soll die Heizung aber noch mindestens 3 Stunden weiter heizen, damit der Schnee weiter schmelzen kann.

Ich hab zwar schon so einiges mit Threshold rumprobiert, bekomme aber den Regensensor nicht eingebunden.

Die Temperaturmessung geschieht mit einem HM-WDS30-OT2-SM welcher an einem Sensor die Aussentemperatur und mit dem zweiten Sensor die Dachrinnentemperatur misst. Der Regensensor ist ein FS20SR. Dieser sendet alle 2 Minuten ein "on".

Wäre für einen Denkansatz dankbar.

Gruß Thomas

Puschel74

#1
Hallo,

Zitatwelche bei einer Aussentemperatur < 0°C die Dachrinne soweit aufheizen soll, daß sie > 3 °C hat und dann abschaltet.
Also mal ein notify auf die Aussentemperatur:temp:* ODER Dachrinne:temp.*
define Dachrinnen_an_pruef notify (Aussentemperatur|Dachrinne):temp.* {

mit einer if-Abfrage ob Aussentemperatur kleiner 0
if (ReadingsVal("Aussentemperatur") < "0.0") {

und einer if-Abfrage ob Dachrinne<3
if (ReadingsVal("Dachrinne") < "3.0") {

und einer Prüfung auf Regen
if (Value("HOF_Regen1") eq "on) {

schaltet die Dachrinenheizung ein
set Dachrinnenheizung on;

In allen anderen Fällen schalten wir die Heizung wieder aus.

Und hier der gesamte Code  ;)
ist ja kurz vor Weihnachten

define Dachrinnen_an_pruef notify (Aussentemperatur|Dachrinne):temp.* {
  if (ReadingsVal("Aussentemperatur") < "0.0") {
    if (ReadingsVal("Dachrinne") <= "3.0") {
  if (Value("HOF_Regen1") eq "on) {
    fhem("set Dachrinnenheizung on") if (Value("Dachrinnenheizung") ne "on");
  }
  else {
        fhem("set Dachrinnenheizung off") if (Value("Dachrinnenheizung") ne "off");
      }
}
else {
      fhem("set Dachrinnenheizung off") if (Value("Dachrinnenheizung") ne "off");
    }
  }
  else {
    ("set Dachrinnenheizung off") if (Value("Dachrinnenheizung") ne "off");
  }
}


Die vielen else-Abfragen hätte man sich sicher auch sparen können - ich will nur auf Numemr sicher gehen.
Eine Bedingung von dir - das es regnet - habe ich mal untergeordnet.

Grüße

Edith: Evtl. Fehler ausgebessert und unnötige Schaltungen vermieden
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Damian

#2
oder so:

define TH_Aussen THRESHOLD Aussen:temperature:0:0

define Heizbedarf structure Heizbadarf_typ TH_Aussen Regensensor
attr Heizbedarf clientstate_behavior relativeKnown
attr Heizbedarf clientstate_priority off on

define TH_Heizung TRHESHOLD Dachrinne:temperature:6:3 OR Heizbedarf:state:off



Für die Verzögerung von drei Stunden, kannst du statt Regensensor einen Dummy in der Structure eintragen. Der Dummy wird verzögert über einen Watchdog auf off gesetzt, wenn der Regensensor einen Zustandsübergang von on auf off erfährt.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Puschel74

Hallo,

Zitatoder so:

Äh - oder so  :o

Ok. Ich lern gern noch dazu.
Habe den Code zwar nicht durchblickt aber das wird schon noch (hoffentlich).
Genial wie kurz das geht.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

DerTom

Moin,

@Puschel74: Die Idee, das ganze nicht über Threshold zu regeln, habe ich ehrlich gesagt gar nicht in Erwägung gezogen, ist aber durchaus ein Ansatz. Allerdings ist der Fakt dass es regnet nicht so untergeordnet, wie Du vielleicht denkst. Es ist nur sinnvoll, die Heizung einzuschalten wenn es auch was zum "Schmelzen" gibt...Die Dachrinne aufzuheizen, nur weil es unter 0°C ist, wäre ja Stromverschwendung...immerhin hat das Ding eine Leistung von 300 W...

@Damian: Das ist wirklich kurz und prägnant! Da muss ich, wie Puschel auch schon meinte, erst mal durchsteigen. Ich will es ja verstehen, nicht nur anwenden. Daher auch die Bemerkung wegen des Denkansatzes. Aber ich wurschtele mich da mit Hilfe der Commandref schon durch...

Schönen 4. Advent, und danke für die Hilfe. :D

Damian

Zitat von: DerTom am 22 Dezember 2013, 09:50:28
@Damian: Das ist wirklich kurz und prägnant! Da muss ich, wie Puschel auch schon meinte, erst mal durchsteigen. Ich will es ja verstehen, nicht nur anwenden. Daher auch die Bemerkung wegen des Denkansatzes. Aber ich wurschtele mich da mit Hilfe der Commandref schon durch...

Es war schon zu kurz. Damit es auch wirklich funktionieren kann, muss man natürlich beim zweiten THRESHOLD noch angeben, was überhaupt zu schalten ist, also:

define TH_Heizung TRHESHOLD Dachrinne:temperature:6:3 OR Heizbedarf:state:off Heizung

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Puschel74

Hallo,

der Regensensor ist bei meinem Code nur deswegen "untergeordnet" weil das notify nicht auf ein regexp von diesem "hört".

Eingeschaltet wird die Heizung nur wenn
Aussentemperatur < 0 °C
Dachrinne < 3°C
und Regensensor meldet on.

Sollte der Regensensor nun ein off melden reagiert das notify nicht drauf da ich davon ausgehe das die 2 Temperaturen (Aussentemperatur und Dachrinne) ihre Werte öfter melden als der Regensensor.
Sollte sich also die temperatur ändern und der Regensensor auf off stehen wird die Heizung natürlich wieder abgeschaltet.
Ebenso wenn eine der beiden Temperaturen höher ist als im Programm angegeben.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

DerTom

@Damian: Ja, ist mir auch schon aufgefallen, aber das hab ich schon korrigiert. Ebenso, wie die Hysterese des zweiten Treshold. Die darf nicht 6 sein, sondern 0, denn sie soll ja bei unter +3 °C wieder einschalten, nicht bei unter -3°C...

Aber wie schon vorher gesagt, ich brauchte nur den Denkansatz. Da kam mir Structure recht passend...

@Puschel: Stimmt, hab ich übersehen. Da aber der FS20SR sowieso kein "off"sendet, sondern ich dieses mit Ablaufen des FHEM-internen Timers nach 2 Minuten per Notify händisch auf off stelle (sonst bleibt "state" ewig auf "on"), hätte ich das damit auch abschalten können. Die Lösung mit Threshold und Structure ist allerdings eleganter. Aber trotzdem danke für diesen Ansatz.

Puschel74

Hallo,

ZitatDie Lösung mit Threshold und Structure ist allerdings eleganter.

Das glaube ich dir gerne  ;D

Könntest du bitte auch deinen kompletten Code hier einstellen und den Beitrag als gelöst markieren?
Evtl. sollten wir sowas auch ins Wiki packen (inkl. meinem umständlichen Code) damit andere davon profitieren.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

DerTom

Ich werde, wenn der Versuch erfolgreich war, hier gern morgen den vollen Code posten, da heute noch einige Adventsbesuche anstehen...(hab keine Lust dazu ::), aber muss sein.)

Wiki gern...

DerTom

#10
Hallo,

hab das Ganze jetzt mal getestet. So wie es aussieht habe ich 3 Themen zu klären:


  • Structure: Die Voraussetzungen sind folgende. Der state des structure soll auf on gehen, wenn beide Bedingungen erfüllt sind ( also <0°C UND es regnet). Der state soll aber auf off gehen, wenn nur EINE Bedingung auf off geht (entweder die Temp geht auf > 0°C ODER der Regen hört auf) Diese Möglichkeit ist weder mit "clientstate_behavior=relative", noch mit "last" gegeben (mit "relativeKnown" und "absolute" bleibt der Status ständig auf "undefined"). Wie kann ich das lösen?
  • Structure: Was hat es mit der Priorisierung auf sich? Ob ich nun on vor off oder off vor on setze, macht keinen Unterschied.Ich habe mal ein paar Testreihen gemacht und angehängt. Schaltrichtung besagt, ich habe die Zustände in Schaltrichtung geändert. Scheinbar richtet sich der state des structure immer nur nach dem Regensensor. Verändert er seinen Zustand, wird der Zustand des structure geändert, wenn der Zustand des Threshold sich ändert, ist das scheinbar nicht von Belang.
  • Threshold: Wenn ich die Werte "hysteresis", "offset" oder "desired" im GUI per "set"-Button" (FHEMWEB) verändere (nicht "DEF"!), werden diese nach einem Save config, nicht in die fhem.cfg übergeben und ich habe nach einem Neustart wieder die Werte, welche ich in der fhem.cfg (direkt oder per Veränderung des Wertes "DEF") eingetragen hab. Wieso werden diese nicht verändert?


Das ist alles sehr verwirrend...

Gruß
Thomas

Damian

Zitat von: DerTom am 23 Dezember 2013, 15:04:59
Das ist alles sehr verwirrend...

Hallo Thomas,

dann fangen wir ganz langsam an, bevor das Christkind kommt:  :)

define D1 dummy
define D2 dummy
define D_S structure D_Typ D1 D2
attr D_S  clientstate_behavior relativeKnown
attr D_S clientstate_priority off on


set D1 on
set D1 on
liefert D_S on

set D1 off
set D1 on
liefert D_S  off

set D1 on
set D1 off
liefert D_S  off

set D1 off
set D1 off
liefert D_S off

Funktioniert bei mir wie programmiert.

Auf gut deutsch: sobald einer auf off geht, ist structure off, wenn alle on sind, dann ist structure on.

Wenn das bei dir läuft, dann kannst du als nächstes einen Dummy gegen den ersten Threshold aus meinem Vorschlag ersetzen.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

DerTom

Hallo Damian,

ich muss sagen, mit einem Dummy statt dem direkten state des Regensensors funktioniert es. Dann schalte ich also zusätzlich einen Dummy mit dem Regensensor. Muss man nur erst mal wissen, daß sich ein FS20SR mit follow-on-timer anders verhält als ein Dummy. Was solls. Werde alles zusammenstellen und dann hier posten.

Es bleibt trotzdem noch meine Frage 3...kannst Du mir diese beantworten? Immerhin bist Du der Urheber des Moduls.

Gruß
Thomas

Damian

Zitat von: DerTom am 25 Dezember 2013, 12:39:24
ich muss sagen, mit einem Dummy statt dem direkten state des Regensensors funktioniert es.
Es muss auch mit dem Regensensor funktionieren, wenn er im Status on bzw. off enthält.
Zitat
Es bleibt trotzdem noch meine Frage 3...kannst Du mir diese beantworten? Immerhin bist Du der Urheber des Moduls.

Das hat eher etwas mit dem FHEM-Konzept zu tun, als mit meinem Modul.

Die Internals werden im Gegensatz zu Readings und Attributen nicht gespeichert, sondern nur die Definition (DEF) des Moduls. Beim erstmaligen Laden des Moduls wird die Definition (DEF) im Modul ausgewertet und die entsprechenden Internals belegt.

Wenn die Werte den Neustart überleben sollen, dann musst du sie in der Definition (DEF) angeben.

Hier z. B. Hysterese von 2 Grad und Offset von -1.

define TH_Heizung TRHESHOLD Dachrinne:temperature:2:3:-1 OR Heizbedarf:state:off Heizung

Für eine dynamische Anpassung von Hysterese bzw. Offset zur Laufzeit, kannst du dir etwas programmieren, was dann über die Schnittstelle set dein_modul ... die Hysterese bzw. den Offset setzt, die statische Anpassung funktioniert über Definition (DEF) wie oben beschrieben.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

DerTom

ZitatEs muss auch mit dem Regensensor funktionieren, wenn er im Status on bzw. off enthält.

Ich habe KEINE Ahnung, was ich jetzt anders gemacht habe. Jetzt funktioniert es auch mit der direkten Nutzung des Regensensors. Gestern kam als Status immer nur undefined heute schaltet er richtig in off bzw. on. Kann wohl nur an mir gelegen haben. Wie auch immer...

Hier die Aufgabenstellung und die getestete Lösung.

Eine Heizung soll bei Aussentemperaturen von <0°C die Dachrinnentemperatur auf >+3°C erhöhen und dann abschalten. Bei einer Dachrinnentemperatur von <+3°C soll die Heizung wieder einschalten. Dies soll aber nur geschehen, wenn Niederschlag fällt. Die Temperatur wird mit einem HM-WDS30-OT2-SM gemessen, welcher 2 Sensoren hat. Einer misst am Dach die Aussentemperatur, während der andere die Dachrinnentemperatur in mindestens 5 cm Entfernung zur Dachrinnenheizung überwacht. Diese wird mit einem FS20WS1 geschaltet. Der Regensensor ist ein FS20SR.

Regensensor:

define HOF_Regen1 FS20 <HC> <GC>
attr HOF_Regen1 follow-on-timer 130


Da der Regenssensor bei Niederschlag alle 120 Sekunden ein "on", aber niemals ein "off" sendet, setze ich mit "follow-on-timer 130" den Status auf "off" zurück, wenn kein "on" nach 120 Sekunden mehr kommt.

Schalter Heizung:

define Dachrinnenheizung FS20 <HC> <GC>
attr Dachrinnenheizung model fs20ws1


Temperatursensor:

Nach dem pairen mit FHEM erscheinen beide Sensoren als Channel im FHEM. Zur Vereinfachung beziehe ich mich nur auf die beiden Channel, welche die Temperaturen überwachen (01 und 02). die 3 anderen Channel (03,04,05), welche nur Differenzen übermitteln und den Eventchannel benötige ich nicht.

In diesem Fall lautet der Name des Aussentemperaturfühlers "HMOT1_Aussen" und der des Dachrinnentemperaturfühlers "HMOT1_Dachrinne".

Die erste Voraussetzung (Aussentemp. <0°C) wird mit einem ersten Threshold definiert und gibt als state bei einer Temperatur <0°C ein "on" aus:

define DRS_Aussen THRESHOLD HMOT1_Aussen:temperature:0:0
attr DRS_Aussen DRS_Heizbedarf_Typ DRS_Heizbedarf
attr DRS_Aussen state_cmd1_gt off
attr DRS_Aussen state_cmd2_lt on
attr DRS_Aussen state_format _sc


Den Status des Regensensors haben wir schon definiert. Beides wird nun in einer Structure zusammengefasst:


define DRS_Heizbedarf structure DRS_Heizbedarf_Typ HOF_Regen1 DRS_Aussen
attr DRS_Heizbedarf clientstate_behavior relativeKnown
attr DRS_Heizbedarf clientstate_priority off on


Wenn beide Bedingungen auf "on" gehen, steht der Status der structure ebenfalls auf "on". Wenn eine Bedingung nicht mehr zutrifft, geht der Status der structure auf "off.

Nun zur eigentlichen Steuerung. E werden beide Bedingungen (structure auf "on" und Dachrinnentemp <+3°C) geprüft. Wenn beide Bedingungen wahr sind, wird die Dachrinnenheizung eingeschaltet und heizt, wegen der Hysterese 0, bis auf >+3°C auf, und schaltet dann ab) :

define DRS_Temp THRESHOLD HMOT1_Dachrinne:temperature:0:3 OR DRS_Heizbedarf:state:off Dachrinnenheizung
attr DRS_Temp state_cmd1_gt off
attr DRS_Temp state_cmd2_lt on
attr DRS_Temp state_format _m _dv _sc


Die genannten Temperaturwerte sind relativ und jeder mag da eine andere Anicht vertreten, ab welchen Temperaturen so eine Heizung sinnvoll ist.

Vielen Dank an Damian und Puschel74 für die Unterstützung.

Gruß Thomas

PS: Wer möchte, kann den Eintrag ins Wiki stellen...