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

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

Vorheriges Thema - Nächstes Thema

mumpitzstuff

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

sub listDevices();
sub connectDivoom($);
sub disconnectDivoom();
sub sendRaw($$);
sub sendPlain($$);
sub convertRawToPlain($);
sub convertImageTB($;$);
sub convertImageAB($;$);

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");
  return $success unless(defined($socket));
 
  if (0 != $socket->connect($device, 4))
  {
    $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 $ret;
  my $retry = 0;
  my $select = IO::Select->new($TIMEBOX);
 
  print "Send raw command: $data\n";

  $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);
        $ret =~ s/[^[:print:]]+//g;
        print "Device answer: $ret";
      }
    }

    $retry++;
  } while (($retry <= 3) && (!defined($ret) || '01' ne $ret));

  if ($retry > 3)
  {
    print "Failed!";
  }
  else
  {
    sleep($timeout);
  }

  print "\ndone\n\n";
}

sub sendPlain($$)
{
  my $data = shift;
  my $timeout = shift;
  my $crc = 0;
  my $ret;
  my $retry = 0;

  print "Send plain command: $data\n";

  # add length (length of data + length of checksum)
  $_ = (length($data) + 4) / 2;
  $data = sprintf("%02x", ($_ & 0xFF)).sprintf("%02x", (($_ >> 8) & 0xFF)).$data;

  # calculate crc
  while ($data =~ /(..)/g)
  {
    $crc += hex($1);
  }

  # add crc
  $data .= sprintf("%02x", ($crc & 0xFF)).sprintf("%02x", (($crc >> 8) & 0xFF)); 

  # escape data
  $data =~ s/(01|02|03)(?{ if (0 == ($-[0] & 1)) {'030'.(3+$1)} else {$1} })/$^R/g;

  # add prefix and postfix
  $data = '01'.$data.'02';

  print "Generated raw command: $data\n";

  sendRaw($data, $timeout);
}

sub convertRawToPlain($)
{
  my $data = shift;

  print $data."\n";

  # remove prefix and postfix
  $data = substr($data, 2, -2);

  # unescape data
  $data =~ s/(03(04|05|06))(?{ if (0 == ($-[0] & 1)) {'0'.($2-3)} else {$1} })/$^R/g;
 
  #remove length
  $data = substr($data, 4);

  # remove checksum
  $data = substr($data, 0, -4);

  print $data."\n";

  return $data;
}

sub convertImageTB($;$)
{
  my $file = shift;
  my $size = shift;
  my @imgData = (0);
  my $image = Imager->new;
 
  $size = 11 if (!defined($size));
  $image->read(file=>$file);
 
  if (!$@)
  {
    my ($r, $g, $b, $a);
    my $flicflac = 0;   
    my $imageResized = $image->scaleX(pixels=>$size)->scaleY(pixels=>$size);

    for (my $y = 0; $y < $size; $y++)
    {
      for (my $x = 0; $x < $size; $x++)
      {
        ($r, $g, $b, $a) = $imageResized->getpixel(x=>$x, y=>$y)->rgba();
       
        if (0 == $flicflac)
        {
          if ($a > 32)
          {
            $imgData[-1] = (($r & 0xF0) >> 4) + ($g & 0xF0);
            push(@imgData, (($b & 0xF0) >> 4));
          }
          else
          {
            $imgData[-1] = 0;
            push(@imgData, 0);
          }

          $flicflac = 1;
        }
        else
        {
          if ($a > 32)
          {
            $imgData[-1] += ($r & 0xF0);
            push(@imgData, (($g & 0xF0) >> 4) + ($b & 0xF0));
          }
          else
          {
            $imgData[-1] += 0;
            push(@imgData, 0);
          }
          push(@imgData, 0);

          $flicflac = 0;
        }
      }
    }
  }

  $_ = '';
  foreach my $byte (@imgData)
  {
    $_ .= sprintf("%02x", ($byte & 0xFF));
  }

  return $_;
}

sub convertImageAB($;$)
{
  my $file = shift;
  my $size = shift;
  my @imgData = ();
  my $image = Imager->new;
  my @color = (0, 1, 2, 11, 4, 5, 2, 5, 8, 1, 2, 3, 4, 13, 6, 7);

  $size = 10;# if (!defined($size));
  $image->read(file=>$file);

  #print $image->maxcolors."\n";
  #print $image->getcolorcount()."\n";

  if (!$@ && ($image->getcolorcount() <= 16))
  {
    my $flicflac = 0;
    #my $imageResized = $image->scaleX(pixels=>$size)->scaleY(pixels=>$size);

    for (my $y = 0; $y < $size; $y++)
    {
      for (my $x = 0; $x < $size; $x++)
      {
        my $index = $image->findcolor(color=>$image->getpixel(x=>$x, y=>$y));
        $index = 15 if ($index > 15);
               
        if (0 == $flicflac)
        {
          push(@imgData, $color[$index]);

          $flicflac = 1;
        }
        else
        {
          $imgData[-1] += ($color[$index] << 4);

          $flicflac = 0;
        }
      }
    }
  }

  $_ = '';
  foreach my $byte (@imgData)
  {
    $_ .= sprintf("%02x", ($byte & 0xFF));
  }

  return $_;
}


Hier habe ich das Mapping der Farbwerte übernommen, das man auch in dem Python Modul findet. Ich hoffe ich habe keinen Schreibfehler drin. Kannst du das mal bitte ausprobieren. Wenn was nicht geht, dann bäuchte ich das Bild + die Koordinaten x und y, an denen was nicht stimmt (Farbe die angezeigt wird und Farbe die du erwarten würdest).

schwatter

#46
Die Farbwerte sind meiner Meinung nach gleich falsch. Ok, heut Abend hab ich Zeit und setz mich an die Koordinaten.

edit:

Wenn ich mal nicht zurück auf Uhr,Temp oder Co. schalte, bleibt das letzte Bild im Buffer :) Wunderbar um ein Infografik
zu halten.

mumpitzstuff

Als Vergleich müsstest du aber ein originales Bild von hier nehmen: https://github.com/derHeinz/divoom-adapter. Wenn du ein eigenes Bild verwendest, dann stimmt da die Palette nicht.

Du müsstest also mit dem Python Script z.B. das example.bmp laden und dir die Farben ansehen, Dann über das Perl Script das selbe Bild laden und die Farben vergleichen.

schwatter

#48
Jetzt nochmal mit dem example.bmp getestet. Deine Farben passen besser als die von derHeinz. Bei ihm wird das
Grau zum Lila. Bei dir das Grau zu einer Art von Grau. Der Rest ist soweit ok.

edit:

Das klingt komisch, wie ich das geschrieben habe. Also nochmal.

Dein Automapping funktioniert besser als das manuelle Mapping.

edit2:

Nachdem ich die richtigen Farbwerte genommen habe, passt auch die Ausgabe.


Rot = [Rot:255,Grün:0,Blau:0]
Grün = [Rot:0,Grün:255,Blau:0]
Blau = [Rot:0,Grün:0,Blau:255]
Gelb = [Rot:255,Grün:255,Blau:0]
Schwarz = [Rot:0,Grün:0,Blau:0]
Weiß = [Rot:255,Grün:255,Blau:255]
Pink = [Rot:255,Grün:0,Blau:255]
Türkis = [Rot:0,Grün:255,Blau:255]

mumpitzstuff

derHeinz verwendet das bmp black.bmp als Basis bzw die Palette von diesem Bild. Ich habe sie mir nicht genau angesehen, aber man sollte die ersten 16 Farben nutzen können, da ein Pixel bei der Aurabox durch 4bit repräsentiert wird, also 16 Werte annehmen kann.

Ich fange jetzt erst mal damit an den Traffic der App zu sniffen und verschiedene Befehle zusammen zu stellen. Danach wollte ich noch Bilder bzw. Text scrollen lassen können. Die Kommandos könntest du vielleicht mit Dingen ergänzen, die nur auf der Aurabox funktionieren.

schwatter

#50
Hört sich gut an.
Ich versuche gerade das Script mit Bildsupport aus Fhem zu starten.
Klappt irgendwie nicht, läuft in der Konsole aber sauber durch.


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

sub listDevices();
sub connectDivoom($);
sub disconnectDivoom();
sub sendRaw($$);
sub sendPlain($$);
sub convertRawToPlain($);
sub convertImageTB($;$);
sub convertImageAB($;$);

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");
  return $success unless(defined($socket));
 
  if (0 != $socket->connect($device, 4))
  {
    $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 $ret;
  my $retry = 0;
  my $select = IO::Select->new($TIMEBOX);
 
  print "Send raw command: $data\n";

  $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);
        $ret =~ s/[^[:print:]]+//g;
        print "Device answer: $ret";
      }
    }

    $retry++;
  } while (($retry <= 3) && (!defined($ret) || '01' ne $ret));

  if ($retry > 3)
  {
    print "Failed!";
  }
  else
  {
    sleep($timeout);
  }

  print "\ndone\n\n";
}

sub sendPlain($$)
{
  my $data = shift;
  my $timeout = shift;
  my $crc = 0;
  my $ret;
  my $retry = 0;

  print "Send plain command: $data\n";

  # add length (length of data + length of checksum)
  $_ = (length($data) + 4) / 2;
  $data = sprintf("%02x", ($_ & 0xFF)).sprintf("%02x", (($_ >> 8) & 0xFF)).$data;

  # calculate crc
  while ($data =~ /(..)/g)
  {
    $crc += hex($1);
  }

  # add crc
  $data .= sprintf("%02x", ($crc & 0xFF)).sprintf("%02x", (($crc >> 8) & 0xFF)); 

  # escape data
  $data =~ s/(01|02|03)(?{ if (0 == ($-[0] & 1)) {'030'.(3+$1)} else {$1} })/$^R/g;

  # add prefix and postfix
  $data = '01'.$data.'02';

  print "Generated raw command: $data\n";

  sendRaw($data, $timeout);
}

sub convertRawToPlain($)
{
  my $data = shift;

  print $data."\n";

  # remove prefix and postfix
  $data = substr($data, 2, -2);

  # unescape data
  $data =~ s/(03(04|05|06))(?{ if (0 == ($-[0] & 1)) {'0'.($2-3)} else {$1} })/$^R/g;
 
  #remove length
  $data = substr($data, 4);

  # remove checksum
  $data = substr($data, 0, -4);

  print $data."\n";

  return $data;
}

# sub convertImageTB($;$)
# {
  # my $file = shift;
  # my $size = shift;
  # my @imgData = (0);
  # my $image = Imager->new;
 
  # $size = 11 if (!defined($size));
  # $image->read(file=>$file);
 
  # if (!$@)
  # {
    # my ($r, $g, $b, $a);
    # my $flicflac = 0;   
    # my $imageResized = $image->scaleX(pixels=>$size)->scaleY(pixels=>$size);

    # for (my $y = 0; $y < $size; $y++)
    # {
      # for (my $x = 0; $x < $size; $x++)
      # {
        # ($r, $g, $b, $a) = $imageResized->getpixel(x=>$x, y=>$y)->rgba();
       
        # if (0 == $flicflac)
        # {
          # if ($a > 32)
          # {
            # $imgData[-1] = (($r & 0xF0) >> 4) + ($g & 0xF0);
            # push(@imgData, (($b & 0xF0) >> 4));
          # }
          # else
          # {
            # $imgData[-1] = 0;
            # push(@imgData, 0);
          # }

          # $flicflac = 1;
        # }
        # else
        # {
          # if ($a > 32)
          # {
            # $imgData[-1] += ($r & 0xF0);
            # push(@imgData, (($g & 0xF0) >> 4) + ($b & 0xF0));
          # }
          # else
          # {
            # $imgData[-1] += 0;
            # push(@imgData, 0);
          # }
          # push(@imgData, 0);

          # $flicflac = 0;
        # }
      # }
    # }
  # }

  # $_ = '';
  # foreach my $byte (@imgData)
  # {
    # $_ .= sprintf("%02x", ($byte & 0xFF));
  # }

  # return $_;
# }

sub convertImageAB($;$)
{
  my $file = shift;
  my $size = shift;
  my @imgData = ();
  my $image = Imager->new;
  #my %color = {0 => 0, 1 => 1, 2 => 2, 3 => 11, 5 => 5, 6 => 2, 7 => 5, 9 => 1, 10 => 2, 11 => 3, 12 => 4, 14 => 6, 15 => 7};

  $size = 10;# if (!defined($size));
  $image->read(file=>$file);

  if (!$@)
  {
    my $flicflac = 0;
    #my $imageResized = $image->scaleX(pixels=>$size)->scaleY(pixels=>$size);

    for (my $y = 0; $y < $size; $y++)
    {
      for (my $x = 0; $x < $size; $x++)
      {
        if (0 == $flicflac)
        {
          push(@imgData, $image->findcolor(color=>$image->getpixel(x=>$x, y=>$y)));

          $flicflac = 1;
        }
        else
        {
          $imgData[-1] += ($image->findcolor(color=>$image->getpixel(x=>$x, y=>$y)) << 4);

          $flicflac = 0;
        }
      }
    }
  }

  $_ = '';
  foreach my $byte (@imgData)
  {
    $_ .= sprintf("%02x", ($byte & 0xFF));
  }

  return $_;
}

my $feuer = convertImageAB('feuer.bmp', 10);
my $black = convertImageAB('black.bmp', 10);

if (connectDivoom('11:75:58:45:59:81'))
{
  sendPlain('44000A0A04'.$feuer, 1);
  sendPlain('44000A0A04'.$black, 1);
  sendPlain('44000A0A04'.$feuer, 1);
  sendPlain('44000A0A04'.$black, 1);
  sendPlain('44000A0A04'.$feuer, 1);
  sendPlain('44000A0A04'.$black, 1);
  sendPlain('44000A0A04'.$feuer, 1);
  sendPlain('44000A0A04'.$black, 1);
  sendPlain('44000A0A04'.$feuer, 1);
  sendPlain('44000A0A04'.$black, 1);
  sendPlain('44000A0A04'.$feuer, 1);
  sendPlain('44000A0A04'.$black, 1);
  sendPlain('44000A0A04'.$feuer, 1);
  sendPlain('44000A0A04'.$black, 1);
  sendPlain('44000A0A04'.$feuer, 1);
  sendPlain('44000A0A04'.$black, 1);
  sendPlain('4500', 1);
  disconnectDivoom();
}



Aufruf in Fhem, welcher nicht klappt.


{system("sudo perl /opt/fhem/divoom/Feuer.pl")}

mumpitzstuff

Gehört das verwendete Bild der richtigen Gruppe an? Stichwort chown. Der Pfad muss ebenfalls diese Rechte besitzen. Ansonsten gib dem Bild mal die Rechte 777 und Probier mal ob es damit geht. Wenn was auf der Console geht und in Fhem nicht, dann ist es meist ein Rechteproblem.
Wenn du das von der Fhem Kommandozeile aus startest, dann müsstest du auch die Ausgaben sehen. Vielleicht steht da ja irgendwas.

schwatter

Ordner, sowie Bild und Script sind alle in der Gruppe Root sowie Eigentümer Fhem. Rechte alle auf 777. Keine Ahnung warum es
nicht funktioniert.

mumpitzstuff

#53
setz mal alles auf fhem:dialup mit:

sudo chown fhem: .*

Was passiert denn wenn du das Script in der Fhem Console ausführst? Kommt da keine Ausgabe/Fehler oder irgendwas?

schwatter

#54
Die 3 Files, auf die es ankommt haben fhem:dialout


root@raspiFhem:/opt/fhem/divoom# groups feuer.pl
groups: ,,feuer.pl": Einen solchen Benutzer gibt es nicht
root@raspiFhem:/opt/fhem/divoom# ls -l /opt/fhem/divoom
insgesamt 128
-rwxrwxrwx 1 fhem dialout  198 Okt  2 23:01 black.bmp
-rw-r--r-- 1 root root     114 Sep 27 23:38 Countdown.pl
-rw-r--r-- 1 root root     116 Sep 27 23:39 DisplayBright.pl
-rw-r--r-- 1 root root     114 Sep 27 23:39 DisplayDark.pl
-rw-r--r-- 1 root root     115 Okt  2 22:54 DisplayOff.pl
-rw-r--r-- 1 root root    5488 Okt  2 23:28 divoom.pl
drwxr-xr-x 5 root root    4096 Okt  1 16:14 divoomtest
-rwxr-xr-x 1 root root     117 Okt  2 23:42 Equalizer.pl
-rw-r--r-- 1 root root     266 Mär 17  2018 example7.bmp
-rw-r--r-- 1 root root     266 Mär 17  2018 example8.bmp
-rw-r--r-- 1 root root     266 Mär 17  2018 example9.bmp
-rwxr-xr-x 1 root root     378 Sep 27 23:41 ExampleAni.pl
-rw-r--r-- 1 root root     198 Okt  2 22:11 example.bmp
-rwxrwxrwx 1 fhem dialout  198 Okt  2 22:56 feuer.bmp
-rwxrwxrwx 1 fhem dialout 6172 Okt  2 23:38 Feuer.pl
-rw-r--r-- 1 root root     266 Mär 17  2018 firework1.bmp
-rw-r--r-- 1 root root     266 Mär 17  2018 firework2.bmp
-rw-r--r-- 1 root root     266 Mär 17  2018 firework3.bmp
-rw-r--r-- 1 root root     266 Mär 17  2018 firework4.bmp
-rw-r--r-- 1 root root     266 Mär 17  2018 firework5.bmp
-rw-r--r-- 1 root root     266 Mär 17  2018 firework6.bmp
-rw-r--r-- 1 root root     266 Mär 17  2018 firework7.bmp
-rw-r--r-- 1 root root     266 Mär 17  2018 firework8.bmp
-rw-r--r-- 1 root root    2793 Sep 27 23:37 lib.pl
-rw-r--r-- 1 root root     116 Sep 27 23:40 OnlyColor.pl
-rw-r--r-- 1 root root     114 Sep 27 23:40 Pixelanimation.pl
-rw-r--r-- 1 root root     114 Sep 27 23:40 SpinningTriangle.pl
-rw-r--r-- 1 root root     108 Sep 28 00:12 Temp.pl
-rw-r--r-- 1 root root     114 Sep 27 23:40 Time.pl
-rw-r--r-- 1 root root     114 Sep 27 23:40 WalkingTriangle.pl
root@raspiFhem:/opt/fhem/divoom#


Führe ich das Script in der Fhemconsole aus, kommt "-1". Aber das kommt auch bei den anderen Scripts, die funktionieren.

edit:

Ich habe jetzt mal systematisch im Script gelöscht.

1. Alles was TB betrifft. Aber das ist ja klar.
2. sendPlain('44000A0A04'.$example, 5);
3. my $example = convertImageAB('example.bmp', 10);

Nach Nummer 3 lief das Script in Fhem durch. Hängt also mit dem Pictureconverter zusammen.

mumpitzstuff

#55
example.bmp hat die Rechte root:root und nicht fhem:dialout.

Nimm mal feuer.bmp, das hätte die richtigen Rechte gesetzt.

schwatter

Stimmt! Habe es jetzt geändert, aber...keine Besserung.

mumpitzstuff


schwatter

#58
Habe ich, hier nochmal die Übersicht

root@raspiFhem:/opt/fhem/divoom# ls -l /opt/fhem/divoom
insgesamt 128
-rw-r--r-- 1 root root     198 Okt  2 23:01 black.bmp
-rw-r--r-- 1 root root     114 Sep 27 23:38 Countdown.pl
-rw-r--r-- 1 root root     116 Sep 27 23:39 DisplayBright.pl
-rw-r--r-- 1 root root     114 Sep 27 23:39 DisplayDark.pl
-rw-r--r-- 1 root root     115 Okt  2 22:54 DisplayOff.pl
-rw-r--r-- 1 root root    5397 Okt  3 20:26 divoom.pl
drwxr-xr-x 5 root root    4096 Okt  1 16:14 divoomtest
-rwxr-xr-x 1 root root     117 Okt  2 23:42 Equalizer.pl
-rw-r--r-- 1 root root     266 Mär 17  2018 example7.bmp
-rw-r--r-- 1 root root     266 Mär 17  2018 example8.bmp
-rw-r--r-- 1 root root     266 Mär 17  2018 example9.bmp
-rwxr-xr-x 1 root root     378 Sep 27 23:41 ExampleAni.pl
-rwxrwxrwx 1 fhem dialout  198 Okt  2 22:11 example.bmp
-rw-r--r-- 1 root root     198 Okt  2 22:56 feuer.bmp
-rwxrwxrwx 1 fhem dialout 4386 Okt  3 20:51 feuer.pl
-rw-r--r-- 1 root root     266 Mär 17  2018 firework1.bmp
-rw-r--r-- 1 root root     266 Mär 17  2018 firework2.bmp
-rw-r--r-- 1 root root     266 Mär 17  2018 firework3.bmp
-rw-r--r-- 1 root root     266 Mär 17  2018 firework4.bmp
-rw-r--r-- 1 root root     266 Mär 17  2018 firework5.bmp
-rw-r--r-- 1 root root     266 Mär 17  2018 firework6.bmp
-rw-r--r-- 1 root root     266 Mär 17  2018 firework7.bmp
-rw-r--r-- 1 root root     266 Mär 17  2018 firework8.bmp
-rw-r--r-- 1 root root    2793 Sep 27 23:37 lib.pl
-rw-r--r-- 1 root root     116 Sep 27 23:40 OnlyColor.pl
-rw-r--r-- 1 root root     114 Sep 27 23:40 Pixelanimation.pl
-rw-r--r-- 1 root root     114 Sep 27 23:40 SpinningTriangle.pl
-rw-r--r-- 1 root root     108 Sep 28 00:12 Temp.pl
-rw-r--r-- 1 root root     114 Sep 27 23:40 Time.pl
-rw-r--r-- 1 root root     114 Sep 27 23:40 WalkingTriangle.pl
root@raspiFhem:/opt/fhem/divoom#


example.bmp und feuer.pl, gleiche Gruppe, alle auf 777 und Besitzer Fhem

mumpitzstuff

#59
Wie sind die Rechte vom divoom Verzeichnis selbst?

Verwende mal qx(command 2>&1), dann sollte auch der Output zurück gegeben werden.

{qx("perl /opt/fhem/divoom/Feuer.pl 2>&1")}

Ach und sudo mal weg lassen bitte.