首页 > 编程问答 >“‘NoneType’类型的对象没有 len()”错误

“‘NoneType’类型的对象没有 len()”错误

时间:2024-07-26 13:51:04浏览次数:12  
标签:python mqtt raspberry-pi-pico thingsboard

下面的代码应该从连接到 Raspberry Pi Pico WH 的电容式传感器连接遥测土壤湿度数据并将其发送到 ThingsBoard 云,但当我运行它时,它显示“‘NoneType’类型的对象没有 len()” Thonny IDE 的 shell 中出现错误。

main.py

from machine import ADC, Pin
import umqtt.robust as mqtt
import json
import utime
import urequests
import network, time
import os


# Soil moisture sensor reading setup
soil = ADC(Pin(26))  
min_moisture = 29799
max_moisture = 46059

# Data sending interval in seconds
delay_seconds = 5

# Configure WiFi connection details 
ssid = "WIFI_NAME"
password = "WIFI_PASS"

# Function to read sensor data
def read_moisture():
    while True:
        moisture = (max_moisture-soil.read_u16())*100/(max_moisture-min_moisture)
        print("moisture: " + "%.2f" % moisture +"% (adc: "+str(soil.read_u16())+")")
        return moisture

# Function to connect to WiFi 
def connect_wlan():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)

    while not wlan.isconnected():
        print("Connecting to WiFi...")
        wlan.connect(ssid, password)
        utime.sleep(2)  

    print("Connected to WiFi")
    return wlan

def send_data_to_thingsboard(moisture_value):
    try:
        client = mqtt.MQTTClient(client_id='CLIENT_ID', server='thingsboard.cloud', port=1883, user='ACCESS_TOKEN')
        client.connect()
        data = {"moisture": moisture_value}
        client.publish("v1/devices/me/telemetry", json.dumps(data))
        client.disconnect()
        print(f"Data sent to ThingsBoard: {moisture_value}")
    except Exception as e:
        print(f"Error sending data: {e}")
        

def main():
    wlan = connect_wlan()
    data_queue = []

    while True:
        try:
            moisture = read_moisture()
            data_queue.append(moisture)

            if wlan.isconnected() and data_queue: 
                while data_queue:
                    moisture_value = data_queue.pop(0)
                    send_data_to_thingsboard(moisture_value)
        except OSError as e:
            print(f"WiFi connection lost: {e}")
            wlan = connect_wlan()  # Attempt to reconnect

        time.sleep(1)  

if __name__ == "__main__":
    main()

`` `

Thonny 中的 Shell 显示: Connected to WiFi moisture: -1.97% (adc: 46411) Error sending data: object of type 'NoneType' has no len()

似乎无法弄清楚出了什么问题。有什么建议欢迎提出,谢谢!


错误信息“‘NoneType’ 类型的对象没有 len()”意味着你正在尝试获取 NoneType 对象的长度,但 NoneType 对象没有长度。这通常发生在你期望一个字符串或列表之类的东西但实际上得到了 None 时。

在你的代码中,错误发生在 client.publish("v1/devices/me/telemetry", json.dumps(data)) 这一行。看来根本原因在于 json.dumps(data) 返回 None,导致错误。这可能是由于 data 变量包含无法序列化为 JSON 的数据类型导致的。

为了解决此问题,你应该检查 data 变量的内容。

  1. 检查数据类型: 确认 moisture_value 确实是数字或浮点数。你可以通过在 send_data_to_thingsboard 函数中添加以下行来打印其类型和值进行检查:
print(f"Moisture value type: {type(moisture_value)}")
print(f"Moisture value: {moisture_value}")
  1. 处理潜在的 None 值: read_moisture() 函数可能返回 None,导致在尝试创建 JSON 负载时出现问题。你可以通过在将数据追加到队列之前检查返回值来解决此问题:
    moisture = read_moisture()
    if moisture is not None:
        data_queue.append(moisture)
  1. 检查 json.dumps() 的结果: 确认 json.dumps(data) 返回有效的 JSON 字符串。你可以通过在 send_data_to_thingsboard 函数中添加以下行来打印其结果进行检查:
json_data = json.dumps(data)
print(f"JSON data: {json_data}")
client.publish("v1/devices/me/telemetry", json_data)

通过仔细检查这些点,你应该能够识别出问题的根源并有效地解决“‘NoneType’ 类型的对象没有 len()”错误。

标签:python,mqtt,raspberry-pi-pico,thingsboard
From: 78796397

相关文章

  • 为什么我的 Python 脚本失败并出现 TypeError?
    我正在编写一个Python脚本,该脚本应该计算数字列表的总和。但是,当我运行代码时遇到TypeError这是一个最小的例子:numbers=[1,2,3,'4']total=sum(numbers)print(total)Theerrormessageis:TypeError:unsupportedoperandtype(s)for+:'int'and'str......
  • 如何通过socks代理传递所有Python的流量?
    有如何通过http代理传递所有Python的流量?但是,它不处理sock代理。我想使用sock代理,我们可以通过ssh隧道轻松获得它。ssh-D5005user@server你可以使用socks库,让你的Python代码通过SOCKS代理传递所有流量。这个库可以让你在套接字级别上指定代......
  • 如何在streamlit python中流式传输由LLM生成的输出
    代码:fromlangchain_community.vectorstoresimportFAISSfromlangchain_community.embeddingsimportHuggingFaceEmbeddingsfromlangchainimportPromptTemplatefromlangchain_community.llmsimportLlamaCppfromlangchain.chainsimportRetrievalQAimports......
  • python mysql操作
    pipinstallmysql-connector-pythonimportmysql.connector#配置数据库连接参数config={'user':'your_username','password':'your_password','host':'your_host','database'......
  • Python 中的面向对象编程
    一.介绍在本文中,我们将使用Python中的类和对象来探索基本的OOP概念。面向对象编程(OOP)是一种强大的方法,可帮助开发人员组织代码,使其易于理解、重用和维护。Python是一种灵活的语言,可以很好地支持OOP概念。1.类和对象类是创建对象的蓝图。它定义了该类的对象将......
  • 学习资源系列之《Python深度学习基于PyTorch》
     前言近期应部分读者朋友的强烈邀请,希望推荐一本python深度学习实操的书籍。呐,今天为大家推荐小编偶然发现的这一本珍藏好书:《Python深度学习基于PyTorch》,文末附电子版获取方式《Python深度学习基于PyTorch》BriefIntroduction前言面对众多的深......
  • 如何使用Python实现语音转文字/字幕
    文章目录......
  • Python 教程(三):字符串特性大全
    目录专栏列表前言1.字符串基础2.字符串方法字符串查询字符串修改字符串切片3.字符串格式化旧式格式化(`%`操作符)`str.format()`方法f-string(Python3.6+)4.字符串编码5.Unicode和ASCII6.正则表达式7.字符串比较8.字符串连接9.字符串不可变性10.字符串的内......
  • python+flask计算机毕业设计新冠肺炎疫情人员统计及打卡系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景自新冠肺炎疫情爆发以来,全球公共卫生体系面临前所未有的挑战。疫情防控工作的高效开展,依赖于对人员流动、健康状况及疫情数据的精准掌握与......
  • python+flask计算机毕业设计基于智能匹配的体育场馆预约系统App(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着全民健身意识的日益增强,体育场馆作为民众参与体育活动的重要场所,其利用率与便捷性成为了社会关注的焦点。然而,传统的体育场馆预约方式......