Structure: Anzahl selber Zustand zählen

Begonnen von choetzu, 21 November 2017, 17:22:41

Vorheriges Thema - Nächstes Thema

Damian

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")]
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

betateilchen

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
}

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

choetzu

#17
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?
Raspi3, EnOcean, Zwave, Homematic

choetzu

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?
Raspi3, EnOcean, Zwave, Homematic

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

choetzu

#20
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.
Raspi3, EnOcean, Zwave, Homematic

betateilchen

Die Meldungen sind keine Fehler, sondern schlichtweg völlig korrekte Logeinträge beim reload der 99_myUtils.pm.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

choetzu

Ok, danke. Aber wieso wird dann kein reading status erstellt?


Gesendet von iPhone mit Tapatalk
Raspi3, EnOcean, Zwave, Homematic

choetzu

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
Raspi3, EnOcean, Zwave, Homematic