THZ Tecalor (LWZ Stiebel Eltron) Wärmepumpe -Optimierung und Erfahrungsaustausch

Begonnen von willybauss, 07 Februar 2015, 11:30:16

Vorheriges Thema - Nächstes Thema

willybauss

you simply need to check 3 weeks ago data before and after filter change.
FHEM auf Raspberry Pi B und 2B; THZ (THZ-303SOL), CUL_HM, TCM-EnOcean, SamsungTV, JSONMETER, SYSMON, OBIS, STATISTICS

willybauss

Ich hatte mal vor Monaten angefangen, die Lüfterstufen zu automatisieren in Abhängigkeit von den Werten der Luftqualität (Co20-Sensoren). Damit bin ich nun ein gutes Stück weiter gekommen. Ich mache nicht mehr zeitgesteuerte "Extravents", sondern ich wechsle die Standard-Lüfterstufen für Tag/Nacht. Das läuft deutlich stabiler. Außerdem habe ich für manuelle Eingriffe die Extravents zur Verfügung.

Zunächst die Definition der Co20-Sensoren incl. FileLog und Mittelwertbildung per userReadings:

define Schlafzimmer_co20 CO20 573435363737150B2313
attr Schlafzimmer_co20 advanced 1
attr Schlafzimmer_co20 event-aggregator voc_avg:900:linear:mean
attr Schlafzimmer_co20 event-on-update-reading voc,voc_avg
attr Schlafzimmer_co20 interval 180
attr Schlafzimmer_co20 retries 20
attr Schlafzimmer_co20 room Heizung
attr Schlafzimmer_co20 timeout 10000
attr Schlafzimmer_co20 userReadings voc_avg { ReadingsVal("Schlafzimmer_co20","voc",0) }

define FileLog_Schlafzimmer_co20 FileLog /mntUSB/fhem/log/CO20-%Y-%m.log Schlafzimmer_co20:.*


define Wohnzimmer_co20 CO20 553438323037150C070E
attr Wohnzimmer_co20 advanced 1
attr Wohnzimmer_co20 event-aggregator voc_avg.*:720:linear:mean
attr Wohnzimmer_co20 event-on-update-reading voc,voc_avg
attr Wohnzimmer_co20 interval 180
attr Wohnzimmer_co20 retries 20
attr Wohnzimmer_co20 room Heizung
attr Wohnzimmer_co20 timeout 10000
attr Wohnzimmer_co20 userReadings voc_avg { ReadingsVal("Wohnzimmer_co20","voc",0) }

define FileLog_Wohnzimmer_co20 FileLog /mntUSB/fhem/log/CO20-%Y-%m.log Wohnzimmer_co20:.*


Dann die Plots für beide:

define Mythz_Plot5_Schlafzimmer_co20 SVG FileLog_Schlafzimmer_co20:SVG_FileLog_Schlafzimmer_co20_1:CURRENT
attr Mythz_Plot5_Schlafzimmer_co20 label "Schlafzimmer voc: $data{currval4} - at - $data{currdate1}"
attr Mythz_Plot5_Schlafzimmer_co20 plotsize 840,210
attr Mythz_Plot5_Schlafzimmer_co20 room Heizung_Plot

define Mythz_Plot6_Wohnzimmer_co20 SVG FileLog_Wohnzimmer_co20:SVG_FileLog_Wohnzimmer_co20_1:CURRENT
attr Mythz_Plot6_Wohnzimmer_co20 label "Wohnzimmer voc: $data{currval4} - at - $data{currdate1}"
attr Mythz_Plot6_Wohnzimmer_co20 plotsize 840,210
attr Mythz_Plot6_Wohnzimmer_co20 room Heizung_Plot


Zwei Dummyvariablen für die "Wunsch-Lüfterstufen" der beiden Räume:

define extraVent_Schlafzimmer_value dummy
attr extraVent_Schlafzimmer_value room Heizung

define extraVent_Wohnzimmer_value dummy
attr extraVent_Wohnzimmer_value room Heizung


Ein DOIF fürs Schlafzimmer, das die "Wunsch-Lüfterstufe" ermittelt: (nur nachts, tagsüber wird der Wert zwangsweise auf 0 gesetzt)

define extraVent_Schlafzimmer DOIF (    ([00:30-06:00])\
and ([Schlafzimmer_co20:voc_avg] > 3400)\
and ([extraVent_Schlafzimmer_value] != 3) ) \
        (set extraVent_Schlafzimmer_value 3, {Log 1,"extraVentSchlafzimmer set to level 3"}) \
DOELSEIF\
(    ([00:30-06:00])\
and ([Schlafzimmer_co20:voc_avg] < 2900) \
and ([Schlafzimmer_co20:voc_avg] > 2500)\
and ([extraVent_Schlafzimmer_value] != 2) ) \
        (set extraVent_Schlafzimmer_value 2, {Log 1,"extraVentSchlafzimmer set to level 2"})\
DOELSEIF\
(    ([00:30-06:00])\
and ([Schlafzimmer_co20:voc_avg] < 1800) \
and ([Schlafzimmer_co20:voc_avg] > 1400)\
and ([extraVent_Schlafzimmer_value] != 1) ) \
        (set extraVent_Schlafzimmer_value 1, {Log 1,"extraVentSchlafzimmer set to level 1"})\
DOELSEIF\
(    ([00:30-06:00])\
and ([Schlafzimmer_co20:voc_avg] < 700)\
and ([extraVent_Schlafzimmer_value] != 0) ) \
        (set extraVent_Schlafzimmer_value 0, {Log 1,"extraVentSchlafzimmer set to level 0"})\
DOELSEIF\
((not [00:30-06:00])\
and ([extraVent_Schlafzimmer_value] != 0) ) \
        (set extraVent_Schlafzimmer_value 0, {Log 1,"extraVentSchlafzimmer set to level 0 - out of night"})\

attr extraVent_Schlafzimmer do always
attr extraVent_Schlafzimmer event-on-update-reading voc
attr extraVent_Schlafzimmer room Heizung

Die "Lücken" in den Luftqualitätswerten verursachen eine Hysterese, damit die Anlage nicht bei geringsten Änderungen wild hin- und her schaltet. Die Verwendung der Average-Werte statt der "echten" Readings beruhigt die Reaktion nochmal etwas.

dito fürs Wohnzimmer:

define extraVent_Wohnzimmer DOIF (    ([Wohnzimmer_co20:voc_avg] > 3600)\
and ([extraVent_Wohnzimmer_value] != 3) ) \
        (set extraVent_Wohnzimmer_value 3, {Log 1,"extraVent_Wohnzimmer set to level 3"}) \
DOELSEIF\
(    ([Wohnzimmer_co20:voc_avg] < 3200)\
and ([Wohnzimmer_co20:voc_avg] > 2800) \
and ([extraVent_Wohnzimmer_value] != 2) ) \
        (set extraVent_Wohnzimmer_value 2, {Log 1,"extraVent_Wohnzimmer set to level 2"}) \
DOELSEIF\
(    ([Wohnzimmer_co20:voc_avg] < 1900)\
and ([Wohnzimmer_co20:voc_avg] > 1200) \
and ([extraVent_Wohnzimmer_value] != 1) ) \
        (set extraVent_Wohnzimmer_value 1, {Log 1,"extraVent_Wohnzimmer set to level 1"}) \
DOELSEIF\
(    ([Wohnzimmer_co20:voc_avg] < 700) \
and ([extraVent_Wohnzimmer_value] != 0) ) \
        (set extraVent_Wohnzimmer_value 0, {Log 1,"extraVent_Wohnzimmer set to level 0"})\

attr extraVent_Wohnzimmer do always
attr extraVent_Wohnzimmer event-on-update-reading voc
attr extraVent_Wohnzimmer room Heizung

Hier ohne zeitliche Einschränkungen.

und schließlich ein DOIF, das endgültig die Entscheidung über die Lüfterstufe trifft:

define extraVent_ALL DOIF (( ([extraVent_Wohnzimmer_value] == 3) \
   or ([extraVent_Schlafzimmer_value] == 3) )\
  and ([Mythz:sGlobal:[inputVentilatorPower. (\d+)]] < 55) )\
((set Mythz p07FanStageDay 3), \
(set Mythz p08FanStageNight 3), \
(attr extraVent_ALL cmdpause 7200:7200:7200:7200),\
{Log 1,"Ventilation set to level 3"})\
DOELSEIF\
   (( ([extraVent_Wohnzimmer_value] == 2) \
   or ([extraVent_Schlafzimmer_value] == 2)\
   or ([Mythz:Rel_humidity] > 70) ) \
and ( ([Mythz:sGlobal:[inputVentilatorPower. (\d+)]] > 55) \
   or  ([Mythz:sGlobal:[inputVentilatorPower. (\d+)]] < 30) ))\
((set Mythz p07FanStageDay 2), \
(set Mythz p08FanStageNight 2), \
(attr extraVent_ALL cmdpause 1:7200:7200:7200),\
{Log 1,"Ventilation set to level 2"},\
{Log 1,"extraVent_Wohnzimmer_value: $extraVent_Wohnzimmer_value"},\
{Log 1,"extraVent_Schlafzimmer_value: $extraVent_Schlafzimmer_value"},\
{Log 1,"Mythz:Rel_humidity: $Mythz:$Rel_humidity"})\
DOELSEIF\
   (( ([extraVent_Wohnzimmer_value] == 1) \
   or ([extraVent_Schlafzimmer_value] == 1) \
   or ([Mythz:sGlobal:[dhwPump. (\d+)]] > 0) )\
and ( ([Mythz:sGlobal:[inputVentilatorPower. (\d+)]] > 30) \
   or  ([Mythz:sGlobal:[inputVentilatorPower. (\d+)]] < 10) ))\
((set Mythz p07FanStageDay 1), \
(set Mythz p08FanStageNight 1), \
(attr extraVent_ALL cmdpause 1:1:7200:7200),\
{Log 1,"Ventilation set to level 1"})\
DOELSEIF\
    ( ([extraVent_Wohnzimmer_value] == 0) \
  and ([extraVent_Schlafzimmer_value] == 0) \
  and ([Mythz:sGlobal:[inputVentilatorPower. (\d+)]] > 10)\
  and ([Mythz:sGlobal:[dhwPump. (\d+)]] == 0)\
  and ([Mythz:Rel_humidity] < 60) \
  and ([RandomTimer_BinAbwesend] eq "ja") )\
((set Mythz p07FanStageDay 0), \
(set Mythz p08FanStageNight 0), \
(attr extraVent_ALL cmdpause 1:1:1:7200),\
{Log 1,"Ventilation set to level 0"})\

attr extraVent_ALL cmdState Level_3|Level_2|Level_1|Level_0
attr extraVent_ALL cmdpause 1:1:7200:7200
attr extraVent_ALL do always
attr extraVent_ALL room Heizung

Hier kommt noch eine Abfrage der aktuellen Lüftereinstellung hinzu, damit nicht unnötig ein bereits gesetzter Wert nochmal gesetzt wird. Ich will mir ja nicht den Speicherbaustein in der THZ zerschießen.
Die "cmdpause" Attribute führen dazu, dass eine einmal höher gestellte Lüfterstufe erst mal für 1 - 2 Stunden hoch bleibt und nicht gleich wieder runter gestellt werden kann. Andererseits ist nach einem runter stellen ein sofortiges höher setzen erlaubt, um auf plötzlich einsetzende schlechte Luft ohne Verzögerung reagieren zu können.
Außerdem wird hier noch auf zu hohe Luftfeuchtigkeit reagiert => Lüftung auf Stufe 2 schalten), sowie Zwangslüftung nach dem duschen (DHW-Pumpe triggert das einschalten der Lüftung auf Stufe 1).

Für den Sommer lasse ich mir noch ein DOIF für die Passivkühlung einfallen, das dann ähnlich wie das Wohnzimmer-DOIF arbeitet. Es muss dann noch in die Logik des finalen extraVent_ALL DOIF implementiert werden.

Nachtrag 7.6.2016:
Ich habe inzwischen gesehen, dass das umschalten auf Lüfterstufe 0 (also ganz aus) nichts bringt. Die sehr kurzzeitigen Stromeinsparungen stehen in keinem Verhältnis zur Anzahl der Schaltungen und damit dem Risiko, die max. Schreibzyklen des Memory-Bausteins zu stressen. Deshalb habe ich das letzte DOIF so geändert, dass es nur noch im Urlaub aktiv ist:


Der Code ist im obigen Listing bereits enthalten


Die Hoffnung ist, dass im Urlaub, wenn niemand zuhause ist, sich die Verhältnisse im Haus nicht so sprunghaft ändern, und dass deshalb die Lüfterstufe 0 etwas bringt.
Die Dummyvariable "RandomTimer_BinAbwesend" hatte ich ohnehin schon für die Anwesenheitssimulation der Lichtsteuerung und für die Verschattung per Rollladen. Da lag es nahe, sie hierfür ebenfalls zu verwenden.

Ansonsten bleibt noch zu erwähnen, dass ich mit Einführung der automatisierten Lüftersteuerung die Drehzahl der Lüfterstufe 1 an den unteren Anschlag eingestellt habe, also 60m³ pro Stunde. Auch so wird Strom gespart.

Nachtrag 23.8.2016:
Inzwischen habe ich eine Average-Bildung der co20-Werte (Wohnzimmer und Schlafzimmer) per userReadings eingeführt. Die DOIFs arbeiten nun mit diesen avf-Werten, wodurch sich Überreaktionen bei kurzzeitigen Peaks verringern. Die anderen Parameter haben eine leichte Überarbeitung (Feinabstimmung) erhalten.
Ab jetzt bekommt dieser Beitrag einen Link im ersten Beitrag der ersten Seite, quasi als Fortsetzungsroman  :).
FHEM auf Raspberry Pi B und 2B; THZ (THZ-303SOL), CUL_HM, TCM-EnOcean, SamsungTV, JSONMETER, SYSMON, OBIS, STATISTICS

willybauss

FHEM auf Raspberry Pi B und 2B; THZ (THZ-303SOL), CUL_HM, TCM-EnOcean, SamsungTV, JSONMETER, SYSMON, OBIS, STATISTICS

willybauss

Ich habe grade 2 Beiträge weiter oben noch einen Nachtrag zu dem letzten DOIF gemacht. Falls es Jemand implementieren will sollte er das gleich berücksichtigen.
FHEM auf Raspberry Pi B und 2B; THZ (THZ-303SOL), CUL_HM, TCM-EnOcean, SamsungTV, JSONMETER, SYSMON, OBIS, STATISTICS

houseowner123

Super, Willy! Grosse Klasse. Vielen Dank, daß Du das zur Verfügung stellst. Ich werde erst mal mit einen CO20 anfangen in einer Testumgebung. Eine Frage: Wenn beim Kamin Holz nachlegt, herrscht ja dann kurzzeitig schlechte Luft, eine Erhöhung der Luftzufuhr würde da allgemein kontrapoduktiv sein. Am besten ist es doch die Lüftung ganz auszuschalten wenn der Kamin an ist. Wenn ich mich recht entsinne, hast Du doch einen Kamin. Wie hast Du das mit dem CO20 gelöst? Viele Grüße, René

willybauss

Ich habe das so gelöst, dass ich gar keinen Kamin habe  :).

Wenn es ein Kamin mit Außenluftzufuhr ist, könnte man sicher die Lüftung abstellen so lange er läuft. Aber wenn er sich den Sauerstoff für die Verbrennung aus der Raumluft holt ist das evtl. keine gute Idee. Die heutigen Häuser sind so luftdicht, dass du sonst irgendwann erstickst.

Falls Dein Kamin einen Datenanschluss hat  ;) kannst Du ihn ja direkt in das DOIF für die Lüfterdrehzahlen einbinden. Aber das wird wohl eher unwahrscheinlich sein. Dann musst Du entweder von Hand ausschalten (unscheduled Vent) oder Dir irgend eine Erkennung für "Kamin brennt" einfallen lassen, z.B. einen Temperatursensor am Kaminrohr. Wobei man ja wegen des Wärmetauschers keine allzu großen Wärmeverluste durch die Lüftung hat; insofern: bringt das was?

Ich habe mir auch schon ein paar mal überlegt, ob man nicht kurzzeitige Spitzen in den Co20-Daten ausfiltern könnte, z.B. mit einer Integralwertbildung, damit die Lüfter nicht wegen jeder Kleinigkeit gleich hochlaufen. Aber darunter leidet dann halt auch die Reaktion in gewünschten Fällen, z.B. beim kochen.

Apropos kochen: über die Leistungsaufnahme von Herd oder Dunsthaube könnte man die Lüfterdrehzahlen ebenfalls triggern.

Ich habe übrigens noch einen Sensor in der Frischluftansaugung. Darüber könnte man einen automatischen Not-Aus realisieren, wenn der Nachbar grade mit Gülle düngt. In den letzten 4 Wochen war da bei mir aber nichts auffällig.
FHEM auf Raspberry Pi B und 2B; THZ (THZ-303SOL), CUL_HM, TCM-EnOcean, SamsungTV, JSONMETER, SYSMON, OBIS, STATISTICS

Junus

Hallo zusammen,

ich bin sehr begeistert von den Möglichkeiten dies sich mit FHEM für die Optimierung meiner THZ 403SOL bieten.
Herzlichen Dank schon mal an alle die dazu beigetragen haben.

Meine 403 hat die FW 2.36, wurde 2007 installiert und ich kann die im WIKI erwähnten USB Stecker auf der Hauptplatine nicht finden.
Kann es sein, dass es diese damals noch nicht gab?

Ich würde gerne die serielle Schnittstelle von meinem RasPi 3 zur Anbindung nutzen. Momenan scheitere ich noch daran, dass keine Datenverbindung zustande kommt.
Der RasPi incl FEM ist frisch aufgesetzt und die serielle Schnittstelle habe ich mit dem BT Overlay schon auf GPIOs 14 & 15 umgebogen. RS232 Pegelumsetzer ist auch da und die Funktion der RS232 Schnittstelle über /dev/ttyAMA0 durch Loopback mit einem Terminalprogramm geprüft.

Das serielle Kabel und die Schnittstelle der THZ funktioniert auch, da ich diese regelmäßig mit dem Serviceprogramm von Stiebel nutze.

In FHEM wird der Status "opend" angezeigt.

Hier das Log zum Start:

2016.06.11 21:21:57 0: Server shutdown
2016.06.11 21:21:59 1: Including fhem.cfg
2016.06.11 21:21:59 3: telnetPort: port 7072 opened
2016.06.11 21:22:00 3: WEB: port 8083 opened
2016.06.11 21:22:00 3: WEBphone: port 8084 opened
2016.06.11 21:22:00 3: WEBtablet: port 8085 opened
2016.06.11 21:22:00 2: eventTypes: loaded 110 events from ./log/eventTypes.txt
2016.06.11 21:22:00 3: Opening Mythz device /dev/ttyAMA0
2016.06.11 21:22:00 3: Setting Mythz serial parameters to 115200,8,N,1
2016.06.11 21:22:00 3: Mythz device opened
2016.06.11 21:22:00 1: Including ./log/fhem.save
2016.06.11 21:22:00 1: usb create starting
2016.06.11 21:22:01 1: usb create end
2016.06.11 21:22:01 0: Featurelevel: 5.7
2016.06.11 21:22:01 0: Server started with 16 defined entities (fhem.pl:11611/2016-06-04 perl:5.020002 os:linux user:fhem pid:781)
2016.06.11 21:22:06 3: Mythz THZ_ReadAnswer got no answer from DevIo_SimpleRead. Maybe too slow?
2016.06.11 21:22:06 3: Mythz THZ_ReadAnswer got no answer from DevIo_SimpleRead. Maybe too slow?
2016.06.11 21:22:07 3: Mythz THZ_ReadAnswer got no answer from DevIo_SimpleRead. Maybe too slow?
2016.06.11 21:22:07 3: Mythz THZ_ReadAnswer got no answer from DevIo_SimpleRead. Maybe too slow?
2016.06.11 21:22:08 3: Mythz THZ_ReadAnswer got no answer from DevIo_SimpleRead. Maybe too slow?
2016.06.11 21:22:09 3: Mythz THZ_ReadAnswer got no answer from DevIo_SimpleRead. Maybe too slow?
2016.06.11 21:22:09 3: Mythz THZ_ReadAnswer got no answer from DevIo_SimpleRead. Maybe too slow?
2016.06.11 21:22:10 3: Mythz THZ_ReadAnswer got no answer from DevIo_SimpleRead. Maybe too slow?
2016.06.11 21:22:10 3: Mythz THZ_ReadAnswer got no answer from DevIo_SimpleRead. Maybe too slow?
2016.06.11 21:22:11 3: Mythz THZ_ReadAnswer got no answer from DevIo_SimpleRead. Maybe too slow?

Woran könnte es liegen dass keine Daten ankommen? Liegt es evtl an der Version die laut Wiki nicht getestet ist?

Vielen Dank vorab,
Stefan

willybauss

Hi Stefan,
ich weiß nicht, ob hier Jemand über die serielle Schnittstelle des Raspi geht. Üblicherweise nimmt man den USB-Port des Raspi und geht direkt auf den USB-Stecker auf dem Board, oder mit einem USB-Seriell-Adapter auf den Servicestecker. Damit funktioniert es auch auf Anhieb - vorausgesetzt man hat einen der bekannt funktionierenden Adapter.

Mag sein, dass Deine Anlage den USB-Stecker auf dem Board noch nicht hat.

Gruß
Willy
FHEM auf Raspberry Pi B und 2B; THZ (THZ-303SOL), CUL_HM, TCM-EnOcean, SamsungTV, JSONMETER, SYSMON, OBIS, STATISTICS

immi

Hi Stefan
bist du sicher über die 115200
Hast Du probiert langsamer zu gehen?
gruß
immi

Junus

Zitat von: immi am 12 Juni 2016, 13:18:18
Hi Stefan
bist du sicher über die 115200
Hast Du probiert langsamer zu gehen?
gruß
immi
Habe ich, alles zwischen 9k6 und 115k2.

Viele Grüße,
Stefan

Gesendet von meinem SM-G850F mit Tapatalk


willybauss

Die Baudrate muss ja dieselbe sein wie beim Stiebel Serviceprogramm.
FHEM auf Raspberry Pi B und 2B; THZ (THZ-303SOL), CUL_HM, TCM-EnOcean, SamsungTV, JSONMETER, SYSMON, OBIS, STATISTICS

micomat

Synology DS218+ with fhem+iobroker in docker, 2x RasPi w. ser2net, CUL433+868, IT, EGPM2LAN, THZ/LWZ, FB_Callmonitor, HMS100TF, Homematic, 2x TX3-TH, Pushover, USB-IR-SML-Head, SONOS, GHoma, MBus, KLF200

immi

HI Stefan
bitte probiere mit 57600 und 115200
bitte poste die log-txt files mit Verbose 5

I saw something very strange in your screenshot;
you should not have p01RoomTempDayHC1SummerMode in your firmware.
Have you set the firmware attribute to 2.06 or 2.14 ?
immi

willybauss

Ich würde gerne die automatische Lüfterregelung noch etwas "beruhigen", so dass sie bei kurzen Spitzen (sh. Bild 6:00 Uhr) nicht sofort die Lüfter hoch fährt, sondern erst wenn der Wert bei der nächsten Auslesung in ähnlicher Höhe bestätigt wird. Dafür gibt es sicher eine einfache Lösung; mir fallen grade nur komplizierte ein  :-\. Hat Jemand eine Idee, wie es einfach geht?
FHEM auf Raspberry Pi B und 2B; THZ (THZ-303SOL), CUL_HM, TCM-EnOcean, SamsungTV, JSONMETER, SYSMON, OBIS, STATISTICS

immi

Zitat von: willybauss am 14 Juni 2016, 22:18:51
Ich würde gerne die automatische Lüfterregelung noch etwas "beruhigen", so dass sie bei kurzen Spitzen (sh. Bild 6:00 Uhr) nicht sofort die Lüfter hoch fährt, sondern erst wenn der Wert bei der nächsten Auslesung in ähnlicher Höhe bestätigt wird. Dafür gibt es sicher eine einfache Lösung; mir fallen grade nur komplizierte ein  :-\. Hat Jemand eine Idee, wie es einfach geht?
hi willi
make an average over 600s
attr co20modulename event-aggregator  .*:600:linear:mean


you can also define 2 variables with userreading : one  with an avarage every 200s (for plotting) and one with 800s (for triggering the ventilator)
immi