InfoFrame: Digitaler Bilderrahmen (Anzeige von Anrufen, E-Mails, Termine, Wetter...)

Habe mein Problem jetzt dadurch gelöst, dass ich den Download der gecachten weather.xml mit meiner Fritzbox erledige (mittels wget und wput im refresh.sh-Skript).
Die doUpdate-Funktion in der WeatherPlugin.php habe ich deaktiviert.

Wenn es stabil und zuverlässig läuft werde ich meine geänderten Code-Zeilen veröffentlichen.

Gruß

fwalter
 
Hallo!
Ich jetzt auch mal an dem Infoframe versucht und habe alles auch soweit gut am laufen.
Nun habe ich versucht mir ein eigenes Plugin zu schreiben, welches mir Werte von meinem Fhem-Server aus einer .xml ausliest und diese dann darstellen soll.
Die auszulesende xml liegt im cache Ordner auf dem Server.

Nur leider wird das ganze jetzt ohne meine auszulesenden Werte auf dem Frame angezeigt. (Siehe Screenshot)

Könnte wohl jemand einen Blick auf meine php werfen, wo da der Fehler liegt?
Ich habe leider von php so gut wie keinen Plan und hab das ganze mehr oder weniger mit copy&paste realisiert.

Code:
class FhemPlugin implements IPlugin
{
    private $dbconn = NULL;
    private $config = NULL;
    
    public function __construct($dbconn, $config) {
        $this->dbconn = $dbconn;
        $this->config = $config;        
    }
    
    // update all feeds
    public function doUpdate() {
        $title =( $this->config['title'] );
        
    if (file_exists('cache/fhem.xml')) {
                    $xml = simplexml_load_file('cache/fhem.xml');
        if($xml) {
    
                    $current_temp_bad = $xml->fhem->Bad->Bad_Heizung_ist['data'];
                    $desired_temp_bad = $xml->fhem->Bad->Bad_Heizung_soll['data'];
                    $current_window_state_bad = $xml->fhem->Bad->Bad_Fenster['data'];
                    $current_temp_kueche = $xml->fhem->Kueche->Kueche_Heizung_ist['data'];
                    $desired_temp_kueche = $xml->fhem->Kueche->Kueche_Heizung_soll['data'];
                    $current_window_state_kueche = $xml->fhem->Kueche->Kueche_Fenster['data'];
                    $current_temp_shz = $xml->fhem->Shz->Shz_Heizung_ist['data'];
                    $desired_temp_shz = $xml->fhem->Shz->Shz_Heizung_soll['data'];
                    $current_window_state_shz = $xml->fhem->Shz->Shz_Fenster['data'];
                    $current_temp_whz = $xml->fhem->Whz->Whz_Heizung_ist['data'];
                    $desired_temp_whz = $xml->fhem->Whz->Whz_Heizung_soll['data'];
                    $current_window_state_whz = $xml->fhem->Whz->Whz_Fenster['data'];
                    
                        $text_1 = "Bad: ".$current_temp_bad."° | ".$desired_temp_bad."°  Fenster: ".$current_window_state_bad;
                        $text_2 = "Kueche: ".$current_temp_kueche."° | ".$desired_temp_kueche."°  Fenster: ".$current_window_state_kueche;
                        $text_3 = "Schlafzimmer: ".$current_temp_shz."° | ".$desired_temp_shz."°  Fenster: ".$current_window_state_shz;
                        $text_4 = "Wohnzimmer: ".$current_temp_whz."° | ".$desired_temp_whz."°  Fenster: ".$current_window_state_whz;
                    
                }
            }
        }

    

    public function doOutput($image, $style, $updateData, &$yoffset) {
            
        // define styles
        $opt_header = array(
            'width' => imagesx($image)-290,
            'line_height' => 18,
            'align' => ALIGN_LEFT
        );
        
        $opt_entry = array(
            'width' => imagesx($image)-290,
            'height' => 12,
            'line_height' => 12,
            'align' => ALIGN_LEFT,
            'word_wrap_hyphen' => '...',
            'aggressive_word_wrap' => true,
        );
        

                        // print header
                        $text = "Fhem";
                        imagettftextboxopt($image, 18, 0, 50, $yoffset, $style['textcolor'], $style['font'], $text, $opt_header);
                        $icon = ImageCreateFromPNG ( 'resources/icons/fhem.png' );
                        ImageCopy($image, $icon, 20, $yoffset-2, 0, 0, imagesx($icon), imagesy($icon));
                        ImageDestroy($icon);
                        $yoffset += 26;
                        
                        // print entries
                        $text = "Bad: ".$current_temp_bad."° | ".$desired_temp_bad."°  Fenster: ".$current_window_state_bad;
                        $text = "Kueche: ".$current_temp_kueche."° | ".$desired_temp_kueche."°  Fenster: ".$current_window_state_kueche;
                        $text = "Schlafzimmer: ".$current_temp_shz."° | ".$desired_temp_shz."°  Fenster: ".$current_window_state_shz;
                        $text = "Wohnzimmer: ".$current_temp_whz."° | ".$desired_temp_whz."°  Fenster: ".$current_window_state_whz;
                        $yoffset += imagettftextboxopt($image, 12, 0, 50, $yoffset, $style['textcolor'], $style['font'], $text, $opt_entry);
                        $yoffset += 4;

                }


    
}
Es wäre klasse, wenn mir da mal jemand weiterhelfen könnte.

Gruß
tequila
 

Anhänge

  • Unbenannt-1.jpg
    Unbenannt-1.jpg
    54.8 KB · Aufrufe: 146
Habe mein Infoframe soweit fertig konfiguriert, allerdings wird das Bild an den Rändern abgeschnitten.
Mein Frame ist ein 7" von Dion und hat die Auflösung 800 x 480 ...
Wie kann ich die Ausgabe des Bildes umleiten auf /var/tmp/ftp/uStor01/bild.jpg der FB7270?

Danke und Gruss
Franko_
 
@Tequila74

Ich bin auch kein PHP-Crack, aber in doOutput() überschreibst Du der Reihe nach $Text, so dass zum Schluss nur WhZ ausgegeben wird. Und wenn ich richtig sehe, ist die Variable $current_temp_whz in doOutput() nicht belegt (die XML-Datei wird in doUpdate() ausgelesen, die Werte in die Variablen gepackt und mit Ende der Methode wird alles verworfen...).

Oder andersherum: Die Variablen, die in doUpdate() befüllt werden, existieren beim Aufruf von doOutput() nicht mehr, sondern werden vielmehr neu angelegt (und sind dann halt leer).

Die Infoframe-Skipte funktionieren so, dass in doUpdate() Informationen/Daten eingesammelt und persistiert werden (i.d.R. in der MySQL-DB), und bei der Aufbereitung für die Anzeige aus dieser Datenablage gelesen werden ( doOutput() ) Damit sind Daten sammeln/Ausgabe bauen losgelöst voneinander.
Du musst bei Dir die FHEM Daten entweder zwischenspeichern oder direkt in doOutput() einlesen (nicht zu empfehlen).

Forist Wusel hat mal ein entsprechendes Plugin gebaut. Du findest es in seinem Blog: http://blogdoch.net/index.php?entry=entry110131-000403
 
Zuletzt bearbeitet:
gibts eigentlich ne liste der funktionierenden wlan rahmen?

sowas wäre für mich ideal
 
wer hat denn einen Samsung SPF 85 V ?

welche FW habt ihr da drauf ? hab meinen bekommen diese woche und da ist FW 1004.2 drauf .. wie gibts denn sowas ?
woher kommt die FW ? würde sie auf dem 83 V auch laufen ? ( dann wär am 83 V der win CE bug weg ) wenn jemand die FW hat bitte melden . auf der Samsung Seite find ich nur die "M-CB08S6WW-1003.1_Upgrade.zip" für den 85 V

DANKE
 
Hab hier auch den 85v "gehabt". Fummel bloss nicht an den Firmwares rum. Hab auch den 83v "gehabt" und wollte beide updaten , dabei ist mir ein Fehler unterlaufen und hab die Firmwares verwechselt! Auf dem 83V werkelt nun die Firm für den 85V und auf den 83V die Firm für die 85V.Starten tun sie beide noch und laufen bis zum Setup, aber dann ist ruhe ,da sich die Tasten-bzw Sensoren nicht mehr ansteuern lassen! Folglich kann man auch nicht zurück ,da man nicht mehr in den USB Modus wechseln kann.
Wenn jemand ne Methode weiß,wie man die Firmware trotzdem noch wechseln könnte , immer her damit!
 
Zuletzt bearbeitet:
finds nur seltsam das auf dem 85 V die FW 1004.2 drauf ist , wo kommt die her ?
 
Wird wohl ne interne sein. Die 1004.2 hab ich damals auch gesucht. Ne Anfrage bei Samsung ergab nur folgendes:
Damit das Problem mit Ihrem Gerät behoben werden kann wenden Sie sich bitte an nachstehenden Service
Partner.

AVMS
Campus 21
Liebermanstrasse F01 102A
2345 Brunn an Gebirge
Tel: 0++++++
 
Hallo,

mein Bilderrahmen soll immer die aktuellen Bilder an /var/media/ftp/uStor01 schicken_
Hier ein Auszug der refresh.sh der FB7270
# process checking result
if [ $err == 0 ] && [ $warn == 0 ] && [ $filesize -ge 10 ]
then
mv $localpath/tmp.jpg /var/media/ftp/uStor01/info.jpg
cp /var/media/ftp/uStor01/info.jpg /var/media/ftp/uStor01/info1$
break

Nur leider sehe ich immer die gleichen Bilder, wo muss ich das genau ändern, damit meine Bilder sich aktualisieren?

Danke und Gruss
 
Was müsste ich im Benzin Plugin ändern, damit die Treffer exakt sind?

Beispiel: Ich will lediglich die Orte "Selb" und "Hof" angezeigt bekommen, erhalte aber auch "Hofheim" und "Selbitz"...
 
Hallo Zusammen,

hier meine Lösung des BenzinPlugins Problems: "Einheitspreis Diesel 1.359"

Ich habe dem Plugin nur eine Zeile hinzugefügt. Damit glaubt clever-tanken.de die Anfrage stammt von einem Browser.

Bei mir hat das wunderbar funktioniert.




Gruß
Fritz

Kannst du auch verraten, welche Zeile das wäre.

Code:
<?php
/***************************************************************************
 * InfoFrame (image generator for digital picture frames)
 * Copyright (C) 2010
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see http://www.gnu.org/licenses/
 ***************************************************************************/

class BenzinPlugin implements IPlugin
{
    private $dbconn = NULL;
    private $config = NULL;
    
    public function __construct($dbconn, $config) {
        $this->dbconn = $dbconn;
        $this->config = $config;
    }
    
    
    public function doUpdate() {
    
        // Preise und Tankstellen lesen - fsockopen-Version
        $i=0;
        $ortnumber = 0;
        // jeden in config.ini eingetragenen Ort in file einlesen
        while ($ort = $this->config['ort_'.++$ortnumber]) {
            $uri  = '/liste_payed.asp?'.'ort='.$ort.'&typ='.$this->config['sorte'];
            header("Content-type: text/html");
            $sock = fsockopen("www.clever-tanken.de", 80, $errno, $errstr, 5); // 80 = Port, 5 = Timeout
            if (!$sock) {
                return;//$title = "keine Tankstellen in $orte_fehlen gefunden";
            } else {
                fputs($sock, "GET ".$uri." HTTP/1.1\r\n");
                fputs($sock, "Host: www.clever-tanken.de\r\n");
                fputs($sock, "Connection: close\r\n\r\n");
                while(!feof($sock)) {
                    $zeile[$i++] = trim(fgets($sock,512));
                }
                fclose($sock);
            }
        }
/*
        // Preise und Tankstellen lesen - fopen-Version
        $i=0;
        $ortnumber = 0;
        // jeden in config.ini eingetragenen Ort in file einlesen
        while ($ort = $this->config['ort_'.++$ortnumber]) {
            $url = 'www.clever-tanken.de/liste_payed.asp?ort='.$ort.'&typ='.$this->config['sorte'];
            $file = fopen ($url,"r");
            if (!$file) {
                return;//$title = "keine Tankstellen in $orte_fehlen gefunden";
            } else {
                while (!feof($file)) {
                    $zeile[$i] = fgets($file,512);
                    $i++;
                }
                fclose($file);
            }
        }
*/
        // Datenbankeinträge löschen
        mysql_query("START TRANSACTION", $this->dbconn);
        $query = "Delete from if_tanken";
        mysql_query($query, $this->dbconn) or die('Error, delete query failed');

        // file zeilenweise einlesen und gefiltert entsprechend den Einträgen in config.ini.
        $ortnumber = 0;
        for ($j=0;$j<$i;$j++) {
            // Auswertung aller Orte, siehe config.ini
            while ($ort = $this->config['ort_'.++$ortnumber]) {
                if ((stripos($zeile[$j],$ort))>0) { // Ort gefunden
                    // Tankstelle extrahieren und Adresse formatieren
                    $tankstelle = strip_tags(trim($zeile[$j]),'<br>');    // sinnlose Zeichen und html-Tags außer <br> entfernen
                    $tankstelle = str_replace('<br>','|',$tankstelle);    // <br> mit Texttrenner | ersetzen
                    $adresse = explode('|',$tankstelle);    // Tankstelle im Array umwandeln, für spätere Ausgabe in Datenbank 
                    $merken = 10; // die nach einem gefundenen Ort folgenden 10 Zeilen werden für die Preissuche berücksichtigt
                }
            }
            if ((strpos($zeile[$j],'Euro')>0) or (strpos($zeile[$j],',')>0)) {    // Text Euro gefunden
                if ($merken>=1) { // Text Euro oder Komma in einer der folgenden 10 Zeilen enthalten?
                    $preis = strip_tags(trim($zeile[$j]));
                    $preis = str_replace('Euro','',$preis); // Euro-zeichen umwandeln
                }
            } else {
                if (strpos($zeile[$j],':')>0) {    // Text : gefunden (als Indikator für Datum)
                    if ($merken>=1) { // Text : in einer der folgenden 10 Zeilen enthalten?
                        // Datum extrahieren
                        $d_arr = date_parse(strip_tags(trim($zeile[$j])));
                        // und in Unix-Zeitstempel konvertieren
                        $datum = mktime($d_arr['hour'],$d_arr['minute'],$d_arr['second'],$d_arr['month'],$d_arr['day'],$d_arr['year']);
                        // nur Preise mit aktuellem Datum berücksichtigen, siehe config.ini
                        $alter = $this->config['max_age_in_hours'];
                        if ($datum>=strtotime("-$alter hours")) {    // Preis ist aktuell
                            // Datensatz für Datenbank anlegen, Adresse ohne PLZ
                            $this->addStation($preis, $datum, substr($adresse[2],11).' - '.$adresse[0].' - '.$adresse[1]);
                        }
                    }
                }
            }
            // Zeilenzähler für Datensuche in file
            if ($merken>0) $merken--;
            else $ortnumber = 0; // 10 Zeilen wurden erreicht, dann Orte neu bestimmen
        }    // Ende for-Schleife

        // in Datenbank schreiben
        mysql_query("COMMIT", $this->dbconn);
    }


    public function doOutput($image, $style, $updateData, &$yoffset) {

        if ($updateData) $this->doUpdate();

        $query = "SELECT * FROM `if_tanken` ORDER BY `datum` DESC, `preis` ASC";
        $result = mysql_query($query, $this->dbconn);
        if (mysql_num_rows($result) == 0) return;

        
        // define styles Überschrift "Kraftstoffpreise" nach unten oben verschieben
        $opt_header = array(
            'width' => imagesx($image)-290,
            'line_height' => 16,
            'align' => ALIGN_LEFT
        );

        $opt_entry = array(
            'width' => imagesx($image)-290,
            'height' => 12,
            'line_height' => 12,
            'align' => ALIGN_LEFT,
            'word_wrap_hyphen' => '...',
            'aggressive_word_wrap' => false,
        );

        // print header
        #$text = 'Spritpreis ('.$this->config['sorte'].')';
        $text = ''.$this->config['sorte'].'';
        #imagettftextboxopt($image, 18, 0, 450, $yoffset, $style['textcolor'], $style['font'], $text, $opt_header);
        imagettftextboxopt($image, 14, 0, 407, 153, $style['textcolor'], $style['fontb'], "D:", $opt_header);
        $icon = ImageCreateFromPNG ( 'resources/icons/tank.png' );
        #ImageCopy($image, $icon, 20, $yoffset-3, 0, 0, imagesx($icon), imagesy($icon));
        ImageCopy($image, $icon, 380, 152, 0, 0, imagesx($icon), imagesy($icon));
        ImageDestroy($icon);
        $yoffset += 10;

        while ($row = mysql_fetch_assoc($result)) {
            $counter++;
           $rest = (mysql_num_rows($result) - $counter) + 1;
            $entrylimit = $this->config['max_displayed_stations'];
            if ( (($entrylimit) && ($counter > $entrylimit)) || (($yoffset >= (imagesy($image) - 36)) && ($rest > 1)) ) {
                // show only n mails. If more mails are available show hint "x more stations..."
                $rest = (mysql_num_rows($result) - $counter) + 1;
        #        if ($rest > 1)
        #            $text = "... $rest weitere Tankstellen";
        #        else
        #           $text = "... $rest weitere Tankstelle";
        #        imagettftextboxopt($image, 10, 0, 24, $yoffset, $style['textcolor'], $style['fontb'], $opt_header);
                $yoffset += 5;
                break;
           }

            // Preis
            $text = ''; // Euro-Zeichen geht nicht
            $text = $row['preis'].$text;
            // Datum
            #$text = $text.'  '.strftime( "%d.%m.-%H:%M", strtotime($row['datum']));
            // Tankstelle
            #$text = $text.'  '.$row['station'];
            #$text = $text.'  ';
            // determine button color
            $colorArray = htmlColorToRgb('#424242');
            $color = ImageColorAllocate ($image, $colorArray[0], $colorArray[1], $colorArray[2]);

            // print appointment text and button
            #if (stripos($text,'aral')>0)            $png = 'resources/icons/aral.png';    // Aral-Tankstelle
            #elseif (stripos($text,'agip')>0)        $png = 'resources/icons/agip.png';    // Agip-Tankstelle
            #elseif (stripos($text,'bft')>0)            $png = 'resources/icons/bft.png';    // BFT-Tankstelle
            #elseif (stripos($text,'esso')>0)        $png = 'resources/icons/esso.png';    // Esso-Tankstelle
            #elseif (stripos($text,'heinlein')>0)        $png = 'resources/icons/h.png';        // Heinlein-Tankstelle
            #elseif (stripos($text,'jet')>0)            $png = 'resources/icons/jet.png';    // Jet-Tankstelle
            #elseif (stripos($text,'omv')>0)            $png = 'resources/icons/omv.png';    // OMV-Tankstelle
            #elseif (stripos($text,'shell')>0)        $png = 'resources/icons/shell.png';    // Shell-Tankstelle
            #else     $png = 'resources/icons/t.png';
            $wicon = ImageCreateFromPNG ( $png );
            #ImageCopy($image, $wicon, 25, $yoffset, 0, 0, imagesx($wicon), imagesy($wicon));
            ImageDestroy($wicon);

            imagettftextboxopt($image, 14, 0, 425, 155, $style['textcolor2'], $style['font'], $text, $opt_entry);

            $yoffset += 5;
        }
        $yoffset += 5;
        mysql_free_result($result);
    }


    private function addStation($preis, $datum, $station) {
        $query = "REPLACE INTO `if_tanken` SET 
                    `preis`= '".mysql_real_escape_string($preis)."', 
                    `datum`= FROM_UNIXTIME($datum), 
                    `station`= '".mysql_real_escape_string($station)."'";

        mysql_query($query, $this->dbconn) or die('Error, insert query failed: '.mysql_error());
    }

}
 
Zuletzt bearbeitet:
@mosjka1

Code:
//------ (FD 15.01.2012) Damit Clever-tanken glaubt es handelt sich um eine Browser
//------ löst das Problem des Diesel Einheitspreises, zumindest bei mir
fputs($sock, "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20021204\r\n");

p.s. findet man auch im Anhang von daehn
 
Hallo!
Ich jetzt auch mal an dem Infoframe versucht und habe alles auch soweit gut am laufen.
Nun habe ich versucht mir ein eigenes Plugin zu schreiben, welches mir Werte von meinem Fhem-Server aus einer .xml ausliest und diese dann darstellen soll.

Da FHEM & Infoframe bei mir auf unterschiedlichen Systemen liegen, verfolge ich für die FHEM-Integration ein Client-Server-Konzept; siehe, wie schon drauf hingewiesen wurde, in meinem Blog. Im Grunde kann man das auch aus der xml rauspfriemeln, das Sensor-Plugin müßte halt statt MySQL zu befragen die XML parsen.

Grade auf kleinen Bildschirmen würde ich über unterschiedliche Seiten gehen, also z. B. Nachrichten, Benzinpreise, Kalender, Wetter. Und vielleicht noch ein Tip, für Rahmen unter 800x480 nutze ich i. d. R. die doppelte Rahmenauflösung für Infoframe und skaliere dann vor dem Hochladen zum Bildschirm auf die tatsächliche Auflösung des Rahmens runter -- denn für so kleine Bildschirme wie 320x240 ist das normale Layout nicht wirklich ausgelegt (siehe Beispiel).

infoframe_scaled.jpeg
 
Hat jemand ne Ahnung wie ich die Wettervorhersage Horizontal anordnen und nicht Vertikal? Und wo kann ich die Begrenzung einstellen ab wieviel pixel er z.B. Kalendereinträge ausblendet? Quasi wie er es am Bilderrand auch macht....hoffe Ihr versteht was ich meine.
 
Auf meinem Infoframe sind insgesamt 4 verschiedene Familienmitglieder mit diversen Mail-Adressen eingerichtet. Jedem Empfänger hatte ich eine Farbe zugeordnet die dann auch auf dem Infoframe erschien (siehe Anhang)

infoframe alt.jpg

alte Mailplugin.php:
Code:
// determine button color
$accountId = $row['account'];
$colorArray = htmlColorToRgb($this->config['color_'.$accountId]);
$color = ImageColorAllocate ($image, $colorArray[0], $colorArray[1], $colorArray[2]);
// print text and button
drawGlassButton($image, $color, 32, $yoffset+14);
				
imagettftextboxopt($image, 14, 0, 84, $yoffset, $style['textcolor'], $style['fontb'], $row['from'], $opt_address);
imagettftextboxopt($image, 12, 0, 50, $yoffset+2, $style['textcolor'], $style['fontb'], "Von:", $opt_address);
imagettftextboxopt($image, 12, 0, 50, $yoffset+16, $style['textcolor'], $style['font'], $row['subject'], $opt_subject);

Das hat immer wieder zu den gleichen Fragen geführt: "Ist die jetzt für mich?" Eine erneute Erklärung der Bedeutung hat nur kurzzeitig geholfen. Also habe ich jeder Farbe ein kleines Icon zugewiesen (siehe Anhang). Bis jetzt sind keine weiteren Fragen aufgekommen. Die Farbcodierung muss dazu mit der Codierung in der config.ini übereinstimmen.

infoframe.jpg

neue Mailplugin.php:
Code:
// Mail Icons
$accountId = $row['account'];
if ($rest > 0)
{

//Person 1				
if (($this->config['color_'.$accountId]) == "#2828A3")
$icon = ImageCreateFromPNG ( 'resources/icons/papa.png' );

// Person 2
if (($this->config['color_'.$accountId]) == "#A32866")
$icon = ImageCreateFromPNG ( 'resources/icons/hanna.png' );

// Person 3
if (($this->config['color_'.$accountId]) == "#A32929")
$icon = ImageCreateFromPNG ( 'resources/icons/laura.png' );

// Person 4
if (($this->config['color_'.$accountId]) == "#28A328")
$icon = ImageCreateFromPNG ( 'resources/icons/mama.png' );
				
ImageCopy($image, $icon, 23, $yoffset+0, 0, 0, imagesx($icon), imagesy($icon));
ImageDestroy($icon);
} 
else {				
// determine button color

$colorArray = htmlColorToRgb($this->config['color_'.$accountId]);
$color = ImageColorAllocate ($image, $colorArray[0], $colorArray[1], $colorArray[2]);

// print text and button
drawGlassButton($image, $color, 32, $yoffset+14);
}

imagettftextboxopt($image, 14, 0, 84, $yoffset, $style['textcolor'], $style['fontb'], $row['from'], $opt_address);
imagettftextboxopt($image, 12, 0, 50, $yoffset+2, $style['textcolor'], $style['fontb'], "Von:", $opt_address);
imagettftextboxopt($image, 12, 0, 50, $yoffset+16, $style['textcolor'], $style['font'], $row['subject'], $opt_subject);

Vielleicht kanns ja jemand gebrauchen.
 
gibts eigentlich ne liste der funktionierenden wlan rahmen?

sowas wäre für mich ideal
darf ich das nochmal fragen?

würde ein Kodak W730 Pulse ohne probleme funktionieren?
wie schnell ist die aktualisierungszeit?

ich bräuchte ihn quasi nur als anzeige für die anrufer und vielleicht noch wetter...
 
Zuletzt bearbeitet:
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.