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.

Facebook SDK für Android einrichten

Quelle: Facebook Developers

 

  •  SDK runterladen 
  • Zip entpacken, alles nach Eclipse exportieren (ohne in den Workspace zu kopieren)
  •  Evtl. Project -> Clean ausführen
  • Developer Account anlegen
  • Key Hash mit dem keytool  (liegt in <JDK Folder>/bin) erzeugen
  • (Linux, Mac) keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
  • (Windows) keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl base64
  • Im Profil Key Hash unter Sample App Settings eintragen.

 

Beispiele Testen.

Skeleton für Webviews in Android

package de.schmitt.michael.webview;
 
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
 
@SuppressLint("SetJavaScriptEnabled")
public class ActivityMain extends Activity {
	protected WebView wv;
	private final static String URL="http://www.google.de/";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
 
		 WebView w = new WebView(this);
		 w.setWebViewClient(new WebViewClient());
		 w.getSettings().setJavaScriptEnabled(true);
		 w.loadUrl(URL);
		 setContentView(w);
 
 
	}
}

Mehr zum Thema in der Android Dokumentation

Google Cloud Messaging (GCM) Tutorial

In diesem Beitrag geht es darum wie man Nachrichten via GCM an Apps verschicken kann.

Viele Android Apps sind klassische Client/Server Anwendungen. Der Client tätigt Requests an einen Server und bekommt im besten Fall eine vernünftige Antwort. In anderer Richtung ist dies jedoch nicht so einfach. Wenn der Server Daten an 1 bis n Clients senden möchte ist das in diesem Szenario nicht so einfach. Mobiltelefone sind meist nicht über eine statische IP zu erreichen, es ist nicht sichergestellt, daß das Gerät mit dem Internet verbunden ist wenn eine Nachricht versendet wird. Wenn der Client regelmäßig den Server anpollt kostet das Bandbreite und elektische Leistung.

Continue reading

Eclipse – Android Quelltexte einbinden

Beim Debuggen von Android Apps kann es sehr hilfreich sein einen Blick in die Systemklassen zu werfen. Davon abgesehen hat das Lesen von fremdem Code noch keinem geschadet.

Wenn die Sourcen von Android nicht eingebunden werden sieht man beim  Klick auf eine Systemklasse meistens sowas

Class Editor - acitivity not found

 

Das Einbinden der Quelltexte ist keine große Herausforderung, allerdings ist der Weg ein wenig schwer zu merken (deswegen dieser Artikel). Die Anleitung bezieht sich auf  die Android Developer Tools Build: v22.0.0-675183 auf Windows 7. Der Vorgang sollte auf richtigen Betriebssystem analog verlaufen.

Zuerst müssen die Sourcen via SDK Manager installiert werden:

sdkmanager

Anschließend muß der Build Path angepasst werden

3_config_bpath

 

Nun auf Libraries klicken, android.jar ausklappen, edit und den Pfad auf die Sourcen setzen.

Du findest den Code im Verzeichniss

$ECLIPSE_DIR\adt-bundle-windows-x86_64-20130514\sdk\sources\android-17

Wenn der Pfad korrekt gesetzt wurde kann sollte es so ausschauen:

5_fin

Fin.

 

Noch ein wenig Off-topic

Wer diesen Artikel via androidblogs.de gelesen hat wird sich vielleicht wundern wer ich bin und was das alles hier soll. Da ich keinen Hallo Welt Artikel in den Planeten jagen wollte nutze ich meinen 1. Artikel um mich vorzustellen:

Mein Name ist Michael, auf meinem Blog geht’s um alles mögliche, Linux, Android, Skripten + Programmieren, kleine Computer und was mir sonst so geschieht oder schief geht. Verschiedenste Telefone und Tablets mit dem Google Betriebssystem nutze ich seit ca 3. Jahren.

Java programmiere ich seit mehreren Jahren, als kleines Nebenprojekt arbeite ich mich in die Entwicklung von Android ein. Wenn Interesse besteht werde ich interessante oder nützliche Dinge in den Feed von Androidblogs.de jagen.

PHP Unit ohne Pear usw. installieren

Unit Tests machen nicht nur Sinn, sondern auch Spaß und erleichtern das Leben. Für PHP gibts PHPUnit.

Auf die Schnelle  geht’s so (bin Verzeichniss in ~ benötigt):

[schmimi2@cepheus ~]$ cd ~/bin
[schmimi2@cepheus bin]$ wget http://pear.phpunit.de/get/phpunit.phar
[schmimi2@cepheus bin]$ mv phpunit.phar phpunit
[schmimi2@cepheus bin]$ chmod +x phpunit
[schmimi2@cepheus bin]$ bash

Zum Testen einfach das File StackTest.php mit folgendem Inhalt erzeugen:

<?php
 
 
class StackTest  extends PHPUnit_Framework_TestCase
{
    public function testPushAndPop()
    {
        $stack = array();
        $this->assertEquals(0, count($stack));
 
        array_push($stack, 'foo');
        $this->assertEquals('foo', $stack[count($stack)-1]);
        $this->assertEquals(1, count($stack));
 
        $this->assertEquals('foo', array_pop($stack));
        $this->assertEquals(0, count($stack));
    }
	public function testFail(){
		$this->assertEquals(false,true);
 
	}	
 
}

Test laufen lassen:

[schmimi2@cepheus unittests]$ phpunit StackTest.php 
PHPUnit 3.7.21 by Sebastian Bergmann.
 
.F
 
Time: 0 seconds, Memory: 2.75Mb
 
There was 1 failure:
 
1) StackTest::testFail
Failed asserting that true matches expected false.
 
/var/www/virtual/schmimi2/api.giftimessen.de/unittests/StackTest.php:19
 
FAILURES!
Tests: 2, Assertions: 6, Failures: 1.

DB Dumps in Mysql importieren

Irgendwann sitzt man vor dem Dump einer Datenbank und möchte diesen in sein RDBMS einspielen. Das ist keine große Sache, aber je nach Dump muß man ein wenig Zeit mitbringen und vielleicht ein wenig tricksen. Um Verwirrungen zu vermeiden nenne ich den Mysql Server RDBMS – also relationales Datenbank Management System. Unter Linux heißt der Prozess mysqld. Das RDBMS verwaltet wie der Name schon sagt Datenbanken die Tabellen mit Daten enthalten. Soweit so klar? Auf gehts ab gehts 🙂

Das Tool meiner Wahl für den Import – und auch um Queries abzusetzen –  ist der mysql Client.

Verbinde Dich auf die Maschine auf der mysqld läuft und starte mysql

mysql -u <user> -p

Mit -p wird die Passwortabfrage für den angegebenen Nutzer erzwungen.

Nun wird eine Datenbank angelegt in die der Dump geschaufelt wird

mysql> create database dump;

Befehle werden immer mit einem Semikolon terminiert. Mit   q kann man den Mysql Prompt jederzeit verlassen.

Eine einzelne Datei mit Tabellenbeschreibungen und Werten läßt sich so importieren:

mysql -u root -p  <DBNAME>  < sqldump.sql

Der Inhalt der Datei sqldump.sql wird einfach zum mysql Befehl umgeleitet. In meinem Beispiel ist DBNAME=dump.

Mit dem Schalter -v (verbose – gesprächig) kann man mysql bei der Arbeit zusehen oder die Ausgabe analysieren.

Wenn der Dump aus mehreren Dateien besteht gibt man die einfach mit cat aus und leitet sie an mysql weiter:

cat *sql |mysql -u root -p <DBNAME>

Man kann der Datenbank auch beim wachsen zusehen, dafür ist der Befehl du ideal:

watch du -h /var/lib/mysql/<DBNAME>

Bitte beachte, daß der Befehl kann nur als Root User erfolgreich ausgeführt werden.

Manchmal steht es mit der referentiellen Integrität des Dumps nicht zum Besten. Mit der Option -f kann man das Laden erzwingen. Allerdings ist ein Datenverlust beim Import sehr wahrscheinlich

cat *sql |mysql -f -u root -p <DBNAME>

Wie ich schon schrieb muß man je nachdem was und wieviel man importieren möchte ein wenig Zeit mitbringen.

Angepasste RSS Feeds für WordPress

Aus gegebenen Anlass muß ich mich mal wieder mit meiner liebsten Blog/ CMS Software beschäftigen. Genauer gesagt geht es um Feeds und wie man sie aus WordPress rauskitzeln kann.

Wenn man /feed an die Url anhängt wird statt Html Xml ausgegeben:

http://schmiddi.co.cc/feed/

 

Dank mod_rewrite kann man den Feed nach verschiedensten Parametern filtern:

http://schmiddi.co.cc/2010/feed/

http://schmiddi.co.cc/category/linux/feed/

http://schmiddi.co.cc/tag/sticker/feed/

http://schmiddi.co.cc/comments/feed/

 

Mit GET Parametern sind dem Spaß keine Grenzen mehr gesetzt. Dem ungeübten sei gesagt, daß GET Parameter für Rattenschwanzlange Links verantwortlich sind.

Der 1. Parameter hängt mit einem Fragezeichen an der aktuellen Url, weitere kann man mit einem & Zeichen anhängen.

Um Einträge der Kategorie Linux anzuzeigen muß diese Url aufgerufen werden:

http://schmiddi.co.cc/feed/rss/?cat=7

 

Die ID 7 habe ich aus der Datenbank. Die WordPress Entwickler haben sich ein schlüssiges und gut verständliches Schema ausgedacht.

Einen Überblick über die Kategorien deines Blogs bekommst Du mit diesem SQL Befehl:

SELECT t.name, t.term_id
FROM wp_terms AS t, wp_term_taxonomy AS tax
WHERE tax.taxonomy = 'category' AND tax.term_taxonomy_id=t.term_id;

Wenn man eine Kategorie ausblenden möchte muß man das Minus Zeichen benutzen:

http://schmiddi.co.cc/?cat=-3

 

 

Man kann auch mehrere Id’s übergeben. Diese müssen mit einem Komma getrennt werden:

http://schmiddi.co.cc/feed/?cat=8,9,10,11,13,18,20

 

Weitere Parameter füge ich hier ein sobald ich sie benötige.