Autor Thema: Wie schiesse ich mir am besten in den Fuß? (undef kann man nicht vergleichen)  (Gelesen 609 mal)

Offline RichardCZ

  • Tester
  • Sr. Member
  • ****
  • Beiträge: 558
  • HoBo: zwischen Weltherrschaft und Intensivstation
    • Experimenteller FHEM Fork
Zur Auflockerung: http://www.toodarkpark.org/computers/humor/shoot-self-in-foot.html
(Der Perl Eintrag hat's in sich  ;) )

https://forum.fhem.de/index.php/topic,93664.msg1042617.html#msg1042617
wollte mal nachsehen ob noch andere in die Falle getappt sind. Natürlich.

FHEM/88_Timer.pm:                && AttrVal( $FW_wname, "confirmDelete", undef ) == 0 )
FHEM/10_UNIRoll.pm:        && AttrVal( $name, "useRolloPos", undef ) == 1 );
FHEM/31_HUEDevice.pm:                || AttrVal( $name, "model", undef ) eq 'LLC020'
FHEM/10_EnOcean.pm:                if ( AttrVal( $name, "temperatureRefDev", undef ) eq $1 ) {
FHEM/10_EnOcean.pm:                if ( AttrVal( $name, "setpointRefDev", undef ) eq $1 ) {
FHEM/10_EnOcean.pm:                if ( AttrVal( $name, "setpointTempRefDev", undef ) eq $1 ) {
FHEM/10_EnOcean.pm:                if ( AttrVal( $name, "humidityRefDev", undef ) eq $1 ) {
FHEM/10_EnOcean.pm:                if ( AttrVal( $name, "observeRefDev", undef ) eq $1 ) {
FHEM/10_EnOcean.pm:                if ( AttrVal( $name, "demandRespRefDev", undef ) eq $1 ) {
FHEM/10_EnOcean.pm:                if ( AttrVal( $name, "temperatureRefDev", undef ) eq $1 ) {
FHEM/10_EnOcean.pm:                if ( AttrVal( $name, "setpointRefDev", undef ) eq $1 ) {
FHEM/10_EnOcean.pm:                if ( AttrVal( $name, "setpointTempRefDev", undef ) eq $1 ) {
FHEM/10_EnOcean.pm:                if ( AttrVal( $name, "humidityRefDev", undef ) eq $1 ) {
FHEM/10_EnOcean.pm:                if ( AttrVal( $name, "observeRefDev", undef ) eq $1 ) {
FHEM/10_EnOcean.pm:                if ( AttrVal( $name, "demandRespRefDev", undef ) eq $1 ) {
FHEM/98_vitoconnect.pm:                    || AttrVal( $name, 'vitoconnect_raw_readings', undef ) eq
FHEM/98_vitoconnect.pm:            if ( AttrVal( $name, 'vitoconnect_actions_active', undef ) eq "1" )
FHEM/98_TRAFFIC.pm:            && AttrVal( $name, "includeReturn", undef ) eq 1 )

Der Sinn des 3. Parameters in AttrVal ist es, einen vernünftigen Default zurückzuliefern. Macht davon bitte Gebrauch.
Falls "undef" vernünftig ist, dann darf man das aber nicht unbedarft auf einen Vergleichsoperator loslassen.

Gern geschehen.

Offline klaus.schauer

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1074
Und wie ist das werte Ergebnis, wenn man sich das im Gesamtkontext ansieht?
      if (defined AttrVal($name, "temperatureRefDev", undef)) {
        if (AttrVal($name, "temperatureRefDev", undef) eq $1) {
          CommandDeleteAttr(undef, "$name temperatureRefDev");
        }
      } elsif (defined AttrVal($name, "setpointRefDev", undef)) {
        if (AttrVal($name, "setpointRefDev", undef) eq $1) {
          CommandDeleteAttr(undef, "$name setpointRefDev");
        }
      } elsif (defined AttrVal($name, "setpointTempRefDev", undef)) {
        if (AttrVal($name, "setpointTempRefDev", undef) eq $1) {
          CommandDeleteAttr(undef, "$name setpointTempRefDev");
        }
      } elsif (defined AttrVal($name, "humidityRefDev", undef)) {
        if (AttrVal($name, "humidityRefDev", undef) eq $1) {
          CommandDeleteAttr(undef, "$name humidityRefDev");
        }
      } elsif (defined AttrVal($name, "observeRefDev", undef)) {
        if (AttrVal($name, "observeRefDev", undef) eq $1) {
          CommandDeleteAttr(undef, "$name observeRefDev");
        }
      } elsif (defined AttrVal($name, "demandRespRefDev", undef)) {
        if (AttrVal($name, "demandRespRefDev", undef) eq $1) {
          CommandDeleteAttr(undef, "$name demandRespRefDev");
        }

Offline RichardCZ

  • Tester
  • Sr. Member
  • ****
  • Beiträge: 558
  • HoBo: zwischen Weltherrschaft und Intensivstation
    • Experimenteller FHEM Fork
Und wie ist das werte Ergebnis, wenn man sich das im Gesamtkontext ansieht?

Kapitalintensiv.

Ich rufe also eine Funktion auf, der ich "undef" als gewünschten Rückgabe-Default mitgebe.
Dann teste ich, ob dieser "undef" Wert zurück kam.
Wenn nein, ... rufe ich die Funktion nochmal auf (gleiche Parameter) und vergleiche das Ergebnis mit einem Rx-match
Wenn das übereinstimmt - mache ich was.

Ja, ich habe mir einen Schutz vor der undef-Warnung hart erarbeitet.

Noch ein wenig mehr Kontext und man sieht:

elsif ( $devName eq "global" && $s =~ m/^RENAMED ([^ ]*) ([^ ]*)$/ ) {
Ergo $1 soll nie nimmer "Leerzeichen" sein. Also nehmen wir doch genau das als Default
und sparen uns den ganzen Regentanz:

elsif ( $devName eq "global" && $s =~ m/^RENAMED ([^ ]*) ([^ ]*)$/ ) {
    if ( AttrVal( $name, "temperatureRefDev", ' ' ) eq $1 ) {
        CommandAttr( undef, "$name temperatureRefDev $2" );
    }
    elsif ( AttrVal( $name, "setpointRefDev", ' ' ) eq $1 ) {
        CommandAttr( undef, "$name setpointRefDev $2" );
    }
    elsif ( AttrVal( $name, "setpointTempRefDev", ' ' ) eq $1 ) {
        CommandAttr( undef, "$name setpointTempRefDev $2" );
    }
    elsif ( AttrVal( $name, "humidityRefDev", ' ' ) eq $1 ) {
        CommandAttr( undef, "$name humidityRefDev $2" );
    }
    elsif ( AttrVal( $name, "observeRefDev", ' ' ) eq $1 ) {
        CommandAttr( undef, "$name observeRefDev $2" );
    }
    elsif ( AttrVal( $name, "demandRespRefDev", ' ' ) eq $1 ) {
        CommandAttr( undef, "$name demandRespRefDev $2" );
    }

Und so wäre EnOcean (in diesem Fall) auch nie prominent im grep gelandet.
Gefällt mir Gefällt mir x 1 Informativ Informativ x 1 Liste anzeigen

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 20272
wenn zu sehen ist das im grep nicht das ganze konstrukt geliefert wurde sollte man sich vor der bitte um beifall die mühe machen den kontext anzuschauen. sonst kann es passieren das man mit seinem hinweis unrecht hat weil man übersieht das der undef teil schon vorher abgehandelt wurde und alle füße noch unverletzt sind und bleiben.
FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH
Gefällt mir Gefällt mir x 2 Liste anzeigen

Offline RichardCZ

  • Tester
  • Sr. Member
  • ****
  • Beiträge: 558
  • HoBo: zwischen Weltherrschaft und Intensivstation
    • Experimenteller FHEM Fork
wenn zu sehen ist das im grep nicht das ganze konstrukt geliefert wurde sollte man sich vor der bitte um beifall die mühe machen den kontext anzuschauen. sonst kann es passieren das man mit seinem hinweis unrecht hat weil man übersieht das der undef teil schon vorher abgehandelt wurde und alle füße noch unverletzt sind und bleiben.

Jaja justme1968 - is' scho' recht.

Der ganze FHEM code ist generell unfehlbar. Wie konnte ich das nur vergessen?

Schon mal ein Baby in vollgeschissener Windel gesehen, was laut schreiend seine gegenwärtige Situation verteidigt? Nein? Nur damit Du in etwa eine Vorstellung davon bekommst was für ein Anblick sich mir gerade geboten hat.

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 20272
ich weiß ja nicht was du falsch gemacht hast, aber meine kinder haben sich nie gegen das windelwechseln gewehrt.
FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH

Offline Martin Fischer

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 1977
    • www.fischer-net.de/
Könnten sich alle Beteiligte bitte wieder auf die Inhalte konzentrieren und etwaige (hinkende und unnötige) Vergleiche aussen vor lassen?

DANKE!
--
Gründungsmitglied des FHEM e.V.

mehrere produktive FHEM Instanzen mit mehr als 300 aktiven Aktoren / Sensoren (1wire, FHT, FS20, HMS, Homematic, Z-Wave, IPCam, JeeLink, KS300, LaCrosse, RFXtrx,  SqueezeBox, etc.)
Zustimmung Zustimmung x 5 Liste anzeigen

 

decade-submarginal