Commit 7ad22855 authored by 何金镒's avatar 何金镒

天气,同步设备等

parent d6c0a972
...@@ -76,6 +76,18 @@ ...@@ -76,6 +76,18 @@
<artifactId>spring-boot-starter-test</artifactId> <artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- mybatisPlus的依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.12</version>
</dependency>
<dependency> <dependency>
<groupId>cn.hutool</groupId> <groupId>cn.hutool</groupId>
......
...@@ -2,8 +2,10 @@ package com.ikonke.konkeaialibabamcp.aitools; ...@@ -2,8 +2,10 @@ package com.ikonke.konkeaialibabamcp.aitools;
import com.ikonke.konkeaialibabamcp.entity.mongodb.DeviceStatus; import com.ikonke.konkeaialibabamcp.entity.mongodb.DeviceStatus;
import com.ikonke.konkeaialibabamcp.service.SycDeviceService;
import com.ikonke.konkeaialibabamcp.service.mongdbservice.DeviceStatusService; import com.ikonke.konkeaialibabamcp.service.mongdbservice.DeviceStatusService;
import com.ikonke.konkeaialibabamcp.utils.KonkeIotUtils; import com.ikonke.konkeaialibabamcp.utils.KonkeIotUtils;
import com.ikonke.konkeaialibabamcp.utils.WeatherUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.tool.annotation.Tool; import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam; import org.springframework.ai.tool.annotation.ToolParam;
...@@ -15,15 +17,19 @@ public class DeviceTools { ...@@ -15,15 +17,19 @@ public class DeviceTools {
private final DeviceStatusService deviceStatusUtil; private final DeviceStatusService deviceStatusUtil;
private final KonkeIotUtils konkeIotServer; private final KonkeIotUtils konkeIotServer;
public DeviceTools( DeviceStatusService deviceStatusUtil, KonkeIotUtils konkeIotServer){ private final SycDeviceService sycDeviceService;
private final WeatherUtils weatherUtils;
public DeviceTools(DeviceStatusService deviceStatusUtil, KonkeIotUtils konkeIotServer, SycDeviceService sycDeviceService, WeatherUtils weatherUtils){
this.deviceStatusUtil = deviceStatusUtil; this.deviceStatusUtil = deviceStatusUtil;
this.konkeIotServer = konkeIotServer; this.konkeIotServer = konkeIotServer;
this.sycDeviceService = sycDeviceService;
this.weatherUtils = weatherUtils;
} }
@Tool(description = "根据主机号和设备ID查询设备状态信息.") @Tool(description = "根据主机号和设备ID查询设备状态信息.")
public DeviceStatus findDeviceState(@ToolParam(description = "主机号") String ccuName, public DeviceStatus findDeviceState(@ToolParam(description = "主机号") String ccuName,
@ToolParam(description = "设备ID") Integer devId) { @ToolParam(description = "设备ID") Integer devId) {
log.info("DeviceTools:findDeviceState....ccuName:{},devId:{}",ccuName,devId); log.info("根据主机号和设备ID查询设备状态信息....ccuName:{},devId:{}",ccuName,devId);
return deviceStatusUtil.findUserByUserId(ccuName, devId); return deviceStatusUtil.findUserByUserId(ccuName, devId);
} }
...@@ -31,16 +37,40 @@ public class DeviceTools { ...@@ -31,16 +37,40 @@ public class DeviceTools {
public String optDeviceOpen(@ToolParam(description = "主机号")String ccuName, public String optDeviceOpen(@ToolParam(description = "主机号")String ccuName,
@ToolParam(description = "设备ID")String devId, @ToolParam(description = "设备ID")String devId,
@ToolParam(description = "设备类型")String operateId){ @ToolParam(description = "设备类型")String operateId){
log.info("DeviceTools:optDeviceOpen....ccuName:{},devId:{},operateId:{}",ccuName,devId,operateId); log.info("根据主机号和设备ID控制打开设备....ccuName:{},devId:{},operateId:{}",ccuName,devId,operateId);
return konkeIotServer.optDeviceOpen(ccuName, devId, operateId); return konkeIotServer.optDeviceOpen(ccuName, devId, operateId);
} }
@Tool(description = "根据主机号和设备ID控制关闭设备") @Tool(description = "根据主机号和设备ID控制关闭设备")
public String optDeviceClosed(@ToolParam(description = "主机号")String ccuName, public String optDeviceClosed(@ToolParam(description = "主机号")String ccuName,
@ToolParam(description = "设备ID")String devId, @ToolParam(description = "设备ID")String devId,
@ToolParam(description = "设备类型")String operateId){ @ToolParam(description = "设备类型")String operateId){
log.info("DeviceTools:optDeviceClosed....ccuName:{},devId:{},operateId:{}",ccuName,devId,operateId); log.info("根据主机号和设备ID控制关闭设备....ccuName:{},devId:{},operateId:{}",ccuName,devId,operateId);
return konkeIotServer.optDeviceClosed(ccuName, devId, operateId); return konkeIotServer.optDeviceClosed(ccuName, devId, operateId);
} }
@Tool(description = "根据主机号同步设备")
public boolean synchronousDevice(@ToolParam(description = "主机号")String ccuName){
log.info("根据主机号同步设备....ccuName:{}",ccuName);
return sycDeviceService.synchronousDevice(ccuName);
}
@Tool(description = "根据城市名查询当前的天气")
public String getWeatherNow(@ToolParam(description = "城市,如:成都、西安")String city){
log.info("根据城市名查询当前的天气....city:{}",city);
return weatherUtils.getWeatherNow(city);
}
@Tool(description = "根据城市名查询未来24小时的天气")
public String getWeatherHourly(@ToolParam(description = "城市,如:成都、西安")String city){
log.info("根据城市名查询未来24小时的天气...city:{}",city);
return weatherUtils.getWeatherHourly(city);
}
@Tool(description = "根据城市名查询未来7天的天气")
public String getWeatherDaily(@ToolParam(description = "城市,如:成都、西安")String city){
log.info("根据城市名查询未来7天的天气....city:{}",city);
return weatherUtils.getWeatherDaily(city);
}
} }
package com.ikonke.konkeaialibabamcp.controller;
import cn.hutool.json.JSONArray;
import com.ikonke.konkeaialibabamcp.service.SycDeviceService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping("/deviceController")
public class DeviceController {
@Autowired
private SycDeviceService sycDeviceService;
@GetMapping("/findSycDeviceByCcu")
public JSONArray findSycDeviceByCcu(@RequestParam(name = "ccuName") String ccuName){
log.info("findSycDeviceByCcu..根据主机号查询设备..ccuName:{}",ccuName);
return sycDeviceService.findByCcu(ccuName);
}
@GetMapping("/synchronousDevice")
public Boolean synchronousDevice(@RequestParam(value = "ccuName") String ccuName) {
log.info("synchronousDevice..同步设备..ccuName:{}",ccuName);
return sycDeviceService.synchronousDevice(ccuName);
}
}
package com.ikonke.konkeaialibabamcp.entity.mysql;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
@Data
@TableName("`syn_device`")
public class SynDevice implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@TableField("deviceId")
private Integer deviceId;
@TableField("deviceName")
private String deviceName;
@TableField("operateId")
private String operateId;
@TableField("roomId")
private Integer roomId;
@TableField("roomName")
private String roomName;
@TableField("description")
private String description;
@TableField("actions")
private String actions;
@TableField("additionalApplianceDetails")
private String additionalApplianceDetails;
@TableField("type")
private Integer type;
@TableField("ccuId")
private String ccuId;
}
package com.ikonke.konkeaialibabamcp.mapper.mysql;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ikonke.konkeaialibabamcp.entity.mysql.SynDevice;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface SynDeviceMapper extends BaseMapper<SynDevice> {
List<SynDevice> findByCcu(String ccuName);
@Select("SELECT * FROM syn_device WHERE deviceName LIKE CONCAT('%',#{deviceName},'%') AND roomName LIKE CONCAT('%',#{roomName},'%')")
List<SynDevice> findByDeviceNameAndRoomName(String deviceName, String roomName);
}
package com.ikonke.konkeaialibabamcp.service;
import cn.hutool.core.exceptions.StatefulException;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ikonke.konkeaialibabamcp.entity.mongodb.Device;
import com.ikonke.konkeaialibabamcp.entity.mongodb.Region;
import com.ikonke.konkeaialibabamcp.entity.mongodb.Room;
import com.ikonke.konkeaialibabamcp.entity.mysql.SynDevice;
import com.ikonke.konkeaialibabamcp.service.mysqlservice.ISynDeviceService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Component
public class SycDeviceService {
@Autowired
private ISynDeviceService synDeviceService;
@Autowired
private MongoTemplate mongoTemplate;
public JSONArray findByCcu(String ccuName){
log.info("findByCcu..根据主机号查询设备..ccuName:{}",ccuName);
QueryWrapper<SynDevice> wrapper = new QueryWrapper<>();
wrapper.eq("ccuId", ccuName);
List<SynDevice> list = synDeviceService.list(wrapper);
JSONArray jsonArray = new JSONArray();
if(!list.isEmpty()){
for (SynDevice synDevice : list) {
JSONObject jsonObject = new JSONObject();
jsonObject.set("deviceId", synDevice.getDeviceId());
jsonObject.set("deviceName", synDevice.getDeviceName());
jsonObject.set("roomId", synDevice.getRoomId());
jsonObject.set("roomName", synDevice.getRoomName());
jsonObject.set("operateId", synDevice.getOperateId());
jsonArray.set(jsonObject);
}
}
return jsonArray;
}
public boolean synchronousDevice(String ccuName) {
log.info("synchronousDevice..同步设备..ccuName:{}",ccuName);
//查询房间信息
Query regionQuery = new Query(Criteria.where("ccuName").is(ccuName));
List<Region> region = mongoTemplate.find(regionQuery, Region.class);
if (region.size() != 1) {
log.error("主机:{} 没有找到匹配的房间",ccuName);
throw new StatefulException(-1, "没有房间信息");
}
List<Room> rooms = region.get(0).getRooms();
//查询设备信息
Query regionQuery2 = new Query(Criteria.where("ccuName").is(ccuName));
List<Device> device = mongoTemplate.find(regionQuery2, Device.class);
if (device.isEmpty()) {
log.error("主机:{} 没有找到匹配的设备",ccuName);
throw new StatefulException(-2, "没有设备信息");
}
//查询场景 todo
List<SynDevice> synDeviceList = getSynDevices(ccuName, device, rooms);
log.debug("要保存的设备:{}", JSONUtil.toJsonStr(synDeviceList));
synDeviceService.remove(new QueryWrapper<SynDevice>().eq("ccuId", ccuName));
return synDeviceService.saveBatch(synDeviceList);
}
@NotNull
private static List<SynDevice> getSynDevices(String ccuName, List<Device> device, List<Room> rooms) {
List<SynDevice> synDeviceList = new ArrayList<>();
for(Device d : device){
if(d.getRoomId() == -1){
continue;
}
SynDevice synDevice = new SynDevice();
synDevice.setDeviceId(d.getDevId());
synDevice.setDeviceName(d.getName());
synDevice.setOperateId(String.valueOf(d.getRealType()));
synDevice.setRoomId(d.getRoomId());
for(Room room : rooms){
if(room.getId().equals(d.getRoomId())){
synDevice.setRoomName(room.getName());
}
}
synDevice.setType(1);
synDevice.setCcuId(ccuName);
synDeviceList.add(synDevice);
}
return synDeviceList;
}
}
package com.ikonke.konkeaialibabamcp.service.mysqlservice;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ikonke.konkeaialibabamcp.entity.mysql.SynDevice;
import java.util.List;
public interface ISynDeviceService extends IService<SynDevice> {
List<SynDevice> findByCcu(String ccuName);
}
package com.ikonke.konkeaialibabamcp.service.mysqlservice.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ikonke.konkeaialibabamcp.entity.mysql.SynDevice;
import com.ikonke.konkeaialibabamcp.mapper.mysql.SynDeviceMapper;
import com.ikonke.konkeaialibabamcp.service.mysqlservice.ISynDeviceService;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class SynDeviceServiceImpl extends ServiceImpl<SynDeviceMapper, SynDevice> implements ISynDeviceService {
@Override
public List<SynDevice> findByCcu(String ccuName) {
return baseMapper.findByCcu(ccuName);
}
}
package com.ikonke.konkeaialibabamcp.utils;
import cn.hutool.http.HttpRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class WeatherUtils {
@Value("${konke.weather.clientId}")
private String clientId;
private final static String weatherNowUrl = "https://kapp.ikonke.com/weather/v1/now?location=";
private final static String weatherHourlyUrl = "https://kapp.ikonke.com/weather/v1/hourly?location=";
private final static String weatherDailyUrl = "https://kapp.ikonke.com/weather/v1/daily?location=";
public String getWeatherNow(String city) {
String url = weatherNowUrl + city;
return HttpRequest.get(url)
.header("clientId", clientId)
.execute().body();
}
public String getWeatherHourly(String city) {
String url = weatherHourlyUrl + city;
return HttpRequest.get(url)
.header("clientId", clientId)
.execute().body();
}
public String getWeatherDaily(String city) {
String url = weatherDailyUrl + city;
return HttpRequest.get(url)
.header("clientId", clientId)
.execute().body();
}
}
...@@ -2,8 +2,12 @@ server: ...@@ -2,8 +2,12 @@ server:
port: 9998 port: 9998
spring: spring:
main: datasource:
banner-mode: off type: com.zaxxer.hikari.HikariDataSource
url: jdbc:mysql://172.17.3.7:3306/ai_alibaba?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowMultiQueries=true&tinyInt1isBit=false&allowLoadLocalInfile=true&allowLocalInfile=true&allowUrl
username: root
password: RbNosaRd9)?_xKG9
driver-class-name: com.mysql.cj.jdbc.Driver
data: data:
mongodb: mongodb:
uri: mongodb://user002:konke2025@172.17.13.1:27017,172.17.13.2:27017,172.17.13.3:27017/konke_iot?authSource=konke_iot&authMechanism=SCRAM-SHA-1 uri: mongodb://user002:konke2025@172.17.13.1:27017,172.17.13.2:27017,172.17.13.3:27017/konke_iot?authSource=konke_iot&authMechanism=SCRAM-SHA-1
...@@ -24,6 +28,8 @@ spring: ...@@ -24,6 +28,8 @@ spring:
completion: true completion: true
konke: konke:
weather:
clientId: da4c19db2be64671
deviceCloud: deviceCloud:
appId: 10001304 appId: 10001304
appKey: 0c350d82-aa95-46e1-91b8-b8d508b5226a appKey: 0c350d82-aa95-46e1-91b8-b8d508b5226a
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment