Frage hinsichtlich Regex

OP #6474378
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
Gast #6474420
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
Moderator Persönliche Seite #6474447
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.
OP #6474448
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren