Jakość powietrza

Biorąc pod uwagę kluczowe flaki

cena uczciwa, ale w sklepach nie widziałem (jest tylko Vindriktning, który podrożał z 40zł do 50zł,)
Ta starsza konstrukcja wewnętrznie mierzy kilka razy na minutę, to akrat wiem bo wykorzystałem integrację tylko “podsłuchującą” transmisję między wbudowanym MCU i czujnikiem PM1006, więc podejrzewam, że tu wewnętrznie może być podobnie, jakkolwiek sieć Zigbee nie powinna być spamowana za częstymi raportami, więc pewnie to też uwzględnili.

Integrował ktoś dane z Edukacyjnej Sieci Antysmogowej https://esa.nask.pl ?. Są montowane na szkołach, i jest ich całkiem sporo. Na stronie można wyszukać czujnik i id czujnika. Tutaj Otwarte Dane jest dostęp do API w postaci JSON. Ale ja jestem cienki w tym temacie i nie potrafię wydobyć z tego url do konkretnego czujnika. Jak wydobyć te dane?
PS
Z tych danych korzysta też aplikacja mObywatel :blush: przy sprawdzaniu jakości powietrza.

Skorzystaj z platformy

Cytat

Multiscrape

Myślałem że da się jakoś przez Rest

Pewnie się da
https://public-esa.ose.gov.pl/api/v1/smog

Do tego też doszedłem. Nawet znalazłem na której podstronie jest interesująca mnie stacja. :grin:

Tylko nie wiem jak zaciągnąć dane tylko z jednego konkretnego czujnika.

Repozytorium HACS.

Potrzebny id czujnika, łatwo pozyskać z adresu na stronie.
Efekt przy odrobinie nakładu pracy, jak poniżej.

1 polubienie

Dla Ciebie to “odrobina” , dla innych wyzwanie dlatego może warto pomóc udostępniając kod.

Dodam, że w tym linku Esa, gdzie jest mapa, można znaleźć więcej miejsc z czujnikami, ale dającymi info w inne miejsce - klimada2. To jakiś inny projekt. Szkoda, że tego jakoś nie łączą, tylko mnożą byty. Oni mają inne API, ale w wyniku dają nie dane bieżące, tylko jakieś sugerowane na 3 dni do przodu.
https://api.prognozy.ios.edu.pl/
Szkoda, że nie idzie się dostać bezpośrednio do tych danych ze szkół, bo jest ich sporo i są bliżej konsumenta.

Mariusz, udostępnisz kod do tej ładnej karty :slight_smile: ?

Co do kodu karty, nie ma problemu. Napisałem, że efekt można uzyskać przy odrobinie nakładu pracy, ponieważ tak naprawdę kod karty już raz zamieszczałem na forum, konkretnie TUTAJ, tyle że wtedy dotyczyło to integracji Airly. Wystarczy zmiana encji i drobna kosmetyka.
Ale OK.
Karta została stworzona na potrzeby interfejsu na urządzenia mobilne, współgra z całą resztą mojego interfejsu, skleciłem to teraz na szybko do kupy i finalnie wygląda to tak:

type: vertical-stack
cards:
  - type: custom:stack-in-card
    cards:
      - type: custom:layout-card
        layout_type: custom:grid-layout
        layout:
          grid-template-columns: 88px auto
          grid-template-rows: auto
          margin: 0
          padding: 5px
        cards:
          - type: custom:mushroom-chips-card
            chips:
              - type: back
              - type: template
                icon: mdi:home
                tap_action:
                  action: none
                icon_color: black
            card_mod:
              style: |
                ha-card {
                  background-color: rgba(255, 255, 255, 0.7) !important;
                  border-radius:7px !important;
                  --chip-spacing: 0px;
                  --chip-height: 40px;
                  --chip-icon-size: 25px;
                  height: 40px;
                  --primary-text-color: black;
                }
          - type: custom:mushroom-chips-card
            chips:
              - type: template
                icon: mdi:school
                icon_color: '#b2b014'
                content: SP. nr .......
                tap_action:
                  action: none
                hold_action:
                  action: none
            alignment: left
            card_mod:
              style: |
                ha-card {
                  background-color: rgba(255, 255, 255, 0.7) !important;
                  border-radius: 7px !important;
                  --chip-spacing: 0px;
                  --chip-height: 40px;
                  --chip-icon-size: 25px;
                  --primary-text-color: black;
                  height: 40px;
                }
      - type: custom:layout-card
        layout_type: custom:grid-layout
        layout:
          grid-template-columns: 68px auto
          grid-template-rows: auto
          margin: 0
        cards:
          - type: custom:mushroom-template-card
            icon: mdi:weather-cloudy-alert
            fill_container: true
            tap_action:
              action: none
            hold_action:
              action: none
            icon_color: '#b2b014'
            card_mod:
              style: |
                ha-card {
                  padding: 0px 9px 8px !important;
                  --primary-text-color: black;
                  --secondary-text-color: black;
                  margin-top: -6px;
                  margin-left: -3px;
                  background: none;
                  box-shadow: none;
                }
                :host {
                  --mush-icon-border-radius: 7px;
                  --mush-icon-size: 50px;
                  --mush-icon-symbol-size: 0.9em;
                  --mush-card-primary-font-size: 1.2rem;
                }
                mushroom-shape-icon {
                  --shape-color: rgba(255, 255, 255, 0.7) !important;
                }
          - type: picture
            image: /local/images/ESA.png
            card_mod:
              style: |
                ha-card {
                  background-color: transparent !important;
                  max-width: 170px;
                  box-shadow: none;
                  margin-top: -9px;
                }
    card_mod:
      style: |
        ha-card {
          background: rgba(178, 178, 20,0.7);
          border-radius: 0px 0px var(--ha-card-border-radius) var(--ha-card-border-radius);
          height: 115px;
        }
        :host {
          z-index: 4;
          position: sticky;
          top: 0;
        }
  - type: custom:stack-in-card
    cards:
      - type: custom:layout-card
        layout_type: custom:grid-layout
        layout:
          grid-template-columns: 18% auto
        cards:
          - type: custom:mushroom-template-card
            entity: sensor.sp_pm2_5
            picture: |-
              {% set ico = states('sensor.sp_pm2_5') |int %}
              {% if ico < 13 %} /local/images/01_veryGood.svg
              {% elif ico < 35 %} /local/images/02_good.svg
              {% elif ico < 55 %}/local/images/03_moderate.svg
              {% elif ico < 75 %} /local/images/04_poor.svg
              {% elif ico < 110 %} /local/images/05_bad.svg
              {% elif ico >= 110 %} /local/images/06_veryBad.svg
              {% endif %}
            card_mod:
              style: |
                ha-card {
                  box-shadow: none;
                  margin-top: -5px;
                  background: none !important;
                }          
          - type: custom:button-card
            entity: sensor.sp_pm2_5
            color_type: card
            show_label: true
            label: |
              [[[
                if (entity.state < 13) return "Jakość powietrza jest bardzo dobra";
                if ((entity.state < 35) && (entity.state >= 13)) return "Jakość powietrza jest zadowalająca";
                if ((entity.state < 55) && (entity.state >= 35)) return "Zanieczyszczenie powietrza może stanowić zagrożenie dla zdrowia";
                if ((entity.state < 75) && (entity.state >= 55)) return "Unikaj przebywania na wolnym powietrzu";
                if ((entity.state < 110) && (entity.state >= 75)) return "Jakość powietrza jest bardzo zła";
                if (entity.state >= 110) return "Jakość powietrza jest bardzo zła i ma negatywny wpływ na zdrowie";
              ]]]
            styles:
              grid:
                - grid-template-areas: ' "l" '
                - grid-template-columns: 100%
              label:
                - white-space: normal
                - font-size: 15px
                - margin-top: |
                    [[[
                      if (entity.state < 35) return "4px";
                      if ((entity.state < 55) && (entity.state > 35)) return "-4px";
                      if ((entity.state < 110) && (entity.state > 55)) return "4px";
                      if (entity.state > 110) return "-4px";
                    ]]]
                - color: |
                    [[[
                      if (entity.state > 75) return 'white';
                      else return 'black'
                    ]]]                
            card_mod:
              style: |
                ha-card {
                  box-shadow: none;   
                  background: none !important;
                }  
    card_mod:
      style: |
        ha-card {
          height: 75px;
          background:
            {% set kolor = states('sensor.sp_pm2_5') |int %}
            {% if kolor < 13 %} rgb(107, 221, 38);
            {% elif kolor < 35 %} rgb(163, 190, 32);        
            {% elif kolor < 55 %} rgb(255, 229, 92);
            {% elif kolor < 75 %} rgb(232, 116, 36);
            {% elif kolor < 110 %} rgb(234, 62, 36);
            {% elif kolor > 110 %} rgb(118, 16, 18);
            {% endif %}
        }  
  - type: vertical-stack
    cards:
      - type: horizontal-stack
        cards:
          - type: custom:mini-graph-card
            entities:
              - entity: sensor.sp_pm2_5
                name: PM2.5
            show:
              icon: true
            color_thresholds:
              - value: 20
                color: '#68c920'
              - value: 50
                color: '#d35400'
              - value: 70
                color: '#ff1200'
            line_width: 4
            font_size: 65
            font_size_header: 12
            hours_to_show: 240
            points_per_hour: 6
          - type: custom:mini-graph-card
            entities:
              - entity: sensor.sp_pm10
                name: PM10
            show:
              icon: true
            color_thresholds:
              - value: 20
                color: '#68c920'
              - value: 50
                color: '#d35400'
              - value: 70
                color: '#ff1200'
            line_width: 4
            font_size: 65
            font_size_header: 12
            hours_to_show: 240
            points_per_hour: 6
      - type: horizontal-stack
        cards:
          - type: custom:mini-graph-card
            entities:
              - sensor.sp_temperature
            name: TEMPERATURA
            color_thresholds:
              - value: -7
                color: '#157feb'
              - value: 0
                color: '#4dd2fd'
              - value: 5
                color: '#2ae96d'
              - value: 10
                color: '#2ae96d'
              - value: 15
                color: '#e2e92a'
              - value: 20
                color: '#e9d02a'
              - value: 25
                color: '#f7b923'
              - value: 30
                color: '#f79623'
              - value: 35
                color: '#f75a23'
              - value: 40
                color: '#f75a23'
            show:
              icon: true
            line_width: 4
            font_size: 65
            font_size_header: 12
            hours_to_show: 240
            points_per_hour: 6
          - type: custom:mini-graph-card
            entities:
              - sensor.sp_humidity
            name: WILGOTNOŚĆ
            color_thresholds:
              - value: 5
                color: '#f4cb0e'
              - value: 40
                color: '#2eda00'
              - value: 65
                color: '#f4cb0e'
              - value: 90
                color: '#ff1200'
            show:
              icon: true
            line_width: 4
            font_size: 65
            font_size_header: 12
            hours_to_show: 240
            points_per_hour: 6
      - type: horizontal-stack
        cards:
          - type: custom:mini-graph-card
            entities:
              - sensor.cisnienie_atmosferyczne
            name: CIŚNIENIE
            color_thresholds:
              - value: 950
                color: '#057928'
              - value: 1010
                color: '#33d612'
              - value: 1020
                color: '#e5ce0f'
              - value: 1030
                color: '#ffa70f'
            show:
              icon: true
            line_width: 4
            font_size: 65
            font_size_header: 12
            hours_to_show: 240
            points_per_hour: 6
          - type: custom:button-card
            color_type: blank-card

Z góry zaznaczam jednak, że nie gwarantuję iż karta będzie wyglądać u innych taka jak u mnie, ponieważ mam poczynione sporo zmian w wyglądzie interfejsu na poziomie motywu.
Będzie wymagać drobnych przeróbek, trzeba wyrzucić to co charakterystyczne dla mojego interfejsu.
Dodatkowo potrzebne są obrazki, kktóre trzeba umieścić w katalogu \config\www\images
images.zip (24,6 KB)

A, jeszcze jedno. Ponieważ z czujnika ESA ciśnienie jest podawane jako wartość bezwzględna, trzeba je sobie przeliczyć na ciśnienie atmosferyczne tworząc sensor typu Template uwzględniający położenie czujnika. Pomocny jest ten WĄTEK

1 polubienie

Dzięki.
Podpowiesz jeszcze jak to ugryźć ? :wink:

Gdzie ten kod wkleić ?
gdzie szukać katalogu \config\www\images ?

Ciśnienie przeliczyłem na atmosferyczne.

Ten YAML powyżej to kod karty, wklejasz w edytorze kart w trybie ręcznej edycji (oczywiście biorąc pod uwagę, że musisz go dostosować do swojej instalacji), weź pod uwagę zależności od niestandardowych rozszerzeń interfejsu - widzę ich w kodzie całe stado, musisz je najpierw doinstalować, najlepiej z HACS

Jeśli masz sambę to w udziale \config masz podkatalog www (używają go rozszerzenia interfejsu, więc pewnie już masz, jeśli nie to go tworzysz), a w nim tworzysz sobie podkatalog images i wrzucasz tam wypakowane pliki.

Sambę mam, podkatalog www także. Utworzyłem Podkatalog images.
Kod karty wiem, gdzie wkleić. Tylko, że pokazuje błędy, prawdopodobnie ze względu na brak niestandardowych rozszerzeń interfejsu.

Podpowiedzcie co muszę doinstalować z HACS ?

Obecnie mam zainstalowane następujące komponenty:

:mushroom: Mushroom

Button Card by @RomRider

A mi nie przyszło do głowy żeby poszukać tego w HACS :face_with_hand_over_mouth:
Karta wygląda super, spróbuję u siebie zrobić taką ale to po weekendzie bo teraz jestem na wyjeździe.

Potrzebne są także:

i oczywiście

Wszystkie dostępne w HACS.

to poniżej to resztki “po wypatroszeniu” - zostawiłem tylko to co sugeruje niestandardowe elementy

  - type: custom:stack-in-card
      - type: custom:layout-card
        layout_type: custom:grid-layout
          - type: custom:mushroom-chips-card
            card_mod:
          - type: custom:mushroom-chips-card
      - type: custom:layout-card
        layout_type: custom:grid-layout
          - type: custom:mushroom-template-card
            card_mod:
    card_mod:
  - type: custom:stack-in-card
      - type: custom:layout-card
        layout_type: custom:grid-layout
          - type: custom:mushroom-template-card
            card_mod:
    card_mod:
          - type: custom:mini-graph-card
          - type: custom:mini-graph-card
          - type: custom:mini-graph-card
          - type: custom:mini-graph-card
          - type: custom:mini-graph-card
          - type: custom:button-card

Dzięki panowie. Jest prawie dobrze, jak na załączonym obrazku. Jedynie czego brakuje to górnej belki z w formie obrazkowej o jakości powietrza.
Co z tym zrobić ? bo to fajna rzecz.

Usunąłem z kodu karty wszystko co charakterystyczne dla mojego interfejsu.
Ostatecznie wygląda tak.

Poniżej kod karty, wystarczy tylko podstawić nazwy własnych encji w odpowiednie miejsca.

type: vertical-stack
cards:
  - type: custom:stack-in-card
    cards:
      - type: custom:layout-card
        layout_type: custom:grid-layout
        layout:
          grid-template-columns: 68px auto
          grid-template-rows: auto
          margin: 0
        cards:
          - type: custom:mushroom-template-card
            icon: mdi:school
            fill_container: true
            tap_action:
              action: none
            hold_action:
              action: none
            icon_color: yellow
            card_mod:
              style: |
                ha-card {
                  padding: 0px 9px 8px !important;
                  --primary-text-color: black;
                  --secondary-text-color: black;
                  margin-top: 6px;
                  margin-left: -3px;
                  background: none;
                  box-shadow: none;
                }
                :host {
                  --mush-icon-size: 50px;
                  --mush-icon-symbol-size: 0.9em;
                  --mush-card-primary-font-size: 1.2rem;
                }
          - type: picture
            image: /local/images/ESA.png
            card_mod:
              style: |
                ha-card {
                  background-color: transparent !important;
                  max-width: 170px;
                  box-shadow: none;
                  margin-top: 9px;
                }
    card_mod:
      style: |
        ha-card {
          background: rgba(178, 178, 20,0.7);
          border-radius: 0px 0px var(--ha-card-border-radius) var(--ha-card-border-radius);
        }
  - type: custom:stack-in-card
    cards:
      - type: custom:layout-card
        layout_type: custom:grid-layout
        layout:
          grid-template-columns: 18% auto
        cards:
          - type: custom:mushroom-template-card
            entity: sensor.sp_pm2_5
            picture: |-
              {% set ico = states('sensor.sp_pm2_5') |int %}
              {% if ico < 13 %} /local/images/01_veryGood.svg
              {% elif ico < 35 %} /local/images/02_good.svg
              {% elif ico < 55 %}/local/images/03_moderate.svg
              {% elif ico < 75 %} /local/images/04_poor.svg
              {% elif ico < 110 %} /local/images/05_bad.svg
              {% elif ico >= 110 %} /local/images/06_veryBad.svg
              {% endif %}
            card_mod:
              style: |
                ha-card {
                  box-shadow: none;
                  margin-top: -5px;
                  background: none !important;
                }          
          - type: custom:button-card
            entity: sensor.sp_pm2_5
            color_type: card
            show_label: true
            label: |
              [[[
                if (entity.state < 13) return "Jakość powietrza jest bardzo dobra";
                if ((entity.state < 35) && (entity.state >= 13)) return "Jakość powietrza jest zadowalająca";
                if ((entity.state < 55) && (entity.state >= 35)) return "Zanieczyszczenie powietrza może stanowić zagrożenie dla zdrowia";
                if ((entity.state < 75) && (entity.state >= 55)) return "Unikaj przebywania na wolnym powietrzu";
                if ((entity.state < 110) && (entity.state >= 75)) return "Jakość powietrza jest bardzo zła";
                if (entity.state >= 110) return "Jakość powietrza jest bardzo zła i ma negatywny wpływ na zdrowie";
              ]]]
            styles:
              grid:
                - grid-template-areas: ' "l" '
                - grid-template-columns: 100%
              label:
                - white-space: normal
                - font-size: 15px
                - margin-top: |
                    [[[
                      if (entity.state < 35) return "4px";
                      if ((entity.state < 55) && (entity.state > 35)) return "-4px";
                      if ((entity.state < 110) && (entity.state > 55)) return "4px";
                      if (entity.state > 110) return "-4px";
                    ]]]
                - color: |
                    [[[
                      if (entity.state > 75) return 'white';
                      else return 'black'
                    ]]]                
            card_mod:
              style: |
                ha-card {
                  box-shadow: none;   
                  background: none !important;
                }  
    card_mod:
      style: |
        ha-card {
          height: 75px;
          background:
            {% set kolor = states('sensor.sp_pm2_5') |int %}
            {% if kolor < 13 %} rgb(107, 221, 38);
            {% elif kolor < 35 %} rgb(163, 190, 32);        
            {% elif kolor < 55 %} rgb(255, 229, 92);
            {% elif kolor < 75 %} rgb(232, 116, 36);
            {% elif kolor < 110 %} rgb(234, 62, 36);
            {% elif kolor > 110 %} rgb(118, 16, 18);
            {% endif %}
        }  
  - type: horizontal-stack
    cards:
      - type: custom:mini-graph-card
        entities:
          - entity: sensor.sp_pm2_5
            name: PM2.5
        show:
          icon: true
        color_thresholds:
          - value: 20
            color: '#68c920'
          - value: 50
            color: '#d35400'
          - value: 70
            color: '#ff1200'
        line_width: 4
        font_size: 65
        font_size_header: 12
        hours_to_show: 240
        points_per_hour: 6
      - type: custom:mini-graph-card
        entities:
          - entity: sensor.sp_pm10
            name: PM10
        show:
          icon: true
        color_thresholds:
          - value: 20
            color: '#68c920'
          - value: 50
            color: '#d35400'
          - value: 70
            color: '#ff1200'
        line_width: 4
        font_size: 65
        font_size_header: 12
        hours_to_show: 240
        points_per_hour: 6
  - type: horizontal-stack
    cards:
      - type: custom:mini-graph-card
        entities:
          - sensor.sp_temperature
        name: TEMPERATURA
        color_thresholds:
          - value: -7
            color: '#157feb'
          - value: 0
            color: '#4dd2fd'
          - value: 5
            color: '#2ae96d'
          - value: 10
            color: '#2ae96d'
          - value: 15
            color: '#e2e92a'
          - value: 20
            color: '#e9d02a'
          - value: 25
            color: '#f7b923'
          - value: 30
            color: '#f79623'
          - value: 35
            color: '#f75a23'
          - value: 40
            color: '#f75a23'
        show:
          icon: true
        line_width: 4
        font_size: 65
        font_size_header: 12
        hours_to_show: 240
        points_per_hour: 6
      - type: custom:mini-graph-card
        entities:
          - sensor.sp_humidity
        name: WILGOTNOŚĆ
        color_thresholds:
          - value: 5
            color: '#f4cb0e'
          - value: 40
            color: '#2eda00'
          - value: 65
            color: '#f4cb0e'
          - value: 90
            color: '#ff1200'
        show:
          icon: true
        line_width: 4
        font_size: 65
        font_size_header: 12
        hours_to_show: 240
        points_per_hour: 6
  - type: horizontal-stack
    cards:
      - type: custom:mini-graph-card
        entities:
          - sensor.cisnienie_atmosferyczne
        name: CIŚNIENIE
        color_thresholds:
          - value: 950
            color: '#057928'
          - value: 1010
            color: '#33d612'
          - value: 1020
            color: '#e5ce0f'
          - value: 1030
            color: '#ffa70f'
        show:
          icon: true
        line_width: 4
        font_size: 65
        font_size_header: 12
        hours_to_show: 240
        points_per_hour: 6
      - type: custom:button-card
        color_type: blank-card

Skopiowałem powyższy kod, podstawiłem swoje encje i jest tak jak poprzednio. To znaczy brakuje jedynie belki z jakością powietrza.
Pokazuje taki błąd jak na załączony obrazku.

Może trzeba zresetować całą maszynę ? uruchamiałem ponownie, ale tylko HA.

A może brakuje jeszcze jakiegoś komponentu HACS ?

EDIT.

Moje niedopatrzenie. Nie wszędzie wstawiłem swoją encje dotyczącą PM 2.5. Sorry.
Teraz jest wszystko ok.

Dzięki za pomoc.

Podpowiedz proszę jeszcze, którą część kodu usunąć aby pozbyć się poniższego obrazka ?