Hallo Zusammen,
ich möchte ein Reading eines LogDB readings im Ausführungsteil eines DOIF verwenden. Da sich der Readingname immer verändert, möchte ich eine RegEx im DOIF verwenden. Das bekomme ich aber nicht hin - über Vorschläge wäre ich dankbar.
Definition des logdb - dass das Reading mit Namen "2017-08-12_23-55-09__Regen__all_between_timestamps" erzeugt
defmod Rep.Rain_1_Y DbRep logdb
attr Rep.Rain_1_Y event-on-change-reading 1
attr Rep.Rain_1_Y reading rain_day
attr Rep.Rain_1_Y readingNameMap Regen
attr Rep.Rain_1_Y timestamp_begin previous_day_begin
attr Rep.Rain_1_Y timestamp_end previous_day_end
setstate Rep.Rain_1_Y 2017-08-13 11:46:54 2017-08-12_23-55-09__Regen__all_between_timestamps 1.0000
setstate Rep.Rain_1_Y 2017-08-13 12:17:50 state connected
Funktionierendes DOIF, wenn ich den Readingnamen des logdb ("2017-08-12_23-55-09__Regen__all_between_timestamps") nutze:
defmod Rain_update DOIF ([+[1]:00]) (set Rain.Hecke.Dauer [Rep.Rain_1_Y:2017-08-12_23-55-09__Regen__all_between_timestamps])
attr Rain_update do always
Resultat: Der Dummy wird richtig aktualisiert:
defmod Rain.Hecke.Dauer dummy
setstate Rain.Hecke.Dauer 1.0000
setstate Rain.Hecke.Dauer 2017-08-13 12:46:19 state 1.0000
Da sich der Readingname aber täglich ändert (logdb setzt die Readingnamen entlang der Zeitparameter), möchte ich im DOIF eine Regex mit "Rep.Rain_1_Y:.*" einsetzen - das klappt aber nicht:
defmod Rain_update DOIF ([+[1]:00]) (set Rain.Hecke.Dauer [Rep.Rain_1_Y:.*])
attr Rain_update do always
attr Rain_update room 9.1_Steuerung,9.6_Umwelt,DOIF
setstate Rain_update cmd_1
setstate Rain_update 2017-08-13 12:59:47 cmd 1
setstate Rain_update 2017-08-13 12:59:47 cmd_event set_cmd_1
setstate Rain_update 2017-08-13 12:59:47 cmd_nr 1
setstate Rain_update 2017-08-13 12:59:47 error set Rain.Hecke.Dauer : no set value specified
setstate Rain_update 2017-08-13 12:59:47 state cmd_1
setstate Rain_update 2017-08-13 12:59:42 timer_01_c01 13.08.2017 13:00:00
Ich denke mal, dass ich da die DOIF Syntax für die Interpretation des RegEx nicht richtig verwende.
VG Timmo
Hi Timmo,
Dein Problem hat meines Erachtens nichts mit DOIF zu tun. Du willst "set magic" verwenden, das funktioniert auch aber mit einem regEx auf alle readings? Wie soll das gehen?
Wie du selbst festgestellt hast [device:reading] funktioniert.
Idee aus dem Bauch:
Was gehen könnte wäre ein regEx was dann genau auf ein reading trifft 2017-08-12.* z.B. bei einem reading pro Tag könntest den tag dann vorher gezielt setzen.
Oder Du nimmst .*Regen__all_between_timestamps falls es bloß ein reading täglich gibt und die anderen immer wieder gelöscht werden.
Gruß Otto
Hi Otto,
vielen Dank für Deine Antwort. Das Reading gibt es immer nur einmal - da das Modul Logdb dieses Reading immer (täglich) durch ein neues Reading - dann mit neuem Datumsstempel - ersetzt (und da liegt das Problem - wie kann ich das Reading in einem anderen Modul weiterverwenden).
Ich denke, die Interpretation des Ausdrucks funktioniert nicht:
(set Rain.Hecke.Dauer [Rep.Rain_1_Y:.*])
im Gegensatz zum Ausdruck
(set Rain.Hecke.Dauer [Rep.Rain_1_Y:2017-08-12_23-55-09__Regen__all_between_timestamps])
Das Reading heißt "2017-08-12_23-55-09__Regen__all_between_timestamps".
Irgendwie wird die regex nicht interpretiert...
VG Timmo
Du verstehst mich falsch, gib mal bitte ein list Rep.Rain_1_Y in Codetags! Die # taste über dem :-X Smily
Was ich meine ist folgendes:
ZitatAb featurelevel 5.7 ersetzt das set und setreading Befehl
[device:name] mit dem Wert des Readings, Internals oder Attributes für device, falls sowohl device, als auch Reading, Internal oder Attribut existiert, und nicht leer ist.
Man kann einen der Präfixe r:, i: oder a: verwenden, um die Suche einzuschränken, genau wie im devspec.
Das Suffix :d extrahiert die erste Zahl.
Das Suffix :i extrahiert die erste Zahl als Ganzzahl.
Das Suffix :r<n> extrahiert die erste Zahl, und rundet sie auf <n> Dezimalstellen. Falls <n> fehlt, dann wird auf eine Dezimalstelle gerundet.
Das Suffix :t liefert den Zeitstempel des Readings
Das Suffix :sec liefert Anzahl der Sekunden seit Änderung des Readings.
Beispiel:
set Lamp blink [blinkDummy:number] [r:blinkDummy:duration:d]
{(perlExpression)} mit dem Ergebnis der perlExpression. $DEV wird dabei mit dem Namen des vom set betroffenen Gerätes ersetzt.
Diese Ersetzungen sind unter dem Namen "set magic" bekannt.
Du meinst das hier:
list Rep.Rain_1_Y
Internals:
CHANGED
DATABASE /opt/fhem/fhem.db
DEF logdb
LASTCMD maxValue
NAME Rep.Rain_1_Y
NOTIFYDEV global,Rep.Rain_1_Y
NR 224
NTFY_ORDER 50-Rep.Rain_1_Y
ROLE Client
STATE done
TYPE DbRep
UTF8 0
VERSION 5.6.1
HELPER:
DBLOGDEVICE logdb
CV:
aggregation no
aggsec 1
destr 2017-08-12
dsstr 2017-08-12
epoch_seconds_end 1502575199
mestr 08
msstr 08
testr 23:59:59
tsstr 00:00:00
wdadd
yestr 2017
ysstr 2017
READINGS:
2017-08-13 15:40:20 2017-08-12_23-55-09__WU_Wetter_FK1__rain_day__MAX__all_between_timestamps 1.0000
2017-08-13 15:40:20 state done
dbloghash:
COLUMNS field length used for Device: 64, Type: 64, Event: 512, Reading: 64, Value: 128, Unit: 32
CONFIGURATION ./db.conf
DEF ./db.conf ESPEasy_wm_1_.*Temp:.*|wiffi1:Wiffi_.*|ESPEasy_wemospro6_T...:Temperature.*|Wetter_DWD:_rr.*|WU_Wetter_FK.:rain_day.*
MODE synchronous
MODEL SQLITE
NAME logdb
NR 176
NTFY_ORDER 50-logdb
PID 775
REGEXP ESPEasy_wm_1_.*Temp:.*|wiffi1:Wiffi_.*|ESPEasy_wemospro6_T...:Temperature.*|Wetter_DWD:_rr.*|WU_Wetter_FK.:rain_day.*
STATE connected
TYPE DbLog
VERSION 2.22.1
dbconn SQLite:dbname=/opt/fhem/fhem.db
dbuser
HELPER:
COLSET 1
DEVICECOL 64
EVENTCOL 512
READINGCOL 64
TYPECOL 64
UNITCOL 32
VALUECOL 128
READINGS:
2017-05-29 23:25:38 countCurrent 19
2017-05-29 23:25:38 countHistory 136091
2017-08-13 01:00:00 reduceLogState reduceLogNbl finished. Rows processed: 0, deleted: 0, updated: 0, time: 0.15sec
2017-08-13 15:45:49 state connected
cache:
index 0
Attributes:
device WU_Wetter_FK1
event-on-change-reading 1
group Beregnung
reading rain_day
room 6.1_Rain,9.0_System,9.3_Logs,9.6_Umwelt
timeout 300
timestamp_begin previous_day_begin
timestamp_end previous_day_end
zumindest würde .* auf die readings READINGS:
2017-08-13 15:40:20 2017-08-12_23-55-09__WU_Wetter_FK1__rain_day__MAX__all_between_timestamps 1.0000
2017-08-13 15:40:20 state done
matchen.
Das geht also nicht. Es kann sein, dass es so gar nicht geht ... denn es steht nicht in der commandref das name eine regEx sein kann.
so ad hoc fällt mir da nichts genaues ein. Müsste ich ein bisschen probieren.
Stimme dir zu, selbst das .* geht nicht.
ich habe es direkt mit dem
set Rain.Hecke.Dauer [Rep.Rain_1_Y:2017-08-12_23-55-09__WU_Wetter_FK1__rain_day__MAX__all_between_timestamps]
probiert, das geht, aber der entsprechende Befehl
set Rain.Hecke.Dauer [Rep.Rain_1_Y:.*]
klappt nicht. irgend wie ist das mit den Ebenen (perl etc) nicht richtig.
Hat also nix mit DOIF zu tun.
Dennoch vielen Dank für Deine Hilfe!
VG Timmo
Hallo Timmo,
so einfach mit [device:name] geht das nicht. Du hast vielleicht eine Chance mit {(perlExpression)}.
Gruß Otto
Hallo Otto,
denke ich auch.. habe jetzt einen Workaround implementiert (indem ich die Regenmenge für heute und den Forecast morgen nehme - funktioniert für meine Bewässerungssteuerung auch, ist aber keine echte Lösung für mein ursprüngliches Problem).
VG timmo