[{"data":1,"prerenderedAt":1105},["ShallowReactive",2],{"manifest":3,"hreflang-alternates":901,"doc-pl-volang\u002Fbiblioteka-standardowa":904},{"site":4,"branding":6,"contact":8,"organization_schema":10,"languages":54,"website":62,"docs":187,"blog":867},{"title":5},"Voldeno",{"logo":7,"company_name":5},"\u002Fimages\u002Flogo\u002Flogo_310.png",{"email":9},"contact@voldeno.com",{"schema_name":5,"legal_name":11,"founding_date":12,"tax_id":13,"identifiers":14,"address":21,"primary_email":9,"knows_about":26,"contact_points":39,"contact_point_available_languages":51},"Voldeno sp. z o.o.","2024","PL7252346262",[15,18],{"name":16,"value":17},"KRS","0001123648",{"name":19,"value":20},"REGON","52946949200000",{"street_address":22,"address_locality":23,"postal_code":24,"address_country":25},"Ogrodowa 8, Lobby B, 3p.","Łódź","91-062","PL",{"en":27,"pl":34},[28,29,30,31,32,33],"Smart Home","Smart Home Systems","Smart Home Automation","Building Automation","IoT","Home Automation System",[35,28,36,37,32,38],"Inteligentny dom","System Smart Home","Automatyka budynkowa","System automatyki domowej",[40,43,46,49],{"email":41,"contact_type":42},"support@voldeno.com","technical support",{"email":44,"contact_type":45},"sales@voldeno.com","sales",{"email":47,"contact_type":48},"partners@voldeno.com","partnerships",{"email":9,"contact_type":50},"customer service",[52,53],"Polish","English",[55,59],{"code":56,"name":57,"default":58},"pl","Polski",true,{"code":60,"name":53,"default":61},"en",false,{"enabled":58,"navigation":63,"path_keys":158,"section_index_slugs":180},{"en":64,"pl":117},[65,71,77,82,91,96,101,112],{"title":66,"slug":67,"path":68,"order":69,"template":70},"Voldeno: Smart Home, Building Automation","index","en\u002Findex",0,"home",{"title":72,"slug":73,"path":74,"order":75,"template":76},"Your Home","your-home","en\u002Fyour-home",1,"homeowners",{"title":78,"slug":79,"path":80,"order":81,"template":79},"For Professionals","professionals","en\u002Fprofessionals",2,{"title":83,"slug":84,"path":85,"order":86,"children":87},"Products","products","en\u002Fproducts",3,[88],{"title":89,"slug":67,"path":90,"order":75,"template":84},"Smart Home Products​ from Voldeno","en\u002Fproducts\u002Findex",{"title":92,"slug":93,"path":94,"order":95,"template":93},"Contact","contact","en\u002Fcontact",4,{"title":97,"slug":98,"path":99,"order":100,"template":98},"About Us","about","en\u002Fabout",5,{"title":102,"slug":103,"path":104,"order":105,"children":106},"Legal","legal","en\u002Flegal",6,[107],{"title":108,"slug":109,"path":110,"order":75,"template":111},"Privacy Policy","privacy-policy","en\u002Flegal\u002Fprivacy-policy","page",{"title":113,"slug":114,"path":115,"order":116},"Projects","projects","en\u002Fprojects",999,[118,121,125,129,137,141,145,154],{"title":119,"slug":67,"path":120,"order":69,"template":70},"Smart Home, Automatyka budynkowa - Voldeno","pl\u002Findex",{"title":122,"slug":123,"path":124,"order":75,"template":76},"Twój Dom","twoj-dom","pl\u002Ftwoj-dom",{"title":126,"slug":127,"path":128,"order":81,"template":79},"Dla Profesjonalistów","dla-profesjonalistow","pl\u002Fdla-profesjonalistow",{"title":130,"slug":131,"path":132,"order":86,"children":133},"Produkty","produkty","pl\u002Fprodukty",[134],{"title":135,"slug":67,"path":136,"order":75,"template":84},"Inteligentne produkty​ Smart Home Voldeno","pl\u002Fprodukty\u002Findex",{"title":138,"slug":139,"path":140,"order":95,"template":93},"Kontakt","kontakt","pl\u002Fkontakt",{"title":142,"slug":143,"path":144,"order":100,"template":98},"O nas","o-nas","pl\u002Fo-nas",{"title":146,"slug":147,"path":148,"order":105,"children":149},"Prawne","prawne","pl\u002Fprawne",[150],{"title":151,"slug":152,"path":153,"order":75,"template":111},"Polityka prywatności","polityka-prywatnosci","pl\u002Fprawne\u002Fpolityka-prywatnosci",{"title":155,"slug":156,"path":157,"order":116},"Realizacje","realizacje","pl\u002Frealizacje",{"module_hub":159,"module_analog_input":162,"module_io":165,"privacy":168,"module_relay":171,"downloads":174,"module_1wire":177},{"pl":160,"en":161},"produkty\u002Fhub","products\u002Fhub",{"pl":163,"en":164},"produkty\u002Fanalog-input","products\u002Fanalog-input",{"en":166,"pl":167},"products\u002Fio","produkty\u002Fio",{"pl":169,"en":170},"prawne\u002Fpolityka-prywatnosci","legal\u002Fprivacy-policy",{"en":172,"pl":173},"products\u002Frelay","produkty\u002Frelay",{"pl":175,"en":176},"pobieranie","downloads",{"en":178,"pl":179},"products\u002F1wire","produkty\u002F1wire",{"pl":181,"en":184},{"produkty":182,"realizacje":183},"produkty\u002Findex","realizacje\u002Findex",{"projects":185,"products":186},"projects\u002Findex","products\u002Findex",{"enabled":58,"navigation":188,"section_redirects":842},{"pl":189,"en":610},[190,203,228,241,558,572,585,595,605],{"title":191,"slug":192,"path":193,"order":75,"children":194},"Pierwsze kroki","pierwsze-kroki","pl\u002Fdocs\u002Fpierwsze-kroki",[195,199],{"title":196,"slug":197,"path":198,"order":75},"Podstawowe pojęcia i terminologia","pojecia","pl\u002Fdocs\u002Fpierwsze-kroki\u002Fpojecia",{"title":200,"slug":201,"path":202,"order":81},"Przegląd systemu dla instalatorów","przeglad-systemu","pl\u002Fdocs\u002Fpierwsze-kroki\u002Fprzeglad-systemu",{"title":204,"slug":205,"path":206,"order":81,"children":207},"Moduły i peryferia","moduly","pl\u002Fdocs\u002Fmoduly",[208,212,216,220,224],{"title":209,"slug":210,"path":211,"order":75},"Okablowanie modułu HUB","okablowanie-hub","pl\u002Fdocs\u002Fmoduly\u002Fokablowanie-hub",{"title":213,"slug":214,"path":215,"order":81},"Okablowanie modułu I\u002FO","okablowanie-io","pl\u002Fdocs\u002Fmoduly\u002Fokablowanie-io",{"title":217,"slug":218,"path":219,"order":86},"Okablowanie modułu RELAY","okablowanie-relay","pl\u002Fdocs\u002Fmoduly\u002Fokablowanie-relay",{"title":221,"slug":222,"path":223,"order":95},"Okablowanie modułu 1-Wire","okablowanie-1wire","pl\u002Fdocs\u002Fmoduly\u002Fokablowanie-1wire",{"title":225,"slug":226,"path":227,"order":100},"Okablowanie modułu Analog Input","okablowanie-analog-input","pl\u002Fdocs\u002Fmoduly\u002Fokablowanie-analog-input",{"title":229,"slug":230,"path":231,"order":86,"children":232},"Wytyczne okablowania","okablowanie","pl\u002Fdocs\u002Fokablowanie",[233,237],{"title":234,"slug":235,"path":236,"order":75},"Topologia i okablowanie magistrali","topologia-magistrali","pl\u002Fdocs\u002Fokablowanie\u002Ftopologia-magistrali",{"title":238,"slug":239,"path":240,"order":81},"Dobór i dystrybucja zasilania","zasilanie","pl\u002Fdocs\u002Fokablowanie\u002Fzasilanie",{"title":242,"slug":243,"path":244,"order":95,"children":245},"Bloki logiczne","bloki-logiczne","pl\u002Fdocs\u002Fbloki-logiczne",[246,252,303,543],{"title":247,"slug":248,"path":249,"order":69,"template":250,"translation_key":251},"Przegląd","przeglad","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprzeglad","logic-block-index","logic-blocks-overview",{"title":253,"slug":254,"path":255,"order":75,"children":256},"Wejścia","input","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput",[257,263,268,273,278,283,288,293,298],{"title":258,"slug":259,"path":260,"order":69,"template":261,"translation_key":262},"Binary input","binary_input","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fbinary_input","logic-block","logic-block-binary_input",{"title":264,"slug":265,"path":266,"order":69,"template":261,"translation_key":267},"Boolean constant","boolean_constant","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fboolean_constant","logic-block-boolean_constant",{"title":269,"slug":270,"path":271,"order":69,"template":261,"translation_key":272},"Numeric constant","numeric_constant","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fnumeric_constant","logic-block-numeric_constant",{"title":274,"slug":275,"path":276,"order":69,"template":261,"translation_key":277},"Numeric input","numeric_input","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fnumeric_input","logic-block-numeric_input",{"title":279,"slug":280,"path":281,"order":69,"template":261,"translation_key":282},"Mode monitor","operation_mode_monitor","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Foperation_mode_monitor","logic-block-operation_mode_monitor",{"title":284,"slug":285,"path":286,"order":69,"template":261,"translation_key":287},"PulseAt","pulse_at","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fpulse_at","logic-block-pulse_at",{"title":289,"slug":290,"path":291,"order":69,"template":261,"translation_key":292},"Schedule","schedule","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fschedule","logic-block-schedule",{"title":294,"slug":295,"path":296,"order":69,"template":261,"translation_key":297},"String constant","string_constant","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fstring_constant","logic-block-string_constant",{"title":299,"slug":300,"path":301,"order":69,"template":261,"translation_key":302},"Switch","switch","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fswitch","logic-block-switch",{"title":304,"slug":305,"path":306,"order":81,"children":307},"Przetwarzanie","process","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess",[308,313,318,323,328,333,338,343,348,353,358,363,368,373,378,383,388,393,398,403,408,413,418,423,428,433,438,443,448,453,458,463,468,473,478,483,488,493,498,503,508,513,518,523,528,533,538],{"title":309,"slug":310,"path":311,"order":69,"template":261,"translation_key":312},"Binary limiter","binary_limiter","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fbinary_limiter","logic-block-binary_limiter",{"title":314,"slug":315,"path":316,"order":69,"template":261,"translation_key":317},"Boolean to string","boolean_to_string","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fboolean_to_string","logic-block-boolean_to_string",{"title":319,"slug":320,"path":321,"order":69,"template":261,"translation_key":322},"Climate regulator","climate_regulator","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fclimate_regulator","logic-block-climate_regulator",{"title":324,"slug":325,"path":326,"order":69,"template":261,"translation_key":327},"Climate regulator hub","climate_regulator_hub","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fclimate_regulator_hub","logic-block-climate_regulator_hub",{"title":329,"slug":330,"path":331,"order":69,"template":261,"translation_key":332},"Delay","delay","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fdelay","logic-block-delay",{"title":334,"slug":335,"path":336,"order":69,"template":261,"translation_key":337},"Delayed Pulse","delayed_pulse","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fdelayed_pulse","logic-block-delayed_pulse",{"title":339,"slug":340,"path":341,"order":69,"template":261,"translation_key":342},"Door, window","door_window_monitor","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fdoor_window_monitor","logic-block-door_window_monitor",{"title":344,"slug":345,"path":346,"order":69,"template":261,"translation_key":347},"Edge detector","edge_detector","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fedge_detector","logic-block-edge_detector",{"title":349,"slug":350,"path":351,"order":69,"template":261,"translation_key":352},"HTTP Request","http_request","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fhttp_request","logic-block-http_request",{"title":354,"slug":355,"path":356,"order":69,"template":261,"translation_key":357},"Hysteresis","hysteresis","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fhysteresis","logic-block-hysteresis",{"title":359,"slug":360,"path":361,"order":69,"template":261,"translation_key":362},"Irrigation","irrigation","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Firrigation","logic-block-irrigation",{"title":364,"slug":365,"path":366,"order":69,"template":261,"translation_key":367},"JSON Get Boolean","json_get_boolean","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fjson_get_boolean","logic-block-json_get_boolean",{"title":369,"slug":370,"path":371,"order":69,"template":261,"translation_key":372},"JSON Get Number","json_get_number","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fjson_get_number","logic-block-json_get_number",{"title":374,"slug":375,"path":376,"order":69,"template":261,"translation_key":377},"JSON Get String","json_get_string","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fjson_get_string","logic-block-json_get_string",{"title":379,"slug":380,"path":381,"order":69,"template":261,"translation_key":382},"Level to pulse","level_to_pulse","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Flevel_to_pulse","logic-block-level_to_pulse",{"title":384,"slug":385,"path":386,"order":69,"template":261,"translation_key":387},"Logic::And","logic_and","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Flogic_and","logic-block-logic_and",{"title":389,"slug":390,"path":391,"order":69,"template":261,"translation_key":392},"Logic::Not","logic_not","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Flogic_not","logic-block-logic_not",{"title":394,"slug":395,"path":396,"order":69,"template":261,"translation_key":397},"Logic::Or","logic_or","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Flogic_or","logic-block-logic_or",{"title":399,"slug":400,"path":401,"order":69,"template":261,"translation_key":402},"Math::Abs","math_abs","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_abs","logic-block-math_abs",{"title":404,"slug":405,"path":406,"order":69,"template":261,"translation_key":407},"Math::Add","math_add","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_add","logic-block-math_add",{"title":409,"slug":410,"path":411,"order":69,"template":261,"translation_key":412},"Math::Average","math_average","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_average","logic-block-math_average",{"title":414,"slug":415,"path":416,"order":69,"template":261,"translation_key":417},"Math::Ceil","math_ceil","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_ceil","logic-block-math_ceil",{"title":419,"slug":420,"path":421,"order":69,"template":261,"translation_key":422},"Math::Divide","math_divide","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_divide","logic-block-math_divide",{"title":424,"slug":425,"path":426,"order":69,"template":261,"translation_key":427},"Math::Floor","math_floor","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_floor","logic-block-math_floor",{"title":429,"slug":430,"path":431,"order":69,"template":261,"translation_key":432},"Math::Max","math_max","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_max","logic-block-math_max",{"title":434,"slug":435,"path":436,"order":69,"template":261,"translation_key":437},"Math::Min","math_min","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_min","logic-block-math_min",{"title":439,"slug":440,"path":441,"order":69,"template":261,"translation_key":442},"Math::Modulo","math_modulo","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_modulo","logic-block-math_modulo",{"title":444,"slug":445,"path":446,"order":69,"template":261,"translation_key":447},"Math::Multiply","math_multiply","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_multiply","logic-block-math_multiply",{"title":449,"slug":450,"path":451,"order":69,"template":261,"translation_key":452},"Math::Random","math_random","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_random","logic-block-math_random",{"title":454,"slug":455,"path":456,"order":69,"template":261,"translation_key":457},"Math::Round","math_round","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_round","logic-block-math_round",{"title":459,"slug":460,"path":461,"order":69,"template":261,"translation_key":462},"Math::Subtract","math_subtract","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_subtract","logic-block-math_subtract",{"title":464,"slug":465,"path":466,"order":69,"template":261,"translation_key":467},"Motor axis","motor_axis","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmotor_axis","logic-block-motor_axis",{"title":469,"slug":470,"path":471,"order":69,"template":261,"translation_key":472},"Moving average","moving_average","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmoving_average","logic-block-moving_average",{"title":474,"slug":475,"path":476,"order":69,"template":261,"translation_key":477},"Number to string","number_to_string","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fnumber_to_string","logic-block-number_to_string",{"title":479,"slug":480,"path":481,"order":69,"template":261,"translation_key":482},"Numeric latch","numeric_latch","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fnumeric_latch","logic-block-numeric_latch",{"title":484,"slug":485,"path":486,"order":69,"template":261,"translation_key":487},"Numeric predicate","numeric_predicate","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fnumeric_predicate","logic-block-numeric_predicate",{"title":489,"slug":490,"path":491,"order":69,"template":261,"translation_key":492},"Numeric throttle","numeric_throttle","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fnumeric_throttle","logic-block-numeric_throttle",{"title":494,"slug":495,"path":496,"order":69,"template":261,"translation_key":497},"PubSub::Publish","pubsub","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fpubsub","logic-block-pubsub",{"title":499,"slug":500,"path":501,"order":69,"template":261,"translation_key":502},"Pulse counter","pulse_counter","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fpulse_counter","logic-block-pulse_counter",{"title":504,"slug":505,"path":506,"order":69,"template":261,"translation_key":507},"Pulse gate","pulse_gate","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fpulse_gate","logic-block-pulse_gate",{"title":509,"slug":510,"path":511,"order":69,"template":261,"translation_key":512},"Pulse throttle","pulse_throttle","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fpulse_throttle","logic-block-pulse_throttle",{"title":514,"slug":515,"path":516,"order":69,"template":261,"translation_key":517},"Sequencer","sequencer","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fsequencer","logic-block-sequencer",{"title":519,"slug":520,"path":521,"order":69,"template":261,"translation_key":522},"Shading","shading","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fshading","logic-block-shading",{"title":524,"slug":525,"path":526,"order":69,"template":261,"translation_key":527},"String format","string_format","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fstring_format","logic-block-string_format",{"title":529,"slug":530,"path":531,"order":69,"template":261,"translation_key":532},"String latch","string_latch","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fstring_latch","logic-block-string_latch",{"title":534,"slug":535,"path":536,"order":69,"template":261,"translation_key":537},"Toggle","toggle","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Ftoggle","logic-block-toggle",{"title":539,"slug":540,"path":541,"order":69,"template":261,"translation_key":542},"Variable Delayed Pulse","variable_delayed_pulse","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fvariable_delayed_pulse","logic-block-variable_delayed_pulse",{"title":544,"slug":545,"path":546,"order":86,"children":547},"Wyjścia","output","pl\u002Fdocs\u002Fbloki-logiczne\u002Foutput",[548,553],{"title":549,"slug":550,"path":551,"order":69,"template":261,"translation_key":552},"Mode controller","operation_mode_controller","pl\u002Fdocs\u002Fbloki-logiczne\u002Foutput\u002Foperation_mode_controller","logic-block-operation_mode_controller",{"title":554,"slug":555,"path":556,"order":69,"template":261,"translation_key":557},"Relay","relay","pl\u002Fdocs\u002Fbloki-logiczne\u002Foutput\u002Frelay","logic-block-relay",{"title":559,"slug":560,"path":561,"order":100,"children":562},"Język programowania Volang","volang","pl\u002Fdocs\u002Fvolang",[563,567],{"title":564,"slug":565,"path":566,"order":75},"Język Volang","jezyk","pl\u002Fdocs\u002Fvolang\u002Fjezyk",{"title":568,"slug":569,"path":570,"order":81,"template":571},"Biblioteka standardowa","biblioteka-standardowa","pl\u002Fdocs\u002Fvolang\u002Fbiblioteka-standardowa","api-reference",{"title":573,"slug":574,"path":575,"order":105,"children":576},"Oprogramowanie","oprogramowanie","pl\u002Fdocs\u002Foprogramowanie",[577,581],{"title":578,"slug":579,"path":580,"order":75},"Voldeno Studio – Instalacja i przewodnik","studio","pl\u002Fdocs\u002Foprogramowanie\u002Fstudio",{"title":582,"slug":583,"path":584,"order":81},"Voldeno Studio – Harmonogramy","schedules","pl\u002Fdocs\u002Foprogramowanie\u002Fschedules",{"title":586,"slug":587,"path":588,"order":589,"children":590},"Poradniki","poradniki","pl\u002Fdocs\u002Fporadniki",7,[591],{"title":592,"slug":593,"path":594,"order":75},"System nawadniania","nawadnianie","pl\u002Fdocs\u002Fporadniki\u002Fnawadnianie",{"title":596,"slug":597,"path":598,"order":599,"children":600},"Diagnostyka i rozwiązywanie problemów","diagnostyka","pl\u002Fdocs\u002Fdiagnostyka",8,[601],{"title":602,"slug":603,"path":604,"order":75},"Rozwiązywanie problemów z komunikacją magistrali","komunikacja-magistrali","pl\u002Fdocs\u002Fdiagnostyka\u002Fkomunikacja-magistrali",{"title":606,"slug":607,"path":608,"order":609},"Często zadawane pytania","faq","pl\u002Fdocs\u002Ffaq",9,[611,624,649,662,799,811,822,830,839],{"title":612,"slug":613,"path":614,"order":75,"children":615},"Getting Started","getting-started","en\u002Fdocs\u002Fgetting-started",[616,620],{"title":617,"slug":618,"path":619,"order":75},"Core Concepts and Terminology","concepts","en\u002Fdocs\u002Fgetting-started\u002Fconcepts",{"title":621,"slug":622,"path":623,"order":81},"System Overview for Installers","system-overview","en\u002Fdocs\u002Fgetting-started\u002Fsystem-overview",{"title":625,"slug":626,"path":627,"order":81,"children":628},"Modules & Peripherals","modules","en\u002Fdocs\u002Fmodules",[629,633,637,641,645],{"title":630,"slug":631,"path":632,"order":75},"Hub Module Wiring","hub-wiring","en\u002Fdocs\u002Fmodules\u002Fhub-wiring",{"title":634,"slug":635,"path":636,"order":81},"I\u002FO Module Wiring","io-wiring","en\u002Fdocs\u002Fmodules\u002Fio-wiring",{"title":638,"slug":639,"path":640,"order":86},"Relay Module Wiring","relay-wiring","en\u002Fdocs\u002Fmodules\u002Frelay-wiring",{"title":642,"slug":643,"path":644,"order":95},"1-Wire Module Wiring","1wire-wiring","en\u002Fdocs\u002Fmodules\u002F1wire-wiring",{"title":646,"slug":647,"path":648,"order":100},"Analog Input Module Wiring","analog-input-wiring","en\u002Fdocs\u002Fmodules\u002Fanalog-input-wiring",{"title":650,"slug":651,"path":652,"order":86,"children":653},"Wiring Guidelines","wiring","en\u002Fdocs\u002Fwiring",[654,658],{"title":655,"slug":656,"path":657,"order":75},"Bus Topology & Wiring","bus-topology","en\u002Fdocs\u002Fwiring\u002Fbus-topology",{"title":659,"slug":660,"path":661,"order":81},"Power Supply Sizing and Distribution","power-supply","en\u002Fdocs\u002Fwiring\u002Fpower-supply",{"title":663,"slug":664,"path":665,"order":95,"children":666},"Logic Blocks","logic-blocks","en\u002Fdocs\u002Flogic-blocks",[667,671,693,791],{"title":668,"slug":669,"path":670,"order":69,"template":250,"translation_key":251},"Overview","overview","en\u002Fdocs\u002Flogic-blocks\u002Foverview",{"title":672,"slug":254,"path":673,"order":75,"children":674},"Input","en\u002Fdocs\u002Flogic-blocks\u002Finput",[675,677,679,681,683,685,687,689,691],{"title":258,"slug":259,"path":676,"order":69,"template":261,"translation_key":262},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fbinary_input",{"title":264,"slug":265,"path":678,"order":69,"template":261,"translation_key":267},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fboolean_constant",{"title":269,"slug":270,"path":680,"order":69,"template":261,"translation_key":272},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fnumeric_constant",{"title":274,"slug":275,"path":682,"order":69,"template":261,"translation_key":277},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fnumeric_input",{"title":279,"slug":280,"path":684,"order":69,"template":261,"translation_key":282},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Foperation_mode_monitor",{"title":284,"slug":285,"path":686,"order":69,"template":261,"translation_key":287},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fpulse_at",{"title":289,"slug":290,"path":688,"order":69,"template":261,"translation_key":292},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fschedule",{"title":294,"slug":295,"path":690,"order":69,"template":261,"translation_key":297},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fstring_constant",{"title":299,"slug":300,"path":692,"order":69,"template":261,"translation_key":302},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fswitch",{"title":694,"slug":305,"path":695,"order":81,"children":696},"Process","en\u002Fdocs\u002Flogic-blocks\u002Fprocess",[697,699,701,703,705,707,709,711,713,715,717,719,721,723,725,727,729,731,733,735,737,739,741,743,745,747,749,751,753,755,757,759,761,763,765,767,769,771,773,775,777,779,781,783,785,787,789],{"title":309,"slug":310,"path":698,"order":69,"template":261,"translation_key":312},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fbinary_limiter",{"title":314,"slug":315,"path":700,"order":69,"template":261,"translation_key":317},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fboolean_to_string",{"title":319,"slug":320,"path":702,"order":69,"template":261,"translation_key":322},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fclimate_regulator",{"title":324,"slug":325,"path":704,"order":69,"template":261,"translation_key":327},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fclimate_regulator_hub",{"title":329,"slug":330,"path":706,"order":69,"template":261,"translation_key":332},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fdelay",{"title":334,"slug":335,"path":708,"order":69,"template":261,"translation_key":337},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fdelayed_pulse",{"title":339,"slug":340,"path":710,"order":69,"template":261,"translation_key":342},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fdoor_window_monitor",{"title":344,"slug":345,"path":712,"order":69,"template":261,"translation_key":347},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fedge_detector",{"title":349,"slug":350,"path":714,"order":69,"template":261,"translation_key":352},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fhttp_request",{"title":354,"slug":355,"path":716,"order":69,"template":261,"translation_key":357},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fhysteresis",{"title":359,"slug":360,"path":718,"order":69,"template":261,"translation_key":362},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Firrigation",{"title":364,"slug":365,"path":720,"order":69,"template":261,"translation_key":367},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fjson_get_boolean",{"title":369,"slug":370,"path":722,"order":69,"template":261,"translation_key":372},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fjson_get_number",{"title":374,"slug":375,"path":724,"order":69,"template":261,"translation_key":377},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fjson_get_string",{"title":379,"slug":380,"path":726,"order":69,"template":261,"translation_key":382},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Flevel_to_pulse",{"title":384,"slug":385,"path":728,"order":69,"template":261,"translation_key":387},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Flogic_and",{"title":389,"slug":390,"path":730,"order":69,"template":261,"translation_key":392},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Flogic_not",{"title":394,"slug":395,"path":732,"order":69,"template":261,"translation_key":397},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Flogic_or",{"title":399,"slug":400,"path":734,"order":69,"template":261,"translation_key":402},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_abs",{"title":404,"slug":405,"path":736,"order":69,"template":261,"translation_key":407},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_add",{"title":409,"slug":410,"path":738,"order":69,"template":261,"translation_key":412},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_average",{"title":414,"slug":415,"path":740,"order":69,"template":261,"translation_key":417},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_ceil",{"title":419,"slug":420,"path":742,"order":69,"template":261,"translation_key":422},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_divide",{"title":424,"slug":425,"path":744,"order":69,"template":261,"translation_key":427},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_floor",{"title":429,"slug":430,"path":746,"order":69,"template":261,"translation_key":432},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_max",{"title":434,"slug":435,"path":748,"order":69,"template":261,"translation_key":437},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_min",{"title":439,"slug":440,"path":750,"order":69,"template":261,"translation_key":442},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_modulo",{"title":444,"slug":445,"path":752,"order":69,"template":261,"translation_key":447},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_multiply",{"title":449,"slug":450,"path":754,"order":69,"template":261,"translation_key":452},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_random",{"title":454,"slug":455,"path":756,"order":69,"template":261,"translation_key":457},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_round",{"title":459,"slug":460,"path":758,"order":69,"template":261,"translation_key":462},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_subtract",{"title":464,"slug":465,"path":760,"order":69,"template":261,"translation_key":467},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmotor_axis",{"title":469,"slug":470,"path":762,"order":69,"template":261,"translation_key":472},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmoving_average",{"title":474,"slug":475,"path":764,"order":69,"template":261,"translation_key":477},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fnumber_to_string",{"title":479,"slug":480,"path":766,"order":69,"template":261,"translation_key":482},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fnumeric_latch",{"title":484,"slug":485,"path":768,"order":69,"template":261,"translation_key":487},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fnumeric_predicate",{"title":489,"slug":490,"path":770,"order":69,"template":261,"translation_key":492},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fnumeric_throttle",{"title":494,"slug":495,"path":772,"order":69,"template":261,"translation_key":497},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fpubsub",{"title":499,"slug":500,"path":774,"order":69,"template":261,"translation_key":502},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fpulse_counter",{"title":504,"slug":505,"path":776,"order":69,"template":261,"translation_key":507},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fpulse_gate",{"title":509,"slug":510,"path":778,"order":69,"template":261,"translation_key":512},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fpulse_throttle",{"title":514,"slug":515,"path":780,"order":69,"template":261,"translation_key":517},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fsequencer",{"title":519,"slug":520,"path":782,"order":69,"template":261,"translation_key":522},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fshading",{"title":524,"slug":525,"path":784,"order":69,"template":261,"translation_key":527},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fstring_format",{"title":529,"slug":530,"path":786,"order":69,"template":261,"translation_key":532},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fstring_latch",{"title":534,"slug":535,"path":788,"order":69,"template":261,"translation_key":537},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Ftoggle",{"title":539,"slug":540,"path":790,"order":69,"template":261,"translation_key":542},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fvariable_delayed_pulse",{"title":792,"slug":545,"path":793,"order":86,"children":794},"Output","en\u002Fdocs\u002Flogic-blocks\u002Foutput",[795,797],{"title":549,"slug":550,"path":796,"order":69,"template":261,"translation_key":552},"en\u002Fdocs\u002Flogic-blocks\u002Foutput\u002Foperation_mode_controller",{"title":554,"slug":555,"path":798,"order":69,"template":261,"translation_key":557},"en\u002Fdocs\u002Flogic-blocks\u002Foutput\u002Frelay",{"title":800,"slug":560,"path":801,"order":100,"children":802},"Volang Programming Language","en\u002Fdocs\u002Fvolang",[803,807],{"title":804,"slug":805,"path":806,"order":75},"The Volang Language","language","en\u002Fdocs\u002Fvolang\u002Flanguage",{"title":808,"slug":809,"path":810,"order":81,"template":571},"Standard Library","stdlib","en\u002Fdocs\u002Fvolang\u002Fstdlib",{"title":812,"slug":813,"path":814,"order":105,"children":815},"Software & Tools","software","en\u002Fdocs\u002Fsoftware",[816,819],{"title":817,"slug":579,"path":818,"order":75},"Voldeno Studio – Installation and Walkthrough","en\u002Fdocs\u002Fsoftware\u002Fstudio",{"title":820,"slug":583,"path":821,"order":81},"Voldeno Studio – Schedules","en\u002Fdocs\u002Fsoftware\u002Fschedules",{"title":823,"slug":824,"path":825,"order":589,"children":826},"How-to Guides & Recipes","how-to","en\u002Fdocs\u002Fhow-to",[827],{"title":828,"slug":360,"path":829,"order":75},"Irrigation System","en\u002Fdocs\u002Fhow-to\u002Firrigation",{"title":831,"slug":832,"path":833,"order":599,"children":834},"Troubleshooting & Diagnostics","troubleshooting","en\u002Fdocs\u002Ftroubleshooting",[835],{"title":836,"slug":837,"path":838,"order":75},"Bus Communication Troubleshooting","bus-communication","en\u002Fdocs\u002Ftroubleshooting\u002Fbus-communication",{"title":840,"slug":607,"path":841,"order":609},"Frequently Asked Questions","en\u002Fdocs\u002Ffaq",{"pl":843,"en":855},{"bloki-logiczne\u002Fprocess":844,"bloki-logiczne\u002Finput":845,"diagnostyka":846,"okablowanie":847,"moduly":848,"bloki-logiczne\u002Foutput":849,"oprogramowanie":850,"pierwsze-kroki":851,"poradniki":852,"bloki-logiczne":853,"volang":854},"bloki-logiczne\u002Fprocess\u002Fbinary_limiter","bloki-logiczne\u002Finput\u002Fbinary_input","diagnostyka\u002Fkomunikacja-magistrali","okablowanie\u002Ftopologia-magistrali","moduly\u002Fokablowanie-hub","bloki-logiczne\u002Foutput\u002Foperation_mode_controller","oprogramowanie\u002Fstudio","pierwsze-kroki\u002Fpojecia","poradniki\u002Fnawadnianie","bloki-logiczne\u002Fprzeglad","volang\u002Fjezyk",{"getting-started":856,"logic-blocks\u002Foutput":857,"troubleshooting":858,"logic-blocks":859,"volang":860,"logic-blocks\u002Fprocess":861,"logic-blocks\u002Finput":862,"modules":863,"software":864,"how-to":865,"wiring":866},"getting-started\u002Fconcepts","logic-blocks\u002Foutput\u002Foperation_mode_controller","troubleshooting\u002Fbus-communication","logic-blocks\u002Foverview","volang\u002Flanguage","logic-blocks\u002Fprocess\u002Fbinary_limiter","logic-blocks\u002Finput\u002Fbinary_input","modules\u002Fhub-wiring","software\u002Fstudio","how-to\u002Firrigation","wiring\u002Fbus-topology",{"enabled":58,"navigation":868},{"en":869,"pl":888},[870,876,882],{"title":871,"slug":872,"path":873,"order":69,"date":874,"translation_key":875},"We are ready! Hundreds of Voldeno modules prepared for smart home deployment.","we-are-ready","en\u002Fblog\u002Fwe-are-ready","2025-08-17","2025_08_17_we_are_ready",{"title":877,"slug":878,"path":879,"order":69,"date":880,"translation_key":881},"New Voldeno 1-Wire Temperature Sensor - Compact, Reliable, and Built for Large-Scale Installations","new-voldeno-1-wire-temperature-sensor-compact-reliable-and-built-for-large-scale-installations","en\u002Fblog\u002Fnew-voldeno-1-wire-temperature-sensor-compact-reliable-and-built-for-large-scale-installations","2025-04-25","2025_04_25_new_voldeno_1wire_temperature_sensor",{"title":883,"slug":884,"path":885,"order":69,"date":886,"translation_key":887},"Discover the Future of Smart Homes with Voldeno","future_of_smart_homes","en\u002Fblog\u002Ffuture_of_smart_homes","2024-10-18","2024_10_18_future_of_smart_homes",[889,893,897],{"title":890,"slug":891,"path":892,"order":69,"date":874,"translation_key":875},"Jesteśmy gotowi! Setki modułów Voldeno przygotowanych do wdrożenia w inteligentnych domach.","jestesmy-gotowi-setki-modulow-voldeno-przygotowanych-do-wdrozenia-w-inteligentnych-domach","pl\u002Fblog\u002Fjestesmy-gotowi-setki-modulow-voldeno-przygotowanych-do-wdrozenia-w-inteligentnych-domach",{"title":894,"slug":895,"path":896,"order":69,"date":880,"translation_key":881},"Nowy czujnik temperatury Voldeno 1-Wire - kompaktowy, niezawodny i stworzony do dużych instalacji","nowy-czujnik-temperatury-1-wire-voldeno-kompaktowy-niezawodny-i-zaprojektowany-do-instalacji-na-duza-skale","pl\u002Fblog\u002Fnowy-czujnik-temperatury-1-wire-voldeno-kompaktowy-niezawodny-i-zaprojektowany-do-instalacji-na-duza-skale",{"title":898,"slug":899,"path":900,"order":69,"date":886,"translation_key":887},"Odkryj przyszłość inteligentnych domów z Voldeno","odkryj-przyszlosc-inteligentnych-domow-z-voldeno","pl\u002Fblog\u002Fodkryj-przyszlosc-inteligentnych-domow-z-voldeno",{"pl":902,"en":903,"xDefault":902},"https:\u002F\u002Fvoldeno.com\u002Fpl\u002Fdocs\u002Fvolang\u002Fbiblioteka-standardowa","https:\u002F\u002Fvoldeno.com\u002Fen\u002Fdocs\u002Fvolang\u002Fstdlib",{"slug":569,"title":568,"description":905,"tags":906,"content_html":909,"headings":910,"template":571,"order":81,"extra":1104},"Dokumentacja referencyjna funkcji i modułów biblioteki standardowej Volang.",[560,809,907,908],"referencja","funkcje","\u003Ch1 id=\"biblioteka-standardowa\">\u003Ca href=\"#biblioteka-standardowa\" class=\"anchor\">#\u003C\u002Fa> Biblioteka standardowa\u003C\u002Fh1>\n\u003Cp>Biblioteka standardowa Volang zapewnia kompleksowy zestaw wbudowanych funkcji niezbędnych do modyfikowania tekstu, wykonywania operacji matematycznych i innych typowych operacji. Funkcje te są dostępne globalnie w każdym skrypcie.\u003C\u002Fp>\n\u003Ch2 id=\"operacje-wejsciowe\">\u003Ca href=\"#operacje-wejsciowe\" class=\"anchor\">#\u003C\u002Fa> Operacje wejściowe\u003C\u002Fh2>\n\u003Cp>Ta sekcja opisuje funkcje do odczytu danych wejściowych w ramach bloku logicznego. Każdy blok logiczny może definiować jeden lub więcej kanałów wejściowych. Gdy wartość wejściowa się zmieni, skrypt bloku zostaje wykonany. Funkcje te pozwalają skryptowi określić, które wejście wywołało wykonanie, oraz odczytać bieżące wartości wszystkich wejść.\u003C\u002Fp>\n\u003Ch3 id=\"input-channel\">\u003Ca href=\"#input-channel\" class=\"anchor\">#\u003C\u002Fa> input::channel\u003C\u002Fh3>\n\u003Cp>Zwraca identyfikator kanału wejściowego, który wywołał bieżące wykonanie skryptu. Gdy blok posiada wiele wejść, ta funkcja jest niezbędna do określenia, które wejście spowodowało uruchomienie bloku, umożliwiając obsługę każdego wejścia w inny sposób.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Brak.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Łańcuch zawierający identyfikator wejścia, które wywołało wykonanie.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"variable\">channel\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">input::channel\u003C\u002Fspan>()\n\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">channel\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"string\">\"input\"\u003C\u002Fspan>) {\n    \u003Cspan class=\"comment\">\u002F\u002F Główne wejście przełączające zostało wyzwolone\u003C\u002Fspan>\n    ...\n} \u003Cspan class=\"keyword\">else\u003C\u002Fspan> \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">channel\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"string\">\"on\"\u003C\u002Fspan>) {\n    \u003Cspan class=\"comment\">\u002F\u002F Dedykowane wejście \"on\" zostało wyzwolone\u003C\u002Fspan>\n    ...\n} \u003Cspan class=\"keyword\">else\u003C\u002Fspan> \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">channel\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"string\">\"off\"\u003C\u002Fspan>) {\n    \u003Cspan class=\"comment\">\u002F\u002F Dedykowane wejście \"off\" zostało wyzwolone\u003C\u002Fspan>\n    ...\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"input-value\">\u003Ca href=\"#input-value\" class=\"anchor\">#\u003C\u002Fa> input::value\u003C\u002Fh3>\n\u003Cp>Zwraca wartość wejścia, które wywołało bieżące wykonanie skryptu. Typ zwracany zależy od zdefiniowanego typu wejścia (boolean, number lub string). Użyj tej funkcji razem z \u003Ccode>input::channel()\u003C\u002Fcode>, aby określić zarówno które wejście się zmieniło, jak i jaka jest jego nowa wartość.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Brak.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Bieżącą wartość wyzwalającego wejścia. Typ zależy od definicji wejścia (boolean, number lub string).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"variable\">channel\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">input::channel\u003C\u002Fspan>()\n\u003Cspan class=\"variable\">value\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">input::value\u003C\u002Fspan>()\n\n\u003Cspan class=\"comment\">\u002F\u002F Reaguj na zbocze narastające na wejściu boolowskim\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">channel\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"string\">\"input\"\u003C\u002Fspan> \u003Cspan class=\"keyword\">and\u003C\u002Fspan> \u003Cspan class=\"variable\">value\u003C\u002Fspan>) {\n    \u003Cspan class=\"variable\">output\u003C\u002Fspan>::\u003Cspan class=\"function\">toggle\u003C\u002Fspan>(\u003Cspan class=\"string\">\"output\"\u003C\u002Fspan>)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"input-get\">\u003Ca href=\"#input-get\" class=\"anchor\">#\u003C\u002Fa> input::get\u003C\u002Fh3>\n\u003Cp>Pobiera ostatnią znaną wartość określonego wejścia po jego identyfikatorze. W przeciwieństwie do \u003Ccode>input::value()\u003C\u002Fcode>, która zwraca jedynie wartość wejścia wywołującego bieżące wykonanie, ta funkcja może odczytać zapisaną wartość dowolnego wejścia w dowolnym momencie.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>id\u003C\u002Fcode> (string): Identyfikator wejścia do odczytu.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Ostatnią znaną wartość określonego wejścia. Typ zależy od definicji wejścia (boolean, number lub string).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Odczytaj bieżącą temperaturę z wejścia\u003C\u002Fspan>\n\u003Cspan class=\"variable\">current_temp\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">input::get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"value\"\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Użyj wartości w logice sterowania\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">current_temp\u003C\u002Fspan> \u003Cspan class=\"operator\">&gt;\u003C\u002Fspan> \u003Cspan class=\"number\">25.0\u003C\u002Fspan>) {\n    \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"cooling\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch2 id=\"operacje-wyjsciowe\">\u003Ca href=\"#operacje-wyjsciowe\" class=\"anchor\">#\u003C\u002Fa> Operacje wyjściowe\u003C\u002Fh2>\n\u003Cp>Ta sekcja opisuje funkcje do sterowania wyjściami bloku logicznego. Każdy blok może definiować jedno lub więcej wyjść, które przekazują wartości do innych podłączonych bloków.\u003C\u002Fp>\n\u003Ch3 id=\"output-get\">\u003Ca href=\"#output-get\" class=\"anchor\">#\u003C\u002Fa> output::get\u003C\u002Fh3>\n\u003Cp>Pobiera bieżącą wartość określonego wyjścia po jego identyfikatorze. Jest to przydatne do odczytu bieżącego stanu wyjścia przed podjęciem decyzji o jego zmianie.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>id\u003C\u002Fcode> (string): Identyfikator wyjścia do odczytu.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Bieżącą wartość określonego wyjścia. Typ zależy od definicji wyjścia (boolean, number lub string).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Sprawdź bieżący stan wyjścia przed przełączeniem\u003C\u002Fspan>\n\u003Cspan class=\"variable\">prev\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">output\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"output\"\u003C\u002Fspan>)\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">prev\u003C\u002Fspan>) {\n    \u003Cspan class=\"stdlib\">std::print\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Wyjście jest aktualnie WŁĄCZONE, wyłączam\"\u003C\u002Fspan>)\n}\n\u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"output\"\u003C\u002Fspan>, \u003Cspan class=\"operator\">!\u003C\u002Fspan>\u003Cspan class=\"variable\">prev\u003C\u002Fspan>)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"output-set\">\u003Ca href=\"#output-set\" class=\"anchor\">#\u003C\u002Fa> output::set\u003C\u002Fh3>\n\u003Cp>Ustawia wartość określonego wyjścia po jego identyfikatorze. Typ wartości musi odpowiadać typowi zdefiniowanemu dla tego wyjścia (boolean, number lub string). Ustawienie wyjścia propaguje nową wartość do wszelkich podłączonych bloków.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>id\u003C\u002Fcode> (string): Identyfikator wyjścia do ustawienia.\u003C\u002Fli>\n\u003Cli>\u003Ccode>value\u003C\u002Fcode>: Nowa wartość do przypisania. Musi odpowiadać zdefiniowanemu typowi wyjścia.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Nic.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Ustaw wyjście boolowskie\u003C\u002Fspan>\n\u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"output\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Ustaw wyjście numeryczne na podstawie obliczeń\u003C\u002Fspan>\n\u003Cspan class=\"variable\">midpoint\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"midpoint\"\u003C\u002Fspan>)\n\u003Cspan class=\"variable\">hysteresis\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"hysteresis\"\u003C\u002Fspan>)\n\u003Cspan class=\"variable\">value\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">input::get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"value\"\u003C\u002Fspan>)\n\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">value\u003C\u002Fspan> \u003Cspan class=\"operator\">&gt;=\u003C\u002Fspan> \u003Cspan class=\"variable\">midpoint\u003C\u002Fspan> \u003Cspan class=\"operator\">+\u003C\u002Fspan> \u003Cspan class=\"variable\">hysteresis\u003C\u002Fspan>) {\n    \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"output\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n} \u003Cspan class=\"keyword\">else\u003C\u002Fspan> \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">value\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;=\u003C\u002Fspan> \u003Cspan class=\"variable\">midpoint\u003C\u002Fspan> \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"variable\">hysteresis\u003C\u002Fspan>) {\n    \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"output\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">false\u003C\u002Fspan>)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"output-toggle\">\u003Ca href=\"#output-toggle\" class=\"anchor\">#\u003C\u002Fa> output::toggle\u003C\u002Fh3>\n\u003Cp>Przełącza wyjście boolowskie, odwracając jego bieżącą wartość. Jeśli wyjście jest obecnie \u003Ccode>true\u003C\u002Fcode>, staje się \u003Ccode>false\u003C\u002Fcode> i odwrotnie. Ta funkcja działa tylko z wyjściami typu boolean.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>id\u003C\u002Fcode> (string): Identyfikator wyjścia boolowskiego do przełączenia.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Nic.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"variable\">channel\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">input::channel\u003C\u002Fspan>()\n\u003Cspan class=\"variable\">value\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">input::value\u003C\u002Fspan>()\n\n\u003Cspan class=\"comment\">\u002F\u002F Przełącz wyjście na zbocze narastające wejścia\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">channel\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"string\">\"input\"\u003C\u002Fspan>) {\n    \u003Cspan class=\"variable\">last_state\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"last_input_state\"\u003C\u002Fspan>)\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">value\u003C\u002Fspan> \u003Cspan class=\"keyword\">and\u003C\u002Fspan> \u003Cspan class=\"operator\">!\u003C\u002Fspan>\u003Cspan class=\"variable\">last_state\u003C\u002Fspan>) {\n        \u003Cspan class=\"variable\">output\u003C\u002Fspan>::\u003Cspan class=\"function\">toggle\u003C\u002Fspan>(\u003Cspan class=\"string\">\"output\"\u003C\u002Fspan>)\n    }\n    \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"last_input_state\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">value\u003C\u002Fspan>)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch2 id=\"operacje-na-stanie\">\u003Ca href=\"#operacje-na-stanie\" class=\"anchor\">#\u003C\u002Fa> Operacje na stanie\u003C\u002Fh2>\n\u003Cp>Ta sekcja opisuje funkcje do zarządzania trwałym stanem w ramach bloku logicznego. Zmienne stanu zachowują swoje wartości pomiędzy wykonaniami skryptu, co czyni je niezbędnymi do śledzenia warunków w czasie, takich jak detekcja zboczy, liczniki czy informacje czasowe. Dostępne zmienne stanu i ich typy są zdefiniowane w deskryptorze bloku.\u003C\u002Fp>\n\u003Ch3 id=\"state-get\">\u003Ca href=\"#state-get\" class=\"anchor\">#\u003C\u002Fa> state::get\u003C\u002Fh3>\n\u003Cp>Pobiera bieżącą wartość trwałej zmiennej stanu po jej identyfikatorze.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>id\u003C\u002Fcode> (string): Identyfikator zmiennej stanu do odczytu.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Bieżącą wartość zmiennej stanu. Typ zależy od definicji zmiennej stanu (boolean, number lub string).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Użyj stanu do wykrycia zbocza narastającego (przejście z false na true)\u003C\u002Fspan>\n\u003Cspan class=\"variable\">value\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">input::value\u003C\u002Fspan>()\n\u003Cspan class=\"variable\">last_state\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"last_input_state\"\u003C\u002Fspan>)\n\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">value\u003C\u002Fspan> \u003Cspan class=\"keyword\">and\u003C\u002Fspan> \u003Cspan class=\"operator\">!\u003C\u002Fspan>\u003Cspan class=\"variable\">last_state\u003C\u002Fspan>) {\n    \u003Cspan class=\"comment\">\u002F\u002F Wykryto zbocze narastające - podejmij działanie\u003C\u002Fspan>\n    \u003Cspan class=\"variable\">output\u003C\u002Fspan>::\u003Cspan class=\"function\">toggle\u003C\u002Fspan>(\u003Cspan class=\"string\">\"output\"\u003C\u002Fspan>)\n}\n\n\u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"last_input_state\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">value\u003C\u002Fspan>)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"state-set\">\u003Ca href=\"#state-set\" class=\"anchor\">#\u003C\u002Fa> state::set\u003C\u002Fh3>\n\u003Cp>Zapisuje wartość w trwałej zmiennej stanu po jej identyfikatorze. Wartość jest zachowywana pomiędzy wykonaniami skryptu, umożliwiając blokowi zapamiętywanie informacji między wieloma zdarzeniami wejściowymi. Typ wartości musi odpowiadać typowi zdefiniowanemu dla tej zmiennej stanu.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>id\u003C\u002Fcode> (string): Identyfikator zmiennej stanu do aktualizacji.\u003C\u002Fli>\n\u003Cli>\u003Ccode>value\u003C\u002Fcode>: Nowa wartość do zapisania. Musi odpowiadać zdefiniowanemu typowi zmiennej stanu.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Nic.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Śledź znacznik czasu ostatniej zmiany wejścia\u003C\u002Fspan>\n\u003Cspan class=\"variable\">channel\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">input::channel\u003C\u002Fspan>()\n\u003Cspan class=\"variable\">value\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">input::value\u003C\u002Fspan>()\n\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">channel\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"string\">\"input\"\u003C\u002Fspan>) {\n    \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"last_change_time\"\u003C\u002Fspan>, \u003Cspan class=\"stdlib\">time::now\u003C\u002Fspan>())\n\n    \u003Cspan class=\"comment\">\u002F\u002F Oblicz, jak długo wejście było w poprzednim stanie\u003C\u002Fspan>\n    \u003Cspan class=\"variable\">elapsed\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">time::now\u003C\u002Fspan>() \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"last_change_time\"\u003C\u002Fspan>)\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">elapsed\u003C\u002Fspan> \u003Cspan class=\"operator\">&gt;\u003C\u002Fspan> \u003Cspan class=\"number\">60\u003C\u002Fspan>) {\n        \u003Cspan class=\"stdlib\">std::print\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Wejście było stabilne przez ponad minutę\"\u003C\u002Fspan>)\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch2 id=\"operacje-konfiguracyjne\">\u003Ca href=\"#operacje-konfiguracyjne\" class=\"anchor\">#\u003C\u002Fa> Operacje konfiguracyjne\u003C\u002Fh2>\n\u003Cp>Ta sekcja opisuje funkcje do odczytu parametrów konfiguracyjnych bloku. Wartości konfiguracyjne są ustawiane przez użytkownika w Voldeno Studio i są tylko do odczytu z poziomu skryptu. Pozwalają na dostosowanie bloków bez modyfikowania kodu - na przykład ustawianie progów, opóźnień czy trybów pracy.\u003C\u002Fp>\n\u003Ch3 id=\"config-get\">\u003Ca href=\"#config-get\" class=\"anchor\">#\u003C\u002Fa> config::get\u003C\u002Fh3>\n\u003Cp>Pobiera wartość parametru konfiguracyjnego po jego identyfikatorze. Parametry konfiguracyjne są zdefiniowane w deskryptorze bloku, a ich wartości są ustawiane przez użytkownika w Voldeno Studio. Skrypt może jedynie odczytywać te wartości, nie może ich modyfikować.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>id\u003C\u002Fcode> (string): Identyfikator parametru konfiguracyjnego do odczytu.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Wartość parametru konfiguracyjnego. Typ zależy od definicji parametru (number, string lub enum). Parametry typu enum zwracają swój indeks numeryczny liczony od zera.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Odczytaj konfigurację opóźnienia w milisekundach\u003C\u002Fspan>\n\u003Cspan class=\"variable\">delay_on_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"delay_on_ms\"\u003C\u002Fspan>)\n\u003Cspan class=\"variable\">delay_off_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"delay_off_ms\"\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Użyj konfiguracji typu enum do wyboru trybu zachowania\u003C\u002Fspan>\n\u003Cspan class=\"variable\">mode\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"mode\"\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca 0, 1, 2... w zależności od wybranej opcji\u003C\u002Fspan>\n\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">mode\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>) {\n    \u003Cspan class=\"comment\">\u002F\u002F Logika pierwszego trybu\u003C\u002Fspan>\n    ...\n} \u003Cspan class=\"keyword\">else\u003C\u002Fspan> \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">mode\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"number\">1\u003C\u002Fspan>) {\n    \u003Cspan class=\"comment\">\u002F\u002F Logika drugiego trybu\u003C\u002Fspan>\n    ...\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Odczytaj próg numeryczny z konfiguracji\u003C\u002Fspan>\n\u003Cspan class=\"variable\">scale\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"scale\"\u003C\u002Fspan>)\n\u003Cspan class=\"variable\">offset\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"offset\"\u003C\u002Fspan>)\n\u003Cspan class=\"variable\">result\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">input::value\u003C\u002Fspan>() \u003Cspan class=\"operator\">*\u003C\u002Fspan> \u003Cspan class=\"variable\">scale\u003C\u002Fspan> \u003Cspan class=\"operator\">+\u003C\u002Fspan> \u003Cspan class=\"variable\">offset\u003C\u002Fspan>\n\u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"value\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">result\u003C\u002Fspan>)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch2 id=\"operacje-callbackow\">\u003Ca href=\"#operacje-callbackow\" class=\"anchor\">#\u003C\u002Fa> Operacje callbacków\u003C\u002Fh2>\n\u003Cp>Ta sekcja opisuje funkcje do planowania opóźnionych wywołań funkcji. Volang jest językiem nieblokującym i nie udostępnia funkcji \u003Ccode>sleep\u003C\u002Fcode>. Zamiast tego callbacki zapewniają mechanizm logiki czasowej poprzez planowanie wywołania zdefiniowanej przez użytkownika funkcji po określonym opóźnieniu.\u003C\u002Fp>\n\u003Cp>Jest to niezbędne do implementacji zachowań takich jak opóźnienia, impulsy czasowe, sekwencje sterowania silnikami czy dowolna logika wymagająca działania po upływie określonego czasu. Callback może przekazać argumenty do wywoływanej funkcji, a funkcja może planować kolejne callbacki, tworząc wielokrokowe sekwencje.\u003C\u002Fp>\n\u003Cp>Tylko jeden callback może być aktywny w danym momencie dla jednego bloku. Zaplanowanie nowego callbacka, gdy jeden jest już oczekujący, wymaga najpierw anulowania istniejącego za pomocą \u003Ccode>callback::clear()\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch3 id=\"callback-set\">\u003Ca href=\"#callback-set\" class=\"anchor\">#\u003C\u002Fa> callback::set\u003C\u002Fh3>\n\u003Cp>Planuje opóźnione wywołanie zdefiniowanej przez użytkownika funkcji \u003Ccode>extern\u003C\u002Fcode> po określonym opóźnieniu w milisekundach. Funkcja jest identyfikowana przez swoją nazwę jako łańcuch. Dodatkowe argumenty mogą być przekazane i zostaną dostarczone do funkcji callback jako jej parametry.\u003C\u002Fp>\n\u003Cp>Funkcja docelowa musi być zadeklarowana z użyciem składni \u003Ccode>extern fn\u003C\u002Fcode> w skrypcie. Gdy opóźnienie upłynie, system wywołuje tę funkcję z podanymi argumentami.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>delay_ms\u003C\u002Fcode> (integer): Opóźnienie w milisekundach przed wywołaniem funkcji.\u003C\u002Fli>\n\u003Cli>\u003Ccode>function_name\u003C\u002Fcode> (string): Nazwa funkcji \u003Ccode>extern fn\u003C\u002Fcode> do wywołania.\u003C\u002Fli>\n\u003Cli>\u003Ccode>...args\u003C\u002Fcode> (opcjonalne): Dodatkowe argumenty do przekazania do funkcji callback. Można przekazać zero lub więcej wartości dowolnego typu.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Nic.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Zdefiniuj prosty handler callbacka\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">extern\u003C\u002Fspan> \u003Cspan class=\"keyword\">fn\u003C\u002Fspan> \u003Cspan class=\"function\">onTimeout\u003C\u002Fspan>() {\n    \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"output\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Zaplanuj callback do wywołania po konfigurowalnym opóźnieniu\u003C\u002Fspan>\n\u003Cspan class=\"variable\">delay_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"delay_ms\"\u003C\u002Fspan>)\n\u003Cspan class=\"stdlib\">callback::set\u003C\u002Fspan>(\u003Cspan class=\"variable\">delay_ms\u003C\u002Fspan>, \u003Cspan class=\"string\">\"onTimeout\"\u003C\u002Fspan>)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\n\u003Cp>\u003Cstrong>Przykład - przekazywanie argumentów:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Callback łańcuchowy przechodzący do następnego kroku\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">extern\u003C\u002Fspan> \u003Cspan class=\"keyword\">fn\u003C\u002Fspan> \u003Cspan class=\"function\">onSequence\u003C\u002Fspan>(\u003Cspan class=\"variable\">step\u003C\u002Fspan>) {\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">step\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"number\">1\u003C\u002Fspan>) {\n        \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"output\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n        \u003Cspan class=\"comment\">\u002F\u002F Zaplanuj krok 2 po czasie trwania impulsu\u003C\u002Fspan>\n        \u003Cspan class=\"variable\">pulse_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"pulse_ms\"\u003C\u002Fspan>)\n        \u003Cspan class=\"stdlib\">callback::set\u003C\u002Fspan>(\u003Cspan class=\"variable\">pulse_ms\u003C\u002Fspan>, \u003Cspan class=\"string\">\"onSequence\"\u003C\u002Fspan>, \u003Cspan class=\"number\">2\u003C\u002Fspan>)\n        \u003Cspan class=\"keyword\">return\u003C\u002Fspan>\n    }\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">step\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"number\">2\u003C\u002Fspan>) {\n        \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"output\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">false\u003C\u002Fspan>)\n        \u003Cspan class=\"keyword\">return\u003C\u002Fspan>\n    }\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Rozpocznij sekwencję po początkowym opóźnieniu\u003C\u002Fspan>\n\u003Cspan class=\"stdlib\">callback::set\u003C\u002Fspan>(\u003Cspan class=\"number\">1000\u003C\u002Fspan>, \u003Cspan class=\"string\">\"onSequence\"\u003C\u002Fspan>, \u003Cspan class=\"number\">1\u003C\u002Fspan>)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"callback-clear\">\u003Ca href=\"#callback-clear\" class=\"anchor\">#\u003C\u002Fa> callback::clear\u003C\u002Fh3>\n\u003Cp>Anuluje aktualnie zaplanowany callback dla bloku. Powinno być wywoływane przed zaplanowaniem nowego callbacka lub gdy oczekujące działanie nie jest już potrzebne (np. wejście zmieniło się przed upłynięciem opóźnienia).\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Brak.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Nic.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"keyword\">extern\u003C\u002Fspan> \u003Cspan class=\"keyword\">fn\u003C\u002Fspan> \u003Cspan class=\"function\">onCallback\u003C\u002Fspan>(\u003Cspan class=\"variable\">value\u003C\u002Fspan>) {\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">value\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"number\">1\u003C\u002Fspan>) {\n        \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"output\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n    } \u003Cspan class=\"keyword\">else\u003C\u002Fspan> \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">value\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"number\">2\u003C\u002Fspan>) {\n        \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"output\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">false\u003C\u002Fspan>)\n    }\n}\n\n\u003Cspan class=\"variable\">channel\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">input::channel\u003C\u002Fspan>()\n\u003Cspan class=\"variable\">value\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">input::value\u003C\u002Fspan>()\n\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">channel\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"string\">\"input\"\u003C\u002Fspan>) {\n    \u003Cspan class=\"variable\">last\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"last_input_state\"\u003C\u002Fspan>)\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">value\u003C\u002Fspan> \u003Cspan class=\"operator\">!=\u003C\u002Fspan> \u003Cspan class=\"variable\">last\u003C\u002Fspan>) {\n        \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"last_input_state\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">value\u003C\u002Fspan>)\n\n        \u003Cspan class=\"comment\">\u002F\u002F Zawsze anuluj poprzedni callback przed zaplanowaniem nowego\u003C\u002Fspan>\n        \u003Cspan class=\"stdlib\">callback::clear\u003C\u002Fspan>()\n\n        \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">value\u003C\u002Fspan>) {\n            \u003Cspan class=\"variable\">delay_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"delay_on_ms\"\u003C\u002Fspan>)\n            \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">delay_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">&gt;\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>) {\n                \u003Cspan class=\"stdlib\">callback::set\u003C\u002Fspan>(\u003Cspan class=\"variable\">delay_ms\u003C\u002Fspan>, \u003Cspan class=\"string\">\"onCallback\"\u003C\u002Fspan>, \u003Cspan class=\"number\">1\u003C\u002Fspan>)\n            } \u003Cspan class=\"keyword\">else\u003C\u002Fspan> {\n                \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"output\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n            }\n        } \u003Cspan class=\"keyword\">else\u003C\u002Fspan> {\n            \u003Cspan class=\"variable\">delay_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"delay_off_ms\"\u003C\u002Fspan>)\n            \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">delay_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">&gt;\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>) {\n                \u003Cspan class=\"stdlib\">callback::set\u003C\u002Fspan>(\u003Cspan class=\"variable\">delay_ms\u003C\u002Fspan>, \u003Cspan class=\"string\">\"onCallback\"\u003C\u002Fspan>, \u003Cspan class=\"number\">2\u003C\u002Fspan>)\n            } \u003Cspan class=\"keyword\">else\u003C\u002Fspan> {\n                \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"output\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">false\u003C\u002Fspan>)\n            }\n        }\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch2 id=\"operacje-na-lancuchach-znakow\">\u003Ca href=\"#operacje-na-lancuchach-znakow\" class=\"anchor\">#\u003C\u002Fa> Operacje na łańcuchach znaków\u003C\u002Fh2>\n\u003Cp>Ta sekcja opisuje funkcje służące do manipulacji łańcuchami znaków.\u003C\u002Fp>\n\u003Ch3 id=\"str-len\">\u003Ca href=\"#str-len\" class=\"anchor\">#\u003C\u002Fa> str::len\u003C\u002Fh3>\n\u003Cp>Oblicza liczbę znaków w podanym łańcuchu.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>text\u003C\u002Fcode> (string): Łańcuch wejściowy do zmierzenia.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Wartość całkowitą reprezentującą liczbę znaków w łańcuchu.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Sprawdź, czy kod PIN użytkownika ma wymaganą długość\u003C\u002Fspan>\n\u003Cspan class=\"variable\">user_pin\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"string\">\"1234\"\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"stdlib\">str::len\u003C\u002Fspan>(\u003Cspan class=\"variable\">user_pin\u003C\u002Fspan>) \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"number\">4\u003C\u002Fspan>) {\n    ...\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"str-trim\">\u003Ca href=\"#str-trim\" class=\"anchor\">#\u003C\u002Fa> str::trim\u003C\u002Fh3>\n\u003Cp>Usuwa wszystkie wiodące i końcowe znaki białe (spacje, tabulatory, znaki nowej linii) z łańcucha. Jest to niezbędne do czyszczenia danych wejściowych użytkownika lub parsowania poleceń otrzymanych z systemów zewnętrznych, gdzie mogą wystąpić dodatkowe odstępy.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>text\u003C\u002Fcode> (string): Łańcuch wejściowy do przycięcia.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Nowy tekst zawierający tekst bez otaczających znaków białych.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Wyczyść polecenie otrzymane z modułu zewnętrznego\u003C\u002Fspan>\n\u003Cspan class=\"variable\">input\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"string\">\"  START  \"\u003C\u002Fspan>\n\u003Cspan class=\"variable\">command\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">str::trim\u003C\u002Fspan>(\u003Cspan class=\"variable\">input\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Teraz łańcuch to \"START\" i może być bezpiecznie porównany\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">command\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"string\">\"START\"\u003C\u002Fspan>) {\n    ....\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"str-concat\">\u003Ca href=\"#str-concat\" class=\"anchor\">#\u003C\u002Fa> str::concat\u003C\u002Fh3>\n\u003Cp>Łączy (konkatenuje) dwa lub więcej łańcuchów w jeden łańcuch. Ta funkcja jest wariadyczna, co oznacza, że akceptuje zmienną liczbę argumentów, umożliwiając dynamiczne budowanie złożonych komunikatów lub poleceń.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>...strings\u003C\u002Fcode>: Sekwencja argumentów łańcuchowych do połączenia. Możesz przekazać dowolną liczbę argumentów, oddzielonych przecinkami. Można również podać pojedynczy argument - w takim przypadku funkcja zwraca sam ten argument.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Nowy łańcuch składający się ze wszystkich łańcuchów wejściowych połączonych w kolejności.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"variable\">room\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"string\">\"Salon\"\u003C\u002Fspan>\n\u003Cspan class=\"variable\">temp\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"string\">\"22.5\"\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Zbuduj pełny komunikat o stanie używając wielu argumentów\u003C\u002Fspan>\n\u003Cspan class=\"variable\">message\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">str::concat\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Status: \"\u003C\u002Fspan>, \u003Cspan class=\"variable\">room\u003C\u002Fspan>, \u003Cspan class=\"string\">\" ma obecnie \"\u003C\u002Fspan>, \u003Cspan class=\"variable\">temp\u003C\u002Fspan>, \u003Cspan class=\"string\">\"°C\"\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Wynik: \"Status: Salon ma obecnie 22.5°C\"\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"str-count\">\u003Ca href=\"#str-count\" class=\"anchor\">#\u003C\u002Fa> str::count\u003C\u002Fh3>\n\u003Cp>Zlicza liczbę nienakładających się wystąpień podłańcucha w łańcuchu. Opcjonalnie wyszukiwanie może być ograniczone do określonego zakresu w łańcuchu za pomocą argumentów pozycji \u003Ccode>start\u003C\u002Fcode> i \u003Ccode>end\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>text\u003C\u002Fcode> (string): Łańcuch, w którym ma być wykonane wyszukiwanie.\u003C\u002Fli>\n\u003Cli>\u003Ccode>substring\u003C\u002Fcode> (string): Podłańcuch, którego wystąpienia mają być zliczone.\u003C\u002Fli>\n\u003Cli>\u003Ccode>start\u003C\u002Fcode> (integer, opcjonalne): Pozycja, od której ma rozpocząć się wyszukiwanie. Domyślnie \u003Ccode>0\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>end\u003C\u002Fcode> (integer, opcjonalne): Pozycja, na której ma zakończyć się wyszukiwanie (wyłącznie). Domyślnie koniec łańcucha.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Wartość całkowitą reprezentującą liczbę nienakładających się wystąpień podłańcucha.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Zlicz wszystkie wystąpienia słowa\u003C\u002Fspan>\n\u003Cspan class=\"variable\">text\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"string\">\"I love apples, apple are my favorite fruit\"\u003C\u002Fspan>\n\u003Cspan class=\"variable\">count\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"module\">str\u003C\u002Fspan>::\u003Cspan class=\"function\">count\u003C\u002Fspan>(\u003Cspan class=\"variable\">text\u003C\u002Fspan>, \u003Cspan class=\"string\">\"apple\"\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca 2\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Zlicz wystąpienia w zakresie\u003C\u002Fspan>\n\u003Cspan class=\"variable\">data\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"string\">\"abcabcabc\"\u003C\u002Fspan>\n\u003Cspan class=\"variable\">count\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"module\">str\u003C\u002Fspan>::\u003Cspan class=\"function\">count\u003C\u002Fspan>(\u003Cspan class=\"variable\">data\u003C\u002Fspan>, \u003Cspan class=\"string\">\"abc\"\u003C\u002Fspan>, \u003Cspan class=\"number\">1\u003C\u002Fspan>)    \u003Cspan class=\"comment\">\u002F\u002F Zwraca 2 (pomija pierwsze \"abc\")\u003C\u002Fspan>\n\u003Cspan class=\"variable\">count\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"module\">str\u003C\u002Fspan>::\u003Cspan class=\"function\">count\u003C\u002Fspan>(\u003Cspan class=\"variable\">data\u003C\u002Fspan>, \u003Cspan class=\"string\">\"abc\"\u003C\u002Fspan>, \u003Cspan class=\"number\">1\u003C\u002Fspan>, \u003Cspan class=\"number\">7\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca 1\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Pusty podłańcuch zwraca długość + 1\u003C\u002Fspan>\n\u003Cspan class=\"variable\">count\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"module\">str\u003C\u002Fspan>::\u003Cspan class=\"function\">count\u003C\u002Fspan>(\u003Cspan class=\"string\">\"hello\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"\"\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca 6\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Nienakładające się: \"aaaa\" zawiera 2 nienakładające się \"aa\"\u003C\u002Fspan>\n\u003Cspan class=\"variable\">count\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"module\">str\u003C\u002Fspan>::\u003Cspan class=\"function\">count\u003C\u002Fspan>(\u003Cspan class=\"string\">\"aaaa\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"aa\"\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca 2\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"str-replace\">\u003Ca href=\"#str-replace\" class=\"anchor\">#\u003C\u002Fa> str::replace\u003C\u002Fh3>\n\u003Cp>Zastępuje wystąpienia podłańcucha w łańcuchu nowym podłańcuchem. Domyślnie zastępowane są wszystkie wystąpienia. Opcjonalny parametr \u003Ccode>count\u003C\u002Fcode> ogranicza liczbę zamian wykonywanych od lewej do prawej.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>text\u003C\u002Fcode> (string): Oryginalny łańcuch.\u003C\u002Fli>\n\u003Cli>\u003Ccode>old\u003C\u002Fcode> (string): Podłańcuch do zastąpienia.\u003C\u002Fli>\n\u003Cli>\u003Ccode>new\u003C\u002Fcode> (string): Podłańcuch, którym ma być zastąpiony.\u003C\u002Fli>\n\u003Cli>\u003Ccode>count\u003C\u002Fcode> (integer, opcjonalne): Maksymalna liczba zamian. Jeśli pominięto, zastępowane są wszystkie wystąpienia.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Nowy łańcuch z zastosowanymi zamianami.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Zastąp wszystkie wystąpienia\u003C\u002Fspan>\n\u003Cspan class=\"variable\">result\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"module\">str\u003C\u002Fspan>::\u003Cspan class=\"function\">replace\u003C\u002Fspan>(\u003Cspan class=\"string\">\"one one was a horse\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"one\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"three\"\u003C\u002Fspan>)\n\u003Cspan class=\"comment\">\u002F\u002F Zwraca \"three three was a horse\"\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Zastąp tylko pierwsze wystąpienie\u003C\u002Fspan>\n\u003Cspan class=\"variable\">result\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"module\">str\u003C\u002Fspan>::\u003Cspan class=\"function\">replace\u003C\u002Fspan>(\u003Cspan class=\"string\">\"one one was a horse\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"one\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"three\"\u003C\u002Fspan>, \u003Cspan class=\"number\">1\u003C\u002Fspan>)\n\u003Cspan class=\"comment\">\u002F\u002F Zwraca \"three one was a horse\"\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Usuwanie przez zastąpienie pustym łańcuchem\u003C\u002Fspan>\n\u003Cspan class=\"variable\">result\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"module\">str\u003C\u002Fspan>::\u003Cspan class=\"function\">replace\u003C\u002Fspan>(\u003Cspan class=\"string\">\"hello\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"l\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"\"\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca \"heo\"\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Pusty old wstawia między każdy znak\u003C\u002Fspan>\n\u003Cspan class=\"variable\">result\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"module\">str\u003C\u002Fspan>::\u003Cspan class=\"function\">replace\u003C\u002Fspan>(\u003Cspan class=\"string\">\"abc\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"-\"\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca \"-a-b-c-\"\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"str-number\">\u003Ca href=\"#str-number\" class=\"anchor\">#\u003C\u002Fa> str::number\u003C\u002Fh3>\n\u003Cp>Parsuje argument łańcuchowy i konwertuje go na wartość numeryczną. Funkcja automatycznie wykrywa format: jeśli łańcuch zawiera kropkę dziesiętną, zwraca liczbę zmiennoprzecinkową, w przeciwnym razie zwraca liczbę całkowitą.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>text\u003C\u002Fcode>: Łańcuch zawierający reprezentację liczby.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Wartość numeryczną, całkowitą lub zmiennoprzecinkową, w zależności od formatu wejściowego.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Przypadek 1: Parsowanie liczby całkowitej (np. poziom jasności)\u003C\u002Fspan>\n\u003Cspan class=\"variable\">brightness\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">str::number\u003C\u002Fspan>(\u003Cspan class=\"string\">\"80\"\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca Integer 80\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Przypadek 2: Parsowanie liczby zmiennoprzecinkowej (np. temperatura)\u003C\u002Fspan>\n\u003Cspan class=\"variable\">temp_str\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"string\">\"21.5\"\u003C\u002Fspan>\n\u003Cspan class=\"variable\">threshold\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">str::number\u003C\u002Fspan>(\u003Cspan class=\"variable\">temp_str\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca Float 21.5\u003C\u002Fspan>\n\u003Cspan class=\"variable\">current_temp\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"number\">22\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Użycie przekonwertowanej wartości w logice\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">current_temp\u003C\u002Fspan> \u003Cspan class=\"operator\">&gt;\u003C\u002Fspan> \u003Cspan class=\"variable\">threshold\u003C\u002Fspan>) {\n    ...\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"str-fmt\">\u003Ca href=\"#str-fmt\" class=\"anchor\">#\u003C\u002Fa> str::fmt\u003C\u002Fh3>\n\u003Cp>Konstruuje sformatowany łańcuch poprzez zastępowanie symboli zastępczych \u003Ccode>{}\u003C\u002Fcode> w szablonie łańcuchowym reprezentacją tekstową podanych argumentów. Akceptuje zmienną liczbę argumentów różnych typów (łańcuchy, wartości numeryczne i logiczne) i automatycznie konwertuje je na tekst przed wstawieniem. Zamiana jest pozycyjna: pierwszy \u003Ccode>{}\u003C\u002Fcode> jest zastępowany pierwszym argumentem, drugi \u003Ccode>{}\u003C\u002Fcode> drugim itd.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>template\u003C\u002Fcode>: Łańcuch formatujący zawierający symbole zastępcze w nawiasach klamrowych \u003Ccode>{}\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>...args\u003C\u002Fcode>: Sekwencja wartości do podstawienia w miejsca symboli zastępczych. Obsługiwane typy to liczby, łańcuchy i literały logiczne (\u003Ccode>true\u003C\u002Fcode>\u002F\u003Ccode>false\u003C\u002Fcode>).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Nowy łańcuch ze wszystkimi symbolami zastępczymi zastąpionymi odpowiednimi wartościami.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"variable\">sensorName\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"string\">\"Kuchnia_Glowna\"\u003C\u002Fspan>\n\u003Cspan class=\"variable\">temp\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"number\">22.5\u003C\u002Fspan>\n\u003Cspan class=\"variable\">isActive\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"boolean\">true\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Sformatuj złożony komunikat logu bez ręcznej konkatenacji\u003C\u002Fspan>\n\u003Cspan class=\"variable\">log\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">str::fmt\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Czujnik {} status: Aktywny={}, Wartość={}°C\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">sensorName\u003C\u002Fspan>, \u003Cspan class=\"variable\">isActive\u003C\u002Fspan>, \u003Cspan class=\"variable\">temp\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Wynik: \"Czujnik Kuchnia_Glowna status: Aktywny=true, Wartość=22.5°C\"\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"str-split\">\u003Ca href=\"#str-split\" class=\"anchor\">#\u003C\u002Fa> str::split\u003C\u002Fh3>\n\u003Cp>Inicjalizuje operację dzielenia łańcucha i tworzy stan iteratora. Ta funkcja nie wykonuje faktycznego dzielenia natychmiast. Zamiast tego zwraca nieprzezroczysty obiekt \u003Ccode>handle\u003C\u002Fcode>, który zawiera bieżącą pozycję i logikę wymaganą do przechodzenia przez łańcuch. Ten obiekt musi być przekazany do \u003Ccode>str::split_next\u003C\u002Fcode> lub \u003Ccode>str::split_has_next\u003C\u002Fcode>, aby pobierać rzeczywiste podłańcuchy jeden po drugim.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>text\u003C\u002Fcode>: Łańcuch źródłowy do podzielenia.\u003C\u002Fli>\n\u003Cli>\u003Ccode>separator\u003C\u002Fcode>: Łańcuch separatora, który oznacza granice między fragmentami.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Nieprzezroczysty uchwyt reprezentujący aktywną sesję dzielenia. Nie należy modyfikować tego obiektu bezpośrednio.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"variable\">rawData\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"string\">\"sensor1;25.5;active\"\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Zainicjalizuj splitter. 'iterator' teraz przechowuje stan.\u003C\u002Fspan>\n\u003Cspan class=\"variable\">iterator\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">str::split\u003C\u002Fspan>(\u003Cspan class=\"variable\">rawData\u003C\u002Fspan>, \u003Cspan class=\"string\">\";\"\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Iterator jest teraz gotowy do użycia przez split_next...\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"str-split-has-next\">\u003Ca href=\"#str-split-has-next\" class=\"anchor\">#\u003C\u002Fa> str::split_has_next\u003C\u002Fh3>\n\u003Cp>Sprawdza, czy są jeszcze podłańcuchy oczekujące na pobranie z bieżącej sesji dzielenia. Ta funkcja sprawdza nieprzezroczysty obiekt \u003Ccode>state\u003C\u002Fcode> utworzony przez \u003Ccode>str::split\u003C\u002Fcode>. Nie modyfikuje stanu ani nie przesuwa pozycji iteratora; jedynie weryfikuje dostępność. Jest powszechnie używana jako warunek w pętli \u003Ccode>while\u003C\u002Fcode> do iterowania przez wszystkie części łańcucha.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>state\u003C\u002Fcode>: Nieprzezroczysty uchwyt zwrócony przez \u003Ccode>str::split\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>true\u003C\u002Fcode>, jeśli dostępny jest co najmniej jeden kolejny podłańcuch; w przeciwnym razie zwraca \u003Ccode>false\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"variable\">data\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"string\">\"CZERWONY,ZIELONY,NIEBIESKI\"\u003C\u002Fspan>\n\u003Cspan class=\"variable\">iterator\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">str::split\u003C\u002Fspan>(\u003Cspan class=\"variable\">data\u003C\u002Fspan>, \u003Cspan class=\"string\">\",\"\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Pętla dopóki są pozostałe tokeny\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">while\u003C\u002Fspan> (\u003Cspan class=\"stdlib\">str::split_has_next\u003C\u002Fspan>(\u003Cspan class=\"variable\">iterator\u003C\u002Fspan>)) {\n    ...\n    \u003Cspan class=\"comment\">\u002F\u002F Bezpieczne wywołanie split_next() tutaj\u003C\u002Fspan>\n    \u003Cspan class=\"comment\">\u002F\u002F color = str::split_next(iterator) \u003C\u002Fspan>\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"str-split-next\">\u003Ca href=\"#str-split-next\" class=\"anchor\">#\u003C\u002Fa> str::split_next\u003C\u002Fh3>\n\u003Cp>Wyodrębnia i zwraca następny podłańcuch z sekwencji dzielenia oraz przesuwa iterator na następną pozycję. Ta funkcja zużywa bieżący segment łańcucha identyfikowany przez nieprzezroczysty \u003Ccode>state\u003C\u002Fcode>. Jest zaprojektowana do sekwencyjnego wywoływania, aż wszystkie części łańcucha zostaną przetworzone.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>state\u003C\u002Fcode>: Nieprzezroczysty uchwyt zwrócony przez \u003Ccode>str::split\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Następny segment oryginalnego tekstu.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cdiv class=\"callout callout-warning\">\n\u003Cdiv class=\"callout-title\">\u003Cspan class=\"callout-icon\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\u003Cpath d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\"\u002F>\u003Cpath d=\"M12 9v4\"\u002F>\u003Cpath d=\"M12 17h.01\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\u003Cspan>Warning\u003C\u002Fspan>\u003C\u002Fdiv>\n\u003Cdiv class=\"callout-content\">\n\u003Cp>Zaleca się zweryfikowanie dostępności za pomocą \u003Ccode>str::split_has_next(state)\u003C\u002Fcode> przed wywołaniem tej funkcji, aby zapewnić bezpieczną iterację.\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Scenariusz: Parsowanie łańcucha polecenia \"SET_COLOR;255;0;0\"\u003C\u002Fspan>\n\u003Cspan class=\"variable\">commandRaw\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"string\">\"SET_COLOR;255;0;0\"\u003C\u002Fspan>\n\u003Cspan class=\"variable\">iter\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">str::split\u003C\u002Fspan>(\u003Cspan class=\"variable\">commandRaw\u003C\u002Fspan>, \u003Cspan class=\"string\">\";\"\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Znamy format, więc możemy wyodrębnić części ręcznie\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"stdlib\">str::split_has_next\u003C\u002Fspan>(\u003Cspan class=\"variable\">iter\u003C\u002Fspan>)) {\n    \u003Cspan class=\"variable\">cmd\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">str::split_next\u003C\u002Fspan>(\u003Cspan class=\"variable\">iter\u003C\u002Fspan>)   \u003Cspan class=\"comment\">\u002F\u002F \"SET_COLOR\"\u003C\u002Fspan>\n    \u003Cspan class=\"variable\">r\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">str::split_next\u003C\u002Fspan>(\u003Cspan class=\"variable\">iter\u003C\u002Fspan>)     \u003Cspan class=\"comment\">\u002F\u002F \"255\"\u003C\u002Fspan>\n    \u003Cspan class=\"variable\">g\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">str::split_next\u003C\u002Fspan>(\u003Cspan class=\"variable\">iter\u003C\u002Fspan>)     \u003Cspan class=\"comment\">\u002F\u002F \"0\"\u003C\u002Fspan>\n    \u003Cspan class=\"variable\">b\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">str::split_next\u003C\u002Fspan>(\u003Cspan class=\"variable\">iter\u003C\u002Fspan>)     \u003Cspan class=\"comment\">\u002F\u002F \"0\"\u003C\u002Fspan>\n    ...\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch2 id=\"operacje-na-tablicach\">\u003Ca href=\"#operacje-na-tablicach\" class=\"anchor\">#\u003C\u002Fa> Operacje na tablicach\u003C\u002Fh2>\n\u003Cp>Ta sekcja opisuje funkcje do tworzenia i manipulowania tablicami.\u003C\u002Fp>\n\u003Ch3 id=\"array-new\">\u003Ca href=\"#array-new\" class=\"anchor\">#\u003C\u002Fa> array::new\u003C\u002Fh3>\n\u003Cp>Tworzy nową tablicę zainicjalizowaną podanymi wartościami. Ta funkcja jest wariadyczna, co oznacza, że akceptuje zmienną liczbę argumentów dowolnego typu. Wywołana bez argumentów tworzy pustą tablicę. Tablice mogą przechowywać różne typy, a ich rozmiar może być dynamicznie zmieniany za pomocą innych funkcji tablicowych.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>...values\u003C\u002Fcode> (opcjonalne): Sekwencja wartości do zainicjalizowania tablicy. Możesz przekazać zero lub więcej argumentów dowolnego typu (liczby, łańcuchy, wartości logiczne, a nawet inne tablice). Jeśli nie podano żadnych argumentów, tworzona jest pusta tablica.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Nieprzezroczysty uchwyt reprezentujący utworzoną tablicę. Ten uchwyt powinien być przekazywany do innych funkcji tablicowych (takich jak \u003Ccode>array::put_at\u003C\u002Fcode>, \u003Ccode>array::get_at\u003C\u002Fcode>, \u003Ccode>array::len\u003C\u002Fcode>) w celu manipulowania zawartością tablicy.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Utwórz pustą tablicę\u003C\u002Fspan>\n\u003Cspan class=\"variable\">empty\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::new\u003C\u002Fspan>()\n\n\u003Cspan class=\"comment\">\u002F\u002F Utwórz tablicę z początkowymi wartościami numerycznymi\u003C\u002Fspan>\n\u003Cspan class=\"variable\">temperatures\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::new\u003C\u002Fspan>(\u003Cspan class=\"number\">21.5\u003C\u002Fspan>, \u003Cspan class=\"number\">22.0\u003C\u002Fspan>, \u003Cspan class=\"number\">19.8\u003C\u002Fspan>, \u003Cspan class=\"number\">23.1\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Utwórz tablicę z różnymi typami\u003C\u002Fspan>\n\u003Cspan class=\"variable\">config\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::new\u003C\u002Fspan>(\u003Cspan class=\"string\">\"sensor1\"\u003C\u002Fspan>, \u003Cspan class=\"number\">100\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Utwórz tablicę z wartościami łańcuchowymi dla nazw pokojów\u003C\u002Fspan>\n\u003Cspan class=\"variable\">rooms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::new\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Salon\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"Kuchnia\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"Sypialnia\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"Łazienka\"\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Tablice mogą być używane do zbierania odczytów czujników w czasie\u003C\u002Fspan>\n\u003Cspan class=\"variable\">readings\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::new\u003C\u002Fspan>()\n\u003Cspan class=\"comment\">\u002F\u002F Później: array::push(readings, current_value)\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"array-len\">\u003Ca href=\"#array-len\" class=\"anchor\">#\u003C\u002Fa> array::len\u003C\u002Fh3>\n\u003Cp>Zwraca liczbę elementów aktualnie przechowywanych w tablicy. Ta funkcja jest przydatna do sprawdzania, czy tablica jest pusta, iterowania po wszystkich elementach lub walidacji rozmiaru tablicy przed dostępem do określonych indeksów.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>arr\u003C\u002Fcode>: Nieprzezroczysty uchwyt tablicy zwrócony przez \u003Ccode>array::new\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Wartość całkowitą reprezentującą liczbę elementów w tablicy.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Sprawdź rozmiar tablicy\u003C\u002Fspan>\n\u003Cspan class=\"variable\">temps\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::new\u003C\u002Fspan>(\u003Cspan class=\"number\">21.5\u003C\u002Fspan>, \u003Cspan class=\"number\">22.0\u003C\u002Fspan>, \u003Cspan class=\"number\">19.8\u003C\u002Fspan>)\n\u003Cspan class=\"variable\">count\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::len\u003C\u002Fspan>(\u003Cspan class=\"variable\">temps\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca 3\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Sprawdź, czy tablica jest pusta\u003C\u002Fspan>\n\u003Cspan class=\"variable\">data\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::new\u003C\u002Fspan>()\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"stdlib\">array::len\u003C\u002Fspan>(\u003Cspan class=\"variable\">data\u003C\u002Fspan>) \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>) {\n    \u003Cspan class=\"stdlib\">std::print\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Brak zebranych danych\"\u003C\u002Fspan>)\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Użyj długości do granic iteracji\u003C\u002Fspan>\n\u003Cspan class=\"variable\">sensors\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::new\u003C\u002Fspan>(\u003Cspan class=\"string\">\"temp1\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"temp2\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"humidity\"\u003C\u002Fspan>)\n\u003Cspan class=\"variable\">i\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">while\u003C\u002Fspan> (\u003Cspan class=\"variable\">i\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::len\u003C\u002Fspan>(\u003Cspan class=\"variable\">sensors\u003C\u002Fspan>)) {\n    \u003Cspan class=\"comment\">\u002F\u002F Przetwórz każdy czujnik...\u003C\u002Fspan>\n    \u003Cspan class=\"variable\">i\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">i\u003C\u002Fspan> \u003Cspan class=\"operator\">+\u003C\u002Fspan> \u003Cspan class=\"number\">1\u003C\u002Fspan>\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"array-get-at\">\u003Ca href=\"#array-get-at\" class=\"anchor\">#\u003C\u002Fa> array::get_at\u003C\u002Fh3>\n\u003Cp>Pobiera wartość przechowywaną pod określonym indeksem w tablicy. Indeksy tablicy są liczone od zera, co oznacza, że pierwszy element znajduje się pod indeksem \u003Ccode>0\u003C\u002Fcode>, drugi pod indeksem \u003Ccode>1\u003C\u002Fcode> itd.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>arr\u003C\u002Fcode>: Nieprzezroczysty uchwyt tablicy zwrócony przez \u003Ccode>array::new\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>index\u003C\u002Fcode>: Pozycja elementu do pobrania, liczona od zera.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Wartość przechowywaną pod określonym indeksem. Typ zwracany zależy od tego, co zostało zapisane na tej pozycji.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cdiv class=\"callout callout-warning\">\n\u003Cdiv class=\"callout-title\">\u003Cspan class=\"callout-icon\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\u003Cpath d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\"\u002F>\u003Cpath d=\"M12 9v4\"\u002F>\u003Cpath d=\"M12 17h.01\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\u003Cspan>Warning\u003C\u002Fspan>\u003C\u002Fdiv>\n\u003Cdiv class=\"callout-content\">\n\u003Cp>Musisz upewnić się, że indeks mieści się w prawidłowych granicach (tj. \u003Ccode>0 &lt;= index &lt; array::len(arr)\u003C\u002Fcode>) przed wywołaniem tej funkcji. Próba dostępu do indeksu, który nie istnieje, zakończy się \u003Cstrong>błędem wykonania programu\u003C\u002Fstrong>, co może skutkować niezdefiniowanym zachowaniem. Zawsze najpierw zwaliduj indeks używając \u003Ccode>array::len()\u003C\u002Fcode>.\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"variable\">temps\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::new\u003C\u002Fspan>(\u003Cspan class=\"number\">21.5\u003C\u002Fspan>, \u003Cspan class=\"number\">22.0\u003C\u002Fspan>, \u003Cspan class=\"number\">19.8\u003C\u002Fspan>, \u003Cspan class=\"number\">23.1\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Bezpieczny dostęp: najpierw sprawdź granice\u003C\u002Fspan>\n\u003Cspan class=\"variable\">index\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"number\">2\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">index\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::len\u003C\u002Fspan>(\u003Cspan class=\"variable\">temps\u003C\u002Fspan>)) {\n    \u003Cspan class=\"variable\">value\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::get_at\u003C\u002Fspan>(\u003Cspan class=\"variable\">temps\u003C\u002Fspan>, \u003Cspan class=\"variable\">index\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca 19.8\u003C\u002Fspan>\n    \u003Cspan class=\"stdlib\">std::print\u003C\u002Fspan>(\u003Cspan class=\"stdlib\">str::fmt\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Temperatura pod indeksem {}: {}°C\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">index\u003C\u002Fspan>, \u003Cspan class=\"variable\">value\u003C\u002Fspan>))\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Bezpieczna iteracja po wszystkich elementach\u003C\u002Fspan>\n\u003Cspan class=\"variable\">i\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">while\u003C\u002Fspan> (\u003Cspan class=\"variable\">i\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::len\u003C\u002Fspan>(\u003Cspan class=\"variable\">temps\u003C\u002Fspan>)) {\n    \u003Cspan class=\"variable\">temp\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::get_at\u003C\u002Fspan>(\u003Cspan class=\"variable\">temps\u003C\u002Fspan>, \u003Cspan class=\"variable\">i\u003C\u002Fspan>)\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">temp\u003C\u002Fspan> \u003Cspan class=\"operator\">&gt;\u003C\u002Fspan> \u003Cspan class=\"number\">22.0\u003C\u002Fspan>) {\n        \u003Cspan class=\"stdlib\">std::print\u003C\u002Fspan>(\u003Cspan class=\"stdlib\">str::fmt\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Wykryto wysoką temperaturę: {}°C\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">temp\u003C\u002Fspan>))\n    }\n    \u003Cspan class=\"variable\">i\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">i\u003C\u002Fspan> \u003Cspan class=\"operator\">+\u003C\u002Fspan> \u003Cspan class=\"number\">1\u003C\u002Fspan>\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F NIEBEZPIECZNE: Nigdy nie rób tego bez sprawdzania granic!\u003C\u002Fspan>\n\u003Cspan class=\"comment\">\u002F\u002F value = array::get_at(temps, 10) \u002F\u002F Niezdefiniowane zachowanie - może spowodować awarię!\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"array-put-at\">\u003Ca href=\"#array-put-at\" class=\"anchor\">#\u003C\u002Fa> array::put_at\u003C\u002Fh3>\n\u003Cp>Zapisuje wartość pod określonym indeksem w tablicy, zastępując istniejącą wartość na tej pozycji. Indeksy tablicy są liczone od zera, co oznacza, że pierwszy element znajduje się pod indeksem \u003Ccode>0\u003C\u002Fcode>, drugi pod indeksem \u003Ccode>1\u003C\u002Fcode> itd. Ta funkcja modyfikuje tablicę w miejscu i nie zwraca wartości.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>arr\u003C\u002Fcode>: Nieprzezroczysty uchwyt tablicy zwrócony przez \u003Ccode>array::new\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>index\u003C\u002Fcode>: Pozycja liczona od zera, gdzie wartość powinna zostać zapisana.\u003C\u002Fli>\n\u003Cli>\u003Ccode>value\u003C\u002Fcode>: Wartość do zapisania pod określonym indeksem. Typ wartości musi być zgodny z typem elementu już przechowywanego na tej pozycji w tablicy.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Nic.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cdiv class=\"callout callout-warning\">\n\u003Cdiv class=\"callout-title\">\u003Cspan class=\"callout-icon\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\u003Cpath d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\"\u002F>\u003Cpath d=\"M12 9v4\"\u002F>\u003Cpath d=\"M12 17h.01\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\u003Cspan>Warning\u003C\u002Fspan>\u003C\u002Fdiv>\n\u003Cdiv class=\"callout-content\">\n\u003Cp>Musisz upewnić się, że indeks mieści się w prawidłowych granicach (tj. \u003Ccode>0 &lt;= index &lt; array::len(arr)\u003C\u002Fcode>) przed wywołaniem tej funkcji. Próba zapisu do indeksu, który nie istnieje, zakończy się \u003Cstrong>błędem wykonania programu\u003C\u002Fstrong>, co może skutkować niezdefiniowanym zachowaniem. Zawsze najpierw zwaliduj indeks używając \u003Ccode>array::len()\u003C\u002Fcode>.\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Utwórz tablicę z początkowymi wartościami\u003C\u002Fspan>\n\u003Cspan class=\"variable\">temps\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::new\u003C\u002Fspan>(\u003Cspan class=\"number\">21.5\u003C\u002Fspan>, \u003Cspan class=\"number\">22.0\u003C\u002Fspan>, \u003Cspan class=\"number\">19.8\u003C\u002Fspan>, \u003Cspan class=\"number\">23.1\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Bezpieczna aktualizacja: najpierw sprawdź granice\u003C\u002Fspan>\n\u003Cspan class=\"variable\">index\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"number\">1\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">index\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::len\u003C\u002Fspan>(\u003Cspan class=\"variable\">temps\u003C\u002Fspan>)) {\n    \u003Cspan class=\"stdlib\">array::put_at\u003C\u002Fspan>(\u003Cspan class=\"variable\">temps\u003C\u002Fspan>, \u003Cspan class=\"variable\">index\u003C\u002Fspan>, \u003Cspan class=\"number\">25.0\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zastąp 22.0 przez 25.0\u003C\u002Fspan>\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Aktualizuj wszystkie wartości w pętli\u003C\u002Fspan>\n\u003Cspan class=\"variable\">i\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">while\u003C\u002Fspan> (\u003Cspan class=\"variable\">i\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::len\u003C\u002Fspan>(\u003Cspan class=\"variable\">temps\u003C\u002Fspan>)) {\n    \u003Cspan class=\"variable\">current\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::get_at\u003C\u002Fspan>(\u003Cspan class=\"variable\">temps\u003C\u002Fspan>, \u003Cspan class=\"variable\">i\u003C\u002Fspan>)\n    \u003Cspan class=\"comment\">\u002F\u002F Zastosuj współczynnik korekcji\u003C\u002Fspan>\n    \u003Cspan class=\"stdlib\">array::put_at\u003C\u002Fspan>(\u003Cspan class=\"variable\">temps\u003C\u002Fspan>, \u003Cspan class=\"variable\">i\u003C\u002Fspan>, \u003Cspan class=\"variable\">current\u003C\u002Fspan> \u003Cspan class=\"operator\">+\u003C\u002Fspan> \u003Cspan class=\"number\">0.5\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">i\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">i\u003C\u002Fspan> \u003Cspan class=\"operator\">+\u003C\u002Fspan> \u003Cspan class=\"number\">1\u003C\u002Fspan>\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Aktualizuj określone elementy w tablicy łańcuchów\u003C\u002Fspan>\n\u003Cspan class=\"variable\">sensors\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::new\u003C\u002Fspan>(\u003Cspan class=\"string\">\"sensor1\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"sensor2\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"sensor3\"\u003C\u002Fspan>)\n\u003Cspan class=\"stdlib\">array::put_at\u003C\u002Fspan>(\u003Cspan class=\"variable\">sensors\u003C\u002Fspan>, \u003Cspan class=\"number\">0\u003C\u002Fspan>, \u003Cspan class=\"string\">\"temp1\"\u003C\u002Fspan>)\n\u003Cspan class=\"stdlib\">array::put_at\u003C\u002Fspan>(\u003Cspan class=\"variable\">sensors\u003C\u002Fspan>, \u003Cspan class=\"number\">1\u003C\u002Fspan>, \u003Cspan class=\"string\">\"temp2\"\u003C\u002Fspan>)\n\u003Cspan class=\"stdlib\">array::put_at\u003C\u002Fspan>(\u003Cspan class=\"variable\">sensors\u003C\u002Fspan>, \u003Cspan class=\"number\">2\u003C\u002Fspan>, \u003Cspan class=\"string\">\"humidity\"\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F NIEBEZPIECZNE: Nigdy nie rób tego bez sprawdzania granic!\u003C\u002Fspan>\n\u003Cspan class=\"comment\">\u002F\u002F array::put_at(temps, 10, 99.9) \u002F\u002F Niezdefiniowane zachowanie - może spowodować awarię!\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"array-append\">\u003Ca href=\"#array-append\" class=\"anchor\">#\u003C\u002Fa> array::append\u003C\u002Fh3>\n\u003Cp>Dodaje wartość na koniec tablicy, zwiększając jej rozmiar o jeden. Ta funkcja jest przydatna do dynamicznego budowania tablic, gdy końcowy rozmiar nie jest znany z góry.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>arr\u003C\u002Fcode>: Nieprzezroczysty uchwyt tablicy zwrócony przez \u003Ccode>array::new\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>value\u003C\u002Fcode>: Wartość do dodania na końcu tablicy. \u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Nic.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Buduj tablicę dynamicznie dodając wartości\u003C\u002Fspan>\n\u003Cspan class=\"variable\">temps\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::new\u003C\u002Fspan>(\u003Cspan class=\"number\">21.5\u003C\u002Fspan>)\n\u003Cspan class=\"stdlib\">array::append\u003C\u002Fspan>(\u003Cspan class=\"variable\">temps\u003C\u002Fspan>, \u003Cspan class=\"number\">22.0\u003C\u002Fspan>)\n\u003Cspan class=\"stdlib\">array::append\u003C\u002Fspan>(\u003Cspan class=\"variable\">temps\u003C\u002Fspan>, \u003Cspan class=\"number\">19.8\u003C\u002Fspan>)\n\u003Cspan class=\"stdlib\">array::append\u003C\u002Fspan>(\u003Cspan class=\"variable\">temps\u003C\u002Fspan>, \u003Cspan class=\"number\">23.1\u003C\u002Fspan>)\n\u003Cspan class=\"comment\">\u002F\u002F temps teraz zawiera: [21.5, 22.0, 19.8, 23.1]\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Zbieraj odczyty czujników w czasie\u003C\u002Fspan>\n\u003Cspan class=\"variable\">readings\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::new\u003C\u002Fspan>(\u003Cspan class=\"number\">0.0\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zainicjalizuj pierwszym odczytem\u003C\u002Fspan>\n\u003Cspan class=\"stdlib\">array::append\u003C\u002Fspan>(\u003Cspan class=\"variable\">readings\u003C\u002Fspan>, \u003Cspan class=\"number\">0.5\u003C\u002Fspan>)\n\u003Cspan class=\"stdlib\">array::append\u003C\u002Fspan>(\u003Cspan class=\"variable\">readings\u003C\u002Fspan>, \u003Cspan class=\"number\">1.2\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Sprawdź nowy rozmiar\u003C\u002Fspan>\n\u003Cspan class=\"variable\">count\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::len\u003C\u002Fspan>(\u003Cspan class=\"variable\">readings\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca 3\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Dodawaj w pętli (np. zbieranie 5 odczytów)\u003C\u002Fspan>\n\u003Cspan class=\"variable\">data\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::new\u003C\u002Fspan>(\u003Cspan class=\"number\">100\u003C\u002Fspan>)\n\u003Cspan class=\"variable\">i\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">while\u003C\u002Fspan> (\u003Cspan class=\"variable\">i\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;\u003C\u002Fspan> \u003Cspan class=\"number\">4\u003C\u002Fspan>) {\n    \u003Cspan class=\"stdlib\">array::append\u003C\u002Fspan>(\u003Cspan class=\"variable\">data\u003C\u002Fspan>, \u003Cspan class=\"number\">100\u003C\u002Fspan> \u003Cspan class=\"operator\">+\u003C\u002Fspan> \u003Cspan class=\"variable\">i\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">i\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">i\u003C\u002Fspan> \u003Cspan class=\"operator\">+\u003C\u002Fspan> \u003Cspan class=\"number\">1\u003C\u002Fspan>\n}\n\u003Cspan class=\"comment\">\u002F\u002F data teraz zawiera: [100, 100, 101, 102, 103]\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"array-clear\">\u003Ca href=\"#array-clear\" class=\"anchor\">#\u003C\u002Fa> array::clear\u003C\u002Fh3>\n\u003Cp>Usuwa wszystkie elementy z tablicy, pozostawiając ją pustą. Po wywołaniu tej funkcji \u003Ccode>array::len(arr)\u003C\u002Fcode> zwróci \u003Ccode>0\u003C\u002Fcode>. Ta funkcja jest przydatna do ponownego wykorzystania tablicy bez tworzenia nowej.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>arr\u003C\u002Fcode>: Nieprzezroczysty uchwyt tablicy zwrócony przez \u003Ccode>array::new\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Nic.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Utwórz i wypełnij tablicę\u003C\u002Fspan>\n\u003Cspan class=\"variable\">temps\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::new\u003C\u002Fspan>(\u003Cspan class=\"number\">21.5\u003C\u002Fspan>, \u003Cspan class=\"number\">22.0\u003C\u002Fspan>, \u003Cspan class=\"number\">19.8\u003C\u002Fspan>, \u003Cspan class=\"number\">23.1\u003C\u002Fspan>)\n\u003Cspan class=\"stdlib\">std::print\u003C\u002Fspan>(\u003Cspan class=\"stdlib\">str::fmt\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Długość przed wyczyszczeniem: {}\"\u003C\u002Fspan>, \u003Cspan class=\"stdlib\">array::len\u003C\u002Fspan>(\u003Cspan class=\"variable\">temps\u003C\u002Fspan>))) \u003Cspan class=\"comment\">\u002F\u002F 4\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Wyczyść wszystkie elementy\u003C\u002Fspan>\n\u003Cspan class=\"stdlib\">array::clear\u003C\u002Fspan>(\u003Cspan class=\"variable\">temps\u003C\u002Fspan>)\n\u003Cspan class=\"stdlib\">std::print\u003C\u002Fspan>(\u003Cspan class=\"stdlib\">str::fmt\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Długość po wyczyszczeniu: {}\"\u003C\u002Fspan>, \u003Cspan class=\"stdlib\">array::len\u003C\u002Fspan>(\u003Cspan class=\"variable\">temps\u003C\u002Fspan>))) \u003Cspan class=\"comment\">\u002F\u002F 0\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Tablica może być ponownie użyta\u003C\u002Fspan>\n\u003Cspan class=\"stdlib\">array::append\u003C\u002Fspan>(\u003Cspan class=\"variable\">temps\u003C\u002Fspan>, \u003Cspan class=\"number\">25.0\u003C\u002Fspan>)\n\u003Cspan class=\"stdlib\">array::append\u003C\u002Fspan>(\u003Cspan class=\"variable\">temps\u003C\u002Fspan>, \u003Cspan class=\"number\">26.5\u003C\u002Fspan>)\n\u003Cspan class=\"comment\">\u002F\u002F temps teraz zawiera: [25.0, 26.5]\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Przydatne do okresowego zbierania danych - wyczyść stare odczyty\u003C\u002Fspan>\n\u003Cspan class=\"variable\">readings\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::new\u003C\u002Fspan>(\u003Cspan class=\"number\">0.0\u003C\u002Fspan>)\n\u003Cspan class=\"comment\">\u002F\u002F ... zbieraj odczyty ...\u003C\u002Fspan>\n\u003Cspan class=\"stdlib\">array::append\u003C\u002Fspan>(\u003Cspan class=\"variable\">readings\u003C\u002Fspan>, \u003Cspan class=\"number\">1.5\u003C\u002Fspan>)\n\u003Cspan class=\"stdlib\">array::append\u003C\u002Fspan>(\u003Cspan class=\"variable\">readings\u003C\u002Fspan>, \u003Cspan class=\"number\">2.3\u003C\u002Fspan>)\n\u003Cspan class=\"comment\">\u002F\u002F ... przetwórz odczyty ...\u003C\u002Fspan>\n\u003Cspan class=\"comment\">\u002F\u002F Zresetuj dla następnego cyklu zbierania\u003C\u002Fspan>\n\u003Cspan class=\"stdlib\">array::clear\u003C\u002Fspan>(\u003Cspan class=\"variable\">readings\u003C\u002Fspan>)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch2 id=\"operacje-na-mapach\">\u003Ca href=\"#operacje-na-mapach\" class=\"anchor\">#\u003C\u002Fa> Operacje na mapach\u003C\u002Fh2>\n\u003Cp>Ta sekcja opisuje funkcje do tworzenia i manipulowania mapami (słownikami klucz-wartość). Mapy w Volang używają łańcuchów jako kluczy i mogą przechowywać wartości dowolnego typu.\u003C\u002Fp>\n\u003Ch3 id=\"map-new\">\u003Ca href=\"#map-new\" class=\"anchor\">#\u003C\u002Fa> map::new\u003C\u002Fh3>\n\u003Cp>Tworzy nową pustą mapę. Mapa to kolekcja par klucz-wartość, gdzie klucze są zawsze łańcuchami. Wartości mogą być dowolnego typu (liczby, łańcuchy, wartości logiczne, tablice lub inne mapy). Mapy są przydatne do przechowywania danych strukturalnych, ustawień konfiguracyjnych lub reprezentowania obiektów podobnych do JSON.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Brak.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Nieprzezroczysty uchwyt reprezentujący utworzoną mapę. Ten uchwyt powinien być przekazywany do innych funkcji mapowych (takich jak \u003Ccode>map::set\u003C\u002Fcode>, \u003Ccode>map::get\u003C\u002Fcode>, \u003Ccode>map::contains\u003C\u002Fcode>) w celu manipulowania zawartością mapy.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Utwórz pustą mapę\u003C\u002Fspan>\n\u003Cspan class=\"variable\">config\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">map::new\u003C\u002Fspan>()\n\n\u003Cspan class=\"comment\">\u002F\u002F Mapa jest teraz gotowa do przechowywania par klucz-wartość\u003C\u002Fspan>\n\u003Cspan class=\"comment\">\u002F\u002F map::set(config, \"temperature\", 22.5)\u003C\u002Fspan>\n\u003Cspan class=\"comment\">\u002F\u002F map::set(config, \"location\", \"Salon\")\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Mapy są również zwracane przez niektóre funkcje, np. nagłówki odpowiedzi HTTP\u003C\u002Fspan>\n\u003Cspan class=\"comment\">\u002F\u002F W callbacku http::on_response parametr 'headers' jest mapą\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"map-len\">\u003Ca href=\"#map-len\" class=\"anchor\">#\u003C\u002Fa> map::len\u003C\u002Fh3>\n\u003Cp>Zwraca liczbę par klucz-wartość aktualnie przechowywanych w mapie. Ta funkcja jest przydatna do sprawdzania, czy mapa jest pusta lub określania, ile zawiera wpisów.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>map\u003C\u002Fcode>: Nieprzezroczysty uchwyt mapy zwrócony przez \u003Ccode>map::new\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Wartość całkowitą reprezentującą liczbę par klucz-wartość w mapie.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"variable\">config\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">map::new\u003C\u002Fspan>()\n\n\u003Cspan class=\"comment\">\u002F\u002F Sprawdź rozmiar pustej mapy\u003C\u002Fspan>\n\u003Cspan class=\"variable\">count\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">map::len\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca 0\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Po dodaniu elementów, liczba rośnie\u003C\u002Fspan>\n\u003Cspan class=\"comment\">\u002F\u002F map::set(config, \"temperature\", 22.5)\u003C\u002Fspan>\n\u003Cspan class=\"comment\">\u002F\u002F map::set(config, \"humidity\", 45)\u003C\u002Fspan>\n\u003Cspan class=\"comment\">\u002F\u002F count = map::len(config) \u002F\u002F Zwraca 2\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Sprawdź, czy mapa jest pusta\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"stdlib\">map::len\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>) \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>) {\n    \u003Cspan class=\"stdlib\">std::print\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Mapa jest pusta\"\u003C\u002Fspan>)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"map-set\">\u003Ca href=\"#map-set\" class=\"anchor\">#\u003C\u002Fa> map::set\u003C\u002Fh3>\n\u003Cp>Dodaje lub aktualizuje wartość dla określonego klucza w mapie. Jeśli klucz nie istnieje, tworzona jest nowa para klucz-wartość. Jeśli klucz już istnieje, wartość jest zastępowana nową, ale nowa wartość musi być tego samego typu co istniejąca wartość.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>map\u003C\u002Fcode>: Nieprzezroczysty uchwyt mapy zwrócony przez \u003Ccode>map::new\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>key\u003C\u002Fcode>: Łańcuch określający nazwę klucza.\u003C\u002Fli>\n\u003Cli>\u003Ccode>value\u003C\u002Fcode>: Wartość do zapisania. Może być dowolnego typu (liczba, łańcuch, wartość logiczna, tablica lub inna mapa).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Nic.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"variable\">config\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">map::new\u003C\u002Fspan>()\n\n\u003Cspan class=\"comment\">\u002F\u002F Dodaj nowe pary klucz-wartość\u003C\u002Fspan>\n\u003Cspan class=\"variable\">map\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>, \u003Cspan class=\"string\">\"temperature\"\u003C\u002Fspan>, \u003Cspan class=\"number\">22.5\u003C\u002Fspan>)\n\u003Cspan class=\"variable\">map\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>, \u003Cspan class=\"string\">\"location\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"Salon\"\u003C\u002Fspan>)\n\u003Cspan class=\"variable\">map\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>, \u003Cspan class=\"string\">\"active\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Aktualizuj istniejącą wartość (wymagany ten sam typ)\u003C\u002Fspan>\n\u003Cspan class=\"variable\">map\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>, \u003Cspan class=\"string\">\"temperature\"\u003C\u002Fspan>, \u003Cspan class=\"number\">23.0\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F OK - float do float\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Przechowuj różne typy pod różnymi kluczami\u003C\u002Fspan>\n\u003Cspan class=\"variable\">map\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>, \u003Cspan class=\"string\">\"sensor_count\"\u003C\u002Fspan>, \u003Cspan class=\"number\">5\u003C\u002Fspan>)      \u003Cspan class=\"comment\">\u002F\u002F integer\u003C\u002Fspan>\n\u003Cspan class=\"variable\">map\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>, \u003Cspan class=\"string\">\"sensor_name\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"temp1\"\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F string\u003C\u002Fspan>\n\u003Cspan class=\"variable\">map\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>, \u003Cspan class=\"string\">\"enabled\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)        \u003Cspan class=\"comment\">\u002F\u002F boolean\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"map-get\">\u003Ca href=\"#map-get\" class=\"anchor\">#\u003C\u002Fa> map::get\u003C\u002Fh3>\n\u003Cp>Pobiera wartość powiązaną z określonym kluczem z mapy. Typ zwracany zależy od tego, co zostało zapisane pod tym kluczem.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>map\u003C\u002Fcode>: Nieprzezroczysty uchwyt mapy zwrócony przez \u003Ccode>map::new\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>key\u003C\u002Fcode>: Łańcuch określający nazwę klucza do pobrania.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Wartość przechowywaną pod określonym kluczem. Typ zwracany odpowiada typowi przechowywanej wartości.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cdiv class=\"callout callout-warning\">\n\u003Cdiv class=\"callout-title\">\u003Cspan class=\"callout-icon\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\u003Cpath d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\"\u002F>\u003Cpath d=\"M12 9v4\"\u002F>\u003Cpath d=\"M12 17h.01\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\u003Cspan>Warning\u003C\u002Fspan>\u003C\u002Fdiv>\n\u003Cdiv class=\"callout-content\">\n\u003Cp>Określony klucz musi istnieć w mapie. Próba pobrania wartości dla nieistniejącego klucza spowoduje \u003Cstrong>błąd wykonania\u003C\u002Fstrong>. Zawsze używaj \u003Ccode>map::contains\u003C\u002Fcode>, aby zweryfikować istnienie klucza przed wywołaniem tej funkcji.\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"variable\">config\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">map::new\u003C\u002Fspan>()\n\u003Cspan class=\"variable\">map\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>, \u003Cspan class=\"string\">\"temperature\"\u003C\u002Fspan>, \u003Cspan class=\"number\">22.5\u003C\u002Fspan>)\n\u003Cspan class=\"variable\">map\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>, \u003Cspan class=\"string\">\"location\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"Salon\"\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Bezpieczny dostęp: najpierw sprawdź, czy klucz istnieje\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">map\u003C\u002Fspan>::\u003Cspan class=\"function\">contains\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>, \u003Cspan class=\"string\">\"temperature\"\u003C\u002Fspan>)) {\n    \u003Cspan class=\"variable\">temp\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">map::get\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>, \u003Cspan class=\"string\">\"temperature\"\u003C\u002Fspan>)\n    \u003Cspan class=\"stdlib\">std::print\u003C\u002Fspan>(\u003Cspan class=\"stdlib\">str::fmt\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Temperatura: {}°C\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">temp\u003C\u002Fspan>))\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Dostęp do wartości, gdy wiesz, że klucz istnieje\u003C\u002Fspan>\n\u003Cspan class=\"variable\">location\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">map::get\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>, \u003Cspan class=\"string\">\"location\"\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca \"Salon\"\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F NIEBEZPIECZNE: Nigdy nie rób tego bez sprawdzenia!\u003C\u002Fspan>\n\u003Cspan class=\"comment\">\u002F\u002F value = map::get(config, \"nonexistent\") \u002F\u002F Błąd wykonania!\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"map-clear\">\u003Ca href=\"#map-clear\" class=\"anchor\">#\u003C\u002Fa> map::clear\u003C\u002Fh3>\n\u003Cp>Usuwa wszystkie pary klucz-wartość z mapy, pozostawiając ją pustą. Po wywołaniu tej funkcji \u003Ccode>map::len(map)\u003C\u002Fcode> zwróci \u003Ccode>0\u003C\u002Fcode>. Ta funkcja jest przydatna do ponownego wykorzystania mapy bez tworzenia nowej.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>map\u003C\u002Fcode>: Nieprzezroczysty uchwyt mapy zwrócony przez \u003Ccode>map::new\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Nic.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"variable\">config\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">map::new\u003C\u002Fspan>()\n\u003Cspan class=\"variable\">map\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>, \u003Cspan class=\"string\">\"temperature\"\u003C\u002Fspan>, \u003Cspan class=\"number\">22.5\u003C\u002Fspan>)\n\u003Cspan class=\"variable\">map\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>, \u003Cspan class=\"string\">\"humidity\"\u003C\u002Fspan>, \u003Cspan class=\"number\">45\u003C\u002Fspan>)\n\u003Cspan class=\"stdlib\">std::print\u003C\u002Fspan>(\u003Cspan class=\"stdlib\">str::fmt\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Rozmiar przed wyczyszczeniem: {}\"\u003C\u002Fspan>, \u003Cspan class=\"stdlib\">map::len\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>))) \u003Cspan class=\"comment\">\u002F\u002F 2\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Wyczyść wszystkie wpisy\u003C\u002Fspan>\n\u003Cspan class=\"stdlib\">map::clear\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>)\n\u003Cspan class=\"stdlib\">std::print\u003C\u002Fspan>(\u003Cspan class=\"stdlib\">str::fmt\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Rozmiar po wyczyszczeniu: {}\"\u003C\u002Fspan>, \u003Cspan class=\"stdlib\">map::len\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>))) \u003Cspan class=\"comment\">\u002F\u002F 0\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Mapa może być ponownie użyta\u003C\u002Fspan>\n\u003Cspan class=\"variable\">map\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>, \u003Cspan class=\"string\">\"new_key\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"new_value\"\u003C\u002Fspan>)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"map-contains\">\u003Ca href=\"#map-contains\" class=\"anchor\">#\u003C\u002Fa> map::contains\u003C\u002Fh3>\n\u003Cp>Sprawdza, czy określony klucz istnieje w mapie. Ta funkcja powinna być używana przed wywołaniem \u003Ccode>map::get\u003C\u002Fcode>, aby uniknąć błędów wykonania przy dostępie do nieistniejących kluczy.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>map\u003C\u002Fcode>: Nieprzezroczysty uchwyt mapy zwrócony przez \u003Ccode>map::new\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>key\u003C\u002Fcode>: Łańcuch określający nazwę klucza do sprawdzenia.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>true\u003C\u002Fcode>, jeśli klucz istnieje w mapie; w przeciwnym razie zwraca \u003Ccode>false\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"variable\">config\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">map::new\u003C\u002Fspan>()\n\u003Cspan class=\"variable\">map\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>, \u003Cspan class=\"string\">\"temperature\"\u003C\u002Fspan>, \u003Cspan class=\"number\">22.5\u003C\u002Fspan>)\n\u003Cspan class=\"variable\">map\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>, \u003Cspan class=\"string\">\"location\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"Salon\"\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Sprawdź, czy klucz istnieje\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">map\u003C\u002Fspan>::\u003Cspan class=\"function\">contains\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>, \u003Cspan class=\"string\">\"temperature\"\u003C\u002Fspan>)) {\n    \u003Cspan class=\"stdlib\">std::print\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Klucz temperature istnieje\"\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">temp\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">map::get\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>, \u003Cspan class=\"string\">\"temperature\"\u003C\u002Fspan>)\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Sprawdź nieistniejący klucz\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">map\u003C\u002Fspan>::\u003Cspan class=\"function\">contains\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>, \u003Cspan class=\"string\">\"humidity\"\u003C\u002Fspan>)) {\n    \u003Cspan class=\"variable\">humidity\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">map::get\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>, \u003Cspan class=\"string\">\"humidity\"\u003C\u002Fspan>)\n} \u003Cspan class=\"keyword\">else\u003C\u002Fspan> {\n    \u003Cspan class=\"stdlib\">std::print\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Wilgotność nie ustawiona\"\u003C\u002Fspan>)\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Użyj w logice warunkowej\u003C\u002Fspan>\n\u003Cspan class=\"variable\">key\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"string\">\"location\"\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">map\u003C\u002Fspan>::\u003Cspan class=\"function\">contains\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>, \u003Cspan class=\"variable\">key\u003C\u002Fspan>)) {\n    \u003Cspan class=\"variable\">value\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">map::get\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>, \u003Cspan class=\"variable\">key\u003C\u002Fspan>)\n    \u003Cspan class=\"stdlib\">std::print\u003C\u002Fspan>(\u003Cspan class=\"stdlib\">str::fmt\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Znaleziono {}: {}\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">key\u003C\u002Fspan>, \u003Cspan class=\"variable\">value\u003C\u002Fspan>))\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"map-keys\">\u003Ca href=\"#map-keys\" class=\"anchor\">#\u003C\u002Fa> map::keys\u003C\u002Fh3>\n\u003Cp>Zwraca tablicę zawierającą wszystkie klucze aktualnie przechowywane w mapie. Zwróconą tablicę można iterować za pomocą \u003Ccode>array::len\u003C\u002Fcode> i \u003Ccode>array::get_at\u003C\u002Fcode>, aby przetworzyć każdy klucz. Kolejność kluczy nie jest gwarantowana.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>map\u003C\u002Fcode>: Nieprzezroczysty uchwyt mapy zwrócony przez \u003Ccode>map::new\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Tablicę łańcuchów, gdzie każdy element jest kluczem z mapy.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"variable\">settings\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">map::new\u003C\u002Fspan>()\n\u003Cspan class=\"variable\">map\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"variable\">settings\u003C\u002Fspan>, \u003Cspan class=\"string\">\"brightness\"\u003C\u002Fspan>, \u003Cspan class=\"number\">80\u003C\u002Fspan>)\n\u003Cspan class=\"variable\">map\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"variable\">settings\u003C\u002Fspan>, \u003Cspan class=\"string\">\"color\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"warm\"\u003C\u002Fspan>)\n\u003Cspan class=\"variable\">map\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"variable\">settings\u003C\u002Fspan>, \u003Cspan class=\"string\">\"enabled\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n\n\u003Cspan class=\"variable\">keys\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">map\u003C\u002Fspan>::\u003Cspan class=\"function\">keys\u003C\u002Fspan>(\u003Cspan class=\"variable\">settings\u003C\u002Fspan>)\n\u003Cspan class=\"variable\">i\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">while\u003C\u002Fspan> (\u003Cspan class=\"variable\">i\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::len\u003C\u002Fspan>(\u003Cspan class=\"variable\">keys\u003C\u002Fspan>)) {\n    \u003Cspan class=\"variable\">key\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::get_at\u003C\u002Fspan>(\u003Cspan class=\"variable\">keys\u003C\u002Fspan>, \u003Cspan class=\"variable\">i\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">value\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">map::get\u003C\u002Fspan>(\u003Cspan class=\"variable\">settings\u003C\u002Fspan>, \u003Cspan class=\"variable\">key\u003C\u002Fspan>)\n    \u003Cspan class=\"stdlib\">std::print\u003C\u002Fspan>(\u003Cspan class=\"stdlib\">str::fmt\u003C\u002Fspan>(\u003Cspan class=\"string\">\"{} = {}\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">key\u003C\u002Fspan>, \u003Cspan class=\"variable\">value\u003C\u002Fspan>))\n    \u003Cspan class=\"variable\">i\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">i\u003C\u002Fspan> \u003Cspan class=\"operator\">+\u003C\u002Fspan> \u003Cspan class=\"number\">1\u003C\u002Fspan>\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"map-values\">\u003Ca href=\"#map-values\" class=\"anchor\">#\u003C\u002Fa> map::values\u003C\u002Fh3>\n\u003Cp>Zwraca tablicę zawierającą wszystkie wartości aktualnie przechowywane w mapie. Zwróconą tablicę można iterować za pomocą \u003Ccode>array::len\u003C\u002Fcode> i \u003Ccode>array::get_at\u003C\u002Fcode>. Kolejność wartości odpowiada kolejności kluczy zwracanych przez \u003Ccode>map::keys\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>map\u003C\u002Fcode>: Nieprzezroczysty uchwyt mapy zwrócony przez \u003Ccode>map::new\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Tablicę wartości, gdzie każdy element jest wartością z mapy. Elementy mogą być dowolnego typu.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"variable\">sensors\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">map::new\u003C\u002Fspan>()\n\u003Cspan class=\"variable\">map\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"variable\">sensors\u003C\u002Fspan>, \u003Cspan class=\"string\">\"temp\"\u003C\u002Fspan>, \u003Cspan class=\"number\">22.5\u003C\u002Fspan>)\n\u003Cspan class=\"variable\">map\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"variable\">sensors\u003C\u002Fspan>, \u003Cspan class=\"string\">\"humidity\"\u003C\u002Fspan>, \u003Cspan class=\"number\">65\u003C\u002Fspan>)\n\n\u003Cspan class=\"variable\">values\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">map\u003C\u002Fspan>::\u003Cspan class=\"function\">values\u003C\u002Fspan>(\u003Cspan class=\"variable\">sensors\u003C\u002Fspan>)\n\u003Cspan class=\"variable\">i\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">while\u003C\u002Fspan> (\u003Cspan class=\"variable\">i\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::len\u003C\u002Fspan>(\u003Cspan class=\"variable\">values\u003C\u002Fspan>)) {\n    \u003Cspan class=\"stdlib\">std::print\u003C\u002Fspan>(\u003Cspan class=\"stdlib\">array::get_at\u003C\u002Fspan>(\u003Cspan class=\"variable\">values\u003C\u002Fspan>, \u003Cspan class=\"variable\">i\u003C\u002Fspan>))\n    \u003Cspan class=\"variable\">i\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">i\u003C\u002Fspan> \u003Cspan class=\"operator\">+\u003C\u002Fspan> \u003Cspan class=\"number\">1\u003C\u002Fspan>\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch2 id=\"operacje-json\">\u003Ca href=\"#operacje-json\" class=\"anchor\">#\u003C\u002Fa> Operacje JSON\u003C\u002Fh2>\n\u003Cp>Ta sekcja opisuje funkcje do pracy z danymi JSON. JSON (JavaScript Object Notation) to popularny format wymiany danych, szczególnie przy komunikacji z API webowymi.\u003C\u002Fp>\n\u003Ch3 id=\"json-get\">\u003Ca href=\"#json-get\" class=\"anchor\">#\u003C\u002Fa> json::get\u003C\u002Fh3>\n\u003Cp>Wyodrębnia wartość z łańcucha JSON używając ścieżki w notacji kropkowej. Ta funkcja parsuje JSON i nawiguje przez zagnieżdżone obiekty, aby pobrać wartość w określonej lokalizacji.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>json\u003C\u002Fcode>: Łańcuch zawierający poprawne dane JSON.\u003C\u002Fli>\n\u003Cli>\u003Ccode>path\u003C\u002Fcode>: Łańcuch określający ścieżkę do żądanego pola w notacji kropkowej (np. \u003Ccode>&quot;a.b.c.d&quot;\u003C\u002Fcode>).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Wartość pod określoną ścieżką. Typ zwracany zależy od typu wartości JSON: \u003Ccode>string\u003C\u002Fcode>, \u003Ccode>number\u003C\u002Fcode>, \u003Ccode>bool\u003C\u002Fcode> lub \u003Ccode>array\u003C\u002Fcode> (ten sam typ tablicy co opisany w Operacjach na tablicach, używalny z funkcjami \u003Ccode>array::*\u003C\u002Fcode>).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Prosty obiekt JSON\u003C\u002Fspan>\n\u003Cspan class=\"variable\">json_data\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"string\">\"\"\"{\"temperature\": 22.5, \"location\": \"Salon\", \"active\": true}\"\"\"\u003C\u002Fspan>\n\u003Cspan class=\"variable\">temp\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">json::get\u003C\u002Fspan>(\u003Cspan class=\"variable\">json_data\u003C\u002Fspan>, \u003Cspan class=\"string\">\"temperature\"\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca 22.5\u003C\u002Fspan>\n\u003Cspan class=\"variable\">location\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">json::get\u003C\u002Fspan>(\u003Cspan class=\"variable\">json_data\u003C\u002Fspan>, \u003Cspan class=\"string\">\"location\"\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca \"Salon\"\u003C\u002Fspan>\n\u003Cspan class=\"variable\">active\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">json::get\u003C\u002Fspan>(\u003Cspan class=\"variable\">json_data\u003C\u002Fspan>, \u003Cspan class=\"string\">\"active\"\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca true\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Zagnieżdżony obiekt JSON\u003C\u002Fspan>\n\u003Cspan class=\"variable\">nested\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"string\">\"\"\"{\"sensor\": {\"id\": \"temp1\", \"value\": 23.5, \"enabled\": false}}\"\"\"\u003C\u002Fspan>\n\u003Cspan class=\"variable\">sensor_id\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">json::get\u003C\u002Fspan>(\u003Cspan class=\"variable\">nested\u003C\u002Fspan>, \u003Cspan class=\"string\">\"sensor.id\"\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca \"temp1\"\u003C\u002Fspan>\n\u003Cspan class=\"variable\">sensor_value\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">json::get\u003C\u002Fspan>(\u003Cspan class=\"variable\">nested\u003C\u002Fspan>, \u003Cspan class=\"string\">\"sensor.value\"\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca 23.5\u003C\u002Fspan>\n\u003Cspan class=\"variable\">sensor_enabled\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">json::get\u003C\u002Fspan>(\u003Cspan class=\"variable\">nested\u003C\u002Fspan>, \u003Cspan class=\"string\">\"sensor.enabled\"\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca false\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Głęboko zagnieżdżona struktura\u003C\u002Fspan>\n\u003Cspan class=\"variable\">deep\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"string\">\"\"\"{\"building\": {\"floor\": {\"room\": {\"temperature\": 22.0}}}}\"\"\"\u003C\u002Fspan>\n\u003Cspan class=\"variable\">room_temp\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">json::get\u003C\u002Fspan>(\u003Cspan class=\"variable\">deep\u003C\u002Fspan>, \u003Cspan class=\"string\">\"building.floor.room.temperature\"\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca 22.0\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Pobieranie tablicy\u003C\u002Fspan>\n\u003Cspan class=\"variable\">json_with_array\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"string\">\"\"\"{\"readings\": [21.5, 22.0, 22.5]}\"\"\"\u003C\u002Fspan>\n\u003Cspan class=\"variable\">readings\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">json::get\u003C\u002Fspan>(\u003Cspan class=\"variable\">json_with_array\u003C\u002Fspan>, \u003Cspan class=\"string\">\"readings\"\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca tablicę [21.5, 22.0, 22.5]\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch2 id=\"operacje-http\">\u003Ca href=\"#operacje-http\" class=\"anchor\">#\u003C\u002Fa> Operacje HTTP\u003C\u002Fh2>\n\u003Cp>Ta sekcja opisuje funkcje do wykonywania żądań HTTP do zewnętrznych serwisów. Funkcje te umożliwiają skryptom Volang komunikację z API webowymi, wysyłanie powiadomień lub integrację z usługami zewnętrznymi.\u003C\u002Fp>\n\u003Ch3 id=\"http-client\">\u003Ca href=\"#http-client\" class=\"anchor\">#\u003C\u002Fa> http::client\u003C\u002Fh3>\n\u003Cp>Tworzy nową instancję klienta HTTP wymaganą do wykonywania żądań HTTP. Klient zarządza ustawieniami połączenia, obsługuje wykonywanie żądań i musi zostać utworzony przed wywołaniem jakiejkolwiek innej funkcji HTTP.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Brak.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Nieprzezroczysty uchwyt reprezentujący klienta HTTP. Ten uchwyt powinien być przekazywany do innych funkcji HTTP (takich jak \u003Ccode>http::call\u003C\u002Fcode>) w celu wykonywania żądań.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Utwórz klienta HTTP\u003C\u002Fspan>\n\u003Cspan class=\"variable\">client\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">http::client\u003C\u002Fspan>()\n\n\u003Cspan class=\"comment\">\u002F\u002F Klient jest teraz gotowy do wykonywania żądań\u003C\u002Fspan>\n\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"http-set-method\">\u003Ca href=\"#http-set-method\" class=\"anchor\">#\u003C\u002Fa> http::set_method\u003C\u002Fh3>\n\u003Cp>Ustawia metodę HTTP dla żądania. Ta funkcja musi zostać wywołana przed wykonaniem żądania za pomocą \u003Ccode>http::call\u003C\u002Fcode>. Jeśli nie zostanie ustawiona, domyślną metodą jest \u003Ccode>GET\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>client\u003C\u002Fcode>: Nieprzezroczysty uchwyt klienta HTTP zwrócony przez \u003Ccode>http::client\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>method\u003C\u002Fcode>: Łańcuch określający metodę HTTP. Obsługiwane wartości: \u003Ccode>&quot;GET&quot;\u003C\u002Fcode>, \u003Ccode>&quot;POST&quot;\u003C\u002Fcode>, \u003Ccode>&quot;PUT&quot;\u003C\u002Fcode>, \u003Ccode>&quot;DELETE&quot;\u003C\u002Fcode>, \u003Ccode>&quot;PATCH&quot;\u003C\u002Fcode>, \u003Ccode>&quot;HEAD&quot;\u003C\u002Fcode>, \u003Ccode>&quot;OPTIONS&quot;\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Nic.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"variable\">client\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">http::client\u003C\u002Fspan>()\n\n\u003Cspan class=\"comment\">\u002F\u002F Ustaw metodę na POST do wysyłania danych\u003C\u002Fspan>\n\u003Cspan class=\"stdlib\">http::set_method\u003C\u002Fspan>(\u003Cspan class=\"variable\">client\u003C\u002Fspan>, \u003Cspan class=\"string\">\"POST\"\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Ustaw metodę na GET do pobierania danych (to jest domyślne)\u003C\u002Fspan>\n\u003Cspan class=\"stdlib\">http::set_method\u003C\u002Fspan>(\u003Cspan class=\"variable\">client\u003C\u002Fspan>, \u003Cspan class=\"string\">\"GET\"\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Ustaw metodę na PUT do aktualizacji zasobów\u003C\u002Fspan>\n\u003Cspan class=\"stdlib\">http::set_method\u003C\u002Fspan>(\u003Cspan class=\"variable\">client\u003C\u002Fspan>, \u003Cspan class=\"string\">\"PUT\"\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Ustaw metodę na DELETE do usuwania zasobów\u003C\u002Fspan>\n\u003Cspan class=\"stdlib\">http::set_method\u003C\u002Fspan>(\u003Cspan class=\"variable\">client\u003C\u002Fspan>, \u003Cspan class=\"string\">\"DELETE\"\u003C\u002Fspan>)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"http-set-header\">\u003Ca href=\"#http-set-header\" class=\"anchor\">#\u003C\u002Fa> http::set_header\u003C\u002Fh3>\n\u003Cp>Dodaje niestandardowy nagłówek HTTP do żądania. Ta funkcja może być wywoływana wielokrotnie, aby dodać wiele nagłówków. Nagłówki służą do przekazywania dodatkowych informacji wraz z żądaniem, takich jak tokeny uwierzytelniające, specyfikacje typu zawartości lub niestandardowe metadane.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>client\u003C\u002Fcode>: Nieprzezroczysty uchwyt klienta HTTP zwrócony przez \u003Ccode>http::client\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>key\u003C\u002Fcode>: Łańcuch określający nazwę nagłówka (np. \u003Ccode>&quot;Content-Type&quot;\u003C\u002Fcode>, \u003Ccode>&quot;Authorization&quot;\u003C\u002Fcode>).\u003C\u002Fli>\n\u003Cli>\u003Ccode>value\u003C\u002Fcode>: Łańcuch określający wartość nagłówka.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Nic.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"variable\">client\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">http::client\u003C\u002Fspan>()\n\u003Cspan class=\"stdlib\">http::set_method\u003C\u002Fspan>(\u003Cspan class=\"variable\">client\u003C\u002Fspan>, \u003Cspan class=\"string\">\"POST\"\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Ustaw typ zawartości dla danych JSON\u003C\u002Fspan>\n\u003Cspan class=\"stdlib\">http::set_header\u003C\u002Fspan>(\u003Cspan class=\"variable\">client\u003C\u002Fspan>, \u003Cspan class=\"string\">\"Content-Type\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"application\u002Fjson\"\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Dodaj nagłówek autoryzacji z kluczem API\u003C\u002Fspan>\n\u003Cspan class=\"stdlib\">http::set_header\u003C\u002Fspan>(\u003Cspan class=\"variable\">client\u003C\u002Fspan>, \u003Cspan class=\"string\">\"Authorization\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"Bearer my-api-token-123\"\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Dodaj niestandardowe nagłówki\u003C\u002Fspan>\n\u003Cspan class=\"stdlib\">http::set_header\u003C\u002Fspan>(\u003Cspan class=\"variable\">client\u003C\u002Fspan>, \u003Cspan class=\"string\">\"X-Custom-Header\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"custom-value\"\u003C\u002Fspan>)\n\u003Cspan class=\"stdlib\">http::set_header\u003C\u002Fspan>(\u003Cspan class=\"variable\">client\u003C\u002Fspan>, \u003Cspan class=\"string\">\"Accept\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"application\u002Fjson\"\u003C\u002Fspan>)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"http-set-body\">\u003Ca href=\"#http-set-body\" class=\"anchor\">#\u003C\u002Fa> http::set_body\u003C\u002Fh3>\n\u003Cp>Ustawia zawartość ciała żądania. Ta funkcja jest zazwyczaj używana z żądaniami \u003Ccode>POST\u003C\u002Fcode>, \u003Ccode>PUT\u003C\u002Fcode> lub \u003Ccode>PATCH\u003C\u002Fcode> do wysyłania danych na serwer. Ciało może zawierać JSON, dane formularza lub dowolną inną treść tekstową. Pamiętaj, aby ustawić odpowiedni nagłówek \u003Ccode>Content-Type\u003C\u002Fcode> za pomocą \u003Ccode>http::set_header\u003C\u002Fcode>, aby dopasować go do formatu ciała.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>client\u003C\u002Fcode>: Nieprzezroczysty uchwyt klienta HTTP zwrócony przez \u003Ccode>http::client\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>body\u003C\u002Fcode>: Łańcuch zawierający zawartość ciała żądania.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Nic.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"variable\">client\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">http::client\u003C\u002Fspan>()\n\u003Cspan class=\"stdlib\">http::set_method\u003C\u002Fspan>(\u003Cspan class=\"variable\">client\u003C\u002Fspan>, \u003Cspan class=\"string\">\"POST\"\u003C\u002Fspan>)\n\u003Cspan class=\"stdlib\">http::set_header\u003C\u002Fspan>(\u003Cspan class=\"variable\">client\u003C\u002Fspan>, \u003Cspan class=\"string\">\"Content-Type\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"application\u002Fjson\"\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Ustaw ciało JSON\u003C\u002Fspan>\n\u003Cspan class=\"stdlib\">http::set_body\u003C\u002Fspan>(\u003Cspan class=\"variable\">client\u003C\u002Fspan>, \u003Cspan class=\"string\">\"\"\"{\"temperature\": 22.5, \"humidity\": 45}\"\"\"\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Lub zbuduj ciało dynamicznie używając str::fmt\u003C\u002Fspan>\n\u003Cspan class=\"variable\">temp\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"number\">22.5\u003C\u002Fspan>\n\u003Cspan class=\"variable\">humidity\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"number\">45\u003C\u002Fspan>\n\u003Cspan class=\"variable\">body\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">str::fmt\u003C\u002Fspan>(\u003Cspan class=\"string\">\"\"\"{\"temperature\": {}, \"humidity\": {}}\"\"\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">temp\u003C\u002Fspan>, \u003Cspan class=\"variable\">humidity\u003C\u002Fspan>)\n\u003Cspan class=\"stdlib\">http::set_body\u003C\u002Fspan>(\u003Cspan class=\"variable\">client\u003C\u002Fspan>, \u003Cspan class=\"variable\">body\u003C\u002Fspan>)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"http-call\">\u003Ca href=\"#http-call\" class=\"anchor\">#\u003C\u002Fa> http::call\u003C\u002Fh3>\n\u003Cp>Wykonuje żądanie HTTP na podany URL używając skonfigurowanych ustawień klienta (metoda, nagłówki, ciało). Ta funkcja jest asynchroniczna - wysyła żądanie i natychmiast zwraca sterowanie. Odpowiedź jest dostarczana poprzez funkcję callback \u003Ccode>http::on_response\u003C\u002Fcode>, która musi być zdefiniowana w skrypcie. Obsługiwane protokoły to \u003Ccode>http:\u002F\u002F\u003C\u002Fcode> i \u003Ccode>https:\u002F\u002F\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>client\u003C\u002Fcode>: Nieprzezroczysty uchwyt klienta HTTP zwrócony przez \u003Ccode>http::client\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>url\u003C\u002Fcode>: Łańcuch zawierający pełny URL, na który ma zostać wysłane żądanie.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Nic. Odpowiedź jest dostarczana asynchronicznie poprzez callback \u003Ccode>http::on_response\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Callback: http::on_response(status, body, headers)\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Aby otrzymać odpowiedź HTTP, musisz zdefiniować zewnętrzną funkcję callback o następującej sygnaturze:\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"keyword\">extern\u003C\u002Fspan> \u003Cspan class=\"keyword\">fn\u003C\u002Fspan> \u003Cspan class=\"stdlib\">http::on_response\u003C\u002Fspan>(\u003Cspan class=\"variable\">status\u003C\u002Fspan>, \u003Cspan class=\"variable\">body\u003C\u002Fspan>, \u003Cspan class=\"variable\">headers\u003C\u002Fspan>) {\n    \u003Cspan class=\"comment\">\u002F\u002F Tutaj obsłuż odpowiedź\u003C\u002Fspan>\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\n\u003Cp>\u003Cstrong>Parametry callbacka:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>status\u003C\u002Fcode>: Liczba całkowita reprezentująca kod statusu HTTP (np. \u003Ccode>200\u003C\u002Fcode> dla sukcesu, \u003Ccode>404\u003C\u002Fcode> dla nie znaleziono, \u003Ccode>500\u003C\u002Fcode> dla błędu serwera).\u003C\u002Fli>\n\u003Cli>\u003Ccode>body\u003C\u002Fcode>: Łańcuch zawierający treść ciała odpowiedzi.\u003C\u002Fli>\n\u003Cli>\u003Ccode>headers\u003C\u002Fcode>: Obiekt mapy (zobacz Operacje na mapach) zawierający nagłówki odpowiedzi jako pary klucz-wartość.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Zdefiniuj callback odpowiedzi - zostanie wywołany gdy nadejdzie odpowiedź\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">extern\u003C\u002Fspan> \u003Cspan class=\"keyword\">fn\u003C\u002Fspan> \u003Cspan class=\"stdlib\">http::on_response\u003C\u002Fspan>(\u003Cspan class=\"variable\">status\u003C\u002Fspan>, \u003Cspan class=\"variable\">body\u003C\u002Fspan>, \u003Cspan class=\"variable\">headers\u003C\u002Fspan>) {\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">status\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"number\">200\u003C\u002Fspan>) {\n        \u003Cspan class=\"stdlib\">std::print\u003C\u002Fspan>(\u003Cspan class=\"stdlib\">str::fmt\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Sukces! Odpowiedź: {}\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">body\u003C\u002Fspan>))\n    } \u003Cspan class=\"keyword\">else\u003C\u002Fspan> {\n        \u003Cspan class=\"stdlib\">std::print\u003C\u002Fspan>(\u003Cspan class=\"stdlib\">str::fmt\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Błąd: HTTP {}\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">status\u003C\u002Fspan>))\n    }\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Przygotuj i wyślij żądanie\u003C\u002Fspan>\n\u003Cspan class=\"variable\">client\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">http::client\u003C\u002Fspan>()\n\u003Cspan class=\"stdlib\">http::set_method\u003C\u002Fspan>(\u003Cspan class=\"variable\">client\u003C\u002Fspan>, \u003Cspan class=\"string\">\"GET\"\u003C\u002Fspan>)\n\u003Cspan class=\"stdlib\">http::set_header\u003C\u002Fspan>(\u003Cspan class=\"variable\">client\u003C\u002Fspan>, \u003Cspan class=\"string\">\"Accept\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"application\u002Fjson\"\u003C\u002Fspan>)\n\u003Cspan class=\"stdlib\">http::call\u003C\u002Fspan>(\u003Cspan class=\"variable\">client\u003C\u002Fspan>, \u003Cspan class=\"string\">\"http:\u002F\u002F192.168.1.100\u002Fapi\u002Fstatus\"\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Dla żądania POST z danymi\u003C\u002Fspan>\n\u003Cspan class=\"variable\">client2\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">http::client\u003C\u002Fspan>()\n\u003Cspan class=\"stdlib\">http::set_method\u003C\u002Fspan>(\u003Cspan class=\"variable\">client2\u003C\u002Fspan>, \u003Cspan class=\"string\">\"POST\"\u003C\u002Fspan>)\n\u003Cspan class=\"stdlib\">http::set_header\u003C\u002Fspan>(\u003Cspan class=\"variable\">client2\u003C\u002Fspan>, \u003Cspan class=\"string\">\"Content-Type\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"application\u002Fjson\"\u003C\u002Fspan>)\n\u003Cspan class=\"stdlib\">http::set_body\u003C\u002Fspan>(\u003Cspan class=\"variable\">client2\u003C\u002Fspan>, \u003Cspan class=\"string\">\"\"\"{\"command\": \"turn_on\"}\"\"\"\u003C\u002Fspan>)\n\u003Cspan class=\"stdlib\">http::call\u003C\u002Fspan>(\u003Cspan class=\"variable\">client2\u003C\u002Fspan>, \u003Cspan class=\"string\">\"http:\u002F\u002F192.168.1.100\u002Fapi\u002Fdevice\u002Frelay1\"\u003C\u002Fspan>)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch2 id=\"operacje-czasowe\">\u003Ca href=\"#operacje-czasowe\" class=\"anchor\">#\u003C\u002Fa> Operacje czasowe\u003C\u002Fh2>\u003Ch3 id=\"time-now\">\u003Ca href=\"#time-now\" class=\"anchor\">#\u003C\u002Fa> time::now\u003C\u002Fh3>\n\u003Cp>Pobiera bieżący czas systemowy jako znacznik czasu Unix. Wartość reprezentuje liczbę sekund, które upłynęły od 00:00:00 UTC 1 stycznia 1970 roku (Epoka Unix).\u003C\u002Fp>\n\u003Cp>Ta funkcja jest niezbędna do śledzenia, kiedy wystąpiły zdarzenia, obliczania czasu, który upłynął między akcjami, lub synchronizacji z serwerami zewnętrznymi.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Brak.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Wartość całkowitą reprezentującą bieżący znacznik czasu Unix (w sekundach).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Zapisz czas, kiedy ostatnio wykryto ruch\u003C\u002Fspan>\n\u003Cspan class=\"variable\">last_motion_time\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">time::now\u003C\u002Fspan>()\n\n\u003Cspan class=\"comment\">\u002F\u002F ... później w kodzie ...\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Sprawdź, czy od ostatniego ruchu minęło więcej niż 60 sekund\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"stdlib\">time::now\u003C\u002Fspan>() \u003Cspan class=\"operator\">&gt;\u003C\u002Fspan> \u003Cspan class=\"variable\">last_motion_time\u003C\u002Fspan> \u003Cspan class=\"operator\">+\u003C\u002Fspan> \u003Cspan class=\"number\">60\u003C\u002Fspan>) {\n   ...\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"time-uptime\">\u003Ca href=\"#time-uptime\" class=\"anchor\">#\u003C\u002Fa> time::uptime\u003C\u002Fh3>\n\u003Cp>Zwraca liczbę sekund, które upłynęły od włączenia modułu lub jego ostatniego restartu. Ta wartość jest przydatna do monitorowania stanu systemu, wykrywania nieoczekiwanych restartów lub implementacji logiki czasowej, która powinna się resetować po cyklu zasilania.\u003C\u002Fp>\n\u003Cp>W przeciwieństwie do \u003Ccode>time::now()\u003C\u002Fcode>, która zwraca bezwzględny znacznik czasu, \u003Ccode>time::uptime()\u003C\u002Fcode> zwraca pomiar względny, który zaczyna się od zera przy każdym uruchomieniu modułu.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Brak.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Wartość całkowitą reprezentującą liczbę sekund od uruchomienia modułu.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Zapisz ostrzeżenie, jeśli moduł działa dłużej niż 24 godziny\u003C\u002Fspan>\n\u003Cspan class=\"comment\">\u002F\u002F (może wskazywać, że nie był restartowany w celu konserwacji)\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"stdlib\">time::uptime\u003C\u002Fspan>() \u003Cspan class=\"operator\">&gt;\u003C\u002Fspan> \u003Cspan class=\"number\">86400\u003C\u002Fspan>) {\n    \u003Cspan class=\"stdlib\">std::print\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Moduł działa ponad 24 godziny\"\u003C\u002Fspan>)\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Opóźnij logikę inicjalizacji, aż moduł będzie stabilny przez 10 sekund\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"stdlib\">time::uptime\u003C\u002Fspan>() \u003Cspan class=\"operator\">&gt;\u003C\u002Fspan> \u003Cspan class=\"number\">10\u003C\u002Fspan>) {\n    \u003Cspan class=\"comment\">\u002F\u002F Można założyć, że wszystkie czujniki zostały zainicjalizowane\u003C\u002Fspan>\n    ...\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Wykryj, czy moduł został niedawno zrestartowany\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"stdlib\">time::uptime\u003C\u002Fspan>() \u003Cspan class=\"operator\">&lt;\u003C\u002Fspan> \u003Cspan class=\"number\">60\u003C\u002Fspan>) {\n    \u003Cspan class=\"stdlib\">std::print\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Moduł właśnie wystartował, inicjalizacja...\"\u003C\u002Fspan>)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch2 id=\"operacje-matematyczne\">\u003Ca href=\"#operacje-matematyczne\" class=\"anchor\">#\u003C\u002Fa> Operacje matematyczne\u003C\u002Fh2>\u003Ch3 id=\"math-abs\">\u003Ca href=\"#math-abs\" class=\"anchor\">#\u003C\u002Fa> math::abs\u003C\u002Fh3>\n\u003Cp>Oblicza wartość bezwzględną liczby. Jeśli dane wejściowe są ujemne, zwraca dodatni odpowiednik; jeśli dane wejściowe są dodatnie, zwraca wartość bez zmian. Ta funkcja obsługuje zarówno typy całkowite, jak i zmiennoprzecinkowe.\u003C\u002Fp>\n\u003Cp>Jest szczególnie przydatna do obliczania różnicy (delty) między dwoma odczytami czujników bez martwienia się o to, która wartość jest większa (np. sprawdzanie, czy temperatura zmieniła się o więcej niż 1 stopień w dowolnym kierunku).\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>value\u003C\u002Fcode>: Liczba do przetworzenia.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Wartość numeryczną reprezentującą nieujemną wartość danych wejściowych. Typ zwracany odpowiada typowi wejściowemu.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"variable\">target_temp\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"number\">21.0\u003C\u002Fspan>\n\u003Cspan class=\"variable\">current_temp\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"number\">19.5\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Oblicz różnicę ignorując kierunek\u003C\u002Fspan>\n\u003Cspan class=\"variable\">delta\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">math::abs\u003C\u002Fspan>(\u003Cspan class=\"variable\">target_temp\u003C\u002Fspan> \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"variable\">current_temp\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Jeśli różnica jest znacząca (więcej niż 0,5 stopnia), podejmij działanie\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">delta\u003C\u002Fspan> \u003Cspan class=\"operator\">&gt;\u003C\u002Fspan> \u003Cspan class=\"number\">0.5\u003C\u002Fspan>) {\n    ....\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"math-round\">\u003Ca href=\"#math-round\" class=\"anchor\">#\u003C\u002Fa> math::round\u003C\u002Fh3>\n\u003Cp>Zaokrągla podaną liczbę zmiennoprzecinkową do najbliższej wartości całkowitej. Przypadki graniczne (gdzie część ułamkowa wynosi dokładnie \u003Ccode>0.5\u003C\u002Fcode>) są zaokrąglane od zera.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>value\u003C\u002Fcode>: Liczba do zaokrąglenia.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Liczbę całkowitą reprezentującą najbliższą liczbę całkowitą.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Przykład 1: Zaokrąglanie danych z czujnika do wyświetlenia\u003C\u002Fspan>\n\u003Cspan class=\"variable\">rawTemp\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"number\">21.7\u003C\u002Fspan>\n\u003Cspan class=\"variable\">displayTemp\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">math::round\u003C\u002Fspan>(\u003Cspan class=\"variable\">rawTemp\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca 22\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Przykład 2: Przypadki graniczne (zaokrąglanie od zera)\u003C\u002Fspan>\n\u003Cspan class=\"variable\">val1\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">math::round\u003C\u002Fspan>(\u003Cspan class=\"number\">2.5\u003C\u002Fspan>)  \u003Cspan class=\"comment\">\u002F\u002F Zwraca 3\u003C\u002Fspan>\n\u003Cspan class=\"variable\">val2\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">math::round\u003C\u002Fspan>(\u003Cspan class=\"operator\">-\u003C\u002Fspan>\u003Cspan class=\"number\">2.5\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca -3\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Ustawienie poziomu ściemniacza (musi być liczbą całkowitą 0-100)\u003C\u002Fspan>\n\u003Cspan class=\"variable\">calculatedLevel\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"number\">55.4\u003C\u002Fspan>\n\u003Cspan class=\"variable\">dimmerLevel\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">math::round\u003C\u002Fspan>(\u003Cspan class=\"variable\">calculatedLevel\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca 55\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"math-random\">\u003Ca href=\"#math-random\" class=\"anchor\">#\u003C\u002Fa> math::random\u003C\u002Fh3>\n\u003Cp>Zwraca pseudolosową liczbę zmiennoprzecinkową z zakresu [0.0, 1.0). Każde wywołanie zwraca inną wartość. Wynik można skalować i łączyć z \u003Ccode>math::round\u003C\u002Fcode>, aby uzyskać losowe liczby całkowite w wybranym zakresie.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Brak.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Wartość zmiennoprzecinkową większą lub równą \u003Ccode>0.0\u003C\u002Fcode> i mniejszą niż \u003Ccode>1.0\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Pobierz losową wartość z zakresu 0.0 do 1.0\u003C\u002Fspan>\n\u003Cspan class=\"variable\">r\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">math\u003C\u002Fspan>::\u003Cspan class=\"function\">random\u003C\u002Fspan>()\n\n\u003Cspan class=\"comment\">\u002F\u002F Wygeneruj losową liczbę całkowitą od 1 do 100\u003C\u002Fspan>\n\u003Cspan class=\"variable\">n\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">math::round\u003C\u002Fspan>(\u003Cspan class=\"variable\">math\u003C\u002Fspan>::\u003Cspan class=\"function\">random\u003C\u002Fspan>() \u003Cspan class=\"operator\">*\u003C\u002Fspan> \u003Cspan class=\"number\">100\u003C\u002Fspan>) \u003Cspan class=\"operator\">+\u003C\u002Fspan> \u003Cspan class=\"number\">1\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Losowa decyzja (50\u002F50)\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">math\u003C\u002Fspan>::\u003Cspan class=\"function\">random\u003C\u002Fspan>() \u003Cspan class=\"operator\">&lt;\u003C\u002Fspan> \u003Cspan class=\"number\">0.5\u003C\u002Fspan>) {\n    \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"led\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n} \u003Cspan class=\"keyword\">else\u003C\u002Fspan> {\n    \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"led\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">false\u003C\u002Fspan>)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch2 id=\"operacje-base64\">\u003Ca href=\"#operacje-base64\" class=\"anchor\">#\u003C\u002Fa> Operacje Base64\u003C\u002Fh2>\n\u003Cp>Ta sekcja opisuje funkcje do kodowania danych za pomocą schematów kodowania Base64.\u003C\u002Fp>\n\u003Ch3 id=\"base64-encode\">\u003Ca href=\"#base64-encode\" class=\"anchor\">#\u003C\u002Fa> base64::encode\u003C\u002Fh3>\n\u003Cp>Koduje łańcuch do jego reprezentacji Base64 używając standardowego alfabetu (RFC 4648 Tabela 1). Wynik używa znaków \u003Ccode>A-Z\u003C\u002Fcode>, \u003Ccode>a-z\u003C\u002Fcode>, \u003Ccode>0-9\u003C\u002Fcode>, \u003Ccode>+\u003C\u002Fcode>, \u003Ccode>\u002F\u003C\u002Fcode> i jest dopełniany znakami \u003Ccode>=\u003C\u002Fcode>, aby zapewnić, że długość wyniku jest wielokrotnością 4.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>data\u003C\u002Fcode> (string): Łańcuch wejściowy do zakodowania.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Łańcuch zawierający reprezentację danych wejściowych zakodowaną w Base64.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Zakoduj prosty łańcuch\u003C\u002Fspan>\n\u003Cspan class=\"variable\">encoded\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">base64\u003C\u002Fspan>::\u003Cspan class=\"function\">encode\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Hello, World!\"\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca \"SGVsbG8sIFdvcmxkIQ==\"\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Zakoduj dane uwierzytelniające dla HTTP Basic Auth\u003C\u002Fspan>\n\u003Cspan class=\"variable\">credentials\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">str::concat\u003C\u002Fspan>(\u003Cspan class=\"string\">\"user\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\":\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"password\"\u003C\u002Fspan>)\n\u003Cspan class=\"variable\">auth\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">str::concat\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Basic \"\u003C\u002Fspan>, \u003Cspan class=\"variable\">base64\u003C\u002Fspan>::\u003Cspan class=\"function\">encode\u003C\u002Fspan>(\u003Cspan class=\"variable\">credentials\u003C\u002Fspan>))\n\u003Cspan class=\"stdlib\">http::set_header\u003C\u002Fspan>(\u003Cspan class=\"variable\">client\u003C\u002Fspan>, \u003Cspan class=\"string\">\"Authorization\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">auth\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Pusty łańcuch koduje się do pustego łańcucha\u003C\u002Fspan>\n\u003Cspan class=\"variable\">encoded\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">base64\u003C\u002Fspan>::\u003Cspan class=\"function\">encode\u003C\u002Fspan>(\u003Cspan class=\"string\">\"\"\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca \"\"\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch3 id=\"base64-url-encode\">\u003Ca href=\"#base64-url-encode\" class=\"anchor\">#\u003C\u002Fa> base64::url_encode\u003C\u002Fh3>\n\u003Cp>Koduje łańcuch do jego reprezentacji Base64url używając alfabetu bezpiecznego dla URL (RFC 4648 Tabela 2). Wynik używa znaków \u003Ccode>A-Z\u003C\u002Fcode>, \u003Ccode>a-z\u003C\u002Fcode>, \u003Ccode>0-9\u003C\u002Fcode>, \u003Ccode>-\u003C\u002Fcode>, \u003Ccode>_\u003C\u002Fcode> i \u003Cstrong>nie\u003C\u002Fstrong> zawiera znaków dopełnienia. To kodowanie jest bezpieczne do użycia w adresach URL, parametrach zapytań i segmentach JWT.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>data\u003C\u002Fcode> (string): Łańcuch wejściowy do zakodowania.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Łańcuch zawierający reprezentację danych wejściowych zakodowaną w Base64url, bez dopełnienia.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Zakoduj do formatu bezpiecznego dla URL\u003C\u002Fspan>\n\u003Cspan class=\"variable\">encoded\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">base64\u003C\u002Fspan>::\u003Cspan class=\"function\">url_encode\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Hello, World!\"\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F Zwraca \"SGVsbG8sIFdvcmxkIQ\"\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Zbuduj nagłówek i ładunek JWT\u003C\u002Fspan>\n\u003Cspan class=\"variable\">header\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">base64\u003C\u002Fspan>::\u003Cspan class=\"function\">url_encode\u003C\u002Fspan>(\u003Cspan class=\"string\">\"\"\"{\"alg\":\"RS256\",\"typ\":\"JWT\"}\"\"\"\u003C\u002Fspan>)\n\u003Cspan class=\"variable\">payload\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">base64\u003C\u002Fspan>::\u003Cspan class=\"function\">url_encode\u003C\u002Fspan>(\u003Cspan class=\"string\">\"\"\"{\"sub\":\"1234567890\",\"name\":\"John\"}\"\"\"\u003C\u002Fspan>)\n\u003Cspan class=\"variable\">signing_input\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">str::concat\u003C\u002Fspan>(\u003Cspan class=\"variable\">header\u003C\u002Fspan>, \u003Cspan class=\"string\">\".\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">payload\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Zwróć uwagę na różnicę w porównaniu ze standardowym base64:\u003C\u002Fspan>\n\u003Cspan class=\"comment\">\u002F\u002F base64::encode(\"subjects?_d\")     zwraca \"c3ViamVjdHM\u002FX2Q=\"\u003C\u002Fspan>\n\u003Cspan class=\"comment\">\u002F\u002F base64::url_encode(\"subjects?_d\") zwraca \"c3ViamVjdHM_X2Q\"\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch2 id=\"operacje-kryptograficzne\">\u003Ca href=\"#operacje-kryptograficzne\" class=\"anchor\">#\u003C\u002Fa> Operacje kryptograficzne\u003C\u002Fh2>\n\u003Cp>Ta sekcja opisuje funkcje do wykonywania operacji kryptograficznych.\u003C\u002Fp>\n\u003Ch3 id=\"crypto-rs256-sign\">\u003Ca href=\"#crypto-rs256-sign\" class=\"anchor\">#\u003C\u002Fa> crypto::rs256_sign\u003C\u002Fh3>\n\u003Cp>Podpisuje dane za pomocą klucza prywatnego RSA algorytmem RS256 (RSASSA-PKCS1-v1_5 z użyciem SHA-256). Ta funkcja jest zazwyczaj używana do tworzenia podpisów JWT lub innych uwierzytelnionych wiadomości.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parametry:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>data\u003C\u002Fcode> (string): Dane do podpisania.\u003C\u002Fli>\n\u003Cli>\u003Ccode>private_key_pem\u003C\u002Fcode> (string): Klucz prywatny RSA w formacie PEM.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Zwraca:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Łańcuch zawierający podpis zakodowany w Base64url.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Przykład:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Utwórz podpis JWT\u003C\u002Fspan>\n\u003Cspan class=\"variable\">header\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">base64\u003C\u002Fspan>::\u003Cspan class=\"function\">url_encode\u003C\u002Fspan>(\u003Cspan class=\"string\">\"\"\"{\"alg\":\"RS256\",\"typ\":\"JWT\"}\"\"\"\u003C\u002Fspan>)\n\u003Cspan class=\"variable\">payload\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">base64\u003C\u002Fspan>::\u003Cspan class=\"function\">url_encode\u003C\u002Fspan>(\u003Cspan class=\"string\">\"\"\"{\"sub\":\"device-001\",\"iat\":1700000000}\"\"\"\u003C\u002Fspan>)\n\u003Cspan class=\"variable\">signing_input\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">str::concat\u003C\u002Fspan>(\u003Cspan class=\"variable\">header\u003C\u002Fspan>, \u003Cspan class=\"string\">\".\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">payload\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Podpisz kluczem prywatnym\u003C\u002Fspan>\n\u003Cspan class=\"variable\">signature\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">crypto\u003C\u002Fspan>::\u003Cspan class=\"function\">rs256_sign\u003C\u002Fspan>(\u003Cspan class=\"variable\">signing_input\u003C\u002Fspan>, \u003Cspan class=\"variable\">private_key\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Złóż kompletny JWT\u003C\u002Fspan>\n\u003Cspan class=\"variable\">jwt\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">str::concat\u003C\u002Fspan>(\u003Cspan class=\"variable\">signing_input\u003C\u002Fspan>, \u003Cspan class=\"string\">\".\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">signature\u003C\u002Fspan>)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch2 id=\"operacje-asynchroniczne\">\u003Ca href=\"#operacje-asynchroniczne\" class=\"anchor\">#\u003C\u002Fa> Operacje asynchroniczne\u003C\u002Fh2>\n\u003Cp>Ta sekcja opisuje funkcje callback, które można zdefiniować do obsługi asynchronicznych zdarzeń i odpowiedzi.\u003C\u002Fp>\n",[911,912,915,918,921,924,927,930,933,936,939,942,945,948,951,954,957,960,963,966,969,972,975,978,981,984,987,990,993,996,999,1002,1005,1008,1011,1014,1017,1020,1023,1026,1029,1032,1035,1038,1041,1044,1047,1050,1053,1056,1059,1062,1065,1068,1071,1074,1077,1080,1083,1086,1089,1092,1095,1098,1101],{"level":75,"text":568,"id":569},{"level":81,"text":913,"id":914},"Operacje wejściowe","operacje-wejsciowe",{"level":86,"text":916,"id":917},"input::channel","input-channel",{"level":86,"text":919,"id":920},"input::value","input-value",{"level":86,"text":922,"id":923},"input::get","input-get",{"level":81,"text":925,"id":926},"Operacje wyjściowe","operacje-wyjsciowe",{"level":86,"text":928,"id":929},"output::get","output-get",{"level":86,"text":931,"id":932},"output::set","output-set",{"level":86,"text":934,"id":935},"output::toggle","output-toggle",{"level":81,"text":937,"id":938},"Operacje na stanie","operacje-na-stanie",{"level":86,"text":940,"id":941},"state::get","state-get",{"level":86,"text":943,"id":944},"state::set","state-set",{"level":81,"text":946,"id":947},"Operacje konfiguracyjne","operacje-konfiguracyjne",{"level":86,"text":949,"id":950},"config::get","config-get",{"level":81,"text":952,"id":953},"Operacje callbacków","operacje-callbackow",{"level":86,"text":955,"id":956},"callback::set","callback-set",{"level":86,"text":958,"id":959},"callback::clear","callback-clear",{"level":81,"text":961,"id":962},"Operacje na łańcuchach znaków","operacje-na-lancuchach-znakow",{"level":86,"text":964,"id":965},"str::len","str-len",{"level":86,"text":967,"id":968},"str::trim","str-trim",{"level":86,"text":970,"id":971},"str::concat","str-concat",{"level":86,"text":973,"id":974},"str::count","str-count",{"level":86,"text":976,"id":977},"str::replace","str-replace",{"level":86,"text":979,"id":980},"str::number","str-number",{"level":86,"text":982,"id":983},"str::fmt","str-fmt",{"level":86,"text":985,"id":986},"str::split","str-split",{"level":86,"text":988,"id":989},"str::split_has_next","str-split-has-next",{"level":86,"text":991,"id":992},"str::split_next","str-split-next",{"level":81,"text":994,"id":995},"Operacje na tablicach","operacje-na-tablicach",{"level":86,"text":997,"id":998},"array::new","array-new",{"level":86,"text":1000,"id":1001},"array::len","array-len",{"level":86,"text":1003,"id":1004},"array::get_at","array-get-at",{"level":86,"text":1006,"id":1007},"array::put_at","array-put-at",{"level":86,"text":1009,"id":1010},"array::append","array-append",{"level":86,"text":1012,"id":1013},"array::clear","array-clear",{"level":81,"text":1015,"id":1016},"Operacje na mapach","operacje-na-mapach",{"level":86,"text":1018,"id":1019},"map::new","map-new",{"level":86,"text":1021,"id":1022},"map::len","map-len",{"level":86,"text":1024,"id":1025},"map::set","map-set",{"level":86,"text":1027,"id":1028},"map::get","map-get",{"level":86,"text":1030,"id":1031},"map::clear","map-clear",{"level":86,"text":1033,"id":1034},"map::contains","map-contains",{"level":86,"text":1036,"id":1037},"map::keys","map-keys",{"level":86,"text":1039,"id":1040},"map::values","map-values",{"level":81,"text":1042,"id":1043},"Operacje JSON","operacje-json",{"level":86,"text":1045,"id":1046},"json::get","json-get",{"level":81,"text":1048,"id":1049},"Operacje HTTP","operacje-http",{"level":86,"text":1051,"id":1052},"http::client","http-client",{"level":86,"text":1054,"id":1055},"http::set_method","http-set-method",{"level":86,"text":1057,"id":1058},"http::set_header","http-set-header",{"level":86,"text":1060,"id":1061},"http::set_body","http-set-body",{"level":86,"text":1063,"id":1064},"http::call","http-call",{"level":81,"text":1066,"id":1067},"Operacje czasowe","operacje-czasowe",{"level":86,"text":1069,"id":1070},"time::now","time-now",{"level":86,"text":1072,"id":1073},"time::uptime","time-uptime",{"level":81,"text":1075,"id":1076},"Operacje matematyczne","operacje-matematyczne",{"level":86,"text":1078,"id":1079},"math::abs","math-abs",{"level":86,"text":1081,"id":1082},"math::round","math-round",{"level":86,"text":1084,"id":1085},"math::random","math-random",{"level":81,"text":1087,"id":1088},"Operacje Base64","operacje-base64",{"level":86,"text":1090,"id":1091},"base64::encode","base64-encode",{"level":86,"text":1093,"id":1094},"base64::url_encode","base64-url-encode",{"level":81,"text":1096,"id":1097},"Operacje kryptograficzne","operacje-kryptograficzne",{"level":86,"text":1099,"id":1100},"crypto::rs256_sign","crypto-rs256-sign",{"level":81,"text":1102,"id":1103},"Operacje asynchroniczne","operacje-asynchroniczne",{},1777471504879]