FHEM Forum

FHEM - Hausautomations-Systeme => Sonstige Systeme => Thema gestartet von: eddi79 am 26 Mai 2015, 12:35:28

Titel: PLCBUS ansteuern
Beitrag von: eddi79 am 26 Mai 2015, 12:35:28
Hallo zusammen,
ich bin noch ziemlich neu hier und gerade dabei FHEM einzurichten.
Habe bisher ein paar HM Komponenten (Fensterkontakte, Funkschalter), welche super funktionieren.
Allerdings ist praktisch meine ganze Lichtsteuerung im Haus per PLCBUS realisiert. Wäre natürlich super, wenn man dieses System in FHEM einbinden könnte.
Es funktioniert vergleichbar mit dem X10 System
http://files.domoticaforum.eu/uploads/PLCBUS/plcbus-1141.pdf

In meinem Fall ist das PLCBUS Modem per Ethernet erreichbar und es klappt per Telnet z.B. über:
#!/bin/bash
echo -ne '\x02\x05\xFF\x02\x62\x64\x00\x03' | nc meine.ip.de 1000

Die HEX Zahlen sind der Befehl zum Ansteuern der Lampe.

Die Aktoren quittieren auch den Empfang und senden ein entsprechendes Kommando zurück - was jedoch im Moment nicht so wichtig wäre für mich.

Hat vielleicht jemand eine Idee wie man sowas angehen könnte (außer über jeden "Aktor" eine Batch aufzurufen welche das Kommando absetzt).

Bin für jeden Tipp dankbar
Markus
Titel: Antw:PLCBUS ansteuern
Beitrag von: Dr. Boris Neubert am 26 Mai 2015, 20:27:04
Hallo Markus,

schau Dir bitte mal ECMD/ECMDDevice an. Das ist das Schweizer Messer für Request-Reply-basierte Kommunikation mit Geräten über serielle oder Telnet-Verbindungen, für die es keine generischen Module in FHEM gibt. Im Wiki und im Forum findest Du auch haufenweise Praxisbeispiele.

Bitte Fragen zu ECMD im richtigen Forum stellen (diesem ;-) und den angehefteten Thread beachten.

Viel Erfolg
Boris
Titel: Antw:PLCBUS ansteuern
Beitrag von: eddi79 am 28 Mai 2015, 08:48:07
Danke für den Tipp.
Da werd ich mich mal etwas einlesen.
Titel: Antw:PLCBUS ansteuern
Beitrag von: eddi79 am 27 Juni 2015, 09:55:42
Guten Morgen,

habe nun etwas mit ECMD rumexperimentiert, allerdings komme ich irgendwie nicht weiter - vermutlich weil ich grad auf der Leitung stehe :-(.

Folgendes hab ich versucht:

in der fhem.cfg:

define myplc ECMD telnet 192.168.100.27:1000
set myplc classdef plc /opt/fhem/plc.classdef
define plcbus ECMDDevice plc

in der plc.classdef:
# definitions for on off
set on cmd {"\x02\x05\xFF\x02\x62\x64\x00\x03"}
set off cmd {"\x02\x05\xFF\x02\x63\x64\x00\x03"}

Wenn ich über die Linux Kommandozeile folgenden Befehl aufrufe schaltet mein PLC Modem das Licht problemlos (hier nur mal ein Gerät zum testen) ein:
echo -ne '\x02\x05\xFF\x02\x62\x64\x00\x03' | nc 192.168.100.27 1000

und bei folgendem wieder aus:
echo -ne '\x02\x05\xFF\x02\x63\x64\x00\x03' | nc 192.168.100.27 1000

Das Modem lässt sich also per Telnet direkt ansprechen. (Die HEX Zeichen geben an, welches Gerät z.B. an oder aus gehen soll)

In FHEM wird bei mir unter dem Punkt ECMD angezeigt myplc opened. Sollte also passen.

Wenn ich dann jedoch versuche z.B.
set plcbus on
oder set plcbus off
passiert gar nichts.

Jetzt hab ich noch was im Log gefunden:
Cmd: >set plcbus on<
2015.06.27 09:58:12 5: ECMDDevice: Analyze command >{\x02\x05\xFF\x02\x62\x64\x00\x03}<
2015.06.27 09:58:12 1: PERL WARNING: Backslash found where operator expected at (eval 259) line 1, near "x02\"
2015.06.27 09:58:12 3: eval: {\x02\x05\xFF\x02\x62\x64\x00\x03}
2015.06.27 09:58:12 1: PERL WARNING: Backslash found where operator expected at (eval 259) line 1, near "x05\"
2015.06.27 09:58:12 3: eval: {\x02\x05\xFF\x02\x62\x64\x00\x03}
2015.06.27 09:58:12 1: PERL WARNING: Backslash found where operator expected at (eval 259) line 1, near "xFF\"
2015.06.27 09:58:12 3: eval: {\x02\x05\xFF\x02\x62\x64\x00\x03}
2015.06.27 09:58:12 1: PERL WARNING: Backslash found where operator expected at (eval 259) line 1, near "x62\"
2015.06.27 09:58:12 3: eval: {\x02\x05\xFF\x02\x62\x64\x00\x03}
2015.06.27 09:58:12 1: PERL WARNING: Backslash found where operator expected at (eval 259) line 1, near "x64\"
2015.06.27 09:58:12 3: eval: {\x02\x05\xFF\x02\x62\x64\x00\x03}
2015.06.27 09:58:12 1: PERL WARNING: Backslash found where operator expected at (eval 259) line 1, near "x00\"
2015.06.27 09:58:12 3: eval: {\x02\x05\xFF\x02\x62\x64\x00\x03}
2015.06.27 09:58:12 5: myplc: sending command "syntax error at (eval 259) line 1, near "x02\\"\n"
2015.06.27 09:58:12 5: myplc: write "syntax error at (eval 259) line 1, near "x02\\"\n"
2015.06.27 09:58:12 5: SW: 73796e746178206572726f7220617420286576616c2032353929206c696e6520312c206e65617220227830325c220a
2015.06.27 09:58:12 5: Triggering plcbus (1 changes)
2015.06.27 09:58:12 5: Notify loop for plcbus on

Dürfte also an der Art wie ich den Hex-Code übertragen will liegen... :-( Nur wie mache ich es richtig.... ?


Was mache ich denn falsch ? Komm da einfach nicht weiter.

Schönes WE
Markus

Titel: Antw:PLCBUS ansteuern
Beitrag von: Dr. Boris Neubert am 27 Juni 2015, 10:40:01
http://perldoc.perl.org/perlnumber.html
Titel: Antw:PLCBUS ansteuern
Beitrag von: eddi79 am 27 Juni 2015, 14:15:19
Vielen Dank,

das hat mir schon mal sehr geholfen. Der Fehler ist weg. Allerdings habe ich nun folgendes im Log:

Cmd: >set plcbus on<
2015.06.27 14:09:12 5: ECMDDevice: Analyze command >{'0x02 0x05 0xFF 0x02 0x62 0x64 0x00 0x03'}<
2015.06.27 14:09:12 5: myplc: sending command "0x02 0x05 0xFF 0x02 0x62 0x64 0x00 0x03"
2015.06.27 14:09:12 5: myplc: write "0x02 0x05 0xFF 0x02 0x62 0x64 0x00 0x03"
2015.06.27 14:09:12 5: SW: 307830322030783035203078464620307830322030783632203078363420307830302030783033
2015.06.27 14:09:12 5: Triggering plcbus (1 changes)

Er sendet also die Zeichen 0x02 0c05 usw. Das Modem reagiert jedoch nicht. Liegt es daran, dass der nun "0x02" sendet statt dem jeweiligen HEX-Wert.
Irgendwie versteh ich nicht, wie ich die Hex-Zeichenkette so senden, dass diese auch ankommt.

In der classdef hab ich jetzt:
# definitions for on off
set on cmd {'0x02 0x05 0xFF 0x02 0x62 0x64 0x00 0x03'}
set off cmd {'0x02 0x05 0xFF 0x02 0x63 0x64 0x00 0x03'}


Danke
Markus
Titel: Antw:PLCBUS ansteuern
Beitrag von: eddi79 am 27 Juni 2015, 19:09:56
Soweit ich mein Problem jetzt eingrenzen konnte wird immer das ASCII Zeichen gesendet (bzw. die ASCII Zeichenkette), jedoch nicht der eigentlich HEX-Wert.
Ich komm einfach nicht drauf wie das gehen sollte.
In der Kommandozeile ist es so einfach.... 

echo -ne '\x02\x05\xFF\x02\x62\x64\x00\x03' | nc 192.168.100.27 1000

und genau diese Hex-Folge möchte ich über ECMD an die 192.168... senden. Nur bin ich zu blöd dafür :-(.

Schönen Abend
Markus
Titel: Antw:PLCBUS ansteuern
Beitrag von: Dr. Boris Neubert am 27 Juni 2015, 19:17:36
sprintf()

Grüße
Boris
Titel: Antw:PLCBUS ansteuern
Beitrag von: eddi79 am 27 Juni 2015, 22:10:54
Hallo,
Hab mir gerde sprintf unter http://perldoc.perl.org/functions/sprintf.html durchgelesen.

Wenn ich das richtig sehe muesste ich meine hex zeichenkette vor dem senden in die jeweiligen char umwandeln damit die den hex entsprechenden ascii zeichen gesendet werden.
Kann man das in der classdef unterbringen ? Da trete ich noch auf der stelle.

Schoenen abend
Titel: Antw:PLCBUS ansteuern
Beitrag von: eddi79 am 27 Juni 2015, 22:11:53
Oder bin ich grad total auf dem holzweg ? :(
Titel: Antw:PLCBUS ansteuern
Beitrag von: Dr. Boris Neubert am 27 Juni 2015, 22:28:25
Sorry, Du musst ja Binärdaten und nicht ASCII senden. Schau Dir daher bitte mal pack() an. Ist allerdings nicht trivial.

Am besten übst Du Perl auf der Kommandozeile. Perlverständnis ist das A und O für die fortgeschrittenen Funktionen, die Du brauchst. Es gibt gute Tutorials auf perldoc.org oder so.

Viele Grüße
Boris
Titel: Antw:PLCBUS ansteuern
Beitrag von: eddi79 am 28 Juni 2015, 07:12:15
Danke,
Pack liest sich wirklich wenig trivial...ich versuch mich mal einzuarbeiten.
Was mir nur noch nicht ganz klar ist, was ich in den "  " bei set on cmd eigentlich an ecmd übergen muss damit es richtig gesendet wird.
Erwartet ecmd eine ascii zeichenkette, also z.b. "hole temp ab" ? und sendet diese dann per telnet? Hier muesste bei mir ja dann die hex zeichenkette kommen... wenn ich aber die hex zeichen angebe kommen vermute ich mal die entsprechenden ascii zeichen an womit das modem nichts anfangen kann.
Gibt es keine moglichkeit einfach die hex direkt an mein modem zu senden?

Schoenen sonntag
Markus
Titel: Antw:PLCBUS ansteuern
Beitrag von: Dr. Boris Neubert am 28 Juni 2015, 08:48:07
Hallo,

was in {} steht, wird als Perl-Kode ausgewertet. Das ist wie eine Funktion, deren Rückgabewert dann exakt so von ECMD an das Gerät gesendet wird.

Dadurch kannst Du auch erst mal mit einem separaten Perl - Programm üben (statt echo bla | nc foo also perl bar.pl |nc foo).

Viel Erfolg
Boris
Titel: Antw:PLCBUS ansteuern
Beitrag von: Klaus0815 am 28 Juni 2015, 08:50:57
Falls es nur um ein paar Lampen geht und Du Dich nicht groß in Pack einarbeiten willst, lass doch einfach Deine Shell-Skripte bestehen und starte diese aus Fhem ?

Hier ein Beispiel:

http://forum.fhem.de/index.php?topic=17613.0 (http://forum.fhem.de/index.php?topic=17613.0)
Titel: Antw:PLCBUS ansteuern
Beitrag von: eddi79 am 28 Juni 2015, 16:26:11
Erst mal Danke für die Antworten.

Das mit den Shell Skripten ist derzeit meine Lösung und funktioniert auch. Da meine PLCBUS Module jedoch auch antworten (ob Sie geschaltet haben) wäre es halt perfekt wenn ich das auch in  FHEM sehen könnte (wobei das eher ein Zukunftsprojekt ist). Mit der Shell Lösung setze ich zwar den Schaltbefehl ab, hab jedoch keine Kontrolle, ob er auch ausgeführt wurde. Es geht im Prinzip um mein ganzes Haus (mit den Rollos sind das ca. 40 bis 50 Aktoren) :-(. Da wär es es auf Dauer doch Wert sich einzuarbeiten... fürchte ich ;-).

In der {} nach set on cmd kann ich also im Prinzip jeden Perl Code verwenden und das was z.B. eine Funktion zurückgibt senden ECMD raus. Ich muss mir also was basteln was meinen HEX Code so umwandelt, dass es auf der Empfängerseite wieder passt. Statt 02 (als ASCII) muss ja dann bei mir binär 0000 0010 ankommen... Wenn ich keinen Denkfehler hab.

Kann ich an ECMD eigentlich statt z.B. 123 auch eine Variable also $zahlen übergeben    set in cmd {$zahlen} klappte nicht. ?


Liebe Grüße
Markus
Titel: Antw:PLCBUS ansteuern
Beitrag von: eddi79 am 28 Juni 2015, 16:52:08
Hab jetzt nochmals etwas getestet indem ich bei set on cmd {chr(64)} einsetzte. Dann sendet er das @ zeichen wandelt also meinen Wert in das Zeichen um. Ich glaube das könnte der Weg (zumindest in die richtige Richtung sein) sein.
Was ich nicht hinbekomme ist chr(64), chr(66) ... also eine Reihe von zeichen zu senden. Hab überlegt pack(chr(64),chr(66)) zu machen, wobei soweit ich das verstehe pack ja nichts zurückgibt, sondern  ich schreiben müsste:   $variable=pack(chr(64), chr(65))    Wobei die Variable ja dann wieder nicht von ECMD gesendet wird.
Irgendwie blick ich das noch nicht so wirklich... :-(

Schönen Sonntag
Markus
Titel: Antw:PLCBUS ansteuern
Beitrag von: eddi79 am 28 Juni 2015, 17:05:13
Jetzt hab ich es geschafft mehrere chr() zu senden Ergebnis:
Log:
Cmd: >set plcbus on<
2015.06.28 17:02:29 5: ECMDDevice: Analyze command >{chr(2).chr(0).chr(255).chr(2).chr(99).chr(100).chr(0).chr(3)}<
2015.06.28 17:02:29 5: myplc: command split into 3 parts.
2015.06.28 17:02:29 5: myplc: sending command "\002"
2015.06.28 17:02:29 5: myplc: write "\002"
2015.06.28 17:02:29 5: SW: 02
2015.06.28 17:02:29 5: myplc: sending command "�\002cd"
2015.06.28 17:02:29 5: myplc: write "�\002cd"
2015.06.28 17:02:29 5: SW: ff026364
2015.06.28 17:02:29 5: myplc: sending command "\003"
2015.06.28 17:02:29 5: myplc: write "\003"
2015.06.28 17:02:29 5: SW: 03
2015.06.28 17:02:29 5: Triggering plcbus (1 changes)

Wieso splittet ECMD das Kommando in drei Teile ?

Mein Modem reagiert natürlich nicht...

Für heute geb ich auf :-(

LG
Markus
Titel: Antw:PLCBUS ansteuern
Beitrag von: eddi79 am 28 Juni 2015, 17:34:49
Nachdem ich in der 66_ECMD.pm den Seperator \000 durch \063 ersetzt habe. (was vermutlich nicht besonders schlau ist, aber jetzt mal funktioniert) Wird der String am Stück gesendet und das Modem reagiert wie gewünscht. Juhuuuuuu !!
Die eigentliche Arbeit kommt erst noch, aber zumindest ist das mal ein Anfang.

Dennoch ein Frage. Wie kann man eine Variable §zeichen an set on cmd {} übergeben ? set on cmd {§zeichen} geht nicht... :-(

Danke erst mal für die Hilfe.

Markus
Titel: Antw:PLCBUS ansteuern
Beitrag von: Dr. Boris Neubert am 28 Juni 2015, 19:30:49
Stichwort Parameter, siehe Commandref
bn
Titel: Antw:PLCBUS ansteuern Message seperated
Beitrag von: eddi79 am 26 Juli 2015, 18:12:16
Hallo zusammen,

erst mal danke für die Hilfe hier.
Im Moment funktioniert alles mit ECMD soweit... nur der RequestSperator - also das Aufteilen der Nachricht wenn diese ein bestimmtes Zeichen enthält macht mir Probleme. :-(
Kann man dies irgendwie ganz abschalten ? (ggf. eine Änderung in der 66_ECMD.pm  - nur ist diese zu komplex für mich :-( ?  (Hier habe ich zwar meinen eigenen Seperator eingesetzt - allerdings finde ich kein Zeichen, welches in keiner der Nachrichten vorkommt). Somit wird immer wieder eine Nachricht getrennt und mein Modem kann sie nicht entziffern.

Wäre super wenn hier jemand einen Tip hätte wie ich diese (sicher für andere Zwecke sinnvolle) Funktion von ECMD abschalten könnte.

Danke
Markus
Titel: Antw:PLCBUS ansteuern
Beitrag von: Dr. Boris Neubert am 26 Juli 2015, 18:46:26
Hallo Markus,

man kann de RequestSeparator nicht abschalten. Das ist eine Lücke im ECMD.

Ich werde das in der nächsten Version wie folgt ändern:
- Wenn das Attribut RequestSeparator nicht gesetzt ist, findet keine Separierung des Requests statt.
- Standardmäßig wird beim Define das Attribut auf \000 gesetzt (Abwärtskompatibilität).
- deleteattr löscht es dann, wenn man es nicht haben will.

Du kannst in der Zwischenzeit requestSeparator auf eine Zeichenfolge setzen, die wahrscheinlich nie in Deiner Sendung vorkommt, z.B.

attr DeinECMD requestSeparator IchkommenieineinerSendungvor

Viele Grüße
Boris
Titel: Antw:PLCBUS ansteuern
Beitrag von: Dr. Boris Neubert am 01 August 2015, 11:53:41
Hallo Markus,

kannst Du bitte die beigefügte Version von ECMD bei Dir testen?

Wenn Du das Attribut requestSeparator mit deleteattr explizit löschst, wird Dein Request nicht mehr aufgetrennt.

Viele Grüße
Boris
Titel: Antw:PLCBUS ansteuern
Beitrag von: kermitthefrog am 06 Oktober 2016, 17:08:52
Hallo,
läuft PLCBus Variante denn nun umfangreich, d.h. auch mit Empfang/Feedback vom Aktor?
Ich überlege auf PLC Bus umzustellen.
Titel: Antw:PLCBUS ansteuern
Beitrag von: eddi79 am 12 Oktober 2016, 17:07:05
Hallo,
sorry für die lange Abwesenheit :-( Komme einfach kaum zu was im Moment. PLC-Bus funktioniert sehr gut über FHEM. Nur die Antworten der Module kann ich noch nicht auswerten - was wohl an mir liegt (aber da diese zu 99% zuverlässig schalten, kann ich erst mal damit leben).
Die geänderte ECMD Version hatte ich ganz übersehen - muss ich noch testen. Trau mir nur im Moment nochts umstellen, da alles soweit gut läuft -  mach ich aber sobald es geht (bzw. ich den Mut dazu habe) :-).

LG
Markus