Eigene Nachrichten aus Modulen verwenden

Hallo,

Zum Thema Nachrichten in Modulen (also RegisterMessage — IP-Symcon :: Automatisierungssoftware und co.) habe ich zwei Fragen:

a) Kann ich aus eigenen Modulen Nachrichten versenden?
b) Wenn ja, kann ich eigene IDs definieren (die Doku spricht nebulös von Modulnachrichten, ich konnte aber nichts finden)

Danke & Gruß,
Florian

Das macht IPS für dich.
Du kannst nur indirekt versenden.
Also wenn du eine Variable beschreibst oder erzeugst, feuert IPS die Nachrichten automatisch.
Was hast du den vor?
Michael

Ich will Events bzw. vielmehr Nachrichten mit Inhalt von „Services“ in IPS an Konsumenten verteilen.
Z.B.

  • 10 Module, die Logmeldungen erzeugen
  • 1 Konsument, der alle Meldungen in eine Datei schreibt
  • 1 Konsument, der alle Meldungen > Loglevel Info ins IPS Log schreibt
  • 1 Konsument, der alle Meldungen > Loglevel Critical per Email versendet

Mit Parents kann man das nicht vernünftig lösen, da noch an mehreren Stellen ähnliche Event Pattern verwendet werden könnten und das Konzept ja nur einen Parent vorsieht.

Kannst du ein Beispiel nennen, damit man versteht was du vorhast.
Weil das ist noch zu abstrakt um den Sinn zu erfassen.
Michael

Im Prinzip dasselbe wie bei den Nachrichten.

Ein Modul soll eine Nachricht (z.B. Lognachricht) erstellen.
Andere Module sollen diesen Typ noch Nachricht (z.B. per ID) abonnieren können (z.B. um Logmeldungen auf verschiedene Art und Weise zu speichern).

Dadurch wird eine Entkopplung von Sender und Empfänger erreicht.

Ja aber, wozu?
Warum? Wo brauchst du das?
Für die logische Abbildung von Hardware reicht die 1:n Anbindung.
Und ein praktisches Beispiel für vielleicht nicht Hardware spezifischer n:m Zuordnung hast du noch immer nicht gepostet.
Nachricht sind ja auch nicht gedacht um Nutzdaten zu transportieren.
Sicherlich kann man ein Modul schreiben und sind dann 6 Instanzen anlegen um auf verschiedenen LogLeveln verschiedene Aktionen auszuführen, aber das sind alles von IPS versendete Nachrichten.
Den Inhalt kannst du natürlich mit IPS_LogMessage festlegen.
Michael

z.B. um in einem Konfigurator festlegen zu können, welche welche Arten noch Nachrichten (Log, Push Notifications, …) auf welchem Weg bekommen solle, OHNE in dem Code, der das Routing in der Konfigurator-Instanz durchführt, zwingend wissen zu müssen, an welche Instanzen man solche Nachrichten senden muss.

Ich kann auch einfach in einer Variable ein serialisiertes Array als FIFO Puffer nutzen und mit Semaphores den konkurrierenden Zugriff regeln. Aber ich befürchte, das wird eher inperformant sein.

Siehe auch hier: Beobachter (Entwurfsmuster) – Wikipedia

Ich meine, die Notwendigkeit für einen solchen Mechanismus sieht man offenbar auch bei IPS.
Ich würde es halt auch nur gerne für eigene Themen nutzen :slight_smile:

Im schlimmsten Fall muss ich eben auf RabbitMQ oder ähnliches ausweichen, würde aber gerne ohne externe Komponenten auskommen.

Das ist zur Zeit nicht möglich. Wir bieten für die PHP Module noch keinen Schreibzugriff auf die interne Message Queue an.

paresy

Wenn dir die interne Message-Queue nicht zur Verfügung steht, dann versuch doch eine externe zu nutzen:

(a) Richte dir Registervariable ein, die auf einem UDP-Port lauschen
(b) Sende deine Messages per UDP an diesen Port
© Reagiere im Event der Registervariable auf neue Messages

Ich weiß nicht, ob du für einen UDP-Port mehrere Registervariable registrieren kannst. Wenn nicht, müsste der Eventhandler das dort auseinander nehmen.

Mir fehlt weiteres know how, ist nur ein Denkanreiz.

Folgendes Szenario:

  • Ich erzeuge für meine Modulinstanz eine Variable
  • Die Modulinstanz registriert sich für die Change-Events der Variable
  • Jetzt werden sehr schnell sehr viele neue Werte aus verschiedenen Threads in die Variable geschrieben

Meine Frage dazu:
Ist garantiert, dass für jede Änderung der Variable ein Event generiert und der MessageSink der Modulinstanz aufgerufen wird?
Oder kann es bei hoher Rate der Änderungen vorkommen, dass nicht alle Änderungen per Event gemeldet werden?
Bzw. gibt es ggf. andere Rahmenbedingungen, unter denen nicht alle Änderungen gemeldet werden?