Neue Features: Aggregationsfunktion, Filtern nach Zahl mit Nachkommastellen

Begonnen von Damian, 15 April 2017, 21:25:06

Vorheriges Thema - Nächstes Thema

OliS.

FHEM in Debian VM auf DS720+, HMLAN und HMUARTLGW, RFXTRX, Conbee II, Homebridge, Alexa
Geräte: Homematic, Tradfri, Shelly, IT, ESA2000, VU+, Denon-AVR, Sonos, Fritz!Box, Harmony Hub, IP-Cams, Roborock, Automower

Ellert

Es gibt ein paar Warnungen beim restart (v 0.6)

2017.04.19 09:49:36.890 1: PERL WARNING: Use of uninitialized value $type in string eq at ./FHEM/98_DOIF.pm line 355, <$fh> line 578.
2017.04.19 09:49:36.892 1: PERL WARNING: Use of uninitialized value $type in string eq at ./FHEM/98_DOIF.pm line 358, <$fh> line 578.
2017.04.19 09:49:36.893 1: PERL WARNING: Use of uninitialized value $type in string eq at ./FHEM/98_DOIF.pm line 360, <$fh> line 578.
2017.04.19 09:49:36.894 1: PERL WARNING: Use of uninitialized value $num in numeric eq (==) at ./FHEM/98_DOIF.pm line 378, <$fh> line 578.

Damian

Zitat von: Ellert am 19 April 2017, 10:04:07
Es gibt ein paar Warnungen beim restart (v 0.6)

2017.04.19 09:49:36.890 1: PERL WARNING: Use of uninitialized value $type in string eq at ./FHEM/98_DOIF.pm line 355, <$fh> line 578.
2017.04.19 09:49:36.892 1: PERL WARNING: Use of uninitialized value $type in string eq at ./FHEM/98_DOIF.pm line 358, <$fh> line 578.
2017.04.19 09:49:36.893 1: PERL WARNING: Use of uninitialized value $type in string eq at ./FHEM/98_DOIF.pm line 360, <$fh> line 578.
2017.04.19 09:49:36.894 1: PERL WARNING: Use of uninitialized value $num in numeric eq (==) at ./FHEM/98_DOIF.pm line 378, <$fh> line 578.


wird mit dem nächsten Update behoben
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

CoolTux

Zitat von: Damian am 19 April 2017, 00:33:44
Mit Version v0.6 ist das Problem des Anlegens von Readings mit Wert 0 behoben (mal zur Info: wer hätte es gedacht: alleine die Abfrage if (defined $defs{$name}{READINGS}{$reading}{VAL}) führt zum Anlegen des Readings!!!)

Dazu gab es mal mehrere Posts im Developer Forum. Ein

if( defined($hash->{a}{b}))

führt zum anlegen von $hash->{a} wenn es $hash->{a} noch nicht gab.

Ich versuche das mal zu finden.



Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Damian

Zitat von: CoolTux am 19 April 2017, 10:20:25
Dazu gab es mal mehrere Posts im Developer Forum. Ein

if( defined($hash->{a}{b}))

führt zum anlegen von $hash->{a} wenn es $hash->{a} noch nicht gab.

Ich versuche das mal zu finden.



Grüße


ganz schön blöd, selbst wenn man über defined abfragt (würde ich fast als bug ansehen) - ist wohl Perl geschuldet.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

CoolTux

Rudi hatte das auch mal erklärt. Finde es leider nicht mehr.

Aber Du kannst

if( defined($hash->{a}) and defined($hash->{a}{b}) )

machen glaube ich. Das war glaube Rudis Lösungsvorschlag.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Damian

Zitat von: CoolTux am 19 April 2017, 10:33:20
Rudi hatte das auch mal erklärt. Finde es leider nicht mehr.

Aber Du kannst

if( defined($hash->{a}) and defined($hash->{a}{b}) )

machen glaube ich. Das war glaube Rudis Lösungsvorschlag.

so mache ich es jetzt auch.

daher auch dieses:

sub
ReadingsVal($$$)
{
  my ($d,$n,$default) = @_;
  if(defined($defs{$d}) &&
     defined($defs{$d}{READINGS}) &&
     defined($defs{$d}{READINGS}{$n}) &&
     defined($defs{$d}{READINGS}{$n}{VAL})) {
     return $defs{$d}{READINGS}{$n}{VAL};
  }
  return $default;
}


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Damian

Zitat von: CoolTux am 19 April 2017, 10:38:10
Und was soll ich sagen, er kann es noch.

https://forum.fhem.de/index.php/topic,63709.msg614819.html#msg614819

Bitte schön


LG

ja, dann ist das in Perl halt so.

Ich programmiere schon seit fast 40 Jahren und kann keinen vergleichbaren Fall finden, wo ich durch eine Abfrage eine Struktur generiere, zumal es in Perl die Abfragemöglichkeit "defined" gibt, die es in vielen anderen Programmiersprache erst gar nicht gibt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

CoolTux

Perl halt  ;)

Aber so lange es eine "Lösung" gibt passt es schon. Auch wenn es umständlich ist. Aber wie oft fragt man schon so komplexe Hash's ab. Ok, ausser Du  ;D
Dann mal weiterhin viel Erfolg. Auf die nächsten 40 Jahre mein Lieber.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Damian

Zitat von: CoolTux am 19 April 2017, 11:10:08
Perl halt  ;)

Aber so lange es eine "Lösung" gibt passt es schon. Auch wenn es umständlich ist. Aber wie oft fragt man schon so komplexe Hash's ab. Ok, ausser Du  ;D
Dann mal weiterhin viel Erfolg. Auf die nächsten 40 Jahre mein Lieber.


Grüße

Was heißt hier komplexe Hashes. Such mal nach $defs hier im Forum, da wirst du schon einige Abfragen finden - und nicht nur im Developer-Forum ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Ich habe im ersten Post eine fehlerbereinigte eincheckfähige Version v0.7 mit Doku angehängt. Es ist ein neuer Punkt "Aggregieren von Werten" in der Commandref hinzugekommen. Auch das Filtern nach Zahl mit Nachkommastellen d<number> wurde in der Doku ergänzt.

Wenn in den nächsten Tagen keine weiteren Probleme gemeldet werden, werde ich sie einchecken.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Ich habe noch an paar Stellen die Doku angepasst (z. T. Tippfehler).

Folgende drei Beispiele habe ich als "Killer"-Anwendungen in der Doku aufgenommen:

Anwendungsbeispiele

Statusanzeige: Offene Fenster:

define di_window DOIF

attr di_window state Offene Fenster: [@"^window:opened":state:"opened","keine"]


Statusanzeige: Alle Devices, deren Batterie nicht ok ist:

define di_battery DOIF

attr di_battery state [@":battery":battery:$_ ne "ok"]


Statusanzeige: Durchschnittstemperatur aller Temperatursensoren in der Gruppe "rooms":

define di_average_temp DOIF

attr di_average_temp state [#average:d2:":temperature":temperature:$group eq "rooms"]


Vielleicht hat jemand noch ein Beispiel für eine effiziente Nutzung der Aggregationsfunktion, welches man noch in die Commandref aufnehmen sollte.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Zitat von: Damian am 22 April 2017, 16:07:08Vielleicht hat jemand noch ein Beispiel für eine effiziente Nutzung der Aggregationsfunktion, welches man noch in die Commandref aufnehmen sollte.
Ein Beispiel habe ich selbst nicht, aber ich könnte alle drei Funktionen nicht 1:1 übernehmen.
1. Habe ich Fenster und Türen sowie drei verschiedene Sensoren/Aktoren mit verschiedenen Status (zu: "closed" & "locked", offen: "open", "tilt" & 0-100%).

2. Akkus (%) und Batterien ("ok")

3. Hätte verschiedene Gerätennamen, wäre daher aus 1. abzuleiten. Das traue ich selbst mir als Nicht-Perle zu.

Damian

Zitat von: Per am 23 April 2017, 11:58:59
Ein Beispiel habe ich selbst nicht, aber ich könnte alle drei Funktionen nicht 1:1 übernehmen.
1. Habe ich Fenster und Türen sowie drei verschiedene Sensoren/Aktoren mit verschiedenen Status (zu: "closed" & "locked", offen: "open", "tilt" & 0-100%).

2. Akkus (%) und Batterien ("ok")

3. Hätte verschiedene Gerätennamen, wäre daher aus 1. abzuleiten. Das traue ich selbst mir als Nicht-Perle zu.

Was geht:

Zu 1. [@"":state:"closed|locked"]

Zu 2. [@"":state:$number == 100]

Zu 3. [@"Gerät1|Gerät2|Gerät3":...]  besser aber in einer Gruppe packen und dann [@"":state:$group eq "mygroup"] abfragen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF