DbRep - Verständnisfrage SET / GET

Begonnen von Pi_01, 08 Mai 2020, 23:18:44

Vorheriges Thema - Nächstes Thema

Pi_01

Hallo,
ich habe mir mein erstes DbRep definiert und bin nun auf das tolle Feature "sqlCmd" gestoßen:
SQL-Statement eingeben, Button "set" drücken, und schon bekomme ich die gewünschte Ausgabe in Form von READINGS.

Der Hacken: Ich möchte nicht jedes Mal manuell den Button "set" drücken müssen, damit FHEM mir die aktuellen Werte zurückliefert.

Wie muss ich denn vorgehen, damit die SQL-Anweisung automatisch nach einem bestimmen Intervall abgerufen wird?



DS_Starter

Du kannst jeden Set/Get Befehl zum Beispiel mit einem definierten at-Device regelmäßig oder zu bestimmten Zeitpunkten ausführen lassen.
Gibt noch mehr Tools dafür ... DOIF, timer ... vielleicht noch andere.
Proxmox+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

Pi_01

#2
Zitat von: DS_Starter am 08 Mai 2020, 23:23:33
Du kannst jeden Set/Get Befehl zum Beispiel mit einem definierten at-Device regelmäßig oder zu bestimmten Zeitpunkten ausführen lassen.
Gibt noch mehr Tools dafür ... DOIF, timer ... vielleicht noch andere.
Da die SQL-Abfrage alle 60 Sekunden durchgeführt werden soll, dachte ich an on-for-timer.

Warum funktioniert diese Codezeile nicht:

define Rep.123 DbRep meinDBlog sqlCmd SELECT value FROM history WHERE device='aaa' ORDER BY timestamp DESC LIMIT 10 on-for-timer 60

Auch mit SET gehts nicht:

define Rep.123 DbRep meinDBlog SET sqlCmd SELECT value FROM history WHERE device='aaa' ORDER BY timestamp DESC LIMIT 10 on-for-timer 60

Rep.123 wird zwar angelegt, es erfolgt jedoch keine SQL-Abfrage.


Bezüglich "on-for-timer" lese ich im Internet Beispiele wie diese:

set Lamp1 on-for-timer 10

Lamp1 ist der Devicename?

Ich möchte aber kein Device alle x Sekunden ausführen lassen, sondern ein SQL-Statement.


Wzut

on-for-timer ist Teil der setExtensions und muß vom Modulautor an die Möglichkeit für Set angebunden werden.
Macht mani.d.R nur für Geräte Module die wirklich etwas schalten.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

DS_Starter

#4
Moin, moin Wzut,

ZitatWarum funktioniert diese Codezeile nicht:.....

(und auch der Rest nicht)

Weil das grundlegend falsch ist. Ich glaube du hast die Definition / Handhabung von Devices und das Zusammenspiel / Verwendung mit Hilfsmodulen wie at / notify etc. noch nicht verstanden.
Ich würde dir dringend raten das Einsteiger PDF (ist hier oben angepinnt) nochmal ? zu lesen und zu verinnerlichen.

Um dir ein konkretes Beispiel zu nennen, wäre hier die Definition für ein at Device welches ein SQL-Statement regelmäßig alle 6 Stunden 20 Minuten ausführt. Es verwendet dazu das vorher definierte DbRep-Device Rep.LogDB.sqlResult:


define At.LogDB.sqlResult at +*06:20:00 set Rep.LogDB.sqlResult sqlCmd select device, count(*) from history group by DEVICE
attr At.LogDB.sqlResult icon clock


Die Verwendung von on-for-timer ist eine ganz andere Geschichte. Dieses Set-Kommando muß von einem Modul direkt angeboten werden (z.B. Module IT, CUL_HM, ....) und bedeutet "schalte etwas für einen bestimmten Zeitraum ein".
Was ein Modul kann, wie die Syntax seiner Set/Get-Befehle sowie deren Bedeutung/Verwendung usw. ist, mußt du IMMER in der CommandRef/Hilfe zum Modul nachlesen !

Kopf hoch, du schaffst das  :)
   
LG,
Heiko
Proxmox+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

Pi_01

Zitat von: DS_Starter am 09 Mai 2020, 08:20:57
Ich glaube du hast die Definition / Handhabung von Devices und das Zusammenspiel / Verwendung mit Hilfsmodulen wie at / notify etc. noch nicht verstanden.
Da hast du leider Recht.

Ich hab folgendes probiert:

define Device55 DbRep MeinDBlog
--> funktioniert

set Device55 sqlCmd SELECT value FROM history WHERE device='aaa' LIMIT 10
--> funktioniert (er zeigt mir die gefunden Datensätze in Form von readings an)

So, jetzt möchte ich Code 1 und Code 2 mit einem at-Befehl verknüpfen, so dass der Code automatisch ausgeführt wird.

Lt. Wiki heißt der Befehl:

define <name> at <timespec|datespec> <command>

Wenn ich aber den Code
define Device55 at +*00:05:00 set Device55 sqlCmd SELECT value FROM history WHERE device='aaa' LIMIT 10
ausführe, kommt die Fehlermeldung "Device55 already defined, delete it first"

Anscheinend muss ich eine ganz neue "Instanz" (Device) anlegen, um eine at-Verknüpfung herstellen zu können.

Ok, nächster Test:
define Device66 at +*00:05:00 set Device66 sqlCmd SELECT value FROM history WHERE device='aaa' LIMIT 10
Er legt mir jetzt ein neues "Device" namens "Device66" an, und der Code wird auch alle 5 Minuten ausgeführt (sieht man am Reading "state" -> "Next ..."), jedoch werden keine mysql-Datensätze in Form von Readings ausgegeben. Das gleiche Problem hatte ich übrigens auch mit deinem Code, DS_Starter.

Ich gehe stark davon aus, dass im Device66 die Verknüpfung zum DBrep-Modul fehlt.

Im ersten Beispiel mit Device55 kann ich DBrep verknüpfen, jedoch fehlt der Bezug zu "at".
Im zweiten Beispiel mit Device66 kann ich eine "at"-Anweisung generieren, jedoch fehlt der Bezug zu "DBrep".

Hiiiiiilfe!

DS_Starter

Zitat
Wenn ich aber den Code
Code: [Auswählen]

define Device55 at +*00:05:00 set Device55 sqlCmd SELECT value FROM history WHERE device='aaa' LIMIT 10

ausführe, kommt die Fehlermeldung "Device55 already defined, delete it first"

Ja schau mal, du hast doch ein Device "Device55" vom TYPE DbRep bereits im ersten Step angelegt. Du kannst kein zweites Device, egal welches Typs, mit dem gleichen Namen anlegen. Device Namen sind Unikate in FHEM !

Zitat
Ok, nächster Test:
Code: [Auswählen]

define Device66 at +*00:05:00 set Device66 sqlCmd SELECT value FROM history WHERE device='aaa' LIMIT 10

Er legt mir jetzt ein neues "Device" namens "Device66" an, und der Code wird auch alle 5 Minuten ausgeführt (sieht man am Reading "state" -> "Next ..."), jedoch werden keine mysql-Datensätze in Form von Readings ausgegeben. Das gleiche Problem hatte ich übrigens auch mit deinem Code, DS_Starter.
Damit hast du jetzt ein Device vom TYPE at mit Namen "Device66" angelegt. -> Vollkommen richtig, das wollten wir.
ABER du hast zur Ausführung des Set-Befehls hier wiederum das at-Device angegeben, was falsch ist. Du hättest das DbRep "Device55" an dieser Stelle angeben müssen.

Dort (in Device55) werden dann auch die Readings erstellt.

D.h. also so wäre es richtig:


define Device66 at +*00:05:00 set Device55 sqlCmd SELECT value FROM history WHERE device='aaa' LIMIT 10


Nochmal ... Einsteiger PDF lesen.  ;) Ich weiß, das ist lästig. Man will einfach loslegen und Ergebnisse sehen. Aber glaub mir, das hilft.

LG,
Heiko

Proxmox+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

Pi_01

#7
Zitat von: DS_Starter am 09 Mai 2020, 13:14:37
... Damit hast du jetzt ein Device vom TYPE at mit Namen "Device66" angelegt. -> Vollkommen richtig, das wollten wir.
ABER du hast zur Ausführung des Set-Befehls hier wiederum das at-Device angegeben, was falsch ist. Du hättest das DbRep "Device55" an dieser Stelle angeben müssen.

Das war der Durchbruch - danke für deine Geduld und Hilfsbereitschaft!

Zitat von: DS_Starter am 09 Mai 2020, 13:14:37
Nochmal ... Einsteiger PDF lesen.  ;)
Meinst du dieses Dokument? fhem.de/Heimautomatisierung-mit-fhem.pdf

Ich gebe ja zu das ich dieses Dokument nur überflogen habe, aber ich dachte mit dem Wiki-Einträgen und Foren-Beiträgen müsste ich zurecht kommen.

Trotz umfangreicher Dokumentation werde ich daraus nicht immer schlau. Ich behaupte sogar, dass mein beschriebenes Problem nirgendwo so umfangreich erklärt wird, dass ein Neueinsteiger das Problem hätte alleine lösen können.

Normalerweise muss ja immer nur ein Device definiert werden, und je nach Modul kann man dann verschiedene Einstellungen vornehmen.
In meinem beschriebenen Fall sind aber gleich zwei Devices notwendig - nur weil ich den SET-Request automatisieren wollte.

Zitat von: DS_Starter am 09 Mai 2020, 13:14:37define Device66 at +*00:05:00 set Device55 sqlCmd SELECT value FROM history WHERE device='aaa' LIMIT 10

Meiner Meinung nach wäre es extrem hilfreich, wenn so ein komplettes Code-Beispiel mit ins Wiki aufgenommen wird (wo man deutlich erkennen kann, dass hier von zwei verschiedenen Devices die Rede ist (Device 55 und Device 66).
Es gibt eine Doku über "DBRep", es gibt eine Dokumentation über "at", es gibt eine Dokumentation über "sqlCmd", aber wie man diese drei Komponenten miteinander verknüpft, steht nirgendwo (das behaupte ich jetzt einfach mal).

Aber nochmal vielen Dank für den tollen Support!

DS_Starter

#8
Schön das es jetzt klappt.  :)

ZitatMeinst du dieses Dokument? fhem.de/Heimautomatisierung-mit-fhem.pdf
Ja, das meinte ich.

ZitatNormalerweise muss ja immer nur ein Device definiert werden, und je nach Modul kann man dann verschiedene Einstellungen vornehmen.
In meinem beschriebenen Fall sind aber gleich zwei Devices notwendig - nur weil ich den SET-Request automatisieren wollte.
Naja, es ist aber ein Grundverständnis bezüglich der Benutzung von at-Devices. Das wird dir immer wieder begegnen. Deswegen war es mir wichtig, dass du die Zusammenhänge vermittelt bekommst bzw. diese verinnerlichst.

Zitat
Meiner Meinung nach wäre es extrem hilfreich, wenn so ein komplettes Code-Beispiel mit ins Wiki aufgenommen wird (wo man deutlich erkennen kann, dass hier von zwei verschiedenen Devices die Rede ist (Device 55 und Device 66).
Es gibt eine Doku über "DBRep", es gibt eine Dokumentation über "at", es gibt eine Dokumentation über "sqlCmd", aber wie man diese drei Komponenten miteinander verknüpft, steht nirgendwo (das behaupte ich jetzt einfach mal).
Das Wiki zu DbRep habe ich aus meiner Position heraus geschrieben.
Sicherlich übergehe ich dabei Dinge, die aus meiner Sicht "eh klar" sind, die aber offensichtlich für Anfänger nicht ganz so transparent vorliegen.
Ich kann das gerne ergänzen, aber jeder User kann die Wiki-Einträge auch mitgstalten ... einfach anmelden.  ;)

Aber ein bisschen Vorsicht mit dem Wiki, weil ...

a) nicht alles was dort steht, ist immer 100% richtig. Je nachdem wer es wann geschrieben hat
b) kann es veraltet sein, wenn nicht gepflegt und durch Modulweiterentwicklung überholt
c) an erster Stelle die Commandref des Moduls gilt

Aber hat natürlich auch klare Vorteile weil Zusammenhänge viel besser erläutert werden können.

Viel Freude noch mit FHEM !  :)

LG,
Heiko
Proxmox+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

Pi_01

Zitat von: DS_Starter am 10 Mai 2020, 12:25:00
Das Wiki zu DbRep habe ich aus meiner Position heraus geschrieben.
Sicherlich übergehe ich dabei Dinge, die aus meiner Sicht "eh klar" sind, die aber offensichtlich für Anfänger nicht ganz so transparent vorliegen.
Ich kann das gerne ergänzen, aber jeder User kann die Wiki-Einträge auch mitgstalten ... einfach anmelden.  ;)

Aber ein bisschen Vorsicht mit dem Wiki, weil ...

a) nicht alles was dort steht, ist immer 100% richtig. Je nachdem wer es wann geschrieben hat
b) kann es veraltet sein, wenn nicht gepflegt und durch Modulweiterentwicklung überholt
c) an erster Stelle die Commandref des Moduls gilt

Aber hat natürlich auch klare Vorteile weil Zusammenhänge viel besser erläutert werden können.

Viel Freude noch mit FHEM !  :)

LG,
Heiko
Ich möchte mich an dieser Stelle nochmal dafür stark machen, dass das Wiki ergänzt wird.
Und nicht nur das Wiki, sondern auch die commandref.html. Dort sind unter dem at-Modul zwar ein paar Code-Beispiele hinterlegt, jedoch nur auf das at-Modul selbst bezogen, quasi isoliert betrachtet (was in der Praxis manchmal gar nichts bringt).
Daher wäre es schon hilfreich, wenn die Code-Beispiele weiter gehen würden.
Z.B. wie man einen DB-Reb Device (inkl. SET/GET) mit dem at-Modul verknüpft.

Danke DS_Starter

DS_Starter

Proxmox+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