Hallo zusammen,
ich habe eine MariaDB auf meinem Raspi und möchte via DbRep gerne Daten aus der Datenbank fischen.
Die Abfrage lautet so:
SELECT DEVICE ,SUM(TIME_TO_SEC(TIMEDIFF(closed, open))) AS duration FROM (
SELECT
TIMESTAMP, VALUE,DEVICE,
@open AS open,
@open := IF(VALUE = "open", TIMESTAMP, NULL) AS prev_open,
@closed := IF(VALUE = "closed", TIMESTAMP, NULL) AS closed
FROM history WHERE
DATE(TIMESTAMP) = CURDATE() AND
DEVICE = "HT_Fensterkontakt" AND
READING = "state" AND
(VALUE = "open" OR VALUE = "closed")
ORDER BY TIMESTAMP
) AS tmp, (SELECT @open:=NULL, @closed:=NULL) AS vars
WHERE open IS NOT NULL AND closed IS NOT NULL;
Wenn ich die via HeidiSQL direkt an die Datenbank gebe, bekomme ich für den angegebenen Fensterkontakt "HT_Fensterkontakt" den Devicenamen und die Zeit in Sekunden die der Kontakt für den aktuellen Tag offen war.
HT_Fensterkontakt , 324.000
zurück.
Wenn ich das via SQLCmd ausführe, bekomme ich in SqlResult folgendes zurück:
{"1":"|"}
lso schaut das DbRep aus:
Internals:
DATABASE fhem
DEF logdb
LASTCMD sqlCmd SELECT DEVICE ,SUM(TIME_TO_SEC(TIMEDIFF(closed, open))) AS duration FROM ( SELECT TIMESTAMP, VALUE,DEVICE, @open AS open, @open := IF(VALUE = "open", TIMESTAMP, NULL) AS prev_open, @closed := IF(VALUE = "closed", TIMESTAMP, NULL) AS closed FROM history WHERE DATE(TIMESTAMP) = CURDATE() AND DEVICE = "HT_Fensterkontakt" AND READING = "state" AND (VALUE = "open" OR VALUE = "closed") ORDER BY TIMESTAMP ) AS tmp, (SELECT @open:=NULL, @closed:=NULL) AS vars WHERE open IS NOT NULL AND closed IS NOT NULL;
MODEL Client
NAME Rep.powerOnTime
NOTIFYDEV global,Rep.powerOnTime
NR 994
NTFY_ORDER 50-Rep.powerOnTime
ROLE Client
STATE done
TYPE DbRep
UTF8 1
VERSION 8.9.9
.attraggr:
.attrminint:
HELPER:
DBLOGDEVICE logdb
IDRETRIES 3
MINTS 2015-03-06 07:10:11
SQLHIST
CV:
aggregation no
aggsec 1
destr 2019-01-18
dsstr 2019-01-17
epoch_seconds_end 1547818322
mestr 01
msstr 01
testr 14:32:02
tsstr 14:32:02
wdadd 345600
yestr 2019
ysstr 2019
DBREPCOL:
COLSET 1
DEVICE 64
EVENT 512
READING 64
TYPE 64
UNIT 32
VALUE 128
Helper:
DBLOG:
state:
logdb:
TIME 1547830724.32965
VALUE done
READINGS:
2019-01-18 17:58:44 SqlResult {"1":"|"}
2019-01-18 17:58:44 sqlCmd SELECT DEVICE ,SUM(TIME_TO_SEC(TIMEDIFF(closed, open))) AS duration FROM ( SELECT TIMESTAMP, VALUE,DEVICE, @open AS open, @open := IF(VALUE = "open", TIMESTAMP, NULL) AS prev_open, @closed := IF(VALUE = "closed", TIMESTAMP, NULL) AS closed FROM history WHERE DATE(TIMESTAMP) = CURDATE() AND DEVICE = "HT_Fensterkontakt" AND READING = "state" AND (VALUE = "open" OR VALUE = "closed") ORDER BY TIMESTAMP ) AS tmp, (SELECT @open:=NULL, @closed:=NULL) AS vars WHERE open IS NOT NULL AND closed IS NOT NULL;
2019-01-18 17:58:44 sqlResultNumRows 1
2019-01-18 17:58:44 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 .*:(measured-temp|desired-temp|desiredTemperature|ValvePosition|valveposition|temperature|humidity|motion|nomotion|noMotion|pct|energy|kWh|power|closed|open|liter|standardabweichung|varianz|fuellhoehe|state|dew|dewpoint|zaehler|presence|DbFileSize|data_length_MB|DataBaseSize|heating-performance|heating-performance-percent|heating-state|MouldTemperature).*
MODE asynchronous
MODEL MYSQL
NAME logdb
NR 4
NTFY_ORDER 50-logdb
PID 10234
REGEXP .*:(measured-temp|desired-temp|desiredTemperature|ValvePosition|valveposition|temperature|humidity|motion|nomotion|noMotion|pct|energy|kWh|power|closed|open|liter|standardabweichung|varianz|fuellhoehe|state|dew|dewpoint|zaehler|presence|DbFileSize|data_length_MB|DataBaseSize|heating-performance|heating-performance-percent|heating-state|MouldTemperature).*
STATE connected
TYPE DbLog
UTF8 1
VERSION 3.13.0
dbconn mysql:database=fhem;host=localhost;port=3306
dbuser fhemuser
.attraggr:
.attrminint:
HELPER:
COLSET 1
DEVICECOL 64
EVENTCOL 512
OLDSTATE connected
READINGCOL 64
TYPECOL 64
UNITCOL 32
VALUECOL 128
READINGS:
2019-01-18 17:59:42 CacheUsage 6
2019-01-18 17:59:41 NextSync 2019-01-18 18:00:11 or if CacheUsage 500 reached
2019-01-18 17:59:41 background_processing_time 0.4337
2019-01-18 17:59:41 sql_processing_time 0.3890
2019-01-18 17:59:41 state connected
2018-11-07 11:27:07 userCommand SELECT sum(round(((data_length + index_length) / 1024 / 1024), 2)) as '' FROM information_schema.TABLES WHERE table_schema = 'DATENBANK'
2018-11-07 11:27:07 userCommandResult no result
cache:
index 12070
.memcache:
12065 2019-01-18 17:59:42|EZF_Thermostat_Clima|CUL_HM|ValvePosition: 9|ValvePosition|9|
12066 2019-01-18 17:59:42|EZF_Thermostat_Clima|CUL_HM|desired-temp: 21.0|desired-temp|21.0|
12067 2019-01-18 17:59:42|EZF_Thermostat_Clima|CUL_HM|measured-temp: 21.0|measured-temp|21.0|
12068 2019-01-18 17:59:42|dHeizLeistung|DUMMY|heating-performance-percent: 20.22|heating-performance-percent|20.22|
12069 2019-01-18 17:59:42|dHeizLeistung|DUMMY|heating-performance-percent: 20.2226310947562|heating-performance-percent|20.2226310947562|
12070 2019-01-18 17:59:42|dHeizLeistung|DUMMY|heating-state: on|heating-state|on|
Attributes:
aggregation no
comment Öffnungszeit ermitteln
devStateIcon connected:10px-kreis-gelb .*disconnect:10px-kreis-rot .*done:10px-kreis-gruen
reading state
room 40_Server
sqlResultFormat json
verbose 5
In der LOG Datei sehe ich auch keinen Fehler:
2019.01.18 17:58:44.114 4: DbRep Rep.powerOnTime - -------- New selection ---------
2019.01.18 17:58:44.115 4: DbRep Rep.powerOnTime - Command: sqlCmd SELECT DEVICE ,SUM(TIME_TO_SEC(TIMEDIFF(closed, open))) AS duration FROM ( SELECT TIMESTAMP, VALUE,DEVICE, @open AS open, @open := IF(VALUE = "open", TIMESTAMP, NULL) AS prev_open, @closed := IF(VALUE = "closed", TIMESTAMP, NULL) AS closed FROM history WHERE DATE(TIMESTAMP) = CURDATE() AND DEVICE = "HT_Fensterkontakt" AND READING = "state" AND (VALUE = "open" OR VALUE = "closed") ORDER BY TIMESTAMP ) AS tmp, (SELECT @open:=NULL, @closed:=NULL) AS vars WHERE open IS NOT NULL AND closed IS NOT NULL;
2019.01.18 17:58:44.116 4: DbRep Rep.powerOnTime - Timestamp begin human readable: not set
2019.01.18 17:58:44.117 4: DbRep Rep.powerOnTime - Timestamp end human readable: not set
2019.01.18 17:58:44.117 4: DbRep Rep.powerOnTime - Aggregation: no
2019.01.18 17:58:44.161 4: DbRep Rep.powerOnTime - SQL execute: SELECT DEVICE ,SUM(TIME_TO_SEC(TIMEDIFF(closed, open))) AS duration FROM ( SELECT TIMESTAMP, VALUE,DEVICE, @open AS open, @open := IF(VALUE = "open", TIMESTAMP, NULL) AS prev_open, @closed := IF(VALUE = "closed", TIMESTAMP, NULL) AS closed FROM history WHERE DATE(TIMESTAMP) = CURDATE() AND DEVICE = "HT_Fensterkontakt" AND READING = "state" AND (VALUE = "open" OR VALUE = "closed") ORDER BY TIMESTAMP ) AS tmp, (SELECT @open:=NULL, @closed:=NULL) AS vars WHERE open IS NOT NULL AND closed IS NOT NULL;
2019.01.18 17:58:44.310 4: DbRep Rep.powerOnTime - SQL result:
2019.01.18 17:58:44.319 5: DbRep Rep.powerOnTime - SQL result decoded: |
Da die SQL Abfrage in HeidiSQL ein Ergebnis liefert und einfache Abfragen auch funktionieren frage ich mich ob in meiner Abfrage vielleicht irgendeine Zeichenkette ist die von DbRep aussortiert oder geändert wird und die ich escapen müsste ???
Danke
Peter
Hallo Peter,
ich habe jetzt versucht dein Statement bei mir im phpMyAdmin (erstmal nicht DbRep) nachzubilden.
Ich bekomme mit:
SELECT DEVICE ,SUM(TIME_TO_SEC(TIMEDIFF(closed, opened))) AS duration FROM (
SELECT
TIMESTAMP, VALUE,DEVICE,
@opened AS opened,
@opened := IF(VALUE = "opened", TIMESTAMP, NULL) AS prev_open,
@closed := IF(VALUE = "closed", TIMESTAMP, NULL) AS closed
FROM history WHERE
DATE(TIMESTAMP) = CURDATE() AND
DEVICE = "MelderGW1" AND
READING = "cover" AND
(VALUE = "opened" OR VALUE = "closed")
ORDER BY TIMESTAMP
) AS tmp, (SELECT @open:=NULL, @closed:=NULL) AS vars
WHERE opened IS NOT NULL AND closed IS NOT NULL
ebenfalls NULL-Ergebnisse, obwohl es natürlich das Device "MelderGW1" mit dem Reading "cover" mit dem Wert opened, closed am heutigen Tag in der DB gibt.
Kann ich jetzt nicht sagen wo das Problem liegen könnte.
Grüße
Heiko
Hallo Heiko, danke für die Unterstützung.
Mittlerweile bin einen Schritt weiter.
Wenn ich HeidiSQL neu starte und die Abfrage dann starte kommt da auch nur eine leere Zeile als Ergebnis.
Die Nächste Abfrage funktioniert dann.
Die verwendeten User-Defined Variables werden nicht über eine Session gespeichert.
Wenn ich in HeidiSQL mehrere Abfragen mache bleibt alles in einer Session, bei DbRep wird wohl jede Abfrage mit einer neuen Session gestartet.
Leider bin ich nicht so SQL sattelfest um eine Lösung dafür zu finden oder das Problem zu verstehen das es wohl beim 1. Durchlauf der Session gibt :-(
Das die Abfragen immer in einer neuen Session passieren ist richtig.
Innerhalb des Moduls gibt es ähnliche Fälle die ich z.B. mit "set \@V:= 0, \@diff:= 0, \@diffTotal:= 0, \@RB:= 1;" initialisiere bevor ich die eigentliche Abfrage absetze.
Bin jetzt auch nicht der SQL-Experte.
Vielleicht wäre es möglich mit einem Schlüsselwort zu arbeiten, z.B. VAR:"@V:= 0,diffTotal:= 0,@RB:= 1"; SELECT DEVICE ,SUM(TIME_TO_SEC(TIMEDIFF(closed, opened)))....
Wenn soetwas im sqlCmd vorgefunden wird, könnte ich intern die Variablen initialisieren die in der Session dann vorhanden wären. Ob das wirklich so klappen würde und nicht woanders wieder Probleme verursacht kann ich gerade auch nicht sicher sagen.
Hallo Heiko,
Ich habe die Abfrage mal auf das kleinste Teil reduziert wo es Probleme gibt:
SELECT
TIMESTAMP, VALUE,DEVICE,
@open AS open,
@open := IF(VALUE = 'open', TIMESTAMP, NULL) AS curr_open,
@closed := IF(VALUE = 'closed', TIMESTAMP, NULL) AS closed
FROM history WHERE
DATE(TIMESTAMP) = CURDATE() AND
DEVICE = "HT_Fensterkontakt" AND
READING = "state" AND
(VALUE = "open" OR VALUE = "closed")
ORDER BY TIMESTAMP;
Die Lösung scheint zu sein, ein SET @open:=NULL, @closed:=NULL;
davor zu stellen, das hilft zumindest bei meiner Abfrage in HeidiSQL.
Wenn ich dann aber
SET @open:=NULL, @closed:=NULL;
SELECT
TIMESTAMP, VALUE,DEVICE,
@open AS open,
@open := IF(VALUE = 'open', TIMESTAMP, NULL) AS curr_open,
@closed := IF(VALUE = 'closed', TIMESTAMP, NULL) AS closed
FROM history WHERE
DATE(TIMESTAMP) = CURDATE() AND
DEVICE = "HT_Fensterkontakt" AND
READING = "state" AND
(VALUE = "open" OR VALUE = "closed")
ORDER BY TIMESTAMP;
in DbRep ausführen lasse, dann gibt es eine Fehlermeldung:
2019.01.18 23:45:51.057 4: DbRep Rep.powerOnTime - -------- New selection ---------
2019.01.18 23:45:51.058 4: DbRep Rep.powerOnTime - Command: sqlCmd SET @open:=NULL, @closed:=NULL; SELECT TIMESTAMP, VALUE,DEVICE, @open AS open, @open := IF(VALUE = 'open', TIMESTAMP, NULL) AS curr_open, @closed := IF(VALUE = 'closed', TIMESTAMP, NULL) AS closed FROM history WHERE DATE(TIMESTAMP) = CURDATE() AND DEVICE = "HT_Fensterkontakt" AND READING = "state" AND (VALUE = "open" OR VALUE = "closed") ORDER BY TIMESTAMP;
2019.01.18 23:45:51.060 4: DbRep Rep.powerOnTime - Timestamp begin human readable: not set
2019.01.18 23:45:51.062 4: DbRep Rep.powerOnTime - Timestamp end human readable: not set
2019.01.18 23:45:51.063 4: DbRep Rep.powerOnTime - Aggregation: no
2019.01.18 23:45:51.151 4: DbRep Rep.powerOnTime - SQL execute: SET @open:=NULL, @closed:=NULL; SELECT TIMESTAMP, VALUE,DEVICE, @open AS open, @open := IF(VALUE = 'open', TIMESTAMP, NULL) AS curr_open, @closed := IF(VALUE = 'closed', TIMESTAMP, NULL) AS closed FROM history WHERE DATE(TIMESTAMP) = CURDATE() AND DEVICE = "HT_Fensterkontakt" AND READING = "state" AND (VALUE = "open" OR VALUE = "closed") ORDER BY TIMESTAMP;
2019.01.18 23:45:51.153 2: DbRep Rep.powerOnTime - ERROR - DBD::mysql::st execute failed: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT TIMESTAMP, VALUE,DEVICE, @open AS open, @open := IF(VALUE = 'open', TI' at line 1 at ./FHEM/93_DbRep.pm line 5575.
Wenn ich den SQL Teil aus der Fehlermeldung in HeidiSQL kopiere funktioniert die Abfrage.
Gruß
Peter
Guten Morgen,
genau diesen Ansatz meinte ich.
Momntan kann es noch nicht funktionieren, weil ich das sqlCmd Kommando erst noch für dein solche Parameterübergabe vorbereiten muss.
Ich mache das mal und stelle dir eine DbRep-Version zum Testen bereit.
Grüße
Heiko
Hallo Peter,
habe DbRep angepasst sodass nun SQL Sessionvariablen in der oben beschriebenen Form übergeben werden können.
https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter (Downloadbutton benutzen)
Probiers mal bitte aus. Also:
sqlCmd SET @open:=NULL, @closed:=NULL;
SELECT
TIMESTAMP, VALUE,DEVICE,
@open AS open,
@open := IF(VALUE = 'open', TIMESTAMP, NULL) AS curr_open,
@closed := IF(VALUE = 'closed', TIMESTAMP, NULL) AS closed
FROM history WHERE
DATE(TIMESTAMP) = CURDATE() AND
DEVICE = "HT_Fensterkontakt" AND
READING = "state" AND
(VALUE = "open" OR VALUE = "closed")
ORDER BY TIMESTAMP;
Mit verbose 4 siehst du im Log dass/wie die Variablen vor dem Select gesetzt werden.
Grüße
Heiko
Hallo Heiko,
vielen Dank es funktioniert !!!!
Ich werde das jetzt so einbauen, dass die Abfrage beim schließen eines Fensters durchgeführt wird und die Fensterkontakte darüber ein neues Reading mit der Öffnungszeit bekommen.
Wenn das Läuft stelle ich die komplette Lösung mal vor.
Vielen Dank für deine Unterstützung !
Gruß
Peter
Hallo Heiko,
es gibt noch eine Unschönheit. Wenn man den SQL in der Oberfläche ausführt und das 2x hintereinander, dann wird der gespeicherten Abfrage der Teil SET @open:=NULL, @closed:=NULL;
vergessen und die Abfrage schlägt deshalb fehl.
Gruß
Peter
Zitates gibt noch eine Unschönheit.
Ja ich weiß. Wollte nur erstmal schauen ob es prinzipiell funktioniert.
Ich programiere es noch aus, aktualisiere die Commandref und stelle dir das Modul nochmal zum Test zur Verfügung.
Wenn ales ok ist, checke ich die neue Version ein.
Hallo Peter,
habe jetzt alles komplett fertig gestellt und die V.8.10.0 wieder nach contrib geladen.
Schau mal ob jetzt alles wie gewünscht klappt.
Ich freue mich auf deine komplette Lösungsbeschreibung und würde sie auch gerne ins DbRep-Wiki übernehmen als funktionales Beispiel mit SQL Session Variablen.
Grüße
Heiko
Hallo Heiko,
läuft alles prima. In der Oberfläche klappt es auch mit der Wiederholung des SQL Kommandos.
Wenn deine Änderung im "normalen" Update ist, dann sag bitte mal bescheid dann stell ich meine Lösung hier vor.
Natürlich kannst du das dann gerne in den DbRep-Wiki packen.
Vielen Dank nochmal für die schnelle Erweiterung !
Gruß
Peter
Guten Morgen Peter,
na das liest sich doch gut :)
Ich habe die Änderung soeben eingecheckt und ist dann morgen früh im Regelupdate vorhanden.
Wer möchte, kann sich das geänderte Modul schon jetzt aus dem SVN ziehen.
Grüße
Heiko
Hallo Heiko,
ich habe heute Morgen nochmal einen Blick ins LOG geworfen:
WindowClosedNty ist das Notify mit dem ich die Funktion SwitchEvent() aufrufe. Das Rep.powerOnTime DbRep Device wird nur für diesen Zweck benutzt.
2019.01.20 10:55:39.833 5: Triggering WindowClosedNty
2019.01.20 10:55:39.834 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 10:55:39.884 5: Triggering WindowClosedNty
2019.01.20 10:55:39.885 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 10:55:39.889 1: DbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:11332 Timeout: process terminated
2019.01.20 10:55:39.952 5: Triggering WindowClosedNty
2019.01.20 10:55:39.953 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 10:55:39.958 1: DbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:11333 Timeout: process terminated
2019.01.20 10:55:40.028 5: Triggering WindowClosedNty
2019.01.20 10:55:40.028 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 10:55:40.030 5: SwitchEvent start query: SET @topen = NULL,@closed = NULL, @popen = NULL;; SELECT DEVICE ,SUM(TIMEDIFF(tclosed, topen)) AS duration FROM ( SELECT TIMESTAMP, VALUE, DEVICE, @topen := @popen AS topen, @closed := IF(VALUE = "closed", TIMESTAMP, NULL) AS tclosed, @popen := IF(VALUE = "open", TIMESTAMP, NULL) AS prev_open FROM history WHERE DATE(TIMESTAMP) = CURDATE() AND DEVICE = "AZ_Fensterkontakt" AND READING = "state" AND (VALUE = "open" OR VALUE = "closed") ORDER BY TIMESTAMP ) AS tmp
2019.01.20 10:55:40.033 1: DbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:11334 Timeout: process terminated
2019.01.20 10:55:40.124 5: Triggering WindowClosedNty
2019.01.20 10:55:40.125 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 10:55:40.129 1: DbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:11335 Timeout: process terminated
2019.01.20 10:55:40.189 5: Triggering WindowClosedNty
2019.01.20 10:55:40.190 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 10:55:40.194 1: DbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:11336 Timeout: process terminated
2019.01.20 10:55:40.265 5: Triggering WindowClosedNty
2019.01.20 10:55:40.265 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 10:55:40.269 1: DbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:11337 Timeout: process terminated
2019.01.20 10:55:40.339 5: Triggering WindowClosedNty
2019.01.20 10:55:40.339 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 10:55:40.343 1: DbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:11338 Timeout: process terminated
2019.01.20 10:55:40.413 5: Triggering WindowClosedNty
2019.01.20 10:55:40.414 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 10:55:40.418 1: DbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:11339 Timeout: process terminated
2019.01.20 10:55:40.478 5: Triggering WindowClosedNty
2019.01.20 10:55:40.479 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 10:55:40.483 1: DbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:11340 Timeout: process terminated
2019.01.20 10:55:40.552 5: Triggering WindowClosedNty
2019.01.20 10:55:40.553 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 10:55:40.557 1: DbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:11341 Timeout: process terminated
2019.01.20 10:55:40.839 1: SwitchQueryResult SqlResult detected.
2019.01.20 10:55:40.840 1: SwitchQueryResult splitted result: SZ_Fensterkontakt 406.000000
2019.01.20 10:56:25.981 1: [Freezemon] myFreezemon: possible freeze starting at 10:55:54, delay is 31.98 possibly caused by: tmr-Calendar_PollChild(Kalender_fhem)
2019.01.20 11:00:34.314 5: Triggering WindowClosedNty
2019.01.20 11:00:34.315 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:00:34.391 5: Triggering WindowClosedNty
2019.01.20 11:00:34.392 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:00:34.396 1: DbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:11375 Timeout: process terminated
2019.01.20 11:00:34.575 5: Triggering WindowClosedNty
2019.01.20 11:00:34.575 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:00:34.579 1: DbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:11376 Timeout: process terminated
2019.01.20 11:00:34.685 1: SwitchQueryResult SqlResult detected.
2019.01.20 11:00:34.685 1: SwitchQueryResult splitted result: BDL_Fensterkontakt 714.000000
2019.01.20 11:00:35.210 5: Triggering WindowClosedNty
2019.01.20 11:00:35.211 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:00:35.335 5: Triggering WindowClosedNty
2019.01.20 11:00:35.336 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:00:35.340 1: DbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:11378 Timeout: process terminated
2019.01.20 11:00:35.399 5: Triggering WindowClosedNty
2019.01.20 11:00:35.399 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:00:35.403 1: DbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:11379 Timeout: process terminated
2019.01.20 11:00:35.513 1: SwitchQueryResult SqlResult detected.
2019.01.20 11:00:35.513 1: SwitchQueryResult splitted result: BD_Fensterkontakt 731.000000
2019.01.20 11:00:35.564 1: SwitchQueryResult SqlResult detected.
2019.01.20 11:00:35.565 1: SwitchQueryResult splitted result: 0
2019.01.20 11:00:35.966 5: Triggering WindowClosedNty
2019.01.20 11:00:35.967 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:00:36.085 5: Triggering WindowClosedNty
2019.01.20 11:00:36.086 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:00:36.092 1: DbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:11381 Timeout: process terminated
2019.01.20 11:00:36.221 1: SwitchQueryResult SqlResult detected.
2019.01.20 11:00:36.221 1: SwitchQueryResult splitted result: BD_Fensterkontakt 731.000000
2019.01.20 11:00:37.099 5: Triggering WindowClosedNty
2019.01.20 11:00:37.099 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:00:37.156 5: Triggering WindowClosedNty
2019.01.20 11:00:37.156 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:00:37.160 1: DbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:11383 Timeout: process terminated
2019.01.20 11:00:37.252 1: SwitchQueryResult SqlResult detected.
2019.01.20 11:00:37.252 1: SwitchQueryResult splitted result: 0
2019.01.20 11:00:52.770 5: Triggering WindowClosedNty
2019.01.20 11:00:52.770 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:00:52.851 5: Triggering WindowClosedNty
2019.01.20 11:00:52.851 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:00:52.855 1: DbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:11385 Timeout: process terminated
2019.01.20 11:00:52.970 1: SwitchQueryResult SqlResult detected.
2019.01.20 11:00:52.970 1: SwitchQueryResult splitted result: WZ_Fensterkontakt 0
2019.01.20 11:00:53.020 5: Triggering WindowClosedNty
2019.01.20 11:00:53.021 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:00:53.091 5: Triggering WindowClosedNty
2019.01.20 11:00:53.092 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:00:53.096 1: DbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:11387 Timeout: process terminated
2019.01.20 11:00:53.201 1: SwitchQueryResult SqlResult detected.
2019.01.20 11:00:53.202 1: SwitchQueryResult splitted result: WZ_Fensterkontakt 0
2019.01.20 11:00:53.292 5: Triggering WindowClosedNty
2019.01.20 11:00:53.292 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:00:53.363 5: Triggering WindowClosedNty
2019.01.20 11:00:53.364 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:00:53.368 1: DbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:11389 Timeout: process terminated
2019.01.20 11:00:53.480 1: SwitchQueryResult SqlResult detected.
2019.01.20 11:00:53.481 1: SwitchQueryResult splitted result: WZ_Fensterkontakt 0
2019.01.20 11:00:53.919 5: Triggering WindowClosedNty
2019.01.20 11:00:53.920 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:00:53.989 5: Triggering WindowClosedNty
2019.01.20 11:00:53.990 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:00:53.994 1: DbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:11391 Timeout: process terminated
2019.01.20 11:00:54.107 1: SwitchQueryResult SqlResult detected.
2019.01.20 11:00:54.107 1: SwitchQueryResult splitted result: WZ_Fensterkontakt 0
2019.01.20 11:01:01.806 5: Triggering WindowClosedNty
2019.01.20 11:01:01.807 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:01:01.905 5: Triggering WindowClosedNty
2019.01.20 11:01:01.905 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:01:01.910 1: DbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:11394 Timeout: process terminated
2019.01.20 11:01:02.098 1: SwitchQueryResult SqlResult detected.
2019.01.20 11:01:02.098 1: SwitchQueryResult splitted result: 0
2019.01.20 11:01:02.359 5: Triggering WindowClosedNty
2019.01.20 11:01:02.359 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:01:02.409 5: Triggering WindowClosedNty
2019.01.20 11:01:02.409 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:01:02.414 1: DbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:11396 Timeout: process terminated
2019.01.20 11:01:02.504 1: SwitchQueryResult SqlResult detected.
2019.01.20 11:01:02.505 1: SwitchQueryResult splitted result: 0
2019.01.20 11:01:02.718 5: Triggering WindowClosedNty
2019.01.20 11:01:02.718 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:01:02.814 1: SwitchQueryResult SqlResult detected.
2019.01.20 11:01:02.814 1: SwitchQueryResult splitted result: 0
2019.01.20 11:01:03.506 5: Triggering WindowClosedNty
2019.01.20 11:01:03.507 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:01:03.625 5: Triggering WindowClosedNty
2019.01.20 11:01:03.626 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:01:03.630 1: DbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:11400 Timeout: process terminated
2019.01.20 11:01:03.748 1: SwitchQueryResult SqlResult detected.
2019.01.20 11:01:03.749 1: SwitchQueryResult splitted result: 0
2019.01.20 11:01:19.952 5: Triggering WindowClosedNty
2019.01.20 11:01:19.952 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:01:20.002 5: Triggering WindowClosedNty
2019.01.20 11:01:20.003 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:01:20.007 1: DbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:11402 Timeout: process terminated
2019.01.20 11:01:20.224 5: Triggering WindowClosedNty
2019.01.20 11:01:20.225 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.20 11:01:20.293 1: SwitchQueryResult SqlResult detected.
2019.01.20 11:01:20.294 1: SwitchQueryResult splitted result: 0
2019.01.20 11:01:20.329 1: SwitchQueryResult SqlResult detected.
2019.01.20 11:01:20.329 1: SwitchQueryResult splitted result: WC_Fensterkontakt 0
es scheint weiter alles zu funktionieren. Ich denke mal das hat nichts mit deiner Änderung zu tun, aber du kannst ja mal einen Blick darauf werfen ob dir das was sagt.
Gruß Peter
Hallo Peter,
du meinst die timeouts ?
ZitatDbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:11341 Timeout: process terminated
Die kommen, wenn die ausgeführte sqlCmd-Routine nicht nach der durch das Attribut timeout definierte Zeit fertig wird. Allerdings ist diese Zeit per default 86400 Sekunden = 1 Tag !
Was mich völlig irritiert ... warum rufst du denn die WindowClosedNty exec- Routine aller paar Millisekunden auf ? Wird das sqlCmd durch diese Routine dann jedesmal auch aufgerufen ?
Hallo Heiko,
das Notify sollte eigentlich nur mit jedem Schließen eines Fensters aufgerufen werden. Die Kontakte melden sich zwar zyklisch, aber eigentlich nicht jede ms. Da muß ich nochmal schauen was da schief geht.
Danke
Peter
Liegt sicherlich an der Definition des Notify bzw. dem Regex darin welcher die Fenstersensoren auswertet. Wenn das sqlCmd alle paar Millisekunden aufgerufen wird, wundert es mich dass nicht mehr Unannehmlichkeiten auftreten. ;)
Ja, schau mal oder poste das Notify wenn du nicht weiterkommst. Würde es mir morgen anschauen.
Schönen Restabend noch !
Grüße
Heiko
Ich habs >:(
Das Notify:
defmod WindowClosedNty notify .*_Fensterkontakt:closed {SwitchEvent($NAME,"dummy",$EVENT)}
attr WindowClosedNty verbose 5
löst wohl nicht nur bei den Fensterkontakten aus, sondern auch wenn die gepeerten Thermostate auf die Kontakte reagieren.
2019.01.21 06:13:45.567 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.21 06:13:45.568 1: SwitchEvent called with: BD_Fensterkontakt dummy closed
..
2019.01.21 06:13:45.622 4: WindowClosedNty exec {SwitchEvent($NAME,"dummy",$EVENT)}
2019.01.21 06:13:45.623 1: SwitchEvent called with: BD_Thermostat_WindowRec dummy trigLast: BD_Fensterkontakt:closed
2019.01.21 06:13:45.626 3: DbRep Rep.powerOnTime - WARNING - old process 20279 will be killed now to start a new BlockingCall
2019.01.21 06:13:45.627 1: DbRep Rep.powerOnTime -> BlockingCall sqlCmd_DoParse pid:20279 Timeout: process terminated
Ich habe erstmal nichts in der Doku gefunden mit der ich ein Notify z.B. auf einen Subtyp beschränken kann und habe den Filter in mein Perl Scrip SwitchEvent() eingebaut das DbRep aufruft. Damit sollte es beim physikalischen schließen des Fensters keinen Mehrfachaufruf mehr geben und die Datenbank genügend Zeit haben.
Danke für den guten Hinweis und Gruß
Peter
Ist doch schon ein Fortschritt.
Zeig doch mal das komplette Event auf das du eigentlich mit dem Notify reagieren willst.
Grüße
Heiko
Hallo Heiko,
mit dem normalen Update funktioniert auch alles. Das Notify habe ich so angepasst dass nur die Events der Fensterkontakte durchkommen.
Ich mache den Thread mal zu und mache für meine Beschreibung der Komplettlösung mit RepDB einen neuen Thread auf.
Gruß
Peter