API domogeek perds les infos tout le temps

System Health

version 2021.1.5
installation_type Home Assistant OS
dev false
hassio true
docker true
virtualenv false
python_version 3.8.7
os_name Linux
os_version 5.4.79-v8
arch aarch64
timezone Europe/Brussels
Home Assistant Community Store
GitHub API ok
Github API Calls Remaining 4947
Installed Version 1.10.1
Stage running
Available Repositories 709
Installed Repositories 4
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Hass.io
host_os Home Assistant OS 5.10
update_channel stable
supervisor_version 2021.01.7
docker_version 19.03.13
disk_total 6.6 GB
disk_used 3.8 GB
healthy true
supported true
board rpi3-64
supervisor_api ok
version_api ok
installed_addons KNXD daemon (0.3.6), File editor (5.2.0), Samba share (9.3.0), Node-RED (8.0.1)
Lovelace
dashboards 1
mode storage
views 2
resources 1

Mon problème

Bonjour,

Comme indiqué dans le titre, mes requêtes sur l’API domogeek n’arrêtent pas de passer de la bonne valeur à Inconnu. Je le fait en RESTfull.
Si je veux l’utiliser dans mes automations, il y a une chance sur 2 que l’info retournée sera « inconnu ».
Avez-vous aussi ce problème?
Existe-t-il un autre moyen de récupérer les mêmes infos que sur domogeek?
N’y a t-il pas moyen qu’il fasse: si valeur inconnue, garder la valeur précédante?

Je vous remercie

Bonjour,

Tu utilises quel code ?
Regarde ici au cas où.
https://forum.hacf.fr/t/exemple-dutilisation-de-lapi-domogeek-pour-les-vacances-scolaires/435
2 suggestions :

  • passer par l’integration google calendar et utiliser les vacances scolaires.
  • Mettre les informations récupérées de l’API de domogeek dans un input puis baser tes automatisations à partir de l’input et non depuis le restful.
1 « J'aime »

Comme ceci (par exemple) :

sensor:
  - platform: template
    sensors:
      apidomogeek_saison_sauvegarde:
        friendly_name: "Saison"
        value_template: >-
          {% if not ( is_state('sensor.apidomogeek_saison', 'unknown') or is_state('sensor.apidomogeek_saison', 'unavailable') ) %}
            {{states('sensor.apidomogeek_saison')}}
          {% else %}
            {{states('sensor.apidomogeek_saison_sauvegarde')}}
          {% endif %}
  - platform: rest
    scan_interval: '06:00:00'
    name: apidomogeek_saison
    resource: "http://api.domogeek.fr/season/json"
    value_template: "{{ value_json.season }}"
1 « J'aime »

Merci d’avoir complété, je n’avais pas le temps de suite.

Je n’aurais pas fait comme cela non plus, mais parfait :wink:

1 « J'aime »

Dès que t’as le temps, n’hésites pas à partager, c’est toujours mieux d’avoir plusieurs exemples :+1: :smiling_face_with_three_hearts:

Dans https://forum.hacf.fr/t/si-sinon-if-else-en-node-red/2389/28 , une troisième option sous NodeRed (@Clemalex pas taper :slight_smile: ) qui permet en plus de faire tout ça en local avec 10 lignes de javascript pompées sur Internet pour la saison.
Autant pour la météo ou les horaires de bus, aller chercher l’info dans le « cloud » pas le choix. Pour des trucs basiques, je préfère rester local. Au moins quand ça ne marche pas, je connais le coupable.

1 « J'aime »

Aucun souci, surtout que je voulais mettre le lien du style On en parle ici mais j’ai oublié :shushing_face:

Le but de ma réponse était surtout pour montrer comment faire une sorte de sauvegarde :+1:

1 « J'aime »

Bonjour,

En fait, j’ai utilisé la facon (en local) de @golfvert pour mon scenario de fermeture de volets.
Seulement, je suis encore une bille mais j’aurais besoin également de l’info WE, WE demain, Férié, Férié demain.
Pour les vacances, étant belge, domogeek ne va pas pour moi et je le récupère avec google agenda.
Si vous savez comment je peux récupérer , en local les histoires de we et feriés, je suis preneur.
Je ne voulais pas t’offenser @golfvert , j’ai utilisé ta méthode mais pas eu le temps de répondre, il était très tard. et merci à toi

Euh non, ce n’est pas évident pour férié notamment…
En cherchant sur Internet, j’ai trouvé un code pour Nodered :slight_smile: Determine properties like holiday, business day, weekend, etc at the moment when message is received. (flow) - Node-RED adapté à la Slovénie :frowning:

Mais, au moins en France, les dates des jours fériés sont soient fixes soient dépendent de Pâques, j’ai adapté son code à la France.
J’ai également rajouté un « shift » pour avoir les infos sur un autre jour.

Et donc, en demandant la date 398 jours en arrière par rapport à aujourd’hui (2/2/21)
{ "_msgid":"6f5a1fc9.560d2", "payload":-398,"date":"2020-01-01T22:23:37.374Z", "holiday":true, "businessday":false, "weekend":false, "weekday":3, "leapyear":true, "holiday_name":"Jour de l'an", "properties":"holiday=true,businessday=false,weekend=false,weekday=3,leapyear=true" }

On voit que le 1er janvier 2020 est un jour férié et que c’était un mercredi…

Ou plus simplement pour demain (donc msg.payload égale 1):

[{"id":"18bb465c.d91d9a","type":"function","z":"f5b50430.ea48b8","name":"Propriété de la date","func":"/*\n\n * ----------------------------------------------------------------------------\n * \"THE BEER-WARE LICENSE\" (Revision 42):\n * github.com/mrizvic wrote this file.  As long as you retain this notice you\n * can do whatever you want with this stuff. If we meet some day, and you think\n * this stuff is worth it, you can buy me a beer in return.   M.Rizvic\n * ----------------------------------------------------------------------------\n * Avec une adaptation de R.Giraud pour la France - Mais ça ne mérite pas une bière\n * avec en plus la possibilté via msg.payload de demander une autre date + ou - X jours\n * par rapport à aujourd'hui\n\n## This function will pass incoming message to multiple outputs based on following conditions:\n## output 1 - unconditional\n## output 2 - if its holiday\n## output 3 - if its business day\n## output 4 - if its weeekend\n## output 5 - if its leap year\n\n## Holidays are defined in a matter of if..else if sentences as shown below in USER SPECIFIC DATES section. Some holidays are variable and must be calculated each time (e.g. easter)\n## Some properties will be appended to original message in case some would like to use them. Below is an example:\n\n_msgid: \"78a5e9f0.a318e8\"\ntopic: \"\"\npayload: 4\ndate: \"2017-02-23T15:59:59.401Z\"\nholiday: false\nbusinessday: true\nweekend: false\nweekday: 4\nleapyear: false\nproperties: \"holiday=false,businessday=true,weekend=false,weekday=4,leapyear=false\"\n\nweekday numbers are in range from 1 to 7 where is 1 for monday, 2 for tuesday, ... and 7 for sunday\ntariff can be 'vt' (high tariff) or 'mt' (low tariff)\n*/\n\nvar futur = msg.payload;\n// take current timestamp\nvar today = new Date();\nvar date = today.addDays(futur);\n\nvar getEasterDate = function(year) {\n  var a = year % 19;\n  var b = Math.floor(year / 100);\n  var c = year % 100;\n  var d = Math.floor(b / 4);\n  var e = b % 4;\n  var f = Math.floor((b + 8) / 25);\n  var g = Math.floor((b - f + 1) / 3);\n  var h = (19 * a + b - d - g + 15) % 30;\n  var i = Math.floor(c / 4);\n  var k = c % 4;\n  var l = (32 + 2 * e + 2 * i - h - k) % 7;\n  var m = Math.floor((a + 11 * h + 22 * l) / 451);\n  var n0 = (h + l + 7 * m + 114);\n  var n = Math.floor(n0 / 31) - 1;\n  var p = n0 % 31 + 1;\n  var date = new Date(year,n,p);\n  return date;\n};\n\nDate.prototype.addDays = function(days)\n{\n    var dat = new Date(this.valueOf());\n    dat.setDate(dat.getDate() + days);\n    return dat;\n};\n\nvar weekday = date.getDay();\nif (weekday === 0) { weekday = 7; }\n\nvar year = date.getFullYear();\nvar month = date.getMonth() + 1;\nvar day = date.getDate();\nvar hour = date.getHours();\n\nvar isHoliday = false;\nvar holidayString = \"\";\nvar isLeapYear = new Date(year, 1, 29).getMonth() == 1;\n\n// sunday or saturday\nvar isWeekend = (weekday > 5);\nvar isBusinessDay = ! isWeekend;\n\n\n// USER SPECIFIC DATES - BEGIN\n\n// Dimanche de Pâques\nvar easterDate = getEasterDate(year);\nvar ed1 = easterDate.getDate();\nvar em1 = easterDate.getMonth() + 1;\n\n// Lundi de Pâques\nvar easterMonday = easterDate.addDays(1);\nvar ed2 = easterMonday.getDate();\nvar em2 = easterMonday.getMonth() + 1;\n\n// Ascension = (Dimanche de Pâques + 39)\nvar ascension = easterDate.addDays(39);\nvar ad1 = ascension.getDate();\nvar am1 = ascension.getMonth() + 1;\n\n// Pentecôte\nvar pentecote = easterDate.addDays(50);\nvar pd1 = pentecote.getDate();\nvar pm1 = pentecote.getMonth() + 1;\n\n// set date specific properties\n\n     if ( (month == 1)   && (day == 1)   ) { isHoliday = true; isBusinessDay = false; holidayString = \"Jour de l'an\"; }\nelse if ( (month == em1) && (day == ed1) ) { isHoliday = true; isBusinessDay = false; holidayString = \"Dimanche de Pâques\"; }\nelse if ( (month == em2) && (day == ed2) ) { isHoliday = true; isBusinessDay = false; holidayString = \"Lundi de Pâques\"; }\nelse if ( (month == 5)   && (day == 1)   ) { isHoliday = true; isBusinessDay = false; holidayString = \"Premier mai\"; }\nelse if ( (month == 5)   && (day == 8)   ) { isHoliday = true; isBusinessDay = false; holidayString = \"Armistice 39/45\"; }\nelse if ( (month == am1) && (day == ad1) ) { isHoliday = true; isBusinessDay = false; holidayString = \"Ascension\"; }\nelse if ( (month == pm1) && (day == pd1) ) { isHoliday = true; isBusinessDay = false; holidayString = \"Pentecôte\";}\nelse if ( (month == 7)   && (day == 14)  ) { isHoliday = true; isBusinessDay = false; holidayString = \"Fête Nationale\"; }\nelse if ( (month == 8)   && (day == 15)  ) { isHoliday = true; isBusinessDay = false; holidayString = \"Assomption\"; }\nelse if ( (month == 11)  && (day == 1)   ) { isHoliday = true; isBusinessDay = false; holidayString = \"Toussaint\"; }\nelse if ( (month == 11)  && (day == 11)  ) { isHoliday = true; isBusinessDay = false; holidayString = \"Armistice 14/18\"; }\nelse if ( (month == 12)  && (day == 25)  ) { isHoliday = true; isBusinessDay = false; holidayString = \"Noël\"; }\n\n// preserve original message\nvar result = msg;\nmsg.date = date;\n\n// add our properties\nresult.holiday = isHoliday;\nresult.businessday = isBusinessDay;\nresult.weekend = isWeekend;\nresult.weekday = weekday;\nresult.leapyear = isLeapYear;\nif (holidayString.length > 0) {\n  result.holiday_name = holidayString;\n}\n\n// generate string of properties so one could\n// parse using switch node\nresult.properties = '';\nresult.properties += 'holiday=' + isHoliday + ',';\nresult.properties += 'businessday=' + isBusinessDay + ',';\nresult.properties += 'weekend=' + isWeekend + ',';\nresult.properties += 'weekday=' + weekday + ',';\nresult.properties += 'leapyear=' + isLeapYear;\n\n// generate conditional outputs\nmsg = result;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":410,"y":2460,"wires":[["bb47b7a1.f10398"]]},{"id":"6e1cf6e6.e7c138","type":"inject","z":"f5b50430.ea48b8","name":"Demain","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":"","topic":"","payload":"1","payloadType":"num","x":210,"y":2460,"wires":[["18bb465c.d91d9a"]]},{"id":"bb47b7a1.f10398","type":"debug","z":"f5b50430.ea48b8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":590,"y":2460,"wires":[]}]

A adapter pour la Belgique avec les jours fériés locaux :slight_smile:

bonjour

@golfvert j’ai copié ton flow, et en le testant j’ai une erreur :

function : (error)
"TypeError: today.addDays is not a function"

@+

Je viens de recopier ce que j’ai posté chez moi et ça passe… Qu’est ce que tu injectes comme payload?
Tu peux copier ton flot ici?

re
j’ai copié ton flux sans rien changer le node inject je l’avais pas ouvert

[{"id":"b4e63e7d.ce16e","type":"tab","label":"Flow 2","disabled":false,"info":""},{"id":"18bb465c.d91d9a","type":"function","z":"b4e63e7d.ce16e","name":"Propriété de la date","func":"/*\n\n * ----------------------------------------------------------------------------\n * \"THE BEER-WARE LICENSE\" (Revision 42):\n * github.com/mrizvic wrote this file.  As long as you retain this notice you\n * can do whatever you want with this stuff. If we meet some day, and you think\n * this stuff is worth it, you can buy me a beer in return.   M.Rizvic\n * ----------------------------------------------------------------------------\n * Avec une adaptation de R.Giraud pour la France - Mais ça ne mérite pas une bière\n * avec en plus la possibilté via msg.payload de demander une autre date + ou - X jours\n * par rapport à aujourd'hui\n\n## This function will pass incoming message to multiple outputs based on following conditions:\n## output 1 - unconditional\n## output 2 - if its holiday\n## output 3 - if its business day\n## output 4 - if its weeekend\n## output 5 - if its leap year\n\n## Holidays are defined in a matter of if..else if sentences as shown below in USER SPECIFIC DATES section. Some holidays are variable and must be calculated each time (e.g. easter)\n## Some properties will be appended to original message in case some would like to use them. Below is an example:\n\n_msgid: \"78a5e9f0.a318e8\"\ntopic: \"\"\npayload: 4\ndate: \"2017-02-23T15:59:59.401Z\"\nholiday: false\nbusinessday: true\nweekend: false\nweekday: 4\nleapyear: false\nproperties: \"holiday=false,businessday=true,weekend=false,weekday=4,leapyear=false\"\n\nweekday numbers are in range from 1 to 7 where is 1 for monday, 2 for tuesday, ... and 7 for sunday\ntariff can be 'vt' (high tariff) or 'mt' (low tariff)\n*/\n\nvar futur = msg.payload;\n// take current timestamp\nvar today = new Date();\nvar date = today.addDays(futur);\n\nvar getEasterDate = function(year) {\n  var a = year % 19;\n  var b = Math.floor(year / 100);\n  var c = year % 100;\n  var d = Math.floor(b / 4);\n  var e = b % 4;\n  var f = Math.floor((b + 8) / 25);\n  var g = Math.floor((b - f + 1) / 3);\n  var h = (19 * a + b - d - g + 15) % 30;\n  var i = Math.floor(c / 4);\n  var k = c % 4;\n  var l = (32 + 2 * e + 2 * i - h - k) % 7;\n  var m = Math.floor((a + 11 * h + 22 * l) / 451);\n  var n0 = (h + l + 7 * m + 114);\n  var n = Math.floor(n0 / 31) - 1;\n  var p = n0 % 31 + 1;\n  var date = new Date(year,n,p);\n  return date;\n};\n\nDate.prototype.addDays = function(days)\n{\n    var dat = new Date(this.valueOf());\n    dat.setDate(dat.getDate() + days);\n    return dat;\n};\n\nvar weekday = date.getDay();\nif (weekday === 0) { weekday = 7; }\n\nvar year = date.getFullYear();\nvar month = date.getMonth() + 1;\nvar day = date.getDate();\nvar hour = date.getHours();\n\nvar isHoliday = false;\nvar holidayString = \"\";\nvar isLeapYear = new Date(year, 1, 29).getMonth() == 1;\n\n// sunday or saturday\nvar isWeekend = (weekday > 5);\nvar isBusinessDay = ! isWeekend;\n\n\n// USER SPECIFIC DATES - BEGIN\n\n// Dimanche de Pâques\nvar easterDate = getEasterDate(year);\nvar ed1 = easterDate.getDate();\nvar em1 = easterDate.getMonth() + 1;\n\n// Lundi de Pâques\nvar easterMonday = easterDate.addDays(1);\nvar ed2 = easterMonday.getDate();\nvar em2 = easterMonday.getMonth() + 1;\n\n// Ascension = (Dimanche de Pâques + 39)\nvar ascension = easterDate.addDays(39);\nvar ad1 = ascension.getDate();\nvar am1 = ascension.getMonth() + 1;\n\n// Pentecôte\nvar pentecote = easterDate.addDays(50);\nvar pd1 = pentecote.getDate();\nvar pm1 = pentecote.getMonth() + 1;\n\n// set date specific properties\n\n     if ( (month == 1)   && (day == 1)   ) { isHoliday = true; isBusinessDay = false; holidayString = \"Jour de l'an\"; }\nelse if ( (month == em1) && (day == ed1) ) { isHoliday = true; isBusinessDay = false; holidayString = \"Dimanche de Pâques\"; }\nelse if ( (month == em2) && (day == ed2) ) { isHoliday = true; isBusinessDay = false; holidayString = \"Lundi de Pâques\"; }\nelse if ( (month == 5)   && (day == 1)   ) { isHoliday = true; isBusinessDay = false; holidayString = \"Premier mai\"; }\nelse if ( (month == 5)   && (day == 8)   ) { isHoliday = true; isBusinessDay = false; holidayString = \"Armistice 39/45\"; }\nelse if ( (month == am1) && (day == ad1) ) { isHoliday = true; isBusinessDay = false; holidayString = \"Ascension\"; }\nelse if ( (month == pm1) && (day == pd1) ) { isHoliday = true; isBusinessDay = false; holidayString = \"Pentecôte\";}\nelse if ( (month == 7)   && (day == 14)  ) { isHoliday = true; isBusinessDay = false; holidayString = \"Fête Nationale\"; }\nelse if ( (month == 8)   && (day == 15)  ) { isHoliday = true; isBusinessDay = false; holidayString = \"Assomption\"; }\nelse if ( (month == 11)  && (day == 1)   ) { isHoliday = true; isBusinessDay = false; holidayString = \"Toussaint\"; }\nelse if ( (month == 11)  && (day == 11)  ) { isHoliday = true; isBusinessDay = false; holidayString = \"Armistice 14/18\"; }\nelse if ( (month == 12)  && (day == 25)  ) { isHoliday = true; isBusinessDay = false; holidayString = \"Noël\"; }\n\n// preserve original message\nvar result = msg;\nmsg.date = date;\n\n// add our properties\nresult.holiday = isHoliday;\nresult.businessday = isBusinessDay;\nresult.weekend = isWeekend;\nresult.weekday = weekday;\nresult.leapyear = isLeapYear;\nif (holidayString.length > 0) {\n  result.holiday_name = holidayString;\n}\n\n// generate string of properties so one could\n// parse using switch node\nresult.properties = '';\nresult.properties += 'holiday=' + isHoliday + ',';\nresult.properties += 'businessday=' + isBusinessDay + ',';\nresult.properties += 'weekend=' + isWeekend + ',';\nresult.properties += 'weekday=' + weekday + ',';\nresult.properties += 'leapyear=' + isLeapYear;\n\n// generate conditional outputs\nmsg = result;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":320,"y":80,"wires":[["bb47b7a1.f10398"]]},{"id":"6e1cf6e6.e7c138","type":"inject","z":"b4e63e7d.ce16e","name":"Demain","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":"","topic":"","payload":"1","payloadType":"num","x":120,"y":80,"wires":[["18bb465c.d91d9a"]]},{"id":"bb47b7a1.f10398","type":"debug","z":"b4e63e7d.ce16e","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":500,"y":80,"wires":[]}]

Ca passe sans problème chez moi… en important « ton » flot. Je ne sais pas pourquoi.

re,

moi non plus, j’ai peut être quelque chose en plus ou en moins ??

c’est pas grave
@+

Quelle version de nodered? ou de l’addon? C’est du pur javascript (que je ne connais pas), donc ça devrait marcher.
La source slovene est là Determine properties like holiday, business day, weekend, etc at the moment when message is received. (flow) - Node-RED tu pourrais voir si ça marche ou pas… Le morceau qui coince est le (tout) petit morceau que j’ai changé?

System Health

version: core-2021.2.1
installation_type: Home Assistant OS
dev: false
hassio: true
docker: true
virtualenv: false
python_version: 3.8.7
os_name: Linux
os_version: 5.4.79-v8
arch: aarch64
timezone: Europe/Paris

GitHub API: ok
Github API Calls Remaining: 4909
Installed Version: 1.10.1
Stage: running
Available Repositories: 711
Installed Repositories: 8

logged_in: false
can_reach_cert_server: ok
can_reach_cloud_auth: ok
can_reach_cloud: ok

host_os: Home Assistant OS 5.10
update_channel: stable
supervisor_version: supervisor-2021.01.7
docker_version: 19.03.13
disk_total: 116.7 GB
disk_used: 15.1 GB
healthy: true
supported: true
board: rpi4-64
supervisor_api: ok
version_api: ok
installed_addons: Samba share (9.3.0), Terminal & SSH (9.0.0), Mosquitto broker (5.1), FTP (4.0.0), ADB - Android Debug Bridge (0.7.0), Visual Studio Code (3.0.1), deCONZ (6.6.3), InfluxDB (4.0.1), Grafana (6.0.0), Node-RED (8.0.1), Let’s Encrypt (4.11.0), ESPHome (1.16.0), Z-Wave JS (0.1.4)

dashboards: 2
resources: 6
views: 4
mode: storage

@golfvert tu vas pas être content, le code original fonctionne !

msg : Object
object
_msgid: "1d3afaa8.051a05"
payload: "power on"
topic: ""
date: "2021-02-05T21:35:28.533Z"
tariff: "mt"
holiday: false
businessday: true
weekend: false
weekday: 5
leapyear: false
properties: "tariff=mt,holiday=false,businessday=true,weekend=false,weekday=5,leapyear=false"

@golfvert et encore plus content avec les mises à HA et nodered ta version fonctionne aussi

merci

1 « J'aime »