Variablentiming mit zwei FHZ?

Ich habe zwei FHZ1300PC (1xUSB und 1xLAN).

Gibt es eine Möglichkeit festzulegen, das beide FHZ „mithören“ aber nur einmal die Variable in IPS aktualisiert wird?

Ich möchte erreichen das kein Funksignal verloren geht, z.B. wenn ein Bewegungsmelder ein Signal sendet.

Wenn zwei FHZ dieses Signal empfangen kommt halt zweimal ein Variablenupdate zustande, wie kann ich das verhindern?

MfG Thomas

Semaphore?

Wenn dann müsste die Schaltungen ja sehr zeitnah kommen.

Das habe ich am laufenden band, sogar 3 mal, da ich auf allen 3 FHZ’s höre.
Das müsste mit IPS Semaphore zu machen sein, nur war ich bis jetzt zu faul das zu machen. :rolleyes:

Franz

Das hatte ich mir anders vorgestellt, natürlich kann ich die Scriptausführung zu einer Zeit mit Semaphore verhindern. Insofern danke. Aber so wollte ich das nicht lösen.

Ich stelle mir einfach eine Unterscheidung von IPS vor, dass das gleiche Funksignal zu einer Zeit auch von IPS nur als ein Signal gewertet wird.

Ich kenne das Funkprotokoll nicht, aber wenn der Aktor eine eindeutige Signatur je abgegebenen „Funkspruch“ hinterlässt währe das ohne Problem möglich… ohne Scriptaufwand.

MfG Thomas

ohne Problem

das ist relativ:

  • es müsste für jede bediente Instanz einen Eingangspuffer geben, der den Update zurückhält / speichert

  • dann müsste man für jedes empfangene Signal ein Zeitfenster „offen halten“, welches dann darüber befindet ob Updates doppelt waren oder nicht

das ist je nach Datenmenge und Wartezeit auch von den Ressourcen her nicht ganz unbedenklich, außer man macht es nur für einen, den FHZ - Splitter…

nur paresy kann wohl darüber Auskunft geben

btw: bei mir bekommen alle Scripte einen semaphore-Eintrag mit eigenem Namen, ob nötig oder nicht
>> habe ich mir seit dem Multithreading so angewöhnt…

Hallo prof,

wenn z.B. das Funksignal mit der Prüfsumme X von FHZ 1 und 2 empfangen wird, dann müßte man kein Zeitfenster haben, weil es ja ein eindeutiger Wert war, aber wie gesagt ich weiß nicht wie das Signal des Aktors aussieht, also welche Informationen bei der FHZ ankommen.

Aber das wäre mal ineressant, vieleicht sagt paresy mal was dazu…

Gruß Thomas

Hallo,

also ich denke, mit Semaphore werdet ihr da nicht sehr weit kommen. Denn wenn die Laufzeit des Scriptes kürzer ist als der Zeitunterschied zwischen den Abarbeitungen der FHZs, ist der erste Ablauf des Scriptes bereits fertig, wenn die Variable sich wieder ändert!

Aber warum verwendet ihr nicht IPS_GetLastRun und sperrt die Abarbeitung für eine kurze Zeit? Ich nehme an, euere Datenquelle sendet nur alle paar Sekunden (Unix-Timeformat: kleinste Einheit ist Sekunden):

Gruß
Erich

EDIT: Funktioniert leider nicht, da von IPS beim Einstieg der Zeitstempel gesetzt wird und nicht beim Verlassen!!!

Aber so sollte es funktionieren:


   //Benötigt wird eine Integer-Variable (Hier im Beispiel "Test_LastRun"

   //Zeit seit dem letzten abarbeiten < 2s?
   if ((time() - GetValueInteger("Test_LastRun")) < 2) {
      //Abarbeitung gesperrt
      IPS_LogMessage("Test","Letzter Aufruf war von nicht ganz 2s");
      return;
   }
   //Zeit für Abarbeitung sichern
   SetValueInteger("Test_LastRun",(int) time());

   //
   //Hier ist der normale Code einzufügen
   //
   
   IPS_LogMessage("Test","Script läuft normal ab");


Gruß
Erich

Das ist ja alles schön und gut, aber das war doch garnicht mein Problem.

Ich habe meine Scripte alle ausreichend gegen doppeltes Triggern gesichert.

Es gibt ein Funksignal eines Aktors, aber zwei Aktualisierungen der dazugehörigen Variable (weil ja zwei FHZ das an IPS melden).

Meine Frage ist nun kann man von IPS Seite feststellen ob beide das gleiche Funksignal empfangen haben???

Gruß Thomas

Hallo Thomas,

nein, Du kannst lediglich feststellen, das etwas empfangen wurde, ob es das gleiche Funksignal war, das kannst Du derzeit nicht ermitteln. Noch nichtmal die Update-Time auf beiden Seiten muss uebereinstimmen.

Gruss Torro

Nee !

Franz

@torro

Danke. Ich finde zwar das ist ein Manko, aber halt nicht zu ändern.
Kannst Du mir mal sagen was bei einem Funksignal einer FS20 Komponente so gesendet wird?

Sicherlich die ID der Komponente und was noch?

Gruß Thomas

Vorsicht!

was bei einem Funksignal einer FS20 Komponente so gesendet wird
urheberrechtlich geschütztes Protokoll.

Suche mal nach …fhz4linux… :smiley:

Hallo Thomas,

Klar kann ich das: die ID, dann die ganzen Werte entsprechend des Geraetes und der definierten Sendeintervalle, Mal mehr und mal wenige. Dann wird das ganze auch noch ueberwacht, damit das ganze Geraet innerhalb einer bestimmten Zeit keine Dauersendungen taetigt.

Noch Fragen? Wie prof schon schrieb…

Gruss Torro

Sehr interessant.:smiley:

Aber da steht auch, das der Repeater mit anderen Quersummen erkannt wird,
paresy hat mal geschrieben das man das Signal nicht unterscheiden kann…:confused: (Habe da auch einen im Einsatz)

MFG Thomas

Wenn ich mir das logfile anschaue kann man erkennen das IPS zur genau gleichen Zeit ein und das gleiche Signal 2x bekommt.

Könnte man nicht einfach einen Filterschalter in IPS setzen, um das auszuschalten?


04.11.2007 20:09:34.265 | DEBUG   | VariableManager      | Variable: Geragentor (Boolean), Value: False
04.11.2007 20:09:34.265 | DEBUG   | ExecuteThread ID: 5536 | Executing Script: Log.ips.php ~ Sender: Variable: Geragentor, Trigger: OnUpdate
04.11.2007 20:09:34.265 | DEBUG   | VariableManager      | Variable: Geragentor (Boolean), Value: False
04.11.2007 20:09:34.265 | DEBUG   | ExecuteThread ID: 5516 | Executing Script: Log.ips.php ~ Sender: Variable: Geragentor, Trigger: OnUpdate

MfG Thomas

Hi,

ich habe zum ursprünlichen Problem auch eine Frage. Nächstes Jahr wollte ich eine weitere FHZ1300 in Betrieb nehmen. Meine Funktaster laufen alle als Umschalter, ich benutzte also nur jeweils einen Kanal zum ein- und ausschalten.

Muss ich jetzt damit rechnen, dass die erste FHZ einen Aktor einschaltet und die zweite FHZ diesen Aktor kurz darauf wieder abschaltet? Das wäre ganz schlecht.

Toll wäre es, wenn man einstellen könnte, in welchem zeitlichen Abstand zwei Befehle mit der selben Adresse angenommen werden. Wenn man hier dann z. B. 0,5 sec einträgt, könnte man sicher sein, dass jeder Befehl nur einmal angenommen wird.

Eine andere, aber auch umständlichere Methode wäre die, wenn man die Variablen der FHZs trennen könnte. Geht das, dass ich für einen Schalter dann in jeder FHZ eine eigene Variable anlegen kann, die nur umschaltet, wenn der Befehl von der entsprechenden FHZ angenommen wurde?

Kann man feststellen, von welcher FHZ eine Variable geändert wurde?

Ich wünsche einen schönen Abend.

Christoph

Ich nehme mal an, du meinst die ‚SWAP‘ Funktion der FS20 Elemente. Ich würde das zwar sein lassen, da du in IPS damit nur Probleme kriegst, da du nicht mehr eindeutig erkennen kannst, ob nun eine Variable TRUE oder FALSE ist.
Bei SWAP wird die dazugehörige Variable einmal auf TRUE gesetzt und dann nicht mehr zurückgesetzt. Du musst das dann jedesmal per Skript tun, äussert lästig.

Franz

Hallo Christoph,

Toll wäre es, wenn man einstellen könnte, in welchem zeitlichen Abstand zwei Befehle mit der selben Adresse angenommen werden. Wenn man hier dann z. B. 0,5 sec einträgt, könnte man sicher sein, dass jeder Befehl nur einmal angenommen wird.

Mit

IPS_GetUpdateMicrotime

sollte man auswerten können wann genau die Variable getriggert wurde, allerdings gibt es da soweit ich mich erinnern kann Probleme mit der Genauigkeit…
Auch mit einem Semaphore könnte man das Script sichern, denke allerdings, dass das in diesem Zeitfenster nicht möglich ist.

Und laut meinem Log scheinen ja die Befehle genau zeitgleich anzukommen?

Vieleicht kann paresy mal was dazu sagen…

Gruß Thomas

Hallo Franz,

Deine Beschreibung, das Variablen nur auf TRUE gesetzt werden kann ich nicht bestätigen. Jedesmal wenn ich schalte, schaltet das Gerät um (direkt nicht über die FHZ) und die entsprechende Variable in IPS ändert ihren Wert.

Einzig, wenn ein Schaltbefehl verloren geht (was bei mir in den letzten Wochen nicht mehr vorkam), stimmt der Variablenwert nicht.

Hallo Thomas,

der Befehl IPS_GetUpdateMicrotime würde mir nicht wirklich weiterhelfen. Ich müsste diesen Wert zwischenspeichern und dann bei der nächsten Änderung prüfen, ob der alte Zeitwert vom neuen außerhalb der Sperrzeit liegt. Ich bräuchte also für jede Variable eine weitere Variable, die die Zeit der letzten Änderung aufnimmt. Hinzu käme, dass jede Variablenänderung ein Skript aufrufen müsste um zu prüfen, ob der neue Wert korrekt ist.

Ich wünsche einen schönen Abend.

Christoph