Vorwort

Diesen Artikel habe ich von der alten Website übernommen, da er recht häufig aufgerufen wurde und immer noch wird. Heutzutage heißt es nicht mehr Hausautomatisierung sondern Smart Home.

Übrigens kann ich jedem davon abraten einfach mal was zu basteln. Ein System sollte nicht nur ein paar Jahre funktionieren, sondern auch von einem potentiellen Käufer oder Mieter problemlos betrieben werden. Sonst wird der die ganze schöne Technik rausreißen - und was Richtiges kaufen. Meine Technik ist jetzt ziemlich genau 10 Jahre alt- und funktioniert im Großen und Ganzen recht problemlos. In dieser Zeit habe ich viele sogenannte professionelle Systeme auf dem Markt kommen und gehen gesehen. Zu gr0ß ist die Konkurrenz und der jeweilige Hype der Entwicklungsinvestitionen der Firmen in die Tonne haut. Daher spricht in meinen Augen nichts - aber auch wirklich garnichts - gegen eine Selbstbaulösung.

In Kürze erscheint hier auch die neue "Smarthome" Alarmanlage, die sich auch vernetzen läßt und über GEO-fence dann auch herausfindet wenn ich vor der Haustüre stehe.

Einleitung

Vor ziemlich genau 10 Jahren hatte ich mich gefragt wie man denn wohl Dinge im Haushalt automatisieren könnte. Eigentlicher Auslöser war die Anschaffung von recht vielen Aussenjalousien die elektrisch bedient werden können. Nach Recherche findet man recht schnell so was wie EIB-Bus, LON etc.

Das Problem ist, das ist zwar ein Standard aber durch recht hohe Lizenzgebühren wird verhindert dass sich der Standard durchsetzt. Alleine für ein Programmiertool soll man fast 2000 Euro bezahlen, aber das ist natürlich nur für den "Edel-Elektriker" gedacht - der Rest der Bevölkerung ist ja dafür zu doof. Die Komponenten die man natürlich dann im ganzen Haus installieren muss, sind auch nochmal mit 75 bis 100 Euro für einen einfachen Schalter eher hinderlich. Kurz und gut man muss was suchen und finden was das Ganze etwas billiger macht.

Heute gibt es ja allerlei proprietäre Lösungen (ja ja - wie meine auch) die dann zwar alle Produkte EINES Herstellers steuern können, aber die Zusammenarbeit mit Produkten anderer Hersteller klappt leider nicht so gut - bis garnicht.

Ja OK Arbeitszeit ist auch teuer.., aber der Weg ist das Ziel. KNX hab ich mir auch etwas detailierter angeschaut, das geht genau in die richtige Richtung, aber auch hier ist die SW und die einzelnen Komponenten doch recht teuer.

Zentralcomputer bitte melden

Der zentrale Rechner ist ein kleiner Nano PC der Firma ZOTAC. Mit ca. 25W Stromverbrauch erschien mir der am besten geeignet dauerhaft die Steuerung, Datenerfassung im Haus zu übernehmen. Der ist noch erheblich kleiner als ein Netzwerkrouter und kann mit einer kleinen SSD Drive auch anspruchsvolle Aufgaben wie Bewegungserfassung der Türkamera locker erbringen. Er hat diverse - kompakte - Schnittstellen wie USB, eSATA oder HDMI. Als Betriebsystem läuft ein Debian Linux auf dem dann auch alle modernen Packages installierbar sind. Ein Apache Webserver und eine Menge Java Script bringt alle Aufgaben und Schnittstellen per Webseite zum Benutzer - und zurück.

Die Größe des Rechners auf dem Bild ist übrigens ca. 130*130*60mm.

Es gibt Ihn auch in einer noch kleineren Version ohne WLAN und fester SSD-Festplatte. Dann ist er sogar nur 90mm*90mm groß (das Bild mit dem Bleistift)

Alle Anschlüsse in die "elektrische Welt" werden über USB abgewickelt. Hierzu habe ich kleine USB Controller-Platinen entwickelt (dazu später mehr). Die Entscheidung für USB war insofern schnell getroffen, da kaum noch Rechner einen RS232 oder Parallelport besitzen.

Nachtrag: Ja so kleine Rechner wie der Zotac Nano haben eben nur noch "kleine" Schnittstellen. USB war also eine perfekte Wahl. Den Raspberry Pi zur Haussteuerung einzusetzen hatte ich auch bereits einmal probiert, allerdings war der für die Aufzeichnung der Webcambilder und als interner Webserver in meinen Augen eigentlich zu langsam. Den Ausschlag hat aber gegeben, daß der Raspberry Pi immer mal wieder einfach stehen blieb. Ich denke entweder durch Störungen die über die Stromleitung einstreuen oder durch Flashfehler. (ja die Flashkarte hatte ich auch schon mehrfach getauscht).

Temperaturmessung

Die wirklich erste Aktion - quasi als Test auch von möglichen Bussystemen - war der 1-wire Bus von Dallas Semiconductor. Dies ist ein 1-Draht-Bus der angeblich eine Ausdehnung von mehr als 100m haben darf. Er wird aber meist nur auf Platinen, Motherboards etc. verwendet.

Dafür habe ich dann im Haus bereits verlegte Telefonleitungen und Alarmanlagenkabel verwendet die noch freie Adern hatten. Mein erster Schritt war es Temperaturen an wichtigen Stellen zu messen und permanent aufzuzeichnen. Als Temperatur-Sensoren habe ich DS18S20 und DS1820 verwendet. Die Temperaturen habe ich dann alle 10s in einer MYSQL Datenbank geloggt und per Webseite auch angezeigt. Anzeige erfolgt mit Dygraphs wie hier:

Geht im Prinzip ganz gut - aber wenn es nicht geht kann man fast immer nur probieren (was hab ich noch als letztes angeschlossen...mmhh). Der Vorteil genau dieser Sensoren ist, die haben wirklich nur 3 Beine und liefern die Temperatur digital gewandelt auf 0.25 Grad genau. Weiter gibt es noch diverse IO-Chips mit 8bit- oder 16bit-Digital IO Port, die im Prinzip auch funktionieren, aber wie gesagt meine Tests ergaben eigentlich: völlig ungeeignet für einen zuverlässigen Hausbus.

ATMEGA und Co - CPU

Um die Wünsche von HoLi - so heisst unser Steuerrechner Ho=Home Li=Linux) in die Außenwelt zu tragen, gibt es kleine Schnittstellenplatinen die USB nach was auch immer realisieren. Die Platinen haben einen ATMEGA 644(AU) als CPU mit 8 bzw. 16MHz getaktet, sowie USB-Controller, manche auch noch CAN-Controller und CAN-Treiberchips, man weiß ja nie was man noch braucht. Die Wahl fiel 2008 auf den Atmel Controller ATMEGA64420AU weil er relativ einfach zu programmieren ist. Die AU-Version (für Automotive) hat zwei UARTS zur Kommunikation mit externen Systemen, eine davon wird für den USB Interface Controller-Chip verwendet falls eingebaut.

Nachtrag 2015

7.6.2015: Neue Rolladenkontroller funktionieren jetzt auch mit dem STM32F103RB oder auch mit STM32F405RGT6 ARM CORTEX M4. Dies sind Chips aus der ARM Cortex Serie von ST mit eingebautem CAN Bus. Hierdurch kann man das ganze noch kleiner bauen und man benötigt nur noch einen einzigen Chip.

Die Stromversorgung der verteilten Busplatinen erfolgt wie bereits an anderer Stelle beschrieben per zentraler Stromversorgung mit einem kleinen 12V DC Schaltnetzteil.

Bei Olimex gibts zwei Boards die man zum Test aber auch schon als fertige Elektronik nutzen kann. Zugegeben die verwendeten MPUs sind eigentlich zu leistungsfähig für die Anwendung, aber die PCBs sind halt recht günstig.

1.10. 2016: Neues STM32 basiertes Board mit Anschluss für 4(!) Motoren ist entwickelt und geht jetzt in die Betatestphase. So kann man einen Raum der bis zu 4 Jalousien oder Rolladen hat mit einer Platine "bedienen". Die Elektronik funktioniert mit der neuen Software soweit ganz gut und braucht in Ruhe 17mA.

Die Software habe ich allerdings jetzt komplett neu geschrieben, da mit dem 32-Bit CPU des STM32 vieles viel einfacher geht als vorher noch mit dem 8-Bit ATMEGA 644.

Mit den nachfolgenden kleinen USB/TTL Wandler Platinen kann man dann per Laptop und Hyperterminal über ein Textmenü die Basiseinstellungen machen (wie z.B. CAN Id, Gruppen Id).

Hier ist nochmal ein Artikel zum USB-TTL Converter.

Mit einem Jumper kann man wählen ob für 5V oder 3.3V Logik.

Hier nochmal die Bilder zu den Platinen der Einzelcontroller, die an den Jalousien und Rolladenmotoren sitzen: - unbestückt und bestückt im passenden Gehäuse.

Diese passen zur Not auch in eine tiefe UP-Dose. Bei neuen Einbauten verwende ich allerdings größere Bopla- oder Elektrogehäuse aus der Hausinstallation mit einem "richtigen" Klemmraum. Die Sicherung verhindert bei einer Fehlfunktion oder Kurzschluss des Rolladenmotors, dass die Platine oder die Relais Schaden nehmen können. Von oben wird die BUS-Leitung eingeführt und angeklemmt, von unten die Schaltkabel des Aktors per Phönix-Klemme direkt über der Sicherung über einen 3-poligen Phönix-Stecker. So ist dann sicher gewährleistet, dass keine Potentiale versehentlich verbunden werden. Auf der Rückseite habe ich die 230V Seite noch mit flüssigem Kunststoff (Heißkleber) gegen jede ungewollte Berührung oder Kriechströme gesichert, auch wenn sie ja eigentlich später im Gehäuse sind.

Hier gehts zu den Details des Rolladenkontroller 1-Kanalig auf Basis des ATMEGA644 Prozessors - jetzt aber auch mit neuestem STM32 Prozessor ;-)

 

 

Die Viessmann Heizzentralen werden mit dem Steuerungssystem Vitotronic gesteuert. Ein LCD-Display erlaubt die Einstellungen und Anzeigen der wichtigsten Betriebsparameter - und dies funktioniert auch ganz gut. Der einziger Nachteil ist, dass eine externe Weiterverarbeitung nicht ohne weiteres möglich ist. Um z.B. die Heizung auf das Gebäude bzw. das Nutzerverhalten optimal einstellen zu können dachte ich mir es wäre doch sinnvoll die Istzustände über den Tages- und Wochenverlauf aufzuzeichnen. Neben den Daten die die Heizung liefert sollen auch unabhängige Temperaturmessungen möglich sein - aber dazu später mehr. Das führte zu meinem Projekt

Heizung & Schnittstelle zur Hausautomatisierung.

Die Steuerung kann man über eine Infrarotschnittstelle "ausfragen". Hierzu hat Viessmann auf der Vorderseite der Steuerung eine Möglichkeit geschaffen mit einer spezielen Viessmann-Software (ich denke für Servicetechniker) die Daten auszulesen oder auch eine Parametrierung vorzunehmen. Aber ich bin nur an Ausgabedaten interessiert. Daher habe ich im ersten Schritt ein Infrarotinterface gebaut welches die Infrarotdaten in standardisierte TTL-Signale umwandelt. Diese TTL-Daten kann man dann über ein USB-TTL Converter in einem PC oder einem kleinen Einplatinencomputer z.B. Raspberry Pi. weiterverarbeiten.

 

Die Schaltung ist wirklich sehr einfach aufgebaut. Es ist aber unbedingt darauf zu achten, dass die IR-Sendediode nicht in die Empfängerdiode einstrahlt, sonst empfängt man nur Müll. Im nachfolgenden Bild habe ich zwei Platinenabstandshalter als Blenden aufgeklebt. Das ganze wird noch mit Heisskleber eingeschmolzen damit man es (DANACH) an der Frontplatte der Heizungssteuerung befestigen kann. Man erkennt die beiden IR-Sender und Empfänger die durch die Platine schauen.

Nachfplgend die EAGLE Schaltbilder:

 

Ich habe die Schaltung in diese beiden Teile getrennt damit man später die Infrarotschnittstelle auch direkt an einen Mikrocontroller ankoppeln könnte.

Die Daten kann man entweder mit einem Windowsrechner oder - wie in meinem Fall - mit einem kleinen Linuxcomputer einlesen und aufzeichen.

Aber wie funktioniert die Kommunikation ?

Protokoll

ACHTUNG: Die hier wiedergegebenen Informationen sind völlig unverbindlich und dienen nur als Einführung in die Technologie. Jede Verwendung gleich welcher Art erfolgt auf eigene Gefahr.

Die Kommunikation mit der Infrarotschnittstelle erfolgt seriell mit den folgenden Schnittstellenparametern: 4800 Baudrate, 1 Startbit, 2 Stopbit, 8 Datenbits. Die nachfolgenden Zeilen sind aus dem Pythoninterfaceprogramm entnommen:

ser = serial.Serial (
        port='/dev/vitoif',
        baudrate=4800,
        parity=serial.PARITY_EVEN,
        stopbits=serial.STOPBITS_TWO,
        bytesize=serial.EIGHTBITS,
        timeout=0.02
    )

Im Ruhezustand sendet die Steuerung mit ca. 1Hz das Zeichen 05h.

Um die Steuerung dazu zu bewegen Daten auszugeben muss man sich zunächst an der Steuerung anmelden. Hierzu einfach (eventuell mehrfach) die folgenden 3 Bytes senden:

"0x16 0x00 0x00" --> ,

die Steuerung antwortet dann meist sofort mit

<-- "0x06"

Jetzt ist die Steuerung bereit um auf Anfragen zu antworten. Dazu sendet man ein Anfragetelegramm:

'4105' '0001' '5525' '02' '82' um z.B. die Aussentemperatur (0x5525) auszulesen.

Beispiel '4105000155250282' ist das gesamte Bytetelegramm. Das letzte Byte (82) ist die Checksumme. Die Steuerung antwortet mit: '0101552502 5F00 E4' was 9.5 deg C (5F00) entspricht.

Nachfolgend die Struktur der Datentelegramme:

Zum Abmelden an der Steuerung einfach wieder 0x04 senden.

Um die Daten der Steuerung quasi per Webbrowser im Onlinezugriff zu haben, habe ich die Daten in einer eigenen Datenbank abgelegt. Von dort können sie dann per Webbrowser oder auch über ein Smartphone ausgelesen werden.

Das Programm um die Heizungsdaten der Viessmann-Zentrale im Rechner aufzuzeichnen habe ich als Python Programm ausgeführt. Dieses liest die verschiedenen "Labels" der Steuerung aus. Die Labels die ausgelesen werden sollen stehen mit Ihrer Adressdefinition, dem Bezeichner und den Skalierungsfaktoren in einer MySQL-Datenbank. Man kann also jederzeit neue Adressen hinzufügen oder die Skalierung ändern.

Der Link mit den Informationen über die verschiedenen Labels auf der Viessmann Seite ist leider nicht mehr erreichbar (vitogate-200-eib_en.html)

Hier ein paar Bilder der MySQL Tabelleneinträge bzw. Webseiten zur Anzeige.

Die Ablage der abgefragten Daten erfolgt in einer weiteren MySQL Tabelle. Aus dieser kann dann eine Webseite die Werte herauslesen und grafisch darstellen.

Was ist also jetzt nötig ?

1. Datenbank innerhalb mysql anlegen, z.B. mit mySQLAdmin oder über die Kommandozeile:

# mysql -u root -p

dann eine neue Datenbank anlegen:

#mysql> CREATE DATABASE heizung;

dann noch einem Benutzer Zugriffsrechte geben:

mysql> GRANT ALL ON heizung.* TO loguser@localhost;

2. Jetzt die Tabellen anlegen - dies kann man mit dem folgenden SQl-Script erledigen

Hier ist der Downloadlink zu einem SQL-Script zur Anlage der Datenbankstruktur in MySQL (Verwendung auf eigene Gefahr):

 

3. Cronjob anlegen der das folgende Pythonprogramm alle 5 Minuten zyklisch aufruft.

# 0-55/5  * * * * root    cd /var/www;python vito.py >> vito.log

Das Pythonprogram (Python2) zur zyklischen Abfrage und Datenablage in der MySQL Datenbank findet sich hier:

 

Update 2023 für Python3 auf Ubuntu:

Das Pythonprogram (Python3) zur zyklischen Anfrage und Datenablage in der MySQL Datenbank findet sich hier:

 

Man muss aber darauf achten die richtige Schnittstelle USBSerial für den Infrarotempfänger auszuwählen.

Jetzt werden zyklisch alle konfigurierten Labels ausgelesen und in die neue MySQL-Tabelle vito_values eingefügt. Es werden aber nur die Labels abgerufen die in der vito_lables Tabelle auf enable=true stehen.

"Der tut nix"

Hier ein paar Tipps was man macht wenn es nicht gleich funktioniert und was man prüfen kann.

1. Infrarot-Interface

Die Ankopplung an die Sende- und Empfangsdioden ist einigermaßen kritisch wenn man die Schnittstelle als Platine selbstbaut. Das liegt an der hohen Empfindlichkeit der Bauteile die schnell zu einem optischen Kurzschluss führen wenn Sender und Empfänger nicht sorgfältig getrennt sind. Da hat Viessmann meiner Meinung nach das Design über die Funktion gestellt. Warum muss es denn ein V-Stecker sein der die IR-Schnittstelle ankoppelt ?

Was ist denn jetzt überhaupt der Sender und was der Empfänger ?

Im nachfolgenden Bild sieht man die Ansicht von vorn auf die Steuerung. Rechts ist der IR-Sender - links der IR-Empfänger.

Hier ist immer darauf zu achten dass man den Empfänger und Sender ordentlich ankoppelt. Das heisst nicht dass die beiden exakt übereinander oder besonders nahe an der Steuerung sein müssen sondern lediglich: Sie müssen optisch gut voneinander getrennt sein, das übernimmt beim Orginaladapter das V. Ich empfehle kleine Hülsen auf die Adapterplatine zu kleben. Ein kleiner Steg aus Aluminium ist sicher auch ganz gut. Ich habe einfach ein kleines Stück Balsaholz verwendet in das ich Aluminiumröhrchen eingesetzt habe. Wer einen fertigen Adapter von Viessmann verwendet, hat die Probleme natürlich grundsätzlich erstmal nicht.

2. Serielle Schnittstelle

Für einen ersten Test der Hardware reicht eine normale serielle Schnittstelle aus. Hier kann man mit dem auf dieser Seite vorgestellten SUB/TTL Wandler leicht den IR-Adapter anschliessen und bekommt direkt einen USB-Anschluss. Hier sollte man zunächst herausfinden an welcher Schnittstelle des PCs ist denn überhaupt der IR-Wandler zu finden ? 

Nun - man kann einfach ein Terminalprogramm starten und schauen welche COM1...COMx Schnittstellen werden denn überhaupt im System angeboten. Dazu steckt man den Adapter zunächst ab und später wieder an. Durch die automatische Konfiguration des FTDI-Chips aus der Anleitung oben kann man dann - sowohl in Windows als auch in Linux - leicht herausfinden welche neue Schnittstelle hinzugekommen ist.

Ein Terminalprogram z.B. HTerm kann man dann für die weiteren Tests verwenden.  Die Schnittstellenparameter müssen wie folgt eingestellt sein: baudrate=4800,parity=EVEN,stopbits=2,databits=8.

Jetzt sollte man dem Terminalprogram noch beibringen, dass es empfangene Daten als HEX darstellt - nicht als ASCII. Dann sollte zumindest schon mal zyklisch (ca. 1/s) der Hexwert 05h empfangen werden, dann funktioniert die Empfangsrichtung.

Das Terminalprogramm zum Senden auf HEX-Eingabe stellen und mehrfach "16 00 00" senden. Das funktioniert am besten wenn man 4 * hintereinander die Sequenz als Kette: "160000160000160000160000" eintippt und dann alles auf einmal sendet. Die Steuerung antwortet bei korrektem Empfang dann mit dem Wert "06".

Wenn man versucht die 3 Bytes "160000" quasi langsam über das Terminalprogramm einzutippen, dann ist dies für die Steuerung zu langsam und sie antwortet garnicht bzw. sendet einfach weiter die 05. Hier nicht gleich aufgeben -das Login kann durchaus mehrfach nötig sein.

Die Steuerung am Ende wieder durch senden des Wertes "04" in den Defaultmode setzen.

Immer darauf achten das das Terminalprogram KEIN CR oder LF mitsendet, das führt immer zum Misserfolg. Die Kommunikation erfolgt nicht über ASCII-Befehle sondern ausschlieslich im Binärmode.

Sofern die Daten jetzt so langsam in die MySQL Datenbank abgelegt werden, kann man diese natürlich auch auswerten. Hier steht wie das denn geht.

Eigentlich hatte ich vor meine Heizung zu modernisieren. Um jedoch herauszufinden wie der aktuelle Verbrauch, mögliche Einsparungen etc. sein könnten, muss man natürlich erst mal wissen: Wie viel verbrauche ich denn eigentlich jetzt ?

jetzt mussten Verbrauchsmessgeräte her und zwar für elektrische Energie, kaltes und warmes Wasser sowie Gas. Nun da mir die Elektronik und Elektrik näher liegt habe ich mit der Erfassung des Stromverbrauchs angefangen.

Erste Recherche im Internet ergab, es gibt zwar einzelne Versuche mittels Reflexlichtschranken Zähler abzulesen, aber die taugten nach Meinung vieler im Web eigentlich nichts. Aus diesem Grunde habe

ich eine eigene Schaltung und Verfahren entwickelt was das ermöglichen sollte. Vorweg, es klappt einwandfrei.

Ich hatte zwar kurzzeitig den Gedanken einen elektronischen Zähler quasi hinter den offiziellen Zähler zu schalten, aber das gleich wieder verworfen. Warum ? Nun, die elektrischen Zähler verbrauchen selbst auch wieder ein paar 10 Watt, die ich natürlich auch selbst bezahlen muss; und das sah ich irgendwie nicht ein - vom Preis ganz zu schweigen (200-300 Euro).

Also muss ein Sensor her der die Umdrehungen des Zählerrads erfasst, also zählt und damit den Stromverbrauch misst. Und das ohne den Zähler zu manipulieren, zu ändern und gleichzeitig auch einem Ableser noch das Ablesen des Zählerstands zu ermöglichen. Ich hatte mir zwar die üblichen Sensoren von Vishay CNY70 angesehen und ausprobiert, doch leider fokussieren die nur auf einen festen Abstand. Soll heißen - funktionierte nicht und wenn - nur sehr unzuverlässig.

Also hatte ich mich für diskrete IR Sende-Dioden und Fotodioden entschieden (SHF309FA sowie SFH409, oder die Alternativtypen), wobei die Sendedioden einen sehr breiten Austrittswinkel haben sollten, wegen der Größe der beleuchteten Fläche. Auch sollten die IR-Empfindlichkeitskurven zueinander passen.

Die Schaltung enthält einen richtigen(!) Diskriminator vom Typ LM311D. Die drei Trimmpotis - von denen nur eins bestückt wird - waren nur wegen der unterschiedlichen Bauformen vorgesehen. Mit einem Zehngang-Trimmer kann man recht gut die Schaltschwelle einstellen, am besten geht das natürlich mit einem Oszilloskop oder Multimeter um die Spannungsänderungen am Eingang bei Auftreten eines Impuls zu messen.

Der Ausgang des Operationsverstärkers liefert ein schönes Rechtecksignal bei jeder Umdrehung des Zählrades. Der Transistor und die LED dienen nur der optischen Kontrolle bei der Justierung und ob es überhaupt noch funktioniert. Zum Test einfach das Poti durchdrehen und sehen wann denn die LED angeht , dann ein bischen zurückdrehen bis sie wieder ausgeht. Das ist der optimale Schaltpegel.

Die Sendediode kann über einen Transistor separat ein und ausgeschaltet werden, um die Schaltung möglichst stromsparend aufzubauen. Dieser Schalteingang wird später von einem Mikrocontroller alle 250ms kurz eingeschaltet um zu sehen "ob denn gerade wohl die rote Markierung vorbeikommt".

Das Ganze findet auf einer eigenen Leiterplatte Platz die nur von der Lötseite bestückt wird. Mit der (freien) Bestückungsseite wird die Platine einfach mit Klebeband passend auf die Glasscheibe des Zählers geklebt. Ja - der Ableser war auch da und fand das ganze recht originell.

Hier noch ein paar Fotos wie die Sensorplatinen an den verschiedenen Messgeräten befestigt ist.

Man sieht auch sehr schön die Montage der Sende- und Empfangsdioden beim Elektrozähler. Die schauen durch ein Loch in der Platine auf die Drehscheibe.

Das Board wird über einen einreihigen Pfostensteckverbinder angeschlossen und mit einem dem eigentlichen Verbrauchsdaten-Interface-Board verbunden. Dies erfasst dann auch gleich die Daten der anderen "Verbrauchsgüter". Dazu später mehr.

Zur Erfassung des Wasserverbrauchs habe ich zwei Wasserzähler mit Impulsausgang von Elster nachträglich jeweils in die Warmwasser und Kaltwasserleitung eingebaut. Diese Zähler gibts ab etwa 45 Euro. Die Zähler haben eine Auflösung von 1 Liter, d.h. je Liter geben die einen Schaltimpuls ab (also Reedkotakt mit zwei potentialfreien Signalen). Dies ist ausreichend für die grobe Erfassung des Wasserverbrauchs. Man sieht noch zwei zusätzliche Kugelhahnventile vor und hinter der Uhr damit ich die auch einfach tauschen kann wenns notwendig wird.

Beim Gaszähler ist es zumeist einfacher. Wer einen neueren Gaszähler der Frma Kromschröder hat, kann sich vom Werkskundendienst einen Reedkontakt zum nachrüsten beschaffen. Dieser wird in eine Mulde an der Unterseite eingesetzt. Auch dieser liefert je 0.01 Kubikmeter einen Schaltimpuls. Achtung einfache Reedkontakte scheinen nicht zuverlässig zu funktionieren, da die Position doch recht kritisch ist. Auch ist durch den vorgesehenen Reedkontakt keinerlei Eingriff am Zähler erforderlich, und es ist ein Orginalteil, keine Bastellösung. Kostenpunkt ca. 25 Euro.

Verbrauchszähler Interface

Jetzt gibts also 4 digitale Signale für die einzelnen Verbrauche die je Einheit einen Impuls erzeugen. Zur Auswertung der Impulse und auch zur unabhängigen Zählung habe ich eine kleine Mikrocontroller-Platine entwickelt die die Impulse zählt, zwischenspeichert und per USB insgesamt oder jeweils auf Anfrage ausgibt. Der USB-Anschluss war erforderlich, weil ich den Controller an einen zentralen Linux Steuerrechner anschließen wollte. Dieser kann jederzeit den aktuellen Gesamtzählerstand oder den Stand seit letztem "Nachfragen" abfragen.

Das Bild oben zeigt die Platine mit den Sensoranschlüssen auf der linken Seite und dem USB Mini Anschluss auf der rechten Seite. Die Bestückungsseite ist leer bis auf die Buchsen, so spart man sich eine zweiseitige Platine. Oben links sieht man die 4 SMD Leuchtdioden, die für jede Verbrauchsart bei jedem Impuls einmal aufblinken. Dies dient als Funktionskontrolle beim Anschluss.

Verwendet wird ein Atmel Microcontroller ATMEGA 644 (AU) sowie ein USB UART Chip von FTDI. Programmiert ist die Firmware in C mit Eclipse und den WinAVR Bibliotheken. Parametrieren - also Einstellen von Einheit pro Impuls etc. - kann man den Controller einfach mit Hyperterminal über ein kleines Text-Menü, so braucht man nicht immer ein Programmiergerät. Alle 60 Minuten werden die aktuellen Verbrauchswerte im Eprom abgelegt, das sind ca. 85000 Epromzugriffe in 10 Jahren, um auch nach Stromausfall die Verbrauchswerte nicht zu verlieren.

Ist aber mittlerweile egal, da ich sowieso nur die "delta" Impulse und damit den Verbrauch seit letzter Anfrage benötige. Der Rest ist ja dann in der MYSQL-Datenbank.

MYSQL Verbrauch mitschreiben...

Der Verbrauch wird alle 5 Minuten in Form von Integralwerten/Zeiteinheit in eine MySQL-Datenbank geschrieben.

Die Datenbank kann man per phpmyadmin oder über die Kommandozeile und mysql> wie folgt anlegen:

CREATE DATABASE `usage`;
CREATE TABLE `raw_counts` (`gs` int( 11 ) NOT NULL ,
`hw` int( 11 ) NOT NULL ,
`cw` int( 11 ) NOT NULL ,
`ee` int( 11 ) NOT NULL ,
`eef` double NOT NULL ,
`time` datetime NOT NULL
) ENGINE = MYISAM DEFAULT CHARSET = latin1;

am besten auf der Linux Kommandozeile mysql -uroot -p eingeben und die obigen Queries enfach mit copy & paste einfügen.

Wenn die Datenbank angelegt ist kann mit einem kleinen Pythonprogramm alle 5 Minuten der Verbrauch dort mitgeloggt werden. Das Python Script ist recht einfach aufgebaut. Über die serielle Schnittstelle wird der AVR Controller abgefragt und die Werte dann in die Datenbank geschrieben. Das Programm öffnet hierzu ein USB-Device und sendet ein CR. Als Antwort sendet der Controller die aktuellen Zählersummen, sowie die aufgelaufene Verbrauchsmenge seit letzter Anfrage. Das kleine Pythonprogramm wird per CRON-Job zyklisch aufgerufen.

Hier ist das Programm zum Download:

Zur Anzeige dient eine Webseite die den aktuellen Verbrauch über einen Zeitraum von etwas über einer Woche entsprechend grafisch darstellt.

Ich kann jetzt genau sagen wann denn gebügelt wurde oder die Spülmaschine lief. Jetzt bekommt man zum ersten Mal ein Gefühl für die Verbrauchsgewohnheiten, dennoch lohnt sich die Anschaffung eines separaten Verbrauchsmessers um Stromfresser aufzuspüren. Bei meinem Test der diversen Verbraucher hatte dabei eine Kaffeemaschine von De Longhi mit Zeitschaltuhr den Vogel abgeschossen. Sie hatte ganze 27W Dauerleistungsaufnahme - wenn sie ausgeschaltet war wohlgemerkt. Damit kann man fast 2 * 15W Energiesparlampen oder 5 LED Glühlampen den ganzen Tag leuchten lassen.

Die Grafik habe ich übrigens mit jpgraph erstellt, was auch recht einfach ist. Es gibt jede Menge Beispiele auf der Website wie man solche Grafiken erzeugt. Neuere Plots erstelle ich jedoch mit dygraphs.

Hier jetzt noch die Schaltpläne und das PCB-Layout für die Elektronik der Pulseerfassung. Orginal Eagle Files auf Anfrage:

 

 

 

Hier jetzt eine Beschreibung eines Windmessers mit CAN-Bus-Anschluss. Windsensoren gibt es wie Sand am Meer, aber alle haben einen oder mehrere Nachteile. Entweder sind sie preiswert, dann ist meistens die Mechanik schlecht, oder die Elektronik oder beides. Oder sie sind mechanisch und elektronisch hervorragend, kosten dann aber weit über 500 Euro - und haben schon lange keinen CAN-Bus Ausgang. Aber warum unbedingt CAN-Bus ? Im Rahmen der Hausautomatisierung hatte ich sowieso schon den CAN-Bus für Jalousien, Rolladen, Heizung etc. verwendet und auch im Haus verlegt (siehe auch ). Der 1-Wire-Bus (den hatte ich auch mal evaluiert) war schlichtweg zu störanfällig bei den im Haus vorkommenden Entfernungen.

Hintergrund für das hier beschriebene Projekt war ein Geschenk, welches ich von einem Bekannten bekommen hatte: Eine Dallas 1-Wire Weather Station. Diese war etwa 15 Jahre alt und enthielt neben der Mechanik eine Elektronik auf Basis der 1-Wire Chips von Dallas. Mit Reed-Kontakten wurde die Windrichtung sowie die Windgeschwindigkeit gemessen. Um diese dann per 1-Wire/RS232 Adapter mit einem PC einzulesen. Die Mechanik war schon ganz brauchbar, wenngleich auch recht amerikatypisch  - robust - aufgebaut.

Aber der Wind ist dort sicher auch häufiger stärker als in unseren Breiten. Den hässlichen Dallas 1-Wire Aufkleber habe ich entfernt, weil jetzt ja kein einziger Dallas Chip mehr drin ist. Ausser dem Kunststoff und den Kugellagern habe ich nichts mehr verwendet.

Das obige Bild zeigt die Orginalplatine von Dallas. Man sieht sehr schön die Reed-Kontakte...und das hat wohl mal funktioniert.. ;-)

Also hab ich die Mechanik behalten und die Elektronik eben neu entwickelt. Basis ist der Mikrokontroller ATMEGA644(P) oder AU mit separatem Microchip CAN-Controller für den CAN-Bus und RS232-Ein/Ausgang zum Einstellen und Debuggen. Programmiert ist das Ganze in der Programmiersprache C mit GCC (WinAVR) übersetzt. Die Programmgröße hätte auch locker in eine 16k-Flash-CPU gepasst, aber wie gesagt der ATMEGA 644 ist mein Universal-Chip für alle Fälle (aber jetzt gibts ja den STM32 ...;-) ); der reicht auch für recht große Projekte, und man kann viele Module wiederverwerten, da man nicht auf Speicher achten muss ;-)

Hier sieht man die neue Platine im alten Dallas-Gehäuse. Die linke Welle misst den Drehwinkel, die rechte die Umdrehungen pro Zeit.

Die Platine hat fast die gleichen Maße wie die orginale Dallas-Platine, jedoch habe ich den freien Platz im Befestigungsbereich ebenfalls ausgenutzt. Dort sind jetzt alle Anschlüsse wie Stromversorgung, CAN-Bus sowie zum debuggen RS232-Ausgang und ISP-Anschluß zum Flashen des Programms. Man benötigt später nur noch 4 Adern (CAN+ CAN- sowie 9-12V DC und GND) in der Zuleitung.

Was wird jetzt wie gemessen ?

Windgeschwindigkeit

Die Windgeschwindigkeit wird mit dem Schalenkreuzanemometer gemessen. Das Schalenkreuz dreht sich in Abhängigkeit der Windgeschwindigkeit eine bestimmte Anzahl pro Zeiteinheit. Die Umdrehung wird über eine Welle ins Innere geleitet. Dort ist ein kleiner Magnet auf einem Ausleger angebracht der an einem Hall-Sensor "vorbeifliegt". Die Auswahl eines geeigneten Hallsensors war garnicht so einfach wie zunächst gedacht, denn: Viele dienen nur als Abstands- oder Wegsensor, und schalten dann einen Ausgang. Hauptproblem dabei ist, dass manche dieser Sensoren recht langsam ansprechen (50ms), und für die UPM oder besser UPS (Umdrehungen pro Sekunde) sind sie viiiiel zu langsam. Mit dem AH183 von Diodes.inc (https://www.diodes.com/datasheets/AH182_AH183.pdf) habe ich aber einen Sensor gefunden der mit 200us Ansprechzeit gut und ausreichend schnell funktioniert. Der Sensor ist auf dem Aussenradius des Drehgebers angebracht. Im Bild oben sieht man den winzigen Quadermagnet (1.5*1.5*2mm). Diesen musste ich statt der orginalen Dallas-Magnete nutzen, da diese viel zu stark waren. Diese haben dann meinen Drehwinkelsensor - für die Windrichtung - beeinflusst.

Den Magnet habe ich mit Heisskleber an Stelle der orginalen Magnete eingeklebt.

Windrichtung

Die Windrichtung grundsätzlich zu messen ist eigentlich ganz einfach. Man misst den Winkel den die Windfahne aufgrund der Windrichtung einnimmt. Nur wie misst man den Winkel ? Zunächst dachte ich, ich ersetze einfach die Reedkontakte ebenfalls durch "moderne" Hallsensoren. Entweder 8 oder 16 Sensoren, je nach Auflösung. Gut der ATMEGA 644 hat genug Eingänge, und die Hallsensoren sind auch preiswert.

Dies hatte ich auch schon weitgehend konstruiert, jedoch gefiel mir überhaupt nicht, dass man dann in Software herausfinden muss ob die Windfahne quasi zwischen zwei Positionen steht. Auch war das Routing auf der Platine (sofern man auf einer Seite bleiben möchte) recht schwierig, von den vielen Bauteilen ganz zu schweigen.

Nun mit etwas Recherche habe ich einen schönen Sensor gefunden der sehr elegant "magnetisch" direkt den Winkel messen und ausgeben kann, und zwar mit nahezu beliebiger Gradauflösung, und das auch noch schnell.

Der Sensor AS5040 kommt von Austria Microsystems und liefert 10 Bit Auflösung, dass sind über 360 Grad 1024 Teilstriche - also ca 0.35 Grad Auflösung. Für eine Windfahne zumindest sicher ausreichend.

Im nachfolgenden Bild sieht man den Sensor-Chip in der Mitte der Platine sowie den Magnet mit Schrumpfschlauch auf der Welle befestigt.

 

Das Hauptproblem hier ist, das man für den Sensor sogenannte Diametral-Magnete benötigt, oder einfach einen "normalen" Magnet entsprechend ausgerichtet auf der Welle befestigt. Das Prinzip findet sich schön erklärt auf der Austria Microsystems-Webseite.

Elektronik

Windgeschwindigkeit wir über die ICP (Input Capture Interrupt Pin) Funktion des ATMEGA 644 gemessen. Das bedeutet per Hardware wird die genaue Zeit beim Eingang eines Pegelwechsels erfasst. Dies funktioniert auch wenn die CPU irgendetwas anderes macht, z.B. weil sie in einem anderen Interupt hängt. Dies ist eine Spezialfunktion der meisten ATMEGA-Chips, und funktioniert nur auf dem PD6 Eingang. Also Achtung wenn jemand das nachbauen will.

Hierzu sind die folgenden ATMEGA 644 Registereinstellungen nötig:

TCCR1B = (1<<ICES1)  | (1<<CS12) ; // Input Capture Edge, 256 Prescaler
TIMSK1 = (1<<ICIE1) | (1<<TOIE1); // Activate Interrupts for Capture + Overflow

diese Routine:

ISR( TIMER1_OVF_vect )
{
TimerOverflows++;
}

und diese:

ISR( TIMER1_CAPT_vect )
{
LastOverFlows=TimerOverflows;
TimerOverflows=0;
StopTimer = StartTimer;
StartTimer = ICR1;
LastTime=StartTimer-StopTimer;;
}

erfasst den Drehimpuls und verabeitet Diesen. Die Anzahl der Impulse pro Zeiteinheit ist dann ein Maß für die Windgeschwindigkeit.

Der Drehwinkel wird über den AS5040 erfasst und per SSI in den ATMEGA 644 übertragen. Da ich keinen fertigen Code oder anderes Verwertbares gefunden hatte, habe ich das halt selbst programmiert (war aber auch einfach). Ich hatte Wert darauf gelegt, die Messung und Kommunikation mit dem Magnetsensor ohne Interrupt oder Timer zu realisieren, damit die für andere Funktionen frei bleiben.

Die Messung und die Übertragung in den Prozesor dauert ca. 50 us und ist schnell genug für die Messung der Windrichtung.

Nachfolgend finden sich die Pläne und die Basissoftware: