mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-01-31 12:49:34 +00:00
mqtt2.template: Patches from Beta-User (Forum #91394)
git-svn-id: https://svn.fhem.de/fhem/trunk@17963 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
00079b0c4e
commit
879f608df8
@ -10,62 +10,62 @@
|
|||||||
# The zigbee2mqtt bridge device
|
# The zigbee2mqtt bridge device
|
||||||
name:zigbee2mqtt_bridge
|
name:zigbee2mqtt_bridge
|
||||||
filter:TYPE=MQTT2_DEVICE
|
filter:TYPE=MQTT2_DEVICE
|
||||||
par:BASEID;base ID set in configuration.yaml of the zigbee2mqtt bridge in the topics;{ AttrVal("DEVICE","readingList","") =~ m,(^.*)[/].*:, ? $1 : undef }
|
par:BASE_TOPIC;base topic as set in configuration.yaml of the zigbee2mqtt bridge in the topics;{ AttrVal("DEVICE","readingList","") =~ m,([^/]+)[/].*:, ? $1 : undef }
|
||||||
attr DEVICE bridgeRegexp BASEID/0x([A-Za-z0-9]*)[/]?.*:.* "zigbee_$1"
|
attr DEVICE bridgeRegexp BASE_TOPIC/0x([A-Za-z0-9]*)[/]?.*:.* "zigbee_$1"
|
||||||
attr DEVICE setList\
|
attr DEVICE setList\
|
||||||
permit_join:true,false BASEID/bridge/config/permit_join $EVTPART1\
|
permit_join:true,false BASE_TOPIC/bridge/config/permit_join $EVTPART1\
|
||||||
remove:textField BASEID/bridge/config/remove $EVTPART1\
|
remove:textField BASE_TOPIC/bridge/config/remove $EVTPART1\
|
||||||
log_level:debug,info,warn,error BASEID/bridge/config/log_level $EVTPART1\
|
log_level:debug,info,warn,error BASE_TOPIC/bridge/config/log_level $EVTPART1\
|
||||||
rename:textField BASEID/bridge/config/rename {"old":"$EVTPART1","new":"$EVTPART2"}\
|
rename:textField BASE_TOPIC/bridge/config/rename {"old":"$EVTPART1","new":"$EVTPART2"}\
|
||||||
network_map:raw,graphviz BASEID/bridge/networkmap $EVTPART1\
|
network_map:raw,graphviz BASE_TOPIC/bridge/networkmap $EVTPART1\
|
||||||
devicelist:noArg BASEID/bridge/config/devices
|
devicelist:noArg BASE_TOPIC/bridge/config/devices
|
||||||
attr DEVICE readingList BASEID/bridge/log:.* { json2nameValue($EVENT) }\
|
attr DEVICE readingList BASE_TOPIC/bridge/log:.* { json2nameValue($EVENT) }\
|
||||||
BASEID/bridge/state:.* state
|
BASE_TOPIC/bridge/state:.* state
|
||||||
|
|
||||||
|
|
||||||
# A dimmable light connected via zigbee2mqtt
|
# A dimmable light connected via zigbee2mqtt
|
||||||
name:zigbee2mqtt_bulb
|
name:zigbee2mqtt_bulb
|
||||||
filter:TYPE=MQTT2_DEVICE
|
filter:TYPE=MQTT2_DEVICE
|
||||||
par:BASEID;base ID set in configuration.yaml of the zigbee2mqtt bridge in the topics;{ AttrVal("DEVICE","readingList","") =~ m,(^.*)[/].*:, ? $1 : undef }
|
par:BASE_TOPIC;base topic as set in configuration.yaml of the zigbee2mqtt bridge in the topics;{ AttrVal("DEVICE","readingList","") =~ m,([^/]+)[/].*:, ? $1 : undef }
|
||||||
par:NAMEINTHEBRIDGE;name of this device in the bridge;{ AttrVal("DEVICE","readingList","") =~ m,(^.*)[/](.*):, ? $2 : undef }
|
par:NAMEINTHEBRIDGE;name of this device in the bridge;{ AttrVal("DEVICE","readingList","") =~ m,(^.*)[/](.*):, ? $2 : undef }
|
||||||
attr DEVICE icon light_control
|
attr DEVICE icon light_control
|
||||||
attr DEVICE devStateIcon {zigbee2mqtt_devStateIcon255($name)}
|
attr DEVICE devStateIcon {zigbee2mqtt_devStateIcon255($name)}
|
||||||
attr DEVICE webCmd toggle:on:off:brightness
|
attr DEVICE webCmd toggle:on:off:brightness
|
||||||
attr DEVICE setList \
|
attr DEVICE setList \
|
||||||
on:noArg BASEID/NAMEINTHEBRIDGE/set {"state":"ON"}\
|
on:noArg BASE_TOPIC/NAMEINTHEBRIDGE/set {"state":"ON"}\
|
||||||
off:noArg BASEID/NAMEINTHEBRIDGE/set {"state":"OFF"}\
|
off:noArg BASE_TOPIC/NAMEINTHEBRIDGE/set {"state":"OFF"}\
|
||||||
brightness:colorpicker,BRI,0,15,255 BASEID/NAMEINTHEBRIDGE/set {"state":"on","$EVTPART0":"$EVTPART1"}
|
brightness:colorpicker,BRI,0,15,255 BASE_TOPIC/NAMEINTHEBRIDGE/set {"state":"on","$EVTPART0":"$EVTPART1"}
|
||||||
|
|
||||||
# A dimmable color light connected via zigbee2mqtt
|
# A dimmable color light connected via zigbee2mqtt
|
||||||
name:zigbee2mqtt_colorbulb
|
name:zigbee2mqtt_colorbulb
|
||||||
filter:TYPE=MQTT2_DEVICE
|
filter:TYPE=MQTT2_DEVICE
|
||||||
par:BASEID;base ID set in configuration.yaml of the zigbee2mqtt bridge in the topics;{ AttrVal("DEVICE","readingList","") =~ m,(^.*)[/].*:, ? $1 : undef }
|
par:BASE_TOPIC;base topic as set in configuration.yaml of the zigbee2mqtt bridge in the topics;{ AttrVal("DEVICE","readingList","") =~ m,([^/]+)[/].*:, ? $1 : undef }
|
||||||
par:NAMEINTHEBRIDGE;name of this device in the bridge;{ AttrVal("DEVICE","readingList","") =~ m,(^.*)[/](.*):, ? $2 : undef }
|
par:NAMEINTHEBRIDGE;name of this device in the bridge;{ AttrVal("DEVICE","readingList","") =~ m,(^.*)[/](.*):, ? $2 : undef }
|
||||||
attr DEVICE icon light_control
|
attr DEVICE icon light_control
|
||||||
attr DEVICE webCmd toggle:on:off:brightness:color_temp
|
attr DEVICE webCmd toggle:on:off:brightness:color_temp
|
||||||
attr DEVICE setList \
|
attr DEVICE setList \
|
||||||
on:noArg BASEID/NAMEINTHEBRIDGE/set {"state":"ON"}\
|
on:noArg BASE_TOPIC/NAMEINTHEBRIDGE/set {"state":"ON"}\
|
||||||
off:noArg BASEID/NAMEINTHEBRIDGE/set {"state":"OFF"}\
|
off:noArg BASE_TOPIC/NAMEINTHEBRIDGE/set {"state":"OFF"}\
|
||||||
brightness:colorpicker,BRI,0,15,255 BASEID/NAMEINTHEBRIDGE/set {"state":"on","$EVTPART0":"$EVTPART1"}\
|
brightness:colorpicker,BRI,0,15,255 BASE_TOPIC/NAMEINTHEBRIDGE/set {"state":"on","$EVTPART0":"$EVTPART1"}\
|
||||||
color_temp:colorpicker,CT,250,1,454 BASEID/NAMEINTHEBRIDGE/set {"$EVTPART0":"$EVTPART1"}
|
color_temp:colorpicker,CT,250,1,454 BASE_TOPIC/NAMEINTHEBRIDGE/set {"$EVTPART0":"$EVTPART1"}
|
||||||
|
|
||||||
name:zigbee2mqtt_colorbulbWithoutColorTemp
|
name:zigbee2mqtt_colorbulbWithoutColorTemp
|
||||||
filter:TYPE=MQTT2_DEVICE
|
filter:TYPE=MQTT2_DEVICE
|
||||||
par:BASEID;base ID set in configuration.yaml of the zigbee2mqtt bridge in the topics;{ AttrVal("DEVICE","readingList","") =~ m,(^.*)[/].*:, ? $1 : undef }
|
par:BASE_TOPIC;base topic as set in configuration.yaml of the zigbee2mqtt bridge in the topics;{ AttrVal("DEVICE","readingList","") =~ m,([^/]+)[/].*:, ? $1 : undef }
|
||||||
par:NAMEINTHEBRIDGE;name of this device in the bridge;{ AttrVal("DEVICE","readingList","") =~ m,(^.*)[/](.*):, ? $2 : undef }
|
par:NAMEINTHEBRIDGE;name of this device in the bridge;{ AttrVal("DEVICE","readingList","") =~ m,(^.*)[/](.*):, ? $2 : undef }
|
||||||
attr DEVICE icon hue_filled_white_and_color_e27_b22
|
attr DEVICE icon hue_filled_white_and_color_e27_b22
|
||||||
attr DEVICE stateFormat {lc ReadingsVal("$name","state",0)}
|
attr DEVICE stateFormat {lc ReadingsVal("$name","state",0)}
|
||||||
attr DEVICE devStateIcon {zigbee2mqtt_devStateIcon255($name)}
|
attr DEVICE devStateIcon {zigbee2mqtt_devStateIcon255($name)}
|
||||||
attr DEVICE webCmd toggle:on:off:brightness:color
|
attr DEVICE webCmd toggle:on:off:brightness:color
|
||||||
attr DEVICE setList \
|
attr DEVICE setList \
|
||||||
on:noArg BASEID/NAMEINTHEBRIDGE/set {"state":"ON"}\
|
on:noArg BASE_TOPIC/NAMEINTHEBRIDGE/set {"state":"ON"}\
|
||||||
off:noArg BASEID/NAMEINTHEBRIDGE/set {"state":"OFF"}\
|
off:noArg BASE_TOPIC/NAMEINTHEBRIDGE/set {"state":"OFF"}\
|
||||||
brightness:colorpicker,BRI,0,15,255 BASEID/NAMEINTHEBRIDGE/set {"state":"on","$EVTPART0":"$EVTPART1"}\
|
brightness:colorpicker,BRI,0,15,255 BASE_TOPIC/NAMEINTHEBRIDGE/set {"state":"on","$EVTPART0":"$EVTPART1"}\
|
||||||
color:colorpicker,RGB {"BASEID/NAMEINTHEBRIDGE/set ".zigbee2mqtt_RGB2JSON($EVTPART1)}
|
color:colorpicker,RGB {"BASE_TOPIC/NAMEINTHEBRIDGE/set ".zigbee2mqtt_RGB2JSON($EVTPART1)}
|
||||||
|
|
||||||
name:zigbee2mqtt_smokeDetector
|
name:zigbee2mqtt_smokeDetector
|
||||||
filter:TYPE=MQTT2_DEVICE
|
filter:TYPE=MQTT2_DEVICE
|
||||||
par:BASEID;base ID set in configuration.yaml of the zigbee2mqtt bridge in the topics;{ AttrVal("DEVICE","readingList","") =~ m,(^.*)[/].*:, ? $1 : undef }
|
par:BASE_TOPIC;base topic as set in configuration.yaml of the zigbee2mqtt bridge in the topics;{ AttrVal("DEVICE","readingList","") =~ m,([^/]+)[/].*:, ? $1 : undef }
|
||||||
par:NAMEINTHEBRIDGE;name of this device in the bridge;{ AttrVal("DEVICE","readingList","") =~ m,(^.*)[/](.*):, ? $2 : undef }
|
par:NAMEINTHEBRIDGE;name of this device in the bridge;{ AttrVal("DEVICE","readingList","") =~ m,(^.*)[/](.*):, ? $2 : undef }
|
||||||
attr DEVICE icon secur_smoke_detector
|
attr DEVICE icon secur_smoke_detector
|
||||||
attr DEVICE stateFormat smoke
|
attr DEVICE stateFormat smoke
|
||||||
@ -77,12 +77,12 @@ attr DEVICE userReadings temperature_weather { sprintf("%.1f",ReadingsVal("DEVIC
|
|||||||
|
|
||||||
name:zigbee2mqtt_smart+plug
|
name:zigbee2mqtt_smart+plug
|
||||||
filter:TYPE=MQTT2_DEVICE
|
filter:TYPE=MQTT2_DEVICE
|
||||||
par:BASEID;base ID set in configuration.yaml of the zigbee2mqtt bridge in the topics;{ AttrVal("DEVICE","readingList","") =~ m,(^.*)[/].*:, ? $1 : undef }
|
par:BASE_TOPIC;base topic as set in configuration.yaml of the zigbee2mqtt bridge in the topics;{ AttrVal("DEVICE","readingList","") =~ m,([^/]+)[/].*:, ? $1 : undef }
|
||||||
par:NAMEINTHEBRIDGE;name of this device in the bridge;{ AttrVal("DEVICE","readingList","") =~ m,(^.*)[/](.*):, ? $2 : undef }
|
par:NAMEINTHEBRIDGE;name of this device in the bridge;{ AttrVal("DEVICE","readingList","") =~ m,(^.*)[/](.*):, ? $2 : undef }
|
||||||
attr DEVICE eventMap { dev=>{ON=>'on',OFF=>'off'} }
|
attr DEVICE eventMap { dev=>{ON=>'on',OFF=>'off'} }
|
||||||
attr DEVICE setList \
|
attr DEVICE setList \
|
||||||
off BASEID/NAMEINTHEBRIDGE/set OFF\
|
off BASE_TOPIC/NAMEINTHEBRIDGE/set OFF\
|
||||||
on BASEID/NAMEINTHEBRIDGE/set ON
|
on BASE_TOPIC/NAMEINTHEBRIDGE/set ON
|
||||||
|
|
||||||
|
|
||||||
###########################################
|
###########################################
|
||||||
@ -148,46 +148,100 @@ attr DEVICE readingList \
|
|||||||
tele/DEVICE/LWT:.* LWT\
|
tele/DEVICE/LWT:.* LWT\
|
||||||
tele/DEVICE/STATE:.* { json2nameValue($EVENT) }\
|
tele/DEVICE/STATE:.* { json2nameValue($EVENT) }\
|
||||||
tele/DEVICE/SENSOR:.* { json2nameValue($EVENT) }\
|
tele/DEVICE/SENSOR:.* { json2nameValue($EVENT) }\
|
||||||
tele/DEVICE/INFO1:.* { json2nameValue($EVENT) }\
|
tele/DEVICE/INFO.:.* { json2nameValue($EVENT) }\
|
||||||
tele/DEVICE/INFO2:.* { json2nameValue($EVENT) }\
|
|
||||||
tele/DEVICE/INFO3:.* { json2nameValue($EVENT) }\
|
|
||||||
stat/DEVICE/RESULT:.* { json2nameValue($EVENT) }
|
stat/DEVICE/RESULT:.* { json2nameValue($EVENT) }
|
||||||
deleteReading DEVICE .*
|
deleteReading DEVICE .*
|
||||||
attr DEVICE autocreate 0
|
attr DEVICE autocreate 0
|
||||||
|
|
||||||
|
|
||||||
# tasmota 4ch as one FHEM device.
|
# tasmota 4ch as one FHEM device.
|
||||||
name:tasmota_noprefix_sonoff_4ch
|
name:tasmota_noprefix_sonoff_4ch
|
||||||
filter:TYPE=MQTT2_DEVICE
|
filter:TYPE=MQTT2_DEVICE
|
||||||
attr DEVICE readingList \
|
set DEVICE attrTemplate tasmota_noprefix_pure_base
|
||||||
tele/DEVICE/LWT:.* LWT\
|
|
||||||
tele/DEVICE/STATE:.* { json2nameValue($EVENT) }\
|
|
||||||
tele/DEVICE/SENSOR:.* { json2nameValue($EVENT) }\
|
|
||||||
tele/DEVICE/INFO1:.* { json2nameValue($EVENT) }\
|
|
||||||
tele/DEVICE/INFO2:.* { json2nameValue($EVENT) }\
|
|
||||||
tele/DEVICE/INFO3:.* { json2nameValue($EVENT) }\
|
|
||||||
stat/DEVICE/RESULT:.* { json2nameValue($EVENT) }
|
|
||||||
attr DEVICE setList \
|
attr DEVICE setList \
|
||||||
p1on:noArg cmnd/DEVICE/POWER1 on\
|
p1:on,off cmnd/DEVICE/POWER1 $EVTPART1\
|
||||||
p1off:noArg cmnd/DEVICE/POWER1 off\
|
p2:on,off cmnd/DEVICE/POWER2 $EVTPART1\
|
||||||
p2on:noArg cmnd/DEVICE/POWER2 on\
|
p3:on,off cmnd/DEVICE/POWER3 $EVTPART1\
|
||||||
p2off:noArg cmnd/DEVICE/POWER2 off\
|
p4:on,off cmnd/DEVICE/POWER4 $EVTPART1
|
||||||
p3on:noArg cmnd/DEVICE/POWER3 on\
|
|
||||||
p3off:noArg cmnd/DEVICE/POWER3 off\
|
|
||||||
p4on:noArg cmnd/DEVICE/POWER4 on\
|
|
||||||
p4off:noArg cmnd/DEVICE/POWER4 off
|
|
||||||
attr DEVICE webCmd p1 on:p1 off:p2 on:p2 off:p3 on:p3 off:p4 on:p4 off
|
attr DEVICE webCmd p1 on:p1 off:p2 on:p2 off:p3 on:p3 off:p4 on:p4 off
|
||||||
attr DEVICE stateFormat {\
|
attr DEVICE stateFormat {\
|
||||||
"<div>P1:" . FW_makeImage(lc ReadingsVal($name, "POWER1", "off"))\
|
"<div>P1:" . FW_makeImage(lc ReadingsVal($name, "POWER1", "off"))\
|
||||||
. " P2:" . FW_makeImage(lc ReadingsVal($name, "POWER2", "off"))\
|
. " P2:" . FW_makeImage(lc ReadingsVal($name, "POWER2", "off"))\
|
||||||
. " P3:". FW_makeImage(lc ReadingsVal($name, "POWER3", "off"))\
|
. " P3:". FW_makeImage(lc ReadingsVal($name, "POWER3", "off"))\
|
||||||
. " P4:" . FW_makeImage(lc ReadingsVal($name, "POWER4", "off"))\
|
. " P4:" . FW_makeImage(lc ReadingsVal($name, "POWER4", "off"))\
|
||||||
. "</div>"
|
. "</div>"\
|
||||||
}
|
}
|
||||||
attr DEVICE webCmd p1on:p1off:p2on:p2off:p3on:p3off:p4on:p4off
|
|
||||||
attr DEVICE autocreate 0
|
attr DEVICE autocreate 0
|
||||||
|
|
||||||
###########################################
|
###########################################
|
||||||
# SHELLY
|
# SHELLY
|
||||||
|
#
|
||||||
|
# shelly1 using original firmware.
|
||||||
|
name:shelly1
|
||||||
|
filter:TYPE=MQTT2_DEVICE
|
||||||
|
par:DEVNAME;Shelly1 name in the topic;{ AttrVal("DEVICE","readingList","") =~ m,shellies/([^/]*)/, ? $1 : undef }
|
||||||
|
attr DEVICE setList\
|
||||||
|
off:noArg shellies/DEVNAME/relay/0/command off\
|
||||||
|
on:noArg shellies/DEVNAME/relay/0/command on
|
||||||
|
attr DEVICE readingList shellies/DEVNAME/relay/0:.* state
|
||||||
|
|
||||||
|
# shelly2 using original firmware.
|
||||||
|
# NOTE: a second device will be created for the second channel
|
||||||
|
name:shelly2
|
||||||
|
filter:TYPE=MQTT2_DEVICE
|
||||||
|
par:DEVNAME;Shelly2 name in the topic;{ AttrVal("DEVICE","readingList","") =~ m,shellies/([^/]*)/, ? $1 : undef }
|
||||||
|
attr DEVICE setList\
|
||||||
|
off:noArg shellies/DEVNAME/relay/0/command off\
|
||||||
|
on:noArg shellies/DEVNAME/relay/0/command on
|
||||||
|
attr DEVICE readingList shellies/DEVNAME/relay/0:.* state
|
||||||
|
attr DEVICE getList shellies/DEVNAME/relay/power power
|
||||||
|
attr DEVICE comment Channel 1 for DEVICE, see also DEVICE_CH2
|
||||||
|
copy DEVICE DEVICE_CH2
|
||||||
|
attr DEVICE_CH2 readingList shellies/DEVNAME/relay/1:.* state
|
||||||
|
attr DEVICE_CH2 comment Channel 2 for DEVICE
|
||||||
|
attr DEVICE_CH2 setList \
|
||||||
|
off:noArg shellies/DEVNAME/relay/1/command off\
|
||||||
|
on:noArg shellies/DEVNAME/relay/1/command on
|
||||||
|
|
||||||
|
# shelly4pro using original firmware
|
||||||
|
# NOTE: for each of the second to fourth channel, a new device will be created
|
||||||
|
name:shelly4pro
|
||||||
|
filter:TYPE=MQTT2_DEVICE
|
||||||
|
par:DEVNAME;Shelly4Pro name in the topic;{ AttrVal("DEVICE","readingList","") =~ m,shellies/([^/]*)/, ? $1 : undef }
|
||||||
|
attr DEVICE setList\
|
||||||
|
off:noArg shellies/DEVNAME/relay/0/command off\
|
||||||
|
on:noArg shellies/DEVNAME/relay/0/command on
|
||||||
|
attr DEVICE readingList shellies/DEVNAME/relay/0:.* state
|
||||||
|
attr DEVICE getList shellies/DEVNAME/relay/0/power power1\
|
||||||
|
shellies/DEVNAME/relay/0/energy energy1
|
||||||
|
attr DEVICE comment Channel 1 for DEVICE, see also DEVICE_CH2, DEVICE_CH3 and DEVICE_CH4
|
||||||
|
copy DEVICE DEVICE_CH2
|
||||||
|
attr DEVICE_CH2 readingList shellies/DEVNAME/relay/1:.* state
|
||||||
|
attr DEVICE_CH2 comment Channel 2 for DEVICE
|
||||||
|
attr DEVICE_CH2 setList \
|
||||||
|
off:noArg shellies/DEVNAME/relay/1/command off\
|
||||||
|
on:noArg shellies/DEVNAME/relay/1/command on
|
||||||
|
attr DEVICE getList shellies/DEVNAME/relay/1/power power2\
|
||||||
|
shellies/DEVNAME/relay/1/energy energy2
|
||||||
|
attr DEVICE comment Channel 2 for DEVICE, see also DEVICE, DEVICE_CH3 and DEVICE_CH4
|
||||||
|
copy DEVICE DEVICE_CH3
|
||||||
|
attr DEVICE_CH3 readingList shellies/DEVNAME/relay/2:.* state
|
||||||
|
attr DEVICE_CH3 comment Channel 3 for DEVICE
|
||||||
|
attr DEVICE_CH3 setList \
|
||||||
|
off:noArg shellies/DEVNAME/relay/2/command off\
|
||||||
|
on:noArg shellies/DEVNAME/relay/2/command on
|
||||||
|
attr DEVICE getList shellies/DEVNAME/relay/2/power power3\
|
||||||
|
shellies/DDEVNAME/relay/2/energy energy3
|
||||||
|
attr DEVICE comment Channel 3 for DEVICE, see also DEVICE, DEVICE_CH2 and DEVICE_CH4
|
||||||
|
copy DEVICE DEVICE_CH4
|
||||||
|
attr DEVICE_CH4 readingList shellies/DEVNAME/relay/3:.* state
|
||||||
|
attr DEVICE_CH4 comment Channel 4 for DEVICE
|
||||||
|
attr DEVICE_CH4 setList \
|
||||||
|
off:noArg shellies/DEVNAME/relay/3/command off\
|
||||||
|
on:noArg shellies/DEVNAME/relay/3/command on
|
||||||
|
attr DEVICE getList shellies/DEVNAME/relay/3/power power4\
|
||||||
|
shellies/DEVNAME/relay/3/energy energy4
|
||||||
|
attr DEVICE comment Channel 4 for DEVICE, see also DEVICE, DEVICE_CH2 and DEVICE_CH3
|
||||||
|
|
||||||
# shellybulb using original firmware. Tested with 1.3
|
# shellybulb using original firmware. Tested with 1.3
|
||||||
name:shellybulb
|
name:shellybulb
|
||||||
|
Loading…
Reference in New Issue
Block a user