Hallo,
vorweg Danke für FHEM!
Durch die Dokus (Commandref, Forum, Wiki, etc) bin ich doch weit gekommen, aber nun stehe ich vor einem Problem bei dem ich glaube nicht genau zu wissen was ich suchen muss und nun schon fast zwei Tage mit Try-Error verbracht habe...
Ich kommuniziere über RPII2C mit einem Arduino mit Standrdfirmata. D.h. ich habe ein Sketch geschrieben, das auf Anfrage einen Testwert über I2C zurückgibt.
Das Modul RPII2C läuft und kommuniziert mit meinem Arduino, also ein
get I2C read 04
ergibt einen Eintrag im Logfile in der Form (TEST_VAL ist nummerischer Wert)
received : TEST_VAL | transmission: Ok
Eine zyklische Abfrage mit at funktioniert ebenso.
Nun stehe ich aber an: Wie kann ich TEST_VAL weiterverarbeiten?!? Im Detail, TEST_VAL sei ein Messwert, den ich über den i2cBus schicke. In welcher Form auch immer, weiß ich nun nicht wo ansetzen um
TEST_VAL ggf. zu modifizieren
TEST_VAL in ein Dummy zu schreiben
Nach einigen Versuchen und unverstandenen Forumsdiskussionen vermute ich den Weg über 99_myUtils.pm, doch leider habe ich weder im wiki, noch im forum, usf. einen Ansatz gefunden, der mir weitergeholfen hätte...
Die Bsp.-Perlskripte setzen leider immer irgendwo an, sodass ich mir schwer tue sie nachzuvollziehen. Um den Post nicht noch länger werden zu lassen spare ich mit Details was ich versucht habe, weil ich auch nicht weiß was wichtig ist...
Kurz: Wie kann ich TEST_VAL als "Reading" (des Dummys, des at-Befehls,...) verwenden?
Hi,
das set und get im RPII2C Modul hatte ich eher als Spielerei zum testen eingebaut.
Der beste Weg ist, ein Modul zu schreiben, welches über RPII2C auf Deine Hardware zugreift.
Es geht natürlich auch über einen Dummy.
Dazu muss in notify des Dummy etwa folgendes stehen:
my $test = fhem "get <RPII2C-Device-Name> read <I2C Addr>";
$test = substr($test,10,length($test)-29);
fhem "setreading <Dummy-Device-Name> state $test";
Anstelle von state kannst Du auch andere Readings nehmen.
Es lassen sich auch mehrere Byte gleichzeitig holen. Dazu müsstest du diese dann z.B. mit my @array=split(/ /,$test); auseinandernehmen und weiterverarbeiten.
Hallo klausw!
Danke! Hat etwas Gefluche gekostet, war aber sehr lehrreich und es funktioniert. Zudem Danke für die Hinweise, sie haben mich bzgl. FHEM ein paar Schritte weitergebracht.
Sry für die späte Antwort, ging aber nicht früher. Wenn gewünscht bastle ich noch ein wenig und stelle dann übersichtsweise meine Lösung hier rein, wie ich über I2C mit dem Arduino kommuniziere. Sonst kann man das Thema auch schließen.
Dass man mehrere Bytes einlesen kann habe ich bereits irgendwo gelesen und werde es sicher noch probieren. In diesem Fall möchte ich mir aber die Möglichkeit frei halten, unterschiedliche Register im Arduino (versch. Werte) durch ein notify zeitgesteuert abzufragen.
Bspw: Vorlauftemperatur der Heizung. Solange der Brenner nicht läuft, brauche ich keine große Auflösung. Sbald er aber anspringt kann ich sie mit höherer Auflösung abfragen...
Aber bis dahin... ;-)
Hallo,
vielleicht hilft es dir auch nichts (aber ich mach es zumindest perfekt kompliziert - aber es klappt und ich hatte noch keinen Bedarf es zu ändern).
Ein at triggert ein notify das seinerseits eine sub in der 99_myUtils.pm aufruft das meine LM75-Sensoren abfragt.
Das at:
+*00:03:00 {
fhem ("set Sensor_I2C 0x48");
fhem ("define at_I2C_messen2 at +00:00:10 set Sensor_I2C 0x49");
fhem ("define at_I2C_messen3 at +00:00:20 set Sensor_I2C 0x4c");
}
Das notify:
Sensor_I2C {
my $temp = messen("@");
my ($sensor, $temp_sensor) = split /\ /, "$temp", 2;
my ($sensor_temp, $zeichen) = split /\ /, "$temp_sensor", 2;
if ($sensor eq "0x48") {
$sensor = "Brauchwasser_Zulauf";
}
if ($sensor eq "0x49") {
$sensor = "Brauchwasser_Vorlauf1";
}
if ($sensor eq "0x4c") {
$sensor = "Brauchwasser_Vorlauf2";
}
$zeichen = " °C";
fhem("set $sensor $sensor_temp $zeichen");
}
Die sub in der 99_myUtils.pm:
sub messen($) {
my ($name) = @_;
my ($sensor) = (Value($name));
my ($befehl) = "sudo i2cget -y 1 ".$sensor." 0x00 w &";
my ($result) = `$befehl`;
my ($wert_hex_nk) = substr($result,2,2);
my ($wert_hex_vk) = substr($result,4,2);
my ($wert_dez_vk) = hex($wert_hex_vk);
my ($wert_dez_nk) = hex($wert_hex_nk);
if ($wert_dez_nk > 128) {
$wert_dez_nk = ".5";
}
else {
$wert_dez_nk = ".0";
}
my ($temperatur) = $wert_dez_vk.$wert_dez_nk." °C";
my ($Sensorwert) = $sensor." ".$temperatur;
return "$Sensorwert";
}
Wie gesagt - kompliziert, ich weiß nicht ob es noch komplizierter geht aber es geht definitiv einfacher.
Aber da das ganze auf einem RasPi läuft und die Daten per FHEM2FHEM überträgt und der RasPi sonst nur noch die Kapazität der Internetverbindung prüft hatte ich noch nie wirklich Bedarf das ganze zu optimieren.
Vielleicht kannst du ja für dich was ableiten davon, und wenn es nur die Erkenntniss ist - so mach ich es nicht 8)
Grüße
Zitat von: suedi am 15 November 2014, 20:44:53
Wenn gewünscht bastle ich noch ein wenig und stelle dann übersichtsweise meine Lösung hier rein, wie ich über I2C mit dem Arduino kommuniziere. Sonst kann man das Thema auch schließen.
Beispiele sind immer gut
Also her damit :)