Modul 93_DbRep - Reporting und Management von Datenbankinhalten (DbLog)

Begonnen von DS_Starter, 19 Mai 2016, 22:52:13

Vorheriges Thema - Nächstes Thema

DS_Starter

Hallo Andreas,

ich glaube es liegt ein grundlegendes Mißverständnis vor ... vermutlich.  :)
Wenn man eine Liste bzw. Angaben mit Wildcards angibt, werden die Werte der auf diese Liste/Wildcards zutreffenden Devices und Readings _alle_ gemeinsam bewertet und aus _allen_ diesen Werten wird z.B. ein Durchschnitt oder Maxvalue usw. berechnet.

Um für eine solche Selektion und Berechnung einen _eindeutigen_ generischen Devicenamen für das Zurückschreiben in die DB zu erstellen, der außerdem auch einen Bezug zu der verwendeten Selektion enthält, erscheint mir momentan recht schwierig.

Vermutlich ist es aber garnicht das was du möchtest. Sondern ich vermute du willst eine Liste von Devices und Readings angeben deren Werte in einem Lauf ermittelt, aber im Ergebnis getrennt voneinander berechnet werden. Das wäre nicht möglich und mit getrennten DbReps zu machen.

LG,
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

flummy1978

Hey Heiko,

danke dass Du das Hirnjogging mit mir teilst  ;D

Zitat von: DS_Starter am 01 Mai 2020, 20:01:08
Vermutlich ist es aber garnicht das was du möchtest. Sondern ich vermute du willst eine Liste von Devices und Readings angeben deren Werte in einem Lauf ermittelt, aber im Ergebnis getrennt voneinander berechnet werden. Das wäre nicht möglich und mit getrennten DbReps zu machen.

Genau darum ging es ... es sollten natürlich nicht diversteste Werte über diverseste Readings zusammen gefasst und im Durchschnitt gerechnet werden, sondern wie Du schon vermutet hast (in meinem Fall):







Device                        Reading
Wetterstationwind_gust
Wetterstationluminosity
HauptzaehlerSchnitt_30min
NEbenzaehlerSchnitt_30min
uswusf

Irgendwie befürchte ich gerade dass der Raum mit meinen Datenbankdevices grad droht zu überfüllen  ::) :P

Vielen Dank dennoch, dass Du Dir mit mir die Gedanken gemacht hast

Viele Grüße
Andreas

DS_Starter

ZitatIrgendwie befürchte ich gerade dass der Raum mit meinen Datenbankdevices grad droht zu überfüllen  ::)
Da ist immer noch Luft  :D

Kleiner Hinweis....
Wenn du sehr viele DbReps hast, setze dir überall das Attribute fastStart = 1:

attr TYPE=DbRep fastStart 1

Dadurch kontaktieren die Devices nicht die DB beim FHEM Start, sondern erst wenn sie das erste Mal eine Aktion ausführen.

LG,
Heiko 
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

flummy1978

Zitat von: DS_Starter am 01 Mai 2020, 21:08:40
Da ist immer noch Luft  :D

attr TYPE=DbRep fastStart 1

Dadurch kontaktieren die Devices nicht die DB beim FHEM Start, sondern erst wenn sie das erste Mal eine Aktion ausführen.

Ich glaub auch ... so wie Du (100 ? oder wieviel war das noch ? ) werde ich wohl nicht hinkommen,also ist da immer Luft nach oben  ::)

Sehr sehr guter (Performence) Hinweis ... aber dann mal so als Idee... wäre das nicht grundsätzlich gut das als Standard zu machen ? Und nur wenn man es unbedingt will (wobei sich da für mich kein wirklicher Grund erschließt) dann fastStart 0 setzen zu müssen ?

VG
Andreas

DS_Starter

ZitatSehr sehr guter (Performence) Hinweis ... aber dann mal so als Idee... wäre das nicht grundsätzlich gut das als Standard zu machen ? Und nur wenn man es unbedingt will (wobei sich da für mich kein wirklicher Grund erschließt) dann fastStart 0 setzen zu müssen ?
Ja, habe ich auch schon dran gedacht. Werde ich wohl machen wenn ich mal wieder am Modul arbeite.
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

uwirt

Ich mache offenbar hier etwas falsch da ich mit DbRep keinen Zugriff auf die Datenbank bekomme.

DbLog ist wie folgt definiert:


defmod Libelium_DbLog DbLog ./db.conf .*:.*

setstate Libelium_DbLog connected
setstate Libelium_DbLog 2020-05-03 17:02:32 state connected


db.conf sieht folgendermassen aus:

%dbconfig= (
    connection => "mysql:database=database;host=db;port=3306",
    user => "user",
    password => "password",
);


DbRep sieht folgendermassen aus:

defmod Libelium_Db DbRep Libelium_DbLog
attr Libelium_Db verbose 5

setstate Libelium_Db disconnected
setstate Libelium_Db 2020-05-03 16:53:33 errortext DBI connect('database=database;;host=192.168.1.171;;port=3306','user',...) failed: Unknown database 'database' at ./FHEM/93_DbRep.pm line 1841.\

setstate Libelium_Db 2020-05-03 16:53:33 state disconnected


Mir scheint ich hätte gemäss Vorgaben alle Perl Module installiert. Ich habe auch user und password über adminCredentials eingegeben.

Kann es damit zu tun haben dass die MySQL Datenbank extern angelegt wurde und die Tabellen "history" und "current" fehlen, dafür aber eine Tabelle mit einer anderen Bezeichnung vorhanden ist?

Hat da jemand eine Idee?
FHEM / Ubuntu / fitlet2
HomeMatic: CCU3|HmIP-STHD|HmIP-PCBS|HmIP-PCBS2|HmIP-PCBS-BAT|HM-WDC7000|HM-WDS100-C6-O|HM-WDS40|HM-LC-Sw1-FM|HM-LC-RGBW-WM|HM-ES-PMSw1-Pl|HM-ES-TX-WM
NAS: DS218+|DS209j|DS216+II|DS412+
Devices: Panasonic Webcams|Withings|Gardena Smart|Tuya

DS_Starter

Momentan frage ich mich ob deine DB wirklich 'database'  heißt ? Ist ein bisschen ungewöhnlich und außerdem ist die Fehlermeldung recht eindeutig:

failed: Unknown database 'database'

ZitatMir scheint ich hätte gemäss Vorgaben alle Perl Module installiert. Ich habe auch user und password über adminCredentials eingegeben.
Damit hat es ganz sicher nichts zu tun. Dann kämen ganz andere Fehler.

Zitat
Kann es damit zu tun haben dass die MySQL Datenbank extern angelegt wurde und die Tabellen "history" und "current" fehlen, dafür aber eine Tabelle mit einer anderen Bezeichnung vorhanden ist?
What ?  :)  Wenn "history" und "current" fehlen, sollte DbLog aber auch Probleme haben. Weniger mit dem connect an sich, wohl aber beim Logging. Das gilt auch für DbRep beim Zugriff auf die Tabellen. Die Connect-Infos werden direkt aus dem angegebenen DbLog-Device gezogen.

Also ich habe noch kein richtiges Bild.
Poste mal bitte ein List vom DbLog 'list Libelium_DbLog' und vor allem auch die Ausgabe von "set Libelium_DbLog configCheck".

Heiko

ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

uwirt

Danke für die rasche Antwort. Die Datenbank heisst MeshliumDB. Hier die Listings:

'list Libelium_DbLog:

Internals:
   COLUMNS    field length used for Device: 64, Type: 64, Event: 512, Reading: 64, Value: 128, Unit: 32
   CONFIGURATION ./db.conf
   DEF        ./db.conf .*:.*
   FUUID      5eaeca15-f33f-8d74-606d-aa6c4b8136403502
   FVERSION   93_DbLog.pm:v4.9.12-s21801/2020-04-29
   MODE       synchronous
   MODEL      MYSQL
   NAME       Libelium_DbLog
   NR         191
   NTFY_ORDER 50-Libelium_DbLog
   PID        1083
   REGEXP     .*:.*
   STATE      connected
   TYPE       DbLog
   UTF8       0
   dbconn     mysql:database=meshliumDB;host=192.168.1.171;port=3306
   dbuser     root
   HELPER:
     COLSET     1
     DEVICECOL  64
     EVENTCOL   512
     OLDSTATE   connected
     PACKAGE    main
     READINGCOL 64
     TC         current
     TH         history
     TYPECOL    64
     UNITCOL    32
     VALUECOL   128
     VERSION    4.9.12
   Helper:
     DBLOG:
       state:
         Libelium_DbLog:
           TIME       1588535549.30821
           VALUE      connected
   READINGS:
     2020-05-03 21:52:29   state           connected
Attributes:


'set Libelium_DbLog config Check':

Result of version check

Used Perl version: 5.26.1
Used DBI (Database independent interface) version: 1.643
Used DBD (Database driver) version mysql: 4.046
Used DbLog version: 4.9.12.
Your local DbLog module is up to date.
Recommendation: No update of DbLog is needed.

Result of configuration read check

Connection parameter store type: file
Connection parameter: Connection -> mysql:database=meshliumDB;host=192.168.1.171;port=3306, User -> root, Password -> read o.k.

Result of connection check

Connection to database was not successful.
Recommendation: Plese check logfile for further information.


Die Information zu den Tables in der Datenbank ist wie folgt:

MySQL [MeshliumDB]> show tables;
+----------------------+
| Tables_in_MeshliumDB |
+----------------------+
| bluetoothData        |
| currentSensors       |
| encryptionData       |
| gpsData              |
| last_data            |
| meshlium             |
| sensorParser         |
| sensors              |
| tokens               |
| users                |
| waspmote             |
| wifiScan             |
| zigbeeData           |
+----------------------+
FHEM / Ubuntu / fitlet2
HomeMatic: CCU3|HmIP-STHD|HmIP-PCBS|HmIP-PCBS2|HmIP-PCBS-BAT|HM-WDC7000|HM-WDS100-C6-O|HM-WDS40|HM-LC-Sw1-FM|HM-LC-RGBW-WM|HM-ES-PMSw1-Pl|HM-ES-TX-WM
NAS: DS218+|DS209j|DS216+II|DS412+
Devices: Panasonic Webcams|Withings|Gardena Smart|Tuya

DS_Starter

Schau mal configCheck sagt:


Result of connection check

Connection to database was not successful.
Recommendation: Plese check logfile for further information.


Wieso im state "connected" steht, kann ich mir noch nicht erklären.
Aber ich behaupte in diese DB wird nichts geschrieben, wohin auch ?
Es gibt keine history / current Tabellen.

Stehen denn im Logfile keine DbLog-Fehler ?  Das müsste doch eigentlich überlaufen  ;)

Morgen schaue ich weiter ...

LG,
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

DS_Starter

@uwirt, hast du noch Infos bzgl. Logausgaben von DbLog ?
(nicht das du jetzt auf irgendwas wartest  ;) )

LG,
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

uwirt

Ich hatte da einen Schreibfehler - der Name der Datenbank ist nicht meshliumDB sondern MeshliumDB.
Das Logfile sieht nun folgendermassen aus:


2020.05.05 17:00:33 2: DbLog Libelium_DbLog -> Error table history - DBD::mysql::st execute_array failed: Table 'MeshliumDB.history' doesn't exist [err was 1146 now 2000000000]


Offenbar möchte ich etwas was man mit der Kombination DbLog und DbRep gar nicht tun kann, nämlich mit FHEM eine Tabelle aus einer MySql Datenbank auslesen, welche weder "history" noch "current" heisst?!

Aber immerhin: mit dem set Befehl "sqlCmd SELECT * FROM sensorParser WHERE id_wasp LIKE 'sur00_'" kriege ich schon mal die Werte meiner Sensoren als Readings dargestellt:


SqlResultRow_01

ID|ID_WASP|ID_SECRET|FRAME_TYPE|FRAME_NUMBER|SENSOR|VALUE|TIMESTAMP|SYNC|RAW|PARSER_TYPE

2020-05-05 17:22:55
SqlResultRow_02

1|sur001|403470039|128|72|TCB|16.37|2020-05-05 17:13:38|0|noraw|1

2020-05-05 17:22:55
SqlResultRow_03

2|sur001|403470039|128|72|HUMB|85.8|2020-05-05 17:13:38|0|noraw|1

2020-05-05 17:22:55
SqlResultRow_04

3|sur001|403470039|128|72|SOILT|15.83|2020-05-05 17:13:38|0|noraw|1

2020-05-05 17:22:55
SqlResultRow_05

4|sur001|403470039|128|72|UV|26.78|2020-05-05 17:13:38|0|noraw|1

2020-05-05 17:22:55
SqlResultRow_06

5|sur001|403470039|128|72|TCC|14.31|2020-05-05 17:13:38|0|noraw|1

2020-05-05 17:22:55
SqlResultRow_07

6|sur001|403470039|128|72|SOIL|5524.86|2020-05-05 17:13:38|0|noraw|1

2020-05-05 17:22:55
SqlResultRow_08

7|sur001|403470039|128|72|LW|0.000|2020-05-05 17:13:38|0|noraw|1

2020-05-05 17:22:55
SqlResultRow_09

8|sur002|403470039|128|73|IN_TEMP|17.00|2020-05-05 17:14:03|0|noraw|1

2020-05-05 17:22:55
SqlResultRow_10

9|sur002|403470039|128|73|BAT|98|2020-05-05 17:14:03|0|noraw|1

2020-05-05 17:22:55
SqlResultRow_11

10|sur002|403470039|128|73|GMT|54|2020-05-05 17:14:03|0|noraw|1

2020-05-05 17:22:55
SqlResultRow_12

11|sur002|403470039|128|73|RSSI|85|2020-05-05 17:14:03|0|noraw|1

2020-05-05 17:22:55
SqlResultRow_13

12|sur002|403470039|128|73|RAM|73|2020-05-05 17:14:03|0|noraw|1

2020-05-05 17:22:55
SqlResultRow_14

13|sur002|403470039|128|73|STR|0|2020-05-05 17:14:03|0|noraw|1

2020-05-05 17:22:55
SqlResultRow_15

14|sur002|403470039|128|73|RAD|4.180645|2020-05-05 17:14:03|0|noraw|1

2020-05-05 17:22:55
sqlCmd

SELECT * FROM sensorParser WHERE id_wasp LIKE 'sur00_'

2020-05-05 17:22:55
sqlResultNumRows

14

2020-05-05 17:22:55
state

done

2020-05-05 17:22:55


Meine Frage wäre nun ob man wie man den Befehl sqlCmd regelmässig ausführen lassen kann?


FHEM / Ubuntu / fitlet2
HomeMatic: CCU3|HmIP-STHD|HmIP-PCBS|HmIP-PCBS2|HmIP-PCBS-BAT|HM-WDC7000|HM-WDS100-C6-O|HM-WDS40|HM-LC-Sw1-FM|HM-LC-RGBW-WM|HM-ES-PMSw1-Pl|HM-ES-TX-WM
NAS: DS218+|DS209j|DS216+II|DS412+
Devices: Panasonic Webcams|Withings|Gardena Smart|Tuya

DS_Starter

ZitatOffenbar möchte ich etwas was man mit der Kombination DbLog und DbRep gar nicht tun kann, nämlich mit FHEM eine Tabelle aus einer MySql Datenbank auslesen, welche weder "history" noch "current" heisst?!
Das ist richtig. Aktuell müssen die Tabellen genau so heißen. Allerdings hatte ich bereits angefangen, eigene Tabellennamen zu ermöglichen. Das ist aber noch nicht fertig umgesetzt und ist noch bisschen Zukunftsmusik.

ZitatAber immerhin: mit dem set Befehl "sqlCmd SELECT * FROM sensorParser WHERE id_wasp LIKE 'sur00_'" kriege ich schon mal die Werte meiner Sensoren als Readings dargestellt:...

Meine Frage wäre nun ob man wie man den Befehl sqlCmd regelmässig ausführen lassen kann?
sqlCmd ist "frei". Da kannst du quasi alles mit machen und auch andere Tabellen auswerten sofern der User die Rechte hat.
Du kannst sqlCmd wie jeden anderen Befehl auch zum Beispiel mit einem einfachen at-Device regelmäßig ausführen. Gibt ja auch noch mehr ... DOIF, timer ... und möglicherwiese noch weitere.
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

uwirt

Na dann freue ich mich wenn es mit den eigenen Tabellennamen so weit ist.

Kannst Du mir ein Beispiel für einen at-Device geben, ich muss dort ja wohl auch den Weg zur Datenbank nennen?!
FHEM / Ubuntu / fitlet2
HomeMatic: CCU3|HmIP-STHD|HmIP-PCBS|HmIP-PCBS2|HmIP-PCBS-BAT|HM-WDC7000|HM-WDS100-C6-O|HM-WDS40|HM-LC-Sw1-FM|HM-LC-RGBW-WM|HM-ES-PMSw1-Pl|HM-ES-TX-WM
NAS: DS218+|DS209j|DS216+II|DS412+
Devices: Panasonic Webcams|Withings|Gardena Smart|Tuya

DS_Starter

Das ist nichts anderes als dein schon genanntes Beispiel von:

sqlCmd SELECT * FROM sensorParser WHERE id_wasp LIKE 'sur00_'

Das Statement nimmst du und packst es in ein at.
Hier mal ein von mir:


define At.DbRep.LogDB.FindNaDevs at +*72:00:00 set Rep.LogDB.FindNaDevs sqlCmd select device, count(*) from history group by DEVICE
attr At.DbRep.LogDB.FindNaDevs icon clock
attr At.DbRep.LogDB.FindNaDevs room Datenbank->Produktiv


Mit deinem Statement wäre es dann:

define At.DbRep.LogDB.FindNaDevs at +*72:00:00 set Rep.LogDB.FindNaDevs sqlCmd SELECT * FROM sensorParser WHERE id_wasp LIKE 'sur00_'
attr At.DbRep.LogDB.FindNaDevs icon clock
attr At.DbRep.LogDB.FindNaDevs room Datenbank->Produktiv


Der Weg zur DB und den damit verbundenen Angaben (credentials) sind ja in dem verwendeten DbRep (Rep.LogDB.FindNaDevs) bereits vorhanden. DbRep weiß welche DB es sein soll, nur mit history / current kannst du halt nicht operieren. Deswegen geht auch nur das sqlCmd weil dort die Tabelle, hier sensorParser, frei angeben kannst.

LG,
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

frober

Hallo Heiko,

ich habe eine Frage zu syncStandby:

Die SyncDB kann nur im gleichen Pfad liegen oder es ist z.B. auf dem NAS eine weitere DB-Instanz nötig (Client)!?

Aktuell mache ich einen Dump auf meinen Router (mit Samba). Da ist der Raspi ca. 2h sehr gut beschäftigt.

Ich würde gerne dort die SyncDB anlegen, alternativ ein 2. USB-Stick auf dem Raspi als Backup. Dazu müsste es die Möglichkeit geben für MariaDB unterschiedliche DB-Pfade anzugeben. Jedoch habe ich aktuell keine Infos gefunden, ob dies möglich ist.

Grüße Bernd
Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...