Welcome to the Pycom forum Forum
    • \[\[global:header.categories\]\]
    • \[\[global:header.recent\]\]
    • \[\[global:header.tags\]\]
    • \[\[global:header.popular\]\]
    • Login

    Explore Pybytes | Official Documentation | Report a Firmware Bug/Issue | GitHub

    syntax question

    Scheduled Pinned Locked Moved Expansion Board
    6 Posts 3 Posters 40 Views 3 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • D Offline
      Daniel Bell
      last edited by Daniel Bell

      Hello, I am working with a Wipy3 and a pysense2 board and am trying to send some sensor data to a broker running on my local machine.

      This is the correct format that I need:

      ``` mqtt_publish(client, "home-assistant/altitude", value)
      
      

      The data is returned this way:

      str(alt.altitude())) 
      

      I may be mistaken but I think the data should be a string, if I am right then would i enter it into the publish line similar to this:

      "home-assistant/alt.altitude"
      

      or some other way? I can't seem to find an example that uses something other than light on or off. thank you in advance

      M 1 Reply Last reply Reply Quote 0
      • M Offline
        Mr Admin @Daniel Bell
        last edited by

        @Daniel-Bell
        Hi,
        MQTT needs the topic name as a strng ("home-assistant/altitude" in your example) and the message contents as a byte array.

        So if you have a string 'mystr' you could pass it as mystr.encode("utf-8") .

        Note that home assistant, will probably want the value to be something like json that it knows how to parse, but I don't have any experience with that...

        I use JSON with my MQTT setup, so I'd do:

        data={ "alt":alt.altitude() }
        mqtt_publish(client, "home-assistant/altitude", ujson.dumps(data).encode("utf-8"))
        

        YMMV...

        Brian

        1 Reply Last reply Reply Quote 0
        • D Offline
          Daniel Bell
          last edited by

          @Mr-Admin thank you and that helps.

          I did find this info about using json:
          "payload must be a string. If you want to send JSON then you need to format/escape it properly. Like:"

          topic: home-assistant/light/1/state
          payload: "{\"Status\":\"off\", \"Data\":\"something\"}"
          

          Would my data look like this then:

          topic: home-assistant/altitude/1/data
          payload: "{\Data\":\"altitude\"}"
          

          But I am hoping to keep things as simple as possible. In the published example, I followed the path of setting up the broker to receive data as SERVICE MQTT.DUMP with # or + used as a wild card Like this:

          1bccc052-2648-4a3c-b996-c990f7508230-image.png

          In my main.py file would this get the data in the correct format assuming it needs to be a string? I must be missing something simple like taking the result from the pysense of

          str(alt.altitude())) 
          

          and setting it equal to "alt.altitude" perhaps like this:

          alt.attitude=str(alt.altitude()))
          

          then adding the publish code like this?

          mqtt_publish(client, "home-assistant/altitude"
          

          Am I close?

          M 1 Reply Last reply Reply Quote 0
          • M Offline
            Mr Admin @Daniel Bell
            last edited by

            @Daniel-Bell
            As I understand it the home-assistant doc is talking about sending messages FROM home-assistant to a device (eg a smart plug or a smart light) and it has 2 ways of formatting the data : 'payload' or 'payload-template', of which the first requires a plain string.... but this is not relevant to your case, as you want home-assistant to RECEIVE the data from your WiPY.

            For your sending of the data (which home-assistant will be listening to - the 'Listen to a topic' part of the dialog), you could try :
            mqtt_publish(client, "home-assistant/altitude", str(alt.altitude).encode('utf-8'))
            which will let it receive it as a string of digits....

            D 1 Reply Last reply Reply Quote 0
            • G Offline
              g0hww
              last edited by

              I used to have a HomeAssistant setup that let me map the location of my Lopy4/Pytrack device, but I moved home and started a new HomeAssistant build that doesn't support this yet.

              My code for publishing the position data looks like so:

                  def lora_handle(self, msg):
                      try:
                          fields = msg.split(b',')
                          # see if it looks like a nav beacon and has at least a 2D fix
                          if len(fields) == 5 and int(fields[1])>=2:
                              lat_str = str(fields[2],"utf-8")
                              if lat_str[-1:] == 'N':
                                  lat = lat_str[:-1]
                              else:
                                  lat = '-'+lat_str[:-1]
                              lon_str = str(fields[3],"utf-8")
                              if lon_str[-1:] == 'E':
                                  lon = lon_str[:-1]
                              else:
                                  lon = '-'+lon_str[:-1]
                              payload = '{'
                              payload += '"latitude":'+lat+','
                              payload += '"longitude":'+lon
                              payload += '}'
                              src = str(fields[0],"utf-8")
                              print('LoRa Rx Nav: '+src+' '+payload)
                              topic = 'homeassistant/location/'+src
                              self.client_try_publish(topic,payload,False,0)
                      except Exception as e:
                          sys.print_exception(e)
              

              The method self.client_try_publish() has an interface like:

              def client_try_publish(self, topic, msg, retained, qos)
              

              and it mostly just checks that the wifi is up, that the mqtt client is connected, locks a mutex to ensure that only one thing is publishing at a time, and handles all exceptions that might occur.

              Hopefully this info might be of some use.

              Before I moved, I was also working towards changing my arbitrary mqtt topics that report info from my Tempodisc THD sensors received over BLE, into something more hass compatible, such that they might be autodetected, but that has been given a right good ignoring since the pandemic began. I did get as far as making my Lopy4's publish their availability as a binary sensor. This stuff is announced using this kind of thing:

                      self.hass_availability_root = b'homeassistant/binary_sensor/'+self.client_id+b'/'+self.service
                      self.hass_availability_config_topic = self.hass_availability_root + b'/config'
                      self.hass_availability_state_topic = self.hass_availability_root + b'/state'
              
                      self.hass_availability_config_payload = '{'
                      self.hass_availability_config_payload += '"name":"'+str(self.client_id,"utf-8")
                      self.hass_availability_config_payload += '","device_class":"connectivity",'
                      self.hass_availability_config_payload += '"state_topic":"'
                      self.hass_availability_config_payload += str(self.hass_availability_state_topic,"utf-8")
                      self.hass_availability_config_payload += '","payload_on":"Online",'
                      self.hass_availability_config_payload += '"payload_off":"Offline",'
                      self.hass_availability_config_payload += '"availability_topic":"'
                      self.hass_availability_config_payload += str(self.hass_availability_state_topic,"utf-8")
                      self.hass_availability_config_payload += '","payload_available":"Online",'
                      self.hass_availability_config_payload += '"payload_not_available":"Unavailable"'
                      self.hass_availability_config_payload += '}'
              

              If that kind of thing is of interest I could possibly dig up more of the associated code.
              I am hoping to finish off this stuff one day, if the IDE and PyMakr plugin keeps working, but I haven't been particularly motivated to do it recently. The code that I do have seems to be working fine, and I have hass config yaml that reads the THD topics and displays the info nicely on the dashboard without bothering with the switch to auto-detection compatible topic content.

              Good luck.

              1 Reply Last reply Reply Quote 0
              • D Offline
                Daniel Bell @Mr Admin
                last edited by

                @Mr-Admin said in syntax question:

                mqtt_publish(client, "home-assistant/altitude", str(alt.altitude).encode('utf-8'))

                thank you, this looks like what I need

                1 Reply Last reply Reply Quote 0

                Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                With your input, this post could be even better 💗

                Register Login
                • 1 / 1
                • First post
                  Last post

                Pycom on Twitter

                Pycom