Forum: PC-Programmierung Frage hinsichtlich Regex


von Fabian H. (hdr)


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?
1
Wenn ison = true, gebe brightness zurück
2
wenn ison = false, gebe 0 (oder false) zurück

Beispiel A (Dimmer an 100%):
1
Eingangsdaten:
2
{"ison":true,"has_timer":false,"timer_started":0,"timer_duration":0,"timer_remaining":0,"mode":"white","brightness":100}
3
4
Ergebnis:
5
100
Beispiel B (Dimmer aus 100%):
1
Eingangsdaten:
2
{"ison":false,"has_timer":false,"timer_started":0,"timer_duration":0,"timer_remaining":0,"mode":"white","brightness":100}
3
4
Ergebnis:
5
0
Beispiel C (Dimmer an 50%):
1
Eingangsdaten:
2
{"ison":false,"has_timer":false,"timer_started":0,"timer_duration":0,"timer_remaining":0,"mode":"white","brightness":100}
3
4
Ergebnis:
5
50

von Imonbln (Gast)


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


Lesenswert?

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

Welche RE-Syntax genau? PCRE?

von Fabian H. (hdr)


Lesenswert?

Ich nutze .NET (also C#)

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


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)


Lesenswert?

Danke trotzdem.

Manchmal ist die Lösung einfacher, als gedacht. Es gibt zwar die 
Bedingungen, aber ich nutze jetzt einfach folgende Expression:
1
{"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


Lesenswert?

In Perl würde es bspw. der folgende Zweizeiler tun:
1
$ perl -ne 's/.*["]ison["]:false.*/0/; s/.*["]brightness["]:(\d+).*/\1/; print;'
2
{"ison":true,"has_timer":false,"timer_started":0,"timer_duration":0,"timer_remaining":0,"mode":"white","brightness":100}
3
100
4
{"ison":false,"has_timer":false,"timer_started":0,"timer_duration":0,"timer_remaining":0,"mode":"white","brightness":100}
5
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)


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!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.