[Gelöst] Arduino über I2C an Fhem

Begonnen von manne44, 20 Juni 2016, 10:58:44

Vorheriges Thema - Nächstes Thema

manne44

Hallo,
ich möchte eine Verbindung zwischen Fhem und einem Arduino über I2C aufbauen, was an sich nicht schwer sein sollte. Der Arduino soll als Slave laufen und nach erfolgtem Kommando einen Kfz-US-Sensor zur Pegelmassung eines Abwasserbehälters triggern, den Rückimpuls messen und anschließend die Länge in cm an Fhem übertragen. Mit Ausnahme der I2C-Kommunikation kein Problem. Die Arduino.Seite macht mir keine Probleme, aber die Einbindung in Fhem. Ich finde nur fertige I2C-Baustein-Lösungen sowohl in der "FHEM reference" als auch nach mehrstündigem Suchen, denn mit dem Suchen allein ist es nicht getan, es muß auch alles gelesen und verstanden werden.
Ich habe bereits einen DS2482-800 mit mehreren DS1820 und DS2408 auf Selbstbauplatinen im Einsatz, aber da erfolgte die Einbindung von 1-Wire und I2C problemlos mit OWSERVER ohne mein direktes Zutun.
Aber wie kann ich das mit dem I2C-Arduino-Slave machen? Ich habe nichts gefunden oder ist das so einfach, daß das nirgends erwähnt wird?
Kann mir da mal jemand einen Tip geben?

Nachtrag:
Ich habe die Referenz nochmals durchgesehen und das Modul RPII2C gefunden, mit dem das aller Wahrscheinlichkeit leicht machbar ist. Ich werde das mal testen und sage dann Bescheid.
RPI4-Buster mit SSD, RPI-Zero mit Bookworm

klausw

Zitat von: manne44 am 20 Juni 2016, 10:58:44
Nachtrag:
Ich habe die Referenz nochmals durchgesehen und das Modul RPII2C gefunden, mit dem das aller Wahrscheinlichkeit leicht machbar ist. Ich werde das mal testen und sage dann Bescheid.

Genau damit kannst du I2C Befehle absetzen.
Es ist auch möglich ein eigenes Modul zu schreiben, welches RPII2C als Physikalisches Modul zur Kommunikation nutzt (das machen z-B- alle Module, die mit I2C_ beginnen)
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

manne44

Vielen Dank für die Antwort, aber in Perl oder "regular expressions" bin ich keineswegs sattelfest um da eigene Module zu schreiben. Ich bin froh, wenn ich das hier so einigermaßen hin bekomme.
Ich habe das RPII2C-Device definiert usw. und habe mich über die Antwort beim Read gewundert, denn ich wollte eigentlich nur ein Byte vom RPI bzw. BananaPi lesen, aber habe
received : 121  |  transmission: Ok
erhalten. Aber mit my ($length) = $retStr =~ /(\d+)/; habe ich dann die gemessene Strecke des US-Wandlers separiert.

Insgesamt funktioniert es wie folgt:
In der fhem.cfg:
define usSensor RPII2C 2
define getUsSensorValue at +*06:00:00 {getUsSensor();;}

und in der 99_myUlil.pm:

sub
getUsSensor()
{
fhem('set usSensor writeByte 0x08 0x55');
sleep(2);
my $retStr = fhem('get usSensor read 0x08 1');
my ($length) = $retStr =~ /(\d+)/;
fhem('setreading AuxDev grube_cm '.$length);
}

Auf dem Arduino Nano läuft ein C-Programm, das auf das Startsignal (0x55) zum Wandeln wartet, dann durch kurze Impulse die Strecke bis zum Flüssigkeitsspiegel feststellt und die Länge in cm in Abhängigkeit der aktuellen Temperatur zurückliefert.
RPI4-Buster mit SSD, RPI-Zero mit Bookworm

manne44

Nachtrag: Es hat über I2C nicht funktioniert, wahrscheinlich die Länge > 50m oder zu dünne Kabel oder nicht hinreichen geschirmte oder oder ... Ich habe das dann mit einem ESP8266 mit ESPeasy realisiert.
define ESP_TxSensors dummy
attr ESP_TxSensors event-on-change-reading .*
attr ESP_TxSensors room ESP

define ESP_Tx MQTT_DEVICE
attr ESP_Tx IODev mqtt
attr ESP_Tx room ESP
attr ESP_Tx stateFormat transmission-state
...
attr ESP_Tx subscribeReading_TxLuft /hooks/devices/21/SensorData/TxLuft
...
define notify_ESP_TxLuft notify ESP_Tx:TxLuft.* { getESPtemperature("TxLuft");; }
...

Der ESP8266 ist ein Baustein, der neben einem uProzessor auch einen WLan-Sender/Empfänger, digitale I/Os hat und relativ billig ist. Er wird in das normale WLan eingebunden. Das funktioniert nun seit einigen Wochen super als MQTT_DEVICE mit FHEM. Die Distanz wird gemessen und zyklisch übertragen, aber leider gibt es wegen der Betauung des Sensors immer wieder Fehlmessungen, d.h. ich muß ihn ab und zu abwischen, dann ist alles wieder richtig.
RPI4-Buster mit SSD, RPI-Zero mit Bookworm