Procesy z życia wzięte - Status poranny

ja powiadomienie na telefon robię przez noda function, przez call service też mi nie chciało iść

wstaw function node a w call service pole “Data” pusto

msg.payload =
{
  "data": {
    "message": "TTS",
    "data": {
      "tts_text": msg.wiadomosc,
      "media_stream": "alarm_stream"
    }
  }
}
return msg;

No dobra, ale jak wywołać do tej funkcji konkretne urządzenie? (notify.mobile_app_)

nodem call service

Hej
Zrobiłem w końcu status poranny i działa (głosowo OK). Mam jednak pytanie o prawidłowe nody w kwestii konfiguracji aby status był odczytywany konkretnie między 5.30 a 6.30 rano z konkretnym warunkiem: lampka musi być: ON, oraz czujnik ruchu musi wykrywać ruch, maksymalnie 1 powtórzenie. Niestety początkowy Inject node nie pozwala na ustawienie dowolnych godzin uruchomienia (tylko pełne godziny). Ciągle coś mi nie działa w tych ustawieniach…

https://flows.nodered.org/node/node-red-contrib-sun-position

do ograniczeń czasowych używam TimeRangeNode możesz co do minuty wstawić warunki,

do ograniczenia TYLKO RAZ DeleyNode ale z parametrem RateLimit :slight_smile:

image

Witam chciałem zrobić sobie na test pierwszy lepszy przykład i wywala mi błąd.



Nie działa, bo nie przesyłasz do nodu call service informacji w takiej formie w jakiej ich oczekuje.
W nodzie call service masz coś takiego z prawej strony u dołu jak Load example data. Kliknij i sprawdź jaką formę musi mieć msg.payload dla google_say. Niżej w tabelce masz wszystkie właściwości jakie możesz przesłać.

nie rozumiem, dziwi mnie czemu orginalny przykład Artura nie działa.

A czy Twój flow wygląda tak jak ‘orginalny’ flow Artura?

Za nodem ‘function 1’ wstaw kolejny nod fuction zawierający:

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

W oryginalnym flow jest to ostatni nod function przed nodem call service ‘Głosnik Artura’.

Witam, napiszę do ekspertów, ponieważ z node red jestem noga.

[{"id":"377af94b9b8466e8","type":"api-call-service","z":"d615831f.f58e4","name":"Głośnik","server":"46d72cce.d68324","version":5,"debugenabled":false,"domain":"tts","service":"google_cloud_say","areaId":[],"deviceId":[],"entityId":["media_player.google_home_mini"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","output_location":"","output_location_type":"none","x":1440,"y":580,"wires":[[]]},{"id":"353576bd6bc3e4ff","type":"function","z":"d615831f.f58e4","name":"Pełna wiadomość","func":"msg.payload =\n{\n    \"data\":\n    {\n        \"message\": msg.wiadomosc,\n    }\n}\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1250,"y":580,"wires":[["377af94b9b8466e8"]]},{"id":"32be454e23a46fc7","type":"function","z":"d615831f.f58e4","name":"Temperatura","func":"msg.temperatura = Math.round(msg.airly_temp);\nmsg.wiadomosc = msg.wiadomosc+\n    \"Temperatura wynosi \"+msg.temperatura+\" stopni celcjusza.\";\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":790,"y":580,"wires":[["4efec7bbf4fc1d17"]]},{"id":"d6d6d3710fbe1593","type":"api-current-state","z":"d615831f.f58e4","name":"Aktualna temperatura","server":"46d72cce.d68324","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.airly_temperatura","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"airly_temp","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":600,"y":580,"wires":[["32be454e23a46fc7"]]},{"id":"7ea660e15865de6c","type":"function","z":"d615831f.f58e4","name":"Aktualna data","func":"const teraz = new Date();\nconst dni_tygodnia = [\"niedziela\", \"poniedziałek\", \"wtorek\", \"środa\", \"czwartek\", \"piątek\", \"sobota\"];\n\nconst miesiace = [\"stycznia\",\"lutego\",\"marca\",\"kwietnia\",\"maja\",\"czerwca\",\"lipca\",\n                  \"sierpnia\",\"września\",\"października\",\"listopada\",\"grudnia\"];\n                  \nconst godziny = [\"północ\", \"pierwsza\",\"druga\",\"trzecia\", \"czwarta\",\"piąta\", \n                 \"szósta\", \"sidma\", \"ósma\", \"dziewiąta\", \"dziesiąta\", \"jedenasta\", \n                 \"dwunasta\", \"trzynasta\", \"czternasta\",\"piętnasta\", \"szesnasta\", \n                 \"siedemnasta\", \"osiemstansta\", \"dziewiętnasta\", \"dwudziesta\", \n                 \"dwudziestapierwsza\", \"dwudziestadruga\", \"dwudziestatrzecia\"];\n                 \nconst dzien_slow = [\"pierwszy\", \"drugi\",\"trzeci\", \"czwarty\", \"piąty\", \"szósty\", \n                    \"siódmy\", \"ósmy\", \"dziewiąty\", \"dziesiąty\", \"jedynasty\", \n                    \"dwunasty\", \"trzynasty\", \"czternasty\", \"piętnasty\", \"szesnasty\", \n                    \"siedemnasty\", \"osiemnasty\", \"dziewiętnasty\", \"dwudziesty\", \n                    \"dwudziestypierwszy\", \"dwudziestydrugi\", \"dwudziestytrzeci\", \n                    \"dwudziestyczwarty\", \"dwudzistypiąty\", \"dwudziestyszósty\", \n                    \"dwudziestysiódmy\", \"dwudziestyósmy\", \"dwudziestydziewiąty\", \n                    \"trzydziesty\", \"trzydziestypierwszy\"];\n\nmsg.akt_godzina = `${ godziny[teraz.getHours()] }`;\nmsg.minuty = teraz.getMinutes();\n\nmsg.dzien_tygodnia = `${ dni_tygodnia[teraz.getDay()] }`;\nmsg.dzien_miesiaca = `${ dzien_slow[teraz.getDate()] }`;\nmsg.miesiac = `${ miesiace[teraz.getMonth()] }`\n\nmsg.wiadomosc = \"Dzień dobry. Dzisiaj jest \"+msg.dzien_tygodnia+\" \"+msg.dzien_miesiaca+\" dzień \"+msg.miesiac+\". Godzina \"+msg.akt_godzina+\" \"+msg.minuty;\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":400,"y":580,"wires":[["d6d6d3710fbe1593"]]},{"id":"89fea13242008e54","type":"inject","z":"d615831f.f58e4","name":"test","props":[],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":270,"y":520,"wires":[["7ea660e15865de6c"]]},{"id":"4efec7bbf4fc1d17","type":"api-current-state","z":"d615831f.f58e4","name":"Pada?","server":"46d72cce.d68324","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"binary_sensor.czujnik_deszczu","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":930,"y":580,"wires":[["a88c71d797f124a1"],["9a2f5c064bb73a9a"]]},{"id":"a88c71d797f124a1","type":"function","z":"d615831f.f58e4","name":"Pada","func":"msg.wiadomosc = msg.wiadomosc+\n    \"Wykryto opady na zewnątrz. Dobrego dnia.\";\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1070,"y":540,"wires":[["353576bd6bc3e4ff"]]},{"id":"9a2f5c064bb73a9a","type":"function","z":"d615831f.f58e4","name":"Nie pada","func":"msg.wiadomosc = msg.wiadomosc+\n    \"Dobrego dnia.\";\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1080,"y":620,"wires":[["353576bd6bc3e4ff"]]},{"id":"46d72cce.d68324","type":"server","name":"Home Assistant","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true}]

Problem polega na tym, że źle odczytuje datę. Dzisiaj jest 24.09 a z głośnika leci 25 września. Jak to naprawić?

Cześć,
Głośnik źle czyta datę bo w przypadku funkcji getDate() indeksowanie zaczyna się od ‘jedynki’ i zakres zwracanych wartości to 1 - 31, a Indeksowanie tablic (w tym Twojej dzien_slow) zaczyna się od 0.
Funkcja getDate() pierwszego dnia miesiąca zwróci 1. W Twojej tablicy dzien_slow z indeksem 0 masz wartość ‘pierwszy’, z indeksem 1 jest ‘drugi’. Funcja getDate() zwróci 1 i głośnik ‘wypluje’ “drugi” dzień miesiąca.

Musisz albo zmiejszyć pobieraną wartośc z getDate() o jeden, albo na samym poczatku tablicy dzien_slow dodać jeszcze jedną dowolną wartość, która z indeksem 0 nigdy nie zostanie sprawdzona. W Twoim przypadku nigdy nie zostanie sprawdzona ‘pierwszy’.

W przypadku getMonth() i Twojej tablicy ‘miesiące’ wszystko działa jak należy bo funkcja zwraca wartości od 0 - 11. Styczeń w tym wypadku zwróci 0

Cześć
Czy ktoś juz rozgryzał temat, z naszym statusem porannym i openweathermap api v3.0? Nie mogę tego uruchomić, a zdaje się ze API v3.0 jest płatne powyżej 1000 odpytań …

Jest płatne, ale to nie jest problem, bo można sobie zlimitować ilość zapytań na które zezwoli ich serwer, co gwarantuje brak obciążeń karty, czy tam innej podłączonej metody płatności.


Standardowo tam jest 2000 zapytań, czyli można sobie nabić rachunku 1.2 GBP (+VAT) dziennie.

W nowej wersji nie ma już encji sensor.openweathermap_forecast_condition (informację o nadchodzącej pogodzie) czy ktoś to może rozkminił czym to zastąpić?

1 polubienie

Ja używam noda openweathermap oczywiście z blokadą do 1000 zapytań, dostajemy od razu całą prognozę z wszystkimi danymi. Trzeba to tylko ubrać w funkcje i tyle.

1 polubienie

Jak pisali poprzednicy. API 3.0 z blokadą i robisz template. Encje są poza integracją openweathermap, ale nazwa zostaje taka jak była poprzednio

template:
  - trigger:
      - platform: time_pattern
        minutes: /2
    action:
      - service: weather.get_forecasts
        data:
          type: daily
        target:
          entity_id: weather.openweathermap
        response_variable: daily
    sensor:
      - name: OpenWeatherMap Forecast Cloud coverage
        unique_id: openweathermap_forecast_cloud_coverage
        state: "{{ daily['weather.home'].forecast[0].cloud_coverage }}"
        unit_of_measurement: '%'
      - name: OpenWeatherMap Forecast Condition
        unique_id: openweathermap_forecast_condition
        state: "{{ daily['weather.home'].forecast[0].condition }}"
      - name: OpenWeatherMap Forecast Precipitation
        unique_id: openweathermap_forecast_precipitation
        state: "{{ daily['weather.home'].forecast[0].precipitation }}"
        unit_of_measurement: mm
        device_class: precipitation
      - name: OpenWeatherMap Forecast Precipitation probability
        unique_id: openweathermap_forecast_precipitation_probability
        state: "{{ daily['weather.home'].forecast[0].precipitation_probability }}"
        unit_of_measurement: '%'
      - name: OpenWeatherMap Forecast Pressure
        unique_id: openweathermap_forecast_pressure
        state: "{{ daily['weather.home'].forecast[0].pressure }}"
        unit_of_measurement: hPa
        device_class: pressure
      - name: OpenWeatherMap Forecast Temperature
        unique_id: openweathermap_forecast_temperature
        state: "{{ daily['weather.home'].forecast[0].temperature }}"
        unit_of_measurement: °C
        device_class: temperature
      - name: OpenWeatherMap Forecast Temperature Low
        unique_id: openweathermap_forecast_temperature_low
        state: "{{ daily['weather.home'].forecast[0].templow }}"
        unit_of_measurement: °C
        device_class: temperature
      - name: OpenWeatherMap Forecast Time
        unique_id: openweathermap_forecast_time
        state: "{{ daily['weather.home'].forecast[0].datetime }}"
        device_class: timestamp
      - name: OpenWeatherMap Forecast Wind bearing
        unique_id: openweathermap_forecast_wind_bearing
        state: "{{ daily['weather.home'].forecast[0].wind_bearing }}"
        unit_of_measurement: °
      - name: OpenWeatherMap Forecast Wind speed
        unique_id: openweathermap_forecast_wind_speed
        state: "{{ daily['weather.home'].forecast[0].wind_speed }}"
        unit_of_measurement: m/s
        device_class: wind_speed

Już ogarnąłem nodem openweathermap. Template pewnie też się przyda.
Dzięki wielkie panowie @ajakubek @rizydorczyk