Fragen zur Modulstruktur

Hallo zusammen,

ich arbeite nach meinem JVC Projektor Modul (das außer mir selbst scheinbar niemand braucht :frowning:) jetzt an einem neuen Modul. Es soll die automatische Gartenbewässerung mit OpenSprinkler gesteuert werden. Den Controller hat eine API, die über HTTP ansprechbar ist.

Der Controller kann acht bis 64 Stationen verwalten, die würde ich als Geräteinstanzen über einen Konfigurator (da kämpf ich mich dann durch…) anlegen.

Nun habe ich zwei Implementierungsfragen:

  1. Konfiguration und Status aller Stationen kann ich über einen einzigen API Call auslesen. Das würde ich dann zyklisch in einer IO Instanz machen und die einzelnen Stations-Instanzen mit SendDataToChildren aktualisieren, oder?

  2. Ich frage eine API über HTTP ab. In den meisten Beispielen wird hier curl verwendet. Das funktioniert auch soweit. Wann würde ich das vordefinierte HTTP Request IO Modul ({4CB91589-CE01-4700-906F-26320EFCF6C4}) verwenden?

Und dann noch eine Best Practice Frage: Die Konfiguration des Controllers ist im Grunde statisch, es sei denn, man konfiguriert was um. Würde man dann eher erwarten, die Konfiguration nur über die Instanzkonfiguration explizit zu aktualisieren (über ein „Auslesen“ Button oder auch in ApplyChanges) oder sollte die Konfiguration jederzeit implizit beim zyklischen Auslesen aktualisiert werden. Da kann dann auch mal eine Sprinkler Station dazukommen oder wegfallen.

Und abschließend: Hat jemand einen OpenSprinkler und Interesse, das Modul zu testen, wenn es soweit ist?

VG
Bernd

1 „Gefällt mir“

Jein. Kurze Grundlage:

  • SendDataToChildren sendet aber immer an alle Child-Instanzen. Du entscheidest also bei SendDataToChildren nicht wo die Daten landen.
  • Immer alle Daten zu senden an alle Childs, kann ein System stark beanspruchen.
  • Eine Child-Instanz kann aber einen Filter setzen, auf Datensätze welche sie empfangen möchte.

Somit wäre der eine Call bestimmt die beste Wahl.
Dann aber das Ergebnis zerlegen in je einen Datensatz pro Station und Diese einzelnen Datensätze auch
einzeln mit SendDataToChildren versenden.
Im Child den ReceiveFilter setzen; dann kommt nur der eine gewünschte Datensatz auch in dieser einen Instanz an.

Dafür habe ich selber auch noch keine Verwendung (in einem PHP-Modul). Ich benutze auch direkt PHP-curl.

Verstehe jetzt nicht wirklich was du hier meinst.
Wenn eine Station hinzukommt, dann kannst du das im Konfigurator anzeigen.
Anlegen muss die Instanz aber der User. Entweder manuell über Instanz hinzufügen, oder über deinen Konfigurator.
Beim löschen ebenso; manuell löschen oder über den Konfigurator.
Michael

1 „Gefällt mir“

Hallo Michael,

danke für das Feedback.

Wenn ich es richtig verstehe, dann führt SetReceiveDataFilter() dazu, dass IPS die Nachricht auf Basis von regex auswertet und an die richtigen Children sendet. Dadurch, dass das Child den Filter selbst setzt, wäre es dann aber auch kein großer Unterschied, wenn das Child die ganze Config bekommt und sich seinen Teil entsprechend rausziehen, oder?

Das beantwortet meine Frage aber auch schon. :slight_smile:
Stationen kommen in zwei Fällen dazu oder weg: Wenn man ein Erweiterungsboard in den Controller einbaut oder wenn man eine Station Controller-seitig aktiviert/deaktiviert.
Der erste Fall passiert natürlich zwischen selten und nie, der zweite kann schon eher mal auftreten, aber sicher auch nicht regelmäßig.
Klingt also eher nach was, was man dann manuell aktualisiert.
Das könnte man dann vermutlich auch mit einer Discovery Instanz lösen.

VG
Bernd

Discovery Instanzen sind dazu gedacht Geräte im Netzwerk oder an anderen physikalischen Schnittstellen zu erkennen.
Das Auslesen der Konfig von deinem Controller und darstellen der verfügbaren Stationen wäre ein Konfigurator.

Technisch eher so daß er Nachrichten verwirft, wenn der Filter nicht passt. Nur wenn der Filter stimmt, geht ein Datensatz durch.

Könnte schwierig werden, weil der Filter auf den String vom Datenaustausch greift. Das ist ein json kodiertes Objekt.
Und da man ja das im ReceiveData vom Child wieder dekodieren muss, benutzt man den Filter immer so daß er einen ganzen Datensatz durchlässt.
Michael

So habe ich es jetzt auch gebaut. Die Discovery Instanz wäre eher was, um es einfach mal gemacht zu haben, denn dass ein neuer OpenSprinkler im Netzwerk dazukommt ist doch eher selten… und auch die Anzahl der Stationen ändert sich normal nicht.

Ich glaube, das muss ich einfach mal ausprobieren, was besser passt…

VG
Bernd

Ich habe gestern eine Schwachstelle von Opensprinkler in Verbindung mit MQTT gesehen - wenn wirklich mehrer Controller im Netzwerk sind, was nicht abwägig ist - bei mir lieber gerade zwei neue mit EPS8266 frisch geflacht auf dem Schreibtisch - dann ist eine Unterscheidung der einzelnen Controller nicht mehr möglich. Opensprinkler schickt keine eindeutige MQTT-Topis, z.b. Seriennummer oder Hostname oder sonst, sondern nur: „opensprinkler/…“

Auch bei den Station werden diese nur mit Topic „opensprinkler/station/xxx“ bezeichnet"

Ich muss mal suchen, ob es zu dem Thema schon einen Feature-Request auf Github gibt. Eine eindeutige Kennung währe doch praktischer, vor allen wenn man mehrere Controller nutzen will die per WLan gekoppelt werden.

Das ist natürlich unschön, Es gibt aber einen „Workaround“: Man kann die Geräte in einer Master/Slave Kombination betreiben.

Ich habe auch zwei Geräte. Auf dem Master sehe ich dann im Web UI auch die Kreise des Slaves (siehe im Screenshot Vorgarten West und Ost, die haben dann ein Funk Symbol). Auch die MQTT Nachrichten kommen dann für diese Sprinkler mit opensprinkler/station/9,10,…

Hallo Bernd,

auch ich habe schon länger vor Opensprinkler in Symcon zu integrieren.

Gibt es das Modul schon irgendwo?

VG Sönke

Hall Sönke,

der aktuelle Entwicklungsstand ist auf GitHub.

Seit letztem Sommer habe ich daran aber nicht weitergearbeitet und ich bin mir auch noch nicht sicher, ob ich das noch machen werde. Ich mag PHP einfach nicht :frowning: und werde mir eher auf Basis von C# etwas zusammenbauen.

Der Stand ist aber zumindest so, dass man den Status der Sprinkler sieht und auch Programme starten oder Sprinkler direkt starten und stoppen kann.

VG
Bernd