Codeoptimierung für Notify Auswertung mehrerer Devices

Begonnen von FHEMAN, 12 Januar 2015, 13:25:05

Vorheriges Thema - Nächstes Thema

FHEMAN

Hallo,

ich habe die Vermutung, meine Auswertung ist ein wenig umständlich und dauert daher länger. Kann mir jemand helfen, den Code zu optimieren?

Ich habe 5 Türfensterkontakte:
TuerFensterKontakt.Bad
TuerFensterKontakt.Eingang
TuerFensterKontakt.Kueche.Fenster
TuerFensterKontakt.SZ.FensterL
TuerFensterKontakt.WZ.FensterL


und einen Dummy Tuerfensterkontakte mit dem Status open, closed, unknown

Diese überwache ich so, dass 1 OPEN/CLOSE/MISSING ACK Event bei den TFK Sensoren eine Überprüfung auslöst und den Wert des Dummies setzt. Dabei soll

  • Closed nur gesetzt werden, wenn alle Fenster zu sind
  • Open nur gesetzt werden, wenn mind. 1 Fenster aufgemacht wurde
  • Unknown bei MISSING ACK etc. gesetzt werden
Mein Notify sieht derzeit so aus:
TuerFensterKontakt[.].*:(closed|open|.*ACK.*) {
if (("$EVENT" eq "closed") && (ReadingsVal("TuerFensterKontakt.Bad","state","unknown") eq "closed") &&
(ReadingsVal("TuerFensterKontakt.Eingang","state","unknown") eq "closed") &&
(ReadingsVal("TuerFensterKontakt.Kueche.Fenster","state","unknown") eq "closed") &&
(ReadingsVal("TuerFensterKontakt.SZ.FensterL","state","unknown") eq "closed") &&
(ReadingsVal("TuerFensterKontakt.WZ.FensterL","state","unknown") eq "closed")) {
fhem("set TuerFensterKontakte closed") ;
} elsif ((ReadingsVal("TuerFensterKontakt.Bad","state","unknown") eq "open") ||
(ReadingsVal("TuerFensterKontakt.Kueche.Fenster","state","unknown") eq "open") ||
(ReadingsVal("TuerFensterKontakt.SZ.FensterL","state","unknown") eq "open") ||
(ReadingsVal("TuerFensterKontakt.WZ.FensterL","state","unknown") eq "open")) ||
(ReadingsVal("TuerFensterKontakt.Eingang","state","unknown") eq "open") {
  fhem("set TuerFensterKontakte windowopen");
        } elsif (OldValue("$NAME") !~ m"ACK") {
fhem("set TuerFensterKontakte unknown ($NAME:$EVENT)");
}
}


Das Ganze ist etwas träge und ich frage mich, ob es eine übersichtlichere und schnellere Möglichkeit gibt?
Mittels Structure habe ich gesehen, kann ich nur anzeigen!?
Hat jemand eine Idee?
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

Mitch

Ich würde so etwas mit DOIF machen.

In etwas so:

define TuerFensterKontakte.Check DOIF ([TuerFensterKontakt.Bad] eq "open" or [TuerFensterKontakt.Eingang] eq "open" or [TuerFensterKontakt.Kueche.Fenster] eq "open" or [TuerFensterKontakt.SZ.FensterL] eq "open" or [TuerFensterKontakt.WZ.FensterL] eq "open") (set TuerFensterKontakte Open) DOELSEIF ([TuerFensterKontakt.Bad] =~ "ACK" or [TuerFensterKontakt.Eingang] =~ "ACK" or [TuerFensterKontakt.Kueche.Fenster] =~ "ACK" or [TuerFensterKontakt.SZ.FensterL] =~ "ACK" or [TuerFensterKontakt.WZ.FensterL] =~ "ACK") (set TuerFensterKontakte unknown ($NAME:$EVENT)) DOELSE (set TuerFensterKontakte Closed)

Alles ungetestet und ohne Gewähr  ;)
FHEM im Proxmox Container

FHEMAN

Das ist jetzt aber weder performanter noch wirklich übersichtlicher!?
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

Mitch

Also ich (persönlich  ;D ) finde es viel übersichtlicher und meine Erfahrung nach Umstellung einiger notifys auf DOIF auch performanter
FHEM im Proxmox Container

Tobias

#4
eine STRUCTURE ist genau DAS was du brauchst...
define Structure_KG_Fenster structure Structure_Haus Fenster_KG_Garage_L Fenster_KG_Garage_R Fenster_KG_HZ Fenster_KG_Bad Fenster_KG_GZ Fenster_KG_NZ Fenster_KG_Oel Fenster_KG_WK
attr Structure_KG_Fenster DbLogExclude .*
attr Structure_KG_Fenster Structure_Haus Structure_KG_Fenster
attr Structure_KG_Fenster alias Fenster Alle
attr Structure_KG_Fenster clientstate_behavior relative
attr Structure_KG_Fenster clientstate_priority Offen|on|open|opened Klapp|tilted Zu|off|closed
attr Structure_KG_Fenster event-on-update-reading state
attr Structure_KG_Fenster group Fenster
attr Structure_KG_Fenster room Haus_Kellergeschoss
attr Structure_KG_Fenster structexclude .*


Meine Notifys beinhalten nur einen Prozeduraufruf der in der MyUtils steht. So schlägt es auch Rudi vor als BestWay
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

slor

Hallo zusammen,

ich habe für den gleichen Zweck auch Structure in Verwendung.
Ich habe eine Structure für jedes Stockwerk.
Dann eine Structure für das Haus. im Haus sind die beiden Stockwerke verschachtelt.

Ich habe "das Gefühl" das die Structures Fhem ziemlich stressen.
Vor allem das Schließen von Türen oder Fenstern führt dazu, das Fehm auf meinem Raspi kurz hängen bleibt. Ab und an kommt es dann sogar zu einem Disconnect meines HM-Lan. Die Kontakte blinkern dann ewig und gehen am Ende auf rot oder bleiben mit orangener LED hängen. Dann hilft nur Batterie raus und wieder rein.
Die Structure bleibt dabei auf offen stehen.

Ist eine Structure wirklich so viel besser in Bezug auf die Performance?

Mitch

Solche Erfahrungen habe ich auch gemacht, weswegen ich wieder komplett von structure weg bin
FHEM im Proxmox Container

slor

Ok, gut zu hören.
Was ist denn eine sinnvolle Alternative? Notify oder DoIf?

Oder wie schon Tim 'The Tool Man' Taylor sagte: "More Power"? Also Umstieg auf stärkere Hardware?

Tobias

Ich bin auf einen Cubietruck umgestiegen. Seitdem (vorher eine IOMega IConnect) ist die Performance deutlich besser. INsbesondere bekomme ich kaum noch Homematick NACK Meldungen meiner HM-Fernbedienung die mit einem Virtuellen Device gepaired ist.
Was ich sagen will ist, das ab einer gewissen Größe einer FHEM-Installation man um bessere Hardware nicht herum kommt...
Bei mir werkeln > 300 Devices
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

slor

Ich habe nur ~40 Geräte und ein paar Virtuelle Devices und mein Rpi schwächelt. Jab mal alle notifies etc. deaktiviert und nun läuft es ganz ok.
Ein Rpi sollte doch eigentlich mehr reißen.

Cubietruck wäre auch mein Favorit.

Tobias

Oftmals sind auch notify´s schlecht programmiert. Mach mal ein globales verbose 5 und schau wie oft was wie lang aufgerufen wird.
Hast du auch mal das Modul apptime und perfmon aktiviert?

Zb. hat mir das geholfen inperformante notifys zu finden...
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter