Frage zu Data-Part

Begonnen von stera, 22 Februar 2016, 18:56:38

Vorheriges Thema - Nächstes Thema

stera

Hallo,

ich möchte gerne das Zeitformat vom Sonnenaufgang anders darstellen bzw. die Sekunden aus der Darstellung entfernen

12:45:21 -> 12:45

<div data-type="label" data-device="Sonnenaufgang" data-get="state" class="cell"></div>

Data-part hatte ich nicht hinbekommen bzw. kann man sowas mit RegEx ändern oder muss ich eine neues Userreading anlegen? Steh da noch ein bisschen auf dem Schlauch

Gruß,
SteRa



setstate

#1
probier das mal

data-part="(\d\d\:\d\d):.*"

oder das:

data-substitution="toDate().hhmm()"

stera

Danke für die Antwort setstate!

Hatte das jetzt zwischenzeitlich mit einem Userreading lösen können:

time {substr(ReadingsVal("Sonnenaufgang","state","???"),0,5)}

data-part="(\d\d\:\d\d):.*"
funktioniert aber super ;o) Ich hatte genau das schon ausprobiert, hatte aber den : vor .* nicht eingesetzt :o(

data-substitution="toDate().hhmm()"
zeigt die aktuelle Zeit gekürzt an..

Vielen Dank

Gruß,
SteRa

choetzu

#3
Hallo

ich habe dazu auch eine Frage In meinem Sonos-Reading steht unter "infoSummarize3" der Wert

Lautstärke: 19 ~ Ton An ~ Balance: Mitte ~ Kein Kopfhörer

Ich möchte davon nur "Lautstärke: 19" übernehmen, also Part 1 und 2.

Wie kann ich data-part definieren, damit das funktioniert? data-part="1,2" geht schonmal nicht. Danke für die Hilfe.

Lg C
Raspi3, EnOcean, Zwave, Homematic

setstate

Da gibt es verschiedene Möglichkeiten:
- nimm zwei Label, eins für Part1, das andere für Part2
- Wenn vorne immer Laustärke steht, dann nimm nur Part2 und schreibe 'Lautstärke' fest ins HTML rein
- benutze RegEx für data-part  data-part="(.*:\s\d{1,3}) ~.*"

choetzu

Zitat von: setstate am 27 September 2016, 20:26:13
- benutze RegEx für data-part  data-part="(.*:\s\d{1,3}) ~.*"
genau das habe ich gesucht!! Du bist ein Teufelskerl ;) Herzlichen Dank.

Gerne würde ich verstehen, was genau in den Klammern steht. Wenn ich nach RegEX im Wiki schaue, finde ich zwar eine kurze Seite, die aber für einen Laien nicht wirklich verständlich ist. Hast du einen Hinweis, wo man in einfachen Worten Regex erklärt kriegt, damit man es selber anwenden kann?

Raspi3, EnOcean, Zwave, Homematic

setstate

Vereinfacht gesagt sind es sind Wildcards und Mengenangaben. Die Mengenangaben sind immer hinter dem Wildcard. Wenn die Mengenangabe fehlt, dann gilt das Wildcard nur genau einmal. Alles andere sind Festwerte.

die benutzen Wildcards sind
.     beliebiges Zeichen
\s   Leerzeichen
\d   Zahl

die benutzen Mengenangaben sind
*    null oder mehrfach
{1,3}  1 bis 3 mal

(.*:\s\d{1,3})

Bedeutet also:
(     gib mir die Gruppe von hier
.     beliebige Zeichen
*    n-mal
:     Doppelpunkt
\s    Leerzeichen
\d{1,3} ein, zwei oder dreistellige Zahlen
) die Gruppe bis hier her
der Rest danach muss auch passen, damit die Gruppe vorne genommen wird.


Ich teste immer hier: https://regex101.com/
Dort ist auch eine Quick Reference rechts unten.



choetzu

herzlichen Dank, das hilft sehr... Auch die Seite https://regex101.com/ ist ein tolles Tool. Somit scheint es auch logisch für mich Trottel ;)

Wo ich nun etwas am rumprobieren bin, ist, dass ich aus 9d22:34:15  den Wert 9:22:34 machen kann, sprich, aus D wird :

Mit (.*d\d{1,2}:\d{1,2}):.* wird zwar 9d:22:34 (also :15 weg), aber ich weiss nicht wie ich das D in ein : umwandle... Next level ;)
Raspi3, EnOcean, Zwave, Homematic

choetzu

Zitat von: choetzu am 28 September 2016, 08:32:26
ich weiss nicht wie ich das D in ein : umwandle..

hat mir jemand eine Hilfestellung. Auf den Regex-Seiten komme ich mit den komplexen Beschreibungen als Laie nicht wirklich klar. Ich möcht wirklich nur ein Zeichen ersetzen. Geht das nicht?
Raspi3, EnOcean, Zwave, Homematic

setstate

Das Problem ist, das data-substitution nur eine Gruppe ersetzt. Du willst aber "d" und das letzte ":15" entfernen willst.

Es geht nur das eine oder das andere

letzte ":15"
data-substitution="s/(:\d\d)$//g"

d durch : ersetzen
data-substitution="s/d/:/g"


choetzu

hallo setstate,

super, danke.

ich habe es nun so gelöst, dass ich das "d" mit data-subtitution (data-substitution="s/d/:/g") konvertiere und das letzte ":15" mit data-part ((.*d\d{1,2}:\d{1,2}):.*) wegkriege. ;)

Darf ich noch was fragen, ohne zu nerven? Wenn ich den Code in data-substitution mit dem Code in data-part vergleiche, dann fällt auf, dass es keine \ in data-substitution hat, sondern /. Ist das der einzige Unterschied? Sprich sind die Platzhalter wie s, d etc die gleichen wie bei data-part? Ich versuche die data-substitution zu verstehen, was mir noch nicht so gelingt. Bei data-part hast du mir super geholfen und ich konnte es mittlerweile schon öfters anders anwenden. Bei data-substitution fehlt mir auch im wiki die entsprechende ERklärung für einen Dummkopf und Laien wie mir ;)

Danke für die Hilfe...

Lg c
Raspi3, EnOcean, Zwave, Homematic

setstate

Das Format für data-substitution hat sich User nesges ausgedacht. Es entspricht einem gängigen Format für String Replacements (siehe gnu Tool sed)
Dabei ist der Teil zwischen erstem und zweiten / der RegEx Teil, nachdem gesucht wird. Zwischen zweitem und drittem / ist der Teil, mit dem dann ersetzt wird. "s/ss/ß/g" heißt: ersetze global alle ss mit einem ß.
Bei data-part wird nur der RegEx Teil angegeben.


choetzu

#12
super, das hilft weiter.. Jetzt verstehe ich das ganze. Konnte es schon erfolgreich auf andere Werte anwenden... Herrlich.

Kann man auch 2 Ersetzungen in deinem Data-substitution machen? Also z.B. aus dem Wert "17d19h" möchte ich "d" mit "days" und "h" mit "hours" ersetzen.

"s/d/ days /g" ersetzt das erste d und "s/h/ hours /g" sollte das zweite ersetzen. Und mit data-substitution='["s/d/ days, /g","s/h/ hours /g"]' komme ich nicht ans Ziel ;)
Raspi3, EnOcean, Zwave, Homematic

setstate

Fragen über Fragen  ;D

data-substitution="s/(.*)d(.*)h/$1 days $2 hours/g"

erste Klammer = erste Gruppe = $1
zweite Klammer = zweite Gruppe = $2

choetzu

Super! Danke.

Ich werd mich mal etwas zurück halten... bis morgen :)
Raspi3, EnOcean, Zwave, Homematic