auf event reagieren ohne devicename zu kennen

Begonnen von chris1284, 20 Juli 2014, 19:53:29

Vorheriges Thema - Nächstes Thema

chris1284

hi,

steh etwas auf dem schlauch. ich möchte gerne auf alle dewpoint events reagieren. leider möchte notify kein regexp das mit * beginnt.
gibt es noch eine andere möglichkeit oder muss ich wirklich für jedes device das dewpoint besitzt ein notify bauen?

hintergrund: ich habe ein dewpoint outdoor und ein dewpoint pro raum. jede änderung soll analysiert und in ein dummy als userreading.
so hat der dummy readings:
dew_outdoor
dew_küche
dew_wz usw usw

nun muss ich natürlich um die userreadings zu setzen auf die änderung der quellen reagieren und da wäre 1 notify besser als eines für jeden sensor / raum.
klar könnte ich in jeden raum ein dummy setzen und das notify auf des namen zb dew.* setzen oder die sensoren mit zb sen.* kennzeichnen aber das ist mehraufwand und würde die aktuelle benamung zerlegen.

gruß
christia

justme1968

eine regex mit einem * am an fang ist keine gültige regex. du brauchst zumindest irgendeinen buchstaben den du mit dem * wiederholst.

so sollte es gehen:.*:dewpoint.*

aber warum kopierst du die readings überhaupt in einen dummy?

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

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

chris1284

ist wie ich finde einfacher bei änderung der dummy readings jedesmal den schlechtesten wert der räume zu errechnen und dann mit dem outddor zu vergleichen ob gelüftet werden kann oder nicht.
ich bin für einfacherer lösungen immer offen

justme1968

#3
du kannst du im notify einfach alle werte vergleichen und nur das ergebniss irgendwo speichern.

{ my $test = fhem( "list .* dewpoint" );
  my $result = -999;
  map { $_ =~ m/([\d\.]*)$/; $result=($1>$result?$1:$result) } split("\n",$test);
  fhem( "setreading maxDummy $result" );}


oder alles direkt in einer einzigen schleife über alle devices.

auf den ersten blick schaut es zwar aufwändiger aus über alle devices zu laufen du sparst aber die dummys und vor allem die events die erzeugt werden wenn du die dummys zum zwischenspeichern schreibst.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

chris1284

#4
danke für den tip, funktioniert.

aber kannst du das näher erläutern?

{ my $test = fhem( "list .* dewpoint" );
- list mit dewpoint-readings holen
- ergebnis zb
ZitatASH2200              2014-07-21 21:03:52 20.3
KS300                2014-07-21 21:26:26 15.4
WetterHan            2014-07-20 18:51:53 16.1

  map { $_ =~ m/([\d\.]*)$/; $result=($1>$result?$1:$result) } split("\n",$test);

pro zeile [split("\n",$test);] aus dem list wird mit [ $_ =~ m/([\d\.]*)$/] die zahl gefiltert (dezimal mit . und allem dahinter *).


$result=($1>$result?$1:$result) die sortierung versteh ich noch nicht ganz

justme1968

du hast doch fast alles raus bekommen :).

Zitat$result=($1>$result?$1:$result)
die sortierung versteh ich noch nicht ganz
damit wird einfach nur das maximum bestimmt. $result wird auf -999 initialisiert und dann für jedes element geschaut ob es größer als der aktuelle wert von $result ist. wenn ja wird $result auf den aktuellen wert gesetzt sonst wird $result beibehalten.

wie gesagt habe ich nicht probiert ob es viel effizienter ist statt dieser version die ohne fhem internas über die internes zu gehen. das wäre dann etwas in der art:{ my $result = -999;
  foreach my $d (sort keys %defs) {
    next if (!defined($defs{$d}) );
    $dewpoint=ReadingsVal($d,"dewpoint",undef);
    next if( !defined($dewpoint) );
    $result=($dewpoint>$result?$dewpoint:$result)
  }
  fhem( "setreading maxDummy $result" ); }


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

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