• apache rewrite without 301 redirect

    /etc/apache2/conf.d/domaincheck.conf

    AddDefaultCharset UTF-8
    Alias /domainchecker "/srv/www/htdocs/domainchecker"
    <Location "/domainchecker">
        DirectoryIndex index.php
        RewriteEngine On
        RewriteBase /
        RewriteCond %{REQUEST_FILENAME} -d
        RewriteRule ^(.+[^/])$ $1/ [L]
    </Location>
    
    <Directory "/srv/www/htdocs/domainchecker">
        DirectorySlash Off
        Options -Indexes +FollowSymLinks
        Require all granted
    </Directory>
  • modbus cli tcp, mbpoll and moodbus_cli

    sinotimer

    mbpoll phase A,B,C

    zei0mucu:~$ mbpoll -a 8 -t 3:float -B -0 -r0,2,4 172.16.100.101 -1 -q 
    -- Polling slave 8...
    [0]:    234.282
    [2]:    234.666
    [4]:    237.221

    mbpoll phase A

    zei0mucu:~$ mbpoll -a 8 -t 3:float -B -0 -r0 172.16.100.101 -1 -q 
    -- Polling slave 8...
    [0]:    235.587

    modbus_cli, voltage phase A,B,C

    zei0mucu:~$ modbus -S 172.16.100.101 -s 8 i@0/f
    236.30426025390625
    zei0mucu:~$ modbus -S 172.16.100.101 -s 8 i@2/f
    233.90081787109375
    zei0mucu:~$ modbus -S 172.16.100.101 -s 8 i@4/f
    237.7670135498047

    relay

    modbus_cli

    on relay 1

    zei0mucu:~$ modbus 127.0.0.1  -s 2  -v   c@0=1
    Parsed 0 registers definitions from 1 files
    → < 97 58 00 00 00 06 02 05 00 00 ff 00 >
    ← < 97 58 00 00 00 06 02 05 00 00 ff 00 > 12 bytes

    off relay 2

    zei0mucu:~$ modbus 127.0.0.1  -s 2  -v   c@1=0
    Parsed 0 registers definitions from 1 files
    → < fa 49 00 00 00 06 02 05 00 00 00 00 >
    ← < fa 49 00 00 00 06 02 05 00 00 00 00 > 12 bytes

    status

    zei0mucu:~$ modbus 127.0.0.1  -s 2  -v   c@0/8B
    Parsed 0 registers definitions from 1 files
    → < bd 43 00 00 00 06 02 01 00 00 00 08 >
    ← < bd 43 00 00 00 04 02 01 01 00 > 10 bytes
    ← [0, 0, 0, 0, 0, 0, 0, 0]
    0: 0 0x0

    mbpoll

    relay 1

    zei0mucu:~$ mbpoll -a 2  -t 0  -0 -r0 127.0.0.1 -q -- 1
    Written 1 references.

    relay 2

    zei0mucu:~$ mbpoll -a 2  -t 0  -0 -r1 127.0.0.1 -q -- 1
    Written 1 references.

    status

    zei0mucu:~$ mbpoll -a 2  -t 0  -0 -r0 127.0.0.1 -q  -1 -c8
    -- Polling slave 2...
    [0]:    1
    [1]:    1
    [2]:    0
    [3]:    0
    [4]:    0
    [5]:    0
    [6]:    0
    [7]:    0
  • Modbus-Rtu 2 Channel 7-24V Relay Module

    install modbus command line tool

    pip3 install modbus_cli

    setup udev rules for usb QinHeng Electronics CH340 serial converter

    #cat /etc/udev/rules.d/98-usb-serial.rules
    KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", OWNER="hass", GROUP="users", MODE="0660", SYMLINK+="rs485"

    relay control

    # 1
    # on 
    modbus   -b 9600   -s 2  -v   /dev/rs485  c@0=1
    # off
    modbus   -b 9600   -s 2  -v   /dev/rs485  c@0=0
    # status
    modbus -b 9600 -s 2  -v /dev/rs485  c@0/8B | egrep -o '\[.*\]' | tr -d '[,]' | cut -f1 -d' '
    # 2
    # on 
    modbus   -b 9600   -s 2  -v   /dev/rs485  c@1=1
    # off
    modbus   -b 9600   -s 2  -v   /dev/rs485  c@1=0
    # status
    modbus -b 9600 -s 2  -v /dev/rs485  c@0/8B | egrep -o '\[.*\]' | tr -d '[,]' | cut -f2 -d' '
  • write data to influxdb with curl

    systemd unit file

    # /etc/systemd/system/influx-send.service
    [Unit]
    Description=send data to influx 
    After=syslog.target network.target
    [Service]
    Type=simple
    ExecStart=/usr/local/sys/influx/influx-send.sh
    [Install]
    WantedBy=multi-user.target

    shell script /usr/local/sys/influx/influx-send.sh

    #!/bin/bash
    while true; do
    find /var/spool/emeter -type f -exec sh -c "curl -o /dev/null -w \"%{http_code}\" --user 'username':'password' -sS -X POST http://192.168.110.16:8086/write?db=emeter -d @{} | grep -q  204 && rm  {}" \;
    sleep 60
    done

    sample data from /var/spool/emeter/*

    voltage,stand=diesel-new,phase=A value=218 1699828098942885595
  • get data from sinotimer meter

    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    
    import libscrc
    import serial
    import sys
    import struct
    def str_to_bytes(data):
        return [hex(ord(c)) for c in data]
    port=sys.argv[1]
    addr=sys.argv[2]
    def get_value(data,port,addr):
        crc16 = libscrc.modbus(data)
        crc16_str = '0x{:04x}'.format(crc16)
        data.append(int(crc16_str[2:][2:4],16))
        data.append(int(crc16_str[2:][0:2],16))
        ser = serial.Serial(port,9600,timeout=0.1,bytesize=8,stopbits=1,parity='N',writeTimeout=0)
        ser.write(data)
        line = ser.read(100)
        ret = (''.join('{:02x}'.format(ord(x)) for x in line))
        val = struct.unpack('>f',line[3:7])[0]
        return "%.3f" % val
        ser.close()
    data = bytearray(b'\x00\x04\x00\x00\x00\x02')
    data[0]=int(addr)
    voltage = get_value(data,port,addr)
    data = bytearray(b'\x00\x04\x00\x08\x00\x02')
    data[0]=int(addr)
    current = get_value(data,port,addr)
    data = bytearray(b'\x00\x04\x00\x12\x00\x02')
    data[0]=int(addr)
    power = get_value(data,port,addr)
    data = bytearray(b'\x00\x04\x01\x00\x00\x02')
    data[0]=int(addr)
    power_total = get_value(data,port,addr)
    print("U="+voltage+" I="+current+" P="+power+" W="+power_total+"|U="+voltage+";; I="+current+";; P="+power+";; "+"W="+power_total+";; ")