• Recent
  • Tags
  • Unsolved
  • Solved
  • MagicMirror² Repository
  • Documentation
  • 3rd-Party-Modules
  • Donate
  • Discord
  • Register
  • Login
MagicMirror Forum
  • Recent
  • Tags
  • Unsolved
  • Solved
  • MagicMirror² Repository
  • Documentation
  • 3rd-Party-Modules
  • Donate
  • Discord
  • Register
  • Login
A New Chapter for MagicMirror: The Community Takes the Lead
Read the statement by Michael Teeuw here.

MMM-MQTTbridge

Scheduled Pinned Locked Moved Unsolved System
44 Posts 14 Posters 11.7k Views 15 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.
  • S Offline
    Serge
    last edited by Serge Nov 27, 2022, 2:04 PM Feb 17, 2020, 10:11 PM

    TOPIC MOVED. PLEASE FOLLOW THE LINK BELOW FOR THE MODULE UPDATES, INQUIRIES, ETC
    [MMM-MQTTbridge] A module to publish and receive MQTT messages.



    MMM-MQTTbridge

    https://github.com/Tom-Hirschberger/MMM-MQTTbridge

    MMM-MQTTbridge allows you to integrate your MagicMirror into your smart home system via MQTT protocol and manage MagicMirror via MQTT messages by converting them into MM Notifications and vise verse - listen to your MM’s Notifications and convert them into MQTT mesages.

    So, this module for MagicMirror do the following:

    • Listens to MQTT messages from your MQTT broker and, if mqtt-message arrives, module sends MM Notifications based on the pre-configured mqtt-to-notification Dictionary rules.
    • Listens to the MM Notifications within your MagicMirror environment. If Notification arrives, module sends MQTT message based on the preconfigured notification-to-mqtt Dictionary rules.

    module_logo

    DOWNLOAD

    Tom-Hirschberger/MMM-MQTTbridge

    CONFIG STRUCTURE

    For better understanding, we have divided config into 3 sections:

    1. General configurations in config.js;
    2. “NOTIFICATION to MQTT” dictionary rules;
    3. “MQTT to NOTIFICATION” dictionary rules;
    GENERAL SECTION
    {
    	module: 'MMM-MQTTbridge',
    	disabled: false,
    	config: {
    		mqttServer: "mqtt://:@localhost:1883",
    		mqttConfig:
    		{
    			listenMqtt: true,
    			interval: 300000,
    		},
    		notiConfig:
    		{
    			listenNoti: true,
    			ignoreNotiId: ["CLOCK_MINUTE", "NEWS_FEED"],
    			ignoreNotiSender: ["SYSTEM", "NEWS_FEED"],
    		},
    		// set "NOTIFICATIONS -> MQTT" dictionary at /dict/notiDictionary.js
    		// set "MQTT -> NOTIFICATIONS" dictionary at /dict/mqttDictionary.js
    	},
    },
    

    GENERAL part

    • mqttServerset you server address using the following format: “mqtt://”+USERNAME+“:”+PASSWORD+“@”+IPADDRESS+“:”+PORT. E.g. if you are using your broker without username/password on localhost with port 1883, you config should looks “mqtt://:@localhost:1883”.

    MQTT part

    • listenMqtt - turn on/off the listening of MQTT messages. Set to false if you are going to use only NOTI->MQTT dictionary to save CPU usage;
    • interval - interval for MQTT status update, default is 300000ms.
      (topics for subscription are taken from mqttDictionary.js

    NOTIFICATION part

    • listenNoti - turn on/off the listening of NOTIFICATIONS. Set to false if you are going to use only MQTT->NOTI dictionary to save CPU usage;
    • ignoreNotiId - list your NOTIFICATION ID that should be ignored from processing, this saves CPU usage. E.g. [“CLOCK_MINUTE”, “NEWS_FEED”],
    • ignoreNotiSender - list your NOTIFICATION SENDERS that should be ignored from processing, this saves CPU usage. E.g. [“system”, “NEWS_FEED”]

    NOTIFICATIONS to MQTT DICTIONARY SECTION

    Should be set within ~/MagicMirror/modules/MMM-MQTTbridge/dict/notiDictionary.js

    If payloadValue is empty, the actual payload of the notification will be used as MQTT payload.
    If payloadValue is specified and matches the payload received via the notification, mqttMsgPayload will be used as MQTT payload.

    var notiHook = [
      {
        notiId: "CLOCK_SECOND",
        notiPayload: [
          {
            payloadValue: '10',
            notiMqttCmd: ["Command 1"]
          },
          {
            payloadValue: '20',
            notiMqttCmd: ["Command 2"]
          },
          {
            payloadValue: '30', 
            notiMqttCmd: ["Command 1"]
          },
        ],
      },
    ];
    var notiMqttCommands = [
      {
        commandId: "Command 1",
        mqttTopic: "myhome/kitchen/light/set",
        mqttMsgPayload: '{"state":"OFF"}'
      },
      {
        commandId: "Command 2",
        mqttTopic: "myhome/kitchen/light/set",
        mqttMsgPayload: '{"state":"ON"}'
      },
    ];
    

    MQTT to NOTIFICATIONS DICTIONARY SECTION

    Should be set within ~/MagicMirror/modules/MMM-MQTTbridge/dict/mqttDictionary.js

    If payloadValue is empty, the actual payload of the MQTT message will be used as notification payload.
    If payloadValue is specified and matches the payload received via MQTT, notiPayload will be used as notification payload.

    var mqttHook = [
        {
          mqttTopic: "dahoam/test",
          mqttPayload: [
            {
              payloadValue: "ASSISTANT_LISTEN",
              mqttNotiCmd: ["Command 1"]
            },
            {
              payloadValue: "",
              mqttNotiCmd: ["Command 2"]
            },
          ],
        },
        {
          mqttTopic: "dahoam/test2",
          mqttPayload: [
            {
              payloadValue: "",
              mqttNotiCmd: ["Command 2"]
            },
          ],
        },
      ];
    var mqttNotiCommands = [
        {
          commandId: "Command 1",
          notiID: "ASSISTANT_LISTEN",
          notiPayload: 'BLABLABLA-1'
        },
        {
          commandId: "Command 2",
          notiID: "ASSISTANT_LISTEN",
          notiPayload: ''
        },
      ];
    

    TESTED ENVIRONMENT

    • Raspberry Pi 3 B+;
    • Clean Updated Upgarded Raspbian Buster;
    • MagicMirror ^2.10.1;
    • mqtt-broker eclipse-mosquitto run in docker on the same RPi;
    • mqtt-client on Windows10.

    CREDITS

    • @Thomas Hirschberger
    • @bugsounet
    • @sergge1
    • @DanielHfnr

    https://github.com/Tom-Hirschberger/MMM-MQTTbridge

    F W 2 Replies Last reply Feb 24, 2020, 10:57 AM Reply Quote 3
    • F Offline
      fribse @Serge
      last edited by Feb 24, 2020, 10:57 AM

      @Serge Wow, that looks very interesting. I’ll go and look into this!
      I have to turn the monitor on and off, and dim an undim the screen, it looks possible with this.

      1 Reply Last reply Reply Quote 0
      • F Offline
        fribse
        last edited by Feb 24, 2020, 8:33 PM

        @Serge is it on purpose you write:
        useMqttBridgeFromatOnly
        and not
        useMqttBridgeFormatOnly
        ?

        S 1 Reply Last reply Feb 25, 2020, 10:20 PM Reply Quote 0
        • F Offline
          fribse
          last edited by Feb 24, 2020, 10:32 PM

          Ok, so now I tried setting it up, so far without luck.

          In the config.js I added

          {
                      module: 'MMM-MQTTbridge',
                      disabled: false,
                      config: {
                          mqttServer: "mqtt://user:password@mqttserver:1883",
                          mqttConfig:
                          {
                              listenMqtt: true,
                              useMqttBridgeFormatOnly: false,
                              interval: 300000,
                              topicSubscr: ["cmnd/home/bathroom/mirror"],
                          },
                          notiConfig:
                          {
                              listenNoti: true,
                              useMqttBridgeFormatOnly: false,
                              ignoreNotiId: ["CLOCK_MINUTE", "NEWS_FEED"],
                              ignoreNotiSender: ["system", "NEWS_FEED"],
                          },
          		// set "NOTIFICATIONS -> MQTT" dictionary at /dict/notiDictionary.js
          		// set "MQTT -> NOTIFICATIONS" dictionary at /dict/mqttDictionary.js
          	        },
                  },
          

          So this should make it listen to the topic

          cmnd/home/bathroom/mirror
          

          I have added the MMM-Remote module to have the screen off/on commands.
          in the dict/mqttDictionary.js I have written

          /**  mqtt-to-notification                     **/
          /**  dictionaty                               **/
          /**  for MMM-MQTTbridge module                **/
          /**  modify comands                           **/
          /**         @sergge1                          **/
          
          var mqttHook = [
              {
                mqttPayload: "TURN_OFF_SCREEN",
                mqttNotiCmd: ["MONITOROFF"]
              },
              {
                mqttPayload: "TURN_ON_SCREEN",
                mqttNotiCmd: ["MONITORON"]
              },
              {
                mqttPayload: "UNDIM_SCREEN",
                mqttNotiCmd: ["UNDIM"]
              },
              {
                mqttPayload: "DIM_SCREEN",
                mqttNotiCmd: ["DIM"]
              },
           ];
          var mqttNotiCommands = [
              {
                commandId: "MONITOROFF",
                notiID: "REMOTE_ACTION",
                notiPayload: 'MONITOROFF'
              },
              {
                commandId: "MONITORON",
                notiID: "REMOTE_ACTION",
                notiPayload: 'MONITORON'
              },
              {
                commandId: "UNDIM",
                notiID: "REMOTE_ACTION",
                notiPayload: 'BRIGHTNESS 100'
              },
              {
                commandId: "DIM",
                notiID: "REMOTE_ACTION",
                notiPayload: 'BRIGHTNESS 75'
              },
            ];
          
            module.exports = { mqttHook,  mqttNotiCommands};
          

          But if I publish MONITOROFF to cmnd/home/bathroom/mirror nothing happens?
          Now, how do I debug this, where can I see if it even receives the message?

          S 1 Reply Last reply Feb 25, 2020, 10:21 PM Reply Quote 0
          • S Offline
            Serge @fribse
            last edited by Serge Feb 26, 2020, 6:02 PM Feb 25, 2020, 10:20 PM

            You have (1) mismatch in config and (2) wrong use of MMMRemoteControl syntax.

            1. First.
              You config.js contains a line:

            useMqttBridgeFormatOnly: false,

            use the syntax exactly as it is written in the module’s readme. So please correct your config.js to useMqttBridgeFromatOnly.
            !!! I know about this misprint but it will be corrected in next release. As of now use as it is mentioned in readme.

            1. Second.

            notiPayload: ‘MONITOROFF’

            Notifications REMOTE_ACTION:MONITOROFF should be issued by the MQTTbridge module with your current mqttDictionary.js.

            However, I have checked the MMM-Remote control module, section “examples” and have found that MMMRemoteControl requires different from your Notification’s payload. It requires format: REMOTE_ACTION:{action: 'MONITOROFF'}

            So correct your mqttDictionary according to that format from MMM-Remote Control repo. As I understood, for monitor turn-off it should look like:

              commandId: "MONITOROFF",
              notiID: "REMOTE_ACTION",
              notiPayload: "{action: 'MONITOROFF'}"
            

            Check the terminal log, MQTTbridge log in there (1) module start/stop (2) connection to mqtt server (3) conversion mqtt->noti.

            1 Reply Last reply Reply Quote 0
            • S Offline
              Serge @fribse
              last edited by Serge Feb 25, 2020, 10:48 PM Feb 25, 2020, 10:21 PM

              @fribse said in MMM-MQTTbridge:

              where can I see if it even receives the message?

              see the log in terminal
              module produces something like this:

              [00:46:52.653] [LOG]    [MQTT bridge] MQTT message received. Topic: cmnd/home/smartmirror/volume/set, message: VOLUME_SET:0
              [00:46:52.873] [LOG]    [MQTT bridge] MQTT -> NOTI issued: VOLUME_SET, payload: 0
              
              1 Reply Last reply Reply Quote 0
              • F Offline
                fribse
                last edited by fribse Mar 1, 2020, 2:04 PM Mar 1, 2020, 2:02 PM

                This post is deleted!
                1 Reply Last reply Reply Quote 0
                • F Offline
                  fribse
                  last edited by fribse Mar 1, 2020, 3:21 PM Mar 1, 2020, 3:11 PM

                  Ok, I fixed the config.
                  The typo is back :-)

                  I see a few results right of the bat:

                  [15:55:10.009] [LOG]    [MQTT bridge] MQTT brocker error: Error: client disconnecting
                  [15:55:10.015] [LOG]    [MQTT bridge] NOTI->MQTT. Topic: home/bathroom/mirror/set, payload: {"state":"OFF"}
                  [15:55:20.026] [LOG]    [MQTT bridge] MQTT brocker error: Error: client disconnecting
                  [15:55:20.028] [LOG]    [MQTT bridge] NOTI->MQTT. Topic: home/bathroom/mirror/set, payload: {"state":"ON"}
                  

                  It also pops up on the screen that the MQTT broker is not replying, which is weird, as it’s in use for a lot of systems. Not sure what is going on?

                  The dict looks like this:

                  var mqttHook = [
                      {
                        mqttPayload: "TURN_OFF_SCREEN",
                        mqttNotiCmd: ["MONITOROFF"]
                      },
                      {
                        mqttPayload: "TURN_ON_SCREEN",
                        mqttNotiCmd: ["MONITORON"]
                      },
                      {
                        mqttPayload: "UNDIM_SCREEN",
                        mqttNotiCmd: ["UNDIM"]
                      },
                      {
                        mqttPayload: "DIM_SCREEN",
                        mqttNotiCmd: ["DIM"]
                      },
                   ];
                  var mqttNotiCommands = [
                      {
                        commandId: "MONITOROFF",
                        notiID: "REMOTE_ACTION",
                        notiPayload: "{action: 'MONITOROFF'}"
                      },
                      {
                        commandId: "MONITORON",
                        notiID: "REMOTE_ACTION",
                        notiPayload: "{action: 'MONITORON'}"
                      },
                      {
                        commandId: "UNDIM",
                        notiID: "REMOTE_ACTION",
                        notiPayload: "{action; 'BRIGHTNESS 100'}"
                      },
                      {
                        commandId: "DIM",
                        notiID: "REMOTE_ACTION",
                        notiPayload: "{action: 'BRIGHTNESS 75'}"
                      },
                    ];
                  
                    module.exports = { mqttHook,  mqttNotiCommands};
                  

                  When I publish the MONITOROFF to it, it seems to pick it up and then bummer:

                  [16:04:30.547] [LOG]    [MQTT bridge] MQTT message received. Topic: cmnd/home/bathroom/mirror, message: TURN_OFF_SCREEN
                  [16:04:30.639] [LOG]    [MQTT bridge] MQTT -> NOTI issued: REMOTE_ACTION, payload: {action: 'MONITOROFF'}
                  [16:04:30.646] [LOG]    Whoops! There was an uncaught exception...
                  [16:04:30.665] [LOG]    MagicMirror will not quit, but it might be a good idea to check why this happened. Maybe no internet connection?
                  [16:04:30.667] [LOG]    If you think this really is an issue, please open an issue on GitHub: https://github.com/MichMich/MagicMirror/issues
                  [16:04:30.710] [LOG]    Whoops! There was an uncaught exception...
                  [16:04:30.713] [LOG]    MagicMirror will not quit, but it might be a good idea to check why this happened. Maybe no internet connection?
                  [16:04:30.714] [LOG]    If you think this really is an issue, please open an issue on GitHub: https://github.com/MichMich/MagicMirror/issues
                  

                  So for me it looks like the MQTT part works, it’s the sending to ‘Remote commander’ that is not working, or am I wrong?
                  I’ve also tried creating a ‘RESTART’ command, same result.

                  S 1 Reply Last reply Mar 1, 2020, 9:43 PM Reply Quote 0
                  • S Offline
                    Serge @fribse
                    last edited by Serge Mar 1, 2020, 10:01 PM Mar 1, 2020, 9:43 PM

                    @fribse said in MMM-MQTTbridge:

                    [16:04:30.547] [LOG] [MQTT bridge] MQTT message received. Topic: cmnd/home/bathroom/mirror, message: TURN_OFF_SCREEN

                    the log record above means that MMM-MQTTbridge received mqtt message at the topic cmnd/home/bathroom/mirror with payload TURN_OFF_SCREEN.

                    The next log record

                    [16:04:30.639] [LOG] [MQTT bridge] MQTT -> NOTI issued: REMOTE_ACTION, payload: {action: ‘MONITOROFF’}

                    says that MQTTbridge issued MagicMirror’s notification REMOTE_ACTION with payload {action: 'MONITOROFF'} which is exactly what you need. So this part works well.

                    However, the further messages in log

                    [16:04:30.646] [LOG] Whoops! There was an uncaught exception…
                    [16:04:30.665] [LOG] MagicMirror will not quit, but it might be a good idea to check why this happened. Maybe no internet connection?
                    [16:04:30.667] [LOG] If you think this really is an issue, please open an issue on GitHub: https://github.com/MichMich/MagicMirror/issues

                    says that something went wrong with the MM core. That could be the reason for not executing the command by another module.

                    To find out the reason, you need to localize the error. Try to disable all modules and then add modules one-by-one and find which one cause that error.
                    hint: to disable modules, use disabled: true within each module config.

                    Change also listenNoti: to false, in MQTTbridge config if you do not need to convert Noti to Mqtt messages. So the module will not check all incoming MM’s notifications.

                    Here is the full log within my setup, I just sent a simple message to issue noti TEST with payload message:

                    pi@raspberrypi:~/MagicMirror $ npm start dev
                    
                    > magicmirror@2.10.1 start /home/pi/MagicMirror
                    > ./run-start.sh "dev"
                    
                    [23:48:05.361] [LOG]    Starting MagicMirror: v2.10.1
                    [23:48:05.395] [LOG]    Loading config ...
                    [23:48:05.435] [LOG]    Loading module helpers ...
                    [23:48:05.444] [LOG]    No helper found for module: clock.
                    [23:48:07.792] [LOG]    Initializing new module helper ...
                    [23:48:07.794] [LOG]    Module helper loaded: calendar
                    [23:48:07.800] [LOG]    No helper found for module: currentweather.
                    [23:48:07.802] [LOG]    No helper found for module: weatherforecast.
                    [23:48:07.890] [LOG]    Initializing new module helper ...
                    [23:48:07.891] [LOG]    Module helper loaded: newsfeed
                    [23:48:08.506] [LOG]    Initializing new module helper ...
                    [23:48:08.507] [LOG]    Module helper loaded: MMM-MQTTbridge
                    [23:48:08.691] [LOG]    All module helpers loaded.
                    [23:48:08.693] [LOG]    Starting server on port 8181 ... 
                    [23:48:08.705] [INFO]   You're using a full whitelist configuration to allow for all IPs
                    [23:48:08.735] [LOG]    Server started ...
                    [23:48:08.740] [LOG]    Connecting socket for: calendar
                    [23:48:08.744] [LOG]    Starting node helper for: calendar
                    [23:48:08.747] [LOG]    Connecting socket for: newsfeed
                    [23:48:08.749] [LOG]    Starting module: newsfeed
                    [23:48:08.752] [LOG]    Connecting socket for: MMM-MQTTbridge
                    [23:48:08.754] [LOG]    [MQTT bridge] Module started
                    [23:48:08.800] [LOG]    Sockets connected & modules started ...
                    [23:48:09.890] [LOG]    Launching application.
                    [23:48:26.071] [LOG]    [MQTT bridge] Subscribed to the topic: home/smartmirror/bathroom/light/set
                    [23:51:43.274] [LOG]    [MQTT bridge] MQTT message received. Topic: home/smartmirror/bathroom/light/set, message: TEST:message
                    [23:51:43.420] [LOG]    [MQTT bridge] MQTT -> NOTI issued: TEST, payload: message
                    
                    1 Reply Last reply Reply Quote 0
                    • F Offline
                      fribse
                      last edited by fribse Mar 2, 2020, 11:04 AM Mar 2, 2020, 10:47 AM

                      Hmm, not really sure what changed. I’ve tried setting the notilisten to false, and then I don’t see the error, but after reactivating it, I still dont’ see it.
                      I can see that the log reports state 0x6 when the monitor is on, and 0x2 when it’s off.
                      I can send commands to the Remote_Control module via http api, but nothing happens when I try it via the mqttbridge.
                      I guess I have to ask @Jopyth about that?

                      I also tried changing the quotation markings in the dict file, to match the Remote_Control parameters in the examples, but no change :-(

                      var mqttNotiCommands = [
                          {
                            commandId: "MONITOROFF",
                            notiID: 'REMOTE_ACTION',
                            notiPayload: '{action: "MONITOROFF"}'
                          },
                          {
                            commandId: "MONITORON",
                            notiID: 'REMOTE_ACTION',
                            notiPayload: '{action: "MONITORON"}'
                          },
                          {
                            commandId: "UNDIM",
                            notiID: 'REMOTE_ACTION',
                            notiPayload: '{action; "BRIGHTNESS", value: "100"}'
                          },
                          {
                            commandId: "DIM",
                            notiID: "REMOTE_ACTION",
                            notiPayload: '{action: "BRIGHTNESS", value: "75"}'
                          },
                          {
                            commandId: "RESTART",
                            notiID: "REMOTE_ACTION",
                            notiPayload: '{action: "RESTART"}'
                          },
                        ];
                      
                      1 Reply Last reply Reply Quote 0
                      • 1
                      • 2
                      • 3
                      • 4
                      • 5
                      • 1 / 5
                      1 / 5
                      • First post
                        4/44
                        Last post
                      Enjoying MagicMirror? Please consider a donation!
                      MagicMirror created by Michael Teeuw.
                      Forum managed by Sam, technical setup by Karsten.
                      This forum is using NodeBB as its core | Contributors
                      Contact | Privacy Policy