Hauptmenü

Berechnung mit DOIF

Begonnen von Iron-R, 05 Dezember 2015, 18:02:30

Vorheriges Thema - Nächstes Thema

Iron-R

Hallo Zusammen,

ich versuche mit DOIF eine Berechnung mit mehreren Readings durchzuführen was im wesentlichen funktioniert.
Zwangsläufig gibt es die situation das die Werte der Readings sich durch Null teilen das ergibt folgende Fehlermeldung
   
2015.12.05 17:58:09 1: PERL WARNING: Argument "Illegal division by zero at (eval 213693) line 1.\n" isn't numeric in int at (eval 213694) line 1.

define PV_Wirkungsgrad DOIF
attr PV_Wirkungsgrad event-on-change-reading 1
attr PV_Wirkungsgrad state {([sv:wr11_currentPower]/[SOLAR_th:PV_Einstrahlung_eff]*100)}
attr PV_Wirkungsgrad stateFormat {sprintf "%.2f %%", int(ReadingsVal($name, "state", 0))}
attr PV_Wirkungsgrad verbose 1

define FileLog_PV_Wirkungsgrad FileLog ./log/PV_Wirkungsgrad-%Y.log PV_Wirkungsgrad


auch der Versuch mit nur brechnen wenn "wr11_currentPower >0 hat keinen erfolgt.
#attr PV_Wirkungsgrad state ([sv:wr11_currentPower] > 0)   ([sv:wr11_currentPower]/[SOLAR_th:PV_Einstrahlung_eff])*100}
#attr PV_Wirkungsgrad stateFormat {sprintf "%.2f %", ReadingsVal($name, "state", 0)}


Kann Bitte einer Helfen.

Viele Grüße
Iron
FHem auf Raspi 512MB-Wheezy; 1wire Bus DS2438, DS18B21, DS2423; Vito200; VBus

Bennemannc

#1
Hallo,

hinter dem DOIF sollte auch etwas stehen - worauf soll das den triggern bzw. wann soll es denn ausgelöst werden und was dann machen ? Wenn keine Bedingung angegeben ist, kann das Modul nichts vergleichen - daher die Fehlermeldung.

Gruß Christoph

PS. event-on-change-reading 1 funktioniert so auch nicht - es sei denn Du hast ein Reading mit dem Namen 1
event-on-change-reading
Dieses Attribut enthält eine durch Kommata getrennte Liste von "readings". Wenn gesetzt, erzeugen nur Veränderungen der gelisteten "readings" ein Ereignis. Wenn die aktualiserten Werte der gelisteten "readings" identisch sind, wird kein Ereignis generiert.
Wenn hinter dem Namen eines "readings" eine :Schwelle angegeben ist, wird das Event nur getriggert wenn die Änderung grösser als diese Schwelle ist.

Also die Logik müsste sein: bei "currentPower" das event-on-change-reading auf .* setzen. Damit kommen nur noch Werte durch, die sich vom letzen Wert unterscheiden. Das DOIF müsste dann auf einen neuen Wert reagieren (auslösen) - ohne Bedingung damit Deine Berechung ausgeführt werden.
Cubietruck, Fhem 5.8
CC-RT-DN|LC-SW2-FM|RC-12|RC-19|LC-SW4-BA-PCB|LCp-SW1-BA-PCB|ES-PMSw1-Pl|LC-Bl1PBU-FM|PBI-4-FM|CC-VD|CC-TC|SEC-SC(2)|RC-KEY3-B|LC-Sw1PBU-FM|PB-2-FM|WDS100-C6-O|WDC7000|LC-Bl1-FM
Module: Dewpoint,FB_Callmonitor,HCS,Panstamp,at,notify,THRESHOLD,average,DOIF

Ellert

#2
Du musst auf den Nenner prüfen, nicht auf den Zähler.
define PV_Wirkungsgrad DOIF ([SOLAR_th:PV_Einstrahlung_eff] != 0)
attr PV_Wirkungsgrad state {(sprintf "%.2f %%", ([sv:wr11_currentPower]/[SOLAR_th:PV_Einstrahlung_eff]*100))}
attr PV_Wirkungsgrad verbose 1

stateFormat kannst Du sparen, s. http://fhem.de/commandref_DE.html#DOIF_state

Alternativ:
define PV_Wirkungsgrad DOIF ([SOLAR_th:PV_Einstrahlung_eff] != 0) (setreading  PV_Wirkungsgrad state  {(sprintf "%.2f %%", ([sv:wr11_currentPower]/[SOLAR_th:PV_Einstrahlung_eff]*100))})
attr PV_Wirkungsgrad verbose 1


Nicht getestet, ggf. Syntax ergänzen.

Iron-R

Guten Morgen Zusammen,

Danke für Eure Antworten und Unterstützung.

@Bennemannc
"currentPower" ist auf event-on-change-reading  .* gesetzt hier wird der Wert nur alle 5 min aktualisiert.
Die Berechnung an sich hat ja funktioniert solange die zu berechnenten Werte nicht Null waren.

@Ellert
habe Deine alternative Code getestet, hatte den erfolgt das über nacht das Log sauber bleibt.
Sobald die PV-Anlage anfängt Werte zu Liefern habe ich folgende Fehlermeldung im Log
2015-12-06_07:35:45 PV_Wirkungsgrad error: no right bracket
2015-12-06_07:35:45 PV_Wirkungsgrad cmd_1
2015-12-06_07:35:46 PV_Wirkungsgrad cmd_2
2015-12-06_07:35:51 PV_Wirkungsgrad error: no right bracket
2015-12-06_07:35:51 PV_Wirkungsgrad cmd_1
2015-12-06_07:35:52 PV_Wirkungsgrad cmd_2
2015-12-06_07:36:19 PV_Wirkungsgrad error: no right bracket
2015-12-06_07:36:19 PV_Wirkungsgrad cmd_1
2015-12-06_07:36:21 PV_Wirkungsgrad cmd_2
2015-12-06_07:36:23 PV_Wirkungsgrad error: no right bracket
2015-12-06_07:36:23 PV_Wirkungsgrad cmd_1
2015-12-06_07:36:24 PV_Wirkungsgrad cmd_2
2015-12-06_07:36:26 PV_Wirkungsgrad error: no right bracket

Mit dem Code
Zitatdefine PV_Wirkungsgrad DOIF ([SOLAR_th:PV_Einstrahlung_eff] != 0)
attr PV_Wirkungsgrad state {(sprintf "%.2f %%", ([sv:wr11_currentPower]/[SOLAR_th:PV_Einstrahlung_eff]*100))}

attr PV_Wirkungsgrad event-on-change-reading state.*
attr PV_Wirkungsgrad verbose 1
define FileLog_PV_Wirkungsgrad FileLog ./log/PV_Wirkungsgrad-%Y.log PV_Wirkungsgrad
gibt es kein Ergebnis das Log sieht so aus:
2015-12-06_08:58:22 PV_Wirkungsgrad 0.00 %
2015-12-06_08:58:24 PV_Wirkungsgrad 0.00 %
2015-12-06_08:58:25 PV_Wirkungsgrad 0.00 %
2015-12-06_08:58:25 PV_Wirkungsgrad 0.00 %
2015-12-06_08:58:26 PV_Wirkungsgrad 0.00 %
2015-12-06_08:58:27 PV_Wirkungsgrad 0.00 %
2015-12-06_08:58:28 PV_Wirkungsgrad 0.00 %
2015-12-06_08:58:28 PV_Wirkungsgrad 0.00 %
Mit event-on-change-reading state.* versuche ich die Menge der Log-Einträge zu reduzieren

Readings
Device                                            SOLAR_th             2015-12-06 09:29:48
cmd_event                                     SOLAR_th             2015-12-06 08:55:11
cmd_nr                                           1                           2015-12-06 08:55:11
e_SOLAR_th_PV_Einstrahlung_eff  9683.2                 2015-12-06 09:29:48
error                                                no right bracket  2015-12-06 08:55:11
state                                               0.00 %                2015-12-06 09:29:48

Irgendwie fehlt hier der Wert "Current_Power"

Danke für die Hilfe

MfG
Iron
FHem auf Raspi 512MB-Wheezy; 1wire Bus DS2438, DS18B21, DS2423; Vito200; VBus

moonsorrox

#4
define PV_Wirkungsgrad DOIF ([SOLAR_th:PV_Einstrahlung_eff] != 0) (setreading  PV_Wirkungsgrad state  {(sprintf "%.2f %%", ([sv:wr11_currentPower]/[SOLAR_th:PV_Einstrahlung_eff]*100))})
attr PV_Wirkungsgrad verbose 1

hier ist die Klammersetzung nicht OK...! irgendwo fehlt dir eine Klammer

Zitat2015-12-06_07:35:51 PV_Wirkungsgrad error: no right bracket
dieser Fehler muss erst einmal weg...
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Iron-R

#5
Ich habe den Code angepasst.

([SOLAR_th:PV_Einstrahlung_eff] != 0)
(
  (setreading PV_Wirkungsgrad state
   {(sprintf("%.2f %%",([sv:wr11_currentPower]/[SOLAR_th:PV_Einstrahlung_eff])*100))})
)


Zumindest wird jetzt keine Fehler mehr angezeigt, aber ein Ergebnis auch nicht.
FHem auf Raspi 512MB-Wheezy; 1wire Bus DS2438, DS18B21, DS2423; Vito200; VBus

Ellert

Das DOIF hat noch nicht getriggert, state steht noch auf initialized.

Iron-R

#7
kann ja nicht gehen wenn der zweite Wert fehlt.

Nun wo er da ist steht bei "state cmd_1"

Wie bekomme ich den Berechneten Wert angezeigt?

im Log steht:
2015-12-06_14:59:18 PV_Wirkungsgrad 0.00 %
2015-12-06_14:59:18 PV_Wirkungsgrad cmd_nr: 1
2015-12-06_14:59:18 PV_Wirkungsgrad cmd_event: SOLAR_th
2015-12-06_14:59:18 PV_Wirkungsgrad cmd_1
FHem auf Raspi 512MB-Wheezy; 1wire Bus DS2438, DS18B21, DS2423; Vito200; VBus

Ellert

Da hab ich was dazu gelernt. Ich hätte gedacht, dass setreading, "state" auf den Wert setzt. Wird wohl auch, aber dann durch cmd_1 überschrieben, falls die Reihenfolge im Log stimmt. Dann versuch mal "attr PV_Wirkungsgrad state ...", wie in der Commandref beschrieben und fang Nenner=0 mit IF ab.

define PV_Wirkungsgrad DOIF
attr PV_Wirkungsgrad state IF ([SOLAR_th:PV_Einstrahlung_eff] != 0) ({(sprintf "%.2f %%", ([sv:wr11_currentPower]/[SOLAR_th:PV_Einstrahlung_eff]*100))})

Ich habe die Klammern nicht überprüft.
Du kannst das Attribut "state" komfortabel im DEF-Editor definieren, wenn Du beim DOIF folgendes Attibut setzt.
attr PV_Wirkungsgrad widgetOverride state:textField-long

Damian

Zitat von: Ellert am 06 Dezember 2015, 18:42:11
Da hab ich was dazu gelernt. Ich hätte gedacht, dass setreading, "state" auf den Wert setzt. Wird wohl auch, aber dann durch cmd_1 überschrieben, falls die Reihenfolge im Log stimmt. Dann versuch mal "attr PV_Wirkungsgrad state ...", wie in der Commandref beschrieben und fang Nenner=0 mit IF ab.

define PV_Wirkungsgrad DOIF
attr PV_Wirkungsgrad state IF ([SOLAR_th:PV_Einstrahlung_eff] != 0) ({(sprintf "%.2f %%", ([sv:wr11_currentPower]/[SOLAR_th:PV_Einstrahlung_eff]*100))})

Ich habe die Klammern nicht überprüft.
Du kannst das Attribut "state" komfortabel im DEF-Editor definieren, wenn Du beim DOIF folgendes Attibut setzt.
attr PV_Wirkungsgrad widgetOverride state:textField-long

Das wird nicht funktionieren.

Das Attribut state ist in erster Linie dazu gedacht, beliebige Texte zu definieren, wo in eckigen Klammern Stati, Readings usw. eingesetzt werden oder eben Perlbefehle, die etwas ausgeben, beginnend mit {(.

FHEM-Befehle dagegen wie z. B. IF werden im state nicht ausgeführt. Ich denke, am einfachsten ist die Variante ohne state-Attribut mit setreading auf ein selbst definiertes Reading oder mit set auf ein Dummy, welches man sich dann, wo auch immer anzeigen lassen kann.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

@Damian: würde es mit dem Perl if funktionieren?

attr PV_Wirkungsgrad state {if ([SOLAR_th:PV_Einstrahlung_eff] != 0) {(sprintf "%.2f %%", ([sv:wr11_currentPower]/[SOLAR_th:PV_Einstrahlung_eff]*100))}}

Damian

Zitat von: Ellert am 06 Dezember 2015, 19:03:54
@Damian: würde es mit dem Perl if funktionieren?

attr PV_Wirkungsgrad state {if ([SOLAR_th:PV_Einstrahlung_eff] != 0) {(sprintf "%.2f %%", ([sv:wr11_currentPower]/[SOLAR_th:PV_Einstrahlung_eff]*100))}}

wenn, dann so (Perl muss im State mit {( beginnen):

attr PV_Wirkungsgrad state {();if ([SOLAR_th:PV_Einstrahlung_eff] != 0) {sprintf "%.2f %%", ([sv:wr11_currentPower]/[SOLAR_th:PV_Einstrahlung_eff]*100)}}

aber, ob dann noch jemand versteht, warum man das so umständlich formulieren muss, wage ich zu bezweifeln.

Gruß

Damian


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Zitat von: Damian am 06 Dezember 2015, 19:27:13
wenn, dann so (Perl muss im State mit {( beginnen):

attr PV_Wirkungsgrad state {();if ([SOLAR_th:PV_Einstrahlung_eff] != 0) {sprintf "%.2f %%", ([sv:wr11_currentPower]/[SOLAR_th:PV_Einstrahlung_eff]*100)}}

oder so (ist auch weitgehend Perl):

attr PV_Wirkungsgrad state {([SOLAR_th:PV_Einstrahlung_eff] ? sprintf "%.2f %%", ([sv:wr11_currentPower]/[SOLAR_th:PV_Einstrahlung_eff]*100):"kein Wert")}


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Iron-R

Hallo Zusammen,

Danke für die Unterstützung,hätte nicht gedacht das es solche Probleme macht.
Habe den Code aus dem letzten Post 19:37:23 mal eingesetzt.

im Log steht:
2015-12-06_19:43:50 PV_Wirkungsgrad kein Wert

im FHEM Log steht kein Eintrag.

Alles andere können wir erst morgen sehen wenn wieder Werte anliegen
Melde mich dann.

Danke
MfG Iron
FHem auf Raspi 512MB-Wheezy; 1wire Bus DS2438, DS18B21, DS2423; Vito200; VBus

Ellert

Man könnte es auch rechnerisch lösen, ohne einen großen Fehler zu erzeugen.

Wenn SOLAR_th:PV_Einstrahlung_eff = 0, dann sollte auch sv:wr11_currentPower = 0 sein, wenn man eine geringe Resteinstrahlung einführt, wirkt sich das kaum auf den Wirkungsgrad aus.

Wirkungsgrad = currentPOWER /(Einstahlung + 0.0000001)

Der Ausdruck (Einstahlung + 0.0000001) wird nie 0 und vermeidet die Division durch 0. Dann kann man "state" ohne if berechnen.