maffi91 hat geschrieben: ↑2. Jun 2022 20:50
iCalendar-Binding installieren und dann eine things Datei erstellen mit
Beim Lesen dieses Post's bin ich neugierig geworden und hab mir das ICalender-Binding installiert und den Abfallkalender meines lokalen Entsorgungsunternehmens unter "openHAB-conf\html" als "abfall.ics" abgespeichert.
Dann habe ich eine "ical.things"-Datei angelegt und neben der Bridge noch die Filter-Things angelegt. Das Ganze geht zwar auch per UI, aber ich machs' gerne(r) "old school". Für die Abfrage des aktuellen und nächsten Termines/Namen sollte aber eigentlich die Bridge reichen. Bei den Eventfiltern habe beim "textValueType" als Wert "TEXT" genommen, da hier nicht eine genaue Übereinstimmung vorhanden sein muss.
ical.things:
Code: Alles auswählen
// ical - Binding - Abfall-Kallender
Bridge icalendar:calendar:abfallkalender "Abfallkalender" @ "RPI4" [ url="http://192.168.178.26:8080/static/abfall.ics", refreshTime=360 ]
Thing icalendar:eventfilter:waste "Restmüll" (icalendar:calendar:abfallkalender) [ maxEvents=1, refreshTime=720, datetimeUnit="WEEK", datetimeStart=0, datetimeEnd=3, datetimeRound=true,textEventField="DESCRIPTION", textEventValue="Restmüll", textValueType="TEXT" ]
Thing icalendar:eventfilter:bio "Biomüll" (icalendar:calendar:abfallkalender) [ maxEvents=1, refreshTime=720, datetimeUnit="WEEK", datetimeStart=0, datetimeEnd=3, datetimeRound=true,textEventField="DESCRIPTION", textEventValue="Bioabfall", textValueType="TEXT" ]
Thing icalendar:eventfilter:yellow "Gelber Sack" (icalendar:calendar:abfallkalender) [ maxEvents=1, refreshTime=720, datetimeUnit="WEEK", datetimeStart=0, datetimeEnd=5, datetimeRound=true,textEventField="DESCRIPTION", textEventValue="Gelber Sack", textValueType="TEXT" ]
Thing icalendar:eventfilter:paper "Blaue Tonne" (icalendar:calendar:abfallkalender) [ maxEvents=1, refreshTime=720, datetimeUnit="WEEK", datetimeStart=0, datetimeEnd=5, datetimeRound=true,textEventField="DESCRIPTION", textEventValue="Blaue Tonne", textValueType="TEXT" ]
Thing icalendar:eventfilter:garden "Gartentonne" (icalendar:calendar:abfallkalender) [ maxEvents=1, refreshTime=720, datetimeUnit="WEEK", datetimeStart=0, datetimeEnd=3, datetimeRound=true,textEventField="DESCRIPTION", textEventValue="Gartentonne", textValueType="TEXT" ]
Thing icalendar:eventfilter:problem "Problemstoffmobil" (icalendar:calendar:abfallkalender) [ maxEvents=1, refreshTime=720, datetimeUnit="WEEK", datetimeStart=0, datetimeEnd=12, datetimeRound=true,textEventField="DESCRIPTION", textEventValue="Problemstoffmobil", textValueType="TEXT" ]
Thing icalendar:eventfilter:wastepaper "Altpapier Vereine" (icalendar:calendar:abfallkalender) [ maxEvents=1, refreshTime=720, datetimeUnit="WEEK", datetimeStart=0, datetimeEnd=26, datetimeRound=true,textEventField="DESCRIPTION", textEventValue="Altpapiersammlung", textValueType="TEXT" ]
Thing icalendar:eventfilter:xmastree "Christbaumsammlung" (icalendar:calendar:abfallkalender) [ maxEvents=1, refreshTime=720, datetimeUnit="WEEK", datetimeStart=0, datetimeEnd=52, datetimeRound=true,textEventField="DESCRIPTION", textEventValue="Christbaumabfuhr", textValueType="TEXT" ]
Thing icalendar:eventfilter:greenwaste "Grünabfuhr" (icalendar:calendar:abfallkalender) [ maxEvents=1, refreshTime=720, datetimeUnit="WEEK", datetimeStart=0, datetimeEnd=52, datetimeRound=true,textEventField="DESCRIPTION", textEventValue="Grünabfuhr", textValueType="TEXT" ]
Dazu habe ich noch eine ical.items Datei angelegt. Die ist zwar noch nicht ganz fertig, da noch die Daten für das semantische Modell fehlen und auch sonst noch ein paar Einträge eingebaut werden müssen (z.B.: Patterns, Icons, zusätzl. Items, etc.)
ical.items:
Code: Alles auswählen
DateTime next_waste_appointment "nächste Abholung [%1$ta, %1$td.%1$tm.%1$ty]" <calendar> { channel="icalendar:calendar:abfallkalender:next_start" }
String next_waste_name "Abholung als naechstes [%s]" <calendar> { channel="icalendar:calendar:abfallkalender:next_title" }
DateTime garbage_Begin_waste "Restmüll Start [%1$ta, %1$td.%1$tm.%1$ty]" {channel="icalendar:eventfilter:waste:result_0#begin"}
DateTime garbage_End_waste "Restmüll Ende [%1$ta, %1$td.%1$tm.%1$ty]" {channel="icalendar:eventfilter:waste:result_0#end"}
String garbage_Title_waste "Restmüll Titel" {channel="icalendar:eventfilter:waste:result_0#title"}
DateTime garbage_Begin_bio "Bioabeutel Start [%1$ta, %1$td.%1$tm.%1$ty]" {channel="icalendar:eventfilter:bio:result_0#begin"}
DateTime garbage_End_bio "Bioabeutel Ende [%1$ta, %1$td.%1$tm.%1$ty]" {channel="icalendar:eventfilter:bio:result_0#end"}
String garbage_Title_bio "Bioabeutel Titel" {channel="icalendar:eventfilter:bio:result_0#title"}
DateTime garbage_Begin_paper "Blaue TonneStart [%1$ta, %1$td.%1$tm.%1$ty]" {channel="icalendar:eventfilter:paper:result_0#begin"}
DateTime garbage_End_paper "Blaue TonneEnde [%1$ta, %1$td.%1$tm.%1$ty]" {channel="icalendar:eventfilter:paper:result_0#end"}
String garbage_Title_paper "Blaue TonneTitel" {channel="icalendar:eventfilter:paper:result_0#title"}
DateTime garbage_Begin_garden "Gartentonne Start [%1$ta, %1$td.%1$tm.%1$ty]" {channel="icalendar:eventfilter:garden:result_0#begin"}
DateTime garbage_End_garden "Gartentonne Ende [%1$ta, %1$td.%1$tm.%1$ty]" {channel="icalendar:eventfilter:garden:result_0#end"}
String garbage_Title_garden "Gartentonne Titel" {channel="icalendar:eventfilter:garden:result_0#title"}
DateTime garbage_Begin_wastepaper "Altpapiersammlung Start [%1$ta, %1$td.%1$tm.%1$ty]" {channel="icalendar:eventfilter:wastepaper:result_0#begin"}
DateTime garbage_End_wastepaper "Altpapiersammlung Ende [%1$ta, %1$td.%1$tm.%1$ty]" {channel="icalendar:eventfilter:wastepaper:result_0#end"}
String garbage_Title_wastepaper "Altpapiersammlung Titel" {channel="icalendar:eventfilter:wastepaper:result_0#title"}
DateTime garbage_Begin_problem "Problemstoff-Mobil Start [%1$ta, %1$td.%1$tm.%1$ty]" {channel="icalendar:eventfilter:problem:result_0#begin"}
DateTime garbage_End_problem "Problemstoff-Mobil Ende [%1$ta, %1$td.%1$tm.%1$ty]" {channel="icalendar:eventfilter:problem:result_0#end"}
String garbage_Title_problem "Problemstoff-Mobil Titel" {channel="icalendar:eventfilter:problem:result_0#title"}
DateTime garbage_Begin_yellow "Gelber Sack Start [%1$ta, %1$td.%1$tm.%1$ty]" {channel="icalendar:eventfilter:yellow:result_0#begin"}
DateTime garbage_End_yellow "Gelber Sack Ende [%1$ta, %1$td.%1$tm.%1$ty]" {channel="icalendar:eventfilter:yellow:result_0#end"}
String garbage_Title_yellow "Gelber Sack Titel" {channel="icalendar:eventfilter:yellow:result_0#title"}
DateTime garbage_Begin_xmas "Weihnachtsbaum Start [%1$ta, %1$td.%1$tm.%1$ty]" {channel="icalendar:eventfilter:xmastree:result_0#begin"}
DateTime garbage_End_xmas "Weihnachtsbaum Ende [%1$ta, %1$td.%1$tm.%1$ty]" {channel="icalendar:eventfilter:xmastree:result_0#end"}
String garbage_Title_xmas "Weihnachtsbaum Titel" {channel="icalendar:eventfilter:xmastree:result_0#title"}
DateTime garbage_Begin_green "Grünabfuhr Start [%1$ta, %1$td.%1$tm.%1$ty]" {channel="icalendar:eventfilter:greenwaste:result_0#begin"}
DateTime garbage_End_green "Grünabfuhr Ende [%1$ta, %1$td.%1$tm.%1$ty]" {channel="icalendar:eventfilter:greenwaste:result_0#end"}
String garbage_Title_green "Grünabfuhr Titel" {channel="icalendar:eventfilter:greenwaste:result_0#title"}
Eine Regel dazu habe ich jetzt keine erstellt, aber das sollte eigentlich keine allzu grosse Hürde sein. Ich könnte mir vorstellen, dass es mit einem Cron-Trigger funktionieren sollte und die Bedingungen des Abfall-Termins mit dem Tagesdatum auf Gleichheit und ggf. Ungleichheit (Current Date + Next Date)
abgefragt könnten.
Gerade habe noch gesehen dass es wohl auch ein Switch-Item gibt.
Code: Alles auswählen
Switch AbfallkalenderCurrentPresence "Kalendereintrag vorhanden" {channel="icalendar:calendar:abfallkalender:current_presence"}
Dieses könnte man evtl. auch noch als Trigger benutzen. Ich habe aber noch nicht ausprobiert, wann sich der Schalter einschaltet.
Da ich mit der "OH2-Sitemap" nicht mehr so viel mache, habe ich mich mehr auf die Darstellung in den OH3-Pages konzentriert.
Dazu habe ich im internationalen Forum ein
tolles kleines Custom-Widget gefunden, dass ich noch etwas modifiziert habe. (In zwei Ausprägungen)
Custom-Widget 1:
Code: Alles auswählen
uid: garbage_calendar_v2
tags:
- https://community.openhab.org/t/garbage-collection/114871
- https://community.openhab.org/t/small-guide-to-icalendar/111430
props:
parameters:
- description: Title of the card
label: Title
name: title
required: false
type: TEXT
- description: Background of the card e.g. linear-gradient(to top left,#B0E0E6 20%,#1E90FF 30%,#FFC0CB 60%) or green, etc, also hex and rgb
label: Background
name: background1
required: false
type: TEXT
- description: The card footer
label: Footer
name: footer
required: false
type: TEXT
- description: Your local translation for tomorrow
label: Tomorrow translation
name: tomorrow
required: true
type: TEXT
- description: Your local translation for today
label: Today translation
name: today
required: true
type: TEXT
- description: Date items
label: Date items
name: datearray
required: false
type: TEXT
parameterGroups: []
timestamp: Jun 5, 2022, 7:04:23 PM
component: f7-card
config:
style:
background: '=(props.background1) ? props.background1 : "linear-gradient(to top left,#B0E0E6 20%,#1E90FF 30%,#FFC0CB 60%)"'
background-position: down
background-repeat: no-repeat
background-size: cover
border-radius: var(--f7-card-expandable-border-radius)
font-size: medium
height: auto
margin: 5px
noShadow: true
padding: 0px
title: =props.title
slots:
default:
- component: f7-card-content
slots:
default:
- component: f7-list
config:
mediaList: true
slots:
default:
- component: oh-repeater
config:
for: listitem
fragment: true
in: =props.datearray.split("|")
slots:
default:
- component: oh-list-item
config:
badge: '=((dayjs(items[loop.listitem.split("\"")[7]].state).diff(dayjs().startOf("day"), "days")) == 0 ? (props.today) : (dayjs(items[loop.listitem.split("\"")[7]].state).diff(dayjs().startOf("day"), "days")) == 1 ? (props.tomorrow) : false)'
badgeColor: '=((dayjs(items[loop.listitem.split("\"")[7]].state).diff(dayjs().startOf("day"), "days")) == 0 ? "red" : "yellow")'
footer: =items[loop.listitem.split("\"")[7]].displayState
icon: =loop.listitem.split("\"")[5]
iconColor: =loop.listitem.split("\"")[3]
title: =loop.listitem.split("\"")[1]
visible: '=items[loop.listitem.split("\"")[7]].state == "UNDEF" ? false : true'
- component: f7-card-footer
slots:
default:
- component: Label
config:
text: =props.footer
Custom-Widget 2:
Code: Alles auswählen
uid: garbage_calendar_color_v2
tags:
- https://community.openhab.org/t/garbage-collection/114871
- https://community.openhab.org/t/small-guide-to-icalendar/111430
props:
parameters:
- description: Title of the card
label: Title
name: title
required: false
type: TEXT
- description: Background of the card e.g. linear-gradient(to top left,#B0E0E6 20%,#1E90FF 30%,#FFC0CB 60%) or green, etc, also hex and rgb
label: Background
name: background1
required: false
type: TEXT
- description: The card footer
label: Footer
name: footer
required: false
type: TEXT
- description: Your local translation for tomorrow
label: Tomorrow translation
name: tomorrow
required: true
type: TEXT
- description: Your local translation for today
label: Today translation
name: today
required: true
type: TEXT
- description: Date items
label: Date items
name: datearray
required: false
type: TEXT
parameterGroups: []
timestamp: Jun 6, 2022, 9:23:12 PM
component: f7-card
config:
style:
background: '=(props.background1) ? props.background1 : "linear-gradient(to top left,#B0E0E6 20%,#1E90FF 30%,#FFC0CB 60%)"'
background-position: down
background-repeat: no-repeat
background-size: cover
border-radius: var(--f7-card-expandable-border-radius)
font-size: medium
height: auto
margin: 5px
noShadow: true
padding: 0px
title: =props.title
slots:
default:
- component: f7-card-content
slots:
default:
- component: f7-list
config:
mediaList: true
slots:
default:
- component: oh-repeater
config:
for: listitem
fragment: true
in: =props.datearray.split("|")
slots:
default:
- component: oh-list-item
config:
badge: '=((dayjs(items[loop.listitem.split("\"")[7]].state).diff(dayjs().startOf("day"), "days")) == 0 ? (props.today) : (dayjs(items[loop.listitem.split("\"")[7]].state).diff(dayjs().startOf("day"), "days")) == 1 ? (props.tomorrow) : false)'
badgeColor: '=((dayjs(items[loop.listitem.split("\"")[7]].state).diff(dayjs().startOf("day"), "days")) == 0 ? "red" : "yellow")'
icon: =loop.listitem.split("\"")[5]
iconColor: =loop.listitem.split("\"")[3]
style:
color: =loop.listitem.split("\"")[3]
font-size: 17px
margin: 0px
padding: 0px
title: =items[loop.listitem.split("\"")[7]].displayState + " - " + loop.listitem.split("\"")[1]
visible: '=items[loop.listitem.split("\"")[7]].state == "UNDEF" ? false : true'
- component: f7-card-footer
slots:
default:
- component: Label
config:
text: =props.footer
color: rgba(255,100,100, 1)
style:
fontSize: 18px
color: black
Yaml-Code Custom-Widget 1:
Code: Alles auswählen
component: widget:garbage_calendar_v2
config:
background1: linear-gradient(to top right,#6fa8dc 0%,#ffe74c 100%)
datearray: '"Bioabfall","orange","f7:trash","garbage_Begin_bio"|"Restmüll","purple","f7:trash","garbage_Begin_waste"|"Gelber Sack","yellow","f7:trash","garbage_Begin_yellow"|"Blaue Tonne","blue","f7:trash","garbage_Begin_paper"|"Gartentonne","teal","f7:trash","garbage_Begin_garden"|"Grünabfuhr","green","f7:car_fill","garbage_Begin_green"|"Altpapier Verein","lightblue","f7:trash","garbage_Begin_wastepaper"|"Problemstoff-Mobil","red","f7:trash","garbage_Begin_problem"|"Weihnachtsbaum","lime","f7:trash","garbage_Begin_xmas"'
footer: '="Nächste Leerung: " + ((dayjs(items.next_waste_appointment.state).diff(dayjs().startOf("day"),"days")) == 0 ? "Heute : " + items.next_waste_name.state :(dayjs(items.next_waste_appointment.state).diff(dayjs().startOf("day"),"days"))== 1 ? "Morgen : " + items.next_waste_name.state : "In " + (dayjs(items.next_waste_appointment.state).diff(dayjs().startOf("day"),"days")) + " Tagen : " + items.next_waste_name.state)'
title: Abfallkalender V2
today: Heute
tomorrow: Morgen
Yaml-Code Custom-Widget 2:
Code: Alles auswählen
component: widget:garbage_calendar_color_v2
config:
datearray: '"Bioabfall","orange","f7:trash","garbage_Begin_bio"|"Restmüll","purple","f7:trash","garbage_Begin_waste"|"Gelber Sack","yellow","f7:trash","garbage_Begin_yellow"|"Blaue Tonne","blue","f7:trash","garbage_Begin_paper"|"Gartentonne","teal","f7:trash","garbage_Begin_garden"|"Grünabfuhr","green","f7:car_fill","garbage_Begin_green"|"Altpapier Verein","lightblue","f7:trash","garbage_Begin_wastepaper"|"Problemstoff-Mobil","red","f7:trash","garbage_Begin_problem"|"Weihnachtsbaum","lime","f7:trash","garbage_Begin_xmas"'
title: Abfallkalender Color V2
today: Heute
tomorrow: Morgen
background1: radial-gradient(circle, rgba(238,86,153,1) 30%, rgba(148,187,233,1) 100%)
footer: '="Nächste Leerung: " + ((dayjs(items.next_waste_appointment.state).diff(dayjs().startOf("day"),"days")) == 0 ? "Heute : " + items.next_waste_name.state :(dayjs(items.next_waste_appointment.state).diff(dayjs().startOf("day"),"days"))== 1 ? "Morgen : " + items.next_waste_name.state : "In " + (dayjs(items.next_waste_appointment.state).diff(dayjs().startOf("day"),"days")) + " Tagen : " + items.next_waste_name.state)'
Die Yaml-Codes sind weitgehend gleich, bis auf die Hintergrundfarbe (background1). In dem Eingabe-Datenstring "Date items", befinden sich die Daten zu den korrespondierenden Bezeichnung, Farbe, Icon und Item, jeweils durch ein Pipe-Symbol getrennt.
Das Ergebnis sieht dann so aus:
abfall.jpg
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.