Komplett überarbeitetes ECMD und ECMDDevice vom 16.3.2014

Begonnen von kpwg, 20 März 2014, 20:40:17

Vorheriges Thema - Nächstes Thema

H_doc

Hallo Boris,

ECMD und ECMDDEVICEdefinitionen:

define somfyurtsi ECMD serial /dev/ttyUSB0@9600
attr somfyurtsi classdefs somfy=/opt/fhem/somfy.classdef
define Rollo_Essecke ECMDDevice somfy 05
attr Rollo_Essecke room Rolladen
attr Rollo_Essecke webCmd up:down:light:stop
define Rollo_kueche ECMDDevice somfy 06
attr Rollo_kueche room Rolladen
attr Rollo_kueche webCmd up:down:light:stop
define Rollo_Schlafzimmer ECMDDevice somfy 04
attr Rollo_Schlafzimmer room Rolladen
attr Rollo_Schlafzimmer webCmd up:down:light:stop
define Rollo_bad ECMDDevice somfy 03
attr Rollo_bad room Rolladen
attr Rollo_bad webCmd up:down:light:stop
define Rollo_heiner ECMDDevice somfy 02
attr Rollo_heiner room Rolladen
attr Rollo_heiner webCmd up:down:light:stop
define Rollo_helga ECMDDevice somfy 01
attr Rollo_helga room Rolladen
attr Rollo_helga webCmd up:down:light:stop



Die Classdef Datei sieht folgendermassen aus:

# Klassendefinition für SOMFY Rolläden
params motor
set up cmd {"01%motorU\r"}
# set up expect "01%motorU\r\n"
set down cmd {"01%motorD\r"}
# set down expect "01%motorD\r\n"
set stop cmd {"01%motorS\r"}
# set stop expect "01%motorS\r\n"
set light cmd {"01%motorU;;W6;;01%motorS\r"}
# set light expect {"01%motorU;;W6;;01%motorS\r\n"}


Die auskommentierten Zeilen sind schon für deine neue Version vorbereitet, aber bisher noch nicht aktiviert.

Gruß

Heiner


Dr. Boris Neubert

Hallo Heiner,

ich habe die Module mit Deinen Definitionen und Deiner Klassendefinition getestet und ich bekomme keinen Absturz. Alles funktioniert, wie es soll.

Hast Du beide Module aus meinem Beitrag aktualisiert? Kannst Du bitte FHEM neustarten?

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

H_doc

Hallo Boris,

ich habe es sicherheitshalber noch einmal aus deinem Post aktualisiert, um eine Verwechselung auszuschliessen. Exakt das gleiche Ergebnis.
Darüberhinaus kommen die Fehlermeldungen ja auch aus dem Logfile nach dem Neustart von fhem.
Wenn ich die "alten" Module zurückspiele, funktioniert alles wieder.
Ich habe leider die nächste Woche keine Zeit etwas auszuprobieren, da ich auf Dienstreise bin.

Gruß
Heiner

Dr. Boris Neubert

Hallo Heiner,

welche Perl-Version (perl -v) und welches Unix (uname -a)  benutzt Du?

Kannst Du bitte noch die beiden beanstandeten Zeilen wie folgt ändern?

Alt:

258 foreach my $classname (keys $IOhash->{fhem}{classDefs}) {
262 foreach my $r (keys $classDef->{readings}) {


Neu:

258 foreach my $classname (keys %{$IOhash->{fhem}{classDefs}}) {
262 foreach my $r (keys %{$classDef->{readings}}) {


Der Ausdruck hinter keys wird also mit %{ } umklammert.

Zitat von: H_doc am 06 April 2014, 18:12:43
Ich habe leider die nächste Woche keine Zeit etwas auszuprobieren, da ich auf Dienstreise bin.

Geht mir genauso. Also nächstes Wochenende müssen wir weitersuchen.

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

H_doc

Hallo Boris,

Perl version ist 5.10.0

Linux version ist 2.6.33.2 (läuft auf einem QNAP 419P

Rest dann nächste Woche,

Danke

Heiner


Tom_S

#35
hallo Boris,
danke für die Hilfe, bin jetzt erst dazu gekommen nochmal zu testen.

ZitatHat jemand auch explizit einen Anwendungsfall, bei dem das Gerät spontan Daten an FHEM sendet, also nicht als Antwort auf eine Anfrage durch FHEM?

ausgehend vom Beispiel in meinem 1. Post habe ich folgendes hinbekommen:
   mein Gerät sendet bei Änderung des Port A3 auf high "port 0 2 1\n" und "port 0 2 0\n" für low.
Ohne Definition in der classdev erhalte ich folglich im Eventmonitor:
   Global global UNDEFINED ECMDDevice message port 0 2 1
   Global global UNDEFINED ECMDDevice message port 0 2 0
In der classdev habe ich, wie in deinem Beispiel beschrieben, folgendes definiert:
   reading on match "^port 0 2 0\n$"  (low für on)
   reading off match "^port 0 2 1\n$"
Ich habe danach ein Reading on (port 0 2 0) ein Reading off (port 0 2 1) und state (offport 0 2 1)
Der Eventmonitor sagt nichts mehr.
Wenn ich den Status mit
   reading on postproc {substr($_, 9, 1) == 0 ? "" : "Fehler";}
   reading off postproc {substr($_, 9, 1) == 1 ? "" : "Fehler";}
ausfilter bekomme ich den korrekten state (on : off)
Soweit ok. allerdings sind diese Readings dann in allen definierten ECMDDevice
die auf der classdev aufbauen, also auch A1 A2 A4 usw.

ZitatAber so richtig klar ist mir das jetzt nicht. Da stehe ich wohl gerade auf der Leitung. Woher weis er welches logische ECMDDevice gemeint ist.

ZitatIn der aktuellen Version werden die %-Parameter im Match nicht ersetzt. Das könnte eine sinnvolle Erweiterung werden.

dann würde es warscheinlich funktionieren (oder für jedes Device eine eigene classdev).

Wie kann ich bei Eintreffen der Nachricht ein Event auslösen? (Damit sich das Symbol ändert)

Grüße
Tom_S
RaspberryPI2 + pilight, 3x AVR-NetIO, LW12, LW12HX, LW12FC; MAX-Lan, ESP8266, Arduino, H801, Neopixel, Solaredge, Modbus

Tom_S

#36
habe noch etwas getestet. Mein Gerät sendet jetzt einmal in der Minute alle OW Temperaturen in der Form
"OW 21,4 15,3 22,8 ..... \n"

die classdef sieht so aus
reading temp match "^OW .*"
reading temp postproc {my $a = substr($_, 3, -2,);\
my $hash = $defs{%NAME};\
my @temperature = split "[ \t]+", $a;\
readingsSingleUpdate($hash, "temperature 0", $temperature[0], 1);\
readingsSingleUpdate($hash, "temperature 1", $temperature[1], 1);\
readingsSingleUpdate($hash, "temperature 2", $temperature[2], 1);\
readingsSingleUpdate($hash, "temperature 3", $temperature[3], 1);\
readingsSingleUpdate($hash, "temperature 4", $temperature[4], 1);\
readingsSingleUpdate($hash, "temperature 5", $temperature[5], 1);\
readingsSingleUpdate($hash, "temperature 6", $temperature[6], 1);\
readingsSingleUpdate($hash, "temperature 7", $temperature[7], 1);\
}

Ich habe dann für jeden Sensor ein Reading.

mfg
RaspberryPI2 + pilight, 3x AVR-NetIO, LW12, LW12HX, LW12FC; MAX-Lan, ESP8266, Arduino, H801, Neopixel, Solaredge, Modbus

Dr. Boris Neubert

Hallo,

Zitat von: Tom_S am 11 April 2014, 12:59:07
habe noch etwas getestet. Mein Gerät sendet jetzt einmal in der Minute alle OW Temperaturen in der Form
"OW 21,4 15,3 22,8 ..... \n"

die classdef sieht so aus
...
}

Ich habe dann für jeden Sensor ein Reading.

Warum so aufwendig? Definiere in der classdef einfach 8 Temperatur-Readings temperature0 bis temperature7, die alle auf denselben Regex "^OW .*\n$" lauschen. ECMD ist nämlich mit Absicht so programmiert, daß alle Readings ausgewertet werden, bei denen einkommende Nachrichten auf das Regex passen. In den individuellen postprocs brauchst Du dann nur mit split die richtige Spalte rauszusuchen und zurückzugeben.

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

Tom_S

#38
hallo Boris,

meinst du
>reading temperature0 match "^OW .*"
>reading temperature0 postproc {split (/ /, $_, 2);}
usw.

Ist einfacher, gibt immer mehrere Lösungen, bin nur nicht darauf gekommen.
Gibt es auch eine Lösung für mein Problem mit den Ports? Da komme ich nicht weiter.

mfg Tom_S
RaspberryPI2 + pilight, 3x AVR-NetIO, LW12, LW12HX, LW12FC; MAX-Lan, ESP8266, Arduino, H801, Neopixel, Solaredge, Modbus

Dr. Boris Neubert

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

Tom_S

#40
habe es so probiert:

params port
reading on match "^port 0 %port 0\n$"
reading off match "^port 0 %port 1\n$"

geht nicht, das habe ich wohl noch nicht begriffen. Wie mache ich das mit einem Makro? Die Parameter gehen ja so nicht.
Gruß
RaspberryPI2 + pilight, 3x AVR-NetIO, LW12, LW12HX, LW12FC; MAX-Lan, ESP8266, Arduino, H801, Neopixel, Solaredge, Modbus

Dr. Boris Neubert

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

Tom_S

hallo Boris

LogTrafic 3

definiert habe ich

   reading on match "^port 2 4 1\n$"
   reading off match "^port 2 4 0\n$"


2014.04.12 13:05:32 3: NETIO91: read "port 2 4 1\n"
2014.04.12 13:05:52 3: NETIO91: read "port 2 4 0\n"
2014.04.12 13:06:02 3: NETIO91: read "port 2 5 1\n"
2014.04.12 13:06:02 2: autocreate: define ECMDDevice message port 2 5 1
2014.04.12 13:06:02 1: ERROR: Unknown module message
2014.04.12 13:06:06 3: NETIO91: read "port 2 5 0\n"
2014.04.12 13:06:06 2: autocreate: define ECMDDevice message port 2 5 0
2014.04.12 13:06:06 1: ERROR: Unknown module message

Port 2 4 wird erkannt, im Prinzip funktioniert es ja. Nur das ich keinen weiteren Port definieren kann bzw. alle über die classdef definierten Geräte (alle Pins) schalten wenn ein Match erkannt wird.

ich kann natürlich noch zB.:
   reading on match "^port 2 5 1\n$"
   reading off match "^port 2 5 0\n$"

aber dann ist egal was erkannt wird, alle Pins gehen gleichzeitig auf on oder off.

Tom_S
RaspberryPI2 + pilight, 3x AVR-NetIO, LW12, LW12HX, LW12FC; MAX-Lan, ESP8266, Arduino, H801, Neopixel, Solaredge, Modbus

Tom_S

wenn ich die Variablen verwende wird nichts erkannt.

params port pin
reading on match "^port %port %pin 1\n$"
reading off match "^port %port %pin 0\n$"

2014.04.12 13:23:42 3: NETIO91: read "port 2 4 1\n"
2014.04.12 13:23:42 2: autocreate: define ECMDDevice message port 2 4 1
2014.04.12 13:23:42 1: ERROR: Unknown module message
2014.04.12 13:23:52 3: NETIO91: read "port 2 4 0\n"
2014.04.12 13:23:52 2: autocreate: define ECMDDevice message port 2 4 0
2014.04.12 13:23:52 1: ERROR: Unknown module message
2014.04.12 13:23:58 3: NETIO91: read "port 2 5 1\n"
2014.04.12 13:23:58 2: autocreate: define ECMDDevice message port 2 5 1
2014.04.12 13:23:58 1: ERROR: Unknown module message
2014.04.12 13:24:06 3: NETIO91: read "port 2 5 0\n"
2014.04.12 13:24:06 2: autocreate: define ECMDDevice message port 2 5 0
2014.04.12 13:24:06 1: ERROR: Unknown module message

Gruß
RaspberryPI2 + pilight, 3x AVR-NetIO, LW12, LW12HX, LW12FC; MAX-Lan, ESP8266, Arduino, H801, Neopixel, Solaredge, Modbus

Dr. Boris Neubert

Füge bitte define und classdef als Anhang bei. Schaue später zuhause drauf.
B.
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!