Hallo zusammen,
hier wiedermal das Thema Ermittlung des Wasserstandes einer Zisterne.
Ich habe mir schon diverse Anleitungen angesehen, aber irgendwie ist für mich das passende nicht dabei gewesen (oder ich hab's einfach nicht gefunden).
Im Keller werkelt ein RPi mit FHEM, der über KNX/I2C Komponenten die Hausautomation übernimmt. An den Pi will ich einen Arduino mit Firmata per USB anschliessen, der kabelgebunden den Füllstand der Zisterne ermittelt, die Gasuhr und den Wasserzähler über S0 ausliest.
Rausgefunden habe ich, dass die Anbindung von Ultraschallsensoren über Firmata nicht "einfach so" funktioniert. Für Snap4Arduino gibt es eine modifizierte Firmata Version, die scheinbar ein neues sysex command implementiert:
[...]
case 0x08: //Get the distance
Serial.write(START_SYSEX);
Serial.write(STRING_DATA);
pinMode(9,OUTPUT);
pinMode(8,INPUT);
Serial.println(ultrasonic.Ranging(CM)); //ultrasonic.Ranging(CM)
Serial.write(END_SYSEX);
[...]
In dem Beispielprogramm für Snap4Arduino sieht die Abfrage so aus:
this.arduino.board.sp.write(new Buffer([0xF0, 0x08, 0xF7]));
0xF0 => Start
0x08 => Wert abfragen
0xF7 => Ende
Was müsste ich in FHEM tun, damit die Werte nutzbar werden?
Vielen Dank für eure Hilfe!
Hallo zusammen,
habe mir jetzt mal das Firmata Perl Modul angesehen. Da ist ein interessantes Bsp. für die Anbindung eines DHT11 Sensors dabei.
Das habe ich geändert, um die Werte erstmal per Perl Programm aus dem Arduino rauszubekommen. Irgendwie funktioniert das aber auch noch nicht
#!/usr/bin/perl
use strict;
use warnings;
use Device::Firmata::Constants qw/ :all /;
use Device::Firmata;
use constant US_CMD => 0x08;
$Device::Firmata::DEBUG = 1;
my $device = Device::Firmata->open('/dev/ttyUSB0')
or die "Could not connect to Firmata Server";
$device->observe_sysex( \&onSysexMessage, undef );
$device->observe_string( \&onStringMessage, undef );
$device->sampling_interval(1000);
$device->sysex_send( US_CMD );
sub onSysexMessage {
my $sysex_message = shift;
my $command = $sysex_message->{command};
my $data = $sysex_message->{data};
print "command: $command\n";
print "data: $data\n";
}
sub onStringMessage {
my $string = shift;
print "string: $string\n";
}
Als Ergebnis kommt
>f0,79,f7
>f0,79,f7
>f0,79,f7
>f0,79,f7
>f0,79,f7
>f0,79,f7
>f0,79,f7
>f0,79,f7
>f0,79,f7
>f0,79,f7
>f0,79,f7
>f0,79,f7
>f0,7a,68,07,f7
>f0,f0,f7
>f0,08,f7
>f0,f7,f7
Ich hätte erwartet, dass eine von den on* Funktionen aufgerufen wird. Alles noch sehr komisch... :(