PLCBUS ansteuern

Begonnen von eddi79, 26 Mai 2015, 12:35:28

Vorheriges Thema - Nächstes Thema

eddi79

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

Dr. Boris Neubert

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
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

eddi79

Danke für den Tipp.
Da werd ich mich mal etwas einlesen.

eddi79

#3
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


Dr. Boris Neubert

http://perldoc.perl.org/perlnumber.html
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

eddi79

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

eddi79

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

Dr. Boris Neubert

Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

eddi79

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

eddi79

Oder bin ich grad total auf dem holzweg ? :(

Dr. Boris Neubert

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
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

eddi79

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

Dr. Boris Neubert

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
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Klaus0815

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

eddi79

#14
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