Hauptmenü

Berechnung mit DOIF

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

Vorheriges Thema - Nächstes Thema

Iron-R

@Ellert

habe Dein Vorschlag mal als zusätzliches DOIF angelegt

define PV_Wirkungsgrad1 DOIF ([SOLAR_th:PV_Einstrahlung_eff] != 0)
attr PV_Wirkungsgrad1 state {([sv:wr11_currentPower]/([SOLAR_th:PV_Einstrahlung_eff]+ 0.0000001)*100)}
attr PV_Wirkungsgrad1 stateFormat {sprintf "%.2f %%", int(ReadingsVal($name, "state", 0))}
attr PV_Wirkungsgrad1 event-min-interval 600
attr PV_Wirkungsgrad1 event-on-change-reading state.*
attr PV_Wirkungsgrad1 verbose 5
define FileLog_PV_Wirkungsgrad1 FileLog ./log/PV_Wirkungsgrad1-%Y.log PV_Wirkungsgrad1
FHem auf Raspi 512MB-Wheezy; 1wire Bus DS2438, DS18B21, DS2423; Vito200; VBus

Damian

#16
Zitat von: Iron-R am 06 Dezember 2015, 21:02:08
@Ellert

habe Dein Vorschlag mal als zusätzliches DOIF angelegt

define PV_Wirkungsgrad1 DOIF ([SOLAR_th:PV_Einstrahlung_eff] != 0)
attr PV_Wirkungsgrad1 state {([sv:wr11_currentPower]/([SOLAR_th:PV_Einstrahlung_eff]+ 0.0000001)*100)}
attr PV_Wirkungsgrad1 stateFormat {sprintf "%.2f %%", int(ReadingsVal($name, "state", 0))}
attr PV_Wirkungsgrad1 event-min-interval 600
attr PV_Wirkungsgrad1 event-on-change-reading state.*
attr PV_Wirkungsgrad1 verbose 5
define FileLog_PV_Wirkungsgrad1 FileLog ./log/PV_Wirkungsgrad1-%Y.log PV_Wirkungsgrad1


Das kannst du wiederum etwas einfacher haben:

define PV_Wirkungsgrad1 DOIF
attr PV_Wirkungsgrad1 state {(sprintf "%.2f %%", int([sv:wr11_currentPower]/([SOLAR_th:PV_Einstrahlung_eff]+ 0.0000001)*100))}
attr PV_Wirkungsgrad1 event-min-interval 600
attr PV_Wirkungsgrad1 event-on-change-reading state.*
attr PV_Wirkungsgrad1 verbose 5
define FileLog_PV_Wirkungsgrad1 FileLog ./log/PV_Wirkungsgrad1-%Y.log PV_Wirkungsgrad1


Gruß

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

Ellert

Zitat von: Damian am 06 Dezember 2015, 19:37:23
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")}

Das hat mich auf die Idee gebracht das nachgestellte if zu probieren, das klappt auch:
attr PV_Wirkungsgrad state {(sprintf "%.2f %%", ([sv:wr11_currentPower]/[SOLAR_th:PV_Einstrahlung_eff]*100) if ([SOLAR_th:PV_Einstrahlung_eff] != 0)}

Getestet habe ich mit: {([BMP180:temperature]) if ([BMP180:temperature] != 0)}
Allerdings ist state leer/undef nach setreading BMP180 temperature 0

Iron-R

Hallo Zusammen,

es gibt ein Ergebnis was gut aussieht:
diese Version:
Zitat von: Iron-R am 06 Dezember 2015, 21:02:08
@Ellert

habe Dein Vorschlag mal als zusätzliches DOIF angelegt

define PV_Wirkungsgrad1 DOIF ([SOLAR_th:PV_Einstrahlung_eff] != 0)
attr PV_Wirkungsgrad1 state {([sv:wr11_currentPower]/([SOLAR_th:PV_Einstrahlung_eff]+ 0.0000001)*100)}
attr PV_Wirkungsgrad1 stateFormat {sprintf "%.2f %%", int(ReadingsVal($name, "state", 0))}
attr PV_Wirkungsgrad1 event-min-interval 600
attr PV_Wirkungsgrad1 event-on-change-reading state.*
attr PV_Wirkungsgrad1 verbose 5
define FileLog_PV_Wirkungsgrad1 FileLog ./log/PV_Wirkungsgrad1-%Y.log PV_Wirkungsgrad1

hatte folgendes im Log:
2015-12-07_16:04:44 PV_Wirkungsgrad1 8.40336134012428
2015-12-07_16:04:46 PV_Wirkungsgrad1 7.35294117309148
2015-12-07_16:04:47 PV_Wirkungsgrad1 8.40336134012428
2015-12-07_16:04:49 PV_Wirkungsgrad1 7.35294117309148
2015-12-07_16:05:16 PV_Wirkungsgrad1 0
2015-12-07_16:34:03 PV_Wirkungsgrad1 0.00 %

Deine vereinfachte Version habe ich auch eingepflegt (letzter Log Eintrag) danach hat sich die PV-Anlage abgschaltet-keine Werte mehr.

Die Version mit iF bringt Fehler
2015-12-07_16:34:03 PV_Wirkungsgrad syntax error at (eval 126195) line 1, near ") if"

Muss noch mal testen habe den Fehler noch nicht gefunden.
Danke erst mal.
Viele Grüße
Iron
FHem auf Raspi 512MB-Wheezy; 1wire Bus DS2438, DS18B21, DS2423; Vito200; VBus

Ellert

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

Iron-R

die fehlende Klammer hatte ich schon eingefügt.
Der Fehler bleibt.
FHem auf Raspi 512MB-Wheezy; 1wire Bus DS2438, DS18B21, DS2423; Vito200; VBus

Bennemannc

Hallo,

also die Logik erschließt sich mir nicht - was macht eine if-Abfrage ohne then für einen Sinn ? Das if müsste vor {(sprintf ....) stehen. Dann würde die Berechnung nicht ausgeführt, wenn der Wert 0 ist.

Gruß Christoph
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


Damian

Zitat von: Bennemannc am 07 Dezember 2015, 19:41:41
Hallo,

also die Logik erschließt sich mir nicht - was macht eine if-Abfrage ohne then für einen Sinn ? Das if müsste vor {(sprintf ....) stehen. Dann würde die Berechnung nicht ausgeführt, wenn der Wert 0 ist.

Gruß Christoph

In Perl gibt es auch die Syntax mit einem nachgestellten if:

<Perl-Befehl> if (...)


Allerdings hat die Definition, die so aussehen müsste:

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

den Nachteil, dass der Status leer wird, wenn die Bedingung nicht wahr ist.

Gruß

Damian

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

Bennemannc

Hallo Damian,

das kannte ich noch nicht - ist für mich irgendwie blöde zu lesen, ungewohnt.

Gruß Christoph
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

Iron-R

@Damian
nachdem ich den Code eingefügt habe hat sich fhem verabschiedet

Zitat von: Damian am 07 Dezember 2015, 20:29:57
In Perl gibt es auch die Syntax mit einem nachgestellten if:

<Perl-Befehl> if (...)


Allerdings hat die Definition, die so aussehen müsste:

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

den Nachteil, dass der Status leer wird, wenn die Bedingung nicht wahr ist.

Gruß

Damian



Fehler im fhem.log
Unmatched ( in regex; marked by <-- HERE in m/ {( <-- HERE sprintf[ :;]/ at fhem.pl line 2401, <$fh> line 559.

War der Code die Ursache?
Nachdem ich die fhem.pl neu aufgespielt habe ging alles wieder.
FHem auf Raspi 512MB-Wheezy; 1wire Bus DS2438, DS18B21, DS2423; Vito200; VBus

Iron-R

Hallo Zusammen,

der Code aus Post 16 läuft jetzt seit 5Tagen zufriedenstellen.
Danke für die Unterstützung

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

Damian

Zitat von: Iron-R am 11 Dezember 2015, 17:30:45
Hallo Zusammen,

der Code aus Post 16 läuft jetzt seit 5Tagen zufriedenstellen.
Danke für die Unterstützung

Grüße
Iron

Man sollte allerdings wissen, dass beim state-Attribut mit Readingangaben [...] der Status unabhängig davon aktualisiert wird, was in der Bedingung steht, dafür habe ich im DOIF einen separaten Triggermechanismus eingebaut. Mit anderen Worten: die Abfrage define PV_Wirkungsgrad1 DOIF ([SOLAR_th:PV_Einstrahlung_eff] != 0) hat hier keine Bedeutung, man hätte die ganze Bedingung auch weglassen können. Sollen die Readingangaben im Status dagegen nicht selbstständig triggern, so muss man wie üblich ein Fragezeichen davor setzen.

Gruß

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