Block: Join Text
Type: io_text_join
Join two pieces of text into one combined string. Perfect for building dynamic messages, creating formatted outputs, or combining data from different sources into readable text.
What is Join Text?
Think of Join Text like using a plus sign (+) to glue two pieces of text together. Just like "Hello" + "World" becomes "HelloWorld", this block combines any two text values into one.
How It Works
INFO
Input A + Input B → Combined Output
Example: "Hello " + "World" → "Hello World"
The Join Text block takes two inputs (A and B) and combines them into a single text output:
- Input A: First piece of text
- Input B: Second piece of text
- Output: A + B (combined text)
Important!
The texts are joined directly with no space between them. If you want a space, you need to add it yourself!
Basic Examples
Simple Text Joining
| Input A | Input B | Output |
|---|---|---|
"Hello" | "World" | "HelloWorld" |
"Hello " | "World" | "Hello World" |
"Temperature: " | "72°F" | "Temperature: 72°F" |
Adding Spaces and Punctuation
| Input A | Input B | Output |
|---|---|---|
"Good" | " morning!" | "Good morning!" |
"Status:" | " Active" | "Status: Active" |
"User" | "#1234" | "User#1234" |
IoT Use Cases
🏷️ Creating Labels with Values
Temperature Label:
A: "Kitchen Temp: "
B: {{ feeds['sensors.kitchen_temp'].value }}
// Output: "Kitchen Temp: 72.5"Device Status:
A: "Door is "
B: {{ feeds['security.door'].value }}
// Output: "Door is OPEN" or "Door is CLOSED"📊 Building Status Messages
Battery Level:
A: "Battery at "
B: {{ vars.battery_percent }}%
// Output: "Battery at 85%"Sensor with Units:
A: {{ feeds['sensors.humidity'].value }}
B: "% humidity"
// Output: "65% humidity"👤 Personalizing Messages
Welcome Message:
A: "Welcome back, "
B: {{ user.name }}
// Output: "Welcome back, John Smith"Custom Greeting:
A: {{ vars.greeting }}
B: {{ user.username }}
// Output: "Hello, jsmith123"🔗 Creating URLs and Paths
A: "https://api.example.com/sensors/"
B: {{ vars.sensor_id }}
// Output: "https://api.example.com/sensors/temp_01"A: "/data/"
B: {{ vars.filename }}
// Output: "/data/readings_2024.csv"🎨 Formatting with Symbols
// Arrow Indicators
A: "Temperature "
B: "↑ Rising"
// Output: "Temperature ↑ Rising"
// Status Icons
A: "🔋 "
B: {{ vars.battery_status }}
// Output: "🔋 Charging" or "🔋 Full"Advanced Patterns
Chaining Multiple Join Blocks
Sometimes you need to combine more than two pieces of text. Use multiple Join Text blocks:
Three-Part Message:
// First Join
A: "Hello, "
B: {{ user.name }}
// Result: "Hello, John"
// Second Join (using first result)
A: [First Join Output]
B: "! Welcome back."
// Final Output: "Hello, John! Welcome back."Building Complex Messages
Multi-Line Status Report (using \n for line breaks):
// First Join
A: "System Status\n"
B: "Temperature: OK\n"
// Second Join
A: [First Join]
B: "Humidity: OK\n"
// Third Join
A: [Second Join]
B: "Battery: Low"
/* Output:
System Status
Temperature: OK
Humidity: OK
Battery: Low
*/Conditional Text Building
Combine with logic blocks to build different messages:
A: "Sensor "
B: [If temperature > 80 then "⚠️ HOT" else "✓ Normal"]
// Output: "Sensor ⚠️ HOT" or "Sensor ✓ Normal"Common Patterns & Tips
1. Don't Forget Spaces!
Common Mistake
Forgetting to add spaces is the #1 beginner error!
Wrong:
A: "Hello"
B: "World"
// Output: "HelloWorld" ❌Right:
A: "Hello " // Space at the end
B: "World"
// Output: "Hello World" ✅Also Right:
A: "Hello"
B: " World" // Space at the beginning
// Output: "Hello World" ✅2. Adding Separators
| Separator | Input A | Input B | Output |
|---|---|---|---|
| Comma | {{ vars.city }} | ", USA" | "Boston, USA" |
| Dash | {{ vars.date }} | " - Event" | "2024-01-15 - Event" |
| Colon | "Error" | ": Connection lost" | "Error: Connection lost" |
3. Building Lists
// Bullet Point
A: "• "
B: {{ vars.item_name }}
// Output: "• Temperature Sensor"
// Numbered
A: "1. "
B: {{ vars.first_step }}
// Output: "1. Check connections"4. Combining Numbers and Text
When joining numbers with text, the number is automatically converted:
A: "Count: "
B: {{ vars.sensor_count }}
// Output: "Count: 5"
A: {{ feeds['sensor'].value }}
B: " degrees"
// Output: "72.5 degrees"5. Empty String Handling
If one input is empty, you get just the other input:
A: "Hello"
B: ""
// Output: "Hello"
A: ""
B: "World"
// Output: "World"Working with Other Blocks
Join + Text Template
Use Join Text to prepare strings for templates:
// Join to create feed key
A: "sensor."
B: {{ vars.location }}
// Output: "sensor.kitchen"
// Then use in template
{{ feeds['[Join Output]'].value }}Join + Variables
Store joined text in a variable for reuse:
// Join
A: "Alert: "
B: {{ vars.message }}
// Store result in variable: "formatted_alert"
// Use later in multiple placesJoin + Conditionals
Build different messages based on conditions:
A: "Status: "
B: [If block result]
// Where If block returns "Online" or "Offline"
// Output: "Status: Online" or "Status: Offline"Troubleshooting
Problem: Text runs together without spaces
Solution: Add a space at the end of the first text or beginning of the second text:
- Change
"Hello"to"Hello " - Or change
"World"to" World"
Problem: Getting [object Object] in output
Solution: Make sure you're passing text/string values, not complex objects. Use the .value or .name property of feeds:
- Wrong:
B: {{ feeds['sensor.temp'] }} - Right:
B: {{ feeds['sensor.temp'].value }}
Problem: Numbers not displaying correctly
Solution: Numbers are automatically converted to text. For formatting, use a Text Template block first:
- Basic:
A: "Price: $" B: {{ vars.price }}→"Price: $9.99" - Formatted: Use template with
{{ vars.price | round: 2 }}first
Problem: Special characters not showing
Solution: Use Unicode or HTML entities:
- Degree symbol: Use
"°"or"°" - Line break: Use
"\n" - Tab: Use
"\t"
Quick Reference
Task Reference Table
| Task | Input A | Input B | Output |
|---|---|---|---|
| Add label | "Temp: " | "72°F" | "Temp: 72°F" |
| Add units | "50" | "%" | "50%" |
| Add prefix | "Error: " | message | "Error: [message]" |
| Add suffix | filename | ".txt" | "[filename].txt" |
| Join names | first_name | last_name | "[first][last]" (no space!) |
| With space | first_name + " " | last_name | "[first] [last]" |
| Line break | "Line 1\n" | "Line 2" | Two lines |
| Build path | "/home/" | username | "/home/[username]" |
When to Use Join Text vs Text Template
Use Join Text when:
- Combining exactly two pieces of text
- Simple concatenation without complex formatting
- Building URLs, paths, or IDs
- Adding prefixes or suffixes
Use Text Template when:
- Combining more than two pieces of text
- Need advanced formatting (dates, numbers)
- Using conditional logic
- Creating multi-line messages
- Need more control over output format
Inputs
A
The first string of text - this will appear first in the combined output. Can be static text like 'Hello' or dynamic data from feeds/variables. Don't forget to add a space at the end if you want separation from the second text!
Compatible Blocks (click to expand)
Get Variable
Retrieve the value stored in a variable that was previously set using a Set Variable block.
Multiline Text
Create formatted text content with multiple lines, paragraphs, and line breaks.
Text
Enter any text content for use in your Actions - words, phrases, device commands, or messages.
Text Template
Create dynamic, personalized messages by combining static text with live data from your IoT system.
Join Text
Join two pieces of text into one combined string.
Text Compare
Compare two text values using different comparison operations.

Weather
Fetch the current or forecast weather conditions at the specified location.

Air Quality
Fetch current or forecast air quality conditions at the specified location using Open-Meteo Air Quality API.
Round/Floor/Ceiling
Convert decimal numbers to whole numbers using different rounding strategies.
Number
Enter any numerical value for use in your IoT Actions - whole numbers, decimals, positive, or negative.

Map
Transform sensor readings and data values by scaling them from one number range to another.

Constrain
Keep any number within specified minimum and maximum boundaries.
Compare Numbers
Build mathematical conditions by comparing any two numerical values in your Action logic.
Arithmetic
Perform mathematical calculations using sensor data, feed values, or any numbers in your Actions.

Logic Operation
Combine multiple conditions to create sophisticated decision logic in your Actions.
Negate
Flip any condition to its opposite - turns true into false and false into true.
Boolean
A simple true or false value for building logic conditions and controlling digital outputs.
Get Feed Value
Resolves to the last value of this feed or component, always a String.

JSONPath Query
Extract specific values from JSON data using JSONPath query syntax.
B
The second string of text - this will appear immediately after the first text with no automatic spacing. Can be static text or dynamic values. Add a space at the beginning if you need separation from the first text.
Compatible Blocks (click to expand)
Get Variable
Retrieve the value stored in a variable that was previously set using a Set Variable block.
Multiline Text
Create formatted text content with multiple lines, paragraphs, and line breaks.
Text
Enter any text content for use in your Actions - words, phrases, device commands, or messages.
Text Template
Create dynamic, personalized messages by combining static text with live data from your IoT system.
Join Text
Join two pieces of text into one combined string.
Text Compare
Compare two text values using different comparison operations.

Weather
Fetch the current or forecast weather conditions at the specified location.

Air Quality
Fetch current or forecast air quality conditions at the specified location using Open-Meteo Air Quality API.
Round/Floor/Ceiling
Convert decimal numbers to whole numbers using different rounding strategies.
Number
Enter any numerical value for use in your IoT Actions - whole numbers, decimals, positive, or negative.

Map
Transform sensor readings and data values by scaling them from one number range to another.

Constrain
Keep any number within specified minimum and maximum boundaries.
Compare Numbers
Build mathematical conditions by comparing any two numerical values in your Action logic.
Arithmetic
Perform mathematical calculations using sensor data, feed values, or any numbers in your Actions.

Logic Operation
Combine multiple conditions to create sophisticated decision logic in your Actions.
Negate
Flip any condition to its opposite - turns true into false and false into true.
Boolean
A simple true or false value for building logic conditions and controlling digital outputs.
Get Feed Value
Resolves to the last value of this feed or component, always a String.

JSONPath Query
Extract specific values from JSON data using JSONPath query syntax.