{"id":1343,"date":"2020-10-27T14:45:06","date_gmt":"2020-10-27T13:45:06","guid":{"rendered":"http:\/\/blog.zhaw.ch\/splab\/?p=1343"},"modified":"2020-10-27T14:45:06","modified_gmt":"2020-10-27T13:45:06","slug":"processing-iot-sensor-data-with-semi-stateful-cloud-functions","status":"publish","type":"post","link":"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/","title":{"rendered":"Processing IoT Sensor Data with Semi-Stateful Cloud Functions"},"content":{"rendered":"\n<p>At Zurich University of Applied Sciences, we are currently building a test track to link applied teaching with research and innovation. Such a facility allows for covering a whole range of topics: programming, autonomous driving, robotics, cloud, serverless, continuums, sensing, open data, data science, and various computing paradigms. We expect a video to be available around November that explains the facility and especially the teaching element. In this research blog post, we already report on interesting observations around the uplink between sensors and FaaS. We expect these insights to bring benefits to companies building IoT-cloud integrations.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/testdriveearlyprototype.png\" alt=\"\" class=\"wp-image-1344\" width=\"580\" height=\"233\" srcset=\"https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/testdriveearlyprototype.png 900w, https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/testdriveearlyprototype-300x121.png 300w, https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/testdriveearlyprototype-768x309.png 768w, https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/testdriveearlyprototype-676x272.png 676w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/figure>\n\n\n\n<!--more-->\n\n\n\n<p>The (simplified) architecture of the system is shown below. Various types of sensors report events to cloud functions. These functions are typically considered stateless, although in practice they are never completely (<a href=\"https:\/\/blog.zhaw.ch\/icclab\/probabilistically-stateful-serverless-web-applications\/https:\/\/blog.zhaw.ch\/icclab\/probabilistically-stateful-serverless-web-applications\/\" data-type=\"URL\" data-id=\"https:\/\/blog.zhaw.ch\/icclab\/probabilistically-stateful-serverless-web-applications\/https:\/\/blog.zhaw.ch\/icclab\/probabilistically-stateful-serverless-web-applications\/\">see older related post<\/a> on building probabilistically stateful applications). To manage state over a longer period of time, an in-memory database is attached to the function; for security reasons, the access is controlled by a restricted virtual network. As we are still covered by GCP Research Credits for Serverless Data Integration, we are basing this work on the respective GCP offerings: GCF, VPC Connector, and the Redis Memorystore.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"663\" src=\"https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/architecture-1024x663.png\" alt=\"\" class=\"wp-image-1345\" srcset=\"https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/architecture-1024x663.png 1024w, https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/architecture-300x194.png 300w, https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/architecture-768x497.png 768w, https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/architecture-676x437.png 676w, https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/architecture.png 1187w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>The &#8216;hit&#8217; function will for instance increase a counter anytime a car passes the corresponding sensor. It reads the Redis credentials from environment variables. Furthermore, it reads a secret from the environment too, with a fallback to a variable definition in a secrets file. This is a pragmatic way to protect against damaging unauthorised function calls: Instead of requiring authentication at the invocation level, the function is open for public invocation but any actual processing, for example writing values to Redis, is protected. We regard low-effort starting with technologies important for prototypical research and teaching, and for this reason also disregarded GCP&#8217;s IoT Core that came with heavy double authentication (keys + JWT) requirements that are redirecting too much effort into security engineering rather than freeing the effort up for advances in technology. (Of course we assume and demand that anybody who operates such solutions in production would then take care of appropriate security.)<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/scr-1024x576.png\" alt=\"\" class=\"wp-image-1347\" srcset=\"https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/scr-1024x576.png 1024w, https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/scr-300x169.png 300w, https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/scr-768x432.png 768w, https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/scr-1536x864.png 1536w, https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/scr-676x380.png 676w, https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/scr.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Once the described system was up and working, the research question emerged: Is Redis really needed? Could we not just store the counter variable as global cloud function variable, hence letting it survive requests?<\/p>\n\n\n\n<p>There are two potential problems that may interfere with that idea. Function instances (the containers or equivalent isolation units beneath FaaS) are kept around for some time, but not forever. Specifically, an invocation will get a new instance if:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Parallelism occurs. In this case, a second instance is temporarily opened. Once the parallelism stops, the older instance takes precedence and the second instance is no longer used. Hence, a typical counting sequence looks like 124, 125, 1, 126, 127.<\/li><li>Recycling occurs. In this case, the original instance is permanently replaced with a new one after an idle period. This problem is potentially even more complex (a whole host VM with multiple containers may migrate or be replaced); for simplicity we are not distinguishing the reasons why a function instance goes away, but we want to know how likely it is. A typical counting sequence looks like 130, 131, 132, 1, 2, 3, 4.<\/li><\/ul>\n\n\n\n<p>Research on function instance recycling has led to interesting insights. In <a href=\"http:\/\/serverless.research-output.org\/\" data-type=\"URL\" data-id=\"http:\/\/serverless.research-output.org\/\">SLD#97<\/a>, Manner et al. from University of Bamberg say that <em>&#8220;containers on most platforms were shut down after 20 minutes of idling&#8221;<\/em>. In <a href=\"http:\/\/serverless.research-output.org\/\" data-type=\"URL\" data-id=\"http:\/\/serverless.research-output.org\/\">SLD#37<\/a>, Lloyd et al. from University of Washington state that all AWS containers were recycled after 45&#8242;. Numbers for GCF were not specifically reported by both, and also not in our own previous work where we observed that IBM Cloud Functions get recycled <a href=\"https:\/\/blog.zhaw.ch\/icclab\/probabilistically-stateful-serverless-web-applications\/\" data-type=\"URL\" data-id=\"https:\/\/blog.zhaw.ch\/icclab\/probabilistically-stateful-serverless-web-applications\/\">after about 10&#8242;<\/a>. In another work (citation currently missing), van Eyk et al. presented a rough estimation about ~6 hours recycling time on GCF, which would be long enough to start codifying it into optimised processing logic.<\/p>\n\n\n\n<p>With our own preliminary observations, we can confirm that. Several invocations with long 60-90&#8242; (and even 240&#8242;) intervals in between led to no reset of the counter. This means that in controlled single tenant environments, like a function exclusively served by a single sensor or by multiple sensors when concurrency can be avoided (e.g. through an ordered queue in front of the function), using global state variables, from simple counters to complex aggregated statistics, is a viable, and highly economical, alternative to using external databases. We anticipate that advanced <a href=\"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/16\/faasification-community-website\/\" data-type=\"post\" data-id=\"1335\">FaaSification<\/a> frameworks allow for simply marking variables to be stateful, and then a code generator takes care of either safely using a backend store or juggling the data between global variables and occasional backend snapshots.<\/p>\n<div class=\"pt-sm\">Schlagw\u00f6rter: <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/continuum\/\">continuum<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/digital-transformation\/\">digital transformation<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/faas\/\">faas<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/googlecloud\/\">googlecloud<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/iot\/\">iot<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/redis\/\">redis<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/sensors\/\">sensors<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/serverless\/\">serverless<\/a><br><\/div>","protected":false},"excerpt":{"rendered":"<p>At Zurich University of Applied Sciences, we are currently building a test track to link applied teaching with research and innovation. Such a facility allows for covering a whole range of topics: programming, autonomous driving, robotics, cloud, serverless, continuums, sensing, open data, data science, and various computing paradigms. We expect a video to be available [&hellip;]<\/p>\n","protected":false},"author":203,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[4],"tags":[131,127,7,165,52,177,54,8],"features":[],"class_list":["post-1343","post","type-post","status-publish","format-standard","hentry","category-research","tag-continuum","tag-digital-transformation","tag-faas","tag-googlecloud","tag-iot","tag-redis","tag-sensors","tag-serverless"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Processing IoT Sensor Data with Semi-Stateful Cloud Functions - Service Prototyping Lab<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Processing IoT Sensor Data with Semi-Stateful Cloud Functions\" \/>\n<meta property=\"og:description\" content=\"At Zurich University of Applied Sciences, we are currently building a test track to link applied teaching with research and innovation. Such a facility allows for covering a whole range of topics: programming, autonomous driving, robotics, cloud, serverless, continuums, sensing, open data, data science, and various computing paradigms. We expect a video to be available [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/\" \/>\n<meta property=\"og:site_name\" content=\"Service Prototyping Lab\" \/>\n<meta property=\"article:published_time\" content=\"2020-10-27T13:45:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/testdriveearlyprototype.png\" \/>\n<meta name=\"author\" content=\"Josef Spillner\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Josef Spillner\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/\"},\"author\":{\"name\":\"Josef Spillner\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/33a5227c6cc1fa3329279d33c3cc440e\"},\"headline\":\"Processing IoT Sensor Data with Semi-Stateful Cloud Functions\",\"datePublished\":\"2020-10-27T13:45:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/\"},\"wordCount\":766,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/testdriveearlyprototype.png\",\"keywords\":[\"continuum\",\"digital transformation\",\"faas\",\"googlecloud\",\"iot\",\"redis\",\"sensors\",\"serverless\"],\"articleSection\":[\"Research\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/\",\"url\":\"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/\",\"name\":\"Processing IoT Sensor Data with Semi-Stateful Cloud Functions - Service Prototyping Lab\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/testdriveearlyprototype.png\",\"datePublished\":\"2020-10-27T13:45:06+00:00\",\"author\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/33a5227c6cc1fa3329279d33c3cc440e\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/#primaryimage\",\"url\":\"https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/testdriveearlyprototype.png\",\"contentUrl\":\"https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/testdriveearlyprototype.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\/\/blog.zhaw.ch\/splab\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Processing IoT Sensor Data with Semi-Stateful Cloud Functions\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#website\",\"url\":\"https:\/\/blog.zhaw.ch\/splab\/\",\"name\":\"Service Prototyping Lab\",\"description\":\"A Blog of the ZHAW Zurich University of Applied Sciences\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.zhaw.ch\/splab\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/33a5227c6cc1fa3329279d33c3cc440e\",\"name\":\"Josef Spillner\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/c57d7019e91373902c08eac230e003cb4f8498ecf68c9d119e9ecb82fdf6c400?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c57d7019e91373902c08eac230e003cb4f8498ecf68c9d119e9ecb82fdf6c400?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c57d7019e91373902c08eac230e003cb4f8498ecf68c9d119e9ecb82fdf6c400?s=96&d=mm&r=g\",\"caption\":\"Josef Spillner\"},\"description\":\"Head of the Service Prototyping Lab. Research on distributed systems and application computing paradigms. Senior lecturer at Zurich University of Applied Sciences.\",\"url\":\"https:\/\/blog.zhaw.ch\/splab\/author\/spio\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Processing IoT Sensor Data with Semi-Stateful Cloud Functions - Service Prototyping Lab","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/","og_locale":"en_GB","og_type":"article","og_title":"Processing IoT Sensor Data with Semi-Stateful Cloud Functions","og_description":"At Zurich University of Applied Sciences, we are currently building a test track to link applied teaching with research and innovation. Such a facility allows for covering a whole range of topics: programming, autonomous driving, robotics, cloud, serverless, continuums, sensing, open data, data science, and various computing paradigms. We expect a video to be available [&hellip;]","og_url":"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/","og_site_name":"Service Prototyping Lab","article_published_time":"2020-10-27T13:45:06+00:00","og_image":[{"url":"https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/testdriveearlyprototype.png","type":"","width":"","height":""}],"author":"Josef Spillner","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Josef Spillner","Estimated reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/#article","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/"},"author":{"name":"Josef Spillner","@id":"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/33a5227c6cc1fa3329279d33c3cc440e"},"headline":"Processing IoT Sensor Data with Semi-Stateful Cloud Functions","datePublished":"2020-10-27T13:45:06+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/"},"wordCount":766,"commentCount":0,"image":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/testdriveearlyprototype.png","keywords":["continuum","digital transformation","faas","googlecloud","iot","redis","sensors","serverless"],"articleSection":["Research"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/","url":"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/","name":"Processing IoT Sensor Data with Semi-Stateful Cloud Functions - Service Prototyping Lab","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/splab\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/#primaryimage"},"image":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/testdriveearlyprototype.png","datePublished":"2020-10-27T13:45:06+00:00","author":{"@id":"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/33a5227c6cc1fa3329279d33c3cc440e"},"breadcrumb":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/#primaryimage","url":"https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/testdriveearlyprototype.png","contentUrl":"https:\/\/blog.zhaw.ch\/splab\/files\/2020\/10\/testdriveearlyprototype.png"},{"@type":"BreadcrumbList","@id":"https:\/\/blog.zhaw.ch\/splab\/2020\/10\/27\/processing-iot-sensor-data-with-semi-stateful-cloud-functions\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/blog.zhaw.ch\/splab\/"},{"@type":"ListItem","position":2,"name":"Processing IoT Sensor Data with Semi-Stateful Cloud Functions"}]},{"@type":"WebSite","@id":"https:\/\/blog.zhaw.ch\/splab\/#website","url":"https:\/\/blog.zhaw.ch\/splab\/","name":"Service Prototyping Lab","description":"A Blog of the ZHAW Zurich University of Applied Sciences","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.zhaw.ch\/splab\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Person","@id":"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/33a5227c6cc1fa3329279d33c3cc440e","name":"Josef Spillner","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/c57d7019e91373902c08eac230e003cb4f8498ecf68c9d119e9ecb82fdf6c400?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c57d7019e91373902c08eac230e003cb4f8498ecf68c9d119e9ecb82fdf6c400?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c57d7019e91373902c08eac230e003cb4f8498ecf68c9d119e9ecb82fdf6c400?s=96&d=mm&r=g","caption":"Josef Spillner"},"description":"Head of the Service Prototyping Lab. Research on distributed systems and application computing paradigms. Senior lecturer at Zurich University of Applied Sciences.","url":"https:\/\/blog.zhaw.ch\/splab\/author\/spio\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/posts\/1343","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/users\/203"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/comments?post=1343"}],"version-history":[{"count":3,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/posts\/1343\/revisions"}],"predecessor-version":[{"id":1349,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/posts\/1343\/revisions\/1349"}],"wp:attachment":[{"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/media?parent=1343"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/categories?post=1343"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/tags?post=1343"},{"taxonomy":"features","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/features?post=1343"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}