Daten persistent speichern

Hallo zusammen,

ich möchte eine Pairing Tabelle (string array mit den Gerätecodes) dauerhaft speichern. Da es in IPS scheinbar noch keine fertige Lösung für Module gibt, habe ich mal in einige andere Module geschaut. Da wird meist auf eine IPS Variable ausgewichen. Allerdings kann diese der Nutzer ja auch sehen und bearbeiten. Ich hätte noch die Idee ein Property mit IPS_SetProperty zu beschreiben und es in form.json nicht mit anzugeben, sodass man einen „unsichtbaren Speicher“ hat? Oder gibt es noch eine andere/bessere Lösung?

Andere Module aus der selben Library sollen auf die Daten zugreifen können.

Danke!

Gruß Basti

Beides ist imho möglich sowohl Property als auch Variable. Ich sehe jetzt persönlich auch nicht den riesigen Nachteil einer Variable, diese kannst Du ausblenden dann wird diese auch nicht im Webfront anzeigt. Und wenn der User diese unbedingt direkt ändern will dann soll er das tun. Da man den Inhalt der Variable aber sowieso durch Einstellungen im Konfigurationsformular ändern kann werden wohl die wenigsten auf die Idee kommen oder eine Notwendigkeit sehen den Inhalt der Variable direkt zu ändern.

Ich würde gerne das Property ausblenden im Form, damit der Benutzer es nicht mehr ändern kann

Einfach in der Form nicht anzeigen.
Aber, was ist mit diesen Daten?
Holst du sie beim starten von IPS?
Dann lege sie in einen Buffer.
Oder sind sie auf die jeweiligen Geräte bezogen? Dann gehören sie in die Instanzen der Geräte.
Von anderen Instanzen direkt drauf zugreifen ist eh nicht drin, dann den Datenaustausch auch dafür nutzen.
Schon überlegt ob eventuell die Propertys vom Typ Liste oder File für diese Daten zutreffen?
Michael

Es ist einfach eine Liste mit den Gerätecodes. Diese Liste muss ich beim Initialisierungsprozess übergeben, damit ich Nachrichten von den Geräten empfangen kann. Der Benutzer kann die Liste nicht bearbeiten. Wird ein neues Gerät gepairt, wird es automatisch auf die Liste gesetzt.

Beim Empfangen von Nachrichten sollen die einzelnen Device Module schauen ob der Gerätecode der Nachricht auf der Liste ist.

Ne Liste würde vielleicht schon sinn machen, aber ne Liste mit den Geräten wollte ich dann eigentlich im Konfigurator machen und nicht im Gateway

Mhhh… das Vorgehen ist so nicht sinnvoll.
Der GeräteCode gehört in die Instanzen.
Diese brauchen nicht in die Nachricht schauen, das macht IPS für dich.
Schau Mal nach SetReceiveDataFilter — IP-Symcon :: Automatisierungssoftware

Beim Initialisierungprozess liest du alle deine Geräte-Instanzen, welche auch mit deinem Splitter verbunden sind, und übergibt diese Liste an dein Gateway.

Wird beim laufenden IPS eine Geräte-Instanz neu erzeugt, kannst du das mit DM_Connect von deinem Splitter auswerten und diesen GeräteCode an deine Liste anhängen.
Diese Liste kannst du dann auch prima in einem Buffer legen, da sie beim Neustart ja neu erzeugt wird.
Michael

Hm warum komme ich nie auf so Ideen? :slight_smile: Der Gerätecode dann als Property in den Instanzen speichern?

Da fällt mir noch was ein, ich möchte ja nen Konfigurator bauen wo man die Instanzen erstellen und löschen kann, dann hab ich doch nicht immer ne Instanz

Sorry… verstehe die Frage nicht.

Der Konfigurator ist auch immer eine Instanz.

Habe ich auch schon gebaut.

Er liest alle Geräte-Instanzen welche am gleichen Parent hängen, wie er selbst.
Und fragt das Gateway nach allen bekannten Geräten ab.
Beide Listen werden verglichen anhand des GeräteCode, dann wird eine Liste erzeugt und angezeigt.

Bei mir immer grün, wenn Instanz vorhanden und im Gateway bekannt.
Rot wenn Instanz vorhanden, aber im Gateway der GeräteCode unbekannt ist.
Farblos, wenn GeräteCode noch in keiner Instanz vorhanden ist -> Diese kann dann mit dem Button Erstellen erzeugt werden.

Michael

Ja exakt so wollte ich es auch machen, jetzt stellt sich mir aber die Frage wo/wie das Gateway die bekannten Geräte abspeichert. Dann müsste der ja doch eine Liste führen? Er kann ja die Liste nicht aus den Instanzen generieren, weil ein Gerät gepairt sein kann, es aber noch keine Instanz dazu gibt, weil der Benutzer noch keine mit dem Konfigurator erstellt hat.

Danke!

Gruss Basti

Das Vorgehen wie Nall-Chan beschrieben hat, ist auf jeden Fall das Beste. Immer die Infos in den Instanzen speichern zu denen Sie gehören und dann ggf. abfragen. Du kommst ja vom Splitter problemlos an eine Liste aller verbundenen Geräte :slight_smile:

Im Prinzip kannst du meisten überlegen: Wie sind die native Modul in IPS aufgebaut? :slight_smile:

paresy

Meinst du mit Gateway jetzt den Splitter oder die Hardware?
Der Konfigurator lädt erst beim öffnen der Konfiguration (GetConfigurationForm) die Daten von der Hardware und holt sich die Gerätecodes aus den Instanzen.
Eine Liste braucht der Splitter nicht, wozu auch.
Michael

Ich meinte den Splitter mit Gateway, sorry. Bis auf einen USB Stick gibts keine Hardware.

Und was ist wenn der Benutzer z.B noch keine Instanz angelgt hat, es aber schon gepairt ist, woher nimmt er dann den Gerätecode? Nutze ich im Konfigurator die Liste um die Gerätecodes zu speichern, wofür es noch keine Instanzen gibt?

Danke

Basti

Die Frage kannst nur du beantworten.
Wie wird den gepairt ?
Wo holst du die Gerätecodes her ?
Den Stick auslesen ?

Nein, das ist eine reine ‚Anzeige‘ -Liste.
Ich verstehe noch immer nicht warum du unbedingt diese Liste irgendwo speichern willst :confused:
Michael

Hallo Michael,

sorry ich sollte dir das vielleicht etwas genauer erklären:

Der Stick kann nichts speichern. Bei jeder Initialisierung muss ich ihm seinen eigenen Gerätecode und die Gerätecodes aller Geräte mit der er gepairt ist übergeben, damit er Statusnachrichten von den Geräten empfangen kann. Diese Liste (PairingTable) muss ich irgendwo speichern, damit ich sie bei jeder Initialisierung erneut übergeben kann.

Es gibt zwar einen Befehl den ich mit dem Stick senden kann, worauf alle Geräte antworten, wenn sie mit dem Stick gepairt sind, auch wenn ich sie beim der Initialisierung nicht mit angegeben habe. Allerdings wollte ich ungern jedes mal die PairingTable anhand der Antworten generieren, weil sich so ein manipuliertes Gerät ins Netzwerk schleichen könnte oder ein Gerät vielleicht keinen Empfang hat. Ich könnte im Konfigurator einen Button „Gepairte Geräte suchen“ einbauen, um z.B. gepairte Geräte zu finden, welche noch nicht im PairingTable stehen. Diese Funktion ist sinnvoll um bei einer Neuinstallation (Verlust des PairingTables) nicht alle Geräte neu angelernt werden müssen.

Es soll also eine Liste mit allen gepairten Geräten geführt werden. Ich dachte, da ist der Splitter passend, da der die Initialisierung auch macht.

Gruß Basti

Und du brauchst noch immer keine persistente Liste in IPS dafür :wink:
Der Splitter weiß ja wann der diese Liste übertragen muss; wenn die Verbindung neu aufgebaut wird (also Neustart, Statusänderung des IO oder welches des IO) oder eine Geräte-Instanz hinzukommt.
Somit liest du bei KRReady einmalig alle deine Instanzen und deren Gerätecodes aus.
Diese Liste sendest du an den Stick.
Wird eine Geräte-Instanz hinzugefügt, so kannst du dem Splitter sagen er soll die Liste neu generieren.
Wenn der User jetzt ein neues Gerät pairen will, so am besten über den Konfigurator.
Der baut diese Liste identisch zum Splitter auf und führt beim öffnen einmalig eine Suche aus (Suchen Button geht aktuell noch nicht… Wohl erst in IPS4.3 )
Schon hast du alle Codes für eine Liste im Konfigurator.
Michael

Hm ich glaube ich stehe auf dem Schlauch :slight_smile:

Was mache ich denn mit den Geräten welche gepairt wurden (über Konfigurator) aber noch keine Instanz erstellt wurde. Da habe ich keine Instanz wo ich den Gerätecode speichern kann, muss ihn mir aber trotzdem für die Initialisierung merken.

Danke

Warum musst du ihn dir merken… Wofür den? Wenn es keine Instanz für diesen Code gibt, kannst du die Daten eh nicht verarbeiten.
Der Konfigurator erstellt beim pairen die Instanz und gut ist.
Michael

Hm, aber nach dem pairen soll das Gerät in der Liste in weiss auftauchen (gibt noch keine instanz aber schon gepairt). Erst wenn der Benutzer die Instanz erstellt hat (Eintrag grün), ist die Instanz vorhanden.

Du meinst jedes mal beim Liste aktualisieren den Update Befehl senden und damit die Liste füllen? Leider dauert es einige Sekunden bis alle Antworten von allen Geräten da sind, ich hab mich noch nicht mit den Listen beschäftigt und weiß nicht, ob ich die dynamisch befüllen kann, sonst würde es sehr lange dauern, bis die Liste angezeigt wird.

Gruß Basti

Dynamisch ja, aber aktuell nur beim Öffnen der Instanz.
Darum sagte ich ja, noch nicht genau so möglich.
Pairen kannst du ja auch über den Splitter machen, grundsätzlich ja egal wo.
Da du ja die Liste vom Stick nur im Konfigurator abfragen musst, ist es ja OK wenn es ein paar Sekunden dauert.
Ansonsten brauchst du diese Daten ja nicht.
Michael