externe Device einbinden welcher Weg am besten

Hallo

Ich habe per PHP und co meine AVR’s eingebunden das läuft auch ganz gut, ich möchte es gern aber etwas „professionalisieren“.

Wie fange ich da am besten an und welche Module muss ich dazu entwicklen?

Ich habe im 6 AVR’s die jeweils eine IP haben, diese schicken selbständig daten an eine fixe IP (Server) und können Daten empfangen.

Brauche ich da nun splitter und co welche ich entwicklen muss?

Ich habe mit Modulentwicklung für IPSymcon noch keine erfahrung, allerdings werkle ich beruflich mit Delphi 6 und Delphi 2007 Professional.

Was ich eben noch nicht ganz verstehe ist wie muss ich das ganze systemtechnisch am besten aufbauen?
den den Serversocket von IPS kann ich nicht verwenden (da der zuwenig infos liefert), daher müsste ich das ganze irgendwie kapseln …

Kann mir da wer der profis einen tipp und den weg zeigen?

es wurde mir interessieren das gleiche zu bekommen.
Jetzt habe ich 7 aktoren die senden - und weil ich in IPS die mac adresse (oder sende adresse) nicht mit bekomme, bin ich verplichtet 7 sockets ein zu richten (aka 1 per aktor)
Die ganze administration wenn jetzt auf welcher port sendet ist mir eher ‚dirty & ugly‘ deshalb meine anregung zu antworten :wink:
Mit Delphi kenne ich mich nich aus - sry

Ja ich weiss :wink:

Deshlab habe ich im Moment ein kleines Delphi Programm, das mir zuerst die Anfrage von den AVR’s entgegen nimmt, sofort ein OK zurücksendet
Dann die IP vorne dazusetzt und das ganze dann an einen Serversocket an IPS sendet

Nur das will ich eben irgendwie nun integrieren in IPS selber …

Könnten nicht die AVR’S irgendwelche Kennungen - z.b. ihre eigene IP oder jedenfalls eine Konstante wie ein Alias in den Datenstrom, den sie schicken, einbinden?

Das sollte doch nicht das Riesenproblem sein, die FW dahingehend umzubiegen?

Ich lasse so eine ganze Reihe „IP“ Devices an denselben Port senden. Von Loxone über Webbrick bis hin zu Eventghost Paketen von PC’s.

Ja könnten Sie, aber warum wenn alle Infos schon in dem IP Paket enthalten sind?

Und das problem ist, die AVR’s warten auf dem Datenstrom auf ein ACK Paket, das diese PAket auch erhalten wurde, und dieses sollte natürlich so schnell wie möglich zurückgesendet werden
im „normalen“ Delphi schickt ich das auf der selben Verbindung sofort zurück, aber per PHP und IPSymcon … habe ich ja keinen nativen zugriff darauf

Ich hatte das damals so gelöst, dass ich nen Kodierschalter vorgesehen habe und dessen Wert immer mitgesendet hab.

Dein kleines Programm mit IPS kommunizieren zu lassen sollte mit TRIXI klappen. Die funktioniert auch unter der 2.6.

Bei einem nativen IPS-Modul hast du ja bei jedem Versionswechsel die A*-Karte weil du alles immer gegen das neue SDK kompilieren musst. Mittlerweile bin ich da aber ganz fit. Vielleicht könnten wir mal einen Gedankenaustausch starten, denn das Thema AVR over Ethernet interessiert mich auch sehr. Hab irgendwie nie so recht den Einstieg geschafft.

Toni

Ah ja ist klar, aber wenn es sich auf die Versionswechsel von 2.5 -> 2.6 beschränkt, dann wäre es ja nicht so schlimm.
Das problem ist im Moment noch das ich noch nicht wirklich weiss was ich alles in das Modul packe und so weiter …

Der AVR machts im moment so
1.) Aufbau einer Verbindung zum Server
2.) Senden des Datenstrings
3.) Wartet auf ein OK (wenn kein OK kommt, dann noch mal senden des Datenstrings)
4.) Trennen der Verbindung

wenn ich was aktiv am AVR machen will
1.) Clientsocket erstellen
2.) Verbinung zum AVR herstellen
3.) Datenstring senden
4.) warten auf ein OK oder sonstiges Zeichen
5.) Trennen der Verbindung

Meiner Erfahrung nach kannst du deinen funktionierenden Delphi-Code recht einfach übernehmen und in ein IPS-Modul einbetten. Arbeitest du mit Indy oder machst du die Kommunikation „zu Fuß“? Das threading ist seit der 2.6 etwas zickig in IPS. Das muss man gesondert berücksichtigen. Ich nehme an, dass früher die Module allesamt im Haupthread liefen und paresy das jetzt geändert hat was eine andere Art der Synchronisierung verlangt. Das kann, muss aber nicht, Probleme bei der Migration von 2.5 auf 2.6 bringen.

Delphi 6 kannst du für IPS leider nicht gebrauchen aber D2k7 sollte klappen, glaub ich. Das war noch eine Version vor der Unicode-Umstellung, oder? Ich selbst verwende ein gepachtes BDS2k6 (TurboDelphi) für IPS weil mein D2k9 das SDK nicht mag.

Toni

Ja verwende die Indys 10 mit delphi 2007
Genau das war vor der unicodeumstellung
Habe zwar auch die XE’s hier rumliegen, aber noch keine zeit gehabt meine Projekte auf Unicode zu porten, deshalb arbeite ich immer noch mit dem 2007er

Super. Das dürfte auch die version sein, die paresy einsetzt.

Dann einfach das SDK mal runterladen und im Ordner IPSModule das MyLib Projekt mal öffnen. Das ist ein fertiges leeres Modul, das out of the box funktioniert aber eben „leer“ ist, also keinen Zweck erfüllt.

In der UTestModule.pas, die automatisch gestartet wird, gibts es constructor und destructor die du einfach wie gewohnt mit deinem Code erweitern kannst. Was sonst noch alles drin ist konnst du vorerst ignorieren.

Toni

ok das SDK habe ich und auch das Modul lässt sich kompilieren

allerdings sehe da dirnnen ja nur ein Modul

Ich brauche ja glaube ich dann

ein modul, das den Serversocket erzeugt
und dann für jeden aVR noch mal ein Modul das mit dem ersten Modul dann kommuniziert oder sehe ich das falsch?

… bzw wie mache ich dann folgendes

Ich bekomme ja in diesem Modul dann am ServerSocket die Info das Device 4, der Port Relais_TV auf 1 gegangen ist
daher muß ich ja das Device irgendwie mit dem Modul verknüpfen?

Ja, jetzt weiss ich nicht so genau wie du bisher mit deinen AVRs umgegangen bist. Ich würde versuchen es für den Anfang möglichst einfach zu halten. Wo sollen denn die Daten landen?

Dein Modul lauscht z.B. mit Indy an einem Port. Mit den empfangenen Daten willst du jetzt was genau anstellen?

ja das ist ja jetzt die frage :slight_smile:

Ich weiss ja noch nciht wie ich dann das Modul das den Serversocket beinhaltet (also dieses hier) die Daten weitergeben soll

im Moment habe ich es so im IPS


AVR
  TV_Schlafzimmer
    Aktiv
    Relais_TV
    Relais_SAT
    IRMP_Code
  Pool
    Licht Schacht
    Licht Pool
    Automatikmodus
    Pumpe
....

TV_Schlafzimmer ist zb Device 66
Pool ist device 201

es kommt also ein Datenstring vom device 66 mit dem Befehel Relais_TV 0 -> dann sollte diese Variable auf 0 gesetzt werden
oder mit device 66 IRMP code 2,0,f,1 dann sollte das in die Varaible IRMP_Code geschrieben werden … usw

nur was mir noch etwas bageht ist nun die verbindung zu diesen im moment Dummy_Modulen TV_Schlafzimmer und Pool

Also du hast Variablen, die nach einem festen Schema gefüllt werden sollen? Und du hast nicht vor deine „Technologie“ an Dritte Weiter zu geben? Ja? Dann „hartverdrahte“ deine „66 Relais_TV 0“ mit der IPS-Variable 56789 (wie sie eben heisst) doch am simpelsten. Könnte so aussehen:


FKernel.VariableManager.WriteVariableInteger(56789, 0); // 56789 ist die VarID, 0 der Wert, der geschrieben wird

Wenn das erstmal klappt und dir die Umsetzung dann zu starr ist brauchst du ja nur die Zuornung der VariablenIDs dynamisch aus einer selbstdefinierten Datei laden (einfache Variante) oder du setzt dich mal mit der settings.xml (ab der 2.6 dann settings.json) auseinander. Dabei aber immer den internen Handler verwenden. IPS steht nicht gerade drauf wenn man da manuell dran herumfummelt. :wink:

Toni

Und du hast nicht vor deine „Technologie“ an Dritte Weiter zu geben?

Das wäre sehr leidenswurdig fur mich … schade
Es wäre super wenn das modul in eine (zwei) variable den ursprung und inhallt vom epfangene daten raus gibt…
Im rahmen unsere implementierte energiemessung geben die sensoren die gemessene pulsen in 5 minuten takt durch. Ohne auswertung von wo die daten kommen kann ich also die pulsen nicht am richtigen ‚verbraucher‘ zuweisen…
Na jah … irgendwann bastelle ich wohl was zusammen.

Good luck

welche art der daten kommen von dem teil?

Im ersten schritt wirds dann so wie es aussieht mal ein einfacher servesocket sein der daten bekommt (diese mit einem OK bestätigt) udn dann die

IP:DATEN

weiterschickt also die 4te ziffer der IP einfach vorne dranhängt und so dann an IPSymcon weiterschickt

freu freu :wink:
die daten sind eine art tabelle mit epoche werte und auflaufende zähler-wert

Um in 5 minuten takt zu messen, brauche ich eigentlich nur die frischeste wert aus die tabelle und dann fängt die ganze rechnerei an… scripte stehen soweit bereit …

Kannst auch noch mit RegisterVariable in eine Art OutBuffer als String schreiben. Da könnte dann ein Script auf Änderung der Variable den Inhalt verarbeiten.

Toni

soooo

ich hab mal getestet
kann es in IPS mal anlegen aber die Properties werden mir nicht angezeigt?

constructor TIPSAVRNet.Create(IKernel: IIPSKernel; InstanceID: TInstanceID);
begin
    inherited;

    RegisterIntProperty('Port', getPort, setPort);
    //Register Variables
    //RegisterVariable('TestVariable', 'TestVariable', vtString, '');

    //Check Parent
    //RequireParent(IIPSClientSocket, True);

    ConstructorPostProcess;

    fCurrentSettings    := fChangedSettings;
end;

muss ich da noch mehr machen als dieses RegisterIntProeprty?

Wie kann ich mir die Version der geladenen DLL anzeigen lassen am leichtesten? damit ich immer sicher sein kann das auch die aktuellste geladen wird?