Skriptausführung OH3

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

SaschaQ
Beiträge: 202
Registriert: 2. Mär 2020 13:50
Answers: 0

Skriptausführung OH3

Beitrag von SaschaQ »

Hallo zusammen,

ich habe 3 Skripte in OpenHab 3 eingebunden zur Bestimmung von Feiertagen und Schulferien.

Die script Dateien sind wie in OH2 eingebunden, werden aber in der GUI von OH3 nicht angezeigt. Auch die Erweiterung mit einem weiteren ".script" hat nicht geholfen.

Die Rules zur Ausführung der Skripte schauen so aus:

Code: Alles auswählen


rule "Feiertag und Ferien Skript aufrufen jede 3 Stunden"
when
  Time cron "0 0 0/3 ? * * *"
then

    callScript("feiertage")
    callScript("ferien")

end



Ich habe auch bei den Rules versucht mit ".script" zu arbeiten, was aber auch nicht funktioniert hat.

Jemand eine Idee?

Benutzeravatar
udo1toni
Beiträge: 15269
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: Skriptausführung OH3

Beitrag von udo1toni »

1. Wo hast Du die Scripte abgelegt?
2. Warum berechnest Du Feiertag und Ferien mehrfach am Tag?
3. Du könntest den Script Code ebenso gut auch direkt in die Rule schreiben, ein Script in dieser Form ist nur ausgelagerter Rules-Code.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

SaschaQ
Beiträge: 202
Registriert: 2. Mär 2020 13:50
Answers: 0

Re: Skriptausführung OH3

Beitrag von SaschaQ »

Hi Udo,

unter

etc/openhab/scripts

Normalerweise müssen die doch erkannt werden oder?

SaschaQ
Beiträge: 202
Registriert: 2. Mär 2020 13:50
Answers: 0

Re: Skriptausführung OH3

Beitrag von SaschaQ »

Es liegt wohl am Skript:

1. org.joda.time.DateTime cannot be resolved to a type.; line 23, column 610, length 22

2. org.joda.time.DateTime cannot be resolved to a type.; line 24, column 682, length 22

3. Type mismatch: cannot convert from int to String; line 24, column 786, length 2

4. Type mismatch: cannot convert from String to long; line 24, column 747, length 42

Was muss ich anpassen?

Code: Alles auswählen


/************************************************** Feiertag Script ********************************************/

//--> Skript zur Bestimmung der Feiertage in NRW

var int year = now.getYear

var int a = year % 19
var int b = year / 100
var int c = year % 100
var int d = b / 4
var int e = b % 4
var int f = (b + 8) / 25
var int g = (b - f + 1) / 3
var int h = (19 * a + b - d - g + 15) % 30
var int i = c / 4
var int k = c % 4
var int L = (32 + 2 * e + 2 * i - h - k) % 7
var int m = (a + 11 * h + 22 * L) / 451

var int month = (h + L - 7 * m + 114) / 31
var int day = ((h + L - 7 * m + 114) % 31) + 1

var org.joda.time.DateTime easterSunday = parse(year+"-"+month+"-"+day)
var org.joda.time.DateTime stAdvent = parse(year+"-12-25").minusDays(((parse(year+"-12-25").getDayOfWeek) + 21))
var int dayOfYear = now.getDayOfYear

logInfo("Holiday-Script", "Heute ist Tag "+dayOfYear+" von "+year)
logInfo("Holiday-Script", "Ostersonntag ist: "+easterSunday)

// Feiertag 
var boolean holiday = false
var String holidayName = null

// bundesweiter Feiertag
if (dayOfYear==parse(year+"-01-01").getDayOfYear) {
    holidayName = "new_years_day" // Neujahr
    holiday = true
}
// Baden-Württemberg, Bayern, Sachsen-Anhalt
else if (dayOfYear==parse(year+"-01-06").getDayOfYear) {
    holidayName = "holy_trinity"// Heilige 3 Könige
    holiday = false 
}
// Carnival ;-)
else if (dayOfYear==easterSunday.getDayOfYear-48) {
    holidayName = "carnival_monday" // Rosenmontag
    holiday = false
}
// bundesweiter Feiertag
else if (dayOfYear==easterSunday.getDayOfYear-2) {
    holidayName = "good_friday" // Karfreitag
    holiday = true
}
// Brandenburg
else if (dayOfYear==easterSunday.getDayOfYear) {
    holidayName = "easter_sunday" // Ostersonntag
    holiday = false
}
// bundesweiter Feiertag
else if (dayOfYear==easterSunday.getDayOfYear+1) {
    holidayName = "easter_monday" // Ostermontag
    holiday = true
}
// bundesweiter Feiertag
else if (dayOfYear==parse(year+"-05-01").getDayOfYear) {
    holidayName = "1st_may"// Tag der Arbeit
    holiday = true 
}
// bundesweiter Feiertag
else if (dayOfYear==easterSunday.getDayOfYear+39) {
    holidayName = "ascension_day" // Christi Himmelfahrt
    holiday = true
}
// Brandenburg
else if (dayOfYear==easterSunday.getDayOfYear+49) {
    holidayName = "whit_sunday" // Pfingstsonntag
    holiday = false
}
// bundesweiter Feiertag
else if (dayOfYear==easterSunday.getDayOfYear+50) {
    holidayName = "whit_monday" // Pfingstmontag
    holiday = true
}
// Baden-Württemberg, Bayern, Hessen, NRW, Rheinland-Pfalz, Saarland sowie regional in Sachsen, Thüringen
else if (dayOfYear==easterSunday.getDayOfYear+60) {
    holidayName = "corpus_christi" // Frohnleichnahm
    holiday = true
}
// Saarland sowie regional in Bayern
else if (dayOfYear==parse(year+"-08-15").getDayOfYear) {
    holidayName = "assumption_day" // Mariä Himmelfahrt
    holiday = false
}
// bundesweiter Feiertag
else if (dayOfYear==parse(year+"-10-03").getDayOfYear) {
    holidayName = "reunification" // Tag der deutschen Einheit
    holiday = true
}
// Brandenburg, Mecklenburg-Vorpommern, Sachsen, Sachsen-Anhalt, Thüringen
else if (dayOfYear==parse(year+"-10-31").getDayOfYear) {
    holidayName = "reformation_day" // Reformationstag
    holiday = false
}
// Baden-Württemberg, Bayern, NRW, Rheinland-Pfalz, Saarland
else if (dayOfYear==parse(year+"-11-01").getDayOfYear) {
    holidayName = "all_saints_day" // Allerheiligen
    holiday = true
}
// religiöser Tag
else if (dayOfYear==stAdvent.getDayOfYear-14) {
    holidayName = "remembrance_day" // Volkstrauertag
    holiday = false
}
// religiöser Tag
else if (dayOfYear==stAdvent.getDayOfYear-7) {
    holidayName = "sunday_in_commemoration_of_the_dead" // Totensonntag
    holiday = false
}
// Sachsen
else if (dayOfYear==stAdvent.getDayOfYear-11) {
    holidayName = "day_of_repentance" // Buß- und Bettag
    holiday = false
}
// kann auch der 4te Advent sein
else if (dayOfYear==parse(year+"-12-24").getDayOfYear) {
    holidayName = "christmas_eve" // Heiligabend
    holiday = true
}
// bundesweiter Feiertag
else if (dayOfYear==parse(year+"-12-25").getDayOfYear) {
    holidayName = "1st_christmas_day" // 1. Weihnachtstag
    holiday = true
}
// bundesweiter Feiertag
else if (dayOfYear==parse(year+"-12-26").getDayOfYear) {
    holidayName = "2nd_christmas_day" // 2. Weihnachtstag
    holiday = true
}
// Silvester
else if (dayOfYear==parse(year+"-12-31").getDayOfYear) {
    holidayName = "new_years_eve" // Silvester
    holiday = true
}
else {
    holidayName = "no_holiday" // Kein Feiertag
    holiday = false  
}

// Name Feiertag setzen
if (holidayName!==null) {
    logInfo("Holiday-Script", "Feiertag: "+holidayName) 
    postUpdate(feiertag_name,holidayName)
}
else {
    postUpdate(feiertag_name,"no_holiday")
}

// Schalter Feiertag setzen
if (holiday) {
    logInfo("Holiday-Script", "Heute ist EIN Feiertag!")
    sendCommand(feiertag,ON)
}
else {
    logInfo("Holiday-Script", "Heute ist KEIN Feiertag!")
    sendCommand(feiertag,OFF)
}


SaschaQ
Beiträge: 202
Registriert: 2. Mär 2020 13:50
Answers: 0

Re: Skriptausführung OH3

Beitrag von SaschaQ »

Und bei diesem:

1. The method or field beforeNow is undefined for the type ZonedDateTime; line 9, column 276, length 9

2. The method or field afterNow is undefined for the type ZonedDateTime; line 9, column 309, length 8

3. The method or field beforeNow is undefined for the type ZonedDateTime; line 10, column 345, length 9

4. The method or field afterNow is undefined for the type ZonedDateTime; line 10, column 378, length 8

5. The method or field beforeNow is undefined for the type ZonedDateTime; line 11, column 414, length 9

6. The method or field afterNow is undefined for the type ZonedDateTime; line 11, column 447, length 8

7. The method or field beforeNow is undefined for the type ZonedDateTime; line 12, column 483, length 9

8. The method or field afterNow is undefined for the type ZonedDateTime; line 12, column 516, length 8

9. The method or field beforeNow is undefined for the type ZonedDateTime; line 13, column 552, length 9

10. The method or field afterNow is undefined for the type ZonedDateTime; line 13, column 585, length 8

11. The method or field beforeNow is undefined for the type ZonedDateTime; line 21, column 732, length 9

12. The method or field afterNow is undefined for the type ZonedDateTime; line 21, column 765, length 8

13. The method or field beforeNow is undefined for the type ZonedDateTime; line 22, column 801, length 9

14. The method or field afterNow is undefined for the type ZonedDateTime; line 22, column 834, length 8

15. The method or field beforeNow is undefined for the type ZonedDateTime; line 23, column 870, length 9

16. The method or field afterNow is undefined for the type ZonedDateTime; line 23, column 903, length 8

17. The method or field beforeNow is undefined for the type ZonedDateTime; line 24, column 939, length 9

18. The method or field afterNow is undefined for the type ZonedDateTime; line 24, column 972, length 8

19. The method or field beforeNow is undefined for the type ZonedDateTime; line 25, column 1008, length 9

20. The method or field afterNow is undefined for the type ZonedDateTime; line 25, column 1041, length 8

21. The method or field beforeNow is undefined for the type ZonedDateTime; line 33, column 1189, length 9

22. The method or field afterNow is undefined for the type ZonedDateTime; line 33, column 1222, length 8

23. The method or field beforeNow is undefined for the type ZonedDateTime; line 34, column 1258, length 9

24. The method or field afterNow is undefined for the type ZonedDateTime; line 34, column 1291, length 8

25. The method or field beforeNow is undefined for the type ZonedDateTime; line 35, column 1327, length 9

26. The method or field afterNow is undefined for the type ZonedDateTime; line 35, column 1360, length 8

27. The method or field beforeNow is undefined for the type ZonedDateTime; line 36, column 1396, length 9

28. The method or field afterNow is undefined for the type ZonedDateTime; line 36, column 1429, length 8

29. The method or field beforeNow is undefined for the type ZonedDateTime; line 44, column 1581, length 9

30. The method or field afterNow is undefined for the type ZonedDateTime; line 44, column 1614, length 8

31. The method or field beforeNow is undefined for the type ZonedDateTime; line 45, column 1650, length 9

32. The method or field afterNow is undefined for the type ZonedDateTime; line 45, column 1683, length 8

33. The method or field beforeNow is undefined for the type ZonedDateTime; line 46, column 1719, length 9

34. The method or field afterNow is undefined for the type ZonedDateTime; line 46, column 1752, length 8

35. The method or field beforeNow is undefined for the type ZonedDateTime; line 47, column 1788, length 9

36. The method or field afterNow is undefined for the type ZonedDateTime; line 47, column 1821, length 8

Code: Alles auswählen


  /************************************************** Ferien Script ********************************************/

//--> Ferienskript zur Bestimmung der Schulferien

var boolean holiday = false
  var String holidayName = null
    // Osterferien
  if (
     (parse("2020-04-06").beforeNow && parse("2020-04-18").afterNow)
  || (parse("2021-03-29").beforeNow && parse("2021-04-10").afterNow)
  || (parse("2022-04-11").beforeNow && parse("2022-04-23").afterNow)
  || (parse("2023-04-03").beforeNow && parse("2023-04-15").afterNow)
  || (parse("2024-03-25").beforeNow && parse("2024-04-06").afterNow)

  ) {
      holidayName = "easter_holiday" // Osterferien
      holiday = true
  }
    // Sommerferien
  if (
     (parse("2020-06-29").beforeNow && parse("2020-08-11").afterNow)
  || (parse("2021-07-05").beforeNow && parse("2021-08-17").afterNow)
  || (parse("2022-06-27").beforeNow && parse("2022-08-09").afterNow)
  || (parse("2023-06-22").beforeNow && parse("2023-08-04").afterNow)
  || (parse("2024-07-08").beforeNow && parse("2024-08-20").afterNow)

  ) {
      holidayName = "summer_holiday" // Sommerferien
      holiday = true
  }
    // Herbstferien
  if (
     (parse("2020-10-12").beforeNow && parse("2020-10-24").afterNow)
  || (parse("2021-10-11").beforeNow && parse("2021-10-23").afterNow)
  || (parse("2022-10-04").beforeNow && parse("2022-10-15").afterNow)
  || (parse("2023-10-02").beforeNow && parse("2023-10-14").afterNow)

  ) {
      holidayName = "autumn_holiday" // Herbstferien
      holiday = true
  }
    // Weihnachtsferien
  if (
     (parse("2019-12-23").beforeNow && parse("2020-01-06").afterNow)
  || (parse("2020-12-24").beforeNow && parse("2021-01-08").afterNow)
  || (parse("2021-12-23").beforeNow && parse("2022-01-06").afterNow)
  || (parse("2022-12-21").beforeNow && parse("2023-01-05").afterNow)
  ) {
      holidayName = "christmas_holiday" // Weihnatsferien
      holiday = true
  }
    HoliDayName.postUpdate(if (holidayName!==null) holidayName else "")
    Holidays.sendCommand(if (holiday) ON else OFF)


Benutzeravatar
udo1toni
Beiträge: 15269
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: Skriptausführung OH3

Beitrag von udo1toni »

Genau.

Im Zweifel wird das Script schon noch irgendwie zum Laufen zu bewegen sein, indem man alle Bezüge auf JodaTime zu JavaTime umbaut.
In openHAB macht man die Berechnung allerdings inzwischen eigentlich mit Ephemeris.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Skriptausführung OH3

Beitrag von int5749 »

SaschaQ hat geschrieben: 5. Mär 2021 13:09 Es liegt wohl am Skript:
Leider ja. Ich habe dies Script damals (noch zu Zeiten von Mr.House ;) ) mit den ganzen Feiertagen angepasst und im Forum agelegt.
Bis OH2.x lief dies auch bei mir immer mit (Never change a running System/Process)

Unter OH2 gab es aber auch noch einige mehr Probleme mit Ephemeris, habe da schon etwas mit experimentiert gahbt.

Jetzt, unter OH3
udo1toni hat geschrieben: 5. Mär 2021 13:27 In openHAB macht man die Berechnung allerdings inzwischen eigentlich mit Ephemeris.
stimme ich Udo hier zu. Daher nutze ich auch nicht mehr das Script, sondern unter OH3 bereits Ephemeris.

Lediglich mit privaten - zusätzlichen - "Feiertagen" und deren Namensauflösung hakt es noch. Wenn man aber auf die Darstellung des Names zunächst verzichten kann, läuft Ephemeris bei mir bisher sehr gut.

Dies bringt dann neben Feiertagen noch weitere Benefits: "isWeekday" "isWeekend", uvm.

Viele Grüße
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

SaschaQ
Beiträge: 202
Registriert: 2. Mär 2020 13:50
Answers: 0

Re: Skriptausführung OH3

Beitrag von SaschaQ »

Ich habe zwei items und möchte diese gerne jwweils auf AN setzen wenn ein Feiertag oder Ferien in NRW ist

Die Ephermesis habe ich eingerichtet.

Wie müssen die Items denn dann aussehen?

Kann das aus der Doku nicht richtig erkennen.

Den Namen der Ferien oder des Feiertages kann man nicht in ein Item bekommen?

Danke

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Skriptausführung OH3

Beitrag von int5749 »

SaschaQ hat geschrieben: 7. Mär 2021 10:15 Ich habe zwei items und möchte diese gerne jwweils auf AN setzen wenn ein Feiertag oder Ferien in NRW ist

Die Ephermesis habe ich eingerichtet.
Ich habe mir das noch einmal genauer angeschaut:
Feiertage und diverse andere Funktionen gehen gut mit Ephermesis und z.B. auch "Spezialtage" wie Geburtstage. Diese Tage müssten dann aber separat in einer XML gepflegt werden. Für statische Tage ist das sicher OK, aber bewegliche Tage wie Ferienzeiten sind da - aus meiner Sicht - eher ungeeignet.

Hier würde ich da auf das iCalennder Binding wechseln und eine URL von Schulferien.org hinterlegen. Dies müsstest Du dann zu Ende/Anfang eines Jahres aktualisieren. Somit würde auch hier das pflegen der entsprechenden Datei entfallen, der Aufwand reduziert.

Ein Beispiel für NRW, kopiert aus dem Sample
Thing

Code: Alles auswählen

Bridge icalendar:calendar:deadbeef    "My calendar" @ "Internet" [ url="https://www.schulferien.org/media/ical/deutschland/ferien_nordrhein-westfalen_2021.ics?k=piRzupfmAvuBLID7gpCiLKvxkQVcWwpgY30Fnt7WzVpNtt-Jl68r2UPZBYqsdUxNdSuKN6naK7RZBlZLSMCddXpEE9_MI4ux4jjDX9T6Sqk", refreshTime=60 ]
Thing  icalendar:eventfilter:feedd0d0 "Tomorrows events" (icalendar:calendar:deadbeef) [ maxEvents=1, datetimeUnit="DAY", datetimeStart=1, datetimeEnd=2, datetimeRound=true ]
Items

Code: Alles auswählen

String   current_event_name        "current event [%s]"                       <calendar> { channel="icalendar:calendar:deadbeef:current_title" }
DateTime current_event_until       "current until [%1$tT, %1$tY-%1$tm-%1$td]" <calendar> { channel="icalendar:calendar:deadbeef:current_end" }
String   next_event_name           "next event [%s]"                          <calendar> { channel="icalendar:calendar:deadbeef:next_title" }
DateTime next_event_at             "next at [%1$tT, %1$tY-%1$tm-%1$td]"       <calendar> { channel="icalendar:calendar:deadbeef:next_start" }
String   first_event_name_tomorrow "first event [%s]"                         <calendar> { channel="icalendar:eventfilter:feedd0d0:result_0#title" }
DateTime first_event_at_tomorrow   "first at [%1$tT, %1$tY-%1$tm-%1$td]"      <calendar> { channel="icalendar:eventfilter:feedd0d0:result_0#begin" }
Ergebnis
icalevent.JPG
SaschaQ hat geschrieben: 7. Mär 2021 10:15 Ich habe zwei items und möchte diese gerne jwweils auf AN setzen wenn ein Feiertag oder Ferien in NRW ist
Manchmal kann ja auch ein Ferientag ein Feiertag sein, wenn Du dann unterschiedliche Aktionen ausführen möchtest, welches hat denn Vorrang???
Ansonsten könnte man 1 Item über die entsprechende Reihenfolge setzen.
If Ferien => On
elseIf Holiday => On
else => Off


PPPPS: iCal würde auch für Feiertage funktionieren, aber da würde ich bei Ephermesis bleiben, da keine URL zu pflegen ist und man weitere Vorteile hat.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

SaschaQ
Beiträge: 202
Registriert: 2. Mär 2020 13:50
Answers: 0

Re: Skriptausführung OH3

Beitrag von SaschaQ »

Könnte man das Skript oben auch theoretisch wieder an OH 3 anpassen?

Es sind ja scheinbar nur die after Now Befehle

Ich finde es halt sehr lästig bei den Ferien den Kalender immer anpassen zu müssen und zusätlich muss ich ja auch bei den Terminen im Kalender dann die Befehle hinterlegen.

Bei den Feiertagen würde mich eben interessieren wie ich die Ephermesis anwende indem ich bei einem Feiertag ein Item auf an schalte und den Namen des Feiertages in ein String Item hinterlege.

Das würde mir für die Feiertage schon reichen.

Ich fände es klasse wenn jemand das Holiday Script umbauen könnte, sodass es unter OH3 wieder läuft.
Zuletzt geändert von SaschaQ am 7. Mär 2021 20:34, insgesamt 1-mal geändert.

Antworten