(Gelöst) Regexp in if und userReading

Begonnen von Puschel74, 08 März 2014, 20:06:32

Vorheriges Thema - Nächstes Thema

Puschel74

Hallo zusammen,

ich habe FHTTK-Sensoren im Einsatz.

Diese liefern als Reading brav Window: Open und Window: Closed

Achtung an alle Programmierer hier - Augen zu und weg schauen  ;D

Wenn das Reading Window Open enthält lasse ich mir Geräte auch auf der Übersichtsseite anzeigen.
Wenn das Reading Window Closed enthält sollen die Geräte nur auf der "Etagenseite" angezeigt werden.

Gelöst habe ich das mit folgendem Codeschnippsel (der einigen von Euch sicher das Wasser in die Augen treiben dürfte):
define Fenster_anzeige notify (.*Fenster.*|.*[Tt]uer):Window.* {
  if($EVENT eq "Window: Open"){
    if(($NAME eq "EG_Eingangstuer")||($NAME eq "EG_Kueche_Fenster")||($NAME eq "EG_WC_Fenster")||($NAME eq "EG_WC_Tuer")||($NAME eq "EG_Terrassentuer")||($NAME eq "EG_Terrassenfenster")||($NAME eq "EG_Zwischentuer")){
      fhem("attr $NAME room 20_Erdgeschoss,00_Bedienung");
  fhem("set $NAME"."_Led led red") if(($NAME ne "EG_WC_Tuer") || ($NAME ne "EG_Zwischentuer"));
    }
if(($NAME eq "OG_Badezimmer_Fenster")||($NAME eq "OG_Badezimmer_Tuer")||($NAME eq "OG_Schlafzimmer_Fenster")||($NAME eq "OG_Schlafzimmer_Tuer")||($NAME eq "OG_Zimmer_Fenster")||($NAME eq "OG_Zimmer_Tuer")){
  fhem("attr $NAME room 30_Obergeschoss,00_Bedienung");
  fhem("set $NAME"."_Led led red") if(($NAME ne "OG_Badezimmer_Tuer") || ($NAME ne "OG_Schlafzimmer_Tuer")||($NAME eq "OG_Zimmer_Tuer"));
}
if(($NAME eq "DG_Bad_Fenster")||($NAME eq "DG_Lern_Fenster")||($NAME eq "DG_Zimmer_Fenster_links")||($NAME eq "DG_Zimmer_Fenster_rechts")){
  fhem("attr $NAME room 40_Dachgeschoss,00_Bedienung");
  fhem("set $NAME"."_Led led red");
}
if(($NAME eq "Keller_Heizraum_Tuer")||($NAME eq "Keller_Gaestezimmer_Tuer")) {
  fhem("attr $NAME room 10_Keller,00_Bedienung");
    }
  }
  else {
    if(($NAME eq "EG_Eingangstuer")||($NAME eq "EG_Kueche_Fenster")||($NAME eq "EG_WC_Fenster")||($NAME eq "EG_WC_Tuer")||($NAME eq "EG_Wohnzimmertuer")||($NAME eq "EG_Terrassentuer")||($NAME eq "EG_Terrassenfenster")($NAME eq "EG_Zwischentuer")){
      fhem("attr $NAME room 20_Erdgeschoss");
  fhem("attr $NAME"."_Led room 20_Erdgeschoss") if(($NAME ne "EG_WC_Tuer") || ($NAME ne "EG_Zwischentuer"));
  fhem("set $NAME"."_Led led green") if(($NAME ne "EG_WC_Tuer") || ($NAME ne "EG_Zwischentuer"));
    }
if(($NAME eq "OG_Badezimmer_Fenster")||($NAME eq "OG_Badezimmer_Tuer")||($NAME eq "OG_Schlafzimmer_Fenster")||($NAME eq "OG_Schlafzimmer_Tuer")||($NAME eq "OG_Zimmer_Tuer")||($NAME eq "OG_Zimmer_Fenster")){
  fhem("attr $NAME room 30_Obergeschoss");
  fhem("attr $NAME"."_Led room 30_Obergeschoss") if(($NAME ne "OG_Badezimmer_Tuer") || ($NAME ne "OG_Schlafzimmer_Tuer")||($NAME eq "OG_Zimmer_Tuer"));
  fhem("set $NAME"."_Led led green") if(($NAME ne "OG_Badezimmer_Tuer") || ($NAME ne "OG_Schlafzimmer_Tuer")||($NAME eq "OG_Zimmer_Tuer"));
}
if(($NAME eq "DG_Bad_Fenster")||($NAME eq "DG_Lern_Fenster")||($NAME eq "DG_Zimmer_Fenster_links")||($NAME eq "DG_Zimmer_Fenster_rechts")){
  fhem("attr $NAME room 40_Dachgeschoss");
  fhem("attr $NAME"."_Led room 40_Dachgeschoss");
  fhem("set $NAME"."_Led led green");
}
if(($NAME eq "Keller_Heizraum_Tuer")||($NAME eq "Keller_Gaestezimmer_Tuer")) {
  fhem("attr $NAME room 10_Keller");
    }
  fhem("attr $NAME"."_Led group Anzeige");
  }
}


Nun habe ich einen HM-SEC-RHS verbaut der leider das Reading Window nicht hat.
Ein Teil meiner Frage der aber nicht vorrangig ist - UserReading muss ich mir erst noch anschauen.

Ich hab aber heute auch ein HM-OU-LED16 bekommen auf dem ich gerne die Stati der Aussentüren und -fenster anzeigen möchte.
Nun sieht mein Code dafür so aus:

hier ist auch das zukünftige userReading Tilted des RHS schon berücksichtigt - darum geht es aber nicht.

Ich denke mal ich muss das wohl oder übel einzeln behandeln da ich die Stati auf das LED16-Device schreiben möchte.

Sehe ich das richtig oder lässt sich mein "Pseudo-Code" doch noch vereinfachen?

Grüße

Edith: Ha, grad gesehen das die LED16 unter <Unsorted> als eigenständiges Device auftauchen.
Richtig benamt sollte das auch einfacher klappen.
Edith2: Die 16 Kanäle sind ja eigenständige Device in FHEM  ::)
Passende Namen vergeben und das ganze klappt mit dem vorhandenen "alten" Code einwandfrei.
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

marvin78

Zu allererst kannst du viele Klammer sparen:

if(($NAME eq "Keller_Heizraum_Tuer")||($NAME eq "Keller_Gaestezimmer_Tuer"))

wird z.B. zu

if($NAME eq "Keller_Heizraum_Tuer" || $NAME eq "Keller_Gaestezimmer_Tuer")

Puschel74

Hallo,

danke schonmal für diene Hilfe.

Wenn ich das richtig sehe sind das sind im ersten Code-Posting (um das es so ja nicht mehr geht) pro Abfragezeile eine ( und eine )
die ich einspare.

Im zweiten Code-Posting ist das ja (notgedrungen) schon eliminiert da ich ja jede(s) Tür/Fenster einzeln prüfe.
Ich denke das ist viel zu umständlich und aufwendig.
Ok, es funktioniert.
Das LED16 schaltet die einzelnen Kanäle brav von rot auf grün und zurück (nach Tür/Fenster auf oder zu).

Aber kann ich das nicht auch einfacher unterbringen?

Genial wäre ja ein Attribut im jeweiligen Device das den zugehörigen Kanal schaltet - Beitrag für Wunschliste  8)

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

marvin78

Eine Möglichkeit wäre, den Code in eine myUtils auszulagern und dann mit einen assoziativen Array (Hash) zu arbeiten. Du ordnest dann im Hash die Fensternamen den LEDs zu (nur die Nummern) und kannst dann den Code massiv verkürzen.

Puschel74

Hallo,

Bingo - stimmt.
Da war noch was.

Dank Perl ist sowas ja möglich - gleich mal mein Perlbuch rauskramen muss.

Danke dir für den Tipp.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

justme1968

mal so ein paar ideen...

- ein ganzes Stockwerk kannst du jeweils so prüfen:if( $NAME =~  m/^EG/ ). kein grund das für jeden raum einzeln zu machen.

- für die HM-OU-LED16 kannst du z.b. für jede led einen alias vergeben der mit dem namen des fensters in beziehung steht und dann mit fhem( "set alias=$NAME"."LED" );oder so ähnlich schalten.

- für das bedingte anzeigen von devices in einer übersicht abhängig von bestimmten readings schau dir mal readingsGroup an. das geht z.b. sogar mit auf klick umschaltbar zwichen alle fenster, nur die offenen, nur die geschlossenen.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Puschel74

Hallo,

autsch.
Ok, mein "Brech-Code"stammt noch aus der Zeit als es noch keine Readingsgroup gab oder ich noch nicht davon wusste.
Ich muss mir das mal in Ruhe anschauen.

Die Prüfung auf jeden Raum einzeln mache ich ja nur erst seit heute da das LED16 dazu gekommen ist und ich mir anders nicht zu helfen wusste - also nicht an readingsgroup dachte  ;)

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.