[gelöst] offene Fenster zählen und auflisten

Begonnen von Christian80, 13 November 2020, 16:12:07

Vorheriges Thema - Nächstes Thema

teichtaucher

Ich sehe keine Reading mit "e_". So sieht mein Doif aktuell aus:

Internals:
   CFGFN     
   DEF        (["\.fk\.:open"])
{my $str = "http://192.168.178.46/control?cmd=epd,txl,1,Fenster,2,offen:";; my $idx=2;; foreach (AggrDoIf('@','^*.fk.*','state','"open"')) {$idx++;;$str=$str.",".$idx.',%22'.uri_escape(AttrVal($_,"alias",$_)).'%22'}system("wget -q $str &");;Log(3, $str)}
DOELSEIF (["\.fk\.:closed"] and [#"\.fk\.:open"]>0)
{my $str = "http://192.168.178.46/control?cmd=epd,txl,1,Fenster,2,offen:";; my $idx=2;; foreach (AggrDoIf('@','^*.fk.*','state','"open"')) {$idx++;;$str=$str.",".$idx.',%22'.uri_escape(AttrVal($_,"alias",$_)).'%22'}system("wget -q $str &");;Log(3, $str)}
DOELSEIF (["\.fk\.:closed"] and [#"\.fk\.:open"]==0)
{system("wget -q http://192.168.178.46/control?cmd=epd,clear &")}
DOELSE
{system("wget -q http://192.168.178.46/control?cmd=epd,clear &")}
   FUUID      6643580f-f33f-2bd4-9ee6-e91d434b283f2a60
   MODEL      FHEM
   NAME       gl.fd.FensterDisplay
   NOTIFYDEV  .*(\.fk\.).*,global
   NR         6836
   NTFY_ORDER 50-di_Fenster
   STATE      cmd_1
   TYPE       DOIF
   VERSION    28546 2024-02-23 20:11:05
   eventCount 282
   READINGS:
     2024-05-17 13:36:46   Device          ki.fk.FensterRechts
     2024-05-17 13:37:14   cmd             1
     2024-05-17 13:37:14   cmd_event       ki.fk.FensterRechts
     2024-05-17 13:37:14   cmd_nr          1
     2024-05-17 13:36:36   mode            enabled
     2024-05-17 13:37:14   state           cmd_1
     2024-05-17 13:37:14   wait_timer      no timer
   Regex:
     accu:
     bar:
     barAvg:
     collect:
     cond:
       :
         0:
           "\.fk\.:open" \.fk\.:open
         1:
           "\.fk\.:closed" \.fk\.:closed
           "\.fk\.:open" \.fk\.:open
         2:
           "\.fk\.:closed" \.fk\.:closed
           "\.fk\.:open" \.fk\.:open
   attr:
     cmdState:
     wait:
       0:
         30
       1:
         30
       2:
         30
       3:
         0
     waitdel:
   condition:
     0          ::EventDoIf('\.fk\.',$hash,'open',0)
     1          ::EventDoIf('\.fk\.',$hash,'closed',0) and ::AggregateDoIf($hash,'#','\.fk\.')>0
     2          ::EventDoIf('\.fk\.',$hash,'closed',0) and ::AggregateDoIf($hash,'#','\.fk\.')==0
   do:
     0:
       0          {my $str = "http://192.168.178.46/control?cmd=epd,txl,1,Fenster,2,offen:";; my $idx=2;; foreach (AggrDoIf('@','^*.fk.*','state','"open"')) {$idx++;;$str=$str.",".$idx.',%22'.uri_escape(AttrVal($_,"alias",$_)).'%22'}system("wget -q $str &");;Log(3, $str)}
     1:
       0          {my $str = "http://192.168.178.46/control?cmd=epd,txl,1,Fenster,2,offen:";; my $idx=2;; foreach (AggrDoIf('@','^*.fk.*','state','"open"')) {$idx++;;$str=$str.",".$idx.',%22'.uri_escape(AttrVal($_,"alias",$_)).'%22'}system("wget -q $str &");;Log(3, $str)}
     2:
       0          {system("wget -q http://192.168.178.46/control?cmd=epd,clear &")}
     3:
       0          {system("wget -q http://192.168.178.46/control?cmd=epd,clear &")}
   helper:
     NOTIFYDEV  .*(\.fk\.).*,global
     event      contact: open (to VCCU)
     globalinit 1
     last_timer 0
     sleepdevice ki.fk.FensterRechts
     sleepsubtimer -1
     sleeptimer -1
     timerdev   ki.fk.FensterRechts
     timerevent contact: open (to VCCU)
     triggerDev ki.fk.FensterRechts
     DOIF_eventa:
       cmd_nr: 1
       cmd: 1
       cmd_event: ki.fk.FensterRechts
       cmd_1
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: ki.fk.FensterRechts
       state: cmd_1
     timerevents:
       alive: yes
       battery: ok
       contact: open (to VCCU)
       sabotageError: off
       open
     timereventsState:
       alive: yes
       battery: ok
       contact: open (to VCCU)
       sabotageError: off
       state: open
     triggerEvents:
       alive: yes
       battery: ok
       contact: open (to VCCU)
       sabotageError: off
       open
     triggerEventsState:
       alive: yes
       battery: ok
       contact: open (to VCCU)
       sabotageError: off
       state: open
   internals:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   room       Global
   wait       30:30:30:0

Was ich aber sehe ist dass von Zeit zu Zeit die Readings aktualisiert werden. Bei cmd_event steht dann immer mal ein anderes Fenster drin und ein Update wird ausgelöst. Ich habe an allen Festern die hm-sec-sco. Ich dachte bisher immer, dass die ihren Status nur on Event senden, also wenn Fenster geöffnet oder geschlossen wird. Aber kann es sein, dass die dauerhaft zyklisch mal "feuern"?

Damian

Wenn du es ganz genau wissen willst, dann musst du dir alle Events der Fenster loggen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

teichtaucher

...habe ich mir gerade angeschaut. Es scheint, dass meine Fensterkontakte zyklisch (den aktuellen Status) senden. Und mein Doif reagiert darauf. Ich stelle die Frage mal in der Rubrik Homematic - das Doif verhält sich richtig. (Es interpretiert jede Nachricht von den Fensterkontakten als Event. Wenn die Fenster schon offen waren wird deshalb trotzdem nochmal "offen" erkannt).

juemuc

Du kennst das Attribut "event-on-change-reading"?

Das könnte Deine Problem lösen.

Viele Grüße
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

teichtaucher

Moin, ich habe noch eine kleines Problem bei dem DOIF mit system wget. So sieht die Definition des DOIF aktuell aus:

(["\.fk\.:open"])
{my $str = "http://192.168.178.46/control?cmd=epd,txl,1,Fenster,2,offen:";;
my $idx=2;;
foreach (AggrDoIf('@','^*.fk.*','state','"open"')) {$idx++;;$str=$str.",".$idx.',%22'.uri_escape(AttrVal($_,"alias",$_)).'%22'}
system("wget -q $str &");;
Log(5, "Update Display")}
DOELSEIF (["\.fk\.:closed"] and [#"\.fk\.":state:"open"]>0)
{my $str = "http://192.168.178.46/control?cmd=epd,txl,1,Fenster,2,offen:";;
my $idx=2;;
foreach (AggrDoIf('@','^*.fk.*','state','"open"')) {$idx++;;$str=$str.",".$idx.',%22'.uri_escape(AttrVal($_,"alias",$_)).'%22'}
system("wget -q $str &");;
Log(5, "Update Display")}
DOELSEIF (["\.fk\.:closed"] and [#"\.fk\.":state:"open"]==0)
{system("wget -q http://192.168.178.46/control?cmd=epd,clear &");;
Log(5, "Update Display")}
DOELSE
{system("wget -q http://192.168.178.46/control?cmd=epd,clear &");;
Log(5, "Update Display")}


Ich habe letztens festgestellt dass bei jedem system command ein File abgelegt wird (siehe angehängter Screenshot). In jedem File steht einfach nur "OK".
Was mache ich beim Aufrauf von system wget falsch? Ich will einfach nur die Webseite asynchron aufrufen ohne auf die Rückmeldung von system zu warten, also Fire&Forget. Ich will auch das nicht in ein File umgeleitet haben.

eisman

hi,

und wenn man es komplizierter will:

dummy:
defmod Info.Window dummy
attr Info.Window alias offene Fenster
attr Info.Window devStateStyle style="text-align:right;;;;"
attr Info.Window group info
attr Info.Window readingList totalDev nokDevs nokDev state
attr Info.Window room Wohnung
attr Info.Window setList totalDev nokDevs nokDev state
attr Info.Window stateFormat nokDev/totalDev<br>nokDevs

notify:

defmod no.Info.Window notify FE_0.*00:.* {getWindowInfo("Info.Window")}
attr no.Info.Window alias Fenster info
attr no.Info.Window devStateStyle style="text-align:right;;;;"
attr no.Info.Window room Wohnung

99_myUtils.pm :

sub getWindowInfo($) {
  my ($name)   = @_;
  my @list     = devspec2array("NAME=RA_0.*00");
  my $state    = "closedclosed";
  my $nokCount = 0;
  my $count    = 0;
  my $nokDevs  = "";
  foreach my $dev (@list) {
    $count++;
    if ( ReadingsVal( $dev,'window','nok' ) ne "closedclosed" and ReadingsVal( $dev, 'ignore', 0) != 1) {
      $nokCount++;
      $state    = "nok";
      $nokDevs .= AttrVal( $dev, 'alias','-') . ",";
    }
  }
  if($nokCount == 0) { $nokDevs = "none" };
  fhem ("set $name totalDev $count");
  fhem ("set $name nokDev $nokCount");
  fhem ("set $name nokDevs $nokDevs");
  fhem ("set $name $state");
}

vor ein paar zig Jahren im Forum gefunden und leistet seine Dienste...
gruss
1x FHEM Debian, Homematic,ZigBee,FS20 / 1X Raspberry, ConBee / 5x ESP
1x FHEM Debian, Homematic,ZigBee         / 1X Raspberry, ConBee / 5x ESP
1x FHEM Debian,MQTT                               / 1X Raspberry, i2c,onewire,gpio
1x auf Windows 2012 Hyper-V-S

teichtaucher

Danke für die Definition. Aber mein Problem ist nicht, dass es nicht funktioniert, sondern dass jeder Systemaufruf mit wget ein File im FHEM Ordner erzeugt, obwohl ich wget mit der Option quiet aufrufe.

eisman

Hi,

es sollte auch nur eine INFO sein,
weil hierbei keine Datei angelegt wird.

gruss
1x FHEM Debian, Homematic,ZigBee,FS20 / 1X Raspberry, ConBee / 5x ESP
1x FHEM Debian, Homematic,ZigBee         / 1X Raspberry, ConBee / 5x ESP
1x FHEM Debian,MQTT                               / 1X Raspberry, i2c,onewire,gpio
1x auf Windows 2012 Hyper-V-S

Damian

Vom DOIF-Modul selbst kommen die Files nicht. Ob dein Systemaufruf mit wget diese verursacht, kannst du über die Kommandozeile testen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

teichtaucher

Habs jetzt rausgefunden. Wer die Doku liest, ist klar im Vorteil  ;)
Wget ruft nicht nur die URL auf sondern lädt auch das File runter. Es gibt aber ein paar Möglichkeiten, dies zu unterbinden:
1) das Output File nach /dev/null umleiten
2) wget mit der Option --spider aufrufen. Ist eigentlich nur dafür gedacht, um zu checken, ob die Seite hinter der URL noch existiert. Funktioniert aber auch für meinen Fall.

Ich habe vorher schon überlegt, ob ich httputils_nonblockingget verwenden soll, aber das ist mir etwas zu umständlich. Ich brauche die Callback nicht, ich will nur Fire&Forget. Wenn das Display offline ist und die Seite nicht erreichbar ist brauche ich keine Fehlerbehandlung. Das sehe ich schon wenn es nicht läuft.