Bash – Touchpad bei Bedarf deaktivieren

Langjährige Büroarbeit hat mir einen ordentlichen Bauch verschafft der ab und an die Kontrolle über die Tasten meines Touchpads übernimmt. Abhilfe schafft hier Sport und ein kleines Script um das Touchpad bei Bedarf zu deaktivieren. Das Script liest den Status des Touchpads aus und invertiert ihn.

Quelle: Lenovo.com
Quelle: Lenovo.com
#!/bin/bash
 
DEVICE_NAME="SynPS/2 Synaptics TouchPad"
 
#read state of the touchpad
STATE=$(xinput list-props "$DEVICE_NAME" |grep "Device Enabled"|cut -f3)
#flip the variable
if [ $STATE = 1 ]; then
	echo disable $DEVICE_NAME
	STATE=0
    else
       	STATE=1
       	echo enable $DEVICE_NAME
fi
 
xinput set-prop  "$DEVICE_NAME"  "Device Enabled" $STATE

Led Lampen mit WLAN Anbindung

Ein Thema das mich immer wieder fasziniert ist die Vernetzung von Gegenständen des Alltags. Meine Wohnzimmerlampe glänzt nicht nur durch hässliche Form sondern auch durch kaltes Licht und Quecksilber im Leuchtmittel. Deshalb ersetze ich nach und nach Kompaktleuchtstofflampen durch LED Lampen. Der Zufall brachte mich zu diesem Lampenset mit WLAN Anbindung (Affiliate) vom Hersteller LimitlessLED. Die Lampen passen in E27 Sockel, haben 6 Watt Leistung und können mit 230V ~  betrieben werden. Die Grundidee ist die Lampen via Smartphone oder auf anderen Wegen einzuschalten, die Farben zu ändern und dimmen.Neben den 3 Lampen werden eine Fernbedienung und was viel interessanter ist einem Controller mit dokumentierter API geliefert. Apps gibt es auch! Pro Fernbedienung und Controller kann man 4 Lampen steuern. Dabei kann man die Parameter Helligkeit, Farbe regeln.

2013-10-15 16.56.18

 

Impressionen

Inbetriebnahme

Lampen

Jede Lampe muß konfiguriert werden. Dabei spielt es keine Rolle, ob man sie der Fernbedienung oder in der App konfiguriert.

Lampe in Fassung drehen und binnen 2 Sekunden nach Anlegen von Spannung auf der Fernbedienung einen Kanal aktivieren – die Lampe ist nun dem entsprechenden Kanal zugewiesen. Die erfolgreiche Zuweisung  wird durch Blinken quittiert. Um die Lampe aus dem Kanal zu lösen innerhalb von 2 Sekunden nach dem Einschalten 5 mal den entsprechenden Kanal auf der Fernbedienung aktivieren.

Controller

Der Controller wird per Micro-USB Kabel mit Spannung versorgt. Ich nutze ein Ladegerät für Smartphones. Nach dem Booten sollte man ein WLAN mit der SSID milight finden. Nun kann man der Anleitung folgen oder was ich als angenehmer per Webinterface konfigurieren. Dazu ins eigene WLAN verbinden und http://192.168.0.100/home.html aufrufen – ob die IP immer die gleiche ist kann ich nicht sagen. Hier muß in den STA Interface Settings das eigene WLAN konfiguriert werden.

App

Momentan nutze ich die in der Anleitung vorgeschlagene App Es gibt auch noch eine puristischere Version mit
Anbindung an Tasker – die  ohne Anpassungen leider nicht läuft.

LED Lampen ansteuern

Beim Hersteller gibt es eine Dokumentation.  Die Beispiele sind leider ein wenig inkonsistent, da irgendwann die Portnummer von 50000 auf 8899 umgestellt wurde.

Die Lampen werden per UDP Kommandos gesteuert. Dabei werden immer 3 Byte übertragen.

Byte 1 ist das Kommando an welches immer der Suffix 0x00  0x55 angehängt werden muß.

In PHP kann mit diesen Zeilen alle Kanäle einschalten:

<?php
define("CONTROLLER_IP", "192.168.0.100");
function executeCommand( $ip, $command, $suffix1=00, $suffix2='55'){
	fwrite(fsockopen("udp://$ip", 8899), chr(hexdec($command)) . chr(hexdec($suffix1)) . chr(hexdec($suffix2)));
}
 
executeCommand(CONTROLLER_IP, 42);

Wer php5-cli installiert hat kann das Script auch auf der Kommandozeile nutzen. Für Freunde der Bash gibt es auch ein Script (geklaut bei Smileytechadventures)

#!/bin/bash 
 
if [ -z "$1" ] ; then 
    echo "You must enter a parameter: "  
    echo "  e.g. $0 allon" 
    exit 1 
fi 
 
incmd="$1" 
ipaddress="192.168.0.201" 
portnum="50000" 
 
allon="\x35\00\x55" 
alloff="\x39\00\x55" 
zone1on="\x38\00\x55" 
zone1off="\x3B\00\x55" 
zone2on="\x3D\00\x55" 
zone2off="\x33\00\x55" 
zone3on="\x37\00\x55" 
zone3off="\x3A\00\x55" 
zone4on="\x32\00\x55" 
zone4off="\x36\00\x55" 
 
eval incmd=\$$incmd 
 
echo -n -e "$incmd" >/dev/udp/"$ipaddress"/"$portnum"

Ein wenig Heimautomatisierung ist auch schnell betrieben. Dieses Skript prüft, ob die Sonne untergegangen ist und schaltet in diesem Fall alle Lampen ein.

#!/usr/bin/php
<?php define("CONTROLLER_IP", "192.168.0.100"); define("ZEIT_FUER_BETT", "23:59"); function executeCommand( $ip, $command, $suffix1=00, $suffix2='55'){ fwrite(fsockopen("udp://$ip", 8899), chr(hexdec($command)) . chr(hexdec($suffix1)) . chr(hexdec($suffix2))); } function getIp(){ return file_get_contents("http://icanhazip.com/"); } function getLatLongByIp($ip){ $geoplugin = unserialize( file_get_contents('http://www.geoplugin.net/php.gp?ip='.$ip) ); if ( is_numeric($geoplugin['geoplugin_latitude']) && is_numeric($geoplugin['geoplugin_longitude']) ) { $ret['lat']= $geoplugin['geoplugin_latitude']; $ret['lon']=$geoplugin['geoplugin_longitude']; return $ret; } } $ret= getLatLongByIp(getIp()); $dateSunset=date_sunset(time(), SUNFUNCS_RET_TIMESTAMP,$ret['lat'], $ret['lon'], 90, 1); $dateSunrise=date_sunrise(time(), SUNFUNCS_RET_TIMESTAMP, $ret['lat'], $ret['lon'], 90, 1); //Zu einer festen Uhrzeit ausschalten if(date("H:i")>= date(ZEIT_FUER_BETT)){
echo "schlafen";
	executeCommand(CONTROLLER_IP, 41);
	exit;
}  
//Nach Sonnenuntergang und vor Aufgang
if ( time() >=$dateSunset && $dateSunset >$dateSunrise){
 
	executeCommand(CONTROLLER_IP, 42);
}else {
	executeCommand(CONTROLLER_IP, 41);
}

Das kleine Skript fühlt sich auf kleinen Linuxrechnern im eigenen Netzwerk sehr wohl und sollte per Cronjob alle 1 Minuten angestoßen werden.

*/1 *    * * *   /home/pi/sunrise.php

Inzwischen habe ich die Lampen seit einer Woche in Betrieb und viel Spaß damit. Die Lichtausbeute ist ausreichend, der Stromverbrauch in Ordnung. Der Preis ist mit 99 EUR schon sehr happig, aber es macht auch sehr sehr viel Spaß Skripte für die Lampen zu schreiben.

Schnelleinstieg in die Kommandozeile

Vor einem Monat fand die Confoo in Montreal, Kanada statt.  Bei der Konferenz ging es primär um die Entwicklung von Webandwendungen. Die Veranstaltung war also nur bedingt für den normalen Ubuntu-User von Interesse wenn  David Winterbottom dort keinen Vortrag gehalten hätte.

David betreibt die Webseite CommandLineFu. Dort kann man nützliche Befehle für die CLI suchen, einstellen, bewerten oder kommentieren.

In der ~60 Slides langen Präsentation werden wichtige Befehle, Ausgabeumleitung, die Bedienung von SSH und Screen und einiges mehr sehr anschaulich erklärt.

Vor allem User, die ein wenig vor der Kommandozeile zurückschrecken sollten sich die Präsentation unbedingt anschauen. Have Fun!!! 🙂

CommandLineFu for web developers

Matroska Headercompression vs. WDTV

Seit geraumer Zeit bin ich Besitzer eines oder einer WDTV Live. Das Gerät steht unter meinem Fernseher und dient nur dem Zweck Filme die auf dem NAS abgelegt sind auf meinem Fernseher abzuspielen. Das Gerät kommt mit so ziemlich allen Formaten klar – abgesehen von manchen Mkv Dateien. Nach kurzer Recherche stand fest, dass dies mit der Headercompression zusammenhängt, doch was hat es damit auf sich?

Matroska ist ein Containerformat, das heißt in einem Matroska Container liegen die eigentlichen Dateien wie Audio und Videospuren, Untertitel usw. Im Header des Containers wird beschrieben welche Dateien enthalten sind und von welchem Typ sie sind. Die Matroskaspezifikation besagt, daß dieser Header auch komprimiert werden kann. Leider ist dieses Feature in den meisten Hardwareplayern anscheinend nicht implementiert obwohl die Spezifikation schon recht alt ist. Das war nie ein Problem bis sich Matroska entschloss die Headercompression standardmäßig in der aktuellen Version ihrer Tools zu aktivieren. Wenn man nun vergisst beim Mergen das entsprechende Flag zu setzen oder ein Mkv File von einem Bekannten bekommt, der solche Sorgen sieht man nur einen schwarzen Bildschirm.

Abhilfe schafft bei mir dieses kleine Bashscript. Die Mkv Tools müssen installiert sein. Die paar Zeilen machen nichts anderes als eine Prüfung auf Headerkomprimierung und ggfs. den Container ohne Kompression nochmal zu mergen. Das kann erfahrungsgemäß ein wenig dauern:

#!/bin/bash

function hascompression()
{
en=’Algorithm: 3 (header removal)‘
de=’Algorithmus: 3 (Entfernen von Kopfdaten)‘
mkvinfo $1 | grep -e „$en“ -e „$de“ &>/dev/null
ret=$?
if [ $ret -eq 0 ]
then
echo „komprimierte Header in $1“
return 0
else
echo „nichts komprimiertes gefunden in $1“
return 1
fi
}
#function
function removecompression()
{
hascompression $1

if [ $? -eq 0 ]
then

mv $1 $1.bak
mkvmerge -o „$1“ –engage keep_bitstream_ar_info -A -S –compression -1:none „$1.bak“ -D -S –compression -1:none „$1.bak“ -A -D –compression -1:none „$1.bak“
rm $1.bak
echo fukr
fi

}
#function

onlyinfo=false
while getopts ‚:i‘ OPTION; do
case „$OPTION“ in
i) onlyinfo=true && shift;;
*) echo „Unbekannter Parameter“

esac
done

for ARG in $@
do
if [ -f $ARG ]
then
if [ $onlyinfo == true ]
then
hascompression $ARG
else

removecompression $ARG
fi
else
echo $ARG isn’t a file
fi

done

WordPress versaut leider die Einrückungen aber ein ordentlichen Texteditor sollte das wieder zurechtrücken. 🙂

Matthias hat sich die Mühe gemacht und ein Applescript erstellt um dem Matroska Container auch unter MacOS die Komprimierung zu rauben:

on open someDroppedAliases
set theAlias to first item of someDroppedAliases
tell application „Finder“
set filename to name of theAlias
set ParentFolder to container of theAlias
set the item_count to the number of items in the ParentFolder
set parentFolderAlias to ParentFolder as alias
end tell
set parentFolderPath to POSIX path of parentFolderAlias
set ausgabe to do shell script „mkvinfo “ & quoted form of POSIX path of someDroppedAliases
if ausgabe contains „Content compression“ then

do shell script „mkvmerge -o “ & quoted form of parentFolderPath & „clean_“ & quoted form of filename & “ –compression 1:none “ & quoted form of POSIX path of someDroppedAliases

tell application „GrowlHelperApp“
set the allNotificationsList to ¬
{„Reparieren“}

set the defaultNotificationsList to ¬
{„Reparieren“}

register as application ¬
„Growl AppleScript Sample“ all notifications allNotificationsList ¬
default notifications defaultNotificationsList ¬
icon of application „Mkvtoolnix“

— Send a Notification…
notify with name ¬
„Reparieren“ title ¬
filename description ¬
„Kompression erfolgreich entfernt.“ application name „Growl AppleScript Sample“
end tell
else
tell application „GrowlHelperApp“
set the allNotificationsList to ¬
{„Nichts zu reparieren“}

set the defaultNotificationsList to ¬
{„Nichts zu reparieren“}

register as application ¬
„Growl AppleScript Sample“ all notifications allNotificationsList ¬
default notifications defaultNotificationsList ¬
icon of application „Mkvtoolnix“

— Send a Notification…
notify with name ¬
„Nichts zu reparieren“ title ¬
filename description ¬
„Keine Kompression vorhanden“ application name „Growl AppleScript Sample“
end tell
end if
end open

Hf^^

Bequemer Bashskripte zusammenfriemeln

Momentan beschäftige ich mich verstärkt mit der Skripterei und muß sagen, daß mir dies erstaunlich schwer fällt. Leerzeichen wollten beachtet sein, ab und an müssen Pfade escaped werden und die Arbeit mit Arrays kotzt mich zum Teil richtig an. Aber es wird langsam besser :).

Sehr hilfreich ist ein eigenes bin Verzeichnis. Da meine Skripte nur und viel mit Dateien arbeiten – sonst würde ich es mit irgendwas anderem machen – sollte der Aufruf auch bequem sein.

Um nun nicht jedesmal sowas wie

./skripta -a -b -c ~/zeugs/bearbeitemich

Habe ich das Verzeichniss ~/bin angelegt. Dort liegen die Skripte an denen ich gerade werkel. Damit meine Bash auch weiß, daß es da Programme gibt, habe ich das Verzeichniss der PATH Variable hinzugefügt:

export PATH=$PATH:~/bin/

Damit Um die Sache permanent zu gestalten habe ich diesen Befehl meiner .bashrc hinzugefügt. Sehr schön:).

 

 

Top Ten von CommandLineFu erklärt

Unix Creators at DEC PDP11
Attribution-NonCommercial-NoDerivs License by PanelSwitchman

Die meisten Leute dürften die Seite CommandLineFu kennen. Dort kann man nützliche Kommandozeilenbefehle posten, lesen, bewerten und kommentieren. Nun hat sich ein netter Herr namens Peteris Krumins die Mühe gemacht und die 10 besten Befehle der Seite auf seinem Blog ausführlich erklärt. Meiner Meinung nach sehr lesenswert 🙂

Argumente an Alias weitergeben

Den meisten Leuten dürfte  bekannt sein, dass man einer Aliasfunktion Argumente übergeben kann. Mir war es neu / ich war noch nie auf die Idee gekommen sowas zu tun :). Ein Beispielaufruf:

create_audiobook ()
{
mpg123 -s $1 | faac -P -X -w -o $2 –
}
create_audiobook (){
mpg123 -s $1 | faac -P -X -w -o $2 -
}

$1 & $2 wären die Variablen, die gesetzt sein sollten für den Aufruf. Problematisch wirds, wenn nur ein oder gar kein Argument mitgegeben wird. Das kann man mit einer simplen If Abfrage validieren:

create_audiobook (){
expr1=$2
expr2=$1
if [ "$expr1" -a "$expr2" ]
then
	mpg123 -s $1 | faac -P -X -w -o $2 -
else
	echo "Usage: create_audiobook INPUTFILE OUTPUTFILE"
fi
}

Das Fleißsternchen bekommt man, wenn man die Existenz der Befehle vor der Ausführung abprüft:

create_audiobook (){
APP1=mpg123
APP2=faac

if which $APP1 &>/dev/null && which $APP2 &>/dev/null
then
	echo "$APP1 & $APP2 found"
else
	echo "Please install $APP1 & $APP2"
	exit
fi

expr1=$2
expr2=$1
if [ "$expr1" -a "$expr2" ]
then
	mpg123 -s $1 | faac -P -X -w -o $2 -
else
	echo "usage: create_audiobook INPUTFILE OUTPUTFILE"
fi
}
######create_audiobook konvertiert ein mp3 zu einer mp4 Datei

Mich würde an dieser Stelle noch interessieren, ob Ihr im Community Planeten an solchen Posts interessiert seid, oder ob ich solche Ergüsse für mich behalten sollte^^.