Übersetzung/Umwandlung von Ergebnis-Werten

Begonnen von NeuFehm, 08 August 2014, 09:04:57

Vorheriges Thema - Nächstes Thema

NeuFehm

Mein Temperaturfühler liefert einen dezimalwert (0-255), Beispiel "74".

Dies entspricht einer Temperatur von 22,1°C.
Da der Fühler nicht linear arbeitet, habe ich für alle Dezimalwerte eine Tabelle aus der ich dann die
dazugehörige Temperatur ablesen kann.

Wo und wie kann ich diese "Übersetzung" der Werte eintragen, sodass ich als Antwort 22,1 statt 74 bekomme?

meine classdef, die die "74" liefert:
#Senden der Temperaturabfrage
set temp cmd {chr(35).chr(84).chr(34).chr(97).chr(13).chr(10)}
Aus dem Ergebnis die richtige Stelle lesen und in dezimal umwandeln
set temp postproc {ord(substr($_,5,1))}
Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul

fiedel

Sieh dir mal "userreadings" und "stateformat" an. Damit kannst du deine Formel integrieren und das Ergebnis als "state" des Sensors anzeigen lassen.

Gruß

Frank
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

NeuFehm

Habe mal die classdef zum Test erweitert(Rückgbewert ohne Umwandlung "074" sollte dann 21.2 erzeugen):

set newtemp cmd {chr(35).chr(84).chr(34).chr(97).chr(13).chr(10)}
set newtemp postproc {\
my %temps = ('073'=>20.7,'074'=>21.2,'075'=>21.6);\
$temps{ord(substr($_,5,1))};\
}


ERzeugt aber eine Fehlermeldung :(

No such class temps at (eval 1393) line 1, near "{my temps" syntax error at (eval 1393) line 1, near "my temps =" Global symbol "%temps" requires explicit package name at (eval 1393) line 1.
Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul

NeuFehm

Hallo Frank,
mit den userReadings komm ich noch nicht klar....
bleibe aber dran...
Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul

fiedel

Hi,

mit der Classdef würde ich nicht klarkommen.  ;)

Hier mal ein einfaches Beispiel für ein Userreading, damit du die Funktion erkennst (einfach Formel mit Faktor oder Wert anlegen):

define Sens_TF_Aussen CUL_WS 6
attr Sens_TF_Aussen event-min-interval state:600
attr Sens_TF_Aussen event-on-change-reading state
attr Sens_TF_Aussen event-on-update-reading .*
attr Sens_TF_Aussen fp_0_Hauptbildschirm 350,486,4,Aussen
attr Sens_TF_Aussen group Geräte_Sensoren
attr Sens_TF_Aussen icon temp_outside
attr Sens_TF_Aussen room 5_System
attr Sens_TF_Aussen userReadings T_Aussen_korr {ReadingsVal("Sens_TF_Aussen", "temperature", "0")+10.5;;}



Und hier mal  ein komplizierteres, damit du siehst, was in etwa möglich ist (es geht noch viel mehr, da man ja eine kompl. Perlfunktion einbauen kann - auch nichtlineare Berechnungen):


attr OW_Counter userReadings displayA {ReadingsVal("OW_Counter","counters.A",0)/75.0+AttrVal("OW_Counter","offsetA",0);;}, consumption_power differential {ReadingsVal("OW_Counter","counters.A",0)*3600*0.01333333333333;;}, daily_power {ReadingsVal("OW_Counter","displayA",0)-Value("Dum_DP_Diff_D");;}, displayB {ReadingsVal("OW_Counter","counters.B",0)/100.0+AttrVal("OW_Counter","offsetB",0);;}, consumption_gas differential {ReadingsVal("OW_Counter","counters.B",0)*3600*0.01;;}, daily_gas {ReadingsVal("OW_Counter","displayB",0)-Value("Dum_DG_Diff_D");;}


Gruß

Frank
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

NeuFehm

Prinzip verstanden! Danke!
Allerdings müsste ich dann für die nichtliniearen Wertepaare eine Funktion ermitteln, mit der ich dann meine Werte in Temperaturen umrechne. Leider ist die Kennlinie nicht liniear, so dass ich als "Nichtmathematiker" das nicht hinbekomme.
Grundsätzlich glaube ich, dass die Funktion alles hin und her rechnen kann, aber ich habe keine Formel :)

Ich such also eine Möglichkeit, wo ich sagen kann: wenn 1, dann 4, wenn 2 dann 5, wenn 3 dann 7, wenn 4 dann 10....

mein Ansatz:
set temp postproc {\
my @temps = ('068'=>18.5,'069'=>18.9,'070'=>19.4,'071'=>19.8,'072'=>20.3,'073'=>20.7,'074'=>21.2,'075'=>21.6,'076'=>22.1,'077'=>22.5,'078'=>23.0);\
$_ = $temps{ord(substr($_,5,1))};\
}

Aber hier gibt es Sysntax-Errors :(
Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul

NeuFehm

Schade,

hatte endlich was "ähnliches" gefunden:

attr mytermo rawToReadable 070:19 071:19 072:20 073:20 074:21

aber das funktioniert nicht mit einem ECMD-Device offensichtlich :(
Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul

NeuFehm

HURRA!!!!:

meine Werte werden nun umgewandelt. :)
Die Fehler kamen, weil der classdef--Code doch ein wenig "erweitert" ist.
So muss man für einen hash statt (wie hier) %temps - %%temps schreiben.
Die Definitionszeile: my $temps = 21;;\ kann man glaube ich auch kürzen,
indem man die Zeile $_= $temps{ord(substr($_,5,1))};;\ so schreibt:
$_= my $temps{ord(substr($_,5,1))};;\
aber das ist noch nicht getestet.
Hier auf jeden Fall das funktionierende Endergebnis.
DANKE allen Kommentaren!

Inhalt meiner temp.classdef:

set temp cmd {chr(35).chr(84).chr(34).chr(97).chr(13).chr(10)}
set temp postproc {\
my $temps = 21;;\
my %%temps = (\
"0"=>-40.5,\
"1"=>-38.9,\
"2"=>-37.3,\
"3"=>-35.7,\
----
usw.
----
"254"=>158.2,\
"255"=>160.4);;\
$_= $temps{ord(substr($_,5,1))};;\
}
Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul

Puschel74

Hallo,

Beitrag NICHT schliessen - ein Gelöst vor den titel genügt.
Danke.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.