Komplett überarbeitetes ECMD und ECMDDevice vom 16.3.2014

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

Vorheriges Thema - Nächstes Thema

Tom_S

@kpwg

Zitat
Das funktioniert leider nicht. es kommt dann nichts (mehr) zurück, war auch kein state ändert.

glaub ich dir nicht. Das Kommando kommt immer zurück.

es geht definitiv! Häng mal deine classdef an

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

kpwg

Ok, *lötkolbenkurzausschalt*, hier ist sie:

params byte1 byte2 byte3
set on cmd {"rfm12 2272 %byte1,%byte2,".sprintf(1+%byte3)." 76 10\n"}
set on expect "OK\n"
set on postproc {s/OK\n//; $_ }
set off cmd {"rfm12 2272 %byte1,%byte2,".sprintf(0+%byte3)." 76 10\n"}
set off expect "OK\n"
set off postproc {s/OK\n//; $_ }

Tom_S

mach einfach mal

set on cmd {"rfm12  2272 %byte1,%byte2,".sprintf(1+%byte3)." 76 10\n"}
set on expect ".*"
set on postproc {"$_" eq "OK\n" ? "" : "Fehler";}


und berichte
wenn es nicht geht, dann schreibe mal was ohne postproc zurück kommt.

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

kpwg

Ähnliches Ergebnis. Die classdef:
params byte1 byte2 byte3
set on cmd {"rfm12 2272 %byte1,%byte2,".sprintf(1+%byte3)." 76 10\n"}
set on expect ".*"
set on postproc {"$_" eq "OK\n" ? "" : "Fehler";}
set off cmd {"rfm12 2272 %byte1,%byte2,".sprintf(0+%byte3)." 76 10\n"}
set off expect ".*"
set off postproc {"$_" eq "OK\n" ? "" : "Fehler";}


Das Device schaltet zwar, state oder die Readings ändern sich aber nicht, da "nichts" zurückgegeben wird.

Tom_S

ja, jetzt habe ich gerade nochmal geschaut. Da ist ja schon die neue ECMDDevice im Update. Mit der geht es bei mir auch nicht. Bei leerem value wird jetzt nichts zurückgegeben. Weis nicht warum Boris das so geändert hat.

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

kpwg

#95
Zitat von: Tom_S am 21 April 2014, 11:22:48
ja, jetzt habe ich gerade nochmal geschaut. Da ist ja schon die neue ECMDDevice im Update. Mit der geht es bei mir auch nicht. Bei leerem value wird jetzt nichts zurückgegeben. Weis nicht warum Boris das so geändert hat.

LG

Danke für's Bestätigen. Bei Ext23 scheint's auch daran zu liegen.
Boris, kannst Du bitte nochmal schauen?

Dr. Boris Neubert

Hallo,

ich habe nochmal über die Verarbeitung nachgedacht. Soll-Zustand:
- Spontan empfangene leere Daten und set-/get-Kommandos ohne Wert setzen kein entsprechendes gleichnamiges Reading.
- state wird immer auf das letzte empfangene Reading oder das letzte set-/get-Kommando gesetzt.

Wer überschüssige Readings hat, kann diese mit "deletereading <devicename> <readingname>" entfernen.

Umgesetzt habe ich das in dieser Routine:

sub
ECMDDevice_Changed($$$)
{
        my ($hash, $cmd, $value)= @_;

        readingsBeginUpdate($hash);
        my $state= $cmd;

        if(defined($value) && $value ne "") {
          readingsBulkUpdate($hash, $cmd, $value);
          $state.= " $value";
        }
        readingsBulkUpdate($hash, "state", $state);
        readingsEndUpdate($hash, 1);
        my $name= $hash->{NAME};
        Log3 $hash, 4 , "ECMDDevice $name $state";
        return $state;
}


Diese ersetzt die gleichnamige Routine in 67_ECMDDevice.pm ab Zeile 107. Die Datei der Vollständigkeit halber auch anbei.

Könntet Ihr Drei (kpwg, ext23, Tom_S) bitte einmal testen, ob ein so verändertes 67_ECMDDevice.pm Euren Vorstellungen entspricht? Bei mir tut es in einem beschränkten Testfall, was es soll. Classdef:

params out
set on cmd { "setport %out.1\r\n" }
set on expect "^(ACK|NAK).*$"
set on postproc { "$_" eq "ACK\r\n" ? "" : "error" }
set off cmd { "setport %out.0\r\n" }
set off expect "^(ACK|NAK).*$"
set off postproc { "$_" eq "ACK\r\n" ? "" : "error" }




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

kpwg

#97
Perfekt! (Mal wieder) Danke, Boris!

Habe es soeben getestet und es funktioniert. Im Detail:

rfm12_2272.classdef params byte1 byte2 byte3
set on cmd {"rfm12 2272 %byte1,%byte2,".sprintf(1+%byte3)." 76 10\n"}
set on expect "OK\n"
set on postproc {s/OK\n//; $_ }
set off cmd {"rfm12 2272 %byte1,%byte2,".sprintf(0+%byte3)." 76 10\n"}
set off expect "OK\n"
set off postproc {s/OK\n//; $_ }


Damit ist das state on bzw off und lässt sich ohne weitere "Zutaten" mit Druck auf's Symbol toggeln, was bedeutet, das ich nun on und off sauber zurück bekomme. Ich hatte noch alte readings on und off stehen, die ich nun gelöscht habe. Damit verhält sich das Device so, das man auch mit Extend devStateIcon arbeiten kann. Erhöht den WAF ungemein  8)

Viele Grüße, Ricardo

Tom_S

hallo Boris,

so funktioniert alles. Für spontan empfangene Nachrichten habe ich jetzt ein Reading wenn Value nicht leer ist.
Sehr schön und
Zitat
Wer überschüssige Readings hat, kann diese mit "deletereading <devicename> <readingname>" entfernen.

wieder was gelernt.

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

Heinz

Hallo,
ich habe da noch ein Problem mit meinen 1wire-Temperatur-Sensoren.
Nachdem ich ich die Classdeff wie folgt umgeschrieben habe:

# Uebergabeparameter Onewire Geräte ID
params devID
# Umsetzung in ECMD Befehle 1w get = Tempwert lesen
get T: cmd {"1w get %devID\n"}
get T: expect ".*"
get T: postproc {\
my $hash  = $defs{%NAME};\
my $temperature = $_;\
\
readingsSingleUpdate($hash, "temperature", $temperature, 1);\
readingsSingleUpdate($hash, "T:", $temperature, 1);\
readingsSingleUpdate($hash, "state", $temperature, 1);\
\
}

hat auch allem Anschein nach erst mal alles geklappt. Nach einiger Zeit spielte dann
der erste von 4 Sensoren verrückt. Er gab als Rückgabewert 16a oder 16b oder ähnliches zurück.
Daraufhin habe ich die Temperaturen in der Ethersex Index Page kontrolliert. Da ist mir dann
aufgefallen das alle Temperaturen nicht passten. Als ob die nicht aktualisiert wurden.

Daraufhin habe ich in der Classdeff das Messen aus dem Wiki Eintrag wieder eingefügt.
Wenn ich jetzt set messen ausführe und dann get temperature bekomme ich bei
dem ersten Sensor ein OK und bei den anderen den echten aktuellen Wert.
Wenn ich dann nochmal ges temperature mache funktioniert auch der erste.

Eventuell hat ja jemand einen Tipp was ich noch falsch mache.

Vielen dank im voraus.

Heinz

kpwg

Heinz,

da würde ich (selbst) dieser Tage nachsehen, wie die classdef mit messen + lesen aussehen müsste. Ich habe aktuell gute Erfahrung mit dem Polling in E6 gemacht, aber mal ehrlich: wer geht schon nochmal an seinen verbauten NetIO 'ran und stellt das um?  ;)

Die 1wire.classdef sieht hier aktuell so aus:
# Uebergabeparameter Onewire Geräte ID
params devID
# Umsetzung in ECMD Befehle 1w get = Tempwert lesen
get T: cmd {"1w get %devID\n"}
get T: expect "\d+.\d\n"
get T: postproc {\
my $hash  = $defs{%NAME};\
my $temperature = $_;\
\
readingsSingleUpdate($hash, "temperature", $temperature, 1);\
readingsSingleUpdate($hash, "state", $temperature, 1);\
\
}

Das readingsSingleUpdate für T: entfiel, weil ja bereits T: gesetzt wird. Aber das sind Kleinigkeiten.
Beim expect ist man mit .* immer erst mal auf der funktionierend sicheren Seite; ich schaue mir jedoch mit logtraffic 0 im ECMDDevice an, was tatsächlich kommt und wie man das in perl beschreiben kann. Das hat nur nix mit Deinem Problem zu tun.

Aktuell habe ich funktionierende classdef's für 1wire-Sensoren, DHT22, LCD, Schalten mit control6, RFM12-Intertechno und RFM12-2272.
Beim ADC bin ich noch am frickeln- prinzipiell funktioniert es schon. Dabei verfolge ich in allen classdef's das Ziel, zu anderen Sensoren vergleichbare readings zu generieren, um die Weiterverarbeitung universeller zu halten. So ganz ohne Programmierkenntnisse...  8)

Es wäre gut, wenn Andere ihre classdef's hier vorstellen. Ich zeige meine nochmals komplett, wenn Boris den Patch vom 22.04. zum Update bereitstellt. Ein paar kleine Dinge wurden in der Zwischenzeit optimiert.

Viele Grüße, Ricardo

Dr. Boris Neubert

Zitat von: kpwg am 25 April 2014, 16:34:35
Es wäre gut, wenn Andere ihre classdef's hier vorstellen. Ich zeige meine nochmals komplett, wenn Boris den Patch vom 22.04. zum Update bereitstellt.

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

ThomasW

Hallo,

nach einem Update von heute (das letzte vor 14Tagen) ging das Einlesen der 1Wire-Temperatirewerte vom  AVR-Net-Io nicht mehr.
Nach Anpassungen in der Classdef (nach Ricardo)

# Uebergabeparameter Onewire Geräte ID
params devID
# Umsetzung in ECMD Befehle 1w get = Tempwert lesen
get T: cmd {"1w get %devID\n"}
get T: expect "\d+.\d\n"
get T: postproc {\
my $hash  = $defs{%NAME};\
my $temperature = $_;\
\
readingsSingleUpdate($hash, "temperature", $temperature, 1);\
readingsSingleUpdate($hash, "state", $temperature, 1);\
\
}

und weiteren Änderungen in der conf

define NETIO_01 ECMD telnet 192.168.178.105:2701
attr NETIO_01 classdefs ONEWIRE=/opt/fhem/InternerSpeicher/onewire.classdef
#set NETIO_01 reopen
attr NETIO_01 room System

define WZ_Temp03 ECMDDevice ONEWIRE 2853b9f5040000bb
attr WZ_Temp03 alias Heizung
attr WZ_Temp03 room Heizung
define 1Wire_Temp03 at +*00:05 get WZ_Temp03 T:
attr 1Wire_Temp03 room hidden

define Log_Heizung FileLog ./log/Heizung-%Y-%m.log WZ_Temp03:(temperature).*
attr Log_Heizung room LogFiles
define weblink_Heizung SVG Log_Heizung:1wtempHz:CURRENT
attr weblink_Heizung label "Temperaturen des Warmwasserspeichers"
attr weblink_Heizung plotsize 1240,420
attr weblink_Heizung room Heizung

konnte ich wieder die Temperaturwerte logen. Aber mit einem Schönheitsfehler.
Im Log-File bzw. Heizungs-Log-File sind zwischen den Messwerten Leerzeilen.

Weiter betätigt man bei den Internals die GET-Taste kommt eine Fehlermeldung.
"WZ_Temp03 error: unknown argument T, choose one of T: "

Sind jetzt keine Fehler mit denen man nicht leben könnte, wollte aber dennoch darauf hinweisen.

Einen schönen Tag wünscht euch - Thomas
FHEM auf RPi Rev.2 mit COC, FS20-Module, LAN-Steckdosen, JeeLink - 4x LaCrosse-Sensoren

Dr. Boris Neubert

Zitat von: ThomasW am 26 April 2014, 12:09:13
Weiter betätigt man bei den Internals die GET-Taste kommt eine Fehlermeldung.
"WZ_Temp03 error: unknown argument T, choose one of T: "

Das liegt an der Idee, einen Doppelpunkt in den Namen des Readings einzubauen. Ein Wunder, daß es überhaupt funktioniert. Warum brauchst Du das?

Ich würde noch den Zeilenumbruch aus dem Reading herausschneiden:


s/\n//g


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

kpwg

Zitat von: Dr. Boris Neubert am 26 April 2014, 12:24:33
Das liegt an der Idee, einen Doppelpunkt in den Namen des Readings einzubauen. Ein Wunder, daß es überhaupt funktioniert. Warum brauchst Du das?

Ich würde noch den Zeilenumbruch aus dem Reading herausschneiden:


s/\n//g


Grüße
Boris

Stimmt, das T: kann funktionieren, muss nicht. Habe es geändert und auch den Zeilenumbruch wie empfohlen entfernt.
Damit habe ich jetzt folgenden Stand:
(http://abload.de/img/20140426_1wire1ckl4.jpg)

und die 1wire.classdef:
# Uebergabeparameter Onewire Geräte ID
params devID
# Umsetzung in ECMD Befehle 1w get = Tempwert lesen
get T cmd {"1w get %devID\n"}
get T expect "\d+.\d\n"
get T postproc {\
s/\n//g;\
my $hash  = $defs{%NAME};\
my $temperature = $_;\
\
readingsSingleUpdate($hash, "temperature", $temperature, 1);\
readingsSingleUpdate($hash, "state", $temperature, 1);\
\
}


Sowie das regelmäßige auslesen:
define 1w_Messung at +*00:05 get Sensor_1 T;; get Sensor_2 T;; get Sensor_3 T;; get Sensor_4 T

Vielleicht lässt sich das noch kürzen, wenn man extrem viele Sensoren hat?

Viele Grüße, Ricardo