MR3020 als Wetterstation

Es geht um den TP-Link MR3020, ein kleiner Wireless AP bzw. 3G Router. Das Gerät ist kompakt, günstig und bietet viele Erweiterungsmöglichkeiten.

Feuchtigkeit in %, gemessen im HaDiKo

Temperatur in °C, gemessen im HaDiKo

Hinweis: die Wetterstation befindet sich zum Testbetrieb, es kann noch viele Fehler geben.

Wir brauchen:

  • MR3020 von TP-Link (ähnliche Modelle gehen auch mit anderen Parametern)
  • OpenWRT
  • I2C Sensoren
  • Lötkolben und Zubehör.

I2C Einrichten

Wir wollen die Sensoren über I2C ansprechen. Die Pins für den Umschalter neben der Ethernet-Buchse haben schon PullUp Widerstände und sind daher gut geeignet.

Folgende Kernelmodule werden benötigt:

  • i2c-tools
  • kmod-i2c-core
  • kmod-i2c-gpio-custom

Derzeit (April 2013) lässt sich kmod-i2c-gpio-custom nicht sofort installieren da es ein Fehler mit einer Abhängigkeit gibt. Nach dem aktualisieren der Paketliste in der Datei /tmp/opkg-lists/attitude_adjustment die Abhängigkeit kmod-i2c-gpio bei kmod-i2c-gpio-customentfernen.

Danach führt man folgendes aus um alles zu initialisieren:

  • rmmod gpio_button_hotplug
  • insmod i2c_algo_bit
  • insmod i2c_gpio_custom bus0=0,18,20,4
  • insmod i2c_gpio
  • insmod i2c_dev

Jetzt kann man i2cdetect -y 0 um alle Geräte auf dem Bus zu suchen. Das Ergebnis sollte ugf. so ausehen:

root@OpenWrt:~# i2cdetect -y 0

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- 28 -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Ab jetzt kann man mit i2cget und ic2set weiterarbeiten. Die Werte für Feuchtigkeit und Temperatur stecken in 4 Bytes (jeweils 14 Bit + 2 status Bits) und werden aktualisiert sobald man etwas in den Speicher schreibt.
Das macht man am besten mit einem kleinen C-Programm (wird noch hochgeladen).

Skript für Munin

Für Munin auf OpenWRT holt sich dieses Skript und ändert es.

Das folgende Beispiel (noch nicht funktionsfähig) ist für ein HYT271.

  1. Unter dem Punkt # ===== PLUGINS CODE ===== folgenden Funktionen einfügen:
    config_temperature() {
    	echo "graph_title Temperature"
    	echo "graph_vlabel Deg. Celcius"
    	echo "temp1.label Sensor1"
    }
    
    fetch_temperature() {
            echo -n "temp1.value "
    }
    
    config_humidity() {
            echo "graph_title Humidity"
            echo "graph_vlabel Relative %"
            echo "hum1.label Sensor1"
    }
    
    fetch_humidity() {
    
            echo -n "hum1.value "
    }
  2. Ganz am Anfang des Skriptes die Funktionen der Liste hinzufügen. Beispiel (hier wurde alles andere entfernt):
    # Remove unwanted plugins from this list
    PLUGINS="temperature humidity"

    Falls man die anderen Funktionen nicht braucht und das Skript vereinfachen möchte kann man alle anderen Funktionen von # ===== PLUGINS CODE ===== entfernen und den Inhalt von Punkt # ===== Runtime config ===== durch folgendes ersetzen:

    RES=""
    for PLUG in $PLUGINS
      do
        RES="$RES $PLUG";
      done
    PLUGINS=$RES
  3. Die Pakete xinetd und bc installieren.
  4. Unter /etc/xinetd.d eine Datei munin erstellen und folgendes einfügen:
    service munin
    {
    port = 4949
    socket_type = stream
    wait = no
    server = /usr/bin/munin-node
    user = root
    group = root
    only_from = 10.0.0.10
    }

    Die Parameter muss/sollte man nach Bedarf anpassen. server muss auf das in Punkt 1 erstelle Skript zeigen.

  5. xinetd starten.