AVR NET-IO mit Relaiskarte K8IO Eingänge lesen

1,093 views
Skip to first unread message

Armink

unread,
Aug 8, 2012, 5:37:20 AM8/8/12
to fhem-...@googlegroups.com
Hallo zusammen,

habe an einer, vom Fhem-Server weit entfernten Stelle, ein AVR NET-IO mit Relaiskarte K8IO von Pollin im Einsatz um den Zustand von Türen zu überprüfen (und diese im Bedarfsfall auch elektrisch öffnen zu können, dies ist hier aber nicht das Thema, das funktioniert schon). Auf der Relaiskarte sind auch Anschlussklemmen für 4 Eingänge (PA0..PA3 des AVR) vorhanden, an die ich Türkontakte anschliessen möchte. Habe in meiner classdef (contacts.classdef) folgenden Eintrag:  get ip cmd {"io set ddr 0 F0\nio get pin 0"} (warum die Maske F0 und nicht wie nach meinem Verständnis 0F für die 4 niederwertigen Bits sein muss hab ich nur durch Probieren herausgefunden)

in der fhem.cfg wird das ganze so definiert:

define NETIO_01 ECMD telnet 192.168.1.111:2701
attr NETIO_01 classdefs ONEWIRE=./FHEM/onewire.classdef:RELAIS=./FHEM/relais.classdef:CONTACT=./FHEM/contacts.classdef
attr NETIO_01 room hidden

desweiteren zum Testen folgender Eintrag:

define k_tuer1 ECMDDevice CONTACT 
attr k_tuer1 room Keller

zum einfachen Testen habe ich 4 von den Relaiskontakten (Schliesser) mit den 4 Eingängen verbunden, so dass ich die später vorhandenen Türkontakte simulieren kann. Wenn die Tür offen ist, liegt am entsprechenden Pin PAx (x = 0...3) high-Pegel an, wenn die Tür geschlossen ist low-Pegel.

wenn ich nun in die Kommandozeile (fhem) 

get k_tuer1 ip

eintippe bekomme ich als Antwort z.B.: ip: OK;port 0: 0x07.

wie komm ich da am Besten an die Zustände der einzelnen Bits ran um festzustellen ob ein Eingang high oder low bzw. die Tür auf oder zu ist, um dies in fhem zu visualisieren, bzw über FS20-angesteuerte LEDs zu visualisieren?
Per Assembler würde ich den zurückgelieferten Wert einfach mit einer entsprechenden Maske (0x01 für PA0 ... 0x08 für PA3) "ver-und-en" und schauen ob das Ergebnis von Null verschieden ist, aber in Perl scheint mir das (zumindest für mich als Perl-Anfänger ("Einführung in Perl" für meinen Kindle ist gerade gekauft worden)) ziemlich kompliziert.

Hat jemand einen Schubs in die richtige Richtung parat? Über Suchfunktion/Wiki hab ich leider nichts gefunden.
Bin für jeden "Schubs" dankbar.

Grüße aus Heidelberg
Armin 

JoWiemann

unread,
Aug 8, 2012, 6:00:32 AM8/8/12
to fhem-...@googlegroups.com
Hallo Armin,
 
 
Grüße
 
Jörg

Armink

unread,
Aug 8, 2012, 7:33:03 AM8/8/12
to fhem-...@googlegroups.com

Hallo Jörg,

 vielen Dank für den Tipp, bin ich auch schon einmal drüber gestolpert hab dann aber den Baum (vor lauter Wald drum rum) nicht erkannt…ich lass das mal wirken bin mir aber nicht sicher ob ich das so einfach hinkriege….

Portstatus nach Binär umwandeln (ohne printf?) dann ausparsen (wie auch immer) müsste eigentlich klappen….mal sehen...ich berichte

Totte1210

unread,
Nov 2, 2012, 10:27:35 AM11/2/12
to fhem-...@googlegroups.com
Hallo Armin,

ich habe ähnliches vor wie du.
Kannst du deine classdef für die Abfrage der Eingänge und deine Definitionen aus der fhem.cfg posten?

beste Grüße

Thorsten

Armink

unread,
Nov 2, 2012, 12:23:58 PM11/2/12
to fhem-...@googlegroups.com
Hallo Jörg,

habe es (wenn auch sicher sehr umständlich, hoffentlich schlägt mich niemend) hinbekommen und zwar so:

Meine contacts.classdef:

get ip01 cmd {"io set ddr 0 F0\nio get pin 0"}
get ip01 postproc {\
my $retval = "closed";\
my $ipwert=substr($_, 13, 2);\
  $ipwert = hex($ipwert) & 0x01;\
$retval = "open" if ($ipwert > 0);\
 \
 $retval;\
 }

get ip02 cmd {"io set ddr 0 F0\nio get pin 0"}
get ip02 postproc {\
my $retval = "closed";\
my $ipwert2=substr($_, 13, 2);\
  $ipwert2 = hex($ipwert2) & 0x02;\
$retval = "open" if ($ipwert2 > 0);\
 \
 $retval;\
 }
get ip03 cmd {"io set ddr 0 F0\nio get pin 0"}
get ip03 postproc {\
my $retval = "closed";\
my $ipwert3=substr($_, 13, 2);\
  $ipwert3 = hex($ipwert3) & 0x04;\
$retval = "open" if ($ipwert3 > 0);\
 \
 $retval;\
 }
get ip04 cmd {"io set ddr 0 F0\nio get pin 0"}
get ip04 postproc {\
my $retval = "closed";\
my $ipwert4=substr($_, 13, 2);\
  $ipwert4 = hex($ipwert4) & 0x08;\
$retval = "open" if ($ipwert4 > 0);\
 \
 $retval;\
 }

Die Definition dazu in der fhem.cfg:

define NETIO_01 ECMD telnet 192.168.1.111:2701
attr NETIO_01 classdefs RELAIS=/usr/share/fhem/FHEM/relais.classdef:CONTACT=/usr/share/fhem/FHEM/contacts.classdef
attr NETIO_01 room hidden

Dann am Beispiel einer Tür, deren Reedkontakt an Eingang 1 angeschlossen ist:

define k_tuer1 ECMDDevice CONTACT
attr k_tuer1 room Haus

dazu ein Status-Dummy:

define k_tuer1_stat dummy
attr k_tuer1_stat loglevel 6
attr k_tuer1_stat room hidden


das notify ist zweigeteilt, damit nur auf Statusänderungen reagiert wird:
Teil 1:
define act_on_k_tuer1 notify k_tuer1 {\
 if ("%" eq "ip01: closed") {\
   fhem("set k_tuer1_stat off")\
   }\
   else {\
   fhem("set k_tuer1_stat on")\
 }\
}
Teil2:
define act_k_tuer1_stat notify k_tuer1_stat {\
 if ("%" eq "on") {\
    if ($value{sa_7} eq "off") {\
               fhem("set sa_7 on")\
        }\
   }\
   else {\
    if ($value{sa_7} eq "on") {\
               fhem("set sa_7 off")\
        }\
 }\
}

sa_7 ist bei mir ein Kanal eines FS20 S8M, an den eine LED angeschlossen ist. Steht die Tür länger als 2 Minuten auf, geht sie an.

Damit die Eingänge auch alle zwei Minuten gelesen werden ist noch folgender Eintrag in die fhem.cfg notwendig:

define k_tuer1_check at +*00:02:00 get k_tuer1 ip01
attr k_tuer1_check loglevel 6

Hatte noch keine Zeit dies zu verbessern und zu dokumentieren, deshalb bislang auch noch keine Info dazu. Ich hoffe das hilft Dir, falls Du noch Fragen hast, einfach melden!

Grüße aus Heidelberg
Armin

Totte1210

unread,
Nov 2, 2012, 3:33:41 PM11/2/12
to fhem-...@googlegroups.com
Danke. Ich werde das auch mal testen!

beste Grüße

Thorsten

Totte1210

unread,
Nov 3, 2012, 11:16:03 AM11/3/12
to fhem-...@googlegroups.com
Läuft ohne Probleme!

Armink

unread,
Nov 7, 2012, 8:15:27 AM11/7/12
to fhem-...@googlegroups.com
Na prima! Freut mich! Falls einer der Profis hier auch mal Eingänge über das NETIO lesen möchte, können wir darauf hoffen das das Ganze noch ein bisschen vereinfacht oder aufgehübscht wird....

Gruss
Armin
Reply all
Reply to author
Forward
0 new messages