[Gelöst] Darstellung on/off in SVG Plot

Begonnen von blitz94, 14 März 2018, 20:17:59

Vorheriges Thema - Nächstes Thema

lin_win

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.

Stephan27

#16
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

OdfFhem

@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 ?

Stephan27

@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.

OdfFhem

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 ...

Stephan27

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?