{"id":38,"date":"2018-11-05T18:48:38","date_gmt":"2018-11-05T16:48:38","guid":{"rendered":"http:\/\/jasu.servebeer.com\/sivut\/wordpress\/?page_id=38"},"modified":"2022-10-24T18:13:46","modified_gmt":"2022-10-24T15:13:46","slug":"koodeja","status":"publish","type":"page","link":"http:\/\/jasun.hifisivut.dy.fi\/index.php\/kotiautomaatio\/koodeja\/","title":{"rendered":"Measurement automation scripts and codes."},"content":{"rendered":"\n<h2 class=\"has-text-align-center wp-block-heading\">STATUS DISPLAY <\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>from inky import InkyPHAT \nfrom PIL import Image, ImageFont, ImageDraw \nfrom font_fredoka_one import FredokaOne \nimport datetime \nimport socket \nimport requests \nimport psutil \nfrom time import sleep \nimport os\nfrom gpiozero import CPUTemperature\n\ny1 = 0 \ny2 = 20 \ny3 = 60\ny4 = 80\n\n#client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) # UDP \n\ninky_display = InkyPHAT(\"black\")\ninky_display.set_border(inky_display.WHITE)\n\nfont1 = ImageFont.truetype(FredokaOne, 20)\nfont2 = ImageFont.truetype(FredokaOne, 20)\n\n#client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) \n#client.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) \n#client.bind((\"\", 37020)) \n\nwhile True:\n    client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) # UDP\n    client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)\n    client.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)\n    client.bind((\"\", 37020))\n    try:\n        CPU_LOAD=str(int(psutil.cpu_percent()))\n    except:\n        CPU_LOAD=\"nan\"\n    try: \n        cpu=CPUTemperature() \n    except: \n        cpu=\"nan\" \n    try: \n        CPU_TEMP=str(int(cpu.temperature)) \n    except: \n        CPU=TEMP=\"nan\" \n    try: \n        if requests.get('https:\/\/google.com').ok:\n            network_status=\"UP\" \n    except:\n        network_status=\"DN\"\n    try: \n        client.settimeout(10) \n        data, addr = client.recvfrom(1024) \n        msg=str(data)&#91;2:-1] \n        values=msg.split(',')\n        print(addr) \n        print(values&#91;0]+\":\"+values&#91;1]) \n        print(values&#91;2]+\":\"+values&#91;3])\n        Workroom=values&#91;1]\n        Outdoor=values&#91;3]\n    except: \n        print(\"timeout\") \n        Workroom=\"nan\"\n        Outdoor=\"nan\"\n    currentDT = datetime.datetime.now() \n    img = Image.new(\"P\", (inky_display.WIDTH, inky_display.HEIGHT)) \n    draw = ImageDraw.Draw(img) \n    hour=str(currentDT.hour) \n    minute=str(currentDT.minute) \n    year=str(currentDT.year) \n    month=str(currentDT.month) \n    day=str(currentDT.day) \n    try:\n        cpu=CPUTemperature() \n    except: \n        cpu=\"nan\" \n    try: \n        testi=6 \n    except: \n        print(\"vituixman\") \n    status1=Workroom+\"C \"+Outdoor+\"C\"\n#    print(status1)\n    status2=CPU_LOAD+\"% \"+CPU_TEMP+\"C \"+network_status\n#    print(status2)\n    date=currentDT.strftime(\"%d.%m.%Y\") \n    time=currentDT.strftime(\"%H:%M\") \n    w, h = font1.getsize(date) \n    x1 = (inky_display.WIDTH \/ 2) - (w \/ 2) \n    w, h = font1.getsize(time) \n    x2 = (inky_display.WIDTH \/ 2) - (w \/ 2) \n    w, h = font1.getsize(status1) \n    x3 = (inky_display.WIDTH \/ 2) - (w \/ 2) \n    w, h = font1.getsize(status2) \n    x4 = (inky_display.WIDTH \/ 2) - (w \/ 2) \n    draw.text((x1, y1), date, inky_display.BLACK, font1) \n    draw.text((x2, y2), time, inky_display.BLACK, font1) \n    draw.text((x3, y3), status1, inky_display.BLACK, font1) \n    draw.text((x4, y4), status2, inky_display.BLACK, font1) \n    inky_display.set_image(img) \n    try:\n        inky_display.show() \n    except: \n        print(\"paskaksm\u00e4n\")\n    sleep(60)\n<\/code><\/pre>\n\n\n\n<h2 class=\"has-text-align-center wp-block-heading\">RUUVITAG READING CODE<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>import signal\nimport time\nimport os\nimport sys\nimport subprocess\n\nfrom datetime import datetime\n\nfrom ruuvitag_sensor.ruuvitag import RuuviTag\n\n#function that has ruuvitag mac address and room name as input. Function gathers data from ruuvitags, and write values to files. \ndef ReadTag(MAC,Room):\n    sensor=RuuviTag(MAC)\n    try:\n        data=sensor.update() #update sensor data\n        print(data)\n    except: #if update fails write to error log file\n        ff = open(\"\/automaatio2\/ruuvi_error\", \"a\")\n        ff.write(\"Sensors_failed\\n\")\n        ff.close()\n    try: #read values from ruuvitag\n        line_sen = str(MAC)\n        #print(line_sen)\n        line_tem = str(data&#91;'temperature'])\n        #print(line_tem)\n        line_hum = str(data&#91;'humidity'])\n        #print(line_hum)\n        line_pre = str(data&#91;'pressure'])\n        #print(line_pre)\n        line_bat = str(data&#91;'battery'])\n        #print(line_bat)\n        file = open('\/automaatio2\/%s.values' %Room , 'w') #open file to write data to\n        file.write(line_sen)\n        file.write('\\n')\n        file.write(line_tem)\n        file.write('\\n')\n        file.write(line_hum)\n        file.write('\\n')\n        file.write(line_pre)\n        file.write('\\n')\n        file.write(line_bat)\n        file.close()\n        ff = open(\"\/automaatio2\/ruuvi_error\", \"a\")\n        ff.write(Room)\n        ff.close()\n        print(\"j\u00f6\u00f6\")\n    except: #if ruuvi read fails write to error log. \n        print(\"p\u00f6\u00f6\")\n        ff = open(\"\/automaatio2\/ruuvi_error\", \"a\")\n        ff.write(Room + \" crashed\")\n        ff.close()\n\n\nNumberOfSensors = 6\n#mac addresses of ruuvitags\nmac1 = 'FC:E2:49:DB:D9:01'#Livingroom**\nmac2 = 'F6:46:1D:B4:01:18'#Adhoc**\nmac3 = 'D8:06:3F:50:87:99'#BedroomA**\nmac4 = 'F0:25:6B:CE:A6:51'#Laundryroom**\nmac5 = 'EC:85:7E:11:E0:73'#Kitchen**\nmac6 = 'FD:69:92:41:8E:2A'#Guestroom\nMacList = &#91;mac1,mac2,mac3,mac4,mac5,mac6] #make list of mac addresses\n\n#rooms linked to mac addresses\nroom1=\"livingroom\"\nroom2=\"adhoc\"\nroom3=\"bedroomA\"\nroom4=\"laundryroom\"\nroom5=\"kitchen\"\nroom6=\"guestroom\"\n\nRoomList = &#91;room1,room2,room3,room4,room5,room6] #make list from room names\n\ntime.sleep(600) #on raspi start wait for a while. \n\n\nwhile True:\n    #just open error log file and write start\n    f = open(os.devnull, 'w')\n    ff = open(\"\/automaatio2\/ruuvi_error\", \"a\")\n    ff.write(\"Start\")\n    ff.close()\n    for Number in range(NumberOfSensors): #loop through ruuvi sensors\n        ReadTag(MacList&#91;Number],RoomList&#91;Number])  #call function\n    time.sleep(30)\n    os.system(\"sudo killall hcitool\") #because it seems that hcitools wont quit and eventually raspi is exhausted of amount of hcitools, we kill all hcitool processes. \n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Simple 28BYJ-48 stepper motor code<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>import RPi.GPIO as GPIO\nimport time\ndef init():\n    GPIO.setmode(GPIO.BOARD)\n    global control_pins\n    control_pins = &#91;7,11,13,15]\n    for pin in control_pins:\n        GPIO.setup(pin, GPIO.OUT)\n        GPIO.output(pin, 0)\nglobal halfstep_seq_ccw\nhalfstep_seq_ccw = &#91;\n  &#91;1,0,0,0],\n  &#91;1,1,0,0],\n  &#91;0,1,0,0],\n  &#91;0,1,1,0],\n  &#91;0,0,1,0],\n  &#91;0,0,1,1],\n  &#91;0,0,0,1],\n  &#91;1,0,0,1]\n]\n\nglobal halfstep_seq_cw\nhalfstep_seq_cw = &#91;\n  &#91;1,0,0,1],\n  &#91;0,0,0,1],\n  &#91;0,0,1,1],\n  &#91;0,0,1,0],\n  &#91;0,1,1,0],\n  &#91;0,1,0,0],\n  &#91;1,1,0,0],\n  &#91;1,0,0,0]\n]\n\ndef ccw(steps,delay):\n    halfstep_seq_ccw = &#91;\n      &#91;1,0,0,0],\n      &#91;1,1,0,0],\n      &#91;0,1,0,0],\n      &#91;0,1,1,0],\n      &#91;0,0,1,0],\n      &#91;0,0,1,1],\n      &#91;0,0,0,1],\n      &#91;1,0,0,1]\n    ]\n    for i in range(steps):\n        for halfstep in range(8):\n            for pin in range(4):\n              GPIO.output(control_pins&#91;pin], halfstep_seq_ccw&#91;halfstep]&#91;pin])\n            time.sleep(delay)\ndef cw(steps,delay):\n    halfstep_seq_cw = &#91;\n      &#91;1,0,0,1],\n      &#91;0,0,0,1],\n      &#91;0,0,1,1],\n      &#91;0,0,1,0],\n      &#91;0,1,1,0],\n      &#91;0,1,0,0],\n      &#91;1,1,0,0],\n      &#91;1,0,0,0]\n    ]\n    for i in range(steps):\n      for halfstep in range(8):\n        for pin in range(4):\n          GPIO.output(control_pins&#91;pin], halfstep_seq_cw&#91;halfstep]&#91;pin])\n        time.sleep(delay)\ndef buzz(steps,delay):\n    for i in range(steps):\n        for halfstep in range(8):\n            for pin in range(4):\n                GPIO.output(control_pins&#91;pin], halfstep_seq_cw&#91;halfstep]&#91;pin])\n                time.sleep(delay)\n    for i in range(steps):\n        for halfstep in range(8):\n            for pin in range(4):\n                GPIO.output(control_pins&#91;pin], halfstep_seq_ccw&#91;halfstep]&#91;pin])\n                time.sleep(delay)\nif __name__ == '__main__':\n#    init()\n    while True:\n        init()\n        direction=input(\"ccw\/cw:    \")\n        delay = input(\"Time Delay (ms)?    \")\n        steps = input(\"How many steps?    \")\n        if direction in &#91;'ccw']:\n            ccw(int(steps), int(delay)\/1000)\n        if direction in &#91;'cw']:\n            cw(int(steps),int(delay)\/1000)\n#        buzz(3,1\/10000)\n#        steps = input(\"How many steps cw? \")\n#        cw(int(delay), int(steps))\nGPIO.cleanup()\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>STATUS DISPLAY RUUVITAG READING CODE Simple 28BYJ-48 stepper motor code<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":35,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-38","page","type-page","status-publish","hentry","nodate","item-wrap"],"_links":{"self":[{"href":"http:\/\/jasun.hifisivut.dy.fi\/index.php\/wp-json\/wp\/v2\/pages\/38","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/jasun.hifisivut.dy.fi\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/jasun.hifisivut.dy.fi\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/jasun.hifisivut.dy.fi\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/jasun.hifisivut.dy.fi\/index.php\/wp-json\/wp\/v2\/comments?post=38"}],"version-history":[{"count":10,"href":"http:\/\/jasun.hifisivut.dy.fi\/index.php\/wp-json\/wp\/v2\/pages\/38\/revisions"}],"predecessor-version":[{"id":304,"href":"http:\/\/jasun.hifisivut.dy.fi\/index.php\/wp-json\/wp\/v2\/pages\/38\/revisions\/304"}],"up":[{"embeddable":true,"href":"http:\/\/jasun.hifisivut.dy.fi\/index.php\/wp-json\/wp\/v2\/pages\/35"}],"wp:attachment":[{"href":"http:\/\/jasun.hifisivut.dy.fi\/index.php\/wp-json\/wp\/v2\/media?parent=38"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}