Files
OpenCode 68a9071cf1 feat: reconcile local master with origin (exa/hot-platform hunters, leaks ledger, latest results)
Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
2026-08-07 12:53:47 +08:00

1 line
150 KiB
JSON
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "aspinozaxxx-lab/growerhub", "files": {"backend/src/main/resources/application.yml": {"d555179123ebb8fedd5f7d8bab335b8f33e60b79": {"t": 1785745244.0585225, "n": 8619, "h": "e0d90649e8e86b7a", "c": "ack:\n # TTL dlya ack (sek).\n ttlSeconds: 180\n # Period ochistki ack (sek).\n cleanupPeriodSeconds: 60\n\ndevice:\n # Porog online statusa (sek).\n onlineThresholdS: 60\n defaults:\n # Cel' vlazhnosti (procent).\n targetMoisture: 40.0\n # Dlitel'nost' poliva (sek).\n wateringDurationSeconds: 30\n # Timeout poliva (sek).\n wateringTimeoutSeconds: 300\n # Chas vklyuchenija sveta.\n lightOnHour: 6\n # Chas vyklyuchenija sveta.\n lightOffHour: 22\n # Dlitel'nost' sveta (chasy).\n lightDurationHours: 16\n # Tekushchaja versija firmware.\n currentVersion: \"1.0.0\"\n # Poslednjaja versija firmware.\n latestVersion: \"1.0.0\"\n # Priznak dostupnosti update.\n updateAvailable: false\n firmware:\n # Versija po umolchaniju.\n defaultVersion: \"old\"\n mqtt:\n # Publichnoe MQTTS podkljuchenie seriynyh ustrojstv.\n publicHost: \"growerhub.ru\"\n publicPort: 8883\n tls: true\n # Rol' ustrojstva v Mosquitto Dynamic Security.\n brokerRole: \"native-device\"\n # Tehnicheskaja zashchita ot chastogo perevypuska credentials.\n credentialCooldownSeconds: 30\n claim:\n # Kolichestvo oshibok do pervoj blokirovki.\n initialFailureLimit: 10\n # Dlitel'nost' pervoj blokirovki (sek).\n blockSeconds: 3600\n # Skol'zjashchee okno ogranichennogo rezhima (sek).\n restrictedWindowSeconds: 3600\n\nauth:\n sso:\n # Spisok podderzhivaemyh providerov.\n supportedProviders: [\"google\", \"yandex\"]\n # Timeout soedinenija (sek).\n connectTimeoutSeconds: 10\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 10\n # Vremja zhizni state-tokena (min).\n stateTtlMinutes: 10\n\nsecurity:\n password:\n pbkdf2:\n # Kolichestvo iteracij.\n rounds: 29000\n # Razmer soli (bytes).\n saltBytes: 16\n # Razmer hesha (bytes).\n hashBytes: 32\n\nfirmware:\n # Katalog binarnikov firmware.\n binariesDir: \"firmware_binaries\"\n # Timeout podtverzhdenija OTA ustrojstvom (sek).\n updateTimeoutSeconds: 300\n\nserver:\n # Public base URL.\n publicBaseUrl: \"https://growerhub.ru\"\n\nadvisor:\n # Priznak vklyucheniya advisor.\n enabled: false\n watering:\n # TTL rekomendacii poliva.\n ttl: \"24h\"\n llm:\n deepseek:\n # Base URL dlya LLM.\n baseUrl: \"https://api.deepseek.com/v1/chat/completions\"\n # API key dlya LLM.\n apiKey: \"${ADVISOR_DEEPSEEK_API_KEY:}\"\n # Model LLM.\n model: \"deepseek-chat\"\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 15\n\nplant:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\nsensor:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\npump:\n history:\n # Maksimal'noe kolichestvo tochek sostoyaniya nasosa.\n maxPoints: 200\n # Chasy istorii nasosa po umolchaniju.\n defaultHours: 24\n watering:\n # Defoltnyi rashod (ml/ch).\n defaultRateMlPerHour: 2000\n # Defoltnaja dlitel'nost' poliva po vremeni (sek).\n defaultTimedDurationS: 300\n # Defoltnyj limit aktivnogo poliva do protechki (sek).\n defaultUntilLeakMaxActiveDurationS: 1800\n # Defoltnaja dlitel'nost' impul'sa poliva (sek).\n defaultPulseRunS: 180\n # Defoltnaja pauza mezhdu impul'sami (sek).\n defaultPulsePauseS: 300\n # Maksimal'naja dlitel'nost' aktivnogo poliva (sek).\n maxActiveDurationS: 86400\n # Maksimal'nyj razmer stranicy zhurnala sessij.\n sessionPageMax: 100\n # Timeout podtverzhdenija ostanovki nasosa (sek).\n stoppingTimeoutS: 15\n ack:\n wait:\n # Timeout ozhidanija ACK po umolchaniju (sek).\n defaultTimeoutSeconds: 5\n # Maksimal'nyi timeout ACK (sek).\n maxTimeoutSeconds: 15\n # Interval polling (ms).\n pollIntervalMs: 500\n\nmqtt:\n provisioning:\n # Provisioning klient imeet tol'ko prava Dynamic Security control.\n enabled: ${MQTT_PROVISIONING_ENABLED:false}\n host: ${MQTT_PROVISIONING_HOST:localhost}\n port: ${MQTT_PROVISIONING_PORT:8883}\n tls: ${MQTT_PROVISIONING_TLS:true}\n username: ${MQTT_PROVISIONING_USERNAME:}\n password: ${MQTT_PROVISIONING_PASSWORD:}\n responseTimeoutSeconds: 10\n # Maksimal'noe kolichestvo poslednih MQTT soobshchenij v pamjati.\n recentMessagesLimit: 200\n # Maksimal'naja dlina payload v poslednih MQTT soobshchenijah.\n recentPayloadChars: 4096\n topics:\n # Ogranichennye topiki backend vmesto global'noj podpiski '#'.\n listen: \"${MQTT_LISTEN_TOPIC:}\"\n listenTopics:\n - \"gh/dev/#\"\n - \"zigbee2growerhub/#\"\n - \"gh/z2m/#\"\n # Topic dlya state.\n state: \"gh/dev/+/state\"\n # Topic dlya ack.\n ack: \"gh/dev/+/state/ack\"\n # Topic dlya service events.\n events: \"gh/dev/+/events\"\n # Bazovyj topic Zigbee2MQTT.\n zigbeeBase: \"zigbee2growerhub\"\n # Bazovyj topic pol'zovatel'skih Zigbee2MQTT namespace.\n zigbeeUserPrefix: \"gh/z2m\"\n # Suffiks dlya state.\n stateSuffix: \"/state\"\n # Suffiks dlya ack.\n ackSuffix: \"/state/ack\"\n # Suffiks dlya service events.\n eventsSuffix: \"/events\"\n\napp:\n debug:\n plantsTiming: false\n\nuser:\n # Chasovoj pojas novogo polzovatelja.\n defaultTimezone: \"Europe/Moscow\"\n\nzigbee:\n self-service:\n # Publichnyj self-service vklyuchaetsja tol'ko posle smoke-proverki.\n enabled: ${SELF_SERVICE_ENABLED:false}\n # Publichnoe MQTT podkljuchenie Zigbee2MQTT.\n mqttServer: \"mqtts://growerhub.ru:8883\"\n # Rol' klienta v Mosquitto Dynamic Security.\n brokerRole: \"z2m-coordinator\"\n # Kolichestvo sluchajnyh bytes parolja koordinatore.\n passwordBytes: 32\n # Tehnicheskaja zashchita ot chastoj vydachi broker credentials.\n credentialCooldownSeconds: 30\n # Bezopasnye writable capabilities dlya pervogo reliza.\n writableProperties: [state, brightness, color_temp]\n # Vremja otkrytogo soprjazhenija po umolchaniju (sek).\n permitJoinDefaultSeconds: 254\n history:\n # Maksimal'noe kolichestvo tochek Zigbee-svojstva.\n maxPoints: 200\n # Maksimal'noe kolichestvo perehodov diskretnogo svojstva.\n maxDiscretePoints: 5000\n # Chasy istorii Zigbee po umolchaniju.\n defaultHours: 24\n # Bazovyj interval zapisi chislovyh svojstv (sek).\n numericIntervalSeconds: 300\n # Minimal'nyj interval mezhdu zapisyami pri rezkom izmenenii (sek).\n numericChangeMinIntervalSeconds: 60\n # Bazovoe znachimoe izmenenie chislovogo svojstva.\n numericChangeThreshold: 0.5\n # Individual'nye intervaly redko menjajushchihsja i diagnosticheskih svojstv.\n numericIntervals:\n battery: 3600\n voltage: 3600\n linkquality: 900\n # Porogi nemedlennoj zapisi pri znachimom izmenenii.\n numericChangeThresholds:\n temperature: 0.3\n soil_temperature: 0.3\n humidity: 2.0\n soil_moisture: 2.0\n battery: 1.0\n voltage: 2.0\n linkquality: 10.0\n power: 5.0\n current: 0.05\n energy: 0.05\n # Sobytiya, gde povtor odinakovogo znachenija imeet smysl.\n eventProperties: [action, click, event]\n # Konfiguracionnye svojstva ostajutsja tol'ko v tekushchem snapshot.\n ignoredProperties:\n - child_lock\n - countdown\n - humidity_calibration\n - indicator_mode\n - power_outage_memory\n - soil_moisture_calibration\n - soil_moisture_sampling\n - soil_calibration\n - soil_sampling\n - soil_temperature_calibration\n - soil_temperature_sampling\n - soil_warning\n - switch_type\n - switch_type_button\n - temperature_calibration\n - temperature_sampling\n - temperature_unit\n\nhistory:\n retention:\n # Ezhednevnoe prorezhivanie istorii vklyucheno.\n enabled: ${HISTORY_RETENTION_ENABLED:true}\n # Kolichestvo polnyh sutok syroj istorii.\n rawDays: 30\n # Maksimal'noe kolichestvo dnei v odnom catch-up zapuske.\n maxDaysPerRun: 365\n # Raspisanie ezhednevnogo zapuska.\n cron: \"0 0 3 * * *\"\n # Chasovoj pojas raspisanija.\n timezone: \"Europe/Istanbul\"\n # Zaderzhka pervogo catch-up posle starta prilozhenija (ms).\n startupDelayMs: 60000\n # Period povtornoj proverki backlog posle starta (ms).\n catchUpPeriodMs: 86400000\n\nautomation:\n # Period worker avtomatizacii (ms).\n workerPeriodMs: 30000\n # Period aktivnyh sessij poliva (ms).\n wateringWorkerPeriodMs: 1000\n # Maksimal'nyj vozrast dannyh sensora dlya scenariev (min).\n staleSensorMinutes: 15\n # Pauza posle ruchnogo vmeshatel'stva (min).\n manualOverrideMinutes: 15\n # Porog statusa net svjazi dlya resursov (min).\n resourceOfflineMinutes: 5\n # Porog statusa net svjazi dlya plitok datchikov (min).\n sensorOfflineMinutes: 20\n # Chasovoj poyas raspisanij.\n timezone: \"Europe/Istanbul\"\n"}, "f5d7e06c067ad4170131eed9bb5f43ab1705760e": {"t": 1785749164.6990378, "n": 8619, "h": "e0d90649e8e86b7a", "c": "ack:\n # TTL dlya ack (sek).\n ttlSeconds: 180\n # Period ochistki ack (sek).\n cleanupPeriodSeconds: 60\n\ndevice:\n # Porog online statusa (sek).\n onlineThresholdS: 60\n defaults:\n # Cel' vlazhnosti (procent).\n targetMoisture: 40.0\n # Dlitel'nost' poliva (sek).\n wateringDurationSeconds: 30\n # Timeout poliva (sek).\n wateringTimeoutSeconds: 300\n # Chas vklyuchenija sveta.\n lightOnHour: 6\n # Chas vyklyuchenija sveta.\n lightOffHour: 22\n # Dlitel'nost' sveta (chasy).\n lightDurationHours: 16\n # Tekushchaja versija firmware.\n currentVersion: \"1.0.0\"\n # Poslednjaja versija firmware.\n latestVersion: \"1.0.0\"\n # Priznak dostupnosti update.\n updateAvailable: false\n firmware:\n # Versija po umolchaniju.\n defaultVersion: \"old\"\n mqtt:\n # Publichnoe MQTTS podkljuchenie seriynyh ustrojstv.\n publicHost: \"growerhub.ru\"\n publicPort: 8883\n tls: true\n # Rol' ustrojstva v Mosquitto Dynamic Security.\n brokerRole: \"native-device\"\n # Tehnicheskaja zashchita ot chastogo perevypuska credentials.\n credentialCooldownSeconds: 30\n claim:\n # Kolichestvo oshibok do pervoj blokirovki.\n initialFailureLimit: 10\n # Dlitel'nost' pervoj blokirovki (sek).\n blockSeconds: 3600\n # Skol'zjashchee okno ogranichennogo rezhima (sek).\n restrictedWindowSeconds: 3600\n\nauth:\n sso:\n # Spisok podderzhivaemyh providerov.\n supportedProviders: [\"google\", \"yandex\"]\n # Timeout soedinenija (sek).\n connectTimeoutSeconds: 10\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 10\n # Vremja zhizni state-tokena (min).\n stateTtlMinutes: 10\n\nsecurity:\n password:\n pbkdf2:\n # Kolichestvo iteracij.\n rounds: 29000\n # Razmer soli (bytes).\n saltBytes: 16\n # Razmer hesha (bytes).\n hashBytes: 32\n\nfirmware:\n # Katalog binarnikov firmware.\n binariesDir: \"firmware_binaries\"\n # Timeout podtverzhdenija OTA ustrojstvom (sek).\n updateTimeoutSeconds: 300\n\nserver:\n # Public base URL.\n publicBaseUrl: \"https://growerhub.ru\"\n\nadvisor:\n # Priznak vklyucheniya advisor.\n enabled: false\n watering:\n # TTL rekomendacii poliva.\n ttl: \"24h\"\n llm:\n deepseek:\n # Base URL dlya LLM.\n baseUrl: \"https://api.deepseek.com/v1/chat/completions\"\n # API key dlya LLM.\n apiKey: \"${ADVISOR_DEEPSEEK_API_KEY:}\"\n # Model LLM.\n model: \"deepseek-chat\"\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 15\n\nplant:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\nsensor:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\npump:\n history:\n # Maksimal'noe kolichestvo tochek sostoyaniya nasosa.\n maxPoints: 200\n # Chasy istorii nasosa po umolchaniju.\n defaultHours: 24\n watering:\n # Defoltnyi rashod (ml/ch).\n defaultRateMlPerHour: 2000\n # Defoltnaja dlitel'nost' poliva po vremeni (sek).\n defaultTimedDurationS: 300\n # Defoltnyj limit aktivnogo poliva do protechki (sek).\n defaultUntilLeakMaxActiveDurationS: 1800\n # Defoltnaja dlitel'nost' impul'sa poliva (sek).\n defaultPulseRunS: 180\n # Defoltnaja pauza mezhdu impul'sami (sek).\n defaultPulsePauseS: 300\n # Maksimal'naja dlitel'nost' aktivnogo poliva (sek).\n maxActiveDurationS: 86400\n # Maksimal'nyj razmer stranicy zhurnala sessij.\n sessionPageMax: 100\n # Timeout podtverzhdenija ostanovki nasosa (sek).\n stoppingTimeoutS: 15\n ack:\n wait:\n # Timeout ozhidanija ACK po umolchaniju (sek).\n defaultTimeoutSeconds: 5\n # Maksimal'nyi timeout ACK (sek).\n maxTimeoutSeconds: 15\n # Interval polling (ms).\n pollIntervalMs: 500\n\nmqtt:\n provisioning:\n # Provisioning klient imeet tol'ko prava Dynamic Security control.\n enabled: ${MQTT_PROVISIONING_ENABLED:false}\n host: ${MQTT_PROVISIONING_HOST:localhost}\n port: ${MQTT_PROVISIONING_PORT:8883}\n tls: ${MQTT_PROVISIONING_TLS:true}\n username: ${MQTT_PROVISIONING_USERNAME:}\n password: ${MQTT_PROVISIONING_PASSWORD:}\n responseTimeoutSeconds: 10\n # Maksimal'noe kolichestvo poslednih MQTT soobshchenij v pamjati.\n recentMessagesLimit: 200\n # Maksimal'naja dlina payload v poslednih MQTT soobshchenijah.\n recentPayloadChars: 4096\n topics:\n # Ogranichennye topiki backend vmesto global'noj podpiski '#'.\n listen: \"${MQTT_LISTEN_TOPIC:}\"\n listenTopics:\n - \"gh/dev/#\"\n - \"zigbee2growerhub/#\"\n - \"gh/z2m/#\"\n # Topic dlya state.\n state: \"gh/dev/+/state\"\n # Topic dlya ack.\n ack: \"gh/dev/+/state/ack\"\n # Topic dlya service events.\n events: \"gh/dev/+/events\"\n # Bazovyj topic Zigbee2MQTT.\n zigbeeBase: \"zigbee2growerhub\"\n # Bazovyj topic pol'zovatel'skih Zigbee2MQTT namespace.\n zigbeeUserPrefix: \"gh/z2m\"\n # Suffiks dlya state.\n stateSuffix: \"/state\"\n # Suffiks dlya ack.\n ackSuffix: \"/state/ack\"\n # Suffiks dlya service events.\n eventsSuffix: \"/events\"\n\napp:\n debug:\n plantsTiming: false\n\nuser:\n # Chasovoj pojas novogo polzovatelja.\n defaultTimezone: \"Europe/Moscow\"\n\nzigbee:\n self-service:\n # Publichnyj self-service vklyuchaetsja tol'ko posle smoke-proverki.\n enabled: ${SELF_SERVICE_ENABLED:false}\n # Publichnoe MQTT podkljuchenie Zigbee2MQTT.\n mqttServer: \"mqtts://growerhub.ru:8883\"\n # Rol' klienta v Mosquitto Dynamic Security.\n brokerRole: \"z2m-coordinator\"\n # Kolichestvo sluchajnyh bytes parolja koordinatore.\n passwordBytes: 32\n # Tehnicheskaja zashchita ot chastoj vydachi broker credentials.\n credentialCooldownSeconds: 30\n # Bezopasnye writable capabilities dlya pervogo reliza.\n writableProperties: [state, brightness, color_temp]\n # Vremja otkrytogo soprjazhenija po umolchaniju (sek).\n permitJoinDefaultSeconds: 254\n history:\n # Maksimal'noe kolichestvo tochek Zigbee-svojstva.\n maxPoints: 200\n # Maksimal'noe kolichestvo perehodov diskretnogo svojstva.\n maxDiscretePoints: 5000\n # Chasy istorii Zigbee po umolchaniju.\n defaultHours: 24\n # Bazovyj interval zapisi chislovyh svojstv (sek).\n numericIntervalSeconds: 300\n # Minimal'nyj interval mezhdu zapisyami pri rezkom izmenenii (sek).\n numericChangeMinIntervalSeconds: 60\n # Bazovoe znachimoe izmenenie chislovogo svojstva.\n numericChangeThreshold: 0.5\n # Individual'nye intervaly redko menjajushchihsja i diagnosticheskih svojstv.\n numericIntervals:\n battery: 3600\n voltage: 3600\n linkquality: 900\n # Porogi nemedlennoj zapisi pri znachimom izmenenii.\n numericChangeThresholds:\n temperature: 0.3\n soil_temperature: 0.3\n humidity: 2.0\n soil_moisture: 2.0\n battery: 1.0\n voltage: 2.0\n linkquality: 10.0\n power: 5.0\n current: 0.05\n energy: 0.05\n # Sobytiya, gde povtor odinakovogo znachenija imeet smysl.\n eventProperties: [action, click, event]\n # Konfiguracionnye svojstva ostajutsja tol'ko v tekushchem snapshot.\n ignoredProperties:\n - child_lock\n - countdown\n - humidity_calibration\n - indicator_mode\n - power_outage_memory\n - soil_moisture_calibration\n - soil_moisture_sampling\n - soil_calibration\n - soil_sampling\n - soil_temperature_calibration\n - soil_temperature_sampling\n - soil_warning\n - switch_type\n - switch_type_button\n - temperature_calibration\n - temperature_sampling\n - temperature_unit\n\nhistory:\n retention:\n # Ezhednevnoe prorezhivanie istorii vklyucheno.\n enabled: ${HISTORY_RETENTION_ENABLED:true}\n # Kolichestvo polnyh sutok syroj istorii.\n rawDays: 30\n # Maksimal'noe kolichestvo dnei v odnom catch-up zapuske.\n maxDaysPerRun: 365\n # Raspisanie ezhednevnogo zapuska.\n cron: \"0 0 3 * * *\"\n # Chasovoj pojas raspisanija.\n timezone: \"Europe/Istanbul\"\n # Zaderzhka pervogo catch-up posle starta prilozhenija (ms).\n startupDelayMs: 60000\n # Period povtornoj proverki backlog posle starta (ms).\n catchUpPeriodMs: 86400000\n\nautomation:\n # Period worker avtomatizacii (ms).\n workerPeriodMs: 30000\n # Period aktivnyh sessij poliva (ms).\n wateringWorkerPeriodMs: 1000\n # Maksimal'nyj vozrast dannyh sensora dlya scenariev (min).\n staleSensorMinutes: 15\n # Pauza posle ruchnogo vmeshatel'stva (min).\n manualOverrideMinutes: 15\n # Porog statusa net svjazi dlya resursov (min).\n resourceOfflineMinutes: 5\n # Porog statusa net svjazi dlya plitok datchikov (min).\n sensorOfflineMinutes: 20\n # Chasovoj poyas raspisanij.\n timezone: \"Europe/Istanbul\"\n"}, "db53ce56767a56098729e78b738e75d17aa3493c": {"t": 1785749167.960735, "n": 8540, "h": "16a7c9c0a4d95cd3", "c": "ack:\n # TTL dlya ack (sek).\n ttlSeconds: 180\n # Period ochistki ack (sek).\n cleanupPeriodSeconds: 60\n\ndevice:\n # Porog online statusa (sek).\n onlineThresholdS: 60\n defaults:\n # Cel' vlazhnosti (procent).\n targetMoisture: 40.0\n # Dlitel'nost' poliva (sek).\n wateringDurationSeconds: 30\n # Timeout poliva (sek).\n wateringTimeoutSeconds: 300\n # Chas vklyuchenija sveta.\n lightOnHour: 6\n # Chas vyklyuchenija sveta.\n lightOffHour: 22\n # Dlitel'nost' sveta (chasy).\n lightDurationHours: 16\n # Tekushchaja versija firmware.\n currentVersion: \"1.0.0\"\n # Poslednjaja versija firmware.\n latestVersion: \"1.0.0\"\n # Priznak dostupnosti update.\n updateAvailable: false\n firmware:\n # Versija po umolchaniju.\n defaultVersion: \"old\"\n mqtt:\n # Publichnoe MQTTS podkljuchenie seriynyh ustrojstv.\n publicHost: \"growerhub.ru\"\n publicPort: 8883\n tls: true\n # Rol' ustrojstva v Mosquitto Dynamic Security.\n brokerRole: \"native-device\"\n # Tehnicheskaja zashchita ot chastogo perevypuska credentials.\n credentialCooldownSeconds: 30\n claim:\n # Kolichestvo oshibok do pervoj blokirovki.\n initialFailureLimit: 10\n # Dlitel'nost' pervoj blokirovki (sek).\n blockSeconds: 3600\n # Skol'zjashchee okno ogranichennogo rezhima (sek).\n restrictedWindowSeconds: 3600\n\nauth:\n sso:\n # Spisok podderzhivaemyh providerov.\n supportedProviders: [\"google\", \"yandex\"]\n # Timeout soedinenija (sek).\n connectTimeoutSeconds: 10\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 10\n # Vremja zhizni state-tokena (min).\n stateTtlMinutes: 10\n\nsecurity:\n password:\n pbkdf2:\n # Kolichestvo iteracij.\n rounds: 29000\n # Razmer soli (bytes).\n saltBytes: 16\n # Razmer hesha (bytes).\n hashBytes: 32\n\nfirmware:\n # Katalog binarnikov firmware.\n binariesDir: \"firmware_binaries\"\n\nserver:\n # Public base URL.\n publicBaseUrl: \"https://growerhub.ru\"\n\nadvisor:\n # Priznak vklyucheniya advisor.\n enabled: false\n watering:\n # TTL rekomendacii poliva.\n ttl: \"24h\"\n llm:\n deepseek:\n # Base URL dlya LLM.\n baseUrl: \"https://api.deepseek.com/v1/chat/completions\"\n # API key dlya LLM.\n apiKey: \"${ADVISOR_DEEPSEEK_API_KEY:}\"\n # Model LLM.\n model: \"deepseek-chat\"\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 15\n\nplant:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\nsensor:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\npump:\n history:\n # Maksimal'noe kolichestvo tochek sostoyaniya nasosa.\n maxPoints: 200\n # Chasy istorii nasosa po umolchaniju.\n defaultHours: 24\n watering:\n # Defoltnyi rashod (ml/ch).\n defaultRateMlPerHour: 2000\n # Defoltnaja dlitel'nost' poliva po vremeni (sek).\n defaultTimedDurationS: 300\n # Defoltnyj limit aktivnogo poliva do protechki (sek).\n defaultUntilLeakMaxActiveDurationS: 1800\n # Defoltnaja dlitel'nost' impul'sa poliva (sek).\n defaultPulseRunS: 180\n # Defoltnaja pauza mezhdu impul'sami (sek).\n defaultPulsePauseS: 300\n # Maksimal'naja dlitel'nost' aktivnogo poliva (sek).\n maxActiveDurationS: 86400\n # Maksimal'nyj razmer stranicy zhurnala sessij.\n sessionPageMax: 100\n # Timeout podtverzhdenija ostanovki nasosa (sek).\n stoppingTimeoutS: 15\n ack:\n wait:\n # Timeout ozhidanija ACK po umolchaniju (sek).\n defaultTimeoutSeconds: 5\n # Maksimal'nyi timeout ACK (sek).\n maxTimeoutSeconds: 15\n # Interval polling (ms).\n pollIntervalMs: 500\n\nmqtt:\n provisioning:\n # Provisioning klient imeet tol'ko prava Dynamic Security control.\n enabled: ${MQTT_PROVISIONING_ENABLED:false}\n host: ${MQTT_PROVISIONING_HOST:localhost}\n port: ${MQTT_PROVISIONING_PORT:8883}\n tls: ${MQTT_PROVISIONING_TLS:true}\n username: ${MQTT_PROVISIONING_USERNAME:}\n password: ${MQTT_PROVISIONING_PASSWORD:}\n responseTimeoutSeconds: 10\n # Maksimal'noe kolichestvo poslednih MQTT soobshchenij v pamjati.\n recentMessagesLimit: 200\n # Maksimal'naja dlina payload v poslednih MQTT soobshchenijah.\n recentPayloadChars: 4096\n topics:\n # Ogranichennye topiki backend vmesto global'noj podpiski '#'.\n listen: \"${MQTT_LISTEN_TOPIC:}\"\n listenTopics:\n - \"gh/dev/#\"\n - \"zigbee2growerhub/#\"\n - \"gh/z2m/#\"\n # Topic dlya state.\n state: \"gh/dev/+/state\"\n # Topic dlya ack.\n ack: \"gh/dev/+/state/ack\"\n # Topic dlya service events.\n events: \"gh/dev/+/events\"\n # Bazovyj topic Zigbee2MQTT.\n zigbeeBase: \"zigbee2growerhub\"\n # Bazovyj topic pol'zovatel'skih Zigbee2MQTT namespace.\n zigbeeUserPrefix: \"gh/z2m\"\n # Suffiks dlya state.\n stateSuffix: \"/state\"\n # Suffiks dlya ack.\n ackSuffix: \"/state/ack\"\n # Suffiks dlya service events.\n eventsSuffix: \"/events\"\n\napp:\n debug:\n plantsTiming: false\n\nuser:\n # Chasovoj pojas novogo polzovatelja.\n defaultTimezone: \"Europe/Moscow\"\n\nzigbee:\n self-service:\n # Publichnyj self-service vklyuchaetsja tol'ko posle smoke-proverki.\n enabled: ${SELF_SERVICE_ENABLED:false}\n # Publichnoe MQTT podkljuchenie Zigbee2MQTT.\n mqttServer: \"mqtts://growerhub.ru:8883\"\n # Rol' klienta v Mosquitto Dynamic Security.\n brokerRole: \"z2m-coordinator\"\n # Kolichestvo sluchajnyh bytes parolja koordinatore.\n passwordBytes: 32\n # Tehnicheskaja zashchita ot chastoj vydachi broker credentials.\n credentialCooldownSeconds: 30\n # Bezopasnye writable capabilities dlya pervogo reliza.\n writableProperties: [state, brightness, color_temp]\n # Vremja otkrytogo soprjazhenija po umolchaniju (sek).\n permitJoinDefaultSeconds: 254\n history:\n # Maksimal'noe kolichestvo tochek Zigbee-svojstva.\n maxPoints: 200\n # Maksimal'noe kolichestvo perehodov diskretnogo svojstva.\n maxDiscretePoints: 5000\n # Chasy istorii Zigbee po umolchaniju.\n defaultHours: 24\n # Bazovyj interval zapisi chislovyh svojstv (sek).\n numericIntervalSeconds: 300\n # Minimal'nyj interval mezhdu zapisyami pri rezkom izmenenii (sek).\n numericChangeMinIntervalSeconds: 60\n # Bazovoe znachimoe izmenenie chislovogo svojstva.\n numericChangeThreshold: 0.5\n # Individual'nye intervaly redko menjajushchihsja i diagnosticheskih svojstv.\n numericIntervals:\n battery: 3600\n voltage: 3600\n linkquality: 900\n # Porogi nemedlennoj zapisi pri znachimom izmenenii.\n numericChangeThresholds:\n temperature: 0.3\n soil_temperature: 0.3\n humidity: 2.0\n soil_moisture: 2.0\n battery: 1.0\n voltage: 2.0\n linkquality: 10.0\n power: 5.0\n current: 0.05\n energy: 0.05\n # Sobytiya, gde povtor odinakovogo znachenija imeet smysl.\n eventProperties: [action, click, event]\n # Konfiguracionnye svojstva ostajutsja tol'ko v tekushchem snapshot.\n ignoredProperties:\n - child_lock\n - countdown\n - humidity_calibration\n - indicator_mode\n - power_outage_memory\n - soil_moisture_calibration\n - soil_moisture_sampling\n - soil_calibration\n - soil_sampling\n - soil_temperature_calibration\n - soil_temperature_sampling\n - soil_warning\n - switch_type\n - switch_type_button\n - temperature_calibration\n - temperature_sampling\n - temperature_unit\n\nhistory:\n retention:\n # Ezhednevnoe prorezhivanie istorii vklyucheno.\n enabled: ${HISTORY_RETENTION_ENABLED:true}\n # Kolichestvo polnyh sutok syroj istorii.\n rawDays: 30\n # Maksimal'noe kolichestvo dnei v odnom catch-up zapuske.\n maxDaysPerRun: 365\n # Raspisanie ezhednevnogo zapuska.\n cron: \"0 0 3 * * *\"\n # Chasovoj pojas raspisanija.\n timezone: \"Europe/Istanbul\"\n # Zaderzhka pervogo catch-up posle starta prilozhenija (ms).\n startupDelayMs: 60000\n # Period povtornoj proverki backlog posle starta (ms).\n catchUpPeriodMs: 86400000\n\nautomation:\n # Period worker avtomatizacii (ms).\n workerPeriodMs: 30000\n # Period aktivnyh sessij poliva (ms).\n wateringWorkerPeriodMs: 1000\n # Maksimal'nyj vozrast dannyh sensora dlya scenariev (min).\n staleSensorMinutes: 15\n # Pauza posle ruchnogo vmeshatel'stva (min).\n manualOverrideMinutes: 15\n # Porog statusa net svjazi dlya resursov (min).\n resourceOfflineMinutes: 5\n # Porog statusa net svjazi dlya plitok datchikov (min).\n sensorOfflineMinutes: 20\n # Chasovoj poyas raspisanij.\n timezone: \"Europe/Istanbul\"\n"}, "3f02ae97b8cc50f54f28c27356574e93b556141a": {"t": 1785749169.0384402, "n": 7982, "h": "ffef66f1361cfc6e", "c": "ack:\n # TTL dlya ack (sek).\n ttlSeconds: 180\n # Period ochistki ack (sek).\n cleanupPeriodSeconds: 60\n\ndevice:\n # Porog online statusa (sek).\n onlineThresholdS: 60\n defaults:\n # Cel' vlazhnosti (procent).\n targetMoisture: 40.0\n # Dlitel'nost' poliva (sek).\n wateringDurationSeconds: 30\n # Timeout poliva (sek).\n wateringTimeoutSeconds: 300\n # Chas vklyuchenija sveta.\n lightOnHour: 6\n # Chas vyklyuchenija sveta.\n lightOffHour: 22\n # Dlitel'nost' sveta (chasy).\n lightDurationHours: 16\n # Tekushchaja versija firmware.\n currentVersion: \"1.0.0\"\n # Poslednjaja versija firmware.\n latestVersion: \"1.0.0\"\n # Priznak dostupnosti update.\n updateAvailable: false\n firmware:\n # Versija po umolchaniju.\n defaultVersion: \"old\"\n\nauth:\n sso:\n # Spisok podderzhivaemyh providerov.\n supportedProviders: [\"google\", \"yandex\"]\n # Timeout soedinenija (sek).\n connectTimeoutSeconds: 10\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 10\n # Vremja zhizni state-tokena (min).\n stateTtlMinutes: 10\n\nsecurity:\n password:\n pbkdf2:\n # Kolichestvo iteracij.\n rounds: 29000\n # Razmer soli (bytes).\n saltBytes: 16\n # Razmer hesha (bytes).\n hashBytes: 32\n\nfirmware:\n # Katalog binarnikov firmware.\n binariesDir: \"firmware_binaries\"\n\nserver:\n # Public base URL.\n publicBaseUrl: \"https://growerhub.ru\"\n\nadvisor:\n # Priznak vklyucheniya advisor.\n enabled: false\n watering:\n # TTL rekomendacii poliva.\n ttl: \"24h\"\n llm:\n deepseek:\n # Base URL dlya LLM.\n baseUrl: \"https://api.deepseek.com/v1/chat/completions\"\n # API key dlya LLM.\n apiKey: \"${ADVISOR_DEEPSEEK_API_KEY:}\"\n # Model LLM.\n model: \"deepseek-chat\"\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 15\n\nplant:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\nsensor:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\npump:\n history:\n # Maksimal'noe kolichestvo tochek sostoyaniya nasosa.\n maxPoints: 200\n # Chasy istorii nasosa po umolchaniju.\n defaultHours: 24\n watering:\n # Defoltnyi rashod (ml/ch).\n defaultRateMlPerHour: 2000\n # Defoltnaja dlitel'nost' poliva po vremeni (sek).\n defaultTimedDurationS: 300\n # Defoltnyj limit aktivnogo poliva do protechki (sek).\n defaultUntilLeakMaxActiveDurationS: 1800\n # Defoltnaja dlitel'nost' impul'sa poliva (sek).\n defaultPulseRunS: 180\n # Defoltnaja pauza mezhdu impul'sami (sek).\n defaultPulsePauseS: 300\n # Maksimal'naja dlitel'nost' aktivnogo poliva (sek).\n maxActiveDurationS: 86400\n # Maksimal'nyj razmer stranicy zhurnala sessij.\n sessionPageMax: 100\n # Timeout podtverzhdenija ostanovki nasosa (sek).\n stoppingTimeoutS: 15\n ack:\n wait:\n # Timeout ozhidanija ACK po umolchaniju (sek).\n defaultTimeoutSeconds: 5\n # Maksimal'nyi timeout ACK (sek).\n maxTimeoutSeconds: 15\n # Interval polling (ms).\n pollIntervalMs: 500\n\nmqtt:\n provisioning:\n # Provisioning klient imeet tol'ko prava Dynamic Security control.\n enabled: ${MQTT_PROVISIONING_ENABLED:false}\n host: ${MQTT_PROVISIONING_HOST:localhost}\n port: ${MQTT_PROVISIONING_PORT:8883}\n tls: ${MQTT_PROVISIONING_TLS:true}\n username: ${MQTT_PROVISIONING_USERNAME:}\n password: ${MQTT_PROVISIONING_PASSWORD:}\n responseTimeoutSeconds: 10\n # Maksimal'noe kolichestvo poslednih MQTT soobshchenij v pamjati.\n recentMessagesLimit: 200\n # Maksimal'naja dlina payload v poslednih MQTT soobshchenijah.\n recentPayloadChars: 4096\n topics:\n # Ogranichennye topiki backend vmesto global'noj podpiski '#'.\n listen: \"${MQTT_LISTEN_TOPIC:}\"\n listenTopics:\n - \"gh/dev/#\"\n - \"zigbee2growerhub/#\"\n - \"gh/z2m/#\"\n # Topic dlya state.\n state: \"gh/dev/+/state\"\n # Topic dlya ack.\n ack: \"gh/dev/+/state/ack\"\n # Topic dlya service events.\n events: \"gh/dev/+/events\"\n # Bazovyj topic Zigbee2MQTT.\n zigbeeBase: \"zigbee2growerhub\"\n # Bazovyj topic pol'zovatel'skih Zigbee2MQTT namespace.\n zigbeeUserPrefix: \"gh/z2m\"\n # Suffiks dlya state.\n stateSuffix: \"/state\"\n # Suffiks dlya ack.\n ackSuffix: \"/state/ack\"\n # Suffiks dlya service events.\n eventsSuffix: \"/events\"\n\napp:\n debug:\n plantsTiming: false\n\nuser:\n # Chasovoj pojas novogo polzovatelja.\n defaultTimezone: \"Europe/Moscow\"\n\nzigbee:\n self-service:\n # Publichnyj self-service vklyuchaetsja tol'ko posle smoke-proverki.\n enabled: ${SELF_SERVICE_ENABLED:false}\n # Publichnoe MQTT podkljuchenie Zigbee2MQTT.\n mqttServer: \"mqtts://growerhub.ru:8883\"\n # Rol' klienta v Mosquitto Dynamic Security.\n brokerRole: \"z2m-coordinator\"\n # Kolichestvo sluchajnyh bytes parolja koordinatore.\n passwordBytes: 32\n # Tehnicheskaja zashchita ot chastoj vydachi broker credentials.\n credentialCooldownSeconds: 30\n # Bezopasnye writable capabilities dlya pervogo reliza.\n writableProperties: [state, brightness, color_temp]\n # Vremja otkrytogo soprjazhenija po umolchaniju (sek).\n permitJoinDefaultSeconds: 254\n history:\n # Maksimal'noe kolichestvo tochek Zigbee-svojstva.\n maxPoints: 200\n # Maksimal'noe kolichestvo perehodov diskretnogo svojstva.\n maxDiscretePoints: 5000\n # Chasy istorii Zigbee po umolchaniju.\n defaultHours: 24\n # Bazovyj interval zapisi chislovyh svojstv (sek).\n numericIntervalSeconds: 300\n # Minimal'nyj interval mezhdu zapisyami pri rezkom izmenenii (sek).\n numericChangeMinIntervalSeconds: 60\n # Bazovoe znachimoe izmenenie chislovogo svojstva.\n numericChangeThreshold: 0.5\n # Individual'nye intervaly redko menjajushchihsja i diagnosticheskih svojstv.\n numericIntervals:\n battery: 3600\n voltage: 3600\n linkquality: 900\n # Porogi nemedlennoj zapisi pri znachimom izmenenii.\n numericChangeThresholds:\n temperature: 0.3\n soil_temperature: 0.3\n humidity: 2.0\n soil_moisture: 2.0\n battery: 1.0\n voltage: 2.0\n linkquality: 10.0\n power: 5.0\n current: 0.05\n energy: 0.05\n # Sobytiya, gde povtor odinakovogo znachenija imeet smysl.\n eventProperties: [action, click, event]\n # Konfiguracionnye svojstva ostajutsja tol'ko v tekushchem snapshot.\n ignoredProperties:\n - child_lock\n - countdown\n - humidity_calibration\n - indicator_mode\n - power_outage_memory\n - soil_moisture_calibration\n - soil_moisture_sampling\n - soil_calibration\n - soil_sampling\n - soil_temperature_calibration\n - soil_temperature_sampling\n - soil_warning\n - switch_type\n - switch_type_button\n - temperature_calibration\n - temperature_sampling\n - temperature_unit\n\nhistory:\n retention:\n # Ezhednevnoe prorezhivanie istorii vklyucheno.\n enabled: ${HISTORY_RETENTION_ENABLED:true}\n # Kolichestvo polnyh sutok syroj istorii.\n rawDays: 30\n # Maksimal'noe kolichestvo dnei v odnom catch-up zapuske.\n maxDaysPerRun: 365\n # Raspisanie ezhednevnogo zapuska.\n cron: \"0 0 3 * * *\"\n # Chasovoj pojas raspisanija.\n timezone: \"Europe/Istanbul\"\n # Zaderzhka pervogo catch-up posle starta prilozhenija (ms).\n startupDelayMs: 60000\n # Period povtornoj proverki backlog posle starta (ms).\n catchUpPeriodMs: 86400000\n\nautomation:\n # Period worker avtomatizacii (ms).\n workerPeriodMs: 30000\n # Period aktivnyh sessij poliva (ms).\n wateringWorkerPeriodMs: 1000\n # Maksimal'nyj vozrast dannyh sensora dlya scenariev (min).\n staleSensorMinutes: 15\n # Pauza posle ruchnogo vmeshatel'stva (min).\n manualOverrideMinutes: 15\n # Porog statusa net svjazi dlya resursov (min).\n resourceOfflineMinutes: 5\n # Porog statusa net svjazi dlya plitok datchikov (min).\n sensorOfflineMinutes: 20\n # Chasovoj poyas raspisanij.\n timezone: \"Europe/Istanbul\"\n"}, "e76fe55a4809e2e07b5e557d5415496c0192e878": {"t": 1785749170.2781317, "n": 7900, "h": "847f363e4d8d79a9", "c": "ack:\n # TTL dlya ack (sek).\n ttlSeconds: 180\n # Period ochistki ack (sek).\n cleanupPeriodSeconds: 60\n\ndevice:\n # Porog online statusa (sek).\n onlineThresholdS: 60\n defaults:\n # Cel' vlazhnosti (procent).\n targetMoisture: 40.0\n # Dlitel'nost' poliva (sek).\n wateringDurationSeconds: 30\n # Timeout poliva (sek).\n wateringTimeoutSeconds: 300\n # Chas vklyuchenija sveta.\n lightOnHour: 6\n # Chas vyklyuchenija sveta.\n lightOffHour: 22\n # Dlitel'nost' sveta (chasy).\n lightDurationHours: 16\n # Tekushchaja versija firmware.\n currentVersion: \"1.0.0\"\n # Poslednjaja versija firmware.\n latestVersion: \"1.0.0\"\n # Priznak dostupnosti update.\n updateAvailable: false\n firmware:\n # Versija po umolchaniju.\n defaultVersion: \"old\"\n\nauth:\n sso:\n # Spisok podderzhivaemyh providerov.\n supportedProviders: [\"google\", \"yandex\"]\n # Timeout soedinenija (sek).\n connectTimeoutSeconds: 10\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 10\n # Vremja zhizni state-tokena (min).\n stateTtlMinutes: 10\n\nsecurity:\n password:\n pbkdf2:\n # Kolichestvo iteracij.\n rounds: 29000\n # Razmer soli (bytes).\n saltBytes: 16\n # Razmer hesha (bytes).\n hashBytes: 32\n\nfirmware:\n # Katalog binarnikov firmware.\n binariesDir: \"firmware_binaries\"\n\nserver:\n # Public base URL.\n publicBaseUrl: \"https://growerhub.ru\"\n\nadvisor:\n # Priznak vklyucheniya advisor.\n enabled: false\n watering:\n # TTL rekomendacii poliva.\n ttl: \"24h\"\n llm:\n deepseek:\n # Base URL dlya LLM.\n baseUrl: \"https://api.deepseek.com/v1/chat/completions\"\n # API key dlya LLM.\n apiKey: \"${ADVISOR_DEEPSEEK_API_KEY:}\"\n # Model LLM.\n model: \"deepseek-chat\"\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 15\n\nplant:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\nsensor:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\npump:\n history:\n # Maksimal'noe kolichestvo tochek sostoyaniya nasosa.\n maxPoints: 200\n # Chasy istorii nasosa po umolchaniju.\n defaultHours: 24\n watering:\n # Defoltnyi rashod (ml/ch).\n defaultRateMlPerHour: 2000\n # Defoltnaja dlitel'nost' poliva po vremeni (sek).\n defaultTimedDurationS: 300\n # Defoltnyj limit aktivnogo poliva do protechki (sek).\n defaultUntilLeakMaxActiveDurationS: 1800\n # Defoltnaja dlitel'nost' impul'sa poliva (sek).\n defaultPulseRunS: 180\n # Defoltnaja pauza mezhdu impul'sami (sek).\n defaultPulsePauseS: 300\n # Maksimal'naja dlitel'nost' aktivnogo poliva (sek).\n maxActiveDurationS: 86400\n # Maksimal'nyj razmer stranicy zhurnala sessij.\n sessionPageMax: 100\n # Timeout podtverzhdenija ostanovki nasosa (sek).\n stoppingTimeoutS: 15\n ack:\n wait:\n # Timeout ozhidanija ACK po umolchaniju (sek).\n defaultTimeoutSeconds: 5\n # Maksimal'nyi timeout ACK (sek).\n maxTimeoutSeconds: 15\n # Interval polling (ms).\n pollIntervalMs: 500\n\nmqtt:\n provisioning:\n # Provisioning klient imeet tol'ko prava Dynamic Security control.\n enabled: ${MQTT_PROVISIONING_ENABLED:false}\n host: ${MQTT_PROVISIONING_HOST:localhost}\n port: ${MQTT_PROVISIONING_PORT:8883}\n tls: ${MQTT_PROVISIONING_TLS:true}\n username: ${MQTT_PROVISIONING_USERNAME:}\n password: ${MQTT_PROVISIONING_PASSWORD:}\n responseTimeoutSeconds: 10\n # Maksimal'noe kolichestvo poslednih MQTT soobshchenij v pamjati.\n recentMessagesLimit: 200\n # Maksimal'naja dlina payload v poslednih MQTT soobshchenijah.\n recentPayloadChars: 4096\n topics:\n # Ogranichennye topiki backend vmesto global'noj podpiski '#'.\n listen: \"${MQTT_LISTEN_TOPIC:}\"\n listenTopics:\n - \"gh/dev/#\"\n - \"zigbee2growerhub/#\"\n - \"gh/z2m/#\"\n # Topic dlya state.\n state: \"gh/dev/+/state\"\n # Topic dlya ack.\n ack: \"gh/dev/+/state/ack\"\n # Topic dlya service events.\n events: \"gh/dev/+/events\"\n # Bazovyj topic Zigbee2MQTT.\n zigbeeBase: \"zigbee2growerhub\"\n # Bazovyj topic pol'zovatel'skih Zigbee2MQTT namespace.\n zigbeeUserPrefix: \"gh/z2m\"\n # Suffiks dlya state.\n stateSuffix: \"/state\"\n # Suffiks dlya ack.\n ackSuffix: \"/state/ack\"\n # Suffiks dlya service events.\n eventsSuffix: \"/events\"\n\napp:\n debug:\n plantsTiming: false\n\nzigbee:\n self-service:\n # Publichnyj self-service vklyuchaetsja tol'ko posle smoke-proverki.\n enabled: ${SELF_SERVICE_ENABLED:false}\n # Publichnoe MQTT podkljuchenie Zigbee2MQTT.\n mqttServer: \"mqtts://growerhub.ru:8883\"\n # Rol' klienta v Mosquitto Dynamic Security.\n brokerRole: \"z2m-coordinator\"\n # Kolichestvo sluchajnyh bytes parolja koordinatore.\n passwordBytes: 32\n # Tehnicheskaja zashchita ot chastoj vydachi broker credentials.\n credentialCooldownSeconds: 30\n # Bezopasnye writable capabilities dlya pervogo reliza.\n writableProperties: [state, brightness, color_temp]\n # Vremja otkrytogo soprjazhenija po umolchaniju (sek).\n permitJoinDefaultSeconds: 254\n history:\n # Maksimal'noe kolichestvo tochek Zigbee-svojstva.\n maxPoints: 200\n # Maksimal'noe kolichestvo perehodov diskretnogo svojstva.\n maxDiscretePoints: 5000\n # Chasy istorii Zigbee po umolchaniju.\n defaultHours: 24\n # Bazovyj interval zapisi chislovyh svojstv (sek).\n numericIntervalSeconds: 300\n # Minimal'nyj interval mezhdu zapisyami pri rezkom izmenenii (sek).\n numericChangeMinIntervalSeconds: 60\n # Bazovoe znachimoe izmenenie chislovogo svojstva.\n numericChangeThreshold: 0.5\n # Individual'nye intervaly redko menjajushchihsja i diagnosticheskih svojstv.\n numericIntervals:\n battery: 3600\n voltage: 3600\n linkquality: 900\n # Porogi nemedlennoj zapisi pri znachimom izmenenii.\n numericChangeThresholds:\n temperature: 0.3\n soil_temperature: 0.3\n humidity: 2.0\n soil_moisture: 2.0\n battery: 1.0\n voltage: 2.0\n linkquality: 10.0\n power: 5.0\n current: 0.05\n energy: 0.05\n # Sobytiya, gde povtor odinakovogo znachenija imeet smysl.\n eventProperties: [action, click, event]\n # Konfiguracionnye svojstva ostajutsja tol'ko v tekushchem snapshot.\n ignoredProperties:\n - child_lock\n - countdown\n - humidity_calibration\n - indicator_mode\n - power_outage_memory\n - soil_moisture_calibration\n - soil_moisture_sampling\n - soil_calibration\n - soil_sampling\n - soil_temperature_calibration\n - soil_temperature_sampling\n - soil_warning\n - switch_type\n - switch_type_button\n - temperature_calibration\n - temperature_sampling\n - temperature_unit\n\nhistory:\n retention:\n # Ezhednevnoe prorezhivanie istorii vklyucheno.\n enabled: ${HISTORY_RETENTION_ENABLED:true}\n # Kolichestvo polnyh sutok syroj istorii.\n rawDays: 30\n # Maksimal'noe kolichestvo dnei v odnom catch-up zapuske.\n maxDaysPerRun: 365\n # Raspisanie ezhednevnogo zapuska.\n cron: \"0 0 3 * * *\"\n # Chasovoj pojas raspisanija.\n timezone: \"Europe/Istanbul\"\n # Zaderzhka pervogo catch-up posle starta prilozhenija (ms).\n startupDelayMs: 60000\n # Period povtornoj proverki backlog posle starta (ms).\n catchUpPeriodMs: 86400000\n\nautomation:\n # Period worker avtomatizacii (ms).\n workerPeriodMs: 30000\n # Period aktivnyh sessij poliva (ms).\n wateringWorkerPeriodMs: 1000\n # Maksimal'nyj vozrast dannyh sensora dlya scenariev (min).\n staleSensorMinutes: 15\n # Pauza posle ruchnogo vmeshatel'stva (min).\n manualOverrideMinutes: 15\n # Porog statusa net svjazi dlya resursov (min).\n resourceOfflineMinutes: 5\n # Porog statusa net svjazi dlya plitok datchikov (min).\n sensorOfflineMinutes: 20\n # Chasovoj poyas raspisanij.\n timezone: \"Europe/Istanbul\"\n"}, "156ff9d6ee758dc3a22965d8d5442aed3a2db2f3": {"t": 1785749171.3409688, "n": 7809, "h": "c04b31a7f40b2a19", "c": "ack:\n # TTL dlya ack (sek).\n ttlSeconds: 180\n # Period ochistki ack (sek).\n cleanupPeriodSeconds: 60\n\ndevice:\n # Porog online statusa (sek).\n onlineThresholdS: 60\n defaults:\n # Cel' vlazhnosti (procent).\n targetMoisture: 40.0\n # Dlitel'nost' poliva (sek).\n wateringDurationSeconds: 30\n # Timeout poliva (sek).\n wateringTimeoutSeconds: 300\n # Chas vklyuchenija sveta.\n lightOnHour: 6\n # Chas vyklyuchenija sveta.\n lightOffHour: 22\n # Dlitel'nost' sveta (chasy).\n lightDurationHours: 16\n # Tekushchaja versija firmware.\n currentVersion: \"1.0.0\"\n # Poslednjaja versija firmware.\n latestVersion: \"1.0.0\"\n # Priznak dostupnosti update.\n updateAvailable: false\n firmware:\n # Versija po umolchaniju.\n defaultVersion: \"old\"\n\nauth:\n sso:\n # Spisok podderzhivaemyh providerov.\n supportedProviders: [\"google\", \"yandex\"]\n # Timeout soedinenija (sek).\n connectTimeoutSeconds: 10\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 10\n # Vremja zhizni state-tokena (min).\n stateTtlMinutes: 10\n\nsecurity:\n password:\n pbkdf2:\n # Kolichestvo iteracij.\n rounds: 29000\n # Razmer soli (bytes).\n saltBytes: 16\n # Razmer hesha (bytes).\n hashBytes: 32\n\nfirmware:\n # Katalog binarnikov firmware.\n binariesDir: \"firmware_binaries\"\n\nserver:\n # Public base URL.\n publicBaseUrl: \"https://growerhub.ru\"\n\nadvisor:\n # Priznak vklyucheniya advisor.\n enabled: false\n watering:\n # TTL rekomendacii poliva.\n ttl: \"24h\"\n llm:\n deepseek:\n # Base URL dlya LLM.\n baseUrl: \"https://api.deepseek.com/v1/chat/completions\"\n # API key dlya LLM.\n apiKey: \"${ADVISOR_DEEPSEEK_API_KEY:}\"\n # Model LLM.\n model: \"deepseek-chat\"\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 15\n\nplant:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\nsensor:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\npump:\n history:\n # Maksimal'noe kolichestvo tochek sostoyaniya nasosa.\n maxPoints: 200\n # Chasy istorii nasosa po umolchaniju.\n defaultHours: 24\n watering:\n # Defoltnyi rashod (ml/ch).\n defaultRateMlPerHour: 2000\n # Defoltnaja dlitel'nost' poliva po vremeni (sek).\n defaultTimedDurationS: 300\n # Defoltnyj limit aktivnogo poliva do protechki (sek).\n defaultUntilLeakMaxActiveDurationS: 1800\n # Defoltnaja dlitel'nost' impul'sa poliva (sek).\n defaultPulseRunS: 180\n # Defoltnaja pauza mezhdu impul'sami (sek).\n defaultPulsePauseS: 300\n # Maksimal'naja dlitel'nost' aktivnogo poliva (sek).\n maxActiveDurationS: 86400\n # Maksimal'nyj razmer stranicy zhurnala sessij.\n sessionPageMax: 100\n # Timeout podtverzhdenija ostanovki nasosa (sek).\n stoppingTimeoutS: 15\n ack:\n wait:\n # Timeout ozhidanija ACK po umolchaniju (sek).\n defaultTimeoutSeconds: 5\n # Maksimal'nyi timeout ACK (sek).\n maxTimeoutSeconds: 15\n # Interval polling (ms).\n pollIntervalMs: 500\n\nmqtt:\n provisioning:\n # Provisioning klient imeet tol'ko prava Dynamic Security control.\n enabled: ${MQTT_PROVISIONING_ENABLED:false}\n host: ${MQTT_PROVISIONING_HOST:localhost}\n port: ${MQTT_PROVISIONING_PORT:8883}\n tls: ${MQTT_PROVISIONING_TLS:true}\n username: ${MQTT_PROVISIONING_USERNAME:}\n password: ${MQTT_PROVISIONING_PASSWORD:}\n responseTimeoutSeconds: 10\n # Maksimal'noe kolichestvo poslednih MQTT soobshchenij v pamjati.\n recentMessagesLimit: 200\n # Maksimal'naja dlina payload v poslednih MQTT soobshchenijah.\n recentPayloadChars: 4096\n topics:\n # Ogranichennye topiki backend vmesto global'noj podpiski '#'.\n listen: \"${MQTT_LISTEN_TOPIC:}\"\n listenTopics:\n - \"gh/dev/#\"\n - \"zigbee2growerhub/#\"\n - \"gh/z2m/#\"\n # Topic dlya state.\n state: \"gh/dev/+/state\"\n # Topic dlya ack.\n ack: \"gh/dev/+/state/ack\"\n # Topic dlya service events.\n events: \"gh/dev/+/events\"\n # Bazovyj topic Zigbee2MQTT.\n zigbeeBase: \"zigbee2growerhub\"\n # Bazovyj topic pol'zovatel'skih Zigbee2MQTT namespace.\n zigbeeUserPrefix: \"gh/z2m\"\n # Suffiks dlya state.\n stateSuffix: \"/state\"\n # Suffiks dlya ack.\n ackSuffix: \"/state/ack\"\n # Suffiks dlya service events.\n eventsSuffix: \"/events\"\n\napp:\n debug:\n plantsTiming: false\n\nzigbee:\n self-service:\n # Publichnyj self-service vklyuchaetsja tol'ko posle smoke-proverki.\n enabled: ${SELF_SERVICE_ENABLED:false}\n # Publichnoe MQTT podkljuchenie Zigbee2MQTT.\n mqttServer: \"mqtts://growerhub.ru:8883\"\n # Rol' klienta v Mosquitto Dynamic Security.\n brokerRole: \"z2m-coordinator\"\n # Kolichestvo sluchajnyh bytes parolja koordinatore.\n passwordBytes: 32\n # Tehnicheskaja zashchita ot chastoj vydachi broker credentials.\n credentialCooldownSeconds: 30\n # Bezopasnye writable capabilities dlya pervogo reliza.\n writableProperties: [state, brightness, color_temp]\n # Vremja otkrytogo soprjazhenija po umolchaniju (sek).\n permitJoinDefaultSeconds: 254\n history:\n # Maksimal'noe kolichestvo tochek Zigbee-svojstva.\n maxPoints: 200\n # Chasy istorii Zigbee po umolchaniju.\n defaultHours: 24\n # Bazovyj interval zapisi chislovyh svojstv (sek).\n numericIntervalSeconds: 300\n # Minimal'nyj interval mezhdu zapisyami pri rezkom izmenenii (sek).\n numericChangeMinIntervalSeconds: 60\n # Bazovoe znachimoe izmenenie chislovogo svojstva.\n numericChangeThreshold: 0.5\n # Individual'nye intervaly redko menjajushchihsja i diagnosticheskih svojstv.\n numericIntervals:\n battery: 3600\n voltage: 3600\n linkquality: 900\n # Porogi nemedlennoj zapisi pri znachimom izmenenii.\n numericChangeThresholds:\n temperature: 0.3\n soil_temperature: 0.3\n humidity: 2.0\n soil_moisture: 2.0\n battery: 1.0\n voltage: 2.0\n linkquality: 10.0\n power: 5.0\n current: 0.05\n energy: 0.05\n # Sobytiya, gde povtor odinakovogo znachenija imeet smysl.\n eventProperties: [action, click, event]\n # Konfiguracionnye svojstva ostajutsja tol'ko v tekushchem snapshot.\n ignoredProperties:\n - child_lock\n - countdown\n - humidity_calibration\n - indicator_mode\n - power_outage_memory\n - soil_moisture_calibration\n - soil_moisture_sampling\n - soil_calibration\n - soil_sampling\n - soil_temperature_calibration\n - soil_temperature_sampling\n - soil_warning\n - switch_type\n - switch_type_button\n - temperature_calibration\n - temperature_sampling\n - temperature_unit\n\nhistory:\n retention:\n # Ezhednevnoe prorezhivanie istorii vklyucheno.\n enabled: ${HISTORY_RETENTION_ENABLED:true}\n # Kolichestvo polnyh sutok syroj istorii.\n rawDays: 30\n # Maksimal'noe kolichestvo dnei v odnom catch-up zapuske.\n maxDaysPerRun: 365\n # Raspisanie ezhednevnogo zapuska.\n cron: \"0 0 3 * * *\"\n # Chasovoj pojas raspisanija.\n timezone: \"Europe/Istanbul\"\n # Zaderzhka pervogo catch-up posle starta prilozhenija (ms).\n startupDelayMs: 60000\n # Period povtornoj proverki backlog posle starta (ms).\n catchUpPeriodMs: 86400000\n\nautomation:\n # Period worker avtomatizacii (ms).\n workerPeriodMs: 30000\n # Period aktivnyh sessij poliva (ms).\n wateringWorkerPeriodMs: 1000\n # Maksimal'nyj vozrast dannyh sensora dlya scenariev (min).\n staleSensorMinutes: 15\n # Pauza posle ruchnogo vmeshatel'stva (min).\n manualOverrideMinutes: 15\n # Porog statusa net svjazi dlya resursov (min).\n resourceOfflineMinutes: 5\n # Porog statusa net svjazi dlya plitok datchikov (min).\n sensorOfflineMinutes: 20\n # Chasovoj poyas raspisanij.\n timezone: \"Europe/Istanbul\"\n"}, "da33221f5bcbd92af0e9db501023954dc0859f61": {"t": 1785749172.7878335, "n": 5821, "h": "f621db19b58193bb", "c": "ack:\n # TTL dlya ack (sek).\n ttlSeconds: 180\n # Period ochistki ack (sek).\n cleanupPeriodSeconds: 60\n\ndevice:\n # Porog online statusa (sek).\n onlineThresholdS: 60\n defaults:\n # Cel' vlazhnosti (procent).\n targetMoisture: 40.0\n # Dlitel'nost' poliva (sek).\n wateringDurationSeconds: 30\n # Timeout poliva (sek).\n wateringTimeoutSeconds: 300\n # Chas vklyuchenija sveta.\n lightOnHour: 6\n # Chas vyklyuchenija sveta.\n lightOffHour: 22\n # Dlitel'nost' sveta (chasy).\n lightDurationHours: 16\n # Tekushchaja versija firmware.\n currentVersion: \"1.0.0\"\n # Poslednjaja versija firmware.\n latestVersion: \"1.0.0\"\n # Priznak dostupnosti update.\n updateAvailable: false\n firmware:\n # Versija po umolchaniju.\n defaultVersion: \"old\"\n\nauth:\n sso:\n # Spisok podderzhivaemyh providerov.\n supportedProviders: [\"google\", \"yandex\"]\n # Timeout soedinenija (sek).\n connectTimeoutSeconds: 10\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 10\n # Vremja zhizni state-tokena (min).\n stateTtlMinutes: 10\n\nsecurity:\n password:\n pbkdf2:\n # Kolichestvo iteracij.\n rounds: 29000\n # Razmer soli (bytes).\n saltBytes: 16\n # Razmer hesha (bytes).\n hashBytes: 32\n\nfirmware:\n # Katalog binarnikov firmware.\n binariesDir: \"firmware_binaries\"\n\nserver:\n # Public base URL.\n publicBaseUrl: \"https://growerhub.ru\"\n\nadvisor:\n # Priznak vklyucheniya advisor.\n enabled: false\n watering:\n # TTL rekomendacii poliva.\n ttl: \"24h\"\n llm:\n deepseek:\n # Base URL dlya LLM.\n baseUrl: \"https://api.deepseek.com/v1/chat/completions\"\n # API key dlya LLM.\n apiKey: \"${ADVISOR_DEEPSEEK_API_KEY:}\"\n # Model LLM.\n model: \"deepseek-chat\"\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 15\n\nplant:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\nsensor:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\npump:\n history:\n # Maksimal'noe kolichestvo tochek sostoyaniya nasosa.\n maxPoints: 200\n # Chasy istorii nasosa po umolchaniju.\n defaultHours: 24\n watering:\n # Defoltnyi rashod (ml/ch).\n defaultRateMlPerHour: 2000\n # Defoltnaja dlitel'nost' poliva po vremeni (sek).\n defaultTimedDurationS: 300\n # Defoltnyj limit aktivnogo poliva do protechki (sek).\n defaultUntilLeakMaxActiveDurationS: 1800\n # Defoltnaja dlitel'nost' impul'sa poliva (sek).\n defaultPulseRunS: 180\n # Defoltnaja pauza mezhdu impul'sami (sek).\n defaultPulsePauseS: 300\n # Maksimal'naja dlitel'nost' aktivnogo poliva (sek).\n maxActiveDurationS: 86400\n # Maksimal'nyj razmer stranicy zhurnala sessij.\n sessionPageMax: 100\n # Timeout podtverzhdenija ostanovki nasosa (sek).\n stoppingTimeoutS: 15\n ack:\n wait:\n # Timeout ozhidanija ACK po umolchaniju (sek).\n defaultTimeoutSeconds: 5\n # Maksimal'nyi timeout ACK (sek).\n maxTimeoutSeconds: 15\n # Interval polling (ms).\n pollIntervalMs: 500\n\nmqtt:\n provisioning:\n # Provisioning klient imeet tol'ko prava Dynamic Security control.\n enabled: ${MQTT_PROVISIONING_ENABLED:false}\n host: ${MQTT_PROVISIONING_HOST:localhost}\n port: ${MQTT_PROVISIONING_PORT:8883}\n tls: ${MQTT_PROVISIONING_TLS:true}\n username: ${MQTT_PROVISIONING_USERNAME:}\n password: ${MQTT_PROVISIONING_PASSWORD:}\n responseTimeoutSeconds: 10\n # Maksimal'noe kolichestvo poslednih MQTT soobshchenij v pamjati.\n recentMessagesLimit: 200\n # Maksimal'naja dlina payload v poslednih MQTT soobshchenijah.\n recentPayloadChars: 4096\n topics:\n # Ogranichennye topiki backend vmesto global'noj podpiski '#'.\n listen: \"${MQTT_LISTEN_TOPIC:}\"\n listenTopics:\n - \"gh/dev/#\"\n - \"zigbee2growerhub/#\"\n - \"gh/z2m/#\"\n # Topic dlya state.\n state: \"gh/dev/+/state\"\n # Topic dlya ack.\n ack: \"gh/dev/+/state/ack\"\n # Topic dlya service events.\n events: \"gh/dev/+/events\"\n # Bazovyj topic Zigbee2MQTT.\n zigbeeBase: \"zigbee2growerhub\"\n # Bazovyj topic pol'zovatel'skih Zigbee2MQTT namespace.\n zigbeeUserPrefix: \"gh/z2m\"\n # Suffiks dlya state.\n stateSuffix: \"/state\"\n # Suffiks dlya ack.\n ackSuffix: \"/state/ack\"\n # Suffiks dlya service events.\n eventsSuffix: \"/events\"\n\napp:\n debug:\n plantsTiming: false\n\nzigbee:\n self-service:\n # Publichnyj self-service vklyuchaetsja tol'ko posle smoke-proverki.\n enabled: ${SELF_SERVICE_ENABLED:false}\n # Publichnoe MQTT podkljuchenie Zigbee2MQTT.\n mqttServer: \"mqtts://growerhub.ru:8883\"\n # Rol' klienta v Mosquitto Dynamic Security.\n brokerRole: \"z2m-coordinator\"\n # Kolichestvo sluchajnyh bytes parolja koordinatore.\n passwordBytes: 32\n # Tehnicheskaja zashchita ot chastoj vydachi broker credentials.\n credentialCooldownSeconds: 30\n # Bezopasnye writable capabilities dlya pervogo reliza.\n writableProperties: [state, brightness, color_temp]\n # Vremja otkrytogo soprjazhenija po umolchaniju (sek).\n permitJoinDefaultSeconds: 254\n history:\n # Maksimal'noe kolichestvo tochek Zigbee-svojstva.\n maxPoints: 200\n # Chasy istorii Zigbee po umolchaniju.\n defaultHours: 24\n\nautomation:\n # Period worker avtomatizacii (ms).\n workerPeriodMs: 30000\n # Period aktivnyh sessij poliva (ms).\n wateringWorkerPeriodMs: 1000\n # Maksimal'nyj vozrast dannyh sensora dlya scenariev (min).\n staleSensorMinutes: 15\n # Pauza posle ruchnogo vmeshatel'stva (min).\n manualOverrideMinutes: 15\n # Porog statusa net svjazi dlya resursov (min).\n resourceOfflineMinutes: 5\n # Porog statusa net svjazi dlya plitok datchikov (min).\n sensorOfflineMinutes: 20\n # Chasovoj poyas raspisanij.\n timezone: \"Europe/Istanbul\"\n"}, "7ef947ab3810ed4fea0d094e5e6d175b18f4e3b0": {"t": 1785749174.877998, "n": 4629, "h": "5a8ef0570b2e89b9", "c": "ack:\n # TTL dlya ack (sek).\n ttlSeconds: 180\n # Period ochistki ack (sek).\n cleanupPeriodSeconds: 60\n\ndevice:\n # Porog online statusa (sek).\n onlineThresholdS: 60\n defaults:\n # Cel' vlazhnosti (procent).\n targetMoisture: 40.0\n # Dlitel'nost' poliva (sek).\n wateringDurationSeconds: 30\n # Timeout poliva (sek).\n wateringTimeoutSeconds: 300\n # Chas vklyuchenija sveta.\n lightOnHour: 6\n # Chas vyklyuchenija sveta.\n lightOffHour: 22\n # Dlitel'nost' sveta (chasy).\n lightDurationHours: 16\n # Tekushchaja versija firmware.\n currentVersion: \"1.0.0\"\n # Poslednjaja versija firmware.\n latestVersion: \"1.0.0\"\n # Priznak dostupnosti update.\n updateAvailable: false\n firmware:\n # Versija po umolchaniju.\n defaultVersion: \"old\"\n\nauth:\n sso:\n # Spisok podderzhivaemyh providerov.\n supportedProviders: [\"google\", \"yandex\"]\n # Timeout soedinenija (sek).\n connectTimeoutSeconds: 10\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 10\n # Vremja zhizni state-tokena (min).\n stateTtlMinutes: 10\n\nsecurity:\n password:\n pbkdf2:\n # Kolichestvo iteracij.\n rounds: 29000\n # Razmer soli (bytes).\n saltBytes: 16\n # Razmer hesha (bytes).\n hashBytes: 32\n\nfirmware:\n # Katalog binarnikov firmware.\n binariesDir: \"firmware_binaries\"\n\nserver:\n # Public base URL.\n publicBaseUrl: \"https://growerhub.ru\"\n\nadvisor:\n # Priznak vklyucheniya advisor.\n enabled: false\n watering:\n # TTL rekomendacii poliva.\n ttl: \"24h\"\n llm:\n deepseek:\n # Base URL dlya LLM.\n baseUrl: \"https://api.deepseek.com/v1/chat/completions\"\n # API key dlya LLM.\n apiKey: \"sk-0a2867b7fe554a9fb41757ce3b0f144f_4234234\"\n # Model LLM.\n model: \"deepseek-chat\"\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 15\n\nplant:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\nsensor:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\npump:\n history:\n # Maksimal'noe kolichestvo tochek sostoyaniya nasosa.\n maxPoints: 200\n # Chasy istorii nasosa po umolchaniju.\n defaultHours: 24\n watering:\n # Defoltnyi rashod (ml/ch).\n defaultRateMlPerHour: 2000\n # Defoltnaja dlitel'nost' poliva po vremeni (sek).\n defaultTimedDurationS: 300\n # Defoltnyj limit aktivnogo poliva do protechki (sek).\n defaultUntilLeakMaxActiveDurationS: 1800\n # Defoltnaja dlitel'nost' impul'sa poliva (sek).\n defaultPulseRunS: 180\n # Defoltnaja pauza mezhdu impul'sami (sek).\n defaultPulsePauseS: 300\n # Maksimal'naja dlitel'nost' aktivnogo poliva (sek).\n maxActiveDurationS: 86400\n # Maksimal'nyj razmer stranicy zhurnala sessij.\n sessionPageMax: 100\n # Timeout podtverzhdenija ostanovki nasosa (sek).\n stoppingTimeoutS: 15\n ack:\n wait:\n # Timeout ozhidanija ACK po umolchaniju (sek).\n defaultTimeoutSeconds: 5\n # Maksimal'nyi timeout ACK (sek).\n maxTimeoutSeconds: 15\n # Interval polling (ms).\n pollIntervalMs: 500\n\nmqtt:\n # Maksimal'noe kolichestvo poslednih MQTT soobshchenij v pamjati.\n recentMessagesLimit: 200\n # Maksimal'naja dlina payload v poslednih MQTT soobshchenijah.\n recentPayloadChars: 4096\n topics:\n # Topic dlya diagnosticheskoj podpiski.\n listen: \"#\"\n # Topic dlya state.\n state: \"gh/dev/+/state\"\n # Topic dlya ack.\n ack: \"gh/dev/+/state/ack\"\n # Topic dlya service events.\n events: \"gh/dev/+/events\"\n # Bazovyj topic Zigbee2MQTT.\n zigbeeBase: \"zigbee2growerhub\"\n # Suffiks dlya state.\n stateSuffix: \"/state\"\n # Suffiks dlya ack.\n ackSuffix: \"/state/ack\"\n # Suffiks dlya service events.\n eventsSuffix: \"/events\"\n\napp:\n debug:\n plantsTiming: false\n\nzigbee:\n # Vremja otkrytogo soprjazhenija po umolchaniju (sek).\n permitJoinDefaultSeconds: 254\n history:\n # Maksimal'noe kolichestvo tochek Zigbee-svojstva.\n maxPoints: 200\n # Chasy istorii Zigbee po umolchaniju.\n defaultHours: 24\n\nautomation:\n # Period worker avtomatizacii (ms).\n workerPeriodMs: 30000\n # Period aktivnyh sessij poliva (ms).\n wateringWorkerPeriodMs: 1000\n # Maksimal'nyj vozrast dannyh sensora dlya scenariev (min).\n staleSensorMinutes: 15\n # Pauza posle ruchnogo vmeshatel'stva (min).\n manualOverrideMinutes: 15\n # Porog statusa net svjazi dlya resursov (min).\n resourceOfflineMinutes: 5\n # Porog statusa net svjazi dlya plitok datchikov (min).\n sensorOfflineMinutes: 20\n # Chasovoj poyas raspisanij.\n timezone: \"Europe/Istanbul\"\n"}, "3b9f5634fe60cdbe4b90f3489639455cc1c1fd2b": {"t": 1785749175.9640749, "n": 4544, "h": "384ac6e7aa55c4b2", "c": "ack:\n # TTL dlya ack (sek).\n ttlSeconds: 180\n # Period ochistki ack (sek).\n cleanupPeriodSeconds: 60\n\ndevice:\n # Porog online statusa (sek).\n onlineThresholdS: 60\n defaults:\n # Cel' vlazhnosti (procent).\n targetMoisture: 40.0\n # Dlitel'nost' poliva (sek).\n wateringDurationSeconds: 30\n # Timeout poliva (sek).\n wateringTimeoutSeconds: 300\n # Chas vklyuchenija sveta.\n lightOnHour: 6\n # Chas vyklyuchenija sveta.\n lightOffHour: 22\n # Dlitel'nost' sveta (chasy).\n lightDurationHours: 16\n # Tekushchaja versija firmware.\n currentVersion: \"1.0.0\"\n # Poslednjaja versija firmware.\n latestVersion: \"1.0.0\"\n # Priznak dostupnosti update.\n updateAvailable: false\n firmware:\n # Versija po umolchaniju.\n defaultVersion: \"old\"\n\nauth:\n sso:\n # Spisok podderzhivaemyh providerov.\n supportedProviders: [\"google\", \"yandex\"]\n # Timeout soedinenija (sek).\n connectTimeoutSeconds: 10\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 10\n # Vremja zhizni state-tokena (min).\n stateTtlMinutes: 10\n\nsecurity:\n password:\n pbkdf2:\n # Kolichestvo iteracij.\n rounds: 29000\n # Razmer soli (bytes).\n saltBytes: 16\n # Razmer hesha (bytes).\n hashBytes: 32\n\nfirmware:\n # Katalog binarnikov firmware.\n binariesDir: \"firmware_binaries\"\n\nserver:\n # Public base URL.\n publicBaseUrl: \"https://growerhub.ru\"\n\nadvisor:\n # Priznak vklyucheniya advisor.\n enabled: false\n watering:\n # TTL rekomendacii poliva.\n ttl: \"24h\"\n llm:\n deepseek:\n # Base URL dlya LLM.\n baseUrl: \"https://api.deepseek.com/v1/chat/completions\"\n # API key dlya LLM.\n apiKey: \"sk-0a2867b7fe554a9fb41757ce3b0f144f_4234234\"\n # Model LLM.\n model: \"deepseek-chat\"\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 15\n\nplant:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\nsensor:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\npump:\n history:\n # Maksimal'noe kolichestvo tochek sostoyaniya nasosa.\n maxPoints: 200\n # Chasy istorii nasosa po umolchaniju.\n defaultHours: 24\n watering:\n # Defoltnyi rashod (ml/ch).\n defaultRateMlPerHour: 2000\n # Defoltnaja dlitel'nost' poliva po vremeni (sek).\n defaultTimedDurationS: 300\n # Defoltnyj limit aktivnogo poliva do protechki (sek).\n defaultUntilLeakMaxActiveDurationS: 1800\n # Defoltnaja dlitel'nost' impul'sa poliva (sek).\n defaultPulseRunS: 180\n # Defoltnaja pauza mezhdu impul'sami (sek).\n defaultPulsePauseS: 300\n # Maksimal'naja dlitel'nost' aktivnogo poliva (sek).\n maxActiveDurationS: 86400\n # Maksimal'nyj razmer stranicy zhurnala sessij.\n sessionPageMax: 100\n # Timeout podtverzhdenija ostanovki nasosa (sek).\n stoppingTimeoutS: 15\n ack:\n wait:\n # Timeout ozhidanija ACK po umolchaniju (sek).\n defaultTimeoutSeconds: 5\n # Maksimal'nyi timeout ACK (sek).\n maxTimeoutSeconds: 15\n # Interval polling (ms).\n pollIntervalMs: 500\n\nmqtt:\n # Maksimal'noe kolichestvo poslednih MQTT soobshchenij v pamjati.\n recentMessagesLimit: 200\n # Maksimal'naja dlina payload v poslednih MQTT soobshchenijah.\n recentPayloadChars: 4096\n topics:\n # Topic dlya diagnosticheskoj podpiski.\n listen: \"#\"\n # Topic dlya state.\n state: \"gh/dev/+/state\"\n # Topic dlya ack.\n ack: \"gh/dev/+/state/ack\"\n # Topic dlya service events.\n events: \"gh/dev/+/events\"\n # Bazovyj topic Zigbee2MQTT.\n zigbeeBase: \"zigbee2growerhub\"\n # Suffiks dlya state.\n stateSuffix: \"/state\"\n # Suffiks dlya ack.\n ackSuffix: \"/state/ack\"\n # Suffiks dlya service events.\n eventsSuffix: \"/events\"\n\napp:\n debug:\n plantsTiming: false\n\nzigbee:\n # Vremja otkrytogo soprjazhenija po umolchaniju (sek).\n permitJoinDefaultSeconds: 254\n history:\n # Maksimal'noe kolichestvo tochek Zigbee-svojstva.\n maxPoints: 200\n # Chasy istorii Zigbee po umolchaniju.\n defaultHours: 24\n\nautomation:\n # Period worker avtomatizacii (ms).\n workerPeriodMs: 30000\n # Period aktivnyh sessij poliva (ms).\n wateringWorkerPeriodMs: 1000\n # Maksimal'nyj vozrast dannyh sensora dlya scenariev (min).\n staleSensorMinutes: 15\n # Pauza posle ruchnogo vmeshatel'stva (min).\n manualOverrideMinutes: 15\n # Porog statusa net svjazi dlya resursov (min).\n resourceOfflineMinutes: 5\n # Chasovoj poyas raspisanij.\n timezone: \"Europe/Istanbul\"\n"}, "92f7be8c84d9a92c771e32be92bacb25a250bf7f": {"t": 1785749177.0413733, "n": 3957, "h": "d0550604af8d0095", "c": "ack:\n # TTL dlya ack (sek).\n ttlSeconds: 180\n # Period ochistki ack (sek).\n cleanupPeriodSeconds: 60\n\ndevice:\n # Porog online statusa (sek).\n onlineThresholdS: 60\n defaults:\n # Cel' vlazhnosti (procent).\n targetMoisture: 40.0\n # Dlitel'nost' poliva (sek).\n wateringDurationSeconds: 30\n # Timeout poliva (sek).\n wateringTimeoutSeconds: 300\n # Chas vklyuchenija sveta.\n lightOnHour: 6\n # Chas vyklyuchenija sveta.\n lightOffHour: 22\n # Dlitel'nost' sveta (chasy).\n lightDurationHours: 16\n # Tekushchaja versija firmware.\n currentVersion: \"1.0.0\"\n # Poslednjaja versija firmware.\n latestVersion: \"1.0.0\"\n # Priznak dostupnosti update.\n updateAvailable: false\n firmware:\n # Versija po umolchaniju.\n defaultVersion: \"old\"\n\nauth:\n sso:\n # Spisok podderzhivaemyh providerov.\n supportedProviders: [\"google\", \"yandex\"]\n # Timeout soedinenija (sek).\n connectTimeoutSeconds: 10\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 10\n # Vremja zhizni state-tokena (min).\n stateTtlMinutes: 10\n\nsecurity:\n password:\n pbkdf2:\n # Kolichestvo iteracij.\n rounds: 29000\n # Razmer soli (bytes).\n saltBytes: 16\n # Razmer hesha (bytes).\n hashBytes: 32\n\nfirmware:\n # Katalog binarnikov firmware.\n binariesDir: \"firmware_binaries\"\n\nserver:\n # Public base URL.\n publicBaseUrl: \"https://growerhub.ru\"\n\nadvisor:\n # Priznak vklyucheniya advisor.\n enabled: false\n watering:\n # TTL rekomendacii poliva.\n ttl: \"24h\"\n llm:\n deepseek:\n # Base URL dlya LLM.\n baseUrl: \"https://api.deepseek.com/v1/chat/completions\"\n # API key dlya LLM.\n apiKey: \"sk-0a2867b7fe554a9fb41757ce3b0f144f_4234234\"\n # Model LLM.\n model: \"deepseek-chat\"\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 15\n\nplant:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\nsensor:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\npump:\n history:\n # Maksimal'noe kolichestvo tochek sostoyaniya nasosa.\n maxPoints: 200\n # Chasy istorii nasosa po umolchaniju.\n defaultHours: 24\n watering:\n # Defoltnyi rashod (ml/ch).\n defaultRateMlPerHour: 2000\n ack:\n wait:\n # Timeout ozhidanija ACK po umolchaniju (sek).\n defaultTimeoutSeconds: 5\n # Maksimal'nyi timeout ACK (sek).\n maxTimeoutSeconds: 15\n # Interval polling (ms).\n pollIntervalMs: 500\n\nmqtt:\n # Maksimal'noe kolichestvo poslednih MQTT soobshchenij v pamjati.\n recentMessagesLimit: 200\n # Maksimal'naja dlina payload v poslednih MQTT soobshchenijah.\n recentPayloadChars: 4096\n topics:\n # Topic dlya diagnosticheskoj podpiski.\n listen: \"#\"\n # Topic dlya state.\n state: \"gh/dev/+/state\"\n # Topic dlya ack.\n ack: \"gh/dev/+/state/ack\"\n # Topic dlya service events.\n events: \"gh/dev/+/events\"\n # Bazovyj topic Zigbee2MQTT.\n zigbeeBase: \"zigbee2growerhub\"\n # Suffiks dlya state.\n stateSuffix: \"/state\"\n # Suffiks dlya ack.\n ackSuffix: \"/state/ack\"\n # Suffiks dlya service events.\n eventsSuffix: \"/events\"\n\napp:\n debug:\n plantsTiming: false\n\nzigbee:\n # Vremja otkrytogo soprjazhenija po umolchaniju (sek).\n permitJoinDefaultSeconds: 254\n history:\n # Maksimal'noe kolichestvo tochek Zigbee-svojstva.\n maxPoints: 200\n # Chasy istorii Zigbee po umolchaniju.\n defaultHours: 24\n\nautomation:\n # Period worker avtomatizacii (ms).\n workerPeriodMs: 30000\n # Period aktivnyh sessij poliva (ms).\n wateringWorkerPeriodMs: 1000\n # Maksimal'nyj vozrast dannyh sensora dlya scenariev (min).\n staleSensorMinutes: 15\n # Pauza posle ruchnogo vmeshatel'stva (min).\n manualOverrideMinutes: 15\n # Porog statusa net svjazi dlya resursov (min).\n resourceOfflineMinutes: 5\n # Chasovoj poyas raspisanij.\n timezone: \"Europe/Istanbul\"\n"}, "17c34c253d1f7b9f8976728111656f07db042bb3": {"t": 1785749178.097451, "n": 3808, "h": "4d5843020f4d59e7", "c": "ack:\n # TTL dlya ack (sek).\n ttlSeconds: 180\n # Period ochistki ack (sek).\n cleanupPeriodSeconds: 60\n\ndevice:\n # Porog online statusa (sek).\n onlineThresholdS: 60\n defaults:\n # Cel' vlazhnosti (procent).\n targetMoisture: 40.0\n # Dlitel'nost' poliva (sek).\n wateringDurationSeconds: 30\n # Timeout poliva (sek).\n wateringTimeoutSeconds: 300\n # Chas vklyuchenija sveta.\n lightOnHour: 6\n # Chas vyklyuchenija sveta.\n lightOffHour: 22\n # Dlitel'nost' sveta (chasy).\n lightDurationHours: 16\n # Tekushchaja versija firmware.\n currentVersion: \"1.0.0\"\n # Poslednjaja versija firmware.\n latestVersion: \"1.0.0\"\n # Priznak dostupnosti update.\n updateAvailable: false\n firmware:\n # Versija po umolchaniju.\n defaultVersion: \"old\"\n\nauth:\n sso:\n # Spisok podderzhivaemyh providerov.\n supportedProviders: [\"google\", \"yandex\"]\n # Timeout soedinenija (sek).\n connectTimeoutSeconds: 10\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 10\n # Vremja zhizni state-tokena (min).\n stateTtlMinutes: 10\n\nsecurity:\n password:\n pbkdf2:\n # Kolichestvo iteracij.\n rounds: 29000\n # Razmer soli (bytes).\n saltBytes: 16\n # Razmer hesha (bytes).\n hashBytes: 32\n\nfirmware:\n # Katalog binarnikov firmware.\n binariesDir: \"firmware_binaries\"\n\nserver:\n # Public base URL.\n publicBaseUrl: \"https://growerhub.ru\"\n\nadvisor:\n # Priznak vklyucheniya advisor.\n enabled: false\n watering:\n # TTL rekomendacii poliva.\n ttl: \"24h\"\n llm:\n deepseek:\n # Base URL dlya LLM.\n baseUrl: \"https://api.deepseek.com/v1/chat/completions\"\n # API key dlya LLM.\n apiKey: \"sk-0a2867b7fe554a9fb41757ce3b0f144f_4234234\"\n # Model LLM.\n model: \"deepseek-chat\"\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 15\n\nplant:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\nsensor:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\npump:\n history:\n # Maksimal'noe kolichestvo tochek sostoyaniya nasosa.\n maxPoints: 200\n # Chasy istorii nasosa po umolchaniju.\n defaultHours: 24\n watering:\n # Defoltnyi rashod (ml/ch).\n defaultRateMlPerHour: 2000\n ack:\n wait:\n # Timeout ozhidanija ACK po umolchaniju (sek).\n defaultTimeoutSeconds: 5\n # Maksimal'nyi timeout ACK (sek).\n maxTimeoutSeconds: 15\n # Interval polling (ms).\n pollIntervalMs: 500\n\nmqtt:\n # Maksimal'noe kolichestvo poslednih MQTT soobshchenij v pamjati.\n recentMessagesLimit: 200\n # Maksimal'naja dlina payload v poslednih MQTT soobshchenijah.\n recentPayloadChars: 4096\n topics:\n # Topic dlya diagnosticheskoj podpiski.\n listen: \"#\"\n # Topic dlya state.\n state: \"gh/dev/+/state\"\n # Topic dlya ack.\n ack: \"gh/dev/+/state/ack\"\n # Topic dlya service events.\n events: \"gh/dev/+/events\"\n # Bazovyj topic Zigbee2MQTT.\n zigbeeBase: \"zigbee2growerhub\"\n # Suffiks dlya state.\n stateSuffix: \"/state\"\n # Suffiks dlya ack.\n ackSuffix: \"/state/ack\"\n # Suffiks dlya service events.\n eventsSuffix: \"/events\"\n\napp:\n debug:\n plantsTiming: false\n\nzigbee:\n # Vremja otkrytogo soprjazhenija po umolchaniju (sek).\n permitJoinDefaultSeconds: 254\n history:\n # Maksimal'noe kolichestvo tochek Zigbee-svojstva.\n maxPoints: 200\n # Chasy istorii Zigbee po umolchaniju.\n defaultHours: 24\n\nautomation:\n # Period worker avtomatizacii (ms).\n workerPeriodMs: 30000\n # Maksimal'nyj vozrast dannyh sensora dlya scenariev (min).\n staleSensorMinutes: 15\n # Pauza posle ruchnogo vmeshatel'stva (min).\n manualOverrideMinutes: 15\n # Chasovoj poyas raspisanij.\n timezone: \"Europe/Istanbul\"\n"}, "01900b26eaa08526513c1e9aff5e72fc25e1f992": {"t": 1785749179.7625802, "n": 3507, "h": "b6780537d89758bf", "c": "ack:\n # TTL dlya ack (sek).\n ttlSeconds: 180\n # Period ochistki ack (sek).\n cleanupPeriodSeconds: 60\n\ndevice:\n # Porog online statusa (sek).\n onlineThresholdS: 60\n defaults:\n # Cel' vlazhnosti (procent).\n targetMoisture: 40.0\n # Dlitel'nost' poliva (sek).\n wateringDurationSeconds: 30\n # Timeout poliva (sek).\n wateringTimeoutSeconds: 300\n # Chas vklyuchenija sveta.\n lightOnHour: 6\n # Chas vyklyuchenija sveta.\n lightOffHour: 22\n # Dlitel'nost' sveta (chasy).\n lightDurationHours: 16\n # Tekushchaja versija firmware.\n currentVersion: \"1.0.0\"\n # Poslednjaja versija firmware.\n latestVersion: \"1.0.0\"\n # Priznak dostupnosti update.\n updateAvailable: false\n firmware:\n # Versija po umolchaniju.\n defaultVersion: \"old\"\n\nauth:\n sso:\n # Spisok podderzhivaemyh providerov.\n supportedProviders: [\"google\", \"yandex\"]\n # Timeout soedinenija (sek).\n connectTimeoutSeconds: 10\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 10\n # Vremja zhizni state-tokena (min).\n stateTtlMinutes: 10\n\nsecurity:\n password:\n pbkdf2:\n # Kolichestvo iteracij.\n rounds: 29000\n # Razmer soli (bytes).\n saltBytes: 16\n # Razmer hesha (bytes).\n hashBytes: 32\n\nfirmware:\n # Katalog binarnikov firmware.\n binariesDir: \"firmware_binaries\"\n\nserver:\n # Public base URL.\n publicBaseUrl: \"https://growerhub.ru\"\n\nadvisor:\n # Priznak vklyucheniya advisor.\n enabled: false\n watering:\n # TTL rekomendacii poliva.\n ttl: \"24h\"\n llm:\n deepseek:\n # Base URL dlya LLM.\n baseUrl: \"https://api.deepseek.com/v1/chat/completions\"\n # API key dlya LLM.\n apiKey: \"sk-0a2867b7fe554a9fb41757ce3b0f144f_4234234\"\n # Model LLM.\n model: \"deepseek-chat\"\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 15\n\nplant:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\nsensor:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\npump:\n watering:\n # Defoltnyi rashod (ml/ch).\n defaultRateMlPerHour: 2000\n ack:\n wait:\n # Timeout ozhidanija ACK po umolchaniju (sek).\n defaultTimeoutSeconds: 5\n # Maksimal'nyi timeout ACK (sek).\n maxTimeoutSeconds: 15\n # Interval polling (ms).\n pollIntervalMs: 500\n\nmqtt:\n # Maksimal'noe kolichestvo poslednih MQTT soobshchenij v pamjati.\n recentMessagesLimit: 200\n # Maksimal'naja dlina payload v poslednih MQTT soobshchenijah.\n recentPayloadChars: 4096\n topics:\n # Topic dlya diagnosticheskoj podpiski.\n listen: \"#\"\n # Topic dlya state.\n state: \"gh/dev/+/state\"\n # Topic dlya ack.\n ack: \"gh/dev/+/state/ack\"\n # Topic dlya service events.\n events: \"gh/dev/+/events\"\n # Bazovyj topic Zigbee2MQTT.\n zigbeeBase: \"zigbee2growerhub\"\n # Suffiks dlya state.\n stateSuffix: \"/state\"\n # Suffiks dlya ack.\n ackSuffix: \"/state/ack\"\n # Suffiks dlya service events.\n eventsSuffix: \"/events\"\n\napp:\n debug:\n plantsTiming: false\n\nzigbee:\n # Vremja otkrytogo soprjazhenija po umolchaniju (sek).\n permitJoinDefaultSeconds: 254\n\nautomation:\n # Period worker avtomatizacii (ms).\n workerPeriodMs: 30000\n # Maksimal'nyj vozrast dannyh sensora dlya scenariev (min).\n staleSensorMinutes: 15\n # Pauza posle ruchnogo vmeshatel'stva (min).\n manualOverrideMinutes: 15\n # Chasovoj poyas raspisanij.\n timezone: \"Europe/Istanbul\"\n"}, "7e1ab60e35a92226fdb6d6fe6edf62f4ae4c0ca1": {"t": 1785749180.8569896, "n": 3209, "h": "59646edf4a6c9cc3", "c": "ack:\n # TTL dlya ack (sek).\n ttlSeconds: 180\n # Period ochistki ack (sek).\n cleanupPeriodSeconds: 60\n\ndevice:\n # Porog online statusa (sek).\n onlineThresholdS: 60\n defaults:\n # Cel' vlazhnosti (procent).\n targetMoisture: 40.0\n # Dlitel'nost' poliva (sek).\n wateringDurationSeconds: 30\n # Timeout poliva (sek).\n wateringTimeoutSeconds: 300\n # Chas vklyuchenija sveta.\n lightOnHour: 6\n # Chas vyklyuchenija sveta.\n lightOffHour: 22\n # Dlitel'nost' sveta (chasy).\n lightDurationHours: 16\n # Tekushchaja versija firmware.\n currentVersion: \"1.0.0\"\n # Poslednjaja versija firmware.\n latestVersion: \"1.0.0\"\n # Priznak dostupnosti update.\n updateAvailable: false\n firmware:\n # Versija po umolchaniju.\n defaultVersion: \"old\"\n\nauth:\n sso:\n # Spisok podderzhivaemyh providerov.\n supportedProviders: [\"google\", \"yandex\"]\n # Timeout soedinenija (sek).\n connectTimeoutSeconds: 10\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 10\n # Vremja zhizni state-tokena (min).\n stateTtlMinutes: 10\n\nsecurity:\n password:\n pbkdf2:\n # Kolichestvo iteracij.\n rounds: 29000\n # Razmer soli (bytes).\n saltBytes: 16\n # Razmer hesha (bytes).\n hashBytes: 32\n\nfirmware:\n # Katalog binarnikov firmware.\n binariesDir: \"firmware_binaries\"\n\nserver:\n # Public base URL.\n publicBaseUrl: \"https://growerhub.ru\"\n\nadvisor:\n # Priznak vklyucheniya advisor.\n enabled: false\n watering:\n # TTL rekomendacii poliva.\n ttl: \"24h\"\n llm:\n deepseek:\n # Base URL dlya LLM.\n baseUrl: \"https://api.deepseek.com/v1/chat/completions\"\n # API key dlya LLM.\n apiKey: \"sk-0a2867b7fe554a9fb41757ce3b0f144f_4234234\"\n # Model LLM.\n model: \"deepseek-chat\"\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 15\n\nplant:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\nsensor:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\npump:\n watering:\n # Defoltnyi rashod (ml/ch).\n defaultRateMlPerHour: 2000\n ack:\n wait:\n # Timeout ozhidanija ACK po umolchaniju (sek).\n defaultTimeoutSeconds: 5\n # Maksimal'nyi timeout ACK (sek).\n maxTimeoutSeconds: 15\n # Interval polling (ms).\n pollIntervalMs: 500\n\nmqtt:\n # Maksimal'noe kolichestvo poslednih MQTT soobshchenij v pamjati.\n recentMessagesLimit: 200\n # Maksimal'naja dlina payload v poslednih MQTT soobshchenijah.\n recentPayloadChars: 4096\n topics:\n # Topic dlya diagnosticheskoj podpiski.\n listen: \"#\"\n # Topic dlya state.\n state: \"gh/dev/+/state\"\n # Topic dlya ack.\n ack: \"gh/dev/+/state/ack\"\n # Topic dlya service events.\n events: \"gh/dev/+/events\"\n # Bazovyj topic Zigbee2MQTT.\n zigbeeBase: \"zigbee2growerhub\"\n # Suffiks dlya state.\n stateSuffix: \"/state\"\n # Suffiks dlya ack.\n ackSuffix: \"/state/ack\"\n # Suffiks dlya service events.\n eventsSuffix: \"/events\"\n\napp:\n debug:\n plantsTiming: false\n\nzigbee:\n # Vremja otkrytogo soprjazhenija po umolchaniju (sek).\n permitJoinDefaultSeconds: 254\n"}, "412a3d9f4026f191a8cd26166fbf27cfc7e121b9": {"t": 1785749181.9285977, "n": 3043, "h": "ccaeab371f5add42", "c": "ack:\n # TTL dlya ack (sek).\n ttlSeconds: 180\n # Period ochistki ack (sek).\n cleanupPeriodSeconds: 60\n\ndevice:\n # Porog online statusa (sek).\n onlineThresholdS: 60\n defaults:\n # Cel' vlazhnosti (procent).\n targetMoisture: 40.0\n # Dlitel'nost' poliva (sek).\n wateringDurationSeconds: 30\n # Timeout poliva (sek).\n wateringTimeoutSeconds: 300\n # Chas vklyuchenija sveta.\n lightOnHour: 6\n # Chas vyklyuchenija sveta.\n lightOffHour: 22\n # Dlitel'nost' sveta (chasy).\n lightDurationHours: 16\n # Tekushchaja versija firmware.\n currentVersion: \"1.0.0\"\n # Poslednjaja versija firmware.\n latestVersion: \"1.0.0\"\n # Priznak dostupnosti update.\n updateAvailable: false\n firmware:\n # Versija po umolchaniju.\n defaultVersion: \"old\"\n\nauth:\n sso:\n # Spisok podderzhivaemyh providerov.\n supportedProviders: [\"google\", \"yandex\"]\n # Timeout soedinenija (sek).\n connectTimeoutSeconds: 10\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 10\n # Vremja zhizni state-tokena (min).\n stateTtlMinutes: 10\n\nsecurity:\n password:\n pbkdf2:\n # Kolichestvo iteracij.\n rounds: 29000\n # Razmer soli (bytes).\n saltBytes: 16\n # Razmer hesha (bytes).\n hashBytes: 32\n\nfirmware:\n # Katalog binarnikov firmware.\n binariesDir: \"firmware_binaries\"\n\nserver:\n # Public base URL.\n publicBaseUrl: \"https://growerhub.ru\"\n\nadvisor:\n # Priznak vklyucheniya advisor.\n enabled: false\n watering:\n # TTL rekomendacii poliva.\n ttl: \"24h\"\n llm:\n deepseek:\n # Base URL dlya LLM.\n baseUrl: \"https://api.deepseek.com/v1/chat/completions\"\n # API key dlya LLM.\n apiKey: \"sk-0a2867b7fe554a9fb41757ce3b0f144f_4234234\"\n # Model LLM.\n model: \"deepseek-chat\"\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 15\n\nplant:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\nsensor:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\npump:\n watering:\n # Defoltnyi rashod (ml/ch).\n defaultRateMlPerHour: 2000\n ack:\n wait:\n # Timeout ozhidanija ACK po umolchaniju (sek).\n defaultTimeoutSeconds: 5\n # Maksimal'nyi timeout ACK (sek).\n maxTimeoutSeconds: 15\n # Interval polling (ms).\n pollIntervalMs: 500\n\nmqtt:\n # Maksimal'noe kolichestvo poslednih MQTT soobshchenij v pamjati.\n recentMessagesLimit: 200\n # Maksimal'naja dlina payload v poslednih MQTT soobshchenijah.\n recentPayloadChars: 4096\n topics:\n # Topic dlya diagnosticheskoj podpiski.\n listen: \"#\"\n # Topic dlya state.\n state: \"gh/dev/+/state\"\n # Topic dlya ack.\n ack: \"gh/dev/+/state/ack\"\n # Topic dlya service events.\n events: \"gh/dev/+/events\"\n # Suffiks dlya state.\n stateSuffix: \"/state\"\n # Suffiks dlya ack.\n ackSuffix: \"/state/ack\"\n # Suffiks dlya service events.\n eventsSuffix: \"/events\"\n\napp:\n debug:\n plantsTiming: false\n"}, "eec40378e6764b9cb3f738d16c5726ee1bad4911": {"t": 1785749183.0156612, "n": 3050, "h": "3a93121874345913", "c": "ack:\n # TTL dlya ack (sek).\n ttlSeconds: 180\n # Period ochistki ack (sek).\n cleanupPeriodSeconds: 60\n\ndevice:\n # Porog online statusa (sek).\n onlineThresholdS: 60\n defaults:\n # Cel' vlazhnosti (procent).\n targetMoisture: 40.0\n # Dlitel'nost' poliva (sek).\n wateringDurationSeconds: 30\n # Timeout poliva (sek).\n wateringTimeoutSeconds: 300\n # Chas vklyuchenija sveta.\n lightOnHour: 6\n # Chas vyklyuchenija sveta.\n lightOffHour: 22\n # Dlitel'nost' sveta (chasy).\n lightDurationHours: 16\n # Tekushchaja versija firmware.\n currentVersion: \"1.0.0\"\n # Poslednjaja versija firmware.\n latestVersion: \"1.0.0\"\n # Priznak dostupnosti update.\n updateAvailable: false\n firmware:\n # Versija po umolchaniju.\n defaultVersion: \"old\"\n\nauth:\n sso:\n # Spisok podderzhivaemyh providerov.\n supportedProviders: [\"google\", \"yandex\"]\n # Timeout soedinenija (sek).\n connectTimeoutSeconds: 10\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 10\n # Vremja zhizni state-tokena (min).\n stateTtlMinutes: 10\n\nsecurity:\n password:\n pbkdf2:\n # Kolichestvo iteracij.\n rounds: 29000\n # Razmer soli (bytes).\n saltBytes: 16\n # Razmer hesha (bytes).\n hashBytes: 32\n\nfirmware:\n # Katalog binarnikov firmware.\n binariesDir: \"server/firmware_binaries\"\n\nserver:\n # Public base URL.\n publicBaseUrl: \"https://growerhub.ru\"\n\nadvisor:\n # Priznak vklyucheniya advisor.\n enabled: false\n watering:\n # TTL rekomendacii poliva.\n ttl: \"24h\"\n llm:\n deepseek:\n # Base URL dlya LLM.\n baseUrl: \"https://api.deepseek.com/v1/chat/completions\"\n # API key dlya LLM.\n apiKey: \"sk-0a2867b7fe554a9fb41757ce3b0f144f_4234234\"\n # Model LLM.\n model: \"deepseek-chat\"\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 15\n\nplant:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\nsensor:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\npump:\n watering:\n # Defoltnyi rashod (ml/ch).\n defaultRateMlPerHour: 2000\n ack:\n wait:\n # Timeout ozhidanija ACK po umolchaniju (sek).\n defaultTimeoutSeconds: 5\n # Maksimal'nyi timeout ACK (sek).\n maxTimeoutSeconds: 15\n # Interval polling (ms).\n pollIntervalMs: 500\n\nmqtt:\n # Maksimal'noe kolichestvo poslednih MQTT soobshchenij v pamjati.\n recentMessagesLimit: 200\n # Maksimal'naja dlina payload v poslednih MQTT soobshchenijah.\n recentPayloadChars: 4096\n topics:\n # Topic dlya diagnosticheskoj podpiski.\n listen: \"#\"\n # Topic dlya state.\n state: \"gh/dev/+/state\"\n # Topic dlya ack.\n ack: \"gh/dev/+/state/ack\"\n # Topic dlya service events.\n events: \"gh/dev/+/events\"\n # Suffiks dlya state.\n stateSuffix: \"/state\"\n # Suffiks dlya ack.\n ackSuffix: \"/state/ack\"\n # Suffiks dlya service events.\n eventsSuffix: \"/events\"\n\napp:\n debug:\n plantsTiming: false\n"}, "4444ebde6fbd22499994e41cd921fd174b4ecfa8": {"t": 1785749184.0878448, "n": 2990, "h": "1966edd49f45d4f7", "c": "ack:\n # TTL dlya ack (sek).\n ttlSeconds: 180\n # Period ochistki ack (sek).\n cleanupPeriodSeconds: 60\n\ndevice:\n # Porog online statusa (sek).\n onlineThresholdS: 60\n defaults:\n # Cel' vlazhnosti (procent).\n targetMoisture: 40.0\n # Dlitel'nost' poliva (sek).\n wateringDurationSeconds: 30\n # Timeout poliva (sek).\n wateringTimeoutSeconds: 300\n # Chas vklyuchenija sveta.\n lightOnHour: 6\n # Chas vyklyuchenija sveta.\n lightOffHour: 22\n # Dlitel'nost' sveta (chasy).\n lightDurationHours: 16\n # Tekushchaja versija firmware.\n currentVersion: \"1.0.0\"\n # Poslednjaja versija firmware.\n latestVersion: \"1.0.0\"\n # Priznak dostupnosti update.\n updateAvailable: false\n firmware:\n # Versija po umolchaniju.\n defaultVersion: \"old\"\n\nauth:\n sso:\n # Spisok podderzhivaemyh providerov.\n supportedProviders: [\"google\", \"yandex\"]\n # Timeout soedinenija (sek).\n connectTimeoutSeconds: 10\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 10\n # Vremja zhizni state-tokena (min).\n stateTtlMinutes: 10\n\nsecurity:\n password:\n pbkdf2:\n # Kolichestvo iteracij.\n rounds: 29000\n # Razmer soli (bytes).\n saltBytes: 16\n # Razmer hesha (bytes).\n hashBytes: 32\n\nfirmware:\n # Katalog binarnikov firmware.\n binariesDir: \"server/firmware_binaries\"\n\nserver:\n # Public base URL.\n publicBaseUrl: \"https://growerhub.ru\"\n\nadvisor:\n # Priznak vklyucheniya advisor.\n enabled: false\n watering:\n # TTL rekomendacii poliva.\n ttl: \"24h\"\n llm:\n deepseek:\n # Base URL dlya LLM.\n baseUrl: \"https://api.deepseek.com/v1/chat/completions\"\n # API key dlya LLM.\n apiKey: \"sk-0a2867b7fe554a9fb41757ce3b0f144f_4234234\"\n # Model LLM.\n model: \"deepseek-chat\"\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 15\n\nplant:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\nsensor:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\npump:\n watering:\n # Defoltnyi rashod (ml/ch).\n defaultRateMlPerHour: 2000\n ack:\n wait:\n # Timeout ozhidanija ACK po umolchaniju (sek).\n defaultTimeoutSeconds: 5\n # Maksimal'nyi timeout ACK (sek).\n maxTimeoutSeconds: 15\n # Interval polling (ms).\n pollIntervalMs: 500\n\nmqtt:\n # Maksimal'noe kolichestvo poslednih MQTT soobshchenij v pamjati.\n recentMessagesLimit: 200\n # Maksimal'naja dlina payload v poslednih MQTT soobshchenijah.\n recentPayloadChars: 4096\n topics:\n # Topic dlya state.\n state: \"gh/dev/+/state\"\n # Topic dlya ack.\n ack: \"gh/dev/+/state/ack\"\n # Topic dlya service events.\n events: \"gh/dev/+/events\"\n # Suffiks dlya state.\n stateSuffix: \"/state\"\n # Suffiks dlya ack.\n ackSuffix: \"/state/ack\"\n # Suffiks dlya service events.\n eventsSuffix: \"/events\"\n\napp:\n debug:\n plantsTiming: false\n"}, "665e55cacfd4aa03b0dfa3fed218ab0f1be30f11": {"t": 1785749185.2265067, "n": 2803, "h": "dae6d8173028235c", "c": "ack:\n # TTL dlya ack (sek).\n ttlSeconds: 180\n # Period ochistki ack (sek).\n cleanupPeriodSeconds: 60\n\ndevice:\n # Porog online statusa (sek).\n onlineThresholdS: 60\n defaults:\n # Cel' vlazhnosti (procent).\n targetMoisture: 40.0\n # Dlitel'nost' poliva (sek).\n wateringDurationSeconds: 30\n # Timeout poliva (sek).\n wateringTimeoutSeconds: 300\n # Chas vklyuchenija sveta.\n lightOnHour: 6\n # Chas vyklyuchenija sveta.\n lightOffHour: 22\n # Dlitel'nost' sveta (chasy).\n lightDurationHours: 16\n # Tekushchaja versija firmware.\n currentVersion: \"1.0.0\"\n # Poslednjaja versija firmware.\n latestVersion: \"1.0.0\"\n # Priznak dostupnosti update.\n updateAvailable: false\n firmware:\n # Versija po umolchaniju.\n defaultVersion: \"old\"\n\nauth:\n sso:\n # Spisok podderzhivaemyh providerov.\n supportedProviders: [\"google\", \"yandex\"]\n # Timeout soedinenija (sek).\n connectTimeoutSeconds: 10\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 10\n # Vremja zhizni state-tokena (min).\n stateTtlMinutes: 10\n\nsecurity:\n password:\n pbkdf2:\n # Kolichestvo iteracij.\n rounds: 29000\n # Razmer soli (bytes).\n saltBytes: 16\n # Razmer hesha (bytes).\n hashBytes: 32\n\nfirmware:\n # Katalog binarnikov firmware.\n binariesDir: \"server/firmware_binaries\"\n\nserver:\n # Public base URL.\n publicBaseUrl: \"https://growerhub.ru\"\n\nadvisor:\n # Priznak vklyucheniya advisor.\n enabled: false\n watering:\n # TTL rekomendacii poliva.\n ttl: \"24h\"\n llm:\n deepseek:\n # Base URL dlya LLM.\n baseUrl: \"https://api.deepseek.com/v1/chat/completions\"\n # API key dlya LLM.\n apiKey: \"sk-0a2867b7fe554a9fb41757ce3b0f144f_4234234\"\n # Model LLM.\n model: \"deepseek-chat\"\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 15\n\nplant:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\nsensor:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\npump:\n watering:\n # Defoltnyi rashod (ml/ch).\n defaultRateMlPerHour: 2000\n ack:\n wait:\n # Timeout ozhidanija ACK po umolchaniju (sek).\n defaultTimeoutSeconds: 5\n # Maksimal'nyi timeout ACK (sek).\n maxTimeoutSeconds: 15\n # Interval polling (ms).\n pollIntervalMs: 500\n\nmqtt:\n topics:\n # Topic dlya state.\n state: \"gh/dev/+/state\"\n # Topic dlya ack.\n ack: \"gh/dev/+/state/ack\"\n # Topic dlya service events.\n events: \"gh/dev/+/events\"\n # Suffiks dlya state.\n stateSuffix: \"/state\"\n # Suffiks dlya ack.\n ackSuffix: \"/state/ack\"\n # Suffiks dlya service events.\n eventsSuffix: \"/events\"\n\napp:\n debug:\n plantsTiming: false\n"}, "efa76a4a0b9b6f46afda1c7bcfb3eca3d30431ec": {"t": 1785749186.3394232, "n": 2677, "h": "04c2fea94c95b4ea", "c": "ack:\n # TTL dlya ack (sek).\n ttlSeconds: 180\n # Period ochistki ack (sek).\n cleanupPeriodSeconds: 60\n\ndevice:\n # Porog online statusa (sek).\n onlineThresholdS: 60\n defaults:\n # Cel' vlazhnosti (procent).\n targetMoisture: 40.0\n # Dlitel'nost' poliva (sek).\n wateringDurationSeconds: 30\n # Timeout poliva (sek).\n wateringTimeoutSeconds: 300\n # Chas vklyuchenija sveta.\n lightOnHour: 6\n # Chas vyklyuchenija sveta.\n lightOffHour: 22\n # Dlitel'nost' sveta (chasy).\n lightDurationHours: 16\n # Tekushchaja versija firmware.\n currentVersion: \"1.0.0\"\n # Poslednjaja versija firmware.\n latestVersion: \"1.0.0\"\n # Priznak dostupnosti update.\n updateAvailable: false\n firmware:\n # Versija po umolchaniju.\n defaultVersion: \"old\"\n\nauth:\n sso:\n # Spisok podderzhivaemyh providerov.\n supportedProviders: [\"google\", \"yandex\"]\n # Timeout soedinenija (sek).\n connectTimeoutSeconds: 10\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 10\n # Vremja zhizni state-tokena (min).\n stateTtlMinutes: 10\n\nsecurity:\n password:\n pbkdf2:\n # Kolichestvo iteracij.\n rounds: 29000\n # Razmer soli (bytes).\n saltBytes: 16\n # Razmer hesha (bytes).\n hashBytes: 32\n\nfirmware:\n # Katalog binarnikov firmware.\n binariesDir: \"server/firmware_binaries\"\n\nserver:\n # Public base URL.\n publicBaseUrl: \"https://growerhub.ru\"\n\nadvisor:\n # Priznak vklyucheniya advisor.\n enabled: false\n watering:\n # TTL rekomendacii poliva.\n ttl: \"24h\"\n llm:\n deepseek:\n # Base URL dlya LLM.\n baseUrl: \"https://api.deepseek.com/v1/chat/completions\"\n # API key dlya LLM.\n apiKey: \"sk-0a2867b7fe554a9fb41757ce3b0f144f_4234234\"\n # Model LLM.\n model: \"deepseek-chat\"\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 15\n\nplant:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\nsensor:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\npump:\n watering:\n # Defoltnyi rashod (ml/ch).\n defaultRateMlPerHour: 2000\n ack:\n wait:\n # Timeout ozhidanija ACK po umolchaniju (sek).\n defaultTimeoutSeconds: 5\n # Maksimal'nyi timeout ACK (sek).\n maxTimeoutSeconds: 15\n # Interval polling (ms).\n pollIntervalMs: 500\n\nmqtt:\n topics:\n # Topic dlya state.\n state: \"gh/dev/+/state\"\n # Topic dlya ack.\n ack: \"gh/dev/+/state/ack\"\n # Suffiks dlya state.\n stateSuffix: \"/state\"\n # Suffiks dlya ack.\n ackSuffix: \"/state/ack\"\n\napp:\n debug:\n plantsTiming: false\n"}, "f92c27db56955e35ef294f7638b2d3e486a737c1": {"t": 1785749190.500355, "n": 2676, "h": "9868965b7de82498", "c": "ack:\n # TTL dlya ack (sek).\n ttlSeconds: 180\n # Period ochistki ack (sek).\n cleanupPeriodSeconds: 60\n\ndevice:\n # Porog online statusa (sek).\n onlineThresholdS: 60\n defaults:\n # Cel' vlazhnosti (procent).\n targetMoisture: 40.0\n # Dlitel'nost' poliva (sek).\n wateringDurationSeconds: 30\n # Timeout poliva (sek).\n wateringTimeoutSeconds: 300\n # Chas vklyuchenija sveta.\n lightOnHour: 6\n # Chas vyklyuchenija sveta.\n lightOffHour: 22\n # Dlitel'nost' sveta (chasy).\n lightDurationHours: 16\n # Tekushchaja versija firmware.\n currentVersion: \"1.0.0\"\n # Poslednjaja versija firmware.\n latestVersion: \"1.0.0\"\n # Priznak dostupnosti update.\n updateAvailable: false\n firmware:\n # Versija po umolchaniju.\n defaultVersion: \"old\"\n\nauth:\n sso:\n # Spisok podderzhivaemyh providerov.\n supportedProviders: [\"google\", \"yandex\"]\n # Timeout soedinenija (sek).\n connectTimeoutSeconds: 10\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 10\n # Vremja zhizni state-tokena (min).\n stateTtlMinutes: 10\n\nsecurity:\n password:\n pbkdf2:\n # Kolichestvo iteracij.\n rounds: 29000\n # Razmer soli (bytes).\n saltBytes: 16\n # Razmer hesha (bytes).\n hashBytes: 32\n\nfirmware:\n # Katalog binarnikov firmware.\n binariesDir: \"server/firmware_binaries\"\n\nserver:\n # Public base URL.\n publicBaseUrl: \"https://growerhub.ru\"\n\nadvisor:\n # Priznak vklyucheniya advisor.\n enabled: false\n watering:\n # TTL rekomendacii poliva.\n ttl: \"24h\"\n llm:\n deepseek:\n # Base URL dlya LLM.\n baseUrl: \"https://api.deepseek.com/v1/chat/completions\"\n # API key dlya LLM.\n apiKey: \"sk-0a2867b7fe554a9fb41757ce3b0f144f_4234234\"\n # Model LLM.\n model: \"deepseek-chat\"\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 15\n\nplant:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\nsensor:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\npump:\n watering:\n # Defoltnyi rashod (ml/ch).\n defaultRateMlPerHour: 2000\n ack:\n wait:\n # Timeout ozhidanija ACK po umolchaniju (sek).\n defaultTimeoutSeconds: 5\n # Maksimal'nyi timeout ACK (sek).\n maxTimeoutSeconds: 15\n # Interval polling (ms).\n pollIntervalMs: 500\n\nmqtt:\n topics:\n # Topic dlya state.\n state: \"gh/dev/+/state\"\n # Topic dlya ack.\n ack: \"gh/dev/+/state/ack\"\n # Suffiks dlya state.\n stateSuffix: \"/state\"\n # Suffiks dlya ack.\n ackSuffix: \"/state/ack\"\n\napp:\n debug:\n plantsTiming: true\n"}, "c43c9254efe861aba4b85882574777cfddb3e9d0": {"t": 1785749191.5914798, "n": 2638, "h": "36d2e647d25938c6", "c": "ack:\n # TTL dlya ack (sek).\n ttlSeconds: 180\n # Period ochistki ack (sek).\n cleanupPeriodSeconds: 60\n\ndevice:\n # Porog online statusa (sek).\n onlineThresholdS: 60\n defaults:\n # Cel' vlazhnosti (procent).\n targetMoisture: 40.0\n # Dlitel'nost' poliva (sek).\n wateringDurationSeconds: 30\n # Timeout poliva (sek).\n wateringTimeoutSeconds: 300\n # Chas vklyuchenija sveta.\n lightOnHour: 6\n # Chas vyklyuchenija sveta.\n lightOffHour: 22\n # Dlitel'nost' sveta (chasy).\n lightDurationHours: 16\n # Tekushchaja versija firmware.\n currentVersion: \"1.0.0\"\n # Poslednjaja versija firmware.\n latestVersion: \"1.0.0\"\n # Priznak dostupnosti update.\n updateAvailable: false\n firmware:\n # Versija po umolchaniju.\n defaultVersion: \"old\"\n\nauth:\n sso:\n # Spisok podderzhivaemyh providerov.\n supportedProviders: [\"google\", \"yandex\"]\n # Timeout soedinenija (sek).\n connectTimeoutSeconds: 10\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 10\n # Vremja zhizni state-tokena (min).\n stateTtlMinutes: 10\n\nsecurity:\n password:\n pbkdf2:\n # Kolichestvo iteracij.\n rounds: 29000\n # Razmer soli (bytes).\n saltBytes: 16\n # Razmer hesha (bytes).\n hashBytes: 32\n\nfirmware:\n # Katalog binarnikov firmware.\n binariesDir: \"server/firmware_binaries\"\n\nserver:\n # Public base URL.\n publicBaseUrl: \"https://growerhub.ru\"\n\nadvisor:\n # Priznak vklyucheniya advisor.\n enabled: false\n watering:\n # TTL rekomendacii poliva.\n ttl: \"24h\"\n llm:\n deepseek:\n # Base URL dlya LLM.\n baseUrl: \"https://api.deepseek.com/v1/chat/completions\"\n # API key dlya LLM.\n apiKey: \"sk-0a2867b7fe554a9fb41757ce3b0f144f_4234234\"\n # Model LLM.\n model: \"deepseek-chat\"\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 15\n\nplant:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\nsensor:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\npump:\n watering:\n # Defoltnyi rashod (ml/ch).\n defaultRateMlPerHour: 2000\n ack:\n wait:\n # Timeout ozhidanija ACK po umolchaniju (sek).\n defaultTimeoutSeconds: 5\n # Maksimal'nyi timeout ACK (sek).\n maxTimeoutSeconds: 15\n # Interval polling (ms).\n pollIntervalMs: 500\n\nmqtt:\n topics:\n # Topic dlya state.\n state: \"gh/dev/+/state\"\n # Topic dlya ack.\n ack: \"gh/dev/+/state/ack\"\n # Suffiks dlya state.\n stateSuffix: \"/state\"\n # Suffiks dlya ack.\n ackSuffix: \"/state/ack\"\n"}, "ff413bb0a8df0d186b6c9a2758a59decb04dffc5": {"t": 1785749193.6866834, "n": 2629, "h": "57033f6984bac165", "c": "ack:\n # TTL dlya ack (sek).\n ttlSeconds: 180\n # Period ochistki ack (sek).\n cleanupPeriodSeconds: 60\n\ndevice:\n # Porog online statusa (sek).\n onlineThresholdS: 60\n defaults:\n # Cel' vlazhnosti (procent).\n targetMoisture: 40.0\n # Dlitel'nost' poliva (sek).\n wateringDurationSeconds: 30\n # Timeout poliva (sek).\n wateringTimeoutSeconds: 300\n # Chas vklyuchenija sveta.\n lightOnHour: 6\n # Chas vyklyuchenija sveta.\n lightOffHour: 22\n # Dlitel'nost' sveta (chasy).\n lightDurationHours: 16\n # Tekushchaja versija firmware.\n currentVersion: \"1.0.0\"\n # Poslednjaja versija firmware.\n latestVersion: \"1.0.0\"\n # Priznak dostupnosti update.\n updateAvailable: false\n firmware:\n # Versija po umolchaniju.\n defaultVersion: \"old\"\n\nauth:\n sso:\n # Spisok podderzhivaemyh providerov.\n supportedProviders: [\"google\", \"yandex\"]\n # Timeout soedinenija (sek).\n connectTimeoutSeconds: 10\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 10\n # Vremja zhizni state-tokena (min).\n stateTtlMinutes: 10\n\nsecurity:\n password:\n pbkdf2:\n # Kolichestvo iteracij.\n rounds: 29000\n # Razmer soli (bytes).\n saltBytes: 16\n # Razmer hesha (bytes).\n hashBytes: 32\n\nfirmware:\n # Katalog binarnikov firmware.\n binariesDir: \"server/firmware_binaries\"\n\nserver:\n # Public base URL.\n publicBaseUrl: \"https://growerhub.ru\"\n\nadvisor:\n # Priznak vklyucheniya advisor.\n enabled: true\n watering:\n # TTL rekomendacii poliva.\n ttl: \"24h\"\n llm:\n deepseek:\n # Base URL dlya LLM.\n baseUrl: \"https://api.deepseek.com/v1/chat/completions\"\n # API key dlya LLM.\n apiKey: \"sk-0a2867b7fe554a9fb41757ce3b0f144f\"\n # Model LLM.\n model: \"deepseek-chat\"\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 15\n\nplant:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\nsensor:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\npump:\n watering:\n # Defoltnyi rashod (ml/ch).\n defaultRateMlPerHour: 2000\n ack:\n wait:\n # Timeout ozhidanija ACK po umolchaniju (sek).\n defaultTimeoutSeconds: 5\n # Maksimal'nyi timeout ACK (sek).\n maxTimeoutSeconds: 15\n # Interval polling (ms).\n pollIntervalMs: 500\n\nmqtt:\n topics:\n # Topic dlya state.\n state: \"gh/dev/+/state\"\n # Topic dlya ack.\n ack: \"gh/dev/+/state/ack\"\n # Suffiks dlya state.\n stateSuffix: \"/state\"\n # Suffiks dlya ack.\n ackSuffix: \"/state/ack\"\n"}, "8c0592a57c41628bdb6df5c53c11b7acddc02b34": {"t": 1785749194.9944975, "n": 2630, "h": "d5dee573d1e1fe45", "c": "ack:\n # TTL dlya ack (sek).\n ttlSeconds: 180\n # Period ochistki ack (sek).\n cleanupPeriodSeconds: 60\n\ndevice:\n # Porog online statusa (sek).\n onlineThresholdS: 60\n defaults:\n # Cel' vlazhnosti (procent).\n targetMoisture: 40.0\n # Dlitel'nost' poliva (sek).\n wateringDurationSeconds: 30\n # Timeout poliva (sek).\n wateringTimeoutSeconds: 300\n # Chas vklyuchenija sveta.\n lightOnHour: 6\n # Chas vyklyuchenija sveta.\n lightOffHour: 22\n # Dlitel'nost' sveta (chasy).\n lightDurationHours: 16\n # Tekushchaja versija firmware.\n currentVersion: \"1.0.0\"\n # Poslednjaja versija firmware.\n latestVersion: \"1.0.0\"\n # Priznak dostupnosti update.\n updateAvailable: false\n firmware:\n # Versija po umolchaniju.\n defaultVersion: \"old\"\n\nauth:\n sso:\n # Spisok podderzhivaemyh providerov.\n supportedProviders: [\"google\", \"yandex\"]\n # Timeout soedinenija (sek).\n connectTimeoutSeconds: 10\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 10\n # Vremja zhizni state-tokena (min).\n stateTtlMinutes: 10\n\nsecurity:\n password:\n pbkdf2:\n # Kolichestvo iteracij.\n rounds: 29000\n # Razmer soli (bytes).\n saltBytes: 16\n # Razmer hesha (bytes).\n hashBytes: 32\n\nfirmware:\n # Katalog binarnikov firmware.\n binariesDir: \"server/firmware_binaries\"\n\nserver:\n # Public base URL.\n publicBaseUrl: \"https://growerhub.ru\"\n\nadvisor:\n # Priznak vklyucheniya advisor.\n enabled: false\n watering:\n # TTL rekomendacii poliva.\n ttl: \"24h\"\n llm:\n deepseek:\n # Base URL dlya LLM.\n baseUrl: \"https://api.deepseek.com/v1/chat/completions\"\n # API key dlya LLM.\n apiKey: \"sk-0a2867b7fe554a9fb41757ce3b0f144f\"\n # Model LLM.\n model: \"deepseek-chat\"\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 15\n\nplant:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\nsensor:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\npump:\n watering:\n # Defoltnyi rashod (ml/ch).\n defaultRateMlPerHour: 2000\n ack:\n wait:\n # Timeout ozhidanija ACK po umolchaniju (sek).\n defaultTimeoutSeconds: 5\n # Maksimal'nyi timeout ACK (sek).\n maxTimeoutSeconds: 15\n # Interval polling (ms).\n pollIntervalMs: 500\n\nmqtt:\n topics:\n # Topic dlya state.\n state: \"gh/dev/+/state\"\n # Topic dlya ack.\n ack: \"gh/dev/+/state/ack\"\n # Suffiks dlya state.\n stateSuffix: \"/state\"\n # Suffiks dlya ack.\n ackSuffix: \"/state/ack\"\n"}, "ec604af93dd7261ec48a26863cf1231576cb6595": {"t": 1785749196.0719764, "n": 2595, "h": "57092079850a95cc", "c": "ack:\n # TTL dlya ack (sek).\n ttlSeconds: 180\n # Period ochistki ack (sek).\n cleanupPeriodSeconds: 60\n\ndevice:\n # Porog online statusa (sek).\n onlineThresholdS: 60\n defaults:\n # Cel' vlazhnosti (procent).\n targetMoisture: 40.0\n # Dlitel'nost' poliva (sek).\n wateringDurationSeconds: 30\n # Timeout poliva (sek).\n wateringTimeoutSeconds: 300\n # Chas vklyuchenija sveta.\n lightOnHour: 6\n # Chas vyklyuchenija sveta.\n lightOffHour: 22\n # Dlitel'nost' sveta (chasy).\n lightDurationHours: 16\n # Tekushchaja versija firmware.\n currentVersion: \"1.0.0\"\n # Poslednjaja versija firmware.\n latestVersion: \"1.0.0\"\n # Priznak dostupnosti update.\n updateAvailable: false\n firmware:\n # Versija po umolchaniju.\n defaultVersion: \"old\"\n\nauth:\n sso:\n # Spisok podderzhivaemyh providerov.\n supportedProviders: [\"google\", \"yandex\"]\n # Timeout soedinenija (sek).\n connectTimeoutSeconds: 10\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 10\n # Vremja zhizni state-tokena (min).\n stateTtlMinutes: 10\n\nsecurity:\n password:\n pbkdf2:\n # Kolichestvo iteracij.\n rounds: 29000\n # Razmer soli (bytes).\n saltBytes: 16\n # Razmer hesha (bytes).\n hashBytes: 32\n\nfirmware:\n # Katalog binarnikov firmware.\n binariesDir: \"server/firmware_binaries\"\n\nserver:\n # Public base URL.\n publicBaseUrl: \"https://growerhub.ru\"\n\nadvisor:\n # Priznak vklyucheniya advisor.\n enabled: false\n watering:\n # TTL rekomendacii poliva.\n ttl: \"24h\"\n llm:\n deepseek:\n # Base URL dlya LLM.\n baseUrl: \"https://api.deepseek.com/v1/chat/completions\"\n # API key dlya LLM.\n apiKey: \"\"\n # Model LLM.\n model: \"deepseek-chat\"\n # Timeout zaprosa (sek).\n requestTimeoutSeconds: 15\n\nplant:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\nsensor:\n history:\n # Maksimal'noe kolichestvo tochek.\n maxPoints: 200\n # Chasy istorii po umolchaniju.\n defaultHours: 24\n\npump:\n watering:\n # Defoltnyi rashod (ml/ch).\n defaultRateMlPerHour: 2000\n ack:\n wait:\n # Timeout ozhidanija ACK po umolchaniju (sek).\n defaultTimeoutSeconds: 5\n # Maksimal'nyi timeout ACK (sek).\n maxTimeoutSeconds: 15\n # Interval polling (ms).\n pollIntervalMs: 500\n\nmqtt:\n topics:\n # Topic dlya state.\n state: \"gh/dev/+/state\"\n # Topic dlya ack.\n ack: \"gh/dev/+/state/ack\"\n # Suffiks dlya state.\n stateSuffix: \"/state\"\n # Suffiks dlya ack.\n ackSuffix: \"/state/ack\"\n"}, "5248f2990f4a04a8aae1edde2297dab87ea4af82": {"t": 1785749217.4147725, "n": 185, "h": "52ec22ca47b0f574", "c": "ack:\n ttlSeconds: 180\n cleanupPeriodSeconds: 60\n\ndevice:\n onlineThresholdS: 60\n\nfirmware:\n binariesDir: \"server/firmware_binaries\"\n\nserver:\n publicBaseUrl: \"https://growerhub.ru\"\n"}}, "ansible/roles/java_backend/defaults/main.yml": {"d555179123ebb8fedd5f7d8bab335b8f33e60b79": {"t": 1785745249.4004807, "n": 4596, "h": "2569f33d3a6d759a", "c": "---\n# Default deployment settings for GrowerHub Java backend.\n\njava_backend_deploy_dir: \"/opt/growerhub/java-backend\"\njava_backend_jar_src: \"{{ playbook_dir }}/../../backend/build/libs/app.jar\"\njava_backend_user: \"{{ ansible_user | default('watering-admin') }}\"\njava_backend_group: \"{{ ansible_user | default('watering-admin') }}\"\njava_backend_deploy_user: \"{{ java_backend_user }}\"\njava_backend_release_mode: false\njava_backend_releases_dir: \"/opt/growerhub/releases/backend\"\njava_backend_current_link: \"/opt/growerhub/current/backend\"\njava_backend_firmware_dir: \"{{ java_backend_deploy_dir }}/firmware_binaries\"\n\njava_backend_service_name: \"growerhub-java-backend.service\"\njava_backend_java_bin: \"/usr/bin/java\"\njava_backend_java_opts: []\njava_backend_bind_ip: \"127.0.0.1\"\njava_backend_enforce_bind_ip: false\njava_backend_host_port: 18080\njava_backend_after_units:\n - network-online.target\n - mosquitto.service\njava_backend_systemd_extra_directives: []\n\njava_backend_env_dir: \"/opt/growerhub/env\"\njava_backend_env_dir_mode: \"0755\"\njava_backend_env_file_path: \"/opt/growerhub/env/growerhub-java-backend.env\"\njava_backend_env_file: \"{{ java_backend_env_file_path }}\"\n\njava_backend_sudo_user: \"watering-admin\"\njava_backend_sudoers_file: \"/etc/sudoers.d/growerhub-java-deploy\"\njava_backend_manage_deploy_sudoers: true\njava_backend_remove_legacy_docker: true\n\n# Required env values (dolzhny byt' zadany v vars/vault)\njava_backend_secret_key: \"\"\njava_backend_db_url: \"\"\njava_backend_db_username: \"\"\njava_backend_db_password: \"\"\n\n# MQTT defaults dlya backend na hoste.\njava_backend_mqtt_host: \"127.0.0.1\"\njava_backend_mqtt_port: 1884\njava_backend_mqtt_username: \"gh_backend\"\njava_backend_mqtt_password: \"{{ lookup('env', 'GH_MQTT_BACKEND_PASSWORD') }}\"\njava_backend_mqtt_tls: false\njava_backend_mqtt_provisioning_enabled: false\njava_backend_mqtt_provisioning_host: \"127.0.0.1\"\njava_backend_mqtt_provisioning_port: 1884\njava_backend_mqtt_provisioning_tls: false\njava_backend_mqtt_provisioning_username: \"gh_provisioning\"\njava_backend_mqtt_provisioning_password: \"{{ lookup('env', 'GH_MQTT_PROVISIONING_PASSWORD') }}\"\n\n# Self-service vklyuchaetsja tol'ko posle polnogo smoke-testa i proverki pravovyh tekstov.\njava_backend_self_service_enabled: false\njava_backend_self_service_legacy_owner_email: \"{{ lookup('env', 'SELF_SERVICE_LEGACY_OWNER_EMAIL') }}\"\njava_backend_advisor_deepseek_api_key: \"{{ lookup('env', 'ADVISOR_DEEPSEEK_API_KEY') }}\"\njava_backend_public_base_url: \"https://growerhub.ru\"\njava_backend_env_extra: {}\n\njava_backend_env_required:\n SECRET_KEY: \"{{ java_backend_secret_key }}\"\n SPRING_DATASOURCE_URL: \"{{ java_backend_db_url }}\"\n SPRING_DATASOURCE_USERNAME: \"{{ java_backend_db_username }}\"\n SPRING_DATASOURCE_PASSWORD: \"{{ java_backend_db_password }}\"\n\njava_backend_env_optional:\n MQTT_HOST: \"{{ java_backend_mqtt_host | default('') }}\"\n MQTT_PORT: \"{{ java_backend_mqtt_port | default('') }}\"\n MQTT_USERNAME: \"{{ java_backend_mqtt_username | default('') }}\"\n MQTT_PASSWORD: \"{{ java_backend_mqtt_password | default('') }}\"\n MQTT_TLS: \"{{ java_backend_mqtt_tls | default('') }}\"\n MQTT_PROVISIONING_ENABLED: \"{{ java_backend_mqtt_provisioning_enabled | bool | lower }}\"\n MQTT_PROVISIONING_HOST: \"{{ java_backend_mqtt_provisioning_host | default('') }}\"\n MQTT_PROVISIONING_PORT: \"{{ java_backend_mqtt_provisioning_port | default('') }}\"\n MQTT_PROVISIONING_TLS: \"{{ java_backend_mqtt_provisioning_tls | bool | lower }}\"\n MQTT_PROVISIONING_USERNAME: \"{{ java_backend_mqtt_provisioning_username | default('') }}\"\n MQTT_PROVISIONING_PASSWORD: \"{{ java_backend_mqtt_provisioning_password | default('') }}\"\n SELF_SERVICE_ENABLED: \"{{ java_backend_self_service_enabled | bool | lower }}\"\n SELF_SERVICE_LEGACY_OWNER_EMAIL: \"{{ java_backend_self_service_legacy_owner_email | default('') }}\"\n ADVISOR_DEEPSEEK_API_KEY: \"{{ java_backend_advisor_deepseek_api_key | default('') }}\"\n SERVER_PUBLIC_BASE_URL: \"{{ java_backend_public_base_url }}\"\n FIRMWARE_BINARIES_DIR: \"{{ java_backend_firmware_dir }}\"\n AUTH_SSO_REDIRECT_BASE: \"{{ java_backend_auth_sso_redirect_base | default('') }}\"\n REFRESH_TOKEN_COOKIE_SECURE: \"true\"\n REFRESH_TOKEN_COOKIE_SAMESITE: \"lax\"\n AUTH_GOOGLE_CLIENT_ID: \"{{ google_client_id | default('') }}\"\n AUTH_GOOGLE_CLIENT_SECRET: \"{{ google_client_secret | default('') }}\"\n AUTH_YANDEX_CLIENT_ID: \"{{ yandex_client_id | default('') }}\"\n AUTH_YANDEX_CLIENT_SECRET: \"{{ yandex_client_secret | default('') }}\"\n\njava_backend_env: >-\n {{\n java_backend_env_required\n | combine(java_backend_env_optional)\n | combine(java_backend_env_extra)\n }}\n"}, "df1858df1e5088da0d474f4b2a9bf69bac7a85d6": {"t": 1785749165.3333008, "n": 4596, "h": "2569f33d3a6d759a", "c": "---\n# Default deployment settings for GrowerHub Java backend.\n\njava_backend_deploy_dir: \"/opt/growerhub/java-backend\"\njava_backend_jar_src: \"{{ playbook_dir }}/../../backend/build/libs/app.jar\"\njava_backend_user: \"{{ ansible_user | default('watering-admin') }}\"\njava_backend_group: \"{{ ansible_user | default('watering-admin') }}\"\njava_backend_deploy_user: \"{{ java_backend_user }}\"\njava_backend_release_mode: false\njava_backend_releases_dir: \"/opt/growerhub/releases/backend\"\njava_backend_current_link: \"/opt/growerhub/current/backend\"\njava_backend_firmware_dir: \"{{ java_backend_deploy_dir }}/firmware_binaries\"\n\njava_backend_service_name: \"growerhub-java-backend.service\"\njava_backend_java_bin: \"/usr/bin/java\"\njava_backend_java_opts: []\njava_backend_bind_ip: \"127.0.0.1\"\njava_backend_enforce_bind_ip: false\njava_backend_host_port: 18080\njava_backend_after_units:\n - network-online.target\n - mosquitto.service\njava_backend_systemd_extra_directives: []\n\njava_backend_env_dir: \"/opt/growerhub/env\"\njava_backend_env_dir_mode: \"0755\"\njava_backend_env_file_path: \"/opt/growerhub/env/growerhub-java-backend.env\"\njava_backend_env_file: \"{{ java_backend_env_file_path }}\"\n\njava_backend_sudo_user: \"watering-admin\"\njava_backend_sudoers_file: \"/etc/sudoers.d/growerhub-java-deploy\"\njava_backend_manage_deploy_sudoers: true\njava_backend_remove_legacy_docker: true\n\n# Required env values (dolzhny byt' zadany v vars/vault)\njava_backend_secret_key: \"\"\njava_backend_db_url: \"\"\njava_backend_db_username: \"\"\njava_backend_db_password: \"\"\n\n# MQTT defaults dlya backend na hoste.\njava_backend_mqtt_host: \"127.0.0.1\"\njava_backend_mqtt_port: 1884\njava_backend_mqtt_username: \"gh_backend\"\njava_backend_mqtt_password: \"{{ lookup('env', 'GH_MQTT_BACKEND_PASSWORD') }}\"\njava_backend_mqtt_tls: false\njava_backend_mqtt_provisioning_enabled: false\njava_backend_mqtt_provisioning_host: \"127.0.0.1\"\njava_backend_mqtt_provisioning_port: 1884\njava_backend_mqtt_provisioning_tls: false\njava_backend_mqtt_provisioning_username: \"gh_provisioning\"\njava_backend_mqtt_provisioning_password: \"{{ lookup('env', 'GH_MQTT_PROVISIONING_PASSWORD') }}\"\n\n# Self-service vklyuchaetsja tol'ko posle polnogo smoke-testa i proverki pravovyh tekstov.\njava_backend_self_service_enabled: false\njava_backend_self_service_legacy_owner_email: \"{{ lookup('env', 'SELF_SERVICE_LEGACY_OWNER_EMAIL') }}\"\njava_backend_advisor_deepseek_api_key: \"{{ lookup('env', 'ADVISOR_DEEPSEEK_API_KEY') }}\"\njava_backend_public_base_url: \"https://growerhub.ru\"\njava_backend_env_extra: {}\n\njava_backend_env_required:\n SECRET_KEY: \"{{ java_backend_secret_key }}\"\n SPRING_DATASOURCE_URL: \"{{ java_backend_db_url }}\"\n SPRING_DATASOURCE_USERNAME: \"{{ java_backend_db_username }}\"\n SPRING_DATASOURCE_PASSWORD: \"{{ java_backend_db_password }}\"\n\njava_backend_env_optional:\n MQTT_HOST: \"{{ java_backend_mqtt_host | default('') }}\"\n MQTT_PORT: \"{{ java_backend_mqtt_port | default('') }}\"\n MQTT_USERNAME: \"{{ java_backend_mqtt_username | default('') }}\"\n MQTT_PASSWORD: \"{{ java_backend_mqtt_password | default('') }}\"\n MQTT_TLS: \"{{ java_backend_mqtt_tls | default('') }}\"\n MQTT_PROVISIONING_ENABLED: \"{{ java_backend_mqtt_provisioning_enabled | bool | lower }}\"\n MQTT_PROVISIONING_HOST: \"{{ java_backend_mqtt_provisioning_host | default('') }}\"\n MQTT_PROVISIONING_PORT: \"{{ java_backend_mqtt_provisioning_port | default('') }}\"\n MQTT_PROVISIONING_TLS: \"{{ java_backend_mqtt_provisioning_tls | bool | lower }}\"\n MQTT_PROVISIONING_USERNAME: \"{{ java_backend_mqtt_provisioning_username | default('') }}\"\n MQTT_PROVISIONING_PASSWORD: \"{{ java_backend_mqtt_provisioning_password | default('') }}\"\n SELF_SERVICE_ENABLED: \"{{ java_backend_self_service_enabled | bool | lower }}\"\n SELF_SERVICE_LEGACY_OWNER_EMAIL: \"{{ java_backend_self_service_legacy_owner_email | default('') }}\"\n ADVISOR_DEEPSEEK_API_KEY: \"{{ java_backend_advisor_deepseek_api_key | default('') }}\"\n SERVER_PUBLIC_BASE_URL: \"{{ java_backend_public_base_url }}\"\n FIRMWARE_BINARIES_DIR: \"{{ java_backend_firmware_dir }}\"\n AUTH_SSO_REDIRECT_BASE: \"{{ java_backend_auth_sso_redirect_base | default('') }}\"\n REFRESH_TOKEN_COOKIE_SECURE: \"true\"\n REFRESH_TOKEN_COOKIE_SAMESITE: \"lax\"\n AUTH_GOOGLE_CLIENT_ID: \"{{ google_client_id | default('') }}\"\n AUTH_GOOGLE_CLIENT_SECRET: \"{{ google_client_secret | default('') }}\"\n AUTH_YANDEX_CLIENT_ID: \"{{ yandex_client_id | default('') }}\"\n AUTH_YANDEX_CLIENT_SECRET: \"{{ yandex_client_secret | default('') }}\"\n\njava_backend_env: >-\n {{\n java_backend_env_required\n | combine(java_backend_env_optional)\n | combine(java_backend_env_extra)\n }}\n"}, "da33221f5bcbd92af0e9db501023954dc0859f61": {"t": 1785749168.4862363, "n": 3766, "h": "2870c79f33f4a7ff", "c": "---\n# Default deployment settings for GrowerHub Java backend.\n\njava_backend_deploy_dir: \"/opt/growerhub/java-backend\"\njava_backend_jar_src: \"{{ playbook_dir }}/../../backend/build/libs/app.jar\"\njava_backend_user: \"{{ ansible_user | default('watering-admin') }}\"\njava_backend_group: \"{{ ansible_user | default('watering-admin') }}\"\n\njava_backend_service_name: \"growerhub-java-backend.service\"\njava_backend_java_bin: \"/usr/bin/java\"\njava_backend_bind_ip: \"127.0.0.1\"\njava_backend_host_port: 18080\n\njava_backend_env_dir: \"/opt/growerhub/env\"\njava_backend_env_file_path: \"/opt/growerhub/env/growerhub-java-backend.env\"\njava_backend_env_file: \"{{ java_backend_env_file_path }}\"\n\njava_backend_sudo_user: \"watering-admin\"\njava_backend_sudoers_file: \"/etc/sudoers.d/growerhub-java-deploy\"\n\n# Required env values (dolzhny byt' zadany v vars/vault)\njava_backend_secret_key: \"\"\njava_backend_db_url: \"\"\njava_backend_db_username: \"\"\njava_backend_db_password: \"\"\n\n# MQTT defaults dlya backend na hoste.\njava_backend_mqtt_host: \"127.0.0.1\"\njava_backend_mqtt_port: 1884\njava_backend_mqtt_username: \"gh_backend\"\njava_backend_mqtt_password: \"{{ lookup('env', 'GH_MQTT_BACKEND_PASSWORD') }}\"\njava_backend_mqtt_tls: false\njava_backend_mqtt_provisioning_enabled: false\njava_backend_mqtt_provisioning_host: \"127.0.0.1\"\njava_backend_mqtt_provisioning_port: 1884\njava_backend_mqtt_provisioning_tls: false\njava_backend_mqtt_provisioning_username: \"gh_provisioning\"\njava_backend_mqtt_provisioning_password: \"{{ lookup('env', 'GH_MQTT_PROVISIONING_PASSWORD') }}\"\n\n# Self-service vklyuchaetsja tol'ko posle polnogo smoke-testa i proverki pravovyh tekstov.\njava_backend_self_service_enabled: false\njava_backend_self_service_legacy_owner_email: \"{{ lookup('env', 'SELF_SERVICE_LEGACY_OWNER_EMAIL') }}\"\njava_backend_advisor_deepseek_api_key: \"{{ lookup('env', 'ADVISOR_DEEPSEEK_API_KEY') }}\"\n\njava_backend_env_required:\n SECRET_KEY: \"{{ java_backend_secret_key }}\"\n SPRING_DATASOURCE_URL: \"{{ java_backend_db_url }}\"\n SPRING_DATASOURCE_USERNAME: \"{{ java_backend_db_username }}\"\n SPRING_DATASOURCE_PASSWORD: \"{{ java_backend_db_password }}\"\n\njava_backend_env_optional:\n MQTT_HOST: \"{{ java_backend_mqtt_host | default('') }}\"\n MQTT_PORT: \"{{ java_backend_mqtt_port | default('') }}\"\n MQTT_USERNAME: \"{{ java_backend_mqtt_username | default('') }}\"\n MQTT_PASSWORD: \"{{ java_backend_mqtt_password | default('') }}\"\n MQTT_TLS: \"{{ java_backend_mqtt_tls | default('') }}\"\n MQTT_PROVISIONING_ENABLED: \"{{ java_backend_mqtt_provisioning_enabled | bool | lower }}\"\n MQTT_PROVISIONING_HOST: \"{{ java_backend_mqtt_provisioning_host | default('') }}\"\n MQTT_PROVISIONING_PORT: \"{{ java_backend_mqtt_provisioning_port | default('') }}\"\n MQTT_PROVISIONING_TLS: \"{{ java_backend_mqtt_provisioning_tls | bool | lower }}\"\n MQTT_PROVISIONING_USERNAME: \"{{ java_backend_mqtt_provisioning_username | default('') }}\"\n MQTT_PROVISIONING_PASSWORD: \"{{ java_backend_mqtt_provisioning_password | default('') }}\"\n SELF_SERVICE_ENABLED: \"{{ java_backend_self_service_enabled | bool | lower }}\"\n SELF_SERVICE_LEGACY_OWNER_EMAIL: \"{{ java_backend_self_service_legacy_owner_email | default('') }}\"\n ADVISOR_DEEPSEEK_API_KEY: \"{{ java_backend_advisor_deepseek_api_key | default('') }}\"\n AUTH_SSO_REDIRECT_BASE: \"{{ java_backend_auth_sso_redirect_base | default('') }}\"\n REFRESH_TOKEN_COOKIE_SECURE: \"true\"\n REFRESH_TOKEN_COOKIE_SAMESITE: \"lax\"\n AUTH_GOOGLE_CLIENT_ID: \"{{ google_client_id | default('') }}\"\n AUTH_GOOGLE_CLIENT_SECRET: \"{{ google_client_secret | default('') }}\"\n AUTH_YANDEX_CLIENT_ID: \"{{ yandex_client_id | default('') }}\"\n AUTH_YANDEX_CLIENT_SECRET: \"{{ yandex_client_secret | default('') }}\"\n\njava_backend_env: \"{{ java_backend_env_required | combine(java_backend_env_optional) }}\"\n"}, "ea09d474ba589e44c54592a1d99988070e14ed7d": {"t": 1785749170.0017273, "n": 2085, "h": "0e13a3c8118bae82", "c": "---\n# Default deployment settings for GrowerHub Java backend.\n\njava_backend_deploy_dir: \"/opt/growerhub/java-backend\"\njava_backend_jar_src: \"{{ playbook_dir }}/../../backend/build/libs/app.jar\"\njava_backend_user: \"{{ ansible_user | default('watering-admin') }}\"\njava_backend_group: \"{{ ansible_user | default('watering-admin') }}\"\n\njava_backend_service_name: \"growerhub-java-backend.service\"\njava_backend_java_bin: \"/usr/bin/java\"\njava_backend_bind_ip: \"127.0.0.1\"\njava_backend_host_port: 18080\n\njava_backend_env_dir: \"/opt/growerhub/env\"\njava_backend_env_file_path: \"/opt/growerhub/env/growerhub-java-backend.env\"\njava_backend_env_file: \"{{ java_backend_env_file_path }}\"\n\njava_backend_sudo_user: \"watering-admin\"\njava_backend_sudoers_file: \"/etc/sudoers.d/growerhub-java-deploy\"\n\n# Required env values (dolzhny byt' zadany v vars/vault)\njava_backend_secret_key: \"\"\njava_backend_db_url: \"\"\njava_backend_db_username: \"\"\njava_backend_db_password: \"\"\n\n# MQTT defaults dlya backend na hoste.\njava_backend_mqtt_host: \"127.0.0.1\"\njava_backend_mqtt_port: 1883\n\njava_backend_env_required:\n SECRET_KEY: \"{{ java_backend_secret_key }}\"\n SPRING_DATASOURCE_URL: \"{{ java_backend_db_url }}\"\n SPRING_DATASOURCE_USERNAME: \"{{ java_backend_db_username }}\"\n SPRING_DATASOURCE_PASSWORD: \"{{ java_backend_db_password }}\"\n\njava_backend_env_optional:\n MQTT_HOST: \"{{ java_backend_mqtt_host | default('') }}\"\n MQTT_PORT: \"{{ java_backend_mqtt_port | default('') }}\"\n MQTT_USERNAME: \"{{ java_backend_mqtt_username | default('') }}\"\n MQTT_PASSWORD: \"{{ java_backend_mqtt_password | default('') }}\"\n MQTT_TLS: \"{{ java_backend_mqtt_tls | default('') }}\"\n AUTH_SSO_REDIRECT_BASE: \"{{ java_backend_auth_sso_redirect_base | default('') }}\"\n AUTH_GOOGLE_CLIENT_ID: \"{{ google_client_id | default('') }}\"\n AUTH_GOOGLE_CLIENT_SECRET: \"{{ google_client_secret | default('') }}\"\n AUTH_YANDEX_CLIENT_ID: \"{{ yandex_client_id | default('') }}\"\n AUTH_YANDEX_CLIENT_SECRET: \"{{ yandex_client_secret | default('') }}\"\n\njava_backend_env: \"{{ java_backend_env_required | combine(java_backend_env_optional) }}\"\n"}, "35d5d5e816d2cfde50ee25eaf8487c535f5276b8": {"t": 1785749171.115804, "n": 2881, "h": "3753d5e95165b7d9", "c": "---\n# Default deployment settings for GrowerHub Java backend (Docker).\n\n# Local path (on Ansible controller) to the repo `backend/` directory.\njava_backend_local_src_dir: \"{{ playbook_dir }}/../../backend\"\n\n# Target host directory where sources are synced for remote docker build.\njava_backend_deploy_dir: \"/opt/growerhub/java-backend\"\njava_backend_deploy_owner: \"{{ ansible_user | default('root') }}\"\njava_backend_deploy_group: \"{{ ansible_user | default('root') }}\"\njava_backend_deploy_mode: \"0755\"\n\n# Docker image/tag to build on the target host.\njava_backend_image_name: \"growerhub-backend\"\njava_backend_image_tag: \"local\"\njava_backend_image: \"{{ java_backend_image_name }}:{{ java_backend_image_tag }}\"\n\n# Container settings.\njava_backend_container_name: \"growerhub-java-backend\"\njava_backend_bind_ip: \"127.0.0.1\"\njava_backend_host_port: 18080\njava_backend_container_port: 8080\n\n# Env file path (sozdaetsya ansible rolyu)\njava_backend_env_dir: \"/opt/growerhub/env\"\njava_backend_env_file_path: \"/opt/growerhub/env/growerhub-java-backend.env\"\njava_backend_env_file: \"{{ java_backend_env_file_path }}\"\n\n# Deploy sudoers\njava_backend_sudo_user: \"watering-admin\"\njava_backend_sudoers_file: \"/etc/sudoers.d/growerhub-java-deploy\"\n\n# Required env values (dolzhny byt' zadany v vars/vault)\njava_backend_secret_key: \"\"\njava_backend_db_url: \"\"\njava_backend_db_username: \"\"\njava_backend_db_password: \"\"\n\n# MQTT defaults (docker0 IP for container -> host access).\n# Override in vault/vars if needed (e.g. LAN IP 192.168.0.11).\njava_backend_mqtt_host: \"172.17.0.1\"\njava_backend_mqtt_port: 1883\n\njava_backend_env_required:\n SECRET_KEY: \"{{ java_backend_secret_key }}\"\n SPRING_DATASOURCE_URL: \"{{ java_backend_db_url }}\"\n SPRING_DATASOURCE_USERNAME: \"{{ java_backend_db_username }}\"\n SPRING_DATASOURCE_PASSWORD: \"{{ java_backend_db_password }}\"\n\njava_backend_env_optional:\n MQTT_HOST: \"{{ java_backend_mqtt_host | default('') }}\"\n MQTT_PORT: \"{{ java_backend_mqtt_port | default('') }}\"\n MQTT_USERNAME: \"{{ java_backend_mqtt_username | default('') }}\"\n MQTT_PASSWORD: \"{{ java_backend_mqtt_password | default('') }}\"\n MQTT_TLS: \"{{ java_backend_mqtt_tls | default('') }}\"\n AUTH_SSO_REDIRECT_BASE: \"{{ java_backend_auth_sso_redirect_base | default('') }}\"\n AUTH_GOOGLE_CLIENT_ID: \"{{ google_client_id | default('') }}\"\n AUTH_GOOGLE_CLIENT_SECRET: \"{{ google_client_secret | default('') }}\"\n AUTH_YANDEX_CLIENT_ID: \"{{ yandex_client_id | default('') }}\"\n AUTH_YANDEX_CLIENT_SECRET: \"{{ yandex_client_secret | default('') }}\"\n\njava_backend_env: \"{{ java_backend_env_required | combine(java_backend_env_optional) }}\"\n\n# Force docker build every run (otherwise builds only when sources changed).\njava_backend_force_build: false\n\n# rsync exclusions for synchronize.\njava_backend_rsync_opts:\n - \"--exclude=.gradle/\"\n - \"--exclude=build/\"\n - \"--exclude=.idea/\"\n - \"--exclude=out/\"\n"}, "a8dbba168c16b8b01665358df0a56f9d83028aec": {"t": 1785749172.3663676, "n": 2692, "h": "ae6dffd055dbb1d8", "c": "---\n# Default deployment settings for GrowerHub Java backend (Docker).\n\n# Local path (on Ansible controller) to the repo `backend/` directory.\njava_backend_local_src_dir: \"{{ playbook_dir }}/../../backend\"\n\n# Target host directory where sources are synced for remote docker build.\njava_backend_deploy_dir: \"/opt/growerhub/java-backend\"\njava_backend_deploy_owner: \"{{ ansible_user | default('root') }}\"\njava_backend_deploy_group: \"{{ ansible_user | default('root') }}\"\njava_backend_deploy_mode: \"0755\"\n\n# Docker image/tag to build on the target host.\njava_backend_image_name: \"growerhub-backend\"\njava_backend_image_tag: \"local\"\njava_backend_image: \"{{ java_backend_image_name }}:{{ java_backend_image_tag }}\"\n\n# Container settings.\njava_backend_container_name: \"growerhub-java-backend\"\njava_backend_bind_ip: \"127.0.0.1\"\njava_backend_host_port: 18080\njava_backend_container_port: 8080\n\n# Env file path (sozdaetsya ansible rolyu)\njava_backend_env_dir: \"/opt/growerhub/env\"\njava_backend_env_file_path: \"/opt/growerhub/env/growerhub-java-backend.env\"\njava_backend_env_file: \"{{ java_backend_env_file_path }}\"\n\n# Deploy sudoers\njava_backend_sudo_user: \"watering-admin\"\njava_backend_sudoers_file: \"/etc/sudoers.d/growerhub-java-deploy\"\n\n# Required env values (dolzhny byt' zadany v vars/vault)\njava_backend_secret_key: \"\"\njava_backend_db_url: \"\"\njava_backend_db_username: \"\"\njava_backend_db_password: \"\"\n\njava_backend_env_required:\n SECRET_KEY: \"{{ java_backend_secret_key }}\"\n SPRING_DATASOURCE_URL: \"{{ java_backend_db_url }}\"\n SPRING_DATASOURCE_USERNAME: \"{{ java_backend_db_username }}\"\n SPRING_DATASOURCE_PASSWORD: \"{{ java_backend_db_password }}\"\n\njava_backend_env_optional:\n MQTT_HOST: \"{{ java_backend_mqtt_host | default('') }}\"\n MQTT_PORT: \"{{ java_backend_mqtt_port | default('') }}\"\n MQTT_USERNAME: \"{{ java_backend_mqtt_username | default('') }}\"\n MQTT_PASSWORD: \"{{ java_backend_mqtt_password | default('') }}\"\n MQTT_TLS: \"{{ java_backend_mqtt_tls | default('') }}\"\n AUTH_SSO_REDIRECT_BASE: \"{{ java_backend_auth_sso_redirect_base | default('') }}\"\n AUTH_GOOGLE_CLIENT_ID: \"{{ google_client_id | default('') }}\"\n AUTH_GOOGLE_CLIENT_SECRET: \"{{ google_client_secret | default('') }}\"\n AUTH_YANDEX_CLIENT_ID: \"{{ yandex_client_id | default('') }}\"\n AUTH_YANDEX_CLIENT_SECRET: \"{{ yandex_client_secret | default('') }}\"\n\njava_backend_env: \"{{ java_backend_env_required | combine(java_backend_env_optional) }}\"\n\n# Force docker build every run (otherwise builds only when sources changed).\njava_backend_force_build: false\n\n# rsync exclusions for synchronize.\njava_backend_rsync_opts:\n - \"--exclude=.gradle/\"\n - \"--exclude=build/\"\n - \"--exclude=.idea/\"\n - \"--exclude=out/\"\n"}, "b4d1d925ba72948d6675aaf5dd55b5355c73cb98": {"t": 1785749173.5974584, "n": 2567, "h": "bb02197b48bcb079", "c": "---\n# Default deployment settings for GrowerHub Java backend (Docker).\n\n# Local path (on Ansible controller) to the repo `backend/` directory.\njava_backend_local_src_dir: \"{{ playbook_dir }}/../../backend\"\n\n# Target host directory where sources are synced for remote docker build.\njava_backend_deploy_dir: \"/opt/growerhub/java-backend\"\njava_backend_deploy_owner: \"{{ ansible_user | default('root') }}\"\njava_backend_deploy_group: \"{{ ansible_user | default('root') }}\"\njava_backend_deploy_mode: \"0755\"\n\n# Docker image/tag to build on the target host.\njava_backend_image_name: \"growerhub-backend\"\njava_backend_image_tag: \"local\"\njava_backend_image: \"{{ java_backend_image_name }}:{{ java_backend_image_tag }}\"\n\n# Container settings.\njava_backend_container_name: \"growerhub-java-backend\"\njava_backend_bind_ip: \"127.0.0.1\"\njava_backend_host_port: 18080\njava_backend_container_port: 8080\n\n# Env file path (sozdaetsya ansible rolyu)\njava_backend_env_dir: \"/opt/growerhub/env\"\njava_backend_env_file_path: \"/opt/growerhub/env/growerhub-java-backend.env\"\njava_backend_env_file: \"{{ java_backend_env_file_path }}\"\n\n# Required env values (dolzhny byt' zadany v vars/vault)\njava_backend_secret_key: \"\"\njava_backend_db_url: \"\"\njava_backend_db_username: \"\"\njava_backend_db_password: \"\"\n\njava_backend_env_required:\n SECRET_KEY: \"{{ java_backend_secret_key }}\"\n SPRING_DATASOURCE_URL: \"{{ java_backend_db_url }}\"\n SPRING_DATASOURCE_USERNAME: \"{{ java_backend_db_username }}\"\n SPRING_DATASOURCE_PASSWORD: \"{{ java_backend_db_password }}\"\n\njava_backend_env_optional:\n MQTT_HOST: \"{{ java_backend_mqtt_host | default('') }}\"\n MQTT_PORT: \"{{ java_backend_mqtt_port | default('') }}\"\n MQTT_USERNAME: \"{{ java_backend_mqtt_username | default('') }}\"\n MQTT_PASSWORD: \"{{ java_backend_mqtt_password | default('') }}\"\n MQTT_TLS: \"{{ java_backend_mqtt_tls | default('') }}\"\n AUTH_SSO_REDIRECT_BASE: \"{{ java_backend_auth_sso_redirect_base | default('') }}\"\n AUTH_GOOGLE_CLIENT_ID: \"{{ google_client_id | default('') }}\"\n AUTH_GOOGLE_CLIENT_SECRET: \"{{ google_client_secret | default('') }}\"\n AUTH_YANDEX_CLIENT_ID: \"{{ yandex_client_id | default('') }}\"\n AUTH_YANDEX_CLIENT_SECRET: \"{{ yandex_client_secret | default('') }}\"\n\njava_backend_env: \"{{ java_backend_env_required | combine(java_backend_env_optional) }}\"\n\n# Force docker build every run (otherwise builds only when sources changed).\njava_backend_force_build: false\n\n# rsync exclusions for synchronize.\njava_backend_rsync_opts:\n - \"--exclude=.gradle/\"\n - \"--exclude=build/\"\n - \"--exclude=.idea/\"\n - \"--exclude=out/\"\n"}, "bc225ef3afc6bbf2c6a64bba3212e30bb088337e": {"t": 1785749176.0953116, "n": 2512, "h": "76b5e76dbe09c686", "c": "---\n# Default deployment settings for GrowerHub Java backend (Docker).\n\n# Local path (on Ansible controller) to the repo `backend/` directory.\njava_backend_local_src_dir: \"{{ playbook_dir }}/../../backend\"\n\n# Target host directory where sources are synced for remote docker build.\njava_backend_deploy_dir: \"/opt/growerhub/java-backend\"\njava_backend_deploy_owner: \"{{ ansible_user | default('root') }}\"\njava_backend_deploy_group: \"{{ ansible_user | default('root') }}\"\njava_backend_deploy_mode: \"0755\"\n\n# Docker image/tag to build on the target host.\njava_backend_image_name: \"growerhub-backend\"\njava_backend_image_tag: \"local\"\njava_backend_image: \"{{ java_backend_image_name }}:{{ java_backend_image_tag }}\"\n\n# Container settings.\njava_backend_container_name: \"growerhub-java-backend\"\njava_backend_bind_ip: \"127.0.0.1\"\njava_backend_host_port: 18080\njava_backend_container_port: 8080\n\n# Env file path (sozdaetsya ansible rolyu)\njava_backend_env_dir: \"/opt/growerhub/env\"\njava_backend_env_file: \"{{ java_backend_env_dir }}/growerhub-java-backend.env\"\n\n# Required env values (dolzhny byt' zadany v vars/vault)\njava_backend_secret_key: \"\"\njava_backend_db_url: \"\"\njava_backend_db_username: \"\"\njava_backend_db_password: \"\"\n\njava_backend_env_required:\n SECRET_KEY: \"{{ java_backend_secret_key }}\"\n SPRING_DATASOURCE_URL: \"{{ java_backend_db_url }}\"\n SPRING_DATASOURCE_USERNAME: \"{{ java_backend_db_username }}\"\n SPRING_DATASOURCE_PASSWORD: \"{{ java_backend_db_password }}\"\n\njava_backend_env_optional:\n MQTT_HOST: \"{{ java_backend_mqtt_host | default('') }}\"\n MQTT_PORT: \"{{ java_backend_mqtt_port | default('') }}\"\n MQTT_USERNAME: \"{{ java_backend_mqtt_username | default('') }}\"\n MQTT_PASSWORD: \"{{ java_backend_mqtt_password | default('') }}\"\n MQTT_TLS: \"{{ java_backend_mqtt_tls | default('') }}\"\n AUTH_SSO_REDIRECT_BASE: \"{{ java_backend_auth_sso_redirect_base | default('') }}\"\n AUTH_GOOGLE_CLIENT_ID: \"{{ google_client_id | default('') }}\"\n AUTH_GOOGLE_CLIENT_SECRET: \"{{ google_client_secret | default('') }}\"\n AUTH_YANDEX_CLIENT_ID: \"{{ yandex_client_id | default('') }}\"\n AUTH_YANDEX_CLIENT_SECRET: \"{{ yandex_client_secret | default('') }}\"\n\njava_backend_env: \"{{ java_backend_env_required | combine(java_backend_env_optional) }}\"\n\n# Force docker build every run (otherwise builds only when sources changed).\njava_backend_force_build: false\n\n# rsync exclusions for synchronize.\njava_backend_rsync_opts:\n - \"--exclude=.gradle/\"\n - \"--exclude=build/\"\n - \"--exclude=.idea/\"\n - \"--exclude=out/\"\n"}, "82a42621c4023689f674f5f6f5c0c191eb58f118": {"t": 1785749178.6058762, "n": 1148, "h": "0138d15e641a7311", "c": "---\n# Default deployment settings for GrowerHub Java backend (Docker).\n\n# Local path (on Ansible controller) to the repo `backend/` directory.\njava_backend_local_src_dir: \"{{ playbook_dir }}/../../backend\"\n\n# Target host directory where sources are synced for remote docker build.\njava_backend_deploy_dir: \"/opt/growerhub/java-backend\"\njava_backend_deploy_owner: \"{{ ansible_user | default('root') }}\"\njava_backend_deploy_group: \"{{ ansible_user | default('root') }}\"\njava_backend_deploy_mode: \"0755\"\n\n# Docker image/tag to build on the target host.\njava_backend_image_name: \"growerhub-backend\"\njava_backend_image_tag: \"local\"\njava_backend_image: \"{{ java_backend_image_name }}:{{ java_backend_image_tag }}\"\n\n# Container settings.\njava_backend_container_name: \"growerhub-java-backend\"\njava_backend_bind_ip: \"127.0.0.1\"\njava_backend_host_port: 18080\njava_backend_container_port: 8080\n\n# Force docker build every run (otherwise builds only when sources changed).\njava_backend_force_build: false\n\n# rsync exclusions for synchronize.\njava_backend_rsync_opts:\n - \"--exclude=.gradle/\"\n - \"--exclude=build/\"\n - \"--exclude=.idea/\"\n - \"--exclude=out/\"\n\n"}, "ac7060c01e3271e702c30b8f825164a1d500f72d": {"t": 1786067321.635779, "n": 4596, "h": "2569f33d3a6d759a", "c": "---\n# Default deployment settings for GrowerHub Java backend.\n\njava_backend_deploy_dir: \"/opt/growerhub/java-backend\"\njava_backend_jar_src: \"{{ playbook_dir }}/../../backend/build/libs/app.jar\"\njava_backend_user: \"{{ ansible_user | default('watering-admin') }}\"\njava_backend_group: \"{{ ansible_user | default('watering-admin') }}\"\njava_backend_deploy_user: \"{{ java_backend_user }}\"\njava_backend_release_mode: false\njava_backend_releases_dir: \"/opt/growerhub/releases/backend\"\njava_backend_current_link: \"/opt/growerhub/current/backend\"\njava_backend_firmware_dir: \"{{ java_backend_deploy_dir }}/firmware_binaries\"\n\njava_backend_service_name: \"growerhub-java-backend.service\"\njava_backend_java_bin: \"/usr/bin/java\"\njava_backend_java_opts: []\njava_backend_bind_ip: \"127.0.0.1\"\njava_backend_enforce_bind_ip: false\njava_backend_host_port: 18080\njava_backend_after_units:\n - network-online.target\n - mosquitto.service\njava_backend_systemd_extra_directives: []\n\njava_backend_env_dir: \"/opt/growerhub/env\"\njava_backend_env_dir_mode: \"0755\"\njava_backend_env_file_path: \"/opt/growerhub/env/growerhub-java-backend.env\"\njava_backend_env_file: \"{{ java_backend_env_file_path }}\"\n\njava_backend_sudo_user: \"watering-admin\"\njava_backend_sudoers_file: \"/etc/sudoers.d/growerhub-java-deploy\"\njava_backend_manage_deploy_sudoers: true\njava_backend_remove_legacy_docker: true\n\n# Required env values (dolzhny byt' zadany v vars/vault)\njava_backend_secret_key: \"\"\njava_backend_db_url: \"\"\njava_backend_db_username: \"\"\njava_backend_db_password: \"\"\n\n# MQTT defaults dlya backend na hoste.\njava_backend_mqtt_host: \"127.0.0.1\"\njava_backend_mqtt_port: 1884\njava_backend_mqtt_username: \"gh_backend\"\njava_backend_mqtt_password: \"{{ lookup('env', 'GH_MQTT_BACKEND_PASSWORD') }}\"\njava_backend_mqtt_tls: false\njava_backend_mqtt_provisioning_enabled: false\njava_backend_mqtt_provisioning_host: \"127.0.0.1\"\njava_backend_mqtt_provisioning_port: 1884\njava_backend_mqtt_provisioning_tls: false\njava_backend_mqtt_provisioning_username: \"gh_provisioning\"\njava_backend_mqtt_provisioning_password: \"{{ lookup('env', 'GH_MQTT_PROVISIONING_PASSWORD') }}\"\n\n# Self-service vklyuchaetsja tol'ko posle polnogo smoke-testa i proverki pravovyh tekstov.\njava_backend_self_service_enabled: false\njava_backend_self_service_legacy_owner_email: \"{{ lookup('env', 'SELF_SERVICE_LEGACY_OWNER_EMAIL') }}\"\njava_backend_advisor_deepseek_api_key: \"{{ lookup('env', 'ADVISOR_DEEPSEEK_API_KEY') }}\"\njava_backend_public_base_url: \"https://growerhub.ru\"\njava_backend_env_extra: {}\n\njava_backend_env_required:\n SECRET_KEY: \"{{ java_backend_secret_key }}\"\n SPRING_DATASOURCE_URL: \"{{ java_backend_db_url }}\"\n SPRING_DATASOURCE_USERNAME: \"{{ java_backend_db_username }}\"\n SPRING_DATASOURCE_PASSWORD: \"{{ java_backend_db_password }}\"\n\njava_backend_env_optional:\n MQTT_HOST: \"{{ java_backend_mqtt_host | default('') }}\"\n MQTT_PORT: \"{{ java_backend_mqtt_port | default('') }}\"\n MQTT_USERNAME: \"{{ java_backend_mqtt_username | default('') }}\"\n MQTT_PASSWORD: \"{{ java_backend_mqtt_password | default('') }}\"\n MQTT_TLS: \"{{ java_backend_mqtt_tls | default('') }}\"\n MQTT_PROVISIONING_ENABLED: \"{{ java_backend_mqtt_provisioning_enabled | bool | lower }}\"\n MQTT_PROVISIONING_HOST: \"{{ java_backend_mqtt_provisioning_host | default('') }}\"\n MQTT_PROVISIONING_PORT: \"{{ java_backend_mqtt_provisioning_port | default('') }}\"\n MQTT_PROVISIONING_TLS: \"{{ java_backend_mqtt_provisioning_tls | bool | lower }}\"\n MQTT_PROVISIONING_USERNAME: \"{{ java_backend_mqtt_provisioning_username | default('') }}\"\n MQTT_PROVISIONING_PASSWORD: \"{{ java_backend_mqtt_provisioning_password | default('') }}\"\n SELF_SERVICE_ENABLED: \"{{ java_backend_self_service_enabled | bool | lower }}\"\n SELF_SERVICE_LEGACY_OWNER_EMAIL: \"{{ java_backend_self_service_legacy_owner_email | default('') }}\"\n ADVISOR_DEEPSEEK_API_KEY: \"{{ java_backend_advisor_deepseek_api_key | default('') }}\"\n SERVER_PUBLIC_BASE_URL: \"{{ java_backend_public_base_url }}\"\n FIRMWARE_BINARIES_DIR: \"{{ java_backend_firmware_dir }}\"\n AUTH_SSO_REDIRECT_BASE: \"{{ java_backend_auth_sso_redirect_base | default('') }}\"\n REFRESH_TOKEN_COOKIE_SECURE: \"true\"\n REFRESH_TOKEN_COOKIE_SAMESITE: \"lax\"\n AUTH_GOOGLE_CLIENT_ID: \"{{ google_client_id | default('') }}\"\n AUTH_GOOGLE_CLIENT_SECRET: \"{{ google_client_secret | default('') }}\"\n AUTH_YANDEX_CLIENT_ID: \"{{ yandex_client_id | default('') }}\"\n AUTH_YANDEX_CLIENT_SECRET: \"{{ yandex_client_secret | default('') }}\"\n\njava_backend_env: >-\n {{\n java_backend_env_required\n | combine(java_backend_env_optional)\n | combine(java_backend_env_extra)\n }}\n"}, "f348e5ef928bf09ed800b14cce2977998a169ffe": {"t": 1786068222.4745662, "n": 4596, "h": "2569f33d3a6d759a", "c": "---\n# Default deployment settings for GrowerHub Java backend.\n\njava_backend_deploy_dir: \"/opt/growerhub/java-backend\"\njava_backend_jar_src: \"{{ playbook_dir }}/../../backend/build/libs/app.jar\"\njava_backend_user: \"{{ ansible_user | default('watering-admin') }}\"\njava_backend_group: \"{{ ansible_user | default('watering-admin') }}\"\njava_backend_deploy_user: \"{{ java_backend_user }}\"\njava_backend_release_mode: false\njava_backend_releases_dir: \"/opt/growerhub/releases/backend\"\njava_backend_current_link: \"/opt/growerhub/current/backend\"\njava_backend_firmware_dir: \"{{ java_backend_deploy_dir }}/firmware_binaries\"\n\njava_backend_service_name: \"growerhub-java-backend.service\"\njava_backend_java_bin: \"/usr/bin/java\"\njava_backend_java_opts: []\njava_backend_bind_ip: \"127.0.0.1\"\njava_backend_enforce_bind_ip: false\njava_backend_host_port: 18080\njava_backend_after_units:\n - network-online.target\n - mosquitto.service\njava_backend_systemd_extra_directives: []\n\njava_backend_env_dir: \"/opt/growerhub/env\"\njava_backend_env_dir_mode: \"0755\"\njava_backend_env_file_path: \"/opt/growerhub/env/growerhub-java-backend.env\"\njava_backend_env_file: \"{{ java_backend_env_file_path }}\"\n\njava_backend_sudo_user: \"watering-admin\"\njava_backend_sudoers_file: \"/etc/sudoers.d/growerhub-java-deploy\"\njava_backend_manage_deploy_sudoers: true\njava_backend_remove_legacy_docker: true\n\n# Required env values (dolzhny byt' zadany v vars/vault)\njava_backend_secret_key: \"\"\njava_backend_db_url: \"\"\njava_backend_db_username: \"\"\njava_backend_db_password: \"\"\n\n# MQTT defaults dlya backend na hoste.\njava_backend_mqtt_host: \"127.0.0.1\"\njava_backend_mqtt_port: 1884\njava_backend_mqtt_username: \"gh_backend\"\njava_backend_mqtt_password: \"{{ lookup('env', 'GH_MQTT_BACKEND_PASSWORD') }}\"\njava_backend_mqtt_tls: false\njava_backend_mqtt_provisioning_enabled: false\njava_backend_mqtt_provisioning_host: \"127.0.0.1\"\njava_backend_mqtt_provisioning_port: 1884\njava_backend_mqtt_provisioning_tls: false\njava_backend_mqtt_provisioning_username: \"gh_provisioning\"\njava_backend_mqtt_provisioning_password: \"{{ lookup('env', 'GH_MQTT_PROVISIONING_PASSWORD') }}\"\n\n# Self-service vklyuchaetsja tol'ko posle polnogo smoke-testa i proverki pravovyh tekstov.\njava_backend_self_service_enabled: false\njava_backend_self_service_legacy_owner_email: \"{{ lookup('env', 'SELF_SERVICE_LEGACY_OWNER_EMAIL') }}\"\njava_backend_advisor_deepseek_api_key: \"{{ lookup('env', 'ADVISOR_DEEPSEEK_API_KEY') }}\"\njava_backend_public_base_url: \"https://growerhub.ru\"\njava_backend_env_extra: {}\n\njava_backend_env_required:\n SECRET_KEY: \"{{ java_backend_secret_key }}\"\n SPRING_DATASOURCE_URL: \"{{ java_backend_db_url }}\"\n SPRING_DATASOURCE_USERNAME: \"{{ java_backend_db_username }}\"\n SPRING_DATASOURCE_PASSWORD: \"{{ java_backend_db_password }}\"\n\njava_backend_env_optional:\n MQTT_HOST: \"{{ java_backend_mqtt_host | default('') }}\"\n MQTT_PORT: \"{{ java_backend_mqtt_port | default('') }}\"\n MQTT_USERNAME: \"{{ java_backend_mqtt_username | default('') }}\"\n MQTT_PASSWORD: \"{{ java_backend_mqtt_password | default('') }}\"\n MQTT_TLS: \"{{ java_backend_mqtt_tls | default('') }}\"\n MQTT_PROVISIONING_ENABLED: \"{{ java_backend_mqtt_provisioning_enabled | bool | lower }}\"\n MQTT_PROVISIONING_HOST: \"{{ java_backend_mqtt_provisioning_host | default('') }}\"\n MQTT_PROVISIONING_PORT: \"{{ java_backend_mqtt_provisioning_port | default('') }}\"\n MQTT_PROVISIONING_TLS: \"{{ java_backend_mqtt_provisioning_tls | bool | lower }}\"\n MQTT_PROVISIONING_USERNAME: \"{{ java_backend_mqtt_provisioning_username | default('') }}\"\n MQTT_PROVISIONING_PASSWORD: \"{{ java_backend_mqtt_provisioning_password | default('') }}\"\n SELF_SERVICE_ENABLED: \"{{ java_backend_self_service_enabled | bool | lower }}\"\n SELF_SERVICE_LEGACY_OWNER_EMAIL: \"{{ java_backend_self_service_legacy_owner_email | default('') }}\"\n ADVISOR_DEEPSEEK_API_KEY: \"{{ java_backend_advisor_deepseek_api_key | default('') }}\"\n SERVER_PUBLIC_BASE_URL: \"{{ java_backend_public_base_url }}\"\n FIRMWARE_BINARIES_DIR: \"{{ java_backend_firmware_dir }}\"\n AUTH_SSO_REDIRECT_BASE: \"{{ java_backend_auth_sso_redirect_base | default('') }}\"\n REFRESH_TOKEN_COOKIE_SECURE: \"true\"\n REFRESH_TOKEN_COOKIE_SAMESITE: \"lax\"\n AUTH_GOOGLE_CLIENT_ID: \"{{ google_client_id | default('') }}\"\n AUTH_GOOGLE_CLIENT_SECRET: \"{{ google_client_secret | default('') }}\"\n AUTH_YANDEX_CLIENT_ID: \"{{ yandex_client_id | default('') }}\"\n AUTH_YANDEX_CLIENT_SECRET: \"{{ yandex_client_secret | default('') }}\"\n\njava_backend_env: >-\n {{\n java_backend_env_required\n | combine(java_backend_env_optional)\n | combine(java_backend_env_extra)\n }}\n"}}}}