Widget rechnen

GUI Relevanten, PaperUI, BasicUI, HabPanel ...

Moderatoren: seppy, udo1toni

Antworten
galaxisspatz
Beiträge: 93
Registriert: 28. Jun 2020 19:42
Answers: 1

Widget rechnen

Beitrag von galaxisspatz »

Moin,
ich benötige einmal eure Hilfe bitte. Ich möchte folgendes Widget https://community.openhab.org/t/garbage ... n/114871/4als Anzeige für die Müllabholungen nutzen. Ich habe es für mich angepasst bekomme aber die Badge (heute/morgen) nicht hin. Ich bekomme immer nur ein "undefined"

es geht um diese beiden Zeilen.

Code: Alles auswählen

badge: '=((items.garbage_collection_restmuell.displayState == items.LokaleZeitDateTime.displayState) ? "Heute" : (items.garbage_collection_restmuell.displayState == LokaleZeitDateTime.plusDays(1).toString()) ? "Morgen" : false)'
                    badgeColor: '=((items.garbage_collection_restmuell.displayState == items.LokaleZeitDateTime.displayState) ? "red" : "yellow")'
Bild

Widget

Code: Alles auswählen

uid: garbage_cell_v4
tags: []
props:
  parameterGroups: []
timestamp: Aug 31, 2023, 10:13:13 PM
component: f7-card
config:
  title: ="Abfuhrtermine:"
slots:
  default:
    - component: f7-card-content
      slots:
        default:
          - component: f7-list
            config:
              mediaList: true
            slots:
              default:
                - component: oh-list-item
                  config:
                    badge: '=((items.garbage_collection_restmuell.displayState == items.LokaleZeitDateTime.displayState) ? "Heute" : (items.garbage_collection_restmuell.displayState == LokaleZeitDateTime.plusDays(1).toString()) ? "Morgen" : false)'
                    badgeColor: '=((items.garbage_collection_restmuell.displayState == items.LokaleZeitDateTime.displayState) ? "red" : "yellow")'
                    footer: =items.garbage_collection_restmuell.displayState
                    icon: f7:trash
                    iconColor: black
                    title: Restmüll
                    visible: '=items.garbage_collection_restmuell.state == "UNDEF" ? false : true'
                - component: oh-list-item
                  config:
                    badge: '=((items.garbage_collection_bioabfall.displayState == items.LokaleZeitDateTime.displayState) ? "Heute" : (items.garbage_collection_bioabfall.displayState == LokaleZeitDateTime.plusDays(1).toString()) ? "Morgen" : false)'
                    badgeColor: '=((items.garbage_collection_bioabfall.displayState == items.local_dateweekday.displayState) ? "red" : "yellow")'
                    footer: =items.garbage_collection_bioabfall.displayState
                    icon: f7:trash
                    iconColor: teal
                    title: Bioabfall
                    visible: '=items.garbage_collection_bioabfall.state == "UNDEF" ? false : true'
                - component: oh-list-item
                  config:
                    badge: '=((items.garbage_collection_gelb.displayState == items.LokaleZeitDateTime.displayState) ? "Heute" : (items.garbage_collection_gelb.displayState == LokaleZeitDateTime.plusDays(1).toString()) ? "Morgen" : false)'
                    badgeColor: '=((items.garbage_collection_gelb.displayState == items.LokaleZeitDateTime.displayState) ? "red" : "yellow")'
                    footer: =items.garbage_collection_gelb.displayState
                    icon: f7:trash
                    iconColor: yellow
                    title: Gelbe Tonne
                    visible: '=items.garbage_collection_gelb.state == "UNDEF" ? false : true'
                - component: oh-list-item
                  config:
                    badge: '=((items.garbage_collection_papier.displayState == items.LokaleZeitDateTime.displayState) ? "Heute" : (items.garbage_collection_papier.displayState == LokaleZeitDateTime.plusDays(1).toString()) ? "Morgen" : false)'
                    badgeColor: '=((items.garbage_collection_papier.displayState == items.LokaleZeitDateTime.displayState) ? "red" : "yellow")'
                    footer: =items.garbage_collection_papier.displayState
                    icon: f7:trash
                    iconColor: blue
                    title: Papier Tonne
                    visible: '=items.garbage_collection_papier.state == "UNDEF" ? false : true'
                - component: oh-list-item
                  config:
                    badge: '=((items.garbage_collection_christmas.displayState == items.local_dateweekday.displayState) ? "Heute" : (items.garbage_collection_christmas.displayState == LokaleZeitDateTime.plusDays(1).toString()) ? "Morgen" : false)'
                    badgeColor: '=((items.garbage_collection_christmas.displayState == items.LokaleZeitDateTime.displayState) ? "red" : "yellow")'
                    footer: =items.garbage_collection_christmas.displayState
                    icon: f7:trash
                    iconColor: green
                    title: Weihnachtsbäume
                    visible: '=items.garbage_collection_christmas.state == "UNDEF" ? false : true'
    - component: f7-card-footer
      slots:
        default:
          - component: Label
            config:
              text: '="Nächste Abholung: " + items.garbage_collection_titel.state + " " + items.garbage_collection.displayState'
Items
Datun heute

Code: Alles auswählen

DateTime   LokaleZeitDateTime   "Datum und zeit jetzt [%1$td.%1$tm.%1$tY]"   {channel="ntp:ntp:local:dateTime"}
Kalendar Eintrag

Code: Alles auswählen

DateTime   garbage_collection_restmuell   "Start [%1$td.%1$tm.%1$tY]"  (itemInGroup) {channel="icalendar:eventfilter:36df030a24:2f9ff51343:result_0#begin"}
von galaxisspatz » 2. Sep 2023 22:53
Moin,
ich habe die Lösung gefunden. Wenn jemand einen besseren Weg kennt, nur her damit.

Ich habe ein zweites Item angelegt

Code: Alles auswählen

DateTime   LokaleZeitDateTimeMorgen "Datum und zeit Morgen [%1$td.%1$tm.%1$tY]"
und die Berechnung in eine rule verschoben.

Code: Alles auswählen

rule "Mitternachts-Trigger Morgen"
when
    Time cron "0 0 0 * * ?" // Dieser Cron entspricht Mitternacht
then

    LokaleZeitDateTimeMorgen.postUpdate(now.plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(0).toLocalDateTime.toString()) 
    
end
und dann wird das neie Item im Widget verglichen

Code: Alles auswählen

badge: '=((items.garbage_collection_restmuell.displayState == items.LokaleZeitDateTime.displayState) ? "heute" : (items.garbage_collection_restmuell.displayState == items.LokaleZeitDateTimeMorgen.displayState) ? "morgen" : false)'
                    badgeColor: '=((items.garbage_collection_restmuell.displayState == items.LokaleZeitDateTime.displayState) ? "red" : "yellow")'
Gruß
Olaf
Gehe zur vollständigen Antwort
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
OH 4 auf dem Raspberry 3b

galaxisspatz
Beiträge: 93
Registriert: 28. Jun 2020 19:42
Answers: 1

Re: Widget rechnen

Beitrag von galaxisspatz »

Moin,
ich habe die Lösung gefunden. Wenn jemand einen besseren Weg kennt, nur her damit.

Ich habe ein zweites Item angelegt

Code: Alles auswählen

DateTime   LokaleZeitDateTimeMorgen "Datum und zeit Morgen [%1$td.%1$tm.%1$tY]"
und die Berechnung in eine rule verschoben.

Code: Alles auswählen

rule "Mitternachts-Trigger Morgen"
when
    Time cron "0 0 0 * * ?" // Dieser Cron entspricht Mitternacht
then

    LokaleZeitDateTimeMorgen.postUpdate(now.plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(0).toLocalDateTime.toString()) 
    
end
und dann wird das neie Item im Widget verglichen

Code: Alles auswählen

badge: '=((items.garbage_collection_restmuell.displayState == items.LokaleZeitDateTime.displayState) ? "heute" : (items.garbage_collection_restmuell.displayState == items.LokaleZeitDateTimeMorgen.displayState) ? "morgen" : false)'
                    badgeColor: '=((items.garbage_collection_restmuell.displayState == items.LokaleZeitDateTime.displayState) ? "red" : "yellow")'
Gruß
Olaf
OH 4 auf dem Raspberry 3b

Benutzeravatar
peter-pan
Beiträge: 2573
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

Re: Widget rechnen

Beitrag von peter-pan »

Ich denke, dass das so nicht funktioniert, als der Vergleich der Datumsangaben, da diese, wenn überhaupt, gerade mal nachts um 0:00 Uhr gleich sein dürften. Ich denke mal, dass der Entwickler die Items "local_dateweekday" und "local_dateweekday_tomorrow" nach diesem Schema (Tag mit Uhrzeit 0:00) selbst erzeugt hat, z.B. mit einer Regel.

Ich habe selbst dieses Widget, in einer etwas abgewandelten Form im Einsatz.
So wie ich den Code verstehe, wird da der jeweilige Abfuhrtermin, das ist der der Termin des jeweiligen Tages (ohne bzw. mit Uhrzeit 0:00) mit dem aktuellen Tagesdatum (um 0:00 Uhr) verglichen bzw. die Differenz ermittelt.

Hier der Code des Widgets:

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: Jul 9, 2022, 8:08:03 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:
              color: rgba(255,100,100, 1)
              style:
                color: black
                fontSize: 16px
              text: =props.footer
und hier der Code der Configuration:

Code: Alles auswählen

component: widget:garbage_calendar_color_v2
config:
  background1: "radial-gradient(circle, lightgreen, yellow,#20B2AA 20%, #6fa8dc 60% ,#ffe74c 95%)"
  datearray: '"Bioabfall","orange","f7:trash","garbage_bio_Begin"|"Restmüll","purple","f7:trash","garbage_waste_Begin"|"Gelber  Sack","yellow","f7:trash","garbage_yellow_Begin"|"Blaue Tonne","blue","f7:trash","garbage_paper_Begin"|"Gartentonne","teal","f7:trash","garbage_garden_Begin"|"Grünabfuhr","green","f7:car_fill","garbage_green_Begin"|"Altpapier     Verein","lightblue","f7:trash","garbage_wastepaper_Begin"|"Problemstoff-Mobil","red","f7:trash","garbage_problem_Begin"|"Weihnachtsbaum","lime","f7:trash","garbage_xmas_Begin"'
  footer: '="Nächster Termin: " + ((dayjs(items.garbage_nextwaste_Begin.state).diff(dayjs().startOf("day"),"days")) == 0 ? "Heute : " + items.garbage_nextwaste_Title.state :(dayjs(items.garbage_nextwaste_Begin.state).diff(dayjs().startOf("day"),"days"))== 1 ? "Morgen : " + items.garbage_nextwaste_Title.state : "In " + (dayjs(items.garbage_nextwaste_Begin.state).diff(dayjs().startOf("day"),"days")) + " Tagen : " + items.garbage_nextwaste_Title.state)'
  title: Abfallkalender
  today: Heute
  tomorrow: Morgen
In dem Daten-Array musst du nur deine Itemnamen anpassen. Das wäre dann z,B. dein "garbage_collection_restmuell" würde mein "garbage_waste_Begin" ersetzen.

Oder wie gesagt, du musst das jeweilige Tagesdatum (heute/morgen) an die "Schreibweise"(Status intern z.B.: 2023-09-04T00:00:00.000+0200) der jeweiligen Items anpassen. Das müsste ich aber selbst auch erst heraus tüfteln. Vielleicht hat ja ein Mitglied das schon gemacht.

Das sieht dann so aus:
abfall.jpg

Edit: Da hat sich mein Beispiel wohl mit deiner eigenen Lösung übrschnitten.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian

galaxisspatz
Beiträge: 93
Registriert: 28. Jun 2020 19:42
Answers: 1

Re: Widget rechnen

Beitrag von galaxisspatz »

Hallo peter-pan,
danke für deine Version.
Es wird bei mir der ".displayState" verglichen und der ist sowohl bei den Daten aus dem Kalendar als auch bei Heute und Heute+1Tag jeweils %1$td.%1$tm.%1$tY. damit geht es dann.

Gruß
Olaf
OH 4 auf dem Raspberry 3b

Benutzeravatar
peter-pan
Beiträge: 2573
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

Re: Widget rechnen

Beitrag von peter-pan »

Du hast das schon richtig gemacht, indem du das Vergleichsdatum (Heute/Morgen) mit einer Regel ermittelt hast, welche das Datum ohne Uhrzeit bzw. mit Uhrzeit 0 ermittelt, damit der Vergleich mit dem jeweiligen Abfuhrtermin passt.

In meinem Widget wird das über die Funktion "dayjs" erledigt. Die macht aber im Prinzip auch nichts anderes, wie deine Regel.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian

Antworten