Архив метки: исходники

Черновик консольной программы для разбора бардака на компьютере (Python)

План был такой:

  1. Выбрать папку для разбора бардака
  2. Программа будет по очереди показывать оттуда файлы (фотки, видео и т.д.)
  3. Пользователь через пробел вводит теги для просмотренного файла (например «фото машина зима» или просто «trash»)
  4. программа переходит к следующему файлу, пока список не кончится
  5. В результате формируется база данных по файлам (sqlite files.db)
  6. Тэги привязываются не к пути файла, а к его контрольной сумме MD5, если копия папки попадётся где-то ещё — программа файлы узнает
  7. В результате файлы любого типа можно находить по тегам
  8. Для удаления мусора можно составить список файлов например с тегом «trash» и передать список например команде «del»

Главное меню:

                Программа для разбора бардака с файлами
                1. Выбор папки
                2. Анализ
                3. Разбор
                4. Сохранить списки
                
                0. Выход

Исходный код черновика (написано за 2 дня):

#! -*- coding: utf-8 -*-

'''
Программа для разбора бардака на дисках

LOG:
    добавил ввод нескольких тэгов через пробел
    добавил таблицу с путями к файлам
    добавил просмотр видео
    добавил разбор по выбранному тэгу, можно для просмотра
    добавил вывод текущих тегов
    добавил удаление тегов через -...
'''

import os
import sqlite3
import hashlib
import time

# просмотрщики
IMAGE_PROGRAM = "eog"
VIDEO_PROGRAM = "vlc"
MUSIC_PROGRAM = "vlc"
TEXT_PROGRAM = "gedit"

CREATE_TABLES_QUERY = """
CREATE TABLE `FILES_INFO` ( `FILES_INFO_ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, `PATH` TEXT NOT NULL, `FILE_MD5` TEXT NOT NULL, `LAST_MODIFIED` TEXT )

CREATE TABLE `FILES_TAGS` ( `FILES_TAGS_ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, `FILE_MD5` TEXT NOT NULL, `TAG` TEXT NOT NULL )
"""

class FilesAnalyzer:
    
    def __init__(self):
        self.db_connection = sqlite3.connect('files.db')
        self.path = ''
        self.count_by_tags = {}
        self.files_by_tags = {}
        
    def analyze(self):
        '''
        1. Статистика по количеству файлов по каждому тегу
        и неразмеченных
        2. Сохранение списков файлов по каждому тегу
        и неразмеченных
        '''
        # Счётчики файлов по тегам
        self.count_by_tags = {}
        self.count_by_tags[""] = 0
        
        # списки файлов по тегам
        self.files_by_tags = {}
        self.files_by_tags[""] = []
        
        for root, dirs, files in os.walk(self.path):
            for f in files:
                f_full = '%s/%s' % (root, f)
                f_md5 = self.get_md5(f_full)
                f_tags = self.get_tags(f_md5)
                ''' DEBUG
                print('Файл: %s' % f_full)
                print('MD5: %s' % f_md5)
                print('Тэги: %s' % ', '.join(f_tags))
                '''
                if len(f_tags) > 0:
                    for tag in f_tags:
                        if tag not in self.count_by_tags.keys():
                            self.count_by_tags[tag] = 1
                            self.files_by_tags[tag] = []
                            self.files_by_tags[tag].append(f_full)
                        else:
                            self.count_by_tags[tag] += 1
                            self.files_by_tags[tag].append(f_full)
                else:
                    self.count_by_tags[''] += 1
                    self.files_by_tags[''].append(f_full)
        for key in self.count_by_tags.keys():
            print("Тэг '%s': %s" % (key, self.count_by_tags[key]))
        ''' DEBUG
        for key in self.files_by_tags.keys():
            print("Файлы '%s':" % key)
            for f in self.files_by_tags[key]:
                print(f)
        '''
        
    def manual_sort(self, selected_tag=""):
        '''
        Ручная маркировка тегами неразмеченных файлов
        '''
        if selected_tag in self.files_by_tags.keys():
            for f in self.files_by_tags[selected_tag]:
                # проверить что новый md5
                md5 = self.get_md5(f)
                tags = self.get_tags(md5)
                if (selected_tag == "" and len(tags) == 0) \
                        or selected_tag in tags:
                    print("Файл: '%s'" % f)
                    print("Текущие тэги: %s" % \
                            self.get_tags(md5))
                    # пердосмотр или открыть файл
                    self.try_preview(f)
                    new_tags_text = input("Введи тэги для файла: ")
                    if len(new_tags_text) > 0:
                        new_tags = new_tags_text.split()
                        for new_tag in new_tags:
                            self.save_tag(f, new_tag)
                        self.save_info(f)
            # теперь прошлый анализ бесполезен
            self.files_by_tags = {}
            self.count_by_tags = {}
        else:
            print('Ошибка: файлов с тегом "%s" не найдено' % selected_tag)
            
    def save_info(self, f):
        '''
        сохранение информации о файле в БД
        /param[in] f - имя файла
        '''
        # приготовить информацию
        md5 = self.get_md5(f)
        mtime = os.path.getmtime(f)
        last_modified = time.strftime('%Y-%m-%d %H:%M:%S',
                time.localtime(mtime))
        
        # проверить, что в базе такого ещё нет
        cur = self.db_connection.cursor()
        check_query = """SELECT * 
                FROM FILES_INFO
                WHERE PATH = '%s'
                AND FILE_MD5 = '%s'
                AND LAST_MODIFIED = '%s'""" % (
                f, md5, last_modified)
        is_new = True
        for row in cur.execute(check_query):
            is_new = False
        
        if is_new:
            # сохранение в БД
            query = """INSERT INTO FILES_INFO
            (PATH, FILE_MD5, LAST_MODIFIED)
            VALUES ('%s', '%s', '%s')""" % (
            f, md5, last_modified)
            cur.execute(query)
            self.db_connection.commit()
        
    def try_preview(self, f):
        if f.lower()[-4:] in ('.png', '.bmp', '.gif', '.jpg', 'jpeg'):
            #os.system('eog "%s"' % f)
            os.system('%s "%s"' % (IMAGE_PROGRAM, f))
        elif f.lower()[-4:] in ('.avi', '.mpg', '.3gp', '.mov'):
            os.system('%s "%s"' % (VIDEO_PROGRAM, f))
        elif f.lower()[-4:] in ('.mp3', '.wav', '.ogg'):
            os.system('%s "%s"' % (MUSIC_PROGRAM, f))
        
        
    def save_tag(self, f, tag):
        md5 = self.get_md5(f)
        cur = self.db_connection.cursor()
        if tag[0] == "-":
            # TODO: УДАЛИТЬ ТЕГ
            del_query = """DELETE FROM FILES_TAGS
                    WHERE FILE_MD5 = '%s'
                    AND TAG = '%s'""" % (md5, tag[1:])
            cur.execute(del_query)
            self.db_connection.commit()
        else:
            # Сначала проверить что тега у файла ещё нет
            check_query = """SELECT * FROM FILES_TAGS
                    WHERE FILE_MD5 = '%s'
                    AND TAG = '%s'""" % (md5, tag)
            is_new = True
            for row in cur.execute(check_query):
                is_new = False
                break
            
            if is_new:
                # Добавить файлу тег
                query = """INSERT INTO FILES_TAGS
                        (FILE_MD5, TAG) VALUES ('%s', '%s')""" % (
                        md5, tag)
                cur.execute(query)
                self.db_connection.commit()
            
    def show_main_menu(self):
        while True:
            print('\n' * 3 + '''
                Программа для разбора бардака с файлами
                1. Выбор папки
                2. Анализ
                3. Разбор
                4. Сохранить списки
                
                0. Выход
            ''')
            
            selected = input("Что делать? > ")
            if selected == "0":
                self.close()
            elif selected == "1":
                self.show_select_path_menu()
            elif selected == "2":
                self.show_analyze_menu()
            elif selected == "3":
                self.show_manual_sort_menu()
            elif selected == "4":
                self.show_save_lists_menu()
            
    def close(self):
        self.db_connection.close()
        print("Выход из программы")
        quit()

    def show_save_lists_menu(self):
        print("Сохранение списков файлов")
        self.save_lists()
        
    def save_lists(self):
        for key in self.files_by_tags.keys():
            file_name = "%s.txt" % key
            if key == "":
                file_name = "_unsorted.txt"
            if len(self.files_by_tags[key]) > 0:
                f = open(file_name, 'w')
                for item in self.files_by_tags[key]:
                    f.write(item)
                    f.write('\n')
                f.close()
                print(file_name)
    
    def show_select_path_menu(self):
        selected = input('Введите имя папки для разбора: ')
        if self.is_valid_path(selected):
            self.path = selected
            print("Выбрана папка: '%s'" % selected)
        else:
            print("Ошибка: не удалось выбрать папку: '%s'" % selected)
        
    def show_analyze_menu(self):
        print("Анализ файлов в %s:" % self.path)
        self.analyze()
    
    def show_manual_sort_menu(self):
        print("Ручной разбор файлов")
        selected_tag = input("Выбери тег для разбора (по умолчанию без тегов): ")
        self.manual_sort(selected_tag)
    
    def is_valid_path(self, str_path):
        if os.path.exists(str_path):
            return True
        else:
            return False
            
    def get_md5(self, file_path):
        result = ''
        f = open(file_path, 'rb')
        content = f.read()
        f.close()
        result = hashlib.md5(content).hexdigest()
        return result
    
    def get_tags(self, md5):
        result = []
        
        cur = self.db_connection.cursor()
        query = "SELECT TAG FROM FILES_TAGS WHERE FILE_MD5 = '%s'" % md5
        for row in cur.execute(query):
            result.append(row[0])
        return result
    
if __name__ == "__main__":
    fa = FilesAnalyzer()
    fa.show_main_menu()
            

Python скрипт для сбора информации по файлам в папке

# -*- coding: utf-8 -*-

'''
на входе папка или файл, на выходе CSV: имя файла;сумма мд5;папка полностью;имя компа
'''

import os
import hashlib
import platform
import time
import sys

class MyItem:
  def __init__(self, f):
    self.hostname = hostname
    self.md5sum = md5(f)
    self.size = os.path.getsize(f)
    self.created = "%s" % time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(os.path.getctime(f)))
    self.modified = "%s" % time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(os.path.getmtime(f)))
    self.ext = os.path.splitext(f)[1]
    self.full_dir, self.file_name = os.path.split(os.path.abspath(f))

def md5(fname):  # https://stackoverflow.com/questions/3431825/generating-an-md5-checksum-of-a-file
    hash_md5 = hashlib.md5()
    with open(fname, "rb") as f:
        for chunk in iter(lambda: f.read(4096), b""):
            hash_md5.update(chunk)
    return hash_md5.hexdigest()

hostname = platform.node()

result_header = "file_name;md5sum;size;created;modified;ext;full_path;hostname\n"
result_file = open('./result.csv','w')
result_file.write(result_header)

targets = []

if len(sys.argv) > 1:
  targets = sys.argv[1::]
else:
  targets.append(".")

for t in targets:
  if os.path.exists(t):
    if os.path.isdir(t):
      for current_dir, dirs, files in os.walk(t):
        for f in files:
          try:
            i = os.path.join(current_dir, f)
            print(i)
            item = MyItem(i)
            result_file.write('%s;%s;%s;%s;%s;%s;%s;%s\n'%(item.file_name, item.md5sum, item.size, item.created, item.modified, item.ext, item.full_dir, item.hostname))
          except:
            print('Error!')
    if os.path.isfile(t):
      try:
        i = t
        print(i)
        item = MyItem(i)
        result_file.write('%s;%s;%s;%s;%s;%s;%s;%s\n'%(item.file_name, item.md5sum, item.size, item.created, item.modified, item.ext, item.full_dir, item.hostname))
      except:
        print('Error!')

result_file.close()

Консольный калькулятор для Windows на Python

Консольный калькулятор на Python

Управление: стрелки на клавиатуре и Enter, выход из программы — Esc

Исходник calc.py:

# -*- coding: utf-8 -*-
# kmsvsr.ru 2020-06-06

import msvcrt
from decimal import *

def makeDisplayString(s):
  result = " " * (20 - len(s)) + s
  return result

class MyCalculator:
  def __init__(self):
    self.last_result = Decimal('99999999999999999999.0')
    self.result = Decimal('0.0')
    self.display_default='''
=====Калькулятор==========
|[ 00000000000000000000 ]|
|========================|
|                        |
|[ 1 ] [ 2 ] [ 3 ]  [ + ]|
|                        |
|[ 4 ] [ 5 ] [ 6 ]  [ - ]|
|                        |
|[ 7 ] [ 8 ] [ 9 ]  [ x ]|
|                        |
|[ 0 ] [ . ] [ = ]  [ / ]|
|                        |
==========================
'''
    self.display = self.display_default
    self.keys=("123+", "456-", "789x", "0.=/")

    self.ACTION_EMPTY = 0
    self.ACTION_PLUS = 1
    self.ACTION_MINUS = 2
    self.ACTION_MULTIPLY = 3
    self.ACTION_DIVIDE = 4

    self.last_action = self.ACTION_EMPTY
    
    self.visible = 1
    
    self.display_digits = "0"  # цифры, которые видно на калькуляторе, не больше 20
    self.last_display_digits = ""
    self.updateDigitsOnDisplay()
    
    # положение курсора слева сверху
    self.curx=0
    self.cury=0
    
    self.needNewDigit = 0  # 1 после кнопки действия
    
  def updateKeysOnDisplay(self):
    self.display = self.display.replace('[ %s ]' % self.keys[self.cury][self.curx], '[>%s<]' % self.keys[self.cury][self.curx])

  def updateDigitsOnDisplay(self):
    if len(self.display_digits) > 0:
      self.display = self.display.replace('00000000000000000000', makeDisplayString(self.display_digits) )
    else:
      self.display = self.display.replace('00000000000000000000', makeDisplayString(self.last_display_digits) )
    
  def resetDisplay(self):
    self.display = self.display_default
    
  def show(self):
    self.visible = 1
    self.redraw()
    
  def redraw(self):
    self.resetDisplay()
    self.updateDigitsOnDisplay()
    self.updateKeysOnDisplay()
    if self.visible == 1:
      print(self.display)
      
  def calc(self):
    try:
      new_value = Decimal('%s' % self.display_digits)
    except:
      new_value = Decimal('99999999999999999999.0')
      
    if self.last_action == self.ACTION_PLUS:
      self.result = self.last_result + new_value
    if self.last_action == self.ACTION_MINUS:
      self.result = self.last_result - new_value
    if self.last_action == self.ACTION_MULTIPLY:
      self.result = self.last_result * new_value
    if self.last_action == self.ACTION_DIVIDE:
      self.result = self.last_result / new_value
    if self.last_action == self.ACTION_EMPTY:
      self.result = new_value
    if self.last_action != self.ACTION_EMPTY:
      self.display_digits = "%s" % self.result
    self.last_result = self.result
    self.needNewDigit = 1
    self.last_display_digits = self.display_digits
    
'''
 H
KPM
'''

calc = MyCalculator()

calc.show()

while True:
  if calc.needNewDigit == 1:
    calc.display_digits = ""
    calc.needNewDigit = 0
  lastkey = msvcrt.getch()
  #print(lastkey)
  if lastkey == b'\x1b':  # Esc
    break
  if lastkey == b'K':  # left
    if calc.curx > 0:
      calc.curx -= 1
    calc.updateKeysOnDisplay()
  if lastkey == b'P':  # down
    if calc.cury < 3:
      calc.cury += 1
    calc.updateKeysOnDisplay()
  if lastkey == b'M':  # right
    if calc.curx < 3:
      calc.curx += 1
    calc.updateKeysOnDisplay()
  if lastkey == b'H':  # up
    if calc.cury > 0:
      calc.cury -= 1
    calc.updateKeysOnDisplay()
  if lastkey == b'\r':
    #Разбираемся, какая кнопка нажата на калькуляторе
    selected = calc.keys[calc.cury][calc.curx]
    if calc.curx < 3 and calc.cury < 3:  # цифры больше 0
      newd = selected  # новая нажатая цифра
      if calc.display_digits == "0":
        calc.display_digits = newd
      elif len(calc.display_digits) < 20:
        calc.display_digits += newd
    if calc.curx == 0 and calc.cury == 3:  # 0
      if calc.display_digits != "0" and len(calc.display_digits) < 20:
        calc.display_digits += selected
    if calc.curx == 1 and calc.cury == 3:  # . (точка)
      if len(calc.display_digits) < 20 and '.' not in calc.display_digits:  
        calc.display_digits += selected
    #.needNewDigit  
    #.last_action
    if calc.curx == 3 and calc.cury == 0:  # +
      calc.calc()
      calc.last_action = calc.ACTION_PLUS
    if calc.curx == 3 and calc.cury == 1:  # -
      calc.calc()
      calc.last_action = calc.ACTION_MINUS
    if calc.curx == 3 and calc.cury == 2:  # x
      calc.calc()
      calc.last_action = calc.ACTION_MULTIPLY
    if calc.curx == 3 and calc.cury == 3:  # /
      calc.calc()
      calc.last_action = calc.ACTION_DIVIDE
    if calc.curx == 2 and calc.cury == 3:  # =
      calc.calc()
      calc.last_action = calc.ACTION_EMPTY

  print('\n'*25)
  calc.redraw()

Скачать: Скачать

https-клиент на python

Скрипт читает в переменную содержимое html-страницы:

# -*- coding: utf-8 -*-
import http.client
import ssl
print('Program started')

#выполнить http-запрос
print('Sending request to site...')
#https://stackoverflow.com/questions/39945702/httplib-httpsconnection-issue-certificate-verify-failed#39945733
conn = http.client.HTTPSConnection('kmsvsr.ru', timeout=5, context=ssl._create_unverified_context())

conn.request("GET", "/")
resp = conn.getresponse()
print(resp.status, resp.reason)

print('Reading answer...')
data = resp.read().decode()
print (data)

Скрипт не дописан, кто будет пользоваться — не забудьте добавить сюда обработку ошибок. А так по быстрому спарсить страницу пойдёт.

Из обобенностей: здесь в примере открывается сайт не по HTTP, а по HTTPS, при чём включен игнор ошибок, то есть код можно использовать для парсинга сайтов с самоподписанными сертификатами.

mssql как узнать, сколько места занимают таблицы в базе

Не моё, нашёл где-то в инете, но проверил, код рабочий, запрос очень помог

SELECT
    t.NAME AS TableName,
    s.Name AS SchemaName,
    p.rows AS RowCounts,
    SUM(a.total_pages) * 8 AS TotalSpaceKB, 
    SUM(a.used_pages) * 8 AS UsedSpaceKB, 
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
FROM
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id  = p.index_id
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
WHERE
    t.NAME NOT LIKE  'dt%' 
    AND t.is_ms_shipped = 0
    AND i.OBJECT_ID > 255 
GROUP BY 
    t.Name, s.Name, p.Rows
ORDER BY 
    -- t.Name
    UsedSpaceKB desc

Кухонный таймер на Bash для Raspberry Pi

Добавил своей малинке функцию кухонного таймера. Написал короткий скрипт для воспроизведения звукового файла через назначенный пользователем интервал времени. Скрипт получился такой:

#!/bin/bash
# kmstimer
echo "Таймер сработает через $1 минут"
for ((i=0; i<$1; i++))
  do
    echo "Прошло $i минут"
    sleep 60
  done
echo "Время вышло!"
echo "Время вышло" | festival --tts --language russian
mpg123 /home/pi/usr/share/sounds/default.mp3

Если на системе установлен синтезатор речи festival, то система получеловеческим голосом объявит, что время вышло, после чего воспроизведёт указанный в скрипте музыкальный файл.

Пример использования скрипта следующий:

/bin/kmstimer 15

где 15 — время в минутах.

Получившимся скриптом удобно пользоваться с android-смартфона, например через программу Raspi SSH. Добавляем новые кнопки с названием вроде «Таймер 15 минут (гречка)» и соответственно кодом «kmstimer 15» — таймер будет включаться нажатием одной кнопки на смартфоне.

C#: программа проверки полисов ОМС

2015-04-07 CheckPolis.exe — консольная прогамма для проверки полисов обязательного медицинского страхования через интернет. Запускается через командную строку так:

CheckPolis.exe XXXXxxxxXXXXxxxx XX.XX.XXXX
Результат выдаёт через stdout и как код возврата приложения
Возможные результаты:
* 0 — аргументы не заданы
* 1 — полис существует
* 2 — полис не существует
* 3 — ответ не распознан

Скачать

Написано за 4 часа. Некоторые события пока не обработаны. Исходный код:

/*
  * Created by SharpDevelop.
  * http://kmsvsr.ru
  * Date: 07.04.2015
  * Time: 17:47
  * 
  */
 
 /* args:
  * [0] - номер полиса
  * [1] - дата рождения
  * 
  * ответ программы:
  * 0 - аргументы не заданы
  * 1 - полис существует
  * 2 - полис не существует
  * 3 - ответ не распознан
  * 4 - ответ не получен
  * 5 - неведома ху...
 */
 
 using System;
 using System.Net;
 using System.IO;
 using System.Text;
 
 namespace CheckPolis
 {
     class Program
     {
         private static string POST(string Url, string Data)
         {// спасибо за функцию http://programmerinfo.ru/post_get/
           WebRequest req = WebRequest.Create(Url);
           req.Method = "POST";
           req.Timeout = 100000;
           req.ContentType = "application/x-www-form-urlencoded";
           byte[] sentData = Encoding.GetEncoding(1251).GetBytes(Data);
           req.ContentLength = sentData.Length;
           Stream sendStream = req.GetRequestStream();
           sendStream.Write(sentData, 0, sentData.Length);
           sendStream.Close();
           WebResponse res = req.GetResponse();
           Stream ReceiveStream = res.GetResponseStream();
           StreamReader sr = new StreamReader(ReceiveStream, Encoding.UTF8);
           //Кодировка указывается в зависимости от кодировки ответа сервера
           Char[] read = new Char[256];
           int count = sr.Read(read, 0, 256);
           string Out = String.Empty;
           while (count > 0)
           {
             String str = new String(read, 0, count);
             Out += str;
             count = sr.Read(read, 0, 256);
           }
           return Out;
         }
         
         public static int Main(string[] args)
         {
             if(args.Length > 1){ //если аргументов хотя бы два
                 //переменная в запрос с номером полиса
                 //ХХХХххххХХХХхххх
                 //переменная в запрос с датой рождения
                 //ХХ.ХХ.ХХХХ
                 string Data="polis=" + args[0] + "&birthday=" + args[1];
                 
                 //адрес страницы проверки полисов
                 string tfomsurl = "http://www.tfoms.e-burg.ru/citizens/check-the-relevance-of-the-policy/?type=special";
                 
                 //сюда получим страницу с ответом
                 string responseFromServer = "";
                 responseFromServer = POST(
                     tfomsurl,
                     Data);
                 
                 if(responseFromServer.Contains("<table class=\"wd-main data-table\">")){//если полис существует
                     Console.Write("1");
                     return 1;
                 }else if(responseFromServer.Contains("<h3 style=\"color: red\">")){//если полис не существует
                     Console.Write("2");
                     return 2;
                 }else{//если ответ непонятный
                     Console.Write("3");
                     return 3;
                 }
             } else { //справка по программе
                 Console.Write("0\nHelp:\nCheckPolis.exe XXXXxxxxXXXXxxxx XX.XX.XXXX");
                 Console.Write("\nhttp://kmsvsr.ru");
                 Console.Write("\nPress any key to continue . . . ");
                 Console.ReadKey(true);
                 return 0;
             }            
         }
     }
 }

BAT-скрипт для включения английского по умолчанию в окне входа

BAT-скрипт для включения английского по умолчанию в окне входа в Windows:

 Reg Add "HKU\.Default\Keyboard Layout\Preload" /V "1" /T Reg_Sz /D "00000409" /F
 Reg Add "HKU\.Default\Keyboard Layout\Preload" /V "2" /T Reg_Sz /D "00000419" /F
 echo "Сейчас компьютер будет перезагружен"
 pause
 shutdown /r /t 5

Raspberry Pi: автоматический полив грядок (не закончено)

Проект автополива  грядок на основе Raspberry PI, пока не закончен.

Имеется в наличии

Бак водонапорный к нему подключены 2 датчика верхний (DL1) и нижний уровень (D2) , реле полива (RL1) , насос из колодца (NS1)

Алгоритм работы 

1. Запуск полива по времени через кронтаб в 21.00

Если бак не пустой ( реле нижний уровень включено ) то включить реле полива

Поливать до тех пор пока бак не опустеет ( реле нежнего уровня выключено)

Выключить реле полива

2. Наполнить водонапорный бак

Включить насос

Насос работае до тех пор пока не выключиться реле на водонапорном баке ( реле верхнего уровня)

Завершить работу насоса

3. Ждать следующего включения в 21.00

Управление портами

Установка высокого и низкого уровней для порта, настроенного на выход выполняется так:

$ echo 1 > /sys/class/gpio/gpioXX/value
$ echo 0 > /sys/class/gpio/gpioXX/value

Определение состояние порта, настроенного на вход делается так:

$ cat /sys/class/gpio/gpioXX/value

Исходный код скрипта, запускающего автополив

#!/bin/bash 
DL1="..."    #подставить /sys/class/gpio/gpioXX/value 
D2="..."    #подставить /sys/class/gpio/gpioXX/value 
RL1="..."    #подставить /sys/class/gpio/gpioXX/value 
NS1="..."    #подставить /sys/class/gpio/gpioXX/value 
 
#1 
while ["$(cat $D2)" != '0'] ; do #Поливать до тех пор пока бак не опустеет ( реле нежнего уровня выключено) 
    echo 1 > $RL1            #включить реле полива 
    sleep 5     #через сколько секунд повторить проверку 
done 
echo 0 > $RL1 #Выключить реле полива 
 
#2 
echo 1 > $NS1        #Включить насос 
while ["$(cat $DL1)" != '0'] ; do #не выключиться реле на водонапорном баке ( реле верхнего уровня) 
    sleep 5     #через сколько секунд повторить проверку 
done 
echo 0 > $NS1    #Завершить работу насоса 
 
#3 конец, Ждать следующего включения в 21.00

Для справки:
http://eddnet.org/?p=1311 — условия
http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-7.html — циклы
http://younglinux.info/bash/commands.php — sleep
http://www.bash-scripting.ru/abs/chunks/ch04.html — работа с переменными

 

C#: Запуск команд CMD из кода программы

Для запуска сторонних программ из программы на C# в начало программы вставляем строчку

using System.Diagnostics;

и после этого запускаем команды CMD из нашего кода следующим образом:

Process.Start("calc");

Эта строчка например запустит виндовый калькулятор.

А эта строчка откроет проводник на диске D:

Process.Start("explorer""d:");

Так же можно запускать программы от имени другого пользователя, см. вамианты перегрузки .Start()