[Lovelace UI] kafelek Airly

A jak pobierasz te dane ?

NR → Mqtt

1 polubienie

Odpowiedzi przychodzące od Airly mają pewną przypadłość, polegającą na tym, że czasami zamieniają się miejscami odczyty dla PM2.5 z PM10 i tak samo dla PM2.5 w procentach z PM10 w procentach. Dlatego w nodach funkcyjnych odpowiadających za pozyskiwanie tych danych wpisz odpowiednio:

dla PM2.5

var name = 'PM25';
var value = null;

msg.payload.current.values.forEach(function (measurment, index) {
    if (measurment.name == name) {
        value = measurment.value.toFixed(0);
    }
});

return { payload: value };

dla PM2.5 w procentach:

var pollutant = 'PM25';
var value = null;

msg.payload.current.standards.forEach(function (measurment, index) {
    if (measurment.pollutant == pollutant) {
        value = measurment.percent.toFixed(0);
    }
});

return { payload: value };

dla PM10:

var name = 'PM10';
var value = null;

msg.payload.current.values.forEach(function (measurment, index) {
    if (measurment.name == name) {
        value = measurment.value.toFixed(0);
    }
});

return { payload: value };

dla PM10 w procentach:

var pollutant = 'PM10';
var value = null;

msg.payload.current.standards.forEach(function (measurment, index) {
    if (measurment.pollutant == pollutant) {
        value = measurment.percent.toFixed(0);
    }
});

return { payload: value };

To rozwąże problem miszmaszu w wartościach jaki czasami powstaje po odpytaniu Airly.

1 polubienie

W nodach funkcyjnych w sensie na karcie ? Sorki aż tak nie jest biegły w tych określeniach .

Jeszcze jedno widzę że Airly o 19.14 przestała wysyłać zapytania mam ustawione co 30 min :

Gdzie się sprawdza taki podgląd ?

Edit:

Ok już wiem co to te nody :slight_smile:

Jutro sprawdzę czy zmienione nody działają .

Zmieniłem też częstotliwość na 45 min

Edit:

To co w takim razie nie tak jest że jest komunikat a Airly przestała pokazywać wskazania?
image

Nie musisz zmieniać częstotliwości odpytywania. API Airly pozwala na 100 zapytań na dobę. Ja mam ustawione zapytanie co 20 minut co przy 24 godzinach daje 72 zapytania. Dodatkowo kartę mam tak skonfigurowaną, że w dowolnym momencie mogę wymusić odpytanie Airly na żądanie, przytrzymując dłużej obrazek.

ok sprawdziłem na inne zakładce miałem jeszcze inną testową kartę z airly myślałem że jak ją usunę to skończą się problemy.
Niestety wciąż wykrzacza się, mimo że mam ustawione co 15 min .

image

A jak to Airly masz zintegrowane czy aby tego nie zdublowałeś tzn jedno jako integracja w HA a drugie w Node-red ?

Mam jedną kartę gdzie użyłem tego kodu :

type: vertical-stack
cards:
  - type: horizontal-stack
    cards:
      - type: custom:button-card
        entity: sensor.airly_caqi_2
        aspect_ratio: 3/1
        color_type: card
        hold_action:
          action: call-service
          service: script.odswiez_airly
        show_state: true
        show_label: true
        show_icon: false
        label: >
          [[[ return states['sensor.airly_description'].state + "<br>" +
          "------------------------------------------------" + "<br>" +
          states['sensor.airly_advice'].state]]]
        styles:
          grid:
            - grid-template-areas: ' "s l" "s l" '
            - grid-template-columns: 30% 75%
          card:
            - background-image: |
                [[[
                  if (entity.state < 26) return "url('/local/images/1.png')";
                  if ((entity.state < 51) && (entity.state > 25)) return "url('/local/images/2.png')";
                  if ((entity.state < 76) && (entity.state > 50)) return "url('/local/images/3.png')";
                  if ((entity.state < 88) && (entity.state > 75)) return "url('/local/images/4.png')";
                  if ((entity.state < 126) && (entity.state > 87)) return "url('/local/images/5.png')";
                  if (entity.state > 125) return "url('/local/images/6.png')";
                ]]]
            - background-size: 100%
            - background-color: |
                [[[ return states['sensor.airly_color'].state ]]]
            - color: |
                [[[
                  if (entity.state > 87) return 'white';
                  else return 'black'
                ]]]
          label:
            - white-space: normal
            - font-size: 14px
            - justify-self: center
            - margin-left: '-20%'
            - margin-top: '-3%'
          state:
            - font-size: 32px
            - font-weight: bold
            - justify-self: center
            - align-self: start
            - padding: 29%
            - margin-left: '-5%'
        style: |
          ha-card {
            box-shadow: 0px 0px 3px 1px var(--state-icon-color);
          }
  - type: custom:sun-card
  - type: vertical-stack
    cards:
      - type: horizontal-stack
        cards:
          - type: custom:mini-graph-card
            entities:
              - entity: sensor.airly_pm2_5
                name: PM2.5
              - entity: sensor.airly_pm2_5_2_2
                show_graph: false
                show_state: true
            show:
              icon: false
            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: 3
            style: |
              ha-card {
                box-shadow: 0px 0px 3px 1px var(--state-icon-color);
                background: var(--card-background-color)
              }
          - type: custom:mini-graph-card
            entities:
              - entity: sensor.airly_pm10
                name: PM10
              - entity: sensor.airly_pm10_2_2
                show_graph: false
                show_state: true
            show:
              icon: false
            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: 3
            style: |
              ha-card {
                box-shadow: 0px 0px 3px 1px var(--state-icon-color);
                background: var(--card-background-color)
              }
      - type: horizontal-stack
        cards:
          - type: custom:mini-graph-card
            entities:
              - sensor.airly_pm1
            name: PM1
            show:
              icon: false
            color_thresholds:
              - value: 10
                color: '#68c920'
              - value: 30
                color: '#d35400'
              - value: 60
                color: '#ff1200'
            line_width: 4
            font_size: 65
            font_size_header: 12
            hours_to_show: 240
            points_per_hour: 3
            style: |
              ha-card {
                box-shadow: 0px 0px 3px 1px var(--state-icon-color);
                background: var(--card-background-color)
              }
          - type: custom:mini-graph-card
            entities:
              - sensor.airly_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: false
            line_width: 4
            font_size: 65
            font_size_header: 12
            hours_to_show: 240
            points_per_hour: 3
            style: |
              ha-card {
                box-shadow: 0px 0px 3px 1px var(--state-icon-color);
                background: var(--card-background-color)
              }
      - type: horizontal-stack
        cards:
          - type: custom:mini-graph-card
            entities:
              - sensor.airly_humidity
            name: WILGOTNOŚĆ
            color_thresholds:
              - value: 5
                color: '#f4cb0e'
              - value: 40
                color: '#2eda00'
              - value: 65
                color: '#f4cb0e'
              - value: 90
                color: '#ff1200'
            show:
              icon: false
            line_width: 4
            font_size: 65
            font_size_header: 12
            hours_to_show: 240
            points_per_hour: 3
            style: |
              ha-card {
                box-shadow: 0px 0px 3px 1px var(--state-icon-color);
                background: var(--card-background-color)
              }
          - type: custom:mini-graph-card
            entities:
              - sensor.airly_pressure
            name: CIŚNIENIE
            color_thresholds:
              - value: 950
                color: '#057928'
              - value: 1010
                color: '#33d612'
              - value: 1020
                color: '#e5ce0f'
              - value: 1030
                color: '#ffa70f'
            show:
              icon: false
            line_width: 4
            font_size: 65
            font_size_header: 12
            hours_to_show: 240
            points_per_hour: 3
            style: |
              ha-card {
                box-shadow: 0px 0px 3px 1px var(--state-icon-color);
                background: var(--card-background-color)
              }type: ''

Dodatkowo sensory dodane configuration.yaml i zrobiona automatyzacja z airly w Node -red.

Nie rozumiesz, kart możesz mieć ile chcesz (one nie wysyłają same żadań) pytałem czy nie masz w Ustawienia->integracje zainstalowanej integracji Airly, ale skoro masz tylko w NR to jeśli masz częstotliwość ustawioną na 15 min lub więcej to problemu nie powinno być, no chyba, że nadużywasz tego

hold_action:
          action: call-service
          service: script.odswiez_airly

Mam w integracji :
image

Czyli rozumiem czujniki Airly mają być dodane w pliku configuration.yaml oraz zrobiona automatyzacja w Node-Red.
Czyli odinstalować tą integrację Airly?

Jeśli używasz w NR to ta z integracji jest niepotrzebna. W obecnej chwili Airly jest odpytywane przez integrację i przez Node-Red, więc limit wyczerpuje się szybko (bo są zdublowane). jeśli chcesz to nie musisz usuwać tej z integracji a tylko ją wyłączyć. Wtedy będziesz korzystał tylko z tej w NR, a jak ci się znudzi to możesz ponownie włączyć a tą z NR albo usunąć albo wyłączyć.
PS. Aby wyłączyć tą z integracji to na twoim obrazku klikasz te trzy kropeczki.
Integracja Airly tworzy sama sensory i je masz od razu dostępne do wykorzystania w kartach ale jeśli chcesz używać NR to sensory same się nie utworzą tylko musisz je sam stworzyć dodając odpowiednie sensory w mqtt i odpowiednio je skonfigurować do topików jakie wysyłasz z NR.

Jakaś podpowiedź jak to zrobić ?

Nie to jak wyłączyć integracje to wiem.
Chodziło mi o stworzenie tych sensorów wg wskazówki :

“ale jeśli chcesz używać NR to sensory same się nie utworzą tylko musisz je sam stworzyć dodając odpowiednie sensory w mqtt i odpowiednio je skonfigurować do topików jakie wysyłasz z NR.”

Zacznij od postu: https://forum.arturhome.pl/t/lovelace-ui-kafelek-airly/88/9?u=artpc

Od tamtej pory zmienił się format zapisu mqtt więc musisz to uwzględnić .

Konfiguracja dla :

configuration.yaml

mqtt: !include mqtt_include.yaml

sensor: !include mqtt_sensors.yaml
switch: !include mqtt_switch.yaml

mqtt_sensors.yaml

#sensor:
  - name: "Airly limit"
    state_class: measurement
    unit_of_measurement: "/100"
    state_topic: "node-red/Airly/limit/value"
    payload_available: "online"
    payload_not_available: "offline"

  - name: "Airly NO2"
    device_class: nitrogen_monoxide
    state_class: measurement
    unit_of_measurement: "µg/m³"
    state_topic: "node-red/Airly/NO2/value"
    payload_available: "online"
    payload_not_available: "offline"

  - name: "Airly NO2_2"
    device_class: nitrogen_monoxide
    state_class: measurement
    unit_of_measurement: "%"
    state_topic: "node-red/Airly/NO2/limit-percent"
    payload_available: "online"
    payload_not_available: "offline"

  - name: "Airly O3"
    device_class: ozone
    state_class: measurement
    unit_of_measurement: "µg/m³"
    state_topic: "node-red/Airly/O3/value"
    payload_available: "online"
    payload_not_available: "offline"

  - name: "Airly O3_2"
    device_class: ozone
    state_class: measurement
    unit_of_measurement: "%"
    state_topic: "node-red/Airly/O3/limit-percent"
    payload_available: "online"
    payload_not_available: "offline"

  - name: "Airly PM1"
    device_class: pm1
    state_class: measurement
    unit_of_measurement: "µg/m³"
    state_topic: "node-red/Airly/PM1/value"
    payload_available: "online"
    payload_not_available: "offline"

  - name: "Airly PM2.5"
    device_class: pm25
    state_class: measurement
    unit_of_measurement: "µg/m³"
    state_topic: "node-red/Airly/PM25/value"
    payload_available: "online"
    payload_not_available: "offline"

  - name: "Airly PM2_5_2"
    device_class: pm25
    state_class: measurement
    unit_of_measurement: "%"
    state_topic: "node-red/Airly/PM25/limit-percent"
    payload_available: "online"
    payload_not_available: "offline"

  - name: "Airly PM10"
    device_class: pm10
    state_class: measurement
    unit_of_measurement: "µg/m³"
    state_topic: "node-red/Airly/PM10/value"
    payload_available: "online"
    payload_not_available: "offline"

  - name: "Airly PM10_2"
    device_class: pm10
    state_class: measurement
    unit_of_measurement: "%"
    state_topic: "node-red/Airly/PM10/limit-percent"
    payload_available: "online"
    payload_not_available: "offline"

  - name: "Airly pressure"
    device_class: pressure
    state_class: measurement
    unit_of_measurement: "hPa"
    state_topic: "node-red/Airly/climate/pressure"
    payload_available: "online"
    payload_not_available: "offline"

  - name: "Airly humidity"
    device_class: humidity
    state_class: measurement
    unit_of_measurement: "%"
    state_topic: "node-red/Airly/climate/humidity"
    payload_available: "online"
    payload_not_available: "offline"

  - name: "Airly temperature"
    device_class: temperature
    state_class: measurement
    unit_of_measurement: "°C"
    state_topic: "node-red/Airly/climate/temperature"
    payload_available: "online"
    payload_not_available: "offline"

  - name: "Airly CAQI"
    device_class: aqi
    state_class: measurement
    icon: mdi:air-filter
    unit_of_measurement: "CAQI"
    state_topic: "node-red/Airly/CAQI/value"
    payload_available: "online"
    payload_not_available: "offline"

  - name: "Airly level"
    state_topic: "node-red/Airly/CAQI/level"
    payload_available: "online"
    payload_not_available: "offline"

  - name: "Airly color"
    state_topic: "node-red/Airly/CAQI/color"
    payload_available: "online"
    payload_not_available: "offline"

  - name: "Airly description"
    state_topic: "node-red/Airly/CAQI/description"
    payload_available: "online"
    payload_not_available: "offline"

  - name: "Airly advice"
    state_topic: "node-red/Airly/CAQI/advice"
    payload_available: "online"
    payload_not_available: "offline"

Jest też inna integracja: worlds-air-quality-index
Instalacja z HACS
https://github.com/pawkakol1/worlds-air-quality-index

https://waqi.info/#/c/27.689/37.697/3.5z

Dzięki miałem wszystko stworzone ,sensory itd. Więc wyłączyłem tylko integrację i na karcie włączyłem nowe czujniki jest godzina 21 i nie pokazuje już “NaN” więc wszystko działa.
Ale dzięki za wyjaśnienie na pewno komuś się przyda, a może za jakiś czas skorzystam z tego drugiego dodatku.

Witajcie,
Jestem nowy w zabawę w UI i nie wiem co robię źle.
Formatowanie mi się kompletnie rozwaliło


kod:

button_card_templates:
  ta_pogoda_airly:
    tap_action:
      action: fire-dom-event
      browser_mod:
        service: browser_mod.popup
        data:
          right_button: OK
          content:
            type: entities
            title: Pogoda AIRLY
            entities:
              - type: custom:layout-card
                layout_type: masonry
                cards:
                  - type: grid
                    columns: 1
                    square: false
                    cards:
                      - type: custom:mini-graph-card
                        card_mod:
                          style: |
                            ha-card {--ha-card-background: #0a0a0a; 
                        entities:
                          - sensor.airly_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'
                        line_width: 2
                        font_size: 65
                        font_size_header: 12
                        hours_to_show: 120
                        points_per_hour: 3
                  - type: grid
                    columns: 2
                    square: false
                    cards:
                      - type: custom:mini-graph-card
                        card_mod:
                          style: |
                            ha-card {--ha-card-background: #0a0a0a; 
                        entities:
                          - sensor.airly_humidity
                        name: Wilgotność
                        color_thresholds:
                          - value: 5
                            color: '#f4cb0e'
                          - value: 40
                            color: '#2eda00'
                          - value: 65
                            color: '#f4cb0e'
                          - value: 90
                            color: '#ff1200'
                        line_width: 2
                        font_size: 65
                        font_size_header: 12
                        hours_to_show: 120
                        points_per_hour: 3
                      - type: custom:mini-graph-card
                        card_mod:
                          style: |
                            ha-card {--ha-card-background: #0a0a0a; 
                        entities:
                          - sensor.airly_pressure
                        name: Ciśnienie
                        color_thresholds:
                          - value: 950
                            color: '#057928'
                          - value: 1010
                            color: '#33d612'
                          - value: 1020
                            color: '#e5ce0f'
                          - value: 1030
                            color: '#ffa70f'
                        line_width: 2
                        font_size: 65
                        font_size_header: 12
                        hours_to_show: 120
                        points_per_hour: 3
                  - type: grid
                    columns: 3
                    cards:
                      - type: custom:mini-graph-card
                        show:
                          icon: false
                        card_mod:
                          style: |
                            ha-card {--ha-card-background: #0a0a0a; 
                        entities:
                          - sensor.airly_pm1
                        name: PM1
                        color_thresholds:
                          - value: 10
                            color: '#68c920'
                          - value: 30
                            color: '#d35400'
                          - value: 60
                            color: '#ff1200'
                        line_width: 2
                        font_size: 60
                        font_size_header: 10
                        hours_to_show: 120
                        points_per_hour: 3
                      - type: custom:mini-graph-card
                        show:
                          icon: false
                        card_mod:
                          style: |
                            ha-card {--ha-card-background: #0a0a0a; 
                        entities:
                          - entity: sensor.airly_pm2_5
                            name: PM2.5
                          - entity: sensor.airly_pm2_5_2
                            show_graph: false
                            show_state: true
                        color_thresholds:
                          - value: 20
                            color: '#68c920'
                          - value: 50
                            color: '#d35400'
                          - value: 70
                            color: '#ff1200'
                        line_width: 2
                        font_size: 60
                        font_size_header: 10
                        hours_to_show: 120
                        points_per_hour: 3
                      - type: custom:mini-graph-card
                        show:
                          icon: false
                        card_mod:
                          style: |
                            ha-card {--ha-card-background: #0a0a0a; 
                        entities:
                          - entity: sensor.airly_pm10
                            name: PM10
                          - entity: sensor.airly_pm10_2
                            show_graph: false
                            show_state: true
                        color_thresholds:
                          - value: 20
                            color: '#68c920'
                          - value: 50
                            color: '#d35400'
                          - value: 70
                            color: '#ff1200'
                        line_width: 2
                        font_size: 60
                        font_size_header: 10
                        hours_to_show: 120
                        points_per_hour: 3
                  - type: grid
                    columns: 2
                    square: false
                    cards:
                      - type: custom:mini-graph-card
                        show:
                          icon: false
                        card_mod:
                          style: |
                            ha-card {--ha-card-background: #0a0a0a; 
                        entities:
                          - entity: sensor.airly_o3
                            name: Ozon O3
                          - entity: sensor.airly_o3_2
                            show_graph: false
                            show_state: true
                        color_thresholds:
                          - value: 20
                            color: '#68c920'
                          - value: 50
                            color: '#d35400'
                          - value: 70
                            color: '#ff1200'
                        line_width: 2
                        font_size: 65
                        font_size_header: 12
                        hours_to_show: 120
                        points_per_hour: 3
                      - type: custom:mini-graph-card
                        show:
                          icon: false
                        card_mod:
                          style: |
                            ha-card {--ha-card-background: #0a0a0a; 
                        entities:
                          - entity: sensor.airly_no2
                            name: Dwutlenek azotu No2
                          - entity: sensor.airly_no2_2
                            show_graph: false
                            show_state: true
                        color_thresholds:
                          - value: 20
                            color: '#68c920'
                          - value: 50
                            color: '#d35400'
                          - value: 70
                            color: '#ff1200'
                        line_width: 2
                        font_size: 65
                        font_size_header: 12
                        hours_to_show: 120
                        points_per_hour: 3
  ta_rozmycie:
    tap_action:
      browser_mod:
        data:
          card_mod:
            style:
              ha-dialog$: |
                div.mdc-dialog__scrim {
                  backdrop-filter: blur(15px) !important;
                  -webkit-backdrop-filter: blur(15px) !important; } 
  ta_powiekszenie:
    style: |
      ha-card:hover {transform: scale(1.05);box-shadow: 0 0 10px;} 
views:
  - title: Home
    type: custom:button-card
    entity: sensor.airly_caqi
    template:
      - ta_powiekszenie
      - ta_rozmycie
      - ta_pogoda_airly
    aspect_ratio: 3/1
    color_type: card
    show_state: true
    show_label: true
    show_icon: false
    hold_action:
      action: call-service
      service: input_boolean.turn_on
      service_data:
        entity_id: input_boolean.airly_req
    label: >
      [[[ return states['sensor.airly_description'].state + "<br>" +
      "------------------------------------------------" + "<br>" +
      states['sensor.airly_advice'].state ]]]
    custom_fields:
      limit: |
        [[[
          if (states['sensor.airly_limit'].state != 999) return "req: " + states['sensor.airly_limit'].state;
          else return "brak" ]]]
    styles:
      grid:
        - grid-template-areas: ' "s l" "s l" "limit l" "limit l" '
        - grid-template-columns: 30% 75%
      card:
        - background-image: |
            [[[
              if (entity.state < 26) return "url('/local/img/powietrze/1.png')";
              if ((entity.state < 51) && (entity.state > 25)) return "url('/local/img/powietrze/2.png')";
              if ((entity.state < 76) && (entity.state > 50)) return "url('/local/img/powietrze/3.png')";
              if ((entity.state < 88) && (entity.state > 75)) return "url('/local/img/powietrze/4.png')";
              if ((entity.state < 126) && (entity.state > 87)) return "url('/local/img/powietrze/5.png')";
              if (entity.state > 125) return "url('/local/img/powietrze/6.png')";
            ]]]
        - background-size: 100%
        - background-color: |
            [[[ return states['sensor.airly_color'].state ]]]
        - color: |
            [[[
              if (entity.state > 87) return 'white';
              else return 'black'
            ]]]
      label:
        - white-space: normal
        - font-size: 14px
        - justify-self: center
        - margin-left: '-30%'
        - margin-top: '-3%'
      state:
        - font-weight: bold
        - justify-self: center
        - align-self: start
        - padding: 35%
        - margin-left: '-33%'
      custom_fields:
        limit:
          - text-align: start
          - align-self: start
          - padding-left: 5%

Tu masz źródłową dokumentację

Wydaje się, że zanadto wyrąbałęś domyślną konfigurację widoku wstawiając tam od razu kod karty.
Po wstawieniu szablonów do głównej konfiguracji dashboardu najłatwiej karty wrzucić zwykłym edytorem kart (wtedy on zadba o to aby nie wyciąć czegoś istotnego).

A gdzie wkleiłeś ten kod ?

Wszystkiego najlepszego w nowym roku :slight_smile:

Właśnie zauważyłem, że nie działa mi flow z odczytami jakości powietrza Ailry poprzez API. Ktoś korzysta z tego procesu i może sprawdzić czy działa on prawidłowo? Odrzucone są próby pobrania parametrów: