mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-10 03:06:37 +00:00
mqtt2.template: add some OMG templates
git-svn-id: https://svn.fhem.de/fhem/trunk@25763 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
8f6d761e8c
commit
6f06a5e031
@ -4479,7 +4479,6 @@ desc:use this with an OpenMQTTGateway for temp/hum sensors like LYWSD03MMC and L
|
||||
order:X_02d
|
||||
par:BT_ID;Pls. enter your bluetooth device ID; {undef}
|
||||
par:BASE_ID;BASE_ID typically is home;{ AttrVal("DEVICE","readingList","") =~ m,([^:]+)[/]O[^/]*M[^/]*G[^/]*[/].*:, ? $1 : undef }
|
||||
#par:READINGLISTOLD;copy readingList to new device for later resolving parameters;{ AttrVal("DEVICE","readingList","")}
|
||||
par:NEWDEVROOM;Room of the calling device; {AttrVal("DEVICE","room","MQTT2_\DEVICE" )}
|
||||
defmod OMG_BT_ID MQTT2_\DEVICE BT_ID
|
||||
deletereading -q OMG_BT_ID (?!associatedWith|IODev).*
|
||||
@ -4497,6 +4496,51 @@ attr OMG_BT_ID model OpenMQTTGateway_BT_temp_hum_sensor
|
||||
set DEVICE attrTemplate set_IODev_in_channels SUBCHANNELS=OMG_BT_ID
|
||||
setreading OMG_BT_ID attrTemplateVersion 20220220
|
||||
|
||||
name:OpenMQTTGateway_BT_scale
|
||||
prereq:{my @devices=devspec2array("model=OpenMQTTGateway_MCU");return 1 if $devices[0];return 0}
|
||||
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*/O[^/]*M[^/]*G[^/]*/.*
|
||||
desc:use this with an OpenMQTTGateway for scales like Xiaomi Mi Scale. For further details visit https://github.com/1technophile/OpenMQTTGateway/wiki<br>Recommended structure of the topic pattern home/OpenMQTTGateway/.*.<br>NOTE: You'll be asked to provide the HEX address of your scale. Best start with looking at what "OpenMQTTGateway_BT_scanner" povides, e.g. if you have a reading name like "6C697244245E_id", "6C697244245E" (without quotes) is what you want to enter...<br>NOTE: this will create a new device!
|
||||
order:X_02e
|
||||
par:BT_ID;Pls. enter your bluetooth device ID; {undef}
|
||||
par:BASE_ID;BASE_ID typically is home;{ AttrVal('DEVICE','readingList','') =~ m,([^:]+)[/]O[^/]*M[^/]*G[^/]*[/].*:, ? $1 : undef }
|
||||
par:NEWDEVROOM;Room of the calling device; {AttrVal('DEVICE','room','MQTT2_\DEVICE')}
|
||||
defmod OMG_BT_ID MQTT2_\DEVICE BT_ID
|
||||
deletereading -q OMG_BT_ID (?!associatedWith|IODev).*
|
||||
attr OMG_BT_ID autocreate 0
|
||||
attr OMG_BT_ID readingList\
|
||||
BASE_ID/O[^/]*M[^/]*G[^/]*/BTtoMQTT/BT_ID:.* { json2nameValue($EVENT,'',$JSONMAP) }
|
||||
attr OMG_BT_ID event-min-interval batteryPercent:7200,weight:1800
|
||||
attr OMG_BT_ID event-on-change-reading batteryPercent,weight:0.1,distance:5,impedance
|
||||
attr OMG_BT_ID icon message_medicine
|
||||
attr OMG_BT_ID jsonMap batt:batteryPercent tempc:temperature tem:0 tempf:0 hum:humidity servicedatauuid:0 servicedata:0
|
||||
attr OMG_BT_ID stateFormat weight kg
|
||||
attr OMG_BT_ID room NEWDEVROOM
|
||||
{ fhem "trigger $FW_wname JS:location.href='$FW_ME?detail=OMG_BT_ID'" if($cl && $cl->{TYPE} eq "FHEMWEB") }
|
||||
attr OMG_BT_ID model OpenMQTTGateway_BT_temp_hum_sensor
|
||||
set DEVICE attrTemplate set_IODev_in_channels SUBCHANNELS=OMG_BT_ID
|
||||
setreading OMG_BT_ID attrTemplateVersion 20220302
|
||||
|
||||
name:OpenMQTTGateway_BT_unknown_gadget
|
||||
prereq:{my @devices=devspec2array("model=OpenMQTTGateway_MCU");return 1 if $devices[0];return 0}
|
||||
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*/O[^/]*M[^/]*G[^/]*/.*
|
||||
desc:use this with an OpenMQTTGateway to get an "empty" device for further adoptions to your needs. For further details visit https://github.com/1technophile/OpenMQTTGateway/wiki<br>NOTE: You'll be asked to provide the HEX address of your gadget. Best start with looking at what "OpenMQTTGateway_BT_scanner" povides, e.g. if you have a reading name like "6C697244245E_id", "6C697244245E" (without quotes) is what you want to enter...<br>NOTE: this will create a new device!
|
||||
order:X_02x
|
||||
par:BT_ID;Pls. enter your bluetooth device ID; {undef}
|
||||
par:BASE_ID;BASE_ID typically is home;{ AttrVal('DEVICE','readingList','') =~ m,([^:]+)[/]O[^/]*M[^/]*G[^/]*[/].*:, ? $1 : undef }
|
||||
par:NEWDEVROOM;Room of the calling device; {AttrVal('DEVICE','room','MQTT2_\DEVICE')}
|
||||
defmod OMG_BT_ID MQTT2_\DEVICE BT_ID
|
||||
deletereading -q OMG_BT_ID (?!associatedWith|IODev).*
|
||||
attr OMG_BT_ID autocreate 0
|
||||
attr OMG_BT_ID readingList\
|
||||
BASE_ID/O[^/]*M[^/]*G[^/]*/BTtoMQTT/BT_ID:.* { json2nameValue($EVENT,'',$JSONMAP) }
|
||||
attr OMG_BT_ID icon bluetooth
|
||||
attr OMG_BT_ID jsonMap batt:batteryPercent tempc:temperature tem:0 tempf:0 hum:humidity servicedatauuid:0 servicedata:0
|
||||
attr OMG_BT_ID room NEWDEVROOM
|
||||
{ fhem "trigger $FW_wname JS:location.href='$FW_ME?detail=OMG_BT_ID'" if($cl && $cl->{TYPE} eq "FHEMWEB") }
|
||||
attr OMG_BT_ID model OpenMQTTGateway_BT_temp_hum_sensor
|
||||
set DEVICE attrTemplate set_IODev_in_channels SUBCHANNELS=OMG_BT_ID
|
||||
setreading OMG_BT_ID attrTemplateVersion 20220302
|
||||
|
||||
|
||||
###############
|
||||
#OwnTracks
|
||||
|
@ -320,7 +320,7 @@ sub Define {
|
||||
|
||||
$hash->{defaultRoom} = $defaultRoom;
|
||||
my $language = $h->{language} // shift @{$anon} // lc AttrVal('global','language','en');
|
||||
$hash->{MODULE_VERSION} = '0.5.16';
|
||||
$hash->{MODULE_VERSION} = '0.5.18';
|
||||
$hash->{baseUrl} = $Rhasspy;
|
||||
initialize_Language($hash, $language) if !defined $hash->{LANGUAGE} || $hash->{LANGUAGE} ne $language;
|
||||
$hash->{LANGUAGE} = $language;
|
||||
@ -473,39 +473,10 @@ sub Undefine {
|
||||
|
||||
sub Delete {
|
||||
my $hash = shift // return;
|
||||
#my $prefix = $hash->{prefix} // return;
|
||||
|
||||
deleteAllRegIntTimer($hash);
|
||||
RemoveInternalTimer($hash);
|
||||
|
||||
# DELETE POD AFTER TESTS ARE COMPLETED
|
||||
#Beta-User: Most likely removing attributes isn't a good idea; additionally: if, then attributes should be removed from global
|
||||
=begin comment
|
||||
|
||||
#Beta-User: globale Attribute löschen
|
||||
for (devspec2array("${prefix}Mapping=.+")) {
|
||||
delFromDevAttrList($_,"${prefix}Mapping:textField-long");
|
||||
}
|
||||
for (devspec2array("${prefix}Name=.+")) {
|
||||
delFromDevAttrList($_,"${prefix}Name");
|
||||
}
|
||||
for (devspec2array("${prefix}Room=.+")) {
|
||||
delFromDevAttrList($_,"${prefix}Room");
|
||||
}
|
||||
for (devspec2array("${prefix}Channels=.+")) {
|
||||
delFromDevAttrList($_,"${prefix}Channels");
|
||||
}
|
||||
for (devspec2array("${prefix}Colors=.+")) {
|
||||
delFromDevAttrList($_,"${prefix}Colors");
|
||||
}
|
||||
for (devspec2array("${prefix}Specials=.+")) {
|
||||
delFromDevAttrList($_,"${prefix}Specials");
|
||||
}
|
||||
for (devspec2array("${prefix}Group=.+")) {
|
||||
delFromDevAttrList($_,"${prefix}Group");
|
||||
}
|
||||
=end comment
|
||||
=cut
|
||||
return;
|
||||
}
|
||||
|
||||
@ -846,8 +817,6 @@ hermes/dialogueManager/configure (JSON)
|
||||
https://rhasspy-hermes-app.readthedocs.io/en/latest/usage.html#continuing-a-session
|
||||
=cut
|
||||
|
||||
my $sId = $siteId eq 'null' ? 'null' : qq("$siteId");
|
||||
|
||||
my @disabled;
|
||||
my $matches = join q{|}, @{$toDisable};
|
||||
for (@intents) {
|
||||
@ -905,7 +874,6 @@ sub init_custom_intents {
|
||||
my $err = perlSyntaxCheck( $perlcommand );
|
||||
return "$err in $line" if $err && $init_done;
|
||||
|
||||
#$hash->{helper}{custom}{$+{intent}}{perl} = $perlcommand; #Beta-User: delete after testing!
|
||||
$hash->{helper}{custom}{$intent}{function} = $function;
|
||||
|
||||
my $args = trim($+{arg});
|
||||
@ -916,7 +884,7 @@ sub init_custom_intents {
|
||||
push @params, $ar;
|
||||
}
|
||||
|
||||
$hash->{helper}{custom}{$+{intent}}{args} = \@params;
|
||||
$hash->{helper}{custom}{$intent}{args} = \@params;
|
||||
}
|
||||
return;
|
||||
}
|
||||
@ -1519,9 +1487,9 @@ sub initialize_msgDialog {
|
||||
sub disable_msgDialog {
|
||||
my $hash = shift // return;
|
||||
my $enable = shift // 0;
|
||||
my $fromSST = shift;
|
||||
readingsSingleUpdate($hash,'enableMsgDialog',$enable,1) if !$fromSST;
|
||||
return initialize_msgDialog($hash) if $enable && !$fromSST;
|
||||
my $fromSTT = shift;
|
||||
readingsSingleUpdate($hash,'enableMsgDialog',$enable,1) if !$fromSTT;
|
||||
return initialize_msgDialog($hash) if $enable && !$fromSTT;
|
||||
|
||||
my $devsp;
|
||||
if ( defined $hash->{helper}->{STT}
|
||||
@ -2555,7 +2523,7 @@ sub notifySTT {
|
||||
return AnalyzePerlCommand( undef, Babble_DoIt($hash->{Babble},$msgtext) ) if $msgtext !~ m{\A[\b]*$tocheck[\b]*\z}i;
|
||||
$msgtext =~ s{\A[\b]*$tocheck}{}i;
|
||||
}
|
||||
return msgDialog_open($hash, $client, $msgtext);
|
||||
return ttsDialog_open($hash, $client, $msgtext);
|
||||
}
|
||||
|
||||
return;
|
||||
@ -2678,7 +2646,7 @@ sub msgDialog_progress {
|
||||
#This is the place to add additional logics and decission making...
|
||||
#my $data = $hash->{helper}->{msgDialog}->{$device}->{data}; # // msgDialog_close($hash, $device);
|
||||
Log3($hash, 5, "msgDialog_progress called with $device and text $msgtext");
|
||||
Log3($hash, 5, 'msgDialog_progress called without DATA') if !defined $data;
|
||||
#Log3($hash, 5, 'msgDialog_progress called without DATA') if !defined $data;
|
||||
|
||||
return if !defined $data;
|
||||
|
||||
@ -2740,7 +2708,7 @@ sub handleTtsMsgDialog {
|
||||
&& defined $hash->{helper}->{msgDialog}->{$recipient} ) {
|
||||
msgDialog_respond($hash,$recipient,$message);
|
||||
sayFinished($hash, $data->{id}, $hash->{siteId});
|
||||
} elsif (defined $hash->{helper}->{STT}
|
||||
} elsif ( defined $hash->{helper}->{STT}
|
||||
&& defined $hash->{helper}->{STT}->{config}->{$recipient} ) {
|
||||
ttsDialog_respond($hash,$recipient,$message,0);
|
||||
sayFinished($hash, $data->{id}, $hash->{siteId}); #Beta-User: may be moved to response logic later with timeout...?
|
||||
@ -2777,6 +2745,7 @@ sub ttsDialog_close {
|
||||
Log3($hash, 5, "ttsDialog_close called with $device");
|
||||
|
||||
deleteSingleRegIntTimer($device, $hash);
|
||||
readingsSingleUpdate($defs{$device}, 'rhasspy_dialogue', 'closed', 1);
|
||||
|
||||
delete $hash->{helper}{ttsDialog}->{$device};
|
||||
return;
|
||||
@ -2797,7 +2766,8 @@ sub ttsDialog_open {
|
||||
customData => $device
|
||||
};
|
||||
|
||||
setTtsDialogTimeout($hash, $sendData, $hash->{helper}->{TTS}->{config}->{$device}->{sessionTimeout});
|
||||
my $tout = $hash->{helper}->{TTS}->{config}->{$device}->{sessionTimeout} // $hash->{sessionTimeout};
|
||||
setTtsDialogTimeout($hash, $sendData, $tout);
|
||||
return ttsDialog_progress($hash, $device, $msgtext, $sendData);
|
||||
}
|
||||
|
||||
@ -2832,20 +2802,32 @@ sub ttsDialog_progress {
|
||||
|
||||
sub ttsDialog_respond {
|
||||
my $hash = shift // return;
|
||||
my $DEVICE = shift // return;
|
||||
my $device = shift // return;
|
||||
my $message = shift // return;
|
||||
my $keepopen = shift // 1;
|
||||
|
||||
Log3($hash, 5, "ttsDialog_respond called with $DEVICE and text $message");
|
||||
Log3($hash, 5, "ttsDialog_respond called with $device and text $message");
|
||||
trim($message);
|
||||
return if !$message; # empty?
|
||||
|
||||
my $msgCommand = $hash->{helper}->{TTS}->{config}->{$DEVICE}->{ttsCommand} // return;
|
||||
$msgCommand =~ s{\\[\@]}{@}x;
|
||||
$msgCommand =~ s{(\$\w+)}{$1}eegx;
|
||||
AnalyzeCommand($hash, $msgCommand);
|
||||
resetRegIntTimer( $DEVICE, time + $hash->{helper}->{TTS}->{config}->{$DEVICE}->{sessionTimeout}, \&RHASSPY_msgDialogTimeout, $hash, 0) if $keepopen;
|
||||
return $DEVICE;
|
||||
my $msgCommand = $hash->{helper}->{TTS}->{config}->{$device}->{ttsCommand} // return;
|
||||
my %specials = (
|
||||
'$DEVICE' => $device,
|
||||
'$message' => $message,
|
||||
'$NAME' => $hash->{NAME}
|
||||
);
|
||||
$msgCommand = EvalSpecials($msgCommand, %specials);
|
||||
AnalyzeCommandChain($hash, $msgCommand);
|
||||
if ( $keepopen ) {
|
||||
my $tout = $hash->{helper}->{TTS}->{config}->{$device}->{sessionTimeout} // $hash->{sessionTimeout};
|
||||
resetRegIntTimer( $device, time + $tout, \&RHASSPY_ttsDialogTimeout, $hash, 0);
|
||||
readingsSingleUpdate($defs{$device}, 'rhasspy_dialogue', 'open', 1);
|
||||
} else {
|
||||
deleteSingleRegIntTimer($device, $hash);
|
||||
delete $hash->{helper}->{ttsDialog}->{$device};
|
||||
readingsSingleUpdate($defs{$device}, 'rhasspy_dialogue', 'closed', 1);
|
||||
}
|
||||
return $device;
|
||||
}
|
||||
|
||||
# Update the readings lastIntentPayload and lastIntentTopic
|
||||
@ -3083,12 +3065,23 @@ sub respond {
|
||||
readingsEndUpdate($hash,1);
|
||||
Log3($hash->{NAME}, 5, "Response is: $response");
|
||||
|
||||
#check for msgDialog session
|
||||
my $identity = (split m{_$hash->{siteId}_}, $data->{sessionId},3)[0];
|
||||
#check for msgDialog or ttsDialog sessions
|
||||
my $identity = (split m{_$hash->{siteId}_}xms, $data->{sessionId},3)[0];
|
||||
if ( defined $hash->{helper}->{msgDialog}
|
||||
&& defined $hash->{helper}->{msgDialog}->{$identity} ){
|
||||
Log3($hash, 5, "respond deviated to msgDialog_respond for $identity.");
|
||||
return msgDialog_respond($hash, $identity, $response);
|
||||
} elsif (defined $hash->{helper}->{TTS}
|
||||
&& defined $hash->{helper}->{TTS}->{config}->{$identity} ) {
|
||||
Log3($hash, 5, "respond deviated to ttsDialog_respond for $identity.");
|
||||
$hash->{helper}->{ttsDialog}->{$identity}->{data} = $data if $topic eq 'continueSession';
|
||||
return ttsDialog_respond($hash,$identity,$response,$topic eq 'continueSession');
|
||||
} elsif (defined $hash->{helper}->{TTS}
|
||||
&& defined $hash->{helper}->{TTS}->{$identity} ) {
|
||||
$identity = $hash->{helper}->{TTS}->{$identity};
|
||||
Log3($hash, 5, "respond deviated to ttsDialog_respond for $identity by siteId.");
|
||||
$hash->{helper}->{ttsDialog}->{$identity}->{data} = $data if $topic eq 'continueSession';
|
||||
return ttsDialog_respond($hash,$identity,$response,$topic eq 'continueSession');
|
||||
}
|
||||
|
||||
IOWrite($hash, 'publish', qq{hermes/dialogueManager/$topic $json});
|
||||
@ -3096,13 +3089,12 @@ sub respond {
|
||||
#setDialogTimeout( $hash, $data, $delay, getResponse( $hash, 'SilentCancelConfirmation' ) ) if $delay;
|
||||
|
||||
#no audio output in msgDialog session
|
||||
return if defined $hash->{helper}->{msgDialog}
|
||||
&& defined $hash->{helper}->{msgDialog}->{(split m{_$hash->{siteId}_}, $data->{sessionId},3)[0]};
|
||||
my $secondAudio = ReadingsVal($hash->{NAME}, "siteId2doubleSpeak_$data->{siteId}",0);
|
||||
#return if defined $hash->{helper}->{msgDialog}
|
||||
# && defined $hash->{helper}->{msgDialog}->{(split m{_$hash->{siteId}_}, $data->{sessionId},3)[0]};
|
||||
my $secondAudio = ReadingsVal($hash->{NAME}, "siteId2doubleSpeak_$data->{siteId}",undef) // return;
|
||||
sendSpeakCommand( $hash, {
|
||||
siteId => $secondAudio,
|
||||
text => $response} )
|
||||
if $secondAudio;
|
||||
text => $response} );
|
||||
return;
|
||||
}
|
||||
|
||||
@ -5614,7 +5606,7 @@ i="i am hungry" f="set Stove on" d="Stove" c="would you like roast pork"</code><
|
||||
<li>
|
||||
<a id="RHASSPY-attr-rhasspyHotwords"></a><b>rhasspyHotwords</b>
|
||||
<p>Define custom reactions as soon as a specific hotword is detected (or with "global": a toggle command is detected). This does not require any specific configuration on any other FHEM device.<br>
|
||||
One hotword per line, syntax is either a simple and an extended version. The "hotword" <i>global</i> will be treated specially and can be used to also execute custom commands when a <toggle> event is indicated.</p>
|
||||
One hotword per line, syntax is either a simple and an extended version. The "hotword" <i>global</i> will be treated specially and can be used to also execute custom commands when a <i>toggle</i> event is indicated.</p>
|
||||
Examples:<br>
|
||||
<p><code>bumblebee_linux = set amplifier2 mute on<br>
|
||||
porcupine_linux = livingroom="set amplifier mute on" default={Log3($DEVICE,3,"device $DEVICE - room $ROOM - value $VALUE")}<br>
|
||||
@ -5662,7 +5654,7 @@ i="i am hungry" f="set Stove on" d="Stove" c="would you like roast pork"</code><
|
||||
<li>
|
||||
<a id="RHASSPY-attr-rhasspyTTS"></a><b>rhasspyTTS</b>
|
||||
<a href="#RHASSPY-experimental"><b>experimental!</b></a>
|
||||
<p>In addition to <a href="#RHASSPY-attr-rhasspySTT">rhasspySTT</a>, this attributes adds some options to manipulate the text-to-speech processing. Any AMADDevice to be adressed for own TTS processing has to be listed here with it's link to it's siteId. If RHASSPY detects a link between a siteId and an AMADDevice type FHEM device, it will not forward any text to be spoken to Rhasspy but use other synthetisation methods instead (defaulting to <code>set <AMADDevice> ttsMsg $message</code>).
|
||||
<p>In addition to <a href="#RHASSPY-attr-rhasspySTT">rhasspySTT</a>, this attributes adds some options to manipulate the text-to-speech processing. Any AMADDevice to be adressed for own TTS processing has to be listed here with it's link to it's siteId (development remark: this is missleading atm!). If RHASSPY detects a link between a siteId and an AMADDevice type FHEM device, it will not forward any text to be spoken to Rhasspy but use other synthetisation methods instead (defaulting to <code>set <AMADDevice> ttsMsg $message</code>).
|
||||
Example:<br>
|
||||
<p><code>AMADDev_A=siteId=android_livingroom ttsCommand={fhem("set $DEVICE ttsMsg $message")}</code><br>Notes:
|
||||
<ul>
|
||||
|
Loading…
x
Reference in New Issue
Block a user