[gelöst] Status als xml-Zeile ausgeben

Begonnen von FHEm2005, 04 Januar 2018, 13:57:23

Vorheriges Thema - Nächstes Thema

FHEm2005

Habe als Status aus einer Webseite die UTC-Zeit erfolgreich geparst und möchte sie später in anderen Systemen weiterverwenden, die xml-fordern. Dazu würde ich sie gerne bereits als xml-Zeile loggen.

reading01Name <device> UTC
reading01Regex <device> minutes ago [^0-9]+([0-9- :]+)
StateFormat <device> UTC


Das bringt mir die Uhrzeit in einem normalen Faormat zur Anzeige und wird auch so geloggt. Jetzt hätte ich aber gerne eine Anzeige im xml-Format <time>UTC</time>. Das soll auch so geloggt werden. Aber mit den spitzen Klammern steht die Ausgabe auf Kriegsfuß. Meine "Wunschanzeige unterdrückt sowohl <time> als auch </time>.  Das Problem ist das <-Zeichen. Mit dem>-Zeichen gibt es keine Probleme. Beim Weglassen des <-Zeichen lautet die Anzeige time>18:45/time>

Was muss ich vor das <-Zeichen setzen, damit es angezeigt wird?
Könnte man das Reading bereits so aufbereiten, dass <time> und </time> bereits "eingearbeitet" werden? Ungefähr so <time>reading</time>.

EDIT: Auch folgendes Konstrukt verweigert die Anzeige von <:
{sprintf ("<time>%s</time>",ReadingsVal($name,'UTC','0'))}


Gruß Eberhard
Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge; Raspi4: Node-red, MQTT, Gaszähler auslesen mit ESP32-CAM, BSB-LAN

FHEm2005

#1
Ich muss das Thema noch einmal aufgreifen, da ich etwas konkreter werden kann:

Ich verwende das Modul HTTPMOD.

Ich habe folgendes attr hinzugefügt:
attr <device> stateFormat {"<trkpt lat=".ReadingsVal($name,'lat','0')." lon=".ReadingsVal($name,'lon','0')." />"}

In den Internals wird mir als STATE angezeigt:
<trkpt lat=51.3382797 lon=1.90751696 />

In der Anzeige wird state (das Reading state gibt es nicht) wegen des "<"-Zeichen nicht angezeigt. Lasse ich es weg wird mir
trkpt lat=51.3382797 lon=1.90751696 />

angezeigt. Ich habe versucht in der Definition das "<" zu ersetzen und zwar durch "\<" (ERgebnis:STATE ok, state keine Anzeige) , entweder wird es nicht angezeigt oder Fehlermeldung.
Dann habe ich die Definition verändert nach:

[code]attr <device> stateFormat {chr(0X3C)."trkpt lat=".ReadingsVal($name,'lat','0')." lon=".ReadingsVal($name,'lon','0')." />"} oder
attr <device> stateFormat {"\x3Ctrkpt lat=".ReadingsVal($name,'lat','0')." lon=".ReadingsVal($name,'lon','0')." />"}
Wieder das Gleiche: STATE wird wie gewollt angezeigt und state wird nicht angezeigt.

Gibt es Zeichen, die im Attribut stateFormat besonders maskiert werden müssen und wenn ja, welche und wie? Ich suche nun seit 3 Tage und habe nichts Passendes gefunden.

Gruß Eberhard

PS: Ähnliche Problemehabe ich mit der Anzeige von Anführungsstrichen.
Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge; Raspi4: Node-red, MQTT, Gaszähler auslesen mit ESP32-CAM, BSB-LAN

KernSani

#2
Für die Anzeige sollte es ein & lt; tun...

Edit: natürlich ohne amp;blank nach dem &, aber anders bekomme ich es gersde nicht dargestellt ;-)

Also UND LT Semikolon
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

FHEm2005

Nach mehreren Versuchen führte folgende Definition letztendlich zum gewünschten Ergebnis:
Eingabe:
{"\&lt;"."trkpt lat=".ReadingsVal($name,'lat','0')." lon=".ReadingsVal($name,'lon','0')." />"}
Ausgabe:
<trkpt lat=49.5975685 lon=-3.84566689 />

Unter Anwendung des gleichen Schemas für die Anführungszeichen erhalte ich mit der Def:
attr <device> stateFormat {"\&lt;"."trkpt lat="."\&quot;".ReadingsVal($name,'lat','0')."\&quot;"." lon="."\&quot;".ReadingsVal($name,'lon','0')."\&quot;"."/>"}
die gewünschte xml-gerechte Ausgabe von
<trkpt lat="49.5755501" lon="-3.92156696"/>  ;D ;D ;D

Die Definition des attr ließ sich durch Zusammenfassen etwas verkürzen:
{"\&lt;trkpt lat=\&quot;".ReadingsVal($name,'lat','0')."\&quot; lon=\&quot;".ReadingsVal($name,'lon','0')."\&quot;/>"}

Danke für den Schubs in die richtige Richtung!
Schönen Sonntag

Gruß Eberhard
Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge; Raspi4: Node-red, MQTT, Gaszähler auslesen mit ESP32-CAM, BSB-LAN

FHEm2005

Zusatzfrage:

HTTPMOD hat kein Reading state. Mit viel Mühe habe ich das attr stateFormat gebastelt. Jetzt möchte ich es auch loggen können. Es gibt aber kein Reading.... ???? :o

Was tun? Ein extra erzeugtens Reading GPX zeigt noch nicht einmal ein Reading im modul HTTPMOD an.

reading14Expr { my $gpx=ReadingsVal('<device>','lon',''); return ($gpx);}
reading14Name GPX


Gruß Eberhard
Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge; Raspi4: Node-red, MQTT, Gaszähler auslesen mit ESP32-CAM, BSB-LAN

FHEm2005

#5
Das Problem habe ich mit einem userReadings gelöst.

attr userReadings GPX {
   my $lon=ReadingsVal($name,"lon","0");
   my $lat=ReadingsVal($name,"lat","0");
   my $gpx = "\&lt;trkpt lat=\&quot;".$lat."\&quot; lon=\&quot;".$lon."\&quot;/>";
   return ($gpx);
}


Das Reading GPX sieht durch die Sonderzeichen zwar etwas ungewöhnlich aus, taucht aber im Eventmonitor wie gewollt auf:

2018-01-07 12:30:04 HTTPMOD <device> GPX: <trkpt lat="49.2418213" lon="-4.79398298"/>

Danke nochmal an KernSani.

Gruß Eberhard

EDIT: Leider erscheinen in der Log-Datei zwar die richtigen Daten, aber die Anzeige ist nicht zu gebrauchen. Es werden die /&.. Zeichen angezeigt. Innerhalb des Readings GPX müssen diese besonderen Zeichen nicht benutzt werden. Statt des \&lt; reicht ein <, für das \&quot; reicht ein \".  Also lautet die Def für das userReadings GPX:

attr userReadings GPX {
my $lon=ReadingsVal($name,"lon","0");
my $lat=ReadingsVal($name,"lat","0");
my $utcd = ReadingsVal($name,"UTCDay","0");
my $utct = ReadingsVal($name,"UTCTime","0");
my $gpx = "<trkpt lat=\"".$lat."\" lon=\"".$lon."><time>".$utcd."T".$utct.":00Z"."</time></trkpt>";
return ($gpx);}


Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge; Raspi4: Node-red, MQTT, Gaszähler auslesen mit ESP32-CAM, BSB-LAN