Ecoharmonogram i waste_collection_schedule

Dodałem Waste Collection Schedule - "niestandardowy komponent Home Assistant, który pobiera harmonogramy odbioru odpadów od wielu usługodawców.

Ale niezależnie co wpiszę w konfiguracji, to do kalendarza przechodzi tylko termin płatności

waste_collection_schedule:
  sources:
    - name: ecoharmonogram_pl
      args:
        town: Dąbrówka
        street: Fosowa
        district: Dopiewo
        house_number: 0
        additional_sides_matcher: ZABUDOWA JEDNORODZINNA

Co ciekawe jak w pliku
/config/custom_components/waste_collection_schedule/waste_collection_schedule/service/EcoHarmonogramPL.py
zamiast schedulePeriodId wpisałem konkretny ID to zadziałało

def fetch_streets(sp, town, street, house_number):
        payload = {'streetName': str(street), 'number': str(house_number), 'townId':town.get("id"),'schedulePeriodId': '4333'}

Tylko obawiam się że do pierwszej aktualizacji a wtedy na 100% nie będę już pamiętał jak to zrobiłem.
Wygląda na to że ecoharmonogram dla mojej wsi rzuca kilka rodzajów zdarzeń w tym samym czasie i płatności są osobno, możliwe że pobiera tylko pierwszy lub ostatni wpis

Macie jakiś pomysł jak to ogarnąć?

To cytat z tamtego wątku, jak sądzę założonego przez autora polskiego dostosowania tego komponentu.

Pamiętaj że jest koniec roku i same firmy przewozowe nie mają ułożonego harmonogramu na kolejny rok. Pojawi się pewnie po nowym roku. Ja tak mam od paru dni (termin nieznany)i wywala tylko termin płatności.
Wiem że nie powinno mieć znaczenia ale wpisz “additional_sides_matcher: Zabudowa jednorodzinna”. Ja mam tak dokładnie jak w aplikacji/ wykazie i śmiga bez problemu. Nie posiadam też wpisu odnośnie nr budynku.

1 polubienie

Zgłosiłem ten problem do autora integracji z ecoharmonogram, ale sprowadza się on do tego, że jest założenie jednego harmonogramu danego typu dla danej lokalizacji. U siebie rozwiązałem to poprzez zakomentowanie następujących linijek w pliku /custom_components/waste_collection_schedule/waste_collection_schedule/source/ecoharmonogram_pl.py

65                    entries = []
...
77                    if self.additional_sides_matcher_input != "":
78                        return entries

KOledzy
Poratujcie prostym opisem kroko po kroku co ma zrobić .
Mam problem z tą integracją kręcę się w kółko chyba.

  1. Zainstalowalem dodatek waste collection ,podałem dane odnośnie lokalizacji
  2. Pojawiła mi się encja kalendarza ecoharmonogram, ale utnkołem nie wiem już co dalej i gdzie wklejać:
# Loads default set of integrations. Do not remove.
default_config:
# Text to speech
tts:
  - platform: google_translate
# Load frontend themes from the themes folder
frontend:
  themes: !include_dir_merge_named themes

automation: !include automations.yaml
sensor: !include sensor.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
binary_sensor:
    api_key: c96a595a85c8e3092999cce9630d1b826af77caa
    warnings:
      - frost_warning
      - heat_warning
      - wind_warning
      - precipitation_warning
      - storm_warning
      - tornado_warning
    storms_nearby:
        radius: 35
waste_collection_schedule:
  sources:
    - name: ecoharmonogram_pl
      args:
        town: D
        district: D
        street: W
        house_number: 
        app:
      customize:
        - type: Odpady selektywne
          alias: Tworzywa
        - type: Papier
          alias: Papier
        - type: Szkło
          alias: Szkło
        - type: Odpady BIO
          alias: Bio
        - type: Odpady zmieszane
          alias: Odpady zmieszane
        - type: Wielkogabaryty
          alias: Odpady wielkogabarytowe  

Dane adresowe usunięte oczywiście, są i ściąga dane.
Mam w kalendarzu widoczne terminy , już mam mętlik w głowie co mam zrobić .

Ja mam tak. Nie wiem czy do końca prawidłowo ale działa. Podstaw tylko miejscowość, ulicę i gminę.

# Śmieci

waste_collection_schedule:
  sources:
    - name: ecoharmonogram_pl
      args:
        town: Miejscowość
        street: Ulica
        district: Gmina
        #house_number: house_number
        #additional_sides_matcher: additional matching parameter
        
sensor:
  - platform: waste_collection_schedule
    name: Śmieci następny wywóz
    details_format:
       appointment_types
       #All
  - platform: waste_collection_schedule
    name: Śmieci wywozy
    details_format: appointment_types
    leadtime: "3"
    value_template: " {{ value.daysTo }} dni"
    types:
      - ODPADY BIO
      - ODPADY ZMIESZANE
      - PAPIER
      - SZKŁO
      - TWORZYWA SZTUCZNE I METALE
      - ODBIÓR CHOINEK
      - POPIÓŁ
      - MYCIE POJEMNIKÓW
      - TERMINY PŁATNOŚCI
      
      # TWORZYWA SZTUCZNE I METALE
  - platform: waste_collection_schedule
    name: Śmieci tworzywa i metale
    details_format: appointment_types
    leadtime: "3"
    value_template: "{% if value.daysTo == 0 %}Dzisiaj{% elif value.daysTo == 1 %}Jutro{% else %} {{value.daysTo}} dni{% endif %}"
    types:
      - TWORZYWA SZTUCZNE I METALE
      # ODPADY ZMIESZANE
  - platform: waste_collection_schedule
    name: Śmieci zmieszane
    details_format: appointment_types
    value_template: "{% if value.daysTo == 0 %}Dzisiaj{% elif value.daysTo == 1 %}Jutro{% else %} {{value.daysTo}} dni{% endif %}"
    types:
      - ODPADY ZMIESZANE
      # PAPIER
  - platform: waste_collection_schedule
    name: Śmieci Papier
    details_format: appointment_types
    value_template: "{% if value.daysTo == 0 %}Dzisiaj{% elif value.daysTo == 1 %}Jutro{% else %} {{value.daysTo}} dni{% endif %}"
    types:
      - PAPIER
      # SZKŁO
  - platform: waste_collection_schedule
    name: Śmieci szkło
    details_format: appointment_types
    value_template: "{% if value.daysTo == 0 %}Dzisiaj{% elif value.daysTo == 1 %}Jutro{% else %} {{value.daysTo}} dni{% endif %}"
    types:
      - SZKŁO 
      # ODPADY BIO
  - platform: waste_collection_schedule
    name: Śmieci odpady BIO
    details_format: appointment_types
    leadtime: "3"
    value_template: "{% if value.daysTo == 0 %}Dzisiaj{% elif value.daysTo == 1 %}Jutro{% else %} {{value.daysTo}} dni{% endif %}"
    types:
      - ODPADY BIO
      # ODBIÓR CHOINEK
  - platform: waste_collection_schedule
    name: Śmieci choinki
    details_format: appointment_types
    leadtime: "3"
    value_template: "{% if value.daysTo == 0 %}Dzisiaj{% elif value.daysTo == 1 %}Jutro{% else %} {{value.daysTo}} dni{% endif %}"
    types:
      - ODBIÓR CHOINEK
      # POPIÓŁ
  - platform: waste_collection_schedule
    name: Śmieci popiół
    details_format: appointment_types
    leadtime: "3"
    value_template: "{% if value.daysTo == 0 %}Dzisiaj{% elif value.daysTo == 1 %}Jutro{% else %} {{value.daysTo}} dni{% endif %}"
    types:
      - POPIÓŁ  
      # MYCIE POJEMNIKÓW
  - platform: waste_collection_schedule
    name: Śmieci mycie pojemników
    details_format: appointment_types
    leadtime: "3"
    value_template: "{% if value.daysTo == 0 %}Dzisiaj{% elif value.daysTo == 1 %}Jutro{% else %} {{value.daysTo}} dni{% endif %}"
    types:
      - MYCIE POJEMNIKÓW
      # TERMINY PŁATNOŚCI
  - platform: waste_collection_schedule
    name: Śmieci termin płatności
    details_format: appointment_types
    value_template: "{% if value.daysTo == 0 %}Dzisiaj{% elif value.daysTo == 1 %}Jutro{% else %} {{value.daysTo}} dni{% endif %}"
    types:
      - TERMINY PŁATNOŚCI  
2 polubienia

@HellboyPL
Od jakiegoś czasu można Integrację tego komponentu niestandardowego instalować z GUI, więc nie ma musu używać YAMLa (tylko to jest kwestia albo-albo, czyli całośc klikasz w GUI albo całość w YAMLu)

Tworzenie dodatkowych sensorów w GUI wprawdzie jest nieintuicyjne, ale się da.
Można wykorzystać template z postu powyżej

{% if value.daysTo == 0 %}Dzisiaj{% elif value.daysTo == 1 %}Jutro{% else %} {{value.daysTo}} dni{% endif %}

tu tylko przykład jednego z dodatkowych sensorów



Jeśli będę kiedyś pomagał komuś osobiście w innej lokalizacji to może przygotuję kompletne obrazki (na etapie, gdy już jest to skonfigurowane może nie jest to takie do końca jasne, ale konfigurator GUI niemal prowadzi za rękę).

A widzisz dotarłem tam ale jak dotarłem do punktu z sensorami to było albo zmodyfikuj albo dodaj więc pomyślałem że już są i nie trzeba . Ok będę próbował.
Czyli dla każdego trzeba skonfigurować wszystko?

Spróbuję zaznaczyć na screenshotach kluczowe punkty (na już skonfigurowanej integracji, więc to wygląda trochę inaczej, niż za 1 razem).

Jeśli używasz config flow (przepływ konfiguracji = wielofazowego konfiguratora) w GUI, to są to 3 fazy

  1. konfiguracja huba
  2. dostosowanie każdego harmonogramu wewnątrz całego kalendarza
  3. tworzenie dodatkowych encji (można utworzyć ich mniej niż cząstkowych harmonogramów lub nawet więcej, jeśli masz pomysły na alternatywne konfiguracje, ale mi starcza 1:1 i chyba większość z tego korzysta).

Oczywiście warunkiem koniecznym jest usunięcie YAMLa (skopiuj i schowaj sobie na potem, jeśli będziesz miał pomysły przekraczające możliwości GUI) i restart HA

edit - nie da się pokazać jak to wygląda na początku, więc spróbuję wieczorem, bo nie mam czasu teraz, a przez to ciśnienie które mają wszyscy na prywatność nie da się pokazać na prawdziwych danych więc wylosuję jakiś adres z Wrocławia od czapy i skonfiguruję całość od zera, ale jeśli masz jakiś adres dla którego istnieją dane od dostawcy którego używasz, to go daj, a zrobię to na jego przykładzie (bo ekosystem.wroc.pl chyba udostępnia uboższy zestaw danych niż wasz operator).


Obiecane obrazki, później dołożę trochę komentarza

Jako testowy adres posłużyła Trzemeska 12 Wrocław
https://ekosystem.wroc.pl/gospodarowanie-odpadami/harmonogram-wywozu-odpadow/?lokalizacja=50294&ulica=1981

HUB

config flow prowadzi za rękę, nie wiem jak dla innych operatorów z innych miast (ale zawsze konkretne informacje są w dokumentacji - należy zajrzeć na repozytorium projektu na githubie)

z nazwy w górnej ramce jest generowana nazwa encji kalenarza (tu będzie calendar.trzemeska ), dolna ramka to dane lokalizacji (to może wyglądać inaczej u innych operatorów odbioru śmieci)

tu kluczowe czekboksy jeśli w jednym przebiegu chcemy personalizację harmonogramów i utworzyć dodatkowe encje (Integrację można wielokrotnie przekonfigurować, więc np. zapomniana lub źle skonfigurowana encja nie jest problemem)

Dostosowanie

wybieramy jakie harmonogramy chcemy dostosowywać (moim skromnym zdaniem nie jest to konieczne, ale OK jeden prosty przykład), jeśli ktoś zamierza dostosowywać warto wybrać wszystkie, każdy ma swój kolejny ekran w config flow, jak widać jeden z nich nazywa się Bio

można niczego nie zmieniać i przejść do kolejnego (albo dostosować pod siebie odsyłam do dokumentacji)

a tu dla przykładu zmieniłem nazwę harmonogramu “Bio” na “Zielone” i ikonka liśc klonu zamiast domyślnej


te ruchy wykonujemy dla wszystkich harmonogramów (zaznaczyłem 4 to miałem 4 kroki do wykonania, oczywiście nie robiłem obrazków z każdego z nich)

Dodatkowe encje

jako kolejny krok config flow pojawi się okienko zatytułowane Create Sensor i jakaś kolejna liczba
w górnym okienku nazwa encji (tu powstanie sensor.tworzywa)
środkowe okienko to wybór formatu danych encji (znowu lektura dokumentacji zalecana, do zwykłego użytku sensowne są dwie pierwsze opcje - można się pobawić i dodać sobie po kilka encji o rożnych nazwach do tego samego harmonogramu by się samodzielnie zaznajomić z różnicami, mi się nie chciało rzeźbić, bo to by zaciemniło prosty przekaz)
trójka w ostatnim okienku to maksymalna ilość przyszłych wydarzeń, które znajdą się w encji (3 wydaje się być sensowne)

tui wykorzystałem polonizujące wartości encji template
{% if value.daysTo == 0 %}Dzisiaj{% elif value.daysTo == 1 %}Jutro{% else %} {{value.daysTo}} dni{% endif %}

i teraz najważniejsze - trzeba wybrać źródłowy harmonogram z którego powstanie encja (w praktyce najpierw na tym oknie dowijam się do miejsca wyboru wybieram skąd chcę brać dane i robię dopiero wszystko co było powyżej)
i UWAGA kluczowy czekboks na dole, że chcemy kontynuować config flow i tworzyć kolejną encję, bez jego zaznaczenia config flow się zakończy! (natomiast jeśli właśnie tworzymy ostatnią encję to go już nie zaznaczamy, by zakończyć dodawanie)

tu jest przykład nadania innej nazwy encji od źródłowego harmonogramu…

… który był już wcześniej zmodyfikowany z “Bio” na “Zielone”

no i na koniec można przypisać Integrację do obszaru (u siebie mam zdefiniowany obszar który dotyczy wszystkiego co się dzieje w bliskiej okolicy, tu akurat stworzyłem nowy dla potrzeb posta)

wynik
ramki niebieskie - skutki dostosowania harmonogramów i nazywania encji inaczej od źródła
ramki zielone encje mają ustawione w/w template
a ramka czerwona encja jest na ustawieniach domyślnych
WCS-4-01-2024-11-08_18-19
oczywiście dostosowywanie jest sporo bardziej elastyczne - zabawa nic nie kosztuje, to jest mniej więcej odpowiednik YAMLa przedstawionego wyżej przez @Jarek_S


Przykładowe niestandardowe karty do wykorzystania dla wizualizacji (dostępne w HACS), obrazki są z realnej instalacji, a nie z tego przykładu powyżej

https://github.com/totaldebug/atomic-calendar-revive

atomic-calendar-revive-2024-11-08_22-35

type: custom:atomic-calendar-revive
name: Wywóz śmieci
enableModeChange: true
firstDayOfWeek: 1
maxDaysToShow: 10
refreshInterval: 600
entities:
  - calendar.wywoz_smieci
showHours: false
calShowDescription: false
dimFinishedEvents: true
showLastCalendarWeek: true
showDate: true
showRelativeTime: true
hideFinishedEvents: true
showDeclined: true
hideDuplicates: true
showMultiDayEventParts: true
showMultiDay: true
showCurrentEventLine: true
showProgressBar: true
showMonth: true
showWeekDay: true
showDescription: true
disableEventLink: true
disableCalEventLink: true
disableCalLocationLink: true
disableCalLink: true
compactMode: false
defaultMode: Event
linkTarget: _blank
showLoader: true
showLocation: false
showAllDayEvents: true
offsetHeaderDate: false
allDayBottom: false
eventDateFormat: dddd D MMMM
disableLocationLink: true
showFullDayProgress: true
showNoEventsForToday: true
showHiddenText: true
showEventIcon: true
showCalendarName: true
showWeekNumber: false
showEventDate: true
showDatePerEvent: false
showTimeRemaining: true
showAllDayHours: true
hoursOnSameLine: false

https://github.com/amaximus/garbage-collection-card
garbage-collection-card-2024-11-08_22-36

type: vertical-stack
cards:
  - type: custom:garbage-collection-card
    entity: sensor.zmieszane
    icon_size: 35px
    icon_color: darkgray
    hide_date: true
    hass_lang_priority: true
  - type: custom:garbage-collection-card
    entity: sensor.metal_i_tworzywa
    icon_size: 35px
    icon_color: yellow
    hide_date: true
    hass_lang_priority: true
  - type: custom:garbage-collection-card
    entity: sensor.biomasa
    icon_size: 35px
    icon_color: brown
    hide_date: true
    hass_lang_priority: true
  - type: custom:garbage-collection-card
    entity: sensor.papier
    icon_size: 35px
    icon_color: blue
    hide_date: true
    hass_lang_priority: true
  - type: custom:garbage-collection-card
    entity: sensor.szklo
    icon_size: 35px
    icon_color: green
    hide_date: true
    hass_lang_priority: true

hmm zmodyfikowałem swoją instalację i teraz coś mam rozjazd we wskazaniach ;D będzie trzeba poszukać błędu…

2 polubienia

Dzięki wielkie za tą instrukcję, dotarłem do tego miejsca tylko raz nie zaznaczałem żeby tworzył sensory z myślą że stworzy domyślne.
Ale nadal jest problem w punkcie gdzie dodaje sensory wychodzi mi ich 8 ale on chce tworzyć dalej , jak daje “x” to zakańcza i nie widzę nawet integracji.

Nie mam takiego okienka:

W ostatnim sensorze NIE zaznaczasz tego czekboksa na dole - opisałem to wyżej

Zamknięcie iksem kończy przepływ konfiguracji bez dodawania czegokolwiek (to celowe, tak ma być - można w ten sposób porzucić konfigurowanie jeśli się zorientujemy, że coś robimy źle).

Możesz nawet dodawać w wielu przebiegach przepływu (re)konfiguracji po jednym lub po kilka, nie musisz od razu dodawać wszystkich sensorów (na próbę dodaj jeden bez czekboksa na dole, tylko dodając po jednym jest za dużo zbędnej roboty).

2 polubienia

Człowiek się jednak śpieszy nawet siedząc :slight_smile: dzięki

Dostałem też pytanie na PW (zamiast w wątku) odnośnie jakiegoś obrazka użytego wcześniej - skąd się tam wzięło “za 4 dni”, no cóż template można edytować jak się komu podoba.

{% if value.daysTo == 0 %}Dzisiaj{% elif value.daysTo == 1 %}Jutro{% elif value.daysTo == 2 %}Pojutrze{% else %}za {{value.daysTo}} dni{% endif %}