Autor Thema: Neues Modul entwicklen  (Gelesen 4046 mal)

Offline sn0000py

  • Developer
  • Full Member
  • ****
  • Beiträge: 210
Neues Modul entwicklen
« am: 03 September 2019, 14:07:21 »
Hallo ich möchte mir gerne ein neues Modul entwicklen

Ich hier einen Arduino Nano mit CAN (MCP2515) der mir die Frames meiner CAN Nodes empfängt und binär an die USB/serielle ausgibt.

Meine Frage ist, wie baut man das am besten schematisch in FHEM auf?

Ein Device das die USB Verbindung aufbaut und dann je Node eine Verbindung?

Wenn der Node ein Rolladenaktor ist, dann ists klar.
Ich habe aber auch einen Node, der 8 230V Eingänge und 8 Relais hat, der Node ist dann programmiert wie in 8 fach Taster (bei Tastendruck wird das Relais getoggelt)
Sollte man sowas dann auch als ein DEVICE abbilden oder werden das mehrere?

Werden diese Device dann in einem pm File abgebildet oder nimmt man für jeden Typ ein eigenes?

danke für input :D

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 8152
  • eigentlich eher user wie "developer"
Antw:Neues Modul entwicklen
« Antwort #1 am: 03 September 2019, 14:20:17 »
Moin,

klingt nach einem interessanten Projekt, erinnert mich aber sehr stark an MySensors im allgemeinen und meine (am Ende erfolgreichen) Experimente mit CAN-Transceivern statt der RS485-Module im speziellen: https://wiki.fhem.de/wiki/MySensors_Starter_Guide#CAN-Transceiver.

Wenn du was eigenes bauen willst (und nicht die Nodes auf das MySensors-Protokoll aufsetzen willst, was vermutlich einfach wäre, da nur der Kummunikationsteil anders zu code wäre), ist es evtl. eine Idee, zumindest die Modul-Struktur zu übernehmen; da sind zwar einige spezielle Dinge drin (das Matching, wenn ich das richtig verstanden habe), aber der Aufsatz als 2-stufiges Modul ist mWn. Standard. Benötigt würde also ein Modul für das "Device das die USB Verbindung aufbaut" (IO-Modul, bei MySensors 00_MYSENSORS.pm), das dann "irgendwie" ableiten muß, wer der eigentliche Empfänger einer Nachricht ist (Client-Modul, MYSENSORS_DEVICE). Theoretisch kannst du unterschiedliche Client-Module bauen, aber vermutlich ist es einfacher, das in eines zu packen.

Mal sehen, was die richtigen Experten dazu sagen...

Gruß, Beta-User
Server: HP-T620@Debian 10, aktuelles FHEM + ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN
svn:MySensors, WeekdayTimer, AttrTemplate => {mqtt2, mysensors, httpmod}

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 22622
Antw:Neues Modul entwicklen
« Antwort #2 am: 03 September 2019, 14:23:00 »
Ich würde ein 2 stufiges Modul machen.
Das physikalische baut die Verbindung zum Arduino Nano mit CAN (MCP2515) aufbaut und dann ein oder mehrere logische welche entsprechend die CAN Nodes abbilden. Wie Du das bei einem 8 fach Taster machst ist Dir überlassen. Kannst ja die Node als logisches Device abbilden und die Relais als Channel wie bei Homemmatic.


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://paypal.me/pools/c/8gULisr9BT
FHEM GitHub: https://github.com/fhem/
kein Support für cfg Editierer

Offline sn0000py

  • Developer
  • Full Member
  • ****
  • Beiträge: 210
Antw:Neues Modul entwicklen
« Antwort #3 am: 03 September 2019, 14:29:00 »
Okay danke, werde mir das mal anschauen.
Die Hardware habe ich schon fertig und läuft zum Teil schon, bis vor kurzem dachte ich das ich mit einem keinen Windows Programm (delphi/Pascel) das ganze in ein MQTT schieben werden.

Nur so spare ich mir den Windows Rechner .

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 21113
Antw:Neues Modul entwicklen
« Antwort #4 am: 03 September 2019, 15:05:31 »
Zitat
Nur so spare ich mir den Windows Rechner .
Eine "Seriell nach MQTT Konvertierung" duerfte auf dem Linux Rechner auch nicht so schwer sein, selbst in dem Microcontroller ist das machbar.
Alternativ baust Du ein weiteres IO-Modul fuer MQTT2_DEVICE :)
Zustimmung Zustimmung x 1 Liste anzeigen

Offline sn0000py

  • Developer
  • Full Member
  • ****
  • Beiträge: 210
Antw:Neues Modul entwicklen
« Antwort #5 am: 04 September 2019, 11:05:30 »
Hallo hier mal ein kurzer ausschnitt aus dem umgebauten Code den ich nicht verstehe

sub Ready($) {
  my $hash = shift;
  Log3 ("TEST",5,"Ready ".(defined($hash->{USBDev}))." ... ".$hash->{USBDev});
  return DevIo_OpenDev($hash, 1, "CANGATEWAY::Init") if($hash->{STATE} eq "disconnected");
    if(defined($hash->{USBDev})) {
    my $po = $hash->{USBDev};
    my ( $BlockingFlags, $InBytes, $OutBytes, $ErrorFlags ) = $po->status;
  Log3 ("TEST",5,"Ready InBytes ".$InBytes);
    return ( $InBytes > 0 );
    }
}
sub Read($) {

  my ($hash) = @_;
  my $name = $hash->{NAME};

  my $buf = DevIo_SimpleRead($hash);
  Log3 ("TTT", 1, "READ ".$hash." ... ".$buf." .. ".(defined($buf)));
  return "" if(!defined($buf));

  my $data = $hash->{PARTIAL};
  Log3 ($name, 4, "CANGATEWAY/RAW: $data/$buf");
  $data .= $buf;

Im Log bekomme ich beim connecten ein

2019.09.04 11:00:03 5: Start
2019.09.04 11:00:03 3: CANGateway: unknown attribute stateFormat. Type 'attr CANGateway ?' for a detailed list.
2019.09.04 11:00:03 3: Opening CANGateway device COM10
2019.09.04 11:00:03 3: Setting CANGateway serial parameters to 115200,8,N,1
2019.09.04 11:00:03 5: Init
2019.09.04 11:00:03 5: Starting notify loop for CANGateway, 1 event(s), first is connection: connected
2019.09.04 11:00:03 5: createNotifyHash
2019.09.04 11:00:03 5: End notify loop for CANGateway
2019.09.04 11:00:03 3: CANGateway device opened

sieht schon mal gut aus, und die COM10 ist auch gesperrt für REalTerm zB

dann werden der Reihe nach die ready Funktionen aufgerufen
2019.09.04 11:00:05 5: Ready 1 ... Win32::SerialPort=HASH(0x43f5738)
2019.09.04 11:00:05 5: Ready InBytes 0
2019.09.04 11:00:05 5: Ready 1 ... Win32::SerialPort=HASH(0x43f5738)
2019.09.04 11:00:05 5: Ready InBytes 0
2019.09.04 11:00:05 5: Ready 1 ... Win32::SerialPort=HASH(0x43f5738)
2019.09.04 11:00:05 5: Ready InBytes 15
2019.09.04 11:00:05 1: READ HASH(0x39c0d28) ...  ..
2019.09.04 11:00:05 5: Ready 1 ... Win32::SerialPort=HASH(0x43f5738)
2019.09.04 11:00:05 5: Ready InBytes 15

Sieht auch gut aus, und die InBytes werden wenn was kommt erhöht
doch das Read das das DevIo_SimpleRead aufruft, bekommt keinen $buf zurück
2019.09.04 11:02:09 1: READ HASH(0x39c0d28) ...  ..


Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 22622
Antw:Neues Modul entwicklen
« Antwort #6 am: 04 September 2019, 11:19:05 »
Gib mal bitte noch ein list vom Device dazu.
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://paypal.me/pools/c/8gULisr9BT
FHEM GitHub: https://github.com/fhem/
kein Support für cfg Editierer

Offline sn0000py

  • Developer
  • Full Member
  • ****
  • Beiträge: 210
Antw:Neues Modul entwicklen
« Antwort #7 am: 04 September 2019, 11:23:18 »
Internals:
   CFGFN     
   DEF        COM10@115200
   DeviceName COM10@115200
   NAME       CANGateway
   NOTIFYDEV  global
   NR         55
   NTFY_ORDER 50-CANGateway
   PARTIAL   
   STATE      opened
   TYPE       CANGATEWAY
   ack        0
   inclusion-mode 0
   outstandingAck 0
   READINGS:
     2019-09-04 11:15:12   connection      connected
     2019-09-04 11:15:12   state           opened
Attributes:
   verbose    5

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 22622
Antw:Neues Modul entwicklen
« Antwort #8 am: 04 September 2019, 11:46:37 »
Passt soweit. Kenne mich aber nicht mit Windows aus.

$buf scheint in der Tat leer zu sein. Sprich ohne Daten.Entweder kennt jemand anderes einen Grund oder eine Möglichkeit zu debuggen oder Du schreibst extra Logs in DevIo  :)
Leider habe ich es damals versäumt mir DevIo genauer an zu schauen. Ich schreibe mein Netzwerkhändling immer selbst.
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://paypal.me/pools/c/8gULisr9BT
FHEM GitHub: https://github.com/fhem/
kein Support für cfg Editierer

Offline sn0000py

  • Developer
  • Full Member
  • ****
  • Beiträge: 210
Antw:Neues Modul entwicklen
« Antwort #9 am: 04 September 2019, 12:09:43 »
hmmm laos in der DevIo.pm

sub
DevIo_DoSimpleRead($)
{
  my ($hash) = @_;
  my ($buf, $res);

  if($hash->{USBDev}) {
    $buf = $hash->{USBDev}->input();
Log3 "DevIO", 3, "SimpleRead (".$buf.")";


geht er in diese funktion rein, und da ist der buf schon undef

und ich habe mir in der ready funktion die anderen status sachen ausgeben lassen

my ( $BlockingFlags, $InBytes, $OutBytes, $ErrorFlags ) = $po->status;
    Log3 ($hash->{NAME},5,"Ready InBytes ".$BlockingFlags.", ".$InBytes.", ".$OutBytes.", ".$ErrorFlags);
2019.09.04 12:09:01 5: Ready InBytes 0, 873, 0, 0

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 22622
Antw:Neues Modul entwicklen
« Antwort #10 am: 04 September 2019, 12:25:52 »
Dann muss da bitte ein anderer Entwickler mal schauen. Mit mehr Überblick. Sorry
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://paypal.me/pools/c/8gULisr9BT
FHEM GitHub: https://github.com/fhem/
kein Support für cfg Editierer

Offline sn0000py

  • Developer
  • Full Member
  • ****
  • Beiträge: 210
Antw:Neues Modul entwicklen
« Antwort #11 am: 04 September 2019, 12:28:39 »
eine andere Frage hätte ich noch, wie kann ich eigentlich noch.

Wie kann ich so eine variable eigentlihc per log ausgeben also zB sowas
    my ( $BlockingFlags, $InBytes, $OutBytes, $ErrorFlags ) = $po->status;
Log3 ($hash->{NAME},5,pp($po->status));
das $po->status
wenn ich es einfach so ausgebe steht da 4
habe es schon mit Dumper und co versucht.

und kann ich auch heruasfinden was das $po->status ist, also welcher Variablen Typ (hash array oder co)

Offline sn0000py

  • Developer
  • Full Member
  • ****
  • Beiträge: 210
Antw:Neues Modul entwicklen
« Antwort #12 am: 04 September 2019, 12:37:59 »
so, nun geht schon mal was ....

da gibts anscheinende ein bekanntest problem mit dem Win32:Serialport unter 64 Bit

https://forum.fhem.de/index.php/topic,98442.msg917824.html#msg917824

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 8152
  • eigentlich eher user wie "developer"
Antw:Neues Modul entwicklen
« Antwort #13 am: 04 September 2019, 12:48:03 »
eine andere Frage hätte ich noch, wie kann ich eigentlich noch.
[...]
und kann ich auch heruasfinden was das $po->status ist, also welcher Variablen Typ (hash array oder co)
Das muss ein Array sein, sonst würde die Zuweisung der Variablen (my ( $BlockingFlags, $InBytes, $OutBytes, $ErrorFlags ) = $po->status;) nicht funktionieren. Ansonsten kann ich mich CoolTux nur anschließen: der Code an sich sieht passend aus.

Generell tust du dir vermutlich leichter, wenn du entweder ein Linux zum Testen verwendest (ist einfach gängiger), oder ein 32bit-Perl@Windows.

Eine "Seriell nach MQTT Konvertierung" duerfte auf dem Linux Rechner auch nicht so schwer sein, selbst in dem Microcontroller ist das machbar.
Alternativ baust Du ein weiteres IO-Modul fuer MQTT2_DEVICE :)
MQTT2_DEVICE als Client-Modul zu nutzen, finde ich übrigens auch eine klasse Idee! Kann sehr leicht konfiguriert werden...

(MYSENSORS_DEVICE ginge vermutlich ähnlich einfach; das hat den Vorteil, dass es gewisse Datentypen "von Haus aus kennt" - da ist alles nummerisch in der Message-Struktur hinterlegt, hat aber den Nachteil, dass man dieselbe Node/Child-Logik verwenden müßte, das ist in MQTT2_DEVICE völlig flexibel).
Server: HP-T620@Debian 10, aktuelles FHEM + ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN
svn:MySensors, WeekdayTimer, AttrTemplate => {mqtt2, mysensors, httpmod}

Offline sn0000py

  • Developer
  • Full Member
  • ****
  • Beiträge: 210
Antw:Neues Modul entwicklen
« Antwort #14 am: 04 September 2019, 13:09:32 »
Ja ich habe die Hardware samt Protokoll schon fertig, und möchte die nun auch so verwenden.

Mittlerweile bekomme ich schon Daten rein

Wie schreibt man sowas eigentlich schöner?
my $packetID = ord(substr($buf, 4, 1));
$packetID = ($packetID << 8) | ord(substr($buf, 3, 1));
$packetID = ($packetID << 8) | ord(substr($buf, 2, 1));
$packetID = ($packetID << 8) | ord(substr($buf, 1, 1));

Log3 ($name, 4, "Data : ".sprintf("%08x", $packetID));

Im $buf ist das erste Byte die länge und dann kommt ein integer.
rausbekommen tue ich es aber das muss auch schöner/eleganter gehen