{"id":2158,"date":"2020-11-08T16:24:00","date_gmt":"2020-11-08T15:24:00","guid":{"rendered":"https:\/\/tybou.eu\/wordpress\/?p=2158"},"modified":"2023-11-08T18:58:28","modified_gmt":"2023-11-08T17:58:28","slug":"domoticz","status":"publish","type":"post","link":"https:\/\/tybou.eu\/wordpress\/blog\/2020\/11\/08\/domoticz\/","title":{"rendered":"Domoticz"},"content":{"rendered":"\n<p>Installation sous Debian en utilisant docker compose (source : <a href=\"https:\/\/github.com\/domoticz\/domoticz-docker\">https:\/\/github.com\/domoticz\/domoticz-docker<\/a>) :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">version: \"3.7\"<br>services:<br>domoticz:<br>image: domoticz\/domoticz<br>container_name: domoticz<br>restart: unless-stopped<br># Pass devices to container<br># devices:<br># - \"\/dev\/serial\/by-id\/usb-0658_0200-if00:\/dev\/ttyACM0\"<br>ports:<br>- \"8084:8080\"<br>volumes:<br>- .\/config:\/opt\/domoticz\/userdata<br>environment:<br>- TZ=Europe\/Amsterdam<br>#- LOG_PATH=\/opt\/domoticz\/userdata\/domoticz.log<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Serveur MQTT<\/h2>\n\n\n\n<p>Installation sous Debian en utilisant docker compose :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">version: \"3.7\"\nservices:\nmosquitto:\nimage: eclipse-mosquitto\ncontainer_name: mosquitto\nrestart: unless-stopped\nports:\n- \"1883:1883\"\n- \"9001:9001\"\nvolumes:\n- \/docker\/mosquitto\/config:\/mosquitto\/config\/:rw\n- \/docker\/mosquitto\/data:\/mosquitto\/data\/:rw\n- \/docker\/mosquitto\/log:\/mosquitto\/log\/:rw<\/pre>\n\n\n\n<p>Cr\u00e9er les fichiers mosquitto.conf password.txt dans le r\u00e9pertoire config :<\/p>\n\n\n\n<p>Exemple de fichier mosquitto.conf (avec l&rsquo;authentification activ\u00e9e. Sinon, commenter les lignes) :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">persistence true\npersistence_location \/mosquitto\/data\/\nlog_dest file \/mosquitto\/log\/mosquitto.log\nlistener 1883\n## Authentication ##\nallow_anonymous false\npassword_file \/mosquitto\/config\/password.txt<\/pre>\n\n\n\n<p>Cr\u00e9er un fichier password.txt  vide :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">touch config\/password.txt<\/pre>\n\n\n\n<p>D\u00e9marrer le container :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">docker-compose up -d<\/pre>\n\n\n\n<p>Cr\u00e9er le premier user\/password, puis red\u00e9marrer le container pour prise en compte :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">docker-compose exec mosquitto mosquitto_passwd -c \/mosquitto\/config\/password.txt vanhaelen_Domoticz\ndocker-compose restart<\/pre>\n\n\n\n<p>Ajouter un user\/password, puis red\u00e9marrer le container pour prise en compte : <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">docker-compose exec mosquitto mosquitto_passwd -b \/mosquitto\/config\/password.txt vanhaelen_Device AZERTYPASSWORDTOALLOCATE\ndocker-compose restart<\/pre>\n\n\n\n<p>Autres commandes utiles :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">docker-compose stop\ndocker-compose down\ndocker logs mosquitto\ndocker logs -f mosquitto\ntail -f log\/mosquitto.log<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Config Domoticz<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Relier Domoticz au serveur MQTT<\/h3>\n\n\n\n<p>Aller dans le menu Setup\/Hardware,<br>Entrer le nom dans le champ Name: \u00ab\u00a0Mosquitto\u00a0\u00bb,<br>Puis choisir le type \u00ab\u00a0MQTT Client Gateway with LAN interface\u00a0\u00bb<br>Dans \u00ab\u00a0Remote Address\u00a0\u00bb mettre l&rsquo;adresse IP du serveur Mosquitto<br>Entrer un username et mot de passe pr\u00e9c\u00e9demment d\u00e9finis dans le serveur Mosquitto.<br>Voir dans le log du serveur si la connexion est correctement \u00e9tablie (commande tail -f log\/mosquitto.log)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ajout d&rsquo;un  switch Sonoff reflash\u00e9 Tasmota<\/h3>\n\n\n\n<p>Cr\u00e9ation nouveau mat\u00e9riel pour Sonoff sous Tasmota (source : <a href=\"https:\/\/www.lprp.fr\/2019\/12\/sonoff-basic-sous-domoticz-avec-tasmota\/\">https:\/\/www.lprp.fr\/2019\/12\/sonoff-basic-sous-domoticz-avec-tasmota\/<\/a> ) :<\/p>\n\n\n\n<p>Aller dans le menu Setup\/Hardware,<br>Entrer le nom dans le champ Name: \u00ab\u00a0Sonoff\u00a0\u00bb,<br>Puis choisir le type \u00ab\u00a0Dummy (Does nothing, use for virtual switches only)\u00a0\u00bb,<br>Cliquer sur Add.<\/p>\n\n\n\n<p>D\u00e9clarer le serveur MQTT dans le switch Sonoff sous Tasmota :<\/p>\n\n\n\n<p>Dans le menu configuration\/configure Domoticz, entrer les id :<br>&#8211; dans le champ \u00ab\u00a0idx 1\u00a0\u00bb : mettre celui du switch relev\u00e9 dans Domoticz,<br> &#8211; dans le champ \u00a0\u00bb Sensor idx 2 Temp,Hum\u00a0\u00bb, mettre celui du capteur d&rsquo;humidit\u00e9\/temp\u00e9rature.<br>Voir dans le log du serveur si la connexion est correctement \u00e9tablie (commande tail -f log\/mosquitto.log) <\/p>\n\n\n\n<p>Favoris pour le dashboard<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Configuration Domoticz<\/h2>\n\n\n\n<p>Setup\/Settings :<br>&#8211; onglet system: menus r\u00e9duits et entrer localisation.<br>&#8211; onglet log history : log total de 365 jours, d\u00e9taill\u00e9 de 7 jours.<br>&#8211; onglet email : entrer from\/to\/server et cocher \u00ab\u00a0Sends error\u00a0\u00bb.<\/p>\n\n\n\n<p>logo de VMC en ventilateur<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Script de commutation de VMC pour douche<\/h3>\n\n\n\n<p>Cr\u00e9er les variables dans Domoticz, \u00e0 l&rsquo;adresse http:\/\/adresseserveurdomoticz\/#\/UserVariables. Toutes les variables sont de type integer et \u00e0 initialiser \u00e0 la valeur 0 :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">TEST_MODE_HUMVAR<br>fanFollowsProgram<br>fanMaxTimer<br>targetFanOffHumidity<br>humidityTmin10<br>humidityTmin5<br>humCounter<\/pre>\n\n\n\n<p>Mettre en place le script dans le menu Setup\/More Options\/Events, cliquer sur le \u00ab\u00a0+\u00a0\u00bb, puis Lua, puis \u00ab\u00a0All (commented\u00a0\u00bb). Y coller le script suivant :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">--[[\n    This script controls the humidity in a typical bathroom setting by detecting\n    relative rises in humidity in a short period.\n    Of course it requires a humidity sensor and a binary switch controlling a fan\/ventilator.\n    (there is no provision for variable speed ventilators here!)\n\n    How it works (assuming the default constants as defined below):\n    Save the script as time triggered!!\n\n    Every 5 minutes a reading is done.\n    Every reading is stored together with the previous reading in two user variables (humidityTmin5 and humidityTmin10).\n    So it has two reading stored over the past 10 minutes.\n    It then takes the lowest of the two and compares it with the current reading and calculates a delta.\n    If the delta is 3 or higher (see constants) then the fan will be turned on, it calculates the target humidity and the 'humidity-decrease program' is started (fanFollowsProgram=1).\n    From then on, every 5 minutes the current humidity is compared to the stored target humidity. Basically if that target is reached, the fan is turned off and the 'program' is ended.\n    Of course, it is possible that the target is never reached (might start raining outside or whatever).\n    Then there is a failsafe (FAN_MAX_TIME) after which the ventilator will be turned off.\n \n    Also, it will detect if the ventilator is manually switched off during a program or when it is switched on before the program starts.\n\n    Along the lines it prints to the log and sends notifications but of course you can turn that off by removing those lines.\n\n--]]\n\ncommandArray = {}\n\n-- adjust to your specific situation\n\n-- devices\nlocal FAN_NAME = 'VMC-SPEED'              -- exact device name of the switch turning on\/off the ventilator\nlocal SENSOR_NAME = 'VMC-HUM-TEMP'        -- exact device name of the humidity sensor\n \n-- script constants\nlocal SAMPLE_INTERVAL = 5                 -- time in minutes when a the script logic will happen\nlocal FAN_DELTA_TRIGGER = 3               -- rise in humidity that will trigger the fan\nlocal FAN_MAX_TIME = 15                   -- maximum amount of sample cycles the fan can be on, in case we never reach the target humidity\nlocal TARGET_OFFSET = 5                   -- ventilator goes off if target+offset is reached (maybe it takes too long to reach the true target due to wet towels etc)\nlocal LABEL = 'VMC Bruxelles - '\n\n-- test \/ debug\nlocal TEST_MODE = false                   -- when true TEST_MODE_HUMVAR is used instead of the real sensor\nlocal TEST_MODE_HUMVAR = 99              -- fake humidity value, give it a test value in domoticz\/uservars\nlocal PRINT_MODE = true                  -- Any other value as false or nil will print output to log and send notifications\n\nif PRINT_MODE then\n    print(LABEL .. '###### Start' )\nend\n\n-- Function added to overcome compatibility problem between Lua version 5.2 an 5.3\nlocal function toInteger(str)\n    return math.floor(str)\nend\n\n-- get the global variables:\n-- this script runs every minute, humCounter is used to create SAMPLE_INTERVAL periods\nlocal current\nlocal humCounter = toInteger(uservariables['humCounter'])\nlocal humidityTmin5 = toInteger(uservariables['humidityTmin5'])                -- youngest reading\nlocal humidityTmin10 = toInteger(uservariables['humidityTmin10'])              -- oldest reading\nlocal targetFanOffHumidity = toInteger(uservariables['targetFanOffHumidity'])  -- target humidity\nlocal fanMaxTimer = toInteger(uservariables['fanMaxTimer'])\nlocal fanFollowsProgram = toInteger(uservariables['fanFollowsProgram'])        -- marker indicating that the decrease program is started\n\nlocal target = 0 -- will hold the target humidity when the program starts\n\n-- get the current humidity value\nif (TEST_MODE) then\n    current = toInteger(uservariables['TEST_MODE_HUMVAR'])\nelse\n    current = toInteger(otherdevices_humidity[SENSOR_NAME])\nend\n\n-- check if the sensor is on or has some weird reading\nif (current == 0 or current == nil) then\n    print(LABEL .. 'current is 0 or nil. Skipping this reading')\n    if PRINT_MODE then\n        print(LABEL .. '###### End' )\n    end\n    return commandArray\nend\n\nif PRINT_MODE then\n    print(LABEL .. 'Current humidity:' .. current)\n    print(LABEL .. 'targetFanOffHumidity:' .. targetFanOffHumidity)\n    print(LABEL .. 'humidityTmin5: ' .. humidityTmin5)\n    print(LABEL .. 'humidityTmin10: ' .. humidityTmin10)\n    print(LABEL .. 'fanMaxTimer: ' .. fanMaxTimer)\n    print(LABEL .. 'humCounter:' .. humCounter)\n    print(LABEL .. 'fanFollowsProgram:' .. fanFollowsProgram)\n    print(LABEL .. 'Current fan state:' .. otherdevices[FAN_NAME])\nend\n\n-- increase cycle counter\nhumCounter = humCounter + 1\n\nif (humCounter &gt;= SAMPLE_INTERVAL) then\n\n    if (humidityTmin5 == 0) then\n        -- initialization, assume this is the first time\n        humidityTmin5 = current\n        humidityTmin10 = current\n    end\n\n    humCounter = 0 -- reset the cycle counter\n\n    -- pick the lowest history value to calculate the delta\n    -- this also makes sure that two relative small deltas in the past 2*interval minutes are treated as one larger rise\n    -- and therefore will still trigger the ventilator\n    -- I don't want to use a longer interval instead because I want the ventilator to start as soon as possible\n    -- (so rather after 5 minutes instead of after 15 minutes because the mirrors in the bathroom become kinda useless ;-)\n    delta = current - math.min(humidityTmin10, humidityTmin5)\n\n    if PRINT_MODE then\n        print(LABEL .. 'Delta: ' .. delta)\n    end\n\n    -- pick the lowest history value\n    target = math.min(humidityTmin10, humidityTmin5) + TARGET_OFFSET\n\n    -- shift the previous measurements\n    humidityTmin10 = humidityTmin5\n    -- and store the current\n    humidityTmin5 = current\n\n    if (otherdevices[FAN_NAME]=='Off' or (otherdevices[FAN_NAME]=='On' and fanFollowsProgram==0)) then\n        -- either the fan is off or it is on but the decrease program has not started\n        -- in that latter case we start the program anyway. This could happen if someone turns on the ventilator\n        -- manually because he\/she is about to take a shower and doesn't like damp mirrors.\n        -- I don't do this because the ventilator removes heat from the bathroom and I want this to happen\n        -- as late as possible ;-)\n\n        if (fanFollowsProgram == 1 and otherdevices[FAN_NAME]=='Off') then\n            -- likely someone turned off the ventilator while the program was running\n            fanFollowsProgram = 1\n        end\n\n        -- see if we have to turn it on\n        if (delta &gt;= FAN_DELTA_TRIGGER) then\n            -- time to start the fan\n            commandArray[FAN_NAME] = 'On'\n            -- commandArray[FAN_NAME] = 'Set Level 99'\n            targetFanOffHumidity = target\n\n            if (fanFollowsProgram == 1) then\n                print('Ventilator was already on but we start the de-humidifying program')\n            end\n\n            fanFollowsProgram = 1\n\n            -- set the safety stop\n            fanMaxTimer = FAN_MAX_TIME\n\n            if PRINT_MODE then\n                print(LABEL .. 'Rise in humidity. Turning on the vents. Delta: ' .. delta)\n                print(LABEL .. 'Target humidity for turning the ventilator: ' ..targetFanOffHumidity)\n                commandArray['SendNotification'] = LABEL .. 'VMC rapide#VMC en vitesse rapide, humidit\u00e9 : ' .. current .. '#0'\n            end\n        end\n\n    else\n        if (fanMaxTimer &gt; 0) then\n            -- possible that someone started the ventilator manually\n            fanMaxTimer = fanMaxTimer - 1\n        end\n\n\n        if (fanFollowsProgram == 1) then -- not manually started\n\n            if (delta &gt;= FAN_DELTA_TRIGGER) then\n                -- ok, there is another FAN_DELTA_TRIGGER rise in humidity\n                -- when this happen we reset the fanMaxTimer to a new count down\n                -- because we have to ventilate a bit longer due to the extra humidity\n                if PRINT_MODE then\n                    print(LABEL .. 'Another large increase detected, resetting max timer. Delta: ' .. delta)\n                end\n                fanMaxTimer = FAN_MAX_TIME\n            end\n\n            -- first see if it can be turned off\n            if (current &lt;= targetFanOffHumidity or fanMaxTimer==0) then\n                commandArray[FAN_NAME] = 'Off'\n\n                msg = ''\n\n                if (fanMaxTimer == 0 and current &gt; targetFanOffHumidity) then\n                    -- msg = 'Target not reached but safety time-out is triggered.'\n                    msg = 'Seuil minimum non atteint, tempo de s\u00e9curit\u00e9 expir\u00e9e.'\n                    if PRINT_MODE == true then\n                    print(msg)\n                    end\n                else\n                    -- msg = 'Target humidity reached'\n                    msg = 'Seuil minimum atteint.'\n                    if PRINT_MODE then\n                        print(LABEL .. msg)\n                    end\n                end\n\n                if PRINT_MODE then\n                    print(LABEL .. 'Turning off the ventilator')\n                    -- msg = msg .. '\\nTurning off the ventilator'\n                    msg = msg .. '\\nPassage VMC en vitesse lente.' .. current\n                end\n\n                targetFanOffHumidity = 0\n                fanMaxTimer = 0\n                fanFollowsProgram = 0\n                -- reset history in this case.. we start all over\n                -- Tmin10 is still in the 'ventilator=On'-zone\n                humidityTmin10 = humidityTmin5\n                 if PRINT_MODE == true then\n                commandArray['SendNotification'] = LABEL .. 'VMC lente#' .. msg .. '#0'\n                end\n\n            else\n                -- we haven't reached the target yet\n                if PRINT_MODE then\n                    print(LABEL .. 'Humidity delta: ' .. delta)\n                end\n            end\n        end\n    end\n\n    if PRINT_MODE then\n        print(LABEL .. 'New values &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;')\n        print(LABEL .. 'humidityTmin5: ' .. humidityTmin5)\n        print(LABEL .. 'humidityTmin10: ' .. humidityTmin10)\n        print(LABEL .. 'fanMaxTimer: ' .. fanMaxTimer)\n        print(LABEL .. 'humCounter:' .. humCounter)\n        print(LABEL .. 'fanFollowsProgram:' .. fanFollowsProgram)\n        print(LABEL .. '------ target: ' .. targetFanOffHumidity)\n    end\n\nend\n\n-- save the globals\ncommandArray['Variable:humCounter'] = tostring(humCounter)\ncommandArray['Variable:humidityTmin10'] = tostring(humidityTmin10)\ncommandArray['Variable:humidityTmin5'] = tostring(humidityTmin5)\ncommandArray['Variable:targetFanOffHumidity'] = tostring(targetFanOffHumidity)\ncommandArray['Variable:fanMaxTimer'] = tostring(fanMaxTimer)\ncommandArray['Variable:fanFollowsProgram'] = tostring(fanFollowsProgram)\n\nif PRINT_MODE then\n    print(LABEL .. '###### End' )\nend\n\nreturn commandArray<\/pre>\n\n\n\n<p>Ajout de p\u00e9riph\u00e9riques externes (autre maison)<\/p>\n\n\n\n<p>Ouvrir et rediriger le port MQTT dans la box\/gateway du r\u00e9seau h\u00e9bergeant le serveur Domoticz.<\/p>\n\n\n\n<p>Ajouter le user dans le fichier password du serveur MQTT, puis le red\u00e9marer.<\/p>\n\n\n\n<p>Mettre \u00e0 jour Tasmota avec id Domoticz puis serveur MQTT<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Plugins Domoticz<\/h2>\n\n\n\n<p>UPS plugin: https:\/\/www.domoticz.com\/wiki\/Plugins\/NUT_UPS.html<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Suggestion to investigate:<\/h3>\n\n\n\n<p>Watermetter via inductive detection:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-ehoco-nl wp-block-embed-ehoco-nl\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"pxRXJjdHY2\"><a href=\"https:\/\/ehoco.nl\/watermeter-uitlezen-in-domoticz-lua-script\/\">Watermeter uitlezen in Domoticz met een LUA script<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8220;Watermeter uitlezen in Domoticz met een LUA script&#8221; &#8212; Ehoco.nl\" src=\"https:\/\/ehoco.nl\/watermeter-uitlezen-in-domoticz-lua-script\/embed\/#?secret=g5MmKIbpwR#?secret=pxRXJjdHY2\" data-secret=\"pxRXJjdHY2\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p><a href=\"https:\/\/github.com\/akamming\/domoticz-watermeter\">https:\/\/github.com\/akamming\/domoticz-watermeter<\/a><\/p>\n\n\n\n<p>A Kodi link:<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/dnpwwo\/Domoticz-Kodi-Plugin\">https:\/\/github.com\/dnpwwo\/Domoticz-Kodi-Plugin<\/a><\/p>\n\n\n\n<p>Lien avec une freebox :<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/supermat\/PluginDomoticzFreebox\">https:\/\/github.com\/supermat\/PluginDomoticzFreebox<\/a><\/p>\n\n\n\n<p>Weather information from <a href=\"https:\/\/www.buienradar.nl\/\">Buienradar.nl<\/a> :<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/ffes\/domoticz-buienradar\">https:\/\/github.com\/ffes\/domoticz-buienradar<\/a><\/p>\n\n\n\n<p>Lien avec compteur linky :<\/p>\n\n\n\n<p>Theme :<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/domoticz\/Machinon\">https:\/\/github.com\/domoticz\/Machinon<\/a><\/p>\n\n\n\n<p>Sonnette de porte avec camera :<\/p>\n\n\n\n<p><a href=\"https:\/\/www.domoticz.com\/forum\/viewtopic.php?t=32536\">https:\/\/www.domoticz.com\/forum\/viewtopic.php?t=32536<\/a><\/p>\n\n\n\n<p>Own dashboard : <strong>Dashticz<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mise en place d&rsquo;un serveur Domoticz (et MQTT) via docker sur une plateforme linux (Debian).<\/p>\n","protected":false},"author":1,"featured_media":2776,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[102,75,128],"tags":[],"class_list":["post-2158","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-batiment","category-informatique","category-regulation"],"_links":{"self":[{"href":"https:\/\/tybou.eu\/wordpress\/wp-json\/wp\/v2\/posts\/2158","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tybou.eu\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tybou.eu\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tybou.eu\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tybou.eu\/wordpress\/wp-json\/wp\/v2\/comments?post=2158"}],"version-history":[{"count":0,"href":"https:\/\/tybou.eu\/wordpress\/wp-json\/wp\/v2\/posts\/2158\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tybou.eu\/wordpress\/wp-json\/wp\/v2\/media\/2776"}],"wp:attachment":[{"href":"https:\/\/tybou.eu\/wordpress\/wp-json\/wp\/v2\/media?parent=2158"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tybou.eu\/wordpress\/wp-json\/wp\/v2\/categories?post=2158"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tybou.eu\/wordpress\/wp-json\/wp\/v2\/tags?post=2158"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}