DOIF für Battery leer Warnung mit unterchiedlichen Devices

Begonnen von Johann.S, 24 September 2019, 16:18:12

Vorheriges Thema - Nächstes Thema

Damian

hier steht https://fhem.de/commandref_DE.html#DOIF_aggregation wie man auf numerische Werte (nach Zahl gefilterten Werte) zugreifen kann.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

pc1246

Zitat von: Johann.S am 09 Oktober 2019, 22:51:17
Danke für den Einzeiler, ich bin erst jetzt dazu gekommen ihn auszuprobieren!
Bei zwei 1.5V Batterien funktioniert es aber ich habe auch einzelne 1.5V Batterien (HMIP-SWDO).
Wie kann ich diese in das DOIF bringen!
Moin
Zur Not wuerde es auch ein zweites DOIF tun!?
Gruss Christoph
HP T610
Onkyo_AVR;3 Enigma2; SB_Server ; SB_Player; HM-USB mit 15 HM-CC-RT-DN, 3 HM_WDS10_TH_O, 6 HM-Sec-SCo, 4 HM-Sec-MDIR-2, 1 HM-Sen-MDIR-O-2, 8 Ferion 5000 OW ; PhilipsTV; 4 harmony hub; Jeelink mit 9 PCA301; Somfy; S7-300; 3 LGW; HUE; HM-IP auf Charly

Johann.S

Hallo,

@amenomade, danke das funktioniert.
@pc1246, wäre mit der jetzigen Version möglich aber nicht mehr notwendig!

Für alle die es Interessiert, meine RAW Definition
defmod di_battery DOIF (([12:00]) and ([?#"":voltage:$_ < 1.2 or ($_ > 1.5  and $_ < 2.3 )]))\
(\
  { DebianMail('beo.bachter@gmx.at', 'Smarthome: Batteriestand', 'In folgenden Geräten ist die Batterie zu wechseln: [?@"":voltage:$_ < 1.2 or ($_ > 1.5  and $_ < 2.3 )]', '') }\
)
attr di_battery do always
attr di_battery room EG->Buero
attr di_battery state In folgenden Geräten ist die Batterie zu wecnseln: [?@"":voltage:$_ < 1.2 or ($_ > 1.5  and $_ < 2.3 )]) if ([?#"":voltage:$_ < 1.2 or ($_ > 1.5  and $_ < 2.3 )])


@Alle, Danke für die Hilfe.


Raspi 3, Sduino 433MHz und 868MHz beide CC1101, Wetterstation TFA Dostmann 35.1119 (WH1080), intertechno PAR1000/PA1500
NOBILY Standard-Minifunkrolladenmotor PR4 13/147-40 ID-98, Homematic CCU3 (homematic-raspi), HmIP-eTRV-2, HmIP-SWDO, HmIP-STH, HmIP-WTH-2, Eigenbau sonoff für Gartenbewässerung

Damian

#18
Zitat von: Johann.S am 11 Oktober 2019, 12:24:24
Hallo,

@amenomade, danke das funktioniert.
@pc1246, wäre mit der jetzigen Version möglich aber nicht mehr notwendig!

Für alle die es Interessiert, meine RAW Definition
defmod di_battery DOIF (([12:00]) and ([?#"":voltage:$_ < 1.2 or ($_ > 1.5  and $_ < 2.3 )]))\
(\
  { DebianMail('beo.bachter@gmx.at', 'Smarthome: Batteriestand', 'In folgenden Geräten ist die Batterie zu wechseln: [?@"":voltage:$_ < 1.2 or ($_ > 1.5  and $_ < 2.3 )]', '') }\
)
attr di_battery do always
attr di_battery room EG->Buero
attr di_battery state In folgenden Geräten ist die Batterie zu wecnseln: [?@"":voltage:$_ < 1.2 or ($_ > 1.5  and $_ < 2.3 )]) if ([?#"":voltage:$_ < 1.2 or ($_ > 1.5  and $_ < 2.3 )])


@Alle, Danke für die Hilfe.

Das kann man so machen, allerdings werden die Unzulänglichkeiten des FHEM-Modus sichtbar: hier wird unnötig bis zu vier mal eine aufwändige Routine aufgerufen.

Im Perl-Modus kann man elegant über das ganze Modul Variablen nutzen, die man mehrfach verwenden kann.

Diese Definition tut das Gleiche, dürfte aber mit wesentlich weniger Systemlast auskommen (auch wenn es nur einmal am Tag passiert):

define di_battery DOIF {
  [12:00];
  if ([?#"":voltage:$_ < 1.2 or ($_ > 1.5  and $_ < 2.3 )]) {
    $_dev=[?@"":voltage:$_ < 1.2 or ($_ > 1.5  and $_ < 2.3 )];
    DebianMail('beo.bachter@gmx.at', 'Smarthome: Batteriestand', "In folgenden Geräten ist die Batterie zu wechseln: $_dev",'');
    set_State ("In folgenden Geräten ist die Batterie zu wechseln: $_dev");
  }
}


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

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Damian

#20
Zitat von: amenomade am 11 Oktober 2019, 18:56:33
Wo liegt der Unterschied?

Das müsste dir eigentlich auffallen. In seiner Version wird mindestens zwei mal  [?#"":voltage:$_ < 1.2 or ($_ > 1.5  and $_ < 2.3 )] aufgerufen und wenn es wahr ist, dann noch mal zwei mal [?@"":voltage:$_ < 1.2 or ($_ > 1.5  and $_ < 2.3 )]

In meiner Version wird nur einmal [?#"":voltage:$_ < 1.2 or ($_ > 1.5  and $_ < 2.3 )] für die Prüfung genutzt und wenn es wahr ist nur einmal [?@"":voltage:$_ < 1.2 or ($_ > 1.5  and $_ < 2.3 )]

Zu bedenken ist, dass bei einer Aggregationsfunktion  in zwei ineinander geschachtelten Schleifen das komplette System durchleuchtet wird.

Hinzukommt, dass im Perl-Modul bereits bei der Definition alles in Perl übersetzt wird. Im FHEM-Modus dagegen wird der Ausführungsteil und auch State bei jedem Aufruf erst mal in Perl übersetzt.

Es handelt sich hier sicherlich insgesamt um ein paar hundert Millisekunden, aber die summieren sich bei jeder Definition. Aus dem Bauchgefühl dürfte die Perl-Version Faktor 3-5 weniger Systemlast beim Aufruf produzieren, als die FHEM-Version.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Johann.S

ZitatDiese Definition tut das Gleiche, dürfte aber mit wesentlich weniger Systemlast auskommen (auch wenn es nur einmal am Tag passiert):
Ich bin da ganz deiner Meinung und habe es gleich übernommen.
Leider kommt eine Fehlermeldung:
2019.10.11 21:38:00 4 : di_battery: condition c01: Undefined subroutine &DOIF::DebianMail called, line 5. in perl block 1
2019-10-11 21:38:00 DOIF di_battery block_01: condition c01: Undefined subroutine &DOIF::DebianMail called, line 5.


Ich interpretiere die Meldung so, dass er DebianMail nicht findet.
defmod di_battery DOIF { [12:00];; \
  if ([?#"":voltage:$_ < 1.2 or ($_ > 1.5  and $_ < 2.3 )]) {\
    $_dev=[?@"":voltage:$_ < 1.2 or ($_ > 1.5  and $_ < 2.3 )];;\
    set_State ("In folgenden Geräten ist die Batterie zu wechseln: $_dev");;\
    DebianMail('beo.bachter@gmx.at', 'Smarthome: Batteriestand', 'In folgenden Geräten ist die Batterie zu wechseln: $_dev','');;\
  }\
}


Ich habe nur die Zeile set_State vor DebianMail gesetzt um ein Ergebnis zu sehen!
Raspi 3, Sduino 433MHz und 868MHz beide CC1101, Wetterstation TFA Dostmann 35.1119 (WH1080), intertechno PAR1000/PA1500
NOBILY Standard-Minifunkrolladenmotor PR4 13/147-40 ID-98, Homematic CCU3 (homematic-raspi), HmIP-eTRV-2, HmIP-SWDO, HmIP-STH, HmIP-WTH-2, Eigenbau sonoff für Gartenbewässerung

Damian

ja, da es sich hier um eine Funktion aus dem main-package handelt, musst du :: davorsetzen, ansonsten ist man im gekapselten DOIF-package:

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

Johann.S

so funktioniert es, ich musste nur die Variable $_dev noch aus den String nehme!

defmod di_battery DOIF { [12:00];; \
  if ([?#"":voltage:$_ < 1.2 or ($_ > 1.5  and $_ < 2.3 )]) {\
    $_dev=[?@"":voltage:$_ < 1.2 or ($_ > 1.5  and $_ < 2.3 )];;\
    set_State ("In folgenden Geräten ist die Batterie zu wechseln: $_dev");;\
    ::DebianMail('beo.bachter@gmx.at', 'Smarthome: Batteriestand', 'In folgenden Geräten ist die Batterie zu wechseln: '. $_dev ,'');;\
  }\
}


Danke noch mal für die Unterstützung!

Gruß Johann
Raspi 3, Sduino 433MHz und 868MHz beide CC1101, Wetterstation TFA Dostmann 35.1119 (WH1080), intertechno PAR1000/PA1500
NOBILY Standard-Minifunkrolladenmotor PR4 13/147-40 ID-98, Homematic CCU3 (homematic-raspi), HmIP-eTRV-2, HmIP-SWDO, HmIP-STH, HmIP-WTH-2, Eigenbau sonoff für Gartenbewässerung

Per

Zitat von: Damian am 11 Oktober 2019, 18:52:45Im Perl-Modus kann man elegant über das ganze Modul Variablen nutzen, die man mehrfach verwenden kann.
Kann man im DOIF-Mode doch mittels DOIF_Readings machen, oder?

Damian

Zitat von: Per am 15 Oktober 2019, 10:12:34
Kann man im DOIF-Mode doch mittels DOIF_Readings machen, oder?

ja, aber eine Perl-Variable zu nutzen, ist um einiges effizienter als ein Reading über Funktionen zu setzen oder auszulesen, zumal die Variable hier nur temporär gebraucht wird. Noch schlimmer wird es, wenn man ein Reading über setreading setzt, da der FHEM-Befehl erst über einen Parser erkannt werden muss ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#27
Hier noch mal eine Version für "Fanatiker". Sie ist kürzer und produziert noch weniger Last:

defmod di_battery DOIF { [12:00];; \
  if (($_dev=[?@"":voltage:$_ < 1.2 or ($_ > 1.5  and $_ < 2.3 ),"keine"]) ne "keine") {\
    set_State ("In folgenden Geräten ist die Batterie zu wechseln: $_dev");;\
    ::DebianMail('beo.bachter@gmx.at', 'Smarthome: Batteriestand', 'In folgenden Geräten ist die Batterie zu wechseln: '. $_dev ,'');;\
  }\
}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

sash.sc

Kannst du das Beispiel in die Wiki packen?

Gesendet von meinem MI 9 mit Tapatalk

Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

Damian

Zitat von: sash.sc am 20 Oktober 2019, 11:29:24
Kannst du das Beispiel in die Wiki packen?

Gesendet von meinem MI 9 mit Tapatalk

Finde ich recht speziell, ich habe z. B. keine Sensoren mit dem Reading Voltage.

Dann besser Sensoren anzeigen, deren Reading battery nicht ok ist oder Ausfall von Sensoren, wie eben gepostet: https://forum.fhem.de/index.php/topic,104569.msg985397.html#msg985397
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF