Ultraschallsensor
Bei [1] bekommt man einen Ultraschallsensor [2], der über eine kleine Zusatzschaltung (ebenfalls dort erhältlich) auch ohne den dort aufgeführten Controller an eine serielle Schnittstelle angebunden werden kann. Dort sind noch andere Sensortypen im Angebot, diese kann man auch selbst bauen. Ich verwende derzeit den verlinkten Mini-Sensor um meinen Zisternenfüllstand auszulesen und will bei Unterschreitung der Mindestfüllmenge über Fhem ein Relais (über die Pollin K8IO-Karte [3], derzeit an der parallelen Schnittstelle, perspektivisch an einem Pollin AVR-Net-IO [4]) über Ethersex/ECMD zur Ansteuerung eines Magnetventils der Nachspeisung schalten. Damit soll ein Trockenlaufen der Pumpe vermieden werden und auch in Trockenzeiten Wasser über die Brauchwasserleitung zur Verfügung stehen.
Das Protokoll ist ziemlich einfach (5 Ziffern im Abstand von ca. 100 ms senden und die Ausgabe des Sensors seriell einlesen), sodass eine Verarbeitung mit Fhem, Nagios/Icinga oder Cacti jederzeit möglich ist.
Durch den (Mindest-)Abstand von 100 ms zwischen den Zeichen verbietet sich der Einsatz von ECMD, da dieses Modul die Zeichen immer mit der vollen Baudrate sendet und bisher kein "Pausenzeichen" (delay) dort möglich ist.
Deshalb habe ich ein kleines (aber nicht sehr elegantes) Pearl-Skript für die serielle Schnittstelle geschrieben, welches momentan zwar im Verzeichnis /usr/share/fhem/FHEM/ liegt, aber noch nicht in FHEM eingebunden ist. Ich verwende dieses aber bereits für das Statusdisplay.
#!/usr/bin/perl # # Ultrasonic sensor value retrieval using Mini3-Sensor from icplan.de # Copyright (C) 2011 Jens Wagner # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # # use strict; use Device::SerialPort; # my $seriel = Device::SerialPort->new('/dev/ttyS1') || die "Kann /dev/ttyS1 nicht öffnen! ($!)\n"; # $seriel->baudrate(9600); $seriel->parity("none"); $seriel->databits(8); $seriel->stopbits(1); # print "Entfernung Sensor 1: "; # $seriel->write('1'); select(undef, undef, undef, 0.2); $seriel->write('2'); select(undef, undef, undef, 0.2); $seriel->write('0'); select(undef, undef, undef, 0.2); $seriel->write('0'); select(undef, undef, undef, 0.2); $seriel->write('0'); # # $|=1; my $exit=0; while($exit < 2000) { my ($cin, $sin) = $seriel->read(1); if($cin) { print $sin; $exit=0; } else {$exit++} } print "\n"; # exit(0);
Verwendet man an Stelle der Zeichenfolge '1 2 0 0 0' die Zeichenfolge '1 1 0 0 0' bekommt man die Temperatur des Sensors angezeigt.
Das Skript muss zwingend verbessert werden, da derzeit nur der Abstand in cm zum Wasserspiegel ausgegeben wird und nicht das enthaltene Volumen. Hierzu braucht man entweder (da meist liegende Zylinder oder Kugeln zum Einsatz kommen) etwas Mathematik oder man nutzt eine Tabelle in Form einer CSV-Datei. Ich habe bereits letzteres in Vorbereitung aber noch nicht in das Skript eingebaut.
-- wird fortgesetzt --Mick 00:03, 21. Jan. 2012 (CET)