die Frage nach Bildern in Studio wurde ja schon mehrfach gestellt, hier nun eine Möglichkeit, dieses zu realisieren. Beim "basteln" mit 7-Segment Anzeigen für Studio (siehe mein anderer Beitrag http://homematic-forum.de/forum/viewtop ... =17&t=1686) bin ich auf eine Möglichkeit gestossen, beliebige Bilder in den Ansichten darzustellen. Bisher dachte ich, daß Studio beim Start den Code erstellt und auch sämtliche anderen Resourcen einbindet, z.B. auch die Bilder(Bitmaps), die in den Typdefinitionen oder Objekten verwendet werden. Das ist aber nicht so! Studio lädt diese Bilder neu, wenn sie sich geändert haben und das Objekt erneut aufgerufen wird. Ebenso lädt Studio auch die Hintergrundbilder der Ansichten immer wenn auf die Ansicht umgeschaltet wird.
Nun habe ich folgendes versucht:
Ich habe eine Webcam im LAN, deren Bild ich so erreichen kann:
Code: Alles auswählen
http://Name:passwort@192.168.0.xx/image.jpg
Mit ein paar Zeilen php lese ich das Bild und speichere es auf einer RAM-Disk. Dieses Bild ist als Bitmap für ein Objekt angegeben, und zwar für einen bestimmten Zustand.
Nach dem speichern wird das Objekt nochmals auf den Zustand gesetzt und das aktuelle Bild erscheint in der Anzeige.
Das selbe klappt auch mit jpgraph, um Diagramme anzuzeigen. Auch hier wird per php das Diagramm erstellt und auf die Ramdisk geschrieben, danach das Objekt erneut aufgerufen und die aktuelle Grafik angezeigt.
Kleines Beispiel:
Ein Objekt Cam01Garten vom Typ Schalter.
Dem Zustand aus wird das Bild zugewiesen (dazu muß es einmal an der richtigen Stelle stehen):
Zustand aus: Bitmap = r:\studio\cam1.jpg
Zustand ein: Bitmap = r:\studio\campause.jpg
(campause.jpg sollte ein belieiges Bild mit der selben Grösse sein. Ich nehme z.B. ein Bild der Camera, welches ich mit einem Grafikprogramm unscharf gemacht habe (blur).
Ausführen bei Änderung ist angeklickt
Der Schalter wird in einer Ansicht angezeigt.
Code: Alles auswählen
<?
$grafikfile="http://name:password@192.168.0.xx/image.jpg";
$savefile='r:\\studio\\cam1.jpg';
function LoadJpeg ($imgname) {
$im = @ImageCreateFromJPEG ($imgname); /* Versuch, Datei zu öffnen */
if (!$im) { /* Prüfen, ob fehlgeschlagen */
$im = ImageCreate (150, 30); /* Erzeugen eines leeren Bildes */
$bgc = ImageColorAllocate ($im, 255, 255, 255);
$tc = ImageColorAllocate ($im, 0, 0, 0);
ImageFilledRectangle ($im, 0, 0, 150, 30, $bgc);
/* Ausgabe einer Fehlermeldung */
ImageString($im, 1, 5, 5, "Fehler beim Öffnen von: $imgname", $tc);
}
return $im;
}
$bild = LoadJpeg ($grafikfile);
imagejpeg($bild, $savefile, 95);
imagedestroy($bild);
?>
Cam01Garten:=0
Nehem wir an, der Zustand des "Schalters" Cam01Garten ist "aus". Nun wird von irgendwoher der Schalter eingeschaltet (Cam01Garten einschalten). Der Schalter ist nun eingeschaltet und zeigt das Pause-Bild. Ebenso wird das Makro gestartet. Im php-Teil ist eine Funktion erstellt, die das Bild lädt und im Fehlerfall die Fehlermeldung ebenfalls als Bild ausgibt. Nach Aufruf der Funktion kann man übrigens das Bild noch manipulieren, z.B. mit Text versehen, die Größe ändern, Teile kopieren etc. php bietet hier sehr viele Möglichkeiten.
Das neue Bild wird dann in die Ram-Disk geschrieben und das php-Bild freigegeben (imagedestroy..). Dann schaltet der Studio-code den Schalter aus und damit wird das neue Bild geladen und angezeigt.
So, damit sind die Grundzüge beschrieben, dynamisch Bilder in Studio einzubinden. Die Quelle des Bildes ist nahezu beliebig. Ich habe z.B. mit jpgraph ein Diagramm für den Zisterenstand erstellt, der dann alle paar minuten aktualisiert angezeigt wird.
ABER: es darf nicht zu lange dauern, bis das Bild erstellt ist. Leider hält Studio quasi komplett an, solange der php-Teil abgearbeitet wird. Das sorgt für Abstürze. Beim Webcam abfragen ist es auch wichtig, das diese erreichbar ist. Ist sie es nicht versucht php standardmäßig 30 sec, das Bild zu laden. Solange ist Studio blockiert und schmiert normalerweise ab. Es bietet sich an, diese Zeit zu begrenzen.
Viel Spaß damit, vielleicht gibts ja noch ganz tolle Ideen.
sanys