semvec/pypi-packages huggingface dataset:
smartlibs 0.1.9
Smart Platforms Libs
License: MIT
Requires Python: >=3.5.0

Smart Platforms Libs

# 项目结构
**主框架**
* smart.auto: 自动化框架
* smart.aaas: auto as a service 自动化任务发布为rest服务
* smart.utils: 工具类
* smart.rest: simple rest server
* smart.rulenet: 规则网络 (原型版本)


**任务类库**
* auto_tasks.tools: 基础任务工具
* auto_tasks.jsonl: jsonl文件读写
* auto_tasks.redis: redis管道服务, 用于向aaas发送数据和读取结果
* auto_tasks.aaas: aaas客户端, 启动远程任务 



# How-to-Use
## Install

```bash
# 安装方法1
## 仓库安装
pip install smartlibs

## 源码打包安装
python3 setup.py sdist
pip install dist/smartlibs-0.1.4.tar.gz

# 记录安装文件
sudo python3 setup.py install --record logs/files.txt

## 更新
pip install --force-reinstall --no-deps smartlibs
```

# Quick Start
## smart_auto quick start
*查看命令说明*: `smart_auto -- --help`  
  
*Run Cmd Example*:
> smart_auto auto_tasks.tasks 'task:tools__tool.range~@tools__print.item_iter'

*Bind Arg*:
> smart_auto auto_tasks.tasks task:tools__tool.range~@tools__print.item_iter --bind_arg.tools__tool.range.size=20 --bind_arg.tools__print.item_iter.head=None

*Multi Tasks*:
> smart_auto auto_tasks.test helloworld,helloworld
> smart_auto auto_tasks.test '["task:tools__tool.range~@tools__print.item_iter","helloworld"]'


## smart_aaas quick start

*启动aaas服务*: `smart_aaas`  

*查看命令说明*: `smart_aaas -- --help`  

[推荐使用 Postman 测试后面的Api]  

*查看服务描述*(asdl: auto service description language): 
```
curl 'http://127.0.0.1/auto/run?module=starter.aaas.client&only_parse=1'
```

*创建任务*:  
```
curl 'http://127.0.0.1/auto/run?module=starter.aaas.client&name=task:tools__tool.range~@tools__print.item_iter'
在运行smart_aaas的终端将看到任务执行日志
```



# 名词解释
* smartlibs: smartnlp底层框架, 设计用于数据科学
* smart_auto: 任务自动化工具命令行, 等同于`python -m smart.auto.run`
* smart_aaas: 自动化发布成服务的工具命令行, 等同于`python -m smart.aaas.run`
  
**smart_auto**
* asdl: auto service description language 自动化服务描述语言, 基于 [yaml](https://yaml.org/spec/1.1/)
* auto yml: 使用asdl编写的yml文件
* task: 最小任务单元, 即使是单进程运行模式, 任务的设计应符合进程隔离; 即任务间应通过管道传递数据
* tree: 任务树, 每个任务最多一个前置任务, 可以有多个后置任务, 不能出现环形依赖
* task expression: 任务表达式, 设计简要的字符串规则, 可被解析为任务名、任务方法、连接方法、绑定配置
* task key: 任务表达式中的任务名、任务方法作为任务关键字, 同一个tree下task key不能重复; 如需复用任务函数, 可用$+数字追加到任务方法之后
* module: 以'.'分割的路径名(dotted_module_path), 追加'.yml'后缀应指向 auto yml 文件; 完整格式: python包名.下属文件路径(路径分隔符替换成'.').auto_yml文件名
* pip: 数据管道, 为任务树的依赖任务之间提供数据队列; 发送机制为广播, 即前置任务同时向多个后置任务发送相同数据, 后置任务不能向前置任务发送数据



# 教程
* [smart_auto doc](./starter/docs/auto/quick_start.md#Directory)

* [smart_aaas doc](./starter/docs/aaas/quick_start.md#Directory)



# 参考代码
* tests: 单元测试

**starter: 入门教程**
* starter.helloworld: 学习创建auto.yml, 编写任务类
  
* starter.aaas: aaas客户端和服务端示例 (通过Redis建立数据管道)


# 开发
## Windows环境

**注意**: Windows需在命令行执行`git config --global core.autocrlf input`  


## Start Redis Server

```
docker run -d --name myredis -p 6379:6379 redis redis-server --appendonly yes
```
xlsx2csv-mergefill 1.0.5
Simple Excel to CSV converter with merged-cell propagation and cp932 encoding
License: MIT
Requires Python: >=3.9
Keywords: excel, csv, converter, merged-cells, cp932, shift-jis, japanese

# xlsx2csv-mergefill

Excelファイル（.xlsx）を、データ処理に適したCSV形式へ変換するPythonライブラリです。
結合セルの補完対応により、業務システムへのデータ取り込みを容易にします。

## 特徴

* **結合セルの自動補完** — 結合領域を左上セルの値で埋め、データ欠損を防止
* **複数シートの一括変換** — Excelブック内の全シートを安全なファイル名で自動出力

## インストール

```bash
pip install xlsx2csv_mergefill
```

## 使い方

### 1. ExcelファイルをCSVに一括変換

```python
from xlsx2csv_mergefill import convert_file

# 基本的な使用方法
convert_file("input.xlsx", "output")

# シート名を数値にする場合
convert_file("input.xlsx", "output", use_numeric_sheet_names=True)

# 非表示シートも含めて出力する場合
convert_file("input.xlsx", "output", include_hidden_sheets=True)
```

→ 出力形式：
- 通常：`<指定パスの拡張子なし>_シート名.csv` という形式で同ディレクトリに出力されます
- 数値オプション使用時：`<指定パスの拡張子なし>_0.csv`, `<指定パスの拡張子なし>_1.csv` という形式で出力されます

※ 1シートの場合でも、シート名（または数値）が付与されたファイル名で出力されます。

### 2. 特定シートをPythonリストとして読み込み

```python
from xlsx2csv_mergefill import read_sheet

rows = read_sheet("input.xlsx")
```

### 3. 全シートを辞書形式で読み込み

```python
from xlsx2csv_mergefill import read_workbook

data = read_workbook("input.xlsx")
```

**引数**

* `input_path`: 入力Excelファイルのパス
* `output_path`: 出力先のパス。プレフィックスとして扱われ、`<指定パスの拡張子なし>_シート名.csv` を同ディレクトリに出力します。
* `use_numeric_sheet_names` (オプション): `True` を指定すると、シート名の代わりに数値（0, 1, 2...）を使用してファイル名を生成します。デフォルトは `False`。
* `include_hidden_sheets` (オプション): `True` を指定すると、非表示シートも含めて出力します。デフォルトは `False`（非表示シートは出力しない）。

**戻り値**

* 成功時に `0` を返します。

**例外**

* `FileNotFoundError` などの例外を送出することがあります。

## 制限事項

* 入力形式は `.xlsx` のみ対応（`.xls` 非対応）
* 出力形式は `UTP-8` / カンマ区切り固定
* 数式セルは計算済みの値として取得されます

## ライセンス

本プロジェクトはMITライセンスの下で公開されています。詳細は[LICENSE](LICENSE)ファイルをご覧ください。
pyiskra 0.1.29
Python Iskra devices interface
License: MIT
Requires Python: >=3.8
Keywords: homeautomation, iskra, energy meter

# PyIskra

PyIskra is a Python package designed to provide interface for Iskra devices using SG and it's RestAPI or ModbusTCP/RTU.

## Installation

You can install PyIskra using pip:

```bash
pip install pyiskra
```

## Features

- Object-oriented mapping for energy meters
- Access to measurements
- Access to Energy counters

## Supported devices

- Smart Gateway
- IE38
- IE14
- MCXXX
- iMCXXX
- MTXXX
- iMTXXX


## Usage

Here's a basic example of how to use PyIskra:

```
import asyncio
from pyiskra.devices import Device
from pyiskra.adapters import RestAPI


device_ip = "192.168.1.1"
device_auth = {"username": "admin", "password": "iskra"}

async def main():
    # Set device IP address

    # Create adapter
    adapter = RestAPI(ip_address=device_ip, authentication=device_auth)

    # Create device
    device = await Device.create_device(adapter)

    # Initalize device
    await device.init()

    devices = [device]


    if device.is_gateway:
        devices += device.get_child_devices()


    for device in devices:
        # Update device status
        print(f"Updating status for {device.model} {device.serial}")
        await device.update_status()

        if device.supports_measurements:
            for index, phase in enumerate(device.measurements.phases):
                print(f"Phase {index+1} - U: {phase.voltage.value} {phase.voltage.units}, I: {phase.current.value} {phase.current.units} P: {phase.active_power.value} {phase.active_power.units} Q: {phase.reactive_power.value} {phase.reactive_power.units} S: {phase.apparent_power.value} {phase.apparent_power.units} PF: {phase.power_factor.value} {phase.power_factor.units} PA: {phase.power_angle.value} {phase.power_angle.units} THD U: {phase.thd_voltage.value} {phase.thd_voltage.units} THD I: {phase.thd_current.value} {phase.thd_current.units}")

        if device.supports_counters:
            for counter in device.counters.non_resettable :
                print(f"Non-resettable counter - Name: {counter.name}, Value: {counter.value} {counter.units}, Direction: {counter.direction}")


            for counter in device.counters.resettable:
                print(f"Resettable counter - Name: {counter.name}, Value: {counter.value} {counter.units}, Direction: {counter.direction}")

asyncio.run(main())
```