Powiadomienia, zasilanie listy

trochę przerobiłem ale proszę bardzo :slight_smile: głównie chodziło aby dorobić czas w jednym miejscu a nie we wszystkich wywołaniach powiadomienia…

flows.json (30,2 KB)

jednak przydał by się ktoś mądry kto przerobi pokazywanie czasu… aby nie było np 9:1 tylko 9:01 albo 09:01, ktoś by się podjął modyfikacji?

image

var czas = new Date();
var czas_formatowany = czas.getHours() + ":" + czas.getMinutes() + " - "

msg.wiadomosc =
{
    "tresc": czas_formatowany + msg.wiadomosc.tresc,
}
return msg;

function addZero(i) {
if (i < 10) {i = “0” + i}
return i;
}

const d = new Date();
h = addZero(d.getHours());
m = addZero(d.getMinutes());
s = addZero(d.getSeconds());
time = h + “:” + m + “:” + s;

przydała by się drobna podpowiedź - niestety programista ze mnie żaden :slight_smile: chyba że PLC :stuck_out_tongue:

image

To raczej nie jest wina formatu HH:MM tylko coś ci obcina twój czas, przejrzałbym kod karty .

nie ma co obcinać - za prosta funkcja … ale udało mi się znaleźć … :slight_smile:
" " kolega użył innego formatowania i w NR nie działał prawidłowo. wrzucam dla chętnych

kod z bloczku godzina ma dwie opcję, jedna na głos w głośniku a druga powiadomienie na telefon

var czas = new Date();

function addZero(i) {
if (i < 10) {i = "0" + i}
return i;
}

var h = addZero(czas.getHours());
var m = addZero(czas.getMinutes());
var czas_formatowany = h + ":" + m + " - "

msg.wiadomosc =
{
    "tresc"  : czas_formatowany + msg.wiadomosc.tresc,
}
msg.payload =
{
    "data":
    {
        "message":  msg.wiadomosc.tresc,
    }
}
return msg;

Dodałem twój subflow, wywołanie
timestamp

funkcja

 msg.wiadomosc =
{
    "temat":"Drzwi i okna",
    "tresc":"Wiadomość testowa",
    "typ":"alarm"
}
return msg;

Screenshot - 03.12.2021 , 18_47_25

@murcin
https://flows.nodered.org/node/node-red-contrib-moment

przesyłam dla chętnych całe wywołanie. z drobnymi aktualizacjiami flows (3).json (32,9 KB)

tutaj akurat z funkcją dodającą 0 gdy minut jest mniej niż 10 - działa :slight_smile:
działa również z data/time formater - sprawdzałem jednak wolę funkcję ponieważ jest jeden bloczek a nie dwa :slight_smile:

2 polubienia

Czy można zrobić tak, aby reset HA nie kasował zapisanych komunikatów?

muszę odgrzać kotleta… :slight_smile:
szukam sposobu na zmienną która mi powie ile opcji aktualnie uzbierało się w input_select…
obawiam się że przy dłuższym nie czyszczeniu listy informacji czy coś lista będzie tak długa że coś się wysypie i chciałbym zrobić w NR restart (kasowanie listy) gdy przekroczy np 500 wpisów…??

Ja używam takiej prostej funkcji do określenia liczby wierszy zwróconych zapytaniem z bazy danych, a o ile dobrze kojarzę wynik z input_select też jest w tablicy

let tab = msg.payload;
let dlugosc = tab.length;
msg.dlugosc = dlugosc;
return msg;
1 polubienie

dzięki :slight_smile: sprawdziłem ale coś nie podaje prawdziwych informacji ta funkcja :frowning:

udało mi się ogarnąć tworząc template sensor przez count - może się komuś przyda :slight_smile:


  - name: input_select informacje
    state: "{{ state_attr('input_select.informacje', 'options') | count }}"
    icon: mdi:format-list-numbered
  - name: input_select ostrzezenia
    state: "{{ state_attr('input_select.warnings', 'options') | count }}"
    icon: mdi:format-list-numbered
  - name: input_select alarmy
    state: "{{ state_attr('input_select.alarmy', 'options') | count }}"
    icon: mdi:format-list-numbered

…bo dotyczy zupełnie innej struktury danych. Odpowiedź masz pod nosem w funkcji “Czyszczenie listy”

msg.data.attributes.options.splice(0, msg.data.attributes.options.length);
msg.data.attributes.options[0] = "Brak alarmów";
msg.payload = 
{
    "data": 
    {
        "options":msg.data.attributes.options
    }    
}
return msg;

Funkcja msg.data.attributes.options.length zwraca długość tablicy, a splice wykonuje różne operacje.
Poczytaj o niej JavaScript Array splice() Method to zmodyfikujesz Wzbogacenie listy tak aby działała w/g oczekiwań. Czyli po przekroczeniu 500 wpisów przed wpisaniem nowego kasujesz ostatni.
Mniej/więcej coś takiego (nie sprawdzone)

// kasuj ostatni gdy > 500
var dl = msg.data.attributes.options.length;
if (dl > 500) {
    msg.data.attributes.options.splice((dl-1),1);  
    
}
// to co było  
if (msg.data.attributes.options.includes("Brak informacji")) {
    msg.data.attributes.options.splice(0,1);
}

if (!msg.data.attributes.options.includes(msg.wiadomosc.tresc)) {
    msg.data.attributes.options.push(msg.wiadomosc.tresc);
}

msg.payload = 
{
    "data": 
    {
        "options":msg.data.attributes.options
    }    
}
return msg;
1 polubienie

java to u mnie na zgadywankę działa :smiley: “spróbuję co się stanie” :slight_smile: - ale link co podesłałeś jest super.
Kod który podrzuciłeś już mi bardzo pomógł ale usuwał ostatni (najświeższy wpis) więc drobna modyfikacja i usuwa najstarszy:)

// kasuj ostatni gdy > 100
var dl = msg.data.attributes.options.length;
if (dl > 100) {
    msg.data.attributes.options.splice(0, 1);
}

// podmiana "Brak komunikatów"
if (msg.data.attributes.options.includes("Brak komunikatów")) {
    msg.data.attributes.options.splice(0,1);
}

// dodanie kolejnej pozycji
if (!msg.data.attributes.options.includes(msg.wiadomosc.tresc)) {
    msg.data.attributes.options.push(msg.wiadomosc.tresc);
}

msg.payload = 
{
    "data": 
    {
        "options":msg.data.attributes.options
    }    
}
return msg;

:+1:… no tak :slight_smile: odpowiedź była pod nosem

// podmiana "Brak komunikatów"
if (msg.data.attributes.options.includes("Brak komunikatów")) {
    msg.data.attributes.options.splice(0,1);
}

tak może odświeżę kotleta… ale czy da się wyświetlić listę input_select w odwróconej kolejności ?
aktualnie działa to od bardzo dawna dobrze… jednak najnowsze wpisy dodają się na sam dół… fajnie by było jednak mieć najnowsze od góry?
ktoś ma pomysł jak?

########################## INFORMACJE ##########################
  - type: custom:button-card
    template: komunikaty
    variables:
      nazwa: Lista informacji
      kolor: var(--state-icon-color)
      ilosc: sensor.input_select_informacjie
    entity: input_select.informacje

a sam custom:button-card wygląda tak:


type: custom:button-card
entity: '[[[ return entity.entity_id ]]]'
name: '[[[ return variables.nazwa ]]]'
triggers_update: all
tap_action:
  action: none
custom_fields:
  sensor_1: |
    [[[ return `${states[entity.entity_id].attributes.options}` ]]]
  sensor_2: |
    [[[ return `${states[variables.ilosc].state}` ]]]
styles:
  card:
    - padding: 5px 5px
  icon:
    - width: 20%
    - color: '[[[ return variables.kolor ]]]'
  name:
    - color: '[[[ return variables.kolor ]]]'
    - font-weight: bold
    - font-size: 130%
    - padding-left: 30px
  grid:
    - grid-template-areas: '"n i sensor_2" "sensor_1 sensor_1 sensor_1"'
    - grid-template-columns: 60% 30% 10%
  custom_fields:
    sensor_1:
      - white-space: pre-line
      - text-align: start
      - padding-left: 10px
    sensor_2:
      - padding-left: 10px
sensor_1: |
    [[[ return `${states[entity.entity_id].attributes.options[::-1]}` ]]]  # Odwrócenie kolejności wyświetlania listy input_select

Pomógł GPT bo ja się na tym znam jak słoń na gwiazdach :slight_smile:

no niestety nie :stuck_out_tongue: nie pokazuje nic… więc błędna składnia… albo coś
no ale powiem Ci że nie wpadłem na to aby GPT pytać :smiley: jednak za stary jestem :stuck_out_tongue:

A ja dzisiaj wpadłem na to żeby go pytać o tematy z HA związane :slight_smile:

Na oficjalnym forum HA jest zakaz używania GPT do pomocy w tematach, gdzie nie znamy rozwiązania, tu się też tego trzymajmy - zbiór danych na których trenowano GPT jest mocno nieaktualny, więc wygenerowane odpowiedzi są zwykle w przestrzeni sci-fi, z tym, że bardziej fiction, niż science…

1 polubienie