FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Carsten1981 am 04 März 2018, 12:36:49

Titel: Ich will mehr lernen, komme aber nicht weiter
Beitrag von: Carsten1981 am 04 März 2018, 12:36:49
Hallo zusammen,

Ich habe ein super funktionierendes DOIF, mit einem kleinen Schönheitsfehler, mit dem ich aber leben könnte. Zum anderen glaube ich das ich das DOIF vereinfachen könnte. Ich habe schon Stunden mit der Suchfunktion verbracht aber keine funktionierende Lösung gefunden. Ich glaube man könnte es mit Variablen lösen, was ich aber leider nicht funktionierend hinbekommen habe.

Zur Erklärung. Ich habe eine Photovoltaik Anlage mit einem Produktionszähler mit S0 Ausgang. Diesen werte ich über einen GPIO mit HourCounter aus. Ein DOIF berechnet aus dem HourCounter die aktuelle Leisten in Watt und den Tages-, Monats- und Jahresertrag.

Mit dem folgenden DOIF fülle ich einen Statistik Dummy mit den jeweiligen Maximalwerten.

##hier wird die Tageshöchstleistung in den Statistik_Dummy_PV geschrieben
(["Dummy_Strom:Leistung"] and [Dummy_Strom:Leistung] > [Statistik_Dummy_PV:Leistung_PV_max_Tag]) (setreading Statistik_Dummy_PV Leistung_PV_max_Tag [Dummy_Strom:Leistung])
DOELSEIF ##hier wird die die höchste Leistung innerhalb eines Monats in den Statistik_Dummy_PV geschrieben
(([11:00:05] or [12:00:05] or [13:00:05] or [14:00:05] or [15:00:05] or [16:00:05] or [17:00:05] or [18:00:05]) and (strftime ("%m",localtime) == 1) and [Statistik_Dummy_PV:Leistung_PV_max_Tag] > [Statistik_Dummy_PV:Leistung_PV_max_Monat_01])
(setreading Statistik_Dummy_PV Leistung_PV_max_Monat_01 [Statistik_Dummy_PV:Leistung_PV_max_Tag])
{fhem "set Telegram_###### msg Tageshöchstleistung Januar:.[Statistik_Dummy_PV:Leistung_PV_max_Tag] Watt"}
DOELSEIF
(([11:00:05] or [12:00:05] or [13:00:05] or [14:00:05] or [15:00:05] or [16:00:05] or [17:00:05] or [18:00:05]) and (strftime ("%m",localtime) == 2) and [Statistik_Dummy_PV:Leistung_PV_max_Tag] > [Statistik_Dummy_PV:Leistung_PV_max_Monat_02])
(setreading Statistik_Dummy_PV Leistung_PV_max_Monat_02 [Statistik_Dummy_PV:Leistung_PV_max_Tag])
{fhem "set Telegram_###### msg Tageshöchstleistung Februar:.[Statistik_Dummy_PV:Leistung_PV_max_Tag] Watt"}
DOELSEIF ## für alle anderen Monate natürlich auch noch
DOELSEIF ##die höchste Leistung in diesem Jahr
(([11:00:10] or [12:00:10] or [13:00:10] or [14:00:10] or [15:00:10] or [16:00:10] or [17:00:10] or [18:00:10]) and [Statistik_Dummy_PV:Leistung_PV_max_Tag] > [Statistik_Dummy_PV:Leistung_PV_max_Jahr])
(setreading Statistik_Dummy_PV Leistung_PV_max_Jahr [Statistik_Dummy_PV:Leistung_PV_max_Tag])
{fhem "set Telegram_###### msg Tageshöchstleistung 2018:.[Statistik_Dummy_PV:Leistung_PV_max_Tag] Watt"}
DOELSEIF ## die höchste Leistung insgesamt
(([11:00:15] or [12:00:15] or [13:00:15] or [14:00:15] or [15:00:15] or [16:00:15] or [17:00:15] or [18:00:15]) and [Statistik_Dummy_PV:Leistung_PV_max_Tag] > [Statistik_Dummy_PV:Leistung_PV_max_gesamt])
(setreading Statistik_Dummy_PV Leistung_PV_max_gesamt [Statistik_Dummy_PV:Leistung_PV_max_Tag])
{fhem "set Telegram_###### msg Tageshöchstleistung gesamt:.[Statistik_Dummy_PV:Leistung_PV_max_Tag] Watt"}
DOELSEIF ## in den folgend DOELSEIF wird der Tageshöchstertrag in den Dummy geschrieben
(([13:00:20] or [14:00:20] or [15:00:20] or [16:00:20] or [17:00:20] or [18:00:20] or [19:00:20] or [20:00:20] or [21:00:20]) and (strftime ("%m",localtime) == 1) and [Dummy_Strom:Tagesertrag] > [Statistik_Dummy_PV:Tagesertrag_max_Monat_01])
(setreading Statistik_Dummy_PV Tagesertrag_max_Monat_01 [Dummy_Strom:Tagesertrag])
{fhem "set Telegram_###### msg Tageshöchstertrag Januar:.[Dummy_Strom:Tagesertrag] Wh"}
DOELSEIF ## natürlich auch hier für alle 12 Monate
DOELSEIF
(([13:00:25] or [14:00:25] or [15:00:25] or [16:00:25] or [17:00:25] or [18:00:25] or [19:00:25] or [20:00:25] or [21:00:25]) and [Dummy_Strom:Tagesertrag] > [Statistik_Dummy_PV:Tagesertrag_max_Jahr])
(setreading Statistik_Dummy_PV Tagesertrag_max_Jahr [Dummy_Strom:Tagesertrag])
{fhem "set Telegram_###### msg Tageshöchstertrag 2018:.[Dummy_Strom:Tagesertrag] Wh"}
DOELSEIF
(([13:00:30] or [14:00:30] or [15:00:30] or [16:00:30] or [17:00:30] or [18:00:30] or [19:00:30] or [20:00:30] or [21:00:30]) and [Dummy_Strom:Tagesertrag] > [Statistik_Dummy_PV:Tagesertrag_max_gesamt])
(setreading Statistik_Dummy_PV Tagesertrag_max_gesamt [Dummy_Strom:Tagesertrag])
{fhem "set Telegram_###### msg Tageshöchstertrag gesamt:.[Dummy_Strom:Tagesertrag] Wh"}
DOELSEIF
([01:00:00])
(setreading Statistik_Dummy_PV Leistung_PV_max_Tag 0)


Die versetzten Zeiten habe ich genommen, damit nicht gleichzeitig mehrere DOIF-Fälle eintreten können. Kann man das gesamte DOIF mit seinen 30! DOIF-Fällen irgendwie schöner lösen?

Wie gesagt, es funktioniert prinzipell so wie es ist, würde aber gerne mehr verstehen und mehr lernen, komme aber mit der Suchfunktion nicht weiter, da ich auch nicht genau weiß wonach ich suchen müsste.

Danke und Gruß Carsten
Titel: Antw:Ich will mehr lernen, komme aber nicht weiter
Beitrag von: Carsten1981 am 04 März 2018, 12:43:12
und zusätzlich ist da ja noch der Schönheitsfehler.

die Werte die durch das DOIF in den Dummy geschrieben werden sind Zahlen.

1234

ich habe in dem Dummy die userreadings formatiert

1,23 kW/h

dann kommt im DOIF aber die Fehlermeldung das die Zahlen nicht Numeric sind und das das DOIF nicht mehr funktioniert. also Formatierung wieder raus genommen :-(
Titel: Antw:Ich will mehr lernen, komme aber nicht weiter
Beitrag von: Otto123 am 04 März 2018, 12:46:06
Hi,

ich habe mir deinen Code nicht angeschaut, aber such mal in der commandref nach :d und :d]

Gruß Otto
Titel: Antw:Ich will mehr lernen, komme aber nicht weiter
Beitrag von: Icinger am 04 März 2018, 12:52:51
Hab mir den Code auch nicht angesehen, aber warum nimmst du für Min/Max/Avg-Werte nicht einfach das statistics-Modul? Genau für solche Anwendungsfälle ist das ja gemacht??

lg, Stefan
Titel: Antw:Ich will mehr lernen, komme aber nicht weiter
Beitrag von: Carsten1981 am 05 März 2018, 16:16:03
Danke erstmal für euer Feedback

zu

:d

und

:d]

habe ich leider nichts gefunden was mir mit meinem Verständniss weitergeholfen hat.

warum ich das Statistics Modul nicht benutzt habe.

lt. commandref funktioniert das nur für die folgenden Reading:
brightness, current, energy_current, humidity, luminosity, temperature, voltage

und der wichtigere Grund, wenn ich etwas fertiges nehme was an anhieb perfekt funktioniert habe ich ja wieder nichts neues gelernt. (FHEM / DOIF / Perl / Variablen)

Gruß Carsten
Titel: Antw:Ich will mehr lernen, komme aber nicht weiter
Beitrag von: Icinger am 05 März 2018, 16:44:24
Zitatlt. commandref funktioniert das nur für die folgenden Reading:
brightness, current, energy_current, humidity, luminosity, temperature, voltage
Ohne weitere Angaben stimmt das schon, allerdings auch lt. commandref:
ZitatminAvgMaxReadings <Gerätewerte>
Durch Kommas getrennte Liste von Gerätewerten, für die in bestimmten Zeiträumen (Tag, Monat, Jahr) Minimum, Mittelwert und Maximum erfasst werden.
Also kannst du auch andere Readings auswerten :)

Und
Zitatund der wichtigere Grund, wenn ich etwas fertiges nehme was an anhieb perfekt funktioniert habe ich ja wieder nichts neues gelernt. (FHEM / DOIF / Perl / Variablen)
stimmt, allerdings
1) gibts sicher genug andere Baustellen und
2) Kannst du dieses eine statistics-Device halt für alle anderen Auswertungsarbeiten in deinem FHEM auch gleich mitnutzen.

War aber nur ein Vorschlag :)

lg, Stefan
Titel: Antw:Ich will mehr lernen, komme aber nicht weiter
Beitrag von: Otto123 am 05 März 2018, 20:55:44
Zitat von: Carsten1981 am 04 März 2018, 12:43:12
ich habe in dem Dummy die userreadings formatiert

1,23 kW/h

dann kommt im DOIF aber die Fehlermeldung das die Zahlen nicht Numeric sind und das das DOIF nicht mehr funktioniert. also Formatierung wieder raus genommen :-(

ZitatAb featurelevel 5.7 ersetzt das set und setreading Befehl

    [device:name] mit dem Wert des Readings, Internals oder Attributes für device, falls sowohl device, als auch Reading, Internal oder Attribut existiert, und nicht leer ist.
        Man kann einen der Präfixe r:, i: oder a: verwenden, um die Suche einzuschränken, genau wie im devspec.
        Das Suffix :d extrahiert die erste Zahl.
        Das Suffix :i extrahiert die erste Zahl als Ganzzahl.
        Das Suffix :r<n> extrahiert die erste Zahl, und rundet sie auf <n> Dezimalstellen. Falls <n> fehlt, dann wird auf eine Dezimalstelle gerundet.
        Das Suffix :t liefert den Zeitstempel des Readings
        Das Suffix :sec liefert Anzahl der Sekunden seit Änderung des Readings.
    Beispiel:
        set Lamp blink [blinkDummy:number] [r:blinkDummy:duration:d]
ZitatEs soll aus einem Reading, das z. B. ein Prozentzeichen beinhaltet, nur der Zahlenwert für den Vergleich genutzt werden:

define di_heating DOIF ([adjusting:actuator:d] < 10) (set heating off) DOELSE (set heating on)

Also besser könnte ich das jetzt nicht erklären. Du müsstest nur zwischen den Ohren Prozentzeichen durch kW/h ersetzen  ;D

Gruß Otto
Titel: Antw:Ich will mehr lernen, komme aber nicht weiter
Beitrag von: Damian am 06 März 2018, 19:44:58
Mit Zahlen sind Dezimalzahlen mit Punkt und nicht mit Komma gemeint.
Titel: Antw:Ich will mehr lernen, komme aber nicht weiter
Beitrag von: Carsten1981 am 09 März 2018, 15:51:54
Perfekt, danke