DOIF - Verwendung von RegEx im Befehlsteil

Begonnen von Tsturm, 13 August 2017, 13:05:17

Vorheriges Thema - Nächstes Thema

Tsturm

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

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Tsturm

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




Otto123

#3
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.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Tsturm

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

Otto123

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.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Tsturm

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

Otto123

Hallo Timmo,

so einfach mit [device:name]  geht das nicht. Du hast vielleicht eine Chance mit {(perlExpression)}.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Tsturm

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