Pollin AVR-NET-IO und 8-Kanal Relaiskarte K8IO Relaisstatus abfragen

Begonnen von Heffa, 10 Januar 2016, 13:53:54

Vorheriges Thema - Nächstes Thema

Heffa

Hallo,

ich habe in mein System die AVR-NET-IO K8IO eingebunden und alles klapp wie am Schnürchen, (Relais Schalten, ADC Abrfgen).

Jetzt habe ich jedoch noch eine Herausforderung zu bewältigen.
Ich habe seit tagen das Netz nach eine Lösung durchgesucht, leider ohne Erfolg.

Ich möchte gerne den Status (ON / OFF) eines Relais abfragen, um weitere Abhängigkeiten je nach Status zu beeinflussen.

Alles wes ich bisher gefunden habe ist wie man die Relais ein und ausschaltet.

Für Ideen / Lösungen wäre ich sehr dankbar.

Danke

Heffa


Klaus0815

Du schaltest doch die Relais nur aus FHEM aus ? Oder hast Du noch andere Schalter angeschlossen ?
FHEM weiss doch dann den Zustand der Relais schon ?

Heffa

Ja das stimmt schon. Beim Neustart des Systems würde ich gerne den Status aktualisieren bevor etwas geschaltet wurde, manche Relais schlten sehr selten.
Ich würde auch gerne den Status in diversen "if" Abfragen verwenden.

Heffa

Gesendet von meinem SM-G900F mit Tapatalk


alexus

Hallo,

ich nehme mal an, Du hast den AVR-NET-IO über ECMD in FHEM eingebunden?
http://www.fhemwiki.de/wiki/AVR-NET-IO
In Deiner fhem.cfg kannst Du für jedes Releais ein Device erstellen (IP-Adresse bitte ergänzen):
define netsw ECMD telnet xxx.xxx.xxx.xxx:50290
attr netsw classdefs relais=/opt/fhem/relais.classdef
define myRelais ECMDDevice relais 1


Falls keine Ethersex-Firmware aufgespielt wurde, müsste man für die Relais eine Datei "relais.classdef" erstellen, ungefähr so:
# Uebergabeparameter AVR-NET-IO Port
params RelaisPort
set on cmd {"SETPORT %RelaisPort.1\n"}
set on expect "ACK\n"
set off cmd {"SETPORT %RelaisPort.0\n"}
set off expect "ACK\n"
get state cmd {"GETPORT %RelaisPort\n"}
get state expect "ACK\n"


Nun müsstest Du über "get myRelais state" den Zustand des AVR-NET-IO abfragen können...
:D

Heffa

Hallo alexus,
danke für die Hinweise. Ich habe Ethersex drauf und somit sieht meine relais.classdef etwas anders aus. Ich habe verucht dort den Eintrag get state einzubauen, bekomme es aber nicht hin.

Heffa

Hallo alexus,

so sieht meine relais.classdef aus:



# Uebergabeparameter HEX Adresse Port
params RelaisPort

#  erst alle Ports PC.. auf Ausgang setzten und dann per Hexcode schalten
set on cmd {"io set ddr 2 ff\n\000io set port 2 %RelaisPort %RelaisPort\n"}
set on expect "OK\n"
set on postproc {s/([OK\n|;]*)/success/; "$_" eq "success" ? "ok" : "error";}
set off cmd {"io set ddr 2 ff\n\000io set port 2 00 %RelaisPort\n"}
set off expect "OK\n"
set off postproc {s/([OK\n|;]*)/success/; "$_" eq "success" ? "ok" : "error";}

get state cmd {"io get ddr 2 ff\n\000io get port 2 00 %RelaisPort\n"}
get state expect "OK\n"
get state postproc {s/([on\n|;]*)/success/; "$_" eq "success" ? "on ok" : "off ok";}


Die beiden set on / off funktionieren super.
Den untere Block ist mein Versuch den Status abzufragen. In der .cfg habe ich folgendes stehen:


define Feger ECMDDevice RELAIS 08
attr Feger room Heizung
attr Feger group 1_Relais
attr Feger sortby 4

get Feger state


In der Oberfläche steht dann:

Feger       state off ok         on         off

Also bekomme ich "state off ok" zurück und nicht "on ok"

Bei der direkten Abfrage mit

http://192.168.xxx.xxx/ecmd?pin get RELAIS4

bekomme ich

on

zurück, also sollte die "get Feger state" wenigstens den anderen falschen Status "state on ok" liefern und nicht off, hatte ich erwartet.  >:(
Bin halt noch nicht so Firm mit PERL.

Gruß
Heffa

alexus

Hallo Heffa,

da ich die Original-Firmware nutze, kann ich es nicht ausprobieren.
Wenn aber Deine direkte Abfrage funktioniert
http://192.168.xxx.xxx/ecmd?pin get RELAIS4
was mich etwas wundert, denn RELAIS4 ist ja keine Adresse?!?
Probier doch dann einfach mal
get state cmd {"pin get RELAIS%RelaisPort\n"}
get state expect "OK\n"

Wäre fast zu einfach...  ::)

larrysteward

Hallo Heffa,

ist der Befehl an deinen Net-IO wirklich
http://192.168.xxx.xxx/ecmd?pin get RELAIS4

Gemäß ECMD Befehlsreferenz gibt es für Port I/O nur die Befehle "io get" und "io set" wie es auch oben in deiner classdef benutzt wird. Wenn ich "pin get 3" (z.B.) an Ethersex schicke kriege ich ein parse error zurück während io get pin 3 das gewünscht Ergebnis in hexadezimaler Schreibweise ergibt.

Zum Abfragen der Ports schau die bitte nochmal das Wiki unter digitale Eingänge an. Habe ich erst diese Woche ergänzt und ist eventuell das was du zur Abfrage suchst.

Gruß,
Larry
Raspberry Pi 2 B mit Raspberry Pi OS + FHEM, 2 x NET-IO mit Ethersex, nanoCUL433 und nanoCUL868 mit culw
e3q MAX! Thermostate, MAX! Fensterkontakte, Intertechno Funksteckdosen, HMIP-Geräte via Raspberrymatic, Tasmota geflashte Sonoff-Zwischenstecker

Heffa

Hallo,

da habe ich mich etwas falsch ausgedrückt. :(

Der Befehl:

http://192.168.xxx.xxx/ecmd?pin get RELAIS4


habe ich in meine Browser ausgeführt, nicht in FHEM. Dient für mich als Kontrolle direkt mit dem AVR-NET-IO zu kommunizieren.
Das die Abfrage in FHEM anders aussehen muss ist mir schon klar.  ;)

Ich werde mir das Wiki nochmals anschauen.

Danke

larrysteward

Hallo Heffa,

ich hatte dich schon richtig verstanden, allerdings nicht an die Named Pin-Unterstützung von Ethersex gedacht, die ich bei mir auch gar nicht aktiviert habe.

Gruß,
Larry
Raspberry Pi 2 B mit Raspberry Pi OS + FHEM, 2 x NET-IO mit Ethersex, nanoCUL433 und nanoCUL868 mit culw
e3q MAX! Thermostate, MAX! Fensterkontakte, Intertechno Funksteckdosen, HMIP-Geräte via Raspberrymatic, Tasmota geflashte Sonoff-Zwischenstecker

Heffa

Hallo Larry,

ich habe die io.classdef angelegt. Die muss ich doch bestimmt auf in der .cfg einbinden, oder?

Wie muss der Eintrag aussehen?

Sollte doch hier:

attr NETIO_01 classdefs ONEWIRE=.\opt\onewire.classdef:RELAIS=.\opt\relais.classdef:ADC=.\opt\netioadc.classdef

mit eingetragen werden, oder?

Wie verwende ich dann den "get" in der .cfg mit meien Definition Feger?


define Feger ECMDDevice RELAIS 08
attr Feger room Heizung
attr Feger group 1_Relais
attr Feger sortby 4


Gruß
Heffa

larrysteward

Hallo Heffa,

ja, theoretisch sollte die Einbindung dann so aussehen:attr NETIO_01 classdefs ONEWIRE=.\opt\onewire.classdef:RELAIS=.\opt\relais.classdef:ADC=.\opt\netioadc.classdef:IO=.\opt\io.classdef

Aber eigentlich kannst du die Abfrage ja innerhalb deiner RELAIS.classdef erledigen.

# Uebergabeparameter HEX Adresse Port
params RelaisPort

#  erst alle Ports PC.. auf Ausgang setzten und dann per Hexcode schalten
set on cmd {"io set ddr 2 ff\n\000io set port 2 %RelaisPort %RelaisPort\n"}
set on expect "OK\n"
set on postproc {s/([OK\n|;]*)/success/; "$_" eq "success" ? "ok" : "error";}
set off cmd {"io set ddr 2 ff\n\000io set port 2 00 %RelaisPort\n"}
set off expect "OK\n"
set off postproc {s/([OK\n|;]*)/success/; "$_" eq "success" ? "ok" : "error";}

get state cmd {"io get pin 2\n"}    # Pin 2 = Port C
get state expect ".*"
get state postproc {\
my $hex = "$_";\
$hex =~ s/port 2: //;\
$hex =~ s/\n//;\
my $dez = hex($hex);\
my $retval = $dez & %RelaisPort;\      # hier wird der einzelne Pin abgefragt, zurück solltest du 0 oder die Portnummer bekommen
}


Probier das erstmal aus. Der Rückgabewert ist zwar nicht on oder off, aber wenn es bis hierher funktioniert, kannst du das Ergebnis ja noch weiter formatieren.

Gruß,
Larry
Raspberry Pi 2 B mit Raspberry Pi OS + FHEM, 2 x NET-IO mit Ethersex, nanoCUL433 und nanoCUL868 mit culw
e3q MAX! Thermostate, MAX! Fensterkontakte, Intertechno Funksteckdosen, HMIP-Geräte via Raspberrymatic, Tasmota geflashte Sonoff-Zwischenstecker

Tueftler1983

Hallo sorry wenn ich mich einklinke aber funktioniert das schalten der relais noch in fhem? Bei mir lief es ein jahr lang ohne Probleme jetzt kann ich seid ca 16 Januar kein Relais mehr schalten. Via telnet geht und wenn ich in der relais.classdef den Befehl :io set ddr 2 ff\n\000 bis dahin rausnehme klappt das schalten wieder bis zu einem Neustart von dem avr net io.
Dann muss :io set ddr 2 ff\n\000 erst wieder 1 mal ausgeführt werden kann mir jemand sagen woran es liegt?

Meine relais.classdef sieht derzeit so aus.
#Uebergabeparameter HEX Adresse Port
params RelaisPort
# erst alle Ports PC.. auf Ausgang setzen und dann per Hexcode schalten
set on cmd {"io set port 2 %RelaisPort %RelaisPort\n"}
set on expect "OK\n"
set on postproc {s/([OK\n|;]*)/success/; "$_" eq "success" ? "ok" : "error";}
set off cmd {"io set port 2 00 %RelaisPort\n"}
set off expect "OK\n"
set off postproc {s/([OK\n|;]*)/success/; "$_" eq "success" ? "ok" : "error";}

Tom_S

@Tueftler1983

hast du das, was ich dir unter "Sonstiges" zu deinem Beitrag geschrieben habe schon gemacht?
Das ist zwar der richtige Forumsbereich, aber nicht dein Thema.

LG
Tom_S
RaspberryPI2 + pilight, 3x AVR-NetIO, LW12, LW12HX, LW12FC; MAX-Lan, ESP8266, Arduino, H801, Neopixel, Solaredge, Modbus

Tueftler1983