Helligkeitssensoren Durchschnittswerte berechnen

Begonnen von stoniii, 03 August 2023, 13:47:28

Vorheriges Thema - Nächstes Thema

stoniii

Hallo,

ich habe 3 Helligkeitssensoren aus welchen ich den Durchschnittswert berechnen möchte. Dies soll jedes mal erfolgen, wenn einer der 3 Sensoren einen neuen Wert übermittelt.
Ich habe es aktuell in einen DOIF hinbekommen die Berechnung durchzuführen, jedoch klappt dies aktuell nur wenn ich es manuell ausführe.

Kann mir jemand bei meinen Problem bitte weiterhelfen? ;)

define lichtsensor DOIF {my $d= (ReadingsNum("deCONZ_HUESensor2","lux",0)+ReadingsNum("Conbee_HUESensor7","lux",0)+ReadingsNum("Conbee_HUESensor8","lux",0))/3;;;; fhem("setreading lichtsensor, lux $d")}
attr lichtsensor addStateEvent 1
attr lichtsensor alias lichtsensor
attr lichtsensor event-on-change-reading .*
attr lichtsensor room 0.0.0_Logik,0.0.1_Test
attr lichtsensor stateFormat lux LUX
#   DEF        {my $d= (ReadingsNum("deCONZ_HUESensor2","lux",0)+ReadingsNum("Conbee_HUESensor7","lux",0)+ReadingsNum("Conbee_HUESensor8","lux",0))/3;; fhem("setreading lichtsensor, lux $d")}
#   FUUID      64b2da3f-f33f-d67e-1b0b-0856d8166bf2e558
#   MODEL      Perl
#   NAME       lichtsensor
#   NOTIFYDEV  global
#   NR         330
#   NTFY_ORDER 50-lichtsensor
#   STATE      29250.3333333333 LUX
#   TYPE       DOIF
#   VERSION    27262 2023-02-21 19:36:39
#   eventCount 9
#   READINGS:
#     2023-08-03 13:41:14   block_01        executed
#     2023-08-03 13:41:14   lux             29250.3333333333
#     2023-08-03 13:31:06   mode            enabled
#     2023-08-03 13:31:06   state           initialized
#   Regex:
#     accu:
#     bar:
#     barAvg:
#     collect:
#   condition:
#     0          my $d= (ReadingsNum("deCONZ_HUESensor2","lux",0)+ReadingsNum("Conbee_HUESensor7","lux",0)+ReadingsNum("Conbee_HUESensor8","lux",0))/3;; fhem("setreading lichtsensor, lux $d")
#   helper:
#     NOTIFYDEV  global
#     globalinit 1
#     last_timer 0
#     sleeptimer -1
#   perlblock:
#     0          block_01
#   uiState:
#   uiTable:
#
setstate lichtsensor 29250.3333333333 LUX
setstate lichtsensor 2023-08-03 13:41:14 block_01 executed
setstate lichtsensor 2023-08-03 13:41:14 lux 29250.3333333333
setstate lichtsensor 2023-08-03 13:31:06 mode enabled
setstate lichtsensor 2023-08-03 13:31:06 state initialized


rischbiter123

Moin,
bin zwar momentan etwas aus der Materie raus, aber ich würde sagen, da fehlt mindestens ein DOELSE in der Definition. Und eventuell auch das attr Do always.
LG
Andreas
4*Raspi, Max Thermostate und Fensterkontakte, FB7590, Mysensors und NanoCUL, IT und Sonoff, zigbee2mqtt2

betateilchen

Erstens ist das hier das falsche Forum für Fragen zu DOIF.
Zweitens frage ich mich, warum man das mit DOIF machen möchte.
Drittens frage ich mich, was denn die Bedingung (immerhin heißt das Ding ja DOIF) ist, aufgrund derer irgendwas passieren soll. Prinzipiell sehe ich da nur einen Ausführungsteil.

Zitat von: rischbiter123 am 03 August 2023, 14:25:46aber ich würde sagen, da fehlt mindestens ein DOELSE in der Definition

Das braucht man m.E. nur, wenn es auch einen alternativen Ausführungszweig gibt.

Und das event-on-bla... in dem DOIF device würde ich grundsätzlich weglassen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Damian

Deine DOIF-Definition besitzt keinen einzigen Trigger, daher kann das Modul nicht wissen, wann es etwas berechnen soll.

Triggerangaben werden beim DOIF in eckigen Klammen gesetzt.

statt ReadingsNum("deCONZ_HUESensor2","lux",0) muss du angeben [deCONZ_HUESensor2:lux:d,0] bei den anderen Reading gilt das gleiche.

Einfacher kannst du Durchschnitt mit Aggregatsfunktion berechnen: https://fhem.de/commandref_DE.html#DOIF_aggregation

z. B.

define lichtsensor DOIF
attr lichtsensor event_Readings lux:[#average:"^deCONZ_HUESensor":lux]
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF