Hauptmenü

Wasserzähler

Begonnen von Damian, 17 Dezember 2020, 18:48:46

Vorheriges Thema - Nächstes Thema

cwagner

Moin, Damian,

Dein Wasserzähler hat mich dazu gebracht, endlich eine Solar- und eine Ölverbrauchs-Graphik nach dem Schema zu versuchen. Grundlage sind die Statistiken, die ich mit dem Statistik-Modul und dem Hour-Counter-Modul erzeuge. Damit spare ich mir Rechnerei an etlichen Stellen.
Den Durchschnitt auf Tag/Woche/Monat/Jahr wollte ich dann mit den Perlzeitvariabelen fortlaufend und gleich in der UI-Table, in der Du ja auch rechnest ("/1000") errechnen in dieser Art:
cylinder("Tag",0,15,"Liter",undef,undef,undef,1,[CN.Test:appOpHoursPerDayTemp]*1.75/$hour,120,"Durchschnitt",[CN.Test:appOpHoursPerDay]*1.75,30,"gestern",[CN.Test:appOpHoursPerDayTemp]*1.75,60,"heute")|

Tja, Näse, da steigt das Plagiat aus. Ich habe etliche Notationen aus dem commandref versucht, aber immer wenn ich mit/ohne geschweiften/runden/eckigen Klammern da etwas zusammenbau, wird die entsprechende Säule gar nicht mehr gezeigt.

Was mache ich falsch?

Herzliche Grüße

Christian
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Damian

Hast du package ui_Table im Attribut angegeben?

Poste sonst list von deiner Definition.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cwagner

ui_Table habe ich eingebunden gemäß Deinem Muster. Bitte beachte beim folgenden Listing, dass ich noch im "werden" bin, daher ist der gesamte Rechenteil aus Deinem Muster buchstäblich "genullt". CN.Test ist ein houcounter, der lediglich die laufenden Durchschnitte nicht errechnet. Könnte ich dort über ein userreading. Bei Deinem uiTable wird aber nur gerechnet, wenn ich drauf schaue, und das ist ja im Normalfall einmal am Tag, also viel seltener als die statistischen Basisdaten erzeugt werden.

Internals:
   .AttrList  disable:0,1 loglevel:0,1,2,3,4,5,6 notexist checkReadingEvent:0,1 addStateEvent:1,0 weekdays setList:textField-long readingList DOIF_Readings:textField-long event_Readings:textField-long uiTable:textField-long event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading
   DEF        {(0)
}

   FUUID      5fe7b8c0-f33f-e1df-54ac-b2cb36eda50e7512
   MODEL      Perl
   NAME       DI_Oelverbrauch
   NOTIFYDEV  global,CN.Test
   NR         3785
   NTFY_ORDER 50-DI_Heizung
   STATE      initialized
   TYPE       DOIF
   VERSION    23403 2020-12-22 15:43:36
   .attraggr:
   .attrminint:
   READINGS:
     2020-12-28 10:27:11   block_01        executed
     2020-12-26 23:39:05   mode            enabled
     2020-12-26 23:39:05   state           initialized
   Regex:
     accu:
     uiTable:
       CN.Test:
         DI_Heizung_uiTable_c_0_0_0_0:
           appOpHoursPerDay ^CN.Test$:^appOpHoursPerDay:
           appOpHoursPerDayTemp ^CN.Test$:^appOpHoursPerDayTemp:
         DI_Heizung_uiTable_c_0_1_0_0:
           appOpHoursPerWeek ^CN.Test$:^appOpHoursPerWeek:
           appOpHoursPerWeekTemp ^CN.Test$:^appOpHoursPerWeekTemp:
         DI_Heizung_uiTable_c_0_2_0_0:
           appOpHoursPerMonth ^CN.Test$:^appOpHoursPerMonth:
           appOpHoursPerMonthTemp ^CN.Test$:^appOpHoursPerMonthTemp:
         DI_Heizung_uiTable_c_0_3_0_0:
           appOpHoursPerYear ^CN.Test$:^appOpHoursPerYear:
           appOpHoursPerYearTemp ^CN.Test$:^appOpHoursPerYearTemp:
   condition:
     0          (0)

   helper:
     DEVFILTER  ^global$|^CN.Test$
     NOTIFYDEV  global|CN.Test
     globalinit 1
     last_timer 0
     sleeptimer -1
   perlblock:
     0          block_01
   uiTable:
     dev        CN.Test
     package    package ui_Table;
     reading    appOpHoursPerYearTemp
     table:
       0:
         0:
           0:
             0          'error Global symbol "$hour" requires explicit package name (did you forget to declare "my $hour"?) at (eval 258855) line 1.
in expression: cylinder("Tag",0,15,"Liter",undef,undef,undef,1,::ReadingValDoIf($hash,'CN.Test','appOpHoursPerDayTemp')*1.75/$hour,120,"Durchschnitt",::ReadingValDoIf($hash,'CN.Test','appOpHoursPerDay')*1.75,30,"gestern",::ReadingValDoIf($hash,'CN.Test','appOpHoursPerDayTemp')*1.75,60,"heute")'
         1:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'DI_Heizung_uiTable_c_0_1_0_0',cylinder("Woche",0,15,"Liter",undef,undef,undef,1,::ReadingValDoIf($hash,'CN.Test','appOpHoursPerWeekTemp')*1.75,120,"Durchschnitt",::ReadingValDoIf($hash,'CN.Test','appOpHoursPerWeek')*1.75,30,"vorige",::ReadingValDoIf($hash,'CN.Test','appOpHoursPerWeekTemp')*1.75,60,"diese"),"")
         2:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'DI_Heizung_uiTable_c_0_2_0_0',cylinder("Monat",0,15,"Liter",undef,undef,undef,1,::ReadingValDoIf($hash,'CN.Test','appOpHoursPerMonthTemp')*1.75,120,"Durchschnitt",::ReadingValDoIf($hash,'CN.Test','appOpHoursPerMonth')*1.75,30,"voriger",::ReadingValDoIf($hash,'CN.Test','appOpHoursPerMonthTemp')*1.75,60,"jetziger"),"")
         3:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'DI_Heizung_uiTable_c_0_3_0_0',cylinder("Jahr",0,15,"Liter",undef,undef,undef,1,::ReadingValDoIf($hash,'CN.Test','appOpHoursPerYearTemp')*1.75,120,"Durchschnitt",::ReadingValDoIf($hash,'CN.Test','appOpHoursPerYear')*1.75,30,"voriges",::ReadingValDoIf($hash,'CN.Test','appOpHoursPerYearTemp')*1.75,60,"dieses"),"")
     tc:
       0          style='padding-left: 3px;padding-right: 3px'
       1          style='padding-left: 3px;padding-right: 3px'
       2          style='padding-left: 3px;padding-right: 3px'
       3          style='padding-left: 3px;padding-right: 3px'
     td:
       0:
     tr:
Attributes:
   room       Test
   uiTable    {package ui_Table;
$TC{0..3}="style='padding-left: 3px;padding-right: 3px'"
}
cylinder("Tag",0,15,"Liter",undef,undef,undef,1,[CN.Test:appOpHoursPerDayTemp]*1.75/$hour,120,"Durchschnitt",[CN.Test:appOpHoursPerDay]*1.75,30,"gestern",[CN.Test:appOpHoursPerDayTemp]*1.75,60,"heute")|
cylinder("Woche",0,15,"Liter",undef,undef,undef,1,[CN.Test:appOpHoursPerWeekTemp]*1.75,120,"Durchschnitt",[CN.Test:appOpHoursPerWeek]*1.75,30,"vorige",[CN.Test:appOpHoursPerWeekTemp]*1.75,60,"diese")|
cylinder("Monat",0,15,"Liter",undef,undef,undef,1,[CN.Test:appOpHoursPerMonthTemp]*1.75,120,"Durchschnitt",[CN.Test:appOpHoursPerMonth]*1.75,30,"voriger",[CN.Test:appOpHoursPerMonthTemp]*1.75,60,"jetziger")|
cylinder("Jahr",0,15,"Liter",undef,undef,undef,1,[CN.Test:appOpHoursPerYearTemp]*1.75,120,"Durchschnitt",[CN.Test:appOpHoursPerYear]*1.75,30,"voriges",[CN.Test:appOpHoursPerYearTemp]*1.75,60,"dieses")|


Danke wiederum, dass Du überhaupt Dich des Themas annimmst.

Christian
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Damian

#18
OK.

$hour ist im uiTable-Attribut nicht bekannt (nur in Ereignis-Blöcken des DOIF).

Du kannst dir aber im uiTable-Attribut eine Perlfunktion definieren (wie z. B. ic-sub
hier https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Anzahl_der_Tage_bis_zur_Abfall-Entsorgung), die mit

  my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime($seconds);

die entsprechenden Variablen zunächst bestimmt, dann die Division durchführt und das Ergebnis zurückliefert.

Die kannst du dann beim cylinder angeben:

cylinder("Tag",0,15,"Liter",undef,undef,undef,1,durchschnitt([CN.Test:appOpHoursPerDayTemp]),120,"Durchschnitt",...

PS

Am besten die neuste DOIF-Version vom 26.12.2020 nehmen. Ich habe einige Optimierungen an der Cylinder-Funktion vorgenommen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cwagner

#19
Ah, danke, subs hatte ich als Möglichkeit übersehen, weil ich zu sehr darauf fixiert war, es mit den Perl-Variabelen (die ja im Ausführungsteil gute Dienste leisten) auch in UI-Tables nutzen zu können.

Allerdings werde ich gleich wieder an meine Grenzen geführt:
DI_Oelverbrauch: error: Global symbol "$seconds" requires explicit package name (did you forget to declare "my $seconds"?) at (eval 267101) line 4.
in uiTable: no warnings 'redefine';package ui_Table;


Auf die Verbesserungen der Cylinder-Funktion war ich heute Morgen auch schon gestoßen, hatte aber sicherheitshalber erstmal nicht geupdatet.

Christian
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Damian

{package ui_Table;
$TC{0..3}="style='padding-left: 3px;padding-right: 3px'"


sub durchschnitt
{
  my ($param)=@_;
  my ($seconds, $microseconds) = ::gettimeofday();
  my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime($seconds);
  return($param*1.75/$hour);
}
}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cwagner

Und es klappt bestens, vielen Dank für diesen Erweiterung der Möglichkeiten und eine bewundernswerte Hilfsbereitschaft!

Christian
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

CQuadrat

Ich glaube, es muss im define
$yday == 0
heißen, um den ersten Tag des Jahres zu erwischen.

Siehe auch:
https://forum.fhem.de/index.php?topic=95162.0
FHEM auf Mini-ITX-Server mit Intel Quad-Core J1900:
+ HM: HM-LAN, HM-USB, HM-MOD-UART mit div. HM-Komponenten
+ RFXtrx: Funkwetterstation Bresser mit ext. Thermometer, Regenmesser und Windmesser
+ TUL (KNX-Anbindung), MQTT, SONOS (div. Gimmicks), OneWire, Hue