为 ESP 8266 生成代码(Telegram 机器人中的声音传感器)¶
该演示介绍了一个模型的开发过程
Engee 处理来自声音传感器的信号,然后通过 Telegram-bot 生成用于控制 ESP 8266 微控制器的代码。
本示例旨在通过Engee建模,然后生成适用于家庭自动化和物联网的简单算法的代码。目标设备是一个带有嵌入式 WiFi 模块的微控制器,将通过 Telegram 机器人进行控制,Telegram 机器人也由 Engee 模型提供。Telegram 机器人将从控制器接收传感器位置的声级,并使用移动平均法进行平均。
本例中使用的目标设备是一块 NodeMCU v1.0 调试板,在 ESP8266 微控制器上安装了 ESP12E WiFi 模块。设备输入的模拟信号来自 LM393 芯片上的声音传感器。传感器由微控制器供电。本示例的设备连接图如下所示。
微控制器通过 USB 端口进行编程,程序被载入闪存。为进一步操作,控制器和传感器由电源装置供电。
用户草图的编译和控制器的编程通过 Arduino IDE 2.3.2 进行。为了与NodeMCU v1.0 (ESP-12E)配合使用,Arduino IDE还提供了一个基于ESP 8266芯片的电路板库,该库来自ESP8266社区。
Telegram 机器人 "ESP_test"(@EngeeESPTestBot)是作为控制控制器的用户界面而创建的。要进一步使用该机器人,您需要它的 HTTP API 访问令牌(创建机器人时生成)和用户 Chat ID。
在使用的机器人中配置了两个命令: /hi
- 输出文本信息,/sound
- 输出平均音量。
创建 Telegram 机器人和获取用户 Chat ID 的过程都很琐碎,可以公开获取,本示例中不予考虑。
需要注意的是,本例中处理 Telegram 机器人传入信息的用户代码只使用了一个指定用户的 ID。要访问处理来自任何用户的命令,应更改机器人的接收消息处理功能。
控制器的控制算法在 Engee 模型中重现。其结构如下图所示。
在这里,程序块MovingAverage
和AverageDiv
计算 10 个信号值的移动平均值。与控制器外围的交互由程序块C Function
执行:
*AnalogInput
- 从模拟输入端接收音频电平信号;
*ToSerial
- 初始化串行端口并向其传输平均声级值;
*TelegramBot
- 初始化 Telegram-bot,检查接收到的信息;
*WiFiConnect
- 建立 WiFi 连接。
用户聊天 IDMyChatID
被传输到TelegramBot
块的输入端,而WiFiConnect
的输入端--连接等待时间ResponseTime
,在 WiFi 信号较弱的情况下应增加连接等待时间。
任何可用库都可用于 Telegram-bot 的工作。本例中使用的是 C++ 库 FastBot。
为了连接到 WiFi 网络,在程序块WiFiConnect
中使用了宏WIFI_SSID
,WIFI_PASS
- WiFi 网络的 SSID 和密码值,这些值将在用户草图中进一步定义。
区块C Function
中代码运行算法的详细说明见区块注释。
为了模拟移动平均算法,还在AnalogInput
模块的输出端生成了一个介于 8 和 10 之间的随机输出值。让我们通过加载和执行组装好的模型来检查算法性能。
让我们绘制模拟信号(生成的随机值)和移动平均计算结果的曲线图。
要将代码上传到 ESP 8266,必须首先从开发的模型中生成代码。
[ Info: Generated code and artifacts: /user/start/examples/codegen/esp8266_tg_sound_detect/esp8266_tg_sound_detect_code
在指定目录下生成的文件将连接到用户草图esp8266_tg_sound_detect.ino
中。此外,我们还将在草图中定义宏、变量和接收信息处理功能,连接库并初始化 Telegram-bot。下载这些文件并使用 Arduino IDE 将其加载到 ESP8266 中。
成功编译自定义草图并将代码加载到控制器后,可在 Arduino IDE 端口监视器中观察到以下输出:
向 Telegram 机器人发送包含指定命令的信息时,可以观察到以下机器人响应:
从程序结果可以看出,Engee 模型中定义的算法在目标设备上得以重现。
在本演示中,我们介绍了创建 Engee 模型的过程,该模型支持与控制器外围设备(模拟输入、串行端口和 WiFi 模块)配合使用。该模型还实现了:声音传感器模拟信号的处理、Telegram-bot 的配置和监控。
{"id": "52b7eb56-1926-4fb7-83fc-1bbce68a155c", "data": [{"showlegend": true, "mode": "lines", "xaxis": "x", "colorbar": {"title": {"text": ""}}, "name": "Сигнал от датчика", "zmin": null, "yaxis": "y", "legendgroup": "Сигнал от датчика", "zmax": null, "line": {"color": "rgba(0, 154, 250, 1.000)", "shape": "linear", "dash": "solid", "width": 2}, "y": [10, 10, 8, 8, 10, 10, 8, 8, 8, 8, 8, 8, 9, 9, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 8, 8, 9, 9, 8, 8, 8, 8, 8, 8, 10, 10, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 9, 9, 10, 10, 8, 8, 8, 8, 8, 8, 8, 8, 10, 10, 8, 8, 9, 9, 10, 10, 9, 9, 8, 8, 10, 10, 8, 8, 8, 8, 9, 9, 10, 10, 8, 8, 8, 8, 10, 10, 10, 10, 9, 9, 9, 9, 8, 8, 10, 10, 9, 9, 8, 8, 9, 9, 8, 8, 9, 9, 9, 9, 8, 8, 9, 9, 8, 8, 8, 8, 10, 10, 8, 8, 9, 9, 8, 8, 9, 9, 9, 9, 9, 9, 8, 8, 10, 10, 10, 10, 9, 9, 8, 8, 9, 9, 10, 10, 9, 9, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 10, 10, 9, 9, 8, 8, 10, 10, 9, 9, 8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 9, 9, 8, 8, 9, 9, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 9, 9, 10, 10, 9, 9, 9, 9, 8, 8, 8, 8, 10, 10, 9, 9, 10, 10, 10, 10, 8, 8, 9, 9, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 8, 8, 8, 8, 10, 10, 10, 10, 8, 8, 9, 9, 8, 8, 9, 9, 10, 10, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 8, 8, 10, 10, 9, 9, 8, 8, 10, 10, 9, 9, 10, 10, 10, 10, 8, 8, 10, 10, 10, 10, 10, 10, 8, 8, 9, 9, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 8, 8, 9, 9, 9, 9, 10, 10, 8, 8, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 8, 8, 9, 9, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 10, 10, 8, 8, 9, 9, 10, 10, 9, 9, 8, 8, 8, 8, 8, 8, 9, 9, 8, 8, 8, 8, 10], "type": "scatter", "x": [0, 0.01, 0.01, 0.02, 0.02, 0.03, 0.03, 0.04, 0.04, 0.05, 0.05, 0.06, 0.06, 0.07, 0.07, 0.08, 0.08, 0.09, 0.09, 0.1, 0.1, 0.11, 0.11, 0.12, 0.12, 0.13, 0.13, 0.14, 0.14, 0.15, 0.15, 0.16, 0.16, 0.17, 0.17, 0.18, 0.18, 0.19, 0.19, 0.2, 0.2, 0.21, 0.21, 0.22, 0.22, 0.23, 0.23, 0.24, 0.24, 0.25, 0.25, 0.26, 0.26, 0.27, 0.27, 0.28, 0.28, 0.29, 0.29, 0.3, 0.3, 0.31, 0.31, 0.32, 0.32, 0.33, 0.33, 0.34, 0.34, 0.35, 0.35, 0.36, 0.36, 0.37, 0.37, 0.38, 0.38, 0.39, 0.39, 0.4, 0.4, 0.41, 0.41, 0.42, 0.42, 0.43, 0.43, 0.44, 0.44, 0.45, 0.45, 0.46, 0.46, 0.47, 0.47, 0.48, 0.48, 0.49, 0.49, 0.5, 0.5, 0.51, 0.51, 0.52, 0.52, 0.53, 0.53, 0.54, 0.54, 0.55, 0.55, 0.56, 0.56, 0.57, 0.57, 0.58, 0.58, 0.59, 0.59, 0.6, 0.6, 0.61, 0.61, 0.62, 0.62, 0.63, 0.63, 0.64, 0.64, 0.65, 0.65, 0.66, 0.66, 0.67, 0.67, 0.68, 0.68, 0.69, 0.69, 0.7, 0.7, 0.71, 0.71, 0.72, 0.72, 0.73, 0.73, 0.74, 0.74, 0.75, 0.75, 0.76, 0.76, 0.77, 0.77, 0.78, 0.78, 0.79, 0.79, 0.8, 0.8, 0.81, 0.81, 0.82, 0.82, 0.83, 0.83, 0.84, 0.84, 0.85, 0.85, 0.86, 0.86, 0.87, 0.87, 0.88, 0.88, 0.89, 0.89, 0.9, 0.9, 0.91, 0.91, 0.92, 0.92, 0.93, 0.93, 0.94, 0.94, 0.95, 0.95, 0.96, 0.96, 0.97, 0.97, 0.98, 0.98, 0.99, 0.99, 1, 1, 1.01, 1.01, 1.02, 1.02, 1.03, 1.03, 1.04, 1.04, 1.05, 1.05, 1.06, 1.06, 1.07, 1.07, 1.08, 1.08, 1.09, 1.09, 1.1, 1.1, 1.11, 1.11, 1.12, 1.12, 1.13, 1.13, 1.14, 1.14, 1.15, 1.15, 1.16, 1.16, 1.17, 1.17, 1.18, 1.18, 1.19, 1.19, 1.2, 1.2, 1.21, 1.21, 1.22, 1.22, 1.23, 1.23, 1.24, 1.24, 1.25, 1.25, 1.26, 1.26, 1.27, 1.27, 1.28, 1.28, 1.29, 1.29, 1.3, 1.3, 1.31, 1.31, 1.32, 1.32, 1.33, 1.33, 1.34, 1.34, 1.35, 1.35, 1.36, 1.36, 1.37, 1.37, 1.38, 1.38, 1.39, 1.39, 1.4, 1.4, 1.41, 1.41, 1.42, 1.42, 1.43, 1.43, 1.44, 1.44, 1.45, 1.45, 1.46, 1.46, 1.47, 1.47, 1.48, 1.48, 1.49, 1.49, 1.5, 1.5, 1.51, 1.51, 1.52, 1.52, 1.53, 1.53, 1.54, 1.54, 1.55, 1.55, 1.56, 1.56, 1.57, 1.57, 1.58, 1.58, 1.59, 1.59, 1.6, 1.6, 1.61, 1.61, 1.62, 1.62, 1.63, 1.63, 1.64, 1.64, 1.65, 1.65, 1.66, 1.66, 1.67, 1.67, 1.68, 1.68, 1.69, 1.69, 1.7, 1.7, 1.71, 1.71, 1.72, 1.72, 1.73, 1.73, 1.74, 1.74, 1.75, 1.75, 1.76, 1.76, 1.77, 1.77, 1.78, 1.78, 1.79, 1.79, 1.8, 1.8, 1.81, 1.81, 1.82, 1.82, 1.83, 1.83, 1.84, 1.84, 1.85, 1.85, 1.86, 1.86, 1.87, 1.87, 1.88, 1.88, 1.89, 1.89, 1.9, 1.9, 1.91, 1.91, 1.92, 1.92, 1.93, 1.93, 1.94, 1.94, 1.95, 1.95, 1.96, 1.96, 1.97, 1.97, 1.98, 1.98, 1.99, 1.99, 2, 2], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 401, "currentCount": 401}}}, {"showlegend": true, "mode": "lines", "xaxis": "x", "colorbar": {"title": {"text": ""}}, "name": "Усредненный сигнал", "zmin": null, "yaxis": "y", "legendgroup": "Усредненный сигнал", "zmax": null, "line": {"color": "rgba(227, 111, 71, 1.000)", "shape": "linear", "dash": "solid", "width": 2}, "y": [0, 0, 0.8, 0.8, 1.7, 1.7, 2.5, 2.5, 3.4, 3.4, 4.4, 4.4, 5.2, 5.2, 6, 6, 6.8, 6.8, 7.7, 7.7, 8.5, 8.5, 8.6, 8.6, 8.6, 8.6, 8.8, 8.8, 8.9, 8.9, 8.9, 8.9, 9, 9, 9.1, 9.1, 9.2, 9.2, 9.2, 9.2, 9.4, 9.4, 9.4, 9.4, 9.5, 9.5, 9.5, 9.5, 9.3, 9.3, 9.2, 9.2, 9.1, 9.1, 9.2, 9.2, 9.1, 9.1, 9.2, 9.2, 9.2, 9.2, 9.1, 9.1, 8.9, 8.9, 8.8, 8.8, 9, 9, 9.1, 9.1, 9.1, 9.1, 9, 9, 9, 9, 9, 9, 8.9, 8.9, 8.9, 8.9, 9, 9, 9.1, 9.1, 9.1, 9.1, 9, 9, 9.2, 9.2, 9.1, 9.1, 9.1, 9.1, 9.1, 9.1, 9, 9, 9.1, 9.1, 9.1, 9.1, 9.1, 9.1, 9.1, 9.1, 9.1, 9.1, 8.9, 8.9, 9.1, 9.1, 9.1, 9.1, 9, 9, 9.1, 9.1, 9.2, 9.2, 9.3, 9.3, 9.2, 9.2, 9.1, 9.1, 9.2, 9.2, 9.3, 9.3, 9.1, 9.1, 9.2, 9.2, 9.1, 9.1, 9.2, 9.2, 9.1, 9.1, 9, 9, 9.1, 9.1, 9, 9, 8.9, 8.9, 9, 9, 9.1, 9.1, 9.2, 9.2, 9.2, 9.2, 9.1, 9.1, 9, 9, 9.1, 9.1, 9, 9, 9, 9, 9.1, 9.1, 9.1, 9.1, 9.1, 9.1, 9.1, 9.1, 9.3, 9.3, 9.4, 9.4, 9.6, 9.6, 9.6, 9.6, 9.6, 9.6, 9.7, 9.7, 9.6, 9.6, 9.4, 9.4, 9.3, 9.3, 9.1, 9.1, 9, 9, 8.9, 8.9, 8.9, 8.9, 8.9, 8.9, 9, 9, 9, 9, 9, 9, 9, 9, 9.1, 9.1, 9.3, 9.3, 9.4, 9.4, 9.5, 9.5, 9.5, 9.5, 9.4, 9.4, 9.4, 9.4, 9.4, 9.4, 9.5, 9.5, 9.5, 9.5, 9.6, 9.6, 9.4, 9.4, 9.2, 9.2, 9, 9, 8.9, 8.9, 8.9, 8.9, 8.8, 8.8, 8.7, 8.7, 8.6, 8.6, 8.8, 8.8, 8.8, 8.8, 8.8, 8.8, 8.8, 8.8, 8.9, 8.9, 8.9, 8.9, 9, 9, 8.9, 8.9, 9.1, 9.1, 9.2, 9.2, 9.2, 9.2, 9.2, 9.2, 9.2, 9.2, 9.4, 9.4, 9.4, 9.4, 9.3, 9.3, 9.2, 9.2, 9.4, 9.4, 9.2, 9.2, 9.1, 9.1, 8.9, 8.9, 8.7, 8.7, 8.9, 8.9, 8.7, 8.7, 8.8, 8.8, 9, 9, 8.9, 8.9, 8.7, 8.7, 8.9, 8.9, 8.8, 8.8, 9, 9, 9, 9, 8.8, 8.8, 8.8, 8.8, 8.7, 8.7, 8.6, 8.6, 8.7, 8.7, 8.9, 8.9, 8.8, 8.8, 8.8, 8.8, 8.6, 8.6, 8.8, 8.8, 8.9, 8.9, 9.1, 9.1, 9.1, 9.1, 9.2, 9.2, 9.1, 9.1, 9, 9, 9.1, 9.1, 9.3, 9.3, 9.3, 9.3, 9.2, 9.2, 9.3, 9.3, 9.1, 9.1, 9.2, 9.2, 9.1, 9.1, 9.3, 9.3, 9.3, 9.3, 9.3, 9.3, 9.2, 9.2, 9.4, 9.4, 9.4, 9.4, 9.4, 9.4, 9.6, 9.6, 9.5, 9.5, 9.6, 9.6, 9.6, 9.6, 9.6, 9.6, 9.4, 9.4, 9.3, 9.3, 9.3, 9.3, 9.2, 9.2, 9.1, 9.1, 9, 9, 8.9], "type": "scatter", "x": [0, 0.01, 0.01, 0.02, 0.02, 0.03, 0.03, 0.04, 0.04, 0.05, 0.05, 0.06, 0.06, 0.07, 0.07, 0.08, 0.08, 0.09, 0.09, 0.1, 0.1, 0.11, 0.11, 0.12, 0.12, 0.13, 0.13, 0.14, 0.14, 0.15, 0.15, 0.16, 0.16, 0.17, 0.17, 0.18, 0.18, 0.19, 0.19, 0.2, 0.2, 0.21, 0.21, 0.22, 0.22, 0.23, 0.23, 0.24, 0.24, 0.25, 0.25, 0.26, 0.26, 0.27, 0.27, 0.28, 0.28, 0.29, 0.29, 0.3, 0.3, 0.31, 0.31, 0.32, 0.32, 0.33, 0.33, 0.34, 0.34, 0.35, 0.35, 0.36, 0.36, 0.37, 0.37, 0.38, 0.38, 0.39, 0.39, 0.4, 0.4, 0.41, 0.41, 0.42, 0.42, 0.43, 0.43, 0.44, 0.44, 0.45, 0.45, 0.46, 0.46, 0.47, 0.47, 0.48, 0.48, 0.49, 0.49, 0.5, 0.5, 0.51, 0.51, 0.52, 0.52, 0.53, 0.53, 0.54, 0.54, 0.55, 0.55, 0.56, 0.56, 0.57, 0.57, 0.58, 0.58, 0.59, 0.59, 0.6, 0.6, 0.61, 0.61, 0.62, 0.62, 0.63, 0.63, 0.64, 0.64, 0.65, 0.65, 0.66, 0.66, 0.67, 0.67, 0.68, 0.68, 0.69, 0.69, 0.7, 0.7, 0.71, 0.71, 0.72, 0.72, 0.73, 0.73, 0.74, 0.74, 0.75, 0.75, 0.76, 0.76, 0.77, 0.77, 0.78, 0.78, 0.79, 0.79, 0.8, 0.8, 0.81, 0.81, 0.82, 0.82, 0.83, 0.83, 0.84, 0.84, 0.85, 0.85, 0.86, 0.86, 0.87, 0.87, 0.88, 0.88, 0.89, 0.89, 0.9, 0.9, 0.91, 0.91, 0.92, 0.92, 0.93, 0.93, 0.94, 0.94, 0.95, 0.95, 0.96, 0.96, 0.97, 0.97, 0.98, 0.98, 0.99, 0.99, 1, 1, 1.01, 1.01, 1.02, 1.02, 1.03, 1.03, 1.04, 1.04, 1.05, 1.05, 1.06, 1.06, 1.07, 1.07, 1.08, 1.08, 1.09, 1.09, 1.1, 1.1, 1.11, 1.11, 1.12, 1.12, 1.13, 1.13, 1.14, 1.14, 1.15, 1.15, 1.16, 1.16, 1.17, 1.17, 1.18, 1.18, 1.19, 1.19, 1.2, 1.2, 1.21, 1.21, 1.22, 1.22, 1.23, 1.23, 1.24, 1.24, 1.25, 1.25, 1.26, 1.26, 1.27, 1.27, 1.28, 1.28, 1.29, 1.29, 1.3, 1.3, 1.31, 1.31, 1.32, 1.32, 1.33, 1.33, 1.34, 1.34, 1.35, 1.35, 1.36, 1.36, 1.37, 1.37, 1.38, 1.38, 1.39, 1.39, 1.4, 1.4, 1.41, 1.41, 1.42, 1.42, 1.43, 1.43, 1.44, 1.44, 1.45, 1.45, 1.46, 1.46, 1.47, 1.47, 1.48, 1.48, 1.49, 1.49, 1.5, 1.5, 1.51, 1.51, 1.52, 1.52, 1.53, 1.53, 1.54, 1.54, 1.55, 1.55, 1.56, 1.56, 1.57, 1.57, 1.58, 1.58, 1.59, 1.59, 1.6, 1.6, 1.61, 1.61, 1.62, 1.62, 1.63, 1.63, 1.64, 1.64, 1.65, 1.65, 1.66, 1.66, 1.67, 1.67, 1.68, 1.68, 1.69, 1.69, 1.7, 1.7, 1.71, 1.71, 1.72, 1.72, 1.73, 1.73, 1.74, 1.74, 1.75, 1.75, 1.76, 1.76, 1.77, 1.77, 1.78, 1.78, 1.79, 1.79, 1.8, 1.8, 1.81, 1.81, 1.82, 1.82, 1.83, 1.83, 1.84, 1.84, 1.85, 1.85, 1.86, 1.86, 1.87, 1.87, 1.88, 1.88, 1.89, 1.89, 1.9, 1.9, 1.91, 1.91, 1.92, 1.92, 1.93, 1.93, 1.94, 1.94, 1.95, 1.95, 1.96, 1.96, 1.97, 1.97, 1.98, 1.98, 1.99, 1.99, 2, 2], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 401, "currentCount": 401}}}], "config": {"showlegend": true, "xaxis": {"showticklabels": true, "gridwidth": 0.5, "range": [-0.06000000000000005, 2.06], "domain": [0.043880626032857, 0.9956255468066493], "mirror": false, "tickangle": 0, "showline": true, "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "y", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "paper_bgcolor": "rgba(255, 255, 255, 1.000)", "annotations": [], "height": 300, "margin": {"l": 0, "b": 20, "r": 0, "t": 20}, "plot_bgcolor": "rgba(255, 255, 255, 1.000)", "yaxis": {"showticklabels": true, "gridwidth": 0.5, "range": [-0.3000000000000007, 10.3], "domain": [0.050160396617089535, 0.9868766404199475], "mirror": false, "tickangle": 0, "showline": true, "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "x", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "legend": {"yanchor": "bottom", "xanchor": "right", "bordercolor": "rgba(0, 0, 0, 1)", "bgcolor": "rgba(255, 255, 255, 1.000)", "borderwidth": 1, "tracegroupgap": 0, "y": 0.07, "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "title": {"font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}, "text": ""}, "traceorder": "normal", "x": 1}, "width": 667}}