Created
January 26, 2026 10:56
-
-
Save ov1d1u/ffbbac5c5a2137c2aaba6357d3e72c4d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| [ | |
| { | |
| "id": "5c6c6fe6e65c4285", | |
| "type": "inject", | |
| "z": "9409b244d6890952", | |
| "name": "Nowcasting alerts", | |
| "props": [ | |
| { | |
| "p": "payload" | |
| }, | |
| { | |
| "p": "topic", | |
| "vt": "str" | |
| } | |
| ], | |
| "repeat": "300", | |
| "crontab": "", | |
| "once": false, | |
| "onceDelay": 0.1, | |
| "topic": "", | |
| "payload": "<?xml version=\"1.0\"?> <avertizariNowcasting><avertizare tipMesaj=\"1\" numeTipMesaj=\"Avertizare nowcasting\" dataInceput=\"2025-06-11T17:20\" dataSfarsit=\"2025-06-11T18:00\" zona=\"Județul Neamţ: Doljești, Sagna, Oniceni, Bozieni, Stănița, Gâdinți, Boghicea, Pâncești, Bira, Poienari;<br>Județul Iaşi: Țibănești, Țibana, Voinești, Dagâța, Mironeasa, Sinești, Mogoșești, Oțeleni, Tansa, Șcheia, Ipatele, Mădârjac, Dragușeni;<br>Județul Vaslui: Băcești, Dumești, Todirești, Negrești, Rafaila;<br>\" semnalare=\"Grindină de dimensiuni medii, vijelie, viteza vântului la rafală de 70…80 km/h, frecvente descărcări electrice, averse torențiale ce vor cumula 20...25 l/mp.\" culoare=\"1\" numeCuloare=\"portocaliu\" modificat=\"2025-06-11 17:10:01\" creat=\"2025-06-11 17:10:01\"/><avertizare tipMesaj=\"2\" numeTipMesaj=\"Atentionare nowcasting\" dataInceput=\"2025-06-11T17:20\" dataSfarsit=\"2025-06-11T18:30\" zona=\"Județul Bacău: Lipova;<br>Județul Neamţ: Roman, Săbăoani, Tămășeni, Cordun, Horia, Doljești, Gherăești, Trifești, Ion Creangă, Sagna, Icușești, Botești, Secuieni, Oniceni, Valea Ursului, Dulcești, Bozieni, Stănița, Tupilați, Gâdinți, Boghicea, Văleni, Pâncești, Bira, Poienari;<br>Județul Iaşi: Tomești, Holboca, Ciurea, Răducăneni, Țibănești, Hălăucești, Miroslava, Țibana, Voinești, Costuleni, Dagâța, Ciortești, Comarna, Mironeasa, Sinești, Mogoșești, Schitu Duca, Butea, Popești, Scânteia, Oțeleni, Prisăcani, Mircești, Rachițeni, Horlești, Tansa, Cozmești, Bârnova, Grajduri, Șcheia, Gorban, Dolhești, Dobrovăț, Țuțora, Moșna, Ipatele, Grozești, Mădârjac, Dragușeni;<br>Județul Vaslui: Vaslui, Huși, Stănilești, Duda-Epureni, Codăești, Drânceni, Ivănești, Văleni, Zăpodeni, Solești, Băcești, Dumești, Rebricea, Muntenii de Sus, Laza, Todirești, Pungești, Tăcuta, Ștefan cel Mare, Bunești-Averești, Oșești, Pușcași, Miclești, Negrești, Delești, Tătărăni, Dănești, Gârceni, Boțești, Cozmești, Tanacu, Vulturești, Ferești, Arsura, Rafaila, Bălteni;<br>\" semnalare=\"intensificări ale vântului la rafală de 50…70 km/h, descărcări electrice, grindină, averse.\" culoare=\"0\" numeCuloare=\"galben\" modificat=\"2025-06-11 17:06:01\" creat=\"2025-06-11 17:06:01\"/><avertizare tipMesaj=\"2\" numeTipMesaj=\"Atentionare nowcasting\" dataInceput=\"2025-06-11T16:40\" dataSfarsit=\"2025-06-11T18:00\" zona=\"Județul Prahova: Măneciu, Brebu, Slănic, Izvoarele, Drajna, Cerașu, Starchiojd, Posești, Teișani, Bertea, Predeal-Sărari, Ștefești, Bătrâni, Cărbunești, Ariceștii Zeletin;<br>Zona de munte a județului Prahova, respectiv zona de munte a localităților: Sinaia, Comarnic, Bușteni, Măneciu, Valea Doftanei, Cerașu, Azuga, Șotrile, Bertea, Secăria;<br>\" semnalare=\"Averse torențiale care vor acumula 20...25 l/mp, descărcări electrice, intensificări ale vântului, grindină.\" culoare=\"0\" numeCuloare=\"galben\" modificat=\"2025-06-11 16:32:01\" creat=\"2025-06-11 16:32:01\"/><avertizare tipMesaj=\"2\" numeTipMesaj=\"Atentionare nowcasting\" dataInceput=\"2025-06-11T16:35\" dataSfarsit=\"2025-06-11T17:30\" zona=\"Județul Botoşani: Ungureni, Hudești, Albești, Trușești, Ștefănești, Coțușca, Suharău, Lunca, Havârna, Vorniceni, Rădăuți-Prut, Călărași, Cristinești, Avrămeni, George Enescu, Gorbănești, Manoleasa, Hlipiceni, Păltiniș, Vlăsinești, Todireni, Mileanca, Sulița, Dângeni, Santa Mare, Unțeni, Știubieni, Darabani, Drăgușeni, Durnești, Dobârceni, Corlăteni, Mihălășeni, Blândești, Cordăreni, Viișoara, Hănești, Săveni, Ripiceni, Concești, Românești, Mitoc, Adășeni, Răușeni;<br>\" semnalare=\"intensificări ale vântului la rafală de 50…70 km/h, descărcări electrice, grindină, averse.\" culoare=\"0\" numeCuloare=\"galben\" modificat=\"2025-06-11 16:22:01\" creat=\"2025-06-11 16:22:01\"/><avertizare tipMesaj=\"2\" numeTipMesaj=\"Atentionare nowcasting\" dataInceput=\"2025-06-11T16:50\" dataSfarsit=\"2025-06-11T17:30\" zona=\"Județul Botoşani: Prăjeni;<br>Județul Suceava: Forăști, Drăgușeni;<br>Județul Neamţ: Târgu Neamț, Răucești, Petricani, Țibucani, Urecheni, Timișești, Brusturi, Păstrăveni, Războieni, Tupilați, Drăgănești;<br>Județul Iaşi: Iași, Pașcani, Târgu Frumos, Hârlău, Holboca, Belcești, Deleni, Podu Iloaiei, Cotnari, Scobinți, Lespezi, Hălăucești, Tătăruși, Miroslava, Lețcani, Ruginoasa, Stolniceni-Prăjescu, Valea Seacă, Popricani, Șipote, Erbiceni, Miroslovești, Moțca, Vânători, Bălțați, Ceplenița, Vlădeni, Dumești, Strunga, Ion Neculce, Sinești, Bivolari, Andrieșeni, Valea Lupului, Todirești, Focuri, Cristești, Mogoșești-Siret, Sirețel, Popești, Lungani, Ungheni, Victoria, Brăești, Probota, Țigănăși, Rediu, Trifești, Gropnița, Plugari, Coarnele Caprei, Golăiești, Alexandru I. Cuza, Movileni, Balș, Heleșteni, Aroneanu, Hărmănești, Românești, Ciohorăni, Fântânele, Costești, Roșcani, Cucuteni;<br>\" semnalare=\"intensificări ale vântului la rafală de 50…70 km/h, descărcări electrice, grindină, averse.\" culoare=\"0\" numeCuloare=\"galben\" modificat=\"2025-06-11 15:54:01\" creat=\"2025-06-11 15:54:01\"/></avertizariNowcasting>", | |
| "payloadType": "str", | |
| "x": 150, | |
| "y": 1240, | |
| "wires": [ | |
| [ | |
| "8e1b7439215e0fff" | |
| ] | |
| ] | |
| }, | |
| { | |
| "id": "8e1b7439215e0fff", | |
| "type": "http request", | |
| "z": "9409b244d6890952", | |
| "name": "", | |
| "method": "GET", | |
| "ret": "txt", | |
| "paytoqs": "ignore", | |
| "url": "https://www.meteoromania.ro/avertizari-nowcasting-xml.php", | |
| "tls": "", | |
| "persist": false, | |
| "proxy": "", | |
| "insecureHTTPParser": false, | |
| "authType": "", | |
| "senderr": false, | |
| "headers": [], | |
| "x": 330, | |
| "y": 1240, | |
| "wires": [ | |
| [ | |
| "db3d4d9bcfc20132" | |
| ] | |
| ] | |
| }, | |
| { | |
| "id": "db3d4d9bcfc20132", | |
| "type": "xml", | |
| "z": "9409b244d6890952", | |
| "name": "", | |
| "property": "payload", | |
| "attr": "", | |
| "chr": "", | |
| "x": 435, | |
| "y": 1240, | |
| "wires": [ | |
| [ | |
| "2fb9e559bfa430e0" | |
| ] | |
| ], | |
| "l": false | |
| }, | |
| { | |
| "id": "cd7981b3abf14b75", | |
| "type": "function", | |
| "z": "9409b244d6890952", | |
| "name": "for result in results", | |
| "func": "var messages = [];\nvar seenHeadlines = new Set();\nmsg.results.forEach(alert => {\n var headline = alert;\n if (!seenHeadlines.has(headline)) {\n seenHeadlines.add(headline);\n messages.push({ alert: alert });\n }\n});\nreturn [messages];", | |
| "outputs": 1, | |
| "timeout": 0, | |
| "noerr": 0, | |
| "initialize": "", | |
| "finalize": "", | |
| "libs": [], | |
| "x": 695, | |
| "y": 1240, | |
| "wires": [ | |
| [ | |
| "a9a219cc16b743cc", | |
| "da449ad7e5251f2d" | |
| ] | |
| ], | |
| "l": false | |
| }, | |
| { | |
| "id": "70a4db441520b6a8", | |
| "type": "function", | |
| "z": "9409b244d6890952", | |
| "name": "Set message", | |
| "func": "function replaceRomanianDiacritics(str) {\n const diacriticMap = {\n 'Ă': 'A', 'Â': 'A', 'Ș': 'S', 'Ş': 'S', 'Ț': 'T', 'Ţ': 'T', 'Î': 'I',\n 'ă': 'a', 'â': 'a', 'ș': 's', 'ş': 's', 'ț': 't', 'ţ': 't', 'î': 'i'\n };\n\n return str.replace(/[ĂÂȘŞȚŢÎăâșşțţî]/g, function (match) {\n return diacriticMap[match] || match;\n });\n}\n\nlet startHour = \"\";\nlet endHour = \"\";\n\ntry {\n const startDate = new Date(msg.alert.dataInceput);\n if (isNaN(startDate.getTime())) {\n throw new Error('Invalid start date');\n }\n startHour = `${startDate.getHours()}:${startDate.getMinutes().toString().padStart(2, '0')}`;\n} catch (error) {\n console.error('Failed to parse start date:', error);\n}\n\ntry {\n const endDate = new Date(msg.alert.dataSfarsit);\n if (isNaN(endDate.getTime())) {\n throw new Error('Invalid end date');\n }\n endHour = `${endDate.getHours()}:${endDate.getMinutes().toString().padStart(2, '0')}`;\n} catch (error) {\n console.error('Failed to parse end date:', error);\n}\n\nlet headline = msg.headline.text;\nif (!headline.endsWith(\".\")) {\n headline = `${headline}.`;\n}\n\nconst title = `ALERTĂ NOWCASTING COD ${msg.alert.numeCuloare.toUpperCase()}`;\nconst timeRange = (startHour && endHour) ? `(${startHour}-${endHour})` : \"\";\nconst message = `${title} ${timeRange}: ${headline}`;\n\nif (title !== \"\" && message !== \"\") {\n msg.message = replaceRomanianDiacritics(message);\n return msg;\n}", | |
| "outputs": 1, | |
| "timeout": 0, | |
| "noerr": 0, | |
| "initialize": "", | |
| "finalize": "", | |
| "libs": [], | |
| "x": 1050, | |
| "y": 1240, | |
| "wires": [ | |
| [ | |
| "7dbdcae0ab70ffff", | |
| "4405ff414f12332d" | |
| ] | |
| ] | |
| }, | |
| { | |
| "id": "30f016f5d3e83676", | |
| "type": "api-call-service", | |
| "z": "9409b244d6890952", | |
| "name": "GPT process", | |
| "server": "b59d18a8.44b6f8", | |
| "version": 7, | |
| "debugenabled": false, | |
| "action": "openai_conversation.generate_content", | |
| "floorId": [], | |
| "areaId": [], | |
| "deviceId": [], | |
| "entityId": [], | |
| "labelId": [], | |
| "data": "{\t \"config_entry\": \"4cd59172989f43f67ce95c9e48b75634\",\t \"prompt\": \"Rezumă, în cel mult 10 cuvinte, următorul text: \" & alert.semnalare \t}", | |
| "dataType": "jsonata", | |
| "mergeContext": "", | |
| "mustacheAltTags": false, | |
| "outputProperties": [ | |
| { | |
| "property": "headline", | |
| "propertyType": "msg", | |
| "value": "", | |
| "valueType": "results" | |
| } | |
| ], | |
| "queue": "none", | |
| "blockInputOverrides": true, | |
| "domain": "openai_conversation", | |
| "service": "generate_content", | |
| "x": 890, | |
| "y": 1240, | |
| "wires": [ | |
| [ | |
| "70a4db441520b6a8" | |
| ] | |
| ] | |
| }, | |
| { | |
| "id": "4405ff414f12332d", | |
| "type": "api-call-service", | |
| "z": "9409b244d6890952", | |
| "name": "Meshcore send", | |
| "server": "b59d18a8.44b6f8", | |
| "version": 7, | |
| "debugenabled": false, | |
| "action": "meshcore.send_channel_message", | |
| "floorId": [], | |
| "areaId": [], | |
| "deviceId": [], | |
| "entityId": [], | |
| "labelId": [], | |
| "data": "{\t \"channel_idx\": 0,\t \"message\": message\t}", | |
| "dataType": "jsonata", | |
| "mergeContext": "", | |
| "mustacheAltTags": false, | |
| "outputProperties": [], | |
| "queue": "none", | |
| "blockInputOverrides": true, | |
| "domain": "meshcore", | |
| "service": "send_channel_message", | |
| "x": 1220, | |
| "y": 1260, | |
| "wires": [ | |
| [ | |
| "266815ee1485cf65" | |
| ] | |
| ] | |
| }, | |
| { | |
| "id": "266815ee1485cf65", | |
| "type": "delay", | |
| "z": "9409b244d6890952", | |
| "name": "", | |
| "pauseType": "delay", | |
| "timeout": "15", | |
| "timeoutUnits": "seconds", | |
| "rate": "1", | |
| "nbRateUnits": "1", | |
| "rateUnits": "minute", | |
| "randomFirst": "1", | |
| "randomLast": "5", | |
| "randomUnits": "seconds", | |
| "drop": true, | |
| "allowrate": false, | |
| "outputs": 1, | |
| "x": 1335, | |
| "y": 1260, | |
| "wires": [ | |
| [ | |
| "355ace024ed370c9" | |
| ] | |
| ], | |
| "l": false | |
| }, | |
| { | |
| "id": "da449ad7e5251f2d", | |
| "type": "delay", | |
| "z": "9409b244d6890952", | |
| "name": "", | |
| "pauseType": "rate", | |
| "timeout": "5", | |
| "timeoutUnits": "seconds", | |
| "rate": "1", | |
| "nbRateUnits": "30", | |
| "rateUnits": "second", | |
| "randomFirst": "1", | |
| "randomLast": "5", | |
| "randomUnits": "seconds", | |
| "drop": false, | |
| "allowrate": false, | |
| "outputs": 1, | |
| "x": 775, | |
| "y": 1240, | |
| "wires": [ | |
| [ | |
| "30f016f5d3e83676" | |
| ] | |
| ], | |
| "l": false | |
| }, | |
| { | |
| "id": "2fb9e559bfa430e0", | |
| "type": "function", | |
| "z": "9409b244d6890952", | |
| "name": "Get Iași warnings", | |
| "func": "function replaceRomanianDiacritics(str) {\n const diacriticMap = {\n 'Ă': 'A', 'Â': 'A', 'Ș': 'S', 'Ş': 'S', 'Ț': 'T', 'Ţ': 'T', 'Î': 'I',\n 'ă': 'a', 'â': 'a', 'ș': 's', 'ş': 's', 'ț': 't', 'ţ': 't', 'î': 'i'\n };\n\n return str.replace(/[ĂÂȘŞȚŢÎăâșşțţî]/g, function (match) {\n return diacriticMap[match] || match;\n });\n}\n\nfunction extractWarnings(data, newerThan) {\n if (typeof data.avertizariNowcasting !== 'object') {\n return {};\n }\n const result = { lastUpdate: null, warnings: {} };\n const warnings = data.avertizariNowcasting.avertizare;\n\n let latestModification = null;\n\n const countyRegex = /Jude[țtțţ]ul (.*?)(?::\\s*(.*))?$/i;\n\n for (const warning of warnings) {\n const modificat = new Date(warning.$.modificat);\n\n if (modificat <= newerThan) {\n continue;\n }\n\n if (!latestModification || modificat > latestModification) {\n latestModification = modificat;\n }\n\n const zones = warning.$.zona.split(/<br>|;/);\n for (const zone of zones) {\n if (zone.trim().length === 0) continue;\n\n const parts = countyRegex.exec(zone);\n if (parts) {\n const county = replaceRomanianDiacritics(parts[1]).trim();\n const localities = (parts[2] ? parts[2].split(',').map(loc => replaceRomanianDiacritics(loc.trim())) : []);\n\n const warningDetails = {\n semnalare: warning.$.semnalare,\n dataInceput: warning.$.dataInceput,\n dataSfarsit: warning.$.dataSfarsit,\n numeCuloare: warning.$.numeCuloare,\n localitati: localities\n };\n\n if (!result.warnings[county]) {\n result.warnings[county] = [];\n }\n\n result.warnings[county].push(warningDetails);\n }\n }\n }\n\n if (latestModification) {\n result.lastUpdate = latestModification.toISOString();\n }\n\n return result;\n}\n\nmsg.results = [];\nvar startDate = new Date(0);\nvar startDateStr = flow.get(\"latestNowcastingAlert\", \"store\");\nif (startDateStr) {\n startDate = new Date(startDateStr);\n}\n\nvar nowcastingAlerts = extractWarnings(msg.payload, startDate);\nmsg.unfilteredNowcastingAlerts = nowcastingAlerts;\n\nif (nowcastingAlerts.lastUpdate != undefined && nowcastingAlerts.lastUpdate != null) {\n flow.set(\"latestNowcastingAlert\", nowcastingAlerts.lastUpdate, \"store\");\n if (nowcastingAlerts.warnings.hasOwnProperty(\"Iasi\")) {\n nowcastingAlerts.warnings[\"Iasi\"].forEach(function (alert) {\n // If alert.localitati is empty or includes \"Iasi\", add it to results\n if (alert.localitati.length === 0 || alert.localitati.includes(\"Iasi\")) {\n msg.results.push(alert);\n }\n });\n }\n}\n\nreturn msg;", | |
| "outputs": 1, | |
| "timeout": 0, | |
| "noerr": 0, | |
| "initialize": "", | |
| "finalize": "", | |
| "libs": [], | |
| "x": 570, | |
| "y": 1240, | |
| "wires": [ | |
| [ | |
| "cd7981b3abf14b75" | |
| ] | |
| ] | |
| }, | |
| { | |
| "id": "355ace024ed370c9", | |
| "type": "api-call-service", | |
| "z": "9409b244d6890952", | |
| "name": "Meshcore send", | |
| "server": "b59d18a8.44b6f8", | |
| "version": 7, | |
| "debugenabled": false, | |
| "action": "meshcore.send_channel_message", | |
| "floorId": [], | |
| "areaId": [], | |
| "deviceId": [], | |
| "entityId": [], | |
| "labelId": [], | |
| "data": "{\t \"channel_idx\": 0,\t \"message\": \"Nota: aceasta functionalitate este in faza beta si pot aparea erori de raportare.\"\t}", | |
| "dataType": "jsonata", | |
| "mergeContext": "", | |
| "mustacheAltTags": false, | |
| "outputProperties": [], | |
| "queue": "none", | |
| "blockInputOverrides": true, | |
| "domain": "meshcore", | |
| "service": "send_channel_message", | |
| "x": 1460, | |
| "y": 1260, | |
| "wires": [ | |
| [] | |
| ] | |
| }, | |
| { | |
| "id": "a9a219cc16b743cc", | |
| "type": "switch", | |
| "z": "9409b244d6890952", | |
| "name": "Cod portocaliu sau roșu", | |
| "property": "$uppercase(alert.numeCuloare)", | |
| "propertyType": "jsonata", | |
| "rules": [ | |
| { | |
| "t": "regex", | |
| "v": "PORTOCALIU|ROSU|ROȘU|ROŞU", | |
| "vt": "str", | |
| "case": false | |
| } | |
| ], | |
| "checkall": "true", | |
| "repair": false, | |
| "outputs": 1, | |
| "x": 765, | |
| "y": 1320, | |
| "wires": [ | |
| [ | |
| "252e88d111a94299" | |
| ] | |
| ], | |
| "l": false | |
| }, | |
| { | |
| "id": "252e88d111a94299", | |
| "type": "function", | |
| "z": "9409b244d6890952", | |
| "name": "Set message", | |
| "func": "function capitalizeFirstLetter(string) {\n if (!string) return string;\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nlet startHour = \"\";\nlet endHour = \"\";\n\n// Start date\ntry {\n const startDate = new Date(msg.alert.dataInceput);\n if (isNaN(startDate.getTime())) {\n throw new Error('Invalid start date');\n }\n startHour = `${startDate.getHours()}:${startDate.getMinutes().toString().padStart(2, '0')}`;\n} catch (error) {\n console.error('Failed to parse start date:', error);\n startHour = \"ora de început necunoscută\"; // Set a default message if needed\n}\n\n// End date\ntry {\n const endDate = new Date(msg.alert.dataSfarsit);\n if (isNaN(endDate.getTime())) {\n throw new Error('Invalid end date');\n }\n endHour = `${endDate.getHours()}:${endDate.getMinutes().toString().padStart(2, '0')}`;\n} catch (error) {\n console.error('Failed to parse end date:', error);\n endHour = \"ora de sfârșit necunoscută\"; // Set a default message if needed\n}\n\nlet headline = msg.alert.semnalare;\nif (!headline.endsWith(\".\")) {\n headline = `${headline}.`;\n}\n\nconst title = `ALERTĂ NOWCASTING COD ${msg.alert.numeCuloare.toUpperCase()}`;\nconst timeRange = (startHour && endHour) ? `Valabil de la ${startHour} până la ${endHour}.` : \"\";\nconst message = `${capitalizeFirstLetter(headline)} ${timeRange}`;\n\nmsg.title = title;\nmsg.message = message;\n\nreturn msg;", | |
| "outputs": 1, | |
| "timeout": 0, | |
| "noerr": 0, | |
| "initialize": "", | |
| "finalize": "", | |
| "libs": [], | |
| "x": 825, | |
| "y": 1320, | |
| "wires": [ | |
| [ | |
| "5612181716d3b369", | |
| "01b01e5f8e0b4e8a" | |
| ] | |
| ], | |
| "l": false | |
| }, | |
| { | |
| "id": "5612181716d3b369", | |
| "type": "api-call-service", | |
| "z": "9409b244d6890952", | |
| "name": "Send urgent notification", | |
| "server": "b59d18a8.44b6f8", | |
| "version": 7, | |
| "debugenabled": false, | |
| "action": "notify.mobile_apps", | |
| "floorId": [], | |
| "areaId": [], | |
| "deviceId": [], | |
| "entityId": [], | |
| "labelId": [], | |
| "data": "{\t \"title\": title,\t \"message\": message,\t \"data\":{\t \"ttl\":0,\t \"notification_icon\":\"mdi:weather-cloudy-alert\",\t \"priority\":\"high\",\t \"channel\":\"Urgențe\",\t \"actions\":[]\t }\t}", | |
| "dataType": "jsonata", | |
| "mergeContext": "", | |
| "mustacheAltTags": false, | |
| "outputProperties": [], | |
| "queue": "none", | |
| "blockInputOverrides": false, | |
| "domain": "notify", | |
| "service": "mobile_apps", | |
| "x": 1010, | |
| "y": 1320, | |
| "wires": [ | |
| [] | |
| ] | |
| }, | |
| { | |
| "id": "01b01e5f8e0b4e8a", | |
| "type": "api-call-service", | |
| "z": "9409b244d6890952", | |
| "name": "GPT process", | |
| "server": "b59d18a8.44b6f8", | |
| "version": 7, | |
| "debugenabled": false, | |
| "action": "openai_conversation.generate_content", | |
| "floorId": [], | |
| "areaId": [], | |
| "deviceId": [], | |
| "entityId": [], | |
| "labelId": [], | |
| "data": "{\t \"config_entry\": \"4cd59172989f43f67ce95c9e48b75634\",\t \"prompt\": \"Pregătește următorul text pentru a fi citit de o aplicatie text-to-speech. Extinde orice prescurtări și adaugă eventualele cuvinte lipsă de legătură:\\n\\nAtenție, a fost emisă o alertă imediată de vreme severă: \" & message\t}", | |
| "dataType": "jsonata", | |
| "mergeContext": "", | |
| "mustacheAltTags": false, | |
| "outputProperties": [ | |
| { | |
| "property": "headline", | |
| "propertyType": "msg", | |
| "value": "", | |
| "valueType": "results" | |
| } | |
| ], | |
| "queue": "none", | |
| "blockInputOverrides": true, | |
| "domain": "openai_conversation", | |
| "service": "generate_content", | |
| "x": 990, | |
| "y": 1380, | |
| "wires": [ | |
| [ | |
| "38487570932f4d34" | |
| ] | |
| ] | |
| }, | |
| { | |
| "id": "38487570932f4d34", | |
| "type": "api-call-service", | |
| "z": "9409b244d6890952", | |
| "name": "Announce", | |
| "server": "b59d18a8.44b6f8", | |
| "version": 7, | |
| "debugenabled": false, | |
| "action": "script.announce_emergency", | |
| "floorId": [], | |
| "areaId": [], | |
| "deviceId": [], | |
| "entityId": [], | |
| "labelId": [], | |
| "data": "{ \"message\": headline.text }", | |
| "dataType": "jsonata", | |
| "mergeContext": "", | |
| "mustacheAltTags": false, | |
| "outputProperties": [], | |
| "queue": "none", | |
| "blockInputOverrides": false, | |
| "domain": "script", | |
| "service": "announce_emergency", | |
| "x": 1160, | |
| "y": 1380, | |
| "wires": [ | |
| [] | |
| ] | |
| }, | |
| { | |
| "id": "b59d18a8.44b6f8", | |
| "type": "server", | |
| "name": "Home Assistant", | |
| "version": 6, | |
| "addon": true, | |
| "rejectUnauthorizedCerts": true, | |
| "ha_boolean": [ | |
| "y", | |
| "yes", | |
| "true", | |
| "on", | |
| "home", | |
| "open" | |
| ], | |
| "connectionDelay": true, | |
| "cacheJson": true, | |
| "heartbeat": false, | |
| "heartbeatInterval": 30, | |
| "areaSelector": "friendlyName", | |
| "deviceSelector": "friendlyName", | |
| "entitySelector": "friendlyName", | |
| "statusSeparator": "at: ", | |
| "statusYear": "hidden", | |
| "statusMonth": "short", | |
| "statusDay": "numeric", | |
| "statusHourCycle": "h23", | |
| "statusTimeFormat": "h:m", | |
| "enableGlobalContextStore": true | |
| }, | |
| { | |
| "id": "18ddc65246da7573", | |
| "type": "global-config", | |
| "env": [], | |
| "modules": { | |
| "node-red-contrib-home-assistant-websocket": "0.80.3" | |
| } | |
| } | |
| ] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment