Verkehrsprojekt Deutsche Einheit Nr. 8: So ändern sich die Reisezeiten

Reisezeitänderungen von MünchenDass die Verbindung München-Berlin schneller wird, haben alle mitbekommen, aber was heißt das für den Rest?

Der Vergleich der alten mit den neuen Reisezeiten von München aus, macht einem sofort klar, dass das Verkehrsprojekt Deutsche Einheit seinem Namen alle Ehre macht. Praktisch jede Reise die in den neuen Bundesländern beginnt oder endet profitiert von schnelleren Verbindungen.

Im folgenden eine interaktive Karte. Im Menü lässt sich einer von 8 Startbahnhöfen auswählen. Die Karte zeigt die Änderung der Reisezeit zum Fahrplanwechsel für jeden Zielbahnhof in Deutschland. Weiße Bereiche haben keine oder nur geringfügige Änderungen, in grünen verkürzt sich die Reisezeit, bei roten wird sie länger.


3 Wege zum Funksteckdosen hacken

Steckdosen mit Funkfernbedienung sind super praktisch, wären aber noch praktischer wenn man nicht auf die Fernbedienung angewiesen wäre.
Vor einiger Zeit habe ich mir günstige ALDI Funksteckdosen (Tevion GT-9000) besorgt und gehofft, diese recht einfach mit einem Gerät wie der CUL ansteuern zu können. Leider Fehlanzeige, unbekanntes Protokoll, hat noch keiner vorher gemacht etc. Für die ebenfalls günstig zu erstehenden Intertechno (ELRO) Steckdosen gibt es genug Material im Internet, aber diese hier sind doch etwas hartnäckiger.

Die CUL erlaubt später Kommandos zu senden, kann bequem an den Router angeschlossen werden und über FHEM kann man dann über das Smartphone und Apps die Geräte steuern.

Funksteckdosen sind zumeist sehr einfach gestrickt. Sie senden recht kurze Datenpakete mittels einfachem ASK/OOK.

Methode 1: Timings und Daten via CUL auslesen

Die CUL hat einen Monitor Mode, der einem die Zeit seit der letzten rising/falling flank ausgibt. Die bisherige Version hatte ein paar Fehler was die Timings insbesondere am Anfang und Ende von Paketen betraf (siehe auch), aber in github:rumpeltux/culfw/tree/tevion gibt es eine verbesserte Version. Zunächst also die CUL anstecken und aktualisieren:

git clone https://github.com/rumpeltux/culfw.git
cd culfw
git checkout tevion
cd culfw/Devices/CUL
make TARGET=CUL_V3 MCU=atmega32u4 build size
echo 'B01' > /dev/ttyACM0 # Reboot the device for flashing
make usbprogram_v3

Meines Erachtens sehr hilfreich ist auch LONG_PULSE anzuschalten, damit werden auch Pakete > 4ms korrekt geloggt.
Dazu einfach: #define LONG_PULSE in die Datei board.h eintragen und mit obigen Schritten neu kompilieren und flashen.

Mit folgendem Befehl startet man den Monitor Mode:

echo X98 > /dev/ttyACM0

Allerdings ist die binäre Ausgabe davon zunächst vollkommen unbrauchbar. Zur Analyse kann das raw_analysis.py tool verwendet werden, das versucht aus einem raw dump die gesendeten Paketdaten und -parameter herauszufinden.

Als erstes werden einige Daten aufgezeichnet, die im Anschluss analysiert werden.

python tools/raw_analysis.py --pause 4000 --plot /dev/ttyACM0

Nun die gewünschte Taste auf der Fernbedienung drücken, ggf. gedrückt lassen damit mehr Pakete gesendet werden und dann Ctrl+C zum Abbrechen der Aufzeichnung drücken. Mit --plot bekommen wir einen Plot der Daten um zu sehen was aufgezeichnet wurde:

python tools/raw_analysis.py --pause 4000 --plot /dev/ttyACM0

Plot of Hightimes & Lowtimes of the received signal

Die Höhe der Ausschläge ist die Signalqualität, die Zeitachse ist in ms, wobei die Pause zwischen Paketen nicht angezeigt wird, aber ein Paketende durch eine Schräge angezeigt wird (z.B. ganz am Anfang im Bild). Auch das Kodierungsschema für Bits ist klar erkennbar: kurz-lang für eine 0, lang-kurz für eine 1.
Wenn wir den Plot schließen sehen wir auch eine Liste der erkannten Pakete. Manche sind 1 bit zu kurz, aber oft wurden sie richtig erkannt.
Hier stehen auch die erkannten Timings (in Einheiten zu je 16μs):

Global Timings: [28, 62, 56, 33] (hi0, lo0, hi1, lo1)

  • ‘0’ Hightime: 28 (=0.45ms)
  • ‘0’ Lowtime: 62 (=0.99ms)
  • ‘1’ Hightime: 56 (=0.90ms)
  • ‘1’ Lowtime: 33 (=0.53mμs)
Auch die eigentlichen Paketdaten werden gemessen. Hier haben wir es also mit Paketen bestehend aus je 24bit + 1 einem Sync-Bit zu tun. Pausezeiten wurden ebenfalls gemessen und das Tool spuckt einem einen CUL Befehl aus, der ein ähnliches Paket zu senden versucht.

Mit etwas Glück reicht es, diesen Befehl an die CUL zu schicken und die Steckdose schaltet. Leider sind die gemessenen Timings nicht immer 100% akkurat (bei mir habe ich z.B. einen leichten Bias bzgl. einer zu kurz gemessenen hightime festgestellt), es lohnt sich also die Werte ein bisschen zu variieren. Zum Bau der CUL Kommandos zum Senden der Pakete ist das tool in docs/rawcmd.html ebenfalls sehr hilfreich.

Hat man weiterhin keinen Erfolg, kann man mit folgenden Mitteln nochmal genauere Daten bekommen, die dann hoffentlich ausreichen, um die entsprechenden Kommandos zu konstruieren.

Methode 2: Timings mit der Soundkarte analysieren

Diese absolute low-cost Variante reicht zumindest zum Sniffen der Daten vollkommen aus. Zum Senden benötigt man dann wieder Hardware wie z.B. die CUL oder günstig erhältliche 433 Mhz Sender, die man dann z.B. mit einem Arduino oder Raspberry Pi steuern kann. Zur Analyse nehme ich Baudline, aber eigentlich tut auch jeder andere Audioeditor in dem man die Waveform des Signals sehen kann.

Ich habe ein Cinch-Kabel genommen in den Mikrofoneingang gesteckt und das andere Ende des Kabels auf verschiedene Pins der Fernbedienung gehalten in der Hoffnung, dass auf einem der Pins ein Signal wahrnehmbar sein wird, das etwas mit dem gesendeten Funksignal zu tun hat. In der Tat, ist das fast auf jeder Pin der Fall und das Signal sieht dann z.B. wie folgt aus:
Baudline: Headphone Jack

Man sieht zwar nur die Übergänge, aber das reicht um das Signal rekonstruieren zu können schon aus.
Die Timings können wir diesmal ganz exakt ablesen:
Kurz ist 0.5ms und lang 1ms. Ein Bit also immer 1.5ms. Nach jedem Paket folgt ein syncbit mit einer hightime von 2.8ms und einer lowtime (Pause) von 6.7ms.

Die Daten könnte man demnach hier auch manuell dekodieren, aber das hat das raw_analysis Tool in Methode 1 bereits für uns getan. Auch hier hilft letztendlich wieder  docs/rawcmd.html beim Erstellen eines Pakets mit den gemessenen Daten/Timings.

Methode 3: RTLSDR

Statt der Soundkarte, kann man auch ein Software Radio zur Aufzeichnung benutzen und muss nun die Fernbedienung nicht einmal mehr aufmachen bzw. könnte z.B. auch nach Signalen der Nachbarn suchen. Dank eines DVB-T Sticks der sich als Software Defined Radio missbrauchen lässt (siehe RTLSDR), gibt es kompatible Hardware zur Aufzeichnung bereits unter 15€.

Nun einfach auf die gewünschte Frequenz tunen und die Aufzeichnung starten:

rtl_sdr logfile.raw -s 2e6 -f 433.92e6

Anschließen kann man sich die Daten z.B. wieder mit Baudline ansehen:
baudline -reset -basefrequency 433920000 -samplerate 2000000 -channels 2 -format u8 -quadrature -stdin < logfile.raw
Baudline Graph showing the recorded waveform

Auch hier kann man die Timings wieder exakt ablesen. Man sieht auch, dass das lange Sync Bit und die anschließende Pause, die am Ende von jedem Paket kommt, eigentlich den Beginn eines Pakets signalisiert, aber da man beim Senden die Pakete eh ein paar Mal wiederholt, ist das zu vernachlässigen.

Zu guter Letzt: Benutzung der Befehle in FHEM

Die raw Pakete, die man mit der CUL sendet, kann man auch zur Steuerung in FHEM einsetzen. Mit andFHEM lassen sie sich dann auch per App steuern. Hier eine Beispielkonfiguration:

define Stehlampe dummy
attr Stehlampe onOffDevice false
attr Stehlampe room Wohnzimmer
attr Stehlampe setList on off
define taste_1_1_An notify Stehlampe:on set CUL raw G0030751f3e3e1fb6012345
define taste_1_1_Aus notify Stehlampe:off set CUL raw G0030751f3e3e1fb6abcdef

Ich hoffe mit den Tools und Methoden lassen sich weitere Geräte und Protokolle noch schneller untersuchen und dann auch leicht in die Heimautomatisierung einbinden.

Ryan air flight route map without silverlight

Update (Nov 2014):
The new version on their website doesn’t require silverlight anymore. I’ll not update the map again and probably turn it down completely at some point.


Ryainair Flightmap JS-Version ScreenshotI’m not sure why they made this stupid mistake of providing their map data in silverlight only. However, here is a javascript-only version of the ryan air flight map data based on Google maps, which I made quickly and will hopefully benefit others as well.

Announcing Osmatravel

Illustration of a map created using osmatravel

Update: This project is obsolete now. Use the {{mapframe}} with PoiMap2 in Wikivoyage instead.

Quite frequently I refer to WikitravelWikivoyage for information on places which are not covered by my guidebook, but a key-element that is pretty much always missing is: maps. Of course there is OpenStreetMap, but when I see a listing in a Wikitravel article, I also want to know where it is.
So someone else came up with a great idea, based on two facts:

  1. The listings in Wikitravel articles are mostly in a xml-format, i.e. machine-readable.
  2. Most names of these objects are also found as entries in OSM data.

Thus, he created a set of scripts and magic that is able to semiautomatically generate a map to a wikitravel article and put all the listings there, so that these can be easily located. The project is based on osmarender for rendering of raw osm-data into an image, thus the name osmatravel. Unfortunately there are some issues and the project did not receive any attention since 2009 making it practically unusable.

Illustration of a map created using osmatravelHowever, I invested some time, did a fork (github:osmatravel) and a lot of changes and adjustments, allowing anyone to create cool maps again (instructions).

See also:

What’s next?
During my time working on the project I discovered some limitations. The main one is that osmarender just uses xslt and maps don’t look as nice as mapnik ones. However, mapnik requires a database to work, which is a drawback concerning easy setup and usability.
Another main problem is data quality since some articles don’t use the xml-listings yet or the names don’t quite match the OSM ones, thus before being able to actually produce maps, cleanup needs to be done.
I imaging though that the ideas could be used to implement a webservice that automatically generates the svg-files for articles. This would make it much easier for people to actually make use of this project.

Building a color world map

I’m trying to use the data of xkcd’s color survey to produce a kind of political map of color the HSV color world. This is getting way more complicated than I thought initially 😉

Here is the initial plain world map of HVS color space (mapped 2D i.e. not including greyscale):
2d view of hsv colorspace

Well, with this mapping comes a problem, best illustrated by this graph of the survey’s data density mapped into HSV space (the survey data is distributed just fine, but when mapping RGB to this crippled HSV, things get weird). White is much data, black is none:
density when converting from RGB to HSV
So here is a couple of things that suck as well when playing around: noisy data, spelling (xkcd has a list), RGB, gimp, HSV, python (occasionally) and most of all: colors (that’s not true, colors rock!). Things that rock too: python, PIL (sometimes), PNG, mogrify.

Anyways, I’m not yet completely there, but some of my intermediate results are already pretty cool, so have a look.
initial color speckles
I actually forgot how I produced this map, but I guess it shows top-40 colors people describe at each point of the HVS space mapped to color most fitted by the word they used. Dots are slightly bigger because I added a 3×3 gaussian filter to input data.

A lot of more coding and quite some magic allowed to get the borders for continents, so I hereby present you the first HSV color continents map:
hsv continents world map
So now, you might be thinking: if he’s producing a continent map, why can’t he do the countries the same way?
Well, countries are much more complicated, as they tend not to be so well seperated as continents. Also many people just answer “green” for all kinds of green-tones, so in the “light green” area, there is a lot of “green” noise, but I figured that out already.

plain simple country map
However, if you look at this map, there are some areas for which it is quite clear, which country they should be (e.g. yellow is very well seperated from the others), but several blue, green or purple tones are still troublesome.
My current approach is to find these troublesome areas, so that I can declare these as war-zones colors are still fighting for. Doing so, produced a map with the colorblend for each pixel and the likelyhood of being the right choice in the alpha channel. Looks cool, eh?

countries with likelihood alpha

To get to the final map shouldn’t take too long, but then again I already worked way to long on this, so I might only finish it in a more distant future.