FHEM Forum

FHEM - Hausautomations-Systeme => Sonstige Systeme => Thema gestartet von: Heimbastler am 14 November 2016, 14:10:38

Titel: Mit ECMD State abfragen
Beitrag von: Heimbastler am 14 November 2016, 14:10:38
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

Titel: Antw:Mit ECMD State abfragen
Beitrag von: Dr. Boris Neubert am 14 November 2016, 18:18:54
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
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Heimbastler am 16 März 2017, 20:45:06
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
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Heimbastler am 19 März 2017, 22:26:14

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.

:-\

Titel: Antw:Mit ECMD State abfragen
Beitrag von: Dr. Boris Neubert am 20 März 2017, 01:08:44
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.
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Tom_S am 23 März 2017, 10:32:48
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
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Heimbastler am 23 März 2017, 21:35:31
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
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Heimbastler am 23 März 2017, 21:42:19
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


Titel: Antw:Mit ECMD State abfragen
Beitrag von: Dr. Boris Neubert am 23 März 2017, 21:49:41
partial verwenden!
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Heimbastler am 25 März 2017, 09:20:40
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
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Heimbastler am 25 März 2017, 09:23:21
leider die Screenshots vergessen  :-\
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Dr. Boris Neubert am 25 März 2017, 20:00:43
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
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Heimbastler am 25 März 2017, 21:41:12
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
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Heimbastler am 25 März 2017, 22:01:58
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
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Dr. Boris Neubert am 31 März 2017, 20:21:45
Warum 1R10, wenn in deiner Definition 11 als Parameter angegeben ist?

Kannst Du bitte noch den Match auf

0R%pin\r\n

setzen?
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Heimbastler am 02 April 2017, 19:39:44
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
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Dr. Boris Neubert am 03 April 2017, 01:08:01
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 { "" }

Titel: Antw:Mit ECMD State abfragen
Beitrag von: Heimbastler am 03 April 2017, 20:15:50
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
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Dr. Boris Neubert am 03 April 2017, 21:09:34
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?
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Heimbastler am 03 April 2017, 21:30:06
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
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Heimbastler am 03 April 2017, 21:56:52
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....

:-\
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Dr. Boris Neubert am 03 April 2017, 22:06:54
Du brauchst doch nur den state und keine Readings.

In Deinem state sollte entweder on oder off stehen.
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Heimbastler am 03 April 2017, 23:01:22
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
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Dr. Boris Neubert am 03 April 2017, 23:06:33
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.
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Heimbastler am 04 April 2017, 21:01:30
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
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Dr. Boris Neubert am 04 April 2017, 23:19:16
Wo kommt denn das spontan empfangene 1R10\r\n um 20:46:10 her? Was löst es aus?
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Heimbastler am 05 April 2017, 08:19:24
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...
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Dr. Boris Neubert am 05 April 2017, 20:05:24
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.
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Heimbastler am 06 April 2017, 19:53:12
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
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Dr. Boris Neubert am 06 April 2017, 20:15:26
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.
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Heimbastler am 06 April 2017, 20:30:10
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....
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Heimbastler am 06 April 2017, 20:46:00
ü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?
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Dr. Boris Neubert am 06 April 2017, 21:00:33
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.
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Heimbastler am 06 April 2017, 21:11:32
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
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Dr. Boris Neubert am 06 April 2017, 21:18:16
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
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Heimbastler am 06 April 2017, 21:39:05
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
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Dr. Boris Neubert am 06 April 2017, 21:43:44
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.
Titel: Antw:Mit ECMD State abfragen
Beitrag von: Heimbastler am 08 April 2017, 16:19:41
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