Damit die Balkonpflanzen auch im Urlaub nicht vertrocknen, stellt dieser Snapshot ein Bewässerungssystem vor, bei dem Linux zweimal täglich die Schleusen öffnet.
Im Sommer genügen schon wenige Tage abwesenheitsbedingter Gießpause, damit die geliebten Balkon- und Zimmerpflanzen ernsthaft Schaden nehmen. Statt nach jeder Kurzreise zum Supermarkt zu fahren, um totes Grünzeug zu ersetzen, überlässt es der Hobbygärtner nach Lektüre dieses Artikels einfach einer Pumpe samt Linux, für den nötigen Wassernachschub zu sorgen.
Schadensbegrenzung
Wer jedoch wie hier Software-gesteuert mit Wasser hantiert, läuft immer Gefahr, die Wohnung infolge eines unvorhergesehenen Fehlers unter Wasser zu setzen. Einen Ausweg aus diesem Dilemma zeigte unlängst eine Bewässerungslösung, die das amerikanische Hightech-Bastelmagazin “Make” [2] vorstellte: Dort beschränkte einfach eine Flasche als Tank den Wasservorrat auf eine unschädliche Menge.
Weil die Frau des Perlmeisters aber keine mit Heißleim zusammengeflickten Wasserflaschen in der Wohnung duldet, ist das heute vorgestellte Pumpsystem optisch etwas ansprechender: Der Vorratsbehälter besteht aus einem im Haushaltswarenladen gekauften Hundekeksbehälter mit aufklappbarer Öffnung (4,75 Dollar, Abbildung 1) und einer bei Ebay ersteigerten Aquariumpumpe (6,75 Dollar plus Porto). Mit einer Bohrmaschine und einem Schleifkopf fräste der Meister in die Rückseite des Behälters oben einen Spalt, durch den der im Heimwerkermarkt gekaufte Wasserschlauch und das Netzkabel der Pumpe auch bei geschlossenem Deckel nach außen gelangen. Der Schlauch führt durchs Fenster auf den Balkon und endet über den Blumentöpfen.

Abbildung 1: Der seinem Zweck etwas entfremdete Hundekeks-Spender mit eingebauter Wasserpumpe. Der Schlauch führt durchs Fenster auf den Balkon zu den Pflanzen hinaus.
Über jeder zu bewässernden Pflanze findet sich ein kleines Loch im Schlauch, durch das Wasser an die Pflanze gelangt. Es ist sorgfältig darauf zu achten, dass die Löcher nicht zu groß werden, falls doch, sind sie leicht mit Kleber wieder zu verkleinern oder ganz zuzustopfen. Die Aquariumpumpe erhält mit Heißkleber Haftung am Behälterboden. Zum Wassernachfüllen klappt man einfach den roten Deckel des Behälters auf.
Gießbefehl durchs Stromnetz
Ein X10-Modul [3] schaltet die Pumpe ein- und aus. Wie schon einmal in [4] vorgestellt, lassen sich mit dem X10-Protokoll Signale über das Stromnetz schicken. Der Sender hängt in diesem Fall am seriellen (oder USB-)Port des Linux-Rechners und speist mit Hilfe einer X10-PC-Schnittstelle (in Deutschland unter anderem auf [5] erhältlich) Signale ins Stromnetz ein. Der Empfänger (siehe Abbildung 3) ist mit einer anderen Steckdose im selben Netz verbunden, empfängt das Signal und schaltet daraufhin die angeschlossene Aquariumpumpe ein und aus.
Die Ansteuerung der seriellen Schnittstelle ist ausgesprochen simpel. Das Skript »water« in Listing 1 muss der User »root« starten, damit es Schreibzugriff auf die erste serielle Schnittstelle des Rechners unter »/dev/ttyS0« erhält, die mit dem X10-Sender verbunden ist. Auch die Steuerung eines Controllers über die USB-Schnittstelle ist möglich, das Wish-Projekt [6] stellt die nötige freie Software dafür bereit.
|
Listing 1: |
|---|
01 #!/usr/bin/perl
02 use warnings;
03 use strict;
04
05 use Device::SerialPort;
06 use ControlX10::CM11;
07 use Log::Log4perl qw(:easy);
08 use Waterscore qw(waterscore);
09
10 my $HOUSE_CODE = "K";
11 my $UNIT_CODE = "11";
12 my $SERIAL = "/dev/ttyS0";
13 my $BAUDRATE = 4800;
14 my $LOCATION = "USCA0987";
15
16 die "You must be root" if $> != 0;
17
18 Log::Log4perl->easy_init({
19 level => $DEBUG,
20 file => ">>/var/log/water.log"});
21
22 my $score = waterscore($LOCATION);
23
24 if($score < 20) {
25 INFO "No water.";
26 exit 0;
27 }
28
29 my $serial = Device::SerialPort->new(
30 $SERIAL, undef);
31 $serial->baudrate($BAUDRATE);
32
33 # Address unit
34 ControlX10::CM11::send($serial,
35 $HOUSE_CODE . $UNIT_CODE);
36
37 # Turn water pump on
38 INFO "Water on";
39 ControlX10::CM11::send($serial,
40 $HOUSE_CODE . "J");
41
42 sleep($score/10);
43
44 # Turn water pump off
45 INFO "Water off";
46 ControlX10::CM11::send($serial,
47 $HOUSE_CODE . "K");
|
Geheimcode
Die im Skript verwendeten Werte für den House Code (»K«) und den Unit Code (»11«) dienen der Adressierung des Empfängers, der, wie in Abbildung 3 zu sehen, ebenfalls auf »K« und »11« eingestellt ist. Diese Werte müssen im Hausstromnetz eindeutig sein.
Das Skript »water« nutzt die Module »Device::SerialPort« und »ControlX10::CM11« vom CPAN für die Fitzelarbeit mit der seriellen Schnittstelle und den Besonderheiten des X10-Protokolls. Gemäß X10 ist das Kommando zum Einschalten eines Empfängers »J«, mit »K« schaltet er danach wieder ab. Vor dem Senden eines Kommandos ist jeweils der Empfänger zu adressieren. Und jedem Kommando geht der House Code voran.
Grüner Daumen
Pflanzen brauchen bei heißem Wetter, wie jeder weiß, mehr Wasser, aber bei Regen gar keins. Das Skript »water« kontaktiert daher den Wetterservice »weather.com« im Internet und fragt dort die aktuelle Temperatur, die Luftfeuchtigkeit und die aktuelle Wetterlage ab. Aus diesen drei Parametern generiert es dann einen Bewässerungs-Score, der Werte zwischen 0 und 100 annimmt.
Bei 0 brauchen die Pflanzen kein Wasser, bei 100 sehr viel. Bei einem Score von weniger als 20 gießt »water« daher überhaupt nicht, darüber bringen jeweils zehn Punkte eine um eine Sekunde längere Gießdauer. Maximal bleibt die Pumpe 10 Sekunden an, diesen Wert sollte jeder Gärtner auf die Pumpkapazität und den Wasserbedarf der Pflanzen auf dem heimischen Balkon abstimmen.
Hydrorechner
Die Wässerungspunktzahl errechnet das Extra-Modul »Waterscore.pm« in Listing 2. Dessen Funktion »waterscore« exportiert das aufrufende Skript »water« in seinen Namensraum. Perls Exporter-Modul sorgt für diesen Service. »Waterscore.pm« kontaktiert die Wetterseite »weather.com« mit einer Partner-ID und einem Lizenzschlüssel. Beides erhält kostenlos, wer sich mit einer gültigen E-Mail-Adresse registriert. Das CPAN-Modul »Weather::Com« abstrahiert den Zugriff auf den dort angebotenen Webservice und wandelt das zurückkommende XML praktischerweise gleich in Perl-Strukturen um.
|
Listing 2: |
|---|
01 ###########################################
02 package Waterscore;
03
04 use base Exporter;
05 @EXPORT_OK = qw(waterscore);
06
07 use strict;
08 use warnings;
09 use Weather::Com;
10 use Log::Log4perl qw(:easy);
11
12 my $PARTNER = "1031443804";
13 my $LICENSE = "8d88149d90fec933";
14
15 ###########################################
16 sub waterscore {
17 ###########################################
18 my($loc) = @_;
19
20 my $w = Weather::Com->new(
21 current => 1,
22 units => "m",
23 timeout => 250,
24 partner_id => $PARTNER,
25 license => $LICENSE,
26 );
27
28 my $now = $w->get_weather($loc);
29 return undef unless defined $now;
30
31 my($cond, $temp, $humi) =
32 map { $now->{cc}->{$_} }
33 qw(t tmp hmid);
34
35 DEBUG "$cond, $temp C, $humi%";
36
37 my $score = 50;
38 $score += 50 if $humi < 50;
39 $score -= 30 if $cond =~ /Showers/;
40 $score -= 80 if $cond =~ /Rain/;
41 $score += 80 if $cond =~ /Sunny/;
42
43 if($temp > 20) {
44 $score += ($temp-15)*10;
45 }
46
47 $score = 100 if $score > 100;
48 $score = 0 if $score < 0;
49 DEBUG "Score: $score";
50 return $score;
51 }
52
53 1;
|
Bayernmetropole GMXX0087
Die Seite »weather.com« liefert das Wetter für Wetterbezirke, die sie mit Kürzeln wie USCA0987 (für San Francisco) bezeichnet. Das Skript »location« (Listing 3) hilft das Kürzel für den lokalen Wetterbezirk zu finden. Abbildung 4 zeigt die Ausgabe des Skripts mit dem Argument »berlin«. Neben einer Reihe von ebenfalls Berlin benannten Städten in den USA liefert es zwei Einträge für das deutsche Berlin. Mit München kann das Modul sonderbarerweise nichts anfangen, aber mit »Munich« aufgerufen liefert es die richtige Wetterstation GMXX0087 der heimlichen Hauptstadt.
|
Listing 3: |
|---|
01 #!/usr/bin/perl -w
02 use strict;
03 use Weather::Com;
04
05 my $w = Weather::Com->new();
06
07 $ARGV[0] or die "usage: $0 city";
08
09 my $locs = $w->search($ARGV[0]);
10
11 for my $loc (keys %$locs) {
12 printf "%-20s %sn",
13 $locs->{$loc}, $loc;
14 }
|
Wetterregeln
»Waterscore.pm« bedient sich einiger empirisch ermittelter Tricks, um den Score zu berechnen. Meldet der Wetterdienst Regen (die Worte »”Rain”« oder »”Showers”« kommen im Wetterbericht vor), zieht es 80 Punkte ab, sodass die Mechanik kaum Wasser an die Pflanzen abgibt, es sei denn, es ist sehr heiß. Geringe Luftfeuchtigkeit erhöht hingegen die Punktzahl und damit Gießwahrscheinlichkeit und -dauer. Sonniges Wetter (angezeigt durch das Wort »”Sunny”« im Feld »{cc}->{t}«) und Temperaturen über 15 Grad Celsius wirken in ähnlicher Weise auf den Zähler ein.
Wird der Konstruktor von »Weather::Com« mit einem wahren Wert für den Parameter »current« aufgerufen, holt die nachher aufgerufene Methode »get_weather()« die Messwerte für das gerade herrschende Wetter ein. Der auf den Wert »”m”« (für metrisch) gesetzte Parameter »units« gibt an, dass die Temperaturen in Celsius und nicht in Fahrenheit zurückkommen.
|
Infos |
|---|
|
[1] Artikel-Listings: [ftp://www.linux-magazin.de/pub/listings/magazin/2007/03/Perl] [2] Bastelmagazin “Make”: [http://makezine.com], Volume 08, Seite 22 [3] X10: [http://de.wikipedia.org/wiki/X10] [4] Michael Schilli, “Kontaktmann”: Linux-Magazin 12/04, S. 104; [https://www.linux-magazin.de/Artikel/ausgabe/2004/12/perl/perl.html] [5] Intellihome: [http://www.intellihome.be/deutsch/store.asp?pag=cat&menu=7] [6] Wish: [http://wish.sourceforge.net] |











