Seite 3 von 7
Re: Jalousien nach Sonnenstand
Verfasst: 5. Mär 2021 19:57
von Markus_JE
Gaga hin oder her. Keine Ahnung wo der Name herkommt.
Was soll ich denn noch machen das man das erkennen kann?
Und wie bitte bekomme ich die Zeilennummern da rein kopiert?
Re: Jalousien nach Sonnenstand
Verfasst: 5. Mär 2021 20:11
von udo1toni
Achso, ich möchte empfehlen, dass Du die Indentation beachtest. Das ist zwar in der DSL für den Ablauf irrelevant, hilft aber den Code zu lesen

Meist sitzen die Tabs im 4er Abstand, ein Tab führt also auf ein Stelle "mehrfaches von 4". Hier in der Forensoftware ist es aber so, dass ein Tab ein mehrfaches von 8 ist, das führt dann zu zusätzlichen Verschiebungen.
Zum eigentlichen Problem... eventuell ist die Strahlungsintensität ebenfalls einheitenbehaftet (habe da nicht drauf geachtet). Weiterhin habe ich ja den Bewölkungsgrad mit eingebaut. Das funktioniert natürlich nur dann, wenn Du auch ein entsprechendes Item hast. der Bewölkungsgrad wird in % angegeben, das wäre also ein Wert zwischen 0 und 100.
Hier mal eine hoffentlich robustere Version:
Code: Alles auswählen
val nElevationMin = 0 // 10
val nElevationMax = 300 // 45
val nAzimutMin = 0 // 130
val nAzimutMax = 210 // 210
val nIntensityMin = 0 // 80
val nCloudynessMax = 110 // 40
rule "Beschattung"
when
Item LokaleSonnendaten_Position_Elevation changed
then
if(!(LokaleSonnendaten_Position_Elevation.state instanceof Number)) {
logWarn("shade","Elevation ungültig! Abbruch!")
return;
}
if(!(LokaleSonnendaten_Azimut.state instanceof Number)) {
logWarn("shade","Azimut ungültig! Abbruch!")
return;
}
val nElevation = (LokaleSonnendaten_Position_Elevation.state as Number).floatValue
val nAzimut = (LokaleSonnendaten_Azimut.state as Number).floatValue
var nIntens = 100
if(LokaleSonnendaten_DirekteStrahlung.state instanceof Number)
nIntens = (LokaleSonnendaten_DirekteStrahlung.state as Number).floatValue
var nCloud = 0
if(LokaleWettervorhersage_Bewolkung.state instanceof Number)
nCloud = (LokaleWettervorhersage_Bewolkung.state as Number).intValue
if(nElevation < nElevationMin || nElevation > nElevationMax ||
nAzimut < nAzimutMin || nAzimut > nAzimutMax ||
nIntens < nIntensityMin ||
nCloud > nCloudynessMax) {
logInfo("shade","Rolladen Büro und Kinderzimmer Beschattung aus!")
} else {
logInfo("shade","Rolladen Büro und Kinderzimmer Beschattung an!")
DGBuero.sendCommand(50)
DGKind.sendCommand(50)
}
end
Re: Jalousien nach Sonnenstand
Verfasst: 5. Mär 2021 20:24
von Markus_JE
Hi,
danke dir. Das Item habe ich letztes mal schon gesehen und umbeannt in mein Item der Bewölkung (LokaleWettervorhersage_Bewolkung)
Ich bekomme auch keinen Fehler mehr im Logging aber immer nur die Log Info "Rolladen Büro und Kinderzimmer Beschattung aus!"
Trotz der Parameter wie ich sie oben definiert habe (min/max werte) läuft die Regel nicht weiter durch.
Ich habe den nElevationMin auf -50 gesetzt funktioniert dies überhaupt in Bezug auf instanceof number ? (Negativwerte)
Da der Elevationswinkel im Moment bei ca -20 steht
Re: Jalousien nach Sonnenstand
Verfasst: 5. Mär 2021 20:33
von udo1toni
Na dann hilft es nix, muss halt mehr Logging rein...
Diesen Block
Code: Alles auswählen
logInfo("shade","Elevation: Min({}) Max({}) aktuell:{}",nElevationMin,nElevationMax,nElevation)
logInfo("shade"," Azimut: Min({}) Max({}) aktuell:{}",nAzimutMin,nAzimutMax,nAzimut)
logInfo("shade","Intensity: Min({}) aktuell:{}",nIntensityMin,nIntens)
logInfo("shade"," Cloud: Max({}) aktuell:{}",nCloudynessMax,nCloud)
vor der Zeile
Code: Alles auswählen
if(nElevation < nElevationMin || nElevation > nElevationMax ||
nAzimut < nAzimutMin || nAzimut > nAzimutMax ||
nIntens < nIntensityMin ||
nCloud > nCloudynessMax) {
einfügen, dann siehst Du die konkret genutzten Werte.
Re: Jalousien nach Sonnenstand
Verfasst: 5. Mär 2021 20:45
von Markus_JE
Hi Udo,
wie cool.
Azimut max hatte nicht gepasst. Habe ich angepasst.
Jetzt kommt aber wieder diese Meldung.
2021-03-05 20:43:29.619 [INFO ] [org.openhab.core.model.script.shade ] - Elevation: Min(-50) Max(300) aktuell:-25.00499
2021-03-05 20:43:29.624 [INFO ] [org.openhab.core.model.script.shade ] - Azimut: Min(0) Max(500) aktuell:291.34424
2021-03-05 20:43:29.628 [INFO ] [org.openhab.core.model.script.shade ] - Intensity: Min(0) aktuell:0.0
2021-03-05 20:43:29.632 [INFO ] [org.openhab.core.model.script.shade ] - Cloud: Max(110) aktuell:12
2021-03-05 20:43:29.645 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'SonnenschutzBüro-1' failed: An error occurred during the script execution: Could not invoke method: org.eclipse.xtext.xbase.lib.IntegerExtensions.operator_lessThan(int,int) on instance: null in SonnenschutzBüro
Ich gehe davon aus das diese Meldung kommt wenn die Werte für den Start der Beschattung passen würden
Re: Jalousien nach Sonnenstand
Verfasst: 5. Mär 2021 22:10
von int5749
Markus_JE hat geschrieben: ↑5. Mär 2021 20:45
Ich gehe davon aus das diese Meldung kommt wenn die Werte für den Start der Beschattung passen würden
Nein, die Meldung ist ja ein Fehler
Ich habe das gerade mal nachgebaut und bei mir kommt diese Meldung nicht
22:04:06.659 [INFO ] [org.openhab.core.model.script.shade ] - Elevation: Min(0) Max(300) aktuell:-33.32822
22:04:06.659 [INFO ] [org.openhab.core.model.script.shade ] - Azimut: Min(0) Max(210) aktuell:308.66458
22:04:06.663 [INFO ] [org.openhab.core.model.script.shade ] - Intensity: Min(0) aktuell:0.0
22:04:06.663 [INFO ] [org.openhab.core.model.script.shade ] - Cloud: Max(110) aktuell:0
22:04:06.671 [INFO ] [org.openhab.core.model.script.shade ] - Rolladen Büro und Kinderzimmer Beschattung aus!
Ich habe die Items derzeit als simple "Number" angelegt
Code: Alles auswählen
Number LokaleSonnendaten_Azimut "Azimuth" { channel="astro:sun:local:position#azimuth" }
Number LokaleSonnendaten_Position_Elevation "Elevation" { channel="astro:sun:local:position#elevation" }
Number LokaleSonnendaten_DirekteStrahlung "Strahlung" { channel="astro:sun:local:radiation#direct" }
Number LokaleWettervorhersage_Bewolkung "Wolken" { channel="openweathermap:weather-and-forecast:api:local:current#cloudiness" }
Wie sehen Deine Items aus??
Re: Jalousien nach Sonnenstand
Verfasst: 5. Mär 2021 22:30
von int5749
udo1toni hat geschrieben: ↑5. Mär 2021 19:52
Das ist komplett gaga... Warum wird da einfach ein frei erfundener Name generiert? Wo kommt der Name her? Und wie bitte soll man einen Fehler eingrenzen, wenn keine Zeilennummern angegeben werden? ~grummel~
Dies ist leider eine Eigenart von OH3, Der Name ist einfach der Name der Datei und dann werden die enthaltenen Rules hochgezählt und der Name der Rule als Identifier
In meinem Fall
Beschattung
Test-1
Re: Jalousien nach Sonnenstand
Verfasst: 5. Mär 2021 22:57
von int5749
Markus_JE hat geschrieben: ↑5. Mär 2021 20:24
Trotz der Parameter wie ich sie oben definiert habe (min/max werte) läuft die Regel nicht weiter durch.
Ich habe den nElevationMin auf -50 gesetzt funktioniert dies überhaupt in Bezug auf instanceof number ? (Negativwerte)
Evtl. habe ich ja auch noch nicht verstanden, wann genau die Rollladen bei Dir fahren sollen, aber
Code: Alles auswählen
if(nElevation < nElevationMin || nElevation > nElevationMax ||
nAzimut < nAzimutMin || nAzimut > nAzimutMax ||
nIntens < nIntensityMin ||
nCloud > nCloudynessMax) {
bedeutet ja, das nur einer der angegebenen Vergleiche wahr sein muß um eben "Rolladen Büro und Kinderzimmer Beschattung aus!" zu triggern
||
bedeutet "oder"
&&
wäre z.B. ein "und" Vergleich
Und verschachteln könntest Du, indem Du Klammern um Vergleiche setzen würde.
Dait wären wir wieder bei "Wie, wann, wo (weiß nicht Obi) aber sollte klar definiert sein

Re: Jalousien nach Sonnenstand
Verfasst: 6. Mär 2021 10:23
von udo1toni
int5749 hat geschrieben: ↑5. Mär 2021 22:30
udo1toni hat geschrieben: ↑5. Mär 2021 19:52
Das ist komplett gaga... Warum wird da einfach ein frei erfundener Name generiert? Wo kommt der Name her? Und wie bitte soll man einen Fehler eingrenzen, wenn keine Zeilennummern angegeben werden? ~grummel~
Dies ist leider eine Eigenart von OH3, Der Name ist einfach der Name der Datei und dann werden die enthaltenen Rules hochgezählt und der Name der Rule als Identifier
In meinem Fall
Beschattung
Test-1
Ah, jetzt, ja. Das war der eine Parameter, den ich nicht kannte... so ist es natürlich wieder einigermaßen sinnvoll. Fehlende Zeilennummern sind aber trotzdem unschön.
Re: Jalousien nach Sonnenstand
Verfasst: 6. Mär 2021 10:26
von udo1toni
int5749 hat geschrieben: ↑5. Mär 2021 22:57
Markus_JE hat geschrieben: ↑5. Mär 2021 20:24
Trotz der Parameter wie ich sie oben definiert habe (min/max werte) läuft die Regel nicht weiter durch.
Ich habe den nElevationMin auf -50 gesetzt funktioniert dies überhaupt in Bezug auf instanceof number ? (Negativwerte)
Evtl. habe ich ja auch noch nicht verstanden, wann genau die Rollladen bei Dir fahren sollen, aber
Code: Alles auswählen
if(nElevation < nElevationMin || nElevation > nElevationMax ||
nAzimut < nAzimutMin || nAzimut > nAzimutMax ||
nIntens < nIntensityMin ||
nCloud > nCloudynessMax) {
bedeutet ja, das nur einer der angegebenen Vergleiche wahr sein muß um eben "Rolladen Büro und Kinderzimmer Beschattung aus!" zu triggern
||
bedeutet "oder"
&&
wäre z.B. ein "und" Vergleich
Und verschachteln könntest Du, indem Du Klammern um Vergleiche setzen würde.
Dait wären wir wieder bei "Wie, wann, wo (weiß nicht Obi) aber sollte klar definiert sein
Das VerODERn ist hier schon in Ordnung, es geht darum, dass die Rollläden nur dann in die Beschattung gehen sollen, wenn alle Parameter oberhalb des Minimum und unterhalb des Maximum sind.