Automatic Shading with Astro, OpenWeather and MqTT (for Shelly 2.5)

Hi,

yes you are right.
I will paste you some comments from the origin founder of this rule regarding to your question:
It´s in written in German.

Hallo,

erst mal vielen Dank für diesen Beitrag. Soetwas hatte ich auch vor und Du hast sogar noch mehr eingebaut (Wetter) als ich erst geplnt hatte.

DaumenHoch

Allerdings habe ich ein (vielleicht auch nur Verständnis-)Problem.
Du holst die aktuelle Zeit mit
var String timeNow = now.toString().substring(0,10)
Wenn ich mir die ins Log schreiben lasse [hiermit: if (log) logInfo(‚rules‘, logPrefix + ‚timeNow=‘ + timeNow)], bekomme ich soetwas:
[eclipse.smarthome.model.script.rules] – Rolloautomatik (Rollo ab) – timeNow=2019-02-15

Soll das wirklich das Datum sein? Von Namen und von der Logik her würde ich eher die Uhrzeit erwarten.
Kann es sein, das ich das lokale Zeit/Datumsformat einstellen Muss?
Falls ja, weißt Du zufällig wie ich das mache?
Ich verwende Openhabian2 auf einem Raspberry.

Tschööö Thorsten

Antworten

  1. Florian S.

15. FEBRUAR 2019 UM 12:15 UHR

Hallo Thorsten,

zuerst Danke für dein Feedback!

now.toString() liefert Datum und Uhrzeit – das hast Du richtig erkannt.
Im Code sieht Du aber, dass ich den String dann mit substring abschneide. Dies mache ich, weil ich möchte, dass nur Jahr-Monat-Tag als Zeitstempel über bleibt.

Im Nachfolgenden der Rule prüfe ich das dann immer ab und verhindere, dass die Rule an einem Tag ggf mehrfach getriggert wird. Dies wäre z.B. der Fall, wenn openhab die Rollos runterfährt, ich aber das Tageslicht von außen dennoch will, das runterfahren stoppe oder das Rollo wieder ganz hoch fahre. Beim nächsten Verändern des Sonnenwinkels (z.B.) wird die Rule wieder getriggert und er würde wieder runterfahren. Daher die Reduktion auf den Tag.

Die Variablenbenennung ist vermutlich unglückllich. timeNow sollte eher datumHeute lauten o.ä. – dann wäre das vielleicht klar gewesen…

Br Peter

yes i have the same problem. where to put exactly this line in the rule?

if (now.isBefore((Sunset_Time.state as DateTimeType).zonedDateTime.toInstant().toEpochMilli) ||now.isAfter((Sunrise_Time.state as DateTimeType).zonedDateTime.toInstant().toEpochMilli))

Directly at the beginning of the rule.

But

if (now.isAfter((Sunrise_Time.state as DateTimeType).zonedDateTime.toInstant().toEpochMilli))

is enough.

this is the beginning of my rule:

var boolean log = true 

rule "Chiusura tapparelle frontali" 

if (now.isAfter((sunrise_time.state as DateTimeType).zonedDateTime.toInstant().toEpochMilli))

when Item Azimuth changed then
    val String logPrefix = 'Autotapparelle (Chiusura Tapparelle Frontali) - '
    if (log) logInfo('rules', logPrefix + 'Regola caricata!')

but i’ve the same problem: the rule is executed in the evening (i’ve set tu run at 310° of azimuth, so around 23.10), it runs, but at 00.00 of the night, the rule is executed again.
it’s strange because should not run “before sunrise” of the new day…:frowning:
i haven’t checked if the command is really dispatched to all my rollershutters, but i see from the log that last execution has run at 00.00 …
any idea?

EDIT: tried to set this way:

val BedTime = now.withTimeAtStartOfDay.plusDays(1)
    if (now.isAfter((sunrise_time.state as DateTimeType).zonedDateTime.toInstant().toEpochMilli) || now.isBefore((BedTime).zonedDateTime.toInstant().toEpochMilli))

should work?

Hi Dominik,

had the same thought, and implemented this little rule:

 rule "Reset Rollo-Automatik"
    when
        Item resetautomatik received command
    then
        rolloautomatik_start_last.state = NULL
        rolloautomatik_ende_last.state = NULL    
    end

and then this switch below the config in the sitemap:

 Switch item=resetautomatik mappings=[ON="Reset"] 
 Text item=rolloautomatik_start_last label="Letzter Start [%s]"

hop this helps,
bst regards,
Mark

Hi Peter,
thanks for sharing the scripts. Is there a specific reason that the rule is comparing item.states for Azimuth and Elevation against their specific strings?

I understand the rule computes an Integer from a string however the setpoints are number values already.
Or am I missing something?

At the same time I had lots of fiddling to get the setpoint numbers into a “non-decimal” state as apparently the rule wont work with decimals.

Why not simply compare Azimuth.state to Azimuth_setpoint.state?