Sprinkler-app/pages/index/index.vue
2024-12-05 14:36:26 +08:00

1655 lines
42 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 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" @click="btnlj">
{{user.deviceName == undefined ? '--' : user.deviceName}} <text style="background-color: red;box-shadow: 0rpx 0rpx 10rpx 0rpx red, 0rpx 0rpx 30rpx 0rpx red" v-if="datalist == ''"></text> <text v-else></text>
</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>
NO
</view>
<view class="weekday">
P1
</view>
<view class="img">
<image
v-if="formattedTime(ver_data.p_set0[0],ver_data.p_set0[1])== xctimesj || formattedTime(ver_data.p_set0[0],Number(ver_data.p_set0[1]) + 1) == xctimesj"
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>
NO
</view>
<view class="weekday">
P2
</view>
<view class="img">
<image
v-if="formattedTime(ver_data.p_set1[0],ver_data.p_set1[1]) == xctimesj || formattedTime(ver_data.p_set1[0],Number(ver_data.p_set1[1]) + 1) == xctimesj"
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>
NO
</view>
<view class="weekday">
P3
</view>
<view class="img">
<image
v-if="formattedTime(ver_data.p_set2[0],ver_data.p_set2[1]) == xctimesj || formattedTime(ver_data.p_set2[0],Number(ver_data.p_set2[1]) + 1) == xctimesj"
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>
NO
</view>
<view class="weekday">
P4
</view>
<view class="img">
<image
v-if="formattedTime(ver_data.p_set3[0],ver_data.p_set3[1]) == xctimesj || formattedTime(ver_data.p_set3[0],Number(ver_data.p_set3[1]) + 1) == xctimesj"
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>
NO
</view>
<view class="weekday">
P5
</view>
<view class="img">
<image
v-if="formattedTime(ver_data.p_set4[0],ver_data.p_set4[1]) == xctimesj || formattedTime(ver_data.p_set4[0],Number(ver_data.p_set4[1]) + 1) == xctimesj"
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>
NO
</view>
<view class="weekday">
P6
</view>
<view class="img">
<image
v-if="formattedTime(ver_data.p_set5[0],ver_data.p_set5[1]) == xctimesj || formattedTime(ver_data.p_set5[0],Number(ver_data.p_set5[1]) + 1) == xctimesj"
src="https://api.ccttiot.com/smartmeter/img/static/u9iZpd6bW6bUsUay4uvH" mode="">
</image>
</view>
</view>
</view>
</view>
<!-- <button @click="kq">开启</button><button @click="gb">关闭</button><button @click="hq">获取</button> -->
<!-- 开关选择 -->
<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="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="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"
:id="activeshu == index ? 'activebor' : ''" @click="btnactive(item.deviceId,index)">
<view class="lt">
<view class="">{{item.deviceName}}</view>
<view class="" style="margin-top: 14rpx;">型号:{{item.model}}</view>
</view>
<view class="rt">
<image src="https://api.ccttiot.com/smartmeter/img/static/uVKucPVDjxjaCDCpFKvw" mode=""></image>
</view>
</view>
</view>
<view class="qdan" @click="btnxuanze">
确定
</view>
</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" :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,
yschecked: true,
etchecked: true,
kgflag: false,
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: {},
showobj: {},
xctime: '--',
sctimejs: '--',
xctimesc: '--',
xctimesj: '',
sdminutes: '',
sdseconds: '',
datalist: '',
devicelist:[],
shebid:'',
user:{},
lastChar:'',
timer:'',
bjflag:false,
userobj:{}
}
},
// 分享到好友(会话)
onShareAppMessage: function() {
return {
title: '绿小能',
path: '/pages/index/index'
}
},
// 分享到朋友圈
onShareTimeline: function() {
return {
title: '绿小能',
query: '',
path: '/pages/index/index'
}
},
onLoad() {
},
onShow() {
// 请求个人信息
this.getinfo()
// 一进来每分钟发一次上传信息命令
this.getshuju()
},
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');
// 返回格式化后的时间字符串
return `${formattedMinutes}:${formattedSeconds}`;
},
// 点击连接
btnlj() {
let that = this
xBlufi.initXBlufi(1)
xBlufi.listenDeviceMsgEvent(true, that.funListenDeviceMsgEvent)
xBlufi.notifyStartDiscoverBle({
'isStart': true
})
this.getchao()
setTimeout(() => {
xBlufi.notifyStartDiscoverBle({
'isStart': false
})
if (that.devicesList.length > 0) {
xBlufi.notifyConnectBle({
isStart: true,
deviceId: that.deviceId,
name: that.name
})
}
}, 5000)
},
// 连接超时提示
getchao(){
uni.showLoading({
title: '浇花器连接中...'
})
this.getshebxq()
setTimeout(()=>{
uni.hideLoading()
if(this.datalist == ''){
let that = this
uni.showModal({
title: '提示',
content: '未连接成功是否重新连接重新连接请确保设备在附近5米范围内',
success: function (res) {
if (res.confirm) {
uni.hideLoading()
that.getinfo()
} else if (res.cancel) {
uni.hideLoading()
uni.showToast({
title: '已取消连接',
icon: 'none',
duration:2000
})
}
}
})
}else{
uni.showToast({
title: '设备连接成功',
icon: 'success',
duration:2000
})
}
},15000)
},
// 静默登录
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()
}
})
},
// 雨水感应开启
btnyushui() {
this.one = false
this.ones = true
if(this.datalist == ''){
let that = this
uni.showModal({
title: '提示',
content: '设备未连接,是否进行设备连接?',
success: function (res) {
if (res.confirm) {
uni.hideLoading()
that.btnlj()
} else if (res.cancel) {
uni.hideLoading()
uni.showToast({
title: '已取消连接',
icon: 'none',
duration:2000
})
}
}
})
}else{
uni.showLoading({
title: '开启中...'
})
let that = this
uni.getNetworkType({
success(res) {
if (res.networkType !== 'none') {
uni.getConnectedBluetoothDevices({
success(res) {
setTimeout(() => {
that.yschecked = false
xBlufi.notifySendCustomData({
customData: '11yudi'
})
uni.hideLoading()
}, 1500)
},
fail(err) {
console.error('获取已连接蓝牙设备信息失败:', err)
}
})
} else {
console.log('手机未连接网络')
}
}
})
}
},
// 雨水感应关闭
btnyushuis() {
this.one = false
this.ones = true
if(this.datalist == ''){
let that = this
uni.showModal({
title: '提示',
content: '设备未连接,是否进行设备连接?',
success: function (res) {
if (res.confirm) {
uni.hideLoading()
that.btnlj()
} else if (res.cancel) {
uni.hideLoading()
uni.showToast({
title: '已取消连接',
icon: 'none',
duration:2000
})
}
}
})
}else{
uni.showLoading({
title: '关闭中...'
})
let that = this
uni.getNetworkType({
success(res) {
if (res.networkType !== 'none') {
uni.getConnectedBluetoothDevices({
success(res) {
setTimeout(() => {
that.yschecked = true
xBlufi.notifySendCustomData({
customData: '11unyudi'
})
uni.hideLoading()
}, 1500)
},
fail(err) {
console.error('获取已连接蓝牙设备信息失败:', err)
}
})
} else {
console.log('手机未连接网络')
}
}
})
}
},
// 点击儿童锁开启
btnertong() {
this.two = false
this.twos = true
if(this.datalist == ''){
let that = this
uni.showModal({
title: '提示',
content: '设备未连接,是否进行设备连接?',
success: function (res) {
if (res.confirm) {
uni.hideLoading()
that.btnlj()
} else if (res.cancel) {
uni.hideLoading()
uni.showToast({
title: '已取消连接',
icon: 'none',
duration:2000
})
}
}
})
}else{
uni.showLoading({
title: '开启中...'
})
let that = this
uni.getNetworkType({
success(res) {
if (res.networkType !== 'none') {
uni.getConnectedBluetoothDevices({
success(res) {
setTimeout(() => {
that.etchecked = false
xBlufi.notifySendCustomData({
customData: '11lock'
})
uni.hideLoading()
}, 1500)
},
fail(err) {
console.error('获取已连接蓝牙设备信息失败:', err)
}
})
} else {
console.log('手机未连接网络')
}
}
})
}
},
// 点击儿童锁关闭
btnertongs() {
this.two = false
this.twos = true
if(this.datalist == ''){
let that = this
uni.showModal({
title: '提示',
content: '设备未连接,是否进行设备连接?',
success: function (res) {
if (res.confirm) {
uni.hideLoading()
that.btnlj()
} else if (res.cancel) {
uni.hideLoading()
uni.showToast({
title: '已取消连接',
icon: 'none',
duration:2000
})
}
}
})
}else{
uni.showLoading({
title: '关闭中...'
})
let that = this
uni.getNetworkType({
success(res) {
if (res.networkType !== 'none') {
uni.getConnectedBluetoothDevices({
success(res) {
setTimeout(() => {
that.etchecked = true
xBlufi.notifySendCustomData({
customData: '11unlock'
})
uni.hideLoading()
}, 1500)
},
fail(err) {
console.error('获取已连接蓝牙设备信息失败:', err)
}
})
} else {
console.log('手机未连接网络')
}
}
})
}
},
// 点击添加设备
btnaddsb() {
//跳转后清空数据 重新进行连接
this.datalist = ''
this.mac = ''
this.ver_data = {}
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() {
uni.navigateTo({
url: '/page_user/dingshi?list=' + JSON.stringify(this.ver_data)
})
},
// 点击取消手动浇水
btnqx() {
this.sdjsflag = false
},
// 确定选择时间
btnqd() {
if (this.minute == '--' || this.second == '--') {
uni.showToast({
title: '请选择浇水时长',
icon: 'none',
duration: 3000
})
} else {
uni.showLoading({
title: '开启中...'
})
let that = this
uni.getNetworkType({
success(res) {
if (res.networkType !== 'none') {
uni.getConnectedBluetoothDevices({
success(res) {
setTimeout(() => {
xBlufi.notifySendCustomData({
customData: "11time@" + that.jstime + '@'
})
uni.hideLoading()
that.startTimer(that.jstime)
that.sdjsflag = false
that.kgflag = true
}, 1500)
},
fail(err) {
console.error('获取已连接蓝牙设备信息失败:', err)
}
})
} else {
console.log('手机未连接网络')
}
}
})
}
},
// 手动浇水定时器
startTimer(totalSeconds) {
let remainingSeconds = totalSeconds; // 正确初始化 remainingSeconds
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() {
if(this.datalist == ''){
let that = this
uni.showModal({
title: '提示',
content: '设备未连接,是否进行设备连接?',
success: function (res) {
if (res.confirm) {
uni.hideLoading()
that.btnlj()
} else if (res.cancel) {
uni.hideLoading()
uni.showToast({
title: '已取消连接',
icon: 'none',
duration:2000
})
}
}
})
}else{
uni.showLoading({
title: '关闭中...'
})
let that = this
uni.getNetworkType({
success(res) {
if (res.networkType !== 'none') {
uni.getConnectedBluetoothDevices({
success(res) {
setTimeout(() => {
xBlufi.notifySendCustomData({
customData: "11close"
})
// that.startTimer(0)
clearInterval(that.timer)
that.sdminutes = ''
that.sdseconds = ''
that.kgflag = false
uni.hideLoading()
}, 1500)
},
fail(err) {
console.error('获取已连接蓝牙设备信息失败:', err)
}
})
}
}
})
}
},
// 开启手动浇水
btngb() {
if(this.datalist == ''){
uni.showModal({
title: '提示',
content: '设备未连接,是否进行设备连接?',
success: function (res) {
if (res.confirm) {
uni.hideLoading()
that.btnlj()
} else if (res.cancel) {
uni.hideLoading()
uni.showToast({
title: '已取消连接',
icon: 'none',
duration:2000
})
}
}
})
}else{
this.sdjsflag = true
}
},
// 跳转到设置
btnsz() {
uni.navigateTo({
url: '/page_user/upload?deviceid=' + this.shebid
})
},
// 选择设备
btnactive(deviceId,index) {
this.shebid = deviceId
this.activeshu = index
},
// 选择确定设备 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,
})
uni.showToast({
title: res.msg,
icon: 'success',
duration: 2000
})
this.datalist = ''
this.mac = ''
this.ver_data = {}
this.name = ''
this.deviceId = ''
this.xuanzeflag = false
let that = this
xBlufi.initXBlufi(1)
xBlufi.listenDeviceMsgEvent(true, that.funListenDeviceMsgEvent)
xBlufi.notifyStartDiscoverBle({
'isStart': true
})
setTimeout(() => {
xBlufi.notifyStartDiscoverBle({
'isStart': false
})
if (that.devicesList.length > 0) {
xBlufi.notifyConnectBle({
isStart: true,
deviceId: that.deviceId,
name: that.name
})
}
}, 5000)
that.getchao()
}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.user = res.data
uni.showLoading({
title: '浇花器连接中...'
})
}
})
},
// 获取设备列表
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.user = res.data[0]
this.shebid = res.data[0].deviceId
if(this.datalist == ''){
let that = this
uni.showModal({
title: '提示',
content: '设备未连接,是否进行设备连接?',
success: function (res) {
if (res.confirm) {
uni.hideLoading()
that.btnlj()
} else if (res.cancel) {
uni.hideLoading()
uni.showToast({
title: '已取消连接',
icon: 'none',
duration:2000
})
}
}
})
}
}else{
this.bjflag = true
}
}
})
},
// 点击切换设备
btnksxz() {
if (this.xuanzeflag == true) {
this.xuanzeflag = false
} else {
this.xuanzeflag = true
}
},
//跳转到浇水日志页
btnjs() {
uni.navigateTo({
url: '/page_user/jiaoshui'
})
},
// 获取附近蓝牙设备列表
funListenDeviceMsgEvent: function(options) {
switch (options.type) {
case xBlufi.XBLUFI_TYPE.TYPE_STATUS_CONNECTED:
if (!options.result) {
this.datalist = ''
this.ver_data = ''
// uni.showModal({
// title: '很抱歉提醒你!',
// content: '小程序与设备异常断开',
// showCancel: false,
// //是否显示取消按钮
// success: function(res) {
// uni.hideLoading()
// this.datalist = ''
// this.ver_data = ''
// }
// })
}
break;
case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS:
if (options.result) {
let devicesarr = options.data
// console.log(devicesarr,'111')
devicesarr.forEach(device => {
const mac = device.name.substring(4)
if (device.name.slice(5, 17) == this.mac) {
this.deviceId = device.deviceId
this.name = device.name
this.devicesList.push(device)
let uniqueDevicesList = Array.from(new Set(this.devicesList))
this.devicesList = uniqueDevicesList;
}
})
}
break;
case xBlufi.XBLUFI_TYPE.TYPE_CONNECTED:
console.log("连接回调:" + JSON.stringify(options))
uni.getNetworkType({
success(res) {
if (res.networkType !== 'none') {
uni.getConnectedBluetoothDevices({
success(res) {
setTimeout(() => {
xBlufi.notifySendCustomData({
customData: "11get"
})
}, 3000)
},
fail(err) {
console.error('获取已连接蓝牙设备信息失败:', err)
}
})
}
}
})
uni.setStorageSync('device_key', 'true')
if (options.result) {
{
xBlufi.notifyInitBleEsp32({
deviceId: this.deviceId
})
this.name = this.name
}
} else {
}
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.getchuli()
break
case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_STOP:
if (options.result) {
let uniqueDevicesList = Array.from(new Set(this.devicesList))
let filteredDevices = uniqueDevicesList.filter(device => device.name.substring(0, 5) ===
"WATER")
// 将过滤后的数组重新赋值给 this.devicesList
this.devicesList = filteredDevices
}
break;
case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_START:
if (!options.result) {
uni.hideLoading()
// uni.showToast({
// title: '蓝牙未开启',
// icon: 'none',
// duration: 3000
// })
uni.showModal({
title: '提示',
content: '请打开蓝牙和位置信息',
success: function (res) {
if (res.confirm) {
uni.hideLoading()
that.btnlj()
} else if (res.cancel) {
uni.hideLoading()
uni.showToast({
title: '已取消连接',
icon: 'none',
duration:2000
})
}
}
})
return
}
break
}
},
// 每隔一分钟发送一次获取数据
getshuju() {
let that = this
const intervalId = setInterval(() => {
uni.getNetworkType({
success(res) {
if (res.networkType !== 'none') {
uni.getConnectedBluetoothDevices({
success(res) {
setTimeout(() => {
xBlufi.notifySendCustomData({
customData: "11get"
})
console.log(that.ver_data,'000');
if(that.ver_data != ''){
that.getchuli()
}
}, 1000)
},
fail(err) {
console.error('获取已连接蓝牙设备信息失败:', err)
}
})
}
}
})
console.log("定时器每分钟执行一次")
}, 60000)
},
// 处理从设备接收数据
getchuli() {
const inputString = this.datalist
const pairs = inputString.split(';')
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')) {
const numbers = value.split(',').map(Number)
pSetObjects[key] = numbers
}
})
this.ver_data = pSetObjects //六个浇水时间段
console.log(inputString,this.ver_data, '002002002')
this.showobj = showObject //雨滴,锁,等是否开启
if (this.showobj.showArray[1] == 1) {
this.yschecked = false
} else {
this.yschecked = true
}
if (this.showobj.showArray[0] == 1) {
this.etchecked = false
} else {
this.etchecked = true
}
// 计算浇水时间
const ver_Data = this.ver_data
function secondsToMinutesAndSeconds(seconds) {
const minutes = Math.floor(seconds / 60)
const remainingSeconds = seconds % 60
return `${minutes}分${remainingSeconds}秒`
}
function timeArrayToDate(timeArray) {
const [hour, minute,minutes, second, /* other fields */ ] = timeArray
const date = new Date()
date.setHours(hour, minute,minute, second, 0) // 毫秒设为0
console.log(date,'11111')
return date
}
function timeDifference(date1, date2) {
const diffMs = Math.abs(date1 - date2)
const diffSeconds = Math.floor(diffMs / 1000)
const diffMinutes = Math.floor(diffSeconds / 60)
const diffHours = Math.floor(diffMinutes / 60)
const remainingMinutes = diffMinutes % 60
return {
hours: diffHours,
minutes: remainingMinutes
}
}
let nextTimeDiff = null
let nextTime = null
let prevTimeDiff = null
let prevTime = null
let nextWaterDuration = null
for (const key in ver_Data) {
if (ver_Data.hasOwnProperty(key) && ver_Data[key][3] === 1) {
const timeArray = ver_Data[key]
console.log(timeArray,'00000')
const timeDate = timeArrayToDate(timeArray)
const diff = timeDifference(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 = secondsToMinutesAndSeconds(timeArray[2])
}
} else {
if (!prevTime || (new Date() - timeDate < new Date() - (prevTime || new Date(0)))) {
prevTimeDiff = timeDifference(new Date(), timeDate)
prevTime = timeDate
}
}
}
}
// 输出结果,确保在访问 null 值之前进行检查
this.xctime = nextTime ? `${nextTimeDiff.hours}时${nextTimeDiff.minutes}分` : '无距离下次浇水时间'
this.xctimesc = nextWaterDuration || '未知'
this.sctimejs = prevTime ? prevTime.toTimeString().split(' ')[0].slice(0, -3) : '无上次浇水时间'
this.xctimesj = nextTime ? nextTime.toTimeString().split(' ')[0].slice(0, -3) : '无下次浇水时间'
console.log('下次浇水时间',this.xctimesj,'距离下次浇水时间',this.xctime,'上次浇水时间',this.sctimejs)
}
}
}
</script>
<style lang="scss">
.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);
/* 最终位置 */
}
}
.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;
// background-color: #FFFFFF;
.tabsb {
width: 750rpx;
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: 1;
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: 600;
line-height: 102rpx;
text-align: center;
background-color: #48893B;
border-radius: 20rpx;
margin-top: 40rpx;
}
.sblist {
width: 100%;
height: 68vh;
overflow: scroll;
.sbist_val {
display: flex;
justify-content: space-between;
align-items: center;
padding: 40rpx 34rpx;
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%;
height: 290rpx;
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;
// align-items: center;
.weeklist {
.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;
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;
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>