云南土土 发布的文章

        Domoticz的网页显示适合管理,不适合展示数据内容,自定义显示方式十分有必要。Domoticz本身是可以自定义页面的,https://www.domoticz.cn/wiki/%E8%87%AA%E5%AE%9A%E4%B9%89%E7%8A%B6%E6%80%81%E9%A1%B5就讲了如何设置自定义页面的方法,但说得不清不楚,在试验成功的基础上,总结下自定义页面的做法。

        首先找一个喜欢的自定义页面,把页面html代码拷贝出来,比如下面这个:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Domoticz</title> 
<link href="http://fonts.googleapis.com/css?family=Orbitron:700" rel="stylesheet" type="text/css">
<script src="https://cdn.staticfile.org/jquery/1.12.0/jquery.min.js"></script>
<style type="text/css">
div#cnt {
    width: 990px;
    margin: 0 auto;
    text-align: center;
}
a, a:visited { text-decoration: none; color: #336699; }
a:hover { text-decoration: none; color: #003366; }
#frame {
    float: left;
    margin: 0px;
    padding: 0px 2px 0px 2px;
}
#label_lg {
    font-family: arial;
    font-weight: normal;
    color: #999;
    font-size: 17px;
    margin-top: -20px;
    height: 25px;
    line-height: 10px;
}
#itemp {
    font-family: Orbitron, serif;
    font-weight: bold;
    width: 570px;
    padding: 5px;
    border: 1px solid #666;
    height: 217px;    
    line-height: 210px; 
    font-size: 180px;    
    color: darkorange;
    margin: 0px ;
}
#oFloor, #purifier, #uv, #ihum, #astat, #astatw, #otemp, #crte,
#uv, #rain, #ohum, #ocld, #wtxt, #ctime, #brLight, #ctemp, #lrLight, 
#waterHeater, #eHeating, #tmpc, #crte, #whWatt, #wind, #hWatt, 
#cpuTemp, #ram, #space, #cpuUsage {
    font-family: Orbitron, serif;
    font-weight: bold;
    width: 162px;
    padding: 10px;
    border: 1px solid #666;
    height: 90px;
    line-height: 75px;         
    font-size: 90px;
    color: #999;
}
#ctime, #brLight, #lrLight, #waterHeater, #eHeating, #tmpc, #crte, #whWatt, #uv, 
#rain, #ohum, #ocld, #wtxt, #otemp, #wind, #astat, #awatt, 
#astatw, #hWatt, #cpuUsage, #cpuTemp, #ram, #space {
    height: 65px;
    line-height: 55px;
    color: #999;
}
#hWatt, #cpuUsage, #crte, #wind { 
    width: 184px; 
}
#wtxt { 
    width: 560px; 
    font-size: 40px;
    line-height: 55px;
    color: darkorange;
}
#al { 
    margin-left: -35px; 
    margin-top: 55px; 
    width: 1050px;height: 570px;    
}
</style>
</head>
<div id="images"></div>
<body bgcolor="#000">
<div id="cnt">
<div style="margin-bottom:5px;">
<div>
<div>
<div id="frame">
    <div id="ihum" style="color:lightblue;font-size:50px;">--</div>
    <div id="label_lg">室内湿度 (%)</div>
    <div id="purifier" style="font-size:35px;">--</div>
    <div id="label_lg">空气净化器</div>
</div>
<div id="frame">
    <div id="itemp">--</div>
    <div id="label_lg" style="font-size:25px;margin-top:-30px;">卧室温度 (º<span class="degsign">C</span>)</div>
</div>
<div id="frame">
    <div id="oFloor" style="color:teal;font-size:50px;">--</div>
    <div id="label_lg">一楼温度 (º<span class="degsign">C</span>)</div>
    <div id="ctemp" style="color:#6666FF;font-size:50px;">--</div>
    <div id="label_lg">地下室温度 (º<span class="degsign">C</span>)</div>
</div>
</div>
<div>
<div id="frame">
    <div id="brLight" style="font-size:40px;">--</div>
    <div id="label_lg">卧室灯</div>
</div>
<div id="frame">
    <div id="lrLight" style="font-size:40px;">--</div>
    <div id="label_lg">客厅灯</div>
</div>
<div id="frame">
    <div id="eHeating" style="font-size:40px;">--</div>
    <div id="label_lg">电暖气</div>
</div>
<div id="frame">
    <div id="hWatt" style="font-size:40px;">--</div>
    <div id="label_lg">电暖气功率</div>
</div>
<div id="frame">
    <div id="waterHeater" style="font-size:40px;">--</div>
    <div id="label_lg">热水器</div>
</div>
</div>
<div>
<div id="frame">
    <div id="space" style="font-size:40px;;color:#3333cc;">--</div>
    <div id="label_lg">硬盘占用</div>
</div>
<div id="frame">
    <div id="ram" style="font-size:40px;color:#009933;">--</div>
    <div id="label_lg">内存占用</div>
</div>
<div id="frame">
    <div id="cpuUsage" style="font-size:40px;color:#ff3333;">--</div>
    <div id="label_lg">CPU使用率</div>
</div>
<div id="frame">
    <div id="cpuTemp" style="font-size:40px;color:#ff3333;">--</div>
    <div id="label_lg">CPU温度 (º<span class="degsign">C</span>)</div>
</div>
<div id="frame">
    <div id="whWatt" style="font-size:40px;color:#ff3333;">--</div>
    <div id="label_lg">热水器功率</div>
</div>
</div>
<div>
<div id="frame">
    <div id="rain" style="font-size:40px;">--</div>
    <div id="label_lg">日降雨量 (MM)</div>
</div>
<div id="frame">
    <div id="uv" style="font-size:40px;color:#C34A2C;">--</div>
    <div id="label_lg">紫外线指数 (UVI)</div>
</div>
<div id="frame">
    <div id="wind" style="font-size:40px;">--</div>
    <div id="label_lg">风速 (<span class="windsign">km/h</span>)</div>
</div>
<div id="frame">
    <div id="otemp" style="font-size:40px;color:darkorange;">--</div>
    <div id="label_lg">户外温度 (º<span class="degsign">C</span>)</div>
</div>
<div id="frame">
    <div id="ohum" style="font-size:40px;color:teal;">--</div>
    <div id="label_lg">户外湿度 (%)</div>
</div>
</div>
<div>
<div id="frame">
    <div id="astat" style="font-size:40px;">--</div>
    <div id="label_lg">净化器功率</div>
</div>
<div id="frame">
    <div id="wtxt">--</div>
    <div id="label_lg">天气</div>
</div>
<div id="frame">
    <div id="astatw" style="font-size:40px;">--</div>
    <div id="label_lg">气压 (hPa)</div>
</div>
</div>
</div>
<div id="all"></div><br>
</div>
</div>
<script type="text/javascript" charset="utf-8">
$.roomplan=0;
$.domoticzurl="http://127.0.0.1:8080";
function RefreshData(){
    clearInterval($.refreshTimer);
    var jurl=$.domoticzurl+"/json.htm?type=devices&plan="+$.roomplan+"&jsoncallback=?";
    $.getJSON(jurl,
        {
            format: "json"
        },
        function(data) {
            if (typeof data.result != 'undefined') {
                if (typeof data.WindSign != 'undefined') {
                    $('.windsign').html(data.WindSign);
                }
                if (typeof data.TempSign != 'undefined') {
                    $('.degsign').html(data.TempSign);
                }
                $.each(data.result, function(i,item){
                    for( var ii = 0, len = $.PageArray.length; ii < len; ii++ ) {
                        if( $.PageArray[ii][0] === item.idx ) {
                            var vtype=$.PageArray[ii][1];
                            var vlabel=$.PageArray[ii][2];
                            var vdata=item[vtype];
                            if (typeof vdata == 'undefined') {
                                vdata="??";
                            }
                            else {
                                vdata=new String(vdata).split(" ",1)[0];
                            }
                            $('#'+vlabel).html(vdata);
                        }
                    }
                });
            }
        });
    $.refreshTimer = setInterval(RefreshData, 10000);
}
$(document).ready(function() {
    $.PageArray = [
        //格式: idx, value, label, comment
        ['19','Temp','itemp','woonkamer'],        //卧室温度
        ['0','Humidity','ihum','woonkamer'],    //室内湿度
        ['4','Barometer','astatw','woonkamer'],    //气压
        ['9','ForecastStr','wtxt','woonkamer'],    //天气
        ['4','Temp','otemp','buiten'],            //户外温度
        ['17','Humidity','ohum','buiten'],        //户外湿度
        ['0','Temp','oFloor','room setpoint'],    //一楼温度
        ['15','Data','cpuTemp','cputemp'],        //CPU温度
        ['16','Data','cpuUsage','cpuusage'],    //CPU占用
        ['7','Rain','rain','rain'],                //降雨量
        ['12','Data','ram','ram'],                //内存占用
        ['6','UVI','uv','uv'],                    //紫外线
        ['8','Data','wind','wind'],                //风速
        ['2','Status','brLight','light'],        //卧室灯
        ['3','Status','lrLight','light'],        //客厅灯
        ['14','Data','space','HardDriver']        //硬盘占用
    ];
    RefreshData();
});  
</script>
</body>
</html>

        修改html当中的一些参数:

        首先修改房间号:设置了多个房间的下面改为对应的编号,跨多个房间的数据要显示的,选择0

$.roomplan=0;

        其次改domoticz地址,在内网部署的话,一般是

$.domoticzurl="http://192.168.1.XXX:8080";

        然后观察图片
Frontpage.jpg
中各个数据显示块的内容,把对应位置的名称改为自己想要展示的数据名称

<div id="label_lg">室内湿度 (%)</div>

        数据命名行中的id记清楚,然后到$.PageArray中修改或加入对应的JSON格式数据

['19','Temp','itemp','woonkamer'],        //卧室温度

        第一个单引号内是domoticz中相关硬件设备的idx,第二个单引号内是对应硬件设备反馈JSON数据中要显示哪个栏目的内容,第三个单引号内是对应数据命名行中的id,第四个单引号内是描述,可以不用管它。每个要显示的数据栏需要有这么一行数据。

        其中容易出问题的是第二个单引号的填写内容,如果错误或没有对应栏目,数据处会显示??。用http://192.168.1.XXX:8080/json.htm?type=devices&plan=0来看所有设备的状态数据,找到对应idx设备的数据,在{}之间的json数据中找到要展示的栏目,把栏目名称填进去。对传感器而言,温度一般是Temp,湿度一般是Humidity,气压一般是Barometer,其他自己定义的传感器如果没有具体的栏目可以填写Data。开关状态显示填Status。

        这个html文件修改调试好后,比如叫a.html,把它移动到/home/pi/domoticz/www/views目录下,这样在浏览器中输入网址http://192.168.1.XXX:8080/views/a.html就可以在浏览器中显示自定义页面内容了。我调整过的页面如下:
domoticz自定义页面.png

可以设置开机自动显示,在终端界面中输入指令:

cd /home/pi/.config/
mkdir autostart
cd /autostart
sudo nano my.desktop

输入如下指令:

[Desktop Entry]
Type=Application
Exec=chromium-browser  --disable-popup-blocking --no-first-run --disable-desktop-notifications  --kiosk "http://192.168.1.XXX:8080/views/a.html"

重启生效。因为是全屏模式,遮蔽了菜单界面等,如要退出按Alt+F4。

为了实现内网穿透,几年前买了一个花生壳盒子,能用,慢,不另外花钱只能用两个链接,虽然很不满意,因为还能用,也就将就着用下来了。

然后半年前忽然就无法访问了,进到官网一看,修改了协议,要补充这个那个,补充完了还是不行,逼着我付费?不惯它,宁可不用。但是不用还是不方便,网上查了一圈,用ddns-go可以实现内网穿透,IPV6真正派上用场,原来我以为的IPV6光打雷不下雨是我错怪了它。这个方法不用额外花钱,速度极快,而且能够穿透的设备数和端口数没有限制,让那些付费的工具见鬼去吧!

先注册一个域名;
在域名服务商那里申请API,获得ID和TOKEN;
树莓派上部署:
安装docker:
sudo curl -sSL https://get.docker.com | sh
检查是否安装正确:
docker -v
设置开机自启动docker:
sudo systemctl enable docker
拉取图形界面镜像:
sudo docker pull portainer/portainer-ce
创建相关卷:
sudo docker volume create portainer_data
启动图形界面容器:
sudo docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
拉取ddns-go镜像:
sudo docker pull jeessy/ddns-go
启动ddns-go容器:
sudo docker run -d --name ddns-go --restart=always --net=host -p 192.168.1.XXX:9876:9876 jeessy/ddns-go -l :9876 -f 1400
进入界面设置:
192.168.1.XXX:9876
填写dnspod,ID,token,选择IPV6,通过网卡获取地址,240X为公网IPV6地址,填写域名,访问:域名:XXXX(根据你的应用而定)

避坑指南:一个API只能对应一台硬件,因为它是解析该硬件的公网IPV6地址,如果内网有多个设备需要穿透,需要申请多个API,一一对应才能成功,一个硬件设置后,该硬件上所有端口都可以使用,比如用22进行SSH等。

        clockworkpi是一家中国公司生产的可以独立运行的树莓派掌上电脑,集成了CM4核心卡,一块720P的屏幕,一个全键盘,以及微型轨迹球,两节18650电池等,工业朋克风的设计风格让人爱不释手。一直想用树莓派做个微型电脑,用来学习linux和对家里的诸多树莓派进行一些命令行的操作,然而工作量不是一般的大,合适的屏幕和配件就很难找到,而这种东西一旦凑合用了通用的配件,一下子格调就降下来了,变成手工耿那样的手工粗糙DIY了。clockworkpi设计很不错,外壳框架都是铝合金CNC出来的,看得出来成本不低,虽然块头大但考虑了人体工学设计,双手端着操作熟练了倒也相当舒服。不枉我等了八个月啊!
微信图片_20240209124339.jpg

        疫情过后,云南星空大会终于回来。还是在抚仙湖星空小镇,加入了云南省中小学天文知识竞赛的决赛和颁奖环节,比往常更累了。好的一方面是协会在抚仙湖星空小镇体验店重新选址装修开张,几百平米两层加一个夹层,望远镜等器材有了摆放的地方且推出去就可以在廊桥上观测,胶囊仓可以住宿,还有一台辣妈咖啡机可以自己做咖啡......我已经将多数望远镜存放在此,家里只留两只折射镜和一台小赤道仪。回归目视,回归初心。

微信图片_20240209102658.jpg
微信图片_20240209102710.jpg
微信图片_20240209102717.jpg
微信图片_20240209102723.jpg
微信图片_20240209102729.jpg
微信图片_20240209102734.jpg
微信图片_20240209102739.jpg
微信图片_20240209102744.jpg
微信图片_20240209104727.jpg

        2023年12月,实在累得头昏眼花了,于是请了公休一个人开车去了怒江。怒江是一直想去的地方,很好奇为什么一个地方会以一条愤怒的江水命名?再加上知子罗,我从来都对废城有一种执着和渴望,站在废城中遥想以前的热闹与辉煌,是一种难以言表的体验与感受。那么我喜欢怒江吗?非常喜欢,小红书看这里怒江印象

        怒江的风景,是你把车停在路边,站在江边就可以看很久那种风景。经常有人问我哪里好玩,我总要反问他你想玩什么,你对什么感兴趣,一道风景对上了不感兴趣的人,就是一句不好玩和一个不高兴。所以旅游本身是很自我的事情,我感兴趣的别人不一定感兴趣,我想驻足观望的别人可能急着要走,所以和别人分享风景不是不可能,而是要找对人。不必期待别人与你同频共振,自己喜欢就好。

        旅游为什么?为了看到和平时不一样的风景。如果你能够放慢脚步,走进平日匆匆路过的街巷,仔细看每一棵树,每一朵花,每座建筑和每个小店,那平素平淡的生活也就有了旅游的兴味。旅游看什么?看自己想看的,也许是风景,也许是古迹,也许是市井风情,你想看的不必与别人一样。
微信图片_20240209102759.jpg

        参加了一次桨板漂流:南盘江漂流风景绝美,难度不大,但桨板要换成漂流专用短尾鳍。通常用的长尾鳍会刮到卡在水底。漂流的时候还没有买短尾鳍,没有装尾鳍的桨板真不是人划的,完全走不了直线,虽然你不划顺着漂也可以。

        参加了一次比赛:中国户外运动挑战赛在大理有一站桨板+跑步的比赛,不知天高地厚就参加了。牌子是拿到了,但和全国各地的桨板高手一比,我只能说,我冒昧了。小红书记录看这里大理桨板比赛

        买了一条折叠艇:水上运动我从来喜欢皮划艇远远超过桨板,但是传统的硬壳皮划艇买了确实没有办法存放和运输,千等万等,澎逸终于出折叠皮划艇了,复刻的羽船,终于有机会携艇走天下了。在阳宗海试的水,整个云南搞水上运动太难了,到处不让下水。期待2024能够畅划阳宗海抚仙湖滇池等等。小红书记录看这里阳宗海试折叠艇
微信图片_20240209100239.jpg
微信图片_20240209100254.jpg
微信图片_20240209100302.jpg

        跑步就是那种不跑步的看跑步的都是疯子,跑步的看不跑步的都是傻子的运动。开始跑步只是为了减肥,营养师要求走10分钟跑10分钟再走10分钟,每天坚持,然后走着跑着就想,我能不能再跑远点,再跑远一点......从一开始的1.5公里,到2公里,3公里,4公里,能跑5公里的时候报了2023年3月的2022上合马拉松的5公里上合跑,拿了此生中第一块跑步的牌牌,虽然只是5公里。小红书记录看这里上合跑

        一帮人一起跑步太有意思了,于是我想我能不能跑个半马呢?开始加量,从5公里开始一点一点加,一直到隔日10公里。期间看了不少跑步的书,配速越来越慢,心率越来越低,10公里变成了跑完了感觉“就这?”。于是乍着胆子报了2023年10月份的昆明高原半程马拉松,家门口嘛,方便,只是方便归方便,这赛道真是操蛋,连绵不绝的坡,尤其彩云南路跑到尽头右转云南白药街那个坡......跟着一堆不要命的,一开始配速就起快了,第一次跑马没有经验,过配给站拿水喝都是跑进跑出的,一泡尿从鸣枪起跑到跑完愣是憋了2个多小时,结果619的配速完赛,代价就是平均心率到了157,手表显示恢复时间79小时。我是年过半百的老头子哎~要不要这么拼命哎~小红书记录看这里昆马半马

        其实跑完半马身体反应也不算夸张,还没爬个海拔升高1000米的山难受呢,于是睡了一觉发现腿没有酸得上下楼都要蹭着走后就嚣张起来了,可以说半马“就这?”了。小红书上无数人都在说“半马是体育运动,全马是极限运动”“全马绝对不是两个半马,要比两个半马恐怖得多”,我就在想嗯,我能不能跑个全马呢?跑个全马是什么感觉呢?算着上合马拉松下一次应该是2024年3月左右,我半年备战应该可以了吧?

        然后才过了一个半月,2023年12月初,2023上合马拉松发布报名通知了,12月31日比赛。
        天人交战啊天人交战,我这连一次30公里的LSD都还没拉过呢......而且就一个月就比赛了,这一个月的跑量还要逐步减下来,这30公里LSD是不能跑了,你让我一个半马后就一直只跑10公里的人跑全马......
        哎,一咬牙报吧!
        还是做了一些准备,能量胶酸轻片盐丸都买了,为了防止大腿小腿肌肉抖动额外耗费能量还买了一条压缩裤,然后就这么奔跑着迎接2024年了~~~小红书记录看这里上合全马

        这回有经验了,一路上进出补给站都是走路,跑步途中该上厕所就上厕所,虽然配速比半马慢了半分钟,但是轻松啊,几乎没啥累的感觉,平均心率才145,恢复时间也大幅下降为37小时,我终于可以挺直腰板说:“全马,就这?!”

好吧我嚣张了。我得承认其实我一开始不是奔着跑马去的,我是想参加战马,就是那个30公里爬升2000米的轿子山越野跑赛,可人家说了,你得有马拉松完赛证明才能报名。所以,今年是不是报个战马?还有,铁三也挺好玩的,我是不是好好练练游泳....?!
微信图片_20240209090028.jpg
微信图片_20240209090015.jpg
微信图片_20240209090042.jpg
微信图片_20240209090050.jpg
微信图片_20240209090057.jpg
微信图片_20240209090102.jpg
微信图片_20240209090109.jpg
微信图片_20240209090114.jpg

        用Stable Diffusion将歌词逐句变成图像,再用AE生成视频,好像是近期比较流行的一种玩法......试验了,有的歌词生成的图像很有创意,但很多句歌词生成的图像平平,还是需要加上一些解释性词语,比如I see green这句,加上summer forest那意境就出来了。
        用邓丽欣的《colors》小试牛刀

[button color="light" icon="" url="https://www.xiaohongshu.com/explore/63d5435d000000001d0106b4" type=""]点击在新页面看colors[/button]

        大年初二偶然望向窗外,看到金星合月。架起相机拍了几张,心想要是那个方向有焰火就好了,然后就有人放起焰火。
        大年初五和朋友出发去拍彗星,行前颇多踌躇,因为初六凌晨冷空气就要自东方压进昆明。关键时刻大叔的一句话令人下定决心:往西走,能拍到四五点,不是彩云天气说的两点变天。
        原来规划的拍星地点是绿汁观景台,到了才发现面向西方且有灯光,只能和朋友摸黑寻找新的拍星点位。经过一片废弃的厂房和生活区,终于在当地人的指点下来到了绿汁滑翔伞起飞场。朋友的瑞星600摄星镜、NEQ6和立柱是首次开光,千算万算还是漏带了鱼骨板,万幸器材正常。天北极附近导星校准困难,灵机一动扭歪导星镜指向远离天北极方向方才校准成功。另一位朋友的70SA套装则是导星不成功,排查半天是赤道仪停止了跟踪。回家后这位朋友还发现赤纬轴松旷得匪夷所思,但那是另一个故事了。我则是因为1/4的螺栓不够长,没有能够把我的6D叠加在摄星镜上,好在70SA的朋友拍完一组彗星后,好心地让我换上我的6D拍了一组,总算没有白跑一趟。
        拍下的彗星怎么处理都感觉不对头。尽管做了暗场和偏置,单反的噪点还是太多。以后还是多用冷冻CCD吧。接上车子的外放电,也不必顾虑电池耗尽的问题,还可以煮火锅呢。

_20230123205751.jpg
20230127C2022E3.jpg
20230127C2022E3_2_小.jpg