RSS um label und goto erweitern

Begonnen von mrmist, 10 April 2018, 22:47:38

Vorheriges Thema - Nächstes Thema

mrmist

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:

  • Wäre eine solche Funktionalität auch für andere von Interesse?
  • Besteht die Chance, das als Patch ins Modul aufgenommen zu bekommen?
  • Gibt es einen schöneren Weg, den Zähler für die Verwendung im Layout zur Verfügung zu stellen, als über $defs{rss_Test}{labelcounter}{testlbl}?
  • Welchen besseren Weg gäbe es, Endlosschleifen zu verhindern?

Gruß,
- Mirko -

Dr. Boris Neubert

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
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

mrmist

Hallo Boris,

anbei mein Patch-Vorschlag.

Gruß,
- Mirko -

Dr. Boris Neubert

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
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Dr. Boris Neubert

Hallo,

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

  • goto springt Labels an, die vor oder nach dem goto liegen
  • goto foo if condition
  • $foo beinhaltet den Zähler, wie oft die Zeile mit dem Label namens foo passiert wurde (nicht wie oft goto dort hingesprungen ist!)

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

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

mrmist

Hallo Boris,

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

Gruß,
- Mirko -

mrmist

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 -

mrmist

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 -

Dr. Boris Neubert


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.
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

mrmist

Hast recht, ich habe es falsch verstanden.  :-[

Dr. Boris Neubert

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
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

betateilchen

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


-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dr. Boris Neubert

Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!