Hallo DOIF Freunde,
ich habe folgendes Problemchen - die Messung mithilfe einer pHSonde benötigt einen aktuellen Temperaturwert. (TemperaturCompensation)
Nun habe ich folgendes gebastelt...
Internals:
CFGFN
DEF ([PoolTemp:d] + 0.5 > [pHSonde:Set_ReadTempComp]) (set pHSonde TemperaturCompensation [PoolTemp])
FUUID 62939592-f33f-cc16-aaa7-5ad398b5b3c10f96
MODEL FHEM
NAME PoolTemp_DOIF_1
NOTIFYDEV pHSonde,PoolTemp,global
NR 3648
NTFY_ORDER 50-PoolTemp_DOIF_1
STATE initialized
TYPE DOIF
VERSION 26020 2022-05-03 16:28:02
READINGS:
2022-05-29 17:58:40 cmd 0
2022-05-29 17:58:40 mode enabled
2022-05-29 17:58:40 state initialized
Regex:
accu:
collect:
cond:
PoolTemp:
0:
d ^PoolTemp$:^d:
pHSonde:
0:
Set_ReadTempComp ^pHSonde$:^Set_ReadTempComp:
attr:
cmdState:
wait:
waitdel:
condition:
0 ::ReadingValDoIf($hash,'PoolTemp','d') + 0.5 > ::ReadingValDoIf($hash,'pHSonde','Set_ReadTempComp')
do:
0:
0 set pHSonde TemperaturCompensation [PoolTemp]
1:
helper:
NOTIFYDEV pHSonde,PoolTemp,global
globalinit 1
last_timer 0
sleeptimer -1
readings:
all PoolTemp:d pHSonde:Set_ReadTempComp
uiState:
uiTable:
Attributes:
PoolTemp ist ein 1Wire Sensor - nicht jede Änderung soll zur pHSonde geschickt werden. Deswegen +0.5 wenn also die Änderung der Temperatur 0.5° übersteigt soll der neue Wert als TemperaturCompensation benutzt werden. In pHSonde:Set_ReadTempComp steckt der aktuell an der Sonde hinterlegte Wert.
Kurze Rede langer Sinn - es funktioniert nicht. Und mein Konstrukt ist noch nicht vollständig - natürlich soll die Compensation auch gesetzt werden wenn die Temperatur um mehr als 0.5° gefallen ist. Zusätzlich macht das ganze eigentlich nur Sinn wenn die Pumpe des Pools läuft.
Habt Ihr eine Idee warum es nicht funktioniert? Habt Ihr vielleicht einen besseren Ansatz?
Zitatwenn also die Änderung der Temperatur 0.5° übersteigt
Veränderung 0,5 zu was?
Hallo
für den ersten Teil
(abs([PoolTemp:d] - [pHSonde:Set_ReadTempComp])>0.5)
beim zweiten Teil sollte m.M mindestens
(set pHSonde TemperaturCompensation [PoolTemp:d])
drin stehen
Nabend Damian,
der PoolTemp ist ein OneWire Sensor, dessen Messwert soll an die pHSonde als Temperatur Compensations Wert übergeben werden. Aber eben nicht bei jeder Änderung. Nur wenn die Änderung > + oder - 0,5 ist.
in pHSonde:Set_ReadTempComp steht der zuletzt übergebene Wert.
Zitat von: der-Lolo am 29 Mai 2022, 21:21:04
Nabend Damian,
der PoolTemp ist ein OneWire Sensor, dessen Messwert soll an die pHSonde als Temperatur Compensations Wert übergeben werden. Aber eben nicht bei jeder Änderung. Nur wenn die Änderung > + oder - 0,5 ist.
in pHSonde:Set_ReadTempComp steht der zuletzt übergebene Wert.
siehe Lösungsansatz von DetlefR oder
([PoolTemp:d] > [pHSonde:Set_ReadTempComp] + 0.5)
Hm, Danke erstmal - leider läuft es auf einen error raus...
2022.05.29 21:58:56 3: eval: pushTemp2pHSonde: warning in condition c01
2022.05.29 21:58:56 1: PERL WARNING: Argument "" isn't numeric in numeric gt (>) at (eval 4003) line 1.
Ich dachte mit dem :d setze ich ja schon darauf nur zahlen zu holen..
Na wie sieht denn PoolTemp und pHSonde aus.
Schick mal von beiden ein list.
Gruß Detlef
Ich habe sowas mit event-on-change-reading realisiert.
attr event-on-change-reading PoolTemp:0.5
Wenn PoolTemp deinen Messwert enthält......
Wenn ich das mit event-on-change-reading mache - habe ich ja keine aktuelle Temperatur mehr, oder?
list PoolTemp:
Internals:
ALARM 1
DEF DS18B20 9DA76A080000
ERRCOUNT 0
FUUID 60cb51c4-f33f-cc16-6b74-28e19a6efddf234b
INTERVAL 10
IODev 1wire
NAME PoolTemp
NOTIFYDEV global
NR 37
NTFY_ORDER 50-PoolTemp
OW_FAMILY 28
OW_ID 9DA76A080000
PRESENT 1
ROM_ID 28.9DA76A080000.29
STATE T: 18.25 °C ↓
TYPE OWTHERM
owg_cf 12
owg_temp 18.25
owg_th 75
owg_tl 70
READINGS:
2022-05-29 20:09:55 IODev 1wire
2022-05-30 17:51:19 statTemperatureDay Min: 13.5625 Avg: 16.0670 Max: 18.2500
2022-05-29 23:59:55 statTemperatureDayLast Min: 15.6875 Avg: 17.3080 Max: 18.1875
2022-05-30 17:51:19 statTemperatureHour Min: 17.6250 Avg: 18.2103 Max: 18.2500
2022-05-30 16:59:55 statTemperatureHourLast Min: 17.6875 Avg: 17.7533 Max: 17.8125
2022-05-30 17:51:19 statTemperatureMonth Min: 0.6875 Avg: 16.3499 Max: 25.1250
2021-11-30 23:59:55 statTemperatureMonthLast Min: 6.9375 Avg: 12.1206 Max: 17.6250
2022-05-30 17:51:19 statTemperatureYear Min: 0.6875 Avg: 16.8275 Max: 28.1250 (since: 2021-07-09_21:55:16 )
2022-05-30 17:51:19 state T: 18.25 °C ↓
2022-05-30 17:51:19 temperature 18.25
helper:
_98_statistics Statistik
tempf:
factor 1
offset 0
Attributes:
IODev 1wire
group Temperaturen
model DS18B20
resolution 12
room 06-Temperaturen,00-Values
tempHigh 75
tempLow 70
list pHSonde:
Internals:
DEF 99
FUUID 606980e7-f33f-cc16-b4ff-05c0e4d14fb5a2e3
I2CBUS_SENDSTAT Ok
I2C_Address 99
IODev I2CBUS
NAME pHSonde
NR 27
STATE S: 1 pH: 8.250
TYPE I2C_EZOPH
READINGS:
2022-05-29 20:09:55 IODev I2CBUS
2022-05-29 21:53:05 Set_ReadTempComp 16.3
2022-05-08 10:42:16 Set_pHCalHigh Cal,high,10.00
2022-05-08 10:37:28 Set_pHCalLow Cal,low,4.00
2022-05-08 10:39:54 Set_pHCalMid Cal,mid,7.00
2022-05-08 10:16:28 Set_pHCalReset Cal,clear
2022-05-30 17:52:02 Status 1
2022-05-30 17:52:02 pH 8.250
2022-05-30 17:52:02 state S: 1 pH: 8.250
Attributes:
IODev I2CBUS
event-on-change-reading pH
poll_interval 5
room 03-I2C-Sensoren
Na ja, wohl wahr. Dein Thermometer ist auf 0,5 Grad genau?
Ich empfehle, die Sache mit den Events (und damit die Philosophie von Fhem) noch mal anzuschauen.
A) liegt die aktuelle Temperatur weiter vor, allerdings im Rahmen der vorgegeben Genauigkeit (falls man diese einschränkt)
B) solltest du mal das gewünschte Verhalten beschreiben, ich (!) glaube, du hast dich etwas verrannt.
Probier mal
(abs([PoolTemp:temperature] - [pHSonde:Set_ReadTempComp])>0.5)
und
(set pHSonde TemperaturCompensation [PoolTemp:temperature])
In "temperature" steht eine Zahl und nicht wie in "STATE" ein Text mit Trendanzeige.
Gruß Detlef
Ok, ich dachte es wäre schon soweit klar worum es geht...
Ich habe eine pHSonde, die misst im Poolwasser den pH Wert. Die Elektronik der pH Messung erwartet einen Temperaturwert, um den pH-Messwert anhand der Wassertemperatur anzupassen. Wie genau das verarbeitet wird kann ich nicht sagen, es ist quasi eine "BlackBox". Wenn der pHSonde ein Temperaturwert übergeben wurde - wird dieser Wert als Reading wieder ausgelesen und dargestellt.
Ich habe OneWire Sensoren am Pool - PoolTemp ist einer dieser Sensoren, die Temperatur die von diesem Sensor gemessen wird soll an die pHSonde weitergereicht werden. Um das nun ein bisschen zu "glätten" und nicht ständig einen neuen Wert an die Sonde zu schicken wollte ich gerne realisieren, dass:
1. der Sonde ein Temperaturwert gegeben wird - kann auch händisch geschehen. ( set pHSonde TemperatureCompensation xx.x ) - nur ein Startwert...
2. der eingegebene Wert steht von nun an im Reading Set_ReadTempComp der pHSonde.
3. Wenn die Abweichung des PoolTemp Sensors > als 0.5° vom Reading Set_ReadTempComp der Sonde ist -> soll der PoolTemp Wert mit set pHSonde TemperaturCompensation an die pHSonde übergeben werden.
4. Nächste TemperaturCompensation anpassung wenn die Abweichung wieder >0.5° ist... also do allways wenn die Bedingung erfüllt ist.
5. Toll wäre wenn das konstrukt in beide Richtungen funktioniert - wenn das Wasser kälter oder wärmer (+-0.5°) wird soll ein neuer Wert gesetzt werden.
War die erklärung gut genug? Es ist auch mit Technischem Verständnis manchmal schwierig eine gewünschte Funktion zu beschreiben.
Danke DetlefR - ich glaube es läuft jetzt... Ärgerlich ist mal wieder nur das ich nicht selbst darauf gekommen bin.
Dann würde ich einfach event-on-change-reading auf 0 5 einstellen und jede Änderung übertragen.
DOIF ([PoolTemp:temperature]) set pHSonde TemperatureCompensation [PoolTemp:temperature])