[{"data":1,"prerenderedAt":994},["ShallowReactive",2],{"manifest":3,"hreflang-alternates":943,"doc-pl-pierwsze-kroki\u002Fvolang-i-volangvm":946},{"site":4,"branding":6,"contact":8,"organization_schema":10,"languages":54,"website":62,"docs":187,"blog":900},{"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},{"pl":64,"en":121},[65,71,77,83,93,99,105,116],{"title":66,"slug":67,"path":68,"order":69,"template":70},"Smart Home, Automatyka budynkowa - Voldeno","index","pl\u002Findex",0,"home",{"title":72,"slug":73,"path":74,"order":75,"template":76},"Twój Dom","twoj-dom","pl\u002Ftwoj-dom",1,"homeowners",{"title":78,"slug":79,"path":80,"order":81,"template":82},"Dla Profesjonalistów","dla-profesjonalistow","pl\u002Fdla-profesjonalistow",2,"professionals",{"title":84,"slug":85,"path":86,"order":87,"children":88},"Produkty","produkty","pl\u002Fprodukty",3,[89],{"title":90,"slug":67,"path":91,"order":75,"template":92},"Inteligentne produkty​ Smart Home Voldeno","pl\u002Fprodukty\u002Findex","products",{"title":94,"slug":95,"path":96,"order":97,"template":98},"Kontakt","kontakt","pl\u002Fkontakt",4,"contact",{"title":100,"slug":101,"path":102,"order":103,"template":104},"O nas","o-nas","pl\u002Fo-nas",5,"about",{"title":106,"slug":107,"path":108,"order":109,"children":110},"Prawne","prawne","pl\u002Fprawne",6,[111],{"title":112,"slug":113,"path":114,"order":75,"template":115},"Polityka prywatności","polityka-prywatnosci","pl\u002Fprawne\u002Fpolityka-prywatnosci","page",{"title":117,"slug":118,"path":119,"order":120},"Realizacje","realizacje","pl\u002Frealizacje",999,[122,125,129,132,139,142,145,154],{"title":123,"slug":67,"path":124,"order":69,"template":70},"Voldeno: Smart Home, Building Automation","en\u002Findex",{"title":126,"slug":127,"path":128,"order":75,"template":76},"Your Home","your-home","en\u002Fyour-home",{"title":130,"slug":82,"path":131,"order":81,"template":82},"For Professionals","en\u002Fprofessionals",{"title":133,"slug":92,"path":134,"order":87,"children":135},"Products","en\u002Fproducts",[136],{"title":137,"slug":67,"path":138,"order":75,"template":92},"Smart Home Products​ from Voldeno","en\u002Fproducts\u002Findex",{"title":140,"slug":98,"path":141,"order":97,"template":98},"Contact","en\u002Fcontact",{"title":143,"slug":104,"path":144,"order":103,"template":104},"About Us","en\u002Fabout",{"title":146,"slug":147,"path":148,"order":109,"children":149},"Legal","legal","en\u002Flegal",[150],{"title":151,"slug":152,"path":153,"order":75,"template":115},"Privacy Policy","privacy-policy","en\u002Flegal\u002Fprivacy-policy",{"title":155,"slug":156,"path":157,"order":120},"Projects","projects","en\u002Fprojects",{"module_io":159,"module_hub":162,"module_relay":165,"module_1wire":168,"module_analog_input":171,"downloads":174,"privacy":177},{"pl":160,"en":161},"produkty\u002Fio","products\u002Fio",{"pl":163,"en":164},"produkty\u002Fhub","products\u002Fhub",{"en":166,"pl":167},"products\u002Frelay","produkty\u002Frelay",{"pl":169,"en":170},"produkty\u002F1wire","products\u002F1wire",{"pl":172,"en":173},"produkty\u002Fanalog-input","products\u002Fanalog-input",{"pl":175,"en":176},"pobieranie","downloads",{"pl":178,"en":179},"prawne\u002Fpolityka-prywatnosci","legal\u002Fprivacy-policy",{"en":181,"pl":184},{"products":182,"projects":183},"products\u002Findex","projects\u002Findex",{"produkty":185,"realizacje":186},"produkty\u002Findex","realizacje\u002Findex",{"enabled":58,"navigation":188,"section_redirects":875},{"pl":189,"en":626},[190,207,232,245,562,576,589,611,621],{"title":191,"slug":192,"path":193,"order":75,"children":194},"Pierwsze kroki","pierwsze-kroki","pl\u002Fdocs\u002Fpierwsze-kroki",[195,199,203],{"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":87},"Volang i VolangVM: po co inteligentny dom potrzebuje własnego języka automatyki","volang-i-volangvm","pl\u002Fdocs\u002Fpierwsze-kroki\u002Fvolang-i-volangvm",{"title":208,"slug":209,"path":210,"order":81,"children":211},"Moduły i peryferia","moduly","pl\u002Fdocs\u002Fmoduly",[212,216,220,224,228],{"title":213,"slug":214,"path":215,"order":75},"Okablowanie modułu HUB","okablowanie-hub","pl\u002Fdocs\u002Fmoduly\u002Fokablowanie-hub",{"title":217,"slug":218,"path":219,"order":81},"Okablowanie modułu I\u002FO","okablowanie-io","pl\u002Fdocs\u002Fmoduly\u002Fokablowanie-io",{"title":221,"slug":222,"path":223,"order":87},"Okablowanie modułu RELAY","okablowanie-relay","pl\u002Fdocs\u002Fmoduly\u002Fokablowanie-relay",{"title":225,"slug":226,"path":227,"order":97},"Okablowanie modułu 1-Wire","okablowanie-1wire","pl\u002Fdocs\u002Fmoduly\u002Fokablowanie-1wire",{"title":229,"slug":230,"path":231,"order":103},"Okablowanie modułu Analog Input","okablowanie-analog-input","pl\u002Fdocs\u002Fmoduly\u002Fokablowanie-analog-input",{"title":233,"slug":234,"path":235,"order":87,"children":236},"Wytyczne okablowania","okablowanie","pl\u002Fdocs\u002Fokablowanie",[237,241],{"title":238,"slug":239,"path":240,"order":75},"Topologia i okablowanie magistrali","topologia-magistrali","pl\u002Fdocs\u002Fokablowanie\u002Ftopologia-magistrali",{"title":242,"slug":243,"path":244,"order":81},"Dobór i dystrybucja zasilania","zasilanie","pl\u002Fdocs\u002Fokablowanie\u002Fzasilanie",{"title":246,"slug":247,"path":248,"order":97,"children":249},"Bloki logiczne","bloki-logiczne","pl\u002Fdocs\u002Fbloki-logiczne",[250,256,307,547],{"title":251,"slug":252,"path":253,"order":69,"template":254,"translation_key":255},"Przegląd","przeglad","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprzeglad","logic-block-index","logic-blocks-overview",{"title":257,"slug":258,"path":259,"order":75,"children":260},"Wejścia","input","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput",[261,267,272,277,282,287,292,297,302],{"title":262,"slug":263,"path":264,"order":69,"template":265,"translation_key":266},"Binary input","binary_input","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fbinary_input","logic-block","logic-block-binary_input",{"title":268,"slug":269,"path":270,"order":69,"template":265,"translation_key":271},"Boolean constant","boolean_constant","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fboolean_constant","logic-block-boolean_constant",{"title":273,"slug":274,"path":275,"order":69,"template":265,"translation_key":276},"Numeric constant","numeric_constant","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fnumeric_constant","logic-block-numeric_constant",{"title":278,"slug":279,"path":280,"order":69,"template":265,"translation_key":281},"Numeric input","numeric_input","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fnumeric_input","logic-block-numeric_input",{"title":283,"slug":284,"path":285,"order":69,"template":265,"translation_key":286},"Mode monitor","operation_mode_monitor","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Foperation_mode_monitor","logic-block-operation_mode_monitor",{"title":288,"slug":289,"path":290,"order":69,"template":265,"translation_key":291},"PulseAt","pulse_at","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fpulse_at","logic-block-pulse_at",{"title":293,"slug":294,"path":295,"order":69,"template":265,"translation_key":296},"Schedule","schedule","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fschedule","logic-block-schedule",{"title":298,"slug":299,"path":300,"order":69,"template":265,"translation_key":301},"String constant","string_constant","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fstring_constant","logic-block-string_constant",{"title":303,"slug":304,"path":305,"order":69,"template":265,"translation_key":306},"Switch","switch","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fswitch","logic-block-switch",{"title":308,"slug":309,"path":310,"order":81,"children":311},"Przetwarzanie","process","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess",[312,317,322,327,332,337,342,347,352,357,362,367,372,377,382,387,392,397,402,407,412,417,422,427,432,437,442,447,452,457,462,467,472,477,482,487,492,497,502,507,512,517,522,527,532,537,542],{"title":313,"slug":314,"path":315,"order":69,"template":265,"translation_key":316},"Binary limiter","binary_limiter","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fbinary_limiter","logic-block-binary_limiter",{"title":318,"slug":319,"path":320,"order":69,"template":265,"translation_key":321},"Boolean to string","boolean_to_string","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fboolean_to_string","logic-block-boolean_to_string",{"title":323,"slug":324,"path":325,"order":69,"template":265,"translation_key":326},"Climate regulator","climate_regulator","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fclimate_regulator","logic-block-climate_regulator",{"title":328,"slug":329,"path":330,"order":69,"template":265,"translation_key":331},"Climate regulator hub","climate_regulator_hub","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fclimate_regulator_hub","logic-block-climate_regulator_hub",{"title":333,"slug":334,"path":335,"order":69,"template":265,"translation_key":336},"Delay","delay","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fdelay","logic-block-delay",{"title":338,"slug":339,"path":340,"order":69,"template":265,"translation_key":341},"Delayed Pulse","delayed_pulse","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fdelayed_pulse","logic-block-delayed_pulse",{"title":343,"slug":344,"path":345,"order":69,"template":265,"translation_key":346},"Door, window","door_window_monitor","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fdoor_window_monitor","logic-block-door_window_monitor",{"title":348,"slug":349,"path":350,"order":69,"template":265,"translation_key":351},"Edge detector","edge_detector","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fedge_detector","logic-block-edge_detector",{"title":353,"slug":354,"path":355,"order":69,"template":265,"translation_key":356},"HTTP Request","http_request","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fhttp_request","logic-block-http_request",{"title":358,"slug":359,"path":360,"order":69,"template":265,"translation_key":361},"Hysteresis","hysteresis","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fhysteresis","logic-block-hysteresis",{"title":363,"slug":364,"path":365,"order":69,"template":265,"translation_key":366},"Irrigation","irrigation","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Firrigation","logic-block-irrigation",{"title":368,"slug":369,"path":370,"order":69,"template":265,"translation_key":371},"JSON Get Boolean","json_get_boolean","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fjson_get_boolean","logic-block-json_get_boolean",{"title":373,"slug":374,"path":375,"order":69,"template":265,"translation_key":376},"JSON Get Number","json_get_number","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fjson_get_number","logic-block-json_get_number",{"title":378,"slug":379,"path":380,"order":69,"template":265,"translation_key":381},"JSON Get String","json_get_string","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fjson_get_string","logic-block-json_get_string",{"title":383,"slug":384,"path":385,"order":69,"template":265,"translation_key":386},"Level to pulse","level_to_pulse","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Flevel_to_pulse","logic-block-level_to_pulse",{"title":388,"slug":389,"path":390,"order":69,"template":265,"translation_key":391},"Logic::And","logic_and","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Flogic_and","logic-block-logic_and",{"title":393,"slug":394,"path":395,"order":69,"template":265,"translation_key":396},"Logic::Not","logic_not","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Flogic_not","logic-block-logic_not",{"title":398,"slug":399,"path":400,"order":69,"template":265,"translation_key":401},"Logic::Or","logic_or","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Flogic_or","logic-block-logic_or",{"title":403,"slug":404,"path":405,"order":69,"template":265,"translation_key":406},"Math::Abs","math_abs","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_abs","logic-block-math_abs",{"title":408,"slug":409,"path":410,"order":69,"template":265,"translation_key":411},"Math::Add","math_add","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_add","logic-block-math_add",{"title":413,"slug":414,"path":415,"order":69,"template":265,"translation_key":416},"Math::Average","math_average","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_average","logic-block-math_average",{"title":418,"slug":419,"path":420,"order":69,"template":265,"translation_key":421},"Math::Ceil","math_ceil","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_ceil","logic-block-math_ceil",{"title":423,"slug":424,"path":425,"order":69,"template":265,"translation_key":426},"Math::Divide","math_divide","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_divide","logic-block-math_divide",{"title":428,"slug":429,"path":430,"order":69,"template":265,"translation_key":431},"Math::Floor","math_floor","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_floor","logic-block-math_floor",{"title":433,"slug":434,"path":435,"order":69,"template":265,"translation_key":436},"Math::Max","math_max","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_max","logic-block-math_max",{"title":438,"slug":439,"path":440,"order":69,"template":265,"translation_key":441},"Math::Min","math_min","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_min","logic-block-math_min",{"title":443,"slug":444,"path":445,"order":69,"template":265,"translation_key":446},"Math::Modulo","math_modulo","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_modulo","logic-block-math_modulo",{"title":448,"slug":449,"path":450,"order":69,"template":265,"translation_key":451},"Math::Multiply","math_multiply","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_multiply","logic-block-math_multiply",{"title":453,"slug":454,"path":455,"order":69,"template":265,"translation_key":456},"Math::Random","math_random","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_random","logic-block-math_random",{"title":458,"slug":459,"path":460,"order":69,"template":265,"translation_key":461},"Math::Round","math_round","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_round","logic-block-math_round",{"title":463,"slug":464,"path":465,"order":69,"template":265,"translation_key":466},"Math::Subtract","math_subtract","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_subtract","logic-block-math_subtract",{"title":468,"slug":469,"path":470,"order":69,"template":265,"translation_key":471},"Motor axis","motor_axis","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmotor_axis","logic-block-motor_axis",{"title":473,"slug":474,"path":475,"order":69,"template":265,"translation_key":476},"Moving average","moving_average","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmoving_average","logic-block-moving_average",{"title":478,"slug":479,"path":480,"order":69,"template":265,"translation_key":481},"Number to string","number_to_string","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fnumber_to_string","logic-block-number_to_string",{"title":483,"slug":484,"path":485,"order":69,"template":265,"translation_key":486},"Numeric latch","numeric_latch","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fnumeric_latch","logic-block-numeric_latch",{"title":488,"slug":489,"path":490,"order":69,"template":265,"translation_key":491},"Numeric predicate","numeric_predicate","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fnumeric_predicate","logic-block-numeric_predicate",{"title":493,"slug":494,"path":495,"order":69,"template":265,"translation_key":496},"Numeric throttle","numeric_throttle","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fnumeric_throttle","logic-block-numeric_throttle",{"title":498,"slug":499,"path":500,"order":69,"template":265,"translation_key":501},"PubSub::Publish","pubsub","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fpubsub","logic-block-pubsub",{"title":503,"slug":504,"path":505,"order":69,"template":265,"translation_key":506},"Pulse counter","pulse_counter","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fpulse_counter","logic-block-pulse_counter",{"title":508,"slug":509,"path":510,"order":69,"template":265,"translation_key":511},"Pulse gate","pulse_gate","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fpulse_gate","logic-block-pulse_gate",{"title":513,"slug":514,"path":515,"order":69,"template":265,"translation_key":516},"Pulse throttle","pulse_throttle","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fpulse_throttle","logic-block-pulse_throttle",{"title":518,"slug":519,"path":520,"order":69,"template":265,"translation_key":521},"Sequencer","sequencer","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fsequencer","logic-block-sequencer",{"title":523,"slug":524,"path":525,"order":69,"template":265,"translation_key":526},"Shading","shading","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fshading","logic-block-shading",{"title":528,"slug":529,"path":530,"order":69,"template":265,"translation_key":531},"String format","string_format","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fstring_format","logic-block-string_format",{"title":533,"slug":534,"path":535,"order":69,"template":265,"translation_key":536},"String latch","string_latch","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fstring_latch","logic-block-string_latch",{"title":538,"slug":539,"path":540,"order":69,"template":265,"translation_key":541},"Toggle","toggle","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Ftoggle","logic-block-toggle",{"title":543,"slug":544,"path":545,"order":69,"template":265,"translation_key":546},"Variable Delayed Pulse","variable_delayed_pulse","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fvariable_delayed_pulse","logic-block-variable_delayed_pulse",{"title":548,"slug":549,"path":550,"order":87,"children":551},"Wyjścia","output","pl\u002Fdocs\u002Fbloki-logiczne\u002Foutput",[552,557],{"title":553,"slug":554,"path":555,"order":69,"template":265,"translation_key":556},"Mode controller","operation_mode_controller","pl\u002Fdocs\u002Fbloki-logiczne\u002Foutput\u002Foperation_mode_controller","logic-block-operation_mode_controller",{"title":558,"slug":559,"path":560,"order":69,"template":265,"translation_key":561},"Relay","relay","pl\u002Fdocs\u002Fbloki-logiczne\u002Foutput\u002Frelay","logic-block-relay",{"title":563,"slug":564,"path":565,"order":103,"children":566},"Język programowania Volang","volang","pl\u002Fdocs\u002Fvolang",[567,571],{"title":568,"slug":569,"path":570,"order":75},"Język Volang","jezyk","pl\u002Fdocs\u002Fvolang\u002Fjezyk",{"title":572,"slug":573,"path":574,"order":81,"template":575},"Biblioteka standardowa","biblioteka-standardowa","pl\u002Fdocs\u002Fvolang\u002Fbiblioteka-standardowa","api-reference",{"title":577,"slug":578,"path":579,"order":109,"children":580},"Oprogramowanie","oprogramowanie","pl\u002Fdocs\u002Foprogramowanie",[581,585],{"title":582,"slug":583,"path":584,"order":75},"Voldeno Studio - Instalacja i przewodnik","studio","pl\u002Fdocs\u002Foprogramowanie\u002Fstudio",{"title":586,"slug":587,"path":588,"order":81},"Voldeno Studio - Harmonogramy","schedules","pl\u002Fdocs\u002Foprogramowanie\u002Fschedules",{"title":590,"slug":591,"path":592,"order":593,"children":594},"Poradniki","poradniki","pl\u002Fdocs\u002Fporadniki",7,[595,599,603,607],{"title":596,"slug":597,"path":598,"order":75},"Czym jest smart home i jak działa?","czym-jest-smart-home","pl\u002Fdocs\u002Fporadniki\u002Fczym-jest-smart-home",{"title":600,"slug":601,"path":602,"order":81},"Jaki system smart home wybrać? Praktyczny przewodnik","jaki-system-smart-home-wybrac","pl\u002Fdocs\u002Fporadniki\u002Fjaki-system-smart-home-wybrac",{"title":604,"slug":605,"path":606,"order":87},"Ile kosztuje inteligentny dom? Trzy warianty instalacji Voldeno z modułami i cenami","ile-kosztuje-inteligentny-dom","pl\u002Fdocs\u002Fporadniki\u002File-kosztuje-inteligentny-dom",{"title":608,"slug":609,"path":610,"order":97},"7 najczęstszych błędów przy projektowaniu instalacji smart home","bledy-przy-projektowaniu-smart-home","pl\u002Fdocs\u002Fporadniki\u002Fbledy-przy-projektowaniu-smart-home",{"title":612,"slug":613,"path":614,"order":615,"children":616},"Diagnostyka i rozwiązywanie problemów","diagnostyka","pl\u002Fdocs\u002Fdiagnostyka",8,[617],{"title":618,"slug":619,"path":620,"order":75},"Rozwiązywanie problemów z komunikacją magistrali","komunikacja-magistrali","pl\u002Fdocs\u002Fdiagnostyka\u002Fkomunikacja-magistrali",{"title":622,"slug":623,"path":624,"order":625},"Często zadawane pytania","faq","pl\u002Fdocs\u002Ffaq",9,[627,644,669,682,819,831,842,863,872],{"title":628,"slug":629,"path":630,"order":75,"children":631},"Getting Started","getting-started","en\u002Fdocs\u002Fgetting-started",[632,636,640],{"title":633,"slug":634,"path":635,"order":75},"Core Concepts and Terminology","concepts","en\u002Fdocs\u002Fgetting-started\u002Fconcepts",{"title":637,"slug":638,"path":639,"order":81},"System Overview for Installers","system-overview","en\u002Fdocs\u002Fgetting-started\u002Fsystem-overview",{"title":641,"slug":642,"path":643,"order":87},"Volang and VolangVM: why a smart home needs its own automation language","volang-and-volangvm","en\u002Fdocs\u002Fgetting-started\u002Fvolang-and-volangvm",{"title":645,"slug":646,"path":647,"order":81,"children":648},"Modules & Peripherals","modules","en\u002Fdocs\u002Fmodules",[649,653,657,661,665],{"title":650,"slug":651,"path":652,"order":75},"Hub Module Wiring","hub-wiring","en\u002Fdocs\u002Fmodules\u002Fhub-wiring",{"title":654,"slug":655,"path":656,"order":81},"I\u002FO Module Wiring","io-wiring","en\u002Fdocs\u002Fmodules\u002Fio-wiring",{"title":658,"slug":659,"path":660,"order":87},"Relay Module Wiring","relay-wiring","en\u002Fdocs\u002Fmodules\u002Frelay-wiring",{"title":662,"slug":663,"path":664,"order":97},"1-Wire Module Wiring","1wire-wiring","en\u002Fdocs\u002Fmodules\u002F1wire-wiring",{"title":666,"slug":667,"path":668,"order":103},"Analog Input Module Wiring","analog-input-wiring","en\u002Fdocs\u002Fmodules\u002Fanalog-input-wiring",{"title":670,"slug":671,"path":672,"order":87,"children":673},"Wiring Guidelines","wiring","en\u002Fdocs\u002Fwiring",[674,678],{"title":675,"slug":676,"path":677,"order":75},"Bus Topology & Wiring","bus-topology","en\u002Fdocs\u002Fwiring\u002Fbus-topology",{"title":679,"slug":680,"path":681,"order":81},"Power Supply Sizing and Distribution","power-supply","en\u002Fdocs\u002Fwiring\u002Fpower-supply",{"title":683,"slug":684,"path":685,"order":97,"children":686},"Logic Blocks","logic-blocks","en\u002Fdocs\u002Flogic-blocks",[687,691,713,811],{"title":688,"slug":689,"path":690,"order":69,"template":254,"translation_key":255},"Overview","overview","en\u002Fdocs\u002Flogic-blocks\u002Foverview",{"title":692,"slug":258,"path":693,"order":75,"children":694},"Input","en\u002Fdocs\u002Flogic-blocks\u002Finput",[695,697,699,701,703,705,707,709,711],{"title":262,"slug":263,"path":696,"order":69,"template":265,"translation_key":266},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fbinary_input",{"title":268,"slug":269,"path":698,"order":69,"template":265,"translation_key":271},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fboolean_constant",{"title":273,"slug":274,"path":700,"order":69,"template":265,"translation_key":276},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fnumeric_constant",{"title":278,"slug":279,"path":702,"order":69,"template":265,"translation_key":281},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fnumeric_input",{"title":283,"slug":284,"path":704,"order":69,"template":265,"translation_key":286},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Foperation_mode_monitor",{"title":288,"slug":289,"path":706,"order":69,"template":265,"translation_key":291},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fpulse_at",{"title":293,"slug":294,"path":708,"order":69,"template":265,"translation_key":296},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fschedule",{"title":298,"slug":299,"path":710,"order":69,"template":265,"translation_key":301},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fstring_constant",{"title":303,"slug":304,"path":712,"order":69,"template":265,"translation_key":306},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fswitch",{"title":714,"slug":309,"path":715,"order":81,"children":716},"Process","en\u002Fdocs\u002Flogic-blocks\u002Fprocess",[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,791,793,795,797,799,801,803,805,807,809],{"title":313,"slug":314,"path":718,"order":69,"template":265,"translation_key":316},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fbinary_limiter",{"title":318,"slug":319,"path":720,"order":69,"template":265,"translation_key":321},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fboolean_to_string",{"title":323,"slug":324,"path":722,"order":69,"template":265,"translation_key":326},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fclimate_regulator",{"title":328,"slug":329,"path":724,"order":69,"template":265,"translation_key":331},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fclimate_regulator_hub",{"title":333,"slug":334,"path":726,"order":69,"template":265,"translation_key":336},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fdelay",{"title":338,"slug":339,"path":728,"order":69,"template":265,"translation_key":341},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fdelayed_pulse",{"title":343,"slug":344,"path":730,"order":69,"template":265,"translation_key":346},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fdoor_window_monitor",{"title":348,"slug":349,"path":732,"order":69,"template":265,"translation_key":351},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fedge_detector",{"title":353,"slug":354,"path":734,"order":69,"template":265,"translation_key":356},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fhttp_request",{"title":358,"slug":359,"path":736,"order":69,"template":265,"translation_key":361},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fhysteresis",{"title":363,"slug":364,"path":738,"order":69,"template":265,"translation_key":366},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Firrigation",{"title":368,"slug":369,"path":740,"order":69,"template":265,"translation_key":371},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fjson_get_boolean",{"title":373,"slug":374,"path":742,"order":69,"template":265,"translation_key":376},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fjson_get_number",{"title":378,"slug":379,"path":744,"order":69,"template":265,"translation_key":381},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fjson_get_string",{"title":383,"slug":384,"path":746,"order":69,"template":265,"translation_key":386},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Flevel_to_pulse",{"title":388,"slug":389,"path":748,"order":69,"template":265,"translation_key":391},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Flogic_and",{"title":393,"slug":394,"path":750,"order":69,"template":265,"translation_key":396},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Flogic_not",{"title":398,"slug":399,"path":752,"order":69,"template":265,"translation_key":401},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Flogic_or",{"title":403,"slug":404,"path":754,"order":69,"template":265,"translation_key":406},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_abs",{"title":408,"slug":409,"path":756,"order":69,"template":265,"translation_key":411},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_add",{"title":413,"slug":414,"path":758,"order":69,"template":265,"translation_key":416},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_average",{"title":418,"slug":419,"path":760,"order":69,"template":265,"translation_key":421},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_ceil",{"title":423,"slug":424,"path":762,"order":69,"template":265,"translation_key":426},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_divide",{"title":428,"slug":429,"path":764,"order":69,"template":265,"translation_key":431},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_floor",{"title":433,"slug":434,"path":766,"order":69,"template":265,"translation_key":436},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_max",{"title":438,"slug":439,"path":768,"order":69,"template":265,"translation_key":441},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_min",{"title":443,"slug":444,"path":770,"order":69,"template":265,"translation_key":446},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_modulo",{"title":448,"slug":449,"path":772,"order":69,"template":265,"translation_key":451},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_multiply",{"title":453,"slug":454,"path":774,"order":69,"template":265,"translation_key":456},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_random",{"title":458,"slug":459,"path":776,"order":69,"template":265,"translation_key":461},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_round",{"title":463,"slug":464,"path":778,"order":69,"template":265,"translation_key":466},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_subtract",{"title":468,"slug":469,"path":780,"order":69,"template":265,"translation_key":471},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmotor_axis",{"title":473,"slug":474,"path":782,"order":69,"template":265,"translation_key":476},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmoving_average",{"title":478,"slug":479,"path":784,"order":69,"template":265,"translation_key":481},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fnumber_to_string",{"title":483,"slug":484,"path":786,"order":69,"template":265,"translation_key":486},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fnumeric_latch",{"title":488,"slug":489,"path":788,"order":69,"template":265,"translation_key":491},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fnumeric_predicate",{"title":493,"slug":494,"path":790,"order":69,"template":265,"translation_key":496},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fnumeric_throttle",{"title":498,"slug":499,"path":792,"order":69,"template":265,"translation_key":501},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fpubsub",{"title":503,"slug":504,"path":794,"order":69,"template":265,"translation_key":506},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fpulse_counter",{"title":508,"slug":509,"path":796,"order":69,"template":265,"translation_key":511},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fpulse_gate",{"title":513,"slug":514,"path":798,"order":69,"template":265,"translation_key":516},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fpulse_throttle",{"title":518,"slug":519,"path":800,"order":69,"template":265,"translation_key":521},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fsequencer",{"title":523,"slug":524,"path":802,"order":69,"template":265,"translation_key":526},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fshading",{"title":528,"slug":529,"path":804,"order":69,"template":265,"translation_key":531},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fstring_format",{"title":533,"slug":534,"path":806,"order":69,"template":265,"translation_key":536},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fstring_latch",{"title":538,"slug":539,"path":808,"order":69,"template":265,"translation_key":541},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Ftoggle",{"title":543,"slug":544,"path":810,"order":69,"template":265,"translation_key":546},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fvariable_delayed_pulse",{"title":812,"slug":549,"path":813,"order":87,"children":814},"Output","en\u002Fdocs\u002Flogic-blocks\u002Foutput",[815,817],{"title":553,"slug":554,"path":816,"order":69,"template":265,"translation_key":556},"en\u002Fdocs\u002Flogic-blocks\u002Foutput\u002Foperation_mode_controller",{"title":558,"slug":559,"path":818,"order":69,"template":265,"translation_key":561},"en\u002Fdocs\u002Flogic-blocks\u002Foutput\u002Frelay",{"title":820,"slug":564,"path":821,"order":103,"children":822},"Volang Programming Language","en\u002Fdocs\u002Fvolang",[823,827],{"title":824,"slug":825,"path":826,"order":75},"The Volang Language","language","en\u002Fdocs\u002Fvolang\u002Flanguage",{"title":828,"slug":829,"path":830,"order":81,"template":575},"Standard Library","stdlib","en\u002Fdocs\u002Fvolang\u002Fstdlib",{"title":832,"slug":833,"path":834,"order":109,"children":835},"Software & Tools","software","en\u002Fdocs\u002Fsoftware",[836,839],{"title":837,"slug":583,"path":838,"order":75},"Voldeno Studio - Installation and Walkthrough","en\u002Fdocs\u002Fsoftware\u002Fstudio",{"title":840,"slug":587,"path":841,"order":81},"Voldeno Studio - Schedules","en\u002Fdocs\u002Fsoftware\u002Fschedules",{"title":843,"slug":844,"path":845,"order":593,"children":846},"How-to Guides & Recipes","how-to","en\u002Fdocs\u002Fhow-to",[847,851,855,859],{"title":848,"slug":849,"path":850,"order":75},"What is a smart home and how does it work?","what-is-a-smart-home","en\u002Fdocs\u002Fhow-to\u002Fwhat-is-a-smart-home",{"title":852,"slug":853,"path":854,"order":81},"How to choose a smart home system: a practical guide","how-to-choose-a-smart-home-system","en\u002Fdocs\u002Fhow-to\u002Fhow-to-choose-a-smart-home-system",{"title":856,"slug":857,"path":858,"order":87},"How much does a smart home cost? Three Voldeno installation variants with modules and prices","how-much-does-a-smart-home-cost","en\u002Fdocs\u002Fhow-to\u002Fhow-much-does-a-smart-home-cost",{"title":860,"slug":861,"path":862,"order":97},"7 most common smart home design mistakes","smart-home-design-mistakes","en\u002Fdocs\u002Fhow-to\u002Fsmart-home-design-mistakes",{"title":864,"slug":865,"path":866,"order":615,"children":867},"Troubleshooting & Diagnostics","troubleshooting","en\u002Fdocs\u002Ftroubleshooting",[868],{"title":869,"slug":870,"path":871,"order":75},"Bus Communication Troubleshooting","bus-communication","en\u002Fdocs\u002Ftroubleshooting\u002Fbus-communication",{"title":873,"slug":623,"path":874,"order":625},"Frequently Asked Questions","en\u002Fdocs\u002Ffaq",{"en":876,"pl":888},{"troubleshooting":877,"getting-started":878,"logic-blocks\u002Finput":879,"logic-blocks\u002Fprocess":880,"logic-blocks\u002Foutput":881,"volang":882,"software":883,"how-to":884,"wiring":885,"logic-blocks":886,"modules":887},"troubleshooting\u002Fbus-communication","getting-started\u002Fconcepts","logic-blocks\u002Finput\u002Fbinary_input","logic-blocks\u002Fprocess\u002Fbinary_limiter","logic-blocks\u002Foutput\u002Foperation_mode_controller","volang\u002Flanguage","software\u002Fstudio","how-to\u002Fwhat-is-a-smart-home","wiring\u002Fbus-topology","logic-blocks\u002Foverview","modules\u002Fhub-wiring",{"bloki-logiczne\u002Finput":889,"bloki-logiczne":890,"bloki-logiczne\u002Foutput":891,"moduly":892,"bloki-logiczne\u002Fprocess":893,"pierwsze-kroki":894,"volang":895,"okablowanie":896,"oprogramowanie":897,"poradniki":898,"diagnostyka":899},"bloki-logiczne\u002Finput\u002Fbinary_input","bloki-logiczne\u002Fprzeglad","bloki-logiczne\u002Foutput\u002Foperation_mode_controller","moduly\u002Fokablowanie-hub","bloki-logiczne\u002Fprocess\u002Fbinary_limiter","pierwsze-kroki\u002Fpojecia","volang\u002Fjezyk","okablowanie\u002Ftopologia-magistrali","oprogramowanie\u002Fstudio","poradniki\u002Fczym-jest-smart-home","diagnostyka\u002Fkomunikacja-magistrali",{"enabled":58,"navigation":901},{"en":902,"pl":927},[903,909,915,921],{"title":904,"slug":905,"path":906,"order":69,"date":907,"translation_key":908},"Voldeno powered the Fischertechnik factory demo at Google Cloud Next '26","voldeno-at-google-cloud-next-26","en\u002Fblog\u002Fvoldeno-at-google-cloud-next-26","2026-04-28","2026_04_28_voldeno_at_google_cloud_next_26",{"title":910,"slug":911,"path":912,"order":69,"date":913,"translation_key":914},"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":916,"slug":917,"path":918,"order":69,"date":919,"translation_key":920},"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":922,"slug":923,"path":924,"order":69,"date":925,"translation_key":926},"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",[928,931,935,939],{"title":929,"slug":905,"path":930,"order":69,"date":907,"translation_key":908},"System Voldeno napędził demo fabryki Fischertechnik na Google Cloud Next '26","pl\u002Fblog\u002Fvoldeno-at-google-cloud-next-26",{"title":932,"slug":933,"path":934,"order":69,"date":913,"translation_key":914},"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":936,"slug":937,"path":938,"order":69,"date":919,"translation_key":920},"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":940,"slug":941,"path":942,"order":69,"date":925,"translation_key":926},"Odkryj przyszłość inteligentnych domów z Voldeno","odkryj-przyszlosc-inteligentnych-domow-z-voldeno","pl\u002Fblog\u002Fodkryj-przyszlosc-inteligentnych-domow-z-voldeno",{"pl":944,"en":945,"xDefault":944},"https:\u002F\u002Fvoldeno.com\u002Fpl\u002Fdocs\u002Fpierwsze-kroki\u002Fvolang-i-volangvm","https:\u002F\u002Fvoldeno.com\u002Fen\u002Fdocs\u002Fgetting-started\u002Fvolang-and-volangvm",{"slug":205,"title":204,"description":947,"tags":948,"content_html":953,"headings":954,"order":87,"extra":993},"Czym jest „logika” w inteligentnym domu, dlaczego nie da się jej w pełni wyklikać, czemu Voldeno wybrał własny język zamiast Pythona albo JavaScriptu i co realnie daje uruchamianie go na własnej maszynie wirtualnej.",[949,564,950,951,952],"pierwsze kroki","volangvm","programowanie","logika","\u003Ch1 id=\"volang-i-volangvm-po-co-inteligentny-dom-potrzebuje-wlasnego-jezyka-automatyki\">\u003Ca href=\"#volang-i-volangvm-po-co-inteligentny-dom-potrzebuje-wlasnego-jezyka-automatyki\" class=\"anchor\">#\u003C\u002Fa> Volang i VolangVM: po co inteligentny dom potrzebuje własnego języka automatyki\u003C\u002Fh1>\n\u003Cp>Każdy inteligentny dom składa się z dwóch warstw. Pierwsza to fizyczne urządzenia: moduły w rozdzielnicy, czujniki, włączniki, silniki rolet, źródła ciepła i chłodu. Druga to logika, czyli reguły, które decydują, co ma się stać, gdy zmienia się stan jakiegoś wejścia. Naciśnięcie przycisku ma włączyć światło. Przekroczenie temperatury ma uruchomić chłodzenie. Wykrycie ruchu o wybranych godzinach ma rozjaśnić korytarz, ale tylko wtedy, kiedy na zewnątrz jest ciemno.\u003C\u002Fp>\n\u003Cp>Większość użytkowników widzi system Voldeno od strony pierwszej warstwy: \u003Ca href=\"\u002Fpl\u002Fprodukty\u002Fhub\">HUB\u003C\u002Fa>, moduły \u003Ca href=\"\u002Fpl\u002Fprodukty\u002Fio\">I\u002FO\u003C\u002Fa>, \u003Ca href=\"\u002Fpl\u002Fprodukty\u002Frelay\">RELAY\u003C\u002Fa>, \u003Ca href=\"\u002Fpl\u002Fprodukty\u002F1wire\">1-WIRE\u003C\u002Fa> i \u003Ca href=\"\u002Fpl\u002Fprodukty\u002Fanalog-input\">ANALOG INPUT\u003C\u002Fa> na szynie DIN, wszystko spięte naszą magistralą Voldeno Bus. Druga warstwa, czyli logika, działa pod spodem i to ona odróżnia „zestaw modułów” od „systemu, który robi dokładnie to, co chcesz”.\u003C\u002Fp>\n\u003Cp>W tym wpisie tłumaczymy, jak ta druga warstwa jest u nas zorganizowana: czym jest \u003Ca href=\"\u002Fpl\u002Fdocs\u002Fvolang\u002Fjezyk\">Volang\u003C\u002Fa>, czym jest VolangVM, dlaczego mamy własny język zamiast korzystać z czegoś popularnego i co z tego wynika dla osób, które będą tej logiki używać. Tekst jest pisany dla czytelnika, który z programowaniem ma niewiele wspólnego, więc kluczowe pojęcia tłumaczymy po drodze.\u003C\u002Fp>\n\u003Ch2 id=\"czym-wlasciwie-jest-logika-w-inteligentnym-domu\">\u003Ca href=\"#czym-wlasciwie-jest-logika-w-inteligentnym-domu\" class=\"anchor\">#\u003C\u002Fa> Czym właściwie jest „logika” w inteligentnym domu\u003C\u002Fh2>\n\u003Cp>Logika to po prostu \u003Cstrong>reguły\u003C\u002Fstrong>. „Jeśli A, to zrób B”. Czasem jeden warunek, czasem siedem, czasem coś z czasem (po dwóch minutach), z licznikiem, z histerezą albo z zależnością od pory dnia.\u003C\u002Fp>\n\u003Cp>Najprostsza logika to dwa zdania po polsku: „kiedy ktoś nacisnie ten przycisk, włącz to światło”. Tę regułę można zapisać w głowie i potem skonfigurować w aplikacji jednym przeciągnięciem. Bardziej złożona logika to kaskada reguł, które wpływają na siebie nawzajem. Temperatura zadana zależy od harmonogramu, harmonogram zależy od trybu domu, tryb domu zależy od obecności, obecność zależy od kilku czujników i ostatniego logowania w aplikacji. Takie rzeczy bardzo szybko stają się trudne do utrzymania, jeśli zapisze się je tylko jako luźną listę „scen” i „automatyzacji”.\u003C\u002Fp>\n\u003Cp>Logika musi być gdzieś \u003Cstrong>uruchamiana\u003C\u002Fstrong>. W Voldeno robi to Hub, a w wybranych przypadkach również moduły rozszerzeń. Pytanie tylko: w jakim formacie ta logika ma być zapisana, żeby Hub wiedział, co dokładnie ma robić.\u003C\u002Fp>\n\u003Ch2 id=\"czy-nie-mozna-tego-po-prostu-wyklikac\">\u003Ca href=\"#czy-nie-mozna-tego-po-prostu-wyklikac\" class=\"anchor\">#\u003C\u002Fa> Czy nie można tego po prostu wyklikać?\u003C\u002Fh2>\n\u003Cp>Można. Dla większości codziennych scenariuszy tak właśnie się robi. W \u003Ca href=\"\u002Fpl\u002Fdocs\u002Foprogramowanie\u002Fstudio\">Voldeno Studio\u003C\u002Fa> całą logikę można złożyć z gotowych klocków. Te klocki nazywamy \u003Cstrong>blokami logicznymi\u003C\u002Fstrong>. Są wśród nich przełączniki, harmonogramy, regulator klimatu, sceny, liczniki, mostki do integracji. Łączy się je liniami: wyjście jednego bloku do wejścia drugiego. Cały projekt automatyzacji typowego domu można w ten sposób zbudować bez napisania jednej linii kodu.\u003C\u002Fp>\n\u003Cp>Ten sposób ma realne granice. Wbudowane bloki to skończona lista. Robią dokładnie to, do czego zostały zaprojektowane. Jeżeli na przykład chcesz:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>liczyć impulsy z licznika energii i co pełną kilowatogodzinę publikować zdarzenie do swojej chmury,\u003C\u002Fli>\n\u003Cli>zaimplementować nietypową sekwencję bramy garażowej, której producent nie obsługuje natywnie,\u003C\u002Fli>\n\u003Cli>napisać własny algorytm sterowania pompą ciepła z trybami i histerezą dopasowaną do konkretnej instalacji,\u003C\u002Fli>\n\u003Cli>zintegrować się z systemem zewnętrznym po protokole, którego jeszcze nie ma w naszej liście integracji,\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>to z samych bloków logicznych tego nie złożysz. Trzeba opisać, \u003Cstrong>co dokładnie ma się dziać\u003C\u002Fstrong>, w sposób, który komputer wykona dosłownie. Do tego służy język programowania.\u003C\u002Fp>\n\u003Ch2 id=\"po-co-tworzy-sie-jezyki-do-logiki\">\u003Ca href=\"#po-co-tworzy-sie-jezyki-do-logiki\" class=\"anchor\">#\u003C\u002Fa> Po co tworzy się „języki” do logiki\u003C\u002Fh2>\n\u003Cp>Język programowania to \u003Cstrong>bardzo precyzyjny sposób zapisywania reguł\u003C\u002Fstrong>. Człowiek pisze tekst, kompilator (program tłumaczący) sprawdza, czy ten tekst trzyma się ustalonych zasad, a potem urządzenie wykonuje opis dosłownie, krok po kroku, miliony razy bez żadnej interpretacji.\u003C\u002Fp>\n\u003Cp>Wszystkie poważne systemy automatyki budynkowej mają swój sposób zapisywania logiki. KNX ma ETS i konfigurację adresów grupowych. Sterowniki PLC w przemyśle mają języki standardu IEC 61131-3 (drabinkę, blok funkcyjny, listę instrukcji, tekst strukturalny). Home Assistant używa YAML i Pythona. Im więcej można zrobić z systemu, tym bardziej precyzyjnego „języka” wymaga w środku.\u003C\u002Fp>\n\u003Cp>Powód, dla którego nie da się uciec przed jakąś formą języka, jest prosty. \u003Cstrong>Bloki logiczne w GUI też są językiem.\u003C\u002Fstrong> Każdy blok to ukryta funkcja. Każde połączenie to ukryta linia kodu. Różnica polega tylko na tym, jak bardzo ten „język” jest widoczny i jak bardzo elastyczny. Wizualne języki są łatwe na początku i męczące, gdy logika rośnie. Tekstowe są trudniejsze na początku i znacznie bardziej wytrzymałe, gdy projekt urośnie.\u003C\u002Fp>\n\u003Ch2 id=\"dlaczego-nie-uzylismy-gotowego-jezyka-jak-python-czy-javascript\">\u003Ca href=\"#dlaczego-nie-uzylismy-gotowego-jezyka-jak-python-czy-javascript\" class=\"anchor\">#\u003C\u002Fa> Dlaczego nie użyliśmy gotowego języka jak Python czy JavaScript\u003C\u002Fh2>\n\u003Cp>To pierwsze pytanie, które sami sobie zadaliśmy. Python i JavaScript są wszędzie. Lua jest popularna w urządzeniach wbudowanych. Mamy do tych języków szacunek i używamy ich w innych miejscach naszego ekosystemu (na przykład w narzędziach back-endowych albo w aplikacji desktopowej). Do logiki uruchamianej na module na szynie DIN zdecydowaliśmy się jednak zbudować coś własnego. Powody są następujące.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Rozmiar.\u003C\u002Fstrong> Hub ma ograniczoną pamięć i procesor wbudowany, a moduły rozszerzeń jeszcze mniej. Pełen interpreter Pythona zajmuje wiele megabajtów RAM-u i ciągnie za sobą gigantyczny ekosystem zależności. Dla naszych modułów to zaporowo dużo. Volang jest projektowany jako mały, oszczędny i szybki w starcie.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Bezpieczeństwo.\u003C\u002Fstrong> Logika napisana przez użytkownika nigdy nie powinna móc zawiesić Huba ani wpływać na inne projekty na tym samym urządzeniu. To wymaga bardzo precyzyjnych ograniczeń, jakie operacje wolno wykonać i jak długo. W ogólnym Pythonie czy JavaScripcie da się to zrobić, ale tylko dużym wysiłkiem i często niepełnie. Własny, wąski język pozwala te ograniczenia wpisać już w sam projekt języka, a nie dokleić je obok.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Przewidywalność czasu wykonania.\u003C\u002Fstrong> W systemie sterującym ogrzewaniem, oświetleniem i bramą formuła „prawie zawsze działa szybko” to nie jest dobra formuła. Chcieliśmy języka, w którym wykonanie tego samego kodu zawsze trwa porównywalnie długo i nie wykonuje magii w tle (na przykład samodzielnego zwalniania pamięci w przypadkowych momentach, jak robi to większość ogólnych runtime'ów). Volang nie ma odśmiecacza pamięci typu „garbage collector”, który mógłby wstrzymać wykonanie skryptu w nieoczekiwanej chwili.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Dopasowanie do automatyki.\u003C\u002Fstrong> W Volangu od pierwszej linijki ma sens taki kod jak \u003Ccode>output::set(&quot;relay_1&quot;, true)\u003C\u002Fcode> albo \u003Ccode>input::value()\u003C\u002Fcode>. Pojęcia „wejście”, „wyjście”, „kanał”, „blok” są częścią biblioteki standardowej. W Pythonie czy JavaScripcie te warstwy trzeba by najpierw zbudować i utrzymywać, a użytkownik i tak musiałby się ich nauczyć.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Stabilność w czasie.\u003C\u002Fstrong> O tym, jak rozwija się składnia Volanga i jego biblioteka standardowa, decydujemy my, a nie zewnętrzna społeczność. W Pythonie czy JavaScripcie kolejne wersje języka regularnie zmieniają stare funkcje albo wycofują je z użycia, przez co projekty co jakiś czas trzeba dostosowywać. W Volangu chcemy, żeby skrypt napisany dziś działał bez zmian również za dwa lata i za dziesięć.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>A co z MicroPythonem?\u003C\u002Fstrong> To pytanie często wraca, więc krótka odpowiedź. \u003Cstrong>MicroPython\u003C\u002Fstrong> i \u003Cstrong>CircuitPython\u003C\u002Fstrong> to okrojone wersje Pythona pod mikrokontrolery i są naprawdę dobre w swojej klasie. Dla naszego konkretnego zastosowania powody, dla których ich nie wzięliśmy, to dokładnie te same powody, które wymieniliśmy wyżej, tylko zaostrzone: nadal kilkaset KB pamięci, nadal jest garbage collector zatrzymujący skrypt na nieprzewidywalne milisekundy, a żeby zbudować z tego sensowny sandbox, trzeba odciąć tyle Pythona, że robi się z tego de facto własny, węższy język. „Prawie Python” jest też pułapką, bo użytkownik wpada w nawyki, które nagle nie działają.\u003C\u002Fp>\n\u003Cp>To nie jest stanowisko „wszystko po swojemu z zasady”. Rozważamy podpięcie dodatkowych języków w przyszłości tam, gdzie to ma sens. Dla samej warstwy logiki bloków własny, bardzo wąski język daje nam najlepszy kompromis.\u003C\u002Fp>\n\u003Ch2 id=\"co-to-jest-volangvm\">\u003Ca href=\"#co-to-jest-volangvm\" class=\"anchor\">#\u003C\u002Fa> Co to jest VolangVM\u003C\u002Fh2>\n\u003Cp>VM, czyli \u003Cstrong>maszyna wirtualna\u003C\u002Fstrong>, to brzmi groźnie, ale w praktyce jest to po prostu \u003Cstrong>mały, wyspecjalizowany program\u003C\u002Fstrong>, który „udaje” prosty komputer i wykonuje na nim instrukcje napisane w Volangu.\u003C\u002Fp>\n\u003Cp>Po napisaniu skryptu w Studio dzieje się tak:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Kod tekstowy w Volangu jest sprawdzany pod kątem składni i typów. To jest etap \u003Cstrong>kompilacji\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003Cli>Jeśli wszystko jest w porządku, kompilator zamienia tekst na zwarte, binarne instrukcje, tzw. \u003Cstrong>bytecode\u003C\u002Fstrong>. Bytecode wygląda dla człowieka jak ciąg liczb, ale jest dla maszyny szybki do odczytania.\u003C\u002Fli>\n\u003Cli>Bytecode trafia do Huba (a docelowo również do wybranych modułów rozszerzeń) i tam jest wczytywany przez VolangVM.\u003C\u002Fli>\n\u003Cli>VolangVM krok po kroku wykonuje instrukcje. Czyta wejścia, oblicza warunki, ustawia wyjścia, wywołuje funkcje biblioteki standardowej.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Dla porównania: bez VM Hub musiałby za każdym razem od nowa parsować tekst skryptu, sprawdzać go, zamieniać na działania. Z VM ta praca jest wykonana raz, a uruchomienie skryptu na urządzeniu sprowadza się do odczytywania gotowych instrukcji.\u003C\u002Fp>\n\u003Ch3 id=\"kompilator-dziala-nie-tylko-w-studio\">\u003Ca href=\"#kompilator-dziala-nie-tylko-w-studio\" class=\"anchor\">#\u003C\u002Fa> Kompilator działa nie tylko w Studio\u003C\u002Fh3>\n\u003Cp>Ważna i często pomijana rzecz: \u003Cstrong>ten sam kompilator Volanga jest zarówno w Voldeno Studio, jak i w samym Hubie\u003C\u002Fstrong>.\u003C\u002Fp>\n\u003Cp>W typowym przepływie pracy instalator otwiera projekt w Studio na komputerze, edytuje skrypt, kompiluje go lokalnie, sprawdza w symulatorze i wgrywa już skompilowany bytecode do Huba. Tak jest najszybciej i najwygodniej, bo Studio od razu pokazuje błędy składni i ostrzeżenia.\u003C\u002Fp>\n\u003Cp>Hub jednak nie wymaga, żeby kod zawsze przyszedł skompilowany. Potrafi też przyjąć \u003Cstrong>sam tekst Volanga\u003C\u002Fstrong> i samodzielnie go skompilować przed uruchomieniem. Sprawdzenie składni, sprawdzenie typów, kontrola integralności, generacja bytecode'u - wszystko to potrafi wykonać samodzielnie.\u003C\u002Fp>\n\u003Cp>Dla nas, jako twórców systemu, jest to fundament architektoniczny. Studio i Hub używają \u003Cstrong>tego samego kodu kompilatora i tej samej VM\u003C\u002Fstrong>. Skrypt skompilowany w jednym miejscu zachowa się identycznie w drugim. Nie ma „dialektu Studio” i „dialektu Huba”. To otwiera w przyszłości drogę do scenariuszy, w których logikę da się aktualizować bez Studio (np. zdalnie z Voldeno Cloud albo programowo z narzędzia integratora). Na dziś podstawową ścieżką pracy jest jednak edycja i kompilacja w Studio.\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Krótki przykład - zobacz wejście, które się zmieniło,\u003C\u002Fspan>\n\u003Cspan class=\"comment\">\u002F\u002F i odpowiednio przełącz wyjście \"relay_1\".\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> \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\">\"relay_1\"\u003C\u002Fspan>)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\n\u003Cp>To jest kilka lini logiki, które po kompilacji zamieniają się w kilkadziesiąt bajtów bytecode'u i są wykonywane przez VolangVM przy każdej zmianie wejścia bloku.\u003C\u002Fp>\n\u003Ch2 id=\"co-realnie-daje-volangvm\">\u003Ca href=\"#co-realnie-daje-volangvm\" class=\"anchor\">#\u003C\u002Fa> Co realnie daje VolangVM\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>Sandbox, czyli izolacja.\u003C\u002Fstrong> Każdy skrypt działa w odgrodzonym środowisku. Błąd wykonania w jednym bloku (na przykład próba dzielenia przez zero) zatrzymuje \u003Cstrong>tylko ten jeden skrypt\u003C\u002Fstrong>, a nie cały Hub. Reszta automatyki dalej działa: światła reagują, ogrzewanie się reguluje, harmonogramy się wykonują.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Wydajność na małym sprzęcie.\u003C\u002Fstrong> Bytecode jest mały i szybki do uruchomienia. VM mieści się tam, gdzie pełen interpreter ogólnego języka by się nie zmieścił. To otwiera drogę do uruchamiania logiki nie tylko centralnie na Hubie, ale też na samych modułach rozszerzeń.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Identyczna symulacja w Voldeno Studio.\u003C\u002Fstrong> To jedna z najważniejszych konsekwencji architektury VM. Ta sama VolangVM, która działa na Hubie, działa też w Studio na komputerze instalatora. Skrypt można uruchomić „na sucho”, podać mu testowe wejścia i zobaczyć, jak się zachowuje, z gwarancją że na realnym urządzeniu będzie działał tak samo. Nie ma sytuacji „u mnie na komputerze działało, u klienta nie”.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Przenośność.\u003C\u002Fstrong> Bytecode nie zależy od tego, jaki dokładnie procesor jest w danym module. Logikę można w przyszłości uruchomić na nowym sprzęcie bez żadnych zmian w kodzie projektu, dopóki działa na nim VolangVM.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Rozproszone wykonanie.\u003C\u002Fstrong> Wybrane fragmenty logiki mogą działać blisko sprzętu, bezpośrednio na module rozszerzenia, a nie centralnie na Hubie. To zmniejsza opóźnienia i pozwala krytycznym reakcjom (np. „natychmiast wyłącz styk po przekroczeniu prądu”) działać lokalnie nawet wtedy, kiedy magistrala jest chwilowo zajęta.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Aktualizacje, które łatwo wycofać.\u003C\u002Fstrong> Skrypty są wersjonowane w projekcie. Wgranie nowej wersji nie zastępuje firmware'u modułu, tylko zawartość VM. Awaryjny powrót do poprzedniej wersji jest tani i szybki.\u003C\u002Fp>\n\u003Ch2 id=\"biblioteka-standardowa-volanga-czyli-co-skrypt-dostaje-od-razu\">\u003Ca href=\"#biblioteka-standardowa-volanga-czyli-co-skrypt-dostaje-od-razu\" class=\"anchor\">#\u003C\u002Fa> Biblioteka standardowa Volanga, czyli co skrypt dostaje od razu\u003C\u002Fh2>\n\u003Cp>Sam język programowania to dopiero połowa układanki. Druga połowa to \u003Cstrong>biblioteka standardowa\u003C\u002Fstrong>, czyli zestaw gotowych funkcji, które każdy skrypt może zawołać od razu, bez instalowania niczego, bez kopiowania kodu skądinąd, bez ściągania pakietów z internetu.\u003C\u002Fp>\n\u003Cp>Każdy poważny język programowania ma swoją bibliotekę standardową. W Pythonie to \u003Ccode>os\u003C\u002Fcode>, \u003Ccode>math\u003C\u002Fcode>, \u003Ccode>datetime\u003C\u002Fcode>, \u003Ccode>json\u003C\u002Fcode> i setki innych. W JavaScripcie to \u003Ccode>Math\u003C\u002Fcode>, \u003Ccode>JSON\u003C\u002Fcode>, \u003Ccode>Date\u003C\u002Fcode>, \u003Ccode>fetch\u003C\u002Fcode>. Powód jest prosty: bez biblioteki standardowej każdy programista musiałby od zera pisać podstawy. Mnożenie liczb to składnia języka, ale „pierwiastek kwadratowy”, „aktualna godzina”, „zamień tekst na liczbę” albo „zaokrąglij w górę” to już funkcje. Biblioteka standardowa odpowiada na pytanie „jakie podstawowe rzeczy język już potrafi, gdy go uruchomisz”.\u003C\u002Fp>\n\u003Cp>W Volangu biblioteka standardowa dzieli się na kilka grup. Wymieniam je, żeby było widać konkretnie, co skrypt ma do dyspozycji:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Wejścia i wyjścia bloku\u003C\u002Fstrong> (\u003Ccode>input::channel\u003C\u002Fcode>, \u003Ccode>input::value\u003C\u002Fcode>, \u003Ccode>input::get\u003C\u002Fcode>, \u003Ccode>output::set\u003C\u002Fcode>, \u003Ccode>output::toggle\u003C\u002Fcode>, ...). To podstawa, bo cały sens Volanga to reakcja na zdarzenie z wejścia i ustawienie wyjścia. Bez tych funkcji skrypt nie ma jak rozmawiać z resztą instalacji.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Stan i konfiguracja bloku\u003C\u002Fstrong> (\u003Ccode>state::set\u003C\u002Fcode>, \u003Ccode>state::get\u003C\u002Fcode>, \u003Ccode>config::get\u003C\u002Fcode>, ...). Dzięki nim blok może coś zapamiętać między zdarzeniami (np. licznik impulsów) i sięgnąć do parametrów ustawionych w Studio.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Czas i harmonogramy\u003C\u002Fstrong> (\u003Ccode>time::now\u003C\u002Fcode>, callbacki). Bez tego nie da się napisać reguły „włącz na 5 minut, potem wyłącz”.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Praca z tekstem, liczbami, tablicami i mapami\u003C\u002Fstrong> (operacje na stringach, math, array, map). Codzienne narzędzia: zliczyć, posortować, podzielić tekst, sprawdzić zakres.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>JSON i Base64.\u003C\u002Fstrong> Standardowe formaty, które są potrzebne za każdym razem, gdy logika ma rozmawiać ze światem zewnętrznym.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>HTTP i operacje sieciowe\u003C\u002Fstrong> w wybranych, kontrolowanych formach. To jedyna droga, żeby skrypt sięgnął poza urządzenie. Nie ma tu „zaimportuj sobie cokolwiek z internetu”. Jest „użyj tych konkretnych funkcji, które VM zna i rozumie”.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Kryptografia i operacje pomocnicze.\u003C\u002Fstrong> Podpisy, skróty, kodowanie - tyle, ile potrzeba, żeby zrobić bezpieczną integrację (np. JWT do Google Cloud, jak w naszym demie z Google Cloud Next).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Operacje asynchroniczne.\u003C\u002Fstrong> Pozwalają zaplanować akcję na później bez blokowania wykonania.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>W Volangu biblioteka standardowa pełni jeszcze jedną rolę, której nie ma w „dużych” językach: \u003Cstrong>jest również granicą bezpieczeństwa\u003C\u002Fstrong>. Skoro nie da się doinstalować pakietu ani zaimportować dowolnego modułu, to wszystko, co skrypt potrafi w stosunku do świata zewnętrznego, musi być w stdlib. Każda funkcja, która tam jest, została świadomie zaprojektowana z myślą o tym, że będzie wywoływana z sandboxa. Nic nie wycieknie „bocznymi drzwiami”, bo bocznych drzwi po prostu nie ma.\u003C\u002Fp>\n\u003Cp>To zmienia sposób myślenia. Dużego języka uczysz się przez „znajdę bibliotekę, która to robi”. Volanga uczysz się przez „sprawdzę, jaka funkcja w stdlib to robi”. Lista jest skończona, ale za to wszystko, co tam jest, jest stabilne, szybkie i bezpieczne.\u003C\u002Fp>\n\u003Cp>Pełną listę funkcji opisuje \u003Ca href=\"\u002Fpl\u002Fdocs\u002Fvolang\u002Fbiblioteka-standardowa\">Biblioteka standardowa Volanga\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"granice-volanga-czyli-czego-nie-zrobi\">\u003Ca href=\"#granice-volanga-czyli-czego-nie-zrobi\" class=\"anchor\">#\u003C\u002Fa> Granice Volanga, czyli czego nie zrobi\u003C\u002Fh2>\n\u003Cp>Volang jest celowo wąski. Wymienienie tego, czego w nim \u003Cstrong>nie ma\u003C\u002Fstrong>, jest tu uczciwsze niż listowanie wszystkiego, co potrafi.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Brak swobodnego dostępu do internetu.\u003C\u002Fstrong> Komunikacja sieciowa odbywa się przez konkretne, przygotowane funkcje biblioteki standardowej (np. wywołania HTTP, klient MQTT, publikacja do Google Pub\u002FSub). Nie ma czegoś takiego jak \u003Ccode>import requests\u003C\u002Fcode> w środku skryptu.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Brak instalowania zewnętrznych bibliotek.\u003C\u002Fstrong> Cała funkcjonalność, jaką możesz wywołać, pochodzi z biblioteki standardowej Volanga albo z bloków logicznych dostarczanych przez Voldeno.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Brak dostępu do plików.\u003C\u002Fstrong> Skrypt nie czyta i nie zapisuje plików na dysku Huba. Stan trzymany jest w zmiennych bloku, w jego wejściach i wyjściach.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Brak operacji systemowych.\u003C\u002Fstrong> Nie da się wywołać programu zewnętrznego, otworzyć socketa „ręcznie”, uruchomić kontenera. To jest celowe i bezpieczeństwo systemu na tym stoi.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Wąska składnia.\u003C\u002Fstrong> Jest tylko pętla \u003Ccode>while\u003C\u002Fcode>, nie ma \u003Ccode>for\u003C\u002Fcode>. Zmienne globalne nie są widoczne wewnątrz funkcji, argumenty trzeba przekazać jawnie. Lista słów kluczowych jest krótka.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Dla kogoś, kto programuje zawodowo, lista ograniczeń jest długa. To jest zgodne z planem. Volang nie ma być „kolejnym językiem ogólnego przeznaczenia”. Ma być najkrótszą drogą od pomysłu na automatyzację do działającego, bezpiecznego i przewidywalnego skryptu wewnątrz Huba.\u003C\u002Fp>\n\u003Ch2 id=\"niebezpieczenstwa-o-ktorych-trzeba-wiedziec\">\u003Ca href=\"#niebezpieczenstwa-o-ktorych-trzeba-wiedziec\" class=\"anchor\">#\u003C\u002Fa> Niebezpieczeństwa, o których trzeba wiedzieć\u003C\u002Fh2>\n\u003Cp>Pisanie własnej logiki to władza, a władza ma konsekwencje. Kilka rzeczy wartych uwagi.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Złe sterowanie sprzętem.\u003C\u002Fstrong> Skrypt, który włącza i wyłącza grzałkę kotła co 200 ms, zniszczy stycznik. Skrypt, który próbuje jednocześnie otworzyć i zamknąć rolety, zatrzyma napęd na ograniczniku termicznym. VolangVM nie wie, co fizycznie jest podpięte do styku po drugiej stronie. To leży po stronie projektanta logiki.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Pętle, które się nie kończą.\u003C\u002Fstrong> Pętla \u003Ccode>while\u003C\u002Fcode> z warunkiem, który nigdy nie staje się fałszywy, zablokuje wykonanie skryptu w bloku. Skoro skrypt nie kończy się normalnie, to nie odpowie też na kolejne zdarzenia z wejść i blok przestaje działać. Dlatego pisząc \u003Ccode>while\u003C\u002Fcode>, warto zadbać o warunek oparty na liczniku albo wartości wejścia, a w środku zawsze umieścić coś, co ten warunek zmienia. Ewentualnie wstawić \u003Ccode>break\u003C\u002Fcode> powiązany z warunkiem awaryjnym. Volang celowo nie ma pętli \u003Ccode>for\u003C\u002Fcode>, więc odpowiedzialność za to, żeby pętla się skończyła, leży po stronie autora skryptu.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Logika, która ma sens „na sucho”, a nie z fizyką.\u003C\u002Fstrong> Symulacja w Studio sprawdza działanie skryptu, ale nie sprawdza, czy w salonie naprawdę można otworzyć rolety, kiedy o 14:00 świeci pełne słońce, a okno jest uchylone na rozszczelnienie i może zaczepić się o napęd. Realnego testu na działającej instalacji nie da się ominąć.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Złożoność, która rośnie szybciej niż dokumentacja.\u003C\u002Fstrong> Łatwo dodać kolejny warunek, kolejną zmienną, kolejną zależność. Trudniej wrócić do tego pliku za rok i zrozumieć, dlaczego tak. Zalecamy dzielenie logiki na małe bloki i komentarze w miejscach, w których powód decyzji nie jest oczywisty z samego kodu.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Aktualizacje, które niezauważalnie zmieniają zachowanie.\u003C\u002Fstrong> Volang jako język i biblioteka standardowa są stabilne, ale projekt automatyzacji ewoluuje. Każda zmiana w skrypcie powinna przejść przez Studio z symulacją, zanim trafi do żywego Huba.\u003C\u002Fp>\n\u003Cp>Te ryzyka są realne, ale są też normalne dla każdego programowalnego systemu automatyki. Dlatego trzymamy się trzech zasad: skrypt działa w sandboxie, ten sam skrypt można uruchomić w Studio przed wgraniem na Hub, a poprzednia wersja zawsze daje się przywrócić.\u003C\u002Fp>\n\u003Ch2 id=\"bloki-logiczne-czyli-warstwa-nad-volangiem\">\u003Ca href=\"#bloki-logiczne-czyli-warstwa-nad-volangiem\" class=\"anchor\">#\u003C\u002Fa> Bloki logiczne, czyli warstwa nad Volangiem\u003C\u002Fh2>\n\u003Cp>Praktyczna uwaga na koniec. Większość użytkowników i instalatorów nigdy nie napisze ani jednej linii Volanga. Dla nich logika powstaje z gotowych \u003Cstrong>bloków logicznych\u003C\u002Fstrong> (przełączniki, regulatory klimatu, harmonogramy, sceny). Studio łączy je wizualnie, a Hub wykonuje. Każdy z tych bloków pod spodem to skompilowany Volang, ale od strony użytkownika wygląda jak klocek z portami wejściowymi i wyjściowymi.\u003C\u002Fp>\n\u003Cp>Volang wchodzi do gry wtedy, gdy:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>chcesz dodać własny blok robiący coś, czego nie ma w bibliotece,\u003C\u002Fli>\n\u003Cli>robisz integrację z systemem zewnętrznym,\u003C\u002Fli>\n\u003Cli>piszesz nietypową automatyzację dla konkretnego klienta,\u003C\u002Fli>\n\u003Cli>albo jako instalator\u002Fintegrator utrzymujesz dla wielu instalacji własny zestaw „swoich” bloków.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Wtedy pisanie w Volangu jest po prostu szybsze i wytrzymalsze w czasie niż próba sklejania wielu wbudowanych bloków logicznych obok siebie.\u003C\u002Fp>\n\u003Ch2 id=\"co-dalej\">\u003Ca href=\"#co-dalej\" class=\"anchor\">#\u003C\u002Fa> Co dalej\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>Pełna dokumentacja języka: \u003Ca href=\"\u002Fpl\u002Fdocs\u002Fvolang\u002Fjezyk\">Volang\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>Funkcje i moduły dostępne w skryptach: \u003Ca href=\"\u002Fpl\u002Fdocs\u002Fvolang\u002Fbiblioteka-standardowa\">Biblioteka standardowa Volang\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"\u002Fpl\u002Fdocs\u002Foprogramowanie\u002Fstudio\">Voldeno Studio\u003C\u002Fa> jest do pobrania za darmo, razem z narzędziami do edycji bloków, kompilacji i symulacji. Zacznij na \u003Ca href=\"\u002Fpl\u002Fpobieranie\">stronie pobierania\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>Chcesz pisać własne bloki dla swoich klientów albo zbudować integrację z konkretnym systemem zewnętrznym? \u003Ca href=\"\u002Fpl\u002Fkontakt\">Skontaktuj się z nami\u003C\u002Fa>. Dla integratorów i partnerów: \u003Ca href=\"\u002Fpl\u002Fdla-profesjonalistow\">Strefa profesjonalistów\u003C\u002Fa>.\u003C\u002Fli>\n\u003C\u002Ful>\n",[955,957,960,963,966,969,972,975,978,981,984,987,990],{"level":75,"text":204,"id":956},"volang-i-volangvm-po-co-inteligentny-dom-potrzebuje-wlasnego-jezyka-automatyki",{"level":81,"text":958,"id":959},"Czym właściwie jest „logika” w inteligentnym domu","czym-wlasciwie-jest-logika-w-inteligentnym-domu",{"level":81,"text":961,"id":962},"Czy nie można tego po prostu wyklikać?","czy-nie-mozna-tego-po-prostu-wyklikac",{"level":81,"text":964,"id":965},"Po co tworzy się „języki” do logiki","po-co-tworzy-sie-jezyki-do-logiki",{"level":81,"text":967,"id":968},"Dlaczego nie użyliśmy gotowego języka jak Python czy JavaScript","dlaczego-nie-uzylismy-gotowego-jezyka-jak-python-czy-javascript",{"level":81,"text":970,"id":971},"Co to jest VolangVM","co-to-jest-volangvm",{"level":87,"text":973,"id":974},"Kompilator działa nie tylko w Studio","kompilator-dziala-nie-tylko-w-studio",{"level":81,"text":976,"id":977},"Co realnie daje VolangVM","co-realnie-daje-volangvm",{"level":81,"text":979,"id":980},"Biblioteka standardowa Volanga, czyli co skrypt dostaje od razu","biblioteka-standardowa-volanga-czyli-co-skrypt-dostaje-od-razu",{"level":81,"text":982,"id":983},"Granice Volanga, czyli czego nie zrobi","granice-volanga-czyli-czego-nie-zrobi",{"level":81,"text":985,"id":986},"Niebezpieczeństwa, o których trzeba wiedzieć","niebezpieczenstwa-o-ktorych-trzeba-wiedziec",{"level":81,"text":988,"id":989},"Bloki logiczne, czyli warstwa nad Volangiem","bloki-logiczne-czyli-warstwa-nad-volangiem",{"level":81,"text":991,"id":992},"Co dalej","co-dalej",{},1778356025685]