A jak pobierasz te dane ?
NR → Mqtt
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.
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
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?
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 .
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 :
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
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 ?