MCPcopy
hub / github.com/Koenkk/zigbee2mqtt / publish

Method publish

lib/mqtt.ts:205–255  ·  view source on GitHub ↗
(topic: string, payload: string, options: Partial<MqttPublishOptions> = {})

Source from the content-addressed store, hash-verified

203 }
204
205 async publish(topic: string, payload: string, options: Partial<MqttPublishOptions> = {}): Promise<void> {
206 // TODO: add `options.validateTopic: boolean` to bypass these checks when topic is "controlled"
207 if (topic.includes("+") || topic.includes("#")) {
208 // https://github.com/Koenkk/zigbee2mqtt/issues/26939#issuecomment-2772309646
209 logger.error(`Topic '${topic}' includes wildcard characters, skipping publish.`);
210 return;
211 }
212
213 const finalOptions = {...this.defaultPublishOptions, ...options};
214 topic = `${finalOptions.baseTopic}/${topic}`;
215
216 if (finalOptions.skipReceive) {
217 this.publishedTopics.add(topic);
218 }
219
220 if (finalOptions.clientOptions.retain) {
221 if (payload) {
222 this.retainedMessages[topic] = {payload, options: finalOptions, topic: topic.substring(finalOptions.baseTopic.length + 1)};
223 } else {
224 delete this.retainedMessages[topic];
225 }
226 }
227
228 this.eventBus.emitMQTTMessagePublished({topic, payload, options: finalOptions});
229
230 if (!this.isConnected()) {
231 if (!finalOptions.skipLog) {
232 logger.error("Not connected to MQTT server!");
233 logger.error(`Cannot send message: topic: '${topic}', payload: '${payload}`);
234 }
235 return;
236 }
237
238 let clientOptions: IClientPublishOptions = finalOptions.clientOptions;
239 if (settings.get().mqtt.force_disable_retain) {
240 clientOptions = {...finalOptions.clientOptions, retain: false};
241 }
242
243 if (!finalOptions.skipLog) {
244 logger.info(() => `MQTT publish: topic '${topic}', payload '${payload}'`, NS);
245 }
246
247 try {
248 await this.client.publishAsync(topic, payload, clientOptions);
249 } catch (error) {
250 if (!finalOptions.skipLog) {
251 logger.error(`MQTT server error: ${(error as Error).message}`);
252 logger.error(`Could not send message: topic: '${topic}', payload: '${payload}`);
253 }
254 }
255 }
256}

Callers 15

connectMethod · 0.95
disconnectMethod · 0.95
onConnectMethod · 0.95
publishEntityStateMethod · 0.45
controller.test.tsFile · 0.45
constructorMethod · 0.45
startMethod · 0.45
stopMethod · 0.45
constructorMethod · 0.45
startMethod · 0.45
stopMethod · 0.45

Calls 6

isConnectedMethod · 0.95
errorMethod · 0.80
addMethod · 0.80
getMethod · 0.80
infoMethod · 0.45

Tested by

no test coverage detected