Hallo,
mein Arduino ist über USB am Raspberri Pi angeschlossen. Auf dem Arduino läuft meine Lichtsteuerung. Das habe ich so gewählt weil es aus verschiedenen Gründen "stabiler" läuft. Nun will ich über FHEM variablen ändern bzw. Schalzustände ändern und abfragen.
Das ändern funktioniert soweit:
Internals des ECMD
Internals:
DEF serial /dev/ttyACM2@9600
DeviceName /dev/ttyACM2@9600
FD 23
NAME Arduino
NR 374
PARTIAL
Protocol serial
STATE opened
TYPE ECMD
Readings:
2016-11-13 22:42:22 state opened
Fhem:
Classdefs:
:
Gets:
Sets:
Arduino:
Ecmd:
filename /opt/fhem/ECMD.classdef
params PAR1
Gets:
Status:
cmd {"VERSION\n"}
Sets:
0r08:
cmd {"0R08\n"}
1r08:
cmd {"1R08\n"}
Led_off:
cmd {"b\n"}
Led_on:
cmd {"a\n"}
Par1:
Params:
Params:
Attributes:
classdefs ECMD=/opt/fhem/ECMD.classdef
room Arduino
verbose 5
Internals des ECMD Device
Internals:
CFGFN
IODev Arduino
NAME R08
NR 537
STATE 1R08
TYPE ECMDDevice
Readings:
2016-11-14 13:46:55 state 1R08
Fhem:
classname ECMD
Cache:
Specials:
%NAME R08
%PAR1 1
%TYPE ECMDDevice
Params:
PAR1 1
Attributes:
IODev Arduino
alias Küchenarbeitsleuchten
class ECMD 1
devStateIcon 0R08:rc_STOP:1R08 1R08:rc_YELLOW:0R08
room Arduino
Ein Auszug aus der Log sieht so aus:
2016.11.14 13:46:45 5: Arduino: sending command "0R08\n"
2016.11.14 13:46:45 5: SW: 305230380a
2016.11.14 13:46:45 5: Arduino: Spontaneously received "0R"
2016.11.14 13:46:45 5: Arduino dispatch 0R
2016.11.14 13:46:45 5: Arduino: Spontaneously received "08\r\n"
2016.11.14 13:46:45 5: Arduino dispatch 08
Leider kriegt FHEM die Änderungen nicht mit. Wenn ein Schalter am Arduino geschaltet wird und das Licht entsprechend an / aus ist sieht FHEM das erst mal nicht.
Kann man mit ECMD auch den Arduino State nach jedem Schalten abfragen oder muss ich regelmäßig per Timer den State abfragen?
Ich bin mir da nicht Sicher wie ich das Umsetzen kann. :o
Vlt. ist die Lösung total simpel, ich steh irgendwie fest.
Danke + VG
Alex
Lass den Arduino nach jedem Schaltvorgang eine Meldung an FHEM absetzen.
Ggf. fehlt in der classdef ein expect und timeout, um die gesplitteten Antworten einzusammeln.
Grüße
Boris von unterwegs
Hi Boris,
bin jetzt erst wieder an dem Thema dran ;D
Wenn der Arduino durch einen Schalter-Eingang ein bestimmtes Relais schaltet sendet er auch jeweils per serial:
Serial.println("0R08");
- 1ste Stelle <0> oder <1> für <aus> bzw. <an>
- 2te Stelle <R> für "Relais"
- 3te+4te Stelle <08> für die "Relais-Nummer" im Schaltschrank
folgendes an fhem: (aus dem Log)
2017.03.16 20:04:43 5: Arduino: Spontaneously received "0R"
2017.03.16 20:04:43 5: Arduino dispatch 0R
2017.03.16 20:04:43 5: Arduino: Spontaneously received "08\r\n"
2017.03.16 20:04:43 5: Arduino dispatch 08
Ich hab leider das Prinzip noch nicht verstanden, deswegen steht im classdef auch noch alles in Klartext. Bestimmt gibt es hier eine clevere Variante um <0> bzw. <1> intelligent zu steuern.
Gänzlich unklar ist mir aber was ich in die classdef eintragen muss um beim serial Empfang von z.Bsp <0R08\r\n> den state eines device zu ändern.
#===========Arduino.classdef
# Uebergabeparameter
params PAR1
# Umsetzung in ECMD Befehle
set led_on cmd {"a\n"}
set led_off cmd {"b\n"}
set 1R00 cmd {"1R00\n"}
#set 1R00 expect "1R00\n"
#set 1R00 postproc {s/
set 0R00 cmd {"0R00\n"}
set 0R00 expect "0R00\n"
set 1R01 cmd {"1R01\n"}
set 0R01 cmd {"0R01\n"}
set 1R02 cmd {"1R02\n"}
set 0R02 cmd {"0R02\n"}
set 1R03 cmd {"1R03\n"}
set 0R03 cmd {"0R03\n"}
set 1R04 cmd {"1R04\n"}
set 0R04 cmd {"0R04\n"}
set 1R07 cmd {"1R07\n"}
set 0R07 cmd {"0R07\n"}
set 1R08 cmd {"1R08\n"}
#set 1R008 expect "1R08\n"
set 0R08 cmd {"0R08\n"}
#set 0R008 expect "0R08\n"
set 1R10 cmd {"1R10\n"}
set 0R10 cmd {"0R10\n"}
set 1R11 cmd {"1R11\n"}
set 0R11 cmd {"0R11\n"}
set 1R12 cmd {"1R12\n"}
set 0R12 cmd {"0R12\n"}
set 1R13 cmd {"1R13\n"}
set 0R13 cmd {"0R13\n"}
set 1R14 cmd {"1R14\n"}
set 0R14 cmd {"0R14\n"}
set 1R15 cmd {"1R15\n"}
set 0R15 cmd {"0R15\n"}
get getdata cmd ("0R00\n")
get getdata expect "0R00\n"
#get getdata postproc {\s/(.*)\n/$1/
get status cmd {"VERSION\n"}
tut mir leid wenn Ihr Augenkrebs bekommt bei meinem stümperhaften vorgehen.
VG Alex
Guten Abend,
noch mal versucht. Leider ohne Erfolg. Wenn ich ein getdata in die ECMD.classdef eingebe:
set 1R08 cmd {"1R08\n"}
set 0R08 cmd {"0R08\n"}
get getdata cmd {"0R10\r\n"}
get getdata expect "0R10\r\n"
get getdata postproc {readingsSingleUpdate(R10, "status", 0R10}
get getdata cmd {"1R10\r\n"}
get getdata expect "1R10\r\n"
get getdata postproc {readingsSingleUpdate(R10, "status", 1R10}
und ich lasse den Arduino senden dann kommt in der log immer noch alles zerhackt an:
2017.03.19 22:14:57 5: Arduino: sending command "1R10\n"
2017.03.19 22:14:57 5: SW: 315231300a
2017.03.19 22:14:57 5: Arduino: Spontaneously received "1R1"
2017.03.19 22:14:57 5: Arduino dispatch 1R1
2017.03.19 22:14:57 5: Arduino: Spontaneously received "0\r\n"
2017.03.19 22:14:57 5: Arduino dispatch 0
Ich habe im ECMD mit dem attr timeout + partial jeweils 3sec auch keinen unterschied gesehen.
Ich denke mal ich habe da immer noch einen denkfehler, weiss aber überhaupt nicht wo ich ansetzen soll.
:-\
Poste bitte mal die vollständige Konfiguration des Device namens Arduino, die classdef, einen Logauszug mit logTraffic.
Mit allem an einer Stelle im Überblick sehe ich vielleicht was.
da gab es mal einen Wiki-Eintrag
prinzipiell legst du doch für jedes Relais ein ECMDDevice an.
define <Name> ECMDDevice rel 01
define <Name> ECMDDevice rel 02
usw
in die classdef schreibst du
params pin
set on cmd {"<dein on Befehl> %pin\r\n"}
set off cmd {"<dein off Befehl> %pin\r\n"}
der Parameter %pin steht für das Relais. Du musst also %pin sinnvoll integrieren.
In deinem Fall 1R%pin für on
Meldungen die zurück kommen kannst du mit
reading on match "1R%pin"
abfangen.
off dann mit 0. Soweit ich das noch aus dem Gedächtnis zusammen bekomme.
Probiere mal und wie Boris schon geschrieben hat, bitte mal die gesamte config
LG Tom_S
Hi Boris und Tom_S...
vielen Dank für Eure Hilfe.
Das Arduino hat vollgende internals:
Internals:
DEF serial /dev/ttyACM2@9600
DeviceName /dev/ttyACM2@9600
FD 16
NAME Arduino
NR 337
PARTIAL
Protocol serial
STATE opened
TYPE ECMD
Readings:
2017-03-23 20:52:34 state opened
Fhem:
Classdefs:
Rel:
filename /opt/fhem/ECMD.classdef
params pin
Gets:
Readings:
Off:
match 0R%pin
On:
match 1R%pin
Sets:
Off:
cmd {"0R%pin\r\n"}
On:
cmd {"1R%pin\r\n"}
Attributes:
classdefs rel=/opt/fhem/ECMD.classdef
requestSeparator
verbose 5
Die ECMDdevice's lasen sich auch alle noch per FHEM schalten. Im reading schaltet state auf on oder off.
Die ECMDdevices haben vollgendes in er cfg:
define R11 ECMDDevice
attr R11 IODev Arduino
attr R11 alias Trägerleuchten
attr R11 class rel 11
attr R11 devStateIcon off:rc_STOP:on on:rc_YELLOW:off
attr R11 group Licht
attr R11 room EG
attr R11 webCmd :
in der classdef steht:
#===========Arduino.classdef
# Uebergabeparameter
params pin
# Umsetzung in ECMD Befehle
set on cmd {"1R%pin\r\n"}
set off cmd {"0R%pin\r\n"}
reading on match "1R%pin"
reading off match "0R%pin"
und in der Log steht:
2017.03.23 21:21:25 5: Arduino: sending command "0R11\r\n"
2017.03.23 21:21:25 5: SW: 305231310d0a
2017.03.23 21:21:25 5: Arduino: Spontaneously received "0R1"
2017.03.23 21:21:25 5: Arduino dispatch 0R1
2017.03.23 21:21:25 5: Arduino: Spontaneously received "1\r\n"
2017.03.23 21:21:25 5: Arduino dispatch 1
2017.03.23 21:21:27 5: Arduino: sending command "1R11\r\n"
2017.03.23 21:21:27 5: SW: 315231310d0a
2017.03.23 21:21:27 5: Arduino: Spontaneously received "1R"
2017.03.23 21:21:27 5: Arduino dispatch 1R
2017.03.23 21:21:27 5: Arduino: Spontaneously received "11\r\n"
2017.03.23 21:21:27 5: Arduino dispatch 11
Ich verstehe nicht wo es noch klemmt. Die
reading on match "1R%pin"
reading off match "0R%pin"
in der classdef scheinen nichts zu bewirken. Oder ich hab das mit dem Befehl nicht verstanden / richtig umgesetzt.
VG
Alex
hier noch mal ein Log Auszug wenn ich den logTraffig beim ECMD auf 5 gesetzt habe:
2017.03.23 21:37:08 5: Arduino: read "0R11\r\n"
2017.03.23 21:37:08 5: Arduino: Spontaneously received "0R11\r\n"
2017.03.23 21:37:08 5: Arduino dispatch 0R11
2017.03.23 21:37:11 5: Arduino: read "1"
2017.03.23 21:37:11 5: Arduino: Spontaneously received "1"
2017.03.23 21:37:11 5: Arduino dispatch 1
2017.03.23 21:37:11 5: Arduino: read "R11\r\n"
2017.03.23 21:37:11 5: Arduino: Spontaneously received "R11\r\n"
2017.03.23 21:37:11 5: Arduino dispatch R11
partial verwenden!
Hallo
Wenn ich mir die Detailansicht des Device (R10) anschaue habe ich verschiedene Merkmale die nun mit/von ECMD zu tun haben. Anbei dazu ein Screenshot.
#1
Set
ganz oben in der Detailansicht
set R10 on 1R10
bzw.
set R10 off 0R10
Ich denke mal das kommt direkt aus der Definition im Classdef
#2
ECMD reading
ich glaube das reading / match funktioniert noch nicht zuverlässig
#===========ECMD.classdef
# Uebergabeparameter
params pin
set on cmd {"1R%pin\r\n"}
set off cmd {"0R%pin\r\n"}
reading on match "1R%pin"
reading off match "0R%pin"
in den Internals als auch in den Readings habe ich nun stimmige Einträge vom ECMD Device / Arduino.
In den Readings habe ich nun 3 verschiedene reading (on + off + state)
Der Arduino sendet immer etwas zurück (1R10\r\n bzw. 0R10\r\n. Nur an den Zeitstempeln der Readings kann ich erkennen das es immer noch nicht 100% "matched" wie in der Classdef definiert. Das ist auch nach wie vor mein eigentliches Problem.
Im Device ECMD habe ich auch das Attribute partial verwendet
attr Arduino partial 1
Ob ich 1sec oder bis zu 10sec verwende macht im Log kein Unterschied.
#3
devStateIcon als klare Darstellung
Ich verwende ein
attr R10 devStateIcon off:rc_STOP:on on:rc_YELLOW:off
um das optisch klar anzuzeigen welchen Status das Relais aktuell hat.
Hier habe ich festgestellt das manchmal das Icon rc_YELLOW -> #3a (die klare beleuchtete Taste wie im 1sten screenshot) ODER die "standard Icon / Lampe" -> #3b (2ter Screenshot) leuchtet. Wenn ich das querchecke mit den Logs macht das auch Sinn:
Wenn #3a/bestimmtes Icon dann scheint das im Log "nicht zu matchen":
2017.03.25 08:22:45 5: Arduino: sending command "0R10\r\n"
2017.03.25 08:22:45 5: Arduino: write "0R10\r\n"
2017.03.25 08:22:45 5: SW: 305231300d0a
2017.03.25 08:22:45 5: Arduino: read "0R1"
2017.03.25 08:22:45 5: Arduino: Spontaneously received "0R1"
2017.03.25 08:22:45 5: Arduino dispatch 0R1
2017.03.25 08:22:45 5: Arduino: read "0\r\n"
2017.03.25 08:22:45 5: Arduino: Spontaneously received "0\r\n"
2017.03.25 08:22:45 5: Arduino dispatch 0
Ich denke mal dann greift das reading state
Wenn #3b/standard Icon dann scheint das im Log "zu matchen":
2017.03.25 08:22:06 5: Arduino: sending command "1R15\r\n"
2017.03.25 08:22:06 5: Arduino: write "1R15\r\n"
2017.03.25 08:22:06 5: SW: 315231300d0a
2017.03.25 08:22:06 5: Arduino: read "1R15"
2017.03.25 08:22:06 5: Arduino: Spontaneously received "1R15"
2017.03.25 08:22:06 5: Arduino dispatch 1R15
2017.03.25 08:22:06 5: Arduino: match regex 1R15 for reading on of device R15 with class rel
2017.03.25 08:22:06 5: Arduino: read "\r\n"
2017.03.25 08:22:06 5: Arduino: Spontaneously received "\r\n"
2017.03.25 08:22:06 5: Arduino dispatch
Ich denke mal dann greift das reading state NICHT und fhem nimmt das standard Icon für on? Das ist mir unklar was da passiert.
Ist zwar ein anderes Thema aber was muss im attribute devStateIcon stehen damit das Sinn macht?
regex on bzw. off
devStateIcon off:rc_STOP:on on:rc_YELLOW:off
ODER
regex 0R10 bzw. 1R10
devStateIcon 0R10:rc_STOP:on 1R10:rc_YELLOW:off
?
VG
Alex
leider die Screenshots vergessen :-\
Hallo,
bitte immer nur eine Problem nach dem anderen.
Nachdem Du partial nun gesetzt hast, wie sagt das Log, wenn vom Arduino die Bestätigung gesendet wird? Bist Du sicher, dass dabei partial am Device Arduino gesetzt ist (attr Arduino partial 1)?
Viele Grüße
Boris
Hi Boris,
ja partial am device Arduino gesetzt
Internals:
DEF serial /dev/ttyACM2@9600
DeviceName /dev/ttyACM2@9600
FD 16
NAME Arduino
NR 337
PARTIAL
Protocol serial
STATE opened
TYPE ECMD
Readings:
2017-03-23 22:43:54 state opened
Fhem:
Classdefs:
Rel:
filename /opt/fhem/ECMD.classdef
params pin
Gets:
Readings:
Off:
match 0R%pin
On:
match 1R%pin
Sets:
Off:
cmd {"0R%pin\r\n"}
On:
cmd {"1R%pin\r\n"}
Partial:
msg 1R08
ts 1490467796.96596
Attributes:
classdefs rel=/opt/fhem/ECMD.classdef
logTraffic 5
partial 1
requestSeparator
verbose 5
und das log sagt vollgendes wenn Arduino eine Antwort schickt
2017.03.25 21:37:43 5: Arduino: sending command "0R10\r\n"
2017.03.25 21:37:43 5: Arduino: write "0R10\r\n"
2017.03.25 21:37:43 5: SW: 305231300d0a
2017.03.25 21:37:43 5: Arduino: read "0R"
2017.03.25 21:37:43 5: Arduino: Spontaneously received "0R"
2017.03.25 21:37:43 5: Arduino dispatch 0R
2017.03.25 21:37:43 5: Arduino: read "10\r\n"
2017.03.25 21:37:43 5: Arduino: Spontaneously received "10\r\n"
2017.03.25 21:37:43 5: Arduino dispatch 10
2017.03.25 21:37:48 5: Arduino: sending command "1R10\r\n"
2017.03.25 21:37:48 5: Arduino: write "1R10\r\n"
2017.03.25 21:37:48 5: SW: 315231300d0a
2017.03.25 21:37:48 5: Arduino: read "1R1"
2017.03.25 21:37:48 5: Arduino: Spontaneously received "1R1"
2017.03.25 21:37:48 5: Arduino dispatch 1R1
2017.03.25 21:37:48 5: Arduino: read "0\r\n"
2017.03.25 21:37:48 5: Arduino: Spontaneously received "0\r\n"
2017.03.25 21:37:48 5: Arduino dispatch 0
Danke für Deine Geduld
VG
Alex
Hi Boris,
jetzt habe ich ein update des 66_ECMD.pm + 67_ECMDDevice.pm gemacht:
2017.03.25 21:52:57 5: Arduino: sending command 1R10\r\n (\061\122\061\060\015\012)
2017.03.25 21:52:57 5: Arduino: write 1R10\r\n (\061\122\061\060\015\012)
2017.03.25 21:52:57 5: SW: 315231300d0a
2017.03.25 21:52:57 5: Arduino: read 1R10 (\061\122\061\060)
2017.03.25 21:52:57 5: Arduino: Spontaneously received 1R10 (\061\122\061\060)
2017.03.25 21:52:57 5: Arduino dispatch 1R10
2017.03.25 21:52:57 5: Arduino: partial message \r\n (\015\012) expired.
2017.03.25 21:52:57 5: Arduino: trying to match message 1R10 (\061\122\061\060)
2017.03.25 21:52:57 5: Arduino: 1R10 (\061\122\061\060) matches regex 1R10 for reading on of device R10 with class rel
2017.03.25 21:52:57 5: Arduino: read \r\n (\015\012)
2017.03.25 21:52:57 5: Arduino: Spontaneously received \r\n (\015\012)
2017.03.25 21:52:57 5: Arduino dispatch
2017.03.25 21:52:57 5: Arduino: trying to match message \r\n (\015\012)
2017.03.25 21:52:57 5: Arduino: partial message \r\n (\015\012) kept
2017.03.25 21:53:03 5: Arduino: sending command 0R10\r\n (\060\122\061\060\015\012)
2017.03.25 21:53:03 5: Arduino: write 0R10\r\n (\060\122\061\060\015\012)
2017.03.25 21:53:03 5: SW: 305231300d0a
2017.03.25 21:53:03 5: Arduino: read 0R (\060\122)
2017.03.25 21:53:03 5: Arduino: Spontaneously received 0R (\060\122)
2017.03.25 21:53:03 5: Arduino dispatch 0R
2017.03.25 21:53:03 5: Arduino: partial message \r\n (\015\012) expired.
2017.03.25 21:53:03 5: Arduino: trying to match message 0R (\060\122)
2017.03.25 21:53:03 5: Arduino: partial message 0R (\060\122) kept
2017.03.25 21:53:03 5: Arduino: read 10\r\n (\061\060\015\012)
2017.03.25 21:53:03 5: Arduino: Spontaneously received 10\r\n (\061\060\015\012)
2017.03.25 21:53:03 5: Arduino dispatch 10
2017.03.25 21:53:03 5: Arduino: merging partial message 0R (\060\122) and 10\r\n (\061\060\015\012)
2017.03.25 21:53:03 5: Arduino: trying to match message 0R10\r\n (\060\122\061\060\015\012)
2017.03.25 21:53:03 5: Arduino: partial message 0R10\r\n (\060\122\061\060\015\012) kept
nun sind deutlich mehr Infos zu sehen
VG Alex
Warum 1R10, wenn in deiner Definition 11 als Parameter angegeben ist?
Kannst Du bitte noch den Match auf
0R%pin\r\n
setzen?
Hallo Boris,
vielen Dank dafür:
Zitat von: Dr. Boris Neubert am 31 März 2017, 20:21:45
Warum 1R10, wenn in deiner Definition 11 als Parameter angegeben ist?
Da hab ich geschlampt bei den Angaben / die devices gemixt.
Zitat von: Dr. Boris Neubert am 31 März 2017, 20:21:45
Kannst Du bitte noch den Match auf
0R%pin\r\n
setzen?
:-X hätt ich auch selbst drauf kommen / probieren können....
Mit dem \r\n läuft das merge sauber durch. Nach jedem reading vom Arduino stimmt nun die Rückgabe.
:D
Nur folgendes ist nun in den Readings zu sehen wenn vorher set on abgesetzt wurde: (siehe Anhänge)
<reading> on <regex> 1R10
<reading> state <regex> on 1R10
Habe jetzt nur noch Probleme das sauber anzuzeigen:
#1
Wenn ich nun das Icon sinnvoll anzeigen will scheint das mit einem Leerzeichen
nicht zu funktionieren.
attr R10 off 0R10:rc_STOP:on on 1R10:rc_YELLOW:off
#2
Das funktioniert aber leider auch nicht:
attr R10 ^0R$:rc_STOP:on ^1R$:rc_YELLOW:off
#3
oder muss ich das über eventMap steuern?
attr R10 { dev=>{"^1R"=>"on"}, dev=>{"^0R"=>"off"} }
Entschuldige bitte wenn Dir das in der Seele wehtun sollte...
VG
Alex
Ich schneide bei meiner Klassendefinition für meinen Arduino einfach alles weg:
set on postproc { s/.*\r\n//; $_ }
set off postproc { s/.*\r\n//; $_ }
Geht vermutlich auch einfacher. Ungetestet:
set on postproc { "" }
set off postproc { "" }
Guten Abend,
jetzt habe ich den postproc probiert...leider ohne Erfolg
Internals:
DEF serial /dev/ttyACM2@9600
DeviceName /dev/ttyACM2@9600
FD 16
NAME Arduino
NR 337
PARTIAL
Protocol serial
STATE opened
TYPE ECMD
Readings:
2017-04-03 19:57:58 state opened
Fhem:
Classdefs:
Rel:
filename /opt/fhem/ECMD.classdef
params pin
Gets:
Readings:
Off:
match 0R%pin\r\n
On:
match 1R%pin\r\n
Sets:
Off:
cmd {"0R%pin\r\n"}
postproc { s/.*\r\n//; $_ }
On:
cmd {"1R%pin\r\n"}
postproc { s/.*\r\n//; $_ }
Partial:
msg
ts 1491242568.33951
Attributes:
classdefs rel=/opt/fhem/ECMD.classdef
logTraffic 5
partial 2
verbose 5
Im Anhang noch deteils zum ECMDdevice
Und ein log-Auszug
2017.04.03 20:09:06 5: Arduino: sending command 0R10\r\n (\060\122\061\060\015\012)
2017.04.03 20:09:06 5: Arduino: write 0R10\r\n (\060\122\061\060\015\012)
2017.04.03 20:09:06 5: SW: 305231300d0a
2017.04.03 20:09:06 5: Arduino: read 0R1 (\060\122\061)
2017.04.03 20:09:06 5: Arduino: Spontaneously received 0R1 (\060\122\061)
2017.04.03 20:09:06 5: Arduino dispatch 0R1
2017.04.03 20:09:06 5: Arduino: trying to match message 0R1 (\060\122\061)
2017.04.03 20:09:06 5: Arduino: partial message 0R1 (\060\122\061) kept
2017.04.03 20:09:06 5: Arduino: read 0\r\n (\060\015\012)
2017.04.03 20:09:06 5: Arduino: Spontaneously received 0\r\n (\060\015\012)
2017.04.03 20:09:06 5: Arduino dispatch 0
2017.04.03 20:09:06 5: Arduino: merging partial message 0R1 (\060\122\061) and 0\r\n (\060\015\012)
2017.04.03 20:09:06 5: Arduino: trying to match message 0R10\r\n (\060\122\061\060\015\012)
2017.04.03 20:09:06 5: Arduino: 0R10\r\n (\060\122\061\060\015\012) matches regex 0R10\r\n for reading off of device R10 with class rel
Ehrlich gesagt verstehe ich den postprocess nicht.
Wie soll der den state auf nur on/off bringen?
VG
Alex
Meine classdef sieht so aus:
# these are the numbers of the output pin from 0 to 2
# relais has inverted logic
params n
set on cmd { "s%n0\r" }
set on expect ".*\r\n"
set on postproc { s/.*\r\n//; $_ }
set off cmd { "s%n1\r" }
set off expect ".*\r\n"
set off postproc { s/.*\r\n//; $_ }
get version cmd { "v\r" }
get version expect ".*\r\n"
#
# eof
#
Bis auf eine andere Kommandosyntax habe ich exakt den selben Anwendungsfall.
Wie sieht denn Deine classdef jetzt aus?
Hi Boris,
das habe ich in meiner classdef stehen:
#===========Arduino.classdef
# Uebergabeparameter
params pin
# Umsetzung in ECMD Befehle
set on cmd {"1R%pin\r\n"}
set off cmd {"0R%pin\r\n"}
set on postproc { s/.*\r\n//; $_ }
set off postproc { s/.*\r\n//; $_ }
reading on match "1R%pin\r\n"
reading off match "0R%pin\r\n"
ich werde Deine einfach mal probieren. Danke für die Info.
VG
Alex
jetzt habe ich das reading aus der classdef entfernt und Deine expect hinzugefügt:
#===========Arduino.classdef
# Uebergabeparameter
params pin
# Umsetzung in ECMD Befehle
set on cmd {"1R%pin\r\n"}
set on expect ".*\r\n
set on postproc { s/.*\r\n//; $_ }
set off cmd {"0R%pin\r\n"}
set off expect ".*\r\n
set off postproc { s/.*\r\n//; $_ }
aber ich denke mal ich muss das reading drinlassen damit überhaupt etwas vom Arduino gelesen werden kann?
jetzt habe ich auch keinerlei reading wenn der Arduino etwas sendet. Vorher hatte ich hier das reading on und das das reading off....
:-\
Du brauchst doch nur den state und keine Readings.
In Deinem state sollte entweder on oder off stehen.
Hi Boris,
ich kriege es nicht hin. Reading ist nun nicht mehr in der classdef und trotzdem kriege ich kein on bzw. off für den state:
2017.04.03 22:50:38 5: Arduino: sending command 0R10\r\n (\060\122\061\060\015\012)
2017.04.03 22:50:38 5: Arduino: write 0R10\r\n (\060\122\061\060\015\012)
2017.04.03 22:50:38 5: SW: 305231300d0a
2017.04.03 22:50:38 5: Arduino: read 0R1 (\060\122\061)
2017.04.03 22:50:38 5: Arduino: Spontaneously received 0R1 (\060\122\061)
2017.04.03 22:50:38 5: Arduino dispatch 0R1
2017.04.03 22:50:38 5: Arduino: partial message 0R10\r\n (\060\122\061\060\015\012) expired.
2017.04.03 22:50:38 5: Arduino: trying to match message 0R1 (\060\122\061)
2017.04.03 22:50:38 5: Arduino: partial message 0R1 (\060\122\061) kept
2017.04.03 22:50:38 5: Arduino: read 0\r\n (\060\015\012)
2017.04.03 22:50:38 5: Arduino: Spontaneously received 0\r\n (\060\015\012)
2017.04.03 22:50:38 5: Arduino dispatch 0
2017.04.03 22:50:38 5: Arduino: merging partial message 0R1 (\060\122\061) and 0\r\n (\060\015\012)
2017.04.03 22:50:38 5: Arduino: trying to match message 0R10\r\n (\060\122\061\060\015\012)
2017.04.03 22:50:38 5: Arduino: partial message 0R10\r\n (\060\122\061\060\015\012) kept
classdef:
# Uebergabeparameter
params pin
# Umsetzung in ECMD Befehle
set on cmd {"1R%pin\r\n"}
set on expect ".*\r\n
set on postproc { s/.*\r\n//; $_ }
set off cmd {"0R%pin\r\n"}
set off expect ".*\r\n
set off postproc { s/.*\r\n//; $_ }
Das ist leider immer noch nicht so das ein "1R%pin\r\n" bzw. "0R%pin\r\n" im state "on" bzw. "off" hinterlegt.
VG
Alex
Nimm mal bitte die regulären Ausdrücke von den match-Kommandos aus Deiner alten Classdef für die regulären Ausdrücke beim expect.
Hi Boris,
habe nun den expect upgedated und alles noch mal gecheckt. Icmmer noch kein Erfolg:
2017.04.04 20:44:20 5: Arduino: sending command 0R10\r\n (\060\122\061\060\015\012)
2017.04.04 20:44:20 5: Arduino: write 0R10\r\n (\060\122\061\060\015\012), expect 0R10\r\n
2017.04.04 20:44:20 5: SW: 305231300d0a
2017.04.04 20:44:20 5: Arduino: read 0R10\r\n (\060\122\061\060\015\012)
2017.04.04 20:44:20 5: Arduino: received answer 0R10\r\n (\060\122\061\060\015\012)
2017.04.04 20:46:10 5: Arduino: read 1R10\r\n (\061\122\061\060\015\012)
2017.04.04 20:46:10 5: Arduino: Spontaneously received 1R10\r\n (\061\122\061\060\015\012)
2017.04.04 20:46:10 5: Arduino dispatch 1R10
2017.04.04 20:46:10 5: Arduino: partial message 1R10\r\n (\061\122\061\060\015\012) expired.
2017.04.04 20:46:10 5: Arduino: trying to match message 1R10\r\n (\061\122\061\060\015\012)
2017.04.04 20:46:10 5: Arduino: partial message 1R10\r\n (\061\122\061\060\015\012) kept
Wenn ich den externen Schalter drücke wird der Schalvorgang erkannt aber nicht im state hinterlegt. Ab 20:46:10 im Log
im classdef steht jetzt
# Uebergabeparameter
params pin
# Umsetzung in ECMD Befehle
set on cmd {"1R%pin\r\n"}
set on expect "1R%pin\r\n"
set on postproc { s/.*\r\n//; $_ }
set off cmd {"0R%pin\r\n"}
set off expect "0R%pin\r\n"
set off postproc { s/.*\r\n//; $_ }
ist der postproc jetzt noch krumm?
VG + Danke
Alex
Wo kommt denn das spontan empfangene 1R10\r\n um 20:46:10 her? Was löst es aus?
Na das müsste der Arduino senden?
In dem Fall wurde der Ursprüngliche Schaltbefehl nicht von fhem aus gesendet, sondern direkt vom Arduino.
Das war/ist aber immer so...egal wer Auslöser ist weil der Arduino nach dem schalten ja immer sendet...
Ach so.
Dann setze bitte an Deinem ECMDDevice das Attribut noState auf 1 und nimm diese classdef:
# Uebergabeparameter
params pin
# Umsetzung in ECMD Befehle
set on cmd {"1R%pin\r\n"}
set on expect "1R%pin\r\n"
set off cmd {"0R%pin\r\n"}
set off expect "0R%pin\r\n"
reading state match "[01]R%pin\r\n"
reading state postproc { /([01])R%pin\r\n/; $1 ? "on" : "off" }
Das habe ich getestet.
geht leider immer noch nicht.
2017.04.06 19:41:12 5: Arduino: sending command 1R10\r\n (\061\122\061\060\015\012)
2017.04.06 19:41:12 5: Arduino: write 1R10\r\n (\061\122\061\060\015\012), expect 1R10\r\n
2017.04.06 19:41:12 5: SW: 315231300d0a
2017.04.06 19:41:12 5: Arduino: read 1R10\r\n (\061\122\061\060\015\012)
2017.04.06 19:41:12 5: Arduino: received answer 1R10\r\n (\061\122\061\060\015\012)
2017.04.06 19:41:24 5: Arduino: sending command 0R10\r\n (\060\122\061\060\015\012)
2017.04.06 19:41:24 5: Arduino: write 0R10\r\n (\060\122\061\060\015\012), expect 0R10\r\n
2017.04.06 19:41:24 5: SW: 305231300d0a
2017.04.06 19:41:25 5: Arduino: read 0R10\r\n (\060\122\061\060\015\012)
2017.04.06 19:41:25 5: Arduino: received answer 0R10\r\n (\060\122\061\060\015\012)
ist split und partial an der Stelle immer nocg sinnvoll?
Im Anhang dazu alle Einstellungen
VG...Alex
Du hast Readings on und off. Diese sind aber nicht in der classdef. Das deutet darauf hin, dass Du nur unvollständig neu geladen hast. Versuche es bitte erneut.
ICH WERD VERRÜCKT....ES FUNKTIONIERT... ;D
...wenn ich die externen Schalter bediene wird der Status korrekt angezeigt!!!
...wenn ich über fhem schalte müsste ebenfalls über ECMD der state gesetzt werden...das geht komischerweise nicht aber ich checke mal den Arduino code zwecks Rückantwort...
VIELEN DANK....
über den Schalter bedient wird die Lampe korrekt geschaltet und der status korrekt angezeigt und bekomme diesen Logeintrag
2017.04.06 20:34:39 5: Arduino: read 0R (\060\122)
2017.04.06 20:34:39 5: Arduino: Spontaneously received 0R (\060\122)
2017.04.06 20:34:39 5: Arduino dispatch 0R
2017.04.06 20:34:39 5: Arduino: trying to match message 0R (\060\122)
2017.04.06 20:34:39 5: Arduino: partial message 0R (\060\122) kept
2017.04.06 20:34:39 5: Arduino: read 10\r\n (\061\060\015\012)
2017.04.06 20:34:39 5: Arduino: Spontaneously received 10\r\n (\061\060\015\012)
2017.04.06 20:34:39 5: Arduino dispatch 10
2017.04.06 20:34:39 5: Arduino: merging partial message 0R (\060\122) and 10\r\n (\061\060\015\012)
2017.04.06 20:34:39 5: Arduino: trying to match message 0R10\r\n (\060\122\061\060\015\012)
2017.04.06 20:34:39 5: Arduino: 0R10\r\n (\060\122\061\060\015\012) matches regex [01]R10\r\n for reading state of device R10 with class rel
über fhem geschaltet wird die lampe korrekt geschaltet aber der state passt jetzt nicht dazu
2017.04.06 20:39:24 5: Arduino: sending command 1R10\r\n (\061\122\061\060\015\012)
2017.04.06 20:39:24 5: Arduino: write 1R10\r\n (\061\122\061\060\015\012), expect 1R10\r\n
2017.04.06 20:39:24 5: SW: 315231300d0a
2017.04.06 20:39:24 5: Arduino: read 1R10\r\n (\061\122\061\060\015\012)
2017.04.06 20:39:24 5: Arduino: received answer 1R10\r\n (\061\122\061\060\015\012)
woran liegt das nun wieder?
Nimm mal bitte noch die beiden expect aus der classdef. Die fressen nämlich die Antwort. Dann wird die Antwort wieder mit dem reading match gefangen. Getestet und geht bei mir.
LÄUFT.... ;D
Vielen Dank Boris!!
Abschliessend werde ich mein Setup noch mal posten um den letzten funktionierenden Stand zu dokumentieren.
Besten Dank noch mal.
Alex
Das war hartes Brot.
Magst Du es nicht im Wiki dokumentieren? Inklusive Begründungen, warum wir es so und nicht anders gemacht haben. Insbesondere, worauf es ankommt (sowohl im Bezug auf den Inhalt der Dateien als auch auf das saubere Arbeiten). Dann haben es andere leichter. Der Anwendungsfall ist ja interessant.
Viele Grüße
Boris
Hi Boris,
mache ich gerne. Mache mich erst mal vertraut wie ein neuer Punkt in die ECMD Wiki aufgenommen wird.
Das bin ich Dir/Euch schuldig.
In diesem hier?
https://wiki.fhem.de/wiki/ECMD
Benötige ich dazu eine Freigabe von Dir?
VG
Alex
Danke Alex.
Ich glaube, dem Artikel tut es gut, wenn er ein Beispiel bekommt.
Eine Freigabe benötigst Du nicht, aber ich schaue mit den Artikel gerne an und gebe bei Bedarf Hinweise.
Habe versucht auf der Seite zu schreiben / mich einzuloggen, geht nicht.
Wenn es so nicht geht schreibe ich einem Admin zwecks Zugang.
https://wiki.fhem.de/wiki/ECMD
VG
Alex