Anbindung an openHCAN

Begonnen von GU!DO, 11 Oktober 2017, 10:30:09

Vorheriges Thema - Nächstes Thema

GU!DO

Ok. Ich schaue mal wie weit ich heute Nachmittag komme und schicke die Dateien heute Abend auf die Reise...

GU!DO

Alles was wir bis jetzt haben, wandert dann in das physiche Modul - ok?

CoolTux

Na nur die Anbindung mit den Socket. Alles andere ins logische
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

GU!DO

Kann ich das denn auch irgend wie als Schleife ausführen lassen?
Mit meinem geliebten try / catch?

CoolTux

Oh nein bitte nicht. Was willst du denn davon die Schleife machen
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

GU!DO

Dann kann ich direkt reagieren, wenn ein keep-alive paket fällig ist, und sende nicht einfach drauf los...

CoolTux

Kannst du doch so auch. Woran erkennst du wenn ein KeepAlive Packet fällig ist?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

GU!DO

Wenn er keine Verbindung mehr zum Socket bekommt:

36     try-
37     {
38         my $frame = $socket->recv( $in_data, MAX_RECV_LEN);
39                &keep_connection_alive;
40         if ( $frame )
41         {
42             print unpack("H*", $in_data),"\n";
43         }
44     }
45     catch
46     {
47         &keep_connection_alive;
48     }

CoolTux

Wenn der Socket sich selber abbaut dann wird dieser von alleine wieder aufgebaut. Das hatten wir im Modul so festgelegt. Aber eigentlich ist das ja schon zu spät. Gibt es da kein Datenpacket was sich vorher meldet. Wenn nicht würde ich einfach alle paar Minuten so ein Telegramm schicken.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

GU!DO

Ich hatte es so verstanden, dass dieses Ding:

  0 sub HCAN_Test_KeepAlive($) {
  1
  2     my $hash    = shift;
  3 ---
  4     my $data    = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
  5 #    print Dumper('Dumper: '.$data);
  6 ---
  7     HCAN_Test_Write($hash,$data);
  8 ---
  9     InternalTimer(gettimeofday()+30, "HCAN_Test_KeepAlive", $hash);
10 }


alle 30 sekunden keep_alive Pakete schickt?!?

CoolTux

Ja das ist korrekt. Aber innerhalb der read Funktion gibt es ja eine Abfrage das wenn Daten der Länge null kommen die Verbindung getrennt wurde und neu aufgebaut wird. Oder getrennt belassen? Weiß gerade nicht. Man kann ja die 30s auf 300 stellen und schauen ob die Verbindung gehalten wird.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

GU!DO

Sorry, hab gestern noch die Module umbenannt, und versucht Deinen (unseren) Code zu verstehen. Dann mußte ich wieder erwarten noch zu einem Kunden, und das war es dann auch mit dem Abend...

Es wäre schön, wenn Du mir ein paar Fragen beantworten würdest, je mehr ich verstehe was vorgeht, desto weniger muß ich Dich nerven.

Im Developer Intro steht:
ZitatDie X_Read-Funktion wird aufgerufen, wenn ein dem Gerät zugeordneter Filedeskriptor (serielle Schnittstelle, TCP-Verbindung, ...) Daten zum Lesen bereitgestellt hat. Die Daten müssen nun eingelesen und interpretiert werden.

Das steht bei uns im Quellcode, und ist wohl die Stelle die Du meinst:

  1     if( !defined($len) || !$len ) {
  2 ----
  3         Log3 $name, 3, "HCAN_hcand ($name) - connection closed by remote Host";
  4         HCAN_hcand_Close($hash);
  5         return;
  6     }
  7 ----
  8     unless( defined $buf) {
  9 ----
10         Log3 $name, 3, "HCAN_hcand ($name) - no data received";
11         return;
12     }


Wenn Read doch nur bei zu verarbeitenden Daten aufgerufen wird, wie kann es dann reagieren, wenn keine Daten kommen.
Oder wird Read sporadisch immer wieder aufgerufen?

Außerdem steht im Wiki:
Zitat
Die Write-Funktion wird durch die Funktion IOWrite() aufgerufen, sobald eine logische Gerätedefinition Daten per IO-Gerät an die Hardware übertragen möchte.
Wir haben ja noch kein 2 Modul Konzept, nutzen sie aber trotzdem. Also wird sie generell zum schreiben genutzt, oder war das nur, weil klar war, dass wir auf 2 Module erweitern?

Innerhalb von _Write steht:

  0      return Log3 $name, 3, "HCAN_hcand ($name) - WriteFn socket not connected"
  1      unless($hash->{CD});

Was ist der Inhalt von CD?

Diese Zeile kommt oft in Quellcodes vor, leider kann ich sie mir nicht erklären:
my $hash = shift;
Wird hier das erste Element des hash Wertes entfernt, ohne es irgendwo zu seichern?


Das hier:
Zitat
Das physische Modul öffnet die Datenverbindung zum Gerät (z.B. CUL) und verarbeitet sämtliche Daten. Es kümmert sich um den Erhalt der Verbindung (bsp. durch Keep-Alives) und konfiguriert das Gerät so, dass eine Kommunikation mit allen weiteren Geräten möglich ist (bsp. Frequenz, Modulation, Kanal, etc.).

hatte ich in Verbindung mit den Aussagen zu _Read _Write und _Parse, so gedeutet, dass das Modul autark läuft, und Daten in die jeweilige Richtung weiterleitet wenn welche von intern oder extern ankommen.
Qualsi als Puffer zwischen der Hardware und FHEM damit, falls die Verbindung zur Hardware hängt, FHEM davon nicht betroffen ist.

Wenn das Modul jedoch genau wie ein logisches Modul in FHEM eingebunden ist, warum benötigen wir dann 2 getrennte Module?




GU!DO

Noch was:

Ich habe mir überlegt, dass es vielleicht sinnvoll ist, das Array mit der Zuordnung der HEX-IDs zu den HCAN-Befehlen, und den Hash , der die lokale Installation abbildet im physischen Device zu erstellen.

Zum einen sind die beiden ja von der Hardware bzw. lokalen Installation abhängig und passen damit gut da herein, zum anderen, ist das für den hash der die lokale Installation abbildet, sinnvoll.
Dieser ist ja mehr oder weniger statisch, und muß so nicht bei jedem erstellen logischen Device mit angegeben werden.

Mir ist allerdings nicht klar, wie ich die beiden im physischen Device so anlege, dass ich sie im logischen wieder abrufen kann.

Vielleicht hättest Du dazu ein Beispiel?!?

Danke schonmal...

CoolTux

Zitat von: GU!DO am 04 November 2017, 08:17:09
Sorry, hab gestern noch die Module umbenannt, und versucht Deinen (unseren) Code zu verstehen. Dann mußte ich wieder erwarten noch zu einem Kunden, und das war es dann auch mit dem Abend...
Ich habe meinen Sohn zu Bett gebracht und bin dann mit eingeschlafen  ;D

Zitat
Das steht bei uns im Quellcode, und ist wohl die Stelle die Du meinst:

  1     if( !defined($len) || !$len ) {
  2 ----
  3         Log3 $name, 3, "HCAN_hcand ($name) - connection closed by remote Host";
  4         HCAN_hcand_Close($hash);
  5         return;
  6     }
  7 ----
  8     unless( defined $buf) {
  9 ----
10         Log3 $name, 3, "HCAN_hcand ($name) - no data received";
11         return;
12     }

Wenn Read doch nur bei zu verarbeitenden Daten aufgerufen wird, wie kann es dann reagieren, wenn keine Daten kommen.
Oder wird Read sporadisch immer wieder aufgerufen?
Eine Verbindung wird ja nicht einfach so abgerissen. Zu mindest nicht wenn es vernünftig läuft.
Es wird immer etwas gesendet das der Client/Server nun die Verbindung beendet. Dann kommen also immer noch eine Meldung über den Socket aber eben ohne Daten Länge. Zum Beispiel nur ein UDP Header
Denk an das OSI Schichtenmodell

Zitat
Also wird sie generell zum schreiben genutzt, oder war das nur, weil klar war, dass wir auf 2 Module erweitern?
Innerhalb von _Write steht:

  0      return Log3 $name, 3, "HCAN_hcand ($name) - WriteFn socket not connected"
  1      unless($hash->{CD});

Was ist der Inhalt von CD?
$hash->CD ist unser Kommunikationskanal zum Netzwerkgerät oder was auch immer. Kann ja auch ein USB Stick sein oder eine Datei.
Der Inhalt ist das was wir daruber schreiben oder lesen. Der von Dir zitierte Code schaut nicht nach dem Inhalt sondern ob der Hash Wert generell vorhanden ist.

Zitat
Diese Zeile kommt oft in Quellcodes vor, leider kann ich sie mir nicht erklären:
my $hash = shift;
Wird hier das erste Element des hash Wertes entfernt, ohne es irgendwo zu seichern?
Wieso nicht gesichert. Der erste Wert der letzten Variablen wird als $hash deklariert. $hash selber ist ein Zeiger auf die Systemvariable %hash.
Wichtig ist das was vor dieser Zeile steht, es ist nämlich der Beginn einer neuen sub, demzufolge macht ein shift den ersten Wert der Übergabe in $hash zu schreiben.
Das macht man/ich so wenn ausschließlich $hash an die Sub übergeben wird und sonst nichts. Also

blabla($hash);

sub blabla($) {

Man kann das auch mit mehreren machen

blabla($hash,$wert1,$wert2);

sub blabla($$$) {
my $hash = shift;
my $wert1 = shift;
my $wert2 = shift;

Aber das ist ja schlecht finde ich


Zitat
Das hier:
hatte ich in Verbindung mit den Aussagen zu _Read _Write und _Parse, so gedeutet, dass das Modul autark läuft, und Daten in die jeweilige Richtung weiterleitet wenn welche von intern oder extern ankommen.
Qualsi als Puffer zwischen der Hardware und FHEM damit, falls die Verbindung zur Hardware hängt, FHEM davon nicht betroffen ist.

Wenn das Modul jedoch genau wie ein logisches Modul in FHEM eingebunden ist, warum benötigen wir dann 2 getrennte Module?

Benötigt man eigentlich nicht. Ist aber in meinen Augen sauberer. Man kann so zum Beispiel ein logisches Modul für Aktoren und eines für Sensoren machen und bei verwenden das selbige physische Modul.
Das physische Modul ist ja in der Tat nur die Kommunikationsebene/Abstraktionsschicht zwischen den logischen Modulen und der Hardware. Wenn die Komminikationsbasis die selbe ist kann man zum Beisspiel alle Telegramme im physischen Modul hinterlegen und zuordnen.

01 zum Beipiel on
00 zum Beispiel off

nun reicht es wenn das logische modul als datenwert einfach ein on sendet, die zurodnung erfolgt dann im physischen.





Grüße

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

GU!DO

Danke für die Erklärungen!  :)

my $hash = shift;

Das ist wohl so wie beim "return". Wenn man keinen Wert dazu schreibt, wird einfach der Letzte genommen.
Macht es für einen noob wie mich nicht unbeding leichter... :'(

Bin mal gespannt wie lange es dauert, bis das Ding wiedermal etwas tut, das ich nicht erwartet hätte...