Steuerung Zirkulationspumpe mit 1Wire Temp.Sensor

Begonnen von Horschd, 28 Dezember 2017, 13:47:10

Vorheriges Thema - Nächstes Thema

Horschd

Hallo, Ich möchte eine Zirkulationspumpe mit einem DS18B20 Steuern.  Der Sensor wird  jede Sekunde abgefragt und die Pumpe sollte einschalten wenn innerhalb von 3 Abfragen die Temperatur um 10°C gestiegen ist. Wie kann ich dieses Nach 3 Abfragen Temperaturunterschied grösser 10°C mit DOIF umsetzen? Wenn das schon irgendwo beschrieben ist wäre ich für den Verweis auch sehr dankbar

Ellert

Du könntest im DOIF ein Reading als Zähler verwenden und Ihn vor dem Befehl  hochzählen und abfragen, etwa so

(deine bedingung) (setreading $SELF count {([$SELF:count] +1)}, IF ([$SELF:count] > 2) (setreading $SELF count 0, deine Befehle))

Horschd

Danke erst mal, ich steige zwar noch nicht ganz durch aber ich werde mich durchlesen. Jetzt hab ich ja einen Anhaltspunkt. Bin noch ganz neu in dem ganzen Thema FEHM aber das wird schon.

Beta-User

Hallo Horschd,

vorab: Willkommen im Forum!

Eine Anmerkung: Je nachdem, wie du den DS18B20 abfragst, kannst du dir FHEM mit einer derart kurzzyklischen Verwendung von 1wire ziemlich lahmlegen. (Kannst ja mal apptime und perfmon bemühen und nachsehen, wie das konkret ausschaut).

Ich mache sowas ähnliches direkt auf einem Arduino, schaue dabei aber nur, ob nach Ablauf eines längeren Zeitraums eine geringere Erhöhung ist (und das Zieldevice nicht schon an). Könnte hier also 5 Grad in 5 Sekunden sein, wobei dafür z.B. auch ein notify mit oldValue-Vergleich ginge.

Für das DOIF müßtest du vermutlich noch eine ganze Anzahl von Referenztemperaturen intern verwalten.

Gruß, Beta-User
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Horschd

@Beta-User
Danke, wie gesagt bin ich in dem ganzen Thema noch sehr wackelig unterwegs. Werde mir deinen Lösungsansatz auch ansehen. Bin schon mehr wie zufrieden mit mir das ich Sensor und Relais in Fehm habe. Bei mir läuft das ganze über einen Raspberry zero W.

Ellert

Nochmal hierzu:
ZitatNach 3 Abfragen Temperaturunterschied grösser 10°C

Könntest Du das etwas mathematischer formulieren? Der Interpretationsspielraum ist recht groß.

Beispiel, wenn

deltaT = Temperaturdifferenz
T0,T1,T2,... = Temperatur zu den Zeitpunkten 0,1,2,...
ti = Dauer des Zeitintervalls

Meinst Du dann

T1-T0 + T2-T1 + T3-T2 > deltaT dafür müsstest Du nicht 3 mal rechnen, Du müsstest nur das Abfrageintervall verdreifachen

oder meinst Du

(T1-T0) > deltaT and (T2-T1) > deltaT and (T3-T2) > deltaT

Bevor Du es zu kompliziert machst könntest Du auch THRESHOLD  als Zweipunktregler nutzen.

Horschd

@Ellert
Ich versuche es mal zu beschreiben. Ich habe einen Boiler der durch Solar oder Holzvergaser erhitzt wird. dadurch habe ich im Boiler keine konstante Temperatur. ich möchte jetzt mit einem DS18B20 ziemlich kurz hinter dem Boiler an der Wasserleitung die Temperatur abfragen. Wenn jetzt jemand kurz den Wasserhahn aufdreht und dann wieder schließt steigt die Temperatur sehr schnell in einem kurzen Zeitraum und das soll der Auslöser für die Zirkulationspumpe sein. Nach dem Auslöser soll die Pumpe max. 3 min nachlaufen und fertig. Soll bewirken das die Pumpe nur bei Bedarf läuft. Da ich große Temperaturschwankungen im Boiler habe ist es nicht möglich es an einer fixen Temperatur festzumachen. Daher der Gedanke: sobald  in einer bestimmten Zeit ein Temperaturunterschied von  x°C überschritten wird geht die Pumpe an.
Sorry das ich es nicht Mathematischer formulieren kann.
Trotzdem vielen Dank

Beta-User

Als Referenzwert, ich mache was ähnliches mit der "normalen" Warmwasserzirkulation:

Als Indikator reichen meinem Arduino +0,2°C, es wird alle 10 Sek. gemessen, der Sensor klebt eng am Rohr (Metall), das an der Stelle isoliert ist. Der Sensor sitzt ca. 80cm hinter dem WW-Speicher. Echte Klagen sind mir damit bisher noch nicht gekommen, ich habe auch nicht den Eindruck, dass zu oft geschaltet wird. Wenn die WW-Temperatur stärker schwankt und das auch Auswirkungen auf die Temp. am Rohr hat (?), würde ich da etwas höhere Werte testen, am besten Grafiken draus machen, dann sieht man dann schön, was passiert ist, und ob das plausibel ist.
Am Rücklauf der Pumpe sitzt übrigens ein 2. DS18B20, der alle 30 sek. prüft, ob die Temp. so ist, dass man davon ausgehen kann, dass an allen Zapfpunkten WW vorhanden ist und dann wieder abschaltet.

Ist aber natürlich immer von den konkreten Anforderungen abhängig.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Horschd

Ich denke du hast genau das was ich auch will, der 2 DS18B20 war auch bei mir eine Überlegung. Ich habe nur extrem Probleme das ganze in einen Code zu formulieren. Ich Büffel zwar schon den ganzen Tag aber ich will das nicht auf die Reihe bekommen. So langsam sehe ich den Wald vor lauter Bäumen nicht mehr.

Beta-User

...mein Arduino-Code ist auf github...
Bringt dich nur vermutlich nicht weiter, weil du erst mal die Grundlagen verstehen solltest, bevor du "richtiges" Coding angehst - und Arduino ist halt Microcontroller-Programmierung unter C++. Hier dann in Verbindung mit MySensors als Kommunikationsebene.

Ging nur um den Refenzwert.

Zum Einstieg würde ich mir (nach Lektüre des Einsteiger-pdf's) den Event-Monitor im Wiki und in Natur näher ansehen und dann das ganze mit notify, perl-if und OldValue zu lösen versuchen.

Just my2ct.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors


Damian

#11
defmod di_zirk DOIF (([zirk:temperature]-[?$SELF:last_temp,99])>1)(set pumpe on)(set pumpe off,setreading $SELF last_temp [zirk:temperature]) DOELSEIF (([?$SELF:last_temp,99]-[zirk:temperature])>1) (setreading $SELF last_temp [zirk:temperature])

attr di_zirk do always
attr di_zirk repeatsame 1
attr di_zirk wait 0,180


Du kannst es erstmal mit einem Einzeiler mit ein paar Zutaten probieren ;)

zirk ist der Temperatursensor.

Edit: die Aktualisierungsrate am 1-Wire-Sensor musst du natürlich von default 300 Sekunden runtersetzen, davon hängt die Reaktionszeit der Schaltung ab. Du kannst ja mal 10 Sekunden probieren.
Edit: Definition angepasst.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

Zitat von: Horschd am 28 Dezember 2017, 18:49:12
@Ellert
Ich versuche es mal zu beschreiben. Ich habe einen Boiler der durch Solar oder Holzvergaser erhitzt wird. dadurch habe ich im Boiler keine konstante Temperatur. ich möchte jetzt mit einem DS18B20 ziemlich kurz hinter dem Boiler an der Wasserleitung die Temperatur abfragen. Wenn jetzt jemand kurz den Wasserhahn aufdreht und dann wieder schließt steigt die Temperatur sehr schnell in einem kurzen Zeitraum und das soll der Auslöser für die Zirkulationspumpe sein. Nach dem Auslöser soll die Pumpe max. 3 min nachlaufen und fertig. Soll bewirken das die Pumpe nur bei Bedarf läuft. Da ich große Temperaturschwankungen im Boiler habe ist es nicht möglich es an einer fixen Temperatur festzumachen. Daher der Gedanke: sobald  in einer bestimmten Zeit ein Temperaturunterschied von  x°C überschritten wird geht die Pumpe an.
Sorry das ich es nicht Mathematischer formulieren kann.
Trotzdem vielen Dank

Du beobachtest die Temperatur über die Zeit, die Geschwindigkeit mit der Temperatur steigt (Temperatur sehr schnell in einem kurzen Zeitraum) ergibt sich aus dem Differenzenquotienten (Temperaturdifferenz / Zeitdifferenz), der wäre das Maß, um einen geöffneten Wasserhahn zu erkennen.

Dieses Verfahren bieten userReadings standartmässig an und erfordert keine tieferen mathematischen Vorkenntnisse.
http://fhem.de/commandref_DE.html#userReadings

Ein userReading würde etwa so aussehen:
attr <gerätename> userReadings diffquote differential {ReadingsNum($name,<temperatur reading>,<defaultwert>)}

Die Angaben in Spitzen klammern müsstest Du durch die Bezeichnungen Deines DS18B20-Gerätes ersetzen.

Horschd

Vielen Dank euch, ich hab jetzt einige Ansatzpunkte. Hätte nicht gedacht das so viele verschiedene Wege zum Ziel führen können. Ich werde nach und nach alle ausprobieren. Das bringt mich auch insgesamt einen großen Schritt weiter. Mit Programmiersprache  tue ich mir einfach gerade noch sehr schwer aber ich möchte das lernen. Das letzte mal als ich damit in Berührung kam hieß die  Sprache noch Basics und war auf einem CPC6128 ( das Gegenstück zum C64 von Schneider). Also doch schon etwas länger her.

Nochmals, VIELEN DANK!!

Per

Viel leichter wäre es, wenn du nicht mit drei, sondern nur mit zwei Werten arbeiten würdest. Den letzten Wert speichert Fhem nämlich automatisch. Die Zeit (Quotient) sollte mit "1s" recht genau angegeben sein und damit zu ignorieren. Also einfach die Differenz zwischen den beiden letzten Messwerten nutzen.