Wenn die Uhr nicht korrekt auf dem Rechner eingestellt ist geschehen die lustigsten Dinge.
Deshalb synchronisiert sich Debian Linux per NTP gegen einen Zeitserver. Manchmal muß man jedoch an sowas vorbei arbeiten.
Um ein Script in der Vergangenheit oder Zukunft auszuführen muß NTP deaktiviert werden.
Unter Debian / Ubuntu funktioniert das so:
root@server:~# timedatectl set-ntp 0root@server:~# timedatectl set-time 2017-06-20root@server:~# date
Tue Jun 20 00:00:01 CEST 2017
root@server:~# timedatectl set-ntp 0
root@server:~# timedatectl set-time 2017-06-20
root@server:~# date
Tue Jun 20 00:00:01 CEST 2017
Im Anschluss auf keinen Fall vergessen NTP wieder zu aktivieren und die Uhr prüfen!
root@server:~# timedatectl set-ntp 1root@server:~# date
Wed Jun 2112:30:45 CEST 2017
root@server:~# timedatectl set-ntp 1
root@server:~# date
Wed Jun 21 12:30:45 CEST 2017
Für bewegte Bilder auf der Glotze ist bei mir Kodi auf einem Raspberry Pi2 zuständig. Ich nutze dafür die Testbuilds von Milhouse weil man damit auch den Streaming Dienst von Amazon nutzen kann. Wie man das initial einrichtet erklärt Christoph von bei Linuxundich ganz gut. Da es sich um Testbuilds handelt macht es Sinn öfter mal ein Update einzuspielen. Wenn man das händisch macht ist es halt mit viel Arbeit verbunden und Arbeit sollten man vermeiden wo es nur geht. Deshalb habe ich ein kleines Script gebastelt welches mir diese Arbeit abnimmt. Die Geschichte ist natürlich bei weitem nicht perfekt. Ich habe aufgehört als es funktioniert hat.
Wichtig: mein Script lädt die Files für den Raspberry PI2 /3 wenn du einen Raspberry Pi 1 hast solltest Du dieses Script auf keinen Fall verwenden!
Benötigte Software
Um das ganze zum laufen zu bringen brauchst du PHP und Bash.
Die Scripte liegen in einem Repo auf Github wenn Du dir das genauer anschauen magst.
Falls nicht mußt du nur dieses Phar File und ein Bash Script downloaden und in ein bin folder legen – $USER/bin wäre ein schöner Ort dafür.
Einfach das Script mit dem ssh String zum Raspberry aufrufen
update-kodi.sh kodi@192.168.0.89
update-kodi.sh kodi@192.168.0.89
Tipps zur Nutzung
Generell solltest Du Deinen public SSH Key auf dem Raspberry ablegen. Das erspart das Eintippen des Passworts bei jedem Aufruf. Zu dem Thema gibt es wohl eine Million Blog Posts. Hier ist einer.
Einen Cronjob in der Nacht einrichten der dann die Arbeit für einen erledigt – 00 00 * * * $HOME/bin/update-kodi.sh kodi
Was noch fehlt
Die Geschichte mit den Scripts ist schon ein wenig smelly. Eigentlich wollte ich mir das mit Ansible aufsetzen und das ADHS hat mich gezwungen diese Scripte zu erzeugen. Sinnvoll wäre es auch, wenn vor dem Einspielen des Updates die /etc/issue geprüft wird um zu schauen ob das Gerät schon auf der aktuellen Version läuft.
Hat jemand einen Tipp für mich?
Ich parse die Url http://milhouse.libreelec.tv/builds/master/RPi2/ das ist ziemlich unelegant wie ich finde. Gibt es da vielleicht eine Art Http Standard um sowas direkt lesen zu können?
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
#!/bin/bashDEVICE_NAME="SynPS/2 Synaptics TouchPad"#read state of the touchpadSTATE=$(xinput list-props "$DEVICE_NAME"|grep"Device Enabled"|cut -f3)#flip the variableif[$STATE = 1]; thenecho disable $DEVICE_NAMESTATE=0elseSTATE=1echoenable$DEVICE_NAMEfi
xinput set-prop "$DEVICE_NAME""Device Enabled"$STATE
#!/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
Für ein kleines Projekt (Mobiltelefon steuert Arduino) habe ich mir ein HC-06 Bluetooth Modul für wenig Geld in China besorgt. Bluetooth habe ich nie gemocht, weil ich nie viel Freude daran hatte diese Gerätschaften unter Linux zu konfigurieren, aber der Preisunterschied zu Arduino WLAN Modulen hatte dann doch den Ausschlag gegeben:).
Über GUI ließ sich das Gerät leider nicht konfigurieren, aber mit den bluez-utils auf der Kommandozeile ließ sich das Problem rasch beheben.
Zuerst muß die MAC Adresse des Moduls in Erfahrung gebracht werden.
root@debian:/# cat /etc/bluetooth/rfcomm.conf ## RFCOMM configuration file.#
rfcomm0 {# # Automatically bind the device at startupbindyes;
## # Bluetooth address of the device
device 20:14:04:11:15:16;
# # RFCOMM channel for the connection
channel 1;
## # Description of the connection
comment "HC-06";
}
root@debian:/# cat /etc/bluetooth/rfcomm.conf
#
# RFCOMM configuration file.
#
rfcomm0 {
# # Automatically bind the device at startup
bind yes;
#
# # Bluetooth address of the device
device 20:14:04:11:15:16;
# # RFCOMM channel for the connection
channel 1;
#
# # Description of the connection
comment "HC-06";
}
Nun die Pin des Geräts (Default ist 1234) setzen – Mac Adresse am Besten per Tabulator vervollständigen
root@debian:/# sudo echo „20:14:04:11:15:16 1234“ >> /var/lib/bluetooth/08\:3E\:8E\:E5\:1C\:5E/pincodes
Und den Bluetooth Daemon neu starten.
root@debian:/# sudo/etc/init.d/bluetooth restart
root@debian:/# sudo /etc/init.d/bluetooth restart
Befehle an den Bluetooth Client senden
Strings kann man nun einfach an das Gerät redirecten
ms@debian:~$ echo „beep“ >/dev/rfcomm0
Ausgabe des Bluetooth Clients lesen
Einfach mit cat die Gerätedatei ausgeben
ms@debian:~$ cat/dev/rfcomm0
==Commands==
led on
led off
beep
beep_d [duration]
==Commands==
led on
led off
beep
beep_d [duration]
ms@debian:~$ cat /dev/rfcomm0
==Commands==
led on
led off
beep
beep_d [duration]
==Commands==
led on
led off
beep
beep_d [duration]
Wer ab und an bei Sharehostern Dateien lädt kennt sicherlich Click’n’Load. Nach dem Klick auf einen Button im Browser füllt sich die Queue des Downloadmanagers mit neuen Files. Dabei werden Informationen zu Dateien per Http POST vom lokal laufenden Download Programm wie jDownloader oder PyLoad entegengenommen. Dies geschieht durch einen kleinen Webserver der auf dem Port 9666 lauscht. Wenn der Downloadmanager nicht lokal läuft funktioniert der Mechanismus leider nicht.
Mit einem SSH-Tunnel kann man den POST Request an einen anderen Rechner weitleiten. Dort muß neben dem Downloadmanager auch ein SSH-Server laufen.
In meinem kleinen Beispiel läuft Pyload auf einem Pi mit der Ip 192.168.0.110. Um den Tunnel nachzubauen mußt Du also nur die Ip anpassen:
Nachtrag 21.06.2014
Die Arbeit mit ssh kann man sich generell einfacher machen wenn man ein Configfile für das Tool benutzt. Dort kann man Aliase für Server definieren, deklarieren auf welchem Port sshd läuft oder welcher Key zur Authentifizierung genutzt werden soll. Nähere Informationen dazu gibt es bei den Ubuntuusers oder Nerderati.
Ich muß einen recht großen Haufen Daten von einer Mysqldatenbank nach Mongodb schaufeln. Das ganze spielt in der Kommandozeile.
app.js
var mysql = require('mysql');
config=require('./config').production;var connection = mysql.createConnection({
host : config.mysqlHost,
port : config.mysqlPort,
database: config.mysqlDatabase,
user : config.mysqlUser,
password : config.mysqlPassword});
connection.connect(function(err){if(err !=null){
console.log(err);}
connection.query("SELECT * from feeds",function(err, rows){if(err !=null){
console.log("Problem with Query "+err);}else{// Shows the result on console window
console.log(rows[0]);
connection.end();}});});
var mysql = require('mysql');
config=require('./config').production;
var connection = mysql.createConnection({
host : config.mysqlHost,
port : config.mysqlPort,
database: config.mysqlDatabase,
user : config.mysqlUser,
password : config.mysqlPassword
});
connection.connect(function(err){
if(err != null) {
console.log(err);
}
connection.query("SELECT * from feeds", function(err, rows){
if(err != null) {
console.log("Problem with Query " +err);
} else {
// Shows the result on console window
console.log(rows[0]);
connection.end();
}
});
});
Ich habe auf meinem Laptop 3 Möglichkeiten den Cursor über den Screen zu schubsen – via Touchpad, Trackpoint und meiner ergonomischen Linkshändermaus. Leider hat sich der Hersteller dieses edlen Geräts überlegt den Rechtsklick auf die Linke Taste zu legen und umgekehrt. Um diese Verhalten nur für die Maus zu ändern benötigt man das Kommando xpinput.
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.
Impressionen
Milight LED Lampen
Milight LED Lampe in blau
Milight LED Lampe in rot
Milight LED Lampe türkis
Milight LED Lampe in warmweiß
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:
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"] ; thenecho"You must enter a parameter: "echo" e.g. $0 allon"exit1fiincmd="$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"evalincmd=\$$incmdecho-n-e"$incmd">/dev/udp/"$ipaddress"/"$portnum"
#!/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(){returnfile_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 Aufgangif(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.
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!!! 🙂