WebMatic Beta: Verlaufsdiagramme auf der CCU berechnet

alternative Weboberfläche für die HomeMatic-Zentrale (CCU)

Moderator: Co-Administratoren

KilamMalik
Beiträge: 152
Registriert: 31.12.2011, 11:12
Wohnort: Augschburg

Re: WebMatic: Verlaufsdiagramme auf der CCU berechnet

Beitrag von KilamMalik » 08.01.2013, 21:28

Hi,

@anli: Korrekt, Performance brauchts beim Loggen in die Variable und beim Auslesen. Wobei das Auslesen so wie es aussieht recht schnell geht. Man hat ja auch nicht unbedingt alle Diagramme auf einer Seite.

@Onthefly: Ist, Soll und Ventil interessieren mich auch, was ist RH?

@leinich: Mit TCL kenne ich mich nicht aus und vom Schreiben in Dateien habe ich mich ferngehalten, weil eben immer wieder von SystemExec Problemen berichtet wird. Das ist aber dann was anderes, was keine Instabilität hervorrufen würde? Mal sehen, was mit den Variablen rauskommt, was die so vertragen. Wenn es da zu schnell Grenzen gibt, schaue ich mir mal TCL an. Ansonsten hat Script und Variable den Vorteil, dass die meisten Anwender dann selber was dran ändern können. TCL hätte aber sicher den Vorteil, dass es wirklich parallel läuft und den Rega Parser nicht beeinflusst... mal sehen, was die Tests so zeigen.
Die Parameterübergabe habe ich übrigens ähnlich vor, allerdings dann eben in der Variablenbeschreibung, weil der Wert ja vergeben ist:

Variable: "Temperaturverlauf"
Beschreibung: "Diagramm Temp (d,t=line,c=ff0000,...)"

@homequaker: Jetzt hättest mich fast schon geschockt mit den 4k... aber ich habe bereits 4 Variablen in die ich logge mit insgesamt 27 kb... läuft stabil seit ich logge, seit 4 Tagen. Mal sehen, was die Test bringen.
An die 200s komme ich denke ich nicht ran, das Script scheint in 1-2 Sekunden die 4 Datenpunkte zu setzen. Soll ja wie gesagt kein CCU-Historian werden, bei dem ich alle Datenpunkte logge :-) Kann man irgendwie die Zeit stoppen die es braucht?
Laufen andere Prozesse dann trotzdem weiter wenn ein Script ausgeführt wird? Also wenn ich jetzt sagen wir 40 DPs loggen würde und es würde 20 Sekunden dauern, wäre das ein Problem?
Zum Erzeugen der Graphen verwende ich jqPlot. Sind sich sehr ähnlich. Aber auch einfach austauschbar, der Code sieht nahezu identisch aus... eigentlich fast wie kopiert ;-)
Ach ja, wg. den 4K bei Dir -> Hast Du evtl. sehr viel installiert an AddOns so dass Dein Speicher ausgeht? Nur mal ins Blaue vermutet, habe keine Ahnung, was da an Puffer vorhanden ist auf der CCU.

@all:
Das Script könnt ihr ja mal testweise laufen lassen, WebMatic 1.1 kann das aber noch nicht darstellen. Ich habe das bei mir zwar am laufen, aber das ist eine (schnell gefrickelte ;-)) Testversion. Werde die nächsten Tage hier eine Beta posten, aber nicht installierbar sondern einfach FTP Upload dann. Am besten in neues Verzeichnis webmatic_beta, dann bleibt eure 1.1 für den Rest der Familie wie gehabt ;-) Solange könnt ihr ja schon mal loggen, dann seht ihr gleich einen Graphen. Habe bei mir das Script alle 15 Minuten = 3 Tage bei 288 Werten, wobei so schnell ändern sich Temperaturen auch nicht, da genügt auch 30 Minuten oder 1 Stunde (Graph wird eh interpoliert). Allerdings bei Stellmotoren ist es wie jemand schon bemerkt hat auch mal kürzer interessant. Man kann natürlich auch einen Teil häufiger loggen und einen Teil der DPs seltener. Muss man halt das Script dann zwei mal einbinden in zwei Programme.

Weiß eigentlich jemand, ob Variablen mal gelöscht werden bei Reboot oder ähnlichen Aktionen? Bisher wurden sie mir nur gelöscht, wenn ich was an der Variable ändere (Name oder Beschreibung). Wg. logging mal über paar Wochen hinweg, ob mir das verloren gehen könnte.

Grüße,
Kilam.

Berni
Beiträge: 425
Registriert: 18.07.2011, 15:35
Kontaktdaten:

Re: WebMatic: Verlaufsdiagramme auf der CCU berechnet

Beitrag von Berni » 08.01.2013, 21:28

Ich komm damit nicht klar :oops:

Ich habe 3 Systemvariablen (Type Zeichenkette) angelegt
1) Verlauf Temp Bad Ist - Bad Ist (d)
2) Verlauf Temp Bad Soll - Bad Soll (d)
3) Veraluf Antrieb Bad - Bad Antrieb (d)

Code: Alles auswählen

    string logValues = "Verlauf Temp Bad Ist,BidCos-RF.IEQXXXXXXX:1.TEMPERATURE;Verlauf Temp Bad Soll,BidCos-2RF.IEQXXXXXXX:1.TEMPERATURE;Verlauf Antrieb Bad,BidCos-RF.HEQXXXXXX.VALVE_STATE;
Wie und wo muss ich das jetzt hier einbauen?

Code: Alles auswählen

    string valueStringName = raum # "HeizungDaten"; ! hier die Systemvariable definieren
    boolean init = false; ! einmal auf true setzen um die Systemvariable zu initialisieren
    integer maxEntries = 120; ! max Eintraege im Umlaufbuffer festlegen
    integer values = 3;  ! Anzahl Messwerte
    time now = system.Date("%Y-%m-%d %H:%M:%S").ToTime();
    string value1 = dom.GetObject("BidCos-RF." # oRegler # ":1.TEMPERATURE").State();
    string value2 = dom.GetObject("BidCos-RF." # oRegler # ":2.SETPOINT").State();
    string value3 = dom.GetObject("BidCos-RF." # oSteller # ":1.VALVE_STATE").State();
    string newEntryString = "," # now.ToString() # "," # value1 # "," # value2 # "," # value3 #; !hier den neuen Eintrag zusammenbauen - das erste , muss sein
    !
    ! Ab hier ist nichts mehr zu aendern
    !
    var valueString = dom.GetObject(valueStringName);
    string initString = "0";
    if ((valueString.Variable() == "???") || init)
    {
        integer counter = 0;
        while (counter < values)
        {
          initString = initString # ",0";
          counter = counter + 1;
        }
        valueString.Variable(initString);
    }
    string valueStringV = valueString.Variable();
    string valueStringBuf = valueStringV.Substr(valueStringV.Find(",")+1,valueStringV.Length()-valueStringV.Find(","));
    integer lastEntry = valueStringV.StrValueByIndex(",",0).ToInteger();
    integer nextEntry = lastEntry +1;
    if (nextEntry >  maxEntries) {nextEntry = 1;}
    string value;
    integer valueCounter = 0;
    integer rowCounter = 1;
    string valueStringNew = nextEntry.ToString();
    string entryString = "";
    foreach (value,valueStringBuf.Split(","))
    {
       valueCounter = valueCounter + 1;
       entryString = entryString # "," # value;
       if (valueCounter == values+1)
       {
          if ( rowCounter == nextEntry ) {entryString = newEntryString;}
          valueStringNew = valueStringNew # entryString;
          entryString = "";
          valueCounter = 0;
          rowCounter = rowCounter + 1;
       }
    }
    if (rowCounter < nextEntry)
    {
      valueStringNew = valueStringNew # newEntryString;
    }
    valueString.Variable(valueStringNew);

Als letztes noch einn Programm das "zeitgesteuert" das Skript aufruft
Dann sollte es klappen?
Oder muss ich noch was anderes "machen"?
250 Kanäle in 117 Geräten und 29 CUxD-Kanäle in 3 CUxD-Geräten

KilamMalik
Beiträge: 152
Registriert: 31.12.2011, 11:12
Wohnort: Augschburg

Re: WebMatic: Verlaufsdiagramme auf der CCU berechnet

Beitrag von KilamMalik » 08.01.2013, 21:30

Hi Berni,

doch, das passt. Dann müsste er in die Variablen loggen. Update auf Beta folgt dann noch die Tage, dann siehst auch Diagramme. Bis dahin wirst nur sehen, wie sich die Datenpunkte fülllen...

Edit: Sehe grade, am Ende der Zeile ist noch ein ; Der dürfte zwar nicht stören, aber es fehlt noch die schließende ":

Code: Alles auswählen

string logValues = "Verlauf Temp Bad Ist,BidCos-RF.IEQXXXXXXX:1.TEMPERATURE;Verlauf Temp Bad Soll,BidCos-2RF.IEQXXXXXXX:1.TEMPERATURE;Verlauf Antrieb Bad,BidCos-RF.HEQXXXXXX.VALVE_STATE";
Das Script nur von meinem zweiten Comment einfach nehmen, nicht das von goersch. Das wollte ich nur nicht vorenthalten, dass das Script eigentlich von ihm kommt.

Grüße,
Kilam.
Zuletzt geändert von KilamMalik am 08.01.2013, 21:34, insgesamt 1-mal geändert.

Berni
Beiträge: 425
Registriert: 18.07.2011, 15:35
Kontaktdaten:

Re: WebMatic: Verlaufsdiagramme auf der CCU berechnet

Beitrag von Berni » 08.01.2013, 21:34

Wo gehört denn das "angepasste Skript mit meinen Geräten" in das zweite eingebaut?
250 Kanäle in 117 Geräten und 29 CUxD-Kanäle in 3 CUxD-Geräten

KilamMalik
Beiträge: 152
Registriert: 31.12.2011, 11:12
Wohnort: Augschburg

Re: WebMatic: Verlaufsdiagramme auf der CCU berechnet

Beitrag von KilamMalik » 08.01.2013, 22:53

Berni hat geschrieben:Wo gehört denn das "angepasste Skript mit meinen Geräten" in das zweite eingebaut?
Gar nicht... Du nimmst einfach das Script von meinem zweiten Comment und ersetzt die erste Zeile. Dann das Script in ein Programm rein und alle x Minuten aufrufen. Hier mit Deiner Zeile:

Code: Alles auswählen

!Liste von Variablen und Datenpunkten zum Loggen.
string logValues = "string logValues = "Verlauf Temp Bad Ist,BidCos-RF.IEQXXXXXXX:1.TEMPERATURE;Verlauf Temp Bad Soll,BidCos-2RF.IEQXXXXXXX:1.TEMPERATURE;Verlauf Antrieb Bad,BidCos-RF.HEQXXXXXX.VALVE_STATE";

integer maxEntries = 288; ! max Eintraege im Umlaufbuffer festlegen. 288 alle 5 Minuten = 24h.
integer values = 1;  ! Anzahl Messwerte
time now = system.Date("%Y-%m-%d %H:%M:%S").ToTime();
!----------------

string logVal;
foreach(logVal, logValues.Split(";"))
{
  string valueStringName = logVal.StrValueByIndex(",", 0);
  string stringDP = logVal.StrValueByIndex(",", 1);
  string valueDP = dom.GetObject(stringDP).State();

  string newEntryString = "," # now.ToString() # "," # valueDP; !hier den neuen Eintrag zusammenbauen - das erste , muss sein
  var valueString = dom.GetObject(valueStringName);
  string initString = "0";
  if ((valueString.Variable() == "???")) 
  { 
      integer counter = 0;
      while (counter < values)
      {
        initString = initString # ",0";
        counter = counter + 1;
      }
      valueString.State(initString); 
  }
  string valueStringV = valueString.Variable();
  string valueStringBuf = valueStringV.Substr(valueStringV.Find(",")+1,valueStringV.Length()-valueStringV.Find(","));
  integer lastEntry = valueStringV.StrValueByIndex(",",0).ToInteger();
  integer nextEntry = lastEntry +1;
  if (nextEntry >  maxEntries) {nextEntry = 1;}
  string value;
  integer valueCounter = 0;
  integer rowCounter = 1;
  string valueStringNew = nextEntry.ToString();
  string entryString = "";
  foreach (value,valueStringBuf.Split(","))
  {
     valueCounter = valueCounter + 1;
     entryString = entryString # "," # value;
     if (valueCounter == values+1) 
     {
        if ( rowCounter == nextEntry ) {entryString = newEntryString;}
        valueStringNew = valueStringNew # entryString;
        entryString = "";
        valueCounter = 0;
        rowCounter = rowCounter + 1;
     }
  }
  if (rowCounter < nextEntry)
  {
    valueStringNew = valueStringNew # newEntryString;
  }
  valueString.State(valueStringNew);
}

Benutzeravatar
anli
Beiträge: 4326
Registriert: 10.06.2009, 14:01
Wohnort: 20 Min. nördlich von Hannover und bei Bremen
Hat sich bedankt: 1 Mal
Danksagung erhalten: 23 Mal
Kontaktdaten:

Re: WebMatic: Verlaufsdiagramme auf der CCU berechnet

Beitrag von anli » 08.01.2013, 23:00

RH = relative humidity (relative Luftfeuchtigkeit)
Herzliche Grüße, anli

Alle Angaben ohne Gewähr und Haftung meinerseits. Verwendung der von mir zur Verfügung gestellten Downloads auf eigene Gefahr. Ich bitte um Verständnis, dass ich aus zeitlichen Gründen keine unaufgeforderte Hilfestellung per PN/Mail geben kann. Bitte allgemeine Fragen ins Forum stellen, hier können viele fähige User viel schneller helfen.

Homematic-Manager v2: einfaches Tool zum Erstellen von Direktverknüpfungen und Bearbeiten von Gerätenamen, -parametern etc. für Homematic und HomematicIP (Alternative diesbzgl. zur WebUI)

Einsteiger-Hilfeerweiterter Skript-Parser

KilamMalik
Beiträge: 152
Registriert: 31.12.2011, 11:12
Wohnort: Augschburg

Re: WebMatic: Verlaufsdiagramme auf der CCU berechnet

Beitrag von KilamMalik » 13.01.2013, 02:09

Hi,

da ja wohl schon ein paar mit dem Script loggen gibt es jetzt eine Beta von WebMatic um das auch sehen zu können. Die Beta gibts nicht als Installer, damit habt ihr die Möglichkeit, euch diese per FTP auch in ein anderes Verzeichnis, z.B. webmatic_beta unter addons zu kopieren. Dann bleibt die 1.1 unberührt davon. Der vollständige Pfad für die AddOns ist <homematic-url>/usr/local/etc/config/addons/www.

Download:
webmatic-1_2-beta.zip
(864.28 KiB) 327-mal heruntergeladen
Das ist eine Beta, also solche kann natürlich schon mal was nicht funktionieren. Sobald die V1.2 offiziell ist, gibt es wieder einen Installer :-)

Was ich bisher gemacht habe:

V1.2 beta
=========
- CUxD Testseite eingefügt.
- Anzeige für Gerät: CO2 Sensor. >=2 ist stark erhöht (Unterschied von WebUI Meldungen zu Gerätesettings. WebUI gibt es 3 Status, in den Gerätesettings 4).
- Einheit von Werten wird jetzt immer aus HomeMatic ausgelesen. Vorher wurde bei Temperatur z.B. immer °C angenommen.
- Bei manchen Geräten liefert die CCU "100%" als Einheit. Wird jetzt automatisch in "%" umgewandelt.
- Änderung der Vorgabe für Parameter ReadOnly und dann auch für Diagramme gültig: Das (r) bzw. (d) muss nicht mehr am Ende des Strings stehen. Das veringert ärgerliche Fehler, wenn man aus Versehen hinten ein Leerzeichen eingegeben hat.
- Optionenseite unter Sonstiges hinzugefügt. Optionen für "Testseite ein-/ausblenden und Icons klein/groß.
- Diagramme:
* Über (d) in Beschreibungstext wird eine Variable als Diagramm markiert.
* Ein Logger Script loggt Daten in die Variablen (siehe ersten Post in diesem Thread um zu sehen, wie es geht).
* Anzeige in WebMatic als Diagramm.
* Diagramme min und max auf x-achse berechnen, damit immer exakt der volle Bereich angezeigt wird.
* True / False in Statistik als 0 und 1, damit auch Status angezeigt werden (z.B. Schalter an/aus oder Bool Variablen).
* Diagrammoptionen:
Farbe, z.B. c=FF0000. Wenn nicht angegeben, werden Standardfarben verwendet.

Kleinster Wert:
Wenn nicht angegeben, dann ist 10% unter dem Minimum der kleinste Wert des Diagramms.
l=m; Genau den kleinsten Wert des Verlaufs als Untergrenze der Anzeige verwenden. Z.B. bei Stellantrieben.
l=<zahl>; Die Zahl als Untergrenze nehmen, aber wenn der Wert darunter liegt, dann niedriger gehen. Z.B. 6° bei Thermostaten.

Größter Wert:
Wenn nicht angegeben, dann ist 10% über dem Maximum der größte Wert des Diagramms.
h=m; Genau den größten Wert des Verlaufs als Obergrenze der Anzeige verwenden.
h=<zahl>; Die Zahl als Obergrenze nehmen, aber wenn der Wert darüber liegt, dann höher gehen.

Beispiele:

Verlauf der Luftfeuchtigkeit mit den Standard 10% oben und unten:
(d)

Verlauf des Stellmotors soll immer bei 0 anfangen, weil mit -10 sieht es komisch aus. Temperaturverlauf möchte man evtl. auch lieber mit Basis 0° sehen, damit man die Höhe insgesamt besser mit anderen Temperaturdiagrammen vergleichen kann. Deswegen so:
(d,l=0)

Wenn es grün sein soll:
(d,c=44AA44)

Achtung, der Variableninhalt wird vom WebUI gelöscht, wenn man den Beschreibungstext oder Variablennamen ändert. Vorher auf WebMatic -> Systemvariablen den Inhalt kopieren und dort auch wieder setzen.

Offen bei Diagrammen:
- Kombinationsdiagramme, Überlagerung mehrerer Diagramme.
- Option gefüllt/Linie.
- Legende mit setzbaren Namen.
- Abstände der Werte auf den Achsen verbessern. Evtl. angeben lassen.
- Evtl. wären die Diagrammsettings besser in einer CFG in WebMatic aufgehoben, weil das Ändern von Settings immer den Inhalt löscht. Allerdings ist das aufwändig, vielleicht spätere Version. Dann könnte ich die Settings auch als Dialog anbieten.
- Ich würde das Logging hauptsächlich für Thermostat + Stellmotor verwenden (Ist, Soll, Stellmotorposition). Vielleicht wäre es sinnvoll, dafür ein spezielles Logging in eine Variable zu bauen, sonst muss man für jeden Raum drei oder vier (mit Luftfeuchte) Variablen anlegen.

Bin gespannt auf euer Feedback.

Was sich auch noch herausstellen muss ist, wie sehr dieses Logging die CCU belastet. Ich logge jetzt 5 Kurven alle 15 Minuten und zwei alle 24 Stunden. Bisher keine Probleme.

Grüße,
Kilam.

KilamMalik
Beiträge: 152
Registriert: 31.12.2011, 11:12
Wohnort: Augschburg

Re: WebMatic Beta: Verlaufsdiagramme auf der CCU berechnet

Beitrag von KilamMalik » 13.01.2013, 02:16

Hier noch ein Screenshot von meinen Verläufen.
diverse_verlaeufe.png
Grüße,
Kilam.

Berni
Beiträge: 425
Registriert: 18.07.2011, 15:35
Kontaktdaten:

Re: WebMatic Beta: Verlaufsdiagramme auf der CCU berechnet

Beitrag von Berni » 13.01.2013, 11:33

Ich hab die beta installiert
Es klappt alles super
jetzt lass ich mal ein bisschen die "Daten sammeln"


Ein ganz großes DANKE für die super Arbeit
Auch ohne "große Programmierkenntnisse" (mit deiner Hilfe) habe ich bisher alles so hinbekommen wie ich es haben wollte.

Es macht richtig Spaß mit WebMatic zu "arbeiten" :D
250 Kanäle in 117 Geräten und 29 CUxD-Kanäle in 3 CUxD-Geräten

Wildshunter
Beiträge: 98
Registriert: 10.09.2009, 22:10

Re: WebMatic Beta: Verlaufsdiagramme auf der CCU berechnet

Beitrag von Wildshunter » 13.01.2013, 12:48

Hallo!
"Beta" werde ich heute Abend gleich ausprobieren! Vielen Dank für die vielen verbrachten Nachtschichten, klasse Arbeit!
Eine Frage fällt mir gerade noch ein, vielleicht kann man den Befehl auch ueber http? an die Zentrale geben: würde mir gerne auf mein Android einen Weblink? setzen, und bei anwahl direkt ein Programm auf der CCU starten lassen (z.B. Alarmanlage ein/aus) ohne jeweils ueber die GUI von Webmatic zu gehen. Gibt es da was?
Danke nochmal und schoenen Sonntag.
Wildshunter

Antworten

Zurück zu „WebMatic“