ECMD - Daten via serieller Schnittstelle

Begonnen von Jenno, 26 Mai 2021, 16:59:45

Vorheriges Thema - Nächstes Thema

Jenno

Hallo,

ich verwende das Modul ECDM um Daten aus einem Regensensor Hydreon RG-9 via RS232-Schnittstelle auszulesen.

Dies funktioniert soweit gut. Daten die vom Sensor automatisch gesendet werden, werden korrekt verarbeitet. Die Daten sind R 0, R 1 usw. je nach Regenstärke.

Jedoch habe ich das Problem, dass nach einem get raw "r\n" zum Auslesen der Schittstelle nicht alle Zeichen verarbeitet werden. Es fehlt immer das erste Zeichen.

Vielleicht kann mir einer der Spezialisten weiterhelfen.

Vielen Dank
Jenno

Die Modulversionen sind:
66_ECMD.pm 16372
67_ECMDDevice.pm 12877

Konfiguration der Module:
Internals:
   DEF        serial /dev/rainsensor@9600
   DeviceName /dev/rainsensor@9600
   FD         46
   FUUID      60aa1745-f33f-1f55-59b9-4f50c16864f3ae59
   NAME       RS
   NR         1290
   PARTIAL   
   Protocol   serial
   STATE      opened
   TYPE       ECMD
   READINGS:
     2021-05-26 16:04:37   raw             B
     2021-05-26 16:03:57   state           opened
   fhem:
     classDefs:
       rsdata.class:
         filename   /opt/fhem/FHEM/rsdata.classdef
         state      Rainlevel
         gets:
         readings:
           DIP:
             match      DIP.*\r\n
             postproc   {s/DIP\s([0-9]+)/$1/;; $_;}
           Emitters:
             match      Emitters.*\r\n
           Parameters:
             match      Baud.*\r\n
             postproc   {s/Baud\s([0-9]+)/$1/;; $_;}
           PwrDays:
             match      PwrDays.*\r\n
             postproc   {s/PwrDays\s([0-9]+)/$1/;; $_;}
           Rainlevel:
             match      R\s[0-9].*\r\n
             postproc   {s/R\s([0-9]+)/$1/;; $_;}
           Reset:
             match      Reset.*\r\n
             postproc   {s/Reset\s(.)/$1/;; $_;}
         sets:
     partial:
       msg        aud 9600
       ts         1622037877.43359
Attributes:
   DbLogExclude .*
   classdefs  rsdata.class=/opt/fhem/FHEM/rsdata.classdef
   logTraffic 5
   partial    3
   room       Comm
   split      \r\n
   verbose    5

Internals:
   CFGFN     
   DEF        rsdata.class
   FUUID      60aa7e90-f33f-1f55-a12b-525da767bdf9a8f2
   IODev      RS
   LASTInputDev RS
   MSGCNT     124
   NAME       wetter_rainsensor
   NR         5552
   RS_MSGCNT  124
   RS_TIME    2021-05-26 15:11:41
   STATE      0

   TYPE       ECMDDevice
   Helper:
     DBLOG:
       Rainlevel:
         logdbweather:
           TIME       1622034701.28104
           VALUE      0

   READINGS:
     2021-05-26 13:19:46   DIP             0000

     2021-05-26 13:19:46   Emitters        Emitters 14 13, EmTotal 27

     2021-05-26 13:19:46   PwrDays         0

     2021-05-26 15:11:41   Rainlevel       0

     2021-05-26 13:19:44   Reset           B

     2021-05-26 15:11:41   state           0

   fhem:
     classname  rsdata.class
     cache:
       readings:
         command:
           DIP        {s/DIP\s([0-9]+)/$1/;; $_;}
           Emitters   
           PwrDays    {s/PwrDays\s([0-9]+)/$1/;; $_;}
           Rainlevel  {s/R\s([0-9]+)/$1/;; $_;}
           Reset      {s/Reset\s(.)/$1/;; $_;}
         match:
           DIP        DIP.*\r\n
           Emitters   Emitters.*\r\n
           Parameters Baud\s(.*)\r\n
           PwrDays    PwrDays.*\r\n
           Rainlevel  R\s[0-9].*\r\n
           Reset      Reset.*\r\n
       specials:
         %NAME      RS.Data
         %TYPE      ECMDDevice
Attributes:
   DbLogExclude .*
   DbLogInclude Rainlevel
   IODev      RS
   devStateIcon 0:weather_cloudy_heavy_more
   room       Comm

Auszug aus der Log-Datei:

nach Abfrage mit r + newline

2021.05.26 13:31:40.430 5: RS: write r\n (\162\012), expect .*
2021.05.26 13:31:40.430 5: SW: 720a
2021.05.26 13:31:40.438 5: RS: read R (\122)
2021.05.26 13:31:40.443 5: RS: read  0\r\n (\040\060\015\012)
2021.05.26 13:31:40.444 5: RS: Spontaneously received  0\r\n (\040\060\015\012)
2021.05.26 13:31:40.445 5: RS: dispatch  0\r\n
2021.05.26 13:31:40.447 5: RS: partial message  0\r\n (\040\060\015\012) expired.
2021.05.26 13:31:40.448 5: RS: trying to match message  0\r\n (\040\060\015\012)
2021.05.26 13:31:40.453 5: RS: partial message  0\r\n (\040\060\015\012) kept

Gerät sendet selbst

2021.05.26 15:11:30.878 5: RS: read R  (\122\040)
2021.05.26 15:11:30.879 5: RS: Spontaneously received R  (\122\040)
2021.05.26 15:11:30.880 5: RS: dispatch R
2021.05.26 15:11:30.881 5: RS: trying to match message R  (\122\040)
2021.05.26 15:11:30.886 5: RS: partial message R  (\122\040) kept
2021.05.26 15:11:30.889 5: RS: read 1\r\n (\061\015\012)
2021.05.26 15:11:30.890 5: RS: Spontaneously received 1\r\n (\061\015\012)
2021.05.26 15:11:30.891 5: RS: dispatch 1\r\n
2021.05.26 15:11:30.892 5: RS: merging partial message R  (\122\040) and 1\r\n (\061\015\012)
2021.05.26 15:11:30.893 5: RS: trying to match message R 1\r\n (\122\040\061\015\012)
2021.05.26 15:11:30.897 5: RS: R 1\r\n (\122\040\061\015\012) matches regex R\s[0-9].*\r\n for reading Rainlevel of device wetter_rainsensor with class rsdata.class

2021.05.26 15:11:41.099 5: RS: read R  (\122\040)
2021.05.26 15:11:41.101 5: RS: Spontaneously received R  (\122\040)
2021.05.26 15:11:41.101 5: RS: dispatch R
2021.05.26 15:11:41.103 5: RS: trying to match message R  (\122\040)
2021.05.26 15:11:41.108 5: RS: partial message R  (\122\040) kept
2021.05.26 15:11:41.110 5: RS: read 0\r\n (\060\015\012)
2021.05.26 15:11:41.111 5: RS: Spontaneously received 0\r\n (\060\015\012)
2021.05.26 15:11:41.112 5: RS: dispatch 0\r\n
2021.05.26 15:11:41.113 5: RS: merging partial message R  (\122\040) and 0\r\n (\060\015\012)
2021.05.26 15:11:41.114 5: RS: trying to match message R 0\r\n (\122\040\060\015\012)
2021.05.26 15:11:41.116 5: RS: R 0\r\n (\122\040\060\015\012) matches regex R\s[0-9].*\r\n for reading Rainlevel of device wetter_rainsensor with class rsdata.class

Dr. Boris Neubert

Hallo,

es dauert 5 Sekunden, bis nach dem R noch das 0\r\n kommt. partial ist aber auf nur Warten für 3 Sekunden gesetzt. Partial auf 6 setzen sollte es bringen.

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

Jenno

Hallo Boris,

danke für die schnelle Reaktion. Das gesamte Schreiben und Lesen der Schnittstelle dauert laut Protokoll doch nur 23 ms?

Grüße Jens

Dr. Boris Neubert

Ach herrje, ich hab mich verguckt:

2021.05.26 13:31:40.438 5: RS: read R (\122)
2021.05.26 13:31:40.443 5: RS: read  0\r\n (\040\060\015\012)


Sind ja Millisekunden.

Die Zeile

2021.05.26 13:31:40.430 5: RS: write r\n (\162\012), expect .*

sagt mir, dass das expect alles matcht und damit gleich das erste R.

Definiere bitte mal ein get, dass auf R\s[0-9].*\r\n matcht.
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Jenno

Hallo,

das mit dem Parameter expect war das richtige Stichwort. Ich dachte die Antwort der Schnittstelle wird wie beim read eingelesen, die Verarbeitung erfolgt aber schon mit dem get.

Ich habe jetzt meine classdefs entsprechend angepasst (Reset=Rainlevel). get für die manuelle Abfrage des Gerätes, reading für das automatische senden des Gerätes.


get Rainlevel cmd {"r\n"}
get Rainlevel expect  "R\s[0-9]\r\n"
get Rainlevel postproc {s/R\s([0-9])\r\n/$1/;; $_;}
reading Rainlevel match "R\s[0-9]\r\n"
reading Rainlevel postproc {s/R\s([0-9])\r\n/$1/;; $_;}


Vielen Dank für die Hilfe
Jens