FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: EliDu am 22 Mai 2015, 20:12:53

Titel: RPII2C Sensor Werte auslesen
Beitrag von: EliDu am 22 Mai 2015, 20:12:53
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
Titel: Antw:RPII2C Sensor Werte auslesen
Beitrag von: klausw am 22 Mai 2015, 23:45:56
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.
Titel: Antw:RPII2C Sensor Werte auslesen
Beitrag 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.
Titel: Antw:RPII2C Sensor Werte auslesen
Beitrag von: klausw am 24 Mai 2015, 22:04:23
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).
Titel: Antw:RPII2C Sensor Werte auslesen
Beitrag von: EliDu am 24 Mai 2015, 23:01:53
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.
Titel: Antw:RPII2C Sensor Werte auslesen
Beitrag von: klausw am 24 Mai 2015, 23:55:58
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";
}
Titel: Antw:RPII2C Sensor Werte auslesen
Beitrag von: EliDu am 25 Mai 2015, 00:17:36
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 :)