Autor Thema: I2C Template / eigenes Modul für INA219 programmieren  (Gelesen 432 mal)

Offline Elektrofreak

  • Jr. Member
  • **
  • Beiträge: 59
I2C Template / eigenes Modul für INA219 programmieren
« am: 06 Dezember 2016, 11:47:10 »
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  ;)

Offline klausw

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1466
Antw:I2C Template / eigenes Modul für INA219 programmieren
« Antwort #1 am: 06 Dezember 2016, 12:59:10 »
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

Offline Elektrofreak

  • Jr. Member
  • **
  • Beiträge: 59
Antw:I2C Template / eigenes Modul für INA219 programmieren
« Antwort #2 am: 08 Dezember 2016, 09:37:09 »
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  :)

Offline dev0

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2419
    • _.:|:._
Antw:I2C Template / eigenes Modul für INA219 programmieren
« Antwort #3 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.

Offline Elektrofreak

  • Jr. Member
  • **
  • Beiträge: 59
Antw:I2C Template / eigenes Modul für INA219 programmieren
« Antwort #4 am: 08 Dezember 2016, 11:21:55 »
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...
« Letzte Änderung: 08 Dezember 2016, 11:40:42 von Elektrofreak »

Offline klausw

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1466
Antw:I2C Template / eigenes Modul für INA219 programmieren
« Antwort #5 am: 08 Dezember 2016, 15:42:25 »
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

Offline danieljo

  • Full Member
  • ***
  • Beiträge: 194
Antw:I2C Template / eigenes Modul für INA219 programmieren
« Antwort #6 am: 02 Januar 2017, 09:30:58 »
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

Offline Elektrofreak

  • Jr. Member
  • **
  • Beiträge: 59
Antw:I2C Template / eigenes Modul für INA219 programmieren
« Antwort #7 am: 02 Januar 2017, 09:37:10 »
Hallo, euch auch ein frohes Neues!

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  ;)

Offline danieljo

  • Full Member
  • ***
  • Beiträge: 194
Antw:I2C Template / eigenes Modul für INA219 programmieren
« Antwort #8 am: 02 Januar 2017, 09:43:04 »
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

Offline dirkeden

  • New Member
  • *
  • Beiträge: 13
Antw:I2C Template / eigenes Modul für INA219 programmieren
« Antwort #9 am: 16 März 2017, 22:29:14 »
Seit ihr mit dem Modul schon voran gekommen?

Offline Elektrofreak

  • Jr. Member
  • **
  • Beiträge: 59
Antw:I2C Template / eigenes Modul für INA219 programmieren
« Antwort #10 am: 17 März 2017, 07:16:23 »
Ich habe nach dem Upload des Codes nicht weiter gemacht  ::)

Offline danieljo

  • Full Member
  • ***
  • Beiträge: 194
Antw:I2C Template / eigenes Modul für INA219 programmieren
« Antwort #11 am: 11 April 2017, 21:49:15 »
Bisher bin ich ebenfalls nicht weitergekommen. Der Sensor ist irgendwie komplexer als erhofft :(