Hauptmenü

Mal wieder regex

Begonnen von Shadow3561, 06 März 2024, 19:19:41

Vorheriges Thema - Nächstes Thema

Shadow3561

Moin,
passt vielleicht nicht ganz in die Anfänger-Rubrik, aber ich kann leider nicht in die Dev-Rubrik schreiben.

In einem meiner modifizierten Module passe ich das Device-state entsprechend den Readings an.

my $Temperature = ReadingsVal($hash->{NAME},"LaundryCare.Washer.Option.Temperature","");
$Temperature    =~ s/.*GC//;
$Temperature   =~ s/\s$//;
$state .= " $Temperature °C -" if (AttrVal($name, "type", "") eq "Washer");

Jetzt kann das ReadingsVal folgende Zustände haben. Wobei mich nur die Zahl oder das Auto interessiert.
Wirklich Klasse wäre noch wenn der Zustand Auto ist, dass das "°C" dann auch entfällt.

LaundryCare.Washer.EnumType.Temperature.GC40
LaundryCare.Washer.EnumType.Temperature.Auto

Wenn ersteres eintrifft passt alles im State. Wenn Auto im Reading vorkommt passt es leider nicht.
Nun habe ich folgende 3 Regex probiert

$Temperature    =~ s/(.*GC|Auto)//;
$Temperature    =~ s/(([0-9][0-9])|Auto)//;
$Temperature    =~ s/([0-9][0-9])|Auto//;

leider funktioniert es auch nicht.
Im Online-Regex-Tester funktionieren zumindest das 2. und 3. jedoch nicht im Modul.

Wer hilft mir auf die Sprünge?
Mit freundlichen Grüßen




Beta-User

...komische Readings...

Nimm' doch ReadingsNum() und gib als default "Auto" zurück?

Für Zahlenerkennung gäbe es noch looks_like_number(), hier würde ich aber wegen der Grad-Angabe nur "eq 'Auto'" prüfen.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Shadow3561

Meckert dann nicht Perl wenn ich ReadingsNum verwende und der Wert keine Zahlen enthält?
Ich bin leider die absolute Perl-Niete und verstehe auch nicht so ganz wie ich es in ein Modul packen soll.
Hier mal der gesamte Aufbau von meinem State, vielleicht ist dann klarer was ich möchte.

Für die komischen Readings kann ich leider nichts, die kommen so von der API

my $name   = $hash->{NAME};
my $state;
my $operationState = ReadingsVal($hash->{NAME},"BSH.Common.Status.OperationState","");
my $program = ReadingsVal($hash->{NAME},"BSH.Common.Root.ActiveProgram","");
 
  $program    =~ s/.*Program\.//;
$program   =~ s/\s$//;
if( $program eq "Auto2"){
  $program = "Auto 45-60";}
  elsif( $program eq "Favorit.001" ){
  $program = "Favorit";}
  elsif( $program eq "Eco50" ){
  $program = "Eco 50";}
  elsif( $program eq "Quick45" ){
  $program = "Speed 45";}
  elsif( $program eq "Intensiv70" ){
  $program = "Intensiv 70";}
  elsif( $program eq "PreRinse" ){
  $program = "Vorspülen";}
  elsif( $program eq "Quick60" ){
  $program = "Speed 60";}
  elsif( $program eq "MachineCare" ){
  $program = "Maschinenpflege";}
  elsif( $program eq "GlassShine" ){
  $program = "Brilliant Shine";}
  elsif( $program eq "Nightwasch" ){
  $program = "Leise";}
  elsif( $program eq "Mix.HHMix.HHMix" ){
  $program = "Schnell/Mix";}
  elsif( $program eq "EasyCare.HHSynthetics.HHSynthetics" ){
  $program = "Pflegeleicht";}
  elsif( $program eq "DelicatesSilk.DelicatesSilk.DelicatesSilk" ){
  $program = "Fein/Seide";}
  elsif( $program eq "Sensitive.Sensitive.Sensitiv" ){
  $program = "Hygiene Plus";}
  elsif( $program eq "RefreshWD.Refresh.Refresh" ){
  $program = "Iron Assist";}
  elsif( $program eq "FastWashDry.WD45.WD45" ){
  $program = "Extra Kurz 15/Wash & Dry 45";}
  elsif( $program eq "SportFitness.SportFitness.SportFitness" ){
  $program = "Sportswear";}
  elsif( $program eq "Rinse.Rinse.Rinse" ){
  $program = "Spülen";}
  elsif( $program eq "Spin.Spin.SpinDrain" ){
  $program = "Schleudern/Abpumpen";}
  elsif( $program eq "Wool.Wool.Wool" ){
  $program = "Wolle";}
  elsif( $program eq "Cotton.Cotton.Cotton" ){
  $program = "Baumwolle";}
  elsif( $program eq "LabelEU19.LabelEU19.Eco4060" ){
  $program = "Eco 40-60";}
  else {$program}

 
 
 
 
 
 
if( $program ne "" && defined($hash->{data}->{trans}->{$program})){
    $program   =  $hash->{data}->{trans}->{$program}
   
  }



if ($operationState eq "BSH.Common.EnumType.OperationState.Active" ||
$operationState eq "BSH.Common.EnumType.OperationState.Run") {

$state = $program;
my $Temperature = ReadingsVal($hash->{NAME},"LaundryCare.Washer.Option.Temperature","");
$Temperature    =~ s/(.*GC|Temperature.)//;
# $Temperature    =~ s/(.*GC|Program.)//;
# $Temperature    =~ s/(([0-9][0-9])|Auto)//;
# $Temperature    =~ s/([0-9][0-9])|Auto//;
# $Temperature    =~ s/[0-9][0-9]|Auto//;
$Temperature   =~ s/\s$//;
$state .= " $Temperature °C -" if (AttrVal($name, "type", "") eq "Washer");
my $rpm = ReadingsVal($hash->{NAME},"LaundryCare.Washer.Option.SpinSpeed","");
$rpm    =~ s/.*RPM//;
$rpm   =~ s/\s$//;
$state .= " $rpm U/min" if (AttrVal($name, "type", "") eq "Washer");
my $optSpeed = ReadingsVal($hash->{NAME},"Dishcare.Dishwasher.Option.VarioSpeedPlus","0");
$state .= " Speed+" if ($optSpeed eq "1");
my $optSilence = ReadingsVal($hash->{NAME},"Dishcare.Dishwasher.Option.SilenceOnDemand","0");
$state .= " Silence" if ($optSilence eq "1");
my $optIntensiv = ReadingsVal($hash->{NAME},"Dishcare.Dishwasher.Option.IntensivZone","0");
$state .= " Intensiv+" if ($optIntensiv eq "1");
my $optHyg = ReadingsVal($hash->{NAME},"Dishcare.Dishwasher.Option.HygienePlus","0");
$state .= " Hygiene+" if ($optHyg eq "1");
my $pct = ReadingsVal($hash->{NAME},"BSH.Common.Option.ProgramProgress",undef);
$state .= " (Fortschritt $pct)" if (AttrVal($name, "show_progress", 0) == 1);
my $tme = ReadingsVal($hash->{NAME},"remaining-time",undef);
$state .= " (fertig in $tme h)" if (AttrVal($name, "show_end_time", 0) == 1);
} elsif ($operationState eq "BSH.Common.EnumType.OperationState.DelayedStart") {
$state = "Delayed start of program $program";
} else {
$state = "Idle";
}

Prof. Dr. Peter Henning

Ich finde es ein wenig problematisch, wenn jemand Module modifiziert, sich selbst als "Perl-Niete" bezeichnet und dann noch Hilfe dabei sucht.

Außerdem lässt sich ein eigener State jederzeit auch ohne Eingriff ins Modul realisieren.

LG

pah

Beta-User

Zitat von: Prof. Dr. Peter Henning am 06 März 2024, 22:02:37Ich finde es ein wenig problematisch, wenn jemand Module modifiziert, sich selbst als "Perl-Niete" bezeichnet und dann noch Hilfe dabei sucht.
Na ja, man muss ja nicht antworten, und nicht jeder kann oder mag sich die Dinge mit einem Lehrbuch aneignen.

Zitat von: Prof. Dr. Peter Henning am 06 März 2024, 22:02:37Außerdem lässt sich ein eigener State jederzeit auch ohne Eingriff ins Modul realisieren.
Der Hinweis mag berechtigt sein, aber TIMTOWTDI...

Und vielleicht gibt es irgendwo auch eine "userfreundlichere" Variante des Moduls, das gleich "brauchbarere" Reading-Namen und -Inhalte erzeugt? Es scheint ja eine gewisse Logik hinter dem zu stehen, wie die Strings aufgebaut sind...

Zitat von: Shadow3561 am 06 März 2024, 20:01:07Meckert dann nicht Perl wenn ich ReadingsNum verwende und der Wert keine Zahlen enthält?
Mach doch einfach einen Test: Gibt was passendes ins Commando-Feld ein und du bekommst ein Ergebnis, eine Fehlermeldung und/oder einen Log-Eintrag...

Zwei Anmerkungen zum code an sich:
- Wenn schon $name als Variable da ist, kann man das auch benutzen
- solche "if - elsif"-Bandwürmer sind imo unglaublich schlecht zu lesen. Würde das in einen HASH packen, und dann sehen, ob es eine passende Zurudnung gibt oder nicht und entsprechend verzweigen (if (defined $bal{$blub}) { ).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Prof. Dr. Peter Henning

Zitat von: Beta-User am 06 März 2024, 23:29:36Und vielleicht gibt es irgendwo auch eine "userfreundlichere" Variante des Moduls, das gleich "brauchbarere" Reading-Namen und -Inhalte erzeugt? Es scheint ja eine gewisse Logik hinter dem zu stehen, wie die Strings aufgebaut sind...
Gibt es. Die allerdings wegen der Vielfalt der Hardware und der mangelhaften Dokumentation von Seiten BSH immer noch im Beta-Stadium ist.
https://forum.fhem.de/index.php?topic=129128.0

LG

pah

betateilchen

Zurück zum Thema und der gestellten Frage.

Warum quält man sich da überhaupt mit regex, wenn sich das Ganze mit split() und ggf. substr() doch recht einfach lösen ließe?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Shadow3561

Zitat von: Prof. Dr. Peter Henning am 06 März 2024, 22:02:37Ich finde es ein wenig problematisch, wenn jemand Module modifiziert, sich selbst als "Perl-Niete" bezeichnet und dann noch Hilfe dabei sucht.
Moin,
da bin ich leider nicht ganz bei dir und problematisch finde ich es schon mal überhaupt nicht.
Warum sollte ich mich nicht daran versuchen Module zu modifizieren (wobei es eher ein anpassen an meine Bedürfnisse ist). Nur weil ich mich selbst als Perl-Niete bezeichne darf ich keine Hilfe suchen?
Warum gibt es Ausbildungen/Studiengänge? Die meisten kommen doch als wenig/nichts-Wissende in eine Ausbildung oder Studium. Niemand kann etwas gleich von Anfang an (selbst um zu atmen benötigt man einen kleinen Klaps auf den Hintern). Deine Studenten sitzen doch nicht im Hörsaal weil sie nichts besseres zu tun haben, sie wollen etwas lernen und bitten um Hilfe. Irgendwann waren wir alle mal Nieten und musste klein anfangen.
Ich z.B. finde es problematisch wenn jemand in einem Forum auf eine Frage antwortet, aber gleichzeitig nicht zur Beantwortung der Frage beiträgt. Trotzdem freue ich mich über jeden Beitrag.

Ich habe deine "ergonomische Version" probiert und bin dankbar für deine Arbeit und Engagement in Sachen FHEM.
Leider funktioniert diese Version bei mir überhaupt nicht.
Ein "get settings" beim Geschirrspüler hat keinerlei Effekt. Es kommen keine readings, es werden keine Programme gelesen usw.
Ein "get settings" beim Waschtrockner ist es leider das selbe.
Einzig mein Kochfeld erzeugt 2 readings. Childlock und PowerState.

ZitatGibt es. Die allerdings wegen der Vielfalt der Hardware und der mangelhaften Dokumentation von Seiten BSH immer noch im Beta-Stadium ist.
In diesem Punkt gebe ich dir Recht. Und wegen der Vielfalt der Hardware versuch ich eben selbst mein Glück.
Meine Erziehung sagt mir "Wenn du etwas möchtest, kümmere dich selbst und verlasse dich nicht auf andere".

Zitat von: Beta-User am 06 März 2024, 23:29:36solche "if - elsif"-Bandwürmer sind imo unglaublich schlecht zu lesen. Würde das in einen HASH packen, und dann sehen, ob es eine passende Zurudnung gibt oder nicht und entsprechend verzweigen (if (defined $bal{$blub}) { ).

Das werde ich mal versuchen umzusetzen. Wobei ich mir nicht sicher bin wie genau. Habe mir mal andere Module durchgeschaut und steige leider nicht so ganz durch.

Zitat von: betateilchen am 07 März 2024, 16:27:55Warum quält man sich da überhaupt mit regex, wenn sich das Ganze mit split() und ggf. substr() doch recht einfach lösen ließe?

Danke, auch hier habe ich schon ein wenig probiert.
Mit split() bekomme es zwar hin alles nach dem letzten Punkt auszugeben aber eben nicht entweder die "Zahl" oder "Auto".
Mit substr() bekomme ich es hin die letzten 4 Zeichen auszugeben aber ich möchte ja die letzte 4 wenn "Auto" und die letzte 2 wenn "GC40"


Shadow3561

#8
Ich habe es jetzt so gelöst.

       my $Temperature = ReadingsVal($hash->{NAME},"LaundryCare.Washer.Option.Temperature","");
$Temperature    =~ s/(.*GC|LaundryCare.Washer.Option.Temperature.)//;
$Temperature   =~ s/\s$//;
if (looks_like_number($Temperature)) {
$state .= " $Temperature °C -" if (AttrVal($name, "type", "") eq "Washer");
} else {
$state .= " $Temperature -" if (AttrVal($name, "type", "") eq "Washer");
}

Laut Test-Compiler sollte es funktionieren. Das wird sich zeigen wenn das nächste mal die Waschmaschine/Trockner läuft.

Als Nächstes steht der if-else-Wurm auf der To-Do Liste
Danke für alle Antworten.
Mit freundlichen Grüßen
Daniel

Prof. Dr. Peter Henning

"Klein anfangen" ist das Stichwort. Man lernt Physik nicht, indem man mit der Allgemeinen Relativitätstheorie beginnt, und man lernt Perl nicht, indem man ohne Kenntnisse in einem FHEM-Modul herumprobiert.

Beides produziert schlechte Ergebnisse, wie man an dem Code unten sieht.

Tipp: Nicht im Modul herumspielen, sondern ein stateFormat mit Perl-Code definieren. Da kann man sich austoben, ohne etwas zu zerstören.

LG

pah

P.S.: Studenten sitzen nicht im Hörsaal und bitten um Hilfe

 


Shadow3561

Zitat von: Prof. Dr. Peter Henning am 08 März 2024, 04:26:16"Klein anfangen" ist das Stichwort. Man lernt Physik nicht, indem man mit der Allgemeinen Relativitätstheorie beginnt, und man lernt Perl nicht, indem man ohne Kenntnisse in einem FHEM-Modul herumprobiert.

Das ist wohl richtig.
Als Gegensatz dazu kann ich sagen, man lernt Fliesen legen nicht vom Bücher lesen. Wenn man das tut, bekommt man schlechte Ergebnisse.
Und so ganz ohne Kenntnisse bin ja nun auch wieder nicht.

Zitat von: Prof. Dr. Peter Henning am 08 März 2024, 04:26:16Beides produziert schlechte Ergebnisse, wie man an dem Code unten sieht.

Was sieht man schlechtes im Code? Es wäre sehr hilfreich wenn du mir das aufzeigen könntest.
Danke schon einmal im Voraus dafür


Zitat von: Prof. Dr. Peter Henning am 08 März 2024, 04:26:16Tipp: Nicht im Modul herumspielen, sondern ein stateFormat mit Perl-Code definieren. Da kann man sich austoben, ohne etwas zu zerstören.
Danke für den Tipp. Dies mache ich tatsächlich in allen meinen Devices. Allerdings bekomme ich dort auch keine seltsamen readings die ich erst mal mit userreadings zerpflücken muss um ein übersichtliches state zu produzieren.

Zerstört habe ich bis jetzt noch nichts. Da ich meine modifizierte Version nicht zur Verfügung anderer im Forum hinterlasse, denke ich, dass das modifizieren unproblematisch ist.

Zitat von: Prof. Dr. Peter Henning am 08 März 2024, 04:26:16P.S.: Studenten sitzen nicht im Hörsaal und bitten um Hilfe
Natürlich bitten sie dich nicht verbal um Hilfe, wenn sie aber keine Hilfe bräuchten wären sie nicht da.


Prof. Dr. Peter Henning

ZitatWas sieht man schlechtes im Code? Es wäre sehr hilfreich wenn du mir das aufzeigen könntest.
Danke schon einmal im Voraus dafür
Sorry, aber da ich diese Art der Bastelarbeit an Modulen nicht unterstütze, werde ich das nicht korrigieren. Vielleicht hat jemand anders die Zeit dafür. Im Übrigen verweise ich auf meine in Arbeit befindliche Version von 48_HomeConnect.pm, da werden alle diese Präfixe entfernt.
ZitatAllerdings bekomme ich dort auch keine seltsamen readings die ich erst mal mit userreadings zerpflücken muss
Das ist Käse. In den Code für stateFormat kann man beliebig viel Zeug packen, ohne den Umweg über userReadings gehen zu müssen. Und im Zweifelsfall kann man beliebig große und komplizierte eigene Perl-Funktionen in seine 99_myUtils.pm packen und dort aufrufen.
ZitatNatürlich bitten sie dich nicht verbal um Hilfe, wenn sie aber keine Hilfe bräuchten wären sie nicht da.
Seltsame Vorstellung, eine Vorlesung ist keine Gruppentherapie.

LG

pah