Hauptmenü

Rückgabe relais.classdef

Begonnen von ollir, 01 Januar 2013, 19:41:19

Vorheriges Thema - Nächstes Thema

ollir

Hallo,

ich habe Probleme mit den Rückgabewerten der ralais.classdef.
Die Relais schalten und ich bekomme immer on bzw. off jedoch mir ERROR zurück.
Laut Telnet meldet ethersex OK als bestätigung zurück.

Hier die relais.classdef:

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


Leider finde ich den Fehler nicht. Was mache ich falsch?

VG
Olaf

Beginner

Hallo zusammen, gleich vorweg: Ich bin neuling und leider in Bezug auf Perl keine Leuchte!
Kurze Info zur Umgebung:
Net-io mit Ethersex drauf, 1-Wire Temp-Sensor und Test-LEDs für die Relais-aktivität.
FHEM auf XUBUNTU.


Hab leider das gleiche Problem.
Mir scheint es so, als würde das postproc die positive Rückantwort mit OK und erneut OK nicht sauber erkennen.
Wäre echt Klasse, wenn jemand einen leinen Tipp für einen Anfänger übrig hätte:-)



ollir

Ich bin auch noch nicht weiter gekommen.
Anscheinend sind wir die einzigen, die solch ein Problem haben.

Meine Vermutung:
Ich habe Ethersex mit "Named Relais" compiliert.
evtl. hat es damit zu tun ?

VG
Olaf

Mopedpaul

Hallo,
möchte mich da anschließen, auch bei mir ist die Rückgabe beim Relais schalten nicht OK und es wird ein Error gemeldet. Habe die Ursache auch noch nicht gefunden.
MfG Mopedpaul
System:FHEM 5.7 auf Intel NUC  mit 1xCUL(433) ,1xCUNO V2 (868)mit Onewire,2xNetIO mit Onewire , HMLAN
,Max Cube , Philips Hue, webViewControll, MiLight
Devices:FS20,Onewire (Cuno+NetIO),Intertechno ,Homematic (Keymatic & TC & SD) Max ,Solaranlage 7,3kWP mit Solarlog 200

Beginner

Zitat von: ollir schrieb am Mi, 06 Februar 2013 15:57Ich bin auch noch nicht weiter gekommen.
Anscheinend sind wir die einzigen, die solch ein Problem haben.

Meine Vermutung:
Ich habe Ethersex mit "Named Relais" compiliert.
evtl. hat es damit zu tun ?

VG
Olaf

Meinst du den Punkt unter I/O>named and logic state i/o ?
Bei mir ist dies nicht aktiv.
Dann wäre deine Vermutung widerlegt und müssten weiter nach einer Lösung suchen...

Gruß

Marco

ollir

Zitat von: Beginner schrieb am Do, 07 Februar 2013 07:32Meinst du den Punkt unter I/O>named and logic state i/o ?
Bei mir ist dies nicht aktiv.......

Ja meine ich. Ich bin weiter gekommen. Ich habe wie oben compiliert und rufe so auf:

set on cmd {"pin set %RelaisPort on\n"}
set on postproc {s/([on|;]*)/success/; "$_" eq "success" ? "on" : "error";}

set off cmd {"pin set %RelaisPort off\n"}
set off postproc {s/([off|;]*)/success/; "$_" eq "success" ? "off" : "error";}


bekomme dann "on on" und "off off" zurück

VG Olaf




Beginner

Zitat von: ollir schrieb am Do, 07 Februar 2013 08:57
Zitat von: Beginner schrieb am Do, 07 Februar 2013 07:32Meinst du den Punkt unter I/O>named and logic state i/o ?
Bei mir ist dies nicht aktiv.......

Ja meine ich. Ich bin weiter gekommen. Ich habe wie oben compiliert und rufe so auf:

set on cmd {"pin set %RelaisPort on\n"}
set on postproc {s/([on|;]*)/success/; "$_" eq "success" ? "on" : "error";}

set off cmd {"pin set %RelaisPort off\n"}
set off postproc {s/([off|;]*)/success/; "$_" eq "success" ? "off" : "error";}


bekomme dann "on on" und "off off" zurück

VG Olaf

:-(
Trage ich dies in meiner class ein, erhalte ich "on error" und "off error", verstehe ich nicht?
Ich bin davon ausgegangen, dass nach diesem REGEX "{s/([off|;]*)" gesucht wird, sollte dieser vorkommen wird im Gutfall on bzw. off übergeben sonst error. Liegt es eventuell daran, dass zwei Befehle mit Rückantwort ausgewertet werden müssen und dazu noch ein Zeilenumbruch mit reinrutscht?
Versteht jemnad das etwas besser und hat ein paar Zeilen für mich übrig?
Kann man evtl. die Befehle sequentiell abarbeiten lassen und lediglich die letze Rückantwort auswerten?

Bin scheinbar noch sehr weit weg von der Problemlösung ....

Gruß

Marco


Beginner

Zitat von: Beginner schrieb am Fr, 08 Februar 2013 13:35
Zitat von: ollir schrieb am Do, 07 Februar 2013 08:57
Zitat von: Beginner schrieb am Do, 07 Februar 2013 07:32Meinst du den Punkt unter I/O>named and logic state i/o ?
Bei mir ist dies nicht aktiv.......

Ja meine ich. Ich bin weiter gekommen. Ich habe wie oben compiliert und rufe so auf:

set on cmd {"pin set %RelaisPort on\n"}
set on postproc {s/([on|;]*)/success/; "$_" eq "success" ? "on" : "error";}

set off cmd {"pin set %RelaisPort off\n"}
set off postproc {s/([off|;]*)/success/; "$_" eq "success" ? "off" : "error";}


bekomme dann "on on" und "off off" zurück

VG Olaf

:-(
Trage ich dies in meiner class ein, erhalte ich "on error" und "off error", verstehe ich nicht?
Ich bin davon ausgegangen, dass nach diesem REGEX "{s/([off|;]*)" gesucht wird, sollte dieser vorkommen wird im Gutfall on bzw. off übergeben sonst error. Liegt es eventuell daran, dass zwei Befehle mit Rückantwort ausgewertet werden müssen und dazu noch ein Zeilenumbruch mit reinrutscht?
Versteht jemnad das etwas besser und hat ein paar Zeilen für mich übrig?
Kann man evtl. die Befehle sequentiell abarbeiten lassen und lediglich die letze Rückantwort auswerten?

Bin scheinbar noch sehr weit weg von der Problemlösung ....

Gruß

Marco


Hab es mal selber versucht umzumodeln....
Jetzt in der relais.classdef folgender Inhalt:


# Uebergabeparameter HEX Adresse Port
params RelaisPort
# erst alle Ports PC.. auf Ausgang setzen und dann per Hexcode schalten
#Einschalten sequentiell, da sonst Auswertung über postproc stetig mit error erfolgt
set on cmd {"io set ddr 2 ff"}
set on cmd {"io set port 2 %RelaisPort %RelaisPort"}
set on postproc {s/OK/success/; "$_" eq "success" ? "ok" : "error";}
#Ausschalten sequentiell, da sonst Auswertung über postproc stetig mit error erfolgt
set off cmd {"io set ddr 2 ff"}
set off cmd {"io set port 2 00 %RelaisPort"}
set off postproc {s/OK/success/; "$_" eq "success" ? "ok" : "error";}


Damit erhalte ich "on ok" und "off ok" zurück. Die Prüfung erfolgt somit nur bei dem jeweils zweiten Command wenn ich es richtig verstehe.
Kann nun diese Seite mit der Anzeige von "on ok" automatisch weitergeleitet werden auf die Ursprungsseite auf der die Aktion durchgeführt wurde?
Als Beispiel:
Ich möchte wenn ich die Aktion im Bereich unsorted ausführe, dort auch wieder automatisch landen.

Gruß

Marco

Dr. Boris Neubert

Zitat von: Beginner schrieb am Fr, 08 Februar 2013 13:48
set on cmd {"io set ddr 2 ff"}
set on cmd {"io set port 2 %RelaisPort %RelaisPort"}



Da ueberschreibt nur die zweite Definition des set on die erste, das bringt nichts.

Ich würde an Deiner Stelle methodisch vorgehen, erst mit telnet direkt die ECMD-Befehle absetzen und die Ergebnisse ansehen, dann nach und nach die classdef entwickeln.

Und die FHEM-Module alle auf den aktuellen Stand bringen.

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

Beginner

@Boris    Danke für deine Antwort, es wird scheibar doch der Anfängerkram gelesen ;-)

KOPFSCHMERZ!
Die Funktion ( Relais 1-8 schalten) ist mit der classdef gegeben, jedoch sicherlich verbesserungswürdig!
Hab die Inhalte der classdef aus dem wiki und habe sie dann angepasst.
Wenn ich es richtig verstehe, dient doch der erste Befehl um die Ports des Atmega auf Output zu stellen, oder?
Der zweite Befehl wird dann je nach Wert die 8 möglichen Ports auf high oder low stellen, richtig?
Wenn ich deine Rückantort richtig verstehe, wird der erste Befehl durch den Zweiten überschrieben und wird folglich nicht zum
Device gesendet.
Dann muss ich während der ganzen Tests wohl vergessen haben, den Atmega mal zurück zu setzen um zu prüfen, ob alle Funktionen noch abgearbeitet werden.
Schau ich mir nochmal genauer an...
Wäre schade, wenn die Befehle nicht sequentiell abgearbeitet werden....

So nebenbei:
Wenn ich mir die Befehle so ansehe, ist beim Ausschalten das setzen des Ports auf Output überflüssig...
Schau ich mir morgen mal an...

Was ich noch loswerden wollte:
Ich komm aus dem Staunen nicht mehr raus, da haben hier ein paar helle Köpfe was richtig feines zusammengebracht!
Herzlichen Dank dafür und für all das was eventuell noch folgt ;-)

Gruss

Marco

ollir

Ein kleiner Hinweis (bin selber darauf reingefallen)

der Befehl:

set on cmd {"io set ddr 2 ff"}

setzt den kompletten ddr2 auf Ausgang. Wenn jemand die K8IO Relaisplatte benutzt funktionieren die Eingänge nicht mehr.
Besser ist:

set on cmd {"io set ddr 2 0f"}

VG
Olaf

Beginner

So, hab jetzt in der classdef folgendes stehen:

set on cmd {"io set ddr 2 df\nio set port 2 %RelaisPort %RelaisPort"}
set on postproc {s/^OK\nOK$/success/; "$_" eq "success" ? "ok" : "error";}


Der HEX-Wert df aus dem Grund, weil ich an PortC.5 1Wire betreibe.
Mit dem REGEX "s/^OK\nOK$" läuft es jetzt scheinbar so wie es soll.
Zu meiner Schande muss ich gestehen: Der Regex steht in der commandref zum ECMDDevice http://fhem.de/commandref.html#ECMDDevice

Zur Info für Anfänger wie ich es bin:
Keine sequentuielle Abarbeitung in der classdef. Boris hat es ja bereits geschrieben. Man überschreibt lediglich die Definition.

Gruß

Marco