Notify/Regex - Event ohne Inhalt ignorieren?!

Begonnen von hmtec99, 30 Dezember 2016, 11:45:49

Vorheriges Thema - Nächstes Thema

hmtec99

Hallo Leute,

kann mir jemand auf die Sprünge helfen?

Wie prüfe ich denn per Regex auf Inhalt eines Readings? D.h. wenn das Reading zwar grundsätzlich das
Richtige ist, aber keinen Inhalt hat (also leer ist) soll das zugehörige Notify nichts tun.

Konkretes Beispiel:

TD_BD:rectext:.* {
if (ReadingsVal("TD_BD", "rectext", "") =~ ".*szene_ruhe.*")
{fhem ('set SBR_Bathroom off; set BD_HV setMode night; set BD_RF Auf');}
elsif (ReadingsVal("TD_BD", "rectext", "") =~ ".*szene_dusche.*")
{fhem ('set SBR_Bathroom on; set BD_HV setMode day');}
elsif (ReadingsVal("TD_BD", "rectext", "") =~ ".*szene_badespass.*")
{fhem ('set SBR_Bathroom on; set BD_HV setMode day; set BD_RF Zu');}
elsif (ReadingsVal("TD_BD", "rectext", "") =~ ".*bd_rolladen_auf.*")
{fhem ('set BD_RF Auf');}
elsif (ReadingsVal("TD_BD", "rectext", "") =~ ".*bd_rolladen_50.*")
{fhem ('set BD_RF 50');}
elsif (ReadingsVal("TD_BD", "rectext", "") =~ ".*bd_rolladen_25.*")
{fhem ('set BD_RF 25');}
elsif (ReadingsVal("TD_BD", "rectext", "") =~ ".*bd_rolladen_zu.*")
{fhem ('set BD_RF Zu');}
elsif (ReadingsVal("TD_BD", "rectext", "") =~ ".*bd_heizung_24.*")
{fhem ('set BD_HV setTemp 24');}
elsif (ReadingsVal("TD_BD", "rectext", "") =~ ".*bd_heizung_21.*")
{fhem ('set BD_HV setTemp 21');}
elsif (ReadingsVal("TD_BD", "rectext", "") =~ ".*bd_heizung_17.*")
{fhem ('set BD_HV setTemp 17');}
elsif (ReadingsVal("TD_BD", "rectext", "") =~ ".*bd_heizung_5.*")
{fhem ('set BD_HV setTemp 5');}
elsif (ReadingsVal("TD_BD", "rectext", "") =~ ".*bd_radio_an.*")
{fhem ('set SBR_Bathroom on');}
elsif (ReadingsVal("TD_BD", "rectext", "") =~ ".*bd_radio_aus.*")
{fhem ('set SBR_Bathroom off');}
}

Beispielevent A (Hier soll das Notify nicht reagieren):

2016-12-29 23:03:50.070 Nextion TD_BD received: Hfe H65(e) H00 H03 H01
2016-12-29 23:03:50.070 Nextion TD_BD rectext:

Beispielevent B: (Hier soll das Notify loslegen):

2016-12-29 23:03:50.749 Nextion TD_BD received: H24($) H61(a) H31(1) H3d(=) H73(s) H7a(z) usw.
2016-12-29 23:03:50.749 Nextion TD_BD rectext: $a1=szene_ruheq

Und noch ne Frage zum Code des Notifys:

Ist das If/Elseif-Gerüst so OK oder dämlich weil ineffizient? Gibt es bessere Lösungen?

Gruß, Oli

RadioJames

#1
Hallo,

es gibt eine ganze Reihe von Ansätzen.
Hier ist einer:
Um es zunächst mal übersichtlicher zu gestalten, könntest du zu Beginn (ReadingsVal("TD_BD", "rectext", "") einer Variablen zuweisen und diese dann "matchen".
Für eine Stringabfrage brauchst du nicht zwangsweise einen regulären Ausdruck. Probier's mal mit dem Perl String Vergleich, hier auf Ungleichheit zu einem Leerstring: if (my_rec_text ne "") { ... }
Du könntest auch den Default Teil im ReadingsVal ändern, z.B. statt des Leerstrings ein "ERROR" und fragst dann darauf ab. Das wäre logischer als ein Leerstring.

Zum Abschluss noch eine Sache. Willst du dir das wirklich antun und alles in die fhem.cfg stopfen?
Ich würde im notify lediglich eine Perl Funktion aufrufen und diese dann in einem 99_MyWasWeissIchUtil.pm Modul unterbringen, ordentlich formatiert und dokumentiert.

Grüße
James.
There are 10 kind of people. Those who understand binary and those who don't.