DEV Community: Mathieu Lory The latest articles on DEV Community by Mathieu Lory (@mathcoll). https://dev.to/mathcoll https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F682021%2Ff4e98aca-45cb-46d7-bfa5-063d90593721.png DEV Community: Mathieu Lory https://dev.to/mathcoll en Combining OpenAI and AI-Flex (from t6 IoT) to Customize Sensor Outputs Mathieu Lory Mon, 18 Nov 2024 18:00:00 +0000 https://dev.to/mathcoll/combining-openai-and-ai-flex-from-t6-iot-to-customize-sensor-outputs-36jc https://dev.to/mathcoll/combining-openai-and-ai-flex-from-t6-iot-to-customize-sensor-outputs-36jc <p>AI-Flex is a game-changing feature within the t6 IoT platform, enabling users to enhance sensor data processing by integrating OpenAI’s advanced language understanding capabilities. Designed to work seamlessly with t6 IoT's ability to collect various sensor measurements (e.g., integers, booleans, floats, and text-based inputs), AI-Flex empowers users to refine, enrich, and add context to raw data for smarter workflows.</p> <h2> Example Use Case: Refining Text-Based Measurements </h2> <p>Text-based sensor outputs often need to be cleaned or standardized for effective use. For instance:</p> <ul> <li>Input: She no went to the market.</li> <li>Output: She did not go to the market.</li> </ul> <p>AI-Flex processes such text through OpenAI, using predefined prompts to return a clear, grammatically correct version. This refined text can then substitute the original data and feed directly into subsequent workflow actions.</p> <h2> Supporting All Measurement Types </h2> <p>AI-Flex doesn’t stop at text. Its integration within t6 IoT’s Rule Engine enables automation and intelligent processing for other data types:</p> <ul> <li>Integers/Floats: Add AI-generated interpretations or context (e.g., "Temperature: 25°C" becomes "Temperature is optimal for plant growth.").</li> <li>Booleans: Combine binary data with AI-driven messages (e.g., "Status: True" becomes "Device is active.").</li> <li>Text: Standardize and enhance language-based inputs for seamless automation.</li> </ul> <h2> Workflow in t6 IoT </h2> <ol> <li> <strong>Input Collection</strong>: Sensor data is gathered in t6 IoT.</li> <li> <strong>AI Processing</strong>: AI-Flex uses OpenAI to process, interpret, or refine the data.</li> <li> <strong>Substitution</strong>: AI-generated responses replace the raw input, enriching it with context or clarity.</li> <li> <strong>Automation</strong>: The refined data triggers customized actions, such as notifications, device activations, or MQTT topic publications.</li> </ol> <h2> Benefits for t6 IoT Users </h2> <ul> <li> <strong>Data Enrichment</strong>: Turn raw sensor data into actionable insights.</li> <li> <strong>Workflow Flexibility</strong>: Tailor OpenAI’s capabilities to suit different sensor types and scenarios.</li> <li> <strong>Enhanced Automation</strong>: Improve decision-making and response accuracy across IoT systems.</li> </ul> <p>With <a href="proxy.php?url=https://www.internetcollaboratif.info/features/ai-flex/" rel="noopener noreferrer">AI-Flex, t6 IoT users can go beyond basic automation</a>, leveraging advanced AI to transform and contextualize sensor measurements for smarter, more dynamic workflows.</p> sensors iot ai openai Implementing Classification with t6 IoT and Machine Learning Mathieu Lory Fri, 19 Apr 2024 11:35:00 +0000 https://dev.to/mathcoll/implementing-classification-with-t6-iot-and-machine-learning-1l2a https://dev.to/mathcoll/implementing-classification-with-t6-iot-and-machine-learning-1l2a <p>Learn how to leverage the machine learning capabilities of the t6 IoT platform to classify data into positive and negative classes, enabling you to make informed decisions and extract valuable insights from your IoT applications.</p> <p>In this tutorial, we will explore how to utilize the machine-learning features of the t6 IoT platform to classify data into positive and negative classes. By harnessing the power of machine-learning algorithms, you can make accurate predictions and gain valuable insights from your IoT data.</p> <p>Follow these steps to classify integers as “Positive” or “Negative” using the t6 IoT machine-learning process:</p> <ol> <li>Data Collection and Integration</li> <li>Customization and Model Configuration</li> <li>Training and Evaluation</li> <li>Predict Class using the model</li> </ol> <p><a href="proxy.php?url=https://www.internetcollaboratif.info/post/implementing-classification-with-t6-iot-and-machine-learning/">Read the full article</a> with detailed Api endpoints.</p> <p>For further information and support, refer to our <a href="proxy.php?url=https://doc.internetcollaboratif.info/#api-Models">Technical documentation</a>.</p> machinelearning iot Enhancing IoT connectivity by introducing Sensor Failure Detection Mathieu Lory Tue, 02 Jan 2024 20:22:00 +0000 https://dev.to/mathcoll/enhancing-iot-connectivity-by-introducing-sensor-failure-detection-hld https://dev.to/mathcoll/enhancing-iot-connectivity-by-introducing-sensor-failure-detection-hld <p>In the ever-evolving landscape of IoT, where uninterrupted connectivity is paramount, <a href="proxy.php?url=https://www.internetcollaboratif.info/features/">t6 IoT</a> unveils a cutting-edge feature — sensor failure detection with enhanced monitoring capabilities. This latest enhancement adds a layer of intelligence to your IoT ecosystem. Whether in agriculture, smart cities, industrial settings, or beyond, <a href="proxy.php?url=https://www.internetcollaboratif.info/features/">t6</a>'s vigilant detection system stands ready to identify disruptions when sensors fail to transmit critical data.</p> <h2> How It Works </h2> <p>In an era where IoT applications are becoming increasingly critical, <a href="proxy.php?url=https://www.internetcollaboratif.info/features/">t6</a> reaffirms its commitment to empowering users with robust tools for efficient, reliable, and uninterrupted connectivity. The sensor failure detection feature is a testament to this commitment, ensuring that users have the tools needed to navigate the complexities of connected systems with confidence.</p> <p><a href="proxy.php?url=https://www.internetcollaboratif.info/features/">t6</a>’s sensor failure detection feature employs a systematic approach to monitor incoming sensor data. When a disruption is detected—whether due to technical glitches, device malfunctions, or unforeseen issues—the system promptly recognizes these lapses. While not operating in real-time, this methodical approach ensures users receive timely alerts, allowing for proactive issue resolution.</p> <p>Powered by custom Flows parameters, <a href="proxy.php?url=https://www.internetcollaboratif.info/features/">t6</a> monitors the incoming sensor data and identifies any gaps in the stream. Whether due to technical glitches, device malfunctions, or other unforeseen issues, the system swiftly recognizes these lapses, triggering immediate notifications (push notifications).</p> <h2> Use Case: Smart City Traffic Management </h2> <p>In the context of a smart city, where urban mobility is a critical aspect of daily life, <a href="proxy.php?url=https://www.internetcollaboratif.info/features/">t6</a>’s sensor failure detection feature plays a pivotal role in ensuring efficient traffic management.</p> <p>Detecting Disruptions<br> Imagine a network of sensors strategically placed throughout the city to monitor traffic flow, analyze congestion patterns, and optimize signal timings. In this bustling urban environment, disruptions in data transmission can lead to suboptimal traffic management, impacting commuters and city operations.</p> <p>Benefits for Smart Cities:</p> <ul> <li>Proactive Traffic Management: With timely alerts on sensor failures, city authorities can proactively address potential traffic issues, optimizing signal timings and rerouting traffic to prevent congestion.</li> <li>Enhanced Urban Mobility: Uninterrupted connectivity ensures that the smart city’s traffic management system operates at peak efficiency, facilitating smoother urban mobility for residents and commuters.</li> </ul> <p>In the bustling context of a smart city, t6’s sensor failure detection feature emerges as a vital tool for ensuring the smooth operation of traffic management systems. This strategic application showcases the adaptability and reliability of t6 in diverse IoT scenarios, emphasizing its role in fortifying the backbone of connected systems. Explore the potential of sensor failure detection — an indispensable asset for smart cities navigating the complexities of urban mobility.</p> sensor iot failuredetection Enhance Location-Based Capabilities with Geofencing in t6 IoT Platform Mathieu Lory Sat, 15 Jul 2023 18:59:35 +0000 https://dev.to/mathcoll/enhance-location-based-capabilities-with-geofencing-in-t6-iot-platform-1lbf https://dev.to/mathcoll/enhance-location-based-capabilities-with-geofencing-in-t6-iot-platform-1lbf <p>Geofencing, a powerful feature within the t6 IoT platform, empowers businesses to take location-based automation to new heights. By creating virtual boundaries and triggering actions based on users' proximity to specific geographic areas, geofencing opens up a realm of possibilities for streamlining operations, optimizing resource allocation, and delivering personalized services.</p> <p>Whether you're looking to improve security, automate processes, or deliver customized experiences, geofencing provides a versatile solution for a wide range of industries and use cases.</p> <p>Let's embark on this journey and learn how to <a href="proxy.php?url=https://www.internetcollaboratif.info/post/enhance-location-based-capabilities-with-geofencing-in-t6-io-t-platform/?utm_source=article&amp;utm_medium=devto&amp;utm_campaign=article_link&amp;utm_term=geofencing">leverage geofencing to revolutionize your IoT</a> applications.</p> <p><a href="proxy.php?url=https://api.internetcollaboratif.info/?utm_source=article&amp;utm_medium=devto&amp;utm_campaign=article_link&amp;utm_term=geofencing">t6 is an IoT plateform</a> dedicated to data.</p> webdev javascript iot Predictive Maintenance with t6 IoT Platform and Temperature Sensors Mathieu Lory Sun, 09 Jul 2023 12:52:01 +0000 https://dev.to/mathcoll/predictive-maintenance-with-t6-iot-platform-and-temperature-sensors-14ei https://dev.to/mathcoll/predictive-maintenance-with-t6-iot-platform-and-temperature-sensors-14ei <p>Predictive maintenance is a proactive maintenance approach that utilizes data analysis and machine learning techniques to anticipate equipment failures before they occur. By monitoring and analyzing sensor data, such as temperature readings, predictive maintenance aims to detect early warning signs of anomalies or degradation in equipment performance.</p> <p>This enables timely maintenance actions, minimizing unplanned downtime, optimizing maintenance schedules, and reducing costs. In this way, predictive maintenance helps businesses enhance operational efficiency, extend asset lifespan, and improve overall productivity.</p> <p>t6 IoT platform is now capable of <a href="proxy.php?url=https://www.internetcollaboratif.info/post/implementing-predictive-maintenance-with-t6-iot-platform-and-temperature-sensors/?utm_source=article&amp;utm_medium=devto&amp;utm_campaign=article_link&amp;utm_term=machine-learning">predict equipment failure based on custom AI Models</a>.<br> I've written a recipe on how to implement such data prediction using t6 IoT.</p> <p>This new feature is developped as beta version on t6. Please send me any feedbacks.</p> javascript programming machinelearning tutorial Several options to authenticate to t6 IoT platform Mathieu Lory Fri, 30 Sep 2022 19:46:42 +0000 https://dev.to/mathcoll/several-options-to-authenticate-to-t6-iot-platform-cb9 https://dev.to/mathcoll/several-options-to-authenticate-to-t6-iot-platform-cb9 <p>The purpose of authentication is to make sure the users are valid and the identity is known on t6 platform. This authentication process on t6 IoT can be done using multiple ways depending on the use-case.</p> <h2> HTTP Basic Authentication </h2> <p>HTTP Basic Authentication can only be used in the Web Sockets use case. This process expect a socket connection to t6 using an extra Autorization Header with the base64 encoded credentials as value. Credentials is a base64 string made from user-Api-Key : user-Api-Secret</p> <p>e.g.:<br> <code>Authorization: Basic dXNlci1hcGkta2V5OnVzZXItYXBpLXNlY3JldA==</code></p> <h2> JWT Bearer Authentication </h2> <p>t6 follows JWT basic concept so that Clients are claiming who they are using a server signed Jwt. t6 allows multiple process to generate such Jwt tokens. Each Jwt token last 5 minutes before expiration and a refresh token mechanizme is also available within a 24 hours period of time.</p> <p>By providing a valid username + password<br> This process is the common password grant_type and require the user to sign in by providing his username (email address) and password. Once the identification on t6 server is done and successful, a Jwt token is forged and sent back to the user. Then, on every next call from that user (before token expires), the client should sent that Jwt token on the headers to claims who the requester is. t6 server will reject malformed or non valid signature Jwt token. Only t6 server can sign the token with the valid signature.</p> <p><em>Please note username and password are sent from the client to t6 using SSL.</em></p> <p>e.g.:<br> <code>Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImVtYWlsQGludmFsaWQtZG9tYWluLmludmFsaWQiLCJmaXJzdE5hbWUiOiJmaXJzdE5hbWUiLCJpZCI6IjM1ZjA1NDc5LWI5MiIsImxhc3ROYW1lIjoibGFzdE5hbWUiLCJsb2NhdGlvbiI6eyJnZW8iOnt9LCJpcCI6IiJ9LCJtYWlsX2hhc2giOiJjYWZlMWZhKioqKioqKioqKio5NDY1OWQ1NzNiIiwicGFzc3dvcmRMYXN0VXBkYXRlZCI6IjE0ODMxKioqKioqOTMiLCJyZW1pbmRlck1haWwiOjE0ODU4MDAwMDAwMDksInJvbGUiOiJ1c2VyIiwic3Vic2NyaXB0aW9uX2RhdGUiOiIxNDYwMDAwMDA2MTkzIiwidW5zdWJzY3JpcHRpb25fdG9rZW4iOiJqZ1pjdHV5UE1LZkN5T01idlNkVmlOSWtWdUNLRW5NRUN5T01DeU9NYmJNYmtPUENSQlhwSGdDeU9NYnhoQ3lPTWJrRnhCbHVMY2hqeFhWUGJoTSIsIm5ld3NsZXR0ZXIiOjE2MzYwMDAwMDAyMTYsInVuc3Vic2NyaXB0aW9uIjp7Im5ld3NsZXR0ZXIiOiIxMDAwMDAwMzU1MzMyIiwiY2hhbmdlUGFzc3dvcmQiOiIxNTcwMDAwMDAzNTk1IiwicmVtaW5kZXIiOiIxMDAwMDAwMzY1Nzc3In0sInVwZGF0ZV9kYXRlIjoiMTU0MDEwMDAwMDA2NiIsInB1c2hTdWJzY3JpcHRpb24iOnt9LCJzdWJzY3JpcHRpb24iOnsiY2hhbmdlUGFzc3dvcmQiOm51bGwsIm5ld3NsZXR0ZXIiOm51bGwsIm1vbnRobHlyZXBvcnQiOm51bGwsInJlbWluZGVyIjpudWxsfSwidG9rZW5fdHlwZSI6IkJlYXJlciIsInNjb3BlIjoiQXBwbGljYXRpb24iLCJzdWIiOiIvdXNlcnMvMzVmMDU0NzktYjkyIiwiaXNzIjoiIiwiaWF0IjoxNjY0NTYyODQwLCJleHAiOjE2NjQ1NjMxNDB9.Cszy91AEzr2udkwLXHZ0adWTvNi5uht9Dia74FGpA3k</code></p> <h2> By providing a valid user-Api-Key + user-Api-Secret on the POST payload </h2> <p>t6 provide a dedicated endpoint to generate Key+Secret Tokens. Those tokens allows to define a custom memo so that you can remember where you are using the Key+Secret credentials. Additionally, you can customize the duration (1 day, 1 week, 1 month or 1 year).</p> <p>Key+Secret can also be revoked in case you don’t need them anymore or when you needs credential to become invalid (for security purpose for instance).</p> <p>POSTing Key+Secret credentials to t6 Authenticate process will also forge a regular Jwt Token with the same attributes as the other processes.</p> <p><em>Beta : Key+Secret credentials can also be sent directly on the X-headers specifically on the datapoint.</em></p> <h2> Refresh a Jwt Token </h2> <p>Whatever the identification process, t6 will send back a Jwt Token as well as a refresh token. Both are having their own expiration (5 min for Jwt and 24 hours for refresh_token). This Refresh Token can be used to get a fresh Jwt Token.</p> <p>More info about t6 IoT platform : <br> <a href="proxy.php?url=https://www.internetcollaboratif.info/">https://www.internetcollaboratif.info/</a></p> t6 iot authentication jwt t6 IoT Sockets connection Mathieu Lory Mon, 19 Sep 2022 19:17:39 +0000 https://dev.to/mathcoll/t6-iot-sockets-connection-59e9 https://dev.to/mathcoll/t6-iot-sockets-connection-59e9 <p>A socket programming interface to connect physical Objects with t6 IoT platform and using a bi-directional communication.</p> <h2> How to use Sockets with t6 IoT? </h2> <p>Sockets is an early stage t6 feature made to connect easily Arduino Objects with t6. The idea is to have a minimal code-base on the Arduino device as generic as possible and interface that Object using simple Socket connectivity.</p> <p>t6 implement a Socket server. Any Client can connect to it using its own t6 credentials (a Basic Authorization header made from base64 encoded key:secret).</p> <p>The Client must then claim the Object using the specific command:</p> <blockquote> <p>{"command": "claimObject", "object_id": "aaaaaaaa-aaaa-4bbb-8888-aaaaaaaaaaaa"}</p> </blockquote> <p><em>Note: The claimed Object must be owned by the User Account from the Basic Authorization.</em></p> <p>Multiple commands can be sent to Socket from any authenticated Client:</p> <ul> <li> <strong>broadcast</strong>: to cast a message to any connected Object from your user account.</li> <li> <strong>unicast</strong>: to cast a message to a specif Object you own.</li> <li> <strong>claimObject</strong>: to Claim the id of a specific Object.</li> <li> <strong>getObject</strong>: to get the id of an Object claimed to server.</li> <li> <strong>getUser</strong>: to get the user_id of an Object claimed to server.</li> <li> <strong>getUA</strong>: to get the user-agent of an Object. help: to get an help message with all of the commands.</li> </ul> <h2> Using Sockets with preprocessor and Rule Engine </h2> <p>Of course Sockets on t6 IoT can be triggered from a Decision Rule during Datapoint creation. The prerequisite is the Object to use Arduino with the sample code</p> <p>The datapoint should stick to the following styntax including a payload on the text node Payload node need to contains an arduinoCommand to specify to command on the Arduino Object. arduinoCommand is one of the following :</p> <ul> <li>analogWrite</li> <li>digitalWrite</li> <li>analogRead</li> <li>digitalRead</li> <li>getPinMode</li> <li>setPinMode</li> </ul> <p>E.g: please note the value attribute containing a variable. It will be transformed with the t6 preprocessor dring the ingestion process.</p> <p><code>[<br> {<br> "value": "1\n",<br> "flow_id": "{{$randomUUID}}",<br> "text": {<br> "command": "unicast",<br> "object_id": "aaaaaaaa-aaaa-4bbb-8888-aaaaaaaaaaaa",<br> "payload": {<br> "arduinoCommand": "digitalWrite",<br> "pin": "2",<br> "value": "{value}"<br> }<br> },<br> "save": false,<br> "unit": "",<br> "mqtt_topic": "",<br> "publish": true,<br> "object_id": "aaaaaaaa-aaaa-4bbb-8888-aaaaaaaaaaaa",<br> "datatype_id": "e7dbdc23-5fa8-4083-b3ec-bb99c08a2a35"<br> }<br> ]</code></p> <h2> Socket messages to single or several Arduino devices </h2> <p>This is possible to send the same message simultaneously to multiple Arduino Objects or to specify a single Object as target message. In order to send a command, you’d need to use object_ids from the same t6 User Account and claim them to Socket using the above procedure.</p> <p>On the Socket payload, the command unicast will send the message to a single Object using the attribute object_id.</p> <p>E.g:<br> <code>{<br> "command": "unicast",<br> "object_id": "aaaaaaaa-aaaa-4bbb-8888-aaaaaaaaaaaa",<br> "payload": {<br> "arduinoCommand": "digitalWrite",<br> "pin": "2",<br> "value": "0"<br> }<br> }</code></p> <p>Obviously, the command broadcast (that does not require any object_id) will send the message to any Object connected to Socket and claimed from the same User Account. The arduinoCommand digitalWrite will be received on all of these devices simultaneously.</p> <p>E.g:<br> <code>{<br> "command": "broadcast",<br> "payload": {<br> "arduinoCommand": "digitalWrite",<br> "pin": "2",<br> "value": "0"<br> }<br> }</code></p> <p>The Arduino example code is available at <a href="proxy.php?url=https://github.com/mathcoll/t6iot/blob/master/examples/nodeMCU-websockets-client/nodeMCU-websockets-client.ino">https://github.com/mathcoll/t6iot/blob/master/examples/nodeMCU-websockets-client/nodeMCU-websockets-client.ino</a></p> javascript iot beginners programming How to use t6-Iot image preprocessor to trigger action based on image facial expression recognition Mathieu Lory Sun, 24 Jul 2022 18:44:37 +0000 https://dev.to/mathcoll/how-to-use-t6-iot-image-preprocessor-to-trigger-action-based-on-image-facial-expression-recognition-m0e https://dev.to/mathcoll/how-to-use-t6-iot-image-preprocessor-to-trigger-action-based-on-image-facial-expression-recognition-m0e <p>In this recipe, the goal is to trigger an Email action after t6-IoT detect a human facial expression from a provided image.</p> <h2> Check prerequisites </h2> <p>In this recipe, we’ll use the following concepts:</p> <ul> <li>an <a href="proxy.php?url=https://www.internetcollaboratif.info/features/data-acquisition-preprocessor/">aidc Preprocessor</a> to identify the facial expression (Automatic identification and data capture)</li> <li>a <a href="proxy.php?url=https://www.internetcollaboratif.info/features/flow/">Flow</a> to store specific measurements</li> <li>a <a href="proxy.php?url=https://www.internetcollaboratif.info/features/decision-rule/">Rule</a> to trigger an email after the facial expression is identified on the image</li> <li>We’ll also set <a href="proxy.php?url=https://www.internetcollaboratif.info/features/data-types/">datatype as a String</a> so that the Flow will contains the facial expression</li> </ul> <h2> Setup the Flow container </h2> <p>This step is straight forward and does not require anything special. We’ll customize this Flow with a <a href="proxy.php?url=https://www.internetcollaboratif.info/features/data-types/">String datatype</a>.</p> <p>So, the first step is to create this Flow using the following payload. To have more details on Flows, read the <a href="proxy.php?url=https://doc.internetcollaboratif.info/#api-Flow-Create_new_Flow">technical documentation</a>.</p> <p><code>{<br> "name": "My AIDC Flow to identify facial expression from images",<br> "data_type": "a394e18f-12bd-4c22-b9c3-74c387d1a8db",<br> "preprocessor": [<br> {<br> "name": "aidc",<br> "mode": "faceExpressionRecognition"<br> }<br> ]<br> }</code></p> <p>Once your Flow is created, take note of the flow.data.id on the Api results. This value will be used on datapoints creation as the referring variable <code>{{$flow_id}}</code>.</p> <p>Create the Rule that will trigger the Email<br> <code>{<br> "name": "Trigger an email when aidc identify a sad facial expression",<br> "rule": {<br> "conditions": {<br> "all": [<br> {<br> "fact": "flow",<br> "operator": "equal",<br> "value": "65e2ca88-adf1-431b-a2f4-82497f54f32f"<br> },<br> {<br> "fact": "value",<br> "operator": "equal",<br> "value": "sad"<br> }<br> ]<br> },<br> "event": {<br> "type": "email",<br> "params": {<br> "to": "{{[email protected]}}",<br> "subject": "Facial recognition on t6 Flow {flow}",<br> "text": "Facial recognition on t6 Flow {value}",<br> "html": "&lt;h1&gt;Hello&lt;/h1&gt;Facial recognition on t6 Flow&lt;br /&gt;Value: {value}"<br> }<br> },<br> "priority": 1<br> },<br> "active": true<br> }</code><br> Need more details on Rules? read the <a href="proxy.php?url=https://doc.internetcollaboratif.info/#api-Rule-Create_new_Rule">technical documentation</a>.</p> <h2> Let’s put it all together, post image datapoint </h2> <p>Before posting the <a href="proxy.php?url=https://doc.internetcollaboratif.info/#api-DataPoint_Measure-Create_a_DataPoint">datapoint</a>, you’ll need to make sure the payload contains a valid base64 image encoded string. You can use an <a href="proxy.php?url=https://doc.internetcollaboratif.info/#api-DataPoint_Measure-Create_a_DataPoint">online service</a> to do that.</p> <p><code>{<br> "save": false,<br> "publish": true,<br> "flow_id": "{{$flow_id}}",<br> "mqtt_topic": "image-test-processing",<br> "preprocessor": [<br> {<br> "name": "aidc",<br> "mode": "faceExpressionRecognition"<br> }<br> ],<br> "value": "/9j/4AAQSkZJRgABAQEASABIAAD/4QCwRXhpZgAASUkqAAgAAAAFABoBBQABAAAASgAAABsBBQABAAAAUgAAACgBAwABAAAAAgAAADEBAgAMAAAAWgAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAAR0lNUCAyLjguMjAABQAAkAcABAAAADAyMjAAoAcABAAAADAxMDABoAMAAQAAAP//AAACoAQAAQAAAJABAAADoAQAAQAAACwBAAAAAAAA/+EC/mh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSfvu78nIGlkPSdXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQnPz4KPHg6eG1wbWV0YSB4bWxuczp4PSdhZG9iZTpuczptZXRhLyc+CjxyZGY6UkRGIHhtbG5zOnJkZj0naHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyc+CgogPHJkZjpEZXNjcmlwdGlvbiB4bWxuczpleGlmPSdodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyc+CiAgPGV4aWY6WFJlc29sdXRpb24+NzI8L2V4aWY6WFJlc29sdXRpb24+CiAgPGV4aWY6WVJlc29sdXRpb24+NzI8L2V4aWY6WVJlc29sdXRpb24+CiAgPGV4aWY6UmVzb2x1dGlvblVuaXQ+SW5jaDwvZXhpZjpSZXNvbHV0aW9uVW5pdD4KICA8ZXhpZjpTb2Z0d2FyZT5Hb29nbGU8L2V4aWY6U29mdHdhcmU+CiAgPGV4aWY6RXhpZlZlcnNpb24+RXhpZiBWZXJzaW9uIDIuMjwvZXhpZjpFeGlmVmVyc2lvbj4KICA8ZXhpZjpGbGFzaFBpeFZlcnNpb24+Rmxhc2hQaXggVmVyc2lvbiAxLjA8L2V4aWY6Rmxhc2hQaXhWZXJzaW9uPgogIDxleGlmOkNvbG9yU3BhY2U+VW5jYWxpYnJhdGVkPC9leGlmOkNvbG9yU3BhY2U+CiAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjk2MDwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjcyMDwvZXhpZjpQaXhlbFlEaW1lbnNpb24+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"<br> }</code></p> <p>And voilà, you’ll notice the Api results will transform the initial value into a String value telling about the recognized expression found in the image. Additionally, the preprocessor is having a specific expressions node in the result providing with the full expressions scores. The Rule identified and use that value to trigger the Email as notification.</p> <p><code>"value": "sad",<br> "preprocessor": [<br> {<br> "name": "aidc",<br> "mode": "faceExpressionRecognition",<br> "initialValue": "1658669719797000000-faceExpressionRecognition.png",<br> "status": "completed",<br> "expressions": {<br> "neutral": 9.418351254453228e-8,<br> "happy": 1.1365385715889076e-10,<br> "sad": 0.9999997615814209,<br> "angry": 7.31789351338108e-10,<br> "fearful": 1.6018465487377398e-7,<br> "disgusted": 8.681204626687089e-13,<br> "surprised": 6.788646977895496e-9<br> },<br> "recognizedValue": "sad",<br> "expressionValue": 0.9999997615814209<br> },<br> ],</code></p> <p>To have more details on Datapoints, read the <a href="proxy.php?url=https://doc.internetcollaboratif.info/#api-DataPoint_Measure-Create_a_DataPoint">technical documentation</a>.</p> tutorial iot How to control the value of a Datapoint using t6 ? Mathieu Lory Sun, 17 Jul 2022 16:22:06 +0000 https://dev.to/mathcoll/how-to-control-the-value-of-a-datapoint-using-t6--l6b https://dev.to/mathcoll/how-to-control-the-value-of-a-datapoint-using-t6--l6b <p>This recipe will help you to figure out how <a href="proxy.php?url=https://api.internetcollaboratif.info">t6 transformation preprocessor</a> should be implemented and how you can use it.</p> <h2> Check prerequisites </h2> <p>t6 require a Flow to store specific measurements. To use this recipe you’d first need to create a Flow like the following example. Feel free to review the <a href="proxy.php?url=https://doc.internetcollaboratif.info/#api-Flow-Create_new_Flow">technical documentation</a> for details.</p> <p><code>{<br> "name": "My Flow that contains only floats normalized values",<br> "data_type": "e7dbdc23-5fa8-4083-b3ec-bb99c08a2a35",<br> "require_signed": false,<br> "require_encrypted": false,<br> "retention": "retention1w",<br> "preprocessor": [<br> {<br> "name": "transform",<br> "mode": "replace",<br> "pattern": "(,)",<br> "replacer": "."<br> },<br> {<br> "name": "sanitize",<br> "datatype": "float"<br> }<br> ]<br> }</code><br> Basically, this Flow is setting the datatype as a Float, and 2 preprocessors will fire before saving datapoint to the Flow:</p> <ul> <li>The first transformation will simply substitute coma with a dot</li> <li>The second one will sanitize the value from a string to a Float type</li> </ul> <p>Once your Flow created (that will contains your measurements), take note of the flow.data.id on the Api results. This value will be used on datapoints creation as the referring variable <code>{{$flow_id}}</code>.</p> <h2> Create datapoints </h2> <p>Here we are going to post datapoints as string with a non-normalized value (we’ll use a coma instead of a dot for decimals).<br> </p> <p><code>{<br> "value": "100,456798",<br> "flow_id": "{{$flow_id}}",<br> "save": true,<br> "publish": true<br> }</code><br> </p> <p>And voilà, you’ll notice the Api results will transform the initial value into a Float using a correct Float value.</p> <p>The preprocessor array in the result shows all the values along the preprocessor computation.<br> There is a double sanitization to Float as the latest one is forced by t6 on any datapoint posted ; we would have removed the sanitize preprocessor on the Flow creation above with exactly the same result.<br> </p> <p><code>"value": 100.456798,<br> "preprocessor": [<br> {<br> "name": "transform",<br> "mode": "replace",<br> "pattern": "(,)",<br> "replacer": ".",<br> "initialValue": "100,456798",<br> "transformedValue": "100.456798",<br> "message": "Transformed to replace.",<br> "status": "completed"<br> },<br> {<br> "name": "sanitize",<br> "datatype": "float",<br> "initialValue": "100.456798",<br> "message": "Converted to float.",<br> "status": "completed"<br> },<br> {<br> "name": "sanitize",<br> "datatype": "float",<br> "initialValue": "100.456798",<br> "message": "Converted to float.",<br> "status": "completed"<br> }<br> ],</code><br> </p> <p>To have more details on Datapoints, read the technical documentation.</p> <p><a href="proxy.php?url=https://api.internetcollaboratif.info">t6 is an IoT plateform</a> dedicated to data.</p> javascript tutorial iot beginners How to trigger a fail2ban action to t6 ? Mathieu Lory Sun, 17 Jul 2022 10:17:28 +0000 https://dev.to/mathcoll/how-to-trigger-a-fail2ban-action-to-t6--o84 https://dev.to/mathcoll/how-to-trigger-a-fail2ban-action-to-t6--o84 <p>This recipe get you introduced to <a href="proxy.php?url=https://www.internetcollaboratif.info">t6-iot</a> and a fail2ban custom script that collect t6 datapoints from fail2ban jail.</p> <blockquote> <p>Considering t6 and fail2ban are already installed and running ; all you need to do is to create the flow container on t6 and then customize the fail2ban jail &amp; action.</p> </blockquote> <h2> Create a specific Flow on t6 </h2> <p>Edit the following file:</p> <blockquote> <p>vi /home/user/fail2ban2t6.sh<br> And add the content from the <a href="proxy.php?url=https://github.com/mathcoll/t6/blob/master/etc/fail2ban/action.d/fail2ban2t6.sh">template</a>.</p> </blockquote> <p>Please note you might need to edit line 13 of this file according to the directory containing the file.</p> <p>Then, you’d need to create the config file from the <a href="proxy.php?url=https://github.com/mathcoll/t6/blob/master/etc/fail2ban/action.d/fail2ban2t6.secret.conf">template</a>.<br> And finally, edit this secret file according to your own settings:</p> <blockquote> <p>vi /home/user/fail2ban2t6.secret.conf</p> </blockquote> <h2> Set the fail2ban jail </h2> <p>Edit the file so that action contains fail2ban2t6 e.g.:</p> <blockquote> <p>vi /etc/fail2ban/jail.local</p> </blockquote> <p><code>[apache-404]<br> enabled = true<br> filter = apache-404<br> logpath = /var/log/t6-error.log<br> /var/log/t6-access.log<br> maxretry = 4<br> findtime = 300<br> bantime = 86400<br> banaction = iptables-allports<br> action=iptables-allports<br> fail2ban2t6<br> port = smtp,465,submission,imap,imaps,pop3,pop3s,http,https</code></p> <h2> Create the action script </h2> <p>Create the file on your server from the <a href="proxy.php?url=https://github.com/mathcoll/t6/blob/master/etc/fail2ban/action.d/fail2ban2t6.conf">template</a></p> <blockquote> <p>/etc/fail2ban/action.d/fail2ban2t6.conf</p> </blockquote> <h2> Check all and restart fail2ban </h2> <p>Usually, this can be done using the following root command:</p> <blockquote> <p>sudo systemctl restart fail2ban</p> </blockquote> <p>And then, each time an IP address is found on apache-404 jail, it will be sent as a datapoint into t6 Flow.</p> javascript beginners t6 tutorial Automatic Data Classification on t6 IoT Mathieu Lory Wed, 13 Apr 2022 18:55:47 +0000 https://dev.to/mathcoll/automatic-data-classification-on-t6-iot-3l9m https://dev.to/mathcoll/automatic-data-classification-on-t6-iot-3l9m <p>Data classification is using an multi-class annotation tool embedded on <a href="proxy.php?url=https://api.internetcollaboratif.info">t6 IoT</a>. The concept is to assign a category to any Datapoints based on Rules.</p> <h2> Benefits on setting t6 for your Data Annotation &amp; Classification </h2> <p>Using t6 <a href="proxy.php?url=https://www.internetcollaboratif.info/features/decision-rule/">Decision Rule</a> maximize and ease the annotation process. This implies :</p> <ul> <li>a fast process on annotating datapoints ;</li> <li>an automatic identification based on Rules without any human requirement (after setting up the rules) ;</li> <li>a reliable and robust identification, whatever the number of datapoint, this annotation will defined the correct Classification from your rules.</li> </ul> <h2> t6 data annotation </h2> <p>t6 preprocessor is flexible and allow any of the following classification types:</p> <h3> Binary Classification </h3> <p>The Classification is having only 2 possible options (2 classes). This can be used on identifying email spam detection (the Classification is either “spam” or “not spam”, and can’t be both at the same time, or any other variation).</p> <h3> Multi-Class Classification </h3> <p>A Multi-Class Classification on the opposite is allowing to have more than 2 classes in the Classification. For instance it can be used to identify either the datapoint is “Walking”, “Running”, “Flying” OR “Swimming”.</p> <h3> Multi-Annotation (or Multi-Label) Classification </h3> <p>This third type is the more flexible and allows the datapoint to relate to multi Binary or Multi-Class Classifications. Hence, it combine multiple Classes together.</p> <h2> Automate classification on measurements </h2> <h3> Identify classes </h3> <p>This step is crucial as it will define the whole classification on your measurement. Identifying classes require a full knowledge of the business behind data and measurements. Thus became business focus. That is the reason why we have set t6 to trust human and business owners on this task.</p> <h3> Define criteria - rules </h3> <p><a href="proxy.php?url=https://www.internetcollaboratif.info/features/decision-rule/">Decision Rule</a> requires basic criteria combination to fully handle the automation. As t6 is Multi-Annotation Classification, having multiple Rules on the same Measured datapoint is feasible. Hence, we can easily and automatically setup several annotations to the same measured just by using multiple Rules distinctively.</p> <h3> Setup a Decision Rule that will trigger the annotation </h3> <p>The idea behind those trigger is very simple :</p> <ul> <li>first you’d need to have a <a href="proxy.php?url=https://www.internetcollaboratif.info/features/flow/">Flow</a> that will contains the Datapoints measured as Facts;</li> <li>and a Category to be used in the Classification;</li> </ul> <p>Then, the combination of the criteria is defined by Conditions matching operators from Decision Rule. And finally, the Action trigger should be “annotate” including an additional category_id on its event parameters.</p> <p>Hence, each time the datapoints will match the condition(s), then annotation process will take other and attribute the Category according to the Rule parameter. And voila.</p> <p>More details about <a href="proxy.php?url=https://api.internetcollaboratif.info">t6 IoT</a></p> classification datascience annotation labelling Data Annotation and labellisation on t6 IoT framework Mathieu Lory Mon, 15 Nov 2021 21:35:14 +0000 https://dev.to/mathcoll/data-annotation-and-labellisation-on-t6-iot-framework-26dd https://dev.to/mathcoll/data-annotation-and-labellisation-on-t6-iot-framework-26dd <p>Data classification and annotation is a new implemented module on the t6 Api. This new process provides annotation on any datapoints and/or range of datapoints with ease. Annotation on t6 is the process of classifying datapoints — with a customizable category.</p> <p>The following 2 modes are available:</p> <ul> <li>Hand labeling for a strong and accurate supervision;</li> <li>Programmatic labeling for a weak supervision. This automatic process is using the t6 Rules, and so, it can combine multiple criteria before annotating to the correct category.</li> </ul> <h2> Categories for labeling </h2> <p>Labellisation on t6 implement custom categories (tags). t6 Users can customize several categories on their account.</p> <blockquote> <p>e.g.: Say that you are measuring a speed (m/s) on a specific t6 Flow; on each datapoints added, a t6 rule can trigger an annotation (using categories “slow”, “fast”) and using the speed as criteria and that can label that datapoint.</p> </blockquote> <p>This process using Rules is weak as it involve a programmatic pattern to identify the category.</p> <p>An alternative process — hand-annotation can be used in parallel to associate categories to datapoints. This association can use a single datapoint or a range of dates.</p> <h2> Why are we using labellisation on t6 ? A smooth startpoint to progress on the data-first approach. </h2> <p>Labellisation is the initial step to craft AI on t6 platform. As Data is centric on t6, the team expect this new feature to become a real north star and bring new opportunities to the users.</p> <h2> Api documentation — further reading: </h2> <ul> <li><a href="proxy.php?url=https://doc.internetcollaboratif.info/#api-11._Classification">Technical Doc</a></li> <li><a href="proxy.php?url=https://bit.ly/30ovN6M">Functionnal Wiki Doc</a></li> <li><a href="proxy.php?url=https://github.com/mathcoll/t6/wiki/Data-Acquisition">Additional documentation about Data-Acquisition Preprocessor &amp; Data Fusion</a></li> </ul> iot datascience saas javascript