Die letzten XX Bilder anzeigen

Begonnen von Andre0909, 14 Januar 2017, 18:19:15

Vorheriges Thema - Nächstes Thema

Andre0909

Hallo zusammen,

ich speicherer beim klingeln Screenshots von meiner Kamera (3 pro Klingeln) und möchte nun in einer Tabelle neben dem Datum des Klingelns (welches ich über die FB_Calllist bekomme) jeweils die 3 Fotos dazu anzeigen.

Dazu müsste ein Script das Vezeichnis durchsuchen und die Fotos zur Verfügung stellen. Sowas ähnliches wurde bereits in folgendem Thread behandelt: https://forum.fhem.de/index.php/topic,49732.0.html

Allerdings funktioniert dort die Anzeige nur iper Weblink in der FHEM-Oberfläche.

Der Scripterfinder hat leider keine Ahnung von Tablet UI, daher hoffe ich hier eine gute Idee zu bekommen.

Das Problem ist, dass die SCreenshots von IPCAM mit Timestamps versehen werden, also es immer um andere Dateinamen geht. Anbei der Ausschnitt aus dem anderen Thread:

sub last_pics($$$$$)
{
my ($col,$row,$w,$h,$ext) = @_;
my ($s, $ss, $i, $j, $p, $img);

for ($i=1; $i<=$row; $i++)
{

  $s .= ($i%2) ? "<tr class='even'>" : "<tr class='odd'>";

  for ($j=1; $j<=$col; $j++)
  {
    $p++;
    $ss = "'".$p."p'";
    $s .= "<td align='center'><div class='col$j'>";
    $img = qx(ls -1l --time-style='+%Y-%m-%d %H:%M:%S' www/snapshots/*.$ext | sed -n $ss | cut -d " " -f6,7,8);
    $img =~s/\n//g;
    if (!$img)
    { $s .= "<img src='/fhem/images/default/icoBlitz.png' alt='pic_$p' title='no image' />"; }
    else
    {
      my @arr = split(" ",$img);
      $s .= "<a href='/fhem/$arr[2]'><img src='/fhem/$arr[2]' width='$w' height='$h' title='$arr[0] $arr[1]' /></a>";
      $s .= "<br>".$arr[0]." ".$arr[1];
    }
    $s .= "</div></td>\n";
  }
  $s .= "</tr>\n";
}

return
"<table class='roomoverview'>
<tr><td><div class='devType'>Last Pics</div></td></tr>
<tr><td>
<table class='block wide'>
$s
</table></td></tr></table>";
}

und weblink:

define last_pics weblink htmlCode { last_pics(3,3,240,180,'jpg')}

Es muss doch irgendeine Möglichkeit geben diese Screens einzublenden :/ HILFE!!

setstate

Du müsstest das Script soweit anpassen, dass du alle HTML Tags entfernst "<ABC>" und dann die reine URL als Output in ein UserRerading schreibst. Dann kannst du dieses URL Reading als Input für das Image Widget benutzen. Aber immer nur eine URL pro Reading.

Oder du nimmst den ganzen Output inkl. HTML Tags in ein UserReading und benutzt ein Label-Widget, der die Tabelle dann anzeigt.

Andre0909

#2
Zitat von: setstate am 14 Januar 2017, 20:00:03
Du müsstest das Script soweit anpassen, dass du alle HTML Tags entfernst "<ABC>" und dann die reine URL als Output in ein UserRerading schreibst. Dann kannst du dieses URL Reading als Input für das Image Widget benutzen. Aber immer nur eine URL pro Reading.

Oder du nimmst den ganzen Output inkl. HTML Tags in ein UserReading und benutzt ein Label-Widget, der die Tabelle dann anzeigt.

Hallo setstate und mal wieder Danke für die Infos. Ich denke der 2. Vorschlag ist wahrscheinlich einfacher? Vielleicht kannst du mir noch ein stupser geben wie genau ich das umsetze. Irgenwie fehlt mir die Verbindung zu dieser sub und dann der weiterverarbeitung wie du es vorgeschlagen hast.

Der 1. Vorschlag scheint jedoch der saubere zu sein. Ich habe nur leider keine Ahnung was ich da genau anpassen muss. Auch hiezu nehme ich gerne noch ein wenig input. Hab leider von dem Code da wenig Ahnung :(

Danke :)

setstate

Du muss eigentlich nur den Kern des Scripts nutzen -> das 'ls -lt' nach Zeit sortierten Auflisten der Bilder

Name letztes neustes Bild
return qx(ls -lt --time-style='+%Y-%m-%d %H:%M:%S' www/snapshots/*.png | sed -n '1p' | cut -d " " -f8);

Zeit letztes neustes Bild
return qx(ls -lt --time-style='+%Y-%m-%d %H:%M:%S' www/snapshots/*.png | sed -n '1p' | cut -d " " -f6-7);

Name vorletztes neustes Bild
return qx(ls -lt --time-style='+%Y-%m-%d %H:%M:%S' www/snapshots/*.png | sed -n '2p' | cut -d " " -f8);

Zeit vorletztes neustes Bild
return qx(ls -lt --time-style='+%Y-%m-%d %H:%M:%S' www/snapshots/*.png | sed -n '2p' | cut -d " " -f6-7);

Alles ungetestet ....

Andre0909

Zitat von: setstate am 15 Januar 2017, 13:43:39
Du muss eigentlich nur den Kern des Scripts nutzen -> das 'ls -lt' nach Zeit sortierten Auflisten der Bilder

Name letztes neustes Bild
return qx(ls -lt --time-style='+%Y-%m-%d %H:%M:%S' www/snapshots/*.png | sed -n '1p' | cut -d " " -f8);

Zeit letztes neustes Bild
return qx(ls -lt --time-style='+%Y-%m-%d %H:%M:%S' www/snapshots/*.png | sed -n '1p' | cut -d " " -f6-7);

Name vorletztes neustes Bild
return qx(ls -lt --time-style='+%Y-%m-%d %H:%M:%S' www/snapshots/*.png | sed -n '2p' | cut -d " " -f8);

Zeit vorletztes neustes Bild
return qx(ls -lt --time-style='+%Y-%m-%d %H:%M:%S' www/snapshots/*.png | sed -n '2p' | cut -d " " -f6-7);

Alles ungetestet ....

Okay, das habe ich soweit verstanden, da der Rest ja wohl nur dafür da ist, die "Tabelle" zu bauen. Wenn ich das richtig verstehe müsste ich also z.b. für 9 Fotos 9 mal eine sub 1..9 bauen und diese jeweils mit:

return qx(ls -lt --time-style='+%Y-%m-%d %H:%M:%S' www/snapshots/*.png | sed -n '1-9p' | cut -d " " -f8);

füllen. Wenn das so richtig ist verstehe ich nur noch nicht den Zusammenhang zum Einbau ins FTUI. Die sub 1 sollte mir ja dann das entsprechende Foto 1 liefern, aber in welcher Form? Als link? Wie binde ich das dann ins Image Widget ein. Sorry ich hab schon echt viel gemacht aber der eigen programmierbare Perl-Teil ist echt meine schwäche.

---------------------

sub last_pics1($$$$$)

return qx(ls -lt --time-style='+%Y-%m-%d %H:%M:%S' www/snapshots/*.png | sed -n '1p' | cut -d " " -f8);


setstate

Perl ist auch nicht meine Lieblingssprache. Vor lauter $ Zeichen sieht man manchmal den Code nicht mehr  ;)

Nicht für jedes Bild ein sub. Du kannst doch Aufrufsparameter benutzen.


sub last_pics($)
{
my ($p) = @_;
my $ss = "'".$p."p'";
return qx(ls -lt --time-style='+%Y-%m-%d %H:%M:%S' www/snapshots/*.png | sed -n $ss | cut -d " " -f8);



Aufruf dann mit {  last_pics(1); }
Wenn es funktioniert, kann man das kann man dann auch als UserReadings bei attr einfügen.

Alles ungetestet !!!

Andre0909

#6
Zitat von: setstate am 15 Januar 2017, 15:40:15
Perl ist auch nicht meine Lieblingssprache. Vor lauter $ Zeichen sieht man manchmal den Code nicht mehr  ;)

Nicht für jedes Bild ein sub. Du kannst doch Aufrufsparameter benutzen.


sub last_pics($)
{
my ($p) = @_;
my $ss = "'".$p."p'";
return qx(ls -lt --time-style='+%Y-%m-%d %H:%M:%S' www/snapshots/*.png | sed -n $ss | cut -d " " -f8);



Aufruf dann mit {  last_pics(1); }
Wenn es funktioniert, kann man das kann man dann auch als UserReadings bei attr einfügen.

Alles ungetestet !!!

Danke erstmal für deine Mühe. Habe jetzt folgendes in die 99 gesetzt:

sub last_pics($)
{
my ($p) = @_;
my $ss = "'".$p."p'";
return qx(ls -lt --time-style='+%Y-%m-%d %H:%M:%S' www/snapshots/cam1/*.jpg | sed -n $ss | cut -d " " -f8);
}


Dazu habe ich ein Dummy erstellt und dieses mit Attr User Reading reading1 {  last_pics(1); }

Ic weiß nicht ob ich was vergessen habe, aber es passiert nüx :/








Andre0909

Hast du hier evtl noch einen Tipp für mich setstate? Ich denke die Lösung ist nah :/

setstate

Was passiert denn, wenn du {  last_pics(1); } in der Fhem Eingabe sendest?

Andre0909

Also irgendwie bin ich zu doof. du meinst die ganz normale Eingabezeile? Dann kommt entweder unknown command "{" oder wenn ich das ohne Klammern eingebe unknown command Last_pics  :-\

Markus Bloch

Da du ein Semikolon im Befehl verwendest der nicht maskiert ist, trennt FHEM den Befehl an dieser Stelle auf, was natürlich nicht Sinn dieses Befehls ist. Entweder das Semikolon maskieren oder ganz weglassen:

{last_pics(1)}
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Andre0909

#11
Super Danke...also ein Schritt weiter...

Wenn ich das ganze in die Kommandozeile eingebe kommt als Response "15:54:23".
Das ist genau die Uhrzeit des letzten Screenshots. So weit so gut denke ich...

Was jetzt noch nicht klappt, wie ich das ganze mit einem Dummy und entsprechenden Reading Versehe damit ich im Image widget genau den Screen anzeigen lassen kann. Das würde dann ja auch analog zu screen 2,3,4,5.... funktionieren.

Ich habe eine Dummy angelegt mit dem Attr UserReading und da im Fenster (nicht der CFG) eingegeben:


reading1 {  last_pics(1); }
reading1 {  last_pics(1);; }
reading1 {  last_pics(1) }


Also jede Variante einmal ausprobiert. Führt leider noch zu keinem Erfolg... Habe mir ach nochmal alles zu Userreadings durchgelesen da ich die eigentlich nicht nutze. Syntax müsste doch eigentlich stimmen. Aber wie komme ich nu ans Bild?

Danke für die geduldige Hilfe!!

Andre0909

#12
Hat hier jmd noch ein Denkansatz für mich ? Ich weiß leider nicht wie ich die Verknüpfung realisieren soll. Die sub  scheint ja zu funktionieren, zumindest gibt sie beim testen die Uhrzeit des screens aus. lieben Dank

setstate

Dann passt das Fragment aus deinem Script noch nicht.
Dreh mal an dem -f8 rum. -f10 oder -f12

Zur Erklärung: das Sript man nix weiter als ein Bash Command zu rufen, was ein Verzeichnis in der Langform listet. Also mit Owner, Gruppen, Zeitstempel, Dateien. Dann wird eine Zeile in Fraktionen zerlegt, anhand eines Trenners (hier Leerzeichen). Du musst also die richtige Spalte zurück geben.

Andre0909

#14
Zitat von: setstate am 20 Januar 2017, 14:29:05
Dann passt das Fragment aus deinem Script noch nicht.
Dreh mal an dem -f8 rum. -f10 oder -f12

Zur Erklärung: das Sript man nix weiter als ein Bash Command zu rufen, was ein Verzeichnis in der Langform listet. Also mit Owner, Gruppen, Zeitstempel, Dateien. Dann wird eine Zeile in Fraktionen zerlegt, anhand eines Trenners (hier Leerzeichen). Du musst also die richtige Spalte zurück geben.

Ah okay, dachte die Anzeige wäre beim Eingabebefehl schon richtig. f10, f12 liefern keine ergebnisse, aber f9 liefert:

"www/snapshots/cam1/Cam1_20170118_191824.jpg "

damit hätte ich ja die notwendige url für ein image widget, richtig? Dann bin ich nur wieder bei dem Problem wie ich das bei jeder Änderung des Subergebnisse in ein Reading schreiben kan, analog für alle 9-12 screens... Wenn da noch jmd helfen kann bin ich bald still :D

Also im Prinzip schreibe alle 5 min sub 1 wert in dummy reading 1, sub 2 wert in dummy reading 2 .... etc..

zusätzliches Problem wird noch, dass die URL in www/.... ausgeben wird und damit das reading in data-url beim image widget falsch verzweigt, da von einem anderen Grundverzeichnis ausgegangen wird...