Divoom Aurabox + Timebox + TimeboxEvo [Update, kommunizieren funktioniert]

Begonnen von schwatter, 25 Dezember 2017, 23:37:43

Vorheriges Thema - Nächstes Thema

schwatter

Mh ne, klappt so nicht. Habe auch Port von 1-6 durchgetestet.

if (0 != $socket->connect($device, 1))


Port 1 führt weiterhin zu Schleife/Stillstand.


mumpitzstuff

Eine Schleife ist in deinem Code gar nicht drin. Erscheint gar nichts auf dem Bildschirm oder kommt vom connect noch eine Antwort zurück? Was passiert wenn du nur connect/disconnect machst, ohne weitere Nachrichten?

schwatter

Auch mit connect/disconnect, ohne was zu senden, bleibe ich in der Schleife.
Hilft nur STRG+C.

if (connectDivoom('11:75:68:C9:7D:36'))
{
  #sendRaw('0104007100750002', 5);
  #sendRaw('010d004500010001000000ffffff510302', 5);
  #sendRaw('010d00450001000100000000e4ff370202', 5);
  #sendRaw('010d00450001000100000000ff05580102', 5);
  disconnectDivoom();
}



So, sniffen geht vorran.


TimeBoxEvo
################
DigitalUhrRot 010d004500010001000000000000540002
DigitalUhrGrün 010d00450001000100000000ff05580102
DigitalUhrBlau 010d0045000100010000000d00ff600102
DigitalUhrGelb 010d004500010001000000fff300460202
DigitalUhrHellblau 010d00450001000100000000e4ff370202
DigitalUhrRosa 010d004500010001000000ff00e5380202
DigitalUhrWeiß 010d004500010001000000ffffff510302
Rainbowclock 010d004500010101000000ffffff520302
Just Color 010d004501f800b8610001000000650202
Uhr 3 010d004500010201000000ffffff530302
Uhr 4 010d004500010301000000ffffff540302
Uhr 5 010d004500010401000000ffffff550302
Uhr 6 010d004500010501000000ffffff560302
StaticColorRosa 010d004501f800b8610001000000650202
StaticColorBlau 010d0045013773f5610001000000540202
StaticColorSoOrange 010d004501f67148610001000000640202
StaticColorSoGelb 010d004501d3f923610001000000a40202
StaticColorSoGrün 010d0045014ef9606100010000005c0202
StaticColorSoBlau 010d0045012f9ad16100010000004f0202
Animation1 01040045024b0002
Animation2 0105004503004d0002
Animation3 0105004503024f0002
Animation4 010500450303500002
Animation5 010500450304510002
Animation6 010500450307540002
Animation7 010500450308550002
Animation8 010500450309560002
Animation9 01050045030a570002
Animation10 01050045030b580002
Animation11 01050045030c590002
Animation12 01050045030d5a0002
Animation13 01050045030e5b0002
Animation14 01050045030f5c0002
Equalizer1 010d0045040b0000000000000000610002
Equalizer2 010d004504000000000000000000560002
Equalizer3 010d004504010000000000000000570002
Equalizer4 010d004504020000000000000000580002
Equalizer5 010d004504030000000000000000590002
Equalizer6 010d0045040400000000000000005a0002
Equalizer7 010d0045040500000000000000005b0002
Equalizer8 010d0045040600000000000000005c0002
Equalizer9 010d0045040700000000000000005d0002
Equalizer10 010d0045040800000000000000005e0002
Equalizer11 010d0045040900000000000000005f0002
Equalizer12 010d0045040a0000000000000000600002

mumpitzstuff

#138
Mit anderen Worten du bekommst keine verwertbaren Ausgaben. Verstehe ich nicht, kann aber auch nichts machen. Wenn die Bibliotheksfunktion einfach hängen bleibt, habe ich darauf keinen Einfluss.

Die Kommandos scheinen sie ja beibehalten zu haben und lediglich den Featureumfang erweitert.

schwatter

Wenn ich das einbaue

if($socket->listen(2) != 0) {
die "listen error: $!\n";
  }


Komm das

root@raspiFhem:/opt/fhem/divoom# perl tbetest.pl
Create RFCOMM client (11:75:68:C9:7D:36)...
listen error: File descriptor in bad state
root@raspiFhem:/opt/fhem/divoom#



sub connectDivoom($)
{
  my $device = shift;
  my $ret;
  my $success = 0;

  print "Create RFCOMM client ($device)...\n";

  $socket = Net::Bluetooth->newsocket("RFCOMM");
  return $success unless(defined($socket));
 
  if($socket->listen(2) != 0) {
die "listen error: $!\n";
  }

  if (0 != $socket->connect($device, 1))
  {
    $socket->close();
    return $success;
  }

  $TIMEBOX = $socket->perlfh();
 
  sysread($TIMEBOX, $ret, 256);
  if (defined($ret))
  {
    $ret =~ s/[^[:print:]]//g;
    print "Device answer: $ret";

    if ('HELLO' eq $ret)
    {
      $success = 1;
    }
    else
    {
      close($TIMEBOX);
      $socket->close();
    }
  }
 
  print "\ndone\n\n";

  return $success;
}

mumpitzstuff

Das ist klar. Erst nach einem connect kann man sich das filehandle holen. Vorher funktioniert das nicht.

schwatter

Ja ok, so deute ich das auch. Ein Beweiß, das keine Verbindung zustande kommt.
Jetzt habe ich mich an den Beispielen von hier bedient.

https://metacpan.org/source/ADDUTKO/Net-Bluetooth-0.41/samples

Wenn ich den Code so ändere,

#!/usr/bin/perl
use strict;
use warnings;
use Time::HiRes;
use Net::Bluetooth;
use IO::Select;
use Imager;

sub listDevices();
sub connectDivoom($);
sub disconnectDivoom();
sub sendRaw($$;$);

my $socket;
my $TIMEBOX;

sub listDevices()
{
  print "Search for devices...\n\n"; 

  my $device_ref = get_remote_devices();
 
  foreach my $addr (keys %$device_ref)
  {
    print "Address: $addr Name: $device_ref->{$addr}\n";
  }

  print "done\n\n";
}

sub connectDivoom($)
{
  my $device = shift;
  my $ret;
  my $success = 0;

  print "Create RFCOMM client ($device)...\n";
 
  $socket = Net::Bluetooth->newsocket("RFCOMM");
  die "Socket could not be created!" unless(defined($socket));
  print "after socket\n";
 
  if($socket ->bind(1) != 0) {
          die "bind error: $!\n";
  }

  if($socket->listen(2) != 0) {
die "listen error: $!\n";
  }

  if (0 != $socket->connect($device,1))
  {
    $socket->close();
    return $success;
  }

  $TIMEBOX = $socket->perlfh();
  sysread($TIMEBOX, $ret, 256);
  if (defined($ret))
  {
    $ret =~ s/[^[:print:]]//g;
    print "Device answer: $ret";

    if ('HELLO' eq $ret)
    {
      $success = 1;
    }
    else
    {
      close($TIMEBOX);
      $socket->close();   
    }
  }
 
  print "\ndone\n\n";

  return $success;
}

sub disconnectDivoom()
{
  close($TIMEBOX);
  $socket->close();
}

sub sendRaw($$;$)
{
  my $data = shift;
  my $timeout = shift;
  my $response = shift;
  my $ret;
  my $retry = 0;
  my $select = IO::Select->new($TIMEBOX);
 
  print "Send raw command: $data\n";

  $response = 1 if (!defined($response));

  $data =~ s/((?:[0-9a-fA-F]{2})+)/pack('H*', $1)/ge;
 
  do
  {
    syswrite($TIMEBOX, $data);

    if ($select->can_read(0.1))
    {
      sysread($TIMEBOX, $ret, 256);
      if (defined($ret))
      {
        $ret = unpack('(H2)*', $ret);
        print "Device answer: $ret\n";
      }
    }
   
    $retry++;
  } while (($response) && ($retry <= 3) && (!defined($ret) || '01' ne $ret));

  if ($retry > 3)
  {
    print "Failed!\n";
  }
  else
  {
    Time::HiRes::sleep($timeout);
  }

  print "done\n\n";
}

if (connectDivoom('11:75:68:C9:7D:36'))
{
  sendRaw('010d0045000100010000000d00ff600102', 5);
  sendRaw('010d004500010101000000ffffff520302', 5);
  sendRaw('010d004501f800b8610001000000650202', 5);
  sendRaw('010d004501f67148610001000000640202', 5);
  disconnectDivoom();
}


Bekomme ich folgende Ausgabe,

root@raspiFhem:/opt/fhem/divoom# perl tbetest.pl
Create RFCOMM client (11:75:68:C9:7D:36)...
after socket
bind error: Address already in use
root@raspiFhem:/opt/fhem/divoom#


Welches dann dahin deutet,

https://hea-www.harvard.edu/~fine/Tech/addrinuse.html


edit:

Oder habe ich Client und Server vermischt?

edit2:

Ok, ja. Das ist Serverseitig nicht Clientseitig...

if($socket ->bind(1) != 0) {
          die "bind error: $!\n";
  }


edit3:

Könnte es vielleicht an dem Sed-Kommando liegen?
Führe ich das Script aus, hängt es ja. Drück ich an der Box auf weiter,
so das die nächste Funktion geschaltet wird, kommt eine Antwort. Die
sehen dann zum Beispiel so aus,

root@raspiFhem:/opt/fhem/divoom# perl tbetest.pl
Create RFCOMM client (11:75:68:C9:7D:36)...
Device answer: FUaa(
done

root@raspiFhem:/opt/fhem/divoom# perl tbetest.pl
Create RFCOMM client (11:75:68:C9:7D:36)...
Device answer: FUaa*
done

root@raspiFhem:/opt/fhem/divoom# perl tbetest.pl
Create RFCOMM client (11:75:68:C9:7D:36)...
Device answer: FUaa+
done

root@raspiFhem:/opt/fhem/divoom# perl tbetest.pl
Create RFCOMM client (11:75:68:C9:7D:36)...
Device answer: FUaa
done

root@raspiFhem:/opt/fhem/divoom# perl tbetest.pl
Create RFCOMM client (11:75:68:C9:7D:36)...
Device answer: FUaa"
done

root@raspiFhem:/opt/fhem/divoom# perl tbetest.pl
Create RFCOMM client (11:75:68:C9:7D:36)...
Device answer: FUaa&
done

root@raspiFhem:/opt/fhem/divoom# perl tbetest.pl
Create RFCOMM client (11:75:68:C9:7D:36)...
Device answer: FUaa(
done

root@raspiFhem:/opt/fhem/divoom# root@raspiFhem:/opt/fhem/divoom# perl tbetest.pl
done

root@raspiFhem:/opt/fhem/divoom# perl tbetest.pl
Create RFCOMM client (11:75:68:C9:7D:36)...
Device answer: FUaa*
done

root@raspiFhem:/opt/fhem/divoom# perl tbetest.pl
-bash: root@raspiFhem:/opt/fhem/divoom#: Datei oder Verzeichnis nicht gefunden
Create RFCOMM client (11:75:68:C9:7D:36)...
Device answer: FUaa+
done


mumpitzstuff

Client Server hast du verwechselt. Ich glaube auch das bringt nichts mehr. Man müsste vermutlich eine Verbindung auf andere Art und Weise aufbauen. Die Bibliothek ist schon sehr alt und wird nicht mehr gepflegt. Vermutlich ist da ein Bug drin. Ich muss mal gucken ob ich da was hin bekomme. Kann aber dauern, ich bin momentan nicht sonderlich motiviert da viel Energie rein zu stecken, da ich das auch gar nicht testen könnte. Dafür bräuchte ich selbst so eine Box.
Die Befehle müsste man auch komplett neu sniffen, die scheinen alle erweitert worden zu sein.

schwatter

Ja...die Bibliothek ist wirklich alt  :(

Und noch ein anderer Versuch etwas aus der Box zu quetschen. Beim connect per gatttool
bekam ich doch promt eine Antwort.

root@raspberrypi:/opt/fhem/divoom1# sudo gatttool -b 11:75:68:C9:7D:36 -I
[11:75:68:C9:7D:36][LE]> connect
Attempting to connect to 11:75:68:C9:7D:36
Connection successful
Notification handle = 0x001e value: 01 06 00 04 36 55 00 95 00 02 00 00 00 00 00 00 00 00 00 00

schwatter

Und, ein kleiner Erfolg.

Wenn ich Equal zu Equal setze hängt er. Switche ich durch an der Box zu einer passenden Funktion,
fängt das Perlscript an zu arbeiten.

$TIMEBOX = $socket->perlfh();
  sysread($TIMEBOX, $ret, 256);
  if (defined($ret))
  {
    $ret =~ s/[^[:print:]]//g;
    print "Device answer: $ret";

    if ($ret eq $ret)
    {
      $success = 1;
    }
    else
    {
      close($TIMEBOX);
      $socket->close();   
    }
  }
 
  print "\ndone\n\n";

  return $success;
}

sub disconnectDivoom()
{
  close($TIMEBOX);
  $socket->close();
}


root@raspberrypi:/opt/fhem/divoom# perl tbetest.pl
Create RFCOMM client (11:75:68:C9:7D:36)...
Device answer: FUaa0
done

Send raw command: 010d0045000100010000000d00ff600102
Device answer: 01
done

Send raw command: 010d004500010101000000ffffff520302
Device answer: 01
done

Send raw command: 010d004501f800b8610001000000650202
Device answer: 01
done

Send raw command: 010d004501f67148610001000000640202
Device answer: 01
done

root@raspberrypi:/opt/fhem/divoom#

schwatter

So kastriert kann ich es genauso anstoßen, einmal Button der Box drücken und es läuft.

$TIMEBOX = $socket->perlfh();
  sysread($TIMEBOX, $ret, 256);
  $ret =~ s/[^[:print:]]//g;
  print "Device answer: $ret";


grrrrrrr

mumpitzstuff

Ich glaube ich habs jetzt. Das ganze Geheimnis scheint zu sein, das die Box kein HELLO mehr schickt. Erst wenn du einen Button drückst sendet die Box was und du kommst über das sysread drüber. Ansonsten bleibt das Ding darin hängen weil einfach keine Zeichen kommen. Ich bau dir was zusammen, das wäre einfach zu beheben.

schwatter

So, zu sysread() belesen.

Erstmal Quick and Dirty,

sysread($TIMEBOX, $ret, 0);
  if (defined($ret))
  {
    $ret =~ s/[^[:print:]]//g;
    print "Device answer: $ret";

    if ($ret eq $ret)
    {
      $success = 1;
    }
    else
    {
      close($TIMEBOX);
      $socket->close();
    }
  }
 
  print "\ndone\n\n";

  return $success;
}



Script läuft nu.

Create RFCOMM client (11:75:68:C9:7D:36)...
Device answer: Send raw command: 010d0045000100010000000d00ff600102
No answer from device!
Device answer: 01
done

Send raw command: 010d004500010101000000ffffff520302
Device answer: 01
done

Send raw command: 010d004501f800b8610001000000650202
Device answer: 01
done

Send raw command: 010d004501f67148610001000000640202
Device answer: 01
done

root@raspberrypi:/opt/fhem/divoom#

mumpitzstuff

Ja. Ich baue es ein, nur etwas eleganter. Ich checke es dann auf github ein.

schwatter

Ok super.

So, ersten Thread mal etwas angepasst und mehr Infos hinzugefügt.