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
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 ?
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
Hallo,
ich nehme mal an, Du hast den AVR-NET-IO über ECMD in FHEM eingebunden?
http://www.fhemwiki.de/wiki/AVR-NET-IO (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
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.
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
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... ::)
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
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
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
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
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
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";}
@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
Habe ich noch nicht gesehen... melde mich gleich
@larrysteward
ist auf jeden Fall der richtige Ansatz. Das $dez brauchst du nicht extra und dann noch in on und off umwandeln
my $hex = "$_";\
$hex =~ s/port 3: //;\
$hex =~ s/\n//;\
my $retval = (hex($hex) & 0x%RelaisPort) > 0 ? "on" : "off" ;\
LG
Tom_S
Hallo Tom_S,
meine Originalaufgabenstellung ist einen Schritt größer, da meine Schaltung eine 1 für aus und 0 für an ergibt. Darum habe ich eine Krücke gebastelt, die mit der Addition von 18446744073709551614 nicht gerade elegant aussieht. Hast du dafür auch einen Verschlankungsvorschlag?
get read cmd {"io get pin 0\n"}
get read expect ".*" #"port 0: 0x\d+\n"
get read postproc {\
my $hex = "$_";\
$hex =~ s/port 0: //;\
$hex =~ s/\n//;\
my $dez = hex($hex);\
my $var = $dez & 1;\
$var += 18446744073709551614;\
my $retval = ~$var;\
}
Gruß,
Larry
also wenn ich das richtig verstanden habe, dann brauchst du in der Zeile
my $retval = (hex($hex) & 0x%RelaisPort) > 0 ? "on" : "off" ;\
nur on und off vertauschen. Dann ist > 0 off und 0 on.
LG
Das Leben kann so einfach sein.
Vielen Dank!
Gruß,
Larry
Hallo zusammen,
habe jetzt endlich wieder Zeit mich um das Thema zu kümmern.
Viele Dank für eure Unterstützung.
Die Abfrage klappt jetzt grundsätzlich.
Sieht jetzt so 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 pin 2\n"} # Pin 2 = Port C
get state expect ".*"
get state postproc {\
my $hex = "$_";\
$hex =~ s/port 2: //;\
$hex =~ s/\n//;\
my $retval = (hex($hex) & 0x%RelaisPort) > 0 ? "on" : "off" ;\
}
Leider bin ich noch zu unerfahren um das Ergebnis (status on, status off) was ich zurück bekomme, in ein (on, off) zu verwandeln, damit das Icon richtig angezeigt wird.
Für einen Hinweis wie ich das machen muss wäre ich sehr dankbar.
Gruß
Heffa
Hallo,
die Abfrage klappt jetzt dank eure Hilfe.
Jetzt habe ich nur noch das Problem mit der Antwort state on / state off. Damit wird das Icon nicht richtig dargestellt.
Hat jemand eine Idee wie ich die Antwort state on in on wandeln kann?
Danke
Heffa
Gesendet von meinem GT-P7501 mit Tapatalk
Hallo,
ich habe jetzt folgendes jetzt folgendes gemacht damit das Icon auch richtig dargestellt wird.
define FegerLampe at +*00:00:01 { if (fhem("get Feger state") eq "state on") { fhem("set Feger on") } else { fhem("set Feger off") } }
Das funktioniert zwar aber ich suche nach eine Lösung wo die Relais nicht geschaltet werden sondern nur das Icon richtig dargestellt wird.
Der Befehl "get Feger state" liefert "state on / state off" und der Befehl "set Feger on" liefert "on ok".
Ich versuche jetzt das "state on" in "on ok" zu wandeln, damit das Icon richtig dargestellt wird.
Ich habe schon einige Sachen probiert, hat aber alles nicht geklappt.
Hier sind zwei versuche:
das hier klappt nicht
attr Feger eventMap { dev=>{"state on"=>"on ok"}, dev=>{"state off"=>"off ok"} }
das auch nicht (hier blinkt manchmal das Icon auf, wird aber wieder vom "state on" überschrieben
define FegerLampe at +*00:00:01 { if (fhem("get Feger state") eq "state on") { fhem("setstate Feger on") } else { fhem("setstate Feger off") } }
Für bessere Lösungen wäre ich sehr dankbar.
Heffa
sorry, dachte du hast es längst gelöst
probiere mal
attr <NAME> devStateIcon .*on:on:off .*off:off:on
<NAME> ist dein Relais
viel Erfolg
Hallo Tom_S,
vielen Dank.
Genau das habe ich gesucht.
Habe leider nicht immer die Zeit mich um das Fine-tuning in meine FHEM zu kümmern, deshalb sind des öfteren größere Lücken in meine Konversationen. :(
Heffa