Neues Modul entwicklen

Begonnen von sn0000py, 03 September 2019, 14:07:21

Vorheriges Thema - Nächstes Thema

sn0000py

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

Beta-User

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-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

CoolTux

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://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

sn0000py

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 .

rudolfkoenig

ZitatNur 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 :)

sn0000py

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) ...  ..



CoolTux

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://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

sn0000py

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

CoolTux

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://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

sn0000py

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

CoolTux

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://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

sn0000py

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)

sn0000py

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

Beta-User

Zitat von: sn0000py am 04 September 2019, 12:28:39
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.

Zitat von: rudolfkoenig am 03 September 2019, 15:05:31
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-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

sn0000py

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