Temperaturwert nach Änderung > 0.5 übertragen

Begonnen von der-Lolo, 29 Mai 2022, 18:10:10

Vorheriges Thema - Nächstes Thema

der-Lolo

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?

Damian

Zitatwenn also die Änderung der Temperatur 0.5° übersteigt

Veränderung 0,5 zu was?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

DetlefR

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

der-Lolo

#3
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.

Damian

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)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

der-Lolo

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..


DetlefR

Na wie sieht denn PoolTemp und pHSonde aus.
Schick mal von beiden ein list.

Gruß Detlef

isy

Ich habe sowas mit event-on-change-reading realisiert.
attr event-on-change-reading PoolTemp:0.5

Wenn PoolTemp deinen Messwert enthält......
Ein Weg wird erst zu einem Weg, wenn man ihn geht

der-Lolo

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



isy

Na ja, wohl wahr. Dein Thermometer ist auf 0,5 Grad genau?
Ein Weg wird erst zu einem Weg, wenn man ihn geht

Per

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.

DetlefR

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

der-Lolo

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.

der-Lolo

Danke DetlefR - ich glaube es läuft jetzt... Ärgerlich ist mal wieder nur das ich nicht selbst darauf gekommen bin.

Per

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])