{"id":66,"date":"2020-06-05T01:27:37","date_gmt":"2020-06-04T23:27:37","guid":{"rendered":"https:\/\/www.smartlux.com\/232keypro\/?page_id=66"},"modified":"2023-06-08T00:35:07","modified_gmt":"2023-06-07T22:35:07","slug":"scripts","status":"publish","type":"page","link":"https:\/\/www.smartlux.com\/232keypro\/documentation\/scripts\/","title":{"rendered":"Custom C# scripts in 232key Pro"},"content":{"rendered":"<h2>232key Pro data flow<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-98\" src=\"https:\/\/www.smartlux.com\/232keypro\/wp-content\/uploads\/sites\/5\/2020\/06\/232key-Pro-Data-Flow.png\" alt=\"232key Pro Data Flow\" width=\"698\" height=\"410\" srcset=\"https:\/\/www.smartlux.com\/232keypro\/wp-content\/uploads\/sites\/5\/2020\/06\/232key-Pro-Data-Flow.png 698w, https:\/\/www.smartlux.com\/232keypro\/wp-content\/uploads\/sites\/5\/2020\/06\/232key-Pro-Data-Flow-300x176.png 300w\" sizes=\"auto, (max-width: 698px) 100vw, 698px\" \/><\/p>\n<p>232key Pro works with data strings or &#8220;lines of data&#8221;. A line is created every time the <a href=\"https:\/\/www.smartlux.com\/232keypro\/documentation\/#terminator\"><strong>Terminator<\/strong><\/a> character is found in the stream of bytes received from your device (or when no additional bytes have been received for the duration of the <a href=\"https:\/\/www.smartlux.com\/232keypro\/documentation\/#timeout\"><strong>Timeout<\/strong><\/a>, if set).<\/p>\n<p>Next, 232key Pro attempts to match a <a href=\"https:\/\/www.smartlux.com\/232keypro\/documentation\/#regex\">regular expression (regex)<\/a> in each line. The results of this match are made available to your C# script in the <a href=\"#variables\">variables<\/a> described below.<\/p>\n<p>Your script runs every time a match is found. It can transform this data in any way you want using the C# language. At he end of your script, <strong>return<\/strong> a string that 232key should type, e.g:<\/p>\n<pre><code>return <span style=\"color: #ff6600;\">value<\/span>+'<span style=\"color: #ff00ff;\">\\n<\/span>';<\/code><\/pre>\n<p>This is the default script in 232keyPro. It simply takes the <span style=\"color: #ff6600;\"><strong>value<\/strong><\/span> variable (see below) and adds a <span style=\"color: #ff00ff;\">new line character<\/span> (which will be transformed into the ENTER key).<br \/>\n<a id=\"variables\"><\/a><\/p>\n<p class=\"caution\"><strong>Note:<\/strong> The <strong>Encoding<\/strong> set under <strong>Settings &gt; General Settings<\/strong> is used when the bytes received from your device are first converted to a string.<\/p>\n<p><a name=\"variables\"><\/a><\/p>\n<h2>Variables with captured data<\/h2>\n<ul>\n<li style=\"padding-bottom: 1em;\">String\u00a0<strong>value<\/strong>: The string matched by the <a href=\"https:\/\/www.smartlux.com\/232keypro\/documentation\/#regex\">first capturing group of the regex<\/a> (or an empty string if nothing was captured). This string is highlighted in <span style=\"color: #0000ff;\">blue<\/span> in the <strong>Event Log<\/strong>.\u00a0Most tasks can be solved by using the <strong>value<\/strong> string.<\/li>\n<li style=\"list-style-type: none;\">Example with four lines of data sent from a scale when the &#8220;Generic measuring instrument&#8221; device profile has been selected in the <strong>Input<\/strong> tab:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-91\" src=\"https:\/\/www.smartlux.com\/232keypro\/wp-content\/uploads\/sites\/5\/2020\/06\/content-of-first-capturing-group-highlighted-in-event-log.png\" alt=\"content of first capturing group highlighted in event log\" width=\"449\" height=\"53\" srcset=\"https:\/\/www.smartlux.com\/232keypro\/wp-content\/uploads\/sites\/5\/2020\/06\/content-of-first-capturing-group-highlighted-in-event-log.png 449w, https:\/\/www.smartlux.com\/232keypro\/wp-content\/uploads\/sites\/5\/2020\/06\/content-of-first-capturing-group-highlighted-in-event-log-300x35.png 300w\" sizes=\"auto, (max-width: 449px) 100vw, 449px\" \/>The regex associated with this device profile captures the first number it encounters in each line (in this case, the weight, e.g. <span style=\"color: #0000ff;\">\u00a0\u00a0\u00a0\u00a08.738<\/span>). Your script would run once for every line and the <strong>value<\/strong> variable would contain the following values:<\/li>\n<li style=\"list-style-type: none; padding-top: 0;\">\n<ol>\n<li><span style=\"color: #0000ff;\">\u00a0\u00a0\u00a0\u00a08.738<\/span><\/li>\n<li><span style=\"color: #0000ff;\">\u00a0\u00a0\u00a0\u00a08.736<\/span><\/li>\n<li><span style=\"color: #0000ff;\">\u00a0\u00a0\u00a0\u00a08.736<\/span><\/li>\n<li><span style=\"color: #0000ff;\">\u00a0\u00a0\u00a0\u00a08.738<\/span><\/li>\n<\/ol>\n<\/li>\n<\/ul>\n<div class=\"note\">\n<p><strong>Tip:<\/strong> You can use the <a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.string.trim\">C# String.Trim method<\/a> to trim extra white spaces captured by the regex. Example:<\/p>\n<pre><code>return value.Trim()+'\\n';<\/code><\/pre>\n<p>For further formatting, please see <a href=\"#NumberFormatter.Format\">NumberFormatter.Format<\/a>\u00a0below.<\/p>\n<\/div>\n<ul>\n<li style=\"padding-bottom: 1em; padding-top: 1em;\"><a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/api\/system.double\">Double<\/a>? <strong>valueDouble<\/strong>: The <strong>value<\/strong> string described above converted to a <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/api\/system.double\">Double<\/a> or null if the conversion was not successful.<\/li>\n<li style=\"padding-bottom: 1em; padding-top: 1em;\"><a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/api\/system.decimal\">Decimal<\/a>? <strong>valueDecimal<\/strong>: The value string converted to a <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/api\/system.decimal\">Decimal<\/a> or null if the conversion was not successful.<\/li>\n<li style=\"padding-bottom: 1em; padding-top: 1em;\"><a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/api\/system.text.regularexpressions.match\">Match<\/a>\u00a0<strong>firstMatch<\/strong>: The first match of the regex (or null if no match was found). Useful to access multiple capturing groups defined in a custom regular expression: firstMatch.Groups[1].Value corresponds to <strong>value<\/strong> (but can be null), firstMatch.Groups[2].Value is the string matched by the second capturing group, etc.<\/li>\n<li style=\"padding-bottom: 1em;\"><a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/api\/system.text.regularexpressions.regex.matches\">MatchCollection<\/a>\u00a0<strong>allMatches<\/strong>: All matches of the regular expression (or null if no matches were found). Use this when the regex matches more than once (and you want to access all matches).<\/li>\n<\/ul>\n<div class=\"note\">\n<p><strong>Tip:<\/strong> If you&#8217;d rather parse all data in your script instead of dealing with regular expressions, you can set the <strong>Device<\/strong> in the <a href=\"https:\/\/www.smartlux.com\/232keypro\/documentation\/#device-tab\"><strong>Input<\/strong> tab<\/a> to &#8220;<em>Generic text device<\/em>&#8220;. This will use a regex which matches all characters except for line feed and carriage return. If you want those as well, change the regex to &#8220;<span style=\"font-weight: 400;\">([\\s\\S]+)&#8221; (without the quotation marks). All data sent from the connected device will then be available in the <strong>value<\/strong> string.<\/span><\/p>\n<\/div>\n<p>Using the ([\\s\\S]+) regex, the same input as in the example above would look like this in the <strong>Event Log<\/strong>, showing that all data sent by the scale has been matched:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-92\" src=\"https:\/\/www.smartlux.com\/232keypro\/wp-content\/uploads\/sites\/5\/2020\/06\/matching-all-data-sent-from-a-scale.png\" alt=\"matching all data sent from a scale\" width=\"449\" height=\"41\" srcset=\"https:\/\/www.smartlux.com\/232keypro\/wp-content\/uploads\/sites\/5\/2020\/06\/matching-all-data-sent-from-a-scale.png 449w, https:\/\/www.smartlux.com\/232keypro\/wp-content\/uploads\/sites\/5\/2020\/06\/matching-all-data-sent-from-a-scale-300x27.png 300w\" sizes=\"auto, (max-width: 449px) 100vw, 449px\" \/><\/p>\n<h2>Functions<\/h2>\n<p>Other than using regular C# code, you can call the following functions from your script to simplify common tasks.<br \/>\n<a name=\"NumberFormatter.Format\"><\/a><\/p>\n<h3>NumberFormatter.Format &#8211; formats a string as a number<\/h3>\n<p><code>string Format(string capturedString, bool useComma, NumberStyles numberStyles)<\/code><\/p>\n<p>This function trims white spaces and removes leading zeros. The decimal separator can be set to a dot or comma.<\/p>\n<p><strong>Parameters<\/strong><\/p>\n<ul>\n<li><b>capturedString<\/b> String: The string to format as a number (usually the <strong>value<\/strong> variable).<\/li>\n<li><b>useComma<\/b> bool: If true, use a comma as the decimal separator. If false, use a decimal point.<\/li>\n<li><b>numberStyles<\/b> enum <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/api\/system.globalization.numberstyles?view=netframework-4.7.2\"> System.Globalization.NumberStyles<\/a>: Style to use\u00a0for formatting (you&#8217;ll usually want to use NumberStyles.Number)<\/li>\n<\/ul>\n<p><strong>Returns<\/strong><\/p>\n<p><strong>String<\/strong>: Formatted string or original string if number conversion fails.<\/p>\n<h4><strong>Script example<\/strong><\/h4>\n<pre><code>return NumberFormatter.Format(value, true, NumberStyles.Number);<\/code><\/pre>\n<p>Formats captured data as number with a comma as the decimal separator and returns it to 232key Pro for output.<\/p>\n<h2>Constants<\/h2>\n<p>For your convenience, the following constants are available to your script:<\/p>\n<ul>\n<li>ESC: The escape character (&#8216;\\u001b&#8217;). Meant to be used with escape sequences (see examples below).<\/li>\n<\/ul>\n<h2>User variables<\/h2>\n<p>You can define any variable you want in your script*, but the variable will be re-initialized every time the script runs, which is every time a line of data is processed. There&#8217;s currently no way to avoid if we also want to use extremely fast compiled scripts.<\/p>\n<p>To maintain state between script executions, the following arrays with 10 elements are available:<\/p>\n<ul>\n<li>bool[10] Bools<\/li>\n<li>int[10] Ints<\/li>\n<li>double[10] Doubles<\/li>\n<li>string[10] Strings<\/li>\n<li>decimal[10] Decimals<\/li>\n<\/ul>\n<p>The variables are maintained even when the script is stopped and restarted. However, they are lost when the program is closed.<\/p>\n<p><strong>*Note:<\/strong> You cannot use <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/csharp\/language-reference\/keywords\/\">reserved keywords<\/a> or the following names for your own (temporary) variables: allMatches, Bools, Decimals, Doubles, ESC, firstMatch, Ints, match (alias for value), Strings, value.<\/p>\n<h4><strong>Script example<\/strong><\/h4>\n<pre><code>Ints[0]++; \/\/Increase by one\r\nreturn $\"{Ints[0]}: {value}\\n\";<\/code><\/pre>\n<p><strong>Note:<\/strong> The dollar sign ($) is not typed, it means that the string literal following it may contain <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/csharp\/language-reference\/tokens\/interpolated\">{interpolated expressions}<\/a>. Instead, you could also write:<\/p>\n<pre><code>return Ints[0]+\": \" +value+'\\n';<\/code><\/pre>\n<p><strong>Example output from a weighing scale:<\/strong><\/p>\n<pre>1:       8.234\r\n2:       2.686\r\n3:      26.740<\/pre>\n<p class=\"note\"><strong>Tip:<\/strong> Wondering where the blank spaces in the output are coming from? Except for the one we&#8217;ve explicitly added, they were already present in the <strong>value<\/strong> variable as the regex defined for this device had captured them.<\/p>\n<p><a name=\"datetime\"><\/a><\/p>\n<h2>Adding the date and time<\/h2>\n<p>You can easily add the current date and time using <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/api\/system.datetime.tostring\">DateTime.Now.ToString()<\/a>. A comprehensive <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/standard\/base-types\/custom-date-and-time-format-strings\">list of format specifiers can be found here<\/a>.<\/p>\n<p class=\"note\"><strong>Note:<\/strong> 232key Pro uses the invariant culture.<\/p>\n<h4><strong>Script example<\/strong><\/h4>\n<pre><code>return $\"{DateTime.Now.ToString(\"yyyy-mm-dd\")}\\t\"\r\n+$\"{DateTime.Now.ToString(\"HH:mm:ss\")}\\t{value}\";<\/code><\/pre>\n<p>Types the current date (+TAB) and the current time (+TAB) ahead of the content of the value variable and then presses the ENTER key.<\/p>\n<p class=\"note\"><strong>Note:<\/strong> The string is broken up into two lines for readability. You could also write the expression in one line:<\/p>\n<pre style=\"font-size: small;\"><code>return $\"{DateTime.Now.ToString(\"yyyy-mm-dd\")}\\t{DateTime.Now.ToString(\"HH:mm:ss\")}\\t{value}\";<\/code><\/pre>\n<p><strong>Example output from a weighing scale<\/strong><\/p>\n<pre><span class=\"value info\"><span class=\"\">022-26-07 13:26:35 123.45 <\/span><\/span><\/pre>\n<p><a name=\"gidei\"><\/a><\/p>\n<h2>Adding characters<\/h2>\n<p>There are currently two ways to add characters which 232key Pro will then convert to keyboard events.<\/p>\n<h3>Using the default output settings<\/h3>\n<p>A keyboard event is created for each character in the string returned from your script. The Unicode flag is set for all characters with the exception of tab (\\t) and line feed (\\n, translated to the ENTER key), which means that you don&#8217;t have to worry about keyboard layouts and modifiers.<\/p>\n<h4><strong>Script example<\/strong><\/h4>\n<pre><code>return $\"\u4e2d\u9593\u503c: {value}\\n\";<\/code><\/pre>\n<p>Types &#8220;\u4e2d\u9593\u503c: &#8221; (average) in front of the content of the value variable and then presses the ENTER key.<\/p>\n<p><strong>Example output from a weighing scale<\/strong><\/p>\n<pre><span class=\"value info\"><span class=\"\">\u4e2d\u9593\u503c:\u00a0 \u00a0 \u00a0 \u00a08.738<\/span><\/span><\/pre>\n<p><a name=\"gidei\"><\/a><\/p>\n<h3>Using GIDEI<\/h3>\n<p>To type non-alphanumeric keys and key combinations, set the <strong>Output Method<\/strong> in the <strong>Settings<\/strong> tab to <strong>GIDEI<\/strong> and use one of the GIDEI escape sequences described below.<\/p>\n<p>The <a href=\"#nonalpha\">keys listed below<\/a> are currently supported.<\/p>\n<p class=\"note\"><strong>Note:<\/strong> Outside of GIDEI escape sequences, all characters are supported just like in the default output mode! We recommend using GIDEI aliases only for non-printable keys and key combinations.<\/p>\n<p>Detailed information on GIDEI (also implemented as Windows SerialKeys up to XP) <a href=\"https:\/\/park.org\/Guests\/Trace\/pavilion\/gideidoc.htm\">can be found in this document<\/a>.<\/p>\n<p class=\"caution\">GIDEI support in 232key is currently incomplete and has to be considered experimental.<\/p>\n<h4>Individual keys<\/h4>\n<p>Start the escape sequence with the ESC character (ASCII 27), followed by one <a href=\"#nonalpha\">key name<\/a> and a period (ASCII 46). White spaces are optional:<br \/>\n<code>ESC Keyname .<\/code><\/p>\n<h4>GIDEI script example with multiple individual keys<\/h4>\n<pre><code>return $\"<span style=\"color: #ff6600;\">{ESC}delete.<\/span>{value}<span style=\"color: #ff00ff;\">{ESC}tab.<\/span><span style=\"color: #3366ff;\">{ESC}tab.<\/span><span style=\"color: #ff0000;\">{ESC}enter.<\/span>\";<\/code><\/pre>\n<p>Presses the DEL key ahead of the content of the <strong>value<\/strong> variable, then TAB twice and finally ENTER. Each GIDEI escape sequence is shown in a different color.<\/p>\n<h4>Key combinations<\/h4>\n<p>232key currently supports the <strong>combine<\/strong> command to create key combinations.<\/p>\n<p>A key combination consists of the escape character (ASCII 27), the <strong>combine<\/strong> command and the <a href=\"#nonalpha\">key names<\/a>, separated by commas. It ends with a period (ASCII 46):<br \/>\n<code>ESC , combine [ , Keyname1 ] [ , Keyname2 ] [, Keyname3 ] [ , etc] .<\/code><\/p>\n<h4>GIDEI script example with key combinations<\/h4>\n<pre><code>return $\"<span style=\"color: #ff6600;\">{ESC}, combine, control, f.<\/span>{value}\";<\/code><\/pre>\n<p>Presses <span style=\"color: #ff6600;\">Ctrl + F<\/span> and then types the content of the <strong>value<\/strong> variable.<br \/>\n<a id=\"nonalpha\"><\/a><\/p>\n<h4>Currently supported GIDEI key names<\/h4>\n<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\">\n<tbody>\n<tr>\n<th>GIDEI Key Name<\/th>\n<th>Description<\/th>\n<\/tr>\n<tr>\n<td>0&#8230;9<\/td>\n<td>Keys 0 to 9<\/td>\n<\/tr>\n<tr>\n<td>A&#8230;Z<\/td>\n<td>Keys A to Z<\/td>\n<\/tr>\n<tr>\n<td>alt<\/td>\n<td>ALT key<\/td>\n<\/tr>\n<tr>\n<td>altgr<\/td>\n<td>Right ALT key<\/td>\n<\/tr>\n<tr>\n<td>backspace<br \/>\nbspace<\/td>\n<td>BACKSPACE key<\/td>\n<\/tr>\n<tr>\n<td>capslock<\/td>\n<td>CAPS LOCK key<\/td>\n<\/tr>\n<tr>\n<td>control<br \/>\nctrl<\/td>\n<td>Left CONTROL key<\/td>\n<\/tr>\n<tr>\n<td>enter<\/td>\n<td>ENTER key<\/td>\n<\/tr>\n<tr>\n<td>f1\u2026f24<\/td>\n<td>F1\u2026F24 function keys<\/td>\n<\/tr>\n<tr>\n<td>del<br \/>\ndelete<\/td>\n<td>DEL key<\/td>\n<\/tr>\n<tr>\n<td>divide<\/td>\n<td>Numpad DIVIDE key (\/)<\/td>\n<\/tr>\n<tr>\n<td>down<\/td>\n<td>DOWN ARROW key<\/td>\n<\/tr>\n<tr>\n<td>end<\/td>\n<td>END key<\/td>\n<\/tr>\n<tr>\n<td>escape<\/td>\n<td>ESC key<\/td>\n<\/tr>\n<tr>\n<td>home<\/td>\n<td>HOME key<\/td>\n<\/tr>\n<tr>\n<td>ins<br \/>\ninsert<\/td>\n<td>INSERT key<\/td>\n<\/tr>\n<tr>\n<td>kp*<br \/>\nkpstar<\/td>\n<td>Numpad MULTIPLY key (*)<\/td>\n<\/tr>\n<tr>\n<td>kp+<br \/>\nkpplus<\/td>\n<td>Numpad ADD key (+)<\/td>\n<\/tr>\n<tr>\n<td>kp-<br \/>\nkpminus<\/td>\n<td>Numpad SUBTRACT key (-)<\/td>\n<\/tr>\n<tr>\n<td>kp\/<br \/>\nkpdivide<br \/>\nkpslash<\/td>\n<td>Numpad DIVIDE key (\/)<\/td>\n<\/tr>\n<tr>\n<td>kp0&#8230;kp9<\/td>\n<td>Numpad 0 to 9 keys<\/td>\n<\/tr>\n<tr>\n<td>kpdp<\/td>\n<td>Numpad DECIMAL POINT key<\/td>\n<\/tr>\n<tr>\n<td>lcontrol<br \/>\nlctrl<\/td>\n<td>Left CONTROL key<br \/>\n(same as control)<\/td>\n<\/tr>\n<tr>\n<td>left<\/td>\n<td>LEFT ARROW key<\/td>\n<\/tr>\n<tr>\n<td>lshift<\/td>\n<td>Left SHIFT key<\/td>\n<\/tr>\n<tr>\n<td>menu<\/td>\n<td>ALT key<br \/>\n(same as alt)<\/td>\n<\/tr>\n<tr>\n<td>next<\/td>\n<td>PAGE DOWN key<\/td>\n<\/tr>\n<tr>\n<td>numlock<\/td>\n<td>Numpad NUM LOCK key<\/td>\n<\/tr>\n<tr>\n<td>prior<\/td>\n<td>PAGE UP key<\/td>\n<\/tr>\n<tr>\n<td>rcontrol<br \/>\nrctrl<\/td>\n<td>Right CONTROL key<\/td>\n<\/tr>\n<tr>\n<td>return<\/td>\n<td>ENTER key<br \/>\n(same as enter)<\/td>\n<\/tr>\n<tr>\n<td>right<\/td>\n<td>RIGHT ARROW key<\/td>\n<\/tr>\n<tr>\n<td>rshift<\/td>\n<td>Right SHIFT key<\/td>\n<\/tr>\n<tr>\n<td>tab<\/td>\n<td>TAB key<\/td>\n<\/tr>\n<tr>\n<td>up<\/td>\n<td>UP ARROW key<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>232key Pro data flow 232key Pro works with data strings or &#8220;lines of data&#8221;. A line is created every time the Terminator character is found in the stream of bytes received from your device (or when no additional bytes have been received for the duration of the Timeout, if set). Next, 232key Pro attempts to &hellip; <a href=\"https:\/\/www.smartlux.com\/232keypro\/documentation\/scripts\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Custom C# scripts in 232key Pro<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":54,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_seopress_titles_title":"","_seopress_titles_desc":"Use your own C# script to process the data sent from a connected device (e.g. a scale or barcode reader) in any way you want.","_seopress_robots_index":"","_seopress_robots_follow":"","_seopress_robots_imageindex":"","_seopress_robots_snippet":"","_seopress_robots_primary_cat":"","_seopress_robots_breadcrumbs":"","_seopress_robots_freeze_modified_date":"","_seopress_robots_custom_modified_date":"","_seopress_robots_canonical":"","_seopress_social_fb_title":"","_seopress_social_fb_desc":"","_seopress_social_fb_img":"","_seopress_social_fb_img_attachment_id":0,"_seopress_social_fb_img_width":0,"_seopress_social_fb_img_height":0,"_seopress_social_twitter_title":"","_seopress_social_twitter_desc":"","_seopress_social_twitter_img":"","_seopress_social_twitter_img_attachment_id":0,"_seopress_social_twitter_img_width":0,"_seopress_social_twitter_img_height":0,"_seopress_redirections_value":"","_seopress_redirections_enabled":"","_seopress_redirections_enabled_regex":"","_seopress_redirections_logged_status":"both","_seopress_redirections_param":"","_seopress_redirections_type":301,"_seopress_analysis_target_kw":"","_seopress_news_disabled":"","_seopress_video_disabled":"","_seopress_video":[],"_seopress_pro_schemas_manual":[{"_seopress_pro_rich_snippets_type":"none"}],"_seopress_pro_rich_snippets_disable_all":"","_seopress_pro_rich_snippets_disable":[],"_seopress_pro_schemas":[],"footnotes":""},"class_list":["post-66","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.smartlux.com\/232keypro\/wp-json\/wp\/v2\/pages\/66","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.smartlux.com\/232keypro\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.smartlux.com\/232keypro\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.smartlux.com\/232keypro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.smartlux.com\/232keypro\/wp-json\/wp\/v2\/comments?post=66"}],"version-history":[{"count":39,"href":"https:\/\/www.smartlux.com\/232keypro\/wp-json\/wp\/v2\/pages\/66\/revisions"}],"predecessor-version":[{"id":362,"href":"https:\/\/www.smartlux.com\/232keypro\/wp-json\/wp\/v2\/pages\/66\/revisions\/362"}],"up":[{"embeddable":true,"href":"https:\/\/www.smartlux.com\/232keypro\/wp-json\/wp\/v2\/pages\/54"}],"wp:attachment":[{"href":"https:\/\/www.smartlux.com\/232keypro\/wp-json\/wp\/v2\/media?parent=66"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}