[{"data":1,"prerenderedAt":1552},["ShallowReactive",2],{"manifest":3,"hreflang-alternates":1339,"doc-de-volang\u002Fstdlib":1344},{"site":4,"branding":6,"contact":8,"organization_schema":10,"languages":60,"website":71,"docs":243,"blog":1243},{"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":44,"contact_point_available_languages":56},"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,"de":39},[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",[28,40,41,42,32,43],"Smart-Home-Systeme","Smart-Home-Automatisierung","Gebäudeautomation","Hausautomationssystem",[45,48,51,54],{"email":46,"contact_type":47},"support@voldeno.com","technical support",{"email":49,"contact_type":50},"sales@voldeno.com","sales",{"email":52,"contact_type":53},"partners@voldeno.com","partnerships",{"email":9,"contact_type":55},"customer service",[57,58,59],"Polish","English","German",[61,65,68],{"code":62,"name":63,"default":64},"pl","Polski",true,{"code":66,"name":58,"default":67},"en",false,{"code":69,"name":70,"default":67},"de","Deutsch",{"enabled":64,"navigation":72,"path_keys":205,"section_index_slugs":233},{"de":73,"pl":130,"en":169},[74,80,86,92,102,108,114,125],{"title":75,"slug":76,"path":77,"order":78,"template":79},"Voldeno: Smart Home, Gebäudeautomation","index","de\u002Findex",0,"home",{"title":81,"slug":82,"path":83,"order":84,"template":85},"Ihr Zuhause","ihr-zuhause","de\u002Fihr-zuhause",1,"homeowners",{"title":87,"slug":88,"path":89,"order":90,"template":91},"Für Fachbetriebe","fuer-fachbetriebe","de\u002Ffuer-fachbetriebe",2,"professionals",{"title":93,"slug":94,"path":95,"order":96,"children":97},"Produkte","produkte","de\u002Fprodukte",3,[98],{"title":99,"slug":76,"path":100,"order":84,"template":101},"Smart-Home-Produkte​ von Voldeno","de\u002Fprodukte\u002Findex","products",{"title":103,"slug":104,"path":105,"order":106,"template":107},"Kontakt","kontakt","de\u002Fkontakt",4,"contact",{"title":109,"slug":110,"path":111,"order":112,"template":113},"Über uns","ueber-uns","de\u002Fueber-uns",5,"about",{"title":115,"slug":116,"path":117,"order":118,"children":119},"Rechtliches","rechtliches","de\u002Frechtliches",6,[120],{"title":121,"slug":122,"path":123,"order":84,"template":124},"Datenschutzerklärung","privacy-policy","de\u002Frechtliches\u002Fprivacy-policy","page",{"title":126,"slug":127,"path":128,"order":129},"Projekte","projekte","de\u002Fprojekte",999,[131,134,138,142,150,152,156,165],{"title":132,"slug":76,"path":133,"order":78,"template":79},"Smart Home, Automatyka budynkowa - Voldeno","pl\u002Findex",{"title":135,"slug":136,"path":137,"order":84,"template":85},"Twój Dom","twoj-dom","pl\u002Ftwoj-dom",{"title":139,"slug":140,"path":141,"order":90,"template":91},"Dla Profesjonalistów","dla-profesjonalistow","pl\u002Fdla-profesjonalistow",{"title":143,"slug":144,"path":145,"order":96,"children":146},"Produkty","produkty","pl\u002Fprodukty",[147],{"title":148,"slug":76,"path":149,"order":84,"template":101},"Inteligentne produkty​ Smart Home Voldeno","pl\u002Fprodukty\u002Findex",{"title":103,"slug":104,"path":151,"order":106,"template":107},"pl\u002Fkontakt",{"title":153,"slug":154,"path":155,"order":112,"template":113},"O nas","o-nas","pl\u002Fo-nas",{"title":157,"slug":158,"path":159,"order":118,"children":160},"Prawne","prawne","pl\u002Fprawne",[161],{"title":162,"slug":163,"path":164,"order":84,"template":124},"Polityka prywatności","polityka-prywatnosci","pl\u002Fprawne\u002Fpolityka-prywatnosci",{"title":166,"slug":167,"path":168,"order":129},"Realizacje","realizacje","pl\u002Frealizacje",[170,173,177,180,187,190,193,201],{"title":171,"slug":76,"path":172,"order":78,"template":79},"Voldeno: Smart Home, Building Automation","en\u002Findex",{"title":174,"slug":175,"path":176,"order":84,"template":85},"Your Home","your-home","en\u002Fyour-home",{"title":178,"slug":91,"path":179,"order":90,"template":91},"For Professionals","en\u002Fprofessionals",{"title":181,"slug":101,"path":182,"order":96,"children":183},"Products","en\u002Fproducts",[184],{"title":185,"slug":76,"path":186,"order":84,"template":101},"Smart Home Products​ from Voldeno","en\u002Fproducts\u002Findex",{"title":188,"slug":107,"path":189,"order":106,"template":107},"Contact","en\u002Fcontact",{"title":191,"slug":113,"path":192,"order":112,"template":113},"About Us","en\u002Fabout",{"title":194,"slug":195,"path":196,"order":118,"children":197},"Legal","legal","en\u002Flegal",[198],{"title":199,"slug":122,"path":200,"order":84,"template":124},"Privacy Policy","en\u002Flegal\u002Fprivacy-policy",{"title":202,"slug":203,"path":204,"order":129},"Projects","projects","en\u002Fprojects",{"module_1wire":206,"module_hub":210,"module_analog_input":214,"downloads":218,"module_relay":221,"privacy":225,"module_io":229},{"pl":207,"de":208,"en":209},"produkty\u002F1wire","produkte\u002F1wire","products\u002F1wire",{"en":211,"pl":212,"de":213},"products\u002Fhub","produkty\u002Fhub","produkte\u002Fhub",{"de":215,"pl":216,"en":217},"produkte\u002Fanalog-input","produkty\u002Fanalog-input","products\u002Fanalog-input",{"de":219,"pl":220,"en":219},"downloads","pobieranie",{"en":222,"pl":223,"de":224},"products\u002Frelay","produkty\u002Frelay","produkte\u002Frelay",{"pl":226,"de":227,"en":228},"prawne\u002Fpolityka-prywatnosci","rechtliches\u002Fprivacy-policy","legal\u002Fprivacy-policy",{"en":230,"pl":231,"de":232},"products\u002Fio","produkty\u002Fio","produkte\u002Fio",{"de":234,"en":237,"pl":240},{"projekte":235,"produkte":236},"projekte\u002Findex","produkte\u002Findex",{"products":238,"projects":239},"products\u002Findex","projects\u002Findex",{"realizacje":241,"produkty":242},"realizacje\u002Findex","produkty\u002Findex",{"enabled":64,"navigation":244,"section_redirects":1205},{"de":245,"pl":696,"en":958},[246,267,276,301,314,631,645,659,681,691],{"title":247,"slug":248,"path":249,"order":84,"children":250},"Erste Schritte","erste-schritte","de\u002Fdocs\u002Ferste-schritte",[251,255,259,263],{"title":252,"slug":253,"path":254,"order":84},"Grundlegende Konzepte und Terminologie","concepts","de\u002Fdocs\u002Ferste-schritte\u002Fconcepts",{"title":256,"slug":257,"path":258,"order":90},"Systemüberblick für Installateure","system-overview","de\u002Fdocs\u002Ferste-schritte\u002Fsystem-overview",{"title":260,"slug":261,"path":262,"order":96},"Logik in Voldeno Studio von Grund auf definieren","logik-von-grund-auf-definieren","de\u002Fdocs\u002Ferste-schritte\u002Flogik-von-grund-auf-definieren",{"title":264,"slug":265,"path":266,"order":106},"Volang und VolangVM: warum ein Smart Home eine eigene Automatisierungssprache braucht","volang-and-volangvm","de\u002Fdocs\u002Ferste-schritte\u002Fvolang-and-volangvm",{"title":268,"slug":269,"path":270,"order":90,"children":271},"Systemarchitektur","systemarchitektur","de\u002Fdocs\u002Fsystemarchitektur",[272],{"title":273,"slug":274,"path":275,"order":84},"Sicherheitsarchitektur","security","de\u002Fdocs\u002Fsystemarchitektur\u002Fsecurity",{"title":277,"slug":278,"path":279,"order":96,"children":280},"Module und Peripherie","module","de\u002Fdocs\u002Fmodule",[281,285,289,293,297],{"title":282,"slug":283,"path":284,"order":84},"Verkabelung des Hub-Moduls","hub-wiring","de\u002Fdocs\u002Fmodule\u002Fhub-wiring",{"title":286,"slug":287,"path":288,"order":90},"Verkabelung des I\u002FO-Moduls","io-wiring","de\u002Fdocs\u002Fmodule\u002Fio-wiring",{"title":290,"slug":291,"path":292,"order":96},"Verkabelung des Relay-Moduls","relay-wiring","de\u002Fdocs\u002Fmodule\u002Frelay-wiring",{"title":294,"slug":295,"path":296,"order":106},"Verkabelung des 1-Wire-Moduls","1wire-wiring","de\u002Fdocs\u002Fmodule\u002F1wire-wiring",{"title":298,"slug":299,"path":300,"order":112},"Verkabelung des Analog-Input-Moduls","analog-input-wiring","de\u002Fdocs\u002Fmodule\u002Fanalog-input-wiring",{"title":302,"slug":303,"path":304,"order":106,"children":305},"Verkabelungsrichtlinien","verkabelung","de\u002Fdocs\u002Fverkabelung",[306,310],{"title":307,"slug":308,"path":309,"order":84},"Bustopologie und Verkabelung","bus-topology","de\u002Fdocs\u002Fverkabelung\u002Fbus-topology",{"title":311,"slug":312,"path":313,"order":90},"Dimensionierung und Verteilung der Spannungsversorgung","power-supply","de\u002Fdocs\u002Fverkabelung\u002Fpower-supply",{"title":315,"slug":316,"path":317,"order":112,"children":318},"Logikbausteine","logikbausteine","de\u002Fdocs\u002Flogikbausteine",[319,325,376,616],{"title":320,"slug":321,"path":322,"order":78,"template":323,"translation_key":324},"Übersicht","uebersicht","de\u002Fdocs\u002Flogikbausteine\u002Fuebersicht","logic-block-index","logic-blocks-overview",{"title":326,"slug":327,"path":328,"order":84,"children":329},"Eingänge","input","de\u002Fdocs\u002Flogikbausteine\u002Finput",[330,336,341,346,351,356,361,366,371],{"title":331,"slug":332,"path":333,"order":78,"template":334,"translation_key":335},"Binary input","binary_input","de\u002Fdocs\u002Flogikbausteine\u002Finput\u002Fbinary_input","logic-block","logic-block-binary_input",{"title":337,"slug":338,"path":339,"order":78,"template":334,"translation_key":340},"Boolean constant","boolean_constant","de\u002Fdocs\u002Flogikbausteine\u002Finput\u002Fboolean_constant","logic-block-boolean_constant",{"title":342,"slug":343,"path":344,"order":78,"template":334,"translation_key":345},"Numeric constant","numeric_constant","de\u002Fdocs\u002Flogikbausteine\u002Finput\u002Fnumeric_constant","logic-block-numeric_constant",{"title":347,"slug":348,"path":349,"order":78,"template":334,"translation_key":350},"Numeric input","numeric_input","de\u002Fdocs\u002Flogikbausteine\u002Finput\u002Fnumeric_input","logic-block-numeric_input",{"title":352,"slug":353,"path":354,"order":78,"template":334,"translation_key":355},"Mode monitor","operation_mode_monitor","de\u002Fdocs\u002Flogikbausteine\u002Finput\u002Foperation_mode_monitor","logic-block-operation_mode_monitor",{"title":357,"slug":358,"path":359,"order":78,"template":334,"translation_key":360},"PulseAt","pulse_at","de\u002Fdocs\u002Flogikbausteine\u002Finput\u002Fpulse_at","logic-block-pulse_at",{"title":362,"slug":363,"path":364,"order":78,"template":334,"translation_key":365},"Schedule","schedule","de\u002Fdocs\u002Flogikbausteine\u002Finput\u002Fschedule","logic-block-schedule",{"title":367,"slug":368,"path":369,"order":78,"template":334,"translation_key":370},"String constant","string_constant","de\u002Fdocs\u002Flogikbausteine\u002Finput\u002Fstring_constant","logic-block-string_constant",{"title":372,"slug":373,"path":374,"order":78,"template":334,"translation_key":375},"Switch","switch","de\u002Fdocs\u002Flogikbausteine\u002Finput\u002Fswitch","logic-block-switch",{"title":377,"slug":378,"path":379,"order":90,"children":380},"Verarbeitung","process","de\u002Fdocs\u002Flogikbausteine\u002Fprocess",[381,386,391,396,401,406,411,416,421,426,431,436,441,446,451,456,461,466,471,476,481,486,491,496,501,506,511,516,521,526,531,536,541,546,551,556,561,566,571,576,581,586,591,596,601,606,611],{"title":382,"slug":383,"path":384,"order":78,"template":334,"translation_key":385},"Binary limiter","binary_limiter","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fbinary_limiter","logic-block-binary_limiter",{"title":387,"slug":388,"path":389,"order":78,"template":334,"translation_key":390},"Boolean to string","boolean_to_string","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fboolean_to_string","logic-block-boolean_to_string",{"title":392,"slug":393,"path":394,"order":78,"template":334,"translation_key":395},"Climate regulator","climate_regulator","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fclimate_regulator","logic-block-climate_regulator",{"title":397,"slug":398,"path":399,"order":78,"template":334,"translation_key":400},"Climate regulator hub","climate_regulator_hub","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fclimate_regulator_hub","logic-block-climate_regulator_hub",{"title":402,"slug":403,"path":404,"order":78,"template":334,"translation_key":405},"Delay","delay","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fdelay","logic-block-delay",{"title":407,"slug":408,"path":409,"order":78,"template":334,"translation_key":410},"Delayed Pulse","delayed_pulse","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fdelayed_pulse","logic-block-delayed_pulse",{"title":412,"slug":413,"path":414,"order":78,"template":334,"translation_key":415},"Door, window","door_window_monitor","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fdoor_window_monitor","logic-block-door_window_monitor",{"title":417,"slug":418,"path":419,"order":78,"template":334,"translation_key":420},"Edge detector","edge_detector","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fedge_detector","logic-block-edge_detector",{"title":422,"slug":423,"path":424,"order":78,"template":334,"translation_key":425},"HTTP Request","http_request","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fhttp_request","logic-block-http_request",{"title":427,"slug":428,"path":429,"order":78,"template":334,"translation_key":430},"Hysteresis","hysteresis","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fhysteresis","logic-block-hysteresis",{"title":432,"slug":433,"path":434,"order":78,"template":334,"translation_key":435},"Irrigation","irrigation","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Firrigation","logic-block-irrigation",{"title":437,"slug":438,"path":439,"order":78,"template":334,"translation_key":440},"JSON Get Boolean","json_get_boolean","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fjson_get_boolean","logic-block-json_get_boolean",{"title":442,"slug":443,"path":444,"order":78,"template":334,"translation_key":445},"JSON Get Number","json_get_number","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fjson_get_number","logic-block-json_get_number",{"title":447,"slug":448,"path":449,"order":78,"template":334,"translation_key":450},"JSON Get String","json_get_string","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fjson_get_string","logic-block-json_get_string",{"title":452,"slug":453,"path":454,"order":78,"template":334,"translation_key":455},"Level to pulse","level_to_pulse","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Flevel_to_pulse","logic-block-level_to_pulse",{"title":457,"slug":458,"path":459,"order":78,"template":334,"translation_key":460},"Logic::And","logic_and","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Flogic_and","logic-block-logic_and",{"title":462,"slug":463,"path":464,"order":78,"template":334,"translation_key":465},"Logic::Not","logic_not","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Flogic_not","logic-block-logic_not",{"title":467,"slug":468,"path":469,"order":78,"template":334,"translation_key":470},"Logic::Or","logic_or","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Flogic_or","logic-block-logic_or",{"title":472,"slug":473,"path":474,"order":78,"template":334,"translation_key":475},"Math::Abs","math_abs","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fmath_abs","logic-block-math_abs",{"title":477,"slug":478,"path":479,"order":78,"template":334,"translation_key":480},"Math::Add","math_add","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fmath_add","logic-block-math_add",{"title":482,"slug":483,"path":484,"order":78,"template":334,"translation_key":485},"Math::Average","math_average","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fmath_average","logic-block-math_average",{"title":487,"slug":488,"path":489,"order":78,"template":334,"translation_key":490},"Math::Ceil","math_ceil","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fmath_ceil","logic-block-math_ceil",{"title":492,"slug":493,"path":494,"order":78,"template":334,"translation_key":495},"Math::Divide","math_divide","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fmath_divide","logic-block-math_divide",{"title":497,"slug":498,"path":499,"order":78,"template":334,"translation_key":500},"Math::Floor","math_floor","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fmath_floor","logic-block-math_floor",{"title":502,"slug":503,"path":504,"order":78,"template":334,"translation_key":505},"Math::Max","math_max","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fmath_max","logic-block-math_max",{"title":507,"slug":508,"path":509,"order":78,"template":334,"translation_key":510},"Math::Min","math_min","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fmath_min","logic-block-math_min",{"title":512,"slug":513,"path":514,"order":78,"template":334,"translation_key":515},"Math::Modulo","math_modulo","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fmath_modulo","logic-block-math_modulo",{"title":517,"slug":518,"path":519,"order":78,"template":334,"translation_key":520},"Math::Multiply","math_multiply","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fmath_multiply","logic-block-math_multiply",{"title":522,"slug":523,"path":524,"order":78,"template":334,"translation_key":525},"Math::Random","math_random","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fmath_random","logic-block-math_random",{"title":527,"slug":528,"path":529,"order":78,"template":334,"translation_key":530},"Math::Round","math_round","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fmath_round","logic-block-math_round",{"title":532,"slug":533,"path":534,"order":78,"template":334,"translation_key":535},"Math::Subtract","math_subtract","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fmath_subtract","logic-block-math_subtract",{"title":537,"slug":538,"path":539,"order":78,"template":334,"translation_key":540},"Motor axis","motor_axis","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fmotor_axis","logic-block-motor_axis",{"title":542,"slug":543,"path":544,"order":78,"template":334,"translation_key":545},"Moving average","moving_average","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fmoving_average","logic-block-moving_average",{"title":547,"slug":548,"path":549,"order":78,"template":334,"translation_key":550},"Number to string","number_to_string","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fnumber_to_string","logic-block-number_to_string",{"title":552,"slug":553,"path":554,"order":78,"template":334,"translation_key":555},"Numeric latch","numeric_latch","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fnumeric_latch","logic-block-numeric_latch",{"title":557,"slug":558,"path":559,"order":78,"template":334,"translation_key":560},"Numeric predicate","numeric_predicate","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fnumeric_predicate","logic-block-numeric_predicate",{"title":562,"slug":563,"path":564,"order":78,"template":334,"translation_key":565},"Numeric throttle","numeric_throttle","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fnumeric_throttle","logic-block-numeric_throttle",{"title":567,"slug":568,"path":569,"order":78,"template":334,"translation_key":570},"PubSub::Publish","pubsub","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fpubsub","logic-block-pubsub",{"title":572,"slug":573,"path":574,"order":78,"template":334,"translation_key":575},"Pulse counter","pulse_counter","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fpulse_counter","logic-block-pulse_counter",{"title":577,"slug":578,"path":579,"order":78,"template":334,"translation_key":580},"Pulse gate","pulse_gate","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fpulse_gate","logic-block-pulse_gate",{"title":582,"slug":583,"path":584,"order":78,"template":334,"translation_key":585},"Pulse throttle","pulse_throttle","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fpulse_throttle","logic-block-pulse_throttle",{"title":587,"slug":588,"path":589,"order":78,"template":334,"translation_key":590},"Sequencer","sequencer","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fsequencer","logic-block-sequencer",{"title":592,"slug":593,"path":594,"order":78,"template":334,"translation_key":595},"Shading","shading","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fshading","logic-block-shading",{"title":597,"slug":598,"path":599,"order":78,"template":334,"translation_key":600},"String format","string_format","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fstring_format","logic-block-string_format",{"title":602,"slug":603,"path":604,"order":78,"template":334,"translation_key":605},"String latch","string_latch","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fstring_latch","logic-block-string_latch",{"title":607,"slug":608,"path":609,"order":78,"template":334,"translation_key":610},"Toggle","toggle","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Ftoggle","logic-block-toggle",{"title":612,"slug":613,"path":614,"order":78,"template":334,"translation_key":615},"Variable Delayed Pulse","variable_delayed_pulse","de\u002Fdocs\u002Flogikbausteine\u002Fprocess\u002Fvariable_delayed_pulse","logic-block-variable_delayed_pulse",{"title":617,"slug":618,"path":619,"order":96,"children":620},"Ausgänge","output","de\u002Fdocs\u002Flogikbausteine\u002Foutput",[621,626],{"title":622,"slug":623,"path":624,"order":78,"template":334,"translation_key":625},"Mode controller","operation_mode_controller","de\u002Fdocs\u002Flogikbausteine\u002Foutput\u002Foperation_mode_controller","logic-block-operation_mode_controller",{"title":627,"slug":628,"path":629,"order":78,"template":334,"translation_key":630},"Relay","relay","de\u002Fdocs\u002Flogikbausteine\u002Foutput\u002Frelay","logic-block-relay",{"title":632,"slug":633,"path":634,"order":118,"children":635},"Programmiersprache Volang","volang","de\u002Fdocs\u002Fvolang",[636,640],{"title":637,"slug":638,"path":639,"order":84},"Die Sprache Volang","language","de\u002Fdocs\u002Fvolang\u002Flanguage",{"title":641,"slug":642,"path":643,"order":90,"template":644},"Standardbibliothek","stdlib","de\u002Fdocs\u002Fvolang\u002Fstdlib","api-reference",{"title":646,"slug":647,"path":648,"order":649,"children":650},"Software und Werkzeuge","software","de\u002Fdocs\u002Fsoftware",7,[651,655],{"title":652,"slug":653,"path":654,"order":84},"Voldeno Studio - Installation und Rundgang","studio","de\u002Fdocs\u002Fsoftware\u002Fstudio",{"title":656,"slug":657,"path":658,"order":90},"Voldeno Studio - Zeitpläne","schedules","de\u002Fdocs\u002Fsoftware\u002Fschedules",{"title":660,"slug":661,"path":662,"order":663,"children":664},"Ratgeber und Anleitungen","ratgeber","de\u002Fdocs\u002Fratgeber",8,[665,669,673,677],{"title":666,"slug":667,"path":668,"order":84},"Was ist ein Smart Home und wie funktioniert es?","was-ist-ein-smart-home","de\u002Fdocs\u002Fratgeber\u002Fwas-ist-ein-smart-home",{"title":670,"slug":671,"path":672,"order":90},"Welches Smart-Home-System sollte man wählen? Ein praktischer Leitfaden","smart-home-system-auswaehlen","de\u002Fdocs\u002Fratgeber\u002Fsmart-home-system-auswaehlen",{"title":674,"slug":675,"path":676,"order":96},"Was kostet ein Smart Home? Drei Voldeno-Installationsvarianten mit Modulen und Preisen","was-kostet-ein-smart-home","de\u002Fdocs\u002Fratgeber\u002Fwas-kostet-ein-smart-home",{"title":678,"slug":679,"path":680,"order":106},"Die 7 häufigsten Fehler bei der Smart-Home-Planung","smart-home-planungsfehler","de\u002Fdocs\u002Fratgeber\u002Fsmart-home-planungsfehler",{"title":682,"slug":683,"path":684,"order":685,"children":686},"Fehlerbehebung und Diagnose","fehlerbehebung","de\u002Fdocs\u002Ffehlerbehebung",9,[687],{"title":688,"slug":689,"path":690,"order":84},"Fehlerbehebung bei der Bus-Kommunikation","bus-communication","de\u002Fdocs\u002Ffehlerbehebung\u002Fbus-communication",{"title":692,"slug":693,"path":694,"order":695},"Häufig gestellte Fragen","faq","de\u002Fdocs\u002Ffaq",10,[697,718,727,752,765,902,914,925,946,955],{"title":698,"slug":699,"path":700,"order":84,"children":701},"Pierwsze kroki","pierwsze-kroki","pl\u002Fdocs\u002Fpierwsze-kroki",[702,706,710,714],{"title":703,"slug":704,"path":705,"order":84},"Podstawowe pojęcia i terminologia","pojecia","pl\u002Fdocs\u002Fpierwsze-kroki\u002Fpojecia",{"title":707,"slug":708,"path":709,"order":90},"Przegląd systemu dla instalatorów","przeglad-systemu","pl\u002Fdocs\u002Fpierwsze-kroki\u002Fprzeglad-systemu",{"title":711,"slug":712,"path":713,"order":96},"Jak zdefiniować logikę w Voldeno Studio od zera","definiowanie-logiki-w-voldeno-studio","pl\u002Fdocs\u002Fpierwsze-kroki\u002Fdefiniowanie-logiki-w-voldeno-studio",{"title":715,"slug":716,"path":717,"order":106},"Volang i VolangVM: po co inteligentny dom potrzebuje własnego języka automatyki","volang-i-volangvm","pl\u002Fdocs\u002Fpierwsze-kroki\u002Fvolang-i-volangvm",{"title":719,"slug":720,"path":721,"order":90,"children":722},"Architektura systemu","architektura-systemu","pl\u002Fdocs\u002Farchitektura-systemu",[723],{"title":724,"slug":725,"path":726,"order":84},"Architektura bezpieczeństwa","bezpieczenstwo","pl\u002Fdocs\u002Farchitektura-systemu\u002Fbezpieczenstwo",{"title":728,"slug":729,"path":730,"order":96,"children":731},"Moduły i peryferia","moduly","pl\u002Fdocs\u002Fmoduly",[732,736,740,744,748],{"title":733,"slug":734,"path":735,"order":84},"Okablowanie modułu HUB","okablowanie-hub","pl\u002Fdocs\u002Fmoduly\u002Fokablowanie-hub",{"title":737,"slug":738,"path":739,"order":90},"Okablowanie modułu I\u002FO","okablowanie-io","pl\u002Fdocs\u002Fmoduly\u002Fokablowanie-io",{"title":741,"slug":742,"path":743,"order":96},"Okablowanie modułu RELAY","okablowanie-relay","pl\u002Fdocs\u002Fmoduly\u002Fokablowanie-relay",{"title":745,"slug":746,"path":747,"order":106},"Okablowanie modułu 1-Wire","okablowanie-1wire","pl\u002Fdocs\u002Fmoduly\u002Fokablowanie-1wire",{"title":749,"slug":750,"path":751,"order":112},"Okablowanie modułu Analog Input","okablowanie-analog-input","pl\u002Fdocs\u002Fmoduly\u002Fokablowanie-analog-input",{"title":753,"slug":754,"path":755,"order":106,"children":756},"Wytyczne okablowania","okablowanie","pl\u002Fdocs\u002Fokablowanie",[757,761],{"title":758,"slug":759,"path":760,"order":84},"Topologia i okablowanie magistrali","topologia-magistrali","pl\u002Fdocs\u002Fokablowanie\u002Ftopologia-magistrali",{"title":762,"slug":763,"path":764,"order":90},"Dobór i dystrybucja zasilania","zasilanie","pl\u002Fdocs\u002Fokablowanie\u002Fzasilanie",{"title":766,"slug":767,"path":768,"order":112,"children":769},"Bloki logiczne","bloki-logiczne","pl\u002Fdocs\u002Fbloki-logiczne",[770,774,796,894],{"title":771,"slug":772,"path":773,"order":78,"template":323,"translation_key":324},"Przegląd","przeglad","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprzeglad",{"title":775,"slug":327,"path":776,"order":84,"children":777},"Wejścia","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput",[778,780,782,784,786,788,790,792,794],{"title":331,"slug":332,"path":779,"order":78,"template":334,"translation_key":335},"pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fbinary_input",{"title":337,"slug":338,"path":781,"order":78,"template":334,"translation_key":340},"pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fboolean_constant",{"title":342,"slug":343,"path":783,"order":78,"template":334,"translation_key":345},"pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fnumeric_constant",{"title":347,"slug":348,"path":785,"order":78,"template":334,"translation_key":350},"pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fnumeric_input",{"title":352,"slug":353,"path":787,"order":78,"template":334,"translation_key":355},"pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Foperation_mode_monitor",{"title":357,"slug":358,"path":789,"order":78,"template":334,"translation_key":360},"pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fpulse_at",{"title":362,"slug":363,"path":791,"order":78,"template":334,"translation_key":365},"pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fschedule",{"title":367,"slug":368,"path":793,"order":78,"template":334,"translation_key":370},"pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fstring_constant",{"title":372,"slug":373,"path":795,"order":78,"template":334,"translation_key":375},"pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fswitch",{"title":797,"slug":378,"path":798,"order":90,"children":799},"Przetwarzanie","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess",[800,802,804,806,808,810,812,814,816,818,820,822,824,826,828,830,832,834,836,838,840,842,844,846,848,850,852,854,856,858,860,862,864,866,868,870,872,874,876,878,880,882,884,886,888,890,892],{"title":382,"slug":383,"path":801,"order":78,"template":334,"translation_key":385},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fbinary_limiter",{"title":387,"slug":388,"path":803,"order":78,"template":334,"translation_key":390},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fboolean_to_string",{"title":392,"slug":393,"path":805,"order":78,"template":334,"translation_key":395},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fclimate_regulator",{"title":397,"slug":398,"path":807,"order":78,"template":334,"translation_key":400},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fclimate_regulator_hub",{"title":402,"slug":403,"path":809,"order":78,"template":334,"translation_key":405},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fdelay",{"title":407,"slug":408,"path":811,"order":78,"template":334,"translation_key":410},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fdelayed_pulse",{"title":412,"slug":413,"path":813,"order":78,"template":334,"translation_key":415},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fdoor_window_monitor",{"title":417,"slug":418,"path":815,"order":78,"template":334,"translation_key":420},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fedge_detector",{"title":422,"slug":423,"path":817,"order":78,"template":334,"translation_key":425},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fhttp_request",{"title":427,"slug":428,"path":819,"order":78,"template":334,"translation_key":430},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fhysteresis",{"title":432,"slug":433,"path":821,"order":78,"template":334,"translation_key":435},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Firrigation",{"title":437,"slug":438,"path":823,"order":78,"template":334,"translation_key":440},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fjson_get_boolean",{"title":442,"slug":443,"path":825,"order":78,"template":334,"translation_key":445},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fjson_get_number",{"title":447,"slug":448,"path":827,"order":78,"template":334,"translation_key":450},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fjson_get_string",{"title":452,"slug":453,"path":829,"order":78,"template":334,"translation_key":455},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Flevel_to_pulse",{"title":457,"slug":458,"path":831,"order":78,"template":334,"translation_key":460},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Flogic_and",{"title":462,"slug":463,"path":833,"order":78,"template":334,"translation_key":465},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Flogic_not",{"title":467,"slug":468,"path":835,"order":78,"template":334,"translation_key":470},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Flogic_or",{"title":472,"slug":473,"path":837,"order":78,"template":334,"translation_key":475},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_abs",{"title":477,"slug":478,"path":839,"order":78,"template":334,"translation_key":480},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_add",{"title":482,"slug":483,"path":841,"order":78,"template":334,"translation_key":485},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_average",{"title":487,"slug":488,"path":843,"order":78,"template":334,"translation_key":490},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_ceil",{"title":492,"slug":493,"path":845,"order":78,"template":334,"translation_key":495},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_divide",{"title":497,"slug":498,"path":847,"order":78,"template":334,"translation_key":500},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_floor",{"title":502,"slug":503,"path":849,"order":78,"template":334,"translation_key":505},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_max",{"title":507,"slug":508,"path":851,"order":78,"template":334,"translation_key":510},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_min",{"title":512,"slug":513,"path":853,"order":78,"template":334,"translation_key":515},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_modulo",{"title":517,"slug":518,"path":855,"order":78,"template":334,"translation_key":520},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_multiply",{"title":522,"slug":523,"path":857,"order":78,"template":334,"translation_key":525},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_random",{"title":527,"slug":528,"path":859,"order":78,"template":334,"translation_key":530},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_round",{"title":532,"slug":533,"path":861,"order":78,"template":334,"translation_key":535},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_subtract",{"title":537,"slug":538,"path":863,"order":78,"template":334,"translation_key":540},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmotor_axis",{"title":542,"slug":543,"path":865,"order":78,"template":334,"translation_key":545},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmoving_average",{"title":547,"slug":548,"path":867,"order":78,"template":334,"translation_key":550},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fnumber_to_string",{"title":552,"slug":553,"path":869,"order":78,"template":334,"translation_key":555},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fnumeric_latch",{"title":557,"slug":558,"path":871,"order":78,"template":334,"translation_key":560},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fnumeric_predicate",{"title":562,"slug":563,"path":873,"order":78,"template":334,"translation_key":565},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fnumeric_throttle",{"title":567,"slug":568,"path":875,"order":78,"template":334,"translation_key":570},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fpubsub",{"title":572,"slug":573,"path":877,"order":78,"template":334,"translation_key":575},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fpulse_counter",{"title":577,"slug":578,"path":879,"order":78,"template":334,"translation_key":580},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fpulse_gate",{"title":582,"slug":583,"path":881,"order":78,"template":334,"translation_key":585},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fpulse_throttle",{"title":587,"slug":588,"path":883,"order":78,"template":334,"translation_key":590},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fsequencer",{"title":592,"slug":593,"path":885,"order":78,"template":334,"translation_key":595},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fshading",{"title":597,"slug":598,"path":887,"order":78,"template":334,"translation_key":600},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fstring_format",{"title":602,"slug":603,"path":889,"order":78,"template":334,"translation_key":605},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fstring_latch",{"title":607,"slug":608,"path":891,"order":78,"template":334,"translation_key":610},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Ftoggle",{"title":612,"slug":613,"path":893,"order":78,"template":334,"translation_key":615},"pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fvariable_delayed_pulse",{"title":895,"slug":618,"path":896,"order":96,"children":897},"Wyjścia","pl\u002Fdocs\u002Fbloki-logiczne\u002Foutput",[898,900],{"title":622,"slug":623,"path":899,"order":78,"template":334,"translation_key":625},"pl\u002Fdocs\u002Fbloki-logiczne\u002Foutput\u002Foperation_mode_controller",{"title":627,"slug":628,"path":901,"order":78,"template":334,"translation_key":630},"pl\u002Fdocs\u002Fbloki-logiczne\u002Foutput\u002Frelay",{"title":903,"slug":633,"path":904,"order":118,"children":905},"Język programowania Volang","pl\u002Fdocs\u002Fvolang",[906,910],{"title":907,"slug":908,"path":909,"order":84},"Język Volang","jezyk","pl\u002Fdocs\u002Fvolang\u002Fjezyk",{"title":911,"slug":912,"path":913,"order":90,"template":644},"Biblioteka standardowa","biblioteka-standardowa","pl\u002Fdocs\u002Fvolang\u002Fbiblioteka-standardowa",{"title":915,"slug":916,"path":917,"order":649,"children":918},"Oprogramowanie","oprogramowanie","pl\u002Fdocs\u002Foprogramowanie",[919,922],{"title":920,"slug":653,"path":921,"order":84},"Voldeno Studio - Instalacja i przewodnik","pl\u002Fdocs\u002Foprogramowanie\u002Fstudio",{"title":923,"slug":657,"path":924,"order":90},"Voldeno Studio - Harmonogramy","pl\u002Fdocs\u002Foprogramowanie\u002Fschedules",{"title":926,"slug":927,"path":928,"order":663,"children":929},"Poradniki","poradniki","pl\u002Fdocs\u002Fporadniki",[930,934,938,942],{"title":931,"slug":932,"path":933,"order":84},"Czym jest smart home i jak działa?","czym-jest-smart-home","pl\u002Fdocs\u002Fporadniki\u002Fczym-jest-smart-home",{"title":935,"slug":936,"path":937,"order":90},"Jaki system smart home wybrać? Praktyczny przewodnik","jaki-system-smart-home-wybrac","pl\u002Fdocs\u002Fporadniki\u002Fjaki-system-smart-home-wybrac",{"title":939,"slug":940,"path":941,"order":96},"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":943,"slug":944,"path":945,"order":106},"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":947,"slug":948,"path":949,"order":685,"children":950},"Diagnostyka i rozwiązywanie problemów","diagnostyka","pl\u002Fdocs\u002Fdiagnostyka",[951],{"title":952,"slug":953,"path":954,"order":84},"Rozwiązywanie problemów z komunikacją magistrali","komunikacja-magistrali","pl\u002Fdocs\u002Fdiagnostyka\u002Fkomunikacja-magistrali",{"title":956,"slug":693,"path":957,"order":695},"Często zadawane pytania","pl\u002Fdocs\u002Ffaq",[959,977,985,1005,1016,1153,1163,1173,1194,1202],{"title":960,"slug":961,"path":962,"order":84,"children":963},"Getting Started","getting-started","en\u002Fdocs\u002Fgetting-started",[964,967,970,974],{"title":965,"slug":253,"path":966,"order":84},"Core Concepts and Terminology","en\u002Fdocs\u002Fgetting-started\u002Fconcepts",{"title":968,"slug":257,"path":969,"order":90},"System Overview for Installers","en\u002Fdocs\u002Fgetting-started\u002Fsystem-overview",{"title":971,"slug":972,"path":973,"order":96},"How to define logic in Voldeno Studio from scratch","define-logic-in-voldeno-studio","en\u002Fdocs\u002Fgetting-started\u002Fdefine-logic-in-voldeno-studio",{"title":975,"slug":265,"path":976,"order":106},"Volang and VolangVM: why a smart home needs its own automation language","en\u002Fdocs\u002Fgetting-started\u002Fvolang-and-volangvm",{"title":978,"slug":979,"path":980,"order":90,"children":981},"System Architecture","system-architecture","en\u002Fdocs\u002Fsystem-architecture",[982],{"title":983,"slug":274,"path":984,"order":84},"Security Architecture","en\u002Fdocs\u002Fsystem-architecture\u002Fsecurity",{"title":986,"slug":987,"path":988,"order":96,"children":989},"Modules & Peripherals","modules","en\u002Fdocs\u002Fmodules",[990,993,996,999,1002],{"title":991,"slug":283,"path":992,"order":84},"Hub Module Wiring","en\u002Fdocs\u002Fmodules\u002Fhub-wiring",{"title":994,"slug":287,"path":995,"order":90},"I\u002FO Module Wiring","en\u002Fdocs\u002Fmodules\u002Fio-wiring",{"title":997,"slug":291,"path":998,"order":96},"Relay Module Wiring","en\u002Fdocs\u002Fmodules\u002Frelay-wiring",{"title":1000,"slug":295,"path":1001,"order":106},"1-Wire Module Wiring","en\u002Fdocs\u002Fmodules\u002F1wire-wiring",{"title":1003,"slug":299,"path":1004,"order":112},"Analog Input Module Wiring","en\u002Fdocs\u002Fmodules\u002Fanalog-input-wiring",{"title":1006,"slug":1007,"path":1008,"order":106,"children":1009},"Wiring Guidelines","wiring","en\u002Fdocs\u002Fwiring",[1010,1013],{"title":1011,"slug":308,"path":1012,"order":84},"Bus Topology & Wiring","en\u002Fdocs\u002Fwiring\u002Fbus-topology",{"title":1014,"slug":312,"path":1015,"order":90},"Power Supply Sizing and Distribution","en\u002Fdocs\u002Fwiring\u002Fpower-supply",{"title":1017,"slug":1018,"path":1019,"order":112,"children":1020},"Logic Blocks","logic-blocks","en\u002Fdocs\u002Flogic-blocks",[1021,1025,1047,1145],{"title":1022,"slug":1023,"path":1024,"order":78,"template":323,"translation_key":324},"Overview","overview","en\u002Fdocs\u002Flogic-blocks\u002Foverview",{"title":1026,"slug":327,"path":1027,"order":84,"children":1028},"Input","en\u002Fdocs\u002Flogic-blocks\u002Finput",[1029,1031,1033,1035,1037,1039,1041,1043,1045],{"title":331,"slug":332,"path":1030,"order":78,"template":334,"translation_key":335},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fbinary_input",{"title":337,"slug":338,"path":1032,"order":78,"template":334,"translation_key":340},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fboolean_constant",{"title":342,"slug":343,"path":1034,"order":78,"template":334,"translation_key":345},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fnumeric_constant",{"title":347,"slug":348,"path":1036,"order":78,"template":334,"translation_key":350},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fnumeric_input",{"title":352,"slug":353,"path":1038,"order":78,"template":334,"translation_key":355},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Foperation_mode_monitor",{"title":357,"slug":358,"path":1040,"order":78,"template":334,"translation_key":360},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fpulse_at",{"title":362,"slug":363,"path":1042,"order":78,"template":334,"translation_key":365},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fschedule",{"title":367,"slug":368,"path":1044,"order":78,"template":334,"translation_key":370},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fstring_constant",{"title":372,"slug":373,"path":1046,"order":78,"template":334,"translation_key":375},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fswitch",{"title":1048,"slug":378,"path":1049,"order":90,"children":1050},"Process","en\u002Fdocs\u002Flogic-blocks\u002Fprocess",[1051,1053,1055,1057,1059,1061,1063,1065,1067,1069,1071,1073,1075,1077,1079,1081,1083,1085,1087,1089,1091,1093,1095,1097,1099,1101,1103,1105,1107,1109,1111,1113,1115,1117,1119,1121,1123,1125,1127,1129,1131,1133,1135,1137,1139,1141,1143],{"title":382,"slug":383,"path":1052,"order":78,"template":334,"translation_key":385},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fbinary_limiter",{"title":387,"slug":388,"path":1054,"order":78,"template":334,"translation_key":390},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fboolean_to_string",{"title":392,"slug":393,"path":1056,"order":78,"template":334,"translation_key":395},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fclimate_regulator",{"title":397,"slug":398,"path":1058,"order":78,"template":334,"translation_key":400},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fclimate_regulator_hub",{"title":402,"slug":403,"path":1060,"order":78,"template":334,"translation_key":405},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fdelay",{"title":407,"slug":408,"path":1062,"order":78,"template":334,"translation_key":410},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fdelayed_pulse",{"title":412,"slug":413,"path":1064,"order":78,"template":334,"translation_key":415},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fdoor_window_monitor",{"title":417,"slug":418,"path":1066,"order":78,"template":334,"translation_key":420},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fedge_detector",{"title":422,"slug":423,"path":1068,"order":78,"template":334,"translation_key":425},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fhttp_request",{"title":427,"slug":428,"path":1070,"order":78,"template":334,"translation_key":430},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fhysteresis",{"title":432,"slug":433,"path":1072,"order":78,"template":334,"translation_key":435},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Firrigation",{"title":437,"slug":438,"path":1074,"order":78,"template":334,"translation_key":440},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fjson_get_boolean",{"title":442,"slug":443,"path":1076,"order":78,"template":334,"translation_key":445},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fjson_get_number",{"title":447,"slug":448,"path":1078,"order":78,"template":334,"translation_key":450},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fjson_get_string",{"title":452,"slug":453,"path":1080,"order":78,"template":334,"translation_key":455},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Flevel_to_pulse",{"title":457,"slug":458,"path":1082,"order":78,"template":334,"translation_key":460},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Flogic_and",{"title":462,"slug":463,"path":1084,"order":78,"template":334,"translation_key":465},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Flogic_not",{"title":467,"slug":468,"path":1086,"order":78,"template":334,"translation_key":470},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Flogic_or",{"title":472,"slug":473,"path":1088,"order":78,"template":334,"translation_key":475},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_abs",{"title":477,"slug":478,"path":1090,"order":78,"template":334,"translation_key":480},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_add",{"title":482,"slug":483,"path":1092,"order":78,"template":334,"translation_key":485},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_average",{"title":487,"slug":488,"path":1094,"order":78,"template":334,"translation_key":490},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_ceil",{"title":492,"slug":493,"path":1096,"order":78,"template":334,"translation_key":495},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_divide",{"title":497,"slug":498,"path":1098,"order":78,"template":334,"translation_key":500},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_floor",{"title":502,"slug":503,"path":1100,"order":78,"template":334,"translation_key":505},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_max",{"title":507,"slug":508,"path":1102,"order":78,"template":334,"translation_key":510},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_min",{"title":512,"slug":513,"path":1104,"order":78,"template":334,"translation_key":515},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_modulo",{"title":517,"slug":518,"path":1106,"order":78,"template":334,"translation_key":520},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_multiply",{"title":522,"slug":523,"path":1108,"order":78,"template":334,"translation_key":525},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_random",{"title":527,"slug":528,"path":1110,"order":78,"template":334,"translation_key":530},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_round",{"title":532,"slug":533,"path":1112,"order":78,"template":334,"translation_key":535},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_subtract",{"title":537,"slug":538,"path":1114,"order":78,"template":334,"translation_key":540},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmotor_axis",{"title":542,"slug":543,"path":1116,"order":78,"template":334,"translation_key":545},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmoving_average",{"title":547,"slug":548,"path":1118,"order":78,"template":334,"translation_key":550},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fnumber_to_string",{"title":552,"slug":553,"path":1120,"order":78,"template":334,"translation_key":555},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fnumeric_latch",{"title":557,"slug":558,"path":1122,"order":78,"template":334,"translation_key":560},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fnumeric_predicate",{"title":562,"slug":563,"path":1124,"order":78,"template":334,"translation_key":565},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fnumeric_throttle",{"title":567,"slug":568,"path":1126,"order":78,"template":334,"translation_key":570},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fpubsub",{"title":572,"slug":573,"path":1128,"order":78,"template":334,"translation_key":575},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fpulse_counter",{"title":577,"slug":578,"path":1130,"order":78,"template":334,"translation_key":580},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fpulse_gate",{"title":582,"slug":583,"path":1132,"order":78,"template":334,"translation_key":585},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fpulse_throttle",{"title":587,"slug":588,"path":1134,"order":78,"template":334,"translation_key":590},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fsequencer",{"title":592,"slug":593,"path":1136,"order":78,"template":334,"translation_key":595},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fshading",{"title":597,"slug":598,"path":1138,"order":78,"template":334,"translation_key":600},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fstring_format",{"title":602,"slug":603,"path":1140,"order":78,"template":334,"translation_key":605},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fstring_latch",{"title":607,"slug":608,"path":1142,"order":78,"template":334,"translation_key":610},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Ftoggle",{"title":612,"slug":613,"path":1144,"order":78,"template":334,"translation_key":615},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fvariable_delayed_pulse",{"title":1146,"slug":618,"path":1147,"order":96,"children":1148},"Output","en\u002Fdocs\u002Flogic-blocks\u002Foutput",[1149,1151],{"title":622,"slug":623,"path":1150,"order":78,"template":334,"translation_key":625},"en\u002Fdocs\u002Flogic-blocks\u002Foutput\u002Foperation_mode_controller",{"title":627,"slug":628,"path":1152,"order":78,"template":334,"translation_key":630},"en\u002Fdocs\u002Flogic-blocks\u002Foutput\u002Frelay",{"title":1154,"slug":633,"path":1155,"order":118,"children":1156},"Volang Programming Language","en\u002Fdocs\u002Fvolang",[1157,1160],{"title":1158,"slug":638,"path":1159,"order":84},"The Volang Language","en\u002Fdocs\u002Fvolang\u002Flanguage",{"title":1161,"slug":642,"path":1162,"order":90,"template":644},"Standard Library","en\u002Fdocs\u002Fvolang\u002Fstdlib",{"title":1164,"slug":647,"path":1165,"order":649,"children":1166},"Software & Tools","en\u002Fdocs\u002Fsoftware",[1167,1170],{"title":1168,"slug":653,"path":1169,"order":84},"Voldeno Studio - Installation and Walkthrough","en\u002Fdocs\u002Fsoftware\u002Fstudio",{"title":1171,"slug":657,"path":1172,"order":90},"Voldeno Studio - Schedules","en\u002Fdocs\u002Fsoftware\u002Fschedules",{"title":1174,"slug":1175,"path":1176,"order":663,"children":1177},"How-to Guides & Recipes","how-to","en\u002Fdocs\u002Fhow-to",[1178,1182,1186,1190],{"title":1179,"slug":1180,"path":1181,"order":84},"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":1183,"slug":1184,"path":1185,"order":90},"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":1187,"slug":1188,"path":1189,"order":96},"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":1191,"slug":1192,"path":1193,"order":106},"7 most common smart home design mistakes","smart-home-design-mistakes","en\u002Fdocs\u002Fhow-to\u002Fsmart-home-design-mistakes",{"title":1195,"slug":1196,"path":1197,"order":685,"children":1198},"Troubleshooting & Diagnostics","troubleshooting","en\u002Fdocs\u002Ftroubleshooting",[1199],{"title":1200,"slug":689,"path":1201,"order":84},"Bus Communication Troubleshooting","en\u002Fdocs\u002Ftroubleshooting\u002Fbus-communication",{"title":1203,"slug":693,"path":1204,"order":695},"Frequently Asked Questions","en\u002Fdocs\u002Ffaq",{"pl":1206,"de":1219,"en":1232},{"bloki-logiczne":1207,"architektura-systemu":1208,"bloki-logiczne\u002Finput":1209,"bloki-logiczne\u002Foutput":1210,"bloki-logiczne\u002Fprocess":1211,"pierwsze-kroki":1212,"oprogramowanie":1213,"moduly":1214,"volang":1215,"poradniki":1216,"diagnostyka":1217,"okablowanie":1218},"bloki-logiczne\u002Fprzeglad","architektura-systemu\u002Fbezpieczenstwo","bloki-logiczne\u002Finput\u002Fbinary_input","bloki-logiczne\u002Foutput\u002Foperation_mode_controller","bloki-logiczne\u002Fprocess\u002Fbinary_limiter","pierwsze-kroki\u002Fpojecia","oprogramowanie\u002Fstudio","moduly\u002Fokablowanie-hub","volang\u002Fjezyk","poradniki\u002Fczym-jest-smart-home","diagnostyka\u002Fkomunikacja-magistrali","okablowanie\u002Ftopologia-magistrali",{"logikbausteine":1220,"logikbausteine\u002Foutput":1221,"ratgeber":1222,"verkabelung":1223,"fehlerbehebung":1224,"erste-schritte":1225,"logikbausteine\u002Fprocess":1226,"module":1227,"logikbausteine\u002Finput":1228,"volang":1229,"software":1230,"systemarchitektur":1231},"logikbausteine\u002Fuebersicht","logikbausteine\u002Foutput\u002Foperation_mode_controller","ratgeber\u002Fwas-ist-ein-smart-home","verkabelung\u002Fbus-topology","fehlerbehebung\u002Fbus-communication","erste-schritte\u002Fconcepts","logikbausteine\u002Fprocess\u002Fbinary_limiter","module\u002Fhub-wiring","logikbausteine\u002Finput\u002Fbinary_input","volang\u002Flanguage","software\u002Fstudio","systemarchitektur\u002Fsecurity",{"logic-blocks\u002Fprocess":1233,"wiring":1234,"logic-blocks\u002Foutput":1235,"volang":1229,"how-to":1236,"troubleshooting":1237,"modules":1238,"getting-started":1239,"software":1230,"logic-blocks\u002Finput":1240,"system-architecture":1241,"logic-blocks":1242},"logic-blocks\u002Fprocess\u002Fbinary_limiter","wiring\u002Fbus-topology","logic-blocks\u002Foutput\u002Foperation_mode_controller","how-to\u002Fwhat-is-a-smart-home","troubleshooting\u002Fbus-communication","modules\u002Fhub-wiring","getting-started\u002Fconcepts","logic-blocks\u002Finput\u002Fbinary_input","system-architecture\u002Fsecurity","logic-blocks\u002Foverview",{"enabled":64,"navigation":1244},{"pl":1245,"en":1282,"de":1308},[1246,1252,1258,1264,1270,1276],{"title":1247,"slug":1248,"path":1249,"order":78,"date":1250,"translation_key":1251},"Inteligentny dom to nie gadżet: policzalne oszczędności, bezpieczeństwo i wartość nieruchomości","inteligentny-dom-to-nie-gadzet","pl\u002Fblog\u002Finteligentny-dom-to-nie-gadzet","2026-07-03","2026_07_03_inteligentny_dom_to_nie_gadzet",{"title":1253,"slug":1254,"path":1255,"order":78,"date":1256,"translation_key":1257},"Przełączanie w zerze napięcia: jak moduły I\u002FO i RELAY wydłużają życie styków przekaźników","przelaczanie-w-zerze-napiecia-moduly-io-i-relay","pl\u002Fblog\u002Fprzelaczanie-w-zerze-napiecia-moduly-io-i-relay","2026-06-11","2026_06_11_przelaczanie_w_zerze_napiecia",{"title":1259,"slug":1260,"path":1261,"order":78,"date":1262,"translation_key":1263},"System Voldeno napędził demo fabryki Fischertechnik na Google Cloud Next '26","voldeno-at-google-cloud-next-26","pl\u002Fblog\u002Fvoldeno-at-google-cloud-next-26","2026-04-28","2026_04_28_voldeno_at_google_cloud_next_26",{"title":1265,"slug":1266,"path":1267,"order":78,"date":1268,"translation_key":1269},"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","2025-08-17","2025_08_17_we_are_ready",{"title":1271,"slug":1272,"path":1273,"order":78,"date":1274,"translation_key":1275},"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","2025-04-25","2025_04_25_new_voldeno_1wire_temperature_sensor",{"title":1277,"slug":1278,"path":1279,"order":78,"date":1280,"translation_key":1281},"Odkryj przyszłość inteligentnych domów z Voldeno","odkryj-przyszlosc-inteligentnych-domow-z-voldeno","pl\u002Fblog\u002Fodkryj-przyszlosc-inteligentnych-domow-z-voldeno","2024-10-18","2024_10_18_future_of_smart_homes",[1283,1288,1293,1296,1300,1304],{"title":1284,"slug":1285,"path":1286,"order":78,"date":1250,"translation_key":1287},"A smart home is not a gadget: measurable savings, security and property value","smart-home-is-not-a-gadget","en\u002Fblog\u002Fsmart-home-is-not-a-gadget","2026_07_03_smart_home_is_not_a_gadget",{"title":1289,"slug":1290,"path":1291,"order":78,"date":1256,"translation_key":1292},"Zero-crossing switching: how the I\u002FO and RELAY modules extend relay contact life","zero-crossing-switching-io-and-relay-modules","en\u002Fblog\u002Fzero-crossing-switching-io-and-relay-modules","2026_06_11_zero_crossing_switching",{"title":1294,"slug":1260,"path":1295,"order":78,"date":1262,"translation_key":1263},"Voldeno powered the Fischertechnik factory demo at Google Cloud Next '26","en\u002Fblog\u002Fvoldeno-at-google-cloud-next-26",{"title":1297,"slug":1298,"path":1299,"order":78,"date":1268,"translation_key":1269},"We are ready! Hundreds of Voldeno modules prepared for smart home deployment.","we-are-ready","en\u002Fblog\u002Fwe-are-ready",{"title":1301,"slug":1302,"path":1303,"order":78,"date":1274,"translation_key":1275},"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",{"title":1305,"slug":1306,"path":1307,"order":78,"date":1280,"translation_key":1281},"Discover the Future of Smart Homes with Voldeno","future_of_smart_homes","en\u002Fblog\u002Ffuture_of_smart_homes",[1309,1314,1319,1324,1329,1334],{"title":1310,"slug":1311,"path":1312,"order":78,"date":1250,"translation_key":1313},"Ein Smart Home ist kein Gadget: messbare Einsparungen, Sicherheit und Immobilienwert","smart-home-ist-kein-gadget","de\u002Fblog\u002Fsmart-home-ist-kein-gadget","2026_07_03_smart_home_ist_kein_gadget",{"title":1315,"slug":1316,"path":1317,"order":78,"date":1256,"translation_key":1318},"Schalten im Nulldurchgang: Wie die Module I\u002FO und RELAY die Lebensdauer der Relaiskontakte verlängern","schalten-im-nulldurchgang-io-und-relay-module","de\u002Fblog\u002Fschalten-im-nulldurchgang-io-und-relay-module","2026_06_11_schalten_im_nulldurchgang",{"title":1320,"slug":1321,"path":1322,"order":78,"date":1262,"translation_key":1323},"Voldeno steuerte die Fischertechnik-Fabrikdemo auf der Google Cloud Next '26","fischertechnik-fabrikdemo-google-cloud-next-26","de\u002Fblog\u002Ffischertechnik-fabrikdemo-google-cloud-next-26","2026_04_28_voldeno_bei_google_cloud_next_26",{"title":1325,"slug":1326,"path":1327,"order":78,"date":1268,"translation_key":1328},"Wir sind bereit! Hunderte Voldeno-Module für den Einsatz im Smart Home vorbereitet.","wir-sind-bereit","de\u002Fblog\u002Fwir-sind-bereit","2025_08_17_wir_sind_bereit",{"title":1330,"slug":1331,"path":1332,"order":78,"date":1274,"translation_key":1333},"Neuer Voldeno 1-Wire Temperatursensor: kompakt, zuverlässig und für große Installationen gebaut","1-wire-temperatursensor-kompakt-zuverlaessig-fuer-grosse-installationen","de\u002Fblog\u002F1-wire-temperatursensor-kompakt-zuverlaessig-fuer-grosse-installationen","2025_04_25_neuer_voldeno_1wire_temperatursensor",{"title":1335,"slug":1336,"path":1337,"order":78,"date":1280,"translation_key":1338},"Entdecken Sie die Zukunft des Smart Home mit Voldeno","zukunft-des-smart-home","de\u002Fblog\u002Fzukunft-des-smart-home","2024_10_18_zukunft_smart_homes",{"map":1340,"xDefault":1341},{"pl":1341,"en":1342,"de":1343},"https:\u002F\u002Fvoldeno.com\u002Fpl\u002Fdocs\u002Fvolang\u002Fbiblioteka-standardowa","https:\u002F\u002Fvoldeno.com\u002Fen\u002Fdocs\u002Fvolang\u002Fstdlib","https:\u002F\u002Fvoldeno.com\u002Fde\u002Fdocs\u002Fvolang\u002Fstdlib",{"slug":642,"title":641,"description":1345,"tags":1346,"content_html":1349,"headings":1350,"template":644,"order":90,"extra":1551},"Referenzdokumentation für die Funktionen und Module der Volang-Standardbibliothek.",[633,642,1347,1348],"referenz","funktionen","\u003Ch1 id=\"standardbibliothek\">\u003Ca href=\"#standardbibliothek\" class=\"anchor\">#\u003C\u002Fa> Standardbibliothek\u003C\u002Fh1>\n\u003Cp>Die Volang-Standardbibliothek stellt einen umfassenden Satz eingebauter Funktionen bereit, die für das Bearbeiten von Text, das Ausführen mathematischer Operationen und andere gängige Aufgaben unerlässlich sind. Diese Funktionen stehen global in jedem Skript zur Verfügung.\u003C\u002Fp>\n\u003Ch2 id=\"eingabeoperationen\">\u003Ca href=\"#eingabeoperationen\" class=\"anchor\">#\u003C\u002Fa> Eingabeoperationen\u003C\u002Fh2>\n\u003Cp>Dieser Abschnitt beschreibt Funktionen zum Lesen von Eingangsdaten innerhalb eines Logikbausteins. Jeder Logikbaustein kann einen oder mehrere Eingangskanäle definieren. Wenn sich ein Eingangswert ändert, wird das Skript des Bausteins ausgeführt. Diese Funktionen ermöglichen es dem Skript festzustellen, welcher Eingang die Ausführung ausgelöst hat, und die aktuellen Werte aller Eingänge zu lesen.\u003C\u002Fp>\n\u003Ch3 id=\"input-channel\">\u003Ca href=\"#input-channel\" class=\"anchor\">#\u003C\u002Fa> input::channel\u003C\u002Fh3>\n\u003Cp>Gibt die Kennung des Eingangskanals zurück, der die aktuelle Skriptausführung ausgelöst hat. Wenn ein Baustein mehrere Eingänge hat, ist diese Funktion unerlässlich, um zu bestimmen, welcher Eingang den Baustein ausgeführt hat, sodass Sie jeden Eingang unterschiedlich behandeln können.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Keine.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Eine Zeichenkette mit der ID des Eingangs, der die Ausführung ausgelöst hat.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\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 Der Haupt-Umschalteingang wurde ausgelöst\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 Der dedizierte \"on\"-Eingang wurde ausgelöst\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 Der dedizierte \"off\"-Eingang wurde ausgelöst\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>Gibt den Wert des Eingangs zurück, der die aktuelle Skriptausführung ausgelöst hat. Der Rückgabetyp hängt vom definierten Typ des Eingangs ab (boolean, number oder string). Verwenden Sie diese Funktion zusammen mit \u003Ccode>input::channel()\u003C\u002Fcode>, um sowohl zu ermitteln, welcher Eingang sich geändert hat, als auch welchen neuen Wert er hat.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Keine.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Der aktuelle Wert des auslösenden Eingangs. Der Typ hängt von der Eingangsdefinition ab (boolean, number oder string).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\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 Auf eine steigende Flanke an einem booleschen Eingang reagieren\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>Ruft den zuletzt bekannten Wert eines bestimmten Eingangs anhand seiner Kennung ab. Anders als \u003Ccode>input::value()\u003C\u002Fcode>, das nur den Wert des Eingangs zurückgibt, der die aktuelle Ausführung ausgelöst hat, kann diese Funktion den gespeicherten Wert jedes Eingangs jederzeit lesen.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>id\u003C\u002Fcode> (string): Die Kennung des zu lesenden Eingangs.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Der zuletzt bekannte Wert des angegebenen Eingangs. Der Typ hängt von der Eingangsdefinition ab (boolean, number oder string).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Aktuelle Temperatur von einem Eingang lesen\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 Den Wert in der Steuerlogik verwenden\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=\"ausgabeoperationen\">\u003Ca href=\"#ausgabeoperationen\" class=\"anchor\">#\u003C\u002Fa> Ausgabeoperationen\u003C\u002Fh2>\n\u003Cp>Dieser Abschnitt beschreibt Funktionen zum Steuern der Ausgänge eines Logikbausteins. Jeder Baustein kann einen oder mehrere Ausgänge definieren, die Werte an andere verbundene Bausteine weitergeben.\u003C\u002Fp>\n\u003Ch3 id=\"output-get\">\u003Ca href=\"#output-get\" class=\"anchor\">#\u003C\u002Fa> output::get\u003C\u002Fh3>\n\u003Cp>Ruft den aktuellen Wert eines bestimmten Ausgangs anhand seiner Kennung ab. Dies ist nützlich, um den aktuellen Zustand eines Ausgangs zu lesen, bevor entschieden wird, ob er geändert werden soll.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>id\u003C\u002Fcode> (string): Die Kennung des zu lesenden Ausgangs.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Der aktuelle Wert des angegebenen Ausgangs. Der Typ hängt von der Ausgangsdefinition ab (boolean, number oder string).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Aktuellen Ausgangszustand vor dem Umschalten prüfen\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\">\"Output is currently ON, turning OFF\"\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>Setzt den Wert eines bestimmten Ausgangs anhand seiner Kennung. Der Werttyp muss dem für diesen Ausgang definierten Typ entsprechen (boolean, number oder string). Das Setzen eines Ausgangs gibt den neuen Wert an alle verbundenen Bausteine weiter.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>id\u003C\u002Fcode> (string): Die Kennung des zu setzenden Ausgangs.\u003C\u002Fli>\n\u003Cli>\u003Ccode>value\u003C\u002Fcode>: Der neue zuzuweisende Wert. Muss dem definierten Typ des Ausgangs entsprechen.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Keine.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Einen booleschen Ausgang setzen\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 Einen numerischen Ausgang basierend auf einer Berechnung setzen\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>Schaltet einen booleschen Ausgang um und kehrt seinen aktuellen Wert um. Ist der Ausgang aktuell \u003Ccode>true\u003C\u002Fcode>, wird er \u003Ccode>false\u003C\u002Fcode> und umgekehrt. Diese Funktion arbeitet nur mit Ausgängen vom Typ boolean.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>id\u003C\u002Fcode> (string): Die Kennung des umzuschaltenden booleschen Ausgangs.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Keine.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\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 Den Ausgang bei einer steigenden Flanke des Eingangs umschalten\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=\"zustandsoperationen\">\u003Ca href=\"#zustandsoperationen\" class=\"anchor\">#\u003C\u002Fa> Zustandsoperationen\u003C\u002Fh2>\n\u003Cp>Dieser Abschnitt beschreibt Funktionen zum Verwalten eines persistenten Zustands innerhalb eines Logikbausteins. Zustandsvariablen behalten ihre Werte zwischen Skriptausführungen bei, was sie unerlässlich macht, um Bedingungen über die Zeit zu verfolgen, etwa Flankenerkennung, Zähler oder Zeitinformationen. Die verfügbaren Zustandsvariablen und ihre Typen werden im Bausteindeskriptor definiert.\u003C\u002Fp>\n\u003Ch3 id=\"state-get\">\u003Ca href=\"#state-get\" class=\"anchor\">#\u003C\u002Fa> state::get\u003C\u002Fh3>\n\u003Cp>Ruft den aktuellen Wert einer persistenten Zustandsvariablen anhand ihrer Kennung ab.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>id\u003C\u002Fcode> (string): Die Kennung der zu lesenden Zustandsvariablen.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Der aktuelle Wert der Zustandsvariablen. Der Typ hängt von der Definition der Zustandsvariablen ab (boolean, number oder string).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Zustand verwenden, um eine steigende Flanke zu erkennen (Übergang von false zu 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 Steigende Flanke erkannt - Aktion ausführen\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>Speichert einen Wert in einer persistenten Zustandsvariablen anhand ihrer Kennung. Der Wert bleibt zwischen Skriptausführungen erhalten, sodass sich der Baustein Informationen über mehrere Eingangsereignisse hinweg merken kann. Der Werttyp muss dem für diese Zustandsvariable definierten Typ entsprechen.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>id\u003C\u002Fcode> (string): Die Kennung der zu aktualisierenden Zustandsvariablen.\u003C\u002Fli>\n\u003Cli>\u003Ccode>value\u003C\u002Fcode>: Der neue zu speichernde Wert. Muss dem definierten Typ der Zustandsvariablen entsprechen.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Keine.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Den Zeitstempel der letzten Eingangsänderung verfolgen\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 Berechnen, wie lange der Eingang in seinem vorherigen Zustand war\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\">\"Input was stable for over a minute\"\u003C\u002Fspan>)\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch2 id=\"konfigurationsoperationen\">\u003Ca href=\"#konfigurationsoperationen\" class=\"anchor\">#\u003C\u002Fa> Konfigurationsoperationen\u003C\u002Fh2>\n\u003Cp>Dieser Abschnitt beschreibt Funktionen zum Lesen der Konfigurationsparameter eines Bausteins. Konfigurationswerte werden vom Benutzer in Voldeno Studio gesetzt und sind aus dem Skript heraus nur lesbar. Sie erlauben es, Bausteine anzupassen, ohne den Code zu ändern, zum Beispiel um Schwellenwerte, Verzögerungen oder Betriebsmodi festzulegen.\u003C\u002Fp>\n\u003Ch3 id=\"config-get\">\u003Ca href=\"#config-get\" class=\"anchor\">#\u003C\u002Fa> config::get\u003C\u002Fh3>\n\u003Cp>Ruft den Wert eines Konfigurationsparameters anhand seiner Kennung ab. Konfigurationsparameter werden im Bausteindeskriptor definiert und ihre Werte werden vom Benutzer in Voldeno Studio gesetzt. Das Skript kann diese Werte nur lesen, nicht verändern.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>id\u003C\u002Fcode> (string): Die Kennung des zu lesenden Konfigurationsparameters.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Der Wert des Konfigurationsparameters. Der Typ hängt von der Definition des Parameters ab (number, string oder enum). Parameter vom Typ enum geben ihren nullbasierten numerischen Index zurück.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Verzögerungskonfiguration in Millisekunden lesen\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 Eine enum-Konfiguration verwenden, um den Verhaltensmodus zu wählen\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 Gibt 0, 1, 2... je nach gewählter Option zurück\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 Logik für den ersten Modus\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 Logik für den zweiten Modus\u003C\u002Fspan>\n    ...\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Einen numerischen Schwellenwert aus der Konfiguration lesen\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=\"callback-operationen\">\u003Ca href=\"#callback-operationen\" class=\"anchor\">#\u003C\u002Fa> Callback-Operationen\u003C\u002Fh2>\n\u003Cp>Dieser Abschnitt beschreibt Funktionen zum Planen aufgeschobener Funktionsaufrufe. Volang ist eine nicht blockierende Sprache und stellt keine \u003Ccode>sleep\u003C\u002Fcode>-Funktion bereit. Stattdessen bieten Callbacks einen Mechanismus für zeitbasierte Logik, indem sie eine benutzerdefinierte Funktion planen, die nach einer festgelegten Verzögerung aufgerufen wird.\u003C\u002Fp>\n\u003Cp>Dies ist unerlässlich, um Verhaltensweisen wie Verzögerungen, zeitgesteuerte Impulse, Motorsteuerungssequenzen oder jede Logik umzusetzen, die nach Ablauf einer bestimmten Zeitspanne handeln muss. Ein Callback kann Argumente an die aufgerufene Funktion übergeben, und die Funktion kann weitere Callbacks planen, um mehrstufige Sequenzen zu erstellen.\u003C\u002Fp>\n\u003Cp>Pro Baustein kann jeweils nur ein Callback aktiv sein. Das Planen eines neuen Callbacks, während bereits einer aussteht, erfordert, den bestehenden zuerst mit \u003Ccode>callback::clear()\u003C\u002Fcode> zu löschen.\u003C\u002Fp>\n\u003Ch3 id=\"callback-set\">\u003Ca href=\"#callback-set\" class=\"anchor\">#\u003C\u002Fa> callback::set\u003C\u002Fh3>\n\u003Cp>Plant einen aufgeschobenen Aufruf einer benutzerdefinierten \u003Ccode>extern\u003C\u002Fcode>-Funktion nach einer festgelegten Verzögerung in Millisekunden. Die Funktion wird durch ihren Namen als Zeichenkette identifiziert. Zusätzliche Argumente können übergeben werden und werden der Callback-Funktion als ihre Parameter zugestellt.\u003C\u002Fp>\n\u003Cp>Die Zielfunktion muss im Skript mit der Syntax \u003Ccode>extern fn\u003C\u002Fcode> deklariert sein. Wenn die Verzögerung abläuft, ruft das System diese Funktion mit den bereitgestellten Argumenten auf.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>delay_ms\u003C\u002Fcode> (integer): Die Verzögerung in Millisekunden, bevor die Funktion aufgerufen wird.\u003C\u002Fli>\n\u003Cli>\u003Ccode>function_name\u003C\u002Fcode> (string): Der Name der aufzurufenden \u003Ccode>extern fn\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>...args\u003C\u002Fcode> (optional): Zusätzliche Argumente, die an die Callback-Funktion übergeben werden. Sie können null oder mehr Werte beliebigen Typs übergeben.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Keine.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Einen einfachen Callback-Handler definieren\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 Den Callback so planen, dass er nach einer konfigurierbaren Verzögerung auslöst\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>Beispiel - Argumente übergeben:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Callback, der in den nächsten Schritt verkettet\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 Schritt 2 nach einer Impulsdauer planen\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 Die Sequenz nach einer anfänglichen Verzögerung starten\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>Bricht jeden aktuell geplanten Callback für den Baustein ab. Dies sollte aufgerufen werden, bevor ein neuer Callback geplant wird, oder wenn die ausstehende Aktion nicht mehr benötigt wird (z. B. wenn sich der Eingang geändert hat, bevor die Verzögerung abgelaufen ist).\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Keine.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Keine.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\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 Den vorherigen Callback immer löschen, bevor ein neuer geplant wird\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=\"zeichenkettenoperationen\">\u003Ca href=\"#zeichenkettenoperationen\" class=\"anchor\">#\u003C\u002Fa> Zeichenkettenoperationen\u003C\u002Fh2>\n\u003Cp>Dieser Abschnitt beschreibt Funktionen, die Zeichenketten bearbeiten.\u003C\u002Fp>\n\u003Ch3 id=\"str-len\">\u003Ca href=\"#str-len\" class=\"anchor\">#\u003C\u002Fa> str::len\u003C\u002Fh3>\n\u003Cp>Berechnet die Anzahl der Zeichen in einer gegebenen Zeichenkette.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>text\u003C\u002Fcode> (string): Die zu messende Eingabezeichenkette.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Ein Ganzzahlwert, der die Anzahl der Zeichen in der Zeichenkette angibt.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Prüfen, ob der PIN-Code des Benutzers die erforderliche Länge hat\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>Entfernt alle führenden und nachgestellten Leerraumzeichen (Leerzeichen, Tabulatoren, Zeilenumbrüche) aus der Zeichenkette. Dies ist unerlässlich, um Benutzereingaben zu bereinigen oder Befehle von externen Systemen zu parsen, bei denen zusätzliche Abstände auftreten können.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>text\u003C\u002Fcode> (string): Die zu bereinigende Eingabezeichenkette.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Ein neuer Text, der den Text ohne umgebenden Leerraum enthält.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Einen von einem externen Modul empfangenen Befehl bereinigen\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 Jetzt ist die Zeichenkette \"START\" und kann sicher verglichen werden\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>Verkettet (verbindet) zwei oder mehr Zeichenketten zu einer einzigen Zeichenkette. Diese Funktion ist variadisch, das heißt, sie akzeptiert eine variable Anzahl von Argumenten, sodass Sie komplexe Nachrichten oder Befehle dynamisch aufbauen können.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>...strings\u003C\u002Fcode>: Eine Folge von Zeichenkettenargumenten, die miteinander verbunden werden sollen. Sie können so viele Argumente wie nötig übergeben, getrennt durch Kommas. Es kann auch ein einzelnes Argument angegeben werden; in diesem Fall gibt diese Funktion das Argument selbst zurück.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Eine neue Zeichenkette, die aus allen Eingabezeichenketten in der angegebenen Reihenfolge zusammengesetzt ist.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\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\">\"Living Room\"\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 Eine vollständige Statusmeldung aus mehreren Argumenten aufbauen\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\">\" is currently \"\u003C\u002Fspan>, \u003Cspan class=\"variable\">temp\u003C\u002Fspan>, \u003Cspan class=\"string\">\"°C\"\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Ergebnis: \"Status: Living Room is currently 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>Zählt die Anzahl der nicht überlappenden Vorkommen einer Teilzeichenkette innerhalb einer Zeichenkette. Optional kann die Suche mithilfe der Positionsargumente \u003Ccode>start\u003C\u002Fcode> und \u003Ccode>end\u003C\u002Fcode> auf einen bestimmten Bereich innerhalb der Zeichenkette beschränkt werden.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>text\u003C\u002Fcode> (string): Die Zeichenkette, in der gesucht wird.\u003C\u002Fli>\n\u003Cli>\u003Ccode>substring\u003C\u002Fcode> (string): Die Teilzeichenkette, deren Vorkommen gezählt werden.\u003C\u002Fli>\n\u003Cli>\u003Ccode>start\u003C\u002Fcode> (integer, optional): Die Position, ab der die Suche beginnt. Standardwert ist \u003Ccode>0\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>end\u003C\u002Fcode> (integer, optional): Die Position, an der die Suche endet (exklusiv). Standardwert ist das Ende der Zeichenkette.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Ein Ganzzahlwert, der die Anzahl der nicht überlappenden Vorkommen der Teilzeichenkette angibt.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Alle Vorkommen eines Wortes zählen\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 Gibt 2 zurück\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Vorkommen innerhalb eines Bereichs zählen\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 Gibt 2 zurück (überspringt das erste \"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 Gibt 1 zurück\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Leere Teilzeichenkette gibt Länge + 1 zurück\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 Gibt 6 zurück\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Nicht überlappend: \"aaaa\" enthält 2 nicht überlappende \"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 Gibt 2 zurück\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>Ersetzt Vorkommen einer Teilzeichenkette innerhalb einer Zeichenkette durch eine neue Teilzeichenkette. Standardmäßig werden alle Vorkommen ersetzt. Ein optionaler Parameter \u003Ccode>count\u003C\u002Fcode> begrenzt die Anzahl der von links nach rechts durchgeführten Ersetzungen.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>text\u003C\u002Fcode> (string): Die ursprüngliche Zeichenkette.\u003C\u002Fli>\n\u003Cli>\u003Ccode>old\u003C\u002Fcode> (string): Die zu ersetzende Teilzeichenkette.\u003C\u002Fli>\n\u003Cli>\u003Ccode>new\u003C\u002Fcode> (string): Die Teilzeichenkette, durch die ersetzt wird.\u003C\u002Fli>\n\u003Cli>\u003Ccode>count\u003C\u002Fcode> (integer, optional): Maximale Anzahl der Ersetzungen. Wird er weggelassen, werden alle Vorkommen ersetzt.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Eine neue Zeichenkette mit den angewendeten Ersetzungen.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Alle Vorkommen ersetzen\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 Gibt \"three three was a horse\" zurück\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Nur das erste Vorkommen ersetzen\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 Gibt \"three one was a horse\" zurück\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Durch Ersetzen mit leerer Zeichenkette löschen\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 Gibt \"heo\" zurück\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Eine leere old-Zeichenkette fügt zwischen jedes Zeichen ein\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 Gibt \"-a-b-c-\" zurück\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>Parst ein Zeichenkettenargument und wandelt es in einen numerischen Wert um. Die Funktion erkennt das Format automatisch: Enthält die Zeichenkette einen Dezimalpunkt, gibt sie eine Gleitkommazahl zurück, andernfalls eine Ganzzahl.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>text\u003C\u002Fcode>: Die Zeichenkette, die die Zahlendarstellung enthält.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Ein numerischer Wert, entweder Ganzzahl oder Gleitkommazahl, je nach Eingabeformat.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Fall 1: Eine Ganzzahl parsen (z. B. Helligkeitsstufe)\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 Gibt Ganzzahl 80 zurück\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Fall 2: Eine Gleitkommazahl parsen (z. B. Temperatur)\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 Gibt Gleitkommazahl 21.5 zurück\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 Den umgewandelten Wert in der Logik verwenden\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>Erstellt eine formatierte Zeichenkette, indem Platzhalter \u003Ccode>{}\u003C\u002Fcode> innerhalb einer Vorlagenzeichenkette durch die Zeichenkettendarstellung der bereitgestellten Argumente ersetzt werden. Sie akzeptiert eine variable Anzahl von Argumenten unterschiedlicher Typen (Zeichenketten, numerische und boolesche Werte) und wandelt sie vor dem Einfügen automatisch in Text um. Die Ersetzung erfolgt positionsabhängig: Das erste \u003Ccode>{}\u003C\u002Fcode> wird durch das erste Argument ersetzt, das zweite \u003Ccode>{}\u003C\u002Fcode> durch das zweite und so weiter.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>template\u003C\u002Fcode>: Die Formatzeichenkette, die geschweifte Klammern als Platzhalter \u003Ccode>{}\u003C\u002Fcode> enthält.\u003C\u002Fli>\n\u003Cli>\u003Ccode>...args\u003C\u002Fcode>: Eine Folge von Werten, die in die Platzhalter eingesetzt werden. Unterstützte Typen sind Zahlen, Zeichenketten und boolesche Literale (\u003Ccode>true\u003C\u002Fcode>\u002F\u003Ccode>false\u003C\u002Fcode>).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Eine neue Zeichenkette, in der alle Platzhalter durch die entsprechenden Werte ersetzt sind.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\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\">\"Kitchen_Main\"\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 Eine komplexe Protokollnachricht ohne manuelle Verkettung formatieren\u003C\u002Fspan>\n\u003Cspan class=\"variable\">log\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">str::fmt\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Sensor {} status: Active={}, Value={}°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 Ergebnis: \"Sensor Kitchen_Main status: Active=true, Value=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>Initialisiert eine Zeichenketten-Aufteilungsoperation und erstellt einen Iteratorzustand. Diese Funktion führt die eigentliche Aufteilung nicht sofort durch. Stattdessen gibt sie ein undurchsichtiges \u003Ccode>handle\u003C\u002Fcode>-Objekt zurück, das die aktuelle Position und die Logik kapselt, die zum Durchlaufen der Zeichenkette erforderlich sind. Dieses Objekt muss an \u003Ccode>str::split_next\u003C\u002Fcode> oder \u003Ccode>str::split_has_next\u003C\u002Fcode> übergeben werden, um die tatsächlichen Teilzeichenketten nacheinander abzurufen.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>text\u003C\u002Fcode>: Die aufzuteilende Quellzeichenkette.\u003C\u002Fli>\n\u003Cli>\u003Ccode>separator\u003C\u002Fcode>: Die Trennzeichenkette, die die Grenzen zwischen den Abschnitten markiert.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Ein undurchsichtiges Handle, das die aktive Aufteilungssitzung darstellt. Sie sollten dieses Objekt nicht direkt verändern.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\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 Den Splitter initialisieren. 'iterator' hält jetzt den Zustand.\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 Der Iterator ist jetzt bereit, von split_next verarbeitet zu werden...\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>Prüft, ob weitere Teilzeichenketten darauf warten, aus der aktuellen Aufteilungssitzung abgerufen zu werden. Diese Funktion untersucht das von \u003Ccode>str::split\u003C\u002Fcode> erstellte undurchsichtige \u003Ccode>state\u003C\u002Fcode>-Objekt. Sie verändert den Zustand nicht und rückt die Iteratorposition nicht vor, sondern prüft nur die Verfügbarkeit. Sie wird häufig als Bedingung in einer \u003Ccode>while\u003C\u002Fcode>-Schleife verwendet, um alle Teile einer Zeichenkette zu durchlaufen.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>state\u003C\u002Fcode>: Das von \u003Ccode>str::split\u003C\u002Fcode> zurückgegebene undurchsichtige Handle.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>true\u003C\u002Fcode>, wenn mindestens eine weitere Teilzeichenkette verfügbar ist; andernfalls \u003Ccode>false\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\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\">\"RED,GREEN,BLUE\"\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 Schleife durchlaufen, solange noch Tokens übrig sind\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 Hier kann split_next() sicher aufgerufen werden\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>Extrahiert die nächste Teilzeichenkette aus der Aufteilungssequenz, gibt sie zurück und rückt den Iterator auf die nächste Position vor. Diese Funktion verbraucht das aktuelle durch das undurchsichtige \u003Ccode>state\u003C\u002Fcode> identifizierte Segment der Zeichenkette. Sie ist dafür ausgelegt, nacheinander aufgerufen zu werden, bis alle Teile der Zeichenkette verarbeitet wurden.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>state\u003C\u002Fcode>: Das von \u003Ccode>str::split\u003C\u002Fcode> zurückgegebene undurchsichtige Handle.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Das nächste Segment des ursprünglichen Textes.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cblockquote>\n\u003Cp>\u003Cstrong>Hinweis:\u003C\u002Fstrong> Es wird empfohlen, die Verfügbarkeit mit \u003Ccode>str::split_has_next(state)\u003C\u002Fcode> zu prüfen, bevor Sie diese Funktion aufrufen, um eine sichere Iteration zu gewährleisten.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Szenario: Parsen einer Befehlszeichenkette \"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 Wir kennen das Format und können die Teile manuell extrahieren\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=\"array-operationen\">\u003Ca href=\"#array-operationen\" class=\"anchor\">#\u003C\u002Fa> Array-Operationen\u003C\u002Fh2>\n\u003Cp>Dieser Abschnitt beschreibt Funktionen zum Erstellen und Bearbeiten von Arrays.\u003C\u002Fp>\n\u003Ch3 id=\"array-new\">\u003Ca href=\"#array-new\" class=\"anchor\">#\u003C\u002Fa> array::new\u003C\u002Fh3>\n\u003Cp>Erstellt ein neues Array, das mit den bereitgestellten Werten initialisiert wird. Diese Funktion ist variadisch, das heißt, sie akzeptiert eine variable Anzahl von Argumenten beliebigen Typs. Wird sie ohne Argumente aufgerufen, erstellt sie ein leeres Array. Arrays können gemischte Typen aufnehmen und ihre Größe kann mit anderen Array-Funktionen dynamisch geändert werden.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>...values\u003C\u002Fcode> (optional): Eine Folge von Werten, mit denen das Array initialisiert wird. Sie können null oder mehr Argumente beliebigen Typs übergeben (Zahlen, Zeichenketten, boolesche Werte oder sogar andere Arrays). Werden keine Argumente angegeben, wird ein leeres Array erstellt.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Ein undurchsichtiges Handle, das das erstellte Array darstellt. Dieses Handle sollte an andere Array-Funktionen (etwa \u003Ccode>array::put_at\u003C\u002Fcode>, \u003Ccode>array::get_at\u003C\u002Fcode>, \u003Ccode>array::len\u003C\u002Fcode>) übergeben werden, um den Inhalt des Arrays zu bearbeiten.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Ein leeres Array erstellen\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 Ein Array mit numerischen Anfangswerten erstellen\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 Ein Array mit gemischten Typen erstellen\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 Ein Array mit Zeichenkettenwerten für Raumnamen erstellen\u003C\u002Fspan>\n\u003Cspan class=\"variable\">rooms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::new\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Living Room\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"Kitchen\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"Bedroom\"\u003C\u002Fspan>, \u003Cspan class=\"string\">\"Bathroom\"\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Arrays können verwendet werden, um Sensormesswerte über die Zeit zu sammeln\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 Später: 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>Gibt die Anzahl der aktuell im Array gespeicherten Elemente zurück. Diese Funktion ist nützlich, um zu prüfen, ob ein Array leer ist, über alle Elemente zu iterieren oder die Array-Größe vor dem Zugriff auf bestimmte Indizes zu validieren.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>arr\u003C\u002Fcode>: Das von \u003Ccode>array::new\u003C\u002Fcode> zurückgegebene undurchsichtige Array-Handle.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Ein Ganzzahlwert, der die Anzahl der Elemente im Array angibt.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Die Größe eines Arrays prüfen\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 Gibt 3 zurück\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Prüfen, ob ein Array leer ist\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\">\"No data collected yet\"\u003C\u002Fspan>)\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Länge für Iterationsgrenzen verwenden\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 Jeden Sensor verarbeiten...\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>Ruft den am angegebenen Index im Array gespeicherten Wert ab. Array-Indizes sind nullbasiert, das heißt, das erste Element befindet sich an Index \u003Ccode>0\u003C\u002Fcode>, das zweite an Index \u003Ccode>1\u003C\u002Fcode> und so weiter.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>arr\u003C\u002Fcode>: Das von \u003Ccode>array::new\u003C\u002Fcode> zurückgegebene undurchsichtige Array-Handle.\u003C\u002Fli>\n\u003Cli>\u003Ccode>index\u003C\u002Fcode>: Die nullbasierte Position des abzurufenden Elements.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Der am angegebenen Index gespeicherte Wert. Der Rückgabetyp hängt davon ab, was an dieser Position gespeichert wurde.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cblockquote>\n\u003Cp>\u003Cstrong>Warnung:\u003C\u002Fstrong> Sie müssen sicherstellen, dass der Index innerhalb der gültigen Grenzen liegt (d. h. \u003Ccode>0 &lt;= index &lt; array::len(arr)\u003C\u002Fcode>), bevor Sie diese Funktion aufrufen. Der Versuch, auf einen nicht vorhandenen Index zuzugreifen, führt zu einem \u003Cstrong>Programmausführungsfehler\u003C\u002Fstrong>, der zu undefiniertem Verhalten führen kann. Validieren Sie den Index immer zuerst mit \u003Ccode>array::len()\u003C\u002Fcode>.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>\u003Cstrong>Beispiel:\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 Sicherer Zugriff: zuerst die Grenzen prüfen\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 Gibt 19.8 zurück\u003C\u002Fspan>\n    \u003Cspan class=\"stdlib\">std::print\u003C\u002Fspan>(\u003Cspan class=\"stdlib\">str::fmt\u003C\u002Fspan>(\u003Cspan class=\"string\">\"Temperature at index {}: {}°C\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">index\u003C\u002Fspan>, \u003Cspan class=\"variable\">value\u003C\u002Fspan>))\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Sicher über alle Elemente iterieren\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\">\"High temperature detected: {}°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 GEFÄHRLICH: Tun Sie dies niemals ohne Grenzenprüfung!\u003C\u002Fspan>\n\u003Cspan class=\"comment\">\u002F\u002F value = array::get_at(temps, 10) \u002F\u002F Undefiniertes Verhalten - kann abstürzen!\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>Speichert einen Wert am angegebenen Index im Array und ersetzt dabei jeden vorhandenen Wert an dieser Position. Array-Indizes sind nullbasiert, das heißt, das erste Element befindet sich an Index \u003Ccode>0\u003C\u002Fcode>, das zweite an Index \u003Ccode>1\u003C\u002Fcode> und so weiter. Diese Funktion verändert das Array direkt und gibt keinen Wert zurück.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>arr\u003C\u002Fcode>: Das von \u003Ccode>array::new\u003C\u002Fcode> zurückgegebene undurchsichtige Array-Handle.\u003C\u002Fli>\n\u003Cli>\u003Ccode>index\u003C\u002Fcode>: Die nullbasierte Position, an der der Wert gespeichert werden soll.\u003C\u002Fli>\n\u003Cli>\u003Ccode>value\u003C\u002Fcode>: Der am angegebenen Index zu speichernde Wert. Der Typ des Werts muss dem Typ des bereits an dieser Position im Array gespeicherten Elements entsprechen.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Keine.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cblockquote>\n\u003Cp>\u003Cstrong>Warnung:\u003C\u002Fstrong> Sie müssen sicherstellen, dass der Index innerhalb der gültigen Grenzen liegt (d. h. \u003Ccode>0 &lt;= index &lt; array::len(arr)\u003C\u002Fcode>), bevor Sie diese Funktion aufrufen. Der Versuch, auf einen nicht vorhandenen Index zu schreiben, führt zu einem \u003Cstrong>Programmausführungsfehler\u003C\u002Fstrong>, der zu undefiniertem Verhalten führen kann. Validieren Sie den Index immer zuerst mit \u003Ccode>array::len()\u003C\u002Fcode>.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Ein Array mit Anfangswerten erstellen\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 Sichere Aktualisierung: zuerst die Grenzen prüfen\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 Ersetzt 22.0 durch 25.0\u003C\u002Fspan>\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Alle Werte in einer Schleife aktualisieren\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 Einen Korrekturfaktor anwenden\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 Bestimmte Elemente in einem Array von Zeichenketten aktualisieren\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 GEFÄHRLICH: Tun Sie dies niemals ohne Grenzenprüfung!\u003C\u002Fspan>\n\u003Cspan class=\"comment\">\u002F\u002F array::put_at(temps, 10, 99.9) \u002F\u002F Undefiniertes Verhalten - kann abstürzen!\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>Fügt einen Wert am Ende des Arrays hinzu und vergrößert seine Größe um eins. Diese Funktion ist nützlich, um Arrays dynamisch aufzubauen, wenn die endgültige Größe im Voraus nicht bekannt ist.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>arr\u003C\u002Fcode>: Das von \u003Ccode>array::new\u003C\u002Fcode> zurückgegebene undurchsichtige Array-Handle.\u003C\u002Fli>\n\u003Cli>\u003Ccode>value\u003C\u002Fcode>: Der am Ende des Arrays hinzuzufügende Wert. \u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Keine.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Ein Array dynamisch durch Anhängen von Werten aufbauen\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 enthält jetzt: [21.5, 22.0, 19.8, 23.1]\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Sensormesswerte über die Zeit sammeln\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 Mit dem ersten Messwert initialisieren\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 Die neue Größe prüfen\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 Gibt 3 zurück\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F In einer Schleife anhängen (z. B. 5 Messwerte sammeln)\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 enthält jetzt: [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>Entfernt alle Elemente aus dem Array und lässt es leer zurück. Nach dem Aufruf dieser Funktion gibt \u003Ccode>array::len(arr)\u003C\u002Fcode> den Wert \u003Ccode>0\u003C\u002Fcode> zurück. Diese Funktion ist nützlich, um ein Array wiederzuverwenden, ohne ein neues zu erstellen.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>arr\u003C\u002Fcode>: Das von \u003Ccode>array::new\u003C\u002Fcode> zurückgegebene undurchsichtige Array-Handle.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Keine.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Ein Array erstellen und befüllen\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\">\"Length before clear: {}\"\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 Alle Elemente löschen\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\">\"Length after clear: {}\"\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 Das Array kann wiederverwendet werden\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 enthält jetzt: [25.0, 26.5]\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Nützlich für periodische Datensammlung - alte Messwerte löschen\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 ... Messwerte sammeln ...\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 ... Messwerte verarbeiten ...\u003C\u002Fspan>\n\u003Cspan class=\"comment\">\u002F\u002F Für den nächsten Sammelzyklus zurücksetzen\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=\"map-operationen\">\u003Ca href=\"#map-operationen\" class=\"anchor\">#\u003C\u002Fa> Map-Operationen\u003C\u002Fh2>\n\u003Cp>Dieser Abschnitt beschreibt Funktionen zum Erstellen und Bearbeiten von Maps (Schlüssel-Wert-Wörterbüchern). Maps in Volang verwenden Zeichenketten als Schlüssel und können Werte beliebigen Typs speichern.\u003C\u002Fp>\n\u003Ch3 id=\"map-new\">\u003Ca href=\"#map-new\" class=\"anchor\">#\u003C\u002Fa> map::new\u003C\u002Fh3>\n\u003Cp>Erstellt eine neue leere Map. Eine Map ist eine Sammlung von Schlüssel-Wert-Paaren, bei der die Schlüssel immer Zeichenketten sind. Werte können von beliebigem Typ sein (Zahlen, Zeichenketten, boolesche Werte, Arrays oder andere Maps). Maps sind nützlich, um strukturierte Daten oder Konfigurationseinstellungen zu speichern oder JSON-ähnliche Objekte darzustellen.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Keine.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Ein undurchsichtiges Handle, das die erstellte Map darstellt. Dieses Handle sollte an andere Map-Funktionen (etwa \u003Ccode>map::set\u003C\u002Fcode>, \u003Ccode>map::get\u003C\u002Fcode>, \u003Ccode>map::contains\u003C\u002Fcode>) übergeben werden, um den Inhalt der Map zu bearbeiten.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Eine leere Map erstellen\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 Die Map ist jetzt bereit, Schlüssel-Wert-Paare zu speichern\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\", \"Living Room\")\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Maps werden auch von einigen Funktionen zurückgegeben, z. B. HTTP-Antwort-Header\u003C\u002Fspan>\n\u003Cspan class=\"comment\">\u002F\u002F Im http::on_response-Callback ist der Parameter 'headers' eine 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>Gibt die Anzahl der aktuell in der Map gespeicherten Schlüssel-Wert-Paare zurück. Diese Funktion ist nützlich, um zu prüfen, ob eine Map leer ist, oder um festzustellen, wie viele Einträge sie enthält.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>map\u003C\u002Fcode>: Das von \u003Ccode>map::new\u003C\u002Fcode> zurückgegebene undurchsichtige Map-Handle.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Ein Ganzzahlwert, der die Anzahl der Schlüssel-Wert-Paare in der Map angibt.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\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 Die Größe einer leeren Map prüfen\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 Gibt 0 zurück\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Nach dem Hinzufügen von Elementen erhöht sich die Anzahl\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 Gibt 2 zurück\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Prüfen, ob eine Map leer ist\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\">\"Map is empty\"\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>Fügt einen Wert für den angegebenen Schlüssel in der Map hinzu oder aktualisiert ihn. Existiert der Schlüssel nicht, wird ein neues Schlüssel-Wert-Paar erstellt. Existiert der Schlüssel bereits, wird der Wert durch den neuen ersetzt, wobei der neue Wert vom selben Typ wie der vorhandene Wert sein muss.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>map\u003C\u002Fcode>: Das von \u003Ccode>map::new\u003C\u002Fcode> zurückgegebene undurchsichtige Map-Handle.\u003C\u002Fli>\n\u003Cli>\u003Ccode>key\u003C\u002Fcode>: Eine Zeichenkette, die den Schlüsselnamen angibt.\u003C\u002Fli>\n\u003Cli>\u003Ccode>value\u003C\u002Fcode>: Der zu speichernde Wert. Kann von beliebigem Typ sein (Zahl, Zeichenkette, boolescher Wert, Array oder eine andere Map).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Keine.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\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 Neue Schlüssel-Wert-Paare hinzufügen\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\">\"Living Room\"\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 Vorhandenen Wert aktualisieren (gleicher Typ erforderlich)\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 - Gleitkomma zu Gleitkomma\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Unterschiedliche Typen unter unterschiedlichen Schlüsseln speichern\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 Ganzzahl\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 Zeichenkette\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 boolescher Wert\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>Ruft den mit dem angegebenen Schlüssel verknüpften Wert aus der Map ab. Der Rückgabetyp hängt davon ab, was unter diesem Schlüssel gespeichert wurde.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>map\u003C\u002Fcode>: Das von \u003Ccode>map::new\u003C\u002Fcode> zurückgegebene undurchsichtige Map-Handle.\u003C\u002Fli>\n\u003Cli>\u003Ccode>key\u003C\u002Fcode>: Eine Zeichenkette, die den abzurufenden Schlüsselnamen angibt.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Der unter dem angegebenen Schlüssel gespeicherte Wert. Der Rückgabetyp entspricht dem Typ des gespeicherten Werts.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cblockquote>\n\u003Cp>\u003Cstrong>Warnung:\u003C\u002Fstrong> Der angegebene Schlüssel muss in der Map existieren. Der Versuch, einen Wert für einen nicht vorhandenen Schlüssel abzurufen, führt zu einem \u003Cstrong>Laufzeitfehler\u003C\u002Fstrong>. Verwenden Sie immer \u003Ccode>map::contains\u003C\u002Fcode>, um zu prüfen, ob der Schlüssel existiert, bevor Sie diese Funktion aufrufen.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>\u003Cstrong>Beispiel:\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\">\"Living Room\"\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Sicherer Zugriff: zuerst prüfen, ob der Schlüssel existiert\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\">\"Temperature: {}°C\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">temp\u003C\u002Fspan>))\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Auf den Wert zugreifen, wenn Sie wissen, dass der Schlüssel existiert\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 Gibt \"Living Room\" zurück\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F GEFÄHRLICH: Tun Sie dies niemals ohne vorherige Prüfung!\u003C\u002Fspan>\n\u003Cspan class=\"comment\">\u002F\u002F value = map::get(config, \"nonexistent\") \u002F\u002F Laufzeitfehler!\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>Entfernt alle Schlüssel-Wert-Paare aus der Map und lässt sie leer zurück. Nach dem Aufruf dieser Funktion gibt \u003Ccode>map::len(map)\u003C\u002Fcode> den Wert \u003Ccode>0\u003C\u002Fcode> zurück. Diese Funktion ist nützlich, um eine Map wiederzuverwenden, ohne eine neue zu erstellen.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>map\u003C\u002Fcode>: Das von \u003Ccode>map::new\u003C\u002Fcode> zurückgegebene undurchsichtige Map-Handle.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Keine.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\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\">\"Size before clear: {}\"\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 Alle Einträge löschen\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\">\"Size after clear: {}\"\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 Die Map kann wiederverwendet werden\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>Prüft, ob der angegebene Schlüssel in der Map existiert. Diese Funktion sollte vor dem Aufruf von \u003Ccode>map::get\u003C\u002Fcode> verwendet werden, um Laufzeitfehler beim Zugriff auf nicht vorhandene Schlüssel zu vermeiden.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>map\u003C\u002Fcode>: Das von \u003Ccode>map::new\u003C\u002Fcode> zurückgegebene undurchsichtige Map-Handle.\u003C\u002Fli>\n\u003Cli>\u003Ccode>key\u003C\u002Fcode>: Eine Zeichenkette, die den zu prüfenden Schlüsselnamen angibt.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>true\u003C\u002Fcode>, wenn der Schlüssel in der Map existiert; andernfalls \u003Ccode>false\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\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\">\"Living Room\"\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F Prüfen, ob ein Schlüssel existiert\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\">\"Temperature key exists\"\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 Auf einen nicht vorhandenen Schlüssel prüfen\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\">\"Humidity not set\"\u003C\u002Fspan>)\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F In bedingter Logik verwenden\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\">\"Found {}: {}\"\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>Gibt ein Array zurück, das alle aktuell in der Map gespeicherten Schlüssel enthält. Über das zurückgegebene Array kann mit \u003Ccode>array::len\u003C\u002Fcode> und \u003Ccode>array::get_at\u003C\u002Fcode> iteriert werden, um jeden Schlüssel zu verarbeiten. Die Reihenfolge der Schlüssel ist nicht garantiert.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>map\u003C\u002Fcode>: Das von \u003Ccode>map::new\u003C\u002Fcode> zurückgegebene undurchsichtige Map-Handle.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Ein Array von Zeichenketten, wobei jedes Element ein Schlüssel aus der Map ist.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\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>Gibt ein Array zurück, das alle aktuell in der Map gespeicherten Werte enthält. Über das zurückgegebene Array kann mit \u003Ccode>array::len\u003C\u002Fcode> und \u003Ccode>array::get_at\u003C\u002Fcode> iteriert werden. Die Reihenfolge der Werte entspricht der Reihenfolge der von \u003Ccode>map::keys\u003C\u002Fcode> zurückgegebenen Schlüssel.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>map\u003C\u002Fcode>: Das von \u003Ccode>map::new\u003C\u002Fcode> zurückgegebene undurchsichtige Map-Handle.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Ein Array von Werten, wobei jedes Element ein Wert aus der Map ist. Die Elemente können von beliebigem Typ sein.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\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=\"json-operationen\">\u003Ca href=\"#json-operationen\" class=\"anchor\">#\u003C\u002Fa> JSON-Operationen\u003C\u002Fh2>\n\u003Cp>Dieser Abschnitt beschreibt Funktionen für die Arbeit mit JSON-Daten. JSON (JavaScript Object Notation) ist ein gängiges Format für den Datenaustausch, insbesondere bei der Kommunikation mit Web-APIs.\u003C\u002Fp>\n\u003Ch3 id=\"json-get\">\u003Ca href=\"#json-get\" class=\"anchor\">#\u003C\u002Fa> json::get\u003C\u002Fh3>\n\u003Cp>Extrahiert einen Wert aus einer JSON-Zeichenkette mithilfe eines Pfads in Punktnotation. Diese Funktion parst das JSON und navigiert durch verschachtelte Objekte, um den Wert an der angegebenen Position abzurufen.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>json\u003C\u002Fcode>: Eine Zeichenkette mit gültigen JSON-Daten.\u003C\u002Fli>\n\u003Cli>\u003Ccode>path\u003C\u002Fcode>: Eine Zeichenkette, die den Pfad zum gewünschten Feld in Punktnotation angibt (z. B. \u003Ccode>&quot;a.b.c.d&quot;\u003C\u002Fcode>).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Der Wert am angegebenen Pfad. Der Rückgabetyp hängt vom JSON-Werttyp ab: \u003Ccode>string\u003C\u002Fcode>, \u003Ccode>number\u003C\u002Fcode>, \u003Ccode>bool\u003C\u002Fcode> oder \u003Ccode>array\u003C\u002Fcode> (derselbe Array-Typ wie in den Array-Operationen beschrieben, verwendbar mit den \u003Ccode>array::*\u003C\u002Fcode>-Funktionen).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Einfaches JSON-Objekt\u003C\u002Fspan>\n\u003Cspan class=\"variable\">json_data\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"string\">\"\"\"{\"temperature\": 22.5, \"location\": \"Living Room\", \"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 Gibt 22.5 zurück\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 Gibt \"Living Room\" zurück\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 Gibt true zurück\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Verschachteltes JSON-Objekt\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 Gibt \"temp1\" zurück\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 Gibt 23.5 zurück\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 Gibt false zurück\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Tief verschachtelte Struktur\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 Gibt 22.0 zurück\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Einen Array-Wert abrufen\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 Gibt Array [21.5, 22.0, 22.5] zurück\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch2 id=\"http-operationen\">\u003Ca href=\"#http-operationen\" class=\"anchor\">#\u003C\u002Fa> HTTP-Operationen\u003C\u002Fh2>\n\u003Cp>Dieser Abschnitt beschreibt Funktionen zum Senden von HTTP-Anfragen an externe Dienste. Diese Funktionen ermöglichen es Ihren Volang-Skripten, mit Web-APIs zu kommunizieren, Benachrichtigungen zu senden oder Dienste von Drittanbietern zu integrieren.\u003C\u002Fp>\n\u003Ch3 id=\"http-client\">\u003Ca href=\"#http-client\" class=\"anchor\">#\u003C\u002Fa> http::client\u003C\u002Fh3>\n\u003Cp>Erstellt eine neue HTTP-Client-Instanz, die zum Senden von HTTP-Anfragen erforderlich ist. Der Client verwaltet die Verbindungseinstellungen, kümmert sich um die Ausführung der Anfrage und muss erstellt werden, bevor andere HTTP-Funktionen aufgerufen werden.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Keine.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Ein undurchsichtiges Handle, das den HTTP-Client darstellt. Dieses Handle sollte an andere HTTP-Funktionen (etwa \u003Ccode>http::call\u003C\u002Fcode>) übergeben werden, um Anfragen auszuführen.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Einen HTTP-Client erstellen\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 Der Client ist jetzt bereit, Anfragen zu senden\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>Setzt die HTTP-Methode für die Anfrage. Diese Funktion muss aufgerufen werden, bevor die Anfrage mit \u003Ccode>http::call\u003C\u002Fcode> ausgeführt wird. Wird sie nicht gesetzt, ist die Standardmethode \u003Ccode>GET\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>client\u003C\u002Fcode>: Das von \u003Ccode>http::client\u003C\u002Fcode> zurückgegebene undurchsichtige HTTP-Client-Handle.\u003C\u002Fli>\n\u003Cli>\u003Ccode>method\u003C\u002Fcode>: Eine Zeichenkette, die die HTTP-Methode angibt. Unterstützte Werte: \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>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Keine.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\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 Methode auf POST setzen, um Daten zu senden\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 Methode auf GET setzen, um Daten abzurufen (dies ist der Standard)\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 Methode auf PUT setzen, um Ressourcen zu aktualisieren\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 Methode auf DELETE setzen, um Ressourcen zu entfernen\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>Fügt der Anfrage einen benutzerdefinierten HTTP-Header hinzu. Diese Funktion kann mehrfach aufgerufen werden, um mehrere Header hinzuzufügen. Header werden verwendet, um zusätzliche Informationen mit der Anfrage zu übergeben, etwa Authentifizierungstoken, Angaben zum Inhaltstyp oder benutzerdefinierte Metadaten.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>client\u003C\u002Fcode>: Das von \u003Ccode>http::client\u003C\u002Fcode> zurückgegebene undurchsichtige HTTP-Client-Handle.\u003C\u002Fli>\n\u003Cli>\u003Ccode>key\u003C\u002Fcode>: Eine Zeichenkette, die den Header-Namen angibt (z. B. \u003Ccode>&quot;Content-Type&quot;\u003C\u002Fcode>, \u003Ccode>&quot;Authorization&quot;\u003C\u002Fcode>).\u003C\u002Fli>\n\u003Cli>\u003Ccode>value\u003C\u002Fcode>: Eine Zeichenkette, die den Header-Wert angibt.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Keine.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\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 Inhaltstyp für JSON-Daten setzen\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 Authorization-Header mit API-Schlüssel hinzufügen\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 Benutzerdefinierte Header hinzufügen\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>Setzt den Inhalt des Anfragekörpers. Diese Funktion wird typischerweise mit \u003Ccode>POST\u003C\u002Fcode>-, \u003Ccode>PUT\u003C\u002Fcode>- oder \u003Ccode>PATCH\u003C\u002Fcode>-Anfragen verwendet, um Daten an den Server zu senden. Der Körper kann JSON, Formulardaten oder beliebige andere textbasierte Inhalte enthalten. Denken Sie daran, mit \u003Ccode>http::set_header\u003C\u002Fcode> den passenden \u003Ccode>Content-Type\u003C\u002Fcode>-Header zu setzen, damit er zum Körperformat passt.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>client\u003C\u002Fcode>: Das von \u003Ccode>http::client\u003C\u002Fcode> zurückgegebene undurchsichtige HTTP-Client-Handle.\u003C\u002Fli>\n\u003Cli>\u003Ccode>body\u003C\u002Fcode>: Eine Zeichenkette, die den Inhalt des Anfragekörpers enthält.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Keine.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\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 JSON-Körper setzen\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 Oder den Körper dynamisch mit str::fmt aufbauen\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>Führt die HTTP-Anfrage an die angegebene URL mit den konfigurierten Client-Einstellungen (Methode, Header, Körper) aus. Diese Funktion ist asynchron: Sie sendet die Anfrage und kehrt sofort zurück. Die Antwort wird über die Callback-Funktion \u003Ccode>http::on_response\u003C\u002Fcode> zugestellt, die in Ihrem Skript definiert sein muss. Unterstützte Protokolle sind \u003Ccode>http:\u002F\u002F\u003C\u002Fcode> und \u003Ccode>https:\u002F\u002F\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>client\u003C\u002Fcode>: Das von \u003Ccode>http::client\u003C\u002Fcode> zurückgegebene undurchsichtige HTTP-Client-Handle.\u003C\u002Fli>\n\u003Cli>\u003Ccode>url\u003C\u002Fcode>: Eine Zeichenkette mit der vollständigen URL, an die die Anfrage gesendet werden soll.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Keine. Die Antwort wird asynchron über den \u003Ccode>http::on_response\u003C\u002Fcode>-Callback zugestellt.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Callback: http::on_response(status, body, headers)\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Um die HTTP-Antwort zu empfangen, müssen Sie eine externe Callback-Funktion mit der folgenden Signatur definieren:\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 Die Antwort hier behandeln\u003C\u002Fspan>\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\n\u003Cp>\u003Cstrong>Callback-Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>status\u003C\u002Fcode>: Eine Ganzzahl, die den HTTP-Statuscode darstellt (z. B. \u003Ccode>200\u003C\u002Fcode> für Erfolg, \u003Ccode>404\u003C\u002Fcode> für nicht gefunden, \u003Ccode>500\u003C\u002Fcode> für Serverfehler).\u003C\u002Fli>\n\u003Cli>\u003Ccode>body\u003C\u002Fcode>: Eine Zeichenkette, die den Inhalt des Antwortkörpers enthält.\u003C\u002Fli>\n\u003Cli>\u003Ccode>headers\u003C\u002Fcode>: Ein Map-Objekt (siehe Map-Operationen), das die Antwort-Header als Schlüssel-Wert-Paare enthält.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Den Antwort-Callback definieren - dieser wird aufgerufen, wenn die Antwort eintrifft\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\">\"Success! Response: {}\"\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\">\"Error: HTTP {}\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">status\u003C\u002Fspan>))\n    }\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Die Anfrage vorbereiten und senden\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 Für eine POST-Anfrage mit Daten\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=\"tcp-operationen\">\u003Ca href=\"#tcp-operationen\" class=\"anchor\">#\u003C\u002Fa> TCP-Operationen\u003C\u002Fh2>\n\u003Cp>Dieser Abschnitt beschreibt Funktionen für die reine TCP-Kommunikation. Sie ermöglichen es einem Volang-Skript, mit Geräten und Diensten zu kommunizieren, die ein eigenes binäres oder textbasiertes Protokoll über TCP sprechen, etwa SPS, Media-Controller oder Industrie-Gateways, bei denen kein HTTP verfügbar ist.\u003C\u002Fp>\n\u003Ch3 id=\"tcp-oneshot\">\u003Ca href=\"#tcp-oneshot\" class=\"anchor\">#\u003C\u002Fa> tcp::oneshot\u003C\u002Fh3>\n\u003Cp>Führt einen vollständigen TCP-Austausch in einem einzigen Aufruf durch: Es öffnet eine Verbindung zur angegebenen Adresse, sendet die Anfrage-Bytes, liest die Antwort und schließt anschließend die Verbindung. Diese Funktion ist asynchron: Sie startet den Austausch und kehrt sofort zurück. Das Ergebnis wird an den \u003Ccode>on_result\u003C\u002Fcode>-Callback zugestellt, sobald die Antwort empfangen wurde, die erwartete Anzahl Bytes eingetroffen ist oder die Operation fehlschlägt.\u003C\u002Fp>\n\u003Cp>Verwenden Sie diese Funktion für kurze Anfrage-Antwort-Protokolle, bei denen pro Verbindung eine Nachricht gesendet und eine Antwort erwartet wird.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>sa\u003C\u002Fcode> (string): Die Socket-Adresse des entfernten Hosts in der Form \u003Ccode>&quot;host:port&quot;\u003C\u002Fcode> (zum Beispiel \u003Ccode>&quot;192.168.1.50:9100&quot;\u003C\u002Fcode>).\u003C\u002Fli>\n\u003Cli>\u003Ccode>din\u003C\u002Fcode>: Ein Byte-Array (mit \u003Ccode>array::new\u003C\u002Fcode> erstellt), das die zu sendenden Anfragedaten enthält. Jedes Element ist ein Byte-Wert im Bereich \u003Ccode>0\u003C\u002Fcode>–\u003Ccode>255\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>exrs\u003C\u002Fcode> (integer): Die erwartete Antwortgröße in Bytes. Die Funktion liest bis zu dieser Anzahl Bytes, bevor sie den Austausch abschließt.\u003C\u002Fli>\n\u003Cli>\u003Ccode>on_result\u003C\u002Fcode> (string): Der Name des \u003Ccode>extern fn\u003C\u002Fcode>-Callbacks, der mit dem Ergebnis aufgerufen wird. Die Funktion muss im selben Skript definiert sein.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Keine. Das Ergebnis wird asynchron über den \u003Ccode>on_result\u003C\u002Fcode>-Callback zugestellt.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Callback: on_result(result, dout)\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Der in \u003Ccode>on_result\u003C\u002Fcode> benannte Callback muss im selben Skript mit der Syntax \u003Ccode>extern fn\u003C\u002Fcode> deklariert sein:\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\">on_result\u003C\u002Fspan>(\u003Cspan class=\"variable\">result\u003C\u002Fspan>, \u003Cspan class=\"variable\">dout\u003C\u002Fspan>) {\n    \u003Cspan class=\"comment\">\u002F\u002F Die Antwort hier behandeln\u003C\u002Fspan>\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\n\u003Cp>\u003Cstrong>Callback-Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>result\u003C\u002Fcode> (integer): \u003Ccode>0\u003C\u002Fcode>, wenn der Austausch erfolgreich war, oder \u003Ccode>-1\u003C\u002Fcode>, wenn er fehlgeschlagen ist (zum Beispiel wenn die Verbindung nicht hergestellt werden konnte, eine Zeitüberschreitung auftrat oder sie geschlossen wurde, bevor die erwarteten Daten eintrafen).\u003C\u002Fli>\n\u003Cli>\u003Ccode>dout\u003C\u002Fcode>: Ein Byte-Array mit den Antwort-Bytes. Bei einem Fehler kann das Array leer sein.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Die Antwort behandeln, sobald der Austausch abgeschlossen ist\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">extern\u003C\u002Fspan> \u003Cspan class=\"keyword\">fn\u003C\u002Fspan> \u003Cspan class=\"function\">on_result\u003C\u002Fspan>(\u003Cspan class=\"variable\">result\u003C\u002Fspan>, \u003Cspan class=\"variable\">dout\u003C\u002Fspan>) {\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">result\u003C\u002Fspan> \u003Cspan class=\"operator\">!=\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>) {\n        \u003Cspan class=\"comment\">\u002F\u002F Das Gerät als nicht erreichbar markieren\u003C\u002Fspan>\n        \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"online\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">false\u003C\u002Fspan>)\n        \u003Cspan class=\"keyword\">return\u003C\u002Fspan>\n    }\n\n    \u003Cspan class=\"comment\">\u002F\u002F Das erste Byte der Antwort lesen und seinen Zustand ausgeben\u003C\u002Fspan>\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"stdlib\">array::len\u003C\u002Fspan>(\u003Cspan class=\"variable\">dout\u003C\u002Fspan>) \u003Cspan class=\"operator\">&gt;\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>) {\n        \u003Cspan class=\"variable\">status\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::get_at\u003C\u002Fspan>(\u003Cspan class=\"variable\">dout\u003C\u002Fspan>, \u003Cspan class=\"number\">0\u003C\u002Fspan>)\n        \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"online\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n        \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"status\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">status\u003C\u002Fspan>)\n    }\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Die Anfrage-Nutzlast als Byte-Array aufbauen\u003C\u002Fspan>\n\u003Cspan class=\"variable\">request\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">array::new\u003C\u002Fspan>(\u003Cspan class=\"number\">0x01\u003C\u002Fspan>, \u003Cspan class=\"number\">0x03\u003C\u002Fspan>, \u003Cspan class=\"number\">0x00\u003C\u002Fspan>, \u003Cspan class=\"number\">0x00\u003C\u002Fspan>)\n\n\u003Cspan class=\"comment\">\u002F\u002F 4 Bytes senden und eine 8-Byte-Antwort erwarten\u003C\u002Fspan>\n\u003Cspan class=\"variable\">tcp\u003C\u002Fspan>::\u003Cspan class=\"function\">oneshot\u003C\u002Fspan>(\u003Cspan class=\"string\">\"192.168.1.50:9100\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">request\u003C\u002Fspan>, \u003Cspan class=\"number\">8\u003C\u002Fspan>, \u003Cspan class=\"string\">\"on_result\"\u003C\u002Fspan>)\n\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch2 id=\"zeitoperationen\">\u003Ca href=\"#zeitoperationen\" class=\"anchor\">#\u003C\u002Fa> Zeitoperationen\u003C\u002Fh2>\u003Ch3 id=\"time-now\">\u003Ca href=\"#time-now\" class=\"anchor\">#\u003C\u002Fa> time::now\u003C\u002Fh3>\n\u003Cp>Ruft die aktuelle Systemzeit als Unix-Zeitstempel ab. Der Wert stellt die Anzahl der Sekunden dar, die seit 00:00:00 UTC am 1. Januar 1970 (der Unix-Epoche) vergangen sind.\u003C\u002Fp>\n\u003Cp>Diese Funktion ist unerlässlich, um zu verfolgen, wann Ereignisse aufgetreten sind, die zwischen Aktionen vergangene Zeit zu berechnen oder sich mit externen Servern zu synchronisieren.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Keine.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Ein Ganzzahlwert, der den aktuellen Unix-Zeitstempel (in Sekunden) darstellt.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Die Zeit speichern, zu der zuletzt Bewegung erkannt wurde\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 ... später im Code ...\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Prüfen, ob seit der letzten Bewegung mehr als 60 Sekunden vergangen sind\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>Gibt die Anzahl der Sekunden zurück, die seit dem Einschalten oder dem letzten Neustart des Moduls vergangen sind. Dieser Wert ist nützlich, um den Systemzustand zu überwachen, unerwartete Neustarts zu erkennen oder zeitbasierte Logik umzusetzen, die nach einem Stromzyklus zurückgesetzt werden soll.\u003C\u002Fp>\n\u003Cp>Anders als \u003Ccode>time::now()\u003C\u002Fcode>, das einen absoluten Zeitstempel liefert, liefert \u003Ccode>time::uptime()\u003C\u002Fcode> eine relative Messung, die bei jedem Start des Moduls bei null beginnt.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Keine.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Ein Ganzzahlwert, der die Anzahl der Sekunden seit dem Start des Moduls darstellt.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Eine Warnung protokollieren, wenn das Modul länger als 24 Stunden läuft\u003C\u002Fspan>\n\u003Cspan class=\"comment\">\u002F\u002F (könnte darauf hindeuten, dass es nicht zur Wartung neu gestartet wurde)\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\">\"Module running for over 24 hours\"\u003C\u002Fspan>)\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Die Initialisierungslogik verzögern, bis das Modul 10 Sekunden lang stabil war\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 Man kann davon ausgehen, dass alle Sensoren initialisiert sind\u003C\u002Fspan>\n    ...\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Erkennen, ob das Modul kürzlich neu gestartet wurde\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\">\"Module just started, initializing...\"\u003C\u002Fspan>)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch2 id=\"mathematische-operationen\">\u003Ca href=\"#mathematische-operationen\" class=\"anchor\">#\u003C\u002Fa> Mathematische Operationen\u003C\u002Fh2>\u003Ch3 id=\"math-abs\">\u003Ca href=\"#math-abs\" class=\"anchor\">#\u003C\u002Fa> math::abs\u003C\u002Fh3>\n\u003Cp>Berechnet den Absolutwert einer Zahl. Ist die Eingabe negativ, gibt sie das positive Äquivalent zurück; ist die Eingabe positiv, gibt sie den Wert unverändert zurück. Diese Funktion unterstützt sowohl Ganzzahl- als auch Gleitkommatypen.\u003C\u002Fp>\n\u003Cp>Sie ist besonders nützlich, um die Differenz (Delta) zwischen zwei Sensormesswerten zu berechnen, ohne sich darum zu kümmern, welcher Wert größer ist (z. B. um zu prüfen, ob sich die Temperatur in eine beliebige Richtung um mehr als 1 Grad geändert hat).\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>value\u003C\u002Fcode>: Die zu verarbeitende Zahl.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Ein numerischer Wert, der den nicht negativen Wert der Eingabe darstellt. Der Rückgabetyp entspricht dem Eingabetyp.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\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 Die Differenz unabhängig von der Richtung berechnen\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 Wenn die Differenz erheblich ist (mehr als 0,5 Grad), Aktion ausführen\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>Rundet die gegebene Gleitkommazahl auf den nächsten Ganzzahlwert. Grenzfälle (bei denen der Nachkommaanteil genau \u003Ccode>0.5\u003C\u002Fcode> beträgt) werden von null weg gerundet.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>value\u003C\u002Fcode>: Die zu rundende Zahl.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Eine Ganzzahl, die die nächste ganze Zahl darstellt.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Beispiel 1: Sensordaten für die Anzeige runden\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 Gibt 22 zurück\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Beispiel 2: Grenzfälle (Runden von null weg)\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 Gibt 3 zurück\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 Gibt -3 zurück\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Eine Dimmerstufe setzen (muss eine Ganzzahl 0-100 sein)\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 Gibt 55 zurück\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>Gibt eine pseudozufällige Gleitkommazahl im Bereich [0.0, 1.0) zurück. Jeder Aufruf erzeugt einen anderen Wert. Das Ergebnis kann skaliert und mit \u003Ccode>math::round\u003C\u002Fcode> kombiniert werden, um zufällige Ganzzahlen innerhalb eines gewünschten Bereichs zu erzeugen.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Keine.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Ein Gleitkommawert, der größer oder gleich \u003Ccode>0.0\u003C\u002Fcode> und kleiner als \u003Ccode>1.0\u003C\u002Fcode> ist.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Einen zufälligen Wert zwischen 0.0 und 1.0 erhalten\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 Eine zufällige Ganzzahl zwischen 1 und 100 erzeugen\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 Zufällige boolesche Entscheidung (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=\"base64-operationen\">\u003Ca href=\"#base64-operationen\" class=\"anchor\">#\u003C\u002Fa> Base64-Operationen\u003C\u002Fh2>\n\u003Cp>Dieser Abschnitt beschreibt Funktionen zum Kodieren von Daten mit Base64-Kodierungsschemata.\u003C\u002Fp>\n\u003Ch3 id=\"base64-encode\">\u003Ca href=\"#base64-encode\" class=\"anchor\">#\u003C\u002Fa> base64::encode\u003C\u002Fh3>\n\u003Cp>Kodiert eine Zeichenkette in ihre Base64-Darstellung unter Verwendung des Standardalphabets (RFC 4648 Tabelle 1). Die Ausgabe verwendet die Zeichen \u003Ccode>A-Z\u003C\u002Fcode>, \u003Ccode>a-z\u003C\u002Fcode>, \u003Ccode>0-9\u003C\u002Fcode>, \u003Ccode>+\u003C\u002Fcode>, \u003Ccode>\u002F\u003C\u002Fcode> und wird mit \u003Ccode>=\u003C\u002Fcode>-Zeichen aufgefüllt, um sicherzustellen, dass die Ausgabelänge ein Vielfaches von 4 ist.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>data\u003C\u002Fcode> (string): Die zu kodierende Eingabezeichenkette.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Eine Zeichenkette, die die Base64-kodierte Darstellung der Eingabe enthält.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Eine einfache Zeichenkette kodieren\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 Gibt \"SGVsbG8sIFdvcmxkIQ==\" zurück\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Anmeldedaten für HTTP Basic Auth kodieren\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 Eine leere Zeichenkette wird zu einer leeren Zeichenkette kodiert\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 Gibt \"\" zurück\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>Kodiert eine Zeichenkette in ihre Base64url-Darstellung unter Verwendung des URL-sicheren Alphabets (RFC 4648 Tabelle 2). Die Ausgabe verwendet die Zeichen \u003Ccode>A-Z\u003C\u002Fcode>, \u003Ccode>a-z\u003C\u002Fcode>, \u003Ccode>0-9\u003C\u002Fcode>, \u003Ccode>-\u003C\u002Fcode>, \u003Ccode>_\u003C\u002Fcode> und enthält \u003Cstrong>keine\u003C\u002Fstrong> Auffüllzeichen. Diese Kodierung eignet sich für die Verwendung in URLs, Query-Parametern und JWT-Segmenten.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>data\u003C\u002Fcode> (string): Die zu kodierende Eingabezeichenkette.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Eine Zeichenkette, die die Base64url-kodierte Darstellung der Eingabe ohne Auffüllung enthält.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Für URL-sichere Verwendung kodieren\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 Gibt \"SGVsbG8sIFdvcmxkIQ\" zurück\u003C\u002Fspan>\n\n\u003Cspan class=\"comment\">\u002F\u002F Einen JWT-Header und eine JWT-Nutzlast aufbauen\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 Beachten Sie den Unterschied zum Standard-Base64:\u003C\u002Fspan>\n\u003Cspan class=\"comment\">\u002F\u002F base64::encode(\"subjects?_d\")     gibt \"c3ViamVjdHM\u002FX2Q=\" zurück\u003C\u002Fspan>\n\u003Cspan class=\"comment\">\u002F\u002F base64::url_encode(\"subjects?_d\") gibt \"c3ViamVjdHM_X2Q\" zurück\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Ch2 id=\"kryptografische-operationen\">\u003Ca href=\"#kryptografische-operationen\" class=\"anchor\">#\u003C\u002Fa> Kryptografische Operationen\u003C\u002Fh2>\n\u003Cp>Dieser Abschnitt beschreibt Funktionen zum Durchführen kryptografischer Operationen.\u003C\u002Fp>\n\u003Ch3 id=\"crypto-rs256-sign\">\u003Ca href=\"#crypto-rs256-sign\" class=\"anchor\">#\u003C\u002Fa> crypto::rs256_sign\u003C\u002Fh3>\n\u003Cp>Signiert Daten mit einem privaten RSA-Schlüssel unter Verwendung des RS256-Algorithmus (RSASSA-PKCS1-v1_5 mit SHA-256). Diese Funktion wird typischerweise verwendet, um JWT-Signaturen oder andere authentifizierte Nachrichten zu erstellen.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Parameter:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>data\u003C\u002Fcode> (string): Die zu signierenden Daten.\u003C\u002Fli>\n\u003Cli>\u003Ccode>private_key_pem\u003C\u002Fcode> (string): Der private RSA-Schlüssel im PEM-Format.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Rückgabe:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Eine Zeichenkette, die die Base64url-kodierte Signatur enthält.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Beispiel:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"comment\">\u002F\u002F Eine JWT-Signatur erstellen\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 Mit dem privaten Schlüssel signieren\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 Das vollständige JWT zusammensetzen\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=\"asynchrone-operationen\">\u003Ca href=\"#asynchrone-operationen\" class=\"anchor\">#\u003C\u002Fa> Asynchrone Operationen\u003C\u002Fh2>\n\u003Cp>Dieser Abschnitt beschreibt Callback-Funktionen, die definiert werden können, um asynchrone Ereignisse und Antworten zu behandeln.\u003C\u002Fp>\n",[1351,1353,1356,1359,1362,1365,1368,1371,1374,1377,1380,1383,1386,1389,1392,1395,1398,1401,1404,1407,1410,1413,1416,1419,1422,1425,1428,1431,1434,1437,1440,1443,1446,1449,1452,1455,1458,1461,1464,1467,1470,1473,1476,1479,1482,1485,1488,1491,1494,1497,1500,1503,1506,1509,1512,1515,1518,1521,1524,1527,1530,1533,1536,1539,1542,1545,1548],{"level":84,"text":641,"id":1352},"standardbibliothek",{"level":90,"text":1354,"id":1355},"Eingabeoperationen","eingabeoperationen",{"level":96,"text":1357,"id":1358},"input::channel","input-channel",{"level":96,"text":1360,"id":1361},"input::value","input-value",{"level":96,"text":1363,"id":1364},"input::get","input-get",{"level":90,"text":1366,"id":1367},"Ausgabeoperationen","ausgabeoperationen",{"level":96,"text":1369,"id":1370},"output::get","output-get",{"level":96,"text":1372,"id":1373},"output::set","output-set",{"level":96,"text":1375,"id":1376},"output::toggle","output-toggle",{"level":90,"text":1378,"id":1379},"Zustandsoperationen","zustandsoperationen",{"level":96,"text":1381,"id":1382},"state::get","state-get",{"level":96,"text":1384,"id":1385},"state::set","state-set",{"level":90,"text":1387,"id":1388},"Konfigurationsoperationen","konfigurationsoperationen",{"level":96,"text":1390,"id":1391},"config::get","config-get",{"level":90,"text":1393,"id":1394},"Callback-Operationen","callback-operationen",{"level":96,"text":1396,"id":1397},"callback::set","callback-set",{"level":96,"text":1399,"id":1400},"callback::clear","callback-clear",{"level":90,"text":1402,"id":1403},"Zeichenkettenoperationen","zeichenkettenoperationen",{"level":96,"text":1405,"id":1406},"str::len","str-len",{"level":96,"text":1408,"id":1409},"str::trim","str-trim",{"level":96,"text":1411,"id":1412},"str::concat","str-concat",{"level":96,"text":1414,"id":1415},"str::count","str-count",{"level":96,"text":1417,"id":1418},"str::replace","str-replace",{"level":96,"text":1420,"id":1421},"str::number","str-number",{"level":96,"text":1423,"id":1424},"str::fmt","str-fmt",{"level":96,"text":1426,"id":1427},"str::split","str-split",{"level":96,"text":1429,"id":1430},"str::split_has_next","str-split-has-next",{"level":96,"text":1432,"id":1433},"str::split_next","str-split-next",{"level":90,"text":1435,"id":1436},"Array-Operationen","array-operationen",{"level":96,"text":1438,"id":1439},"array::new","array-new",{"level":96,"text":1441,"id":1442},"array::len","array-len",{"level":96,"text":1444,"id":1445},"array::get_at","array-get-at",{"level":96,"text":1447,"id":1448},"array::put_at","array-put-at",{"level":96,"text":1450,"id":1451},"array::append","array-append",{"level":96,"text":1453,"id":1454},"array::clear","array-clear",{"level":90,"text":1456,"id":1457},"Map-Operationen","map-operationen",{"level":96,"text":1459,"id":1460},"map::new","map-new",{"level":96,"text":1462,"id":1463},"map::len","map-len",{"level":96,"text":1465,"id":1466},"map::set","map-set",{"level":96,"text":1468,"id":1469},"map::get","map-get",{"level":96,"text":1471,"id":1472},"map::clear","map-clear",{"level":96,"text":1474,"id":1475},"map::contains","map-contains",{"level":96,"text":1477,"id":1478},"map::keys","map-keys",{"level":96,"text":1480,"id":1481},"map::values","map-values",{"level":90,"text":1483,"id":1484},"JSON-Operationen","json-operationen",{"level":96,"text":1486,"id":1487},"json::get","json-get",{"level":90,"text":1489,"id":1490},"HTTP-Operationen","http-operationen",{"level":96,"text":1492,"id":1493},"http::client","http-client",{"level":96,"text":1495,"id":1496},"http::set_method","http-set-method",{"level":96,"text":1498,"id":1499},"http::set_header","http-set-header",{"level":96,"text":1501,"id":1502},"http::set_body","http-set-body",{"level":96,"text":1504,"id":1505},"http::call","http-call",{"level":90,"text":1507,"id":1508},"TCP-Operationen","tcp-operationen",{"level":96,"text":1510,"id":1511},"tcp::oneshot","tcp-oneshot",{"level":90,"text":1513,"id":1514},"Zeitoperationen","zeitoperationen",{"level":96,"text":1516,"id":1517},"time::now","time-now",{"level":96,"text":1519,"id":1520},"time::uptime","time-uptime",{"level":90,"text":1522,"id":1523},"Mathematische Operationen","mathematische-operationen",{"level":96,"text":1525,"id":1526},"math::abs","math-abs",{"level":96,"text":1528,"id":1529},"math::round","math-round",{"level":96,"text":1531,"id":1532},"math::random","math-random",{"level":90,"text":1534,"id":1535},"Base64-Operationen","base64-operationen",{"level":96,"text":1537,"id":1538},"base64::encode","base64-encode",{"level":96,"text":1540,"id":1541},"base64::url_encode","base64-url-encode",{"level":90,"text":1543,"id":1544},"Kryptografische Operationen","kryptografische-operationen",{"level":96,"text":1546,"id":1547},"crypto::rs256_sign","crypto-rs256-sign",{"level":90,"text":1549,"id":1550},"Asynchrone Operationen","asynchrone-operationen",{},1783173855062]