FHEM Forum

FHEM - Hardware => Einplatinencomputer => Thema gestartet von: doesel am 20 Mai 2015, 11:46:41

Titel: Raspberry, Firmata und I2C
Beitrag von: doesel am 20 Mai 2015, 11:46:41
Hallo,
ich hatte mein Problem schon vor ein paar Tagen bei "Anfängerfragen" geschildert, bekam aber leider keine Antwort von einem Wissenden...
Deshalb nun hier ein neuer Versuch.

Ich versuche den Feuchtigkeitssensor SHT21 über einen an den Raspberry angeschlossenen Arduino (Configurable Firmata) in Betrieb zu nehmen, jedoch verstehe ich nicht das Zusammenspiel von FRM_I2C und I2C_SHT21.
Hat das jemand schon realisiert? Übrigens: Auch mit dem BMP180 ist mir das nicht gelungen, direkt am Raspberry läuft dieser jedoch.

Nachdem ich die Suchfunktion im Forum und Google erfolglos bemüht habe, erhoffe ich mir hier den entscheidenden Hinweis.
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: thymjan am 17 August 2015, 07:01:39
Wenn ich mir die Command Reference durchschaue, bin ich der Meinung die Definitionen von FRM und I2C_SHT21 sollten genügen. Das Modul FRM_I2C ist für das allgemeinere Schreiben auf dem I2C-Bus gedacht, oder?
Bin aber leider ein schlechter Berater, da I2C_SHT21 bei mir zwar den Status "initialized" hat, aber leider auch keine Werte liefert. Mit einem Testprogramm und dem Seriellen Monitor der Arduino-IDE funktioniert das auslesen über I2C allerdings tadellos.

Hat jemand eine Kombi FRM + I2C_xxxxx am Laufen, der uns helfen kann?
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: klausw am 17 August 2015, 18:16:01
Zitat von: thymjan am 17 August 2015, 07:01:39
Wenn ich mir die Command Reference durchschaue, bin ich der Meinung die Definitionen von FRM und I2C_SHT21 sollten genügen. Das Modul FRM_I2C ist für das allgemeinere Schreiben auf dem I2C-Bus gedacht, oder?
exakt, das FRM Modul sollte das IODev für I2C_SHT21 sein. Steht auch so in der Commandref drin.

Da ich kein FRM nutze kann ich nur mutmaßen...
Das Modul I2C_SHT21 ist nicht im @clients von 10_FRM.pm aufgeführt, daher reagiert 10_FRM.pm auch nicht auf Anfragen dieses Moduls.
Bitte mal testweise in der 10_FRM.pm in das clients Array (z.B. nach der Zeile I2C_BMP180) eine neue Zeile mit I2C_SHT21 einfügen. Speichern und danach FHEM neu starten.
Jetzt sollte es laufen.
Der BMP180 sollte ohne Modifikation funktionieren.

...und bitte Rückmeldung, damit Norbert es noch ins Modul einpflegen kann
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: thymjan am 17 August 2015, 22:50:36
ZitatBitte mal testweise in der 10_FRM.pm in das clients Array (z.B. nach der Zeile I2C_BMP180) eine neue Zeile mit I2C_SHT21 einfügen. Speichern und danach FHEM neu starten.
Jetzt sollte es laufen.
Hab ich gemacht. Leider ohne Erfolg: STATE von meinem I2C_SHT21 Sensor bleibt auf "Initialized"
Im Log steht nach wie vor (direkt nach den Meldungen von shutdown restart) einmal "received String_data: I2C: Too few bytes received" und dann passiert nix mehr.
________________________________________________
FRM Readings:
error   I2C: Too few bytes received    2015-08-17 22:44:46
state   opened                                 2015-08-17 22:44:42
________________________________________________

So habe ich FRM und I2C_SHT21 definiert:

define FRM_1 FRM /dev/ttyUSB0@57600
define AdaSensor I2C_SHT21 64
attr AdaSensor IODev FRM_1
attr AdaSensor poll_interval 5


Ist das Modul I2C_SHT21 über FRM angeschlossen akzeptiert es als I2C Adresse nur Dezimalzahlen. Bei direktem Anschluss am Raspberry mit RPII2C als IODev geht es im Hex-Format 0x40.

Edit 1.9.15: mit verbose 5 gibt es bei der Angabe der Adresse im hex-Format auch bei RPII2C eine Fehlermeldung und es wird der default-Wert 64 verwendet.
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: klausw am 18 August 2015, 09:24:41
Zitat von: thymjan am 17 August 2015, 22:50:36
Im Log steht nach wie vor (direkt nach den Meldungen von shutdown restart) einmal "received String_data: I2C: Too few bytes received" und dann passiert nix mehr.
________________________________________________
FRM Readings:
error   I2C: Too few bytes received    2015-08-17 22:44:46
state   opened                                 2015-08-17 22:44:42
________________________________________________
Klingt für mich als würde nix vom FRM Modul kommen...leider recht ungenau

Zitat von: thymjan am 17 August 2015, 22:50:36
So habe ich FRM und I2C_SHT21 definiert:

define FRM_1 FRM /dev/ttyUSB0@57600
define AdaSensor I2C_SHT21 64
attr AdaSensor IODev FRM_1
attr AdaSensor poll_interval 5

FRM hat ein Attribut i2c-config. Vielleicht muss dieses noch genutzt werden.

Alternativ kannst du über FRM_I2C einmal versuchen den SHT21 händisch anzusteuern. So lässt sich herausfinden, ob die Kommunikation funktioniert.

Zitat von: thymjan am 17 August 2015, 22:50:36
Ist das Modul I2C_SHT21 über FRM angeschlossen akzeptiert es als I2C Adresse nur Dezimalzahlen. Bei direktem Anschluss am Raspberry mit RPII2C als IODev geht es im Hex-Format 0x40.

dein FHEM ist aktuell? (update ausgeführt)
Die I2C Adresse wird im I2C_SHT21 Modul verarbeitet.
Das hat nichts mit dem IODev zu tun. Sie sollte in beiden Fällen als Dezimalwert im Internal I2C_Address stehen.
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: thymjan am 18 August 2015, 22:16:59
Die Module habe ich jetzt so konfiguriert für die händische Ansteuerung von SHT21:
define FRM_1 FRM /dev/ttyUSB0@57600
attr FRM_1 i2c-config 1
attr FRM_1 model nano
attr FRM_1 sampling-interval 3000

define AdaTest FRM_I2C 64 229 3
attr AdaTest IODev FRM_1


Die Funktion von i2c-config ist mir nicht 100%ig klar:
Zitat
i2c-config
Configure the arduino for ic2 communication. This will enable i2c on the i2c_pins received by the capability-query issued during initialization of FRM.
As of Firmata 2.3 you can set a delay-time (in microseconds) that will be inserted into i2c protocol when switching from write to read.
See: Firmata Protocol details about I2C
Einerseits steht hier das die i2c-Pins am Arduino beim Initialisieren von FRM aktiviert werden, andererseits kann auch noch eine Wartezeit zwischen Lese- und Schreib-Befehlen angegeben werden?
Und hier steige ich völlig aus:

/* I2C config
* -------------------------------
* 0  START_SYSEX (0xF0) (MIDI System Exclusive)
* 1  I2C_CONFIG (0x78)
* 2  Delay in microseconds (LSB)
* 3  Delay in microseconds (MSB)
* ... user defined for special cases, etc
* n  END_SYSEX (0xF7)
*/


Mit obiger Konfiguration von
FRM_I2C
  - IC2-Adresse von SHT21: 0x40/64;
  - Command Trigger Humidity Measurement 0xE5/227;
  - 3 Bytes sollen gelesen werden [Data (MSB), Data (LSB), Checksum]


erhalte ich Zahlenkolonnen folgender Art:
120 82 16 120 70 151 120 66 83 120 54 111 120 50 171 120 50 171 120 50 171 120 42 81 ... bzw.
120 82 16
120 70 151
120 66 83
120 54 111
120 50 171
120 50 171
120 50 171
120 42 81
Scheint so als würde der Sensor was erzählen. Zeitgleich läuft im Log nach wie vor auf:
[...]
2015.08.18 21:02:07 3: received String_data: I2C: Too few bytes received
2015.08.18 21:02:07 3: received String_data: I2C: Too few bytes received
2015.08.18 21:02:37 3: received String_data: I2C: Too few bytes received
2015.08.18 21:02:37 3: received String_data: I2C: Too few bytes received
2015.08.18 21:02:38 3: received String_data: I2C: Too few bytes received
[...]

State von FRM_1 ist jetzt "opened"
State von AdaTest ist "active"
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: thymjan am 28 August 2015, 18:42:02
Habe jetzt den Arduino nano mit configurable firmata per Ethernet angeschlossen.
Jetzt erscheint im logfile alle 5 Minuten (polling-Intervall) folgendes:
2015.08.28 18:13:18 5: FRM:>f07640007301f7
2015.08.28 18:13:18 5: FRM:>f07640080200f7
2015.08.28 18:13:18 5: FRM:>f07640007501f7
2015.08.28 18:13:18 5: FRM:>f07640080200f7
2015.08.28 18:13:18 5: FRM:<f077400000006b002001f7
2015.08.28 18:13:18 5: onI2CMessage address: '64', register: '0' data: [107,160]
2015.08.28 18:13:18 5: FRM:<f0774000000074001200f7
2015.08.28 18:13:18 5: onI2CMessage address: '64', register: '0' data: [116,18]
2015.08.28 18:18:18 5: FRM:>f07640007301f7
2015.08.28 18:18:18 5: FRM:>f07640080200f7
2015.08.28 18:18:18 5: FRM:>f07640007501f7
2015.08.28 18:18:18 5: FRM:>f07640080200f7
2015.08.28 18:18:18 5: FRM:<f077400000006b002401f7
2015.08.28 18:18:18 5: onI2CMessage address: '64', register: '0' data: [107,164]
2015.08.28 18:18:18 5: FRM:<f0774000000074002a00f7
2015.08.28 18:18:18 5: onI2CMessage address: '64', register: '0' data: [116,42]
2015.08.28 18:18:44 5: FRM:>e37f01
2015.08.28 18:18:48 5: FRM:>900400
2015.08.28 18:23:18 5: FRM:>f07640007301f7
2015.08.28 18:23:18 5: FRM:>f07640080200f7
2015.08.28 18:23:18 5: FRM:>f07640007501f7
2015.08.28 18:23:19 5: FRM:>f07640080200f7
2015.08.28 18:23:19 5: FRM:<f077400000006b002801f7
2015.08.28 18:23:19 5: onI2CMessage address: '64', register: '0' data: [107,168]
2015.08.28 18:23:19 5: FRM:<f0774000000074004600f7
2015.08.28 18:23:19 5: onI2CMessage address: '64', register: '0' data: [116,70]
2015.08.28 18:28:19 5: FRM:>f07640007301f7
2015.08.28 18:28:19 5: FRM:>f07640080200f7
2015.08.28 18:28:19 5: FRM:>f07640007501f7
2015.08.28 18:28:19 5: FRM:>f07640080200f7
2015.08.28 18:28:19 5: FRM:<f077400000006b002801f7
2015.08.28 18:28:19 5: onI2CMessage address: '64', register: '0' data: [107,168]
2015.08.28 18:28:19 5: FRM:<f0774000000074004600f7
2015.08.28 18:28:19 5: onI2CMessage address: '64', register: '0' data: [116,70]

Das sieht ja schon vielversprechender aus. Allerdings kommt im I2C_SHT21-Modul nix davon an. Das steht nach wie vor im Modus initialized.
Hat irgendjemand das I2C_SHT21-Modul über Firmata am Laufen und kann mir helfen?
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: klausw am 31 August 2015, 16:04:30
steht dein Loglevel generell auf 5?
Mich wundert es, das keine Einträge vom SHT21 vorhanden sind.
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: thymjan am 31 August 2015, 18:06:26
Habe bisher nur in den Modulen I2C_SHT21 und FRM verbose auf 5 gesetzt. Mache das jetzt mal in global.
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: thymjan am 31 August 2015, 18:26:17
Internals:
   DEF        64
   FRM_1_SENDSTAT Ok
   I2C_Address 64
   IODev      FRM_1
   NAME       AdaSensor
   NR         25
   STATE      Initialized
   TYPE       I2C_SHT21
Attributes:
   IODev      FRM_1
   poll_interval 5
   roundHumidityDecimal 0
   roundTemperatureDecimal 2
   verbose    5

FHEM ist aktuell. Habe eben nochmal geupdated.
Auch mit "attr global verbose 5" bleibt I2C_SHT21 über FRM stumm: Keine Einträge im logfile.

Bei I2C_SHT21 über RPII2C gibt es im logfile Einträge:
2015.08.31 21:43:29 5: empfangen: 110 84
2015.08.31 21:43:29 5: empfangen: 94 18


Ich vermute, dass FRM die Daten gar nicht an I2C_SHT21 weitergibt, sonst hätte ich ja auch Readings in I2C_SHT21, oder?
Die Kommunikation von I2C_SHT21 in Richtung FRM und Arduino zu I2C scheint zu funktionieren. Verkleinere ich beispielsweise das polling-Intervall, werden die Werte auch dementsprechend häufiger abgefragt. Die abgefragten Werte sind im Logfile (FRM) zu sehen, scheinen dann aber im FRM-Modul stecken zu bleiben. Der Eintrag von "I2C_SHT21" in die clients-list in der Datei "10_FRM.pm" scheint nicht auszureichen.
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: klausw am 01 September 2015, 17:47:43
Es wird weitergegeben,
im Logfile steht ja empfangen

ersetze bitte testweise
Log3 $hash, 5, "empfangen: $clientmsg->{received}";
durch
my $ankommen = "$name: vom client empfangen";
foreach my $av (keys %{$clientmsg}) { $ankommen .= "|" . $av . ": " . $clientmsg->{$av}; }
Log3 $hash, 0, $ankommen;

und schicke mir das log
Ich vermute, da fehlt eine Variable im Hash


Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: thymjan am 01 September 2015, 19:56:38
Habe die erweiterte Ausgabe ins Logfile in 52_I2C_SHT21.pm in der Subroutine I2C_SHT21_I2CRec eingebaut.

Auf dem RasPi an dem der Sensor direkt am I2C-Bus angeschlossen ist, spuckt das logfile folgendes aus:
2015.09.01 19:39:48 0: Sensor: vom client empfangen|PimoroniI2C_SENDSTAT: Ok|direction: i2cread|nbyte: 2|type: temp|i2caddress: 64|received: 108 36
2015.09.01 19:39:48 0: Sensor: vom client empfangen|PimoroniI2C_SENDSTAT: Ok|direction: i2cread|nbyte: 2|type: hum|i2caddress: 64|received: 115 46


Auf dem RasPi der die Messwerte vom über Ethernet angeschlossenen Arduino nano mit ConfigurableFirmata empfängt bleibt das Modul I2C_SHT21 nach wie vor stumm.
Lediglich der Datenverkehr zwischen FRM und Arduino wird geloggt:
2015.09.01 19:51:39 5: FRM:>f07640007301f7
2015.09.01 19:51:39 5: FRM:>f07640080200f7
2015.09.01 19:51:39 5: FRM:>f07640007501f7
2015.09.01 19:51:39 5: FRM:>f07640080200f7
2015.09.01 19:51:39 5: FRM:<f0774000000067006c01f7f0774000000004016e00f7
2015.09.01 19:51:39 5: onI2CMessage address: '64', register: '0' data: [103,236]
2015.09.01 19:51:39 5: onI2CMessage address: '64', register: '0' data: [132,110]
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: thymjan am 02 September 2015, 20:31:17
Habe testweise zusätzlich einen BMP180 Sensor an den Arduino Nano angeschlossen. Von diesem kommen die Messwerte im Modul I2C_BMP180 an.
define BMP180 I2C_BMP180
attr BMP180 IODev FRM_1
attr BMP180 model BMP180
attr BMP180 oversampling_settings 3
attr BMP180 poll_interval 5
attr BMP180 roundPressureDecimal 2
attr BMP180 roundTemperatureDecimal 2


Ein Auslesevorgang sieht im logfile so aus:
2015.09.02 20:27:14 5: FRM:>f076770074012e00f7
2015.09.02 20:27:14 5: FRM:>f076770876010200f7
2015.09.02 20:27:14 5: FRM:>f076770074017401f7
2015.09.02 20:27:14 5: FRM:>f076770876010300f7
2015.09.02 20:27:14 5: FRM:<f0777700760156000f01f7f0777700760124010d000001f7
2015.09.02 20:27:14 5: onI2CMessage address: '119', register: '246' data: [86,143]
2015.09.02 20:27:14 5: BMP180 empfangen: 86 143
2015.09.02 20:27:14 5: onI2CMessage address: '119', register: '246' data: [164,13,128]
2015.09.02 20:27:14 5: BMP180 empfangen: 164 13 128


list BMP180:
Internals:
   CFGFN
   FRM_1_SENDSTAT Ok
   I2C_Address 119
   IODev      FRM_1
   NAME       BMP180
   NR         123
   STATE      T: 24.19 P: 980.49 P-NN: 1015.20
   TYPE       I2C_BMP180
   Readings:
     2015-09-02 21:18:55   pressure        980.49
     2015-09-02 21:18:55   pressure-nn     1015.20
     2015-09-02 21:18:55   state           T: 24.19 P: 980.49 P-NN: 1015.20
     2015-09-02 21:18:55   temperature     24.19
   Calibrationdata:
     ac1        8245
     ac2        -1107
     ac3        -14864
     ac4        34269
     ac5        25328
     ac6        13848
     b1         6515
     b2         41
     b5         3862.94178706027
     mb         -32768
     mc         -11786
     md         2620
Attributes:
   IODev      FRM_1
   model      BMP180
   oversampling_settings 3
   poll_interval 5
   roundPressureDecimal 2
   roundTemperatureDecimal 2
   verbose    5
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: thymjan am 03 September 2015, 22:41:17
Jetzt habe ich das Problem gefunden:

Der Client I2C_SHT21 ruft die CallFn im Master FRM auf und schickt im %sendpackage den key {type} mit, die FRM noch nicht erwartet/versteht.
Und {type} wird dann von FRM auch nicht mehr zurück an I2C_SHT21 geschickt.

Müssen wir FRM so umschreiben, dass der key {type} nicht verloren geht?
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: thymjan am 05 September 2015, 20:54:42
Und hier meine Lösung:

Habe ins Datenblatt vom SHT21 geschaut. Pro Messung (Temp. bzw. Luftfeuchte) werden ja jeweils zwei Datenbytes (MSB und LSB) übermittelt.
Die maximale Auflösung des Sensors sind 14 bit. Sind also zwei Bits übrig. Eins wird für die Information genutzt, ob der Messwert den Temperaturwert ('0') oder den Luftfeuchtewert ('1') enthält. Deshalb habe ich statt des keys {type: temp, hum} eine Bitmaske benutzt, die identifiziert ob es sich beim empfangenen Wert um den Temperatur- oder Luftfeuchtewert handelt. Das war dann einfacher umzusetzen als erwartet.

Damit man den Sensor SHT21 über einen Arduino mit ConfigurableFirmata mit IODev FRM benutzen kann sind folgende Schritte notwendig:

So funktioniert I2C_SHT21 auch immer noch mit RPII2C.

@klausw: Denkst Du es entstehen bei dieser Vorgehensweise Nachteile gegenüber der Verwendung des keys {type}?

hier nochmal der code zum kopieren:
sub I2C_SHT21_I2CRec ($$) {
    my ($hash, $clientmsg) = @_;
    my $name = $hash->{NAME};
    my $phash = $hash->{IODev};
    my $pname = $phash->{NAME};
    while ( my ( $k, $v ) = each %$clientmsg ) {  #erzeugen von Internals fuer alle Keys in $clientmsg die mit dem physical Namen beginnen
        $hash->{$k} = $v if $k =~ /^$pname/ ;
    }
    if ($clientmsg->{direction} && $clientmsg->{$pname . "_SENDSTAT"} eq "Ok") {
        if ( $clientmsg->{direction} eq "i2cread" && defined($clientmsg->{received}) ) {
            Log3 $hash, 5, "empfangen: $clientmsg->{received}";
            my @raw = split(" ",$clientmsg->{received});
            I2C_SHT21_GetTemp ($hash, $clientmsg->{received}) if !($raw[1] & 2) && $clientmsg->{nbyte} == 2;
            I2C_SHT21_GetHum ($hash, $clientmsg->{received}) if ($raw[1] & 2) && $clientmsg->{nbyte} == 2;
        }
    }
}
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: klausw am 07 September 2015, 19:04:00
Hi thymian,

dauert bei mir im mom bisschen mit den Antworten.

Die Lösung hat einen Nachteil, sie bekämpft nicht die Ursache. Der BMP180 beispielsweise funktioniert dann immer noch nicht. Bei dem ließe sich das auch nicht ohne weitere einbauen, da Druck und Temperatur soweit ich mich erinnere gleichlange Ergebnisse zurückliefern und damit die Unterscheidung unmöglich machen.
Eigentlich müsste 10_FRM.pm angepasst werden, das {type} mit zurück geliefert wird.

Grüße
Klaus
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: thymjan am 07 September 2015, 19:18:53
Beim BMP180 stehen Druck und Temperatur in unterschiedlichen Registern. Danach wird auch beim Empfang im Modul unterschieden ({reg}). Der läuft hier tadellos mit FRM.
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: klausw am 07 September 2015, 19:33:36
Ah, ok. Ist lange her, das ich das Bmp Modul angepasst hatte. Ich hatte nur hier irgendwo gelesen, das es nicht mit Ftm läuft. Aber vermutlich wurden dann frm_i2c verwendet...
Ok, da das Sht21 im mom das Einzige mit {type} ist kann ich auch deinen Lösungsansatz einbauen. Ich werde aber auch die {type} Variante drin lassen
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: thymjan am 07 September 2015, 20:44:17
Der key {type} ist redundant,  aber natürlich schöner zu lesen als die Bitmaske. Will man das konsequent umsetzen, müsste man {type} ja bis in die ConfigurableFirmata einpflegen, oder?

Hier noch die Definitionen mit denen ich I2C_SHT21 und I2C_BMP180 über FRM und Firmata auf Arduino Nano (Ethernet) und Arduino Mirco (USB) zum Laufen gebracht habe:

# Arduino Micro mit ConfigurableFirmata per USB am RasPi
define FRM_0 FRM /dev/ttyACM0@57600
attr FRM_0 i2c-config 1

# Arduino Nano mit ConfigurableFirmata per Ethernet
define FRM_1 FRM 3031 global
attr FRM_1 i2c-config 1
attr FRM_1 model nano

# BMP180 angeschlossen am Arduino Nano und Ethernet
define BMP180 I2C_BMP180
attr BMP180 IODev FRM_1
attr BMP180 icon weather_barometric_pressure
attr BMP180 oversampling_settings 0
attr BMP180 poll_interval 5

# SHT21 angeschlossen am Arduino Micro und USB
define AdaSensor I2C_SHT21
attr AdaSensor IODev FRM_0
attr AdaSensor icon temperature_humidity
attr AdaSensor poll_interval 5


Im Modul I2C_BMP180 werden momentan mit shutdown restart die oversampling_settings und das poll_interval immer mit den default-Werten 3 und 5 überschrieben. Ich hab die zwei Zeilen aus I2C_MBP180.pm rausgenommen.

Im übrigen setze ich nicht den SHT21 ein, sondern den HTU21D-F. Der hat das gleiche Protokoll und funktioniert auch tadellos mit I2C_SHT21.
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: klausw am 08 September 2015, 10:35:45
Zitat von: thymjan am 07 September 2015, 20:44:17
Der key {type} ist redundant,  aber natürlich schöner zu lesen als die Bitmaske. Will man das konsequent umsetzen, müsste man {type} ja bis in die ConfigurableFirmata einpflegen, oder?
Nein, im Modul 10_FRM.pm ist ausreichend. Es gibt jede I2C Adresse pro Bus nur 1x.

Wenn ich es mir genauer überlege ist deine Lösung doch die elegantere.
Den Satz in der Spec bezüglich Bit 1 zur Unterscheidung habe ich damals überlesen.  :(
Das logische Modul (in diesem Fall) das SHT21 muss schließlich selbst wissen, was es angefordert hat.
Damit muss das physikal Modul (z.B. FRM) nix mit zu tun haben.

Deine Modifikation läuft bei dir ohne Probleme?
Wenn ja teste ich sie auch noch paar Tage bei mit und pflege es ein.

Zitat von: thymjan am 07 September 2015, 20:44:17
Im übrigen setze ich nicht den SHT21 ein, sondern den HTU21D-F. Der hat das gleiche Protokoll und funktioniert auch tadellos mit I2C_SHT21.
Gut zu wissen, der ist um einiges günstiger :)
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: thymjan am 14 September 2015, 21:20:12
Hallo Klaus,

habe die Modifikation von I2C_SHT21.pm noch in Verbindung mit einem Arduino micro per USB an einem raspi B getestet. Lief auf Anhieb und spuckt stabil plausible Messwerte aus.

Gruß,
Stefan

Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: klausw am 15 September 2015, 22:15:57
Ok, bei mir läuft es auch.
Werde es heute einchecken.
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: schami23 am 03 Januar 2016, 08:14:43
Hallo,
ich benutze einen Arduino mit Firmata drauf und möchte einen HTU21D Sensor einbinden ich habe den Sensor wie folgt eingebunden:


Internals:
   FIRMATA_SENDSTAT Ok
   I2C_Address 64
   IODev      FIRMATA
   NAME       AdaSensor
   NR         177
   STATE      T: 23.2 H: 35.0
   TYPE       I2C_SHT21
   Readings:
     2016-01-02 14:45:35   humidity        35.0
     2016-01-02 14:45:35   state           T: 23.2 H: 35.0
     2016-01-02 19:51:36   temperature     22.6
Attributes:
   IODev      FIRMATA
   poll_interval 5


Das auslesen der Temperatur funktioniert aber aber die Luftfeuchtigkeit wird kurz nach dem anlegen ausgelesen aber dann nicht mehr.
Was mir seltsam erscheint ist das laut Log die Temperatur zweimal ausgelesen wird.


2016-01-02_14:45:35 AdaSensor temperature: 23.2
2016-01-02_14:45:35 AdaSensor humidity: 35.0
2016-01-02_14:48:37 AdaSensor temperature: 23.1
2016-01-02_14:48:37 AdaSensor temperature: 23.1
2016-01-02_14:48:40 AdaSensor temperature: 23.1
2016-01-02_14:48:40 AdaSensor temperature: 23.1
2016-01-02_14:48:42 AdaSensor temperature: 23.1
2016-01-02_14:48:42 AdaSensor temperature: 23.1
2016-01-02_14:48:43 AdaSensor temperature: 23.1
2016-01-02_14:48:43 AdaSensor temperature: 23.1
2016-01-02_14:50:36 AdaSensor temperature: 23.1
2016-01-02_14:50:36 AdaSensor temperature: 23.1
2016-01-02_14:55:36 AdaSensor temperature: 22.9
2016-01-02_14:55:36 AdaSensor temperature: 22.9
2016-01-02_15:00:36 AdaSensor temperature: 22.9
2016-01-02_15:00:36 AdaSensor temperature: 22.9
2016-01-02_15:05:36 AdaSensor temperature: 22.8
2016-01-02_15:05:36 AdaSensor temperature: 22.8
2016-01-02_15:10:36 AdaSensor temperature: 22.8
2016-01-02_15:10:36 AdaSensor temperature: 22.8
2016-01-02_15:15:36 AdaSensor temperature: 22.9
2016-01-02_15:15:36 AdaSensor temperature: 22.9
2016-01-02_15:20:36 AdaSensor temperature: 22.7
2016-01-02_15:20:36 AdaSensor temperature: 22.7
2016-01-02_15:25:37 AdaSensor temperature: 22.8
2016-01-02_15:25:37 AdaSensor temperature: 22.8
2016-01-02_15:30:37 AdaSensor temperature: 22.7
2016-01-02_15:30:37 AdaSensor temperature: 22.7
2016-01-02_15:35:37 AdaSensor temperature: 22.8
2016-01-02_15:35:37 AdaSensor temperature: 22.8
2016-01-02_15:40:37 AdaSensor temperature: 22.7
2016-01-02_15:40:38 AdaSensor temperature: 22.7
2016-01-02_15:45:37 AdaSensor temperature: 22.8
2016-01-02_15:45:37 AdaSensor temperature: 22.8
2016-01-02_15:50:37 AdaSensor temperature: 22.7
2016-01-02_15:50:37 AdaSensor temperature: 22.7
2016-01-02_15:55:37 AdaSensor temperature: 22.8
2016-01-02_15:55:37 AdaSensor temperature: 22.8
2016-01-02_16:00:38 AdaSensor temperature: 22.8
2016-01-02_16:00:38 AdaSensor temperature: 22.8
2016-01-02_16:05:38 AdaSensor temperature: 22.7
2016-01-02_16:05:38 AdaSensor temperature: 22.7
2016-01-02_16:10:38 AdaSensor temperature: 22.8
2016-01-02_16:10:38 AdaSensor temperature: 22.8
2016-01-02_16:15:38 AdaSensor temperature: 22.8
2016-01-02_16:15:38 AdaSensor temperature: 22.8
2016-01-02_16:20:38 AdaSensor temperature: 22.7
2016-01-02_16:20:38 AdaSensor temperature: 22.7
2016-01-02_16:25:38 AdaSensor temperature: 22.7
2016-01-02_16:25:38 AdaSensor temperature: 22.7
2016-01-02_16:30:38 AdaSensor temperature: 22.7
2016-01-02_16:30:38 AdaSensor temperature: 22.7
2016-01-02_16:35:38 AdaSensor temperature: 22.6
2016-01-02_16:35:38 AdaSensor temperature: 22.6
2016-01-02_16:40:39 AdaSensor temperature: 22.7
2016-01-02_16:40:39 AdaSensor temperature: 22.7
2016-01-02_16:45:39 AdaSensor temperature: 22.6
2016-01-02_16:45:39 AdaSensor temperature: 22.6
2016-01-02_16:50:39 AdaSensor temperature: 22.5
2016-01-02_16:50:39 AdaSensor temperature: 22.5
2016-01-02_16:55:39 AdaSensor temperature: 22.4
2016-01-02_16:55:39 AdaSensor temperature: 22.4
2016-01-02_17:00:39 AdaSensor temperature: 22.4
2016-01-02_17:00:39 AdaSensor temperature: 22.4
2016-01-02_17:05:39 AdaSensor temperature: 22.3
2016-01-02_17:05:39 AdaSensor temperature: 22.3
2016-01-02_17:10:39 AdaSensor temperature: 22.2
2016-01-02_17:10:39 AdaSensor temperature: 22.2
2016-01-02_17:15:40 AdaSensor temperature: 22.3
2016-01-02_17:15:40 AdaSensor temperature: 22.3
2016-01-02_17:20:40 AdaSensor temperature: 22.3
2016-01-02_17:20:40 AdaSensor temperature: 22.3
2016-01-02_17:25:40 AdaSensor temperature: 22.2
2016-01-02_17:25:40 AdaSensor temperature: 22.2
2016-01-02_17:30:40 AdaSensor temperature: 22.2
2016-01-02_17:30:40 AdaSensor temperature: 22.2
2016-01-02_17:35:40 AdaSensor temperature: 22.2
2016-01-02_17:35:40 AdaSensor temperature: 22.2
2016-01-02_17:40:40 AdaSensor temperature: 22.3
2016-01-02_17:40:40 AdaSensor temperature: 22.3
2016-01-02_17:45:40 AdaSensor temperature: 22.5
2016-01-02_17:45:40 AdaSensor temperature: 22.5
2016-01-02_17:50:41 AdaSensor temperature: 22.5
2016-01-02_17:50:41 AdaSensor temperature: 22.5
2016-01-02_17:55:41 AdaSensor temperature: 22.4
2016-01-02_17:55:41 AdaSensor temperature: 22.4
2016-01-02_18:00:41 AdaSensor temperature: 22.4
2016-01-02_18:00:41 AdaSensor temperature: 22.4
2016-01-02_18:05:41 AdaSensor temperature: 22.4
2016-01-02_18:05:41 AdaSensor temperature: 22.4
2016-01-02_18:10:41 AdaSensor temperature: 22.3
2016-01-02_18:10:41 AdaSensor temperature: 22.3
2016-01-02_18:15:41 AdaSensor temperature: 22.5
2016-01-02_18:15:41 AdaSensor temperature: 22.5
2016-01-02_18:20:41 AdaSensor temperature: 22.5
2016-01-02_18:20:41 AdaSensor temperature: 22.5
2016-01-02_18:25:42 AdaSensor temperature: 22.4
2016-01-02_18:25:42 AdaSensor temperature: 22.4
2016-01-02_18:30:42 AdaSensor temperature: 22.5
2016-01-02_18:30:42 AdaSensor temperature: 22.5
2016-01-02_18:35:42 AdaSensor temperature: 62.7
2016-01-02_18:35:42 AdaSensor temperature: 62.7
2016-01-02_18:40:42 AdaSensor temperature: 62.7
2016-01-02_18:40:42 AdaSensor temperature: 62.7
2016-01-02_18:50:32 AdaSensor temperature: 22.4
2016-01-02_18:50:32 AdaSensor temperature: 22.4
2016-01-02_18:55:32 AdaSensor temperature: 22.4
2016-01-02_18:55:32 AdaSensor temperature: 22.4
2016-01-02_19:00:32 AdaSensor temperature: 22.4
2016-01-02_19:00:32 AdaSensor temperature: 22.4
2016-01-02_19:05:33 AdaSensor temperature: 22.3
2016-01-02_19:05:33 AdaSensor temperature: 22.3
2016-01-02_19:10:33 AdaSensor temperature: 22.4
2016-01-02_19:10:33 AdaSensor temperature: 22.4
2016-01-02_19:15:33 AdaSensor temperature: 22.5
2016-01-02_19:15:33 AdaSensor temperature: 22.5
2016-01-02_19:20:33 AdaSensor temperature: 22.6
2016-01-02_19:20:33 AdaSensor temperature: 22.6
2016-01-02_19:25:33 AdaSensor temperature: 22.5
2016-01-02_19:25:33 AdaSensor temperature: 22.5
2016-01-02_19:30:33 AdaSensor temperature: 22.6
2016-01-02_19:30:33 AdaSensor temperature: 22.6
2016-01-02_19:35:33 AdaSensor temperature: 22.6
2016-01-02_19:35:33 AdaSensor temperature: 22.6
2016-01-02_19:40:33 AdaSensor temperature: 22.6
2016-01-02_19:40:33 AdaSensor temperature: 22.6
2016-01-02_19:40:41 AdaSensor temperature: 22.6
2016-01-02_19:40:41 AdaSensor temperature: 22.6
2016-01-02_19:40:43 AdaSensor temperature: 22.6
2016-01-02_19:40:43 AdaSensor temperature: 22.6
2016-01-02_19:40:44 AdaSensor temperature: 22.6
2016-01-02_19:40:44 AdaSensor temperature: 22.6
2016-01-02_19:40:45 AdaSensor temperature: 22.6
2016-01-02_19:40:45 AdaSensor temperature: 22.6
2016-01-02_19:45:34 AdaSensor temperature: 22.6
2016-01-02_19:45:34 AdaSensor temperature: 22.6
2016-01-02_19:50:34 AdaSensor temperature: 22.6
2016-01-02_19:50:34 AdaSensor temperature: 22.6
2016-01-02_19:51:34 AdaSensor temperature: 22.6
2016-01-02_19:51:34 AdaSensor temperature: 22.6
2016-01-02_19:51:35 AdaSensor temperature: 22.7
2016-01-02_19:51:35 AdaSensor temperature: 22.7
2016-01-02_19:51:36 AdaSensor temperature: 22.6
2016-01-02_19:51:36 AdaSensor temperature: 22.6
2016-01-02_19:55:34 AdaSensor temperature: 22.6
2016-01-02_19:55:34 AdaSensor temperature: 22.6


Ich habe auch schon einen anderen Arduino und zwei andere HTU21D versucht.

Bitte um Hilfe

danke
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: thymjan am 03 Januar 2016, 12:33:57
Hallo schami23,

Das ist ein seltsames Verhalten.

ist Dein FHEM aktuell (welche Version; mit "update" in der ersten Zeile im WebInterface wird auf die aktuellste Version geupdated)? Welche Firmata-Version verwendest Du denn?
Wie ist Dein Arduino angeschlossen (per USB oder per Ethernet)?

Gruß,
Stefan
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: schami23 am 03 Januar 2016, 13:03:44
Im Event monitor kommt folgende ausgabe wenn ich set readValues ausführe.

2016-01-03 13:00:02 I2C_SHT21 AdaSensor readValues
2016-01-03 13:00:02 I2C_SHT21 AdaSensor temperature: 22.3
2016-01-03 13:00:02 FRM FIRMATA error: I2C: Too few bytes received
2016-01-03 13:00:02 I2C_SHT21 AdaSensor temperature: 22.3


Ich benutze einen Arduino Mega mit Ethernet hab es aber auch schon mit Uno versucht.
FHEM hab ich erst vor kurzen abgedatet.

Grüße Jürgen
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: thymjan am 03 Januar 2016, 16:25:24
Stell mal sowohl beim SHT21 als auch beim FRM Module verbose auf 5 und schau Dir dann das Log-File dazu an.
Gruß,
Stefan
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: schami23 am 03 Januar 2016, 20:23:01
Hier das die log von FRM  und SHT21 Modul :

2016.01.03 20:19:27 5: FRM:>f07640007301f7
2016.01.03 20:19:27 5: FRM:>f07640080200f7
2016.01.03 20:19:27 5: FRM:>f07640007501f7
2016.01.03 20:19:27 5: FRM:>f07640080200f7
2016.01.03 20:19:27 5: FRM:<f07740
2016.01.03 20:19:27 5: FRM:<000000
2016.01.03 20:19:27 5: FRM:<640008
2016.01.03 20:19:27 5: FRM:<01f7
2016.01.03 20:19:27 5: onI2CMessage address: '64', register: '0' data: [100,136]
2016.01.03 20:19:27 5: empfangen: 100 136
2016.01.03 20:19:27 5: FRM:<f07149
2016.01.03 20:19:27 5: FRM:<0032004300
2016.01.03 20:19:27 5: FRM:<3a00
2016.01.03 20:19:27 5: FRM:<200054
2016.01.03 20:19:27 5: FRM:<006f
2016.01.03 20:19:27 5: FRM:<006f
2016.01.03 20:19:27 5: FRM:<00
2016.01.03 20:19:27 5: FRM:<2000
2016.01.03 20:19:27 5: FRM:<66
2016.01.03 20:19:27 5: FRM:<0065
2016.01.03 20:19:27 5: FRM:<0077
2016.01.03 20:19:27 5: FRM:<00
2016.01.03 20:19:27 5: FRM:<2000
2016.01.03 20:19:27 5: FRM:<62
2016.01.03 20:19:27 5: FRM:<0079
2016.01.03 20:19:27 5: FRM:<00
2016.01.03 20:19:27 5: FRM:<74
2016.01.03 20:19:27 5: FRM:<0065
2016.01.03 20:19:27 5: FRM:<0073
2016.01.03 20:19:27 5: FRM:<0020
2016.01.03 20:19:27 5: FRM:<00
2016.01.03 20:19:27 5: FRM:<72
2016.01.03 20:19:27 5: FRM:<0065
2016.01.03 20:19:27 5: FRM:<00
2016.01.03 20:19:27 5: FRM:<63
2016.01.03 20:19:27 5: FRM:<00
2016.01.03 20:19:27 5: FRM:<65
2016.01.03 20:19:27 5: FRM:<00
2016.01.03 20:19:27 5: FRM:<6900
2016.01.03 20:19:27 5: FRM:<76
2016.01.03 20:19:27 5: FRM:<00
2016.01.03 20:19:27 5: FRM:<65
2016.01.03 20:19:27 5: FRM:<00
2016.01.03 20:19:27 5: FRM:<64
2016.01.03 20:19:27 5: FRM:<00
2016.01.03 20:19:27 5: FRM:<f7
2016.01.03 20:19:27 3: received String_data: I2C: Too few bytes received
2016.01.03 20:19:27 5: FRM:<f0774000000064000801f7
2016.01.03 20:19:27 5: onI2CMessage address: '64', register: '0' data: [100,136]
2016.01.03 20:19:27 5: empfangen: 100 136


Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: thymjan am 03 Januar 2016, 20:30:24
Hallo Jürgen,

verwendest Du die Standard Firmata oder die ConfigurableFirmata? Welche Version genau?

Was hängt sonst noch an Deinem Arduino?

Gruß,
Stefan
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: schami23 am 04 Januar 2016, 09:30:27
Hallo Stefan,

ich verwende die ConfigurableFirmata, und es hängt noch ein BMP180 am Arduino.
Seit dem letzten update Gestern geht die Verbindung  zum FRM immer wieder verloren.
Ich habe mich entschlossen meinen Server zu aktualisieren und die neue Version von FHEM zu installieren, mal schauen ob es dann funktioniert.
Melde mich dann wieder.

Grüße Jürgen
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: klausw am 04 Januar 2016, 10:27:05
Ich habe mit jetzt auch ein paar Arduino Nanos bestellt und würde einen Versuchsaufbau mit Firmata machen wollen.
Gibt es eine kurze Anleitung/Tutorial, welches Firmata ich wie draufbekommen soll/muss?  8)
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: thymjan am 04 Januar 2016, 16:10:54
Hallo Klaus,

habe mich damals an die Anleitung von Norbert Truchsess gehalten.
Da gibts einen elend langen Threat den ich mühsam durchgearbeitet habe.
Das war die Kombi Nano-ENC28J60. Das ist ziemlich knapp mit dem Speicherplatz. Aber einmal konfiguriert läufts stabil bei mir.
Firmata-mäßig läuft da allerdings momentan einiges. Da habe ich den Überblick verloren.
Wenn Du Norberts Weg und seine Firmata verwenden willst, bin ich Dir gerne behilflich.
Muss die Infos nur nochmal zusammen kratzen.

Das nächste große Ding wäre ja auch Firmata mit WLAN oder Bluetooth. Habe ich hier auch zwei Module.
Spätestens da muss man sich mit den neuen Firmatas intensiv beschäftigen.

Hängen wir uns rein!

Grüße,
Stefan

Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: thymjan am 04 Januar 2016, 21:27:55
@Jürgen:
Wie versorgst Du den Arduino mit Strom? Bei mir hat ein gutes Netzteil die Stabilität erheblich verbessert.

Gruß,
Stefan
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: schami23 am 05 Januar 2016, 09:26:42
Hallo Stefan,

Die Stomversorgung erfolgt über USB 5V 2A.

Hab jetzt alles neu gemacht, hat schwierigkeiten mit der Verbindung zum Arduino hab das Problem behoben die neue FHEM Version mag die Klammern beim global (http://forum.fhem.de/index.php?topic=46618.0) nicht.

Leider hab ich das Problem immer noch seltsammerweise kommt ab und zu eine Luftfeuchtikeit zurück aber keine Temperatur nie beides.
Wenn das SHT21 Modul abfragt kommt vom Arduino folgendes zurück.

2016.01.05 08:37:10 3: received String_data: I2C: Too few bytes received
2016.01.05 08:37:10 5: empfangen: 156 248
2016.01.05 08:37:10 3: received String_data: I2C: Too few bytes received
2016.01.05 08:37:10 5: empfangen: 156 248
2016.01.05 08:42:11 5: empfangen: 100 164
2016.01.05 08:42:11 3: received String_data: I2C: Too few bytes received
2016.01.05 08:42:11 5: empfangen: 100 164


Ich hab im FRM unter Readings
error                          I2C: Too few bytes received
stehen

Ich verwende diese Firmata auf beide Mega
/*
* Firmata is a generic protocol for communicating with microcontrollers
* from software on a host computer. It is intended to work with
* any host computer software package.
*
* To download a host software package, please click on the following link
* to open the download page in your default browser.
*
* http://firmata.org/wiki/Download
*/

/*
  Copyright (C) 2006-2008 Hans-Christoph Steiner.  All rights reserved.
  Copyright (C) 2010-2011 Paul Stoffregen.  All rights reserved.
  Copyright (C) 2009 Shigeru Kobayashi.  All rights reserved.
  Copyright (C) 2009-2013 Jeff Hoefs.  All rights reserved.
  Copyright (C) 2013 Norbert Truchsess. All rights reserved.
  Copyright (C) 2014 Nicolas Panel. All rights reserved.

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  See file LICENSE.txt for further informations on licensing terms.

  formatted using the GNU C formatting and indenting
*/


#include <Firmata.h>

/*
* by default Firmata uses the Serial-port (over USB) of Arduino.
* ConfigurableFirmata may also comunicate over ethernet using tcp/ip.
* To configure this 'Network Firmata' to use the original WIZ5100-based
* ethernet-shield or Arduino Ethernet uncomment the includes of 'SPI.h' and 'Ethernet.h':
*/

#include <SPI.h>
#include <Ethernet.h>

/*
* To configure 'Network Firmata' to use an ENC28J60 based board include
* 'UIPEthernet.h' (no SPI.h required). The UIPEthernet-library can be downloaded
* from: https://github.com/ntruchsess/arduino_uip
*/

//#include <UIPEthernet.h>

/*
* To execute Network Firmata on Yun uncomment Bridge.h and YunClient.h.
* Do not include Ethernet.h or SPI.h in this case.
* On Yun there's no need to configure local_ip and mac in the sketch
* as this is configured on the linux-side of Yun.
*/

//#include <Bridge.h>
//#include <YunClient.h>

#if defined ethernet_h || defined UIPETHERNET_H || defined _YUN_CLIENT_H_
/*==============================================================================
* Network configuration for Network Firmata
*============================================================================*/
#define NETWORK_FIRMATA
//replace with ip of server you want to connect to, comment out if using 'remote_host'
#define remote_ip IPAddress(192,168,56,104)
//replace with hostname of server you want to connect to, comment out if using 'remote_ip'
//#define remote_host " "
//replace with the port that your server is listening on
#define remote_port 3031
//replace with arduinos ip-address. Comment out if Ethernet-startup should use dhcp. Is ignored on Yun
//#define local_ip IPAddress(192,168,56,140)
//replace with ethernet shield mac. It's mandatory every device is assigned a unique mac. Is ignored on Yun
const byte mac[] = {0x90, 0xA2, 0xDA, 0x0D, 0x07, 0x01};
#endif

// To configure, save this file to your working directory so you can edit it
// then comment out the include and declaration for any features that you do
// not need below.

// Also note that the current compile size for an Arduino Uno with all of the
// following features enabled is about 22.4k. If you are using an older Arduino
// or other microcontroller with less memory you will not be able to include
// all of the following feature classes.

#include <utility/DigitalInputFirmata.h>
DigitalInputFirmata digitalInput;

#include <utility/DigitalOutputFirmata.h>
DigitalOutputFirmata digitalOutput;

#include <utility/AnalogInputFirmata.h>
AnalogInputFirmata analogInput;

#include <utility/AnalogOutputFirmata.h>
AnalogOutputFirmata analogOutput;

#include <Servo.h> //wouldn't load from ServoFirmata.h in Arduino1.0.3
#include <utility/ServoFirmata.h>
ServoFirmata servo;

#include <Wire.h> //wouldn't load from I2CFirmata.h in Arduino1.0.3
#include <utility/I2CFirmata.h>
I2CFirmata i2c;

#include <utility/OneWireFirmata.h>
OneWireFirmata oneWire;

#include <utility/FirmataStepper.h>
FirmataStepper stepper;

#include <utility/FirmataExt.h>
FirmataExt firmataExt;

#include <utility/FirmataScheduler.h>
FirmataScheduler scheduler;

#include <utility/EncoderFirmata.h>
EncoderFirmata encoder;


// dependencies. Do not comment out the following lines
#if defined AnalogOutputFirmata_h || defined ServoFirmata_h
#include <utility/AnalogWrite.h>
#endif

#if defined AnalogInputFirmata_h || defined I2CFirmata_h || defined EncoderFirmata_h
#include <utility/FirmataReporting.h>
FirmataReporting reporting;
#endif

// dependencies for Network Firmata. Do not comment out.
#ifdef NETWORK_FIRMATA
#if defined remote_ip && defined remote_host
#error "cannot define both remote_ip and remote_host at the same time!"
#endif
#include <utility/EthernetClientStream.h>
#ifdef _YUN_CLIENT_H_
YunClient client;
#else
EthernetClient client;
#endif
#if defined remote_ip && !defined remote_host
#ifdef local_ip
EthernetClientStream stream(client, local_ip, remote_ip, NULL, remote_port);
#else
EthernetClientStream stream(client, IPAddress(0, 0, 0, 0), remote_ip, NULL, remote_port);
#endif
#endif
#if !defined remote_ip && defined remote_host
#ifdef local_ip
EthernetClientStream stream(client, local_ip, IPAddress(0, 0, 0, 0), remote_host, remote_port);
#else
EthernetClientStream stream(client, IPAddress(0, 0, 0, 0), IPAddress(0, 0, 0, 0), remote_host, remote_port);
#endif
#endif
#endif

/*==============================================================================
* FUNCTIONS
*============================================================================*/

void systemResetCallback()
{
  // initialize a defalt state

  // pins with analog capability default to analog input
  // otherwise, pins default to digital output
  for (byte i = 0; i < TOTAL_PINS; i++) {
    if (IS_PIN_ANALOG(i)) {
#ifdef AnalogInputFirmata_h
      // turns off pullup, configures everything
      Firmata.setPinMode(i, ANALOG);
#endif
    } else if (IS_PIN_DIGITAL(i)) {
#ifdef DigitalOutputFirmata_h
      // sets the output to 0, configures portConfigInputs
      Firmata.setPinMode(i, OUTPUT);
     
#endif
    }
  }

#ifdef FirmataExt_h
  firmataExt.reset();
#endif
}

/*==============================================================================
* SETUP()
*============================================================================*/

void setup()
{
 
 
#ifdef NETWORK_FIRMATA
#ifdef _YUN_CLIENT_H_
  Bridge.begin();
#else
#ifdef local_ip
  Ethernet.begin((uint8_t *)mac, local_ip); //start ethernet
#else
  Ethernet.begin((uint8_t *)mac); //start ethernet using dhcp
#endif
#endif
  delay(1000);
#endif
  Firmata.setFirmwareVersion(FIRMATA_MAJOR_VERSION, FIRMATA_MINOR_VERSION);

#if defined AnalogOutputFirmata_h || defined ServoFirmata_h
  /* analogWriteCallback is declared in AnalogWrite.h */
  Firmata.attach(ANALOG_MESSAGE, analogWriteCallback);
#endif

#ifdef FirmataExt_h
#ifdef DigitalInputFirmata_h
  firmataExt.addFeature(digitalInput);
#endif
#ifdef DigitalOutputFirmata_h
  firmataExt.addFeature(digitalOutput);
#endif
#ifdef AnalogInputFirmata_h
  firmataExt.addFeature(analogInput);
#endif
#ifdef AnalogOutputFirmata_h
  firmataExt.addFeature(analogOutput);
#endif
#ifdef ServoFirmata_h
  firmataExt.addFeature(servo);
#endif
#ifdef I2CFirmata_h
  firmataExt.addFeature(i2c);
#endif
#ifdef OneWireFirmata_h
  firmataExt.addFeature(oneWire);
#endif
#ifdef StepperFirmata_h
  firmataExt.addFeature(stepper);
#endif
#ifdef FirmataReporting_h
  firmataExt.addFeature(reporting);
#endif
#ifdef FirmataScheduler_h
  firmataExt.addFeature(scheduler);
#endif
#ifdef EncoderFirmata_h
  firmataExt.addFeature(encoder);
#endif
#endif
  /* systemResetCallback is declared here (in ConfigurableFirmata.ino) */
  Firmata.attach(SYSTEM_RESET, systemResetCallback);

  // Network Firmata communicates with Ethernet-shields over SPI. Therefor all
  // SPI-pins must be set to IGNORE. Otherwise Firmata would break SPI-communication.
  // add Pin 10 and configure pin 53 as output if using a MEGA with Ethernetshield.
  // No need to ignore pin 10 on MEGA with ENC28J60, as here pin 53 should be connected to SS:
#ifdef NETWORK_FIRMATA
  // ignore SPI and pin 4 that is SS for SD-Card on Ethernet-shield
  for (byte i = 0; i < TOTAL_PINS; i++) {
if (IS_PIN_SPI(i)
|| 4 == i
|| 10 == i //explicitly ignore pin 10 on MEGA as 53 is hardware-SS but Ethernet-shield uses pin 10 for SS
) {
Firmata.setPinMode(i, IGNORE);
}
}
pinMode(PIN_TO_DIGITAL(53), OUTPUT); //configure hardware-SS as output on MEGA
pinMode(PIN_TO_DIGITAL(4), OUTPUT); // switch off SD-card bypassing Firmata
digitalWrite(PIN_TO_DIGITAL(4), HIGH); // SS is active low;

// start up Network Firmata:
Firmata.begin(stream);
#else
// start up the default Firmata using Serial interface:
Firmata.begin(57600);
#endif
systemResetCallback(); // reset to default config
}

/*==============================================================================
* LOOP()
*============================================================================*/
void loop()
{
#ifdef DigitalInputFirmata_h
  /* DIGITALREAD - as fast as possible, check for changes and output them to the
   * stream buffer using Firmata.write()  */
  digitalInput.report();
#endif

  /* STREAMREAD - processing incoming messagse as soon as possible, while still
   * checking digital inputs.  */
  while (Firmata.available()) {
    Firmata.processInput();
#ifdef FirmataScheduler_h
    if (!Firmata.isParsingMessage()) {
      goto runtasks;
    }
  }
  if (!Firmata.isParsingMessage()) {
runtasks: scheduler.runTasks();
#endif
  }

  /* SEND STREAM WRITE BUFFER - TO DO: make sure that the stream buffer doesn't go over
   * 60 bytes. use a timer to sending an event character every 4 ms to
   * trigger the buffer to dump. */

#ifdef FirmataReporting_h
  if (reporting.elapsed()) {
#ifdef AnalogInputFirmata_h
    /* ANALOGREAD - do all analogReads() at the configured sampling interval */
    analogInput.report();
#endif
#ifdef I2CFirmata_h
    // report i2c data for all device with read continuous mode enabled
    i2c.report();
#endif
#ifdef EncoderFirmata_h
    // report encoders positions if reporting enabled.
    encoder.report();
#endif
  }
#endif
#ifdef StepperFirmata_h
  stepper.update();
#endif
#if defined NETWORK_FIRMATA && !defined local_ip &&!defined _YUN_CLIENT_H_
  if (Ethernet.maintain())
  {
    stream.maintain(Ethernet.localIP());
  }
#endif
}


Welche Firmata verwendest du?



Grüße Jürgen
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: schami23 am 05 Januar 2016, 10:08:55
Ich hab das Problem GELÖST.

Nach der Durchsicht der der HTU21DF Librarie und des I2C_SHT21 Moduls ist mir aufgefallen das eine andere Abfrageadresse zum lese für den  HTU21DF verwendet werden muss.


#define HTU21DF_I2CADDR       0x40
#define HTU21DF_READTEMP      0xE3
#define HTU21DF_READHUM       0xE5
#define HTU21DF_WRITEREG       0xE6
#define HTU21DF_READREG       0xE7
#define HTU21DF_RESET       0xFE


Ich hab im I2C_SHT21 fölgende änderung vorgenohmen und jetzt läuft es.

sub I2C_SHT21_readTemperature($) {
my ($hash) = @_;
  my $name = $hash->{NAME};
  return "$name: no IO device defined" unless ($hash->{IODev});
  my $phash = $hash->{IODev};
    my $pname = $phash->{NAME};
 
# Write 0xF3 to device. This requests a temperature reading
my $i2creq = { i2caddress => $hash->{I2C_Address}, direction => "i2cwrite" };

       #$i2creq->{data} = hex("F3");

        # E3 für HTU21DF
        $i2creq->{data} = hex("E3");

CallFn($pname, "I2CWrtFn", $phash, $i2creq);
usleep(85000); #fuer 14bit

# Read the two byte result from device
my $i2cread = { i2caddress => $hash->{I2C_Address}, direction => "i2cread" };
        $i2cread->{nbyte} = 2;
$i2cread->{type} = "temp";
CallFn($pname, "I2CWrtFn", $phash, $i2cread);

return;
}

sub I2C_SHT21_readHumidity($) {
my ($hash) = @_;
my $name = $hash->{NAME};
return "$name: no IO device defined" unless ($hash->{IODev});
my $phash = $hash->{IODev};
my $pname = $phash->{NAME};

# Write 0xF5 to device. This requests a humidity reading
my $i2creq = { i2caddress => $hash->{I2C_Address}, direction => "i2cwrite" };

       # $i2creq->{data} = hex("F5");

       # E5 für HTU21DF
        $i2creq->{data} = hex("E5");

CallFn($pname, "I2CWrtFn", $phash, $i2creq);
usleep(39000); #fuer 12bit

# Read the two byte result from device
my $i2cread = { i2caddress => $hash->{I2C_Address}, direction => "i2cread" };
        $i2cread->{nbyte} = 2;
$i2cread->{type} = "hum";
CallFn($pname, "I2CWrtFn", $phash, $i2cread);

return; # $retVal;
}


Danke

Grüße Jürgen
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: klausw am 05 Januar 2016, 10:53:52
Zitat von: thymjan am 04 Januar 2016, 16:10:54
Hallo Klaus,
...
Hängen wir uns rein!

Grüße,
Stefan
Ich werde mich mal einlesen und dich bei Fragen löchern :)
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: schami23 am 05 Januar 2016, 11:09:06
Ich hab das I2C_SHT21 Modul adaptiert für ein I2C_HTU21DF Modul.
Hab halt nur SHT21 durch HTU21DF ersetzt und die Adresse geändert.
Ich hab es bei mir so am laufen.

package main;

use strict;
use warnings;

use Time::HiRes qw(usleep);
use Scalar::Util qw(looks_like_number);
#use Error qw(:try);

use constant {
HTU21DF_I2C_ADDRESS => '0x40',
};

##################################################
# Forward declarations
#
sub I2C_HTU21DF_Initialize($);
sub I2C_HTU21DF_Define($$);
sub I2C_HTU21DF_Attr(@);
sub I2C_HTU21DF_Poll($);
sub I2C_HTU21DF_Set($@);
sub I2C_HTU21DF_Undef($$);
sub I2C_HTU21DF_DbLog_splitFn($);

my %sets = (
'readValues' => 1,
);

sub I2C_HTU21DF_Initialize($) {
my ($hash) = @_;

$hash->{DefFn}    = 'I2C_HTU21DF_Define';
$hash->{InitFn}   = 'I2C_HTU21DF_Init';
$hash->{AttrFn}   = 'I2C_HTU21DF_Attr';
$hash->{SetFn}    = 'I2C_HTU21DF_Set';
$hash->{UndefFn}  = 'I2C_HTU21DF_Undef';
  $hash->{I2CRecFn} = 'I2C_HTU21DF_I2CRec';
$hash->{AttrList} = 'IODev do_not_notify:0,1 showtime:0,1 poll_interval:1,2,5,10,20,30 ' .
'roundHumidityDecimal:0,1,2 roundTemperatureDecimal:0,1,2 ' .
$readingFnAttributes;
  $hash->{DbLog_splitFn} = "I2C_HTU21DF_DbLog_splitFn";
}

sub I2C_HTU21DF_Define($$) {
my ($hash, $def) = @_;
my @a = split('[ \t][ \t]*', $def);

  $hash->{STATE} = "defined";

  if ($main::init_done) {
    eval { I2C_HTU21DF_Init( $hash, [ @a[ 2 .. scalar(@a) - 1 ] ] ); };
    return I2C_HTU21DF_Catch($@) if $@;
  }
  return undef;
}

sub I2C_HTU21DF_Init($$) {
my ( $hash, $args ) = @_;

my $name = $hash->{NAME};

if (defined $args && int(@$args) > 1)
{
  return "Define: Wrong syntax. Usage:\n" .
          "define <name> I2C_HTU21DF [<i2caddress>]";
}

if (defined (my $address = shift @$args)) {
    $hash->{I2C_Address} = $address =~ /^0.*$/ ? oct($address) : $address;
    return "$name I2C Address not valid" unless ($address < 128 && $address > 3);
} else {
$hash->{I2C_Address} = hex(HTU21DF_I2C_ADDRESS);
}


my $msg = '';
# create default attributes
if (AttrVal($name, 'poll_interval', '?') eq '?') { 
    $msg = CommandAttr(undef, $name . ' poll_interval 5');
    if ($msg) {
      Log3 ($hash, 1, $msg);
      return $msg;
    }
  }
AssignIoPort($hash);
$hash->{STATE} = 'Initialized';

# my %sendpackage = ( i2caddress => $hash->{I2C_Address}, direction => "i2cread" );
# $sendpackage{reg} = hex("AA");
# $sendpackage{nbyte} = 22;
# return "$name: no IO device defined" unless ($hash->{IODev});
# my $phash = $hash->{IODev};
# my $pname = $phash->{NAME};
# CallFn($pname, "I2CWrtFn", $phash, \%sendpackage);

return undef;
}

sub I2C_HTU21DF_Catch($) {
  my $exception = shift;
  if ($exception) {
    $exception =~ /^(.*)( at.*FHEM.*)$/;
    return $1;
  }
  return undef;
}


sub I2C_HTU21DF_Attr (@) {# hier noch Werteueberpruefung einfuegen
my ($command, $name, $attr, $val) =  @_;
my $hash = $defs{$name};
my $msg = '';
if ($command && $command eq "set" && $attr && $attr eq "IODev") {
if ($main::init_done and (!defined ($hash->{IODev}) or $hash->{IODev}->{NAME} ne $val)) {
main::AssignIoPort($hash,$val);
my @def = split (' ',$hash->{DEF});
I2C_HTU21DF_Init($hash,\@def) if (defined ($hash->{IODev}));
}
}
if ($attr eq 'poll_interval') {
#my $pollInterval = (defined($val) && looks_like_number($val) && $val > 0) ? $val : 0;

if ($val > 0) {
RemoveInternalTimer($hash);
InternalTimer(1, 'I2C_HTU21DF_Poll', $hash, 0);
} else {
$msg = 'Wrong poll intervall defined. poll_interval must be a number > 0';
}
} elsif ($attr eq 'roundHumidityDecimal') {
$msg = 'Wrong $attr defined. Use one of 0, 1, 2' if defined($val) && $val <= 0 && $val >= 2 ;
} elsif ($attr eq 'roundTemperatureDecimal') {
$msg = 'Wrong $attr defined. Use one of 0, 1, 2' if defined($val) && $val <= 0 && $val >= 2 ;
}
return ($msg) ? $msg : undef;
}

sub I2C_HTU21DF_Poll($) {
my ($hash) =  @_;
my $name = $hash->{NAME};

# Read values
I2C_HTU21DF_Set($hash, ($name, 'readValues'));

my $pollInterval = AttrVal($hash->{NAME}, 'poll_interval', 0);
if ($pollInterval > 0) {
InternalTimer(gettimeofday() + ($pollInterval * 60), 'I2C_HTU21DF_Poll', $hash, 0);
}
}

sub I2C_HTU21DF_Set($@) {
my ($hash, @a) = @_;
my $name = $a[0];
my $cmd =  $a[1];

if(!defined($sets{$cmd})) {
return 'Unknown argument ' . $cmd . ', choose one of ' . join(' ', keys %sets)
}

if ($cmd eq 'readValues') {
I2C_HTU21DF_readTemperature($hash);
I2C_HTU21DF_readHumidity($hash);
}
}

sub I2C_HTU21DF_Undef($$) {
my ($hash, $arg) = @_;

RemoveInternalTimer($hash);
return undef;
}

sub I2C_HTU21DF_I2CRec ($$) {
my ($hash, $clientmsg) = @_;
  my $name = $hash->{NAME}; 
  my $phash = $hash->{IODev};
  my $pname = $phash->{NAME};
  while ( my ( $k, $v ) = each %$clientmsg ) { #erzeugen von Internals fuer alle Keys in $clientmsg die mit dem physical Namen beginnen
    $hash->{$k} = $v if $k =~ /^$pname/ ;
  }
#alte Variante zur Temp Hum Unterscheidung
    #if ( $clientmsg->{direction} && $clientmsg->{type} && $clientmsg->{$pname . "_SENDSTAT"} && $clientmsg->{$pname . "_SENDSTAT"} eq "Ok" ) {
# if ( $clientmsg->{direction} eq "i2cread" && defined($clientmsg->{received}) ) {
# Log3 $hash, 5, "empfangen: $clientmsg->{received}";
# I2C_HTU21DF_GetTemp  ($hash, $clientmsg->{received}) if $clientmsg->{type} eq "temp" && $clientmsg->{nbyte} == 2;
# I2C_HTU21DF_GetHum ($hash, $clientmsg->{received}) if $clientmsg->{type} eq "hum" && $clientmsg->{nbyte} == 2;
# }
#}
   
    # Bit 1 of the two LSBs indicates the measurement type (‘0’: temperature, ‘1’ humidity)
    if ( $clientmsg->{direction} && $clientmsg->{$pname . "_SENDSTAT"} && $clientmsg->{$pname . "_SENDSTAT"} eq "Ok" ) {
    if ( $clientmsg->{direction} eq "i2cread" && defined($clientmsg->{received}) ) {
    Log3 $hash, 5, "empfangen: $clientmsg->{received}";   
        my @raw = split(" ",$clientmsg->{received});
        I2C_HTU21DF_GetTemp ($hash, $clientmsg->{received}) if !($raw[1] & 2) && $clientmsg->{nbyte} == 2;
        I2C_HTU21DF_GetHum  ($hash, $clientmsg->{received}) if  ($raw[1] & 2) && $clientmsg->{nbyte} == 2;
        }
    }
}

sub I2C_HTU21DF_GetTemp ($$) {
my ($hash, $rawdata) = @_;
  my @raw = split(" ",$rawdata);
  my $temperature = $raw[0] << 8 | $raw[1];
$temperature = ( 175.72 * $temperature / 2**16 ) - 46.85;
$temperature = sprintf(
'%.' . AttrVal($hash->{NAME}, 'roundTemperatureDecimal', 1) . 'f',
$temperature
);
readingsSingleUpdate($hash,"temperature", $temperature, 1);
}

sub I2C_HTU21DF_GetHum ($$) {
my ($hash, $rawdata) = @_;
  my @raw = split(" ",$rawdata);
my $name = $hash->{NAME};
my $temperature = ReadingsVal($name,"temperature","0");

my $humidity = $raw[0] << 8 | $raw[1];
$humidity = ( 125 * $humidity / 2**16 ) - 6;
$humidity = sprintf(
'%.' . AttrVal($hash->{NAME}, 'roundHumidityDecimal', 1) . 'f',
$humidity
);
readingsBeginUpdate($hash);
readingsBulkUpdate(
$hash,
'state',
'T: ' . $temperature . ' H: ' . $humidity
);
#readingsBulkUpdate($hash, 'temperature', $temperature);
readingsBulkUpdate($hash, 'humidity', $humidity);
readingsEndUpdate($hash, 1);
}


sub I2C_HTU21DF_readTemperature($) {
my ($hash) = @_;
  my $name = $hash->{NAME};
  return "$name: no IO device defined" unless ($hash->{IODev});
  my $phash = $hash->{IODev};
    my $pname = $phash->{NAME};
 
# Write 0xF3 to device. This requests a temperature reading
my $i2creq = { i2caddress => $hash->{I2C_Address}, direction => "i2cwrite" };
  $i2creq->{data} = hex("E3");
CallFn($pname, "I2CWrtFn", $phash, $i2creq);
usleep(85000); #fuer 14bit

# Read the two byte result from device
my $i2cread = { i2caddress => $hash->{I2C_Address}, direction => "i2cread" };
  $i2cread->{nbyte} = 2;
$i2cread->{type} = "temp";
CallFn($pname, "I2CWrtFn", $phash, $i2cread);

return;
}

sub I2C_HTU21DF_readHumidity($) {
my ($hash) = @_;
my $name = $hash->{NAME};
return "$name: no IO device defined" unless ($hash->{IODev});
my $phash = $hash->{IODev};
my $pname = $phash->{NAME};

# Write 0xF5 to device. This requests a humidity reading
my $i2creq = { i2caddress => $hash->{I2C_Address}, direction => "i2cwrite" };
  $i2creq->{data} = hex("E5");
CallFn($pname, "I2CWrtFn", $phash, $i2creq);
usleep(39000); #fuer 12bit

# Read the two byte result from device
my $i2cread = { i2caddress => $hash->{I2C_Address}, direction => "i2cread" };
  $i2cread->{nbyte} = 2;
$i2cread->{type} = "hum";
CallFn($pname, "I2CWrtFn", $phash, $i2cread);

return; # $retVal;
}

sub I2C_HTU21DF_DbLog_splitFn($) {
    my ($event) = @_;
    Log3 undef, 5, "in DbLog_splitFn empfangen: $event";
    my ($reading, $value, $unit) = "";
    my @parts = split(/ /,$event);
    $reading = shift @parts;
    $reading =~ tr/://d;
    $value = $parts[0];
    $unit = "\xB0C" if(lc($reading) =~ m/temp/);
    $unit = "%" if(lc($reading) =~ m/humi/);
    return ($reading, $value, $unit);
}

1;

=pod
=begin html

<a name="I2C_HTU21DF"></a>
<h3>I2C_HTU21DF</h3>
(en | <a href="commandref_DE.html#I2C_HTU21DF">de</a>)
<ul>
<a name="I2C_HTU21DF"></a>
Provides an interface to the HTU21DF I2C Humidity sensor from <a href="www.sensirion.com">Sensirion</a>.
The I2C messages are send through an I2C interface module like <a href="#RPII2C">RPII2C</a>, <a href="#FRM">FRM</a>
or <a href="#NetzerI2C">NetzerI2C</a> so this device must be defined first.<br>
<b>attribute IODev must be set</b><br>
<a name="I2C_HTU21DFDefine"></a><br>
<b>Define</b>
<ul>
<code>define &lt;name&gt; I2C_HTU21DF [&lt;I2C Address&gt;]</code><br>
where <code>&lt;I2C Address&gt;</code> is an 2 digit hexadecimal value<br>
</ul>
<a name="I2C_HTU21DFSet"></a>
<b>Set</b>
<ul>
<code>set &lt;name&gt; readValues</code><br>
Reads the current temperature and humidity values from sensor.<br><br>
</ul>
<a name="I2C_HTU21DFAttr"></a>
<b>Attributes</b>
<ul>
<li>poll_interval<br>
Set the polling interval in minutes to query data from sensor<br>
Default: 5, valid values: 1,2,5,10,20,30<br><br>
</li>
<li>roundHumidityDecimal<br>
Number of decimal places for humidity value<br>
Default: 1, valid values: 0 1 2<br><br>
</li>
<li>roundTemperatureDecimal<br>
Number of decimal places for temperature value<br>
Default: 1, valid values: 0,1,2<br><br>
</li>
<li><a href="#IODev">IODev</a></li>
<li><a href="#do_not_notify">do_not_notify</a></li>
<li><a href="#showtime">showtime</a></li>
</ul><br>
</ul>

=end html

=begin html_DE

<a name="I2C_HTU21DF"></a>
<h3>I2C_HTU21DF</h3>
(<a href="commandref.html#I2C_HTU21DF">en</a> | de)
<ul>
<a name="I2C_HTU21DF"></a>
Erm&ouml;glicht die Verwendung eines HTU21DF I2C Feuchtesensors von <a href="www.sensirion.com">Sensirion</a>.
I2C-Botschaften werden &uuml;ber ein I2C Interface Modul wie beispielsweise das <a href="#RPII2C">RPII2C</a>, <a href="#FRM">FRM</a>
oder <a href="#NetzerI2C">NetzerI2C</a> gesendet. Daher muss dieses vorher definiert werden.<br>
<b>Das Attribut IODev muss definiert sein.</b><br>
<a name="I2C_HTU21DFDefine"></a><br>
<b>Define</b>
<ul>
<code>define &lt;name&gt; I2C_HTU21DF [&lt;I2C Address&gt;]</code><br>
Der Wert <code>&lt;I2C Address&gt;</code> ist ein zweistelliger Hex-Wert<br>
</ul>
<a name="I2C_HTU21DFSet"></a>
<b>Set</b>
<ul>
<code>set &lt;name&gt; readValues</code><br>
Aktuelle Temperatur und Feuchte Werte vom Sensor lesen.<br><br>
</ul>
<a name="I2C_HTU21DFAttr"></a>
<b>Attribute</b>
<ul>
<li>poll_interval<br>
Aktualisierungsintervall aller Werte in Minuten.<br>
Standard: 5, g&uuml;ltige Werte: 1,2,5,10,20,30<br><br>
</li>
<li>roundHumidityDecimal<br>
Anzahl Dezimalstellen f&uuml;r den Feuchtewert<br>
Standard: 1, g&uuml;ltige Werte: 0 1 2<br><br>
</li>
<li>roundTemperatureDecimal<br>
Anzahl Dezimalstellen f&uuml;r den Temperaturwert<br>
Standard: 1, g&uuml;ltige Werte: 0,1,2<br><br>
</li>
<li><a href="#IODev">IODev</a></li>
<li><a href="#do_not_notify">do_not_notify</a></li>
<li><a href="#showtime">showtime</a></li>
</ul><br>
</ul>

=end html_DE

=cut


Grüße Jürgen
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: klausw am 05 Januar 2016, 11:15:13
Zitat von: schami23 am 05 Januar 2016, 11:09:06
Ich hätte das I2C_SHT21 Modul adabtiert für ein I2C_HTU21DF Modul.

Nee lass mal lieber, sind schon ohnehin inzwischen sehr viel Module :)

Was ich seltsam finde, das hier im Forum bereits berichtet wurde (weiss leider nicht mehr von wem) das beide Sensoren kompatibel sind.
Ich könnte ein Attribut in das Modul einbauen, das sich der Sensortyp auswählen lässt. Das wäre meiner Meinung nach die beste Lösung.
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: schami23 am 05 Januar 2016, 11:25:06
Okay, Super Idee.

Ihr seit die Profis ich bin noch blutiger Anfänger.

Danke

Jürgen
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: thymjan am 05 Januar 2016, 11:49:35
Hallo Ihr beiden,

ich hatte behauptet, dass der HTU21 mit dem SHT21-Modul funktioniert. Hab das auch hier mit Firmata-USB und direkt am Raspi am Laufen. Wundert mich jetzt mit den zwei Adressen...

Muss ich mir nochmal anschauen.

Gruß,
Stefan
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: klausw am 05 Januar 2016, 12:20:55
Zitat von: schami23 am 05 Januar 2016, 11:25:06
Okay, Super Idee.

Ihr seit die Profis ich bin noch blutiger Anfänger.

Danke

Jürgen
Ich habe nochmal geschaut. Beide Sensoren sind von den Registern her identisch.
Das einzige was du machst, ist den Transaktionsmodus von No Hold master auf Hold master umzustellen.
Das ist ein anderes Problem. beim "Hold master" blockiert der Sensor den Bus solange, bis die Sensorwerte abgerufen werden können.
Beim "No Hold master" wir der Konvertierungsvorgang angeschubst und nach einer gewissen Zeit werden sie Sensorwerte abgefragt.
Hold master funktioniert beim Raspberry nicht (war glaube ich nen silicon bug im Chip).
Vermutlich sind die Wartezeiten zwischen Anfordern und auslesen einfach zu kurz, weil es bei FRM ja auch noch zu Laufzeiten kommt.

Folgendes bitte testen:

Gehe bitte wieder auf F3 und F5
und ändere die Wartezeiten:
usleep(39000);
usleep(85000);
auf die 10fachen Werte (also ne 0 anfügen)

dann sollte es laufen

Ist der Firmata per Lan angeschlossen?
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: klausw am 05 Januar 2016, 12:27:48
Zitat von: thymjan am 05 Januar 2016, 11:49:35
Hallo Ihr beiden,

ich hatte behauptet, dass der HTU21 mit dem SHT21-Modul funktioniert. Hab das auch hier mit Firmata-USB und direkt am Raspi am Laufen. Wundert mich jetzt mit den zwei Adressen...

Muss ich mir nochmal anschauen.

Gruß,
Stefan
Dich hatte ich auch in Verdacht  8)
Ich vermute, das es am Timing liegt.
FRM über USB hat kleine Latenzzeiten, aber über das Netzwerk kann es schon sein das der Abstand zwischen beiden Botschaften zu kurz ist.
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: schami23 am 05 Januar 2016, 12:38:24
ZitatIch habe nochmal geschaut. Beide Sensoren sind von den Registern her identisch.
Das einzige was du machst, ist den Transaktionsmodus von No Hold master auf Hold master umzustellen.
Das ist ein anderes Problem. beim "Hold master" blockiert der Sensor den Bus solange, bis die Sensorwerte abgerufen werden können.
Beim "No Hold master" wir der Konvertierungsvorgang angeschubst und nach einer gewissen Zeit werden sie Sensorwerte abgefragt.
Hold master funktioniert beim Raspberry nicht (war glaube ich nen silicon bug im Chip).
Vermutlich sind die Wartezeiten zwischen Anfordern und auslesen einfach zu kurz, weil es bei FRM ja auch noch zu Laufzeiten kommt.

Folgendes bitte testen:

Gehe bitte wieder auf F3 und F5
und ändere die Wartezeiten:
usleep(39000);
usleep(85000);
auf die 10fachen Werte (also ne 0 anfügen)

dann sollte es laufen

Ist der Firmata per Lan angeschlossen?

Ja stimmt, hab es gerade getestet jetzt lauft es.

Mein FRM ist via Lan angeschlossen
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: klausw am 05 Januar 2016, 13:32:33
Zitat von: schami23 am 05 Januar 2016, 12:38:24
Ja stimmt, hab es gerade getestet jetzt lauft es.
Super Sache
Kannst du bitte Testen, bis zu welchem Zeitwert es funktioniert?

Den Wert für die Temperatur kannst du ja eigentlich lassen, wenn der schon vorher ging.
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: schami23 am 05 Januar 2016, 14:08:42
Hab folgende Zeitwerte erfolgreich getestet:


Für die Temperatur          usleep(85000);
Für die Luftfeuchtigkeit    usleep(135000);


2016-01-05_14:02:24 AdaSensor temperature: 21.8
2016-01-05_14:02:24 AdaSensor humidity: 35.9
2016-01-05_14:02:26 AdaSensor temperature: 21.8
2016-01-05_14:02:26 AdaSensor humidity: 35.9
2016-01-05_14:02:28 AdaSensor temperature: 21.8
2016-01-05_14:02:28 AdaSensor humidity: 35.8
2016-01-05_14:02:30 AdaSensor temperature: 21.8
2016-01-05_14:02:30 AdaSensor humidity: 35.8
2016-01-05_14:02:32 AdaSensor temperature: 21.8
2016-01-05_14:02:32 AdaSensor humidity: 35.8
2016-01-05_14:02:34 AdaSensor temperature: 21.8
2016-01-05_14:02:34 AdaSensor humidity: 35.8
2016-01-05_14:02:36 AdaSensor temperature: 21.8
2016-01-05_14:02:36 AdaSensor humidity: 35.7
2016-01-05_14:02:39 AdaSensor temperature: 21.8
2016-01-05_14:02:39 AdaSensor humidity: 35.7
2016-01-05_14:02:40 AdaSensor temperature: 21.8
2016-01-05_14:02:40 AdaSensor humidity: 35.7
2016-01-05_14:02:42 AdaSensor temperature: 21.8
2016-01-05_14:02:42 AdaSensor humidity: 35.7
2016-01-05_14:02:44 AdaSensor temperature: 21.8
2016-01-05_14:02:44 AdaSensor humidity: 35.8
2016-01-05_14:02:47 AdaSensor temperature: 21.8
2016-01-05_14:02:47 AdaSensor humidity: 35.9
2016-01-05_14:02:49 AdaSensor temperature: 21.8
2016-01-05_14:02:49 AdaSensor humidity: 36.0
2016-01-05_14:02:50 AdaSensor temperature: 21.8
2016-01-05_14:02:50 AdaSensor humidity: 36.0
2016-01-05_14:07:10 AdaSensor temperature: 21.8
2016-01-05_14:07:10 AdaSensor humidity: 35.6
2016-01-05_14:07:25 AdaSensor temperature: 21.8
2016-01-05_14:07:25 AdaSensor humidity: 35.9
2016-01-05_14:07:27 AdaSensor temperature: 21.8
2016-01-05_14:07:27 AdaSensor humidity: 35.9
2016-01-05_14:07:28 AdaSensor temperature: 21.8
2016-01-05_14:07:28 AdaSensor humidity: 36.0
2016-01-05_14:07:30 AdaSensor temperature: 21.8
2016-01-05_14:07:30 AdaSensor humidity: 36.0
2016-01-05_14:07:31 AdaSensor temperature: 21.8
2016-01-05_14:07:31 AdaSensor humidity: 36.0
2016-01-05_14:07:33 AdaSensor temperature: 21.8
2016-01-05_14:07:33 AdaSensor humidity: 36.0
2016-01-05_14:07:34 AdaSensor temperature: 21.8
2016-01-05_14:07:34 AdaSensor humidity: 36.0
2016-01-05_14:07:37 AdaSensor temperature: 21.8
2016-01-05_14:07:37 AdaSensor humidity: 36.0
2016-01-05_14:07:38 AdaSensor temperature: 21.8
2016-01-05_14:07:38 AdaSensor humidity: 36.0
2016-01-05_14:09:45 AdaSensor temperature: 21.8
2016-01-05_14:09:45 AdaSensor humidity: 36.0
2016-01-05_14:09:48 AdaSensor temperature: 21.8
2016-01-05_14:09:48 AdaSensor humidity: 35.9
2016-01-05_14:09:49 AdaSensor temperature: 21.8
2016-01-05_14:09:49 AdaSensor humidity: 35.8
2016-01-05_14:12:10 AdaSensor temperature: 21.7
2016-01-05_14:12:11 AdaSensor humidity: 35.8
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: klausw am 05 Januar 2016, 16:58:41
Ich habe das Ganze mal umgestrickt.
Jetzt wird nach anstoßen der Messung ein Timer gesetzt, der nach 1s sie Messwerte abholt.
So dauert der Vorgang zwar gut 2s aber dafür ist in dieser Zeit das FHEM nicht blockiert. (220ms ist schon recht lang).
Bitte testen und Berichten
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: thymjan am 05 Januar 2016, 17:06:27
@Klaus: ich hab nur "timer" gedacht, da hast Du's schon umgesetzt, super! Werd' ich nacher gleich testen.
Gruß,
Stefan
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: schami23 am 05 Januar 2016, 17:42:52
Funktioniert ohne Probleme, die Werte kommen mit 1 Sekunde abstand an.


2016.01.05 17:31:21 5: empfangen: 101 192
2016.01.05 17:31:23 5: empfangen: 84 106
2016.01.05 17:32:24 5: empfangen: 101 68
2016.01.05 17:32:25 5: empfangen: 83 110
2016.01.05 17:33:26 5: empfangen: 101 36
2016.01.05 17:33:27 5: empfangen: 81 78
2016.01.05 17:34:28 5: empfangen: 101 16
2016.01.05 17:34:29 5: empfangen: 81 126
2016.01.05 17:35:30 5: empfangen: 101 0
2016.01.05 17:35:31 5: empfangen: 82 114



2016-01-05_17:31:21 AdaSensor temperature: 23.0
2016-01-05_17:31:23 AdaSensor humidity: 35.2
2016-01-05_17:32:24 AdaSensor temperature: 22.7
2016-01-05_17:32:25 AdaSensor humidity: 34.7
2016-01-05_17:33:26 AdaSensor temperature: 22.6
2016-01-05_17:33:27 AdaSensor humidity: 33.7
2016-01-05_17:34:28 AdaSensor temperature: 22.5
2016-01-05_17:34:29 AdaSensor humidity: 33.8
2016-01-05_17:35:30 AdaSensor temperature: 22.5
2016-01-05_17:35:31 AdaSensor humidity: 34.3
2016-01-05_17:36:32 AdaSensor temperature: 22.5
2016-01-05_17:36:33 AdaSensor humidity: 33.9
2016-01-05_17:37:34 AdaSensor temperature: 22.4
2016-01-05_17:37:35 AdaSensor humidity: 34.0
2016-01-05_17:38:39 AdaSensor temperature: 22.4
2016-01-05_17:38:40 AdaSensor humidity: 34.0
2016-01-05_17:39:42 AdaSensor temperature: 22.4
2016-01-05_17:39:43 AdaSensor humidity: 33.9
2016-01-05_17:40:44 AdaSensor temperature: 22.4
2016-01-05_17:40:45 AdaSensor humidity: 33.9
2016-01-05_17:41:46 AdaSensor temperature: 22.5
2016-01-05_17:41:47 AdaSensor humidity: 33.9
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: klausw am 05 Januar 2016, 18:11:45
äh, gut 1s zwischen Temperatur und Feuchte ... aber dann sollte erstmal für den Poll Interval ruhe sein

weil ich gerade dabei bin, noch eine Version mit aktiviertem CRC Check.
Werte werden ab jetzt nur noch aktualisiert, wenn die CRC Prüfsummenberechnung gut geht.
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: schami23 am 05 Januar 2016, 20:15:54
Super arbeitet einwandfrei. :)

So werde mich jetzt dran machen, mehrere von den HTU21 an meinen FRM anzubinden.
Ich möchte sie über einen Multiplexer schalten und abfragen.

Danke
Grüße,
Jürgen
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: klausw am 06 Januar 2016, 10:27:32
So muss es sein, werde es heute Abend einchecken.
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: thymjan am 06 Januar 2016, 10:52:33
Bei  mir hier auch alles im grünen Bereich!
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: klausw am 06 Januar 2016, 11:12:43
Zitat von: thymjan am 06 Januar 2016, 10:52:33
Bei  mir hier auch alles im grünen Bereich!
Über RPII2C oder FRM?

mal was viel interessanteres ;) : welche Stellmotoren nutzt du im Keller?
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: thymjan am 06 Januar 2016, 22:21:43
Sowohl bei RPII2C und FRM-USB bis jetzt keine Fehler sichtbar, läuft gut.

Stellmotor habe ich aus Italien (http://r.ebay.com/JewXPG), leider schlimme Versandkosten. Den Antrieb habe ich jetzt knapp ein Jahr in Betrieb. Versorgungsspannung ist 24V. Steuern tu ich es mit dem Stellmotor-Modul (http://www.fhemwiki.de/wiki/STELLMOTOR) und den 2 Relais vom PiFace Digital (da tuts aber auch jede andere Relaiskarte). Dachte eigentlich, dass ich die Tasten vom PiFace auch implementiert kriege, aber die werden von FHEM nur spartanisch unterstützt. Habe zunächst was mit Lego Technik aufgebaut, das war mir dann aber zu klobig...
Der Antrieb hat 2 bzw. 3 Endschalter. Benutze aber nur einen (beim Schließen vom Fenster) als Referenz. Der Motor wird zeitgesteuert vom Stellmotor ein und ausgeschaltet. Funktioniert eigentlich zuverlässig. Gelegentlich mache ich eine Referenzfahrt (selten ca. 1x im Quartal).

Grüße,
Stefan
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: klausw am 08 Januar 2016, 11:06:13
eingecheckt
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: schami23 am 11 Januar 2016, 14:19:48
Hallo darf ich zwei Profis um einen rat fragen?

Ich hab es geschafft, dass ich mehre HTU21 abfragen kann. Ich wollte eigentlich mehrere Sensoren mit dem SHT21 Modul anlegen.
Hab aber dann bemerkt wenn ich ein readValues einleite ändert sich der Wert bei allen SHT21 Sensoren desselben IODev.
Hab jetzt mehre Dummys angelegt die jetzt mit den werten des einen SHT21 Sensors gefüttert werden.

Jetzt hab ich aber folgendes Problem, wenn ein readValues eingeleitet wird und es kommt kein wert zurück (CRC error) wird der letzte Wert des vorigen Sensors weitergegeben.

Habt ihr einen Tipp, wie ich eine Überprüfung ob ein Wert zurückkommt machen kann und falls nicht wird auch keiner weiter gegeben.

Auszug aus 99_myUtils.pm
##############################################################################
#MUX Channel
#

sub channel($) {
my ($num) = @_;
my ($Sen) = "AdaSensor1";
 
 
if ($num eq "0")
  {
  fhem("set s0 off; set s1 off; set s2 off; set s3 off; set $Sen readValues");
  }
elsif ($num eq "1")
  {
  fhem("set s0 on; set s1 off; set s2 off; set s3 off; set $Sen readValues");
  }
elsif ($num eq "2")
  {
  fhem("set s0 off; set s1 on; set s2 off; set s3 off; set $Sen readValues");
  }
elsif ($num eq "3")
  {
  fhem("set s0 on; set s1 on; set s2 off; set s3 off; set $Sen readValues");
  }
elsif ($num eq "4")
  {
  fhem("set s0 off; set s1 off; set s2 on; set s3 off; set $Sen readValues");
  }
}


sub Sensor($){

  my ($Ts) = @_;
  my ($Sen) = "AdaSensor1";
 
 
  my $val = ReadingsVal("$Sen","humidity",0);
  my $val1 = ReadingsVal("$Sen","temperature",0);
  fhem("setreading Sensor$Ts humidity $val");
  fhem("setreading Sensor$Ts temperature $val1");
  fhem("setreading Sensor$Ts state T: $val H: $val1")
   
}


und das at

+*00:05:00 {
fhem("define sensor1_1 at +00:00:05 {channel(0)}");
fhem("define sensor1_2 at +00:00:10 {Sensor(1)}");
fhem("define sensor2_1 at +00:00:15 {channel(1)}");
fhem("define sensor2_2 at +00:00:20 {Sensor(2)}");
fhem("define sensor3_1 at +00:00:25 {channel(2)}");
fhem("define sensor3_2 at +00:00:30 {Sensor(3)}");
fhem("define sensor4_1 at +00:00:35 {channel(3)}");
fhem("define sensor4_2 at +00:00:40 {Sensor(4)}")
}


Danke
Titel: Antw:Raspberry, Firmata und I2C
Beitrag von: klausw am 11 Januar 2016, 15:14:12
Zitat von: schami23 am 11 Januar 2016, 14:19:48
Ich hab es geschafft, dass ich mehre HTU21 abfragen kann. Ich wollte eigentlich mehrere Sensoren mit dem SHT21 Modul anlegen.
Hab aber dann bemerkt wenn ich ein readValues einleite ändert sich der Wert bei allen SHT21 Sensoren desselben IODev.
Jetzt, wo du es sagst, ist es logisch.
Die I2C Adresse wird genutzt, um das logische Device zu identifizieren. Daher bekommen alle Module mit der selben I2C Adresse diese Botschaft zugestellt. Macht grundsätzlich Sinn, da an einem I2C Bus jede Adresse nur 1x vorkommt.
Evtl könnte man ein Modul für den Multiplexer erstellen, das dazwischen geschaltet wird. Dieses ist das IODev für den SHT11 und nutzt selbst als IODev den FRM. Die Identifikation könnte in diesem Fall anders gelöst werden.

Zitat von: schami23 am 11 Januar 2016, 14:19:48
Jetzt hab ich aber folgendes Problem, wenn ein readValues eingeleitet wird und es kommt kein wert zurück (CRC error) wird der letzte Wert des vorigen Sensors weitergegeben.

Habt ihr einen Tipp, wie ich eine Überprüfung ob ein Wert zurückkommt machen kann und falls nicht wird auch keiner weiter gegeben.
Lese in deiner sensor Sub mit InternalVal($$$) den _SENDSTAT vom SHT21 aus. Das sollte vergleichbar zu ReadingsVal sein.
Wenn der Ok ist übernimmst du die Werte wenn nicht lässt du es.