InfoFrame on Speed, the Sources

So, wie angekündigt, hier die Sourcen zu meinen Änderungen an den InfoFrame-Sourcen (inkl. eines BenzinPlugins, welches zumindest bei mir rudimentär funktioniert; für Gütersloh scheint es keine so häufigen Updates zu geben, sodaß meine relativ kurze TTL immer wieder mal zu keinen Ausgaben führt …
Kurz zusammengefaßt die Erweiterungen an der Basissoftware:

  • Möglichkeit, per HTTP-GET-Aufruf Sensordaten (gedacht in erster Linie für FHEM) in die InfoFrame-Datenbank zu übergeben.
  • Möglichkeit, zeitabhängig (relativ zum letzten Aufruf) die Hintergrundbilder durchzurotieren (Pictureframe-Betrieb mit InfoFrame-Addon, quasi). Die Hintergrundbilder werden alphabetisch sortiert abgerufen und seitenverhältnisrichtig auf die Ausgabegröße skaliert.
  • Multi-Client-Fähigkeit (Status wird in Abhängigkeit der anfragenden IP in der DB gespeichert); bei mir laufen derzeit 3 Rahmen von einem Server.
  • Über URL-Parameter können die Größe des auszugebenden Images geändert werden.
  • Möglichkeit, Plugins auf verschiedene Seiten aufzuteilen.
  • Exemplarisches FHEMPlugin zur Anzeige von lokalen Sensordaten.

Es gelten die gleichen (softwaretechnischen) Voraussetzungen wie bei der Quelle; getestet habe ich den Code auf meinem yaVDR-0.3-Rechner (Ubuntu Jaunty) mit …
PHP 5.3.2-1ubuntu4.7 with Suhosin-Patch (cli) (built: Jan 12 2011 18:36:08)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

…, installiert über das Ubuntu-Package-Management.
Für Hinweise zur Anbindung von FHEM an InfoFrame verweise ich auf den vorigen Beitrag, falls es unklar ist, bitte per Kommentar Fragen stellen, ich versuche diese dann in einem Folgebeitrag zu (er-)klären. Die weiteren Optionen sollten über die config.ini erklärt sein …

InfoFrame on Speed ;)

Nachdem mein WiFi-Bilderrahmen MeeFrame rund ein Jahr ungenutzt rumlag (da über MeeChannel nicht funktional und die initiale Idee, daß ich meiner Family dann via Picasa-Feed immer mal wieder Bilder aus Berlin auf den Frame schicke – Pendlerschicksal – auch nicht so richtig verfing) und mich bei einer krankheitsbedingten Auszeit beim Wertverlieren frech angrinste, surfte ich noch mal nach aktuellen Entwicklungen beim »InfoFrame-Projekt«, welches aus einer innovatigen Idee aus dem studentischen Alltag entsprang und sich lustigerweise im IP-Phone-Forum fortentwickelte — wohl anfänglich, da diese Implementation Features der Fritz-Boxen nutzt (und auf einer – »gefreezten« – FB lauffähig ist).

Da ich schon länger auf der Suche nach einem Display für Status-Werte, die meine Heimautomation FHEM auswirft, bin, studierte ich auch den InfoFrame-Hardware-Thread, allerdings ohne wirklichen Erfolg. Basierend auf Aussagen im VDR-Portal, die andeuteten, daß der SPF-87H unter Linux als dumme JPEG-Anzeige, ja sogar als Framebuffer, verwendbar sei, kontaktierte ich die Amazone meines Vertrauens und überbrückte die Wartezeit mit der Implementation des InfoFrame-Krams auf meinem neuen Nettop für yaVDR im Wohnzimmer. Dual-Core Atom mit Hyperventilation, äh, -threading, da sollte ja so’n bißchen Apache & PHP kein Problem sein …

Und in der Tat, bis auf die Notwendigkeit, libusb1 für Debian Lenny (Deskop-OS ist bei mir i. d. R. Ubuntu, auf den DockStars und sonstigen PlugComputern läuft i. d. R. Debian Lenny oder, wenn ganz neu aufgesetzt, Squeeze) aus den Backports zu ziehen, war sowohl die native Übersetzung auf ‘nem DockStar als auch die Ausführung der Binaries (spf87h-tool, playusb) herrlich unproblematisch, sodaß der Samsung SPF-87H nun von einem DockStar angesteuert wird (Prinzip: wget InfoFrame-Image, playusb, wait 20, redo once – und das minütlich per cron). Schick, und endlich mal schnell umgesetzt – da lacht das Hacker-Herz ;-)
Da mir der statische Hintergrund des normalen InfoFrames nicht zusagte, erweiterte ich erst einmal das PHP-Skript um dynamische Hintergrundbilder, basierend auf dem schon bei InfoFrame.org hinterlegten Gerüst.

Die Bilder werden im korrekten Seitenverhältnis auf die Bildgröße skaliert, die Bildgröße ist per GET-Parameter nuin auch wählbar. (Und bei Breiten unter 700 Pixeln wird die Datumszeile reformattiert, sodaß auch Mini-Rähmchen wie der Parrot-Rahmen ansteuerbar sind – ausgeben lasse ich auch 640×480, der Parrot rechnet das beim Empfang auf seine 320×240 Pixel zurecht.)
Eine weitere Ergänzung sind konfigurierbare »Seiten«, d. h. es können bestimmte Abfolgen von Plugins definiert werden, die auf einem Bild kombiniert werden, Mail, Weather, FHEM und Kalender zum Beispiel haben kaum auf 800×480 Pixeln sinnvoll

Ferner wurde die Möglichkeit geschaffen, relativ beliebige Sensordaten an InfoFrame zu übergeben — und z. B. vom FHEMPlugin ausgeben zu lassen. Auf FHEM-Seite wird per notify ein Skript gestartet …
define InfoFrameA notify .*_TH:T.* "/var/log/fhem/update_InfoFrame.sh "%NAME" "%
TYPE" "%EVENT""
define InfoFrameB notify WS3600_RH.*:.* "/var/log/fhem/update_InfoFrame.sh "%NAM
E" "%TYPE" "%EVENT""

…, update_InfoFrame.sh ist im Prinzip ein Wrapper, der die unterschiedlichen Parameter für den GET-Aufuf aufbereitet:
(/usr/bin/wget -O /dev/null -q "http://yavdr.local:1234/infoframe/?sensor=$SENSORNAME&type=$TYPESTR&value=$TEMPSTR") &
Welche Daten man, auch letztlich woher, an InfoFrame schickt, ist nicht genauer spezifiziert; die Magie muß das Plugin ggf. leisten, für TH (Temperatur- und Luftfeuchte-Sensoren vom Typ S300TH/S555TH) und getrennte Temperatur- bzw. Feuchtesensoren bringt das FHEMPlugin Logik mit, Rest muß man sich an die eigenen Bedürfnisse anpassen (oder den Warpper so schreiben, daß er die Daten wie erwartet ablegt ;-)):

mysql> select * from if_sensors;
+----------------‐--------------------‐------------‐--------------‐
| name | datum | typ | wert |
+----------------‐--------------------‐------------‐--------------‐
| Bad_TH | 2011-01-30 16:38:32 | TH | T:22_H:43.5 |
| Essz_TH | 2011-01-30 16:39:48 | TH | T:7.2_H:42.9 |
| Flur_TH | 2011-01-30 16:39:25 | TH | T:22.7_H:40.2 |
| Huette_TH | 2011-01-30 16:38:35 | TH | T:4.8_H:83.6 |
| Kammer_TH | 2011-01-30 16:30:39 | TH | T:22.9_H:38 |
| Keller_TH | 2011-01-30 16:34:20 | TH | T:19.6_H:36.6 |
| Parkplatz_TH | 2011-01-30 16:38:52 | TH | T:7.4_H:80.6 |
| Terrarium_TH | 2011-01-30 16:39:01 | TH | T:26_H:55.6 |
| WS3600_Forecast | 2011-01-30 16:39:22 | forecast | Cloudy |
| WS3600_Rain | 2011-01-30 16:39:22 | rain | R1h |
| WS3600_RHi | 2011-01-30 16:39:21 | humidity | 40 |
| WS3600_RHo | 2011-01-30 16:39:22 | humidity | 79 |
| WS3600_RP | 2011-01-30 16:39:22 | pressure | 1007.700 |
| WS3600_Tendency | 2011-01-30 16:39:22 | tendency | Falling |
| WS3600_Ti | 2011-01-30 16:39:21 | temperature | 22.6 |
| WS3600_To | 2011-01-30 16:39:21 | temperature | 0.5 |
+----------------‐--------------------‐------------‐--------------‐
16 rows in set (0.00 sec)

Zugegeben, das FEHMPlugin hat noch wenig Eye-Candy, aber in erster Linie ging es mir darum, die Werte sichtbar zu machen; ohne Browser sehen zu können, daß im Terrarium wieder Wasser nachgesprüht werden muß, ist schon recht praktisch — zumal dessen Bewohner das traditionelle Instrument gerne verbuddeln/umwerfen, der S300TH darin hingegen blieb bislang verschont.
Mit etwas Muße kann man, insbesondere auf den Icon-Set, welches für das WeatherPlugin schon vorhanden ist, da sicher was aufhübschen, aber ein Anfang ist schon mal gemacht ;)
Beim genauen Anschauen der Bilder fällt evtl. auf, daß der obere Bereich etwas abgedunkelt ist — das Problem ist, daß durch die Verwendung beliebiger Hintergründe es zu einem »weißer Adler auf weißem Grund«-Effekt kommen kann: man kann auf zu hellen Hintergründen die weiße Schrift nicht mehr (gut) erkennen. Der erste Trick war, das gesamte Hintergrundbild abzudunkeln, was aber oft wenig vorteilhaft ausssah. Somit dunkle ich derzeit nur die oberen 120 Zeilen ab und habe die Ausgabe des FHEM-Plugins auch nur für diesen Bereich vorgesehen. Das klappt bei vielen Querformatbilden auf meinen Rahmen (MeeFrame:, 800×600, SPF-87H: 800×480) recht gut, aber es bleibt ein Kompromiß. Optimal wäre eine (automatische) Abdunklung der Bereiche, in denen Ausgaben vorgenommen werden, derlei gibt aber die Ausgaberoutine nicht her. Deren eigenwilliges Verhalten ist auch der Grund, warum derzeit das FHEM-Plugin die Ausgabe mit »|« einrahmt — pixelgenaues Positionieren ist mit der Eierlegendenwollmilchsau-Routine nicht möglich (sie variiert die Baselein eigenmächtig), mehrzeilige Ausgaben orientieren sich an der benutzten Fläche, d. h. Texte mit Ober-/Unterlängen verbrauchen mehr Höhe als solche ohne. Weird ;-)
Das Skript zum Aktualisieren des Parrot-Bluetooth-Rahmens sieht wie folgt aus:

#!/bin/bash
# wusel@death:~$ hcitool scan
# Scanning ...
# 88:77:66:55:44:33 Parrot PHOTO
FRAMEBTADDR=88:77:66:55:44:33
SUFFIX="`date +%M|gawk '{printf("%d\n", $1%2);}'`"
wget -q -O /tmp/InfoFrame4Parrot.jpg 'http://yavdr.local:1234/infoframe/?width=640&height=480' 2>/dev/null
RC=$?
if [ $RC -eq 0 ]; then
/home/wusel/with_timeout +25 ussp-push ${FRAMEBTADDR}@ /tmp/InfoFrame4Parrot.jpg tmp-${SUFFIX}.jpg 2>/dev/null
fi

Leider überschreibt der Rahmen nicht empfangene Bilder gleichen Namens, sodaß in Bälde der (interne) Speicher voll sein dürfte; gut, den für 30 EUR aus UK bezogenen Rahmen hatte ich auch nicht primär für InfoFrame vorgesehen, sondem gedenke, ihn neuer Verwendung zuzuführen. Ihn für InfoFrame-Ausgabe zu verwenden ist insofern nur ein Proof-of-Concept ;-)
Ähnlich simpel ist auch die Ansteuerung des SPF-87H gelöst, nur daß hier playusb statt der BT-Übertragung eingesetzt wird:

#!/bin/bash
PWD="`pwd`"
cd /nfs/20090924-1TB
for times in 1 2
do
wget -q -O infoframe-tmp.jpg 'http://yavdr.local:1234/infoframe/?width=800&height=480' 2>/dev/null
if [ $? -eq 0 ]; then
/root/playusb -j infoframe-tmp.jpg 2>infoframe-dbg.out 1>&2
FAIL=$?
if [ $FAIL -ne 0 ]; then
/root/spf87h-tool 2>/dev/null 1>&2
fi
if [ $times == 1 ]; then
sleep 20
fi
fi
done
cd $PWD

(Da der DockStar von einem Flash-Medium läuft, gehe ich auf eine typischerweise sowieso oft aktive Platte und lege die Dateien dort ab.) Der Aufruf von spf87h-tool an dieser Stelle bringt nix, falls sich der Rahmen nicht in Vorbereitung auf den USB-Monitor-Modus befindet, was er erst nach manueller Intervention an den Knöpfen dort in Erwägung zieht, zumindest bei meiner Version. Allerdings läuft er nun auch seit zwei Tagen so durch, solange also in relativ kurzen Intervallen neue JPEGs kommen, scheint zumindest meiner diesen Modus nicht zu verlassen. Ich habe den Aufruf an der Stelle primär für den Fall drin, daß er sich mal aufhängt und ich ihn manuell in den USB-Monitor-Modus bringe – das Skript sollte dann ohne händisches Login die Umschaltung erledigen. Ob’s so klappt, wird die Zukunft zeigen …
Meinen MeeFrame habe ich übrigens über den Einsatz von MediaTomb an den Start gebracht. Per wget (Schema-F ;)) legt die yaVDR-Box jede Minute das aktuelle Bild in ein Verzeichnis, welches wiederum MediaTomb (als einziges) mittels inotify überwacht. Der MeeFrame nutzt über die Einstellung »MeeBox« den MediaTomb als UPnP-Server und streamt den Inhalt dieses Verzeichnisses (1 Bild ;-)) auf sein Display als Diashow. Leider ist auch das nicht rebootfest, sprich nach einem Neustart muß man wieder über den Touchscreen des MeeFrames navigieren: Bilder -> MeeBox -> (Serverauswahl:) MediaTomb -> PCDirectory -> Pfad -> zur -> Datei und dann in der Vorschau rechts das Bild anklicken und nach dem initialen Laden noch die Diashow mit Touch auf’s Dreieck-Icon oben starten. Lästig, aber immerhin. Wie lange das ohne Interaktion durchläuft, muß sichnoch erweisen; leider kennt der MeeFrame auch keine Schlafzeiten, wenn man ihn nicht abschaltet, läuft diese Diashow Tag und Nacht. (Wobei sie mir einmal nach 24h abgebrochen ist: Frame-Reboot – WinCE läßt grüßen? ;-))
Ich werde nun noch die Sourcen zusammenpacken, evtl. etwas (besser) kommentieren und dann später heute abend hier in einem Folgebeitrag ablegen, auf den ich dann auch im InfoFrame-Thread im IP-Phone-Forum verweisen werde.

Not my day (II)

(Blogged via flickr)

Wohnungssuche auf dem China-Tablet (Eken M002) – wie so vieles dort, ein Satz mit X :(

Kamera: Nokia N900 (Brennweite 5.2mm, f/2.8)

Not my day (I)

(Blogged via flickr)

Alte Fritz!Box 7170 entstaubt, da Speedport W503V bei Kollegin meiner Frau abgeraucht, Telekom-Shop sagt, Austauschgerät kommt nächste Woche (die Zeit, in der die Existenz der T-Shops für T-Kunden noch einen Vorteil darstellte, ist vorbei, ja?) … Super Service; denn es ist ein T-Entertain-Anschluß, ohne Router also auch kein TV … Tja, nur hat dieses Schätzchen von Fritz!Box noch eine uralte Firmware, 29.03.99 – und von der kommt man auf keine aktuelle (29.*04*.80 ist aktuell): Imagedatei zu groß. Ich bräuchte eine 29.04.30, die aber nicht mehr bei AVM downloadbar ist und auch sonst im Netz nicht auffindbar. An dieser Stelle ein freundliches ‘Flickr Euch!’ (spannend, dieses Wörterbuch von Android; ich hatte ein anderes F-Wort getippt …) an’s ‘Fachinformatiker Forum’ (www.fia-fis.de) – der Link dort auf einen externen Hoster, für dessen Entschleierung man sich erst anmelden und dann auch noch einmal posten muß (spätpubertierende Sysops, allem Anschein nach), geht nicht mehr, was seit Juni 2010 dokumentiert ist, aber die Admins dort nicht juckt; ein weiteres Paradebeispiel, warum dieser Forenquatsch nicht ins Internet gehört sondern in den Haustiernetzen hätte bleiben sollen. Narf. Anyway: auch eine Flashen von Windows aus mit AVMs Recovery-EXE schlägt fehl (s. Screenshot). Großes Kino also – hat noch wer ‘ne niedrige 29.04er-Fritzbox-FW im Zugriff?

Kamera: Motorola Milestone (f/2.8)

Für die Sache!

(Blogged via flickr)

Mal wieder die internen Magnete neu einschwingen lassen. Watt kost’ so’n MRT-Lauf eigentlich?

Kamera: Nokia N900 (Brennweite 5.2mm, f/2.8)

#followerpower Mathe Klasse 5 – WTF geht 7. a)?

(Blogged via flickr)

Entweder sind die Aufgaben im Buch falsch oder ich hab’ mein bc nicht mehr im Griff … Es sollte letzteres sein, aber eigentlich tippe ich auf Fehler im Mathebuch … Erleuchte mich doch mal wer, was ich übersehe, wenn bei mir immer ‘keine’ rauskommt :)

Kamera: Motorola Milestone (f/1.1)

Gütersloh, die Alten-Stadt

(Blogged via flickr)

Ein Platz zum altwerden, Seniorenstifte scheinen das Gros der Neubauvorhaben auszumachen. Und dann noch as überdimensionierte, überteuerte neue Theater …

Kamera: Vignette Vignette for Android

#Squeezeslave Nr. 3

(Blogged via flickr)

So, vorhin Guruplug entstaubt, als WLAN-Client an Fritzbox gehängt, USB-Boxen (Logitech SB-150) dran, squeezeslave-Binary drauf, fertig ist der Player für’s Kinderzimmer. Im Arbeitszimmer dann USB-Adapter (€ 3,–) und ‘USB-Boxen’ (Logilink SP0006; USB ist da nur für Strom, aber dafür ‘USB Highspeed’-Logo) für 10,– in 10fach USB-Hub (und den Audioadapter …) am Dockstar gesteckt, squeezeslave-Binary drauf, fertig ist die Laube. Das rockt, so Musik um sich herum … Jetzt muß ich mir für die Arbeit wohl doch was einfallen lassen *sigh*

Kamera: Vignette Vignette for Android