RPII2C Sensor Werte auslesen

Begonnen von EliDu, 22 Mai 2015, 20:12:53

Vorheriges Thema - Nächstes Thema

EliDu

Hi,
ich bin neu hier (und bei Fhem insgesamt) und versuche den Wert eines I2C Sensor in Fhem auszulesen. Der Sensor (Lichtstärke Sensor BH1750FVI I2C, I2C Ardesse 0x23 ) ist an einem Raspi an der GPIO angeschlossen und läuft ordnungsgemäß. Auf dem Raspi läuft auch die Fhem Instanz. Unter Fhem ist I2C mit dem Modul RPII2C als Device "MyI2C" eingebunden und ich kann auch die zwei interessanten Bytes auslesen: "get MyI2C readblock 23 2". Allerdings bekomme ich einen String zurück der so aussieht: "received : 1 115 | transmission: Ok ". Wie komme ich an die beiden Werte (in diesem Beispiel 1 und 115)? Ist "get ..." evtl der falsche Ansatz an die Daten zu kommen?
Vielen Dank und Grüße,
EliDu

klausw

Nee, der Ansatz ist nicht falsch, aber diese Funktion war eher zum testen gedacht.
Du könntest den String mit
my @parts = split(/ /,$input);
in ein Array speichern.
$parts[2] und 3 beinhalten dann deine Werte die du weiterverarbeiten kannst.
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

EliDu

Danke für die Antwort. Ich musste noch @@ statt @ für das Array verwenden, sonst kommt eine Fehlermeldung weil das Array nur lokal erzeugt wird (was eigentlich doch ok sein sollte - aber habe wenig Ahnung von Perl). Schlussendlich nutze ich aber das RPII2C Modul gar nicht mehr, sondern lese den Sensorwert über einen Systemzugriff und konvertiere noch von hexadezimal nach dezimal: ($test)=hex(`i2cget -y 1 0x23 0x20 w`) Das Modul RPII2C kann anscheinend nicht 2-Byte Werte verarbeiten, sondern liest die beiden Bytes als jeweils als einzelne Zahl. Die könnte man natürlich dann wieder zu einer Zahl zusammenfrickeln, aber da ist der Systemzugriff dann doch einfacher.

klausw

Zitat von: EliDu am 24 Mai 2015, 12:30:12
Danke für die Antwort. Ich musste noch @@ statt @ für das Array verwenden, sonst kommt eine Fehlermeldung weil das Array nur lokal erzeugt wird (was eigentlich doch ok sein sollte - aber habe wenig Ahnung von Perl). Schlussendlich nutze ich aber das RPII2C Modul gar nicht mehr, sondern lese den Sensorwert über einen Systemzugriff und konvertiere noch von hexadezimal nach dezimal: ($test)=hex(`i2cget -y 1 0x23 0x20 w`) Das Modul RPII2C kann anscheinend nicht 2-Byte Werte verarbeiten, sondern liest die beiden Bytes als jeweils als einzelne Zahl. Die könnte man natürlich dann wieder zu einer Zahl zusammenfrickeln, aber da ist der Systemzugriff dann doch einfacher.
Das @ steht im FHEM an manchen Stellen für den Devicenamen. Das ist ein Feature was nicht mehr offiziell genutzt werden soll und irgendwann rausfliegt, aber solang muss es durch ein zweites @ escaped werden.
...wie du das machst ist deine Sache, aber 2 Zahlen lassen sich in Perl leicht addieren ;)
Das RPII2C Modul soll in erster Linie den Zugriff auf Systemebene für andere Module bereitstellen. Du könntest auch auf Basis eines existierenden Moduls ein weiteres für den BH1750FVI schreiben oder das I2C_TSL2561 um den Sensor erweitern (lassen).
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

EliDu

Ok, danke für den Tipp mit dem @ - hatte mich schon gewundert. Das mit dem Addieren ist leider nicht so einfach: Das Modul gibt anscheinend nur dezimale 1-Byte Werte aus, der Sensor Wert ist abe 2 Byte lang und hexadezimal. Daher müsste ich erst die beiden Dezimalzahlen aus den Bytes wieder in hexadezimal Strings umwandeln, ggf. eine Null ergänzen, alles Zusammenfügen und dann den String wieder zu dezimal konvertieren. Ist natürlich machbar aber doch komplizierter als einfach den Wert direkt auszulesen. Wenn ich etwas fitter in Fhem und Perl geworden bin sehe ich mir mal den Code von dem Modul an, evtl. ist da auch schon was eingebaut und ich habe es übersehen.

klausw

Zitat von: EliDu am 24 Mai 2015, 23:01:53
Das mit dem Addieren ist leider nicht so einfach: Das Modul gibt anscheinend nur dezimale 1-Byte Werte aus, der Sensor Wert ist abe 2 Byte lang und hexadezimal. Daher müsste ich erst die beiden Dezimalzahlen aus den Bytes wieder in hexadezimal Strings umwandeln, ggf. eine Null ergänzen, alles Zusammenfügen und dann den String wieder zu dezimal konvertieren. Ist natürlich machbar aber doch komplizierter als einfach den Wert direkt auszulesen.
Also Zahlen lassen sich, wenn sie die selbe Basis haben immer addieren.
Damit kannst du die 2 Zahlen addieren:

sub i2clesen()
{
my @parts = split(/ /,fhem "get <name vom RPII2C> read <I2CAdresse> <RegisterAddr> 2");
$parts[8] eq "Ok" ? return $parts[2] * 256 + $parts[3] : return "error";
}
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

EliDu

Ok danke, so geht das natürlich einfacher. Den Wert des höheren Bytes mit 256 zu multiplizieren sollte man nicht vergessen, sonst funzt das nicht :)