Hallo,
ich habe ein structure gemacht, welcher die Zustände meiner Lampen auswertet. Nun möchte ich gerne erreichen, dass es mir errechnet, wieviele Lampen innerhalb der structure auf ON sind.. Also das Ergebnis sollte eine Zahl sein. Geht das?
Lg c
hab da was gefunden..https://forum.fhem.de/index.php/topic,57091.msg485057.html#msg485057
finde aber die Integration von code in fhem.pl etwas heikel... was meint ihr?
Guck mal in die deutsche commandref von DOIF, dort gibt es einen Abschnitt aggregieren von Werten oder so ähnlich
Zitat von: choetzu am 21 November 2017, 23:04:20
hab da was gefunden..https://forum.fhem.de/index.php/topic,57091.msg485057.html#msg485057
finde aber die Integration von code in fhem.pl etwas heikel... was meint ihr?
Da wird nichts in fhem.pl integriert, sondern abgekupfert...
...der genannte Code steht vermutlich in myUtils oder direkt im Notify...
Gruß, Joachim
super, herzlichen Dank. Das hat mich zur Lösung geführt..
Innerhalb DOIF kann dies gelöst werden.. Siehe nebst Command REF auch https://forum.fhem.de/index.php/topic,70624.0.html
bei mir habe ich es wie folgt gemacht:
define Licht_AN_ANZAHL DOIF (leerschlag)
attr state [#""::$STATE eq "on" and $group eq "Licht"]
Somit werden alle "on" in der Gruppe "Licht" gezählt.. As simple as that..
Lg c
Na dann...
Bitte noch den Thread als gelöst kennzeichnen, umbenennen z.B. in "[gelöst] Structure: Anzahl selber Zustand zählen"
Gruß und viel Spaß, Joachim
Wenn du das Event einschränken könntest (statt "", z. B. alle Devices, die mit blabla anfangen oder mit blabla enden o. ä.), würde es weniger dein System belasten. So werden bei jedem! Event alle Systemdevices durchforstet.
Zitat von: Damian am 23 November 2017, 15:03:54
Wenn du das Event einschränken könntest (statt "", z. B. alle Devices, die mit blabla anfangen oder mit blabla enden o. ä.), würde es weniger dein System belasten. So werden bei jedem! Event alle Systemdevices durchforstet.
danke, was muss ich machen, wenn ich die devices nehmen will, die mit FSB61 enden? Bei devices die mit FSB61 anfangen würden, käme ja ein ^FSB61... und was wenns damit endet?
und kann man auch 2 verschiedene Endungen in einem machen? deshalb hab ich eine gruppe gebildet..
und wenn ich noch $TYPE ergänze, wäre das evtl schlanker?
also attr state [#""::$STATE eq "on" and $group eq "Licht" and $TYPE eq "EnOcean"]
Ich habe mehrere Lampen, welche unterschiedlich anfangen und auch unterschiedlich enden, deshalb wird es schwierig beim Device-Namen anzusetzen..
Zitat von: choetzu am 24 November 2017, 16:17:47
und wenn ich noch $TYPE ergänze, wäre das evtl schlanker?
also attr state [#""::$STATE eq "on" and $group eq "Licht" and $TYPE eq "EnOcean"]
Ich habe mehrere Lampen, welche unterschiedlich anfangen und auch unterschiedlich enden, deshalb wird es schwierig beim Device-Namen anzusetzen..
Nein.Das Problem ist, dass diese Anweisung ohne spezifischen Trigger auf alles in FHEM reagiert.
Du könntest zumindest auf on reagieren, dann hast du schon viele Events ausgeschlossen:
#":on"....
Wenn irgendeine Systematik bei der Namensgebung der Devices erkennbar wäre, kann man auch passende regex definieren.
ZitatDu könntest zumindest auf on reagieren, dann hast du schon viele Events ausgeschlossen:
#":on"....
Wenn irgendeine Systematik bei der Namensgebung der Devices erkennbar wäre, kann man auch passende regex definieren.
super, danke.. das hilft schon sehr. Meine Lampen haben 3 verschiedene verschiedene Teile im Namen. Entweder FUD61 (für Dimmer) oder NodOn (für Schalter) oder dann Poollicht (fürs Pool). Kann man das in einem regex bündeln?
Zitat von: choetzu am 24 November 2017, 19:50:38
super, danke.. das hilft schon sehr. Meine Lampen haben 3 verschiedene verschiedene Teile im Namen. Entweder FUD61 (für Dimmer) oder NodOn (für Schalter) oder dann Poollicht (fürs Pool). Kann man das in einem regex bündeln?
klar
[#"FUD61|NodOn|Poollicht:"...
du bist ne rakete!!! Das funktioniert perfekt.. herzlichen Dank.
darf ich noch was fragen? wie erkenne ich, ob ein DOIF oder sonst ein Modul viel ressourcen benutzt? Ich denke nicht nur anhand der anzahl ausgelöster events, oder??
lg c
https://fhem.de/commandref.html#apptime
Hallo
ich muss dieses Thema wieder aufnehmen, weil ich am rumbasteln bin. Ich habe nun folgenden DOIF
[#"_L_|_D_|Licht:"::$STATE eq "on" and $group eq "Dimmer"]
Nun möchte ich auch noch die $group "Licht" mit einbeziehen, also nicht nur "Dimmer". Mit "Licht|Dimmer" gehts nicht. Auch nicht mit "[Licht|Dimmer]".. und
[#"_L_|_D_|Licht:"::$STATE eq "on" and $group eq "Dimmer" or $group eq "Licht"]
spuckt mir logischerweise komplett falsche Werte aus.
Was wäre denn richtig?
Zitat von: choetzu am 14 Februar 2018, 22:07:43
Hallo
ich muss dieses Thema wieder aufnehmen, weil ich am rumbasteln bin. Ich habe nun folgenden DOIF
[#"_L_|_D_|Licht:"::$STATE eq "on" and $group eq "Dimmer"]
Nun möchte ich auch noch die $group "Licht" mit einbeziehen, also nicht nur "Dimmer". Mit "Licht|Dimmer" gehts nicht. Auch nicht mit "[Licht|Dimmer]".. und
[#"_L_|_D_|Licht:"::$STATE eq "on" and $group eq "Dimmer" or $group eq "Licht"]
spuckt mir logischerweise komplett falsche Werte aus.
Was wäre denn richtig?
Rangfolge der Operatoren (and/or) beachten:
[#"_L_|_D_|Licht:"::$STATE eq "on" and ($group eq "Dimmer" or $group eq "Licht")]
Zitat von: choetzu am 21 November 2017, 17:22:41
ich habe ein structure gemacht, welcher die Zustände meiner Lampen auswertet. Nun möchte ich gerne erreichen, dass es mir errechnet, wieviele Lampen innerhalb der structure auf ON sind.. Also das Ergebnis sollte eine Zahl sein. Geht das?
Klar. Sogar ganz ohne DOIF und kryptische Codierung...
- aktuellen Status der Struktur in ein reading sichern
- per regexp in dem reading das Vorkommen zählen
- mit dem Ergebnis irgendwas tun (z.B. zu einem anderen Ergebnis addieren)
Genau diese drei Schritte passieren in folgendem Beispiel.
Es wird gezählt, wieviele Geräte innerhalb der Struktur "st_wz_Licht" den Status "off" haben, der gefundene Zahlenwert wird ausgegeben.
sub count_struct {
fhem("set st_wz_Licht saveStructState status"); # Status der structure in das reading 'status' sichern
my @count = (ReadingsVal('st_wz_Licht','status','') =~ /off/g); # zählen, wie häufig 'off' im reading 'status' vorkommt
return @count; # Anzahl ausgeben
}
hallo zusammen, herzlichen Dank.
Damian, hat geklappt!! Super.
bettateilchen, wo muss ich das eingeben, damit es wirkt? Myutils?
Und dann generell, welche der beiden Lösungen ist die "schonendere" fürs System?
Zitat von: betateilchen am 14 Februar 2018, 23:22:03
Klar. Sogar ganz ohne DOIF und kryptische Codierung...
- aktuellen Status der Struktur in ein reading sichern
- per regexp in dem reading das Vorkommen zählen
- mit dem Ergebnis irgendwas tun (z.B. zu einem anderen Ergebnis addieren)
Genau diese drei Schritte passieren in folgendem Beispiel.
Es wird gezählt, wieviele Geräte innerhalb der Struktur "st_wz_Licht" den Status "off" haben, der gefundene Zahlenwert wird ausgegeben.
sub count_struct {
fhem("set st_wz_Licht saveStructState status"); # Status der structure in das reading 'status' sichern
my @count = (ReadingsVal('st_wz_Licht','status','') =~ /off/g); # zählen, wie häufig 'off' im reading 'status' vorkommt
return @count; # Anzahl ausgeben
}
wo platzier ich diese Zeilen? In MyUtils hat es nicht geklappt. Und mit
set Licht_Structure saveStructState status
werden nur die Stati angezeigt..
Weiss jemand Bescheid?
Mein Codeschnipsel sollte exemplarisch zeigen, wie man die Aufgabe in reinem (und klar verständlichem) perl umsetzt.
Perl-Code läßt sich sowohl in einem notify direkt (ich empfehle das aber nicht) oder in der 99_myUtils.pm unterbringen und aufrufen.
Zitat von: betateilchen am 16 Februar 2018, 20:55:55
Mein Codeschnipsel sollte exemplarisch zeigen, wie man die Aufgabe in reinem (und klar verständlichem) perl umsetzt.
Perl-Code läßt sich sowohl in einem notify direkt (ich empfehle das aber nicht) oder in der 99_myUtils.pm unterbringen und aufrufen.
ok, dann hab ich es doch richtig gemacht. es geht aber nicht:
hier das List vom Structure
Internals:
ATTR Licht
CHANGEDCNT 4
DEF Licht room=02_Licht
DEVSPECDEF 1
NAME Licht_Structure
NR 270
NTFY_ORDER 50-Licht_Structure
STATE on
TYPE structure
READINGS:
2018-02-16 22:05:43 LastDevice WZ_L_NodOn12
2018-02-16 22:05:43 LastDevice_Abs WZ_L_NodOn12
2018-02-16 22:05:43 state on
Attributes:
alias Licht
clientstate_behavior relativeKnown
clientstate_priority on off
devStateIcon on:ios_on_fill@blue off:ios_off_fill@gray set_off:ios_off_fill@red
group Structure
room 10_System
und hier meine 99_MyUtils. Ganz unten angehängt:
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.
package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_Initialize($$)
{
my ($hash) = @_;
}
sub modify($$$$){
my ($device,$value,$old,$new) = @_ ;
my @devices = devspec2array($device) ;
foreach $device (@devices){
if ($value eq "DEF"){
my $VALUE = InternalVal($device,$value,($value." error"));
$VALUE =~ s/$old/$new/g;
fhem("modify $device $VALUE");
}elsif ($value eq "NAME"){
my $VALUE = InternalVal($device,$value,($value." error"));
$VALUE =~ s/$old/$new/g;
fhem("rename $device $VALUE");
}else{
my $VALUE = AttrVal($device,$value,($value." error"));
$VALUE =~ s/$old/$new/g;
fhem("attr $device $value $VALUE");
}
}
}
sub count_struct {
fhem("set Licht_Structure saveStructState status"); # Status der structure in das reading 'status' sichern
my @count = (ReadingsVal('Licht_Structure','status','') =~ /on/g); # zählen, wie häufig 'off' im reading 'status' vorkommt
return @count; # Anzahl ausgeben
}
1;
wo liegt der Fehler?
im logfile steht
[Fri Feb 16 22:14:56 2018] fhem.pl: Subroutine modify redefined at ./FHEM/99_myUtils.pm line 19.
[Fri Feb 16 22:14:56 2018] fhem.pl: Subroutine count_struct redefined at ./FHEM/99_myUtils.pm line 39.
Die Meldungen sind keine Fehler, sondern schlichtweg völlig korrekte Logeinträge beim reload der 99_myUtils.pm.
Ok, danke. Aber wieso wird dann kein reading status erstellt?
Gesendet von iPhone mit Tapatalk
Zitat von: choetzu am 17 Februar 2018, 11:23:39
Ok, danke. Aber wieso wird dann kein status reading?
Bettateilchen, kannst du mir hier einen Tipp geben? Danke