Wasserzähler mit HM-ES-TX-WM

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

Sven_A
Beiträge: 2123
Registriert: 26.01.2016, 08:14
Wohnort: Renningen

Wasserzähler mit HM-ES-TX-WM

Beitrag von Sven_A » 05.12.2016, 10:34

Hallo,

ich wollte nach Strom und Gas auch den Wasserzähler an die Homematic anschließen. Warum? Weil es geht ;)

Nach langen Recherchen und Suchen hab ich mir also Eugens Wasserzähler als Vorlage genommen. Vielen Dank an dieser Stelle für die Anleitung/Doku. Ohne die hätte ich das nicht hin bekommen.

Ich hab also Eugens Grundlage genommen, wollte aber unbedingt das Thema Mehrfacherkennung/prellen los werden. Da ich immer eine Hand voll Arduino Unos in der Bastelkiste liegen hab war klar: Das geht für mich am schnellsten und einfachsten.

Eugens Schaltung mit der grünen LED und dem Phototransistor hab ich also an einen Arduino Uno und dessen analogen Eingang angeschlossen. Dieser ließt im 50ms Abstand den Wert am analogen Eingang und kann so erkennen wann der Zeiger vorbei kommt. Ich überwache wie Eugen auch den Literzeiger der Wasseruhr. Reflektiert der weiße Untergrund habe ich einen realtiven niedrigen Wert am Analogeingang, kommt dann der rote Zeiger vorbei wird weniger Licht reflektiert, und der Wert am Eingang steigt an.
Mit der weißen Reflektionsfläche liegt der Wert ungefähr bei 450, mit dem Zeiger bei 550. Um das Prellen zu vermeiden hab ich also den Arduino so programmiert das der Wert über 520 steigen muss um als Zeiger erkannt zu werden, und erst wieder unter 480 fallen muss bevor überhaupt eine weitere Erkennung statt findet. Die Werte hängen natürlich immer stark von den jeweiligen Gegebenheiten vor Ort ab, wenn das jemand Nachbauen will muss hier angepasst werden.

Als nächstes war die Frage wie ich den erkannten Zeiger in die Homematicwelt bekomme? Ich hätte den Arduino natürlich ans Netzwerk hängen können, und direkt in eine Systemvariable schreiben können. Ist aber viel Aufwand um sicher zu gehen das dort alles sauber ankommt, auch wenn die CCU vielleicht gerade mal neu Bootet. Also dachte ich mir ich nehme den HM-ES-TX-WM, da ist schon alles drin was an Logik benötigt wird, außerdem hab ich die schon für Gas und Wasser im Einsatz.

Meinen Arduino hab ich also als "Gaszähler" getarnt angeschlossen. m³ sind m³, egal ob Gas oder Wasser.
Über einen digitalen Ausgang des Arduinos steuer ich einen Optokoppler an, auf dessen anderer Seite die HM-Sendeeinheit hängt. Damit hab ich die Systeme sauber galvanisch getrennt. Auf der Arduinoseite hängt noch eine weitere LED als optische Kontrolle, bei jedem gemessenen Liter blinkt die einmal kurz mit.

Mechanisch hab ich den Phototransistor wie Eugen auch in einem kurzen Rohr untergebracht, um die notwendige "Zielgenauigkeit" zu erreichen. Auf der Suche wie ich das am besten auf meine Wasseruhr bekomme bin ich über den Deckel eines Babybreis gestolpert, der Haargenau in meine Wasseruhr passt. Stitz stramm ohne zu Wackeln, lässt sich aber gut entfernen. Für den Ableser der Stadt hab ich noch ein Sichtfenster über die m³ Anzeige rein geschnitten. Dann noch eine Markierung mit Klebeband um die Leseeinheit bei Bedarf wieder sauber einsetzen zu können, und gut ist.

Anbei mal noch Bilder und meine Schaltpläne.

Das ganze ist erst seit gestern fertig, jetzt muss sich im Test zeigen.
Bei Fragen oder Anmerkungen einfach melden.

Gruß,
Sven
Dateianhänge
schaltplan2.jpg
Achtung: Die LED braucht noch einen 220 Ohm Widerstand! Damit gehts zur HM-Sendeeinheit. Links gehts zum Arduino, in der Mitte trennt der Optokoppler die HM Welt galvanisch. Rechts die PINs an der Buchse der HM-Sendeeinheit.
schaltplan1.jpg
Ein paar Kleinteile am Arduino. Widerstände, die grüne LED, der Phototransistor.
wasseruhr2.jpg
Wasseruhr mit Ableseeinheit.
wasseruhr.jpg
So sieht meine Wasseruhr aus.
Zuletzt geändert von Sven_A am 21.12.2016, 07:42, insgesamt 2-mal geändert.

xdelta
Beiträge: 38
Registriert: 06.12.2015, 13:36
Wohnort: Meschede

Re: Wasserzähler mit HM-ES-TX-WM

Beitrag von xdelta » 05.12.2016, 12:16

Spannende Sache - vielen Dank fürs Teilen!

Grüße
Kai

Sven_A
Beiträge: 2123
Registriert: 26.01.2016, 08:14
Wohnort: Renningen

Re: Wasserzähler mit HM-ES-TX-WM

Beitrag von Sven_A » 07.12.2016, 12:25

Bisher scheint das ganz gut zu funktionieren, im CCU-Historian schauts jedenfalls gut aus.
trend1.png
CCU-Historian
Anbei auch noch ein Bild wo man den Aufbau evtl. etwas besser erkennt.
wasseruhr3.jpg
Schrägansicht
Gruß,
Sven

Sven_A
Beiträge: 2123
Registriert: 26.01.2016, 08:14
Wohnort: Renningen

Re: Wasserzähler mit HM-ES-TX-WM

Beitrag von Sven_A » 12.12.2016, 08:39

So, nach einer Woche Betrieb mal eine erste Ergebnissmeldung: Der Zählerstand in der Homematic ist heute morgen 10 Liter VOR der Wasseruhr im Keller... ggf. hatte ich aber den Referenzwert falsch eingegeben, weil der 10 Liter Zeiger direkt beim Umspringen war... und ich mir natürlich nicht notiert habe was ich abgelesen/eingegeben hatte... Bei genau 10 Liter halte ich das aber für plausibel, insofern würde ich sagen funktioniert das :D

Cybertron
Beiträge: 111
Registriert: 08.12.2014, 09:31

Re: Wasserzähler mit HM-ES-TX-WM

Beitrag von Cybertron » 12.12.2016, 08:56

Coole Idee...

Das koennte mich auch reizen.
Würdest du eventuell mal eine komplette Bauteilliste und den Sketch für den Uno Posten ?

Gruß
Silvio
--------------------------------------------
770 Kanäle und 3439 Datenpunkte in 223 Geräten:

Sven_A
Beiträge: 2123
Registriert: 26.01.2016, 08:14
Wohnort: Renningen

Re: Wasserzähler mit HM-ES-TX-WM

Beitrag von Sven_A » 12.12.2016, 09:54

Klar doch. Teileliste ist einfach:

- Arduino Uno oder kompatibel

Auswerteeinheit:
- 220 Ohm Vorwiderstand für Grüne LED
- 100 kOhm Pullupwiderstand für Phototransistor
- grüne, helle LED, ich hab z.B. elv 68-07 96 38 NACHTRAG: Gerade stelle ich fest das es die 23000mcd helle grüne LED nichtmehr gibt, als Alternative geht evtl. elv 68-04 89 26. auch wenn die weniger Leuchtkraft hat
- Phototransistor Osram „SFH 309-5“ (genau dieses Model mit -5 am Ende, gibts z.B. bei eBay)
auswerteeinheit.jpg
Auswerteeinheit
Sendeeinheit:
- 220 Ohm Vorwiderstand für Optokoppler
- Optokoppler, ich hab z.B. elv 68-11 33 89
- ggf. Sockel für Optokoppler, kann man aber auch direkt verlöten, ich hatte noch einen (elv 68-11 20 06) rumfahren,
- 110kOhm Widerstand (oder 100kOhm + 10kOhm, oder oder oder...)
- ggf. noch irgendeine Status-LED die anzeigt das ein Impuls an den HM-ES-TX-WM gesendet wurde, ich hatte noch eine grüne 3mm rumliegen, ist aber nicht nötig
- 6poliger Westernstecker + Crimpzange
sendeeinheit.jpg
Sendeeinheit
Je nach Lust und Laune noch etwas Platinenmaterial, Stecker, Buchsen,...
Oder alles direkt miteinander verlöten, das muss jeder selber wissen.

Den Sketch häng ich hier auch mal dran, auch wenn er alles andere als schön ist, weil ich mehrfach umgebaut hatte und auch erst mit IR-Lichtschranken experimentiert hatte..:

Code: Alles auswählen

/*
Wasserzählerscript für Arduino Uno.
Erstellt von Sven Angelmahr sven@angelmahr.de
Mehr Infos: http://homematic-forum.de/forum/viewtopic.php?f=18&t=34207

v0.1 - Proof of concept, only reading the analog pin and printing the result to the serial
v1.0 - First RC, has yet to be tested.


If there is much reflection from the white surface the reading on the analog PIN is low. 
If the red pointer comes along there is less reflection, so the analog reading rises.
To avoid chatter/bouncing there is not one value to keep them apart, but two. For the pointer to be counted as "seen"
the analog reading has to rise above "highLevel". After that it has to drop below "lowLevel" to be sure the
pointer has passed.
*/

//analog read value will be compared to this, make your changes here!
const int highLevel = 520;
const int lowLevel = 480;

//Sensors and LEDs
const int irout = 2;
const int irin = A0;
const int pulseout = 3;

int sensorValue = 1000;  // value read from the photo transistor

// false = high reflection, no counter event
// true = low reflection, counter event
boolean lastCountState = false; 



void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  pinMode(irout, OUTPUT);
  digitalWrite(irout, HIGH);
  pinMode(pulseout, OUTPUT);
  digitalWrite(pulseout, LOW);
}

void loop() {
    // If the lowLevel value is higher than the highLevel the counter can not work, go to error loop
    // The LED lighting the pointer will flicker to show something is wrong
    while (lowLevel>highLevel) {
      digitalWrite(irout, HIGH);
      delay(500);
      digitalWrite(irout, LOW);
      delay(500);
    } 
        
    // perform measurement
    // read the analog value:    
    sensorValue = analogRead(irin);           
    // print analog value to serial, just for debug
    Serial.println(sensorValue);
    
    // counter-event found
    if ((sensorValue >= highLevel) && (lastCountState == false)) {
      lastCountState = true;
      Serial.println("Counter-Event detected!\n");
      digitalWrite(pulseout, HIGH);
      delay(200);
      digitalWrite(pulseout, LOW);
    }
    //counter-event passed by
    else if ((sensorValue <= lowLevel) && (lastCountState == true)) {
      lastCountState = false;
      Serial.println("Counter-Event passed, back for waiting.\n");      
    }
    
    //wait 50ms before next measurement
    delay(50);
}
Viele Grüße,
Sven
Zuletzt geändert von Sven_A am 13.01.2017, 12:11, insgesamt 2-mal geändert.

Ghoethe
Beiträge: 46
Registriert: 18.12.2015, 12:50
Kontaktdaten:

Re: Wasserzähler mit HM-ES-TX-WM

Beitrag von Ghoethe » 12.12.2016, 19:55

Kannst du auch eine kleines arduino how-to schreiben, für jene die gar keine Ahnung von arduino haben?

Löten, Schaltplan lesen is kein Problem, aber was stelle ich mitder kleinen Platine an, wenn mein Amazon Paket eintrifft :wink:

Sven_A
Beiträge: 2123
Registriert: 26.01.2016, 08:14
Wohnort: Renningen

Re: Wasserzähler mit HM-ES-TX-WM

Beitrag von Sven_A » 13.12.2016, 08:19

Ich versuche das mal.

Als erstes die Entwicklungsumgebung runterladen und installieren:
https://www.arduino.cc/en/Main/Software

Dann den Arduino per USB an den Rechner anschließen, da es sich um einen einfachen USB-Serial-Chip handelt sollte das eigentlich unter keinem Betriebssystem zu nennenswerten Fehlermeldungen führen... :twisted:

Arudino Entwicklungsumgebung starten. Da geht dann gleich ein leerer "Sketch" auf. Sketch ist das was nachher mal das Programm wird.

Unter dem Menüpunkt "Tools" --> "Serieller Port" den korrekten Port einstellen. Für mein Linuxsystem wäre das /dev/ttyUSB0, unter Windows wirds irgendein COM7/8/was-auch-immer werden. Da kann aber auch nichts kaputt gehen, wenn du den falschen Auswählst gibts nachher beim Übertragen eine Fehlermeldung.

Dann muss unter "Tools" --> "Boards" noch das korrekte Arduino Board ausgewählt werden, also (vermutlich) den "Arduino Uno" (außer du hast was anderes Bestellt).

Dann eigentlich nur noch meinen Quellcode in den leeren Sketch kopieren, und einmal links oben das Häckchen drücken. Dann sollte im unteren Teil des Sketches in dem grünen Balken "Kompilierung abgeschlossen" stehen, und im schwarzen Balken steht dann noch die Größe des Programmes. Wenn hier irgendwelche Fehlermeldungen auftauchen stimmt irgendwas mit dem Code nicht, nochmal neu kopieren, testen, und ansonsten Fehlermeldung hier posten.

Dann kann das Programm auf den Arudino übertragen werden. Dazu links oben neben dem Häckchen den Pfeil drücken. Das Programm wird dann nochmals neu kompiliert (=in Maschinensprache übersetzt) und dann auf den Arduino übertragen. Nach ein paar Sekunden sollte das erledigt sein und unten eine entsprechende Meldung erscheinen. Da ich gerade keinen zur Hand hab kann ich dir aber nichtmal sagen was genau da steht.

Jetzt sollte die grüne LED leuchten. Um was zu sehen oben "Tools" --> "Serieller Monitor" auswählen. Es geht ein neues Fenster auf wo der Arduino dir die gemessenen Werte des Phototransistors zeilenweise ausspuckt.

Jetzt gehts an die Wasseruhr: Den Phototransistor so ausrichten das er schön von oben auf die Stelle zeigt wo der Literzeiger vorbei kommt. Ich hab dazu von oben durch das Metalrohr geschaut, und dann die grüne LED so ausgerichtet das dass meiste Licht direkt unter dem Rohr ist. Dann die Photodiode in das Rohr schieben, aber nicht ganz nach unten bis aufs Glas, ich hab so ca. einen Zentiemeter Luft nach unten.

Am "Seriellen Monitor" solltest du jetzt die Werte sehen, und wenn die LED und der Transistor ausgerichtet sind und nicht bewegt werden sollte der Wert auch ziemlich stabil gleich bleiben. Jetzt mal Wasser laufen lassen und den Seriellen Monitor beobachten. Wenn der Zeiger unter der Photodiode vorbei kommt sollte der Wert niedriger werden. Wenn man mit der Höhe der Photodiode im Rohr etwas spielt sollte man den Punkt rausbekommen wo der Unterschied zwischen "Zeiger" und "kein Zeiger" möglichst groß ist. Ich hab aber auch nicht ewig rumgespielt, wenn der Unterschied deutlich ist reicht das. Den Phototransistor im Rohr fixieren, ich hab dazu einen Tropfen Heißkleber oben an die Kabel gemacht.

Jetzt musst du sinnvolle Werte für die Erkennung "Zeiger" oder "kein Zeiger" festlegen. Bei mir war "Kein Zeiger" ca. 550, also hab ich im Sketch in Zeile 18 "HighLevel = 520" gesetzt. Sprich jeder Wert der über 520 geht wird als "kein Zeiger" erkannt. Zwischen 550 und 520 ist noch etwas "Luft", das ist absicht. Sonst wird die Erkennung nachher zu schwer.

Den "Zeiger" Wert lag bei mir ca. bei 450, also habe ich in Zeile 19 "lowLevel = 480 gesetzt. Alles unter 480 wird damit als "Zeiger" erkannt. Auch hier etwas abstand zum niedrigsten Wert.

Durch Licht im Raum könnte der gemessene Wert schon mal leicht pendeln, daher ist wichtig das Zwischen "highLevel" und "lowLevel" genug Abstand ist.

Wenn du die Zahlen-Werte in Zeile 18 und 19 entsprechend geändert hast musst du das Programm per "Pfeil" nochmal kompilieren und auf den Arduino übertragen. Dabei wird der "Serielle Monitor" geschlossen, weil die serielle Verbindung zur übertragung des Programmes benötigt wrid.

Danach den Seriellen Monitor nochmal öffnen und Wasser laufen lassen. Es erscheinen permanent die gemessenen Werte. Beim Unterschreiten des in "lowLevel" festgelegten Wertes erscheint außerdem die Meldung "Counter-Event detected!" auf dem Monitor, und der Arduino gibt auf PIN 3 einen 200ms dauernd Impuls aus, wenn du auf der "Sendeeinheit" die Status-LED verbaut hast leuchtet diese entsprechnd für 200ms auf.

Wenn der gemessene Wert wieder über "highLevel" steigt ist der Zeiger wohl unter der Photodiode durch, und es erscheint die Meldung "Counter-Event passed, back for waiting." Der Arduino beobachtet weiter ob der Zeiger wieder vorbei kommt.

Jetzt kannst du die USB-Verbindung zum Arduino trennen. Der Arduino kann entweder per USB oder per Hohlbuchse mit Spannung versorgt werden. Ich hab USB gewählt, weil neben dran an der Heizung schon ein Raspberry hängt. Ich hab Arduino und Raspberry über ein gemeinsames USB Netzteil mit 2 Ausgängen versorgt, im Grunde ist das aber ganz egal. Sobald du den Arduino wieder mit Strom versorgst startet er wieder das Programm (Bootdauer so ca. 1 bis 2 Sekunden) und beobachtet deine Wasseruhr.

Fertig!

Hoffe das war jetzt alles Verständlich, wenn ich was vergessen habe einfach melden.

Gruß,
Sven

==== Nachtrag 1 ====
Wenn der HM-ES-TX-WM verwendet wird muss hier die Zählerkonstante natürlich noch auf 0.001 m³/IMP gesetzt werden, weil 1000 Liter nunmal 1m³ sind. Wenn der 10 Liter überwacht wird entsprechend 0.01m³/IMP eintragen,...

Ghoethe
Beiträge: 46
Registriert: 18.12.2015, 12:50
Kontaktdaten:

Re: Wasserzähler mit HM-ES-TX-WM

Beitrag von Ghoethe » 14.12.2016, 10:39

Perfekt, vielen Dank! :D

xdelta
Beiträge: 38
Registriert: 06.12.2015, 13:36
Wohnort: Meschede

Re: Wasserzähler mit HM-ES-TX-WM

Beitrag von xdelta » 14.12.2016, 12:36

auch von mir DANKE - Arduino ist unterwegs... :)

Antworten

Zurück zu „Projektvorstellungen“