[gelöst] userReadings mit "ODER-Bedingung" (besser UND-Bedingung)

Begonnen von Vize, 15 August 2016, 22:00:26

Vorheriges Thema - Nächstes Thema

Vize

Guten Abend zusammen,

über ein userReading habe ich mir eine Berechnung gebaut, um eine ungefähre Soll-Leistung meiner Photovoltaikanlage zu ermitteln.
Im ersten Schritt sah das userReading so aus:
PV-Sollleistung { sprintf("%.0f",ReadingsVal($name,"Solarstrahlung",0)*ReadingsVal($name,"Faktor",0)*60*.134) }

Dabei stecken im Reading "Faktor" jede Menge Winkelangaben und auch der Azimuth der Sonne, welchen ich mir aus dem Twilight-Modul hole.

Die entsprechende Formel liefert allerdings nur plausible Werte, wenn der Rechenwert "Azimuth Minus 180" größer/gleich -90 ODER kleiner/gleich 90 ist.

Hier komme ich nun nicht weiter. Wenn ich das userReading mit einer einzelnen Bedingung baue, funktioniert es:
PV-Sollleistung { (ReadingsVal("Twilight","azimuth",0)-180) <= 90 ?
sprintf("%.0f",ReadingsVal($name,"Solarstrahlung",0)*ReadingsVal($name,"Faktor",0)*60*.134) :
sprintf("%.0f",ReadingsVal($name,"Solarstrahlung",0)*6) }


Ich schaffe es aber nicht, dort auch noch die Bedingung "ODER >=-90" einzubauen...weiß gar nicht mehr genau, was ich alles probiert habe, aber mit trial and error komme ich nicht weiter...
z.B.
PV-Sollleistung { (ReadingsVal("Twilight","azimuth",0)-180) >= -90 || (ReadingsVal("Twilight","azimuth",0)-180) <= 90 ? blablubb
oder
PV-Sollleistung { ((ReadingsVal("Twilight","azimuth",0)-180) >= -90 || (ReadingsVal("Twilight","azimuth",0)-180) <= 90) ? blablubb
funktioniert nicht...

Vielleicht kann mir ja jemand helfen, oder mich in die richtige Richtung schubsen?

Danke schonmal für jegliche Hilfe!

Gruß
Andreas

frank

ich vermute der wert soll im bereich von -90 bis +90 liegen. dann musst du aber eine UND-verknüpfung (&&) bauen.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

Vize

Hallo frank,

richtig, der Rechenwert "azimuth-180" soll im Bereich -90 bis 90 liegen...wusste nicht, dass man das als UND verknüpft.
Kann man denn bei dieser "Entweder-Oder-Auswertung" ( ?: ) überhaupt einen Wertebereich angeben, oder kann man damit nur auf einen einzelnen festen Wert prüfen?

Gruß
Andreas

frank

mach am besten eine klammer um die ganze bedingung, wie in deinem letzten bsp.
beide bedingungen sollen erfüllt sein, also bed1 und bed2.

ZitatKann man denn bei dieser "Entweder-Oder-Auswertung" ( ?: ) überhaupt einen Wertebereich angeben, oder kann man damit nur auf einen einzelnen festen Wert prüfen?
verstehe ich nicht ganz, aber es sollte funktionieren.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

decaflo

Er meinte wohl

PV-Sollleistung { (ReadingsVal("Twilight","azimuth",0)-180) >= -90 && (ReadingsVal("Twilight","azimuth",0)-180) <= 90 ? blablubb

Natürlich kannst Du auf diese Art einen Bereich angeben. Vor dem ? muss nur ein Term stehen, dessen Auswertung "true" ergibt, d.h. in Perl einen Wert ungleich 0, '' oder undef.
Hast Du das schon probiert? Warum das mit ||, also logisch "oder" nicht klappt, kannst Du Dir leicht selber überlegen. Jede Zahl ist kleinergleich 90 oder größergleich -90, nicht nur die zwischen -90 und 90. Das ist keine Konvention, sondern Logik :)

Die Klammer um den Term brauchst Du nicht, weil && eine höhere Priorität hat als ?: Sie schadet aber auch nicht, wenn es der Lesbarkeit dient.

Vize

Hallo frank,
hallo decaflo,

besten Dank für die Hilfe und die - natürlich logischen - Erklärungen...
Werde heute Abend mal testen.

Das Brett vorm Kopf ist entfernt, dauert halt etwas länger, wenn man Ü40 ist...  ;D :P

@frank
Hatte die Frage gestellt, da ich in anderen Bespielen immer nur eine einzelne Zahl vor dem "?" gesehen habe, aber nie z.B. >=-90 && <=90 o.ä..

Danke nochmal!

Gruß
Andreas

betateilchen

#6
Zitatrichtig, der Rechenwert "azimuth-180" soll im Bereich -90 bis 90 liegen

Wenn (azimuth-180) im Bereich -90 .. +90 liegen soll, dann muss azimuth zwischen 90 und 270 liegen.
Wozu die ganze Rumrechnerei, wenn man den Wert von azimuth einfach auf absolute Grenzwerte prüfen kann?

{ my $a = ReadingsVal("Twilight","azimuth",0); return blablub if ($a > 89 && $a < 271); return irgendwasanderes; }

Das ist einfachste Algebra, 6. Schulklasse.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Vize

Zitat von: betateilchen am 16 August 2016, 11:45:47Das ist einfachste Algebra, 6. Schulklasse.

Mist, das hatte ich in der 5. Klasse und muss es wohl in der 6. nicht mehr auf dem Schirm gehabt haben...da warn mir glaub ich andere Dinge wichtiger als Algebra...  ::) ???

Die 180 gilt für eine fest installierte PV-Anlage mit genau südlicher Ausrichtung, bei nachgeführten Systeme steht dort eine sich im Tagesverlauf ändernde Winkelangabe...

Gruß
Andreas

betateilchen

#8
Zitat von: Vize am 16 August 2016, 12:16:22
bei nachgeführten Systeme steht dort eine sich im Tagesverlauf ändernde Winkelangabe...

Auch kein Problem, dann mach es doch komplett flexibel...


{ my $azi = ReadingsVal("Twilight","azimuth",0);
my $winkel = (irgendwoherDenWinkelWert statt 180);
my $min = $winkel - 90;
my $max = $winkel + 90;
return blablub if ($azi > $min && $azu < $max);
return irgendwasanderes; }


Ich würde das Ganze dann aber als Funktion in die 99_myUtils packen, der einfachen Les- und Wartbarkeit wegen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Vize

Zitat von: betateilchen am 16 August 2016, 12:25:07
Ich würde das Ganze dann aber als Funktion in die 99_myUtils packen, der einfachen Les- und Wartbarkeit wegen.

Jau, habe ich auch schon überlegt...darauf wird es wohl hinauslaufen...

Danke!

Gruß
Andreas

Vize

N'Abend,

hab es jetzt erstmal mit der Variante
>= Winkel && <= Winkel umgesetzt, und es funktioniert.

Auslagern in die 99_myUtils folgt später...

Danke nochmal!

Gruß
Andreas