Test: 02_RSS mit alignments

Begonnen von betateilchen, 12 November 2013, 13:29:56

Vorheriges Thema - Nächstes Thema

betateilchen

Ziel: Bilder an einem bestimmten Punkt im RSS-jpg ausrichten, im Beispiel genau in der Mitte (x=0.5,y=0.5)

Layout: (default)


#halign "left" ## default
#valign "top"  ## default
img .5 .5 1 jpeg file "250jpg.jpg"


Ergebnis:

(http://up.picr.de/16451335nf.jpg)


Layout:


halign "left"
valign "center"
img .5 .5 1 jpeg file "250jpg.jpg"


Ergebnis:

(http://up.picr.de/16451336rx.jpg)


Layout:


halign "left"
valign "bottom"
img .5 .5 1 jpeg file "250jpg.jpg"


Ergebnis:
(http://up.picr.de/16451342yt.jpg)


Layout:


halign "center"
valign "bottom"
img .5 .5 1 jpeg file "250jpg.jpg"


Ergebnis:

(http://up.picr.de/16451345ga.jpg)


Layout:


halign "right"
valign "bottom"
img .5 .5 1 jpeg file "250jpg.jpg"


Ergebnis:

(http://up.picr.de/16451337so.jpg)


Layout:


halign "right"
valign "center"
img .5 .5 1 jpeg file "250jpg.jpg"


Ergebnis:

(http://up.picr.de/16451346fk.jpg)


Layout:


halign "right"
valign "top"
img .5 .5 1 jpeg file "250jpg.jpg"


Ergebnis:

(http://up.picr.de/16451352aa.jpg)


Layout:


halign "center"
valign "top"
img .5 .5 1 jpeg file "250jpg.jpg"


Ergebnis:

(http://up.picr.de/16451353kb.jpg)


Layout:


halign "center"
valign "center"
img .5 .5 1 jpeg file "250jpg.jpg"


Ergebnis:

(http://up.picr.de/16451354hb.jpg)



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

betateilchen

Das Ganze funktioniert genauso auch mit allen Textelementen (text, date, time...) innerhalb eines RSS:

Layout:


line 0 100 1 100
line 0 200 1 200
line 0 300 1 300
line 0 400 1 400
line 0 500 1 500

font /usr/share/fonts/truetype/msttcorefonts/arial.ttf
pt 30
text 100 100 { "this is default alignment" }

valign "top"
text 100 200 { "this is alignment with valign = top" }

valign "center"
text 100 300 { "this is alignment with valign = center" }

valign "base"
text 100 400 { "this is alignment with valign = base" }

valign "bottom"
text 100 500 { "this is alignment with valign = bottom" }


Ergebnis:

(http://up.picr.de/16453198ax.jpg)



Voraussetzungen für die Nutzung von valign und halign mit Textelementen:

Das Perl Modul GD::Text::Align muss nachinstalliert werden!

Auf einem RaspberryPi, einem BeagleBoneBlack oder anderen Debian Installationen am einfachsten mit [/li][/list]
apt-get install libgd-text-perl


  • Auf die Darstellung der halign Möglichkeiten "left","center","right" habe ich hier verzichtet, da eigentlich selbsterklärend
  • 02_RSS prüft, ob das Modul zur Verfügung steht. Fehlt das Modul, kann man die neuen Tags zwar alle im Layout verwenden, aber sie werden bei der Textausgabe einfach ignoriert. Eine Fehlermeldung oder ein Abbruch erfolgt nicht.
  • Die valign Definition "base" kann auch bei img-Einbettungen verwendet werden, dann wird das img quasi auf der Baseline eines danebenstehenden Textes ausgerichtet. Technisch betrachtet gibt es bei img keinen Unterschied zwischen "base" und "bottom"
  • ungültige Angaben bei valign und halign werden ignoriert, die bis zu diesem Punkt definierten Parameter bleiben unverändert (es wird NICHT der Defaultwert verwendet!)


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

betateilchen

Und wenn man mal im RSS entscheiden möchte, ob man einen Inhalt überhaupt darstellen will?

Kein Problem, machen wir das Ganze eben conditional:

Layout:


font /usr/share/fonts/truetype/msttcorefonts/arial.ttf
pt 20

condition { ( 1 == 1 ) }
text 100 100 { "Ich werde angezeigt, weil condition WAHR ergibt" }

condition { ( 1 == 2 ) }
text 100 200 { "ich werde NICHT angezeigt, weil condition FALSCH ergibt" }


Ergebnis:

(http://up.picr.de/16453462sg.jpg)

Wie man sieht, wird die zweite Textzeile nicht ausgegeben, weil 1 ungleich 2 ist.

Wichtig:
Alles was in der Layout-Definition nach so einer condition kommt, wird entweder dargestellt oder eben nicht - solange, bis eine neue condition definiert wird! Man sollte also nicht vergessen, eine condition auch wieder zurückzusetzen  8)

Wozu das Ganze?

Anwendungsbeispiel aus einer meiner eigenen RSS-Definition:

vorher:


rgb "FFFFFF"
halign "center"
text .25 410 {if(ReadingsVal("gds","a_valid","")){utf8ToLatin1("gültig von: ".ts2text(ReadingsVal("gds","a_onset","?")))}}
text .75 410 {if(ReadingsVal("gds","a_valid","")){utf8ToLatin1("gültig bis: ".ts2text(ReadingsVal("gds","a_expires","?")))}}
text .50 430 {if(ReadingsVal("gds","a_valid","")){utf8ToLatin1(ReadingsVal("gds","a_headline",""))}}


nachher:


condition { ReadingsVal("gds","a_valid","") }
rgb "FFFFFF"
halign "center"
text .25 410 { utf8ToLatin1("gültig von: ".ts2text(ReadingsVal("gds","a_onset","?")) }
text .75 410 { utf8ToLatin1("gültig bis: ".ts2text(ReadingsVal("gds","a_expires","?")) }
text .50 430 { utf8ToLatin1(ReadingsVal("gds","a_headline","")) }


Ich muss also die if-Abfrage nicht in jedes Element schreiben, sondern nur einmal vor den Block.
Das macht komplexe Layout-Definitionen einfach sehr viel übersichtlicher.



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

betateilchen

Das geänderte Modul geht jetzt erstmal zu Boris zur Prüfung :)

Und die Doku für die commandref fehlt auch noch...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

was mir jetzt eigentlich noch fehlt, ist die Möglichkeit, innerhalb der Layoutdefinition einen Zähler zu führen.

Anwendungsbeispiel:
Ich habe 5 Zeilen mit Statusmeldungen untereinander, alle haben einen Pixelabstand von 20px.
Nun werden die Zeilen 2 und 4 wegen condition = false nicht ausgegeben, dann sollen die Zeilen 3 und 5 nachrücken. Also Zeile 3 an y-Positon(2) und Zeile 5 an y-Position(3)

Muss ich mal intensiv drüber nachdenken...
-----------------------
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

Hallo,

das Modul ist im SVN und steht morgen zum Update bereit!

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

betateilchen

#6
Die jetzt eingecheckte Version der Änderungen gefällt mir nicht wirklich, aber das muss an anderer Stelle diskutiert werden.




Nächstes Thema...

Zitat von: betateilchen am 14 November 2013, 11:26:32
was mir jetzt eigentlich noch fehlt, ist die Möglichkeit, innerhalb der Layoutdefinition einen Zähler zu führen.

Anwendungsbeispiel:
Ich habe 5 Zeilen mit Statusmeldungen untereinander, alle haben einen Pixelabstand von 20px.
...

Grundsätzlich habe ich das jetzt auch gelöst.


rgb "2E64FE"
text 220 70 { "LR: ".ts2text(ReadingsTimestamp("out_Regen_Sensor", "lastRain","n/a"))}

rgb "FF0000"
condition { ReadingsVal("gds", "a_valid", "") }
ypos +20
text 220  ypos { ">>> DWD Warnung!" }

condition { ( Value("freezeWarning") eq "ja" ) }
ypos +20
text 220  ypos { ">>> Frostgefahr!" }

condition { ( Value("RM_Status") ne "ok" ) }
ypos +20
text 220 ypos { ">>> Rauchmelder!" }

condition { ( Value("batteryWarning") ne "ok" ) }
ypos +20
text 220 ypos { ">>> Batterien!" }


Ich habe aktuell nur noch das Problem, dass ich irgendwie zwei Instanzvariablen (beispielsweise $hash->{helper}{xpos} und $hash->{helper}{ypos}) unterbringen muss und mir das im Modul noch nicht zuverlässig gelungen ist...
-----------------------
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

Zitat von: betateilchen am 15 November 2013, 22:10:06
Die jetzt eingecheckte Version der Änderungen gefällt mir nicht wirklich, aber das muss an anderer Stelle diskutiert werden.

Ich habe jetzt eine neue Version eingecheckt, bei der es zusätzlich gesonderte Layoutbefehle thalign, ihalign, tvalign, ivalign gibt, die sich nur auf Text bzw. Bild auswirken. halign und valign wirken sich weiterhin auf beides aus und stellen hoffentlich den von Dir gewünschten Zustand her. Kannst Du Dir das bitte mal ansehen?

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

betateilchen

ja, schau ich mir an. Obwohl man es überhaupt nicht so kompliziert (mit zusätzlichen Parametern) hätte machen müssen.

Ich habe in meiner Version hier vor Ort einfach noch die Werte "default" für valign und halign zugelassen, damit lassen sich innerhalb des Layouts wieder die "geordneten" Verhältnisse herstellen, ohne dass man weitere Definitionen braucht. Vielleicht wäre das die einfachere Lösung anstatt mit weiteren Parametern arbeiten zu müssen. Durch zu viele weitere Parameter wird doch die ganze Layout-Gestaltung wieder unübersichtlich, ausserdem muss man dann dauernd an vier Parameter denken anstatt nur an zwei.


Übrigens:

Zitatvalign "top"|"center"|"base"|"bottom"
Sets the vertical text and image alignment. Defaults to top-aligned. You can use { <perl special> } instead of the literal alignment control word.

Dieser Ausschnitt aus der commandref stimmt so nicht ganz. Default für Texte ist nicht top-aligned, sondern base-aligned. top-aligned ist nur bei Images der default-Wert. Genau DAS ist ja das Problem, warum ich base auch für Images zulassen wollte.

Und in der commandref fehlt m.E. im Moment auch noch ein Hinweis auf GD:Text:Align - oder ich habe es übersehen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#9
Zitat von: Dr. Boris Neubert am 16 November 2013, 12:32:21Ich habe jetzt eine neue Version eingecheckt, bei der es zusätzlich gesonderte Layoutbefehle thalign, ihalign, tvalign, ivalign gibt, die sich nur auf Text bzw. Bild auswirken. halign und valign wirken sich weiterhin auf beides aus und stellen hoffentlich den von Dir gewünschten Zustand her.

Funktioniert überhaupt nicht!

Weder funktionieren meine bestehenden Layouts mit halign und valign, noch funktionieren neu angelegte Layouts mit ihalign/ivalign/...

Gute Nacht.


font /usr/share/fonts/truetype/msttcorefonts/arial.ttf

#--------------------
# Linien zeichnen
#

rgb { return "7F7F7F"; } # grau
line 0  50 1  50
line 0 220 1 220
line 0 388 1 388

line 200 50 200 220
line 400 50 400 220
line 600 50 600 220

#--------------------
# Kopfzeile
#

pt 24
tvalign "center"
thalign "center"
rgb "FF0000"
text .375 25 { tendenz(Value("out_balkon_alt"), Value("out_balkon_neu")).ReadingsVal("out_Balkon","temperature","n/a "). "°C"  }

thalign "right"
rgb "2E64FE" # blau
text .57 25 { tendenz(Value("out_balkonH_alt"), Value("out_balkonH_neu")).int(ReadingsVal("out_Balkon","humidity","0")). "%"  }

thalign "right"
rgb "00FF00" # grün
text .80 25 { tendenz(Value("pressure_alt"), Value("pressure_neu")).int(ReadingsVal("BMP180","pressure-nn","0")). " hPa"  }

rgb ffffff # weiss
thalign "center"
date 0.125 25
time 0.875 25

condition { ReadingsVal("gds", "a_valid", "") || Value("freezeWarning") eq "ja" || Value("freezeWarning") eq "ja" || Value("RM_Status") ne "ok" || Value("batteryWarning") ne "ok"  }
ihalign "center"
ivalign "center"
img 775 25 1 jpeg file { "/home/udo/alert48.jpg" }


(http://up.picr.de/16490533qm.jpg)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#10
Nachtrag: images scheinen jetzt zu funktionieren, aber Texte stehen immer noch kreuz und quer.



EDIT:
Lösung:
1. Ein einfaches reload 02_RSS in Kombination mit einem anschließenden rereadcfg reicht nicht.
2. nach einem shutdown restart scheinen jetzt auch die Texte korrekt positioniert zu werden.

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

betateilchen

Problem:


2013.11.16 23:34:02 1: DUALRSS: Illegal command condition in layout definition.
2013.11.16 23:34:02 1: DUALRSS: Illegal command condition in layout definition.
2013.11.16 23:34:03 1: DUALRSS: Illegal command condition in layout definition.


Lösung:


Index: 02_RSS.pm
===================================================================
--- 02_RSS.pm (revision 4232)
+++ 02_RSS.pm (working copy)
@@ -443,6 +443,7 @@
             ($x,$y,$scale,$imgtype,$srctype,$arg)= split("[ \t]+", $def,6);
             my $arg= AnalyzePerlCommand(undef, $arg);
             RSS_itemImg($S,$x,$y,$scale,$imgtype,$srctype,$arg,%params);
+          } elsif($cmd eq 'condition') {
           } else {
             Log3 $name, 1, "$name: Illegal command $cmd in layout definition.";
           }

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

betateilchen

Hier noch ein kompletter ad-hoc-Patch, der die zwei neuen Befehle xpos und ypos (siehe weiter oben erklärt) implementiert und diese auch noch per <perl-special> auflösen kann, falls man das irgendwo braucht.

Die Sache mit den beiden Postionsvariablen muss noch anders gelöst werden - aber mir ist noch keine "einfache" Idee eingefallen.
$hash und $name sind momentan überall da, wo ich sie bräuchte, nicht in den betroffenen Funktionen verfügbar.


Index: 02_RSS.pm
===================================================================
--- 02_RSS.pm (revision 4232)
+++ 02_RSS.pm (working copy)
@@ -21,6 +21,8 @@
my @valid_valign = qw(top center base bottom);
my @valid_halign = qw(left center right);

+my ($xpos,$ypos);
+
# we can
# use vars qw(%FW_types);  # device types,
# use vars qw($FW_RET);    # Returned data (html)
@@ -213,8 +215,20 @@
sub
RSS_xy($$$) {
   my ($S,$x,$y)= @_;

+  $x = $xpos if($x eq 'xpos');
+  $y = $ypos if($y eq 'ypos');

+  $x = AnalyzePerlCommand(undef, $x);
+  $y = AnalyzePerlCommand(undef, $y);

   if($x<=1) { $x*= $S->width; }
   if($y<=1) { $y*= $S->height; }

+  $xpos = $x;
+  $ypos = $y;

+  #Debug "xpos: $x - ypos: $y";
   return($x,$y);
}

@@ -405,6 +419,10 @@
             $params{font}= $def;
           } elsif($cmd eq "pt") {
             $params{pt}= $def;
+          } elsif($cmd eq "xpos") {
+            $xpos += $def;
+          } elsif($cmd eq "ypos") {
+            $ypos += $def;
           } elsif($cmd ~~ @cmd_halign) {
                 my $d = AnalyzePerlCommand(undef, $def);
                 if($d ~~ @valid_halign) {
@@ -443,6 +461,7 @@
             ($x,$y,$scale,$imgtype,$srctype,$arg)= split("[ \t]+", $def,6);
             my $arg= AnalyzePerlCommand(undef, $arg);
             RSS_itemImg($S,$x,$y,$scale,$imgtype,$srctype,$arg,%params);
+          } elsif($cmd eq 'condition') {
           } else {
             Log3 $name, 1, "$name: Illegal command $cmd in layout definition.";
           }
-----------------------
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

Hallo,

ich habe eine erweiterte Version eingecheckt.

Diese enthält die von Dir vorgeschlagene Möglichkeit zur relativen Positionierung. Die Befehle heißen moveto und moveby (statt xpos,ypos). Erinnert mich an Turtle Graphics. Wo Koordinaten verlangt sind, kann mit literalen x und y auf die zuletzt verwendete Position zugegriffen werden. Zwischengespeichert wird das in %params, da die Informationen ja nur beim Durcharbeiten des Layouts benötigt werden und nicht permanent am Device oder Modul.

Außerdem werden nur Werte zwischen -1 und +1 exklusive als relative Positionierungen erkannt. Damit ist es auch möglich, auf x=1 oder y=1 zu positionieren.

condition liefert kein Gemecker mehr im Log.

Doku ist fit.

Ich hoffe, daß bei Dir damit auch alles läuft.

Mit dem $defs{"theNameOfTheRSSDevice"}{fhem}{counter} im Perl-Special für condition und ein wenig Modulo-Arithmetik kann man bestimmte Elemente übrigens nur jedes x-te Mal anzeigen lassen.

Viele Grüße
Boris

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

betateilchen

Danke, ich schau mir die erweiterte Version heute an.
Muss ich wohl alle meine Layout nochmal ändern und die Befehle umschreiben.

Ist das der gleiche counter, über dessen Sinn im Modul ich mich schon seit Monaten wundere?  8)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!