FHEM Forum

FHEM => Frontends => RSS => Thema gestartet von: mrmist am 10 April 2018, 22:47:38

Titel: RSS um label und goto erweitern
Beitrag von: mrmist am 10 April 2018, 22:47:38
Hallo,

ich baue mir mit RSS ein Bild für ein eInk-Infodisplay zusammen. Darauf werden insb. Wettervorhersage und Kalender angezeigt. Für beides wäre eine Schleifenfunktion sehr interessant.

Nach ein wenig tüfteln habe ich mir mit folgendem kleinen Patch zwei weitere Layout-Kommandos "label" und "goto" in 02_RSS eingebaut:

Index: 02_RSS.pm
===================================================================
--- 02_RSS.pm   (Revision 16580)
+++ 02_RSS.pm   (Arbeitskopie)
@@ -554,12 +554,15 @@
   $params{y}= 0;
   
   $defs{$name}{".embed"}= "";
+  $defs{$name}{labelcounter}= {};
   

-  my ($x,$y,$z,$x1,$y1,$x2,$y2,$scale,$bgcolor,$boxwidth,$text,$imgtype,$srctype,$arg,$format);
+  my ($x,$y,$z,$x1,$y1,$x2,$y2,$scale,$bgcolor,$boxwidth,$text,$imgtype,$srctype,$arg,$format,%labels);

   my $cont= "";
-  foreach my $line (@layout) {
+  my $i = 0;
+  while ($i <= $#layout) {
+          my $line = $layout[$i++];
           # kill trailing newline
           chomp $line;
           # kill comments and blank lines
@@ -705,6 +708,17 @@
              $defs{$name}{".embed"} .= $arg."\n";
              $defs{$name}{".embed"} .= "</div>\n";
              #main::Debug "SET EMBED=" . $defs{$name}{".embed"};
+            } elsif($cmd eq "label") {
+              $labels{$def} = $i-1;
+              if (defined $defs{$name}{labelcounter}{$def}) {
+                $defs{$name}{labelcounter}{$def}++;
+              } else {
+                $defs{$name}{labelcounter}{$def} = 0;
+              }
+            } elsif($cmd eq "goto") {
+              if (defined $label{$def} && $defs{$name}{labelcounter}{$def} <= 100) {
+                $i = $label{$def};
+              }
          } else {
              Log3 $name, 2, "$name: Illegal command $cmd in layout definition.";
          }


Damit kann ich jetzt ein Label setzen, zu dem ich dann zurückspringen kann:

...
label testlbl
moveby 0 15
text x y {"Zeile ".$defs{rss_Test}{labelcounter}{testlbl}}
condition {$defs{rss_Test}{labelcounter}{testlbl} < 5}
goto testlbl
condition {1}
...


Natürlich besteht damit die Gefahr, eine Endlosschleife in die Layoutdefinition einzubauen. Deshalb habe ich die maximale Anzahl an Rücksprüngen pro Label erst einmal auf 100 begrenzt. (Das lässt sich aber bestimmt intelligenter regeln.)

Ich habe nun mehrere Fragen:

Gruß,
- Mirko -
Titel: Antw:RSS um label und goto erweitern
Beitrag von: Dr. Boris Neubert am 13 April 2018, 12:27:32
Hallo Mirko,

das hat gute Chancen, aufgenommen zu werden. Sobald ich mich wieder an FHEM mache, werde ich mich darum kümmern. Auch um eine Erleichterung für $defs{rss_Test}{labelcounter}{testlbl}.

Ich wäre Dir dankbar, wenn Du die commandref erweitern könntest und mir das insgesamt nochmal als Patch anhängst.

Viele Grüße
Boris
Titel: Antw:RSS um label und goto erweitern
Beitrag von: mrmist am 15 April 2018, 15:32:22
Hallo Boris,

anbei mein Patch-Vorschlag.

Gruß,
- Mirko -
Titel: Antw:RSS um label und goto erweitern
Beitrag von: Dr. Boris Neubert am 18 April 2018, 22:03:01
Hi Mirko,

habe jetzt eine Variante gefunden, die bei Verwendung von einem Label foo die Variable $foo auf den Durchlaufzähler setzt.

Dabei ist mir aufgefallen, dass es m.E. keinen Grund gibt, den Labelzähler in $defs{$name} zu speichern, da die Zählung lokal in RSS_evalLayout() erfolgt. Wir könnten auch my $labelcount{foo} benutzen.

Wie siehst Du das?

Viele Grüße
Boris
Titel: Antw:RSS um label und goto erweitern
Beitrag von: Dr. Boris Neubert am 19 April 2018, 21:30:27
Hallo,

ich habe das jetzt nochmal gründlich überarbeitet. Wesentliche Neuerungen:

Über Tests der anhängenden Version würde ich mich freuen.

Viele Grüße
Boris
Titel: Antw:RSS um label und goto erweitern
Beitrag von: mrmist am 19 April 2018, 22:13:43
Hallo Boris,

das klingt super. Ich kann es aber erst morgen Abend testen, dann bin ich wieder zu Hause.  :)

Gruß,
- Mirko -
Titel: Antw:RSS um label und goto erweitern
Beitrag von: mrmist am 22 April 2018, 14:21:59
Hallo!

Es funktioniert super!  :)
Besonders die Möglichkeit, eine Bedingung für ein goto direkt dahinter zu schreiben ist genial.  8)

Viele Grüße und riesigen Dank an Boris,
- Mirko -
Titel: Antw:RSS um label und goto erweitern
Beitrag von: mrmist am 22 April 2018, 14:49:06
Hallo,

eines ist mir gerade doch noch aufgefallen: Beim ersten Durchlauf einer Schleife ist der Label-Zähler 1 und nicht wie in der Commandref beschrieben 0. Also muss entweder der Code oder die Commandref angepasst werden.  ;D

Gruß,
- Mirko -
Titel: Antw:RSS um label und goto erweitern
Beitrag von: Dr. Boris Neubert am 22 April 2018, 16:40:51

ZitatThe counter starts with zero and is increased with every hit of the label.

Ist das verständlich?

Solange wir noch nicht am Label vorbeigekommen sind, steht der Zähler auf 0. Sobald wir das Label erreichen, geht er auf 1. Wenn das goto davor ist und nach vorne springt, ist also $label beim ersten Mal 0, wenn das goto danach ist und zurück springt, ist also $label beim ersten Mal 1.
Titel: Antw:RSS um label und goto erweitern
Beitrag von: mrmist am 22 April 2018, 17:21:47
Hast recht, ich habe es falsch verstanden.  :-[
Titel: Antw:RSS um label und goto erweitern
Beitrag von: Dr. Boris Neubert am 22 April 2018, 17:30:57
Hi Mirko,

eine Anleitung soll leicht verständlich sein. Habe daher eine Erläuterung dazugetan.

Eingecheckt, morgen um 8 per Update verfügbar.

Viele Grüße
Boris
Titel: Antw:RSS um label und goto erweitern
Beitrag von: betateilchen am 31 Mai 2018, 12:33:47
Zitat von: Dr. Boris Neubert am 22 April 2018, 17:30:57
Eingecheckt, morgen um 8 per Update verfügbar.

Hallo Boris,

ich glaube, Du musst nochmal ran und die Sache mit den Labels überarbeiten.

In Zeile 613 rufst Du EvalSpecials(undef,%count) auf. Der erste Parameter darf aber nicht undef sein.

Siehe auch: https://forum.fhem.de/index.php/topic,88271.msg806925.html#msg806925


Titel: Antw:RSS um label und goto erweitern
Beitrag von: Dr. Boris Neubert am 03 Juni 2018, 21:53:17
gefixt und eingecheckt