Hauptmenü

Notify und Trigger

Begonnen von Florian_GT, 31 Juli 2016, 16:15:19

Vorheriges Thema - Nächstes Thema

Florian_GT

Hallo,

ich habe aktuell nachfolgende FHEM Konfiguration:

define rs485 ECMD telnet 192.168.0.83:20108
attr rs485 classdefs drs110m=/fhem/trunk/fhem/drs110m.classdef
attr rs485 partial 2
attr rs485 timeout 5

define StromL1 ECMDDevice drs110m 001613300204 00000000
attr StromL1 IODev rs485
attr StromL1 alias 1: Strom L1 Leitung
attr StromL1 group Strom
attr StromL1 room Alle
attr StromL1 stateFormat { sprintf("%s W", ReadingsVal("StromL1","wirkleistung",0)) ;; }
define FileLog_StromL1 FileLog ./log/Daten-%Y.log StromL1
attr FileLog_StromL1 logtype text
define AuslesenALL_StromL1 notify AuslesenALL_StromL1 get StromL1 cleanBefore;; get StromL1 checkID;;sleep 0.08;;get StromL1 setProgMode;; sleep 0.28;; get StromL1 setPassword;; sleep 0.28;; get StromL1 spannung;; sleep 0.08;; get StromL1 strom;; sleep 0.08;; get StromL1 frequenz;; sleep 0.08;; get StromL1 wirkleistung;; sleep 0.08;; get StromL1 blindleistung;; sleep 0.08;; get StromL1 scheinleistung;; sleep 0.08;; get StromL1 leistungsfaktor;; sleep 0.08;; get StromL1 gesamtleistung_zaehlerstand;; sleep 0.08;; get StromL1 gesamtleistung_zaehlerstand_kopie;; sleep 0.08;; get StromL1 energie_in_rueckwaertsrichtung;; sleep 0.08;; get StromL1 energie_in_rueckwaertsrichtung_kopie;; sleep 0.08;; get StromL1 temperatur;; sleep 0.08;; get StromL1 ende

define StromL2 ECMDDevice drs110m 001613300207 00000000
attr StromL2 IODev rs485
attr StromL2 alias 2: Strom L2 Leitung
attr StromL2 group Strom
attr StromL2 room Alle
attr StromL2 stateFormat { sprintf("%s W", ReadingsVal("StromL2","wirkleistung",0)) ;; }
define FileLog_StromL2 FileLog ./log/Daten-%Y.log StromL2
attr FileLog_StromL2 logtype text
define AuslesenALL_StromL2 notify AuslesenALL_StromL2 get StromL2 cleanBefore;; get StromL2 checkID;;sleep 0.08;;get StromL2 setProgMode;; sleep 0.28;; get StromL2 setPassword;; sleep 0.28;; get StromL2 spannung;; sleep 0.08;; get StromL2 strom;; sleep 0.08;; get StromL2 frequenz;; sleep 0.08;; get StromL2 wirkleistung;; sleep 0.08;; get StromL2 blindleistung;; sleep 0.08;; get StromL2 scheinleistung;; sleep 0.08;; get StromL2 leistungsfaktor;; sleep 0.08;; get StromL2 gesamtleistung_zaehlerstand;; sleep 0.08;; get StromL2 gesamtleistung_zaehlerstand_kopie;; sleep 0.08;; get StromL2 energie_in_rueckwaertsrichtung;; sleep 0.08;; get StromL2 energie_in_rueckwaertsrichtung_kopie;; sleep 0.08;; get StromL2 temperatur;; sleep 0.08;; get StromL2 ende

define Timer_Strom at +*00:03:00 trigger AuslesenALL_StromL1,AuslesenALL_StromL2


Ich möchte hier zwei Stromzähler per RS485 über Netzwerk auslesen. Das Auslesen von einem Stromzähler funktioniert bereits, und wird von demTimer per Trigger gestartet. Wenn ich nun versuche, einen weiteren Zähler hinzuzufügen, wird wie in meinem Beispielcode der zweite Zähler ebenfalls per Trigger abgefragt.

Wenn ich das richtig sehe, wird bei einem Notify im Device jeder Befehl nacheinander abgearbeitet, und bei einem Trigger parallel.

Da aber alle meine Stromzähler über ein und das selbe RS485 Gerät im Netz hängen, muss ein Stromzähler nach dem anderen, und somit nicht parallel abgefragt werden.

Mir kam der gedanke, nun ein DummyDevice anzulegen, und dort in einem Notify also alle anderen Notifys hintereinander aufzurufen. Ich weiß jedoch leider nicht, wie ich ein Notify anrufen kann.

Wie kann ich das am besten Realisieren?
FHEM: Proxmox Server, FHEM in VM, pgSQL DB
Hardware: Ethersex (Pollin NETIO Boards), Diverse Tasmota MQTT Devices, Raspberry Pi Zero W Kameras, (Github RaspberryPiStreamingCamera), Zigbee2MQTT, ESPEasy

Development: UBA (Umwelt Bundesamt), BFS (Bundesamt für Strahlenschutz)

Ellert

Könntest Du nicht die trigger zeitversetzt senden?

define Timer_Strom at +*00:03:00 trigger AuslesenALL_StromL1;;sleep <Summe aller sleep-Zeiten StromL1>;;trigger AuslesenALL_StromL2

Florian_GT

Zitat von: Ellert am 31 Juli 2016, 19:31:57
Könntest Du nicht die trigger zeitversetzt senden?

define Timer_Strom at +*00:03:00 trigger AuslesenALL_StromL1;;sleep <Summe aller sleep-Zeiten StromL1>;;trigger AuslesenALL_StromL2

Gute Idee! Ich habe jetzt erfolgreich eine Zeitversetzte Abfrage laufen, ich habe es aber noch etwas anders gelöst.

define Timer_Strom1 at +*00:01:00 trigger AuslesenALL_StromL1
define Timer_Strom2 at +*00:01:00 sleep 5;; trigger AuslesenALL_StromL2
define Timer_Strom3 at +*00:01:00 sleep 10;; trigger AuslesenALL_StromL3
define Timer_strom4 at +*00:01:00 sleep 15;; trigger AuslesenALL_StromWohnzimmer


Ich habe je Abfrage einen Timer definiert, und ein Sleep davor gehangen. So ist es noch etwas übersichtlicher.

Aber ich habe bereits leider schon ein neues Problem. Sobald ich das XBMC Module hinzufüge, funktioniert die Abfrage nicht mehr. Ich vermute da meine Abfragen sehr Zeitkritisch sind, gibt es dort Probleme.
FHEM: Proxmox Server, FHEM in VM, pgSQL DB
Hardware: Ethersex (Pollin NETIO Boards), Diverse Tasmota MQTT Devices, Raspberry Pi Zero W Kameras, (Github RaspberryPiStreamingCamera), Zigbee2MQTT, ESPEasy

Development: UBA (Umwelt Bundesamt), BFS (Bundesamt für Strahlenschutz)

Ellert

Bei den einzelen at Auslösern könnte es sein, das die Auslösezeitpunkte nicht synchron bleiben, ineinander laufen und sich stören.

Davon unabhängig wäre DOIF eine übersichtliche Alternative, es vereint at und notify und Du benötigst nur eine Definition.

([global:"^(INITIALIZED|MODIFIED $SELF)$"])
## Abfrage StromL1
   (get StromL1 cleanBefore, get StromL1 checkID)
   (get StromL1 setProgMode)
   (get StromL1 setPassword)
   (get StromL1 spannung)
   (get StromL1 strom)
   (get StromL1 frequenz)
   (get StromL1 wirkleistung)
   (get StromL1 blindleistung)
   (get StromL1 scheinleistung)
   (get StromL1 leistungsfaktor)
   (get StromL1 gesamtleistung_zaehlerstand)
   (get StromL1 gesamtleistung_zaehlerstand_kopie)
   (get StromL1 energie_in_rueckwaertsrichtung)
   (get StromL1 energie_in_rueckwaertsrichtung_kopie)
   (get StromL1 temperatur)
   (get StromL1 ende)
##Abfrage StromL2
   ...


Attribute
wait 0,0.08,0.28,0.28,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,<Wartezeiten StromL2> ...
repeatcmd 60

Das DOIF wird ausgelöst beim "restart" durch INITIALIZED oder bei der Änderung der Definition durch MODIFIED.
Wait gibt die Wartezeiten zwischen den Befehlssequenzen an.
Mit "repeatcmd 60" werden alle Befehle alle 60 Sekunden wiederholt.

Die Befehle und Wartezeiten für weitere Geräte müssten ergänzt werden.

Im DEF-Editor in der "Device Overview" lässt die Definition sehr gut strukturieren, besonders wenn die codemirror-Ergänzung aktiv ist.

Siehe: Tips leichtere Bedienung Syntaxhervorhebung Klammerprüfung Suchen&Ersetzen Kommentierung