增加voice_num priority配置

This commit is contained in:
曹前明 2022-07-12 09:05:19 +08:00
parent c5ea72b4a6
commit 011f9a2a4c
5 changed files with 37 additions and 6 deletions

View File

@ -0,0 +1,23 @@
# Generated by Django 3.2.12 on 2022-07-12 00:55
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('ecm', '0009_auto_20220704_1504'),
]
operations = [
migrations.AddField(
model_name='eventcate',
name='priority',
field=models.PositiveSmallIntegerField(default=1, help_text='1-99', verbose_name='优先级'),
),
migrations.AddField(
model_name='eventcate',
name='voice_num',
field=models.PositiveSmallIntegerField(default=2, verbose_name='播放次数'),
),
]

View File

@ -19,10 +19,12 @@ class EventCate(CommonAModel):
) )
code = models.CharField('标识', max_length=10, unique=True) code = models.CharField('标识', max_length=10, unique=True)
name = models.CharField('名称', max_length=20, unique=True) name = models.CharField('名称', max_length=20, unique=True)
priority = models.PositiveSmallIntegerField('优先级', default=1, help_text='1-99')
trigger = models.PositiveSmallIntegerField('触发方式', default=10, choices=EVENT_TRIGGER_CHOICES) trigger = models.PositiveSmallIntegerField('触发方式', default=10, choices=EVENT_TRIGGER_CHOICES)
self_algo = models.BooleanField('识别算法', default=False) self_algo = models.BooleanField('识别算法', default=False)
speaker_on = models.BooleanField('开启喇叭报警', default=True) speaker_on = models.BooleanField('开启喇叭报警', default=True)
voice_person = models.PositiveSmallIntegerField('声音选择', default=0, help_text='0女声3男声') voice_person = models.PositiveSmallIntegerField('声音选择', default=0, help_text='0女声3男声')
voice_num = models.PositiveSmallIntegerField('播放次数', default=2)
speakers = models.ManyToManyField(TDevice, verbose_name='固定喇叭', blank=True, related_name='ec_speakers') speakers = models.ManyToManyField(TDevice, verbose_name='固定喇叭', blank=True, related_name='ec_speakers')
filter_area_level = models.PositiveSmallIntegerField('固定喇叭区域级别过滤', choices=Area.AREA_LEVEL_CHOICES, filter_area_level = models.PositiveSmallIntegerField('固定喇叭区域级别过滤', choices=Area.AREA_LEVEL_CHOICES,
default=Area.AREA_1) default=Area.AREA_1)

View File

@ -31,7 +31,8 @@ class EventCateListSerializer(CustomModelSerializer):
class EventCateUpdateSerializer(CustomModelSerializer): class EventCateUpdateSerializer(CustomModelSerializer):
class Meta: class Meta:
model = EventCate model = EventCate
fields = ['speaker_on', 'speakers', 'filter_area_level', 'voice_person', 'handle_minute'] fields = ['speaker_on', 'speakers', 'filter_area_level',
'voice_person', 'handle_minute', 'voice_num', 'priority']
class NotifySettingsSerializer(CustomModelSerializer): class NotifySettingsSerializer(CustomModelSerializer):

View File

@ -118,7 +118,9 @@ def save_voice_and_speak(event: Event):
Args: Args:
event (Event): _description_ event (Event): _description_
""" """
_, event.voice, _ = generate_voice(event.voice_msg, event.cates.first().voice_person) main_cate = event.cates.all().order_by('priority', 'create_time').first()
v_p, v_num = main_cate.voice_person, main_cate.voice_num
_, event.voice, _ = generate_voice(event.voice_msg, v_p)
event.save() event.save()
sps = list(TDevice.objects.filter(area=event.area, type=TDevice.DEVICE_SPEAKER).values_list('code', flat=True)) sps = list(TDevice.objects.filter(area=event.area, type=TDevice.DEVICE_SPEAKER).values_list('code', flat=True))
if len(sps) == 0: # 如果当前区域没有喇叭就找覆盖区的喇叭 if len(sps) == 0: # 如果当前区域没有喇叭就找覆盖区的喇叭
@ -130,7 +132,7 @@ def save_voice_and_speak(event: Event):
if n.code not in sps: if n.code not in sps:
sps.append(n.code) sps.append(n.code)
if sps: if sps:
spClient.speak(event.voice, sps) spClient.speak(event.voice, sps, v_num)
def create_remind(event: Event): def create_remind(event: Event):
@ -222,7 +224,7 @@ def dispatch_dahua_event(data: dict):
if alarm_type in [1001003, 1001000] and vchannel: # 内部人员/或陌生人报警 if alarm_type in [1001003, 1001000] and vchannel: # 内部人员/或陌生人报警
# 查看加载的算法 # 查看加载的算法
algo_codes = list(AlgoChannel.objects.filter(vchannel=vchannel).exclude( algo_codes = list(AlgoChannel.objects.filter(vchannel=vchannel).exclude(
algo__code=None).values_list('algo__code', flat=True)) algo__code=None).order_by('algo__priority', 'algo__create_time').values_list('algo__code', flat=True))
area = vchannel.area # 视频所在区域 area = vchannel.area # 视频所在区域
if algo_codes and area: # 如果加载了算法且视频通道绑定区域才继续 if algo_codes and area: # 如果加载了算法且视频通道绑定区域才继续
face_img_o = dhClient.get_full_pic(data['info']['alarmPicture']) face_img_o = dhClient.get_full_pic(data['info']['alarmPicture'])

View File

@ -109,12 +109,13 @@ class SpClient:
raise APIException(**SP_REQUEST_ERROR) raise APIException(**SP_REQUEST_ERROR)
return 'error', SP_REQUEST_ERROR return 'error', SP_REQUEST_ERROR
def speak(self, path: str, sns: list): def speak(self, path: str, sns: list, v_num: int):
"""播放报警声 """播放报警声
Args: Args:
path (str): 资源本地地址 path (str): 资源本地地址
sns (list): 喇叭sn队列 sns (list): 喇叭sn队列
v_num (int): 播放次数
""" """
json = { json = {
"sns": sns, "sns": sns,
@ -129,7 +130,9 @@ class SpClient:
}] }]
} }
} }
self.request(**spapis['send_to_device'], json=json) while v_num > 0:
self.request(**spapis['send_to_device'], json=json)
v_num = v_num - 1
return return
def _get_response_ms(self): def _get_response_ms(self):