Hallo zusammen,
ich habe mich seit einiger Zeit in die FHEM Umgebung eingearbeitet und scheitere nun bei der Erstellung eines SVG Plots. Ich möchte neben einigen Temperaturen auch den Schaltzustand der Heizung (on/off) im selben Graph darstellen.
Ich habe im Frontend unter "Tics as ("Txt" val, ...)" die numerischen Werte für on bzw. off definiert, was scheinbar auch in der rechten y-Achse des Graphs übernommen wurde. Leider werden dann keine Kurven angezeigt.
Die Werte dazu sind im Logfile aber gespeichert. Meine Einstellung über das Frontend habe ich als Bilddatei angefügt.
Hat jemand eine Idee warum die Werte nicht graphisch dargestellt werden? Gibt es vielleicht zusätzliche Anforderungen an die Filelog Datei?
Ich wäre für jede Hilfe dankbar.
Schöne Grüße
Franz
Lass mal die Klammern weg, also nur: "off" 0, "on" 1
für DBlog im glot file:
#logdb ETA_FBH_2_Heizpumpe:Puffer_Heizpumpe:::$val=($val=~'Ein'?17:15)
Ein = 17
alles andere = 15
Danke für eure Antworten.
Zitat von: dkreutz am 14 März 2018, 20:35:33
Lass mal die Klammern weg, also nur: "off" 0, "on" 1
Ich habs mal probiert. Leider wurde der Graph dadurch auch nicht angezeigt. Komisch ist ja, dass er die Unterscheidung zwischen on und off erkennt....
Zitat von: Frank_Huber am 14 März 2018, 21:36:22
für DBlog im glot file:
#logdb ETA_FBH_2_Heizpumpe:Puffer_Heizpumpe:::$val=($val=~'Ein'?17:15)
Ein = 17
alles andere = 15
Wo muss ich diese Zeile angepasst reinkopieren?
Ich habe nur eine log Datei über Filelog. Gehört di da rein?
Den Syntax für Text log weiß ich auch nicht genau.
Mach dir Gplot Datei auf und vergleiche / teste.
Die tics sind nur für die Beschriftung da.
Mit dem Handy online, daher kurz gefasst...
Hallo Franz,
herzlich willkommen im Forum! Deine Fragestellung habe ich hier schon sehr oft gelesen. Du findest sicher über die Forensuche viele Lösungsansätze. Mein Heizungs- SPS Plotfile habe ich vor langer Zeit auch schon mal gepostet (https://forum.fhem.de/index.php/topic,13538.msg84064.html#msg84064).
Gruß
Frank
Habe jetzt in der Maske unter Function noch folgenden Zusatz vermerkt:
$fld[2]=~"on"?1:0
Zumindest wird nun eine - wenn auch nicht richtige - Grafik erstellt.
In der gplot Datei habe ich auch einige Versuche durchgeführt, leider vergeblich. Ich denke viel fehlt nicht mehr...
Hallo zusammen,
habe das Problem nun gelöst. Falls jemand einmal auf dieselbe Fragestellung stößt, es braucht prinzipiell keinen Eingriff in die gplot Datei, da alle nötigen Parameter über die Frontendoberfläche eingegeben werden können.
Unter "Function" muss dem Graph mitgeteilt werden welcher numerischen Wert ein "off" bzw. "on" entspricht. In der Eingabemaske unter "Tics" wird lediglich die Achseneinstellung definiert.
Die Funktion lautet nun:
$fld[3]=~"on"?2:0
Wobei der Wert [3] von euerem Logfile abhängt. Bei mir der Wert in der 3. Spalte und die 2:0 sind die numerischen Werte für on bzw. off.
Eigentlich ganz einfach, wenn man die Konfiguration kennt.
Vielen Dank nochmal an alle.
Schöne Grüße
Franz
Diverse Beispiele zum Thema sind auch unter https://wiki.fhem.de/wiki/Plots_erzeugen#.gplot-Editor verlinkt.
und bitte noch ein |Gelöst] vor das Subject des ersten Posts :-)
Danke, hat mir auch geholfen !
-> nur beachten, daß $fld[3] die Spalte 4 bezeichnet ... !
VG ak323
Wie macht man das bei dblog? Dort hat man ja dieses Feld für Funktionen nicht.
OK direkt das gplot anpassen geht, mhh schade, dass es dieses Feld hier nicht gibt, wäre etwas bequemer.
/Daniel
Bei DbLog macht man es direkt im gplot File. Ist zum Beispiel hier beschrieben.
https://wiki.fhem.de/wiki/SVG-Plots_von_FileLog_auf_DbLog_umstellen
LG
Hallo Zusammen,
ich möchte mich mal hier hinten dran hängen. Ich habe mir jetzt diverse Beispiele angesehen und es auch geschafft einen von mehreren Values in einen darstellbaren Wert zu ändern, wie mache ich das aber für eine Vielzahl?
Hier mal die Zeile mit der ich den Wert "heating" aus der Datenbank ins Diagramm bekommen habe.
#DBLogging vitoconnect:heating.compressors.0.phase:::$val=($val=~"heating"?4:0)
Ich hatte versucht entsprechend die Werte "off", "pause" und "defrost" in einer weiteren Zeile zu definieren, was aber nicht den gewünschten Effekt hatte. (hier hat er mir dann 4 Graphen erzeugt, statt die Zustände zu mappen)
Wie schaffe ich es die Werte aus der Datenbank auf Zahlenwerte umzusetzen?
Also
1 - "off"
2 - "pause"
3 - "defrost"
4 - "heating"
Leider sind viele Beispiele nur mit On/Off und das konnte ich soweit bewerkstelligen.
EDIT:
Konnte es wie folgt lösen:
#DBLogging vitoconnect:heating.compressors.0.phase:::$val=~s/(heating|preparing|defrost|pause|off)(\d*).*/$1eq"heating"?5:$1eq"preparing"?4:$1eq"defrost"?3:$1eq"pause"?2:$1eq"off"?1:0/eg
Ob das jetzt richtig ist und was genau die "Schalter" im Befehl machen weiß ich leider nicht, aber das Ergebnis scheint zu passen. :-)
Moin
Zitat$val=($val=~"heating"?4:0)
der teil in der Klammer nennt sich ternärer Operator oder so. Ist eine vereinfachte Schreibweise für if..then..else. Und genau wie bei if..then..else kannst Du den auch immer weiter schachteln:
$val=($val=~"heating"?4:$val=~"defrost"?3:$val=~"pause"?2:$val=~"off"?1:0)
Gruß
Sany
Ich visualisiere so meine Betriebsarten des Heizungsreglers:
($fld[3]=~'Auto'?1.3:($fld[3]=~'Standby'?2.3:($fld[3]=~'Hand'?3.3:($fld[3]=~'Sonne'?4.3:($fld[3]=~'Mond'?5.3:0))))) |
Für jeden Heizkreis hab ich einen anderen "Offset", das heißt mal .1/.2/.3/.4 damit die Linien nicht genau übereinander geschrieben werden.
Zitat von: Sany am 26 Januar 2022, 08:33:27
Moinder teil in der Klammer nennt sich ternärer Operator oder so. Ist eine vereinfachte Schreibweise für if..then..else. Und genau wie bei if..then..else kannst Du den auch immer weiter schachteln:
$val=($val=~"heating"?4:$val=~"defrost"?3:$val=~"pause"?2:$val=~"off"?1:0)
Gruß
Sany
Danke für die Erklärung. Das macht es für mich sehr viel nachvollziehbarer.
@Lin_win
Du machst das aber quasi aus einem LogFile und nicht auf Basis einer Datenbank und hast je Betriebsart eine Linie? Ich hab es jetzt so, dass es bei mir (so gewollt) mit einer einzigen Linie gezeichnet wird und quasi zwischen den Zuständen "alterniert". Trotzdem danke für dein Beispiel samt Grafik.
Anbei nochmal mein Code samt Diagramm:
#DBLogging vitoconnect:heating.compressors.0.phase:::$val=~s/(heating|preparing|defrost|pause|off)(\d*).*/$1eq"heating"?5:$1eq"preparing"?4:$1eq"defrost"?3:$1eq"pause"?2:$1eq"off"?1:0/eg
@Stephan27
Die "if..then..else"-Theorie von z.B. Sany sorgt dafür, dass jeder mögliche Wert in eine Zahl umgewandelt wird ... im unvorhergesehenen Fall in eine 0.
Du verwendest die "search and replace"-Theorie. Nachteil ist, dass der replace-Teil nur dann zum Tragen kommt, wenn der search-Teil angeschlagen hat. Bedeutet übersetzt, dass unerwartete Werte nicht berücksichtigt werden - quasi rausgefiltert werden ... die Zahl 0 wird es wohl nie geben.
An der Grafik würde man vermutlich nicht erkennen, dass ein unerwarteter Zustand eingetreten ist. Was passiert z.B., wenn Du "off" im search-Teil in "aus" änderst ? Hält dann laut angehängter Grafik der Zustand "pause" an oder gibt es doch einen 0-Fall ?
@OdfFhem
Das hatte ich dann missverstanden. Also könnte ich meinen Befehl nochmal etwas abspecken und auf die IF...then...else - Variante umsteigen?
Zu deiner Frage.
Ich hatte tatsächlich gestern zufällig mal noch damit gespielt und wenn ich z.B. "OFF" weg lassen, geht er automatisch auf den Wert 0, wenn "OFF" auftritt. Genauso hatte ich am Anfang den Eindruck, dass er Preparing "nicht macht", obwohl ganz vereinzelt Datenpunkte in der DB sind. Also hatte ich den Befehl umgestellt auf 4:Heating, 3:Defrost, 2:Pause, 1:Off:0. Nun danach hatte ich plötzlich "Ausreißer von 1 auf 0 und das waren dann genau die unbekannten Datenpunkte, die in der DB "Preparing" hießen. Also es funktioniert quasi genau wie geplant. Status 1 für Off könnte ich eigentlich weg lassen, er das ja quasi als "else" auf 0 setzen würde, aber ich persönlich finde es besser, wenn die Diagramme gut im "Fenster" sichtbar sind und nicht ganz unten am Rand bei 0 eine Linie ziehen. Skalierung des Diagramm habe ich quasi von Hand auf 0:6 gesetzt und die Werte liegen alle zwischen 1 und 5. Also weder unten, noch oben berührt meine Linie den Rand. >>> Zudem, wenn wirklich mal ein Status kommen sollte der jetzt nicht bekannt oder erfasst ist, dann sehe ich dass wenn die Linie auf "0" ausschlägt und kann in der DB schauen.
Zitat von: Stephan27 am 27 Januar 2022, 11:52:39
@OdfFhem
Das hatte ich dann missverstanden. Also könnte ich meinen Befehl nochmal etwas abspecken und auf die IF...then...else - Variante umsteigen?
Ja, die von Sany bereitgestellte Vorlage ist im Grunde 1:1 einsetzbar, müsste nur um "preparing" erweitert werden ...
Zitat von: Stephan27 am 27 Januar 2022, 11:52:39
Zu deiner Frage.
Ich hatte tatsächlich gestern zufällig ...
Ich vermute, dass Du beim Testen den replace-Teil verändert hast, ansonsten hätte es die 0 eigentlich nicht geben dürfen ...
search-Teil ... testweise mal einen Zustand samt | entfernen ...
(heating|preparing|defrost|pause|off)(\d*).*
replace-Teil ... unverändert lassen
$1eq"heating"?5:$1eq"preparing"?4:$1eq"defrost"?3:$1eq"pause"?2:$1eq"off"?1:0
Zitat von: Stephan27 am 27 Januar 2022, 11:52:39
Zudem, wenn wirklich mal ein Status kommen sollte der jetzt nicht bekannt oder erfasst ist, dann sehe ich dass wenn die Linie auf "0" ausschlägt und kann in der DB schauen.
Genau das ist der Grund, warum ich nicht auf die 0 verzichten wollte ...
Super. Bin gestern nicht mehr dazu gekommen, aber das von Sany probier ich mal aus.
Die veränderte Abfrage sah wie folgt aus:
#DBLogging vitoconnect:heating.compressors.0.phase:::$val=~s/(heating|preparing|defrost|pause|off)(\d*).*/$1eq"heating"?4:$1eq"defrost"?3:$1eq"pause"?2:$1eq"off"?1:0/eg
In Folge ist beim DB-Value "Preparing" das Diagramm auf die 0 gegangen und der Rest wie durch die Funktion beschrieben. ("Off" als 1) Aber ja im Prinzip hast du Recht. Den Search hatte ich so belaßen und bloß den Replace geändert. Guter Einwand! Einen Test ziehe ich nach sobald ich etwas Luft habe. (Also die Gegenprobe mit nur Search verändern und auch mal mit "beiden Seiten".
Im Prinzip möchte ich die Null ja auch haben. Meine definierten Zustände inklusive "OFF" sollen zwischen 1 und <Zustandsanzahl> liegen und Unbekannte dann auf eben auf 0. Aber ich habe jetzt Dank euch sehr viel Input, den ich vorher aus den WIKIs, Dokus und Beispielen so nicht rauslesen konnte. Finde ich klasse! :-) Vielen Dank für die offene Diskussion und Hilfe.... auch wenn ich nicht direkt was gefunden habe, kann ich mir vorstellen dass sowas häufiger vorkommt als Frage.
P.S.:
Es passt jetzt thematisch nicht zu 100%, aber vlt. hast du eine flotte Antwort.
ich mache Exclude/ Include beim Logging, habe jetzt dblogExclude .* für das Device und die Parameter mit dblogInclude <device.parameter> wieder eingebunden. Kann man beim Include nochmal ein alternatives Intervall angeben? In der globalen Config des Devices habe ich 60 mitgegeben, also jede Minute einen Datenpunkt. Speziell jetzt die Außentemperatur reicht mir eigentlich ein stündlicher Verlauf, genauso Warmwasser-Temperatur. Phase und Vorlauf/ Rücklauf hätte ich aber gern weiter auf 1-5 Minutenintervall. Kann ich beim Include auch "dbloginclude <device.parameter> 600, <device.parameter2>, <device.parameter3> 360,..." machen?