Neue Features: Aggregationsfunktion, Filtern nach Zahl mit Nachkommastellen

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

Vorheriges Thema - Nächstes Thema

FFHEM

Hallo zusammen,
irgendwie passen die obigen Lösungen nicht auf mein Problem, oder ich sehe irgendetwas noch falsch (sehr wahrscheinlich).
Ein DOIF soll liefern: "Alle zu" wenn alle Fenster geschlossen sind und z. B. "Badezimmerfenster,Schlafzimmerfenster" wenn diese beiden geöffnet sind. Wenn das Badezimmerfenster geschlossen wird, soll natürlich nur noch "Schlafzimmerfenster" angezeigt werden, soweit, so klar.

Bei mir zeigen die DOIFs noch nicht das Richtige an.

Das hier scheint zunächst zu funktionieren und ist FAST richtig, aber reduziert nicht die Liste der Fensternamen, wenn von z. B. 2 Fenstern eines geschlossen wird:
defmod di_Fenster_perl DOIF {if ([#"^Melder_":state:"open"] != 0) \
{set_Reading ("state",[@:a"^Melder_:open":state:"open"],1)}\
}\
\
{if ([#"^Melder_:closed":state:"open"] == 0)\
{set_Reading ("state", "alle zu",1)}\
}\


Das Beispiel aus der Referenz:
Statusanzeige: Offene Fenster:

define di_window DOIF

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


liefert bei mir NIE den Wert "keine" zurück, sondern es bleibt immer eine Liste offener Fenster, auch wenn alle geschlossen sind.

Kann mir jemand noch einen Denktipp geben?
Vielen Dank!
Gruß
Friedhelm




Raspberry Pi 4B, Homematic, Sonoff, Shelly, Worx, Arduino, ESP8266

Damian

Zitat von: FFHEM am 27 Januar 2019, 13:16:19
Hallo zusammen,
irgendwie passen die obigen Lösungen nicht auf mein Problem, oder ich sehe irgendetwas noch falsch (sehr wahrscheinlich).
Ein DOIF soll liefern: "Alle zu" wenn alle Fenster geschlossen sind und z. B. "Badezimmerfenster,Schlafzimmerfenster" wenn diese beiden geöffnet sind. Wenn das Badezimmerfenster geschlossen wird, soll natürlich nur noch "Schlafzimmerfenster" angezeigt werden, soweit, so klar.

Bei mir zeigen die DOIFs noch nicht das Richtige an.

Das hier scheint zunächst zu funktionieren und ist FAST richtig, aber reduziert nicht die Liste der Fensternamen, wenn von z. B. 2 Fenstern eines geschlossen wird:
defmod di_Fenster_perl DOIF {if ([#"^Melder_":state:"open"] != 0) \
{set_Reading ("state",[@:a"^Melder_:open":state:"open"],1)}\
}\
\
{if ([#"^Melder_:closed":state:"open"] == 0)\
{set_Reading ("state", "alle zu",1)}\
}\


Das Beispiel aus der Referenz:
Statusanzeige: Offene Fenster:

define di_window DOIF

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


liefert bei mir NIE den Wert "keine" zurück, sondern es bleibt immer eine Liste offener Fenster, auch wenn alle geschlossen sind.

Kann mir jemand noch einen Denktipp geben?
Vielen Dank!
Gruß
Friedhelm

ohne konkrete Hinweise wird man dir nicht helfen können.

Was liefert?:

list window.*

list der einzelnen window-devices

list des DOIF-Devices

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

FFHEM

Hallo Damian,
danke und klar, ohne Infos nix los:
Das Beispiel aus der Commandref auf meine Sensoren geändert:
Symptom: offene Fenstermelder werden angezeigt, wenn diese schließen, bleiben diese Fenster aber angeblich offen, der Fall "keine" tritt hier nie ein:
Internals:
   CFGFN     
   DEF        ##
   FUUID      5c4dc82f-f33f-26cd-f247-414e471567a4b3b0
   MODEL      FHEM
   NAME       di_window
   NR         12599
   NTFY_ORDER 50-di_window
   STATE      Offene Fenster: Melder_Bad_links,Melder_Bad_rechts
   TYPE       DOIF
   READINGS:
     2019-01-27 16:03:11   cmd             0
     2019-01-27 16:03:11   mode            enabled
     2019-01-27 16:05:37   state           Offene Fenster: Melder_Bad_links,Melder_Bad_rechts
   Regex:
     STATE:
       :
         STATE:
           "^Melder_:open" ^Melder_:open
   condition:
   devices:
   do:
     0:
   helper:
     event      battery: ok,contact: open (to VCCU),open,trigger_cnt: 40
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev Melder_Bad_links
     DOIF_eventas:
       state: Offene Fenster: Melder_Bad_links,Melder_Bad_rechts
     triggerEvents:
       battery: ok
       contact: open (to VCCU)
       open
       trigger_cnt: 40
     triggerEventsState:
       battery: ok
       contact: open (to VCCU)
       state: open
       trigger_cnt: 40
   itimer:
   uiState:
   uiTable:
Attributes:
   room       Test
   state      Offene Fenster: [@"^Melder_:open":state:"open","keine"]


Melder_Bad_links ist, wie man sieht, "open"
Internals:
   CFGFN      ./FHEM/fhem_geraete.cfg
   DEF        5F5A30
   FUUID      5c444ff0-f33f-26cd-7af2-bb9dcc4a82a83f42
   IODev      myHmUART
   LASTInputDev myHmUART
   MSGCNT     56
   NAME       Melder_Bad_links
   NOTIFYDEV  global
   NR         358
   STATE      open
   TYPE       CUL_HM
   lastMsg    No:BD - t:41 s:5F5A30 d:FF3004 0128C8
   myHmUART_MSGCNT 56
   myHmUART_RAWMSG 05010044BDA6415F5A30FF30040128C8
   myHmUART_RSSI -68
   myHmUART_TIME 2019-01-27 16:05:37
   peerList   Badthermostat_WindowRec,
   protLastRcv 2019-01-27 16:05:37
   protRcv    56 last_at:2019-01-27 16:05:37
   protRcvB   15 last_at:2019-01-27 16:05:37
   protSnd    41 last_at:2019-01-27 16:05:37
   protState  CMDs_done
   rssi_at_myHmUART cnt:56 min:-75 max:-58 avg:-63.85 lst:-68
   READINGS:
     2019-01-26 16:50:39   Activity        alive
     2018-12-29 16:28:16   CommandAccepted no
     2018-12-07 10:19:34   D-firmware      1.0

     2019-01-05 16:15:27   PairedTo        0xFF3004
     2018-12-07 12:22:37   R-Badthermostat_WindowRec-expectAES off
     2018-12-07 12:22:37   R-Badthermostat_WindowRec-peerNeedsBurst on
     2018-12-07 12:22:36   R-cyclicInfoMsg on
     2018-12-07 12:22:36   R-eventDlyTime  0 s
     2018-12-07 12:22:36   R-pairCentral   0xFF3004
     2018-12-07 12:22:36   R-sabotageMsg   on
     2018-12-07 12:22:36   R-sign          on
     2019-01-05 16:15:27   RegL_00.        00:00 02:01 09:01 0A:FF 0B:30 0C:04 10:01 14:06
     2019-01-05 16:15:27   RegL_01.        00:00 08:01 20:9C 21:00 30:06
     2019-01-05 16:15:28   RegL_04.Badthermostat_WindowRec 00:00 01:01
     2019-01-27 15:10:18   alive           yes
     2019-01-27 16:05:37   battery         ok
     2019-01-02 12:23:13   battery_warning 1546428192.65447
     2019-01-27 16:05:37   contact         open (to VCCU)
     2019-01-26 16:50:39   peerList        Badthermostat_WindowRec,
     2019-01-05 09:58:19   powerOn         2019-01-05 09:58:19
     2019-01-27 15:10:18   recentStateType info
     2019-01-27 15:10:18   sabotageError   off
     2019-01-27 16:05:37   state           open
     2019-01-27 16:05:37   trigger_cnt     40
   helper:
     HM_CMDNR   189
     mId        00C7
     regLst     ,0,1,4p
     rxType     28
     supp_Pair_Rep 0
     ack:
     expert:
       def        1
       det        0
       raw        1
       tpl        0
     io:
       newChn     +5F5A30,00,00,00
       nextSend   1548601537.98151
       rxt        2
       vccu       VCCU
       p:
         5F5A30
         00
         00
         00
       prefIO:
         myHmUART
     mRssi:
       mNo        BD
       io:
         myHmUART:
           -64
           -64
     prt:
       bErr       0
       sProc      0
       sleeping   0
       rspWait:
     q:
       qReqConf   
       qReqStat   
     role:
       chn        1
       dev        1
     rpt:
       IO         myHmUART
       flg        A
       ts         1548601537.6884
       ack:
         HASH(0x3af6998)
         BD8002FF30045F5A300101C800
     rssi:
       at_myHmUART:
         avg        -63.8571428571429
         cnt        56
         lst        -68
         max        -58
         min        -75
     tmpl:
Attributes:
   IODev      myHmUART
   IOgrp      VCCU:myHmUART
   actCycle   002:50
   actStatus  alive
   alias      Badezimmer links
   autoReadReg 4_reqStatus
   devStateIcon open:10px-kreis-rot closed:10px-kreis-gruen
   expert     2_raw
   firmware   1.0
   group      Fenster/Tür
   model      HM-SEC-SCo
   peerIDs    00000000,633A0803,
   room       Alarmanlage

   subType    threeStateSensor
   userattr   room_map structexclude


während Melder_Bad_rechts, nachdem er einmal "open" war, nun wieder "closed" ist, und trotzdem als offen angezeigt wird:
Internals:
   CFGFN      ./FHEM/fhem_geraete.cfg
   DEF        5F5A5A
   FUUID      5c444ff0-f33f-26cd-2882-7f01903d706a6642
   IODev      myHmUART
   LASTInputDev myHmUART
   MSGCNT     94
   NAME       Melder_Bad_rechts
   NOTIFYDEV  global
   NR         362
   STATE      closed
   TYPE       CUL_HM
   lastMsg    No:5B - t:10 s:5F5A5A d:FF3004 06010000
   myHmUART_MSGCNT 94
   myHmUART_RAWMSG 050100425BA6105F5A5AFF300406010000
   myHmUART_RSSI -66
   myHmUART_TIME 2019-01-27 16:06:00
   peerList   Badthermostat_WindowRec,
   protLastRcv 2019-01-27 16:06:00
   protRcv    94 last_at:2019-01-27 16:06:00
   protRcvB   34 last_at:2019-01-27 16:05:54
   protSnd    60 last_at:2019-01-27 16:06:00
   protState  CMDs_done
   rssi_at_myHmUART cnt:94 min:-77 max:-64 avg:-67.46 lst:-66
   READINGS:
     2019-01-26 16:50:39   Activity        alive
     2018-12-09 09:05:47   CommandAccepted no
     2018-12-07 10:19:34   D-firmware      1.0

     2018-12-28 21:37:55   PairedTo        0xFF3004
     2018-12-07 11:37:57   R-Badthermostat_WindowRec-expectAES off
     2018-12-07 11:37:57   R-Badthermostat_WindowRec-peerNeedsBurst on
     2018-12-07 11:37:56   R-cyclicInfoMsg on
     2018-12-07 11:37:56   R-eventDlyTime  0 s
     2018-12-07 11:37:56   R-pairCentral   0xFF3004
     2018-12-07 11:37:56   R-sabotageMsg   on
     2018-12-07 11:37:56   R-sign          on
     2018-12-28 21:37:55   RegL_00.        00:00 02:01 09:01 0A:FF 0B:30 0C:04 10:01 14:06
     2018-12-28 21:37:55   RegL_01.        00:00 08:01 20:9C 21:00 30:06
     2018-12-28 21:37:56   RegL_04.Badthermostat_WindowRec 00:00 01:01
     2019-01-27 16:06:00   alive           yes
     2019-01-27 16:06:00   battery         ok
     2019-01-24 08:28:25   battery_warning 1548314903.68419
     2019-01-27 16:06:00   contact         closed (to VCCU)
     2019-01-26 16:50:39   peerList        Badthermostat_WindowRec,
     2019-01-04 17:41:10   powerOn         2019-01-04 17:41:10
     2019-01-27 16:06:00   recentStateType info
     2019-01-27 16:06:00   sabotageError   off
     2019-01-27 16:06:00   state           closed
     2019-01-27 16:05:55   trigger_cnt     112
   helper:
     HM_CMDNR   91
     mId        00C7
     regLst     ,0,1,4p
     rxType     28
     supp_Pair_Rep 0
     ack:
     expert:
       def        1
       det        0
       raw        1
       tpl        0
     io:
       newChn     +5F5A5A,00,00,00
       nextSend   1548601560.39845
       rxt        2
       vccu       VCCU
       p:
         5F5A5A
         00
         00
         00
       prefIO:
         myHmUART
     mRssi:
       mNo        5B
       io:
         myHmUART:
           -62
           -62
     prt:
       bErr       0
       sProc      0
       sleeping   0
       rspWait:
     q:
       qReqConf   
       qReqStat   
     role:
       chn        1
       dev        1
     rpt:
       IO         myHmUART
       flg        A
       ts         1548601560.10431
       ack:
         HASH(0x3ad3768)
         5B8002FF30045F5A5A00
     rssi:
       at_myHmUART:
         avg        -67.468085106383
         cnt        94
         lst        -66
         max        -64
         min        -77
     tmpl:
Attributes:
   IODev      myHmUART
   IOgrp      VCCU:myHmUART
   actCycle   002:50
   actStatus  alive
   alias      Badezimmer rechts
   autoReadReg 4_reqStatus
   devStateIcon open:10px-kreis-rot closed:10px-kreis-gruen
   expert     2_raw
   firmware   1.0
   group      Fenster/Tür
   model      HM-SEC-SCo
   peerIDs    00000000,633A0803,
   room       Alarmanlage

   subType    threeStateSensor
   userattr   room_map structexclude


Meiner Meinung nach erfolgt ja kein Rücksetzen durch die Abfrage auf "closed".

-------------------------------------------------------------------------------------
Und hier ein abgewandeltes Beispiel, was zwar erkennt, wenn alle Fenster geschlossen sind, aber nicht, wenn von den 2 Fenstern eins wieder geschlossen wird:

Internals:
   CFGFN     
   DEF        ([#"^Melder_:open":state:"open"] != 0)
()

DOELSEIF ([#"^Melder_:closed":state:"open"] == 0)
()

   FUUID      5c4d979b-f33f-26cd-2b75-bea1e71e89070f51
   MODEL      FHEM
   NAME       di_Fenster
   NR         10765
   NTFY_ORDER 50-di_Fenster
   STATE      Badezimmer links,Badezimmer rechts
   TYPE       DOIF
   READINGS:
     2019-01-27 16:17:16   Device          Melder_Bad_rechts
     2019-01-27 16:17:12   cmd             1
     2019-01-27 16:17:12   cmd_event       Melder_Bad_links
     2019-01-27 16:17:12   cmd_nr          1
     2019-01-27 12:53:33   mode            enabled
     2019-01-27 16:17:12   state           Badezimmer links,Badezimmer rechts
   Regex:
     STATE:
       :
         STATE:
           "^Melder_:open" ^Melder_:open
     cond:
       :
         0:
           "^Melder_:open" ^Melder_:open
         1:
           "^Melder_:closed" ^Melder_:closed
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::AggregateDoIf($hash,'#','^Melder_','state','"open"') != 0
     1          ::AggregateDoIf($hash,'#','^Melder_','state','"open"') == 0
   devices:
   do:
     0:
       0         
     1:
       0         
     2:
   helper:
     event      battery: ok,contact: closed (to VCCU),closed,trigger_cnt: 116
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   Melder_Bad_links
     timerevent battery: ok,contact: open (to VCCU),open,trigger_cnt: 42
     triggerDev Melder_Bad_rechts
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: Melder_Bad_links
       state: Badezimmer links,Badezimmer rechts
     timerevents:
       battery: ok
       contact: open (to VCCU)
       open
       trigger_cnt: 42
     timereventsState:
       battery: ok
       contact: open (to VCCU)
       state: open
       trigger_cnt: 42
     triggerEvents:
       battery: ok
       contact: closed (to VCCU)
       closed
       trigger_cnt: 116
     triggerEventsState:
       battery: ok
       contact: closed (to VCCU)
       state: closed
       trigger_cnt: 116
   internals:
   itimer:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   do         always
   room       Test
   state      [@:a"^Melder_:open":state:"open","alle zu"]


Raspberry Pi 4B, Homematic, Sonoff, Shelly, Worx, Arduino, ESP8266

Damian

Zitat von: FFHEM am 27 Januar 2019, 16:24:01

Und hier ein abgewandeltes Beispiel, was zwar erkennt, wenn alle Fenster geschlossen sind, aber nicht, wenn von den 2 Fenstern eins wieder geschlossen wird:

Internals:
   CFGFN     
   DEF        ([#"^Melder_:open":state:"open"] != 0)
()

DOELSEIF ([#"^Melder_:closed":state:"open"] == 0)
()


Klar nicht! Den Fall ([#"^Melder_:closed":state:"open"]  > 0 hast du auch nicht definiert.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FFHEM

ZitatKlar nicht! Den Fall ([#"^Melder_:closed":state:"open"]  > 0 hast du auch nicht definiert.
Oh Mann,
da hatte ich wieder 2 dicke Tomaten auf den Augen,
vielen Dank!!!!
Raspberry Pi 4B, Homematic, Sonoff, Shelly, Worx, Arduino, ESP8266

Paddie

Hi,

Ich weiß jetzt nicht ob ich die Funktion falsch verstehe oder irgendwo einen Fehler habe.

Ich möchte, wenn ich das Haus verlasse eine Meldung darüber bekommen, welche Fenster (OK, im Moment gibts nur eins mit passendem Sensor...aber der Rest kommt, wenn das hier dann funktioniert ;-)) noch offen sind.

Dafür hab ich Tasker auf meinem Handy so eingerichtet, dass er beim Berühren eines bestimmten NFC-Tags ein Dummy-Device auf 1 setzt. Dadurch wird dann ein DOIF getriggert, welches mir dann per Telegram mitteilt, welche Fenster noch offen sind

mein DOIF sieht jetzt so aus:

([d_Fenster_Check] eq 1)(
    IF ([#"Fenster:open":state:"open"] != 0) (
        {Log 1, "Folgende Fenster sind offen: [@"Fenster":state:"open"]"}
    ) ELSEIF ([#"Fenster:closed":state:"open"] == 0) (
        {Log 1,  "alle Fenster geschlossen"}
    )
)


Als Fehler bekomme ich imm:


IF: unknown Device: #"Fenster


Danke für eure Hilfe.

Paddie

Damian

Der Befehl IF kennt keine Aggregation, die Abfrage musst du in die DOIF-Bedingung verlagern:

([d_Fenster_Check] eq 1 and [#"Fenster:open":state:"open"] != 0)...
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Paddie

Hmm..stimmt, dann funktionierts ;-).

Wobei jetzt aber bei "alle geschlossen" gar nichts ausgegeben wird. Wobei das eigentlich auch nicht soooo wichtig ist

...kleiner Edit... OK, ich bin doof, ich kann das ja einfach in den doelseif packen ... ;-)  8) ::)

Vielen Dank

heinemannj66

Hallo,

ich habe Probleme mit der Filterung nach Gruppen:

defmod di_average_temp DOIF ##
attr di_average_temp state [#sum"^MQTT":power:$group eq "test2"]

setstate di_average_temp 53
setstate di_average_temp 2020-01-26 13:54:30 cmd 0
setstate di_average_temp 2020-01-26 13:54:30 mode enabled
setstate di_average_temp 2020-01-26 14:52:14 state 53

Sind die zu Summierenden Device nur EINER einzigen Gruppe zugeordnet ist alles OK.
Bei mehreren Gruppenzuweisungen llaufe ich vor die Pumpe ...

Bug oder Feature oder Problem vor dem Bildschirm?

Cheers
Joerg

Onkel.Tom


Hallo und moin, moin,

ich stehe auf dem Schlauch und wäre für einen "rettenden" Hinweis sehr dankbar:

Ich möchte aggregiert bei allen Devices des Typs "MQTT2_DEVICE" abfragen, ob das Reading "new_fw" true ist,
aber hiermit funktioniert es noch nicht:

DOELSEIF ([@"":new_fw:$_ eq "true" and $TYPE eq "MQTT2_DEVICE"])
   (set Telegram _msg $DEVICE Neue Firmware,
    set $DEVICE x_update)

Was mache ich falsch ?

Dank euch !

VG

Sany

Moin,

ich habe bei mir folgendes am laufen:
attr XYZ DOIF_Readings neueFW:[@as(<br>)":new_fw":new_fw:$_ eq "true" and $TYPE eq "MQTT2_DEVICE"]

liefert das Reading neueFW als Liste untereinander. Für Deinen Zweck musst Du evtl. das s(<br>) weglassen für eine kommaseparierte Zeile.

Viel Erfolg!
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Peter aus Calw

Hallo zusammen,
mit diesem Code konnte ich den Fenster-Status super erdarstellen.

DEF
([#"^FS_:open":state:"open"] != 0) DOELSEIF ([#"^FS_:closed":state:"open"] == 0) DOELSEIF ([#"^FS_:closed":state:"open"] > 0)
attr state Offene Fenster: [@"^window:open":state:"open","keine"]


Nun würde ich aber gerne die Alias Device Namen darstellen um diese in FTUI anzeigen zu können.
Wie könnte das erreicht werden ?
würde mich über einen Tipp freuen, Gruß Peter

Damian

Zitat von: Peter aus Calw am 22 November 2021, 18:01:26
Hallo zusammen,
mit diesem Code konnte ich den Fenster-Status super erdarstellen.

DEF
([#"^FS_:open":state:"open"] != 0) DOELSEIF ([#"^FS_:closed":state:"open"] == 0) DOELSEIF ([#"^FS_:closed":state:"open"] > 0)
attr state Offene Fenster: [@"^window:open":state:"open","keine"]


Nun würde ich aber gerne die Alias Device Namen darstellen um diese in FTUI anzeigen zu können.
Wie könnte das erreicht werden ?
würde mich über einen Tipp freuen, Gruß Peter

Für Aliasnamen musst du a angeben, wie in der Doku beschrieben, also:

[@a"^window:open":state:"open","keine"]
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Peter aus Calw

Hallo Damian,
es ist immer wieder ein Erlebnis wie Du mir und vielen anderen prompt und so super hilfst.
Also es funktioniert wie gewünscht.
Besten Dank und Gruß Peter

Peter aus Calw

Hallo Damian und alle Fhemler,
die Lösung von Damian schreibt nun alle Alias der geöffneten Fenster ins "state", das hat zur Folge, daß das in  FTUI-Tablet übernommen wird.
Allerdings fortschreibend. Ist es möglich die Device state jeweils in eine neue Zeile im tablet zu schreiben - also in Form einer Device Liste ?
Das müßte vermutlich in FTUI-Tablet passieren, also hier :
                          <td>
                             <div data-type="label" data-device="FENSTER_STATUS" data-get="state" class="large"</div>
                             </td>

Hier werden die Device-Alias durch ein Komma getrennt angezeigt.
Habe keine Ahnung das in eine Listenförm zu bringen oder nach dem Komma in die nächste Zeile ?
Brauche also noch einmal eure Unterstützung.
Gruß Peter