@@ -63,22 +63,42 @@ async ValueTask<IAsyncDisposable> IOpenNettyHandler.SubscribeAsync()
6363 [
6464 await _events . ActionScenarioReported
6565 . Where ( static arguments => ! string . IsNullOrEmpty ( arguments . Endpoint . Name ) )
66- . Do ( arguments => ReportAsync ( arguments . Endpoint , OpenNettyMqttAttributes . Scenario , builder =>
66+ . Do ( async arguments =>
6767 {
68- var node = new JsonObject
68+ // Note: if the device class is "doorbell", a standard "ring" event is also sent for action scenarios.
69+ if ( arguments . Type is OpenNettyModels . ScenariosPlus . ActionScenarioType . Action &&
70+ arguments . Endpoint . GetStringSetting ( OpenNettySettings . HomeAssistantScenarioDeviceClass )
71+ is OpenNettySettings . HomeAssistantDeviceClasses . Events . Doorbell )
6972 {
70- [ "event_type" ] = arguments . Type switch
73+ await ReportAsync ( arguments . Endpoint , OpenNettyMqttAttributes . Scenario , builder =>
7174 {
72- OpenNettyModels . ScenariosPlus . ActionScenarioType . Action => "action" ,
73- OpenNettyModels . ScenariosPlus . ActionScenarioType . StopAction => "stop_action" ,
75+ var node = new JsonObject
76+ {
77+ [ "event_type" ] = "ring"
78+ } ;
7479
75- _ => throw new InvalidDataException ( SR . GetResourceString ( SR . ID0068 ) )
76- }
77- } ;
80+ builder . WithContentType ( MediaTypeNames . Application . Json ) ;
81+ builder . WithPayload ( node . ToJsonString ( ) ) ;
82+ } ) ;
83+ }
7884
79- builder . WithContentType ( MediaTypeNames . Application . Json ) ;
80- builder . WithPayload ( node . ToJsonString ( ) ) ;
81- } ) )
85+ await ReportAsync ( arguments . Endpoint , OpenNettyMqttAttributes . Scenario , builder =>
86+ {
87+ var node = new JsonObject
88+ {
89+ [ "event_type" ] = arguments . Type switch
90+ {
91+ OpenNettyModels . ScenariosPlus . ActionScenarioType . Action => "action" ,
92+ OpenNettyModels . ScenariosPlus . ActionScenarioType . StopAction => "stop_action" ,
93+
94+ _ => throw new InvalidDataException ( SR . GetResourceString ( SR . ID0068 ) )
95+ }
96+ } ;
97+
98+ builder . WithContentType ( MediaTypeNames . Application . Json ) ;
99+ builder . WithPayload ( node . ToJsonString ( ) ) ;
100+ } ) ;
101+ } )
82102 . Retry ( )
83103 . SubscribeAsync ( static arguments => ValueTask . CompletedTask ) ,
84104
@@ -358,51 +378,95 @@ await _events.PilotWireShutdownModeReported
358378
359379 await _events . PressureScenarioReported
360380 . Where ( static arguments => ! string . IsNullOrEmpty ( arguments . Endpoint . Name ) )
361- . Do ( arguments => ReportAsync ( arguments . Endpoint , OpenNettyMqttAttributes . Scenario , builder =>
381+ . Do ( async arguments =>
362382 {
363- var node = new JsonObject
383+ // Note: if the device class is "doorbell", a standard "ring" event is also sent for short pressure scenarios.
384+ if ( arguments . Type is OpenNettyModels . Scenarios . PressureScenarioType . Pressure &&
385+ arguments . Endpoint . GetStringSetting ( OpenNettySettings . HomeAssistantScenarioDeviceClass )
386+ is OpenNettySettings . HomeAssistantDeviceClasses . Events . Doorbell )
364387 {
365- [ "event_type" ] = arguments . Type switch
388+ await ReportAsync ( arguments . Endpoint , OpenNettyMqttAttributes . Scenario , builder =>
366389 {
367- OpenNettyModels . Scenarios . PressureScenarioType . Pressure => "pressure" ,
368- OpenNettyModels . Scenarios . PressureScenarioType . ReleaseAfterShortPressure => "release_after_short_pressure" ,
369- OpenNettyModels . Scenarios . PressureScenarioType . ReleaseAfterExtendedPressure => "release_after_extended_pressure" ,
370- OpenNettyModels . Scenarios . PressureScenarioType . ExtendedPressure => "extended_pressure" ,
390+ var node = new JsonObject
391+ {
392+ [ "event_type" ] = "ring" ,
393+ [ "scenario_type" ] = "evolved" ,
394+ [ "button" ] = arguments . Button
395+ } ;
371396
372- _ => throw new InvalidDataException ( SR . GetResourceString ( SR . ID0068 ) )
373- } ,
374- [ "scenario_type" ] = "evolved" ,
375- [ "button" ] = arguments . Button
376- } ;
397+ builder . WithContentType ( MediaTypeNames . Application . Json ) ;
398+ builder . WithPayload ( node . ToJsonString ( ) ) ;
399+ } ) ;
400+ }
377401
378- builder . WithContentType ( MediaTypeNames . Application . Json ) ;
379- builder . WithPayload ( node . ToJsonString ( ) ) ;
380- } ) )
402+ await ReportAsync ( arguments . Endpoint , OpenNettyMqttAttributes . Scenario , builder =>
403+ {
404+ var node = new JsonObject
405+ {
406+ [ "event_type" ] = arguments . Type switch
407+ {
408+ OpenNettyModels . Scenarios . PressureScenarioType . Pressure => "pressure" ,
409+ OpenNettyModels . Scenarios . PressureScenarioType . ReleaseAfterShortPressure => "release_after_short_pressure" ,
410+ OpenNettyModels . Scenarios . PressureScenarioType . ReleaseAfterExtendedPressure => "release_after_extended_pressure" ,
411+ OpenNettyModels . Scenarios . PressureScenarioType . ExtendedPressure => "extended_pressure" ,
412+
413+ _ => throw new InvalidDataException ( SR . GetResourceString ( SR . ID0068 ) )
414+ } ,
415+ [ "scenario_type" ] = "evolved" ,
416+ [ "button" ] = arguments . Button
417+ } ;
418+
419+ builder . WithContentType ( MediaTypeNames . Application . Json ) ;
420+ builder . WithPayload ( node . ToJsonString ( ) ) ;
421+ } ) ;
422+ } )
381423 . Retry ( )
382424 . SubscribeAsync ( static arguments => ValueTask . CompletedTask ) ,
383425
384426 await _events . PressureScenarioPlusReported
385427 . Where ( static arguments => ! string . IsNullOrEmpty ( arguments . Endpoint . Name ) )
386- . Do ( arguments => ReportAsync ( arguments . Endpoint , OpenNettyMqttAttributes . Scenario , builder =>
428+ . Do ( async arguments =>
387429 {
388- var node = new JsonObject
430+ // Note: if the device class is "doorbell", a standard "ring" event is also sent for short pressure scenarios.
431+ if ( arguments . Type is OpenNettyModels . ScenariosPlus . PressureScenarioType . ShortPressure &&
432+ arguments . Endpoint . GetStringSetting ( OpenNettySettings . HomeAssistantScenarioDeviceClass )
433+ is OpenNettySettings . HomeAssistantDeviceClasses . Events . Doorbell )
389434 {
390- [ "event_type" ] = arguments . Type switch
435+ await ReportAsync ( arguments . Endpoint , OpenNettyMqttAttributes . Scenario , builder =>
436+ {
437+ var node = new JsonObject
438+ {
439+ [ "event_type" ] = "ring" ,
440+ [ "scenario_type" ] = "plus" ,
441+ [ "button" ] = arguments . Button
442+ } ;
443+
444+ builder . WithContentType ( MediaTypeNames . Application . Json ) ;
445+ builder . WithPayload ( node . ToJsonString ( ) ) ;
446+ } ) ;
447+ }
448+
449+ await ReportAsync ( arguments . Endpoint , OpenNettyMqttAttributes . Scenario , builder =>
450+ {
451+ var node = new JsonObject
391452 {
392- OpenNettyModels . ScenariosPlus . PressureScenarioType . ShortPressure => "short_pressure" ,
393- OpenNettyModels . ScenariosPlus . PressureScenarioType . StartOfExtendedPressure => "start_of_extended_pressure" ,
394- OpenNettyModels . ScenariosPlus . PressureScenarioType . ExtendedPressure => "extended_pressure" ,
395- OpenNettyModels . ScenariosPlus . PressureScenarioType . EndOfExtendedPressure => "end_of_extended_pressure" ,
453+ [ "event_type" ] = arguments . Type switch
454+ {
455+ OpenNettyModels . ScenariosPlus . PressureScenarioType . ShortPressure => "short_pressure" ,
456+ OpenNettyModels . ScenariosPlus . PressureScenarioType . StartOfExtendedPressure => "start_of_extended_pressure" ,
457+ OpenNettyModels . ScenariosPlus . PressureScenarioType . ExtendedPressure => "extended_pressure" ,
458+ OpenNettyModels . ScenariosPlus . PressureScenarioType . EndOfExtendedPressure => "end_of_extended_pressure" ,
396459
397- _ => throw new InvalidDataException ( SR . GetResourceString ( SR . ID0068 ) )
398- } ,
399- [ "scenario_type" ] = "plus" ,
400- [ "button" ] = arguments . Button
401- } ;
460+ _ => throw new InvalidDataException ( SR . GetResourceString ( SR . ID0068 ) )
461+ } ,
462+ [ "scenario_type" ] = "plus" ,
463+ [ "button" ] = arguments . Button
464+ } ;
402465
403- builder . WithContentType ( MediaTypeNames . Application . Json ) ;
404- builder . WithPayload ( node . ToJsonString ( ) ) ;
405- } ) )
466+ builder . WithContentType ( MediaTypeNames . Application . Json ) ;
467+ builder . WithPayload ( node . ToJsonString ( ) ) ;
468+ } ) ;
469+ } )
406470 . Retry ( )
407471 . SubscribeAsync ( static arguments => ValueTask . CompletedTask ) ,
408472
0 commit comments