Hallo,
versuche schon seit langem aus dem NETIO analog Werte einzulesen und umzurechenn und anschliessend zu speichern. Es will mitr aber nicht gelingen. Das Einlesen läuft wie beschrieben, doch wie kann man diese dann einer Funktion übergeben und dann in ein File speichern.
Meine ersten Versuche unter FHEM Perl schauen so aus, Fehler bekomme ich keine, Werte aber auch nicht, diese werden nur im EventMonitor angezeigt bzw. auf der "Everything-Seite".
define Messung_adc at +*00:01 get MP_0 portvalue;;
attr Messung_adc verbose 0
Das File wurde angelegt, jedoch ohne Werte. ich dachte mit get werden die Daten geholt und in portvalue gespeichert.
# log Temp to database
define TempLog FileLog ./log/temp-%d-%m.log portvalue #{ CalcTemp(portvalue) }
Ein Versuch zum Umrechnen hätte ich in einer Funktion in meine 99_myUTILS.pm hinterlegt
sub CalcTemp($) {
my ($Data) = @_;
$Data=$Data+1;
return($Data);
}
Gruß
Hallo,
das ist zu wenig Kontext, um Dir helfen zu können. Bitte den angehefteten Beitrag http://forum.fhem.de/index.php/topic,25748.0.html (http://forum.fhem.de/index.php/topic,25748.0.html) beachten.
Viele Grüße
Boris
Hallo,
hoffe nun alles beisammen zu haben:
hier die Definition des AVR NETIOs:
define NETIO1 ECMD telnet 192.168.1.98:2701
attr NETIO1 classdefs ONEWIRE=/opt/fhem/onewire.classdef:RELAIS=/opt/fhem/relais.classdef:RFM12=/opt/fhem/intertechno.classdef:ADC=/opt/fhem/netioadc.classdef
#attr NETIO1 eventMap /on:Activ/off:Inactiv/
attr NETIO1 room Interfaces
define MP_0 ECMDDevice ADC 4
attr MP_0 IODev NETIO1
und ein Auszug aus dem Log File:
2015.01.16 19:59:49 4: HTTP FHEMWEB:192.168.1.20:61414 GET /fhem?XHR=1&inform=type=status;filter=;since=1421434787;fmt=JSON×tamp=1421434785379
2015.01.16 19:59:51 4: Connection closed for FHEMWEB:192.168.1.20:61414: EOF
2015.01.16 19:59:51 4: Connection accepted from FHEMWEB:192.168.1.20:61417
2015.01.16 19:59:51 4: HTTP FHEMWEB:192.168.1.20:61417 GET /fhem?cmd=style%20edit%20fhem.cfg
2015.01.16 19:59:51 4: 5452:FHEMWEB:192.168.1.20:61417: /fhem?cmd=style%20edit%20fhem.cfg / RL:2235 / text/html; charset=UTF-8 / Content-Encoding: gzip
/
2015.01.16 19:54:29 5: Cmd: >get MP_0 portvalue<
2015.01.16 19:54:29 5: ECMDDevice: Analyze command >{"adc get 4\n"}<
2015.01.16 19:54:29 5: NETIO1: sending command "adc get 4\n"
2015.01.16 19:54:29 5: SW: 6164632067657420340a
2015.01.16 19:54:29 5: NETIO1: received answer "0AC \n"
2015.01.16 19:54:29 5: Postprocessing "0AC \n" with perl command {hex(trim("$_"))}.
2015.01.16 19:54:29 5: Postprocessed value is "172".
2015.01.16 19:54:29 5: Triggering MP_0 (2 changes)
2015.01.16 19:54:29 5: Notify loop for MP_0 portvalue: 172
2015.01.16 19:54:29 4: eventTypes: ECMDDevice MP_0 portvalue: 172 -> portvalue: .*
2015.01.16 19:54:29 4: eventTypes: ECMDDevice MP_0 portvalue 172 -> portvalue .*
2015.01.16 19:54:29 4: eventTypes: ECMDDevice MP_0 state: portvalue 172 -> state: portvalue .*
2015.01.16 19:52:29 5: Cmd: >define TempLog FileLog ./log/temp-%d-%m.log portvalue<
2015.01.16 19:52:29 5: Cmd: >define heizung readingsGroup t1:MP_0 t2:MP_1<
die besten PERL Kenntnisse habe ioch leider noch nicht, da ich erst damit anfange, ich hoffe aber trotzdem etwas Hilfe zu bekommen.
Zitat von: Maxl am 16 Januar 2015, 20:03:13
hoffe nun alles beisammen zu haben:
/opt/fhem/netioadc.classdef?
Hallo,
schon unterwegs:
netioadc.classdef:
# Uebergabeparameter Portnummer des internen Analogeingangs
params PortID
# Umsetzung in ECMD Befehle
# value = Rückgabewert in 0-100%, je nach eingestelltem Referenzwert im Attribut "Referenz"
# Gleichzeitig wird das Reading "status" gesetzt, je nach eingestelltem Schwellwert
# status = on => gemessener Wert liegt unter dem Schwellwert
# status = off => gemessener Wert liegt über dem Schwellwert
# portvalue = originaler Rückgabewert des NET-IO in Dec umgerechnet um einen Referenzwert ermitteln zu können
get value cmd {"adc get %PortID\n"}
get value expect ".*"
get value postproc {\
my $hexval = hex(trim("$_"));\
my $refval = trim(AttrVal("%NAME","referenz",1024));\
my $retval = $hexval*100/$refval;\
my $hash = $defs{%NAME};\
my $status = "off";\
my $schwellwert = trim(AttrVal("%NAME","schwellwert",30));\
\
$status = "on" if ($retval < $schwellwert);\
\
readingsSingleUpdate($hash, "status", $status, 1);\
\
$retval;\
}
get portvalue cmd {"adc get %PortID\n"}
get portvalue expect ".*"
get portvalue postproc {hex(trim("$_"))}
adc.classdef:
get value cmd {"adc get %PortID\n"}
params PortID
get value expect ".*"
get value postproc {\
my $hexval = hex(trim("$_"));\
my $hash = $defs{%NAME};\
readingsSingleUpdate($hash, "state", $hexval, 1);\
}
Zitat von: Maxl am 16 Januar 2015, 17:27:41
# log Temp to database
define TempLog FileLog ./log/temp-%d-%m.log portvalue #{ CalcTemp(portvalue) }
Hier ist der Fehler: dein Regexp portvalue ist falsch, es muss vermutlich
MP_0:portvalue.*
heißen.
Grüße
Boris
Danke hat funktioniert :)
Nur mal eine Frage zum Verständnis, ich beschäftige mich auch gerade mit dem Pollin AVR-NET-IO Board.
Warum hast du eine netioadc.classdef und eine adc.classdef??
VG
Frank
Hallo,
ist zweimal das Gleiche, nur von unterschiedlichen Seiten heruntergeladen.
Gruß
Maxl