InfoFrame: Digitaler Bilderrahmen auf dem Raspberry PI

Also ich werde jetzt mittlerweile echt nicht mehr schlau. Habe jetzt folgendes probiert:

1. XML Feed auf Raspi im Cache Verzeichnis, Fehler kommt.
2. XML Feed auf QNAP, Fehler kommt.
3. Frame wieder auf QNAP --> ganz Normal ohne Fehler.

Also muss es irgendein Konflikt geben. Aber wie finde ich das heraus? Habe jetzt mal vor den Raspi endlos anzupingen um zu sehen ob er irgendwann etwas macht.
 
Hallo Marvin,

könntest Du mir mal helfen? Wie muss ich das InfoFrame.php umbauen das der Raspi das Bild nicht in Cache sondern auf die FritzBox kopiert? Möchte was probieren. Oder macht man das per Cron Job?
 
InfoFrame: Digitaler Bilderrahmen auf dem Ra

Hallo Thomas,
ich kann Dir jetzt nicht ganz folgen:

1. ist die in den letzten Tagen eingerichtete Konfiguration?
2. media.XML auf QNAP und das JPG auch?
3. Wer ist Frame?

Um das jpg auf die Fritzbox zu bekommen fallen mir zwei Wege ein.
a) Du hast ein Verzeichnis der Box im Raspi gemountet und schreibst das JPG dorthin statt nach ./cache
b) Du holst das JPG mit wget "http://Infoframe/infoframe.php" -qO /dir/in/der/fritz/box/info.jpg vom raspi
 
Zuletzt bearbeitet:
Hi,

ich möchte ausschließen das es was mit dem Philips Bilderrahmen zu tun hat (Frame). Meine Idee wäre folgendes:

Raspi erstellt ganz normal das info.jpg. Die XML wäre schon angepasst auf dem QNAP, nur das info.jpg müsste auf den QNAP kopiert werden. Also der Raspi muss nur, NACH erstellen der info.jpg diese dann auf den QNAP kopieren. Der Philips holt sich dann die XML und das aktuelle info.jpg vom QNAP und nicht vom Raspi.

Wenn das so funktionieren sollte hat es doch was mit dem Raspi zu tun und wir müssen noch weiter suchen. Wenn es immer noch zum Problem kommt, weiß ich auch nicht mehr weiter. Ich probiere schon den ganzen Tag und es ist echt reproduzierbar, komme einfach nicht drauf was genau das Problem ist. Das mit dem ping habe ich bereits durchgeführt und es sah sehr gut aus. Also das der Raspi stabil läuft, allerdings hat das Aufrufen der infoframe.php bei gleichzeitigem Ping zu 8 sec. Erstellung der Seite geführt.
 
Versuch doch mal folgendes: Du lässt mit ImageJpeg ($im, 'cache/info-tmp.jpg', 90); ein temporäres JPG erzeugen und mit rename('cache/info-tmp.jpg', 'cache/info.jpg'); umbenennen. Die Wahrscheinlichkeit, dass es hier zu Konflikten kommt, sollte wesentlich geringer sein.
 
Zuletzt bearbeitet:
Hallo Michael
Um sie endgültig zu löschen müsstest Du ein
PHP:
$query = "DELETE FROM `if_call_log` WHERE time > DATE_SUB(NOW(), INTERVAL ".$max_display_age_day." DAY)"; $result = $this->dbconn->query($query);
an geeigneter Stelle hinzufügn, z.b. vor Zeile 96.
... verpasste Gespräche kommen weder auf den Screen noch gelangen diese in die Datenbank.
 
Hi jono,

klar, der Code ist ja auch falsch, wo hast Du den denn her? ;) In WHERE time > DATE_SUB(NOW() das > in < ändern.
Korrekt ist:
PHP:
$query = "DELETE FROM `if_call_log` WHERE time < DATE_SUB(NOW(), INTERVAL ".$max_display_age_day." DAY)";
$result = $this->dbconn->query($query);


Nachtrag:
Ich habe das gewünschte Verhalten im Code übernommen und kann in der config.ini über die Option delete_after_max_display_age Konfiguriert werden.
  • delete_after_max_display_age = 1: Anrufe werden nach max_display_age_day gelöscht
  • delete_after_max_display_age = 0 oder gar nicht gesetzt: Anrufe werden nach max_display_age_day nicht angezeigt, verbleiben aber in der Datenbank


CallsPlugin.php:
PHP:
...
		// print missed calls
		if (isset($this->config['max_display_age_day']))
			$max_display_age_day = $this->config['max_display_age_day'];
		else
			$max_display_age_day = 1;
		
		if (isset($this->config['delete_after_max_display_age']))
			$delete = $this->config['delete_after_max_display_age'];
		else
			$delete = 0;
			
		if ($delete == 1) 
		{
			$query = "DELETE FROM `if_call_log` WHERE time < DATE_SUB(NOW(), INTERVAL ".$max_display_age_day." DAY)";
			$result = $this->dbconn->query($query);
		}
		$query = "SELECT * FROM `if_call_log` WHERE `type`=4 AND `pretype`=2 AND `duration`=0 AND time > DATE_SUB(NOW(), INTERVAL ".$max_display_age_day." DAY) ORDER BY time DESC";
		$result = $this->dbconn->query($query);
		
		if ($result->rowcount() > 0)
...
 
Zuletzt bearbeitet:
Hallo Marvin,

ich habe jetzt mal die Änderung wie in deinem Post #125 durchgeführt und hatte bisher keinen Ausfall. Ich werde es morgen nochmal den ganzen Tag beobachten. Melde mich wieder.
 
Hallo Thomas,

mach doch mal den ultimativen Stresstest:

Die crontab so abändern, dass infoframe.php alle 30 Sekunden ausgeführt wird
Code:
* * * * * root wget localhost/infoframe.php -qO /dev/null
* * * * * root (sleep 30; wget localhost/infoframe.php -qO /dev/null)
und Deinen Bilderrahmen jede Sekunde den RSS Feed aktualisieren lassen.
 
... den denn her? ;) ...
Hallo Michael,
Post 73, Seite 4, es ist sehr schön, dass du infoframe.php und das CallsPlugin angepasst hast. Ich habe die Änderungen übernommen, Tageszahl ist bei mir 3, ich denke, so funktioniert es. Wie der Name infoframe schon sagt, geht es nur um Informationen für verschiedene Dinge, nicht aber um dauerhafte Speicherung bestimmter Daten, irgendwann sind dann die kleinen Rechenknechte echt langsam.
 
InfoFrame: Digitaler Bilderrahmen auf dem Ra

Hallo Jono,


Wo bleibt Dein Humor ;) Das weiß ich, Du hast den Smiley sogar noch mitgequoted. Das war ein Scherz.
 
Zuletzt bearbeitet:
Hallo Marvin,

hat alles nichts gebraucht. Fehler besteht weiterhin. Ich werde aus dem ganzen Zeug nicht schlau. Es hängt reproduzierbar mit dem Raspi zusammen, aber keine Ahnung genau was.
Der Test mit dem Bild auf die FritzBox kopieren konnte ich leider nicht testen da alles im Netzwerk einen Anmeldenamen benötigt und ich das im Philips Bilderrahmen nicht einstellen / Übergeben kann.
Was ich bemerkt habe ist folgendes: Ab und an, wenn ich auf F5 gehe um das Bild zu aktualisieren (infoframe.php) braucht er recht lange >7s. Danach geht's wieder schnell ca. 2s. Ich habe echt stark die Vermutung das es damit zusammen hängen könnte. Kann es sein, das wenn er das Bild generiert und so lange benötigt dann gar nicht mehr erreichbar ist? Wieso braucht der manchmal länger?

Kann ich irgendwas parallel laufen lassen das mir die Netzwerkkommunikation / Ping aufzeichnet um zu sehen ob der manchmal nicht erreichbar ist wenn er was macht?

Also z.B. ein Sekunden Zähler um zu sehen das er z.B. 1, 2, 3, 4, 9, 10, 11 zählt oder irgendwas anderes? Bin echt verzweifelt.
 
Hallo Thomas,

dass er manchmal länger braucht hängt mit der Arbeitsweise des Infoframes zusammen und ist ganz normal. Jedes Plugin hat zwei Funktionen doUpdate und doOutput.

  1. Bei einem doUpdate werden alle Informationen des Plugins erneuert und in der Datenbank abgespeichert. Da dazu meißt das Internet befragt werden muss, dauert dieser Vorgang recht lange. Ein doUpdate wird defaultmäßig alle fünf Minuten ausgeführt, kannst Du aber in der config.ini verändern.
  2. Bis die nächsten fünf Minuten vorbei sind, wird nur noch ein doOutput ausgeführt. Dazu werden lediglich die Daten aus der Datenbank auf den Bildschirm geschrieben, das geht recht flott.

Auch wenn 1) deutlich länger dauert, bedeutet das nicht, dass der Raspi hier mit der Berechnung des Bildes beschäftigt ist, die meiste Zeit geht drauf, weil er die verschiedensten Daten herunterladen muss. Wenn in dieser Zeit ein Zugriff auf info.jpg stattfindet, dann wird dieser nicht ganz so schnell abgearbeitet weil jetzt mehrere Prozesse laufen, aber letztendlich sollte das funktionieren. Du bekommst dann halt noch das "alte" info.jpg.

Ich vermute Dein Problem eher darin, was Du bereits geschrieben hast. Genau in dem Augenblick, wo der Bilderrahmen per XML auf die info.jpg zugreift, wird diese verändert... und das mag er nicht. Dann verstehe ich aber nicht, warum du diese Problem nicht bereits vorher hattest. Vielleicht skizzierst Du uns mal, wie es vorher gelaufen ist?

Gruß, Michael...
 
Hallo Michael,

sodele: Bin vielleicht etwas weiter gekommen. Habe jetzt folgende Konfig bei mir. Habe die jpg Bilderstellung komplett deaktiviert im Script und auch wieder die Erstellung der XML gelöscht. Habe auf meinem QNAP die XML fest hinterlegt (Da ändert sich ja eh nichts drin). Habe nun Cron auf meinem QNAP laufen und er holt sich das Bild vom Raspi, wie von Dir vorgeschlagen. Dabei ist mir aufgefallen das es besser wurde, aber immer noch da ist. Als habe ich folgendes Probiert.

1. Die XML so angepasst das es nicht nur ein Bild anzeigt, sondern das Bild 3 mal anzeigt, bis er dann quasi das XML von oben wieder einließt (hoffe Du weißt was ich meine). Leider brachte es nicht die erhoffte abhilfe.

2. Habe die info.jpg händisch auf info2.jpg kopiert und dann mein XML angepasst das er nur die info2.jpg anzeigen soll. Diese wird ja nicht vom QNAP / Raspi angelangt und siehe da, keine Probleme (allerdings ja auch kein Bildwechsel ;))

Dann habe ich nachgedacht und nochmals alles Schritt für Schritt mit dem alten System verglichen und habe dann festgestellt das da noch ein Script abläuft. Es ist das vom Pacman und heißt refresh.php

Hier der Inhalt:

PHP:
#!/bin/sh
# refresh infoframe image

# config
localpath="/var/tmp/infoframe"
serverscript="http://192.168.2.11"

# try 3 times to download picture until error is displayed
tries=1
while true
do
	# download new picture
	wget "$serverscript?$1" -O $localpath/tmp.jpg
	# do some checks (error/warning string in file? downloaded file should be at least 10k of size?)
	# if error occured we do a next try
	err=0
	warn=0
	filesize=0
	if [ -f $localpath/tmp.jpg ]
	then
		err=`grep -i 'error' $localpath/tmp.jpg | wc -l`
		warn=`grep -i 'warning' $localpath/tmp.jpg | wc -l`
		filesize=`du $localpath/tmp.jpg | cut -f1`
	fi
	
	
	# process checking result
	if [ $err == 0 ] && [ $warn == 0 ] && [ $filesize -ge 10 ]
	then
		mv $localpath/tmp.jpg $localpath/info.jpg
		break
	else
		if [ $tries -ge 3 ]
		then
			date +%d-%m-%Y_%H-%M-%S >> $localpath/download.log
			echo "*** ERROR OR WARNING FOUND: filesize= $filesize ***" >> $localpath/download.log
			rm $localpath/tmp.jpg 2> /dev/null
			cp $localpath/error.jpg $localpath/info.jpg
			break
		else
			# just wait some seconds, then try again
			tries=$(expr $tries + 1)
			sleep 5
		fi
	fi
done

Das wäre im Moment der einzige Unterschied. Was genau macht dieses Script? Wäre das die Lösung? Wenn ja, wie baue ich das ein?

EDIT: Pacman ruft ja auch erst dieses refresh Scrip auf und holt es nicht per Cron einfach rüber, so interpretiere ich das, kann das sein?
 
Zuletzt bearbeitet von einem Moderator:
also, das Script macht ja erstmal nichts anderes als dreimal zu versuchen das Bild auf die Box zu laden (mit ein paar checks, ob es ein error/warning gab und es größer null ist). Wenn alles ok ist, wird es von tmp.jpg in info.jpg umbenannt, ansonsten wird error.jpg nach info,jpg gespeichert. Das ist ja so ungefähr die Finte, die wir ja schon mal probiert haben, erst speichern, dann ein rename.

Du sagts aber, du hast die XML immer neu erstellen lassen? Vielleicht lag es ja gar nicht an der Erstellung des Bildes sondern der XML? Also der Rahmen greift auf die XML zu, während diese gerade neu erstellt wird?

Neuer Vorschlag:
a) die XML auf dem Raspi, nicht erstellen lassen, ist sowieso immer das selbe drin.
b) Dann wie im Post 125 das Bild erst erstellen, dann nach info.jpg umbenennen
PHP:
ImageJpeg ($im, 'cache/info-tmp.jpg', 90);
rename('cache/info-tmp.jpg', 'cache/info.jpg');

Wenn das nicht fruchtet, bin ich mit meinem Latein am Ende...
 
Hallo Michael,
gelegentlich erscheint folgende Meldung auf einem weißen Display, bei der nächsten Aktualisierung ist die infoframe-Anzeige wieder da. Lässt sich dagegen etwas unternehmen?
Code:
Error, insert query failed: Incorrect parameter count in the call to native function 'FROM_UNIXTIME'
 
Hallo Marvin,

auch das klappt nicht. :( Ist echt frustrierend.
Ich hätte noch eine bitte, könnten wir es trotzdem mal mit dem Script versuchen? Übrigens ist es keine refresh.php sondern eine refresh.sh. Ich bekomme es nicht zum laufen mit cron. Mein Eintrag in Cron sieht so aus:

Code:
# minuetlich aufrufen
* * * * * root localhost/refresh.sh

Und meine angepasste refresh.sh so:

Code:
#!/bin/sh
# refresh infoframe image

# config
localpath="/var/www/cache"
serverscript="http://192.168.2.12"

# try 3 times to download picture until error is displayed
tries=1
while true
do
    # download new picture
    wget "$serverscript?$1" -O $localpath/tmp.jpg
    # do some checks (error/warning string in file? downloaded file should be at least 10k of size?)
    # if error occured we do a next try
    err=0
    warn=0
    filesize=0
    if [ -f $localpath/tmp.jpg ]
    then
        err=`grep -i 'error' $localpath/tmp.jpg | wc -l`
        warn=`grep -i 'warning' $localpath/tmp.jpg | wc -l`
        filesize=`du $localpath/tmp.jpg | cut -f1`
    fi
    
    
    # process checking result
    if [ $err == 0 ] && [ $warn == 0 ] && [ $filesize -ge 10 ]
    then
        mv $localpath/tmp.jpg $localpath/info.jpg
        break
    else
        if [ $tries -ge 3 ]
        then
            date +%d-%m-%Y_%H-%M-%S >> $localpath/download.log
            echo "*** ERROR OR WARNING FOUND: filesize= $filesize ***" >> $localpath/download.log
            rm $localpath/tmp.jpg 2> /dev/null
            cp $localpath/error.jpg $localpath/info.jpg
            break
        else
            # just wait some seconds, then try again
            tries=$(expr $tries + 1)
            sleep 5
        fi
    fi
done

Die refresh.sh liegt im selben Verzeichnis wie die infoframe.php. Bin komplett auf dem Raspi, nur das XML liegt auf meinem QNAP.

Habe aber grade noch eine Entdeckung gemacht:

Wenn ich z.B. irgendein Bild nehme, sagen wir Test.jpg, dieses dann mit meiner XML im Philips Bilderrahmen aufrufe, dann wird dieses dargestellt und es kommt zu KEINEM Fehler. Der Bilderrahmen aktualisiert alle 5 Sekunden. Jetzt habe ich die Datei "Test.jpg" gelöscht und es kommt exakt 5 Sekunden nach dem löschen des Bildes zu dem Fehler. Also liegt es wirklich daran das er das Bild nicht findet / es verwendet wird.
 
Mal eine Idee: Lass doch vom Script eine Kopie erstellen. Danach kopiere im Script diese zur eigentlichen Datei und lass die den Rahmen hohlen.

Beispiel: infoframe.php erstellt test.jpg
im Shellsript dann ein cp test.jpg bild.jpg
und der Rahmen soll dann bild.jpg holen.
So ist gewährleistet, dass das Kopieren die wenigste Zeit kostet und die Datei keine Zugriffsblockade haben dürfte.

Ausprobieren kannst du es ja mal. ;)
 
Abend

Hi JL3 so sieht man sich wieder. ;)

@ht81: Erstmal den Crontabeintrag richten...

# minuetlich aufrufen
* * * * * root localhost/refresh.sh

Ich assoziiere mal dass der Pfad zu refresh.sh in $localpath definiert ist...

localpath="/var/www/cache"

...dann sollte der Crontabeintrag am Besten so aussehen...

* * * * * root sh /var/www/cache/refresh.sh

...und crond sollte auch nur einmal laufen. ;)
 
Zuletzt bearbeitet:
Hallo Thomas,
Du willst also wirklich Dein erstelltes Bild per wget in ein anderes Verzeichnis kopieren? Klar geht das, aber was soll das bringen außer recourcen zu verschwenden? Dann nimm doch den Vorschlag von JL3, das ist letztendlich dasselbe.

@koy,
Du weißt schon, dass sich das Bild im selben Dateisystem befindet?

Gruß, Michael...
 
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.