Category Archives: Computer

Portable Squeeze Server

Update : https://www.henriaanstoot.nl/2022/05/26/portable-logitech-media-server-again/


Below is a picture of my mobile LMS server i used in my car.
I only had radio and a CD player, i’m not a radio man .. folk, pipes and audiobooks


At the time i was working for Dutch Railways, imagine me walking with this blinky leds thingy, though the railway station …

It consisted of a dual port usb charger, a usb hub to power the drive, the rpi wasn’t strong enough. Thumbdrives where small in capacity, so i had to use a spinning disk harddrive.
It was only a raspberry 1, in a case i had designed and lasercutted at Fablab Utrecht.

Now you can get rid of the Usb hub and harddrive using a small but with large capacity sdcards.

I could charge the thing in my car, and when i got home, it would connect to my home wifi network, sync-ed my MP3’s and turn off.

My first raspberry Pi

Today i got my first Raspberry Pi!

Many followed

The first-generation Raspberry Pi Model B was released in February 2012, followed by the simpler and cheaper Model A.

Later i bought the Pi2, Pi3, Pi4 and the Zero’s

I like the little buggers! I’ve used them for many projects.

Aloha gave me a banana pi to try, and i’ve tried the orange pi.

Aparantly i already registered at the raspberry store 2012-02-14.
28 of May i got a “activation code” to order

Now (2023 .. all shops out of stock )

Web controller for Acdsee

UPDATE: 2023 It’s still working

I made a webcontroller for viewing images on a big TV.

Using a Acdsee instance with MCE Controller installed and a webserver.

https://tig.github.io/mcec/example_commands.html

Rate the picture 1-5, clear rating, slideshow start, escape, open/close image, zoom-in out and zoom-reset. Previous and next image fullscreen and delete/yes

Some used defined keys (see php file)

 if ($cmd=="I"){ $put="chars:+"; };
 if ($cmd=="O"){ $put="chars:-"; };
 if ($cmd=="R"){ $put="chars:*"; };
 if ($cmd=="Y"){ $put="chars:y"; };
 if ($cmd=="F"){ $put="chars:f"; };
 if ($cmd=="D"){ $put="delete"; };
 if ($cmd=="N"){ $put="right"; };
 if ($cmd=="P"){ $put="left"; };
 if ($cmd=="ENTER"){ $put="enter"; };
 if ($cmd=="ESC"){ $put="escape"; };

PHP Script for the buttons and creating the TCP packets for MCE.

<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0.1/jquery.mobile-1.0.1.min.css" />
<script src="http://code.jquery.com/jquery-1.6.4.min.js"></script>
<script src="http://code.jquery.com/mobile/1.0.1/jquery.mobile-1.0.1.min.js"></script>
<?php
  $ip           = "remoteserver";
  $port         = "5150";

if (empty($put)) $put = "";
if (empty($line)) $line = "";
$cmd=$_POST['cmd'];
 if ($cmd=="I"){ $put="chars:+"; };
 if ($cmd=="O"){ $put="chars:-"; };
 if ($cmd=="R"){ $put="chars:*"; };
 if ($cmd=="Y"){ $put="chars:y"; };
 if ($cmd=="F"){ $put="chars:f"; };
 if ($cmd=="D"){ $put="delete"; };
 if ($cmd=="N"){ $put="right"; };
 if ($cmd=="P"){ $put="left"; };
 if ($cmd=="ENTER"){ $put="enter"; };
 if ($cmd=="ESC"){ $put="escape"; };
  $fp = stream_socket_client("tcp://".$ip.":".$port, $errno, $errstr, 30);
    $task = send_cmd("$put", $fp);

 if ($cmd=="1" || $cmd=="2" || $cmd=="3" || $cmd=="4" || $cmd=="5" || $cmd=="0"){
  $fp = stream_socket_client("tcp://".$ip.":".$port, $errno, $errstr, 30);
        send_cmd("shiftdown:ctrl", $fp);
  fclose($fp);
  $fp = stream_socket_client("tcp://".$ip.":".$port, $errno, $errstr, 30);
        send_cmd("$cmd", $fp);
  fclose($fp);
  $fp = stream_socket_client("tcp://".$ip.":".$port, $errno, $errstr, 30);
        send_cmd("shiftup:ctrl", $fp);
  fclose($fp);
        };
if ($cmd=="S") {
  $fp = stream_socket_client("tcp://".$ip.":".$port, $errno, $errstr, 30);
        send_cmd("shiftdown:alt", $fp);
  fclose($fp);
  $fp = stream_socket_client("tcp://".$ip.":".$port, $errno, $errstr, 30);
        send_cmd("$cmd", $fp);
  fclose($fp);
  $fp = stream_socket_client("tcp://".$ip.":".$port, $errno, $errstr, 30);
        send_cmd("shiftup:alt", $fp);
  fclose($fp);
        };

 if ($cmd=="fnietF"){
  $fp = stream_socket_client("tcp://".$ip.":".$port, $errno, $errstr, 30);
        send_cmd("shiftdown:shift", $fp);
  fclose($fp);
  $fp = stream_socket_client("tcp://".$ip.":".$port, $errno, $errstr, 30);
        send_cmd("shiftdown:ctrl", $fp);
  fclose($fp);
  $fp = stream_socket_client("tcp://".$ip.":".$port, $errno, $errstr, 30);
        send_cmd("$cmd", $fp);
  fclose($fp);
  $fp = stream_socket_client("tcp://".$ip.":".$port, $errno, $errstr, 30);
        send_cmd("shiftup:ctrl", $fp);
  fclose($fp);
  $fp = stream_socket_client("tcp://".$ip.":".$port, $errno, $errstr, 30);
        send_cmd("shiftup:shift", $fp);
  fclose($fp);
        };



//}
  echo "<html><head><title></title></head>";
  echo "<body><center><H1>";
$callself=$_SERVER['PHP_SELF'];
echo "<div data-role=\"controlgroup\" data-type=\"horizontal\">";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"1\"><input type=\"submit\" value=\"1\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"2\"><input type=\"submit\" value=\"2\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"3\"><input type=\"submit\" value=\"3\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"4\"><input type=\"submit\" value=\"4\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"5\"><input type=\"submit\" value=\"5\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"0\"><input type=\"submit\" value=\"Rate Clear\" /></form>\n";
echo "</div>";

echo "<div data-role=\"controlgroup\" data-type=\"horizontal\">";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"S\"><input type=\"submit\" value=\"SLIDESHOW\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"ESC\"><input type=\"submit\" value=\"ESC\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"ENTER\"><input type=\"submit\" value=\"OPEN/CLOSE\" /></form>\n";
  fclose($fp);
echo "</div>";

echo "<div data-role=\"controlgroup\" data-type=\"horizontal\">";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"I\"><input type=\"submit\" value=\"ZOOMIN\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"R\"><input type=\"submit\" value=\"ZOOMRESET\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"O\"><input type=\"submit\" value=\"ZOOMOUT\" /></form>\n";
echo "</div>";

echo "<div data-role=\"controlgroup\" data-type=\"horizontal\">";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"P\"><input type=\"submit\" value=\"PREV\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"D\"><input type=\"submit\" value=\"DEL\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"Y\"><input type=\"submit\" value=\"Y\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"F\"><input type=\"submit\" value=\"FULL\" /></form>\n";
    echo "<form data-transition=\"none\" style=\"display:inline;\" name=\"input\" action=\"$callself\" method=\"post\"><input type=\"hidden\" name=\"cmd\" value=\"N\"><input type=\"submit\" value=\"NEXT\" /></form>\n";
echo "</div>";
  echo "</body></html>";
  function send_cmd($cmd, $fp){
    fwrite($fp, $cmd);
    fwrite($fp, "\n");
        return;
  }
?>

New shirts for our group “Prutsers”

Design made with Inkscape

Joke about this: Someone’s granny said: “Indeed prutsers .. 3 is far to hot for those shirts”

Prutser .. as used many times on this site.

Definitions of botcher. someone who makes mistakes because of incompetence. synonyms: blunderer, bumbler, bungler, butcher, fumbler, sad sack, stumbler. type of: incompetent, incompetent person.

Used in our context: Not serious about the things we create, fast fun and easy .. then we take it apart and make something else.

Using Graphviz and dot language to plot friends and family

I’ve been using the dotty language for many things, this is a who is who displayer.
iptables rules displayer, open ports, gluster brinks/nodes. netstat ports.,
Wil post more about this later


installing
apt-get install graphviz

View it on a website using mojozoom javascipt

demo : https://media.henriaanstoot.nl/websites/dotviewer/index.html

dot file example (changed names to protect the innocent)

           digraph G {
                size="960,960"
                graph [fontsize=16];
                node  [fontsize=16];
                ericewc [shape=diamond]
                notoasat [shape=diamond]
                rwke [shape=diamond]
                prtsu [shape=diamond]
                wkmre [shape=diamond]
                hsocol [shape=diamond]
                stm [shape=diamond]
                scoisenr [shape=diamond]
                lpetg [shape=diamond]
                ptoi [shape=diamond]
                nrnag -> rean;
                rean -> grrdea;
                rean -> kmoina;
                nrnag -> aabrrba;
                aabrrba -> edide;
                aabrrba -> taamra;
                wkmre -> renei;
                renei -> ilem;
                cpb -> mttne;
                cpb -> mhyme;
                ghnhlaid -> hsanvk;
                hsanvk -> mray;
                ghnhlaid -> erbnete -> kene;
                erbnete -> ebnno;
                erbnete -> hsan;
                erbnete -> anek;
                nehri -> hetctur;
                nlicoe -> hetctur;
                ueoqnim -> hetctur;
                hetctur -> aisovwkrs;
                aisovwkrs -> amnroa;
                aisovwkrs -> gioud;
                aisovwkrs -> aulra;
                rwke -> lemtcu;
                lemtcu -> rhary;
                lemtcu -> gmc;
                prtsu -> ico;
                prtsu -> hloaa;
                nehri -> prtsu;
           }

Making the graphics

dot -Tsvg -obig.svg goed.dot
#gs -q -dNOPAUSE -dBATCH -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=png16m -sOutputFile=big.png big.ps
convert big.svg big.png
convert -resize 800x800 big.png bigsmall.png

Onkyo web control hack

Back in 2009 i’ve posted my web controller for Onkyo in a forum.

Several people build on that source and made android/iphones app using this as example.

It uses pfsockopen with raw packets in php.
Spend a lot of work reverse engineering the tcp headers to be send.
Another fun trick was re-using a trick i’ve used for my ipcam controller and dartabase. (Dart game application)

Below a PDF with first page of forum

I’ve made a alteration in my logitechmediaserver (squeezebox server) which embedded a onkyo volume control part in the gui.

Volume Onkyo in LMS

Part of code

<?php
// :colorscheme elflord
// Henri Aanstoot
// Onkyo Reciever Web Interface 2009
// Version 0.6b - 23 Oct 2009
// EDIT THIS
$receiveripnumber="your.onkyo.ip.here";
$receiverlistenport="60128";
// maximum to set volume (0-100) 
// !! some have 64 max????
$volumemax=60;
// (i had to enable this port by going onto the menu's on my Onkyo
// ---- NO EDITING BELOW THIS LINE

// trick browser into staying on same page
$ibrowser = strpos($_SERVER['HTTP_USER_AGENT'],"iPhone");
if ($ibrowser == false) {
header("HTTP/1.0 204 No Response");
}
// test write to file
//$fp=fopen("test.txt", "wb");
// write to Receiver 
$fp = pfsockopen($receiveripnumber, $receiverlistenport, $errno, $errstr, 30);
//get command from post form
$command=$_POST['cmd'];
//get volume if cmd is numeric
if(is_numeric($command)) 
 {
if ($command > $volumemax) { $command=$volumemax; }
echo $command;
  $vol=str_pad(dechex($command), 2, '0', STR_PAD_LEFT);
  $command="!1MVL$vol";
 }
// Calculate header and datapacket lengths
$length=strlen($command); 
$length=$length+1;
$total=$length+16;
$code=chr($length);
// total eiscp packet to send 
$line="ISCP\x00\x00\x00\x10\x00\x00\x00$code\x01\x00\x00\x00".$command."\x0D";
#fputs($fp,$line,$total);
// write
fwrite($fp, $line);
// rest status part
//    while (!feof($fp)) {
//        echo fgets($fp, 128);
//    } 

fclose($fp);

if ($ibrowser == true) {
print "<html>
<head>
<title>Sending Command...</title>`
<meta http-equiv=\"refresh\" content=\"0;url=index.php\">
</head>
<body></body>
</html>";
}

?>

List of command’s

header,Power
!1PWR00,Poweroff
!1PWR01,Poweron
header,Muting
!1AMT00,Audio muting off
!1AMT01,Audio muting on
!1AMTQSTN,Audio muting stat
header, Speaker A/B (Main/Front?)
!1SPA00,Speaker A Off
!1SPA01,Speaker A On
!1SPB00,Speaker B Off
!1SPB01,Speaker B On
header,Sound modus
!1LMD00,STEREO
!1LMD01,DIRECT 
!1LMD02,SURROUND
!1LMD03,FILM
!1LMD04,THX
!1LMD05,ACTION
!1LMD06,MUSICAL
!1LMD07,MONO MOVIE
!1LMD08,ORCHESTRA
!1LMD09,UNPLUGGED
!1LMD0A,STUDIO-MIX
!1LMD0B,TV LOGIC
!1LMD0C,ALL CH STEREO
!1LMD0D,THEATER-DIMENSIONAL 
!1LMD0E,ENHANCED 7/ENHANCE
!1LMD0F,MONO 
!1LMD11,PURE AUDIO 
!1LMD12,MULTIPLEX
!1LMD13,FULL MONO
!1LMD14,DOLBY VIRTUAL
!1LMD40,5.1ch Surround
!1LMD40,Straight Decode*1
!1LMD41,Dolby EX/DTS ES
!1LMD41,Dolby EX*2
!1LMD42,THX Cinema
!1LMD43,THX Surround EX
!1LMD50,U2/S2 Cinema/Cinema2
!1LMD51,MusicMode
!1LMD52,Games Mode
!1LMD80,PLII/PLIIx Movie
!1LMD81,PLII/PLIIx Music
!1LMD82,Neo:6 Cinema
!1LMD83,Neo:6 Music
!1LMD84,PLII/PLIIx THX Cinema
!1LMD85,Neo:6 THX Cinema
!1LMD86,PLII/PLIIx Game
!1LMD87,Neural Surr*3
!1LMD88,Neural THX
!1LMD89,PLII THX Games
!1LMD8A,Neo:6 THX Games
!1LMDUP,Listening Mode Wrap-Around Up
!1LMDDOWN,Listening Mode Wrap-Around Down
header,Input Selector
!1SLI00,VIDEO1    VCR/DVR
!1SLI01,VIDEO2    CBL/SAT
!1SLI02,VIDEO3    GAME/TV
!1SLI03,VIDEO4    AUX1(AUX)
!1SLI04,VIDEO5    AUX2
!1SLI05,VIDEO6
!1SLI06,VIDEO7
!1SLI10,DVD
!1SLI20,TAPE(1)
!1SLI21,TAPE2
!1SLI22,PHONO
!1SLI23,CD
!1SLI24,FM
!1SLI25,AM
!1SLI26,TUNER
!1SLI27,MUSIC SERVER 
!1SLI28,INTERNET RADIO
!1SLI29,USB
!1SLI30,MULTI CH
!1SLI31,XM*1
!1SLI32,SIRIUS*1
!1SLIUP,Selector Position Wrap-Around Up
!1SLIDOWN,Selector Position Wrap-Around Down

Staircase pictures

Maybe you also have a white area to fill, here is a suggestion.

For years we collected picture frames, weird and ugly.
We wanted to have a collection of images in our staircase, to fill the white area.
The images are all something we like, have interest in or are personal.

It needed to be on 3 walls, so here was my first design.

Around the corner picture frame i made