I2C Template / eigenes Modul für INA219 programmieren

Begonnen von Elektrofreak, 06 Dezember 2016, 11:47:10

Vorheriges Thema - Nächstes Thema

Elektrofreak

Hallo zusammen,

ich habe an meinem Raspberry Pi zwei INA219 Stromsensoren angeschlossen und möchte diese gerne in FHEM einbauen. Da es noch kein Modul für dieses IC gibt, möchte ich es selber programmieren.

Gibt es bereits ein recht gutes Template oder Beispiel für I2C-Module? Ich möchte das FHEM-Modul nicht komplett selber programmieren, da ich mich erst mal in die Syntax einarbeiten müsste und nicht allzu viel Zeit verschwenden möchte  ::)

Vielen Dank für eure Anregungen  ;)

klausw

Als erstes empfehle ich, folgende Seiten zu lesen:
http://www.fhemwiki.de/wiki/DevelopmentModuleIntro
http://www.fhemwiki.de/wiki/DevelopmentModuleAPI

Als Basis könnte das BME280 Modul dienen.
Da hatte ich an die Subroutinen grob ran geschrieben was die machen.

Die I2CRecFn wird von der globalen Schleife aus aufgerufen wenn I2C Werte empfangen wurden.
Befehle werde über CallFn in der I2C_BME280_i2cread($$$) abgesetzt.
Wichtig ist, das die Übertragung asynchron erfolgen muss.
Sprich zum lesen von Werten sendest du einen I2C Befehl ab.
Du wartest jedoch nicht auf die Antwort. Sondern du verarbeitest die Antwort erst, wenn die dir vom IoDev (über das aufrufen der I2CRecFn ) geschickt wurde.

Nur das Anfordern der Werte ist im Modul nicht schön gelöst. Eigentlich sollte das per get und nicht per set erfolgen.
Darum muss ich mich irgendwann mal kümmern.
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

Elektrofreak

Hallo zusammen,

ich habe mir das Modul mal angesehen und habe einige Zeilen umgeschrieben. Ich kann auch schon die Spannung und den Strom auslesen. Allerdings kann ich irgendwie nichts in den INA schreiben, da stürzt FHEM ab  :o.

Er stürzt bei folgender Zeile ab:

I2C_INA219_SetCal($hash);

Diese führt folgende Funktion aus:

sub I2C_INA219_SetCal($@) { #
my ($hash) = @_;

my $cal =  0.04096/((AttrVal($hash, 'INA_Imax', 3)/32768)*AttrVal($hash, 'INA_Rshunt', 0.1)) & 0xFFFF;

readingsSingleUpdate($hash, 'calibrationRegister', $cal, 1);
I2C_BME280_i2cwrite($hash, 0x05, $cal);
}


Irgendwo in dieser Funktion könnte der Fehler sein. die i2cwrite-Funktion habe ich nicht geändert...

Kann ich die cal-variable irgendwie so definieren, dass die 2 bytes groß ist? In C (oder C++) habe ich das früher mit einem sogenannten cast gemacht.


Ich würde die Tage mal eine erste Version hochladen, die etwas bereinigt ist  :)

dev0

AttrVal() erwartet einen Devicenamen, nicht den Devicehash, als ersten Parameter. Ob das aber schon Dein Problem löst weiß ich nicht.

Elektrofreak

#4
Zitat von: dev0 am 08 Dezember 2016, 10:42:59
AttrVal() erwartet einen Devicenamen, nicht den Devicehash, als ersten Parameter. Ob das aber schon Dein Problem löst weiß ich nicht.

Hallo,

das war ein Fehler, den ich eingebaut habe  ;D aber er löst nicht das Problem.

Wenn ich die Zeile mit dem i2cwrite auskommentiere, stürzt es nicht ab. Ich denke ich muss den Float-Wert noch in einen Integer umwandeln und dann in ein byte-Array. Ich weis aber leider nicht, wie das geht und finde auch keinen Beispielcode :-\

Hier noch ein Beispiel:




calibrationRegister41942016-12-08 11:36:36
config57 1592016-12-08 11:36:36

das config-Reading bekomme ich via i2cread, das calibrationRegister-Reading möchte ich gerne per i2cwrite schreiben. Der sollte aber laut meinem Verständnis auch in 2 byte-Blöcke geteilt werden...

klausw

Stürzt FHEM komplett ab?
Verbose auf 5 könnte dir ein paar zusätzliche Informationen bringen.

data muss durch Leerzeichen getrennte Bytes als Dezimalwerte (0-255) enthalten
4194 = "16  98" = 16*256 + 98 = 4194 (wobei der erste Wert auf die niedrigere Adresse geschrieben wird) da musst du schauen, ob das passt

Das geht mit pack/unpack

und könnte so gehen (nicht getestet):
my @ACAL = unpack("C*", pack("S", $cal));
$data = sprintf "%01d %01d", @ACAL;

es gibt sicher auch elegantere Lösungen
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

danieljo

Hallo und ein Frohes neues Jahr,

Ich habe hier selber einen INA219 rumliegen denn ich schon seit geraumer Zeit mal nutzen will mit FHEM. Ich könnte mich beim Testen anbieten vllt. bei dem weiteren schreiben des Moduls. Ein bisschen Erfahrungen habe ich ja sammeln könnnen beim schreiben von Modulen mit dem I2C Sensoren für pH-Wert Leitwert usw.

MFG, Daniel Joachims

Elektrofreak

Hallo, euch auch ein frohes Neues!

Zitat von: danieljo am 02 Januar 2017, 09:30:58
Ich habe hier selber einen INA219 rumliegen denn ich schon seit geraumer Zeit mal nutzen will mit FHEM. Ich könnte mich beim Testen anbieten vllt. bei dem weiteren schreiben des Moduls. Ein bisschen Erfahrungen habe ich ja sammeln könnnen beim schreiben von Modulen mit dem I2C Sensoren für pH-Wert Leitwert usw.

Darüber würde ich mich sehr freuen. Ich kann mittlerweile Spannung und Strom (berechnet aus gemessener Spannung geteilt durch Shunt-Widerstand) auslesen, jedoch noch keine Informationen in den INA219 schreiben (wodurch der richtige Strom gemessen wird und die Power berechnet wird). Dazu hatte ich noch keine Zeit. Außerdem funktioniert das periodische Auslesen von Werten erst nach einem manuellen pollen. Sollte aber leicht zu beheben sein.

Das Modul ist also in einer pre-Beta Phase und noch nicht für den produktiven Einsatz zu gebrauchen. Ich kann es aber trotzdem bereit stellen und falls du etwas mehr Zeit hast die Entwicklung auch vorerst an dich abgeben. Dann würde ich mich als Beta-Tester zu Verfügung stellen  ;)

danieljo

Das ist doch schonmal etwas, ich werde mir das gleich mal alles in Ruhe anschauen und mich mal in die Sache reindenken. Ich denke das ich es heute noch testen werde aber ich muss erstmal meinen I2C-Bus erweitern da alle Anschlüsse voll sind :D

dirkeden


Elektrofreak

Ich habe nach dem Upload des Codes nicht weiter gemacht  ::)

danieljo

Bisher bin ich ebenfalls nicht weitergekommen. Der Sensor ist irgendwie komplexer als erhofft :(

Frank_Huber

Moin Moin,

gibt es hier etwas neues? Gestern lagen meine INA219 in der Post und warten jetzt darauf ihre Daten in FHEM abzuliefern. ;-)

/Frank

dev0

ZitatGestern lagen meine INA219 in der Post und warten jetzt darauf ihre Daten in FHEM abzuliefern. ;-)
Nicht die Sensoren warten, sondern der Compler/Interpreter auf Deinen Input ;)

Frank_Huber

Zitat von: dev0 am 05 Juli 2017, 12:10:58
Nicht die Sensoren warten, sondern der Compler/Interpreter auf Deinen Input ;)
??? da versteh ich jetzt nur Bahnhof...
Was kann ich tun um hier zu helfen vorwärts zu kommen?