FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: FHEMAN am 12 Januar 2015, 13:25:05

Titel: Codeoptimierung für Notify Auswertung mehrerer Devices
Beitrag von: FHEMAN am 12 Januar 2015, 13:25:05
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
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?
Titel: Antw:Codeoptimierung für Notify Auswertung mehrerer Devices
Beitrag von: Mitch am 12 Januar 2015, 13:39:29
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  ;)
Titel: Antw:Codeoptimierung für Notify Auswertung mehrerer Devices
Beitrag von: FHEMAN am 12 Januar 2015, 13:42:27
Das ist jetzt aber weder performanter noch wirklich übersichtlicher!?
Titel: Antw:Codeoptimierung für Notify Auswertung mehrerer Devices
Beitrag von: Mitch am 12 Januar 2015, 13:44:05
Also ich (persönlich  ;D ) finde es viel übersichtlicher und meine Erfahrung nach Umstellung einiger notifys auf DOIF auch performanter
Titel: Antw:Codeoptimierung für Notify Auswertung mehrerer Devices
Beitrag von: Tobias am 12 Januar 2015, 19:54:25
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
Titel: Antw:Codeoptimierung für Notify Auswertung mehrerer Devices
Beitrag von: slor am 13 Januar 2015, 10:38:43
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?
Titel: Antw:Codeoptimierung für Notify Auswertung mehrerer Devices
Beitrag von: Mitch am 13 Januar 2015, 10:54:42
Solche Erfahrungen habe ich auch gemacht, weswegen ich wieder komplett von structure weg bin
Titel: Antw:Codeoptimierung für Notify Auswertung mehrerer Devices
Beitrag von: slor am 13 Januar 2015, 11:07:49
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?
Titel: Antw:Codeoptimierung für Notify Auswertung mehrerer Devices
Beitrag von: Tobias am 14 Januar 2015, 08:09:11
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
Titel: Antw:Codeoptimierung für Notify Auswertung mehrerer Devices
Beitrag von: slor am 14 Januar 2015, 08:45:47
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.
Titel: Antw:Codeoptimierung für Notify Auswertung mehrerer Devices
Beitrag von: Tobias am 14 Januar 2015, 09:08:07
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...