A MQTT broker, such as Mosquitto must also be running somewhere on the on the network. (It can run on either the same PC as Rocrail or a different PC). Rocrail needs to know the IP address of this MQTT broker, and this should be set in the Rocrail Rocnet Controller "Address" options with Port set to 1883 if using Mosquitto. (see illustration, where I use 192.168.0.11 for my Broker).
My node code uses "rocnet" protocol, so subscribes to rocnet/lc and rocnet/#. see https://wiki.rocrail.net/doku.php?id=rocnet:rocnet-prot-en&s
Rocrail can also use service calls to send information in "readable" format, see https://wiki.rocrail.net/doku.php?id=rocrailini-service-en#mqtt_service. I use this technique for my handheld controller (RocClientThrottle ), to use this you need to add a "MQTT Service Client" (with the correct address) in the Rocrail Service Properties.
On power up the nodes each search IP sub addresses 3-49 in sequence to find the MQTT Broker (The range can be easily changed if your broker has a higher IP address).
Once the node finds the router it saves the MQTT Broker sub address and uses this on its next start up to save time.
The Nodes do not "know" where Rocrail is, nor do they need to. All communications are set via the MQTT broker.
Rocrail addresses each Node by its ROCNET ID, which is usually initially set to the nodes subIP for simplicity.
The system is therefore theoretically limited to about 250 ESPMQTT nodes, depending on what else the WiFI router is connecting.
As they start up and connect to the WiFi router, each ESPMQTTROCNETSound Node will be given an IP address by the router.Provided that the Router SSID and password have been properly set in the "Secrets" file in the code.
There is an option to use "WiFi manager" available, (#define _Use_Wifi_Manager). If this option is used, the node will search for a previously connected SSID first, but if this is not found it will set up a hotspot to which you can connect and then let it know which SSID (and passwords) it should use. I added this feature to allow the nodes to be "easily" used at new sites, but in practice I think it is simpler not to use this option, and I stick to the "preset" settings set in the secrets.h file.
When first setting up each node I would recommend that the define "#define _ForceRocnetNodeID_to_subIPL" is set to force the Rocnet "ID" address to the IP sub address. I also force set the eeprom settings by using "#define _ForceDefaultEEPROM". This prevents confusion over what is initially set and any ID clashes.
After running the node once, I then reprogram the node with these directives commented out so the Rocnode ID can be set using the Rocnet programming options (if desired), and changes to eeprom settings can be made (and saved) via Rocrail.
Each node can now be individually seen and modified by Rocrail. Every node provides 8 universal i/o pins. "D1-D8". Each I/O is effectively a virtual Pi02 channel with added Pi03 capabilities. Rocview programming is used to set the functionality of each port.
PROVIDED that the Pin is not being used for an AUDIO ouput or Motor drive or other pre-defined function, it can be set by Rocrail as an input or output, using the "Pi02 Port Setup". This allows blinking, and inversion.
Some "standard" port setups are selected by using the Static /Mobile options and Audio DAC/NoDAC definitions. These are shown below.
To select "Mobile" settings, use the "#define _LOCO_SERVO_Driven_Port 1". (This example sets D1 as the RC Servo drive, and also sets D2 and D5 as front and back light drivers).
To use Mobile "PWM" drive rather than Servo drive, use "#define _LocoPWMDirPort 3 " (If you do this then D3 (and D1 set above) are used to drive the PWM drive device).
Other pins are then "used up" by the various audio output options.
User : Port is available for user to specify as Input or Output.
Port usage shown above is "standard", but all port numbers/use can be modified in the code "directives.h" file if required.
(Some additional #defines are set or ignored depending on the defines noted above) e.g:
#ifdef _LOCO_SERVO_Driven_Port #define BACKLight 2 // NodeMCU D2 #define FRONTLight 5 // NodeMCU D5 // #define SteamOutputPin 6 #endif
Just to be "safe", I recommend that the first time you program you should also set:
#define _ForceRocnetNodeID_to_subIPL #define _ForceDefaultEEPROM // #define _Force_Loco_Addr 3
This will make sure that the eeprom is set to at least some semi sensible values, and that the Rocnet node addresses shuld not clash if you program more than one device.
After you have done this, comment out these defines and reprogram the unit so you can set and change things for your application.