Seite auswählen
WEATHERMAN … die perfekte Wetterstation für die Hausautomation

WEATHERMAN … die perfekte Wetterstation für die Hausautomation

1 Warum eine besondere Wetterstation für die Hausautomation ?

Ursprünglich wollte ich ja gar keine Wetterstation selber bauen, sondern wollte die für die Homematic vorgesehene Wetterstation nehmen oder ggf. andere Wetterstationen anpassen. Aber nach dem Studium der technischen Daten kam doch etwas Enttäuschung auf: Einerseits war der Preis ganz schön hoch und andererseits fehlten den typischen Wetterstationen wesentliche Eigenschaften, die insbesondere für die Hausautomation wichtig sind.

Das geht schon beim Regenmesser los: Verwendet wird meist ein sog. Regenmengenmesser mit einem Trichter und einer Messwippe. Beim Durchlaufen von Wasser gibt diese Einrichtung Impulse ab, die dann ausgewertet werden. Bei Beginn eines Regenschauers kann das aber u.U. einige Minuten dauern, bis die Wippe schaltet. In dieser Zeit ist die Markise schon nass, bevor sie automatisch eingefahren werden kann. Auch ein zu lange geöffnetes Dachfenster kann zu unangenehmen Wasserschäden führen. Fazit: Für die Hausautomation braucht man einen sehr schnell reagierenden Regenmelder („one drop only“), der zur Zeit nur mit besonderen zusätzlichen externen Modulen (>>50€) darstellbar ist.

Gleiches „Elend“ bei der Erkennung, ob Sonne scheint oder nicht. Die meist verwendeten Helligkeitssensoren haben eine viel zu geringe Dynamik, um störsicher sowohl im dunklen Winter als auch im hellen Sommer eindeutig den Sonnenschein zu erkennen. Ein sog. Sonnensensor ist hier viel besser geeignet. Ich habe ihn schon seit Jahren mit großem Erfolg in Betrieb und möchte ihn nicht mehr missen. Deshalb gehört ein Sonnensensor unbedingt in eine Wetterstation für die Hausautomation integriert.

Und natürlich ist es für die Hausautomation wichtig, nicht nur zu wissen, ob die Sonne scheint oder nicht, sondern wo genau die Sonne am Himmel steht. Nur so kann man dann erkennen, ob beispielsweise Fenster besonnt sind, die dann ggf. automatisch abgeschattet werden können. Deshalb ist eine Berechnung der Sonnenposition unverzichtbar.

Wetterstationen, die nicht für die Homematic konzipiert sind, können prinzipiell natürlich auch verwendet werden, aber man hat das Problem, die Daten in die Homematic zu bekommen. Zudem sind üblicherweise kein schneller Regenmelder und auch kein Sonnensensor enthalten. Und für mich besonders störend ist die meistens verwendete  Batterie-Stromversorgung. Das ist schon deshalb negativ, weil man üblicherweise eine leistungshungrige Beheizung für den Regenmelder braucht.  All diese Argumente führten mich schließlich zum Selbstbau meiner eigenen Wetterstation WEATHERMAN.

2  Das kann der WEATHERMAN

Der WEATHERMAN ist die Fortsetzung einer Reihe von Sensor- und Aktor-Modulen ( die WIFFIs), die hauptsächlich zur  Erweiterung  und  Ergänzung der Hausautomation mit der Homematic konzipiert sind. Diese Module sind allesamt Funkmodule , die das in nahezu jedem Haushalt vorhandene gesicherte WLAN-Funknetz verwenden, um mit der Homematic-CCU zu kommunizieren.

Der WEATHERMAN hat eine Vielzahl von Sensoren, mit denen folgende Wettersignale messbar sind:

  • Windgeschwindigkeit mittel in m/s
  • Windgeschwindigkeit spitze in m/s
  • Windstärke in Bft
  • Windrichtung als Text und in Grad
  • Aussentemperatur in °C
  • Aussentemperatur gefühlt in °C
  • Taupunkt-Temperatur in °C
  • rel. Luftfeuchte in %
  • abs. Luftfeuchte in g/m3
  • Luftdruckmessung bez. auf N.N. in mb
  • Luftdruck-Trend zur Erkennung von Wetteränderungen 
  • Regenmelder  (one drop only!) mit einstellberer Empfindlichkeit
  • Regenmengenmesser  mit mm/h und mm/24h
  • Sonnensensor mit einstellbarer Schaltschwelle
  • Helligkeitssensor mit sehr weitem Dynamikbereich
  • Berechnung Sonnenstand Azimut
  • Berechnung Sonnenstand Elevation

Die Datenübertragung erfolgt mit dem hauseigenen WLAN. Die Datenübertragung zur Homematic arbeitet völlig automatisch im Hintergrund, indem die Daten auf entsprechende CCU-Systemvariable abgebildet werden. Für die Verwendung in Verbindung mit ioBbroker oder anderen Hausautomationssystemen kann der WEATHERMAN anstatt zur CCU auch JSON Daten an die entsprechende programmierbare Serveradresse versenden. Und natürlich kann man die Wetterstation auch ganz ohne Hausautomation verwenden: dafür hat der WEATHERMAN sogar seine eigene Webseite, womit die Wetterdaten im Heimnetz mit jedem üblichen Browser einfach dargestellt werden können. So  hat man die aktuellen Wetterdaten jederzeit auch auf dem Tablet oder Smartphone im Blick..

Das Erscheinungsbild könnte man zwar mit einer App graphisch aufpeppen, aber der Aufwand war mir einfach zu groß. Schließlich steht die Funktionalität an erster Stelle und die ist mit der aktuellen Webseite voll erfüllt. Aber vielleich findet sich in der Community ein „App-Experte“, der aus der eine alternative Darstellungsmöglichkeit für Smartphone oder Tablet schafft.

3  Nachbau leicht gemacht

Der erste Prototyp meiner Wetterstation war mechanisch und elektronisch komplett im Eigenbau hergestellt. Als Windmesser kam ein kardanisch aufgehängtes Pendel mit einer Kugel als Windfänger zur anwendung. Aus dem Ausschlag des Pendels konnte man Windstärke und Windrichtung gut berechnen. Allerdings war die Konfiguration einfach zu groß und erheblich zu kompliziert für den Nachbau von mechanisch weniger versierten Homematikern. Deshalb wurde diese Lösung nicht weiter verfolgt.

Eine sehr gute Lösung bot sich mit der preiswerten Verfügbarkeit eines Windmessers an, der als Ersatzteil für eine käufliche Wetterstation hier angeboten wird. Dieses Teil W132 hat einen relativ robusten Windmesser mit einer Windfahne für die Windrichtung. Ebenfalls eingebaut ist ein Temperatur- und Feuchtigkeitssensor mit einer eigenen Elektronik, welche  die Daten normalerweise mittels 433Mhz-Sender an die hier nicht verwendete Basisstation sendet. Im folgenden Bild ist das Modul rechts direkt am Mast befestigt.


Insgesamt besteht der WEATHERMAN aus den im Bild gezeigten Modulen, wobei der Regenmengenmesser und das W132 Ersatzteil fertig gekauft werden. Der WEATHERMAN-Controller kann als Bausatz in meinem Webshop gekauft werden. Die sog. Wetterkappe für den optionalen BME280-Sensor ist im 3D-Druck hergestellt und kann im Webshop bezogen werden. Wer einen 3D-Drucker hat, der kann sich mit diesem stl-File das Teil auch selbst ausdrucken.

In der ausführlichen 25-seitigen Bauanleitung wird genau beschrieben, wie die Wetterstation zusammen gebaut wird. Zum Überblick hier nur die wesentlichen Schritte:

Das W132-Modul wird mit einem Kabel modifiziert, so daß die Daten vom WEATHERMAN-Controller verarbeitet werden können. Normalerweise werden die W132-Messdaten intern an den 433Mhz-Sender geschickt und dort ausgesendet. Der WEATHERMAN hört diese Daten einfach ab und dekodiert diese. Die übliche Versorgung des W132 mittels Batterien entfällt, da  das Teil vom WEATHERMAN mit 3,3V versorgt wird. Die dafür notwendige Modifikation des W132 ist relativ einfach: nur drei(!) Leitungen sind für den Anschluss des W132 notwendig. In der Bauanleitung ist detailliert beschrieben, wie die Modifikation des W132 erfolgt. Das folgende Bild zeigt die geöffnete Box des W132 mit den drei verzinnten Leitungen, über die das Modul von aussen mit 3V-Spannung versorgt und das Datentelegramm „angezapft“ wird.

Der WEATHERMAN-Controller ist in einem robusten wassergeschützten Standard-ABS-Gehäuse untergebracht. Dieses Gehäuse nimmt auch den Regensensor, Sonnensensor, Helligkeitssensor und Barometersensor auf.  Hier ein Eindruck vom Innenleben des Hauptgehäuses mit der Ober- und Unterschale:


Den WEATHERMAN-Controller gibt´s nur als Bausatz. Der Nachbau ist auch für den weniger versierten Elektroniker möglich, denn mit dem angebotenen  Bausatz muß man eigentlich nur die mitgelieferte Platine bestücken und sauber verlöten. Der Mikrocontroller WeMos mini wird  bereits komplett programmiert geliefert, so daß man sich nicht mit der Arduino-Entwicklungsumgebung „auseinander setzen“ muß.  Aber man sollte schon etwas Erfahrung mit dem Zusammenbau und Inbetriebnahme von elektronischen Modulen haben! Mit der detaillierten  kann eigentlich  wenig „schief “ gehen, wenn man sorgfältig alle Schritte ausführt, über etwas Löterfahrung und ein Multimeter verfügt.


Der neu entwickelte Regensor ist ein besonderes „Schmankerl“! Dafür wurde eine von unten beheizte Platine mit vergoldeten (Korrosionsschutz!)  Leiterbahnen konzipiert. Ausgewertet wird sowohl die Widerstands- als auch Kapazitätsänderung, wenn ein Regentropfen auf das Messgitter tropft. Damit ist in gewissen Grenzen nicht nur  eine analoge Intensitätsmessung möglich sondern mit einer individuellen Schwellenvorgabe  auch die Schaltempfindlichkeit des Regenmelders einstellbar. Insgesamt ist die Reaktion des Regenmelders inkl. Übertragung zur CCU im Bereich von 1 bis 5sec !!. Mittig im Regensensor ist eine LED integriert, die das Einschalten des Regenmelders signalisiert. Das folgende Bild zeigt links die Sensorfläche und rechts die Unterseite mit den Kontaktstellen für die Heizwiderstände und die mittige  LED.

Zusätzlich ist noch ein typischer konventioneller Regenmengenmesser angebaut, dessen Zählimpulse vom WEATHERMAN ausgewertet werden. Dieses Gerät ist ein im Internet relativ preiswert verfügbares Modul. Kann man beispielsweise bei Aliexpress mit dem Suchwort „rain gauge“ finden.

Für den Nachbau habe ich hier die Einkaufsliste mit Bezugsquellen zusammengestellt. Die zugehörigen aktuellen Preise zeigen, daß der Selbstbau des WEATHERMAN sehr preiswert ist. Mal abgesehen davon, daß die Funktionalität insbesondere im Hinblick auf die Nutzung mit der Hausautomation überragend ist.

4 Programmierung und Einstellung

Der WEATHERMAN verwendet als Mikrocontroller mit WLAN den WeMos mini mit integrierter USB-Schnittstelle. Der WeMos ist vorprogrammiert, lediglich die für das WLAN notwendigen Zugangsdaten für den heimischen Router müssen eingegeben werden. Dies kann sehr komfortabel erfolgen, indem man den WEATHERMAN zur Einstellung als Hotspot arbeiten läßt.  Auf der eigenen Webseite des WEATHERMAN (IP: 192.168.4.1) kann man dann die notwendigen Daten und Einstellungen mit einem normalen Browser durchführen. Dafür sind keinerlei Programmierkenntnisse notwendig, also alles sehr einfach. Die folgenden Schritte zeigen kochrezeptartig das Vorgehen bei geöffnetem WEATHERMAN-Controller Gehäuse:

1.RESET-Taster seitlich am WeMos mini drücken. Einige Sekunden  warten bis die rote LED auf der Platine alle 1sec blinkt (dabei versucht der WEATHERMAN sich ins WLAN einzuloggen, was natürlich wegen des Fehlens der Zugangsdaten noch nicht geht!).

2. Dann den PROG-Taster (der Taster neben dem WeMos) etwa 2sec drücken bis die rote LED im 0,5sec-Takt blinkt. Jetzt ist der WEATHERMAN im Hotspot-Modus.

3. Mit dem Smartphone oder besser Laptop  nach einem Hotspot mit dem Namen „wiffi“ suchen und die Verbindung herstellen. Da es eine gesicherte Verbindung ist, muß beim ersten Zugang das Kennwort „wiffi1234“ eingegeben werden. Danach müßte, wenn alles richtig funktioniert, eine gesicherte Verbindung zum „wiffi“ vorhanden sein.

4. Auf dem so im WLAN eingeloggten Smartphone oder Tablet mit der Adresszeile des Browsers die Hotspot-Webseite des WEATHERMAN  aufrufen mit: 192.168.4.1/?
Die Antwort müßte so aussehen:

:

5. Jetzt die notwendigen Eingaben in der Adresszeile des Browsers machen. Das macht man mit folgenden Befehlen, die immer mit einem Doppelpunkt abgeschlossen werden:
192.168.4.1/?ssid:my_ssid:  dabei ist „my_ssid“ die SSID des eigenen Routers  (Achtung, die SSID darf keinen Doppelpunkt enthalten!)
192.168.4.1/?pwd:my_pwd:  dabei ist „my_pwd“ das Router-Passwort des eigenen Routers (Achtung, das PWD darf keinen Doppelpunkt enthalten!)
192.168.4.1/?ccu:my_ccu:  und „my_ccu“ ist die feste (!) IP der eigenen CCU1 oder CCU2 Wenn alle drei Daten richtig eingegeben sind und auf der Webseite auch richtig angezeigt werden , dann ist der WEATHERMAN startbereit und kann mit dem Befehl:
192.168.4.1/?reset: oder dem Druck auf den RESET-Taster (am WeMos)  neu gestartet werden. Nach einigen Sekunden blinkt die LED  solange im 2sec Takt bis der WEATHERMAN sich im heimischen WLAN eingeloggt hat. Danach sind nur sehr kurze LED-Lichtblitze vorhanden. Diese signalisieren eine erfolgreiche WLAN-Verbindung.

Jetzt kann die Webseite des WEATHERMAN im Heimnetz aufgerufen werden. Dazu schaut man im Router nach, welche IP der WEATHERMAN bekommen hat und ruft dann einfach diese IP auf, indem man diese IP in die Adresszeile des Browsers eingibt. Oder man schreibt einfach in die Adresszeile: weatherman.local.  Allerdings kann diese letzte Methode u.U. in einigen Heimnetzen nicht erfolgreich sein. Ich persönlich verwende immer die IP, dann hat man eine eindeutige Zuordnung. Deshalb stellt man dann auch sinnvollerweise den Router so ein, daß er dem WEATHERMAN immer diese gleiche IP zuteilt. Die Antwort auf den Browseraufruf ist im folgenden Bild dargestellt.


Das ist eigentlich schon alles. Für besondere individuelle Anforderungen gibt es noch mehr Befehle, die oben im Bild aufgelistet sind. Diese Befehle sind aber nur für besondere Anwendungen und werden weiter unten erklärt.

5 Anlernen an die CCU

Die automatische Verbindung zur CCU wird über Systemvariablen hergestellt, deren Namen von mir vorgegeben sind (in rot). Allerdings lassen sich mit dem name-Befehl beliebige andere Namen für die Systemvariablen  definieren. Im ersten Schritt sollte man diese Vorgabe erst mal behalten! Darunter werden auf der WEATHERMAN-Webseite die Sensorsignale der Wetterstation dargestellt.  Diese Werte werden alle 60sec in einem festen Zeitraster aktualisiert, um das Datenaufkommen für die Signalübertragung zu begrenzen. Erst durch Aktualisierung der Webseite oder Klick auf den Link Aktualisierung der Messwerte kann auch außerhalb des Zeitrasters die Anzeige jederzeit aktualisiert werden.

Das Anlernen des WEATHERMAN an die CCU ist sehr einfach, weil für jedes Sensorsignal nur eine korrespondierende Systemvariable angelegt wird. Entsprechend der Vorgabe (rote Namen) sind folgende Systemvariablen in der CCU anzulegen:

w_ip vom Typ „Zeichenkette“
w_temperature vom Typ „Zahl“ mit Maßeinheit „°C“
w_windchill vom Typ „Zahl“ mit Maßeinheit „°C“
w_taupunkt  vom Typ „Zahl“ mit Maßeinheit „°C“
w_humidity vom Typ „Zahl“ mit Maßeinheit „%“
w_hum_abs vom Typ „Zahl“ mit Maßeinheit „g/m3″
w_wind_avg vom Typ  Zahl mit Maßeinheit m/s
w_wind_peak vom Typ  Zahl mit Maßeinheit m/s
w_windstaerke vom Typ  Zahl mit Maßeinheit bft
w_wind_direction vom Typ „Zeichenkette“
w_wind_dir vom Typ  Zahl mit Maßeinheit °
w_rain_activity vom Typ „Zahl“
w_rain_status vom Typ „Logikwert“
w_rain_intensity vom Typ „Zahl“ mit Maßeinheit mm/h
w_rain_volume_1 vom Typ „Zahl“ mit Maßeinheit mm/1h
w_rain_volume_24 vom Typ „Zahl“ mit Maßeinheit mm/24h
w_barometer vom Typ „Zahl“ mit Maßeinheit mb
w_barotrend vom Typ „Zeichenkette“
w_sun_temp vom Typ „Zahl“ mit Maßeinheit „°C“
w_diff_temp vom Typ „Zahl“ mit Maßeinheit „°C“
w_sonne_scheint vom Typ „Logikwert“
w_lux vom Typ „Zahl“ mit Maßeinheit „lux“
w_elevation vom Typ  Zahl mit Maßeinheit °
w_azimut vom Typ  Zahl mit Maßeinheit °

Es müssen nur diejenigen Systemvariablen definiert werden, die man auch benutzen möchte!

Die Aktualisierung aller genannten  Systemvariablen erfolgt automatisch, aber nur wenn sich die Messwerte ändern. Dadurch wird vorteilhafterweise der Datenfluss stark reduziert.

Anmerkung:
Die oben genannten Systemvariablen sind „normale“ CCU-Systemvariablen, deren Zahl nicht wie bei den HM-Skriptvariablen auf  200 begrenzt ist !

6 Befehlsliste des WEATHERMAN

Auf der Help1-Seite sind Befehle dargestellt, mit denen bestimmte Eigenschaften des WEATHERMAN bei Bedarf geändert werden können. Normalerweise ist dies aber nicht notwendig. Nur bei speziellen Bedürfnissen wie Änderung der Namen für die CCU-Systemvariablen oder Löschung der Router Zugangsdaten etc. sollte man diese Befehle anwenden.

7 Einstellungen im Expertenmodus

Das Gleiche gilt für den sog. Expertenmodus. Normalerweise ist  keine Einstellung notwendig!!!!! Einstellungen sollten auch nur dann vorgenommen werden, wenn man wirklich weiß, was man verändert. Im ungünstigen Fall kann der WEATHERMAN irreparabel beschädigt werden. Hier ist diese Einstellungsseite:

8 Optionale Überwachung der WLAN-Verbindung

Wenn man mit den Messwerten des WEATHERMAN in der CCU wichtige Aktoren schalten möchte (Fenster, Markisen etc.) , dann kann es hilfreich sein, eine regelmässige Überwachung der Datenverbindung zwischen WEATHERMAN und CCU zu haben. Mit der ab Update weatherman_30  eingeführten regelmässigen (alle 5min) Übertragung der WEATHERMAN-IP zur CCU lässt sich mit den folgenden zwei einfachen WebUI-Programmen nun erkennen, ob regelmässig Messdaten vom WEATHERMAN in der CCU ankommen. Damit ist auf der CCU-Seite eine grundsätzliche „alive“-Erkennung des WEATHERMAN selbst als auch der WLAN-Strecke zum Router möglich. Für diese beiden WebUI-Programme ist lediglich eine neue Systemvariable w_connect als Logikwert mit den Zuständen Ja/Nein zu definieren:

Die Zeitsteuerung beim zweiten Programm ist auf zyklische Auslösung alle 5min eingestellt. und bei beiden  Programmen das Retrigger-Häkchen beachten!

Und wer wie ich dauernd Probleme mit der CCU-Zeitsteuerung hat, der sollte den Timer von CuxD verwenden, so wie im folgenden Bild:


9 Rückstellen in Werkszustand

Manchmal kann es notwendig sein, die im EEPROM abgelegten Daten zu löschen und den WEATHERMAN in den Auslieferungszustand zu versetzen. Hierfür wird durch 1sec-Drücken des PROG-Tasters zuerst der Hotspot-Modus eingestellt, was durch 1sec- Blinken der roten LED angezeigt wird. Danach hält man den PROG-Taster  solange gedrückt, bis die rote LED dauerhaft leuchtet. Jetzt werden die EEPROM-Daten gelöscht. Läßt man die PROG-Taste wieder los, dann startet WIFFI neu und geht automatisch in den Hotspot-Modus, um so wieder neu an den Router angelernt zu werden. Achtung: nie den PROG- und RESET-Taster gleichzeitig drücken, da das Modul dann in den Programmiermodus geht und u.U. die Firmware beschädigt wird.

10 Update des WEATHERMAN

Ein Update des WEATHERMAN kann ohne Demontage bzw. Geräteöffnung komplett über das WLAN erfolgen. Dabei ist der WEATHERMAN vorher im Heimnetz über WLAN eingeloggt und seine Webseite ist mit der vom Router vergebenen IP-Adresse aufrufbar.

Aktuelles Update Zip-Archiv von der Webseite stall.biz runterladen und den *.bin File entpacken und auf dem PC speichern. Achtung nicht das Zip-Archiv zum Update verwenden, das beschädigt u.U. den WEATHERMAN.

Die Update-Seite des WEATHERMAN aufrufen (siehe nächstes Bild). Dort werden zwei Alternativen eines Updates angeboten: das Komplett-Update nur wenn das bei den Informationen zum Update-File ausdrücklich angemerkt ist und das normalerweise verwendete Teil-Update.

Das Teil-Update mit Klick auf den Link Teil-Update auslösen und mindestens 15sec warten und erst dann den Link Update-Explorer auslösen.

Nach kurzer Zeit öffnet sich der Browser mit der Möglichkeit per „Durchsuchen“ den neuen update *.bin File einzugeben und dann mit dem Update-Button den Vorgang zu starten:


Nach einigen Sekunden wird ein erfolgreiches Update bestätigt und der WEATHERMAN neu mit der upgedateten Firmware gestartet:

.

11 Update der Firmware über USB

Ein Update über USB ist etwas komplizierter als über WLAN. Aber wenn beispielsweise ein neues Ersatz-WeMos-Modul verwendet werden soll, dann ist  ein Update über USB die einzige Lösung.
Hier die Anleitung dafür:

  1. Aktuelle Firmware runterladen, entpacken und bin-File wegspeichern
  2. Zuerst für den WeMos den notwendigen USB-Treiber installieren: windows 32&64bit
  3. USB-Kabelverbindung PC <>  WIFFI herstellen und im Gerätemanager unter Anschlüsse (COM & LPT) nachschauen, welcher COM-Port aktiv ist
  4. Xtcom Util runterladen, entpacken und starten
  5. Fenster Tools(T) / Config Device öffnen, die aktive COM-Nummer und die Baudrate 115200 eingeben und dann Open.
  6. Danach Connect  und dann am WIFFI den Prog-Taster gedrückt halten und währenddessen am WeMos kurz den Reset-Taster drücken. Wenn erfolgreich, dann kommt Meldung Connect with target OK
  7. Fenster API Test(A) /Flash Image Download öffnen und beim Image Path den Pfad des abgespeicherten bin-Files eingeben.
  8. Dann mit dem  Download Button den Download starten. Erfolgreicher Abschluss mit Operation Succeeded!
  9. Danach startet der WEATHERMAN. Wenn LED  im sec-Takt blinkt, dann Prog-Taster solange drücken bis Dauerleuchten.
  10. Danach startet der WEATHERMAN neu , warten bis die LED im 0,5sec-Takt blinkt, was den Hotspot-Modus signalisisiert
  11. Im Hotspot-Modus können jetzt auf IP 192.168.4.1 wie oben beschrieben die eigenen Zugangsdaten eingegeben werden.

12 Hier die neuesten Updates zum runterladen:

Zum Update das ZIP-Archiv runterladen und entpacken. Zum Update nur die *.bin-Datei aus dem zip-Archiv verwenden.

Update 28.08.2017: weatherman_8   Kleine Fehler behoben, alternativ Wetterstation Froggit  WH5300 verwendbar, Betauungsschutz-Heizung  für den Regenmelder implementiert.

Update 27.09.2017: weatherman_19  Tauvermeidung auf dem Regensensor durch verbesserte Heizstrategie, PWD- und SSID-Eingabe  ohne Abschluss-Doppelpunkt, zusätzliche I2C-Anschlussmöglichkeit für IR-Temperatursensor MLX90614

Update 24.10.2017: weatherman_28  schnellere Browserreaktion, schnelle zyklische JSON-Komplett-Datenabfrage (>8sec) möglich (wichtig für IObroker, MQTT, etc),

Update 29.10.2017: weatherman_29  Sommer/Winterzeitumschaltung  und Regenmengenberechnung korrigiert.

Update 30.10.2017: weatherman_31  Übertragung der IP alle 5min für Überwachung der WLAN-Strecke in der CCU

Update 01.11.2017: weatherman_33  Sonnenstandsberechnung korrigiert

… und wo kann man den Bausatz bekommen?

Für den Nachbauer  habe ich Bausätze zusammengestellt. Diese  können bei mir bezogen werden:  WEATHERMAN-Controller Bausatz Wer vorher einen Blick in die Bauanleitung werfen möchte, bitteschön: Bauanleitung

Haftungs- und Sicherheitshinweise

Beim Nachbau müssen natürlich alle wichtigen einschlägigen Sicherheitsvorschriften für den Umgang mit gefährlichen Spannungen  eingehalten werden. Fundierte theoretische und praktische Fachkenntnisse der Elektrotechnik und für den Umgang mit gefährlichen Spannungen sind unverzichtbar!! Durch eine unsachgemäße Installation gefährden Sie ihr Leben und das Leben ihrer Mitmenschen! Darüberhinaus riskieren Sie erhebliche Sachschäden , welche durch Brand etc. hervorgerufen werden können ! Für alle Personen- und Sachschäden durch falsche Installation etc. ist nicht der Hersteller sondern nur der Betreiber verantwortlich. Ich verweise hier unbedingt auf  die  „Sicherheitshinweise und Haftungsausschluss„-Seite dieses Blogs.

Impulsgeber mit S0-Schnittstelle für konventionelle Stromzähler

Impulsgeber mit S0-Schnittstelle für konventionelle Stromzähler

Vorwort

Die Messung des Energieverbrauches(kWh)  und insbesondere der aktuellen Anschlussleistung(kW) ist für die Hausautomation von großem Vorteil, weil man damit insbesondere aus der Ferne einfach feststellen kann, ob auch alle Verbraucher abgeschaltet sind oder ob ein eingeschaltetes Gerät auch normal funktioniert und die erwartete Leistung verbraucht. Dazu kommt, daß man beispielsweise mit der Homematic in Verbindung mit einem Datenaufzeichnungsprogramm wie dem Historian auch Langzeitaufzeichnungen des Energieverbrauches machen kann, die für eine Optimierung des häuslichen Energieverbrauches sehr hilfreich sind.

Messprinzip

Auch für die Homematic gibt es bereits Impulsgeber, die aber nur in Verbindung mit einem speziellen Auswertegerät funktionieren. Hier wurde ein neuer Impulsgeber entwickelt, der eigenständig die rote Markierung auf der sog- Ferraris-Scheibe im Stromzähler erkennt und entsprechende Impulse über eine galvanisch getrennte S0-Schnittstelle ausgibt. Das hat den Vorteil, daß man universell für viele marktgängige Impuls-Auswertegeräte ein standardisiertes Impulssignal hat. So kann man aus dem eigenen konventionellen „alten“ Stromzähler mit Ferraris-Scheibe einen modernen Stromzähler mit S0-Impulsausgang machen. Das Messprinzip ist einfach: Die rote Markierung auf der Ferraris-Scheibe wird mittels optischem Reflexgeber erkannt und entsprechend ein Impulsausgang ein bzw. ausgeschaltet. Die Weiterverarbeitung und Zählung der Impulse erfolgt mit dem Impulszähler der eigenen Wahl. Ich verwende hiefür denin nächster Zeit verfügbaren WIFFI-logger, der insgesamt 3 Impulszählereingänge hat und so nicht nur den Hausstrom  sondern auch Solarstrom  und Gasenergie erfassen kann. Darüberhinaus wird aus dem Zeitabstand der Impulse die aktuelle Leistung in Watt errechnet und angezeigt.

Der Impulsgeber

Die Schaltung des Impulsgebers ist auf einer kleinen Platine realisiert, die mit einem hierfür speziell konstruierten Kunststoffgehäuse im 3D-Druck sehr einfach auf der Glasscheibe des Stromzählers positioniert und dort eingestellt werden kann. Mit einem Trimmpoti wird die Helligkeit der verwendeten IR-LED so justiert,  daß die Reflexlichtschranke unabhängig vom verwendeten Stromzähler immer im gleichen Helligkeits-Arbeitspunkt arbeitet. Das führt zu guter elektrischer Reproduzierbarkeit. Die Auswertung der Impulse erfolgt mit einem Schmitt-Trigger, so daß die Anfälligkeit für Störimpulse  gering ist. Den Schaltplan mit Stückliste zeigt das folgende Bild. Mit dem linken Operationsverstärker wird der Strom durch die IR-LED (Anschluss A und K)  im Reflexsensor mit dem Trimmpoti einstellbar geregelt. So wird die Beleuchtungsstärke an der Ferraris-Scheibe immer auf die gleiche IR-Helligkeit geregelt. Der Phototransistor (Anschluss C und E) misst das reflektierte Licht und mit dem nachfolgendem Operationsverstärker (Schmitt-Trigger) die LED geschaltet. Gleichzeitig schaltet der Optokoppler galvanisch getrennt das S0-Interface. Realisiert wurde die Schaltung auf einer kleinen Platine, bei der der Reflexgeber auf der Platinenunterseite eingelötet ist: Damit das Ganze auch an dem Stromzähler richtig und besonders einfach fixiert werden kann, wurde ein kleines Gehäuse für den 3D-Druck konstruiert: Damit wird die Platine gehalten und mit den dreieckigen Peilmarken kann sehr einfach der Refleximpulsgeber auf die Ferraris-Scheibe ausgerichtet werden. Mit den seitlichen Laschen  kann man den Geber mittels Tesaband auf dem Stromzählerglas zugfest fixieren. Der doppelte Haltewinkel oben im Bild ist für die Durchführung und Zugentlastung der Kabel.  Diese Zugentlastung ist besonders wichtig, weil relativ zur Gehäusegröße die Anschlusskabel doch recht stark sind und ggf. das Gehäuse dejustieren könnten. Das folgende Bild zeigt die aktuelle Konfiguration mit dem S-Schlag der Kabel für die Zugentlastung: Je nach Stromzählertyp kann man den Impulsgeber senkrecht oder horizontal auf dem Glas des Stromzählers mit Tesaband aufkleben. Mit Verwendung der Peilnasen reicht normalerweise die Genauigkeit der Justage völlig aus. Der galvanisch getrennte S0-Ausgang kann direkt an vorhandene S0-Zähler angeschaltet werden. Falls die Auswertung mit einem normalen digitalen Input eines WIFFI-logger, Homeduino,  Arduino, WeMos oder einem Rapberry erfolgen soll, ist die Beschaltung entsprechend dem folgenden Schaltschema vorzusehen:

Nachbau

Für den Nachbauer ist ein Komplett-Bausatz inkl. dem 3D-Ausdruck des Gehäuses in meinem Webshop verfügbar. Da nur relativ große Standard-Bauelemente verwendet werden, ist der Nachbau auch vom weniger versierten Elektroniker möglich. Die Bauanleitung gibt hierzu mehr Informationen.

Inbetriebnahme

Für die Inbetriebnahme ist der Impulsgeber auf die  Glasscheibe des Stromzählers so anzubringen, daß die Reflexlichtschranke auf der Platinenunterseite die Ferraris-Scheibe genau „sieht“. Dazu sind Peilmarken am Gehäuse angebracht, mit denen eine Justage einfach möglich ist. Wenn die richtige Postion erreicht ist,  dann klebt man einfach mit Tesa-Band an den seitlichen Laschen den Impulsgeber auf die Scheibe. Dieses Verfahren ist besser als eine Befestigung mit Klebepads, weil man erst in aller Ruhe justieren, den Sensor in der optimalen Postion halten kann und mit der anderen Hand das Klebeband befestigen kann. Zusätzlich kann man mit den Peilmarken am Gehäuse jederzeit überprüfen , ob die Justage noch in Ordnung ist. Die Empfindlichkeit der Anzeige stellt man mit dem Trimmpoti so ein, daß beim Durchgang der roten Markierung geschaltet wird. Achtung! Manchmal sind die Ferraris-Scheiben „vermackt“, so daß  durch optische Reflexionen an diesen „Macken“ noch zusätzlich ungewollt geschaltet wird. In diesem Fall die Empfindlichkeit runterdrehen und ggf. noch eine Feinjustage vornehmen. Die Anschlussleitungen des Impulsgeber sollten möglichst weiche Stromlitzen sein, damit die Kräfte von den Kabeln auf den Impulsgeber möglichst gering sind und keine Dejustierung erfolgt. Zur Zugentlastung sind die Drähte wie im Bild durch die offenen Löcher zu führen.

… wo gibt´s den Bausatz ?

Einen kompletten Bausatz des Impulsgebers  kann man in meinem Webshop erwerben:  Bausatz Impulsgeber mit S0-Schnittstelle

Haftungs- und Sicherheitshinweise

Beim Nachbau müssen natürlich alle wichtigen einschlägigen Sicherheitsvorschriften für den Umgang mit gefährlichen Spannungen  eingehalten werden. Fundierte theoretische und praktische Fachkenntnisse der Elektrotechnik und für den Umgang mit gefährlichen Spannungen sind unverzichtbar!! Durch eine unsachgemäße Installation gefährden Sie ihr Leben und das Leben ihrer Mitmenschen! Darüberhinaus riskieren Sie erhebliche Sachschäden , welche durch Brand etc. hervorgerufen werden können ! Für alle Personen- und Sachschäden durch falsche Installation etc. ist nicht der Hersteller sondern nur der Betreiber verantwortlich. Ich verweise hier unbedingt auf  die  „Sicherheitshinweise und Haftungsausschluss„-Seite dieses Blogs.

IO-Shield-Plus (neue Version)  … mehr Inputs und integriertes WLAN

IO-Shield-Plus (neue Version) … mehr Inputs und integriertes WLAN

Vorgeschichte:

Auf dieser Webseite sind verschiedene Bauanleitungen mit Verwendung der äußerst vielseitigen und preiswerten Arduino-Module im Zusammenspiel mit der  Homematic vorgestellt. Zur einfachen Anwendung auch für den weniger versierten Elektroniker ist ein sehr praktisches Anschlußboard IO-Shield20  entstanden.  In Verbindung mit der kostenlosen Homeduino Software  lassen sich damit eine Vielzahl von Sensoren über einfache Schraubklemmen anschließen und die Sensorsignale über LAN oder WLAN an die Homematic übertragen. . Mehr dazu hier:

https://www.stall.biz/?project=der-homeduino-2-0-als-vielseitiges-lanwlan-sensormodul-fur-die-homematic

https://www.stall.biz/?project=vielseitiges-io-shield-board-2-0-fur-fast-alle-arduinos

https://www.stall.biz/project/homeduino-3-0-das-ultimative-io-modul-fuer-die-hausautomation

Der Vorteil bei Verwendung des IO-Shield-Plus als Homeduino-Sensormodul ist, daß auf der Homematic keinerlei komplizierte Skripte o.ä. installiert werden müssen. Lediglich ist für jede Meßgröße eine entsprechende Systemvariable in der CCU festzulegen. Die Aktualisierung mit den Meßwerten aus dem Homeduino erfolgt automatisch, aber nur wenn  sich der Meßwert ändert. Damit entsteht ein sehr geringer Traffic im Netz, was insbesondere bei vielen Homeduinos von Vorteil ist.

Warum ein weiteres IO-Shield ?

Das hier vorgestellte  IO-Shield-Plus ist nicht ein Ersatz für das bisherige IO-Shield20, sondern eine wichtige Ergänzung. Dabei spielt eine wesentliche Rolle, daß für die Verwendung von weiteren Shields beispielsweise zur  LCD-Anzeige und zur Bereitstellung des WLAN oft recht viele Pins des Standard-Arduino-Pinouts für den Betrieb des Shields belegt werden. Für die eigentliche Automatisierungsaufgabe bleiben dann oft nur wenige Funktionspins übrig. Aber gerade beim MEGA2560 sind ja noch viele IO´s auf dem hinteren Teil der Platine verfügbar, die mit diesem Erweiterungsshield an Schraubklemmen verfügbar gemacht werden können. Vorne lassen sich  dann Shields beispielsweise für ein alphanumerisches Display oder ein Touch-Display aufstecken. Weiter unten sind Beispiele für typische Konfigurationen.

Eigenschaften des IO-Shield-Plus

Das IO-Shield-Plus wird mit Stiftleisen auf die hinteren Pins des MEGA2560 aufgesteckt. Mittels Schraubklemmen lassen sich verschiedene Sensoren anschließen. Für die  WLAN-Module sind Steckplätze vorhanden. Man kann dort das sehr leistungsfähige Wifi-Modul CC3000 von Texas Instruments und das besonders preisgünstige Modul ESP8266-01 einstecken. Das folgende Bild  zeigt das IO-Shield-Plus von der Bestückungsseite:

platine_1

Alle Inputs sind mit 470Ohm-Widerständen gegen Kurzschluß geschützt.  Ein 3,3V-Spannungsregler versorgt aktuell das Wifi-Modul, kann aber auch zur Versorgung von anderen 3.3V-Verbrauchern verwendet werden. Für den Anschluß der potentialfreien S0-Schnittstellen sind 4 Optokoppler ebenfalls auf der Platine. Mit Jumpern kann für jeden Port ein 10kOhm-Pullup-Widerstand zugeschaltet werden (im Schemabild unten als schwarzer Juzmper gekennzeichnet). Ein 470Ohm Reihen-Widerstand ist als Schutzwiderstand in jeder Portzuleitung vorhanden, der aber per Jumper überbrückt werdeb kann (im Schemabild unten als grüner Juzmper gekennzeichnet). Bei Verwendung des Ports als Ausgang kann dieser Widerstand auch  als Vorwiderstand für eine LED o.ä.verwendet werden.

Hier die Eigenschaften des IO-Shield-Plus im Detail:

  •   insgesamt 24  digital und analog nutzbare Funktionsports  werden insgesamt nach außen auf Schraubklemmen geführt  . Diese Inputs sind individuell aufgeteilt nutzbar als…
  •  24   digitale Inputs
  •     4   Impulseingänge direkt oder über Optokoppler (S0-Schnittstellen) ,
    (in Verbindung mit dem CC3000 sind nur 3 Impulseingänge verfügbar)
  •    8   analoge Inputs  mit Eingangsspannung alle von 0 bis 5V oder 0 bis 1V (wenn Uref umgeschaltet wird )
  •    8   NTC-Temperatursensoren 10kOhm  mit über Jumper zuschaltbarem 10kOhm-Widerstand
  •  24   1Wire-Temperatursensoren  DS18B20
  •  24   DHT-22 digitale Temperatursensoren
  •  24   Ultraschallsensoren

Da IO-Shield-Plus hat eine Größe von 100mm x 65mm und kann mit den Stiften auf der Unterseite direkt auf die entsprechenden Buchsenleisen des MEGA2560 aufgesteckt werden. Dabei läßt sich das Shield alleine betreiben aber auch in Kombination mit dem universellen IO-Shield20:

Folie4

 Anwendungsmöglichkeiten

Natürlich läßt sich das Shield ganz normal in einem StandAlone-Arduino betreiben, um etwas zu steuern und zu regeln. Aber bei der Auslegung des IO–Shield-Plus wurde besonderer Wert auf eine einfache Anbindung über WLAN an die CCU der Homematic gelegt. Deswegen sind Stecksockel für geeignete Wifi-Module auf dem Board, so daß sehr einfach eine WLAN-Funktionalität erreicht werden kann. Damit bleibt der „normale“ Steckplatz für andere Shields frei und somit eröffnen sich flexible Kombinationsmöglichkeiten mit vielen Standard-Shields. Die folgenden Bilder sollen dazu einen Eindruck verschaffen:

Folie5

 

Folie6

 

Installation des WLAN-Moduls CC3000

Als Wifi-Module können der CC3000 von Texas Instruments verwendet werden, aber auch der sehr preisgünstige Chip ESP8266-01 eines chinesischen Herstellers. Die Steuerung des CC3000 erfolgt über die sog. SPI-Schnittstelle, welche  auf dem MEGA2560 mit den Datenpins D50 bis D53 verfügbar ist. Zusätzlich werden noch die Pins D46 und D18 verwendet. Dabei ist zu beachten, daß der D18 im IO-Angebot des IO-Shields-Plus  nicht mehr für eine Zählerfunktion o.ä. verwendet werden kann.

Das CC3000-Modul ist als sog. Breakout in einschlägigen meist chinesischen Internet-Shops bereits für etwa 20€ verfügbar. Suchbegriff z.B. bei Aliexpress oder ebay „cc3000  breakout“.

Das Breakout-Modul ist nahezu fertig; es muß lediglich die mitgelieferte Stiftleiste eingelötet werden. Dabei hat man die Wahl, die Stiftleisten auf der  Rückseite oder der Bestückungsseite einzulöten. Dementsprechend zeigt das Modul später im eingesteckten Zustand auf dem Board nach hinten oder nach vorn. Ich habe die Stifte auf der Rückseite eingelötet:

cc3000_hand

Zusammenbau des IO-Shield-Plus

Das IO-Shield-Plus ist  in meinem Shop als Bausatz erhältlich. https://www.stall.biz/produkt/io-shield-plus-neue-version  Das Board ist bereits mit allen Widerständen, Kondensatoren usw. bestückt. Lediglich einige Steckleisten müssen zugeschnitten und verlötet werden. Dies ist auch für den  weniger versierten Elektroniker gut machbar. Das folgende Bild zeigt den Lieferumfang:

teile

Zur Hilfestellung beim Zusammenbau gibt´s hier auch eine Bauanleitung.

 Anschlussschema

Der Anschluss der Sensoren und Module erfolgt im wesentlichen mit den vielen verfügbaren Schraubklemmen. Für alle Ports sind noch per (schwarzem) Jumper zuschaltbare 10kOhm-Pullups vorhanden, was beispielsweise für die einfache Applikation von 10kOhm-NTC-Thermosensoren hilfreich ist. Auch typische Sensoren mit Pullup-Bedarf wie der digitale Temperatursensor DS18B20  kann so ohne Zusatzbauelemente an den entsprechenden Ports betrieben werden.

Jeder Port ist mit einem seriellen Widerstand von 470 Ohm gegen Kurzschluss geschützt. Dieser Widerstand kann aber mit einem Jumper (grüner Jumper) überbrückt werden. Man kann diesen Schutzwiderstand bei Bedarf auch als Vorwiderstand für eine LED o.ä. verwenden.

Für Anschluß von verbreiteten Modulen mit I2C-Bus ist auch ein Lötanschluß verfügbar. Der auf dem Board integrierte 3,3V-Spannungsregler ist auch für weitere externe 3,3V-Module verwendbar, wenn zur drahtlosen Kommunikation der ESP8266 nicht verwendet wird.

Die Wlan-Module haben beide einen Steckanschluss und müssen seitenrichtig einfach nur eingesteckt werden.

Der Rest wird mit der Homeduino-Software eingestellt und konfiguriert. Die aktuelle Version der Software ist hier: https://www.stall.biz/project/homeduino-3-0-das-ultimative-io-modul-fuer-die-hausautomation

 

Viel Spaß und Erflog mit dem Teilchen :))

Folie8

 

 Wo bekommt man das IO-Shield-Plus?

Wer das IO-Shield-Plus nachbauen möchte, kann über meinen Webshop einen Bausatz mit allen Teilen außer dem Wifi-Modul beziehen.

https://www.stall.biz/produkt/io-shield-plus-neue-version

Haftungs- und Sicherheitshinweise

Beim Nachbau müssen natürlich alle wichtigen einschlägigen Sicherheitsvorschriften für den Umgang mit gefährlichen Spannungen  eingehalten werden. Fundierte theoretische und praktische Fachkenntnisse der Elektrotechnik und für den Umgang mit gefährlichen Spannungen sind unverzichtbar!!

Durch eine unsachgemäße Installation gefährden Sie ihr Leben und das Leben ihrer Mitmenschen! Darüberhinaus riskieren Sie erhebliche Sachschäden , welche durch Brand etc. hervorgerufen werden können ! Für alle Personen- und Sachschäden durch falsche Installation etc. ist nicht der Hersteller sondern nur der Betreiber verantwortlich.

Ich verweise hier unbedingt auf  die  „Sicherheitshinweise und Haftungsausschluss„-Seite dieses Blogs.

 

 

Robuster Sonnensensor ganz einfach !

Robuster Sonnensensor ganz einfach !

Ein Sonnensensor ist sehr wichtig zur Steuerung der Rolladen , Jalousien und Markisen. Viele verwenden hierfür einen Helligkeitssensor, aber die große Dydnamik des Helligkeitssignals ist mit normalen Helligkeitssensoren meist nur unbefriedigend abzubilden, weshalb ich eigentlich von so einer Lösung abraten möchte.

Deshalb verwende ich einen einfachen und robusten thermischen Sonnensensor, der sich bereits seit Jahren ausgezeichnet für die Steuerung meiner Rolladen bewährt hat. Mehr dazu hier:

https://www.stall.biz/project/sonnensensor-fur-jalousien-und-rolladensteuerung

In diesem Post möchte ich einen noch einfacheren Sonnensensor vorstellen, der fast ohne Werkzeug auch von einem Nicht-Heimwerker nachgebaut werden kann. Dabei werden mit Bedacht nur Materialien verwendet, die eine langjährige Verwendung bei alle Wind- und Wetterbedingungen aushalten. Insbesondere Sonneneeinstrahlung und Feuchtigkeitseintritt sind immer wieder eine Herausforderung bei der Gestaltung von Sensoren!

Lange genug geredet, jetzt folgt das Kochrezept für den Nachbau!

Die wenigen Zutaten:

  • Ein Kleinverteilergehäuse aus Kunststoff, das  sehr gut wassergeschützt (Dichtung!) und für den Aussensatz geeignet ist. Geeignetes  Kunststoffmaterial ist oft glasfaserverstärkt und aus Hartplastik. Es muß der Sonne einige Jahre widerstehen können. Maße des Gehäuses in mm:  115 x 115 x 60. Bezugsquelle z.B. Baumarkt.
  • Ein Homematic Differenz-Temperatursensor HM-WDS30-OT2_SM . Bezugsquelle kennen wir!
  • Ein Röhrchen aus Messing oder Aluminium, das über den Sensor geschoben wird. Innendurchmesser 5mm, Aussendurchmesser ca. 6mm . Bezugsquelle z.B. Baumarkt.
  • Ein geeignetes Schnapsglas oder Stamper aus der Hausbar.

Das folgende Bild sagt mehr als viele Worte:

Folie1

Im Deckel des Kleinverteilergehäuses wird mittig ein 5mm-Loch zur Aufnahme des ersten  Temperaturfühlers gebohrt, in die Seite des Gehäuses wird ein weiteres 5mm-Loch für die Aufnahme des zweiten Temperaturfühlers gebohrt. Dann werden der Differenz-Temperatursensor und die Fühler so in das Gehäuse eingepasst wie man auf dem nächsten Bild sehen kann. Die langen Fühlerzuleitungen sollten so wie auf dem Bild sehr kompakt zusammengerollt werden, damit sie möglichst wenig die Funkabstrahlung behindern.

Folie2

Dann die Fühler mit Sekundenkleber fixieren und Gehäuse schließen. Der obere Sonnenfühler wird nun (optional) mit einem geschwärzten Messing- oder Aluröhrchen verlängert. Und zum Schluß noch mittig das Schnapsglas aufsetzen  und mit Silikon abdichten. Nicht vergessen, vorher noch ein möglichst kleines Loch (1 mm) neben dem Sensor anbringen, womit ein Druckausgleich erreicht werden soll.

… und fertig ist unser Sonnensensor!

Aufgestellt wird der Sonnensensor natürlich draussen an einem Ort, wo er möglichst den ganzen Tag die Sonne „sieht“. Wichtig ist dabei, daß der seitlich angebrachte Fühler möglichst unverfälscht  die Aussentemperatur mißt. Dazu ist diese Seite nach Norden auszurichten , so daß der Fühler permanent im Schatten ist.

Das WebUI-Programm dazu ist ganz einfach, weil ja bereits im Differenz-Temperatursensor sowohl die beiden Temperaturen als auch die Differenztemperaturen verfügbar sind. Man legt dazu eine logische Systemvariable Sonne_scheint an und verwendet das folgende WebUI-Programm:

sonnensensor_6

Damit bei Aprilwetter nicht die Beschattung dauernd ein- und ausgeschaltet wird, sorgt eine Temperatur- und Zeithysterese für entsprechende „Ruhe“ in der Steuerung. Die Schwellwerte für die Temperaturen muß jeder selbst nach eigenen Bedürfnissen festlegen. Aber das ist im praktischen Betrieb nach kurzer Erfahrung leicht möglich.

Damit auch nur die Rolladen betätigt werden, die von der Sonne bescheint werden, ist die Verwendung meines Skriptes zur Berechnung des Sonnenstandes sehr zu empfehlen.

https://www.stall.biz/project/sonnenstandsberechnung-2-0-fur-rolladen-markisen-lampen

… und weitere Erläuterungen zur Entwicklung geeigneter  Programme zur intelligenten Steuerung der Rolladen und Markisen sind hier:

https://www.stall.biz/project/so-steuert-man-rolladen-jalousien-und-markisen-mit-der-homematic

… und wer selbst keine Wetterstation hat kann sich ergänzende Wetterdaten aus dem Internet holen:

https://www.stall.biz/project/wunderground-wetter-mit-einfachem-hm-skript-holen

Ergänzung 15.09.2015:

Insbesondere wenn bei Aprilwetter die Sonne sehr häufig zwischen den Wolken hervor kommt, ist eine „Glättung“ der Differenztemperatur sinnvoll. Dies macht man mit einem kleinen Skript, das bei jedem neuen Messwert des Temperatursensors (das ist so alle 3 Minuten) ausgelöst wird. Dazu vorher eine Systemvariable sonne_diff_mittel vom Typ Zahl mit der Dimension °C anlegen.

Hier das WebUI-Programm:

webui_mittelwert

und das zugehörige HM-Skript:

!skript zur berechnung des mittelwertes der sonnentemperatur
real tau = 0.1;   ! 1 = keine mittelung ; kleinere werte, umso stärker ist mittelung
real Sonne_Diff_Tur = dom.GetObject("BidCos-RF.KEQ0543406:4.TEMPERATURE").Value();
!WriteLine(Sonne_Diff_Tur);
real Sonne_Diff_Mittel = dom.GetObject("sonne_diff_mittel").Value();
!WriteLine(Sonne_Diff_Mittel);
real Diff= Sonne_Diff_Tur - Sonne_Diff_Mittel;
Sonne_Diff_Mittel = Sonne_Diff_Mittel + (tau *Diff);
!WriteLine(Sonne_Diff_Mittel);
dom.GetObject("sonne_diff_mittel").State(Sonne_Diff_Mittel );

Danach muß nur noch im WebUI-Programm sonnescheint die gemessene Differenztemperatur durch die neue gemittelte Temperatur ersetzt werden. Das sieht dann so :

sonne_scheint

Das Ergebnis ist eine „geglättete“ bzw. gemittelte Differenztemperatur, wie man im folgenden Diagramm schön sehen kann. Aufgezeichnet ist typisches Aprilwetter:

Viel Erfolg beim Nachbau!

Homeduino 3.0 … das ultimative IO-Modul für die Hausautomation

Homeduino 3.0 … das ultimative IO-Modul für die Hausautomation

Wichtiger Hinweis: Es gibt mittlerweile eine neue Softwareversion:   Homduino 4.0

Für die Ungeduldigen ist hier die erste vorläufige Version der Homeduino 3.0 Software veröffentlicht. An der Software wird noch gearbeitet und einige Funktionalitäten für  Infrarot- und 433Mhz-Module fehlen noch. Darüberhinaus ist auch noch eine LCD-Anzeige geplant.

Unterstützt werden das IO-Shield20 und das IO-Shield-Plus

Hier die Installationshinweise:

1. Installation der Arduino 1.6.3 IDE

2. Kopieren der zusätzlichen Libraries in das Library-Verzeichnis:
https://www.stall.biz/wp/wp-content/uploads/2015/04/homeduino_libraries30.zip

3. Ausführen der aktuellen Version : (mit W5100-Ethernet-Shield oder CC3000 Shield )

Anmerkung 07.05.2015:  Die aktuelle Version homeduino30_03 ist noch nicht komplett getestet !!

Rückmeldungen erwünscht .

Beide folgenden Versionen (W5100 mit LAN und CC3000 mit WLAN) könnte man in einem Sketch mit sog. „conditional compilation“ zusammenfassen, aber leider gibt es damit noch Fehlermeldungen, die aktuell (noch) nicht beseitigt werden konnten. Deshalb hier aktuell noch zwei Versionen:

 

 Hier die LAN-Version:

/*Ver.: "homeduino30_03_LAN.ino / Stand: 2015.05.11 / Verfasser: Eugen Stall
 
LAN-Version mit W5100 Shield
 
hier ist immer die aktuelle Version:
Home
das folgende homeduino-programm sendet messdaten zur ccu (homeduino als webclient) ...
und empfängt ausgabedaten für die homeduino-outputs (homeduino als webserver)
____________________ ___________________
 | | 
 server port 8181 |<------------<| client 
 | | 
 CCU | | Homeduino 
 | | 
 client |>------------>| server port 80
____________________| |___________________
 
erprobt fuer Arduino Mega 2560 mit Arduino 1.6.3
diese Software steuert referenziert die signale an den Arduino-pins mit entsprechenden systemvariablen in der Homematic ccu
mit dem Befehl: http://<ip der ccu>:8181/GET /xy.exe?antwort=dom.GetObject('<systemvariable>').State(" + value + ")"
/Quellen:Arduino website plus http://arduino.cc/en/Tutorial/WebClient und ...
 http://tushev.org/articles/arduino/item/52-how-it-works-ds18b20-and-arduino und ...
*/
 
#include <SPI.h>
#include <Wire.h> 
#include <OneWire.h> //für Temperatursensoren DS18B20 http://www.hacktronics.com/code/OneWire.zip
#include <NewPing.h> //für Ultraschallsensoren SR04 https://arduino-new-ping.googlecode.com/files/NewPing_v1.5.zip
#include "DHT.h" //für Temperatursensoren SHT22 https://github.com/adafruit/DHT-sensor-library/archive/master.zip
#include <AS_BH1750.h> //für I2C-Luxmeter https://github.com/hexenmeister/AS_BH1750/archive/master.zip
#include <SFE_BMP180.h>//für I2C-Barometer https://github.com/sparkfun/BMP180_Breakout/archive/master.zip
#include <RCSwitch.h> // läuft noch nicht!
//#include <IRremote.h> // läuft noch nicht!
 
//Kommunikationsweg  festlegen
#define com_mode 0  //"0"  W5100, "1" CC300 Breakout                                     <<user-eingabe<< 
 
/*
//der folgende Bereich ist die Initialisierung des CC3000 Wifi auf dem IO-Shield-Plus 
#include <SFE_CC3000.h>// fuer cc3000 wifi http://github.com/sparkfun/SFE_CC3000_Library/archive/master.zip
#include <SFE_CC3000_Client.h>
// Pins
#define CC3000_INT 18 // int-Pin mit Wifi Shield ist D3, mit breakout auf IO-Shield-Plus ist D18
#define CC3000_EN 46 // en-Pin mit Wifi Shield ist D5, mit breakout auf IO-Shield-Plus ist D46
#define CC3000_CS 53 // cs-Pin mit Wifi Shield ist D10, mit breakout auf IO-Shield-Plus ist D53
SFE_CC3000 wifi = SFE_CC3000(CC3000_INT, CC3000_EN, CC3000_CS);
SFE_CC3000_Client client = SFE_CC3000_Client(wifi);
// Constants
char ap_ssid[] = "ssid"; // SSID Name des WLAN in Anführungszeichen                       <<user-eingabe<< 
char ap_password[] = "passwort"; // Passwort des WLAN in Anführungszeichen                <<user-eingabe<< 
unsigned int ap_security = WLAN_SEC_WPA2; // Security of network
unsigned int timeout = 30000; // Milliseconds
//char server[] = "192,168,178,50"; // Remote host site
*/
 
//der folgende Bereich ist die Initialisierung des LAN bei Verwendung des LAN-Shields
#include <Ethernet.h> 
EthernetClient client;
EthernetServer server(80);
 
 
byte ccu[] = { 192, 168, 178, 50 }; //das ist die IP der CCU <<user-eingabe<< 
byte mac[] = { 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC }; //bei mehreren homeduinos ändern!!    <<user-eingabe<<
byte homeduino[] = { 192, 168, 178, 52 }; //das ist feste IP dieses Homeduino,             <<user-eingabe<< 
 //wenn DHCP versagt
String homeduino_nummer = "xyz"; //indiv. Bezeichnung dieses homeduino                     <<user-eingabe<< 
 //das ist bel. String ohne 
 //sonderzeichen und öäüß... 
String hm_systemvariable = "homeduino_" + homeduino_nummer +"_";
 
 
//Input-Kennung: hier wird die Funktion aller verwendbaren IO´s mit einer Kennziffer festgelegt 
//dabei haben alle IO´s die Standardfunktionen plus spez. Sonderfunktionen
byte iomodus_D[70] = 
{ 0, //D0 : '0' = andere Nutzg; 
 0, //D1 : '0' = andere Nutzg; 
 
//Standardfkt:'0' =andere Nutzg; '1' =dig_input; '2' =dig_output; '3' =1wire '4' =DHTxx; '5' =U_Schall 
 
//++++++++++++++ hier folgt die Festlegung der digitalen Pinfunktionen für das IO-Shield20 +++++++++++++++++ 
 2, //D2 : Standardfkt; '5' = IR_Rx?? '6' =ImpCount;                        <<user-eingabe für IO-Shield20<< 
 2, //D3 : Standardfkt; '7' = 433_Rx?? '6' =ImpCount;                       <<user-eingabe für IO-Shield20<< 
 0, //D4 : Standardfkt; '7' = 433_Tx?? '0' =W5100/SS-Pin                    <<user-eingabe für IO-Shield20<< 
 2, //D5 : Standardfkt;                                                     <<user-eingabe für IO-Shield20<< 
 0, //D6 : Standardfkt; '9' = buzzer                                        <<user-eingabe für IO-Shield20<< 
 0, //D7 : Standardfkt;                                                     <<user-eingabe für IO-Shield20<< 
 0, //D8 : Standardfkt;                                                     <<user-eingabe für IO-Shield20<< 
 1, //D9 : Standardfkt; '5' = IR_Tx??                                       <<user-eingabe für IO-Shield20<< 
 0, //D10 : '0' =andere Nutzg;'0' =W5100 '2' = digital in; 
 0, //D11 : '0' =andere Nutzg;'0' =W5100 '2' = digital in; 
 0, //D12 : '0' =andere Nutzg;'0' =W5100 '2' = digital in; 
 0, //D13 : '0' =andere Nutzg;'0' =W5100 '2' = digital in; 
//++++++++++++++ hier folgt die Festlegung der digitalen Pinfunktionen für das IO-Shield_Plus ++++++++++++++ 
 3, //D14 : Standardfkt; '7' =ESP8266;                                  <user-eingabe für IO-Shield-Plus20<< 
 2, //D15 : Standardfkt; '7' =ESP8266;                                  <user-eingabe für IO-Shield-Plus20<< 
 2, //D16 : Standardfkt; '7' =ESP8266;                                  <user-eingabe für IO-Shield-Plus20<< 
 2, //D17 : Standardfkt; '7' =ESP8266;                                  <user-eingabe für IO-Shield-Plus20<< 
 0, //D18 : Standardfkt; '6' =ImpCount; '0' =CC3000                     <user-eingabe für IO-Shield-Plus20<< 
 3, //D19 : Standardfkt; '6' =ImpCount;                                 <user-eingabe für IO-Shield-Plus20<< 
 1, //D20 : Standardfkt; '6' =ImpCount; '8' =I2C;SDA                    <user-eingabe für IO-Shield-Plus20<< 
 1, //D21 : Standardfkt; '6' =ImpCount; '8' =I2C;SCL                    <user-eingabe für IO-Shield-Plus20<< 
 1, //D22 : Standardfkt;                                                <user-eingabe für IO-Shield-Plus20<< 
 1, //D23 : Standardfkt;                                                <user-eingabe für IO-Shield-Plus20<< 
 1, //D24 : Standardfkt;                                                <user-eingabe für IO-Shield-Plus20<< 
 1, //D25 : Standardfkt;                                                <user-eingabe für IO-Shield-Plus20<< 
 1, //D26 : Standardfkt;                                                <user-eingabe für IO-Shield-Plus20<< 
 1, //D27 : Standardfkt;                                                <user-eingabe für IO-Shield-Plus20<< 
 1, //D28 : Standardfkt;                                                <user-eingabe für IO-Shield-Plus20<< 
 1, //D29 : Standardfkt;                                                <user-eingabe für IO-Shield-Plus20<< 
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 
//hier wird die Funktion der Eingänge A0 bis A15 festgelegt
//++++++++++++++ hier folgt die Festlegung der analogen Pinfunktionen für das IO-Shield20 ++++++++++++++++++
 3, //D54 A0 : Standardfkt; '10' =anal_Inp '11' =NTC                   <<user-eingabe für IO-Shield-Plus20<< 
 2, //D55 A1 : Standardfkt; '10' =anal_Inp '11' =NTC                   <<user-eingabe für IO-Shield-Plus20<< 
 3, //D56 A2 : Standardfkt; '10' =anal_Inp '11' =NTC                   <<user-eingabe für IO-Shield-Plus20<< 
 0, //D57 A3 : Standardfkt; '10' =anal_Inp '11' =NTC                   <<user-eingabe für IO-Shield-Plus20<< 
 0, //D58 A4 : Standardfkt; '10' =anal_Inp '11' =NTC                   <<user-eingabe für IO-Shield-Plus20<< 
 3, //D59 A5 : Standardfkt; '10' =anal_Inp '11' =NTC                   <<user-eingabe für IO-Shield-Plus20<< 
 0, //D60 A6 : "0" =andere Nutzg; 
 0, //D61 A7 : "0" =andere Nutzg; 
//++++++++++++++ hier folgt die Festlegung der analogen Pinfunktionen für das IO-Shield_Plus +++++++++++++++
 1, //D62 A8 : Standardfkt; '10' =anal_Inp '11' =NTC                   <<user-eingabe für IO-Shield-Plus20<< 
 1, //D63 A9 : Standardfkt; '10' =anal_Inp '11' =NTC                   <<user-eingabe für IO-Shield-Plus20<< 
 1, //D64 A10 : Standardfkt; '10' =anal_Inp '11' =NTC                  <<user-eingabe für IO-Shield-Plus20<< 
 1, //D65 A11 : Standardfkt; '10' =anal_Inp '11' =NTC                  <<user-eingabe für IO-Shield-Plus20<< 
 1, //D66 A12 : Standardfkt; '10' =anal_Inp '11' =NTC                  <<user-eingabe für IO-Shield-Plus20<< 
 1, //D67 A13 : Standardfkt; '10' =anal_Inp '11' =NTC                  <<user-eingabe für IO-Shield-Plus20<< 
 1, //D68 A14 : Standardfkt; '10' =anal_Inp '11' =NTC                  <<user-eingabe für IO-Shield-Plus20<< 
 1 //D69 A15 : Standardfkt; '10' =anal_Inp '11' =NTC                   <<user-eingabe für IO-Shield-Plus20<< 
}; 
//hier werden Sensoren am I2C-Eingang aktiviert
byte iomodus_baro = 0; //'0' =nc; '1' =BMP180, dann auch oben I2C setzen <<user-eingabe für IO-Shield-Plus<<
byte iomodus_lux = 0; //'0' =nc; '1' =BH1750, dann auch oben I2C setzen  <<user-eingabe für IO-Shield-Plus<<
 
//hier werden die Kennwerte fuer die Impulszaehler festgelegt
unsigned zaehlwert;
unsigned last_zaehlwert[6] = {0,0,0,0,0,0};
volatile unsigned long pulsecounter[6] = 
{ 0, //Zaehlerstand fuer D2 -Impulseingang bei Reset                        <<user-eingabe für IO-Shield20<<
 0, //Zaehlerstand fuer D3 -Impulseingang bei Reset                         <<user-eingabe für IO-Shield20<<
 4711, //Zaehlerstand fuer D21-Impulseingang bei Reset                   <<user-eingabe für IO-Shield-Plus<< 
 3, //Zaehlerstand fuer D20-Impulseingang bei Reset                      <<user-eingabe für IO-Shield-Plus<< 
 4, //Zaehlerstand fuer D19-Impulseingang bei Reset                      <<user-eingabe für IO-Shield-Plus<< 
 5 //Zaehlerstand fuer D18-Impulseingang bei Reset                       <<user-eingabe für IO-Shield-Plus<< 
}; 
//hier wird der Teilerfaktor für die Impulszaehler festgelegt
int pulsedivider[6] = 
{ 1, //Teilerfaktor D2 :                                                    <<user-eingabe für IO-Shield20<<
 1, //Teilerfaktor D3 :                                                     <<user-eingabe für IO-Shield20<<
 1, //Teilerfaktor D21 :                                                 <<user-eingabe für IO-Shield-Plus<<
 1, //Teilerfaktor D20 :                                                 <<user-eingabe für IO-Shield-Plus<<
 1, //Teilerfaktor D19 :                                                 <<user-eingabe für IO-Shield-Plus<<
 1, //Teilerfaktor D18 :                                                 <<user-eingabe für IO-Shield-Plus<<
}; 
 
//hier werden die zuletzt gesendeten sytemvariablen gespeichert
boolean last_digital_value_D[70];
float last_value_D[70];
float last_IR_value;
float last_RF_value;
float last_lux_value;
double last_baro_value;
double last_baroT_value;
 
boolean complete_loop =1; // wenn 1, dann einmal komplett durchlaufen
 
String header = String(20);
String befehl;
String sub_command = String(20);
String parameter = String(20);
int param;
int port_pin;
boolean port_data;
 
boolean value;
String I;
int analogwert;
 
float tempNTC;
float B_wert = 3950; //aus dem Datenblatt des NTC //<<user-eingabe<<
float Tn = 298.15; //25°Celsius in °Kelvin 
float Rv = 10000; //Vorwiderstand
float Rn = 10000; //NTC-Widerstand bei 25°C
float Rt ; 
float temp_tur;
float humidity;
 
float delta_onewire = 0.2; //Deltas für Sendeauslösung 
float delta_DHT = 0.2; //in °C 
float delta_us = 3.0; // in cm
float delta_analog = 2.0; // in inkrement
float delta_ntc = 0.5; //in °C
float delta_lux = 20; //in lux
float delta_counter = 5; //in counter inkrement
double delta_baro = 0.2; //in mB
double delta_baroT = 0.5; //in °C
 
long duration, cm; //variable für Ultraschallsensor
 
unsigned long next_full_loop = 0;
unsigned long delta_time = 3600000; // jede Stunde werden alle Inputs aktualisiert
unsigned long delta_tx = 500; //in ms, minimaler Abstand der Telegramme an die CCU
unsigned long next_tx = 0;
unsigned long time_DHT = 0; 
 
int rf_key;
String rfkey;
RCSwitch mySwitch = RCSwitch();
 
//************************************************************************************************** 
AS_BH1750 sensor; //Initialize BH1750 Luxmeter library
#define ALTITUDE 299.0 // eigene seehoehe in metern              <<user-eingabe für IO-Shield-Plus<<
SFE_BMP180 pressure;
char status;
double T,P,p0;
 
boolean reading = false;
String command = String(200);
 
//************************************************************************************************** 
//************************************************************************************************** 
void setup() 
{Serial.begin(115200); 
 
//einrichtung der interrupts fuer impulszahler D2,D3,D18,D19,D20,D21
if ((pulsedivider[0] > 0) && (iomodus_D[2] == 6)) {pinMode(2, INPUT_PULLUP); attachInterrupt(0, ISR_0, FALLING);}
if ((pulsedivider[1] > 0) && (iomodus_D[3] == 6)) {pinMode(3, INPUT_PULLUP); attachInterrupt(1, ISR_1, FALLING);} 
if ((pulsedivider[2] > 0) && (iomodus_D[21] == 6)) {pinMode(21, INPUT_PULLUP); attachInterrupt(2, ISR_2, FALLING);}
if ((pulsedivider[3] > 0) && (iomodus_D[20] == 6)) {pinMode(20, INPUT_PULLUP); attachInterrupt(3, ISR_3, FALLING);}
if ((pulsedivider[4] > 0) && (iomodus_D[19] == 6)) {pinMode(19, INPUT_PULLUP); attachInterrupt(4, ISR_4, FALLING);}
#if com_mode == 0 
if ((pulsedivider[5] > 0) && (iomodus_D[18] == 6)) {pinMode(18, INPUT_PULLUP); attachInterrupt(5, ISR_5, FALLING);}
#endif 
 
 
//+++++++ hier folgt die LAN Initialisierung
 if (Ethernet.begin(mac) == 0) // start the Ethernet connection:
 {Serial.println("Failed to configure Ethernet using DHCP"); Ethernet.begin(mac, homeduino);}
 delay(1000);// give the Ethernet shield a second to initialize:
 Serial.println("connecting..."); // if you get a connection, report back via serial:
 if (client.connect(ccu, 8181)) {}
 else {Serial.println("connection failed");} // if you didn't get a connection to the server:
 client.stop(); 
 char myIpString[24]; //IP auslesen
 IPAddress myIp = Ethernet.localIP();
 sprintf(myIpString, "%d.%d.%d.%d", myIp[0], myIp[1], myIp[2], myIp[3]); 
 I = myIpString;
 befehl = "GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + "IP" + "').State('" + I + "')";
 set_sysvar(); 
 server.begin();
 
/*
//+++++++ hier folgt die CC3000 Initialisierung
 ConnectionInfo connection_info;
 int i;
 byte IP_ADDR_LEN =4;
 Serial.println("SparkFun CC3000 - WebClient");
 if ( wifi.init() ) {Serial.println("init complete");} 
 else {Serial.println("problem with init!");}
 // Connect using DHCP
 if(!wifi.connect(ap_ssid, ap_security, ap_password, timeout)) {Serial.println("no connection to AP");}
 // Gather connection details and print IP address
 if ( !wifi.getConnectionInfo(connection_info) ) {Serial.println("no connection details");} 
 else {for (i = 0; i < IP_ADDR_LEN; i++) 
 {Serial.print(connection_info.ip_address[i]);
 if ( i < IP_ADDR_LEN - 1 ) {Serial.print(".");}
 }
 Serial.println(" ist aktuelle IP-Adresse"); 
 }
 
 if (client.connect(ccu, 8181)) {} // Make a TCP connection to remote host
 else {Serial.println("connection failed");} // if you didn't get a connection to the server:
 client.stop();
*/
 
}
//************************************************************************************************** 
//************************************************************************************************** 
void loop() 
{complete_loop = 0;
 if (millis() > next_full_loop) //mindestens jede Stunde eine komplette Aktualisierung
 {complete_loop = 1; next_full_loop = millis() + delta_time; 
 if (next_full_loop < millis()) {complete_loop = 0;} //wichtig wegen Zahlensprung von millis() alle 50 Tage
 } 
 for (int i = 2; i < 70; i++) //behandlung aller Ports D2 bis D69 
 {if (i== 30) {i = 54;} // unbenutzte pins überspringen
 
 //************************************************************************************************** 
 if (iomodus_D[i] == 1) //behandlung digitaleingänge 
 {pinMode(i, INPUT_PULLUP); 
 digitalWrite(i, HIGH);
 value =digitalRead(i);
 if ((!value == last_digital_value_D[i]) || complete_loop) 
 {I = String(i);
 befehl = "GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + "D" + I + "').State(" + value + ")";
 set_sysvar();
 last_digital_value_D[i] = value;
 } 
 }
//************************************************************************************************** 
 if (iomodus_D[i] == 3) //behandlung onewire 
 {pinMode(i, INPUT_PULLUP);
 digitalWrite(i, HIGH);
 OneWire ds(i); 
 #define DS18S20_ID 0x10
 #define DS18B20_ID 0x28 
 
 byte present = 0;
 byte data[12];
 byte addr[8];
 temp_tur = 1000.0;
 if (!ds.search(addr)) { ds.reset_search(); temp_tur = -1000.0; } //find a device
 if ((OneWire::crc8( addr, 7) != addr[7]) && (temp_tur > -1000.0)) {temp_tur = -1000.0; }
 if ((addr[0] != DS18S20_ID && addr[0] != DS18B20_ID)&& (temp_tur > -1000.0)) {temp_tur = -1000.0;}
 if (temp_tur > -1000.0) 
 {ds.reset(); 
 ds.select(addr); 
 ds.write(0x44, 1); // Start conversion
 delay(850); // Wait some time...
 present = ds.reset(); 
 ds.select(addr);
 ds.write(0xBE); // Issue Read scratchpad command
 for ( int k = 0; k < 9; k++) { data[k] = ds.read(); } // Receive 9 bytes
 temp_tur = ( (data[1] << 8) + data[0] )*0.0625; // Calculate temperature value 18B20
 //temp_tur = ( (data[1] << 8) + data[0] )*0.5 // Calculate temperature value 18S20
 }
 if ((temp_tur > (last_value_D[i] + delta_onewire)) 
 || (temp_tur < (last_value_D[i] - delta_onewire)) || complete_loop) 
 {I = String(i);
 befehl = "GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + "D" + I + "').State(" + temp_tur + ")";
 set_sysvar();
 last_value_D[i] = temp_tur;
 } 
 }
//************************************************************************************************** 
 if (iomodus_D[i] == 4) //behandlung DHT temperatur- und feuchtesensoren
 {DHT dht(i, DHT22); //je nach verwendetem sensor "DHT11" oder "DHT22" (AM2302) oder "DHT 21" (AM2301)
 dht.begin();
 //delay(2000); // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
 time_DHT = millis() +2000;
 while (millis() < time_DHT) {datenempfang();} //wahrend der 2s wartezeit, daten empfangen
 humidity = dht.readHumidity(); // Read temperature as Celsius
 temp_tur = dht.readTemperature(); 
 if (isnan(humidity) || isnan(temp_tur) ) // Check if any reads failed and 
 { //Serial.println("Failed to read from DHT sensor!");
 temp_tur = -1000;
 }
 if ((temp_tur > (last_value_D[i] + delta_DHT)) || (temp_tur < (last_value_D[i] - delta_DHT)) || complete_loop) 
 {I = String(i);
 befehl = "GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + "D" + I + "').State(" + temp_tur + ")";
 set_sysvar();
 befehl = "GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + "D" + I + "1').State(" + humidity + ")";
 set_sysvar();
 last_value_D[i] = temp_tur;
 } 
 } 
 //************************************************************************************************** 
 if (iomodus_D[i] == 5) //behandlung ultraschallsensoren achtung: zu beachten 
 //bei verwendung der US-Sensoren beim IO-Shield-Plus sind die 150-Ohm-Schutzwiderstände 
 //zu überbrücken , entsprechend beim IO-Shield20 der digitale Jumper 4-5 zu setzen!! 
 {NewPing sonar(i, i, 200); // NewPing setup of pin and maximum distance.
 unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS).
 int cm = uS / US_ROUNDTRIP_CM;
 if ((cm > (last_value_D[i] + delta_us)) || (cm < (last_value_D[i] - delta_us)) || complete_loop) 
 {I = String(i);
 befehl = "GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + "D" + I + "').State(" + cm + ")";
 set_sysvar();
 last_value_D[i] = cm;
 } 
 } 
//************************************************************************************************** 
 if (iomodus_D[i] == 10) //behandlung analogeingänge 
 {analogwert =analogRead(i); 
 if ((analogwert > (last_value_D[i] + delta_analog)) || (analogwert < (last_value_D[i] - delta_analog)) || complete_loop) 
 {I = String(i);
 befehl = "GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + "D" + I + "').State(" + analogwert + ")";
 set_sysvar();
 last_value_D[i] = analogwert;
 } 
 } 
//**************************************************************************************************
 if (iomodus_D[i] == 11) //behandlung NTC 
 {Rt = Rv/((1024.0/analogRead(i))- 1.0);
 tempNTC = (B_wert * Tn / ( B_wert + (Tn * log(Rt/Rn)))) -Tn +25.0 ;
 if ((tempNTC > (last_value_D[70] + delta_ntc)) || (tempNTC < (last_value_D[70] - delta_ntc)) || complete_loop) 
 {I = String(i);
 befehl = "GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + "D" + I + "').State(" + tempNTC + ")";
 set_sysvar();
 last_value_D[i] = tempNTC;
 } 
 } 
//************************************************************************************************** 
 if (iomodus_D[i] == 6) //behandlung impulszahler D2,D3,D21,D20,D19,D18 
 {byte offset =23;
 if (i ==2) {offset = 4;} if (i ==3) {offset = 6;}
 zaehlwert = pulsecounter[offset - i ] / pulsedivider[offset - i ];
 if ((pulsedivider[offset -i] > 0) && ((zaehlwert > (last_zaehlwert[offset - i]+ delta_counter) || complete_loop))) 
 {I = String(offset -i);
 befehl = "GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + "imp" + I + "').State(" + zaehlwert + ")";
 set_sysvar();
 last_zaehlwert[offset - i] = zaehlwert;
 } 
 } 
//**************************************************************************************************
//behandlung Luxmeter BH1750 an SCL pin21 und SDA pin 20
// for normal sensor resolution (1 lx resolution, 0-65535 lx, 120ms, no PowerDown) use: sensor.begin(RESOLUTION_NORMAL, false); 
 if ((iomodus_D[20] == 1) && (iomodus_D[21] == 1) && (iomodus_lux ==1))
 {if(!sensor.begin()) { Serial.println("Sensor not present"); }
 float lux = sensor.readLightLevel(); delay(1000);
 Serial.print("Helligkeit/lux: "); Serial.print(lux); Serial.println();
 if ((lux > (last_lux_value + delta_lux)) || (lux < (last_lux_value - delta_lux)) || complete_loop) 
 {befehl = "GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + "lux" + "').State(" + lux + ")";
 set_sysvar();
 last_lux_value = lux;
 } 
 } 
//**************************************************************************************************
//behandlung barometer BMP180 an SCL pin21 und SDA pin 20
 if ((iomodus_D[20] == 8) && (iomodus_D[21] == 8)&& (iomodus_baro ==1))
 {if (pressure.begin()) {status = pressure.startTemperature();}
 if (status) {delay(status); status = pressure.getTemperature(T);} //messung T
 if (status) {status = pressure.startPressure(3);} // //messung P mit resolution 0 bis 3
 if (status) {delay(status); status = pressure.getPressure(P,T);}
 if (status) {p0 = pressure.sealevel(P,ALTITUDE);} // umrechnung auf N.N.
 Serial.print("Hoehe/m: "); Serial.print(ALTITUDE); Serial.print(" Temperatur/C: "); Serial.print(T); Serial.print(" Normaldruck /mb: "); Serial.println(p0); 
 if ((p0 > (last_baro_value + delta_baro)) || (p0 < (last_baro_value - delta_baro)) || complete_loop) 
 {befehl = "GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + "baro" + "').State(" + p0 + ")";
 set_sysvar();
 last_baro_value = p0;
 }
 if ((T > (last_baroT_value + delta_baroT)) || (p0 < (last_baroT_value - delta_baroT)) || complete_loop) 
 {befehl = "GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + "baroT" + "').State(" + T + ")";
 set_sysvar();
 last_baroT_value = T;
 }
 }
 }
//**************************************************************************************************
 if (iomodus_D[3] == 7) //behandlung 433Mhz-rx 
 {if (mySwitch.available()) 
 {int value = mySwitch.getReceivedValue();
 if (value == 0) {client.print("Unknown encoding");} 
 else {Serial.print("Pin D3 received : ");
 Serial.print (mySwitch.getReceivedValue() );
 Serial.print (" / ");
 Serial.print( mySwitch.getReceivedBitlength() );
 Serial.print("bit Protocol: ");
 Serial.println( mySwitch.getReceivedProtocol() + " \n\r" );
 }
 mySwitch.resetAvailable();
 }
 } 
//**************************************************************************************************
 
datenempfang(); 
} 
 
//##############################################################
//##############################################################
void datenempfang() //Unterprogramm datenempfang: daten von ccu an homeduino
{command = ""; 
 
 EthernetClient client = server.available();   //mit W5100
 //SFE_CC3000_Client client = SFE_CC3000_Client(wifi);   //mit CC3000
 
 if (client) 
 { // an http request ends with a blank line
 boolean currentLineIsBlank = true;
 while (client.connected())
 {if (client.available()) 
 {char c = client.read();
 if (reading && c == ' ') reading =false;
 if (c == '?') reading = true; // beginn der Befehlssequenz 
 if (reading) 
 {//read char by char HTTP request
 if (command.length() < 100) 
 { //store characters to string
 command = command + c;
 }
 } 
 if (c == '\n' && currentLineIsBlank) break;
 if (c == '\n') {currentLineIsBlank = true;} 
 else if (c != '\r') { currentLineIsBlank = false;}
 } 
 } 
 client.println(command);
 delay(1); 
 client.stop();
//**************************************************************************************************
 if (command.length() > 2) //behandlung Datenempfang: port auf 0 / 1 setzen 
 {Serial.println(command); //empfangenen befehl ausgeben
 client.print(command); 
 //befehl dekodieren 
 int colonPosition = command.indexOf(':');
 sub_command = command.substring(2,colonPosition); //portpin erkennen
 Serial.print("D" + sub_command + " :");
 port_pin = sub_command.toInt();
 command = command.substring((colonPosition+1)); //Rest-command bilden
 if ((iomodus_D[port_pin] == 2) && (command == "0")) 
 {pinMode(port_pin, OUTPUT); digitalWrite(port_pin, LOW); Serial.println(command);}
 if ((iomodus_D[port_pin] == 2) && (command == "1")) 
 {pinMode(port_pin, OUTPUT); digitalWrite(port_pin, HIGH); Serial.println(command);}
 if ((iomodus_D[port_pin] == 7) && (port_pin ==4)) 
 { rf_send(command); Serial.println(command);} 
 if ((iomodus_D[port_pin] == 5) && (port_pin ==9)) 
 { ir_send(command); Serial.println(command);} 
 
 }
 
 } 
} 
//##############################################################
void set_sysvar() // subroutine HTTP request absetzen:
{ //while (millis() < next_tx) {} //warten bis time > next_tx oder timeout
 next_tx = millis() +delta_tx;
 if (client.connect(ccu, 8181)) 
 {Serial.println(befehl);
 client.println(befehl);
 client.println();
 client.stop();
 }
}
//##############################################################
void rf_send(String rf_command) // subroutine rf telegramm senden
{
 }
//##############################################################
void ir_send(String ir_command) // subroutine ir telegramm senden
{
 }
 
//##############################################################
//hier sind die interrupt-service-routinen fuer die impulszaehler
void ISR_0() //Interrupt an D2
{pulsecounter[0]++;}
 
void ISR_1() //Interrupt an D3
{pulsecounter[1]++;}
 
 
void ISR_2() //Interrupt an D21
{pulsecounter[2]++;}
 
void ISR_3() //Interrupt an D20
{pulsecounter[3]++;}
 
void ISR_4() //Interrupt an D19
{pulsecounter[4]++;}
 
void ISR_5() //Interrupt an D18 
{pulsecounter[5]++;}

 

 

Und hier die Wifi-Version :

/*Ver.: "homeduino30_03_wifi.ino / Stand: 2015.05.07 / Verfasser: Eugen Stall
 
Wifi-Version mit CC3000-Breakout
 
hier ist immer die aktuelle Version:
Home
das folgende homeduino-programm sendet messdaten zur ccu (homeduino als webclient) ...
und empfängt ausgabedaten für die homeduino-outputs (homeduino als webserver)
____________________ ___________________
 | | 
 server port 8181 |<------------<| client 
 | | 
 CCU | | Homeduino 
 | | 
 client |>------------>| server port 80
____________________| |___________________
 
erprobt fuer Arduino Mega 2560 mit Arduino 1.6.3
diese Software steuert referenziert die signale an den Arduino-pins mit entsprechenden systemvariablen in der Homematic ccu
mit dem Befehl: http://<ip der ccu>:8181/GET /xy.exe?antwort=dom.GetObject('<systemvariable>').State(" + value + ")"
/Quellen:Arduino website plus http://arduino.cc/en/Tutorial/WebClient und ...
 http://tushev.org/articles/arduino/item/52-how-it-works-ds18b20-and-arduino und ...
*/
 
#include <SPI.h>
#include <Wire.h> 
#include <OneWire.h> //für Temperatursensoren DS18B20 http://www.hacktronics.com/code/OneWire.zip
#include <NewPing.h> //für Ultraschallsensoren SR04 https://arduino-new-ping.googlecode.com/files/NewPing_v1.5.zip
#include "DHT.h" //für Temperatursensoren SHT22 https://github.com/adafruit/DHT-sensor-library/archive/master.zip
#include <AS_BH1750.h> //für I2C-Luxmeter https://github.com/hexenmeister/AS_BH1750/archive/master.zip
#include <SFE_BMP180.h>//für I2C-Barometer https://github.com/sparkfun/BMP180_Breakout/archive/master.zip
#include <RCSwitch.h> // läuft noch nicht!
//#include <IRremote.h> // läuft noch nicht!
 
//Kommunikationsweg  festlegen
#define com_mode 1  //"0"  W5100, "1" CC300 Breakout                                     <<user-eingabe<< 
 
 
//der folgende Bereich ist die Initialisierung des CC3000 Wifi auf dem IO-Shield-Plus 
#include <SFE_CC3000.h>// fuer cc3000 wifi http://github.com/sparkfun/SFE_CC3000_Library/archive/master.zip
#include <SFE_CC3000_Client.h>
// Pins
#define CC3000_INT 18 // int-Pin mit Wifi Shield ist D3, mit breakout auf IO-Shield-Plus ist D18
#define CC3000_EN 46 // en-Pin mit Wifi Shield ist D5, mit breakout auf IO-Shield-Plus ist D46
#define CC3000_CS 53 // cs-Pin mit Wifi Shield ist D10, mit breakout auf IO-Shield-Plus ist D53
SFE_CC3000 wifi = SFE_CC3000(CC3000_INT, CC3000_EN, CC3000_CS);
SFE_CC3000_Client client = SFE_CC3000_Client(wifi);
// Constants
char ap_ssid[] = "ssid"; // SSID Name des WLAN in Anführungszeichen                       <<user-eingabe<< 
char ap_password[] = "passwort"; // Passwort des WLAN in Anführungszeichen                <<user-eingabe<< 
unsigned int ap_security = WLAN_SEC_WPA2; // Security of network
unsigned int timeout = 30000; // Milliseconds
//char server[] = "192,168,178,50"; // Remote host site
 
/*
//der folgende Bereich ist die Initialisierung des LAN bei Verwendung des LAN-Shields
#include <Ethernet.h> 
EthernetClient client;
EthernetServer server(80);
*/
 
byte ccu[] = { 192, 168, 178, 50 }; //das ist die IP der CCU <<user-eingabe<< 
byte mac[] = { 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC }; //bei mehreren homeduinos ändern!!    <<user-eingabe<<
byte homeduino[] = { 192, 168, 178, 52 }; //das ist feste IP dieses Homeduino,             <<user-eingabe<< 
 //wenn DHCP versagt
String homeduino_nummer = "xyz"; //indiv. Bezeichnung dieses homeduino                     <<user-eingabe<< 
 //das ist bel. String ohne 
 //sonderzeichen und öäüß... 
String hm_systemvariable = "homeduino_" + homeduino_nummer +"_";
 
 
//Input-Kennung: hier wird die Funktion aller verwendbaren IO´s mit einer Kennziffer festgelegt 
//dabei haben alle IO´s die Standardfunktionen plus spez. Sonderfunktionen
byte iomodus_D[70] = 
{ 0, //D0 : '0' = andere Nutzg; 
 0, //D1 : '0' = andere Nutzg; 
 
//Standardfkt:'0' =andere Nutzg; '1' =dig_input; '2' =dig_output; '3' =1wire '4' =DHTxx; '5' =U_Schall 
 
//++++++++++++++ hier folgt die Festlegung der digitalen Pinfunktionen für das IO-Shield20 +++++++++++++++++ 
 2, //D2 : Standardfkt; '5' = IR_Rx?? '6' =ImpCount;                        <<user-eingabe für IO-Shield20<< 
 2, //D3 : Standardfkt; '7' = 433_Rx?? '6' =ImpCount;                       <<user-eingabe für IO-Shield20<< 
 0, //D4 : Standardfkt; '7' = 433_Tx?? '0' =W5100/SS-Pin                    <<user-eingabe für IO-Shield20<< 
 2, //D5 : Standardfkt;                                                     <<user-eingabe für IO-Shield20<< 
 0, //D6 : Standardfkt; '9' = buzzer                                        <<user-eingabe für IO-Shield20<< 
 0, //D7 : Standardfkt;                                                     <<user-eingabe für IO-Shield20<< 
 0, //D8 : Standardfkt;                                                     <<user-eingabe für IO-Shield20<< 
 1, //D9 : Standardfkt; '5' = IR_Tx??                                       <<user-eingabe für IO-Shield20<< 
 0, //D10 : '0' =andere Nutzg;'0' =W5100 '2' = digital in; 
 0, //D11 : '0' =andere Nutzg;'0' =W5100 '2' = digital in; 
 0, //D12 : '0' =andere Nutzg;'0' =W5100 '2' = digital in; 
 0, //D13 : '0' =andere Nutzg;'0' =W5100 '2' = digital in; 
//++++++++++++++ hier folgt die Festlegung der digitalen Pinfunktionen für das IO-Shield_Plus ++++++++++++++ 
 3, //D14 : Standardfkt; '7' =ESP8266;                                  <user-eingabe für IO-Shield-Plus20<< 
 2, //D15 : Standardfkt; '7' =ESP8266;                                  <user-eingabe für IO-Shield-Plus20<< 
 2, //D16 : Standardfkt; '7' =ESP8266;                                  <user-eingabe für IO-Shield-Plus20<< 
 2, //D17 : Standardfkt; '7' =ESP8266;                                  <user-eingabe für IO-Shield-Plus20<< 
 0, //D18 : Standardfkt; '6' =ImpCount; '0' =CC3000                     <user-eingabe für IO-Shield-Plus20<< 
 3, //D19 : Standardfkt; '6' =ImpCount;                                 <user-eingabe für IO-Shield-Plus20<< 
 1, //D20 : Standardfkt; '6' =ImpCount; '8' =I2C;SDA                    <user-eingabe für IO-Shield-Plus20<< 
 1, //D21 : Standardfkt; '6' =ImpCount; '8' =I2C;SCL                    <user-eingabe für IO-Shield-Plus20<< 
 1, //D22 : Standardfkt;                                                <user-eingabe für IO-Shield-Plus20<< 
 1, //D23 : Standardfkt;                                                <user-eingabe für IO-Shield-Plus20<< 
 1, //D24 : Standardfkt;                                                <user-eingabe für IO-Shield-Plus20<< 
 1, //D25 : Standardfkt;                                                <user-eingabe für IO-Shield-Plus20<< 
 1, //D26 : Standardfkt;                                                <user-eingabe für IO-Shield-Plus20<< 
 1, //D27 : Standardfkt;                                                <user-eingabe für IO-Shield-Plus20<< 
 1, //D28 : Standardfkt;                                                <user-eingabe für IO-Shield-Plus20<< 
 1, //D29 : Standardfkt;                                                <user-eingabe für IO-Shield-Plus20<< 
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 
//hier wird die Funktion der Eingänge A0 bis A15 festgelegt
//++++++++++++++ hier folgt die Festlegung der analogen Pinfunktionen für das IO-Shield20 ++++++++++++++++++
 3, //D54 A0 : Standardfkt; '10' =anal_Inp '11' =NTC                   <<user-eingabe für IO-Shield-Plus20<< 
 2, //D55 A1 : Standardfkt; '10' =anal_Inp '11' =NTC                   <<user-eingabe für IO-Shield-Plus20<< 
 3, //D56 A2 : Standardfkt; '10' =anal_Inp '11' =NTC                   <<user-eingabe für IO-Shield-Plus20<< 
 0, //D57 A3 : Standardfkt; '10' =anal_Inp '11' =NTC                   <<user-eingabe für IO-Shield-Plus20<< 
 0, //D58 A4 : Standardfkt; '10' =anal_Inp '11' =NTC                   <<user-eingabe für IO-Shield-Plus20<< 
 3, //D59 A5 : Standardfkt; '10' =anal_Inp '11' =NTC                   <<user-eingabe für IO-Shield-Plus20<< 
 0, //D60 A6 : "0" =andere Nutzg; 
 0, //D61 A7 : "0" =andere Nutzg; 
//++++++++++++++ hier folgt die Festlegung der analogen Pinfunktionen für das IO-Shield_Plus +++++++++++++++
 1, //D62 A8 : Standardfkt; '10' =anal_Inp '11' =NTC                   <<user-eingabe für IO-Shield-Plus20<< 
 1, //D63 A9 : Standardfkt; '10' =anal_Inp '11' =NTC                   <<user-eingabe für IO-Shield-Plus20<< 
 1, //D64 A10 : Standardfkt; '10' =anal_Inp '11' =NTC                  <<user-eingabe für IO-Shield-Plus20<< 
 1, //D65 A11 : Standardfkt; '10' =anal_Inp '11' =NTC                  <<user-eingabe für IO-Shield-Plus20<< 
 1, //D66 A12 : Standardfkt; '10' =anal_Inp '11' =NTC                  <<user-eingabe für IO-Shield-Plus20<< 
 1, //D67 A13 : Standardfkt; '10' =anal_Inp '11' =NTC                  <<user-eingabe für IO-Shield-Plus20<< 
 1, //D68 A14 : Standardfkt; '10' =anal_Inp '11' =NTC                  <<user-eingabe für IO-Shield-Plus20<< 
 1 //D69 A15 : Standardfkt; '10' =anal_Inp '11' =NTC                   <<user-eingabe für IO-Shield-Plus20<< 
}; 
//hier werden Sensoren am I2C-Eingang aktiviert
byte iomodus_baro = 0; //'0' =nc; '1' =BMP180, dann auch oben I2C setzen <<user-eingabe für IO-Shield-Plus<<
byte iomodus_lux = 0; //'0' =nc; '1' =BH1750, dann auch oben I2C setzen  <<user-eingabe für IO-Shield-Plus<<
 
//hier werden die Kennwerte fuer die Impulszaehler festgelegt
unsigned zaehlwert;
unsigned last_zaehlwert[6] = {0,0,0,0,0,0};
volatile unsigned long pulsecounter[6] = 
{ 0, //Zaehlerstand fuer D2 -Impulseingang bei Reset                        <<user-eingabe für IO-Shield20<<
 0, //Zaehlerstand fuer D3 -Impulseingang bei Reset                         <<user-eingabe für IO-Shield20<<
 4711, //Zaehlerstand fuer D21-Impulseingang bei Reset                   <<user-eingabe für IO-Shield-Plus<< 
 3, //Zaehlerstand fuer D20-Impulseingang bei Reset                      <<user-eingabe für IO-Shield-Plus<< 
 4, //Zaehlerstand fuer D19-Impulseingang bei Reset                      <<user-eingabe für IO-Shield-Plus<< 
 5 //Zaehlerstand fuer D18-Impulseingang bei Reset                       <<user-eingabe für IO-Shield-Plus<< 
}; 
//hier wird der Teilerfaktor für die Impulszaehler festgelegt
int pulsedivider[6] = 
{ 1, //Teilerfaktor D2 :                                                    <<user-eingabe für IO-Shield20<<
 1, //Teilerfaktor D3 :                                                     <<user-eingabe für IO-Shield20<<
 1, //Teilerfaktor D21 :                                                 <<user-eingabe für IO-Shield-Plus<<
 1, //Teilerfaktor D20 :                                                 <<user-eingabe für IO-Shield-Plus<<
 1, //Teilerfaktor D19 :                                                 <<user-eingabe für IO-Shield-Plus<<
 1, //Teilerfaktor D18 :                                                 <<user-eingabe für IO-Shield-Plus<<
}; 
 
//hier werden die zuletzt gesendeten sytemvariablen gespeichert
boolean last_digital_value_D[70];
float last_value_D[70];
float last_IR_value;
float last_RF_value;
float last_lux_value;
double last_baro_value;
double last_baroT_value;
 
boolean complete_loop =1; // wenn 1, dann einmal komplett durchlaufen
 
String header = String(20);
String befehl;
String sub_command = String(20);
String parameter = String(20);
int param;
int port_pin;
boolean port_data;
 
boolean value;
String I;
int analogwert;
 
float tempNTC;
float B_wert = 3950; //aus dem Datenblatt des NTC //<<user-eingabe<<
float Tn = 298.15; //25°Celsius in °Kelvin 
float Rv = 10000; //Vorwiderstand
float Rn = 10000; //NTC-Widerstand bei 25°C
float Rt ; 
float temp_tur;
float humidity;
 
float delta_onewire = 0.2; //Deltas für Sendeauslösung 
float delta_DHT = 0.2; //in °C 
float delta_us = 3.0; // in cm
float delta_analog = 2.0; // in inkrement
float delta_ntc = 0.5; //in °C
float delta_lux = 20; //in lux
float delta_counter = 5; //in counter inkrement
double delta_baro = 0.2; //in mB
double delta_baroT = 0.5; //in °C
 
long duration, cm; //variable für Ultraschallsensor
 
unsigned long next_full_loop = 0;
unsigned long delta_time = 3600000; // jede Stunde werden alle Inputs aktualisiert
unsigned long delta_tx = 500; //in ms, minimaler Abstand der Telegramme an die CCU
unsigned long next_tx = 0;
unsigned long time_DHT = 0; 
 
int rf_key;
String rfkey;
RCSwitch mySwitch = RCSwitch();
 
//************************************************************************************************** 
AS_BH1750 sensor; //Initialize BH1750 Luxmeter library
#define ALTITUDE 299.0 // eigene seehoehe in metern              <<user-eingabe für IO-Shield-Plus<<
SFE_BMP180 pressure;
char status;
double T,P,p0;
 
boolean reading = false;
String command = String(200);
 
//************************************************************************************************** 
//************************************************************************************************** 
void setup() 
{Serial.begin(115200); 
 
//einrichtung der interrupts fuer impulszahler D2,D3,D18,D19,D20,D21
if ((pulsedivider[0] > 0) && (iomodus_D[2] == 6)) {pinMode(2, INPUT_PULLUP); attachInterrupt(0, ISR_0, FALLING);}
if ((pulsedivider[1] > 0) && (iomodus_D[3] == 6)) {pinMode(3, INPUT_PULLUP); attachInterrupt(1, ISR_1, FALLING);} 
if ((pulsedivider[2] > 0) && (iomodus_D[21] == 6)) {pinMode(21, INPUT_PULLUP); attachInterrupt(2, ISR_2, FALLING);}
if ((pulsedivider[3] > 0) && (iomodus_D[20] == 6)) {pinMode(20, INPUT_PULLUP); attachInterrupt(3, ISR_3, FALLING);}
if ((pulsedivider[4] > 0) && (iomodus_D[19] == 6)) {pinMode(19, INPUT_PULLUP); attachInterrupt(4, ISR_4, FALLING);}
#if com_mode == 0 
if ((pulsedivider[5] > 0) && (iomodus_D[18] == 6)) {pinMode(18, INPUT_PULLUP); attachInterrupt(5, ISR_5, FALLING);}
#endif 
 
/*
//+++++++ hier folgt die LAN Initialisierung
 if (Ethernet.begin(mac) == 0) // start the Ethernet connection:
 {Serial.println("Failed to configure Ethernet using DHCP"); Ethernet.begin(mac, homeduino);}
 delay(1000);// give the Ethernet shield a second to initialize:
 Serial.println("connecting..."); // if you get a connection, report back via serial:
 if (client.connect(ccu, 8181)) {}
 else {Serial.println("connection failed");} // if you didn't get a connection to the server:
 client.stop(); 
 char myIpString[24]; //IP auslesen
 IPAddress myIp = Ethernet.localIP();
 sprintf(myIpString, "%d.%d.%d.%d", myIp[0], myIp[1], myIp[2], myIp[3]); 
 I = myIpString;
 befehl = "GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + "IP" + "').State('" + I + "')";
 set_sysvar(); 
 server.begin();
*/ 
 
//+++++++ hier folgt die CC3000 Initialisierung
 ConnectionInfo connection_info;
 int i;
 byte IP_ADDR_LEN =4;
 Serial.println("SparkFun CC3000 - WebClient");
 if ( wifi.init() ) {Serial.println("init complete");} 
 else {Serial.println("problem with init!");}
 // Connect using DHCP
 if(!wifi.connect(ap_ssid, ap_security, ap_password, timeout)) {Serial.println("no connection to AP");}
 // Gather connection details and print IP address
 if ( !wifi.getConnectionInfo(connection_info) ) {Serial.println("no connection details");} 
 else {for (i = 0; i < IP_ADDR_LEN; i++) 
 {Serial.print(connection_info.ip_address[i]);
 if ( i < IP_ADDR_LEN - 1 ) {Serial.print(".");}
 }
 Serial.println(" ist aktuelle IP-Adresse"); 
 }
 
 if (client.connect(ccu, 8181)) {} // Make a TCP connection to remote host
 else {Serial.println("connection failed");} // if you didn't get a connection to the server:
 client.stop();
 
 
}
//************************************************************************************************** 
//************************************************************************************************** 
void loop() 
{complete_loop = 0;
 if (millis() > next_full_loop) //mindestens jede Stunde eine komplette Aktualisierung
 {complete_loop = 1; next_full_loop = millis() + delta_time; 
 if (next_full_loop < millis()) {complete_loop = 0;} //wichtig wegen Zahlensprung von millis() alle 50 Tage
 } 
 for (int i = 2; i < 70; i++) //behandlung aller Ports D2 bis D69 
 {if (i== 30) {i = 54;} // unbenutzte pins überspringen
 
 //************************************************************************************************** 
 if (iomodus_D[i] == 1) //behandlung digitaleingänge 
 {pinMode(i, INPUT_PULLUP); 
 digitalWrite(i, HIGH);
 value =digitalRead(i);
 if ((!value == last_digital_value_D[i]) || complete_loop) 
 {I = String(i);
 befehl = "GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + "D" + I + "').State(" + value + ")";
 set_sysvar();
 last_digital_value_D[i] = value;
 } 
 }
//************************************************************************************************** 
 if (iomodus_D[i] == 3) //behandlung onewire 
 {pinMode(i, INPUT_PULLUP);
 digitalWrite(i, HIGH);
 OneWire ds(i); 
 #define DS18S20_ID 0x10
 #define DS18B20_ID 0x28 
 
 byte present = 0;
 byte data[12];
 byte addr[8];
 temp_tur = 1000.0;
 if (!ds.search(addr)) { ds.reset_search(); temp_tur = -1000.0; } //find a device
 if ((OneWire::crc8( addr, 7) != addr[7]) && (temp_tur > -1000.0)) {temp_tur = -1000.0; }
 if ((addr[0] != DS18S20_ID && addr[0] != DS18B20_ID)&& (temp_tur > -1000.0)) {temp_tur = -1000.0;}
 if (temp_tur > -1000.0) 
 {ds.reset(); 
 ds.select(addr); 
 ds.write(0x44, 1); // Start conversion
 delay(850); // Wait some time...
 present = ds.reset(); 
 ds.select(addr);
 ds.write(0xBE); // Issue Read scratchpad command
 for ( int k = 0; k < 9; k++) { data[k] = ds.read(); } // Receive 9 bytes
 temp_tur = ( (data[1] << 8) + data[0] )*0.0625; // Calculate temperature value 18B20
 //temp_tur = ( (data[1] << 8) + data[0] )*0.5 // Calculate temperature value 18S20
 }
 if ((temp_tur > (last_value_D[i] + delta_onewire)) 
 || (temp_tur < (last_value_D[i] - delta_onewire)) || complete_loop) 
 {I = String(i);
 befehl = "GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + "D" + I + "').State(" + temp_tur + ")";
 set_sysvar();
 last_value_D[i] = temp_tur;
 } 
 }
//************************************************************************************************** 
 if (iomodus_D[i] == 4) //behandlung DHT temperatur- und feuchtesensoren
 {DHT dht(i, DHT22); //je nach verwendetem sensor "DHT11" oder "DHT22" (AM2302) oder "DHT 21" (AM2301)
 dht.begin();
 //delay(2000); // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
 time_DHT = millis() +2000;
 while (millis() < time_DHT) {datenempfang();} //wahrend der 2s wartezeit, daten empfangen
 humidity = dht.readHumidity(); // Read temperature as Celsius
 temp_tur = dht.readTemperature(); 
 if (isnan(humidity) || isnan(temp_tur) ) // Check if any reads failed and 
 { //Serial.println("Failed to read from DHT sensor!");
 temp_tur = -1000;
 }
 if ((temp_tur > (last_value_D[i] + delta_DHT)) || (temp_tur < (last_value_D[i] - delta_DHT)) || complete_loop) 
 {I = String(i);
 befehl = "GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + "D" + I + "').State(" + temp_tur + ")";
 set_sysvar();
 befehl = "GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + "D" + I + "1').State(" + humidity + ")";
 set_sysvar();
 last_value_D[i] = temp_tur;
 } 
 } 
 //************************************************************************************************** 
 if (iomodus_D[i] == 5) //behandlung ultraschallsensoren achtung: zu beachten 
 //bei verwendung der US-Sensoren beim IO-Shield-Plus sind die 150-Ohm-Schutzwiderstände 
 //zu überbrücken , entsprechend beim IO-Shield20 der digitale Jumper 4-5 zu setzen!! 
 {NewPing sonar(i, i, 200); // NewPing setup of pin and maximum distance.
 unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS).
 int cm = uS / US_ROUNDTRIP_CM;
 if ((cm > (last_value_D[i] + delta_us)) || (cm < (last_value_D[i] - delta_us)) || complete_loop) 
 {I = String(i);
 befehl = "GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + "D" + I + "').State(" + cm + ")";
 set_sysvar();
 last_value_D[i] = cm;
 } 
 } 
//************************************************************************************************** 
 if (iomodus_D[i] == 10) //behandlung analogeingänge 
 {analogwert =analogRead(i); 
 if ((analogwert > (last_value_D[i] + delta_analog)) || (analogwert < (last_value_D[i] - delta_analog)) || complete_loop) 
 {I = String(i);
 befehl = "GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + "D" + I + "').State(" + analogwert + ")";
 set_sysvar();
 last_value_D[i] = analogwert;
 } 
 } 
//**************************************************************************************************
 if (iomodus_D[i] == 11) //behandlung NTC 
 {Rt = Rv/((1024.0/analogRead(i))- 1.0);
 tempNTC = (B_wert * Tn / ( B_wert + (Tn * log(Rt/Rn)))) -Tn +25.0 ;
 if ((tempNTC > (last_value_D[70] + delta_ntc)) || (tempNTC < (last_value_D[70] - delta_ntc)) || complete_loop) 
 {I = String(i);
 befehl = "GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + "D" + I + "').State(" + tempNTC + ")";
 set_sysvar();
 last_value_D[i] = tempNTC;
 } 
 } 
//************************************************************************************************** 
 if (iomodus_D[i] == 6) //behandlung impulszahler D2,D3,D21,D20,D19,D18 
 {byte offset =23;
 if (i ==2) {offset = 4;} if (i ==3) {offset = 6;}
 zaehlwert = pulsecounter[offset - i ] / pulsedivider[offset - i ];
 if ((pulsedivider[offset -i] > 0) && ((zaehlwert > (last_zaehlwert[offset - i]+ delta_counter) || complete_loop))) 
 {I = String(offset -i);
 befehl = "GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + "imp" + I + "').State(" + zaehlwert + ")";
 set_sysvar();
 last_zaehlwert[offset - i] = zaehlwert;
 } 
 } 
//**************************************************************************************************
//behandlung Luxmeter BH1750 an SCL pin21 und SDA pin 20
// for normal sensor resolution (1 lx resolution, 0-65535 lx, 120ms, no PowerDown) use: sensor.begin(RESOLUTION_NORMAL, false); 
 if ((iomodus_D[20] == 1) && (iomodus_D[21] == 1) && (iomodus_lux ==1))
 {if(!sensor.begin()) { Serial.println("Sensor not present"); }
 float lux = sensor.readLightLevel(); delay(1000);
 Serial.print("Helligkeit/lux: "); Serial.print(lux); Serial.println();
 if ((lux > (last_lux_value + delta_lux)) || (lux < (last_lux_value - delta_lux)) || complete_loop) 
 {befehl = "GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + "lux" + "').State(" + lux + ")";
 set_sysvar();
 last_lux_value = lux;
 } 
 } 
//**************************************************************************************************
//behandlung barometer BMP180 an SCL pin21 und SDA pin 20
 if ((iomodus_D[20] == 8) && (iomodus_D[21] == 8)&& (iomodus_baro ==1))
 {if (pressure.begin()) {status = pressure.startTemperature();}
 if (status) {delay(status); status = pressure.getTemperature(T);} //messung T
 if (status) {status = pressure.startPressure(3);} // //messung P mit resolution 0 bis 3
 if (status) {delay(status); status = pressure.getPressure(P,T);}
 if (status) {p0 = pressure.sealevel(P,ALTITUDE);} // umrechnung auf N.N.
 Serial.print("Hoehe/m: "); Serial.print(ALTITUDE); Serial.print(" Temperatur/C: "); Serial.print(T); Serial.print(" Normaldruck /mb: "); Serial.println(p0); 
 if ((p0 > (last_baro_value + delta_baro)) || (p0 < (last_baro_value - delta_baro)) || complete_loop) 
 {befehl = "GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + "baro" + "').State(" + p0 + ")";
 set_sysvar();
 last_baro_value = p0;
 }
 if ((T > (last_baroT_value + delta_baroT)) || (p0 < (last_baroT_value - delta_baroT)) || complete_loop) 
 {befehl = "GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + "baroT" + "').State(" + T + ")";
 set_sysvar();
 last_baroT_value = T;
 }
 }
 }
//**************************************************************************************************
 if (iomodus_D[3] == 7) //behandlung 433Mhz-rx 
 {if (mySwitch.available()) 
 {int value = mySwitch.getReceivedValue();
 if (value == 0) {client.print("Unknown encoding");} 
 else {Serial.print("Pin D3 received : ");
 Serial.print (mySwitch.getReceivedValue() );
 Serial.print (" / ");
 Serial.print( mySwitch.getReceivedBitlength() );
 Serial.print("bit Protocol: ");
 Serial.println( mySwitch.getReceivedProtocol() + " \n\r" );
 }
 mySwitch.resetAvailable();
 }
 } 
//**************************************************************************************************
 
datenempfang(); 
} 
 
//##############################################################
//##############################################################
void datenempfang() //Unterprogramm datenempfang: daten von ccu an homeduino
{command = ""; 
 
 //EthernetClient client = server.available();   //mit W5100
 SFE_CC3000_Client client = SFE_CC3000_Client(wifi);   //mit CC3000
 
 if (client) 
 { // an http request ends with a blank line
 boolean currentLineIsBlank = true;
 while (client.connected())
 {if (client.available()) 
 {char c = client.read();
 if (reading && c == ' ') reading =false;
 if (c == '?') reading = true; // beginn der Befehlssequenz 
 if (reading) 
 {//read char by char HTTP request
 if (command.length() < 100) 
 { //store characters to string
 command = command + c;
 }
 } 
 if (c == '\n' && currentLineIsBlank) break;
 if (c == '\n') {currentLineIsBlank = true;} 
 else if (c != '\r') { currentLineIsBlank = false;}
 } 
 } 
 client.println(command);
 delay(1); 
 client.stop();
//**************************************************************************************************
 if (command.length() > 2) //behandlung Datenempfang: port auf 0 / 1 setzen 
 {Serial.println(command); //empfangenen befehl ausgeben
 client.print(command); 
 //befehl dekodieren 
 int colonPosition = command.indexOf(':');
 sub_command = command.substring(2,colonPosition); //portpin erkennen
 Serial.print("D" + sub_command + " :");
 port_pin = sub_command.toInt();
 command = command.substring((colonPosition+1)); //Rest-command bilden
 if ((iomodus_D[port_pin] == 2) && (command == "0")) 
 {pinMode(port_pin, OUTPUT); digitalWrite(port_pin, LOW); Serial.println(command);}
 if ((iomodus_D[port_pin] == 2) && (command == "1")) 
 {pinMode(port_pin, OUTPUT); digitalWrite(port_pin, HIGH); Serial.println(command);}
 if ((iomodus_D[port_pin] == 7) && (port_pin ==4)) 
 { rf_send(command); Serial.println(command);} 
 if ((iomodus_D[port_pin] == 5) && (port_pin ==9)) 
 { ir_send(command); Serial.println(command);} 
 
 }
 
 } 
} 
//##############################################################
void set_sysvar() // subroutine HTTP request absetzen:
{ //while (millis() < next_tx) {} //warten bis time > next_tx oder timeout
 next_tx = millis() +delta_tx;
 if (client.connect(ccu, 8181)) 
 {Serial.println(befehl);
 client.println(befehl);
 client.println();
 client.stop();
 }
}
//##############################################################
void rf_send(String rf_command) // subroutine rf telegramm senden
{
 }
//##############################################################
void ir_send(String ir_command) // subroutine ir telegramm senden
{
 }
 
//##############################################################
//hier sind die interrupt-service-routinen fuer die impulszaehler
void ISR_0() //Interrupt an D2
{pulsecounter[0]++;}
 
void ISR_1() //Interrupt an D3
{pulsecounter[1]++;}
 
 
void ISR_2() //Interrupt an D21
{pulsecounter[2]++;}
 
void ISR_3() //Interrupt an D20
{pulsecounter[3]++;}
 
void ISR_4() //Interrupt an D19
{pulsecounter[4]++;}
 
void ISR_5() //Interrupt an D18 
{pulsecounter[5]++;}

 

 

Damit ist es jetzt möglich, auch Daten von der CCU  an den Homeduino zu senden, um beispielsweise einen beliebigen Port zu setzen. Der Weg zurück erfolgt automatisch, indem bei Veränderung der Sensorsignale die korrespondierenden Systemvariablen gesetzt werden.

Eine detaillierte Anleitung und Beschreibung erfolgt später. Wichtig: Gegenüber den bisherigen Versionen wurde aus verschiedenen Gründen die Portbezeichnung und die Port-Funktionskennung geändert. Mein aktueller Homeduino heißt homeduino_xyz. Wichtig bei der richtigen Benennung der verwendeten Systemvariablen !

 

Ein Beispiel für ein HM-Skript, mit dem man einen Ausgang auf dem Homeduino schalten kann ist hier:

 

var send_data = "homeduino_xyz/D9:0"; !##########################
!beim  "homeduino_xyz"  Pin D9 auf 0 / 1 setzen #####  Stand 12.04.2015  stall.biz  
integer word_position = send_data.Find("/");
var h_duino = send_data.Substr(0, word_position) + "_IP";
h_duino = dom.GetObject(h_duino).State();
send_data = "http://" + h_duino + "/?" + send_data.Substr(word_position+1, 30);
string stdout;
string stderr;
 
!verwendung system.Exec
!system.Exec("wget -q -O - '"#send_data#"'", &stdout, &stderr);
 
!verwendung CUxD
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -q -O - '"#send_data#"'");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
stdout = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
 
!fehler behandlung fehlt noch
boolean fehler = 1;
if (stdout.Length() >0) {fehler =0;} 
dom.GetObject("CUxD.CUX2801001:1.SYSLOG").State("eine Statusmeldung");

 

Wichtig:
Die neue Homeduino 3.0 Software ist sowohl für das
>>> Basis-Shield  IO-Shield20 als auch für das …
>>> Ergänzungs-Shield IO-Shield-Plus geeignet!

Rückmeldungen und Erfahrungen sind willkommen.

Haftungs- und Sicherheitshinweise

Beim Nachbau müssen natürlich alle wichtigen einschlägigen Sicherheitsvorschriften für den Umgang mit gefährlichen Spannungen  eingehalten werden. Fundierte theoretische und praktische Fachkenntnisse der Elektrotechnik und für den Umgang mit gefährlichen Spannungen sind unverzichtbar!!

Durch eine unsachgemäße Installation gefährden Sie ihr Leben und das Leben ihrer Mitmenschen! Darüberhinaus riskieren Sie erhebliche Sachschäden , welche durch Brand etc. hervorgerufen werden können ! Für alle Personen- und Sachschäden durch falsche Installation etc. ist nicht der Hersteller sondern nur der Betreiber verantwortlich.

Ich verweise hier unbedingt auf  die  „Sicherheitshinweise und Haftungsausschluss„-Seite dieses Blogs.

 

 

 

IO-Shield-Plus … mehr Inputs und integriertes WLAN

IO-Shield-Plus … mehr Inputs und integriertes WLAN

Vorgeschichte:

Auf dieser Webseite sind verschiedene Bauanleitungen mit Verwendung der äußerst vielseitigen und preiswerten Arduino-Module im Zusammenspiel mit der  Homematic vorgestellt. Zur einfachen Anwendung auch für den weniger versierten Elektroniker ist ein sehr praktisches Anschlußboard IO-Shield20  entstanden.  In Verbindung mit der kostenlosen Homeduino Software  lassen sich damit eine Vielzahl von Sensoren über einfache Schraubklemmen anschließen und die Sensorsignale über LAN oder WLAN an die Homematic übertragen. . Mehr dazu hier:

https://www.stall.biz/?project=der-homeduino-2-0-als-vielseitiges-lanwlan-sensormodul-fur-die-homematic

https://www.stall.biz/?project=vielseitiges-io-shield-board-2-0-fur-fast-alle-arduinos

Der Vorteil bei Verwendung des IO-Shield-Plus als Homeduino-Sensormodul ist, daß auf der Homematic keinerlei komplizierte Skripte o.ä. installiert werden müssen. Lediglich ist für jede Meßgröße eine entsprechende Systemvariable in der CCU festzulegen. Die Aktualisierung mit den Meßwerten aus dem Homeduino erfolgt automatisch, aber nur wenn  sich der Meßwert ändert. Damit entsteht ein sehr geringer Traffic im Netz, was insbesondere bei vielen Homeduinos von Vorteil ist.

Warum ein weiteres IO-Shield ?

Das hier vorgestellte  IO-Shield-Plus ist nicht ein Ersatz für das bisherige IO-Shield20, sondern eine wichtige Ergänzung. Dabei spielt eine wesentliche Rolle, daß für die Verwendung von weiteren Shields beispielsweise zur  LCD-Anzeige und zur Bereitstellung des WLAN oft recht viele Pins des Standard-Arduino-Pinouts für den Betrieb des Shields belegt werden. Für die eigentliche Automatisierungsaufgabe bleiben dann oft nur wenige Funktionspins übrig. Aber gerade beim MEGA2560 sind ja noch viele IO´s auf dem hinteren Teil der Platine verfügbar, die mit diesem Erweiterungsshield an Schraubklemmen verfügbar gemacht werden können. Vorne lassen sich  dann Shields beispielsweise für ein alphanumerisches Display oder ein Touch-Display aufstecken. Weiter unten sind Beispiele für typische Konfigurationen.

Eigenschaften des IO-Shield-Plus

Das IO-Shield-Plus wird mit Stiftleisen auf die hinteren Pins des MEGA2560 aufgesteckt. Mittels Schraubklemmen lassen sich verschiedene Sensoren anschließen. Für die  WLAN-Module sind Steckplätze vorhanden. Man kann dort das sehr leistungsfähige Wifi-Modul CC3000 von Texas Instruments und das besonders preisgünstige Modul ESP8266-01 einstecken. Das folgende Bild  zeigt das IO-Shield-Plus von der Bestückungsseite:

platine2

Alle Inputs sind mit 150Ohm-Widerständen gegen Kurzschluß geschützt. Für mögliche Störprobleme bei längeren Sensorleitungen lassen sich an den Inputs keramische Kondensatoren nachträglich einlöten. Ein 3,3V-Spannungsregler versorgt aktuell das Wifi-Modul, kann aber auch zur Versorgung von anderen 3.3V-Verbrauchern verwendet werden. Für den Anschluß der potentialfreien S0-Schnittstellen sind 4 Optokoppler ebenfalls auf der Platine.

Hier die Eigenschaften des IO-Shield-Plus im Detail:

  •   insgesamt 24  digital und analog nutzbare Funktionsports  werden insgesamt nach außen auf Schraubklemmen geführt  . Diese Inputs sind individuell aufgeteilt nutzbar als…
  •  24   digitale Inputs
  •     4   Impulseingänge direkt oder über Optokoppler (S0-Schnittstellen) ,
    (in Verbindung mit dem CC3000 sind nur 3 Impulseingänge verfügbar)
  •    8   analoge Inputs  mit Eingangsspannung alle von 0 bis 5V oder 0 bis 1V (wenn Uref umgeschaltet wird )
  •    8   NTC-Temperatursensoren 10kOhm  mit über Jumper zuschaltbarem 10kOhm-Widerstand
  •  24   1Wire-Temperatursensoren  DS18B20
  •  24   DHT-22 digitale Temperatursensoren
  •  24   Ultraschallsensoren

Da IO-Shield-Plus hat eine Größe von 100mm x 55mm und kann mit den Stiften auf der Unterseite direkt auf die entsprechenden Buchsenleisen des MEGA2560 aufgesteckt werden. Dabei läßt sich das Shield alleine betreiben aber auch in Kombination mit dem universellen IO-Shield20:

Folie7

 

Anwendungsmöglichkeiten

Natürlich läßt sich das Shield ganz normal in einem StandAlone-Arduino betreiben, um etwas zu steuern und zu regeln. Aber bei der Auslegung des IO–Shield-Plus wurde besonderer Wert auf eine einfache Anbindung über WLAN an die CCU der Homematic gelegt. Deswegen sind Stecksockel für geeignete Wifi-Module auf dem Board, so daß sehr einfach eine WLAN-Funktionalität erreicht werden kann. Damit bleibt der „normale“ Steckplatz für andere Shields frei und somit eröffnen sich flexible Kombinationsmöglichkeiten mit vielen Standard-Shields. Die folgenden Bilder sollen dazu einen Eindruck verschaffen:

Folie8

 

Folie5

 

Folie6

 

 

Installation des WLAN-Moduls CC3000

Als Wifi-Module können der CC3000 von Texas Instruments verwendet werden , aber auch der sehr preisgünstige Chip ESP8266-01 eines chinesischen Herstellers. Die Steuerung des CC3000 erfolgt über die sog. SPI-Schnittstelle, welche  auf dem MEGA2560 mit den Datenpins D50 bis D53 verfügbar ist. Zusätzlich werden noch die Pins D46 und D18 verwendet. Dabei ist zu beachten, daß der D18 im IO-Angebot des IO-Shields-Plus  nicht mehr für eine Zählerfunktion o.ä. verwendet werden kann.

Das CC3000-Modul ist als sog. Breakout in einschlägigen meist chinesischen Internet-Shops bereits für etwa 20€ verfügbar. Suchbegriff z.B. bei Aliexpress oder ebay „cc3000  breakout“.

Das Breakout-Modul ist nahezu fertig; es muß lediglich die mitgelieferte Stiftleiste eingelötet werden. Dabei hat man die Wahl, die Stiftleisten auf der  Rückseite oder der Bestückungsseite einzulöten. Dementsprechend zeigt das Modul später im eingesteckten Zustand auf dem Board nach hinten oder nach vorn. Ich habe die Stifte auf der Rückseite eingelötet:

cc3000_hand

Zusammenbau des IO-Shield-Plus

Das IO-Shield-Plus ist  in meinem Shop als Bausatz erhältlich. Wegen der Verwendung von relativ großen Standardteilen kann auch ein weniger versierter Elektronikbastler das Board einfach montieren und verlöten. Das folgende Bild zeigt die Stückliste und den Einbau der Einzelteile:

IO_plus_bestueck

 Anschlussschema

Der Anschluss der Sensoren und Module erfolgt im wesentlichen mit den vielen verfügbaren Schraubklemmen. Für die analogen Eingänge sind noch per Jumper zuschaltbare 10kOhm-Pullups vorhanden, was für die einfache Aplikation von 10kOhm-NTC-Thermosensoren hilfreich ist. Auch typische Sensoren mit Pullup-Bedarf wie der digitale Temperatursensor DS 18B20  kann ohne Zusatzbauelemente an den Pins A08 bis A15 betrieben werden.

Für Anschluß von verbreiteten Modulen mit I2C-Bus ist auch ein Lötanschluß verfügbar. Der auf dem Board integrierte 3,3V-Spannungsregler ist auch für Module verwendbar, wenn zur Kommunikation der ESP8266 nicht verwendet wird.

Die Wlan-Module haben beide einen Steckanschluss und müssen einfach nur seitenrichtig eingesteckt werden.

Der Rest wird mit der Homeduino-Software eingestellt und konfiguriert.

Zur Hilfestellung beim Zusammenbau gibt´s auch eine Bauanleitung : Bauanleitung_shield_plus

Viel Spaß und Erflog mit dem Teilchen :))

Folie2

 

 

 Wo bekommt man das IO-Shield-Plus?

Wer das IO-Shield-Plus nachbauen möchte, kann über meinen Webshop einen Bausatz mit allen Teilen außer dem Wifi-Modul beziehen. Der Zusammenbau ist einfach, da nur relativ große Standardteile verlötet werden müssen.

https://www.stall.biz/?post_type=product&p=1634

Haftungs- und Sicherheitshinweise

Beim Nachbau müssen natürlich alle wichtigen einschlägigen Sicherheitsvorschriften für den Umgang mit gefährlichen Spannungen  eingehalten werden. Fundierte theoretische und praktische Fachkenntnisse der Elektrotechnik und für den Umgang mit gefährlichen Spannungen sind unverzichtbar!!

Durch eine unsachgemäße Installation gefährden Sie ihr Leben und das Leben ihrer Mitmenschen! Darüberhinaus riskieren Sie erhebliche Sachschäden , welche durch Brand etc. hervorgerufen werden können ! Für alle Personen- und Sachschäden durch falsche Installation etc. ist nicht der Hersteller sondern nur der Betreiber verantwortlich.

Ich verweise hier unbedingt auf  die  „Sicherheitshinweise und Haftungsausschluss„-Seite dieses Blogs.

 

 

 

 

USV für Homematic-CCU2 und Raspberry  mit wirkungsvollem Überspannungsschutz

USV für Homematic-CCU2 und Raspberry mit wirkungsvollem Überspannungsschutz

Motivation für eine unterbrechungsfreie Stromversorgung (USV) ?

Das Stromnetz ist in den meisten Gegenden Deutschland eine relativ zuverlässige Sache. Langanhaltende Stromunterbrechungen sind sehr selten. Aber kurze Stromunterbrechungen sind gar nicht so selten. Beispielsweise habe ich in meiner Wohnung eine GSM-Schaltbox, die per SMS geschaltet werden kann. Funktioniert recht gut, hat aber nur einen Nachteil, daß bei jeder kleinsten Stromunterbrechung eine Info-SMS abgeschickt wird. Seit Beginn des Jahres habe ich schon mehr als 10 solcher SMS bekommen !! Und das scheint wohl auch so richtig zu sein, denn wenn man diesen Artikel liest:
http://vik.de/pressemitteilung/items/aktuelle-vik-untersuchung-zeigt-stromversorgungsqualitaet-unter-hohem-druck-mehr-als-90-prozent-der-stromunterbrechungen-werden-.html
dann ist eine kurze  Stromunterbrechung ein gar nicht seltenes Phänomen. Darüberhinaus scheinen neben dem eigentlichen Stromausfall auch andere Probleme wie Überspannung, Unterspannung, Spannungsspitzen und hochfrequente Steuersignale zu stromausfallähnlichen Störungen zu führen. Deshalb habe ich mich entschieden, auch für meine Homematic eine sog. „unterbrechungsfreie Stromversorgung“ anzuschaffen, die genau diese Probleme beseitigen soll.

Welcher Energiespeicher für die USV?

Nach umfangreicher Google-Befragung und der verschiedenen Diskussionen  zum Thema USV im Homematic-Forum  z.B. hier : http://homematic-forum.de/forum/viewtopic.php?f=31&t=17398&start=30&hilit=usv  habe ich eine eigene USV mit Verwendung von Supercaps gebaut. Der Grund für Supercaps war die erkennbaren Lebensdauer Probleme mit chemischen Energiespeicher wie Bleibatterien, NiMH- und Lithium-Akkus bei einer notwendigen Dauerladung des Energiespeichers. Und da mittlerweile die Supercaps oder Doppelschicht-Kondensatoren sowohl preislich als auch größenmäßig sehr günstig geworden sind, habe ich mich für diese Art des Energiespeichers entschieden. In der stillen Hoffnung, daß diese Energiespeicher eine deutlich höhere Lebensdauer besitzen und keinerlei Wartung benötigen 😉

Die Schaltung

Allerdings hat so ein Kondensator anwendungstechnisch seine Tücken, weil die Spannung quadratisch mit dem Energieinhalt abnimmt. Demgegenüber haben die chemischen Akkus über einen weiten Energiebereich eine fast konstante Spannung! Um also die Energie eines Kondensators gut auszunutzen ist ein Spannungswandler (DC/DC-Konverter)  erforderlich, der den relativ großen Spannungshub des Speicherkondensators in eine konstante Spannung (bei uns 5V) umsetzen kann.Das folgende Bild zeigt den Schaltplan meiner  5V-USV:

usv_CCU2_1

Von dem Netzteil wird die USV mit 5V versorgt. Über eine Schottky-Diode mit nur 0,3V Spannungsabfall wird ein sog. Step-up DC/DC Konverter angesteuert, der daraus eine konstante Spannung von 5V macht. Das funktioniert mit dem von mir eingesetzten Modul selbst bei Eingangsspannungen bis runter  zu etwa 1,5V erstaunlich gut! Allerdings sollte man exakt das gleiche Modul verwenden, weil es sehr unterschiedlich leistungsfähige DC/DC-Konverter im Markt gibt. Dazu habe ich bestimmt 5 verschiedene solcher Fertigmodule (sog. Breakouts) detailliert durchgemessen. Das beste Modul war das hier im Bild gezeigte Modul aus der „Bucht“: http://www.ebay.de/itm/400770776961?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT oder Suchen nach Stichworten wie:  „Step Up Power Supply Module“

Für die Überbrückung des Stromausfalls werden insgesamt vier 100F(!) Doppelschicht-Kondensatoren eingesetzt. Da diese normalerweise nur 2,7V ertragen, sind sie für eine 5V-Versorgung entsprechend dem Schaltplan in Reihe verschaltet. Zusätzlich sind zur sog. Symmetrierung noch Widerstände und Zenerdioden notwendig. Die Zuschaltung bei Stromausfall erfolgt automatisch mit der zweiten Schottky-Diode vom Typ BYV10.

Zum Überspannungsschutz ist eine wirkungsvolle sog. Suppressordiode vom Typ 1N5908 eingebaut. Damit und in Verbindung mit dem DC/DC Konverter dürften Überspannungen aus dem Netz kaum zur CCU „durchschlagen“. Angezeigt wird der Status der USV mit einer DUO-LED. Leuchtet sie gelb, dann  ist alles o.k. bzw. die CCU2 wird mit 5V versorgt und vom Netzteil sind auch 5V da. Leuchtet sie rot, dann ist die Netzversorgung ausgefallen.

Eingebaut habe ich dieSchaltung in ein Kleingehäuse. Eine gedruckte Platine lohnt bei den  wenigen Bauteilen wohl kaum! Für den versierten Elektroniker ist der Aufbau sicher kein Problem. Aber bei der Verschaltung der Supercaps darauf achten, daß sie über einen Widerstand vorher entladen wurden, weil sonst Kurzschlüsse etc. zu einer Beschädigung führen können. Das ist genauso wie bei Akkus!
gehaeuse1

Etwas Theorie

Die Energie des Kondensators nimmt während des Entladens näherungsweise linear ab (siehe blaue Kennlinie im nachfolgenden Bild). Die auf 5V aufgeladenen Kondensatoren können theoretisch die CCU2 etwa 10min versorgen. Mit Verlusten und mit Berücksichtigung einer für den DC/DC-Konverter noch gut verwertbaren Minimalspannung von 2.0V ist zwar nicht die gesamte Kondensatorenergie nutzbar, aber  bei der hier gewählten Konstellation sind doch beachtliche  84% der Kondensatorenergie zur Notstromversorgung nutzbar!

entladekurve2
Meßergebnisse

Letztlich entspricht die theoretische Entladekurve auch dem praktischen Entladeverhalten. In Verbindung mit der CCU2 kann eine Zeit von 9 Minuten überbrückt werden, wenn die Kondensatoren vorher vollgeladen sind. Meßwerte für einen Raspberry-Notbetrieb habe ich noch nicht ermittelt. … wird wohl etwas weniger sein!

 

Update: Mit preisgünstigen „super capacitors“ mit 500F (2 Stück für 10€!) wären sogar deutlich mehr als 20 Minuten möglich!
http://de.aliexpress.com/item/Free-Shipping-2pcs-Super-Capacitor-Black-2-7V-500F-Farad-Capacitor-Power-Capacitor-10001/32292279913.html?recommendVersion=1

 

Haftungs- und Sicherheitshinweise

Beim Nachbau müssen natürlich alle wichtigen einschlägigen Sicherheitsvorschriften für den Umgang mit gefährlichen Spannungen  eingehalten werden. Fundierte theoretische und praktische Fachkenntnisse der Elektrotechnik und für den Umgang mit gefährlichen Spannungen sind unverzichtbar!!

Durch eine unsachgemäße Installation gefährden Sie ihr Leben und das Leben ihrer Mitmenschen! Darüberhinaus riskieren Sie erhebliche Sachschäden , welche durch Brand etc. hervorgerufen werden können ! Für alle Personen- und Sachschäden durch falsche Installation etc. ist nicht der Hersteller sondern nur der Betreiber verantwortlich.

Ich verweise hier unbedingt auf  die  „Sicherheitshinweise und Haftungsausschluss„-Seite dieses Blogs.

 

Impulsgeber für den Wasserzähler selbst gebaut

Impulsgeber für den Wasserzähler selbst gebaut

Warum ein Impulsgeber für den Wasserzähler so schwierig ist!

Im Rahmen der Hausautomation ist die Information über die aktuellen Verbräuche von Strom,Gas und Wasser relativ wichtig, weil diese  Signale für verschiedenste Steuerungs- und Regelmechanismen notwendig sind. Zwar gibt es heute bereits schon entsprechende Zähler mit Impulsausgängen, aber vielfach sind noch alte Geräte eingebaut, die nur mehr oder weniger aufwendig mit geeigneten Impulsgebern ausgerüstet werden können.
Bei den Stromzählern kann man mit Reflex-Lichtschranken die rote Markierung auf der Drehscheibe abtasten und als Impulssignal weiter berarbeiten. Entsprechende Fertiggeräte gibt es bereits für diese Aufgabe und im Internet kursieren auch viele Bauanleitungen zum Selbstbau.
Bei den Gaszählern ist oft schon ein Magnet im Zählwerk vorhanden, der mit einem Reedschalter als Impulsgeber sehr einfach „digitalisiert“ werden kann.
Problematisch ist die Nachrüstung der Wasserzähler, da in der Wasseruhr die Zeiger sehr klein sind und auch die Zahnscheibe eine äußerst kleine Verzahnung hat, die mit Reflexions-Lichtschranken ohne spezielle Optik kaum zu detektieren sind.
Ich habe dazu verschiedene Versuche mit einer Infrarot Reflexions-Lichtschranke gemacht, wie sie u.a. für Stromzähler verwendet werden. Diese Sensoren werden im Internet für wenige Euros als sog. Breakouts (das sind kleine Platinen) verkauft. Das Ergebnis der Versuche mit diesen Sensoren war immer, daß die Justage extrem empfindlich und eigentlich kein reproduzierbar stabiles Impulssignal erreichbar ist.
Weitere Tests mit preiswerten Lasermodulen ergaben zwar deutlich bessere Ergebnisse, aber die Laserdioden haben meist nicht lange im Dauerbetrieb gehalten! Nach dem gleichen Prinzip arbeiten professionelle Laser-Reflexionssensoren wie der  SunX EX-26B, mit dem lt. einem Internetbeitrag wohl eine Abtastung des Wasserzählers möglich sein soll.

Wenn man die  zu dem Thema veröffentlichten Artikel zusammenfaßt, dann ist die Nachrüstung des Wasserzählers offensichtlich ein relativ schwieriges Problem. Und ich kann nach den eigenen Versuchen dies nur bestätigen!

(M)ein Lösungsansatz

Geht man wieder zurück zu der Lösung, die einem normalerweise bei dieser Meßaufgabe einfällt, dann ist man wieder wieder bei der  Infrarot-Reflexions-Lichtschranke. Die hat aber beim Wasserzähler bisher nicht richtig funktioniert, weil zu kleine Zeiger  usw. zu einem zu kleinen Nutzsignal führten.

Also was kann man tun, um das Nutzsignal zu verbessern ?
1. Man kann die Fotodiode besser fokussieren entweder mit einer Optik ( zu aufwendig!) oder mit einer Lochblende.
Ich habe dafür ein längeres Röhrchen gewählt, in das die Fotodiode eingeklebt ist.
2. Man kann die roten Zeiger mit einem Licht bestrahlen, was die Komplementärfarbe hat. Bei rot wäre das grünes Licht, was mit einer entsprechenden LED einfach darstellbar ist.

Erste Versuche mit dem grünen Licht anstelle dem infrarotem Licht waren erstaunlich besser. Die Zeiger sind mit der grünen Beleuchtung fast schwarz gegenüber dem weißen Hintergrund und haben offensichtlich einen viel besseren Kontrast. Deshalb wurde auf Basis dieser beiden Ansätze der folgende Impulsgeber  konzipiert. Hier das Kochrezept zum Nachbau:

Die elektronische Hardware

Man besorgt sich eine sog. Infrarot Reflexions-Lichtschranke. Anbieter findet man u.a. bei ebay mit den Stichworten “ TCRT5000 reflective module“. Dieses Modul hat eine Infrarot LED und eine Infrarot Photodiode, die wir für unseren Einsatz entfernen müssen. Man kann sie auslöten oder einfach mit einem Seitenschneider wegklipsen. Zur besseren Signalverarbeitung müssen wir noch einen 10kOhm SMD-Widerstand  ablöten oder wegschneiden. Im folgenden Bild sind die Änderungen erkennbar:

wasser_1

Dann brauchen wir noch eine grüne 3mm-LED und einen Phototransistor vom Typ Osram „SFH 309-5“ und verschalten das ganze entsprechend dem Schaltplan im oberen Bild.

Übrigens den Schaltplan zum Modul findet man aktuell hier:
http://www.google.de/imgres?imgurl=http%3A%2F%2Fg04.s.alicdn.com%2Fkf%2FHT1fT8kFGpbXXagOFbXP%2F220671527%2FHT1fT8kFGpbXXagOFbXP.jpg&imgrefurl=http%3A%2F%2Fwww.alibaba.com%2Fproduct-detail%2FTCRT5000-IR-Barrier-Line-Track-sensor_1800749503.html&h=586&w=750&tbnid=BdcAZhuLe2NkWM%3A&zoom=1&docid=zZ3LYeDVN9vQ8M&ei=nObpVNuOMImiygOY14HoBg&tbm=isch&iact=rc&uact=3&dur=4230&page=3&start=112&ndsp=62&ved=0CH4QrQMwKDhk

 

Die Mechanik

Die mechanische „Verpackung“ der grünen LED und des Phototransistors ist im folgenden Bild erklärt. Für die Aufnahme des Phototransistors habe ich ein 40mm langes Messingröhrchen mit Durchmesser 6mm (Baumarkt) verwendet, das zusmmen mit der seitlich angeordneten grünen Led in eine 17er-Mutter mit Sekundenkleber eingeklebt wird. Ggf. muß das Gewinde mit einem 10er-Bohrer aufgebohrt werden. LED und Phototransistor werden entsprechend dem Schaltplan verlötet und die Leitungen mit Schrumpfschluch o.ä. isoliert. Das folgende Bild sagt mehr als viele Worte.

wasser_2

Dann probiert man den Impulsgeber aus, um die richtige Position zu finden. Ich verwende für die Abtastung den Zeiger für die Literanzeige, d.h. eine Umdrehung entsprechen ein Liter Wasser. Man muß nun die richtige Position finden, indem man mit einem Voltmeter die Spannung am Phototransistor mißt. Das schon eine etwas diffizile Arbeit, um die richtige Position mit dem größten Spannungshub pro Umdrehung zu finden. Bei mir ist der Spannungshub etwa 0.15V bei einer mittleren Spannung von etwa 2,7 V (diese Spannung hängt von der Beleuchtungsstärke und vom Phototransistor ab!) .Aber die mittlere Spannung sollte etwa zwischen 1,5 u 3,5V liegen. In dieser Position kann nun der Impulsverstärker auf dem Breakout mit dem Trimmpotentiometer so eingestellt werden, daß die grüne LED auf dem Breakout an ist und nur wenn der Zeiger am Sensor vorbeigeht für kurze Zeit aus geht.

Jetzt muß der Sensor im Schauglas der wasseruhr so fixiert werden, daß  zuverlässig und haltbar die Meßposition eingehalten wird. Man kann den Sensor einkleben, aber das könnte Probleme mit dem Wasserwerk geben. Ich habe mit einfachen Mitteln einen schweren Einsatz gebaut: Dazu wurde die Sensormutter im Schauglas mit einer Reihe von anderen Mittern zusammen geklebt, so daß der Mutterverbund spielfrei im Schauglas sitzt. Vorher habe ich das Schauglas mit Küchenfolie abgedeckt, damit der Kleber nicht am Glas haftete.  Nachdem alles stabil ausgehärtet ist, wird der Mutternverbund mit 2-Komponenten-Kleber vergossen, so daß eine stabile und schwere Scheibe entsteht.

Wasserzaehler6

Diese Scheibe bekommt noch eine Markierung, daß man sie zum Ablesen der Wasseruhr einfach entnehmen kann und daß beim Wiedereinsetzen die Meßposition sicher eingestellt ist. Das sieht zwar recht bastelmäßig aus, aber die Funktion ist gut und nicht jeder hat eine Drehbank, um sich ggf. eine schwere Metallscheibe als Aufsatz bzw. Einsatz zu basteln.

That´s it!

Viel Erfolg beim Nachbau
… und bei der Justage nie die Geduld verlieren, weil das schon etwas Fingerspitzengefühl verlangt 😉

Haftungs- und Sicherheitshinweise

Beim Nachbau müssen natürlich alle wichtigen einschlägigen Sicherheitsvorschriften für den Umgang mit gefährlichen Spannungen  eingehalten werden. Fundierte theoretische und praktische Fachkenntnisse der Elektrotechnik und für den Umgang mit gefährlichen Spannungen sind unverzichtbar!!

Durch eine unsachgemäße Installation gefährden Sie ihr Leben und das Leben ihrer Mitmenschen! Darüberhinaus riskieren Sie erhebliche Sachschäden , welche durch Brand etc. hervorgerufen werden können ! Für alle Personen- und Sachschäden durch falsche Installation etc. ist nicht der Hersteller sondern nur der Betreiber verantwortlich.

Ich verweise hier unbedingt auf  die  „Sicherheitshinweise und Haftungsausschluss„-Seite dieses Blogs. Auch die notwendigen Eingriffe in das Wasser- und Heizungssystem dürfen nur von ausgebildeten Fachpersonal durchgeführt werden. Es sind die geltenden Sicherheitsvorschriften und dieDVGW-Richtlinien einzuhalten.

 

Trinkwasser-Zirkulationspumpe intelligent geschaltet mit oder ohne Homematic-Anbindung

Trinkwasser-Zirkulationspumpe intelligent geschaltet mit oder ohne Homematic-Anbindung

Wichtiger Hinweis:  Dieses Modul gibt es mittlerweile auch mit OLED-Display. WIFFI-pump-2

1. Einige grundsätzliche Gedanken
Eine Warmwasser-Zirkulation ist ein in der Hausinstallation heute oft eingesetztes Komfortmerkmal, um an allen Zapfstellen im Haus nahezu sofort nach Aufdrehen des Wasserhahnes warmes Wasser verfügbar zu haben. Dazu verwendet man eine Ringleitung, in der eine kleine sog. Zirkulationspumpe  das warme Wasser dauernd oder nur zu bestimmmten Tagesabschnitten im Kreis pumpt. Im Hinblick auf Energieeinsparung kommt schnell der Gedanke auf, durch „intelligentere“ Steuerung das System zu verbessern.

Der erste Gedanke ist meist die Verringerung des Verbrauchs von elektrischer Leistung durch die Zirkulationspumpe. In einem typischen Einfamilienhaus hat die heute meist nur 5W. Das heißt im Dauerbetrieb verbraucht diese Pumpe übers Jahr ganze 44KWh, also mit 25ct/KWH macht das etwa 11€. Allerdings wird  meist eine Schaltuhr  verwendet, die vielleicht 12h schaltet und demnach die Verbrauchskosten auf 6€/Jahr halbiert. Für 6€/Jahr lohnt sich wohl keine  „intelligentere“ Steuerung als eine einfache Schaltuhr!

Also warum denn hier was machen??
Der Grund liegt darin, dass die eigentlichen Verluste nicht elektrisch sind, sondern die erheblichen Wärmverluste der Ringleitung. Dazu habe ich Messungen gemacht, die hier auf der Webseite nachgelesen werden können:

https://www.stall.biz/?project=zirkulationspumpe-warmebedarfsgerecht-geschaltet

Das Ergebnis kann man mit wenigen Kennzahlen trendmässig beschreiben:

– Elektrische Verluste  der Zirkulationspumpe:  5W   >> Jahreskosten 11€
– Wärmeverluste  der Ringleitung ohne Schwerkraftzirkulation:  60W   >>  Jahreskosten 132€    (mit einem Absperrhahn im Rücklauf wurde die natürliche Zirkulation abgeschaltet )
– Wärmeverluste der Ringleitung mit Schwerkraftzirkulation: 128W   >>  Jahreskosten 282€ !!
– Wärmeverluste der Ringleitung mit 12h/Tag laufender Zirkulationspumpe : 562W   >>  Jahreskosten 616€ !!!

Ohne jetzt das nur als „Hausnummer“  zu wertende Ergebnis weiter im Einzelnen zu diskutieren, wird eines klar:

Eine intelligente Steuerung der Zirkulationspumpe ist nicht wegen der elektrischen Energieeinsparung sinnvoll, sondern hauptsächlich wegen der damit möglichen Reduzierung der Verlustwärme !!

2. Das „intelligente“ Steuerungskonzept
Optimal ist danach, daß die Zirkulationspumpe auch nur dann läuft, wenn auch irgendwo im Haus warmes Wasser möglichst ohne wärmeverzug gezapft werden soll. Dazu gehört erst mal eine Strategie, um den Nutzerwunsch nach warmem Wasser zu erkennen. Denkbar wäre  ein Bewegungssensor im Badezimmer oder ein  Geräuschmelder in den „Wasserräumen“. Aber oftmals geht man in diese Räume, ohne den Warmwasserhahn zu betätigen . Also doch vielleicht einen Taster in Wasserhahnnähe installieren, den man anstößt, wenn warmes Wasser benötigt wird ? Das widerspricht aber einer „intelligenten“ automatischen Bedienung!
Also vielleicht einen Sensor installieren, der den Durchfluss mißt? Zu teuer und das erfordert   einen geeigneten Sensor und einen Eingriff in die Installation… Nein, lieber nicht!

Die Lösung ist einfach und auch nicht neu: Am Vorlauf-Ausgang des Warmwasserspeichers wird einfach mit einem Temperatursensor die Temperatur gemessen. Wenn dann warmes Wasser gezapft wird, dann erhöht sich schlagartig dort die Temperatur. Diese Temperaturerhöhung wertet man mit einer Elektronik entsprechend aus und schaltet umgehend die Zirkulationspumpe ein. Diese schiebt nun das warme Wasser schnellstens in die Ringleitung, so dass bereits nach relativ kurzer Zeit  das warme Wasser an der Zapfstelle ist.  Und spätestens jetzt wird klar, daß hierfür eine Pumpe mit möglichst hoher Leistung viel besser geeignet wäre, als die heute mit Schaltuhr eingesetzten Kleinleistungs-Typen.

Abgeschaltet wird die Pumpe entweder nach 3 bis 4 Minuten ( wenn die Ringleitung gut und komplett durchspült ist) oder wenn im Rücklauf am Warmwasserspeicher die Temperatur angestiegen ist. Dazu würde allerdings noch ein zweiter Temperatursensor benötigt.

Nach mehreren Versuchen mit und ohne zweiten Temperatursensor im Rücklauf wurde die einfache Lösung mit nur einem Temperatursensor im Vorlauf praktisch umgesetzt. Die Vorteile mit einem zweiten Sensor wären nur sehr gering!

Die erste Steuerung war analog mit wenigen Bauelementen umgesetzt (siehe Link oben) und hat ein Jahr problemlos gelaufen. Allerdings hatten einige Nachbauer mit Bauteiltoleranzen der analogen Steuerung zu kämpfen, so daß der Wunsch nach einer robusteren digitalen Lösung aufkam, die zudem optional in meine Homematic-Haussteuerung gut integriert werden kann. Damit meine ich, daß die Homematic sowohl die Zirkulationspumpe einschalten kann, als auch bei selbsttätiger Einschaltung die Homematic über den Schaltzustand rückinformiert wird. (bidirektionale Einbindung).

Vielleicht wird der eine oder andere Leser die Frage stellen, warum denn nicht gleich die Zirkulationspumpe mit der Homematic steuern?
Die Antwort ist einfach, weil die aktuell verfügbaren Homematic-Temperatursensoren mit Aktualisierungsintervallen von 3 und mehr Minuten  viel zu langsam sind!

3. Die Schaltung
Die Steuerung wurde mit einem programmierbaren Mikrochip Atmel ATTiny 45 oder 85 aufgebaut. Damit sind nur noch wenige zusätzliche Bauelemente erforderlich. Als Temperatursensor dient ein 10kOhm-NTC , der mit dem Vorlaufrohr in möglichst innigem thermischen Kontakt gebracht werden muß. Doch dazu später weitere Einzelheiten.

Hier erst mal der Schaltplan:

Folie1

 

Für die Realisierung wurde eine doppelseitige Platine hergestellt und mit den wenigen notwendigen Bauteilen bestückt. Das Programm (Firmware)  für den verwendeten Mikrocontroller  ATTiny85 ist auf dem Arduino entwickelt und erprobt worden.  Da nur sehr wenige Bauteile verwendet werden, wäre auch ein Lochrasteraufbau schnell realisiert. Natürlich müssen insbesondere die 230V-spannungsführenden Teile nach den geltenden Sicherheitsnormen geschützt werden. Zusätzlich habe ich auf der Platinenunterseite die 230V-führenden Kontaktpunkte am Relais und an der Schraubklemme mit jeweils einem dicken Wulst Heißkleber überzogen. Und dann muß man das Ganze mit einem geeigneten Kästchen „verpacken“.  Jeder versierte Elektroniker hat da sicher seine eigenen Vorstellungen 😉

Für Interessierte :

Einen kompletten Bausatz der Zirkulationspumpensteuerung mit dem programmierten Attiny Mikrocontroller und einem konfektionierten NTC-Temperaturfühler kann man bei mir erwerben:
https://www.stall.biz/?product=zirkulationspumpensteuerung

Die ATTiny- Steuerungssoftware prüft nach dem Start zuerst die I/O-Peripherie und zeigt das Ergebnis der Prüfungen mit einem Blinkcode an.  Zuerst blinkt für einige Sekunden die Signal-LED sehr schnell. Während dieser Zeit wartet die Steuerung darauf, daß ein möglicherweise  angeschlossener HM-Schaltaktor sich nach dem Einschalten stabilisiert hat. Dann erfolgt die Prüfung , ob überhaupt der HM-Schaltaktor da ist. Dazu wird der HM-Schaltaktor kurz über den Taster eingeschaltet und wieder ausgeschaltet. Wenn der Ausgang des HM-Schaltaktors dann ebenfalls den Status gewechselt hat , wird ein entsprechender Blinkcode zur Signalisierung der bidirektionalen Betriebsart ausgegeben.

Bei der bidirektionalen Betriebsart wird der HM-Schaltaktor sowohl als Output für ein Schaltsignal verwendet als auch als Input für die Rückmeldung des Zirkulationspumpen-Schaltrelais. Damit ist die Zirkulationspumpen-Steuerung perfekt in die HM-Welt eingebunden.

Die Einschaltzeit ist mit etwa 4 Minuten fest vorgegeben und entspricht etwa der Zeit, die das Wasser in in der Zirkulationsleitung für „eine Runde“ benötigt. Will man andere Einschaltwerte verwenden, dann kann man optional einen sog.  Programmierwiderstand Rtime einfügen. Die Einschaltzeit in Minuten  entspricht dem Wert in kOhm. Der kleinste Wert ist 0,33kOhm entsprechend 20sec.

Wenn beispielsweise bei längerer Abwesenheit die Zirkulation länger als 2 Tage nicht aktiviert wurde, dann startet automatisch eine  Zirkulation für etwa 10 Minuten . Dies ist wichtig zur Reduzierung der Legionellengefahr. In Verbindung mit der Homematic kann man diesen Desinfektionslauf sinnvollerweise mit dem Desinfektionslauf der Heizung synchronisieren.

4. Anwendungsmöglichkeiten
Je nach individuellen Bedürfnissen kann die Zirkulationspumpen-Steuerung in verschiedenen Betriebsarten betrieben werden. Welche Betriebsart aktiviert ist hängt von der Beschaltung ab . Angezeigt wird die Betriebsart mit einem Blinkcode nach dem Einschalten. Erläuterungen dazu nachfolgend:

Betriebsart 1:
Die einfachste Betriebsart  ist die Verwendung der Steuerung als Schalttreiber für die Zirkulationspumpe . Die Zirkulationspumpe folgt einfach dem Schaltaktor.
Folie2

Betriebsart 2:
Sobald eine Temperaturerhöhung im Vorlauf detektiert wird, schaltet die Zirkulationspumpe für 4 Minuten ein. Zusätzlich kann mit einem externen Taster oder Schalter die Zirkulationspumpe eingeschaltet werden. Das kann ein einfacher Taster an der Zapfstelle sein oder ein Bewegungsmelder oder ein Geräuschmelder oder ein HM-Schaltaktor oder …
Ausgeschaltet wird die Zirkulationspumpe immer automatisch nach der vorgegebenen Zeit.
Folie3

Folie4

Betriebsart 3:
Hier wird mit einem HM-Schaltaktor eine bidirektionale Verbindung mit einem 1-Kanal-HM-Schaltaktor hergestellt. Dabei schaltet der HM-Aktor, wie bei den vorgenannten Betriebsarten auch, die Zirkulationspumpe ein. In diesem Fall „weiß“ die CCU, daß die Zirkulationspumpe eingeschaltet ist. Wenn diese  aber nach 4 Minuten selbsttätig ausschaltet muß eine entsprechende Rückmeldung an die CCU abgeschickt werden. Dies erfolgt über die im nachfolgenden Bild gelbe Steuerleitung. Damit wird der Toggle-Taster des Schaltaktor betätigt und der Aktor schaltet wieder AUS. Dies „weiß“ dann die CCU auch. So kann man den Schaltaktor sowohl als digitalen Ausgang als auch digitalen Eingang „mißbrauchen“.
Übrigens kann man als HM-Schaltaktor sowohl den aktuellen  1-fach als auch den 4-fach Batterie-Schaltaktor verwenden 🙂
Folie5

5. Blinkcodes
Mit einer LED wird die Betätigung des Schaltrelais für die Zirkulationspumpe angezeigt. Die andere im Bild linke sog. Info-LED ist zur Anzeige von Blinkcodes während des Startvorganges wichtig.
> Nach dem Einschalten der Versorgungsspannung blinkt die Info-LED sehr schnell für etwa 10 Sekunden. Während dieser Zeit kann sich der HM-Schaltaktor „einschwingen“ und stabilisieren.
> Danach wird soweit vorhanden der HM-Schaltaktor mit dem Toggle-Taster ein- und nach einigen  Sekunden  wieder ausgeschaltet
> Das Ergebnis der Prüfungen wird am Ende der Startphase durch ein langsames Blinksignal angezeigt:

– 1x Blinken: Betriebsart 1 mit externem Schalter ohne Temperatursensor
– 2x Blinken: Betriebsart 2a oder 2b mit externem Temperatursensor mit/ohne externem Schalter
– 4x Blinken: Betriebsart  3 mit externem Temperatursensor und HM-Schaltaktor

Im normalen Betrieb, wenn die Steuerung gewissermaßen in „Lauerstellung“ ist, wird kontinuierlich alle 0.5s ein kurzer Lichtblitz auf der Info-LED erzeugt (heartbeat)

6. Anbringung des Temperatursensors
Der Temperatursensor muß am vorlaufseitigen Ausgangsrohr des Wasserspeichers so nah angebracht werden, daß bei Zapfen von warmem Wasser möglichst schnell eine Temperaturerhöhung gemessen wird. Andererseits darf der Sensor nicht zu nah am Wasserspeicher sein, weil sonst die wasserseitige Wärmeausstrahlung das Rohr immer erwärmt. Mein Erfahrungswert für die optimale Leitungsentfernung zwischen Sensor und Speicherausgang ist  etwa 40cm bis 60cm; das hängt vom Leitungsquerschnitt und den räumlichen Gegebenheiten ab. Muß man halt etwas Probieren!
Test: Wenn die Zirkulationspumpe längere Zeit nicht gelaufen ist, dann sollte der geplante Anbringungsort für den Sensor höchstens handwarm sein!

Der Wärmekontakt des Sensors muß so gut sein, daß Temperaturänderung möglichst verzugfrei detektiert werden. Bei einem konfektionierten 10kOhm NTC in einem Röhrchen ist dies zwar auch akzeptabel, aber  ein direkt aufgebrachter kleiner NTC-Widerstand reagiert schneller. Beide möglichen Lösungen zeigen die folgenden Bilder:
Folie8

Folie7

Besonders wichtig für eine gute Funktion ist natürlich eine gut entlüftete Ringleitung. Wenn hier sich Luftblasen angesammelt haben, dann ist eine effektive Pumpfunktion nicht möglich. Besonders die Schwerkraftbremse muß einwandfrei funktionieren, damit bei abgeschalteter Zirkulationspumpe auch wirklich kein Wasser zirkuliert. Prüfen kann man das folgendermaßen:
Zirkulationspumpe stromlos machen und mindestens 2 Stunden den Kreislauf abkühlen lassen. wenn  danach der Rücklauf  kalt ist und der Vorlauf nur auf dem ersten Meter handwarm, dann ist keine natürliche Zirkulation da und die Schwerkraftbremse ist in Funktion.

Danach wird die Zirkulationspumpe eingeschaltet und die Zeit gemessen, bis das warme Wasser am Rücklauf angekommen ist. wenn nach 2 bis 5 Minuten das warme Wasser im Rücklauf angekommen ist, dann scheint der hydraulische Pumpenkreis wohl in Ordnung zu sein!

Die Leitungslänge zwischen Steuerung und Temperatursensor  sollte so kurz wie möglich sein, da sonst die Leitungen wie Antennen wirken und Störsignale  „einsammeln“. Abgeschirmte Leitungen helfen auch nicht gegen magnetische Störfelder. Also 1 bis 2 Meter dürften funktionieren.

7. Einbindung in die Homematic
Die Steuerung funktioniert als Standalone-System sehr gut und man könnte sich seitens  der Homematic auf die Status-Anzeige (EIN/AUS)  des verwendeten HM-Aktors beschränken. Allerdings kann man die Rückinformation, wann und ob der Wasserhahn benutzt wurde, sehr gut für andere Steuerungsaufgaben in der Hausautomation verwenden. Die folgenden WebUI-Programme zeigen beispielhaft einige Möglichkeiten:

– Bei der  Wasser-Desinfektion  der Heizung an jedem  Montag um 7h05 wird hier die Zirkulation eingeschaltet, um auch den Rücklauf zu desinfizieren:
prog1
Die Berechnung der Systemvariablen  zu_bett_gegangen erfolgt u.a. in dem zweiten WebUI-Programm:
Die Systemvariable zu_bett_gegangen ist immer dann wahr, wenn man am abend zuvor vor dem zu Bett gehen den Wasserhahn betätigt hat. In diesem Fall wird morgens zur typischen Badezimmerzeit die Zirkulation vorsorglich eingeschaltet, um praktisch gar keine „Wartzezeiten“ mit dem warmen Wasser zu haben.
Prog2

8. Schaltungsaufbau


Zur Verbesserung der Störsicherheit wird der Einbau des 100nF-Kondensator C3  empfohlen. Man kann ihn entweder auf die Platine löten  oder gemeinsam mit den Zuleitungen an die Schraubklemmen  Tfor und GND legen.

Update 2.0:  Layout wurde überarbeitet und R9 und C3 integriert:
Folie10

Update Ver. 2.1  : PTC-Sicherung hinzugefügt

z_pumpensteuerung_14

Update Ver. 2.2: Layout optimiert

Hinweise zum Zusammenbau:

Für den Zusammmenbau der Schaltung sollte man schon einige Kenntnisse der Elektronik besitzen. Insbesondere sollten folgende Hinweise beachtet werden, weil sonst die Schaltung beschädigt wird:

  • Der Elektrolytkondensator C1 ist polrichtig einzubauen.  Der Minuspol ist mit weißem Streifen gekennzeichnet .
  • Das IC1 ist ebenfalls polrichtig einzusetzen (auf die Punktmarkierung achten!)
  • Die LEDs sind polrichtig einzulöten. „K“ wie kurzes „Beinchen“.

Nach dem Zusammenbau ist ein einfacher Funktionstest auf dem Labortisch möglich, indem man nach der Startphase, wenn nur doch der regelmässige kurze LED-Blitz da ist, kurz mit den Fingern  den Temperatursensor erwärmt. Dann muß sofort LED2 und das Relais aktiviert werden. Erst nach etwa  4  Minuten geht die LED 2 wieder aus und  startet  wieder den regelmässigen Lichtblitz.

Hinweise bei Funktionsproblemen

  • Funktioniert der sog,. Fingertest ? Dabei wird der kalte noch nicht montierte NTC-Sensor einige Sekunden mit den Fingern erwärmt. Wenn dann das Realis einschaltet , dann ist die Schaltung mit großer Wahrscheinlichkeit in Ordnung
  • Ist die Leitung für den NTC-Sensor nicht länger als 1 bis 2m und liegt möglichst nicht mit anderen Kabeln nah zusammen
  • Ist das Netzteil in Ordnung ? Oft neigen Billig-Netzteile zu Störungen.
  • Ist der NTC-Sensor an einem metallischen Rohr montiert ? Kunststoffrohre funktionieren nicht !
  • Hat der NTC-Sensor guten Wämekointakt mit dem Rohr am WW-Auslauf ?
  • Ist der Sensor auch nicht zu nah am WW-Auslauf positioniert, so daß bei  Erwärmung des WW_Speichers die Erwärmung bis in das WW-Auslaufrohr einwirkt.
  • Hat die Zirkulationspumpe eine sog. Schwerkraftbremse ? Bei modernen WW-Pumpen ist das Ventil in der Pumpe. Es gibt aber auch Rückschlagventile, um ein Zirkulation bei abgeschalteter Pumpe zu verhindern.


Für Interessierte :

Einen kompletten Bausatz der Zirkulationspumpensteuerung kann man in meinem Shop erwerben. 

https://www.stall.biz/?product=zirkulationspumpensteuerung

Haftungs- und Sicherheitshinweise

Beim Nachbau müssen natürlich alle wichtigen einschlägigen Sicherheitsvorschriften für den Umgang mit gefährlichen Spannungen  eingehalten werden. Fundierte theoretische und praktische Fachkenntnisse der Elektrotechnik und für den Umgang mit gefährlichen Spannungen sind unverzichtbar!!

Durch eine unsachgemäße Installation gefährden Sie ihr Leben und das Leben ihrer Mitmenschen! Darüberhinaus riskieren Sie erhebliche Sachschäden , welche durch Brand etc. hervorgerufen werden können ! Für alle Personen- und Sachschäden durch falsche Installation etc. ist nicht der Hersteller sondern nur der Betreiber verantwortlich.

Ich verweise hier unbedingt auf  die  „Sicherheitshinweise und Haftungsausschluss„-Seite dieses Blogs. Auch die notwendigen Eingriffe in das Heizungssystem dürfen nur von ausgebildeten Fachpersonal durchgeführt werden. Es sind die geltenden Sicherheitsvorschriften und die DVGW-Richtlinien einzuhalten.

 

 

Analogausgang und PWM mit Homematic-Schaltaktor realisieren

Analogausgang und PWM mit Homematic-Schaltaktor realisieren

1  Ein paar Worte vorweg…
Zugegeben, bei der Hausautomation braucht man nicht so oft analoge Ausgänge. Aber ich suchte eine Möglichkeit für eine  analoge  Füllstandsanzeige und da hat man im aktuellen HM-Produktportfolio  leider keine Wahl.  Zwar gibt es Wired-Komponenten mit PWM-Ausgang, die sich für die Aufgabe eignen würde, aber eben Wired. Und ich wollte nicht noch weitere Kabel durchs Haus ziehen. Also mußte eine Funklösung her !
Viele HM-Schaltaktoren haben die Möglichkeit, daß man nicht nur einfach EIN und AUS schalten kann, sondern man kann erst die Einschaltdauer definieren und danach die Schaltung auslösen. Das hat den Vorteil, daß der Schaltbefehl nach Auslösung auch beendet wird; selbst wenn nach Auslösung die Funkübertragung gestört ist.  Darüberhinaus wird die Einschaltdauer viel genauer eingehalten, weil der Aktor selbständig für die Impulslänge verantwortlich ist. Ein Schalten von der CCU ist bezüglich ein- und Ausschaltzeit immer mit einer zeitlichen Unsicherheit von einigen Sekunden behaftet. Somit ist beim erstgenannten Modus die variable (analoge) Einschaltdauer eine sehr brauchbare Größe, um analoge Signale zu übertragen! Man muß „nur“ auf der Empfängerseite die Impulslänge wieder messen (dekodieren) und daraus eine analoge Spannung machen.

2  Die Zusatzschaltung
Die Lösung ist mit einem kleinen Singlechip-Mikroprozessor relativ einfach fast ohne zusätzliche Bauelemente zu realisieren. Aus der folgenden Beschreibung sollte eigentlich das Funktionsprinzip klar werden. Das  Bild zeigt die Lösung mit Verwendung eines 1-fach Funk-Schaltaktors (HM-LC-Sw-Ba_PCB0), aber auch der 4-fach-Aktor funktioniert und alle anderen Aktoren auch, deren Einschaltdauer getrennt programmiert werden kann . Wenn der Schaltaktor eine vorgegebene Einschaltzeit einschaltet, dann wird diese Zeit vom nachfolgen Mikroprozessor  gemessen . Aus dieser Zeit wird dann ein PWM-Signal (ca. 600Hz) mit einem Tastverhältnis errechnet, das der gemessenen Einschaltdauer proportional ist. Konkret werden hier die Einschaltzeiten von o bis 5 Sekunden in ein Tastverhältnis von 0 bis 100% umgesetzt. Damit man analoge Ausgangsspannungen erhält, wird aus dem PWM-Signal mittels Tiefpass eine analoge Spannung von 0 bis 5V erzeugt.

bild1

Die Schaltung besteht hauptsächlich  aus dem kleinen 8-beinigen IC (ATtiny45 oder ATtiny 85) , das allerdings entsprechend programmiert ist. Mehr dazu weiter unten. Dazu kommen eigentlich nur noch 2 Widerstände und ein Elko. Die LED mit Vorwiderstand ist optional. Sie zeigt die Höhe der Ausgangsspannung oder das Tastverhältnis mit mehr oder weniger starkem Leuchten an. Das Ganze kann man entweder als „Luftverdrahtung“ oder auf einer kleinen Lochrasterplatine aufbauen. Der Lötumfang hält sich also doch sehr in Grenzen 😉

3  Messergebnisse
Wenn nun der  Schaltaktor  einmalig einen Schaltimpuls sagen wir mal von 2 Sekunden Länge abgibt, dann wird danach vom Mikrocontroller  dauerhaft eine Spannung von 2V abgegeben . Das bleibt so, bis ein neuer Schaltimpuls eine neue Ausgangsspannung mit seiner Schaltimpulslänge vorgibt. Das nächste Bild verdeutlicht mit praktischen Messergebnissen die recht ordentliche Linearität der Einrichtung:

bild_2

Die Programmierung des Mikrocontrollers ist so, daß Einschaltzeiten von 0 bis 5s  in eine Ausgangsspannung von 0 bis 5V transformiert werden. Bei längeren Einschaltzeiten ist die Ausgangsspannung auf 5V begrenzt. Problematisch sind Einschaltzeiten unter 0,1s, weil dann der HM-Aktor m.E. falsch reagiert: er schaltet dauerhaft ein !! Also eine Einschaltdauer von null führt zum dauerhaften Einschalten des Aktors?! Damit kann man aber leben, man muß nur den Bereich unter 100ms meiden.

4  Programmierung des Mikrocontrollers
Der verwendete Mikrocontroller ATtiny45 oder 85 von Atmel läßt sich sehr gut mit der Arduino-Entwicklungsumgebung programmieren und flashen. Hier sollen nicht weitere Details hierzu erläutert werden. Für die „Fachleute“ ist  das nachfolgende kleine Arduino-Sketch sicher selbsterklärend. Die „Anderen“ können einfach den programmierten Chip von mir gegen Zahlung eines Unkostenbeitrags beziehen.

boolean attiny = 1;  //= 1 wenn attiny verwendet wird ***************************************************
int pwm = 0;
unsigned long int time_start = 0;  //in 1ms schritten
unsigned long int pulsdauer = 0;  //in 1ms schritten
const long int pulsdauer_max = 5000;  //5s max messzeit
boolean input =1;
boolean input_alt= 1;
 
//#####################################################################################
void setup() 
{if (attiny) { pinMode(0, OUTPUT); pinMode(1, OUTPUT);} 
         else { pinMode(6, OUTPUT); pinMode(7, OUTPUT);}  
 pinMode(2, INPUT);
 pinMode(4, INPUT);
}
 
void loop() 
{input_alt = input;
 input = digitalRead(4);
 if ((!input) && input_alt) {time_start = millis();}
 if ((input) && (!input_alt)) {pulsdauer = millis() - time_start;}
 if (pulsdauer > pulsdauer_max) {pulsdauer = pulsdauer_max;}
 if (pulsdauer < 0) {} // wenn zeitüberlauf (nach 5 tagen ) dann nichts machen 
 pwm = (255.0 * pulsdauer/pulsdauer_max);
 if (attiny) {{analogWrite(0,pwm); analogWrite(1,pwm);}} else {analogWrite(6,pwm); analogWrite(7,pwm);}
}

5  Ansteuerung von der CCU
Dazu ist eigentlich wenig zu sagen, weil die Ansteuerung des Schaltaktors  genauso erfolgt, wie bei „normalem“ Betrieb. Wichtig ist , daß zuerst die Einschaltdauer entsprechend der gewünschten analogen Ausgangsspanung anhand der o.a.Kennlinie festgelegt wird und dann mit zwei Befehlen der Impuls ausgegeben wird.

Hat man analoge Signale z.B. Systemvariable, die man als analoge Spannungen ausgeben möchte, dann ist allerdings ein Skript notwendig, das direkt die Einschaltdauer des Aktors anspricht. Das hab ich bisher noch nicht benötigt, aber vielleicht noch in Zukunft, dann wird der Thread weiter ergänzt.

Haftungs- und Sicherheitshinweise

Beim Nachbau müssen natürlich alle wichtigen einschlägigen Sicherheitsvorschriften für den Umgang mit gefährlichen Spannungen  eingehalten werden. Fundierte theoretische und praktische Fachkenntnisse der Elektrotechnik und für den Umgang mit gefährlichen Spannungen sind unverzichtbar!!

Durch eine unsachgemäße Installation gefährden Sie ihr Leben und das Leben ihrer Mitmenschen! Darüberhinaus riskieren Sie erhebliche Sachschäden , welche durch Brand etc. hervorgerufen werden können ! Für alle Personen- und Sachschäden durch falsche Installation etc. ist nicht der Hersteller sondern nur der Betreiber verantwortlich.

Ich verweise hier unbedingt auf  die  „Sicherheitshinweise und Haftungsausschluss„-Seite dieses Blogs.

 

schnell ansprechender Regensensor

schnell ansprechender Regensensor

Zum Thema Regensensor findet man im FHZ- Forum über 600 Fundstellen, die einerseits den Bedarf und die Notwendigkeit aufzeigen andererseits aber auch die Problematik geeigneter Sensoren . Auch ich habe eine „bewegte“ Regensensor-Geschichte: Zuerst Kemo-Sensor gekauft, der bei Regen nicht funktionierte, dann selber mit einem PTC etwas gebastelt, was ordentlich funktionierte, aber leider mit entsprechendem Wetterschutz für den PTC fast 10s Reaktionszeit hatte.viewtopic.php?f=31&t=12306&p=92604&hilit=+regenmelder#p92241
Deshalb war ich ganz erfreut, als jetzt ein Homematic-Regensensor herauskam. Insbesondere bei der umfangreichen Forendiskussion hoffte ich, dass der „Neue“ sicher besser funktionieren würde, als die bisherigen Lösungen. Das war aber eine falsche Hoffnung: nach zwei Wochen Erprobung habe ich nun das Gerät wegen Nichtfunktion zurückgeschickt. Selbst bei Dauerregen wurde manchmal „Trockenheit“ angezeigt!! Diese Enttäuschungen haben mich dann angespornt, selbst einen hoffentlich besseren Regenmelder zu bauen, der vor allen Dingen sicher und schnell reagiert.
Meine wichtigsten Anforderungen an einen Regensensor für die typischen Homematic-Anwendungszwecke sind:
– schnelle Reaktion und Meldung (one-drop-only !) , unter 3 Sekunden
– möglichst auch eine analoge Information über die Regenstärke
– sichere Funktion auch bei nahezu nichtleitendem Regenwasser
– schaltbare Heizung für Schnee- und Eiserkennung und für Abtrocknen des KammsensorsDie Anforderung nach Detektion sogar von destilliertem Wasser führt automatisch weg vom Messprinzip der Widerstandsmessung hin zum kapazitiven Messprinzip.
Basierend auf einem käuflichen Kammsensor http://www.conrad.de/ce/de/product/1565 … wetterfest wurden verschiedene Schaltungskonzepte aufgebaut und praktisch erprobt. Die beste Lösung möchte ich hier als Nachbaulösung für den versierten Bastler vorstellen:Das Messprinzip beruht darauf, dass der Kammsensor mit seiner Kapazität in Verbindung mit einer Induktivität zu einem elektronischen Schwingkreis ergänzt wird.
Als Eigenfrequenz des gekauften Kammsensors mit einer Standard-Induktivität von 1mH wurden etwa 500kHz ermittelt. Mit einem Rechteckoszillator mit ebenfalls 500kHz wird nun dieser Schwingkreis über eine Koppelkapazität angeregt. Ergebnis ist eine Resonanzspannung von einigen Volt, die mit einer Diode gleichgerichtet und als Messsignal angezeigt wird.
Wenn nun die Kapazität des Kammsensors beispielsweise durch einzelne Wassertropfen sich ändert, dann verstimmt sich dementsprechend der Schwingkreis und eine geringere Spannung wird angezeigt. Wenn der Wassertropfen zusätzlich noch leitfähig ist, dann vergrössert dies die Dämpfung des Schwingkreises, was ebenfalls zu einer geringeren Anzeige führt. Also beide Wirkmechanismen (Kapazität und Widerstand) wirken in die gleiche Richtung und verringern den Anzeigewert deutlich. Damit ist dann schon alles getan.
Hier die zugehörige Schaltung, welche einfach auf einer Lochrasterplatine aufgebaut wurde.
schaltplan_regensensor_2

Der Abgleich ist sehr einfach: Mit dem Trimmpoti P wird die Oszillatorfrequenz so eingestellt, dass die Ausgangsspannung bei trockenem Kammsensor maximal wird. Das ist alles! Zu empfehlen ist, dass beim Kammsensor die unflexible Anschlussleitung durch ein 4-poliges kurzes und biegeweiches Flachkabel ersetzt wird und die entsprechenden Heizwiderstände aufgelötet werden. Die nachfolgenden Bilder zeigen hierzu Details der praktischen Ausführung:

Regenmelder

Die Heizung kann entweder mit einem Jumper zu einer Dauerheizung geschaltet werden. Alternativ wird bei Regenerkennung automatisch die Heizung zum Abtrocknen eingeschaltet oder zusätzlich von der Hommatic bzw. per Programm eingeschaltet. Das analoge Messsignal wird an einen analogen Eingang eines Wired-Moduls (HMW-IO-12-Sw14-DR) geführt und kann dann auch als Maß für die Regenstärke ausgewertet werden. Alternativ hat der Regenmelder einen digitalen Open-Collector-Ausgang für die Anschaltung an einen digitalen Eingang. Die Materialkosten für den Regensensor einschliesslich Kammsensor sind etwa 25€. Als Bauzeit muss man schon ein paar
Stunden einrechnen.
Einige Tage habe ich nun mit dem Regensensor erste „Regenerfahrungen“ machen können. Dabei zeigte sich eine sehr schnelle Raktionszeit, so wie ich mir das bei einem guten Regensensor vorgestellt habe. Langzeiterfahrungen bezüglich Einfluss von Verschmutzung, Temperatur- und Messsignalstabilität liegen noch nicht vor, aber die ersten Ergebnisse mit dem Gerätchen sind ganz vielversprechend.

Haftungs- und Sicherheitshinweise

Beim Nachbau müssen natürlich alle wichtigen einschlägigen Sicherheitsvorschriften für den Umgang mit gefährlichen Spannungen  eingehalten werden. Fundierte theoretische und praktische Fachkenntnisse der Elektrotechnik und für den Umgang mit gefährlichen Spannungen sind unverzichtbar!!

Durch eine unsachgemäße Installation gefährden Sie ihr Leben und das Leben ihrer Mitmenschen! Darüberhinaus riskieren Sie erhebliche Sachschäden , welche durch Brand etc. hervorgerufen werden können ! Für alle Personen- und Sachschäden durch falsche Installation etc. ist nicht der Hersteller sondern nur der Betreiber verantwortlich.

Ich verweise hier unbedingt auf  die  „Sicherheitshinweise und Haftungsausschluss„-Seite dieses Blogs.

Regensensor, Regenmelder mal ganz anders

Regensensor, Regenmelder mal ganz anders

Die preiswerten Regensensoren von Kemo und Conrad basieren auf dem Prinzip der einfachen Widerstandsmessung und haben demnach insbesondere bei fast reinem Regenwasser ein Leitfähigkeitsproblem. Einzig der Regenmelder von Hygrosens scheint wirklich zuverlässig zu funktionieren, kostet aber mit Halter auch stattliche 70€. Irgendwie haben mich die genannten Probleme dann doch herausgefordert, nach kostengünstigeren Lösungen zu suchen, die aber mindestens so gut sowohl im Sommer als auch im Winter funktionieren sollten.

Ich habe eine Reihe von Versuchen mit verschiedenen Messprinzipien angestellt, wobei sich dann die nachfolgend vorgestellte Lösung als besonders einfach und kostengünstig herausgestellt hat. Zudem ist die Funktion sowohl mit Regen als auch Schnee sehr gut und letztlich ist auch der Energiebedarf für die Heizung akzeptabel. Mit den nachfolgenden Bildern möchte ich meine Lösung soweit vorstellen, dass der Interessierte sicher eigene Versuche anstellen kann. Ich übernehme natürlich keine Gewähr oder Haftung beim Nachbau.

Funktionsprinzip

Die Funktion des Regensensors beruht darauf, dass ein nahezu punktförmiges Heizelement auf eine fast konstante Temperatur geregelt wird. Im stationären Zustand ist dafür eine bestimmte Leistung notwendig, abhängig davon, wieviel Wärme an die umgebenden Teile abgestrahlt bzw. abgegeben wird. Wenn nun z.B. ein Regentropfen auf das punktförmige Heizelement fällt, dann muß die Temperaturregelung mehr Leistung zuführen, um die Temperatur wieder auf den Sollwert zu bringen. Dies ist dann das Signal für „Regen“. Versuche mit solch einer Anordnung haben ganz gut funktioniert, der Nachteil war nur der relativ hohe Aufwand.Eine super einfache Temperaturregelung lässt sich wie nachfolgend beschrieben mit einem sog. PTC darstellen. Diese Elemente werden auch als Kaltleiter bezeichnet und dienen oft auch als „selbstrückstellende“ Sicherung. Ein geeigneter PTC wurde ausgewählt und als Regenmelder verschaltet. (siehe folgendes Bild)

Folie1

Schaltungstechnisch besteht der Regensensor nur aus einem PTC (0,15€) und einem Shunt-Widerstand von 10 Ohm mit zwei simplen Dioden 1N4007 o.ä.
Das Messsignal zwischen 0 und etwa 1,5V wird an den analogen Eingang eines Wired I/O Moduls 12/14 geführt. Das ist alles !

Die Funktion des PTC ist hoffentlich mit dem Funktionsdiagramm im obigen Bild nachvollziehbar. Im kalten Einschaltzustand ist der Widerstand klein und führt bei dem gewählten PTC zu Einschaltströmen von etwa 1,2A (weniger als 1sec); dann heizt sich der Widerstand innerhalb von Sekunden auf etwa 120C auf. Der PTC-Widerstand wird dann schlagartig größer und begrenzt den weiteren Temperaturanstieg. So bleibt die Temperatur dann nahezu konstant und abhängig von der „Verpackung“ des PTC fließt nur noch ein geringer Strom zur Aufrechterhaltung der Temperatur. Dieser Haltestrom ist bei der hier dargestellte Lösung weniger als 90mA. Bei der Speisespannung von 24V sind das etwa 2W, also so viel wie die Heizung bei den käuflichen Regenmeldern verbraucht. Bei Regen- oder Schneefall steigt der Strom auf mehr als 120mA, das führt zu einem gesteigerten Signal am analogen Eingang des Wired I/O Moduls 12/14 und kann schließlich im WebUI ausgewertet werden.

Praktische Ausführung

Die nachfolgenden Bilder zeigen die praktisch ausgeführte Lösung mit simplen (rostfreien!) Teilen aus dem Baumarkt. Aufwand Materialkosten unter 5€ und natürlich etwas handwerkliches Geschick:

Folie2
Folie3
Folie4
Wichtig ist insbesondere , dass der PTC nach unten und zur Seite möglichst wenig Wärme abstrahlt. Dafür wurde der Widerstand mit hitzestabilem Schaumstoff eingepolstert. Von oben rollen dann die Tropfen auf den PTC und verdunsten/verdampfen und führen schlagartig zur deutlichen Stromerhöhung.

Zu beachten ist , dass der PTC immerhin 120°C warm ist und man sicher stellen muß, dass keine Berührung erfolgen kann oder es nicht zu Entzündungen von brennbarem Material kommt.

Haftungs- und Sicherheitshinweise

Beim Nachbau müssen natürlich alle wichtigen einschlägigen Sicherheitsvorschriften für den Umgang mit gefährlichen Spannungen  eingehalten werden. Fundierte theoretische und praktische Fachkenntnisse der Elektrotechnik und für den Umgang mit gefährlichen Spannungen sind unverzichtbar!!

Durch eine unsachgemäße Installation gefährden Sie ihr Leben und das Leben ihrer Mitmenschen! Darüberhinaus riskieren Sie erhebliche Sachschäden , welche durch Brand etc. hervorgerufen werden können ! Für alle Personen- und Sachschäden durch falsche Installation etc. ist nicht der Hersteller sondern nur der Betreiber verantwortlich.

Ich verweise hier unbedingt auf  die  „Sicherheitshinweise und Haftungsausschluss„-Seite dieses Blogs.

Robuster Bodenfeuchtesensor für den Ausseneinsatz

Robuster Bodenfeuchtesensor für den Ausseneinsatz

Ein Bodenfeuchtesensor wird normalerweise für die Steuerung der Bakonblumen-Bewässerung als auch für die Garten-Bewässerung eingesetzt.
Das Thema ist von der Sensorik recht anspruchsvoll, weil eine einfache ohmsche Widerstandsmessung mit Gleichstrom ungewollte elektrolytische Nebeneffekte erzeugt, die schnell zu einer Korrosion bis zur Auflösung der Messelektroden führt. Deshalb ist dieses Messverfahren mehr oder weniger ungeeignet!
Deutlich besser ist dagegen eine Messung mit Wechselspannung. Dabei wird der Scheinwiderstand als Maß für die Bodenfeuchte verwendet. Der Aufwand ist zwar größer, aber für die meisten Anwendungsfälle im privaten Umfeld ist dieses Messverfahren die erste Wahl.
Am genauesten sind aufwendige professionelle Messverfahren u.a. mit kleinen Hochfrequenzsendern, deren gedämpfte Ausstrahlung im Erdreich gemessen wird. Für den Hobbyanwender sicher zu aufwendig und zu teuer.
Für mich ist das Wechselstromverfahren in Verbindung mit einem umgebauten HM-Temperatursensor der Favorit, weil mit dem unten beschriebenen Messprinzip keine zusätzliche Stromversorgung (außer den im Temperatursensor vohandenen Batterien) notwendig ist.
Den Eigenbau eines ersten Bodenfeuchtesensors als Modifikation des „normalen“ HM-Temperatursensors wurde bereits hier erläutert: http://homematic-forum.de/forum/viewtopic.php?f=31&t=15240&p=132390&hilit=Bodenfeuchte#p120763
Die praktischen Ergebnisse in den letzten 3 Monaten mit diesem Verfahren haben gezeigt, daß selbst eine modifizierte Gleichstrommessung gut funktioniert, wenn nur sehr kurzzeitig mit kleinem Tastverhältnis gearbeitet wird. Aufgrund der Bauart des HM-Temperatursensors wird nur alle 3 bis 4 Minuten für etwa 15ms der Sensorwiderstand gemessen. Dieses Tastverhältnis führt dementsprechend nur zu einer sehr geringen Korrosion. Das folgende Bild zeigt die als Elektroden verwendeten Edelstahl-Fahrradspeichen nach über 3 Monaten.
Folie1

Durch die starke Bildvergrösserung scheint die Korrosion stärker zu sein, als sie in Wirklichkeit ist. Damit könnte man einen Bodenfeuchtesensor aufbauen, der sicher einige Jahre hält.

Trotzdem wollte ich unbedingt den Gleichanteil in der Strommessung weghaben. Deshalb habe ich eine modifizierte neue Schaltung mit einem Trennelko aufgebaut.

Folie2

Durtch geeignete Auslegung der Zeitkonstanten der zusätzlichen 100kOhm-Widerstandes und des NV-Elkos kann eine Messung erfolgen, ohne dass ein Gleichstrom fließt. Dementsprechend erwarte ich auf diese Art und Weise keinerlei Restkorrosion mehr. Während des sehr kurzen 15ms-Messintervalls wirkt der Kondesator wie ein direkter Durchgang und behindert die Widerstandsmessung bzw. die Leitfähigkeitsmessung kaum. Dabei wird der Kondensator geringfügig aufgeladen. Während der dann folgenden langen Pause von etwa 4min bis zum nächsten Zyklus entlädt sich der Kondensator und macht mögliche elektrolytische Wirkungen wieder rückgängig. Dass diese Theorie auch funktioniert, habe ich durch mehrere Versuche erprobt.

Der praktische Aufbau ist simpel, weil nur der kleine Elko und der 100kOhm-Widerstand im Sensorgehäuse untergebracht werden müssen. Die Bilder erklären das sicher. Wichtig ist vorher mit einem Ohmmeter bei der zweipoligen Sensorleitung die Masse herauszumessen.
Man kann auch den Widerstand und den Elko direkt im Bodenfeuchtefühler integrieren, das ist letztlich „Geschmackssache“.

Nun zum Bau des möglichst robusten Bodensensors. Denn er soll ja mechanisch stabil sein und auch möglichst wasserdicht oder zumindest wasserfest. Als Elektroden kommen wieder meine beliebten Edelstahl-Fahrradspeichen zum Einsatz. Ich verwende 2mm-Durchmesser. Als Griff und Halter werden zwei Korken verwendet ( möglichst Kunststoffkorken!). Im Abstand der Elektroden und der verwendeten Lüsterklemme sind entsprechende Bohrungen im Korken einzubringen. Die nachfolgenden Bilder verdeutlichen die Konstruktion

Folie3

Danach mit Schrumpfschlauch oder einem Rohr den Griff abdichten und fertig ist ein stabiler und hoffentlich wasserfester Bodenfeuchtesensor.
Wer will kann mit dem verfügbaren Differenztemperaturfühler einen 2-fach-Bodenfeuchtesensor aufbauen: einen Fühler ins Beet, einen Fühler in den Balkonkasten.
Dann kann der Sommer kommen 🙂

 

Ergänzung 20.06.2015
Verwendung des Differenz-Temperatursensors HM-WDS30-OT2_SM

Da ich mehrere Bodenfeuchtesensoren einsetzen wollte, kam der relativ neue und preiswerte Differenz-Temperatursensor gerade richtig. Dieser enthält zwei Temperaturfühler, die im Prinzip genauso verschaltet sind wie beim alten einkanaligen Sensor.

Nachdem der Anschluß des Bodenfühlers nach dem obigen Rezept erfolgt war, funktionierte der Sensor dann nicht mehr, wenn die Elektroden Kurschluss hatten oder der Boden eine hohe Leitfähigkeit (viel zu feucht) hat. In diesem Fall wird der Kanal einfach nicht mehr abgetastet und ist quasi abgeschaltet. Die Ursache ist offensichtlich eine Softwareänderung beim Differenz-Temperatursensor gegenüber dem einkanaligen Sensor, mit der die Temperatursignale auf Plausbilität geprüft werden. Im „Fehlerfall“ geht die Temperatur dann auf 150°C und ist „eingefroren“.

Die Lösung ist relativ einfach, indem man den Kurzschluss der Elektroden elektrisch ausschließt. Mit einem Widerstand von 820Ohm in Reihe mit dem Elektrolytkondensator ist alles wieder gut !!

Hier ein Bild von der Modifikation des Differenz-Temperatursensors:

differenz_tempsensor

Man kann damit zwar auch zwei Bodenfeuchtesensoren herstellen, hier wurde aber der zweite Kanal für die wirkliche Temperaturmessung im Blumentopf neben dem Erdfeuchtesensor verwendet. So eröffnen sich dann Möglichkeiten, die stark temperaturabhängige Leitfähigkeit des Bodens ggf. herauszurechnen, um ein genaueres Signal zu erhalten.

Es gibt also noch Verbesserungsmöglichkeiten 😉

Ergänzung 14.09.2017
Sensorkonzeption mit verbessertem 3D-Gehäuse

Mittlerweile haben die Bodenfeuchtesensoren den Dauertest recht ordentlich überstanden. Allerdings kam schon der Wunsch auf, den Sensor etwas besser zu „verpacken“. Entsprechende Gehäuse kann man ja mittlerweile mit einem 3D-Drucker mit ausreichender Qualität selber produzieren. Hier die 3D-Konstruktion eines Gehäuses, das einerseits sehr stabil die rostfreien speichen führen soll und andererseits aber auch die notwendigen elektronischen Teile aufnehmen und vor Wind und Wetter schützen soll.

Wer einen eigenen 3D-Drucker hat kann das Geäuse leicht selbst ausdrucken. Hier der stl-File dazu: bodenfuehler_8
In meinem Webshop wird auch ein entsprechender Bausatz demnächst erhältlich sein.

Das Gehäuse besteht aus dem Grundkörper rechts, in dem die Speichen befestigt werden. Darüber wird die Kappe geschoben und von unten mit einer rostfreien M4x16 Senkschraube verschraubt. Das Kabel zum HM-Temperatursensor geht unten ab, damit kein Wasser eindringen kann. Die notwendigen elektronischen Bauteile sind jetzt im Sensorgehäuse untergebracht, so daß im HM-Temperatursensor-Gehäuse selbst keinerlei Änderungen mehr notwendig sind. Lediglich der NTC-Temperatursensor wird am Zuleitungskabel abgeschnitten und an dessen Stelle wird der Bodenfeuchtesensor angeschlossen. Hier einige Bilder dazu:

 

Haftungs- und Sicherheitshinweise

Beim Nachbau müssen natürlich alle wichtigen einschlägigen Sicherheitsvorschriften für den Umgang mit gefährlichen Spannungen  eingehalten werden. Fundierte theoretische und praktische Fachkenntnisse der Elektrotechnik und für den Umgang mit gefährlichen Spannungen sind unverzichtbar!!

Durch eine unsachgemäße Installation gefährden Sie ihr Leben und das Leben ihrer Mitmenschen! Darüberhinaus riskieren Sie erhebliche Sachschäden , welche durch Brand etc. hervorgerufen werden können ! Für alle Personen- und Sachschäden durch falsche Installation etc. ist nicht der Hersteller sondern nur der Betreiber verantwortlich.

Ich verweise hier unbedingt auf  die  „Sicherheitshinweise und Haftungsausschluss„-Seite dieses Blogs.

Einfache Modifikation eines Homematic-Temperatursensors als Analogeingang

Einfache Modifikation eines Homematic-Temperatursensors als Analogeingang

Leider gibt es keinen Homematic-Funksensor mit Analogeingang. Deshalb habe ich einen normalen Funk-Temperatursensor zum Analogeingang umfunktioniert. Wie diese Baubeschreibung zeigt, ist dies sogar ohne Lötarbeit oder Änderungen an der Sensorelektronik möglich!
Das Konzept erlaubt folgende Eingangsspannungsbereiche: 0 bis +10V, 0 bis 3V, 0 bis 5V, -5 bis +5V und -10 bis +10V. Damit sind die typischen Anwendungsbereiche abgedeckt. Der Innenwiderstand der angeschlossenen Sensoren sollte möglichst klein sein <<10kOhm.Die Auslegung wurde für den Einfach-Funksensor HM-WDS30-T-O durchgeführt, aber nach Schaltplan Durchsicht ist dies vermutlich genauso mit dem Funk-Temperaturdifferenzsensor möglich (Man hat dann sogar 2 Analogeingänge verfügbar.)Das folgende Bild zeigt den modifizierten Sensor mit geöffnetem Gehäuse.

schaltschema.jpg

Der NTC-Fühler wird abgeschnitten und mit einem Ohmmeter von den beiden Zuleitungen die Masseleitung ermittelt. Unbedingt diese Masseleitung kennzeichnen, damit später keine negativen Spannungen auf den Eingang des uP kommen. (könnte ihn ggf. zerstören!). Statt dem NTC-Widerstand werden entsprechend dem Schaltplan zwei neue Widerstände hinzugefügt. Die Auslegung der Widerstände ist der Tabelle im Bild zu entnehmen. Zur Darstellung der „krummen“ Widerstandswerte werden Standardwiderstände in Reihe geschaltet. Optional kann eine Schutzdiode als Verpolungsschutz eingefügt werden.

Der gewählte Eingangsspannungbereich wird mit dem vorgeschalteten Widerstands-Netzwerk auf den Spannungsbereich 1,0V bis 2,5V umgesetzt. In diesem Bereich ist die Charakteristik des Funk-Temperatursensors relativ linear, weshalb die Kurve ganz gut durch eine Geradengleichung angenähert werden kann. Der Sensor arbeitet mit dem gewählten Spannungsbereich dann in einem „Temperaturbereich“ von etwa 10 bis 80gradC. Das folgende Bild zeigt die entsprechende Charakteristik:

Temp_sensor_messg.jpg

Die softwareseitige Einbindung erfolgt mit einem Skript, das bei jeder Aktualisierung des Sensorwertes aufgerufen wird:
(Vorher natürlich eine Systemvariable „temp_input“ als Zahl mit Dimension V definieren)

programm0.jpg
HM-Skript   
!Berechnung der Systemvariablen temp_input
        !aus analoger Eingangsspannung am Funk-Temperatur-Sensor!Eingangsspannung 0 bis +10V mit Re =  (1,5+1)kOhm, Rv = (3,9+4,7)kOhm
        !real m = -0.15;
        !real n = 11.56;!Eingangsspannung 0 bis +3V mit Re =  (6,8+1)kOhm, Rv = (1,8+0,82)kOhm
        real m = -0.05;
        real n = 3.49;
 
        !Eingangsspannung 0 bis +5V mit Re =  (3,3+0,22)kOhm, Rv =  (3,3+1)kOhm
        !real m = -0.08;
        !real n = 5.84;
 
        !Eingangsspannung -5 bis +5V mit Re =  (4,7+3,9)kOhm, Rv =  (15)kOhm
        !real m = -0.16;
        !real n = 6.38;
 
        !Eingangsspannung -10V bis +10V mit Re =  (5,6+1)kOhm, Rv =  (15+15)kOhm
        !real m = -0.31;
        !real n = 13.19;
 
        real T = dom.GetObject("BidCos-RF.IEQ0405570:1.TEMPERATURE").Value();
        real temp_inp = n+  T * m;
        dom.GetObject("temp_input").State(temp_inp);

Das Skript berechnet aus den Temperaturwerten die entsprechenden analogen Eingangsspannungen in Abhängigkeit vom gewählten Messbereich.
Im Skript müssen je nach Messbereich die entsprechenden Konstanten m und n aktiviert werden. Im Skript oben ist der Spannungsbereich 0 bis 3V eingeschaltet.
Anmerkung. Natürlich kann man die Kennlinie statt mit dem Skript auch mit CuxD umrechnen.

Erfahrungen mit dieser Lösung.
Sicher kann man diesen Analogeingang nicht mit einem Analogeingang der Wired-Komponenten vergleichen. Die Abtastung erfolgt entsprechend dem ursprünglichen Verwendungszweck nur alle 2 bis 4 Minuten, je nachdem ob sich der Messwert geändert hat und ob eine Aktualisierung notwendig ist. Aber für die Messung langsam veränderlicher Größen wie Temperaturen, Feuchtigkeiten, Wasserstände usw. ist diese Abtastrate kein Problem.
Die Genauigkeit ist sicher nicht allzu hoch, aber für die meisten Anwendungszwecke sicher ausreichend. Wer Lust hat, kann das System sicher noch weiter verbessern, z.B. genauere Kennlinien-Berechnung etc.

Anmerkung zum Thema Genauigkeit: Bei dem unveränderten Temperatursensor wird der interne multipliziernde A/D-Wandler mit der gleichen Spannung (nahezu Batteriespannung) betrieben wie der Spannungsteiler mit dem NTC. Dadurch ist die Temperaturanzeige nahezu unabhängig von der Batteriespannung! Wenn aber wie in diesem Fall beispielsweise die am Analogeingang angebotene Spannung konstant bleibt und die Batteriespannung z.B. sinkt, dann wird eine höhere Eingangsspannung erkannt. Lange Rede kurzer Sinn: Bei höheren Anforderungen an Genauigkeit sollte die Versorgungsspannung für den Funk-Temperatursensor möglichst auf 3V stabilisiert gehalten werden.

Viel Spass bei eigenen Versuchen mit diesem Sensor.
Ich übernehme natürlich keinerlei Haftung ….

Haftungs- und Sicherheitshinweise

Beim Nachbau müssen natürlich alle wichtigen einschlägigen Sicherheitsvorschriften für den Umgang mit gefährlichen Spannungen  eingehalten werden. Fundierte theoretische und praktische Fachkenntnisse der Elektrotechnik und für den Umgang mit gefährlichen Spannungen sind unverzichtbar!!

Durch eine unsachgemäße Installation gefährden Sie ihr Leben und das Leben ihrer Mitmenschen! Darüberhinaus riskieren Sie erhebliche Sachschäden , welche durch Brand etc. hervorgerufen werden können ! Für alle Personen- und Sachschäden durch falsche Installation etc. ist nicht der Hersteller sondern nur der Betreiber verantwortlich.

Ich verweise hier unbedingt auf  die  „Sicherheitshinweise und Haftungsausschluss„-Seite dieses Blogs.

868Mhz-Funksignal ansehen mit DVB-T Stick

868Mhz-Funksignal ansehen mit DVB-T Stick

Es kann sehr hilfreich sein, die Sendesignale der Homematic sich mal genauer anzusehen. Bisher waren hierfür teure Empfänger notwendig, die in diesem Zusammenhang den Aufwand sicher nicht rechtfertigen. Dazu kommt, daß die Funkaussendungen meist nur sehr kurz sind (ca. 0,1sec) und diese kurzen Signale mit einem einfachen Scanner- oder Kontrollempfänger bestenfalls als Knacken im Lautsprecher wahrgenommen werden. Eine hochfrequenzmäßige Optimierung ist so kaum möglich.
Seit einem halben Jahr gibt es aber die Möglichkeit, mit einem ganz bestimmten DVB-T Stick und spezieller Treiber (anstelle der Original-Treiber) in Verbindung mit einer tollen Freeware auf dem PC einen fast professionellen Panoramaempfänger für unter 20€ zu realisieren! Damit kann dann nicht nur eine diskrete Empfangsfrequenz sondern ein Frequenzbereich von fast 3Mhz wie auf einem teuren Frequenzanalysator dargestellt werden. Gleichzeitig kann mit einem sog. Wasserfalldiagramm das Frequenzspektrum über längere Zeit beobachtet und aufgezeichnet werden, so dass keine Aussendung verborgen bleibt.
Statt vieler Worte schaut man sich am besten das angefügte Bild der Bedienoberfläche an.Wer diesen sog. Software Define Receiver (SDR) auch haben möchte , der sollte sich die folgenden Links ansehen.
http://www.oe7.oevsv.at/opencms/referat … /RTL2832U/
http://dl3jin.de/sdr.htm
… oder Googeln mit „RTL2832 und SDR“Es gibt mittlerweile eine große Entwicklergemeinde, die innerhalb kürzester Zeit verschiedene Empfänger-Software an den DVB-T Stick angepasst haben.
Mein Favorit ist die Empfänger-Software SDR# : http://rtlsdr.org/softwarewindows… noch eine Anmerkung zur Beschaffung eines geeigneten DVB-T Stick:
ein nach meinen Erfahrungen besonders empfindlicher Stick ist mit der Chipkombination RTL2832U und R820T ausgeführt.
Preiswert in China über ebay zu beziehen mit den Suchbegriffen „DVB-T RTL2832U R820T“ unter „weltweit“.
Preis ca. 10€ inkl. Porto , Lieferung dauert meistens 2 bis 3 Wochen. Zoll ist bei dieser Einkaufssumme m.E. keiner fällig.
Viel Spass beim Nachbau

Nachtrag:

Die Besitzer von einigen FS20 Komponenten können wahrscheinlich ein Lied darauf singen, wie wichtig die „Funk-Gesundheit“ eines drahtlosen Automationssystems ist. Lt. aktueller c´t -Ausgabe haben einige FS20-Komponenten wohl sehr breitbandige Empfänger, die mit den Aussendungen des LTE-Datenfunks im Frequenzbereich 790 bis 882Mhz einige Probleme haben. siehe : http://www.heise.de/ct/12/26/links/025.shtmlWenn ich das Datenblatt des Funkchips (CC1100 von Texas Instruments) von den Homematic-Komponenten richtig interpretiere, haben wir hier einen relativ schmalbandigen Empfänger und sind hoffentlich von diesem Thema verschont. Trotzdem sieht man an dem FS20-Beispiel, wie wichtig die „Funk-Hygiene“ für den störungsarmen und sicheren Betrieb eines Automationssystems ist.Zwar ist der Funkverkehr mit der Homematic insofern „sicher“, weil er die Befehle quittiert. Aber was nützt das alles, wenn bei Funkstörungen dauernd Fehlermeldungen entstehen? Eine zuverlässige und damit sichere Verbindung ist auch bei der Homematic nur bei sauberen Hochfrequenz-Verhältnissen möglich! Zwar ist die Arbeitfrequenz von 868,35Mhz z.Zt. noch recht frei, aber dies wird sich sicher in Zukunft ändern, ähnlich wie schon bei 435Mhz vorgelebt.Also wer ein zuverlässiges Homematic-System haben will sollte ….
1  die Antennen für optimale Verbindung einrichten
2  ggf. eine externe CCU-Antenne platzieren
3  hochfrequenzmäßige Störquellen identifizieren und beseitigen.
4  Repeater nur im Notfall einsetzen
Für den Punkt 3. habe ich den Panoramampfänger mit dem DVB-T Stick sehr gut einsetzen können! Mit einer geeigneten Antenne kann man ausgezeichnet sehen, was die eigene Homematic aussendet und, was noch wichtiger ist, ob auf der Sendefrequenz sich noch andere Sender tummeln, die der eigenen Homematic das Leben schwer machen. Wenn man einfach nur den DVB-Stick kauft und die spezielle Software auf dem PC betreibt, dann reicht dies eigentlich für den Homematic-User zur Kontrolle seines Systems völlig aus.Wer aber mehr mit diesem tollen Stick machen möchte und beispielsweise auch niederfrequentere Störungen im Mittel- und Kurzwellenbereich analysieren möchte, die beispielsweise von schlechten Schaltnetzteilen oder Datenübertragungen über Netzleitungen verursacht werden, der kauft sich einen zusätzlichen Frequenzumsetzer.
Ich habe mir einen preiswerten Umsetzer „Ham It Up“ über ebay in den USA bestellt. Kosten mit Versand unter 40€. Dieser Frequenzumsetzer transformiert die Eingangsfrequenz von 0 bis 50Mhz in einen für den DVB-T Stick empfangbaren Bereich von 100 bis 150Mhz. In der Empfangssoftware SDR# wird dann lediglich ein Frequenzoffset von 100Mhz eingestellt.Selbst ohne Lötkolben kann man dieses Modul mit geeigneten Verbindungskabeln mit dem DVB-T Stick und der USB-Buchse des PC verbinden. Wer´s besonders gut machen will, der baut sowohl den Stick als auch den Frequenzumsetzer in ein Weißblechkästchen ein. Weitere Details findet man hier:
http://www.hamradioscience.com/ham-it-up-hf-converter/
Damit hat man nun einen Kontrollempfänger von 0 bis in den Ghz-Bereich und kann entweder zum Vergnügen auf Wellenjagd gehen oder zielgerichtet irgendwelche Störer ermitteln. Ich habe damit bereits das 24V-Schaltnetzeil für meine Wired-Komponenten als Störenfried entdecken können. Die angehängten Bilder zeigen sehr schön die beachtlichen Störungen („Lattenzaum“) im Kurzwellenbereich mit schlechtem und „gutem“ Netzteil. In meinem Haus hatte ich noch weitere Schaltnetzteile mit erheblichem „Sendungsbewusstsein“, die ich so leicht identifizieren konnte. Sicher sind diese Störungen für die Homematic kaum relevant, aber an dem Beispiel kann man gut erkennen, wie gut die Störungssuche mit diesem Panoramaempfänger möglich ist.
Hier noch einige Links bei Youtube zum Angucken: Stichwort „RTL2832“ und/oder „Ham It Up“
http://www.youtube.com/watch?v=Rnof4xGkdAo
http://www.youtube.com/watch?v=Z0hEquzLsWUsdr2normales Frequenzspektrum ohne StörungenFrequenzspektrum mit Störungen durch schlechtes Schaltnetzteilssdr4

8-fach Temperaturmessung für Heizungsüberwachung

8-fach Temperaturmessung für Heizungsüberwachung

Ausgangssituation:

Leider erlaubt die Regelung meiner Buderus-Heizung nicht die Kommunikation mit der CCU, da das Datenprotokoll des seriellen Busses (wahrscheinlich ähnlich RS485) nicht offengelegt ist.Allerdings möchte ich doch bestimmte „unabhängige“ Komponenten wie zusätzliche Zirkulationspumpen und die Anbindung an die thermische Solaranlage von der Homematic steuern, so dass ich einige Informationen aus dem Heizungssystem (insbesondere mehrere Temperaturen) benötige. Diese Informationen sind natürlich in der Heizungsregelung schon vorhanden, aber ich komme ja nicht dran! Zudem sollte die Homematic-Steuerung völlig unabhängig von der Heizungsregelung sein, um nicht irgendwelche versicherungsrechtliche Probleme zu bekommen.Als Randbedingung hatte ich ein Wired 12/14 IO-Modul in einem Schaltkasten etwa 5m von der Heizung verfügbar. Allerdings waren nicht genügend Ports frei, da ich mindesten 8 Temperaturen analog aufzeichnen wollte. Die Verwendung von sog 1-wired-Temperatursensoren in Verbindung mit einem entsprechenden USB-Interface kam für mich nicht in Frage, da ich mit diesen Sensoren nicht so gute Erfahrungen gemacht hatte. Demgegenüber sind herkömmliche NTC-Messwiderstände sehr robust und werden deshalb wohl in der Heizungstechnik fast ausschließlich eingesetzt.Hardware:
Meine guten Erfahrungen mit dem Bau eigener NTC-Meßfühler und der einfachen Einbindung über Analogeingang und Skript (siehe http://homematic-forum.de/forum/viewtopic.php?f=31&t=12216 ) führten zu einer Lösung mit einem 8-fach Multiplexer. Wenn relativ hochohmige Fühler verwendet werden, kann mit einfachen Bauelementen und etwas Löterfahrung ein preisgünstiger Multiplexer für unter 10€ aufgebaut werden!
Der folgende Schaltplan zeigt die NTC-Temperaturfühler, deren Signale über zwei 4-fach CMOS-Umschalter im CMOS-IC 4052 auf zwei freie analoge Eingänge des Wired 12/14 IO-Modul abgefragt werden können. Welcher von den jeweils vier Eingangssignalen gerade durchgeschaltet wird, hängt von den digitalen Steuersignalen A0 und A1 ab, die direkt an zwei freie digitale Ports (Open Collector) angeschlossen sind. Benötigt werden also zur Steuerung des Multiplexers nur zwei digitale Ausgangsports und zwei analoge Eingangsports.

Multiplexer_schaltplan

Zur Schaltung selbst gibt es wenig zu sagen, außer daß zur Glättung der analogen Signale und zur Störungsunterdrückung bei langen Leitungen direkt am analogen Eingang des Wired 12/14 IO-Moduls noch zwei 10uF Elkos direkt angeschaltet werden müssen. Ansonsten führen kleine Störsignale zu häufigen Signalaussendungen des Moduls und können u.U. zu Traffic-Problemen auf dem RS485-Bus führen.

Als Einganssignal kann man nicht nur Temperaturfühler verwenden sondern z.B. auch Optokoppler wie den PC814 zur potentialfreien Überwachung von Netzspannungssignalen. Ebenfalls sind einfache Schalter als Sensoren verwendbar.

Die kleine Schaltung habe ich in eine normale Verteilerdose eingebaut und direkt an der Heizung zum kurzen Anschluss der Temperatursensoren platziert. Über ein 6-adriges Telefonkabel ist das Kästchen mit dem Wired 12/14 IO-Modul verbunden.

Bild_elektronik

Für die Temperatursensoren habe ich sehr kleine NTC-Präzisionswiderstände von Epcos verwendet
(http://www.conrad.de/ce/de/product/500682/Epcos-Heissleiter-S861-HEISSLEITER-PRAeZTEMP-MESSUNG-S861-1-R-25-10-K-Heissleiter-Nenn-Temperatur-25-C-Toleranz-1.
Diese wurde in eine Messinghülse mit Silikon eingeklebt; vorher natürlich mit einer Koaxleitung kontaktiert. Mehr zum Selbstbau der Meßfühler ist unter dem o.a. ersten Link zu finden.

Software:
– Zuerst werden für jeden Meßkanal entsprechende Systemvariable vom Typ Zahl angelegt. Bei mir sind dies die Variablen „NTC_Temp_0“ bis „NTC_Temp_7“
– Im folgenden Steuerprogramm wird zyklisch ( bei mir alle 4 Minuten) ein Messzyklus ausgelöst. Innerhalb des Zyklus erfolgt jede Minute eine Abtastung von zwei Kanälen, danach erfolgt die Weiterschaltung des Messkanals mit Ausgabe der Steuersignale „Pointer A1_DO2:8“ und „Pointer A0_DO6:12“. Ich hoffe, das Programm kann man so verstehen.

Multriplexer_prog

Die im Programm verwendeten Skripte unterscheiden sich jeweils geringfügig, je nachdem welcher Port gerade eingelesen wird. Die dort verwendeten Parameter sind für die ausgewählten NTC-Widerstände mit der nachfolgenden Excel-Tabelle berechnet worden (Genaueres hierzu im oben angegebenen Link):

Multiplexer_Tabelle_Ntc

Damit man das komplette Programm sehen kann, hier das Listing:

Listing

Erfahrungen:
Gerätchen läuft seit einigen Monaten. Anfangs hatte ich einige Probleme mit den Störsignalen auf den analogen Eingängen. Diese führten zu Timing-Problemen auf dem RS-485 -Bus. Mit den o.a. Kondensatoren war aber Ruhe. Im Systemprotokoll sind hin und wieder Kommunikationsprobleme zun verzeichnen, aber meist nur dann, wenn die Abtastrate deutlich verkürzt wird. Da aber ohnehin die Temperaturen sich sehr langsam verändern reicht die Abtastung der 8 Kanäle alle 4 Minuten völlig aus. Die Auflösung ist bei den verwendeten Sensoren je nach Messbereich ca. 0,2gradC. Die Genauigkeit muß ich noch durch Versuche ermitteln, ich schätze für meine Anwendungsbereiche ca. 1 bis 2 gradC.

Haftungs- und Sicherheitshinweise

Beim Nachbau müssen natürlich alle wichtigen einschlägigen Sicherheitsvorschriften für den Umgang mit gefährlichen Spannungen  eingehalten werden. Fundierte theoretische und praktische Fachkenntnisse der Elektrotechnik und für den Umgang mit gefährlichen Spannungen sind unverzichtbar!!

Durch eine unsachgemäße Installation gefährden Sie ihr Leben und das Leben ihrer Mitmenschen! Darüberhinaus riskieren Sie erhebliche Sachschäden , welche durch Brand etc. hervorgerufen werden können ! Für alle Personen- und Sachschäden durch falsche Installation etc. ist nicht der Hersteller sondern nur der Betreiber verantwortlich.

Ich verweise hier unbedingt auf  die  „Sicherheitshinweise und Haftungsausschluss„-Seite dieses Blogs.

 

NTC Temperatursensor am wired 12/14 IO-Modul

NTC Temperatursensor am wired 12/14 IO-Modul

Temperatursensoren für eine Hausautomation kann man ja gar nicht genug haben. Die Diskussionen in diesem Thread viewtopic.php?f=27&t=7751&hilit=temperaturmessung zeigen, daß preisgünstige sog. 1-wired Sensoren ideal wären, aber leider die Integration mit Homematic-Modulen zumindest bei der heutigen Entwicklungsgeschwindigkeit von ELV in nächster Zeit nicht zu erwarten ist.Das Wired 12/14 IO-Modul hat mit 6 analogen Eingängen gute Möglichkeiten, analoge Temperatursensoren auszuwerten. Das Problem ist nur, dass geeignete preiswerte Sensoren für den Eingangspannungsbereich 0 bis +10V nicht erhältlich sind bzw. nur in Verbindung mit einer geeigneten und dementsprechend teuren Anpasselektronik funktionieren. Insbesondere bei der Regelung von Heizungen werden fast ausschließlich NTC-Widerstände als Temperatursensoren eingesetzt. Der Nachteil einer nichtlinearen Widerstandcharakteristik fällt dabei kaum ins Gewicht, weil die Steuerungen mit geeigneten Algorithmen die Temperaturen aus dem Widerstandswert einfach berechnen können. Eigentlich könnten wir in der Homematic auch eine Berechnung mittels Skript durchführen, das Problem ist nur, dass die Widerstandscharakteristik exponential bzw. logaritmisch ist und solche mathematische Funktionen in der Skript-Sprache m.W. leider nicht verfügbar ist. Also kam nur eine Berechnung mit den vier Grundrechenarten in Frage.
Für die Steuerung einzelner Heizungskomponenten (Umwälzpumpen etc. ) benötigte ich mehrere Temperatursensoren mit möglichst weitem Temperaturbereich, weshalb ich die nachfolgend beschriebene Lösung entwickelt habe:
Verwendet wird ein preiswerter NTC und ein zusätzlicher Vorwiderstand. Das ist alles! Das Bild oben zeigt die Schaltung.

Vom +24V-Anschluss wird einfach der Vorwiderstand (100KOhm) auf den analogen Eingang des 12/14 IO-Moduls geschaltet und zwischen dem Eingang und Masse der NTC-Widerstand zugeschaltet. Unter der Annahme , daß der interne A/D-Wandler sehr hochohmig ist, ergibt sich aus dem Schaltplan ein Eingangswiderstand des analogen Einganges von insgesamt 62,5KOhm. Dieser bildet mit dem NTC und dem Vorwiderstand Rv einen Spannungsteiler. Damit entsteht in Abhängigkeit von der Temperatur am analogen Eingang ein Signal von etwa 0 bis 10V. Die Nichtlinearität der analogen Eingangsspannung in Abhängigkeit von der Temperatur hängt vom verwendeten NTC-Widerstand ab und ist im entsprechendenden Datenblatt als Tabelle genau definiert.
Ich habe einen 10KOhm NTC von Reichelt für 0,33€ verwendet, wie er so ähnlich in vielen Heizungen eingesetzt wird.
http://www.reichelt.de/NTC-0-2-10K/3/index.html?&ACTION=3&LA=446&ARTICLE=13553&artnr=NTC-0%2C2+10K&SEARCH=ntc+10k
Das Datenblatt mit der Widerstandskennlinie gibt´s da auch unter „Datenblätter und Downloads“.
Die gekrümmte Kennlinie habe ich nun abschnittsweise durch Geradenstücke ersetzt. Im für mich besonders wichtigen Bereich nahe Raumtemperatur und wegen der dort stärkeren Krümmung der Kennlinie wurden hier mehr Geradenstücke zur Linearisierung eingesetzt als in den Randbereichen. Mit einer Excel-Tabelle wurden die einzelnen Kennwerte der Geradenstücke (Steigung m und T-Abschnitt n ) aus der Werteliste des NTC berechnet. Diese Werte werden in einem einfachen Skript verwendet, um die Temperaturwerte aus der Eingangsspannung Ut zu bestimmen.
Damit das Ganz nicht zu kompliziert wird hier mein „Kochrezept“:

1  Auswahl eines geeigneten NTC-Widerstandes möglichst im Bereich um 10KOhm oder am besten den oben vorgeschlagenen Widerstand nehmen.

2  Vorwiderstand 100KOhm anschließen lt. Schaltplan. Achtung, da die 24V.Spannung als Referenzspannung dient, sollte sie auch möglichst genau 24V sein. Überprüfen!

Mit der NTC-Werteliste und dem nachfolgendem Excel-Berechnungsprogramm die Parameter der Geradengleichungen berechnen.

Folie2

Hier ist das Excel-Programm zur Linearisierun_NTC

4  Systemvariable für die Temperatur definieren, z.B. „NTC_Temp“ , Variablentyp „Zahl“, Maßeinheit „Celsius“

 

5  WebUI-Programm erstellen, wobei der Messwert z.B. alle 3 Minuten berechnet wird. (Zeitabstände möglichst groß, um di CCU nicht zu sehr zu belasten!)

NTC_1

6  Folgendes Skript zur Umrechnung der analogen Eingangsspannung verwenden:

HM-Skript   
!Berechnung Temperatur aus NTC Widerstandswert 10KOhm!Wert vom analogen Eingang holen
real Ut = dom.GetObject("BidCos-Wired.IEQ0525027:26.VALUE").Value();
 
!lgeeignete linearisierte Kennlinie aussuchen und Temperatur berechnen
real Temp = -999;      !NTC hat Kurzschluss
if (Ut >10.0)  {Temp = 126.310 - (0.859*Ut);}
if (Ut>77.2)  {Temp = 92.426 - (0.420*Ut);}
if (Ut>112.9)  {Temp = 76.264 - (0.277*Ut);}
if (Ut >167.1)  {Temp =65.700 - (0.214*Ut);}
if (Ut >190.5)  {Temp =60.915 - (0.189*Ut);}
if (Ut >217.0)  {Temp =56.340 - (0.167*Ut);}
if (Ut >246.8)  {Temp = 51.926 - (0.150*Ut);}
if (Ut >280.3)  {Temp = 46.342 - (0.130*Ut);}
if (Ut >357.4)  {Temp = 39.291 - (0.110*Ut);}
if (Ut >900)  {Temp = 999;} !kein NTC angeschlossen
 
!Temperatur auf Systemvariable speichern
dom.GetObject("NTC_Temp").State(Temp);
dom.GetObject("Kennlinie").State(kennlinie);

7  NTC-Sensor geeignet „verpacken“ z.B. so:

Folie3

Abschließend noch einige Anmerkungen zur Genauigkeit und Auflösung:
Die Auflösung in den einzelnen Arbeitsbereichen ist unterschiedlich. Wie man in dem Excel-Berechnungsprogramm in der Spalte „Auflösung/oC“ sieht, nimmt die Auflösung zu den hohen Temperaturen ab ( weil beim NTC dort die relative Widerstandänderung immer kleiner wird). Insgesamt ist aber für meine Heizungsanwendungen die Auflösung im Temperaturbereich von -15oC bis 100oC völlig ausreichend.
Die Genauigkeit ist schwieriger abschätzbar. Sie hängt davon ab, wie genau der NTC die Datenblattangaben einhält. Auch ist wichtig, dass die Referenzspannung 24V möglichst genau eingehalten wird und daß natürlich die anderen Widerstände möglichst genau sind.

Anmerken möchte ich noch, daß diese Methode natürlich auch bei anderen nichtlinearen Sensoren ( z.B. Fotowiderstand, Hall-Element, etc. )geeignet ist, das Signal zu linearisieren und auszulesen. Da ist noch viel Platz für eigene Projekte!

Viel Spass beim Nachbau!

Haftungs- und Sicherheitshinweise

Beim Nachbau müssen natürlich alle wichtigen einschlägigen Sicherheitsvorschriften für den Umgang mit gefährlichen Spannungen  eingehalten werden. Fundierte theoretische und praktische Fachkenntnisse der Elektrotechnik und für den Umgang mit gefährlichen Spannungen sind unverzichtbar!!

Durch eine unsachgemäße Installation gefährden Sie ihr Leben und das Leben ihrer Mitmenschen! Darüberhinaus riskieren Sie erhebliche Sachschäden , welche durch Brand etc. hervorgerufen werden können ! Für alle Personen- und Sachschäden durch falsche Installation etc. ist nicht der Hersteller sondern nur der Betreiber verantwortlich.

Ich verweise hier unbedingt auf  die  „Sicherheitshinweise und Haftungsausschluss„-Seite dieses Blogs.

Ansteuerung des SCI-3-FM Schließerkontakt-Interface

Ansteuerung des SCI-3-FM Schließerkontakt-Interface

Zur Ermittlung des Betriebszustandes der einzelnen Komponenten meiner Audio/TV-Anlage benötigte ich geeignetes Interface, um mit einer Zustandserkennung die Wohnzimmerbeleuchtung, den Sat-Schalter, den Antennenverstärker und noch andere Komponenten zu betätigen. Mit dem SCI-3-FM 3-Kanal-Funk-Schließerkontakt-Interface kann man eine Zustandserkennung realisieren, allerdings nur mit geeigneten Schaltrelais, die dann von den einzelnen Geräten bzw. von deren Versorgungsspannungen betätigt werden.
Ich wollte aber möglichst keine Relais einsetzen, sondern direkt mit den in den einzelnen Geräten zur Verfügung stehenden Spannungen das Schließerkontakt-Interface ansteuern. Die im nachfolgenden Schaltplan dargestellten recht simplen Möglichkeiten habe ich in verschiedenen Anwendungen erprobt. Für den bastelfreudigen Homematiker ist die Realisierung sicher kein Problem.
Folie1 Folie2

Wenn eine Potentialtrennung nicht notwendig ist, dann kann recht einfach mit einem NPN-Transistor ein Eingang das Schließerkontakt-Interface angesteuert werden. Die gewählte Dimensionierung funktioniert für einen weiten Gleichspannungsbereich von 4,5V bis über 24V. Als Schalter wird ein Standard NPN-Kleinsignal-Transistor eingesetzt.Der Link zeigt hierzu geignete Typen.
Sollte aus verschiedenen Gründen eine Potentialtrennung notwendig sein, dann erfolgt die Ansteuerung mit Optokopplern z.B. mit dem sehr gebräuchlichen PC817. Hier muss in Abhängigkeit von der Gleichspannung der Vorwiderstand Rv für den Optokoppler dimensioniert werden (siehe Tabelle).
Für die Erkennung des Einschaltzustandes von 230V-Geräten ist auf jeden Fall eine Potentialtrennung notwendig. Eine Schaltungsvariante, die ich für die Überwachung meiner Heizungspumpen verwende, ist unten dargestellt.
Das obere Bild zeigt das Beispiel einer Realisierung. Hier wurde zusätzlich die Batterie für das Schließerkontakt-Interface durch ein einfaches geregeltes 3V-Netzteil ersetzt, was im Hinblick auf Batterieverbrauch manchmal ganz sinnvoll sein kann.

Haftungs- und Sicherheitshinweise

Beim Nachbau müssen natürlich alle wichtigen einschlägigen Sicherheitsvorschriften für den Umgang mit gefährlichen Spannungen  eingehalten werden. Fundierte theoretische und praktische Fachkenntnisse der Elektrotechnik und für den Umgang mit gefährlichen Spannungen sind unverzichtbar!!

Durch eine unsachgemäße Installation gefährden Sie ihr Leben und das Leben ihrer Mitmenschen! Darüberhinaus riskieren Sie erhebliche Sachschäden , welche durch Brand etc. hervorgerufen werden können ! Für alle Personen- und Sachschäden durch falsche Installation etc. ist nicht der Hersteller sondern nur der Betreiber verantwortlich.

Ich verweise hier unbedingt auf  die  „Sicherheitshinweise und Haftungsausschluss„-Seite dieses Blogs.

Türverriegelung mit Homematic-Schaltaktor und RFID-Zugang

Türverriegelung mit Homematic-Schaltaktor und RFID-Zugang

Jeder kennt das Problem, dass man die Haustür zwar geschlossen hat, die Tür aber nicht mit dem Schlüssel verriegelt ist. Dementsprechend leicht kann man mit Scheckkarte oder ähnlichen Gegenständen die Tür öffnen. Eine Lösung ist das konsequente manuelle Abschließen oder z.B. die Betätigung des Türschlosses mit der Keymatic. Mal abgesehen vom Preis ist dieser batteriebetriebene Homematic-Aktor vermutlich regelmäßig mit neuen Batterien auszustatten, was mich bisher von einer Beschaffung abgehalten hat. Zudem benötige ich für meine Verhältnisse mindestens fünf Schlüssel bzw. Fernbedienungen. Deshalb suchte ich eine möglichst batteriefreie Lösung , die folgende weitere Eigenschaften haben sollte:

> außer beim Ein-und Ausgehen muß die Tür dauernd verriegelt sein.
> Bedienung der Tür sollte mit Homematic-Komponenten als auch mit RFID-Tags erfolgen
> Beim Hinausgehen soll die Tür automatisch nur entriegelt aber nicht geöffnet werden; das Öffnen soll manuell mit der Türklinke erfolgen.
> Beim Hineingehen soll die Tür mit der Homematic-Fernbedienung als auch mit den RFID-Tags automatisch sowohl entriegelt als auch geöffnet werden.
Professionelle Lösungen mit ähnlicher Funktionalität gibt es , diese kosten aber auch professionelle Preise. Also wurde ein Selbstbau ins Auge gefasst . Hier möchte ich über meine Lösung berichten, um Anregungen für ähnliche Bastelprojekte zu geben.
Beim Googeln ergaben sich interessante und kostengünstige Lösungen u.a. auf Basis von Fernost-Komponenten:
– ein RFID-Zugangssystem mit 10 Schlüsselanhängern und RFID-Karten für 7 € (ebay Stichwort „RFID access“ und „weltweit Suche“)
– ein elektromagnetischer Türriegel für etwa 20€ (ebay Stichwort „electric door bolt“ )
– ein Schaltnetzteil 12V und Imax 3A für etwa 15€ ( ebay Stichwort “ access power supply control“
– ein Bewegungsmelder für die Türinnenseite für ca. 2€ (ebayStichwort „PIR module“)
– ein elektrischer Türöffner passend zum Türschloss ca. 16 €
– ein HomeMatic-Schaltaktor für Batteriebetrieb als Bausatz für ca. 26 €
– Elektronikbox als Selbstbau mit Relais und etwas Elektronik-Kleinkram für ca. 20 €
Alles zusammen ist der reine Materialpreis etwa 110€, was bei der erreichbaren Funktionalität günstig ist. Arbeitslohn dürfen wir natürlich nicht rechnen, denn das Ganze soll ja eine hobbymäßige Bastelei sein!Das nächste Bild zeigt die hier eingesetzten Komponenten:
Komponenten

Das verwendete Netzteil hat zwar schon eine integrierte Steuerung für den Türöffner und die Verriegelung, aber leider hatte ich vom Stromkasten zur Tür nur eine 3-Drahtleitung zur Verfügung, so dass die standardmäßige Verdrahtung bei mir nicht möglich war. Deshalb habe ich eine kleine Steuerbox zusammengestellt, in der zusätzliche Funktionalitäten wie Bewegungsmelder und Leistungsbegrenzung des dauernd eingeschalteten Verriegelungsmagneten integriert sind. Die Einzelheiten sind den nachfolgenden Bildern zu entnehmen.

Schaltplan

Um die Erwärmung des dauernd bestromten Verriegelungsmagneten gering zu halten, wurde mit einem modifizierten Schaltregler die Betriebsspannung von 12V auf ungefähr 6V abgesenkt. Nur beim Einschalten ist etwa 1sec die volle 12V-Spannung vorhanden. Details in dem folgenden Bild:

Step_down_regler

Das RFID-Zugangssystem AD-2000M soll angeblich auch für Außenmontage geeignet sein, aber die Kunststoffkiste ist für einen robusten Aussenbetrieb völlig ungeeignet! Das macht aber nichts, denn ich wollte an der Türaußenseite sowieso nur eine möglichst nicht sichtbare RFID-Antenne haben, um gar keine Möglichkeit der Manipulation zu geben. Die Tastatur für die Programmierung bzw. das RFID-Steuergerät ist dementsprechend nur auf der Innenseite der Haustür angebracht. Die RFID-Antenne wurde ausgebaut und ist hinter einer nicht metallischen Türblende so befestigt. dass man von außen den RFID-Tag daran halten kann.

RFID_geraet

 

Das nächste Bild zeigt die Schaltbox mit dem Bewegungsmelder (Rückseite) , Step-Down-Schaltregler und den Relais.

Box

 

Abschließend soll noch mal darauf hingewiesen werden, dass mit solch einem elektrischen Riegel nicht nur die Sicherheit erhöht wird, sondern damit auch bei Verlust des Schlüssels oder bei Ausfall des Systems die Schwierigkeiten ungleich größer sind, die Tür zu öffnen! Man sollte deshalb vor Inbetriebnahme über diese „Eventualitäten“ nachdenken. Viel Spaß beim Nachbau!

… und das ist vielleicht auch noch hilfreich:
Das chinesische RFID-Zugangssystem AD2000-M hatte eine völlig unverständliche Bedienungsanleitung. Deshalb hier eine hoffentlich bessere Anleitung.

Manual_ ad2000-M_1

Haftungs- und Sicherheitshinweise

Beim Nachbau müssen natürlich alle wichtigen einschlägigen Sicherheitsvorschriften für den Umgang mit gefährlichen Spannungen  eingehalten werden. Fundierte theoretische und praktische Fachkenntnisse der Elektrotechnik und für den Umgang mit gefährlichen Spannungen sind unverzichtbar!!

Durch eine unsachgemäße Installation gefährden Sie ihr Leben und das Leben ihrer Mitmenschen! Darüberhinaus riskieren Sie erhebliche Sachschäden , welche durch Brand etc. hervorgerufen werden können ! Für alle Personen- und Sachschäden durch falsche Installation etc. ist nicht der Hersteller sondern nur der Betreiber verantwortlich.

Ich verweise hier unbedingt auf  die  „Sicherheitshinweise und Haftungsausschluss„-Seite dieses Blogs.

4fach Schaltaktor steuert Buderus Heizung mit RC35 Bediengerät

4fach Schaltaktor steuert Buderus Heizung mit RC35 Bediengerät

Das Bediengerät RC35 für meine Buderus Heizung kommuniziert zwar über einen RS-485-Bus mit dem Heizungscontroller, aber leider ist das Protokoll nicht bekannt und ein „Einklinken“ in diesen Datenverkehr wäre kaum sinnvoll. Allerdings wollte ich doch zumindest aus der Ferne die Heizung von Tag(Hochtemperatur) auf Nachtbetrieb(Niedertemperatur) umstellen können und auch die Auslösung der Warmwasser-Erwärmung wäre sinnvoll. Hierfür hat die RC35-Bedieneinheit ingesamt 4 Tasten, die wunderschön durch den neuen 4-fach Funk-Schaltaktor HM-LC-Sw-Ba-PCB betätigt werden können. Sehr gut ist auch, dass dieser Aktor bereits mit 3V betrieben werden kann und eine vergleichbare Spannung (3.3V) auch in der Buderus Bedieneinheit zur Verfügung steht. Mit den ausgangsseitigen Mosfets lassen sich direkt und ohne Zusatzbauteile die RC35-Taster betätigen. Mit ein wenig sensibler Lötarbeit kann so ein Homematic-Interface für die Heizungsbedienung realisiert werden.

Die nachfolgenden Bilder zeigen die Vorgehensweise zum Umbau:Hier ist die fertige Bedieneinheit RC35 mit dem 4-fach-Schaltaktor. Der im oberen Bild sichtbare Funk-Schaltaktor verschwindet bei mir in einer grösseren Schaltdose hinter der Bedieneinheit, damit er nicht sichtbar ist.Die Bedieneinheit wird von hinten geöffnet, indem man unten oder oben das Gehäuse nach aussen drückt. Die Schränkklapen geben dann den hinteren Deckel frei.

Bild2

Dann löst man die 4 Schrauben und kann die Platine vorsichtig nach oben klappen.

Bild3

An jeden der vier Tasteranschlüsse lötet man vorsichtig vier dünne flexible Litzen an, die jeweils mit einem Ausgang des Schaltaktors verbunden werden.

 

Bild4

Hier sieht man genauer das Anlöten an den Tasterprint.

 

Bikld5

Die 3.3V-Spannungsversorgung holt man von diesen Lötpunkten. Links im Bild ist Plus, rechts Minus.

Bild6

Insgesamt ist der Funk-Schaltaktor mit 6 Strippen mit der RC35-Bedieneinheit verbunden.

 

Bild7

Programmtechnisch wird der jeweilige Taster so angesteuert, dass er für etwa 1s Einschaltdauer eingeschaltet wird. Im Normalbetrieb müssen alle Ausgänge immer ausgeschaltet sein, sonst wird die Tastatur im RC35 blockiert.
Das System funktioniert bei mir prima und löst meine alte Lösung mit mehreren 1-fach Schaltaktoren ab.

Abschliessend möchte ich darauf hinweisen, dass mit dieser Lösung das Heizungssystem verändert wird und dies haftungstechnische Folgen haben kann. Das ist also nur etwas für „Personal vom Fach“ ;

ich übernehme jedenfalls keinerlei Haftung!!

Anmerkung: Von Buderus gibt es neben den RC35-Bediengerät den Vorläufertyp RC30. Dieser sieht fast genauso aus, hat aber eine andere Elektronik mit 5V-Versorgungsspannung. Die vorgestellte Lösung geht mit entsprechenden Änderungen bezüglich der Spannungsversorgung des Schaltaktors auch mit RC30.

Haftungs- und Sicherheitshinweise

Beim Nachbau müssen natürlich alle wichtigen einschlägigen Sicherheitsvorschriften für den Umgang mit gefährlichen Spannungen  eingehalten werden. Fundierte theoretische und praktische Fachkenntnisse der Elektrotechnik und für den Umgang mit gefährlichen Spannungen sind unverzichtbar!!

Durch eine unsachgemäße Installation gefährden Sie ihr Leben und das Leben ihrer Mitmenschen! Darüberhinaus riskieren Sie erhebliche Sachschäden , welche durch Brand etc. hervorgerufen werden können ! Für alle Personen- und Sachschäden durch falsche Installation etc. ist nicht der Hersteller sondern nur der Betreiber verantwortlich.

Ich verweise hier unbedingt auf  die  „Sicherheitshinweise und Haftungsausschluss„-Seite dieses Blogs.

Zirkulationspumpe wärmebedarfsgerecht geschaltet

Zirkulationspumpe wärmebedarfsgerecht geschaltet

Nach einer längeren Aufzeichnung der Temperatur im Warmwasserspeicher meiner Heizung war ich mehr oder weniger erschüttert, wie schnell sich das Wasser auch ohne Wasserzapfen abkühlt. Da bei mir der Warmwasserspeichger recht gut gedämmt ist, kam als Ursache nur die Zirkulationsleitung in Frage. Im Winter sind hier Wärmeverluste ziemlich egal, weil die Wärmeverluste die Raumheizung unterstützen. In der Übergangszeit und im Sommer ist nach meiner Messung hier noch erhebliches Einsparpotential vorhanden.
Bisher hatte ich nur eine passive Zirkulation (ohne Zirkulationspumpe), weil ich glaubte, damit zumindest die Stromkosten für das Pümpchen zu sparen. Aber die Messung zeigt klar, dass die Stromenergie für die Zirkulationspumpe eigentlich vernachlässigbar im Vergleich zu den Wärmeverlusten der Ringleitung durch die natürliche Zirkulation ist.
Ein Stillegen der Ringleitung wäre eine wenn auch unkomfortable Lösung, allerdings wäre bei mir ein hoher Installationsaufwand notwendig.
Ein einfaches Unterbrechen der Ringleitung ist auch nicht anzuraten, weil in den toten Leitungen eine Gefahr für Legionellen enstehen könnte.Die erste Idee, die Wärmeverluste zumindest nachts zu reduzieren, wäre ein Schaltventil im Warmwasser-Rücklauf. Besser schien mir aber die Installation einer kleinen Zirkulationspumpe in Verbindung mit dem meist bereits in der Pumpe integrierten Rückschlagventil: wenn die Pumpe nicht läuft, dann entsteht auch keine natürliche Zirkulation.Die Frage war nun, wie die beste Schaltstrategie für die Zirkulationspumpe ist. Einfach zu bestimmten Tageszeiten einschalten ist zwar eine Lösung, aber für einen Homematiker zu simpel! Im Internet kursieren die wildesten Vorschläge für eine bessere Steuerung der Zirkulationspumpe: Das beginnt mir Differenzmessung der Temperaturen im Vor- und Rücklauf und geht bis zu aufwendigen Durchflussgebern, die den Wasserbedarf detektieren.
Ich habe mich für eine sehr einfache Methode entschieden(Bild 1).Folie2Mit nur einem Temperaturfühler ( kann der billigste NTC-Widerstand sein) wird am Warmwasser-Vorlauf nur die Änderung der Temperatur ausgewertet. Die absolute Temperatur ist unerheblich. Wenn nun an einem Wasserhahn warmes Wasser gezapft wird, dann erwärmt sich am WW_Speicher-Auslauf schlagartig das Vorlauf-Rohr. Mit einem NTC-Temperatursensor, der natürlich innig mit diesem Kupferrohr verbunden sein muß, kann die Temperatürerhöhung der Vorlauftemperatur in weniger als einer Sekunde erkannt werden. Davon ausgelöst wird dann die Zirkulationpumpe solange eingeschaltet, bis keine Temperaturänderung mehr vorliegt. Einige Versuche und Messungen an meiner Heizung haben gezeigt, dass dies ein sehr gute Steuerungsstrategie ist.Wie nun realisieren und möglichst mit Standard-Homematic- Komponenten??
Das Problem ist die schnelle Temperaturmessung! Übliche drahtlose Homematic-Sensoren scheiden aus , da viel zu langsam. Die Verwendung eines analogen Einganges vom HMW-IO-12-Sw14-DR war schon deutlich besser, aber immer noch zu langsam, um schnell bei Aufdrehen des Wasserhahns die Zirkulationspumpe einzuschalten.Auch wären komplexe Skripte notwendig, um aus dem Signal mit einem mehr oder weniger aufwendigen Algorithmus ein Schaltsignal zu erzeugen.Die Lösung war der Selbstbau einer simplen Elektronik, die aber auch von Homematic-Aktoren schaltbar sein sollte.z_pumpensteuerung_2Das Bild zeigt den Schaltplan meiner Steuerung. Die verwendeten „Wald und Wiesen“-Bauteile kosten weit unter 10€. Der Pfiff der Schaltung ist, dass zur Messung der Temperaturänderung das Spannungssignal vom NTC-Temperatursensor einfach nur differenziert wird. Das Differential berechnet der Inverter I1 (CMOS-IC HC 4069), der hier als analoger Operationsverstärker „missbraucht“ wird. Bei konstanter Temperatur ist die Spannung am Ausgang von I1 die halbe Versorgungsspannung, also hier 2,5V. Verändert sich die Temperatur mehr oder eniger schnell, dann schlägt die Inverterspannung deutlich verstärkt nach oben oder unten aus. Das wird dann im nachfolgen Schmitt-Trigger (I2 und I3) zu einem sauberen Schaltsignal umgeformt.Die nachgeschalteten Inverter I4, I5 und I6 bräuchte man eigentlich nicht mehr, aber ich habe noch eine mit dem Jumper J1 zuschaltbare Schaltzeitverlängerung eingebaut.
Die komplette Schaltung wurde in einen Kleinverteiler eingebaut:Bild3

Geschaltet wird ein 24V-Relais, welches die Netzspannung für die Zirkulationspumpe einige Zeit einschaltet, bis die Auslauftemperatur wieder stabil ist. Die Gerätchen schaltet also nur , wenn vorher einige Zeit nicht gezapft wurde bzw. die Zirkulationsleitung abgekühlt ist und eine schnelle Bereitstellung von warmem Wasser wichtig ist.
Wenn längere Zeit warmes Wasser verwendet wird , beispielsweise beim Duschen, dann läuft die Zirkulationspumpe nur zu Beginn , schaltet dann aber nach einiger Zeit wieder ab, weil sie ja auch nicht gebraucht wird!
Ein Homematik-Schalter wird noch eingesetzt, um einmal wöchentlich zeitgleich mit der Desinfektionsphase meiner Heizung die Zirkulationsleitungen mit heissem Wasser (65C) gegen Legionellen durchzuspülen.
Ob und wieviel die neue Lösung an Energie einspart, das werde ich in nächster Zeit „loggen“.
Jedenfalls bin ich begeistert, wie mit meiner Wasserleitung als Fernsteuerung die Zirkulationspumpe rasend schnell eingeschaltet wird. Hätte ich so nicht erwartet!
Bleibt anschliessend für den geneigten Nachbauer noch die Warnung, dass man hier mit Netzspannung hantiert und die einschlägigen Regeln einzuhalten sind. Ich übernehme keinerlei Haftung!

Ergänzungen nach ersten Messungen:

Alt-System:

Meine Heizung ist eine Buderus 132T mit integriertem 160l Warmwasserspeicher. Zur Versorgung der Zapfstellen mit Warmwasser hatte ich bisher nur eine Zirkulationsleitung mit Schwerkraftzirkulation. Die hat bisher ihren Komfortzweck ganz gut erfüllt, aber zirkuliert natürlich dauernd, was nach den vorliegenden Messungen doch erhebliche Verluste bedeuten.

Neu-System:

Ergänzt habe ich jetzt die Zirkulation mit einer Zirkulationspumpe mit integrierter Schwerkraftbremse (Rückschlagventil) vom Typ Wilo Star Z Nova A. Dazu kommt die intelligente Steuerung wie oben beschrieben, die die Pumpe nur beim eigentlich recht seltenen Wasserzapfen einschaltet. In den Pausen steht das Wasser in der Zirkulation wegen der Schwerkraftbremse.

Die Langzeit-Messungen erfolgten komfortabel mit dem Historian.Die folgenden Bilder zeigen nur die Ergebnisse:

Folie4

Diese erste Messung zeigt beim Alt-System den Temperaturverlauf im Warmwasserspeicher in einem typischen Temperaturbereich, ohne dass Wasser gezapft wird. Aus der Abkühlung lässt sich einfach die abgegebene Verlustenergie ausrechnen. Daumenregel: Um 1l Wasser um 1C zu erhitzen ist etwa 1,17Wh notwendig
(siehe http://de.wikipedia.org/wiki/Eigenschaften_des_Wassers#Spezifische_W.C3.A4rmekapazit.C3.A4t
Damit ergibt sich bei meinem Alt-System im schlafenden Betrieb eine kontinuierliche Verlustleistung von 128W !!! Soviel hätte ich nicht erwartet. In diesem Zusammenhang über die geringe elektrische Leistung der Zirkulationspumpe zu philosophieren macht dann wenig Sinn.

Jetzt noch eine Extrembetrachtung:
Nach dem Einbau meiner neuen Zirkulationspumpe habe ich ebenfalls Messungen der thermischen Verlustleistung des gesamten Systems mit dauernd laufender Pumpe gemacht. Insgesamt verliert in diesem Betriebszustand der Speicher je Stunde etwa 3gradC. Daraus ergibt sich eine Verlustleistung von sage und schreibe 562W!! . Jetzt kann man verstehen, dass schon eine einfache Schaltuhr, die nur einige Stunden die Zirkulationspumpe einschaltet, sehr viel bringt.

Folie3

Die gleiche Messung an meinem intelligenten Neu-System zeigt, dass die Verlustleistung im schlafenden Betrieb nur 60W ist.

Vergleichen wir mal die verschiedenen Betriebsarten bei meinem Heizsystem, ohne dass Wasser gezapft wird :

Folie5.jpg

Gegenüber meinem Alt-System ergibt sich für mich eine jährliche Einsparung von etwa 36€. Gegenüber einer typischen Lösung mit Schaltuhr wäre die Einsparung über 110€.
Jeder kann sich so ausrechnen, ob sich die Investition lohnt. Für mich war das auf jeden Fall sinnvoll, da ich die Umrüstung selbst gemacht habe und nur Material ( Pumpe 100€, Anschlüsse 30€, Elektronik 10€) bezahlen musste. Der Spass war es mir jedenfalls wert.
Und wenn man schon einen erheblichen Betrag für seine Hausautomation ausgegeben hat, dann sollte m.E. auch so eine Funktion automatisiert sein (… ohne manuellen Schalter und so!)

Haftungs- und Sicherheitshinweise

Beim Nachbau müssen natürlich alle wichtigen einschlägigen Sicherheitsvorschriften für den Umgang mit gefährlichen Spannungen  eingehalten werden. Fundierte theoretische und praktische Fachkenntnisse der Elektrotechnik und für den Umgang mit gefährlichen Spannungen sind unverzichtbar!!

Durch eine unsachgemäße Installation gefährden Sie ihr Leben und das Leben ihrer Mitmenschen! Darüberhinaus riskieren Sie erhebliche Sachschäden , welche durch Brand etc. hervorgerufen werden können ! Für alle Personen- und Sachschäden durch falsche Installation etc. ist nicht der Hersteller sondern nur der Betreiber verantwortlich.

Ich verweise hier unbedingt auf  die  „Sicherheitshinweise und Haftungsausschluss„-Seite dieses Blogs. Auch die notwendigen Eingriffe in das Heizungssystem dürfen nur von ausgebildeten Fachpersonal durchgeführt werden. Es sind die geltenden Sicherheitsvorschriften und die DVGW-Richtlinien einzuhalten.

Watchdog : Wenn Nichts mehr geht !

Watchdog : Wenn Nichts mehr geht !

Hier im Forum gab es bereits verschiedene softwareseitige Ansätze für die Realisierung eines Watchdogs. Anlass war meist ein Hängenbleiben der CCU , die durch den Watchdog wieder zum Leben erwachen soll. Der Watchdog ist also so etwas wie der Defibrillator in der Medizin. Wenn das Herz nicht oder nicht mehr richtig schlägt wird mit purer Gewalt der Herzschlag neu gestartet. Genauso ist es mit dem elektronischen Watchdog: wenn der Rechner beispielsweise eingefroren ist oder sich anderweitig „aufgehängt“ hat, dann soll ein Watchdog dies möglichst erkennen und den Rechner resetten. Im „normalen“ Betrieb bekommt der Watchdog vom Rechner regelmässige Signale, die ein Funktionieren signalisieren sollen. Ob die Funktion des Rechners richtig ist oder ob vieleicht schon bestimmte Dienste sich „verabschiedet“ haben lässt sich dabei nur schwer erkennen. Also, um bei der Medizin zu bleiben: ein Watchdog kann nur erkennen , ob der Patient lebt ; er kann aber nicht erkennen ob der Patient gesund ist!Deshalb halte ich persönlich eigentlich vom Watchdog gar nichts, weil er oft nur eine softwareseitig oder hardwareseitig fehlerhafte Funktion oder eine insgesamt schlechte Konstruktion kaschiert.Ein robust und fehlerarm konstruiertes System braucht keinen Watchdog!Aber warum dann die nachfolgende Bauanleitung?
Ganz einfach, ich hatte ein relativ gut funktionierendes Homematic-System auf Basis der CCU1. Zur Zeit habe ich leider ein weniger zuverlässig funktionierendes System auf Basis der CCU2. Ein oder zwei Tage läuft es mit den auf der alten CCU1 problemlos funktionierenden und nahezu unverändert übernommenen Programmen einwandfrei, bis dann unregelmässig bestimmte Funktionen ausfallen. Bei mir ist es beispielsweise das altbekannte Tageszeit-Skript, welches nach einiger Zeit immer mal stehen bleibt. Da von dieser Funktion bei mir viele Funktionen und u.a. auch die Rolladen und Lüftungsfenster ausgelöst werden, hat dies inbesondere bei Urlaubsabwesenheit bei mir zu (gelinde gesagt) unschönen Effekten geführt. Damit wenigstens in so einer Situation das System neu gestartet wird und ich die Hoffnung haben kann , dass die Homematic danach die nächsten Stunden nicht einfriert, habe ich mir notgedrungen einen Hardware-Watchdog aufgebaut. Wenn dann hoffentlich in nächster Zeit die Software der CCU2 zufriedenstellend läuft, dann kann ich vielleicht dieses Gerätchen entsorgen.
Die Schaltung ist simpel und kann innerhalb einer Stunde leicht zusammengelötet werden.schaltplan_watchdogBild 1: Schaltplan WatchdogDie Versorgungsspannung vom Homematic-Netzteil wird über ein 5V-Relais (Ruhestellung durchgeschaltet) auf einen baugleichen Versorgungsspannungsstecker an die CCU gegeben. Nach dem Einschalten wird der 1000uF-Kondensator über den 1MOhm-Widerstand langsam aufgeladen, bis dann nach etwa 14 Minuten der FET durchschaltet und das Relais betätigt. Damit wird dann die Versorgungsspannung für die CCU kurz unterbrochen, was zu einem Hardware-Reset führt. Dieser Vorgang wird aufgehalten, solange regelmässig beispielsweise alle 10 Minuten mit dem Funk-Schaltaktor der 1000uF-Elko entladen wird. Der 22uF-Tantal-Kondensator mit dem vorgeschalteten 1MOhm-Widerstand sorgt dafür, dass die Versorgungsspannung für die CCU etwa 1 Sekunde lang unterbrochen wird. Dies reicht bei mir für einen ordentlichen Reset der CCU2.watchdog_kaestchenBild 2: Das Watchdog-KästchenWenn nun der Watchdog regelmässig alle 10 Minuten angestossen wird, dann läuft die CCU ganz normal weiter. Erst wenn die regelmässigen Impulse ausbleiben, wird ein Reset ausgelöst. An dem Vorhandensein dieser Impulse wird also eine ordnungsgemässe Funktion der CCU festgemacht.Anmerkung: Wenn ein Firmware-Update erfolgt und/oder das Flash programmiert wird, muß der Watchdog abgeschaltet sein. Man kann auch mit einem Überbrückungsschalter den 1000uF-Kondensator kurzschliessen und so den Watchdog abschalten.Ein entsprechendes Programm für das Auslösen eines regelmässigen Impulses kann im einfachsten Fall eine einfache Zeitsteuerung sein. Besser wäre aber eine Art Testprogramm, mit dem die verschiedenen Funktionen der CCU getestet würden, um erst bei richtiger Funktion den Impuls regelmässig (bei mir alle 10 Minuten) auszugeben. Ich verwende zur Zeit noch eine einfache Skript- Zeitsteuerung. Hier sind kreative Homematiker gefragt, um bessere Software zu entwickeln. Für entsprechende Anregungen wäre ich dankbar.
Wau, Wau !!

Haftungs- und Sicherheitshinweise

Beim Nachbau müssen natürlich alle wichtigen einschlägigen Sicherheitsvorschriften für den Umgang mit gefährlichen Spannungen  eingehalten werden. Fundierte theoretische und praktische Fachkenntnisse der Elektrotechnik und für den Umgang mit gefährlichen Spannungen sind unverzichtbar!!

Durch eine unsachgemäße Installation gefährden Sie ihr Leben und das Leben ihrer Mitmenschen! Darüberhinaus riskieren Sie erhebliche Sachschäden , welche durch Brand etc. hervorgerufen werden können ! Für alle Personen- und Sachschäden durch falsche Installation etc. ist nicht der Hersteller sondern nur der Betreiber verantwortlich.

Ich verweise hier unbedingt auf  die  „Sicherheitshinweise und Haftungsausschluss„-Seite dieses Blogs.

Selbstgebauter Bettsensor… Steuern und Regeln im Schlaf!

Selbstgebauter Bettsensor… Steuern und Regeln im Schlaf!

Eins vorweg: Dies soll kein Scherz sein sondern ein ernstgemeinter Beitrag für den Selbstbau eines universellen Bettsensors oder auch Bett-Belegungssensor genannt.
Bei einem Bettsensor denkt man vielleich zuerst an Krankenhaus, Seniorenheim oder welche Art von Hotel auch immer. Entsprechende Sensoren, welche die Bettbelegung anzeigen sollen, gibt es im sanitären Handel; die Preise sind aber jenseits von Gut und Böse (.. wie das eben so im Gesundheitswesen ist!). Für die Hausautomation hat ein Bettsensor unerwartete Vorteile, weil viele Steuerungsaufgaben viel besser oder einfacher an die Belegung des heimischen Bettes geknüpft werden können. Beispiele hierfür:
Beim Zubettgehen:
– alle Lichter im Haus ausschalten
– die Heizung auf Nachtbetrieb
– die Alarmanlage scharf schalten
– TV /Multimedia abschalten
– Rolladen runterfahren
– …Beim Aufstehen:
– Licht im Bad und im Haus einschalten
– Zirkulationspumpe für Warmwasser einschalten
– Heizung auf Tagbetrieb
– Alarmanlage ausschalten
– Rolladen hochfahren
– Kaffemaschine anschalten
– …
Natürlich muss die Bettbelegungsinformation noch mit anderen Informationen verknüpft werden, damit eine komfortable möglichst unmerkliche Hausautomation verwirklicht wird. Der Ehrgeiz liegt zumindest bei mir darin, auf Fernbedienungen und ähnliches Zeugs ganz zu verzichten. Der Bettsensor ist in diesem Zusammenhang eine ideale Sensorik zur „Zustandserkennung“ der Hausbewohner und ergänzt andere bekannten Sensoren zur Anwesenheits- und Aktivitätserkennung wie beispielsweise Bewegungsmelder, Akustikmelder, Handy-Anwesenheit usw.Für den Selbstbau solche eines Bettsensors gibt es viele, viele Lösungsansätze : Temperaturfühler, Schaltermatte unter der Matraze, Lichtschranke unter dem Lattenrost, Magnet mit Reedkoontakt am Lattenrost, …
Meine Lösung sollte möglichst ohne Netzteil auskommen, justierbar sein und natürlich und möglichst einfach und kostengünstig zu bauen sein. Der nachfolgende Bauvorschlag ist für ein Doppelbett gedacht und verwendet hierfür das HomeMatic Schließerkontakt-Interface für Öffner und Schließerkontakte HM-SCI-3-FM. Zwei Kanäle werden jeweils für die beiden Betten verwendet, der dritte Schalterkanal ist für einen bettseitigen Alarmschalter, den man softwaremäßig mit beliebigen Funktionen ausstatten kann. Der Einbau erfolgt in einem einfachen Kleinverteilergehäuse:Bild1

Der eigentliche Bettsensor ist ein einfacher Taster ( Schliesser), welcher in Verbindung mit einem ca. 20 bis 30cm langen verwindungsteifen Alu-Eckprofil die Durchbiehgung des Lattenrostes detektiert. Die Schalteinheit bringt man sinnvollerweise an der mittleren Latte des Lattenrostes so an, wie im folgenden Bild gezeigt:

Bild4

Mit den Muttern an den langen M4-Senkkopfschrauben lässt sich die Lage des Tasters so einstellen, dass im unbelasteten Zustand (Bild oben) der Taster dauernd eingeschaltet ist. Unter Last biegt sich das Lattenrost nach unten und der Schaltet öffnet wieder ( Bild unten).
Damit nicht jede „größere Bewegung im Bett“ in der Steuerungsoftware zu ungewollten Schaltvorgängen führt, sollte eine logische Systemvariable z.B. „Bettbelegung“ erst nach entsprechenden Verzögerungszeiten ein und ausgeschaltet werden. Aber sowas kennen wir ja auch von anderen Sensoren.

Das wars schon. Viel Spass beim Steuern und Regeln im Schlaf!

Haftungs- und Sicherheitshinweise

Beim Nachbau müssen natürlich alle wichtigen einschlägigen Sicherheitsvorschriften für den Umgang mit gefährlichen Spannungen  eingehalten werden. Fundierte theoretische und praktische Fachkenntnisse der Elektrotechnik und für den Umgang mit gefährlichen Spannungen sind unverzichtbar!!

Durch eine unsachgemäße Installation gefährden Sie ihr Leben und das Leben ihrer Mitmenschen! Darüberhinaus riskieren Sie erhebliche Sachschäden , welche durch Brand etc. hervorgerufen werden können ! Für alle Personen- und Sachschäden durch falsche Installation etc. ist nicht der Hersteller sondern nur der Betreiber verantwortlich.

Ich verweise hier unbedingt auf  die  „Sicherheitshinweise und Haftungsausschluss„-Seite dieses Blogs. Auch die notwendigen Eingriffe in das Heizungssystem dürfen nur von ausgebildeten Fachpersonal durchgeführt werden. Es sind die geltenden Sicherheitsvorschriften und die DVGW-Richtlinien einzuhalten.

Sonnensensor für Jalousien- und Rolladensteuerung

Sonnensensor für Jalousien- und Rolladensteuerung

Das Fehlen eines geeigneten Helligkeitssensors zur Rolladen- und Jalousiesteuerung hat bereits zu verschiedenen Lösungsansätzen geführt. Hier wird sehr einfache Lösung gezeigt, die ich bereits seit Jahren zur Steuerung von Solarkollektoren für das Schwimmbad verwende.
Das Prinzip ist die Nachbildung eines einfachen thermischen Solarkollektors, der die Sonneneinstrahlung möglichst wirkungsvoll einfängt und zur Aufheizung eines eingebauten Temperatursensors führt. In der Regel werden bereits bei diffuser Sonneneinstrahlung Temperaturwerte deutlich oberhalb von 35Grad erreicht, so dass mit dieser Temperatur eine einfache und eindeutige Schaltinformation für die Aktuierung von Rolläden oder Beschattungseinrichtungen ableitbar ist. Die beigefügten Bilder zeigen die Bauanleitung für den sog. Sonnensensor. Ein Alu-Rohr wird im oberen Bereich schwarz eingefärbt und mit geeigneten radialen Bohrungen wird dieser Bereich thermisch möglichst vom Rohr entkoppelt. Über den schwarzen Rohrbereich ist ein Glas mit Silikon befestigt, das die Sonnenstrahlung rundum einfängt. Im Rohr sitzt im schwarzen Bereich der Temperatursensor, welcher durch eingestopfte Glaswolle an die Wandung gedrückt wird. Je nach Bedarf kann der Temperatursensor direkten oder weniger direkten Kontakt zum Alu–Rohr haben; dies führt dann zu mehr oder weniger phlegmatischer Temperaturmessung (thermischer Tiefpass!).

Folie1

Wer´s noch komfortabler haben möchte, sollte nicht direkt die Sensortemperatur für Schaltaufgaben verwenden, sondern die Differenztemperatur zwischen dem „Sonnensensor“ und der Aussentemperatur. Damit ist sehr feinfühlig eine Detektierung verschiedener Sonneneinstrahlungen möglich. Die  Bilder zeigen hierfür die Programme und das Skript.

Folie2
Da der Sonnensensor bei geeigneter Montage eine „Rundum-Information“ der Sonneneinstrahlung gibt, kann mit der vorhandenen Zeitinformation der genaue Sonnenstand ermittelt werden und gezielt nur die Beschattungseinrichtungen am Haus betätigt werden, die gerade Sonne haben.
Dioe Einrichtung läuft bei mir seit einem halben Jahr mit insgesamt 14 Jalousieaktoren störungsfrei. Nach anfänglicher Abstimmungsarbeit mit den Schaltschwellen geht alles „wunderbar“ .

Translate »