Sprinkler-app/pages/index/index.vue
2025-02-19 17:42:28 +08:00

1481 lines
38 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="page">
<u-navbar :is-back="false" :border-bottom="false" :background="bgc" title-color='#2E4975' title-size='36'
height='8'></u-navbar>
<view class="title">
<image src="https://api.ccttiot.com/smartmeter/img/static/uhRjXxrVaNwOCld2fYUl" mode=""></image>
</view>
<!-- 背景图 -->
<!-- 没设备时展示 -->
<image class="bjimg" v-if="bjflag" src="https://api.ccttiot.com/smartmeter/img/static/uz8MR6BuZW2qRANnYgLu"
mode=""></image>
<!-- 有设备时展示 -->
<image class="bjimg" v-else src="https://api.ccttiot.com/smartmeter/img/static/uXBpJuaUs0XUNb8HTahh" mode="">
</image>
<view class="wusb" v-if="bjflag">
<text>暂无设备,请先绑定设备</text>
<view class="bang" @click="btnaddsb">
绑定
</view>
<!-- <view class="selectnames" @click="btnluru" v-if="userobj.userType == 00">
录入设备
</view> -->
</view>
<view class="" v-else>
<!-- 选择设备 -->
<view class="selectbox">
<view class="selectname" @click="btnksxz">
切换设备 <image v-if="!xuanzeflag" src="https://api.ccttiot.com/smartmeter/img/static/uwHOBxvbJjkhx1uDiQHI" mode=""></image>
<image v-else class="rotated-image" src="https://api.ccttiot.com/smartmeter/img/static/uwHOBxvbJjkhx1uDiQHI" mode=""></image>
</view>
<view class="selectshezhi" style="display: flex;">
<!-- <view class="selectnames" @click="btnluru" v-if="userobj.userType == 00">
录入设备
</view> -->
<image @click="btnsz" src="https://api.ccttiot.com/smartmeter/img/static/uvCJ8ro0MpfGZd53vypJ" mode=""></image>
</view>
</view>
<view class="selectbox">
<view class="shebeiname">
{{user.deviceName == undefined ? '--' : user.deviceName}} <text style="background-color: red;box-shadow: 0rpx 0rpx 10rpx 0rpx red, 0rpx 0rpx 30rpx 0rpx red" v-if="vardataflag == 1 || vardataflag == 2"></text> <text v-else></text>
<view class="lj" @click="btnlj" v-if="vardataflag == 1">
点击连接
</view>
<view class="lj" @click="btnlj" v-if="vardataflag == 2">
连接中
</view>
<view class="lj" style="color: #15C55D;border: 1px solid #15C55D;" @click="btnlj" v-if="vardataflag == 3">
已连接
</view>
</view>
<!-- <view class="shebeiadd" @click="btnaddsb">
<image src="https://api.ccttiot.com/smartmeter/img/static/udlX67UXzuRUZCuEtWDH" mode=""></image>
</view> -->
</view>
<!-- 设备信息 -->
<view class="devicebox">
<view class="devicetop">
<view class="devicelt">
<image src="https://api.ccttiot.com/smartmeter/img/static/uVKucPVDjxjaCDCpFKvw" mode=""></image>
<view class="xinghao">
<view class="one">型号:{{user.model == undefined ? '--' : user.model}}</view>
<view class="">MAC{{user.mac == undefined ? '--' : user.mac}}</view>
</view>
</view>
<!-- <view class="devicert">
<view class="shoudong">
<image @click="btnkq" v-if="kgflag"
src="https://api.ccttiot.com/smartmeter/img/static/uIiHf1LAHhLyVZODV9Pc" mode="">
</image>
<image @click="btngb" v-else
src="https://api.ccttiot.com/smartmeter/img/static/upKZD5SgfKHZDCxcPSCl" mode="">
</image> 手动浇水
</view>
<view class="shengyu">
剩余:{{ sdminutes ? sdminutes + ':' : '' }}{{ sdseconds ? sdseconds : '--' }}
</view>
</view> -->
</view>
<view class="deviceweek">
<view class="weeklist">
<view class="kg" v-if="ver_data.p_set0[3] == 0">
OFF
</view>
<view class="kg" style="color: #48893B;" v-else>
ON
</view>
<view class="weekday">
P1
</view>
<view class="">
{{ver_data.p_set0[0] == undefined ? '' : ver_data.p_set0[0] + ':'}}{{ver_data.p_set0[1] == undefined ? '' : ver_data.p_set0[1]}}
</view>
<view class="img">
<image v-if="ver_data.p_set0 && ver_data.p_set0[0] == xctimesj.slice(0,2) && ver_data.p_set0[1] == xctimesj.slice(-2)"
src="https://api.ccttiot.com/smartmeter/img/static/u9iZpd6bW6bUsUay4uvH" mode="">
</image>
</view>
</view>
<view class="weeklist">
<view class="kg" v-if="ver_data.p_set1[3] == 0">
OFF
</view>
<view class="kg" style="color: #48893B;" v-else>
ON
</view>
<view class="weekday">
P2
</view>
<view class="">
{{ver_data.p_set1[0] == undefined ? '' : ver_data.p_set1[0] + ':'}}{{ver_data.p_set1[1] == undefined ? '' : ver_data.p_set1[1]}}
</view>
<view class="img">
<image v-if="ver_data.p_set1 && ver_data.p_set1[0] == xctimesj.slice(0,2) && ver_data.p_set1[1] == xctimesj.slice(-2)"
src="https://api.ccttiot.com/smartmeter/img/static/u9iZpd6bW6bUsUay4uvH" mode="">
</image>
</view>
</view>
<view class="weeklist">
<view class="kg" v-if="ver_data.p_set2[3] == 0">
OFF
</view>
<view class="kg" style="color: #48893B;" v-else>
ON
</view>
<view class="weekday">
P3
</view>
<view class="">
{{ver_data.p_set2[0] == undefined ? '' : ver_data.p_set2[0] + ':'}}{{ver_data.p_set2[1] == undefined ? '' : ver_data.p_set2[1]}}
</view>
<view class="img">
<image v-if="ver_data.p_set2 && ver_data.p_set2[0] == xctimesj.slice(0,2) && ver_data.p_set2[1] == xctimesj.slice(-2)"
src="https://api.ccttiot.com/smartmeter/img/static/u9iZpd6bW6bUsUay4uvH" mode="">
</image>
</view>
</view>
<view class="weeklist">
<view class="kg" v-if="ver_data.p_set3[3] == 0">
OFF
</view>
<view class="kg" style="color: #48893B;" v-else>
ON
</view>
<view class="weekday">
P4
</view>
<view class="">
{{ver_data.p_set3[0] == undefined ? '' : ver_data.p_set3[0] + ':'}}{{ver_data.p_set3[1] == undefined ? '' : ver_data.p_set3[1]}}
</view>
<view class="img">
<image v-if="ver_data.p_set3 && ver_data.p_set3[0] == xctimesj.slice(0,2) && ver_data.p_set3[1] == xctimesj.slice(-2)"
src="https://api.ccttiot.com/smartmeter/img/static/u9iZpd6bW6bUsUay4uvH" mode="">
</image>
</view>
</view>
<view class="weeklist">
<view class="kg" v-if="ver_data.p_set4[3] == 0">
OFF
</view>
<view class="kg" style="color: #48893B;" v-else>
ON
</view>
<view class="weekday">
P5
</view>
<view class="">
{{ver_data.p_set4[0] == undefined ? '' : ver_data.p_set4[0] + ':'}}{{ver_data.p_set4[1] == undefined ? '' : ver_data.p_set4[1]}}
</view>
<view class="img">
<image v-if="ver_data.p_set4 && ver_data.p_set4[0] == xctimesj.slice(0,2) && ver_data.p_set4[1] == xctimesj.slice(-2)"
src="https://api.ccttiot.com/smartmeter/img/static/u9iZpd6bW6bUsUay4uvH" mode="">
</image>
</view>
</view>
<view class="weeklist">
<view class="kg" v-if="ver_data.p_set5[3] == 0">
OFF
</view>
<view class="kg" style="color: #48893B;" v-else>
ON
</view>
<view class="weekday">
P6
</view>
<view class="">
{{ver_data.p_set5[0] == undefined ? '' : ver_data.p_set5[0] + ':'}}{{ver_data.p_set5[1] == undefined ? '' : ver_data.p_set5[1]}}
</view>
<view class="img">
<image v-if="ver_data.p_set5 && ver_data.p_set5[0] == xctimesj.slice(0,2) && ver_data.p_set5[1] == xctimesj.slice(-2)"
src="https://api.ccttiot.com/smartmeter/img/static/u9iZpd6bW6bUsUay4uvH" mode="">
</image>
</view>
</view>
</view>
</view>
<!-- 开关选择 -->
<view class="switchbox">
<view class="switch_he">
<image src="https://api.ccttiot.com/smartmeter/img/static/u7NwkNOoQYYsvHVMkDlu" mode=""></image>
<view class="yushui">
雨水感应
<u-switch v-if="yschecked" v-model="one" @change="btnyushui" inactive-color="#eee"
active-color="#eee" size="40"></u-switch>
<u-switch v-else v-model="ones" @change="btnyushuis" active-color="#7FAD76"
inactive-color="#7FAD76" size="40"></u-switch>
</view>
</view>
<view class="switch_he">
<image src="https://api.ccttiot.com/smartmeter/img/static/u7kd92ocUgDN052nhp4R" mode=""></image>
<view class="yushui">
儿童锁 <u-switch v-if="etchecked" v-model="two" @change="btnertong" inactive-color="#eee"
active-color="#eee" size="40"></u-switch>
<u-switch v-else v-model="twos" @change="btnertongs" active-color="#7FAD76"
inactive-color="#7FAD76" size="40"></u-switch>
</view>
</view>
</view>
<view class="" style="display: flex;justify-content: space-between;">
<!-- 定时 -->
<view class="dingshi_he" @click="btntime">
<view class="naoz">
<image src="https://api.ccttiot.com/smartmeter/img/static/uJPgzMejk9gaogWnCO9M" mode=""></image> 6组
</view>
<view class="dstime">
定时管理 <image src="https://api.ccttiot.com/smartmeter/img/static/uagx3wGa7RYvqKqoSymy" mode="">
</image>
</view>
</view>
<!-- 手动浇水 -->
<view class="dingshi_he">
<view class="naoz" style="font-weight: 400;font-size: 26rpx;align-items: center;">
<image style="width: 170rpx;" src="https://api.ccttiot.com/smartmeter/img/static/uVYXvo4F6U6fJ5fP27BT" mode="aspectFill"></image>{{ sdminutes ? sdminutes + ':' : '' }}{{ sdseconds ? sdseconds : '' }}
</view>
<view class="dstime">
手动浇水 <u-switch v-if="kgflag" v-model="jskeds" @change="btngb" inactive-color="#eee"
active-color="#eee" size="40"></u-switch>
<u-switch v-else v-model="jsked" @change="btnkq" active-color="#7FAD76"
inactive-color="#7FAD76" size="40"></u-switch>
</view>
</view>
</view>
<!-- 浇水日志 -->
<view class="wateringlogbox" @click="btnjs">
<view class="wateringlogtop">
<image src="https://api.ccttiot.com/smartmeter/img/static/uGh3pRM7mMRSHdmvtzv3" mode=""></image>
浇水日志
</view>
<view class="wateringlogbd">
<view class="lt">
<view class="">距离下次:{{xctime}}</view>
<view class="">下次浇水时长:{{xctimesc}}</view>
<view class="">上次浇水:{{sctimejs}}</view>
</view>
<view class="rt">
<image src="https://api.ccttiot.com/smartmeter/img/static/uagx3wGa7RYvqKqoSymy" mode=""></image>
</view>
</view>
</view>
</view>
<!-- 切换设备 -->
<view class="tabsb" v-if="xuanzeflag">
<view class="sblist">
<view class="sbist_val" v-for="(item,index) in devicelist" :key="index" @click="btnactive(item.deviceId,index)">
<view class="lt">
<view class="">{{item.deviceName}}</view>
<!-- <view class="" style="margin-top: 14rpx;">型号:{{item.model}}</view> -->
<view class="" style="margin-top: 14rpx;">MAC:{{item.mac}}</view>
</view>
<view class="rt">
<image src="https://api.ccttiot.com/smartmeter/img/static/uVKucPVDjxjaCDCpFKvw" mode=""></image>
</view>
</view>
</view>
<view class="qdan" @click="btnaddsb">
添加新设备
</view>
</view>
<view class="mask" v-if="xuanzeflag"></view>
<!-- 手动浇水 -->
<view class="manualjs" v-if="sdjsflag">
<view class="toptit">
选择浇水时长
</view>
<view class="container" @click="btnshowjs">
<view class="">{{minute}}分</view>
<text>:</text>
<view class="">{{second}}秒</view>
</view>
<view class="anniu">
<view class="qx" @click="btnqx">
取消
</view>
<view class="qd" @click="btnqd">
确定
</view>
</view>
</view>
<view class="manualmask" v-if="sdjsflag"></view>
<!-- 选择浇水时间-->
<u-picker v-model="showjs" mode="time" :default-time="00" :params="params" @confirm="confirm"></u-picker>
<tab-bar :indexs='0'></tab-bar>
</view>
</template>
<script>
var xBlufi = require("@/components/blufi/xBlufi.js")
export default {
data() {
return {
one: false,
ones: true,
two: false,
twos: true,
jsked:true,
jskeds:false,
yschecked: true,
etchecked: true,
kgflag: true,
activeshu: 0,
xuanzeflag: false,
selectedMinute: '1',
selectedSecond: '1',
sdjsflag: false,
showjs: false,
params: {
year: false,
month: false,
day: false,
hour: false,
minute: true,
second: true
},
minute: '--',
second: '--',
devicesList: [],
deviceId: '',
name: '',
mac: '',
jstime: '',
ver_data: {},
vardataflag:1,
showobj: {},
jstimeobj:{},
xctime: '--',
sctimejs: '--',
xctimesc: '--',
xctimesj: '',
sdminutes: '',
sdseconds: '',
datalist: '',
devicelist:[],
shebid:'',
user:{},
lastChar:'',
timer:'',
bjflag:true,
userobj:{},
devicesarr:[],
intervalId: null,
imgflag:true,
ver:''
}
},
// 分享到好友(会话)
onShareAppMessage: function() {
return {
title: '绿小能',
path: '/pages/index/index'
}
},
// 分享到朋友圈
onShareTimeline: function() {
return {
title: '绿小能',
query: '',
path: '/pages/index/index'
}
},
onLoad() {
wx.openBluetoothAdapter({
success: function (res) {
console.log('蓝牙适配器初始化成功');
},
fail: function (err) {
console.error('蓝牙适配器初始化失败,可能是因为没有权限', err);
uni.showToast({
title: '蓝牙适配器初始化失败,可能是因为没有权限',
icon: 'none',
duration:2000
})
}
})
this.vardataflag = 1
xBlufi.initXBlufi(1)
let that = this
xBlufi.listenDeviceMsgEvent(true, that.funListenDeviceMsgEvent)
xBlufi.notifyStartDiscoverBle({
'isStart': true
})
},
onShow() {
// 请求个人信息
this.getinfo()
this.getshuju() // 页面加载时启动定时器
xBlufi.listenDeviceMsgEvent(true, this.funListenDeviceMsgEvent)
},
mounted() {
},
onHide() {
// 页面隐藏时清除定时器
this.clearTimer()
},
onUnload() {
// 页面卸载时清除定时器
this.clearTimer()
},
methods: {
// 点击进行设备录入
btnluru(){
this.datalist = ''
this.mac = ''
this.ver_data = {}
uni.reLaunch({
url:'/pages/myorder/index'
})
},
// 点击选择时间
btnshowjs() {
this.showjs = true
},
// 补零函数
formattedTime(minutes, seconds) {
// 将数字转换为字符串并补零
const formattedMinutes = String(minutes).padStart(2, '0')
const formattedSeconds = String(seconds).padStart(2, '0')
// 返回格式化后的时间字符串
console.log(`${formattedMinutes}:${formattedSeconds}`,'111111111')
return `${formattedMinutes}:${formattedSeconds}`
},
// 静默登录
jmlogin() {
let taht = this
wx.login({
success(res) {
if (res.code) {
let data = {
jsCode: res.code,
}
taht.$u.post(`/loginByopenid?jsCode=${res.code}`, data).then(res => {
if (res.code == 200) {
taht.getinfo()
uni.setStorageSync('token', res.token)
}else{
uni.showModal({
title: '提示',
content: '您还未登录,是否前去登录?',
success: function (res) {
if (res.confirm) {
uni.navigateTo({
url:'/pages/login/login'
})
} else if (res.cancel) {
}
}
})
}
})
}
}
})
},
// 获取用户信息
getinfo() {
this.$u.get(`/appVerify/profile`).then((res) => {
if (res.code == 200) {
this.userobj = res.data
// 根据用户id获取当前用户
this.getlist()
}else if(res.code == 401){
this.jmlogin()
}
})
},
// 获取设备列表
getlist(){
this.$u.get(`/app/getDeviceInfoByUser?userId=${this.userobj.userId}`).then((res) => {
if (res.code == 200) {
if(res.data.length > 0 || res.data != ''){
this.bjflag = false
this.devicelist = res.data
this.mac = res.data[0].mac
this.deviceId = res.data[0].mac.match(/.{2}/g).reverse().join(':')
this.user = res.data[0]
this.shebid = res.data[0].deviceId
let that = this
}else{
this.bjflag = true
}
}
})
},
// 点击连接蓝牙函数
btnlj() {
console.log("进入111蓝牙连接")
if (this.vardataflag != 3) {
this.vardataflag = 2
let that = this
if (that.deviceId != '') {
let systemInfo = uni.getSystemInfoSync()
if (systemInfo.platform == 'android') {
console.log("进入这里是IOS")
xBlufi.notifyStartDiscoverBle({
'isStart': false
})
console.log("进入蓝牙连接", that.deviceId)
console.log("进入that.name", that.name)
xBlufi.notifyConnectBle({
isStart: true,
deviceId: that.deviceId,
name: that.name
})
} else if (systemInfo.platform == 'ios') {
// 当前设备是 iOS
console.log("进入这里是IOS")
that.findDevice() //使用递归函数不断去匹配
}
}
}
},
// ios递归函数匹配
findDevice() {
// 使用 find 方法查找匹配的设备
const matchedDevice = this.devicesarr.find(device => {
console.log(device.name, this.mac, '111')
console.log("IOSMAC", device)
return device.name.slice(-12) == this.mac.slice(-12)
})
if (matchedDevice) {
// 找到匹配的设备
xBlufi.notifyStartDiscoverBle({
'isStart': false
})
xBlufi.notifyConnectBle({
isStart: true,
deviceId: matchedDevice.deviceId,
name: matchedDevice.name
})
this.deviceId = matchedDevice.deviceId
this.name = matchedDevice.name
console.log(this.deviceId, '11221')
} else {
console.log("未找到匹配的设备,继续查找...")
setTimeout(this.findDevice.bind(this), 1000) // 使用 bind 保持 this 上下文
}
},
// 雨水感应开启
btnyushui() {
this.one = false
this.ones = true
if(this.vardataflag != 3){
uni.showToast({
title: '设备未连接',
icon: 'none',
duration:2000
})
}else{
uni.showLoading({
title: '开启中...'
})
setTimeout(() => {
this.yschecked = false
xBlufi.notifySendCustomData({
customData: '11yudi'
})
uni.hideLoading()
}, 1500)
}
},
// 雨水感应关闭
btnyushuis() {
this.one = false
this.ones = true
if(this.vardataflag != 3){
uni.showToast({
title: '设备未连接',
icon: 'none',
duration:2000
})
}else{
uni.showLoading({
title: '关闭中...'
})
setTimeout(() => {
this.yschecked = true
xBlufi.notifySendCustomData({
customData: '11unyudi'
})
uni.hideLoading()
}, 1500)
}
},
// 点击儿童锁开启
btnertong() {
this.two = false
this.twos = true
if(this.vardataflag != 3){
uni.showToast({
title: '设备未连接',
icon: 'none',
duration:2000
})
}else{
uni.showLoading({
title: '开启中...'
})
setTimeout(() => {
this.etchecked = false
xBlufi.notifySendCustomData({
customData: '11lock'
})
uni.hideLoading()
}, 1500)
}
},
// 点击儿童锁关闭
btnertongs() {
this.two = false
this.twos = true
if(this.vardataflag != 3){
uni.showToast({
title: '设备未连接',
icon: 'none',
duration:2000
})
}else{
uni.showLoading({
title: '关闭中...'
})
setTimeout(() => {
this.etchecked = true
xBlufi.notifySendCustomData({
customData: '11unlock'
})
uni.hideLoading()
}, 1500)
}
},
// 点击添加设备
btnaddsb() {
//跳转后清空数据 重新进行连接
this.vardataflag = 1
this.ver_data = {}
this.datalist = ''
uni.navigateTo({
url: '/page_user/lanya'
})
},
// 点击选择浇水时间
confirm(e) {
this.minute = e.minute
this.second = e.second
this.jstime = Number(e.second) + Number(e.minute * 60)
},
// 点击跳转到定时页面
btntime() {
if(this.vardataflag != 3){
uni.showToast({
title: '蓝牙未连接',
icon: 'none',
duration: 2000
})
}else{
uni.navigateTo({
url: '/page_user/dingshi?list=' + JSON.stringify(this.ver_data)
})
}
},
// 点击取消手动浇水
btnqx() {
this.sdjsflag = false
this.sdminutes = ''
this.sdseconds = ''
this.kgflag = true
this.jsked = true
this.jskeds = false
},
// 确定选择时间
btnqd() {
if (this.minute == '--' || this.second == '--') {
uni.showToast({
title: '请选择浇水时长',
icon: 'none',
duration: 3000
})
} else {
uni.showLoading({
title: '开启中...'
})
setTimeout(() => {
xBlufi.notifySendCustomData({
customData: "11time@" + this.jstime + '@'
})
uni.hideLoading()
this.startTimer(this.jstime)
this.sdjsflag = false
}, 1500)
}
},
// 手动浇水定时器
startTimer(totalSeconds) {
let remainingSeconds = totalSeconds
const sdminutes = ''
const sdseconds = ''
this.timer = setInterval(() => {
// 计算分钟和秒
const minutes = Math.floor(remainingSeconds / 60).toString()
const secs = (remainingSeconds % 60).toString()
// 格式化秒和分钟,确保是两位数
this.sdseconds = secs.padStart(2, '0')
this.sdminutes = (minutes > 0 ? minutes : '').padStart(2, '0') // 如果分钟为0则不显示分钟
// 更新剩余秒数
remainingSeconds--
// 如果剩余秒数为0则停止定时器
if (remainingSeconds <= 0) {
clearInterval(this.timer)
this.btnkq()
this.sdminutes = ''
this.sdseconds = ''
}
}, 1000)
},
// 关闭手动浇水
btnkq() {
console.log('关闭')
if(this.vardataflag != 3){
uni.showToast({
title: '设备未连接',
icon: 'none',
duration:2000
})
}else{
uni.showLoading({
title: '关闭中...'
})
setTimeout(() => {
xBlufi.notifySendCustomData({
customData: "11close"
})
clearInterval(this.timer)
this.sdminutes = ''
this.sdseconds = ''
this.kgflag = true
this.jsked = true
this.jskeds = false
uni.hideLoading()
}, 1500)
}
},
// 开启手动浇水
btngb() {
console.log('开启')
if(this.vardataflag != 3){
uni.showToast({
title: '设备未连接',
icon: 'none',
duration:2000
})
this.jsked = true
this.jskeds = false
}else{
this.sdjsflag = true
this.kgflag = false
}
},
// 跳转到设置
btnsz() {
xBlufi.listenDeviceMsgEvent(false, this.funListenDeviceMsgEvent)
uni.navigateTo({
url: '/page_user/upload?deviceid=' + this.shebid + '&ver=' + this.ver
})
},
// 选择设备
btnactive(deviceId,index) {
this.shebid = deviceId
this.btnxuanze()
},
// 选择确定设备 shebid
btnxuanze() {
this.$u.put(`/app/toggleDevice?userId=${this.userobj.userId}&deviceId=${this.shebid}`).then(res => {
if(res.code == 200){
wx.closeBLEConnection({
deviceId: this.mac,
})
xBlufi.notifyConnectBle({
isStart: false,
deviceId: this.deviceId,
name: this.name
})
uni.showToast({
title: res.msg,
icon: 'success',
duration: 2000
})
this.datalist = ''
this.mac = ''
this.ver_data = {}
this.name = ''
this.deviceId = ''
this.xuanzeflag = false
this.vardataflag = 1
this.sdseconds = ''
this.sdminutes = ''
this.kgflag = true
this.jsked = true
this.jskeds = false
this.getshebxq()
}else{
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
})
}
})
},
// 获取设备信息
getshebxq(){
this.$u.get(`/app/getDeviceInfo/${this.shebid}`).then(res => {
if(res.code == 200){
this.mac = res.data.mac
this.deviceId = res.data.mac.match(/.{2}/g).reverse().join(':')
this.user = res.data
}
})
},
// 点击切换设备
btnksxz() {
if (this.xuanzeflag == true) {
this.xuanzeflag = false
} else {
this.xuanzeflag = true
}
},
//跳转到浇水日志页
btnjs() {
uni.showToast({
title: '此功能暂未开通',
icon: 'none',
duration:2000
})
// uni.navigateTo({
// url: '/page_user/jiaoshui'
// })
},
// 获取附近蓝牙设备列表
funListenDeviceMsgEvent: function(options) {
switch (options.type) {
case xBlufi.XBLUFI_TYPE.TYPE_STATUS_CONNECTED:
if (!options.result) {
this.vardataflag = 1
}
break;
case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS:
if (options.result) {
this.devicesarr = options.data
}
break;
case xBlufi.XBLUFI_TYPE.TYPE_CONNECTED:
console.log("连接回调:" + JSON.stringify(options))
if (options.result == true){
this.datalist = '1'
this.vardataflag = 3
xBlufi.notifyInitBleEsp32({
deviceId: this.deviceId
})
}else{
this.vardataflag = 1
}
break
case xBlufi.XBLUFI_TYPE.TYPE_RECIEVE_CUSTON_DATA:
console.log("1收到设备发来的自定义数据结果", options.data,options.data.length)
this.datalist = options.data.slice(0, -1) + ";"
this.vardataflag = 3
this.getchuli()
break
case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_START:
if (!options.result) {
console.log('蓝牙未开启')
return
}
break
}
},
// 每隔一时间发送一次获取数据
getshuju() {
const that = this
that.intervalId = setInterval(() => {
if (that.vardataflag == 3) {
xBlufi.notifySendCustomData({
customData: "11get"
})
}
console.log("定时器一段时间执行一次")
}, 10000)
},
// 清除定时器
clearTimer() {
if (this.intervalId) {
clearInterval(this.intervalId);
this.intervalId = null; // 重置定时器 ID
console.log("定时器已清除");
}
},
// 处理从设备接收数据
getchuli() {
const inputString = this.datalist
const [ver, restOfString] = inputString.split('@')
this.ver = ver || ''
console.log(this.ver, restOfString, 'ververver')
const processedString = restOfString
const pairs = processedString.split(';')
console.log(pairs,'10101010');
const showObject = {}
const pSetObjects = {}
// 解析字符串
pairs.forEach(pair => {
const [key, value] = pair.split(':')
if (key === 'show') {
showObject.showArray = value.split(',').map(Number)
} else if (key.startsWith('p_set')) {
pSetObjects[key] = value.split(',').map(Number)
}
})
this.ver_data = pSetObjects // 六个浇水时间段
this.jstimeobj = pSetObjects
this.showobj = showObject// 雨滴,锁,等是否开启
// 设置开关状态
this.yschecked = this.showobj.showArray[1] !== 1
this.etchecked = this.showobj.showArray[0] !== 1
// 计算浇水时间
const calculateTimeDifference = (date1, date2) => {
const diffMs = Math.abs(date1 - date2)
const diffMinutes = Math.floor(diffMs / (1000 * 60))
const diffHours = Math.floor(diffMinutes / 60)
const remainingMinutes = diffMinutes % 60
return { hours: diffHours, minutes: remainingMinutes }
}
const formatTime = (seconds) => {
const minutes = Math.floor(seconds / 60)
const remainingSeconds = seconds % 60
return `${minutes}分${remainingSeconds}秒`
}
const getTimeFromArray = (timeArray) => {
const [hour, minute, , second] = timeArray
const date = new Date()
date.setHours(hour, minute, second, 0) // 毫秒设为0
return date
}
let nextTime = null
let nextTimeDiff = null
let nextWaterDuration = null
let prevTime = null
for (const key in this.ver_data) {
if (this.ver_data.hasOwnProperty(key) && this.ver_data[key][3] === 1) {
const timeArray = this.ver_data[key]
const timeDate = getTimeFromArray(timeArray)
const diff = calculateTimeDifference(timeDate, new Date())
if (timeDate > new Date()) {
if (!nextTime || (diff.hours * 60 + diff.minutes < (nextTimeDiff?.hours || 0) * 60 + (nextTimeDiff?.minutes || 0))) {
nextTimeDiff = diff
nextTime = timeDate
nextWaterDuration = formatTime(timeArray[2])
}
} else if (!prevTime || timeDate > prevTime) {
prevTime = timeDate;
}
}
}
// 输出结果
this.xctime = nextTime ? `${nextTimeDiff.hours}时${nextTimeDiff.minutes}分` : '无距离下次浇水时间'
this.xctimesc = nextWaterDuration || '未知'
this.sctimejs = prevTime ? prevTime.toTimeString().slice(0, 5) : '无上次浇水时间'
this.xctimesj = nextTime ? nextTime.toTimeString().slice(0, 5) : '无下次浇水时间'
console.log('下次浇水时间', this.xctimesj, '距离下次浇水时间', this.xctime, '上次浇水时间', this.sctimejs)
}
}
}
</script>
<style lang="scss">
.rotated-image {
transform: rotate(180deg); /* 旋转 180 */
transition: transform 1s ease;
}
.container {
display: flex;
align-items: center;
justify-content: center;
margin-top: 22rpx;
view {
width: 242rpx;
height: 208rpx;
background: #F0F0F0;
border-radius: 24rpx 24rpx 24rpx 24rpx;
text-align: center;
line-height: 208rpx;
font-weight: 600;
font-size: 44rpx;
color: #3D3D3D;
}
text {
font-size: 80rpx;
margin-left: 46rpx;
margin-right: 46rpx;
}
}
.anniu {
display: flex;
justify-content: space-between;
margin-top: 58rpx;
.qx {
width: 278rpx;
height: 80rpx;
border-radius: 10rpx 10rpx 10rpx 10rpx;
border: 2rpx solid #7FAD76;
font-size: 36rpx;
color: #7FAD76;
font-weight: 600;
line-height: 80rpx;
text-align: center;
}
.qd {
width: 278rpx;
height: 80rpx;
background: #7FAD76;
border-radius: 10rpx 10rpx 10rpx 10rpx;
font-size: 36rpx;
color: #fff;
font-weight: 600;
line-height: 80rpx;
text-align: center;
}
}
.selected-time {
margin-top: 20px;
font-size: 20px;
}
#activebor {
border: 1px solid #48893B;
}
@keyframes fadeInDown {
from {
opacity: 0;
transform: translateY(-20px);
/* 初始位置稍微在上方 */
}
to {
opacity: 1;
transform: translateY(0);
/* 最终位置 */
}
}
.mask{
width: 100%;
height: 100vh;
background: #3D3D3D;
opacity: 0.2;
position: fixed;
top: 20%;
left: 0;
z-index: 1;
}
.manualmask {
width: 100%;
height: 100vh;
background: #3D3D3D;
opacity: 0.2;
position: fixed;
top: 0;
left: 0;
z-index: 99;
}
.manualjs {
width: 678rpx;
max-height: 610rpx;
background: #fff;
border-radius: 24rpx 24rpx 24rpx 24rpx;
position: fixed;
top: 538rpx;
left: 50%;
transform: translateX(-50%);
z-index: 100;
padding: 42rpx 44rpx;
box-sizing: border-box;
.toptit {
font-size: 36rpx;
color: #3D3D3D;
font-weight: 600;
display: flex;
justify-content: space-between;
align-items: center;
}
}
.page {
padding: 0 40rpx;
box-sizing: border-box;
.tabsb {
width: 750rpx;
max-height: 90vh;
background: #FFFFFF;
position: fixed;
top: 270rpx;
left: 0;
padding: 0 40rpx;
padding-bottom: 60rpx !important;
box-sizing: border-box;
border-radius: 0rpx 0rpx 50rpx 50rpx;
z-index: 2;
padding-top: 48rpx;
box-sizing: border-box;
animation: fadeInDown .5s ease-out forwards;
.qdan {
width: 100%;
height: 102rpx;
font-size: 48rpx;
color: #FFFFFF;
font-weight: 500;
line-height: 102rpx;
text-align: center;
background-color: #48893B;
border-radius: 20rpx;
margin-top: 40rpx;
}
.sblist {
width: 100%;
max-height: 68vh;
overflow: scroll;
.sbist_val {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20rpx 30rpx;
margin-bottom: 28rpx;
box-sizing: border-box;
background: #F7F7F7;
border-radius: 20rpx 20rpx 20rpx 20rpx;
border: 1px solid transparent;
.lt {
font-size: 36rpx;
color: #3D3D3D;
font-weight: 600;
}
.rt {
image {
width: 124rpx;
height: 124rpx;
}
}
}
}
}
.sbmask {
width: 100%;
height: 100vh;
background-color: rgb(238, 238, 238);
position: fixed;
top: 400rpx;
left: 0;
opacity: .5;
}
.wusb {
margin-top: 514rpx;
text-align: center;
text {
font-size: 28rpx;
color: #737B80;
}
view {
width: 212rpx;
height: 76rpx;
background: #48893B;
border-radius: 38rpx 38rpx 38rpx 38rpx;
border-radius: 50rpx;
font-size: 28rpx;
color: #FFFFFF;
text-align: center;
line-height: 76rpx;
margin: auto;
margin-top: 50rpx;
}
}
.wateringlogbox {
width: 100%;
height: 244rpx;
background: #FFFFFF;
box-shadow: 0rpx 0rpx 38rpx 0rpx rgba(128, 128, 128, 0.3);
filter: blur(0px);
border-radius: 20rpx;
margin-top: 20rpx;
padding: 30rpx;
box-sizing: border-box;
.wateringlogbd {
display: flex;
justify-content: space-between;
.lt {
view {
font-size: 28rpx;
color: #50565A;
margin-top: 10rpx;
}
}
.rt {
image {
width: 114rpx;
height: 114rpx;
}
}
}
.wateringlogtop {
display: flex;
align-items: center;
font-size: 32rpx;
color: #3D3D3D;
font-weight: 600;
image {
width: 40rpx;
height: 40rpx;
margin-right: 14rpx;
}
}
}
.dingshi_he {
margin-top: 24rpx;
width: 304rpx;
height: 194rpx;
background: #FFFFFF;
box-shadow: 0rpx 0rpx 38rpx 0rpx rgba(128, 128, 128, 0.3);
filter: blur(0px);
border-radius: 20rpx;
padding: 26rpx;
box-sizing: border-box;
.naoz {
font-size: 40rpx;
color: #3D3D3D;
font-weight: 600;
display: flex;
justify-content: space-between;
image {
width: 78rpx;
height: 78rpx;
}
}
.dstime {
margin-top: 14rpx;
display: flex;
align-items: center;
width: 100%;
justify-content: space-between;
image {
width: 52rpx;
height: 52rpx;
}
}
}
.switchbox {
margin-top: 24rpx;
display: flex;
justify-content: space-between;
.switch_he {
width: 304rpx;
height: 194rpx;
background: #FFFFFF;
box-shadow: 0rpx 0rpx 38rpx 0rpx rgba(128, 128, 128, 0.3);
filter: blur(0px);
border-radius: 20rpx;
padding: 26rpx;
box-sizing: border-box;
.yushui {
width: 100%;
font-size: 28rpx;
color: #3D3D3D;
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 20rpx;
}
image {
width: 78rpx;
height: 78rpx;
}
}
}
.devicebox {
width: 100%;
max-height: 320rpx;
background: #FFFFFF;
box-shadow: 0rpx 0rpx 38rpx 0rpx rgba(128, 128, 128, 0.3);
filter: blur(0px);
margin-top: 22rpx;
border-radius: 20rpx;
padding: 30rpx;
box-sizing: border-box;
.deviceweek {
display: flex;
justify-content: space-between;
margin-top: 34rpx;
.weeklist {
text-align: center;
.kg {
font-size: 24rpx;
color: #999999;
font-weight: 600;
}
.weekday {
font-size: 36rpx;
color: #3D3D3D;
font-weight: 600;
margin-top: 4rpx;
}
.img {
text-align: center;
image {
width: 12rpx;
height: 12rpx;
}
}
}
}
.devicetop {
display: flex;
justify-content: space-between;
align-items: center;
.devicert {
text-align: right;
.shoudong {
display: flex;
image {
width: 64rpx;
height: 32rpx;
margin-right: 8rpx;
}
font-size: 24rpx;
color: #3D3D3D;
}
.shengyu {
font-size: 24rpx;
color: #3D3D3D;
margin-top: 6rpx;
}
}
.devicelt {
display: flex;
.xinghao {
font-size: 24rpx;
color: #3D3D3D;
.one {
font-size: 28rpx !important;
color: #3D3D3D;
font-weight: 600 !important;
margin-top: 6rpx;
}
}
image {
width: 74rpx;
height: 80rpx;
margin-right: 32rpx;
}
}
}
}
.selectbox {
width: 100%;
margin-top: 22rpx;
display: flex;
justify-content: space-between;
align-items: center;
.shebeiname {
font-size: 36rpx;
color: #73787B;
font-weight: 600;
display: flex;
align-items: center;
.lj{
color: red;
margin-left: 10rpx;
font-weight: 400;
font-size: 28rpx;
border: 1px solid red;
padding: 4rpx;
box-sizing: border-box;
border-radius: 10rpx;
}
text {
display: inline-block;
width: 14rpx;
height: 14rpx;
background: #15C55D;
border-radius: 50%;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(0, 255, 102, 0.9), 0rpx 0rpx 30rpx 0rpx rgba(69, 255, 143, 0.9);
margin-left: 22rpx;
}
}
.shebeiadd {
image {
width: 214rpx;
height: 64rpx;
}
}
.selectname {
font-size: 48rpx;
color: #3D3D3D;
font-weight: 600;
z-index: 2;
image {
width: 32rpx;
height: 26rpx;
margin-left: 14rpx;
}
}
.selectnames {
font-size: 28rpx;
color: #3D3D3D;
border: 1px solid;
padding:0 20rpx;
box-sizing: border-box;
border-radius: 10rpx;
background-color: #7FAD76;
color: #fff;
height: 60rpx;
line-height: 60rpx;
image {
width: 32rpx;
height: 26rpx;
margin-left: 14rpx;
}
}
.selectshezhi {
image {
width: 60rpx;
height: 66rpx;
}
}
}
.bjimg {
width: 100%;
height: 100vh;
position: fixed;
top: 0;
left: 0;
z-index: -1;
}
.title {
box-sizing: border-box;
image {
width: 260rpx;
height: 60rpx;
}
}
}
</style>