Forum: PC-Programmierung Frage hinsichtlich Regex


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Fabian H. (hdr)


Bewertung
0 lesenswert
nicht lesenswert
Moin,
ich habe nun meine erste Dimmer von Shelly in meine Hausautomatisierung 
eingebunden. Nun geht es darum den Status vernünftig zu interpretieren. 
Meine Steuerung (selfmade) unterstützt bereits Regex-Ausdrücke. Ich 
könnte mir nun auch einen Shelly-Hack implementieren, jedoch möchte ich 
die Haussteuerung weiterhin generisch halten.
Für mich die schönste Lösung wäre, wenn ich es per Regex-Ausdruck lösen 
kann.

Daraus ergibt sich folgende Fragestellung:

Kann ich alleine durch einen Regex-Ausdruck folgende 
Übersetzungsfunktion realsieren?
Wenn ison = true, gebe brightness zurück
wenn ison = false, gebe 0 (oder false) zurück

Beispiel A (Dimmer an 100%):
Eingangsdaten:
{"ison":true,"has_timer":false,"timer_started":0,"timer_duration":0,"timer_remaining":0,"mode":"white","brightness":100}

Ergebnis:
100
Beispiel B (Dimmer aus 100%):
Eingangsdaten:
{"ison":false,"has_timer":false,"timer_started":0,"timer_duration":0,"timer_remaining":0,"mode":"white","brightness":100}

Ergebnis:
0
Beispiel C (Dimmer an 50%):
Eingangsdaten:
{"ison":false,"has_timer":false,"timer_started":0,"timer_duration":0,"timer_remaining":0,"mode":"white","brightness":100}

Ergebnis:
50

von Imonbln (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Fabian H. schrieb:
> Meine Steuerung (selfmade) unterstützt bereits Regex-Ausdrücke. Ich
> könnte mir nun auch einen Shelly-Hack implementieren, jedoch möchte ich
> die Haussteuerung weiterhin generisch halten.
> Für mich die schönste Lösung wäre, wenn ich es per Regex-Ausdruck lösen
> kann.

Du hast da so schönes JSON und das willst du nun mit gewalt

Du hast da so schönes JSON und das willst Du nun mit Gewalt in eine 
Regex Prügeln, warum nur, weil Du woanders eine regex parst? Ich würde 
Dir empfehlen Deine tolle selbst entwickelte Steuerung zu erweitern, wie 
wäre es, wenn Du eine Plugin Infrastruktur entwickelst, welche dann denn 
Status interpretiert, und wenn kein Plugin zuständig ist dann greift das 
Default verhalten. Dann brauchst Du kein Shelly-Hack, sondern hast dann 
der passenden Stelle ein Plugin für Shelly, das ist sauber und 
generisch.

Fabian H. schrieb:
> Beispiel C (Dimmer an 50%):Eingangsdaten:
> {"ison":false,"has_timer":false,"timer_started":0,"timer_duration":0,"ti 
mer_remaining":0,"mode":"white","brightness":100}
>
> Ergebnis:
> 50

Falsch, ison == False ergo Ergebnis: 0

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Fabian H. schrieb:
> Meine Steuerung (selfmade) unterstützt bereits Regex-Ausdrücke.

Welche RE-Syntax genau? PCRE?

von Fabian H. (hdr)


Bewertung
0 lesenswert
nicht lesenswert
Ich nutze .NET (also C#)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Fabian H. schrieb:
> Ich nutze .NET (also C#)

Ich habe aber keine Ahnung von .NET, da musst du schon mal selbst 
nachschauen, welche RE-Syntax sie implementieren.

von Fabian H. (hdr)


Bewertung
0 lesenswert
nicht lesenswert
Danke trotzdem.

Manchmal ist die Lösung einfacher, als gedacht. Es gibt zwar die 
Bedingungen, aber ich nutze jetzt einfach folgende Expression:
{"ison":true.*brightness":(\d*).*}

Wenn es aus ist, bekomme ich auch keine Group 1. Das ist für mich auch 
ok.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
In Perl würde es bspw. der folgende Zweizeiler tun:
$ perl -ne 's/.*["]ison["]:false.*/0/; s/.*["]brightness["]:(\d+).*/\1/; print;'
{"ison":true,"has_timer":false,"timer_started":0,"timer_duration":0,"timer_remaining":0,"mode":"white","brightness":100}
100
{"ison":false,"has_timer":false,"timer_started":0,"timer_duration":0,"timer_remaining":0,"mode":"white","brightness":100}
0

Zweizeiler, weil ich der Einfachheit halber für den Test zwei 
RE-Ersetzungen gleich in die Kommandozeile geschrieben habe. Die erste 
ersetzt "ison":false durch eine 0. Die zweite würde die Zahl nach 
"brightness" suchen und übrig lassen – die es natürlich nur gibt, wenn 
die erste nicht schon komplett alles durch 0 ersetzt hat.

Keine Ahnung, ob dir das jetzt weiter hilft …

Ich würde allerdings meinem Vorredner Recht geben: mit irgendeiner 
Bibliothek das JSON zu parsen, ist der vernünftigere Weg.

Edit: hat sich mit deiner Lösung überkreuzt.

: Bearbeitet durch Moderator
von Fabian H. (hdr)


Bewertung
0 lesenswert
nicht lesenswert
Imonbln schrieb:
> Du hast da so schönes JSON und das willst Du nun mit Gewalt in eine
> Regex Prügeln, warum nur, weil Du woanders eine regex parst? Ich würde
> Dir empfehlen Deine tolle selbst entwickelte Steuerung zu erweitern, wie
> wäre es, wenn Du eine Plugin Infrastruktur entwickelst, welche dann denn
> Status interpretiert, und wenn kein Plugin zuständig ist dann greift das
> Default verhalten. Dann brauchst Du kein Shelly-Hack, sondern hast dann
> der passenden Stelle ein Plugin für Shelly, das ist sauber und
> generisch.

Klingt sinnvoll! Danke!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.