FHEM – Analoge Eingänge einlesen

Das Anlegen eines analogen I2C-Eingangsmodules wurde in diesem Beitrag beschrieben
FHEM – I2C-Module anlegen und adressieren.
Hier zeigen wir, wie die einzelnen Analogeingänge definiert und angesprochen werden.

Die Analog-Eingangskarte stellt ihre Messwerte als Byte-Array zur Verfügung.

Byte 1 Zeiger
Byte 2 Analogwert 1 Low Byte
Byte 3 Analogwert 1 High Byte
Byte 4 Analogwert 2 Low Byte
Byte 5 Analogwert 2 High Byte
Byte 6 Analogwert 3 Low Byte
Byte 7 Analogwert 3 High Byte
Byte 8 Analogwert 4 Low Byte
Byte 9 Analogwert 4 High Byte
Byte 10 Analogwert 5 Low Byte
Byte 11 Analogwert 5 High Byte

Die genaue Beschreibung der 5-Kanal Analogkarte I2HAE ist hier beschrieben.
I2C-Analog Input 5 Kanäle 0-10V 10 Bit

Aber jetzt zu FHEM. Wir möchten die Analogwerte alle zwei Sekunden lesen um den PI nicht unnötig zu belasten.
Für zyklische Abfragen kann man in FHEM den Befehl bzw. das Modul AT verwenden.

Diese Zeile legt einen AT an, der alle zwei Sekunden Zeitintervall triggert.

define read_AE at +*00:00:02 .

Um an die Werte zu kommen, müssen 11 Bytes von der Karte gelesen werden.
Das erfolgt über den Befehl “get myI2C readblock 0x08 11”. Aus dem Byte-Array können die einzelnen Messwerte dann berechnet werden.

In dem AT-Modul dann folgende Codezeilen in die DEF kopieren:

+*00:00:02 {
 my @parts = split(/ /,fhem "get myI2C readblock 0x08 11");;
 my $value_1 = $parts[4] * 256 + $parts[3];;
 my $value_2 = $parts[6] * 256 + $parts[5];;
 my $value_3 = $parts[8] * 256 + $parts[7];;
 my $value_4 = $parts[10] * 256 + $parts[9];;
 my $value_5 = $parts[12] * 256 + $parts[11];;
 fhem("set AE08_CH0 $value_1");;
 fhem("set AE08_CH1 $value_2");;
 fhem("set AE08_CH2 $value_3");;
 fhem("set AE08_CH3 $value_4");;
 fhem("set AE08_CH4 $value_5");;
}

5 Kommentare

  1. Hallo,

    besten Dank für die schnelle Antwort und ohnehin die gesamte Entwicklungsarbeit.

    Ich habe es nun folgendermaßen gemacht – es gibt ein eigenes Modul für den MCP3424 🙂

    define modulE68_CH1_4 I2C_MCP342x 0x68 4
    attr modulE68_CH1_4 IODev myI2C
    attr modulE68_CH1_4 poll_interval 1
    attr modulE68_CH1_4 room i2c

    define E68.1 readingsProxy modulE68_CH1_4:Channel1
    attr E68.1 group ModulE68
    attr E68.1 icon time_graph
    attr E68.1 room i2c

    Auch interessant – es gibt ein eigenes Kernel-Modul für den MCP3424, welches wie folgt aktiviert wird:

    echo mcp3424 0x68 > /sys/bus/i2c/devices/i2c-1/new_device

    Im Anschluss können die Werte bequem von der CLI abgerufen werden, bspw.:

    watch -n 0.5 ‘cat /sys/bus/i2c/devices/1-0068/iio:device0/in_voltage*_raw’

    Viele Grüße

  2. Hi,

    kann man die Einträge auch für das Modul “I2C-Analog-Input 4 Kanäle / 18 Bit mit MCP3424” verwenden? In dem Fall müsste dann pro Eingang bei einer Auflösung von “12-Bit, 14-Bit oder 16-Bit” 3 Bytes eingelesen werden? D.h anstelle der 11 bytes dann entsprechend 12 bytes? Würde im Anschluss die Kalkulation mit dem Array genau so aussehen?

    Danke vorab,
    dmq

    • Hallo,
      der MCP3424 muss ganz anders angesprochen werden um Analogwerte abzufragen.
      (Siehe dazu Blogbeitrag I2C-MCP3424 Analog-In-18Bit-Modul mit Python
      Bei der analoge Eingangskarte I2AE macht der PIC selbständig die AD-Wandlung auf allen 5 Kanälen im 250Hz Takt und stellt die Daten zum Abruf am I2C-Bus bereit.
      Das vereinfacht die Programmierung in FHEM ungemein.
      Wir haben auch eine I2AE8 mit 8 Kanälen 10-Bit und ganz neu eine 8-kanalige Analog-Eingangskarte mit 12-Bit und 250 Hz Abtastrate.
      Gruß, JH

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.