Verbindung zu SMTP Server ohne telnet oder nc testen

Um die Verbindung zu einem SMTP Server zu testen um zum Beispiel einen Fehler durch eine Firewall auszuschließen nutze ich normalerweise telnet:

user@host ~ $ telnet mail.example.net 25
Trying 1.2.3.4...
Connected to mail.example.net.
Escape character is '^]'.
220 mail.example.net ESMTP Postfix

Wenn telnet nicht installiert ist geht das auch noch mit netcat:

user@host ~ $ nc mail.example.net 25
220 mail.example.net ESMTP Postfix

Heute hatte ich ein System auf dem beides nicht existierte. Da habe ich eine Methode mit python gefunden die sehr gut funktioniert hat:

user@host ~ $ python
Python 2.7.9 (default, Mar  1 2015, 12:57:24) 
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> conn=socket.create_connection(('mail.example.net',25))
>>> input=conn.makefile()
>>> print input.readline()
220 mail.example.net ESMTP Postfix

>>> conn.sendall('QUIT')
>>> conn.close()
>>> 

YourCar: Ein Carsharingmodell in Göttingen zur richtigen Zeit!

Heute möchte ich kurz etwas nicht technisches hier schreiben. Ich wohne seit über zehn Jahren in der kleinen Universitätsstadt Göttingen. Ursprünglich zum studieren hergekommen bin ich dann einfach zum Arbeiten da geblieben.

In einer kleinen Stadt braucht man als Student zum Fortbewegen nur seine Füße und bei Bedarf ein Fahrrad. Das Semesterticket war damals bereits so umfassend, dass ich in komplett Niedersachsen auch kostenlos Regionalverkehr mit der Bahn fahren konnte. Ein Auto brauchte ich nicht.

Die Rahmenbedingungen sind heute natürlich anders als vor zehn Jahren. Ich wohne nicht mehr im Studentenwohnheim, bin verheiratet und Vater von zwei Kindern. An unserem Mobilitätskonzept hat sich allerdings nicht viel geändert. Weiterhin machen wir viele Wege zu Fuß oder vorzugsweise mit dem Fahrrad. Als unsere erste Tochter geboren wurde haben wir uns einen Fahrradanhänger und einen Kinderwagen zugelegt. Außerdem haben meine Frau und ich beide eine Bahncard 50 und reisen längere Strecken gerne mit der Bahn. Auch die Nutzung der Busse der GöVB ist hin- und wieder dazugekommen.

Es wurde aber schon bemerkbar, dass gerade wenn man am Wochenende Freunde besuchen möchte und dann da mit Kinderwagen und einem Kind in der Bahn hin fährt, man ja zum Beispiel abklären muss, dass zum Beispiel genügend Kindersitze vorhanden sind. Wir haben dann immer mal wieder durchgerechnet aber sind letztendlich immer zu dem Entschluss gekommen, dass das Geld das wir im Jahr ohne Auto sparen mehr ist, als wir im Jahr für Mietwagen und Taxis ausgeben würden.

Als dann Kind zwei unterwegs war machte sich spätestens bei der Frage: „Wie kommen wir eigentlich dann wenn es los geht schnell ins Krankenhaus?“ wieder das Thema Auto breit.

yourcar-logo Mehr oder weniger zur gleichen Zeit gab es dann in Göttingen einen neuen Carsharing Anbieter: Das Startup YourCar. Das Konzept hinter dem Carsharing ist sehr simpel. Es gibt eine Autoflotte und ein definiertes Stadtgebiet in dem die Autos abgestellt werden können. Es sind genügend Autos vorhanden um eine gute Dichte auf dem Stadtgebiet zu erreichen. Auf einer Karte kann man sehen wo sich das nächste Auto befindet und nach der einmaligen Anmeldung kann man sich jederzeit eines schnappen und überall damit hinfahren. Eine Minute Autofahrt kostet 33 Cent, eine Minute Parken kostet 9 Cent. Abstellen kann man das Auto auf allen öffentlichen und nicht kostenpflichtigen Parkplätzen im definierten Stadtgebiet.

Neben ein paar Testfahrten zur Arbeit gab es dann auch zwei Fälle in denen es gut war direkt ein Auto zur Hand zu haben. Praktischerweise parkte auch jedes mal eines nur wenige Meter von unserem Haus weit weg, also genauso wie man sich es vorstellt.
yourcar1
Die erste Fahrt war auch gleich die ins Krankenhaus. Die Frau hat Wehen, eben gucken wo ein YourCar steht, am Haus vorfahren, parken, Frau einladen, ins Krankenhaus und da einfach auf einem öffentlichen Parkplatz abstellen und nicht weiter drum kümmern. Absolut super. Die ganze Aktion hat uns … 3,24€ gekostet. Kein Taxi wäre billiger gewesen und jeder Nachbar hätte uns mehr dafür gezahlt um ihn nicht zu der Zeit rauszuklingeln. Absolut Super!

https://twitter.com/pregopresto/status/654494034120081408

Beim zweiten Fall war es so, dass ich frei hatte und Zuhause war und meine Frau sich mit anderen Frauen zum Frühstücken mit Kindern verabredet hatte. Irgendwann klingelte dann das Telefon: Die Große hat sich einen nicht mehr identifizierbaren Gegenstand, vermutlich ein Legoteil in die Nase gesteckt und das kommt nicht mehr raus. Sie hätte beim Kinderarzt angerufen, der meinte wir sollten zum HNO-Arzt und der Kinderarzt hätte uns da schon gleich angemeldet. Ich möge doch bitte vorbeikommen und sie alle abholen m dann zum HNO-Arzt zu fahren. Auch in diesem Fall hab ich mir ein YourCar geschnappt und bin einmal durch die Stadt gefahren. Dank Rotz-und-Wasser-heulens war dann als ich ankahm ein gelbes Lego Funkgerät in Sichtweite und mit einer Pinzette und einem beherzten Zugreifen konnte ich das Ding aus der Nase meiner Tochter herausbefördern. Die Fahrt Fahrt zum Arzt konnten wir uns dadurch sparen. Auch hier war das YourCar die perfekte Lösung für uns. Zwei Kindersitze aus dem Keller fix in ein Auto werfen und losfahren können ist einfach superpraktisch. Taxi, Nachbarn oder eigenes Auto wären deutlich aufwendiger und teurer und ein Wagen nach einem „konventionellen“ Mietwagen-Konzept anzumieten hätte deutlich zu lang gebraucht.

Ich schreibe diesen Blogeintrag weil ich mir wünsche, dass das CarSharing von YourCar hier in Göttingen über ein Startup hinauskommt. Es ist gerade für unsere Stadtmobilität die perfekte Ergänzung zu dem was wir schon haben und was wir nun dazu brauchten. Ich wünsche mir ganz viele Kunden bei YourCar und dass ein nachhaltiges tragfähiges Geschäftsmodell daraus wird sowie weitere mögliche Kooperationen oder Fusionen mit anderen Göttinger CarSharing Anbietern um auch relativ einfach größere Autos zu mieten für einen längeren Zeitraum.

Smarthome? Monitoring? Notifications mit altem Android Handy!

Heute morgen bin ich über die coolste App seit langem gestolpert. Es handelt sich um den Home24-MediaPlayer (Google Play oder direkter Download der APK).

Die App ist nicht etwa ein stupider Media Player wie der Name vermuten würde, sondern eine ziemlich geniale Möglichkeit um Benachrichtigungen zu verschicken. Die App – einmal gestartet – lauscht per HTTP auf Port 50000 und kann per GET Parameter angewiesen werden unterschiedlichste Dinge zu tun. Man kann das Handy vibrieren lassen, eine Nachricht in den Benachrichtigungen anzeigen lassen oder den Bildschirm anschalten.
Einzelne Kommandos können mit einer | getrennt verknüpft werden. Kommandos mit Parametern können per & verknüpft werden. Das angesprochene Beispiel ist:

curl "http://192.168.1.1:50000/statusbar=Hallo Welt|vibrate|screentimeout=3"

Deutlich cooler sind aber die weiteren Funktionen. So ist es zum Beispiel möglich eine auf dem Gerät vorliegende MP3 abzuspielen. Damit kann man mit simplen Mitteln einen Türgong realisieren. Beispiel:

curl "http://192.168.1.1:50000/track=gong.ogg"

Noch besser finde ich die Text-To-Speach Funktion:

curl "http://192.168.1.1:50000/tts=Alarm! Der Einbruchssensor beim Fenster im Schlafzimmer wurde ausgelöst!"

Aber man kann – eine SIM Karte im Gerät vorausgesetzt – auch SMS verschicken. Ganz einfach:

curl "http://192.168.1.1:50000/sms=017612345678&message=Es ist keiner Zuhause, das Schlafzimmerfenster ist offen und es gibt eine Unwetterwarnung vor starkem Gewitter."

Eine Übersicht der Möglichen Befehle gibt es auf der Webseite vom Home24-MediaPlayer.

Der Phantasie sind hier keine Grenzen gesetzt. Benachrichtigungen auf dem Smartphone wenn man Zuhause ist, SMS wenn man nicht Zuhause ist, Türgong über einen angeschlossenen Lautsprecher und so weiter. Und als Sysadmin ist das eine supersimple günstige einfache Möglichkeit auch Benachrichtigungen zu bekommen…. Genial!

Anwesenheitserkennung für Smarthome mit der Fritz!Box via TR-064

Wer sich mit dem Kontext SmartHome beschäftigt, der hat früher oder später immer die Frage: Wie erkenne ich möglichst automatisiert, ob jemand zuhause ist oder nicht? Am einfachsten geht das mit dem Smartphone. Das hat man in der Regel bei sich. Der am häufigsten anzutreffende Ansatz ist dieses in regelmäßigen Abständen anzupingen und auf der Basis den Anwesenheitsstatus zu definieren.

Da ich mein Smartphone aber nicht anpingen kann fällt die Lösung für mich flach. Ich habe aber eine Fritz!Box und mein Handy bezieht darüber per DHCP eine IP-Adresse. In der Fritz!Box ist auch sichtbar, ob das Gerät aktiv oder nicht aktiv ist.

Die Fritz!Box hat eine Schnittstelle für Anwendungen basierend auf TR-064. Der Zugriff darauf muss in dem Webinterface unter

  • Heimnetz ->
  • Heimnetzübersicht ->
  • Netzwerkeinstellungen ->
  • Zugriff für Anwendungen zulassen

freigeschaltet werden. Anschließend kann via SOAP mit der Fritz!Box kommuniziert und unter anderem auch der Status eines angeschlossenen Gerätes ermittelt werden. Dafür muss man nur die MAC-Adresse kennen.

Die Antwort der Fritz!Box sieht dann zum Beispiel so aus:

<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <s:Body>
    <u:GetSpecificHostEntryResponse xmlns:u="urn:dslforum-org:service:Hosts:1">
      <NewIPAddress>11.22.33.44</NewIPAddress>
      <NewAddressSource>DHCP</NewAddressSource>
      <NewLeaseTimeRemaining>0</NewLeaseTimeRemaining>
      <NewInterfaceType>802.11</NewInterfaceType>
      <NewActive>1</NewActive>
      <NewHostName>mySmartphoneDevice</NewHostName>
    </u:GetSpecificHostEntryResponse>
  </s:Body>
</s:Envelope>

Für die Hausautomatisierung setze ich Homematic mit einer CCU2 ein. Dort habe ich eine Systemvariable definiert und über die XML API kann diese auch per GET aktualisiert werden. Dafür muss man nur die sogenannte ise_id der Variable kennen, die findet man unter der folgenden URL: http://ccu2/config/xmlapi/sysvarlist.cgi

Die Anfrage an die Fritz!Box und das anschließende setzen der Systemvariable in der CCU2 habe ich in PHP wie folgt gelöst:

<?php 
 
// Array of MAC addresses and coresponndig ise_id on ccu2
$check[] = array('mac' => 'AA:BB:CC:DD:EE:FF', 'ise_id' => '1234');
$check[] = array('mac' => '11:22:33:44:55:66', 'ise_id' => '4321');
 
 
for ($j = 0; $j < count($check); $j++) {
 
	$soapUrl = "http://fritz.box:49000/upnp/control/hosts";
 
	$xml_post_string = '<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" >
  <s:Body>
    <u:GetSpecificHostEntry xmlns:u="urn:dslforum-org:service:Hosts:1">
      <NewMACAddress>' . $check[$j]['mac'] . '</NewMACAddress>
    </u:GetSpecificHostEntry>
  </s:Body>
</s:Envelope>';
 
	$headers = array(
		"Content-type: text/xml;charset="utf-8"",
		"Accept: text/xml",
		"Cache-Control: no-cache",
		"Pragma: no-cache",
		"SoapAction:urn:dslforum-org:service:Hosts:1#GetSpecificHostEntry",
		"Content-length: ".strlen($xml_post_string),
        ); 
 
 
 
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $soapUrl);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_TIMEOUT, 10);
	curl_setopt($ch, CURLOPT_POST, true);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_post_string);
	curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
 
	$response = curl_exec($ch); 
	curl_close($ch);
 
	$parser = simplexml_load_string($response);
	$parser->registerXPathNamespace("a", "urn:dslforum-org:service:Hosts:1");
 
	$NewActive_h = $parser->xpath('//NewActive/text()');
	$NewActive =  $NewActive_h[0]->__toString();
 
	if ($NewActive == 1) {
		$result = file_get_contents("http://ccu2/config/xmlapi/statechange.cgi?ise_id=" . $check[$j]['ise_id'] . "&new_value=true");
	}
	else {
		$result = file_get_contents("http://ccu2/config/xmlapi/statechange.cgi?ise_id=" . $check[$j]['ise_id'] . "&new_value=false");
	}
}
?>

Als Cronjob laufen lassen irgendwo, zum Beispiel auf einem Raspberry Pi, und schon hat man eine korrekte Systemvariable in der CCU2 auf dessen Basis man dann weitere Dinge machen kann.