FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Frood42 am 02 April 2019, 16:06:05

Titel: Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Frood42 am 02 April 2019, 16:06:05
Das scheint eine einfache Frage, aber trotz Brain 2.0 kann ich nach 2-3 Tagen nicht sagen, dass ich die optimale Lösungen gefunden habe.

Da ist ein Ventilator im Schrank und ein Temperatur Sensor.
Wenn die Temperatur > 28 ist, soll der Ventilator angehen, sonst aus.
Das macht der auch andauernd, für mich zu oft, so ca 10 mal die Stunde an und aus. Das muss ja nicht sein.
So sieht das aktuell aus:

define di_lamp DOIF ([temp_schrank:temperature] > 28) (set venti on) DOELSE (set venti off)
attire di_lamp do always

Jetzt würde es reichen, den Ventilator nur alle 15 Minuten an oder auszuschalten. Es kann auch passieren, dass der Ventilator zwo mal hintereinander, also um 10:15 und 10:30 angeschaltet wird, das ist auch ok.
D.h. die Bedingung sollte nur alle 15 Minuten überprüft werden.
Oder soll die Aktion an/ausschalten nur nach 15 Minuten durchgeführt werden und nicht mehrmals innerhalb 15 Minuten?

Ein do always scheint ungeeignet - alleine.
So hatte ich auch

([+600] and [temp_schrank:temperature] > 28)

ausprobiert und Sachen mit
attr di_push wait 600
attr di_push do resetwait


oder auch

attr di_push  repeatsame 3

Aber irgendwie bin ich mir nicht sicher.

Was ist denn die empfohlene Vorgehensweise?
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Byte09 am 02 April 2019, 16:12:18
In erster Linie würde ich hier mit schwellwerten arbeiten , da es vermutlich darum geht zu 'kühlen'. Also an bei >28 und aus bei <27 z.b. . Damit solltest du das gröbste 'flattern' schonmal in den griff bekommen.



Gruss Byte09



Gesendet von meinem SM-G900F mit Tapatalk
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Otto123 am 02 April 2019, 16:14:09
Hi,

Vorschlag für das was Du sagst - ungetestet:
define di_lamp DOIF ([+:15] and [?temp_schrank:temperature] > 28) (set venti on) DOELSE (set venti off)
attr di_lamp do always


Allerdings würde ich eigentlich für so etwas THRESHOLD nehmen, dass ist dafür gemacht. Und dann wie byte08 (09) (der spielt heute Jekyll & Hide) ;D ;D ;D schon sagt: regelt die Hysterese das Meiste :)

Gruß Otto
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Frood42 am 02 April 2019, 16:18:27
ok, also das mit <27.5 und > 28.5 ist schon ganz gut glaube ich.

Was bedeutet denn das Fragezeichen vor dem ?temp_schrank ? Das kommt mir öfters unter, aber habe nicht gefunden was es ist.
Heisst das, dass 28 exkludiert ist?

THRESHOLDS muss ich mal ankucken. Hat denn THRESHOLDS diese 15 Minuten delay drinne?
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Damian am 02 April 2019, 17:34:34
THRESHOLD kennt keine delay-Zeit, sondern eine Hysterese.

define di_lamp DOIF ([temp_schrank:temperature] > 28.5) (set venti on)  DOELSEIF  ([temp_schrank:temperature] < 27.5) (set venti off)

do always nicht setzen, die Hysterese bei diesem DOIF-Beispiel beträgt übrigens 1 Grad
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Otto123 am 02 April 2019, 19:00:26
Zitat von: Frood42 am 02 April 2019, 16:18:27
Was bedeutet denn das Fragezeichen vor dem ?temp_schrank ? Das kommt mir öfters unter, aber habe nicht gefunden was es ist.
Dann Doku gucken, ctrl+f im Browser nutzen einfach nach [? suchen, der zweite Treffer erklärt:
https://commandref.fhem.de/commandref_DE.html#DOIF_Zeitintervalle_Readings_und_Status_ohne_Trigger
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Frood42 am 02 April 2019, 20:49:22
Zitat von: Damian am 02 April 2019, 17:34:34
do always nicht setzen, die Hysterese bei diesem DOIF-Beispiel beträgt übrigens 1 Grad

Früher hatte ich schlechtere Schaltsteckdosen, da hatte ich lieber immer geschaltet, besser als gar nicht... just in case...
Jetzt läuft es so:
defmod di_venti_an DOIF ([temp_server:temperature] < 28]) (set HM_6A9B61_fan_server off) DOELSEIF ([temp_server:temperature] > 29)) (set HM_6A9B61_fan_server on) 
attr di_venti_an do always
attr di_venti_an waitsame 60


Vorab zusammenfassend darf ich anmerken,
dass es kein super Rezept für diese Anforderung gibt, sondern [+:15] soweit das ausgefeilteste war. Ansonsten muss man nur das DOIF anpassen, dass sich im Kontext des Temperaturverlaufs weniger oft eine Schaltung ergibt.

Danke und Grüße,
Frood

Ansonsten verwendet man den THRESHOLD.
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Otto123 am 02 April 2019, 21:24:16
Zitat von: Frood42 am 02 April 2019, 20:49:22
Früher hatte ich schlechtere Schaltsteckdosen, da hatte ich lieber immer geschaltet, besser als gar nicht... just in case...
Das löst man doch nicht mit do always!?
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Frood42 am 03 April 2019, 08:41:06
Wenn die Steckdose das Signal nicht immer empfängt oder verarbeitet, ist es doch besser, wenn es mehrfach gesendet wird, also bei jedem reading.
Mit do always: "Befehle werden wiederholt im bestehenden Status ausgeführt."
Bei HM passiert glaub gar nichts an der Steckdose wenn sie an ist und nochmal an geschaltet wird. Ausser dem Stromverbrauch schadet es da erst mal wenig.
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Otto123 am 03 April 2019, 09:22:57
Zitat von: Frood42 am 03 April 2019, 08:41:06
Mit do always: "Befehle werden wiederholt im bestehenden Status ausgeführt."
Wunschlesemodus und Dünnbrettbohrer aktiv  ;D
Das das DOIF wiederholt auf Events reagiert, obwohl sich der Status der Bedingung nicht ändert, hat doch nichts damit zu tun, dass im Ausführungsteil die Kommandos beim Empfänger nicht ankommen.
Lieber zuviel machen weil ich das Ziel verfehlen könnte ist für mich keine Lösungsstrategie. Aber leider ist das der Grundansatz der meisten Menschen, nicht nur in der Hausautomatisierung.  ::)

Ich entschuldige mich für Off Topic
Otto
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Frood42 am 03 April 2019, 14:24:26
Vielen Dank für den Hinweis.
Dennoch ist diese Art von destruktiver Kritik zu persönlich und unbegründet. Und unterstützt in keiner Weise eine intelligente oder sinnvolle Lösungsstrategie.
Falls das nicht ankommt, muss ich es noch mal wiederholen  ;D Das wäre dann so wie bei den miserablen PCA301 Funksteckdosen, die da mal in Betrieb waren, aber nun in Rente geschickt wurden. 
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Otto123 am 03 April 2019, 14:49:58
Du, persönlich habe ich das nicht gemeint - destruktiv sollte das auch nicht sein.  :D
Du hast Recht, ist bei Dir so angekommen - Entschuldigung dafür.

Aber, es war auch viel allgemeiner gemeint:
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Damian am 03 April 2019, 15:48:10
Das Attribut waitsame macht hier aber wenig Sinn. Wenn du schon mit do always wiederholen willst, dann würde ich dir das Attribut cmdpause empfehlen. Bei schlechtem Empfang wiederhole ich bewusst, indem ich den set-Befehl dopple, das reicht meistens schon aus, statt alle paar Minuten etwas wiederholt zu schalten (erhöhte Kollisionswahrscheinlichkeit bzw. 1%-Regel).
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Frood42 am 03 April 2019, 19:45:48
Ok, also interessanterweise ist das jetzt stark reduziert und bis auf waitsame ohne besondere Attribute.
defmod di_venti_an DOIF ([temp_server:temperature] < 28) (set HM_6A9B69_fan_server off) DOELSEIF ([temp_server:temperature] > 29) (set HM_6A9B69_fan_server on)
attr di_venti_an waitsame 60


Den waitsame braucht man wahrscheinlich auch nicht mehr.
Eigentlich hatte ich den Thread aufgemacht um die Attribute besser zu verstehen. Stattdessen sind sie beseitigt. So muss ich sie nicht mehr verstehen. Mh  ::)

Leider kann ich den Verlauf heute nicht so gut kontrollieren, da Ausreisser dabei sind - da weiß ich leider auch noch nicht wie man die filtert.
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Damian am 03 April 2019, 21:56:48
Es ist immer gut die Bedeutung der Attribute zu verstehen, denn gerade beim DOIF können sie eine Steuerung komplett auf den Kopf stellen.

Ausreißer kannst du mit Median elegant ausmerzen: https://fhem.de/commandref_DE.html#DOIF_Reading_Funktionen
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Frood42 am 04 April 2019, 15:05:53
Das wird jetzt bissl Multi und Off topic aber ok.
Den

defmod di_venti_an

kann ich mit dem med beeinflussen, ja.

Aber der Wert selbst wird über das DB Modul direkt in die DB gesendet.
Ich habe immer noch keinen Weg gefunden an der Stelle den Ausreißer zu ignorieren.
Die Sensoren sind alle günstige IT oder Pearl Sensoren für Wetter Stationen die über Signalduino reinkommen.
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Otto123 am 04 April 2019, 16:32:06
Naja aus meiner Sicht ein ähnliches Thema wie mit deinem do always - bloß am anderen Ende. Hier würde ich nicht im Nachgang Mittelwerte bilden, sondern offensichtliche Ausreißer an der Quelle eliminieren. Also am Sensordevice, beim loggen der der Werte also möglichst weit vorn entscheiden: der Wert passt oder den lass ich einfach weg.
Ein userReading mit Sinnfälligkeit, also if kleiner if größer und nur die Werte im Toleranzband nehmen.

Es gab da immer mal schon ähnliche Beiträge, als Beispiel für die Google Suche: site:forum.fhem.de ds1820 ausreißer

Gruß Otto
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Damian am 04 April 2019, 17:22:26
defmod di_venti_an DOIF ([$SELF:temp] < 28) (set HM_6A9B69_fan_server off) DOELSEIF ([$SELF:temp] > 29) (set HM_6A9B69_fan_server on)

attr di_venti_an event_Readings temp: [temp_server:temperature:med]


Das Reading di_venti_an:temp kannst du gleichzeitig in der DB ohne Ausreißer ablegen ;)
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Frood42 am 05 April 2019, 09:21:37
Zitat von: Otto123 am 04 April 2019, 16:32:06
Also am Sensordevice, beim loggen der der Werte also möglichst weit vorn entscheiden: der Wert passt oder den lass ich einfach weg.
Das würde ich liebend gerne machen. In der Prä-fhem Ära hat das mein Python Script einfach raus-ge-iffed.
Das mit der Google Suche habe ich auch gefunden, aber das mit den Subs sind mir zu high hanging fruits.
Ich würde lieber so etwas beim sensor device selbst pflegen
set irgendetwas_reading:FILTER=temperature>10 and temperature < 40
(im Sinne von set room=kitchen:FILTER=STATE=on off)
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Frood42 am 05 April 2019, 09:26:45
Zitat von: Damian am 04 April 2019, 17:22:26
Das Reading di_venti_an:temp kannst du gleichzeitig in der DB ohne Ausreißer ablegen ;)

Okay. Aber so wie es da steht geht es noch nicht in die DB, oder? Wie legt man denn aus dem DOIF heraus etwas in die DB? Das "temp" in den DB filter (define myDbLog DbLog ./db.conf .*:(temperature|valveposition|humidity).*) mit aufnehmen?
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Otto123 am 07 April 2019, 19:37:15
Hi Frood42,

ich hatte sowas simples im Sinn, Beispiel mit dummy:
define w1 dummy
attr w1 room Test
attr w1 userReadings temp  { my $val =ReadingsNum($name,'state',0);; if ($val > 15 and $val < 25) {fhem("setreading wert temp $val")}}
define wert dummy

Das Reading temp in wert nimmt so nur Werte innerhalb >15 <25 an.

Vielleicht geht das besser, aber mir fiel es jetzt nicht ein.  ;)

Gruß Otto
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Damian am 07 April 2019, 19:41:47
Zitat von: Frood42 am 05 April 2019, 09:26:45
Okay. Aber so wie es da steht geht es noch nicht in die DB, oder? Wie legt man denn aus dem DOIF heraus etwas in die DB? Das "temp" in den DB filter (define myDbLog DbLog ./db.conf .*:(temperature|valveposition|humidity).*) mit aufnehmen?

Reicht nicht das "temp" in die regex aufzunehmen?
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Frood42 am 12 April 2019, 00:04:22
Also ähm. So ganz habe ich es nicht vertanden.
Beim Attribut userReadings pflegen beim Temperatur Sensor poppt eine schwarze Box ein, da habe ich das eingetragen:
temperature { my $val = ReadingsNum($name,'temperature',0);; if ($val > 15 and $val < 27) {fhem("setreading $name temperature $val")}}

So ganz ehrlich verstehe ich schon nicht dass es mit "temperature {"  anfängt und nicht z.B. "temperature = {"  und dann steht da ReadingsNum und nicht ReadingsVal. Ich denke mal, dass $name der DeviceName ist. und $val device name:reading, das neuste (0).

temperature ist das echte reading, was ich ja irgendwie prüfen will und dann mitgebe aus $val - genau genommen würde ich es überschreiben bzw ersetzen, aber mit demselben Namen.

Da gibts ein 3447 mal gelesenes Posting dazu https://forum.fhem.de/index.php?topic=37289.0 - ich finde es ist doch recht beliebt. Aber eine Antwort die noch einfacher ist, bzw die man verstehen kann, sehe ich da leider auch nicht. Kann unter anderem daran liegen, dass ich kein Perl kenne.
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Otto123 am 12 April 2019, 09:28:57
Moin,

nö liegt denke ich daran weil Du nicht in der Doku  (https://commandref.fhem.de/#readingFnAttributes)nachschaust.

$name ist der Gerätename in dem das userReadings aufgerufen / definiert wird.

Was Du jetzt programmieren willst ist eine Kombination aus Baron Münchhausen und einem CPU Heizprogramm für Deinen FHEM Server.
Falls die kurze Erklärung in der Doku nicht reicht kannst Du gern nachfragen:  ;)
ZitatuserReadings
A comma-separated list of definitions of user-defined readings. Each definition has the form:
<reading>[:<trigger>] [<modifier>] { <perl code> }
After a single or bulk readings update, the user-defined readings are set by evaluating the perl code { <perl code> } for all definitions and setting the value of the respective user-defined reading <reading> to the result. If <trigger> is given, then all processing for this specific user reading is only done if one of the just updated "reading: value" combinations matches <trigger>, which is treated as a regexp.

Gruß Otto
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Frood42 am 12 April 2019, 11:16:45
Ich will ja echt nicht meckern, aber diese Dokus sind extrem wissenschaftlich und theoretisch.
Ein komplettes Beispiel würde mir persönlich reichen um es sofort (in Millisekunden) zu verstehen. 

Nachdem ich die Doku gelesen habe, muss ich aber sagen, dass es gar nicht so schlecht war.
Die Rekursiv rausgenommen, also ein eigenes Reading definiert, sollte das so gehen oder?


myTemp { my $val = ReadingsNum($name,'temperature',0);; if ($val > 15 and $val < 27) {fhem("setreading $name temperature $val")}}

oder auch eindeutiger:

attr HM_B76343_temp_sens userReadings myTemp { my $val = ReadingsNum(HM_B76343_temp_sens,'temperature',0);; if ($val > 15 and $val < 27) {fhem("setreading HM_B76343_temp_sens myTemp $val")}}


Was passiert denn in dem Fall mit dem echten Reading für "temperature", ist das dann auch noch da?

Und wenn man das User Reading myTemp definiert, was macht denn dann darin noch das {fhem("setreading HM_B76343_temp_sens theTemp $val")} ?
Müsste da nicht einfach sowas wie ReadingsVal stehen, was den Wert zurückgibt?
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Otto123 am 12 April 2019, 11:49:56
Also ich finde die Doku ist häufig sehr minimalistisch auf den Punkt und alle Fälle kann man nicht in einem Beispiel beschreiben.

Jetzt hast Du immer noch das "Heizprogramm"! Warum?
-> Das userreadings wird getriggert wenn ein Reading des Gerätes getriggert wird, Du setzt innerhalb dieses Trigger wieder ein Reading des gleichen Gerätes.
Das wird eine Schleife!

Mein Beispiel oben war völlig anders! Da waren zwei Geräte im Spiel! Soviel dazu:  ;D ;D ;D
ZitatEin komplettes Beispiel würde mir persönlich reichen um es sofort (in Millisekunden) zu verstehen. 

Probier doch mein Beispiel per Hand, du wirst sehen wo der Unterscheid zwischen dem userReading temp in w1 und dem Reading temp in wert liegt!

Das userReading wird nämlich immer gesetzt, entweder mit dem temperature Wert oder mit nichts.
Das Reading temp im dummy wert wird entweder mit dem temperature wert gesetzt oder nicht.

Ich hoffe Du verstehst mein Wortspiel.

Gruß Otto
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Frood42 am 12 April 2019, 12:24:16
Oh man, das ist ja wie eine Schnitzeljagd. Oder wie bei Hänsel und Gretel mit den Brotkrumen. Ich weiß nur nicht ob ich Hänsel oder Gretel bin...

Also, anders ausgedrückt mache ich nur ein UserReading muellTemp zum Spaß sozusagen. Das wird selbst gar nicht weiterverarbeitet.
Ich mache es nur um dadurch das Reading (someTemp) eines neuen Dummy Gerätes (HM_dummy_temp_sens) zu setzen.

Jetzt müsste ich someTemp in die DB log regExp aufnehmen, aber ich könnte statt someTemp auch einfach temperature auf dem neuen dummy Gerät setzen. Das geht eh schon in die DB.


attr HM_B76343_temp_sens userReadings muellTemp \
   { my $val = ReadingsNum(HM_B76343_temp_sens,'temperature',0);; \
   if ($val > 15 and $val < 27) \
   {fhem("setreading HM_dummy_temp_sens someTemp $val")}}

define HM_dummy_temp_sens dummy


Konsequenterweise müsste ich dann noch das reading temperature vom echten Sensor umbenennen, dass es nicht mehr in die DB geht, aber das geht nicht laut Doku, ne. Bissl DB sparen wäre schon gut.

Am Ende des Tages wird dann aber für mich nur noch HM_dummy_temp_sens:temperature (oder someTemp) relevant verwendet.
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Otto123 am 12 April 2019, 13:30:36
naja, wie Du das Reading im Dummy benennst ist egal, das kannst Du ruhig temperature nennen.

Macht es denn so was Du willst? Du kannst auch statt des userReadings ein notify nach gleichem Schema nehmen und das neue Reading in das Sensor Device schreiben. Da hättest Du das Schleifenthema nicht. Bei mehreren Sensoren (hattest Du das irgendwo gesagt) könntest Du sicher mit einem notify alle Sensoren mit korrigierten Werten "beschicken".

So nach dem Schema (jetzt nur mal angedacht und nicht getestet)
define n_korrektur notify cheepSensor.*:temperature {if ($EVTPART1 > 15 and $EVTPART1 < 27) {fhem("setreading $NAME someTemp $EVTPART1")}}


Gruß Otto
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Frood42 am 12 April 2019, 13:53:38
I see. Mit {fhem("setreading $NAME someTemp $EVTPART1")} wird nun ein neues Reading namens someTemp am Original Sensor gesetzt, da müsste ich someTemp in die DB regExp hinzufügen.

Aaaaaaber: 
Zitatdefine n_korrektur notify cheepSensor.*:temperature
der . (Punkt) bedeutet > ein beliebiges Zeichen - aber NICHT kein Zeichen.
der * (Stern) bedeutet > beliebige Wiederholung des vorstehenden Zeichens - auch keine Wiederholung.

Wenn meine temp Sensoren in der Tat immer mit temp_ anfangen (temp_kitchen, temp_dining,...) wäre das
define n_korrektur notify temp_.*:temperature {if ($EVTPART1 > 15 and $EVTPART1 < 27) {fhem("setreading $NAME someTemp $EVTPART1")}}

Korrekt?

Da ich verdammt viele von den Sensoren habe (Günstig mit Jeelink & Signalduino) wäre das eine feine Sache!
Allerdings hätte ich dann mein Brain upgegradet mit dem userReadings und würde es gar nicht mehr verwenden. Mh. Alleine deswegen sollte ich userReadings machen  :o
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Otto123 am 12 April 2019, 15:47:51
Ja Du siehst das richtig. Einzig ob in $EVTPART1 wirklich bei Dir die Temperatur drin steht weiß ich nicht. Siehst Du aber im Eventmonitor.

Und userReadings sind eine feine Sache, vielseitig verwendbar - deswegen kannst Du das erworbene Wissen irgendwo anders nachnutzen.

Gruß Otto
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Frood42 am 12 April 2019, 19:11:51
im event monitor steht

2019-04-12 19:06:22 SD_WS07 temp_kitchen T: 24 H: 19
2019-04-12 19:06:22 SD_WS07 temp_kitchen temperature: 24
2019-04-12 19:06:22 SD_WS07 temp_kitchen humidity: 19


das notify:
defmod temp_sens_korrektur notify temp_ki.*:temperature {if ($EVTPART1 > 15 and $EVTPART1 < 40) {fhem("setreading $NAME korrTemp $EVTPART1")}}

müsste denn nun nicht auch im event monitor irgendetwas zu korrTemp zu sehen sein??

Viele Grüße,
Frood
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Frood42 am 12 April 2019, 20:11:58
YES!
so gehts: (Frood hat nachgelesen  :o :o :o :o)
define temp_sens_korrektur notify temp_ki.*:temperature:.* {if ($EVTPART1 > 15 and $EVTPART1 < 40) {fhem("setreading $NAME tempKorr $EVTPART1")}}
(nach so viel regExp brauche ich jetzt erst mal eine regExp Pause bis morgen, sonst kriege ich regExpKater)


2019-04-12 20:07:10 SD_WS07 temp_kitchen T: 23.9 H: 19
2019-04-12 20:07:10 SD_WS07 temp_kitchen temperature: 23.9
2019-04-12 20:07:10 SD_WS07 temp_kitchen humidity: 19
2019-04-12 20:07:10 SD_WS07 temp_kitchen tempKorr: 23.9


Perfekt! Dass das echte temperature reading erhalten bleibt, ist ja auch ok, als Kontrolle zum Beispiel.
Ich lasse das mal laufen und melde dann den Grafana Graphen.

Vielen Dank!!


Da war aber noch was mit der DB?

Internals:
   REGEXP     .*:(temperature|humidity|voltage|frequency|power|motion|brightness|tempKorr).*


tempkorr landet irgendwie nicht in der DB, ich habe nur "|tempKorr" hinzugefügt.
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Otto123 am 12 April 2019, 21:11:43
ich sehe da auch keinen Fehler.
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Frood42 am 12 April 2019, 21:14:11
shutdown restart, alles gemacht. tempkorr alles klein geschrieben.  (./db.conf .*:(tempkorr|temperature|humidity|voltage|frequency|power|motion|brightness).*)
Kommt immer wieder in den logs

2019-04-12 21:11:46 SD_WS07 temp_kitchen T: 24.5 H: 19
2019-04-12 21:11:46 SD_WS07 temp_kitchen temperature: 24.5
2019-04-12 21:11:46 SD_WS07 temp_kitchen tempkorr: 24.5

Aber nicht in der DB. komisch.  :o
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Otto123 am 12 April 2019, 21:15:10
naja jetzt ist es klein? tempkorr
Vorhin war es groß tempKorr

Es hieß auch schonmal korrTemp  ;D

Gruß Otto
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Frood42 am 12 April 2019, 21:15:54
ja, gerade hinzugefügt die Info
Zitattempkorr alles klein geschrieben.  (./db.conf .*:(tempkorr|temperature|humidity|voltage|frequency|power|motion|brightness).*)

und
defmod temp_sens_korrektur notify temp_ki.*:temperature:.* {if ($EVTPART1 > 15 and $EVTPART1 < 40) {fhem("setreading $NAME tempkorr $EVTPART1")}}
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Frood42 am 13 April 2019, 10:55:43
soll ich mal einen neuen thread aufmachen? MIt den 15 Minuten hat das nichts mehr zu tun....

Bisschen schrill ist das ganze ja. Ich habe schon 100 mal das DB log angepasst, mal humidity hinzugefügt und schnapp war das aus dem reading aller devices gespeichert in der DB.

Mit dem defmod notify oben geht das bis jetzt wirklich gar nicht.

Daher fall back - und das neue Dummy Device gemacht. Funzt, alles prima, nur: Wieso 4-5 mal mit demselben Zeitstempel?
Attributes:
   event-min-interval .*:300
   event-on-change-reading .*
   group      01_Sensor_Temp
   room       EG_KITCHEN_ROOM
   userReadings trashTemp { my $val = ReadingsNum('temp_kitchen','temperature',0);  if ($val > 15 and $val < 37) {fhem("setreading temp_kitchen_corr temperature $val")}}
   userattr   max-deviation-hum:1,2,3,4,5,6,7,8,9,10,15,20,25,30,35,40,45,50 max-deviation-temp:1,2,3,4,5,6,7,8,9,10,15,20,25,30,35,40,45,50 offset-hum:slider,-50,1.0,50 offset-temp:slider,-25,1.0,25


Ich ignoriere auch gepflegt das "max-deviation-temp" und hoffe, dass das nicht sowieso schon für meine Zwecke gedacht war  ::)


SELECT * FROM `history` WHERE DEVICE = "temp_kitchen_corr"

TIMESTAMP DEVICE TYPE EVENT READING VALUE UNIT
2019-04-13 10:46:52 temp_kitchen_corr DUMMY temperature: 24.9 temperature 24.9
2019-04-13 10:46:52 temp_kitchen_corr DUMMY temperature: 24.9 temperature 24.9
2019-04-13 10:46:52 temp_kitchen_corr DUMMY temperature: 24.9 temperature 24.9
2019-04-13 10:46:52 temp_kitchen_corr DUMMY temperature: 24.9 temperature 24.9
2019-04-13 10:46:52 temp_kitchen_corr DUMMY temperature: 24.9 temperature 24.9


Das reading temperature kam früher definitiv nur einmal vor - laut event monitor.
2019-04-13 10:57:19 dummy temp_kitchen_corr temperature: 24.8
2019-04-13 10:57:19 dummy temp_kitchen_corr temperature: 24.9
2019-04-13 10:57:19 dummy temp_kitchen_corr temperature: 24.9
2019-04-13 10:57:19 dummy temp_kitchen_corr tempkorr: 24.8
2019-04-13 10:57:19 dummy temp_kitchen_corr tempkorr: 24.9
2019-04-13 10:57:19 dummy temp_kitchen_corr tempkorr: 24.9
2019-04-13 10:57:19 SD_WS07 temp_kitchen T: 24.9 H: 21
2019-04-13 10:57:19 SD_WS07 temp_kitchen temperature: 24.9
2019-04-13 10:57:19 SD_WS07 temp_kitchen batteryState: low
2019-04-13 10:57:19 SD_WS07 temp_kitchen tempkorr: 24.9


Der scheint mir irgendwie für alle readings des devices das UserReading zu machen, oder? (das tempkorr ist auch noch drin, aber landet ja nicht in der DB)
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Otto123 am 13 April 2019, 14:34:02
ZitatWieso 4-5 mal mit demselben Zeitstempel?
Weil jede änderung an dem Device das userreading triggert.
Dann musst Du für das userreading einen trigger definieren. userReadings trashTemp:temperature.*
Ich bin nicht sicher mit dem Trigger

Ich versteh nicht, warum das notify schuld sein soll.  :D
Oder versuch mal in dem notify den Befehl zu ergänzen
{fhem("sleep 0.1;setreading $NAME tempkorr $EVTPART1")} da war doch was ...
Zitatsetreading
[EN DE]
setreading <devspec> <reading> <value>

Set the reading <reading> for the device <name> to <value> without sending out commands to the device, but triggering events and eventMap/stateFormat transformations as usual. See the set command documentation for replacement description.

Examples:
setreading lamp state on
Note: setreading won't generate an event for device X, if it is called from a notify for device X. Use "sleep 0.1; setreading X Y Z" in this case.
Titel: Antw:Aktion nur einmal pro 15 Minuten ausführen - einfache Frage
Beitrag von: Frood42 am 13 April 2019, 22:53:41
Super, vielen Dank!
Das ist ja aber auch schon etwas spezial, nech!

Das mit dem
userReadings trashTemp:temperature.*
hat nicht gut geklappt. habe auch an der Stelle ein sleep probiert, aber die temp* readings kommen zumindest immer noch doppelt rein.

Das notify mit dem sleep ist das beste. Klappt! Nicht ganz so ein selbsterklärender Einzeiler aber immerhin geht es.

defmod temp_sens_server_korrektur notify temp_se.*:temperature:.* {if ($EVTPART1 > 22 and $EVTPART1 < 38) {fhem("sleep 0.1;; setreading $NAME tempkorr $EVTPART1")}}

Viele Grüße,
Frood