upgrade to 10.x
This commit is contained in:
@@ -12,5 +12,4 @@ trim_trailing_whitespace = true
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[*.yml]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
250
README.md
250
README.md
@@ -1,236 +1,40 @@
|
||||
# Restore weewx Database from Ecowitt.net
|
||||
<a href="https://supportukrainenow.org/"><img src="https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner-direct.svg" width="100%"></a>
|
||||
|
||||
**PRs welcome!**
|
||||
------
|
||||
|
||||
## General
|
||||
<p align="center">
|
||||
<img title="Laravel Zero" height="100" src="https://raw.githubusercontent.com/laravel-zero/docs/master/images/logo/laravel-zero-readme.png" />
|
||||
</p>
|
||||
|
||||
In case your weather station send all data to ecowitt.net and you lost your weewx database,
|
||||
this huge cannonball will help you to reintegrate your data. build with https://laravel-zero.com
|
||||
<p align="center">
|
||||
<a href="https://github.com/laravel-zero/framework/actions"><img src="https://github.com/laravel-zero/laravel-zero/actions/workflows/tests.yml/badge.svg" alt="Build Status"></img></a>
|
||||
<a href="https://packagist.org/packages/laravel-zero/framework"><img src="https://img.shields.io/packagist/dt/laravel-zero/framework.svg" alt="Total Downloads"></a>
|
||||
<a href="https://packagist.org/packages/laravel-zero/framework"><img src="https://img.shields.io/packagist/v/laravel-zero/framework.svg?label=stable" alt="Latest Stable Version"></a>
|
||||
<a href="https://packagist.org/packages/laravel-zero/framework"><img src="https://img.shields.io/packagist/l/laravel-zero/framework.svg" alt="License"></a>
|
||||
</p>
|
||||
|
||||
The steps are easy.
|
||||
<h4> <center>This is a <bold>community project</bold> and not an official Laravel one </center></h4>
|
||||
|
||||
Laravel Zero was created by [Nuno Maduro](https://github.com/nunomaduro) and [Owen Voke](https://github.com/owenvoke), and is a micro-framework that provides an elegant starting point for your console application. It is an **unofficial** and customized version of Laravel optimized for building command-line applications.
|
||||
|
||||
### 1. Export and Convert
|
||||
- Built on top of the [Laravel](https://laravel.com) components.
|
||||
- Optional installation of Laravel [Eloquent](https://laravel-zero.com/docs/database/), Laravel [Logging](https://laravel-zero.com/docs/logging/) and many others.
|
||||
- Supports interactive [menus](https://laravel-zero.com/docs/build-interactive-menus/) and [desktop notifications](https://laravel-zero.com/docs/send-desktop-notifications/) on Linux, Windows & MacOS.
|
||||
- Ships with a [Scheduler](https://laravel-zero.com/docs/task-scheduling/) and a [Standalone Compiler](https://laravel-zero.com/docs/build-a-standalone-application/).
|
||||
- Integration with [Collision](https://github.com/nunomaduro/collision) - Beautiful error reporting
|
||||
|
||||
This simple tool will login into your ecowitt.net account, fetch all available devices and download all available data
|
||||
for the range between `startdate` and `enddate`.
|
||||
------
|
||||
|
||||
```sh
|
||||
./ecowitt2weewx export --user <ecowitt username> --pass <ecowitt password> start_date end_date
|
||||
```
|
||||
## Documentation
|
||||
|
||||
example
|
||||
```sh
|
||||
./ecowitt2weewx export --user foo@example.org --pass 12345 2020-01-01 2020-12-31
|
||||
```
|
||||
For full documentation, visit [laravel-zero.com](https://laravel-zero.com/).
|
||||
|
||||
Details see source file: `/app/Commands/EcowittExportCommand.php`
|
||||
## Support the development
|
||||
**Do you like this project? Support it by donating**
|
||||
|
||||
This script will generate a CSV File which is compatible with wee_import config in step 2.
|
||||
The file will be generated in `ecowitt_<device_id>.csv`.
|
||||
- PayPal: [Donate](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L)
|
||||
- Patreon: [Donate](https://www.patreon.com/nunomaduro)
|
||||
|
||||
### 2. import
|
||||
## License
|
||||
|
||||
Import your data with wee_import. Sample config below
|
||||
|
||||
Sample Import File: weewx_import.conf:
|
||||
```conf
|
||||
# EXAMPLE CONFIGURATION FILE FOR IMPORTING FROM CSV FILES
|
||||
#
|
||||
# Copyright (c) 2009-2019 Tom Keffer <tkeffer@gmail.com> and Gary Roderick.
|
||||
# See the file LICENSE.txt for your rights.
|
||||
|
||||
##############################################################################
|
||||
|
||||
# Specify the source. Available options are:
|
||||
# CSV - import obs from a single CSV format file
|
||||
# WU - import obs from a Weather Underground PWS history
|
||||
# Cumulus - import obs from a one or more Cumulus monthly log files
|
||||
# WD - import obs from a one or more WD monthly log files
|
||||
# Format is:
|
||||
# source = (CSV | WU | Cumulus)
|
||||
source = CSV
|
||||
|
||||
##############################################################################
|
||||
|
||||
[CSV]
|
||||
# Parameters used when importing from a CSV file
|
||||
|
||||
# Path and name of our CSV source file. Format is:
|
||||
# file = full path and filename
|
||||
file = /home/pi/input.csv
|
||||
|
||||
# The character used to separate fields. Format is:
|
||||
# delimiter = <single character>
|
||||
# Default is , (comma).
|
||||
delimiter = ","
|
||||
|
||||
# If there is no mapped interval field how will the interval field be
|
||||
# determined for the imported records. Available options are:
|
||||
# derive - Derive the interval field from the timestamp of successive
|
||||
# records. This setting is best used when the imported records
|
||||
# are equally spaced in time and there are no missing records.
|
||||
# conf - Use the interval setting from weewx.conf. This setting is
|
||||
# best used if the records to be imported have been produced by
|
||||
# WeeWX using the same archive interval as set in weewx.conf on
|
||||
# this machine.
|
||||
# x - Use a fixed interval of x minutes for every record. This
|
||||
# setting is best used if the records to be imported are
|
||||
# equally based in time but there are some missing records.
|
||||
#
|
||||
# Note: If there is a mapped interval field then this setting will be
|
||||
# ignored.
|
||||
# Format is:
|
||||
# interval = (derive | conf | x)
|
||||
interval = derive
|
||||
|
||||
# Should the [StdQC] max/min limits in weewx.conf be applied to the
|
||||
# imported data. This may be useful if the source has extreme values that
|
||||
# are clearly incorrect for some observations. Available options are:
|
||||
# True - weewx.conf [StdQC] max/min limits are applied.
|
||||
# False - weewx.conf [StdQC] max/min limits are not applied.
|
||||
# Format is:
|
||||
# qc = (True | False)
|
||||
qc = True
|
||||
|
||||
# Should any missing derived observations be calculated from the imported
|
||||
# data if possible. Available options are:
|
||||
# True - Any missing derived observations are calculated.
|
||||
# False - Any missing derived observations are not calculated.
|
||||
# Format is:
|
||||
# calc_missing = (True | False)
|
||||
calc_missing = True
|
||||
|
||||
# Specify how imported data fields that contain invalid data (eg a numeric
|
||||
# field containing non-numeric data) are handled. Available options are:
|
||||
# True - The invalid data is ignored, the WeeWX target field is set to
|
||||
# None and the import continues.
|
||||
# False - The import is halted.
|
||||
# Format is:
|
||||
# ignore_invalid_data = (True | False)
|
||||
# Default is True.
|
||||
ignore_invalid_data = True
|
||||
|
||||
# Imported records are written to archive in transactions of tranche
|
||||
# records at a time. Increase for faster throughput, decrease to reduce
|
||||
# memory requirements. Format is:
|
||||
# tranche = x
|
||||
# where x is an integer
|
||||
tranche = 250
|
||||
|
||||
# Specify whether a UV sensor was used to produce any UV observations.
|
||||
# Available options are:
|
||||
# True - UV sensor was used and UV data will be imported.
|
||||
# False - UV sensor was not used and any UV data will not be imported.
|
||||
# UV fields will be set to None/NULL.
|
||||
# For a CSV import UV_sensor should be set to False if a UV sensor was
|
||||
# NOT present when the import data was created. Otherwise it may be set to
|
||||
# True or omitted. Format is:
|
||||
# UV_sensor = (True | False)
|
||||
UV_sensor = True
|
||||
|
||||
# Specify whether a solar radiation sensor was used to produce any solar
|
||||
# radiation observations. Available options are:
|
||||
# True - Solar radiation sensor was used and solar radiation data will
|
||||
# be imported.
|
||||
# False - Solar radiation sensor was not used and any solar radiation
|
||||
# data will not be imported. radiation fields will be set to
|
||||
# None/NULL.
|
||||
# For a CSV import solar_sensor should be set to False if a solar radiation
|
||||
# sensor was NOT present when the import data was created. Otherwise it may
|
||||
# be set to True or omitted. Format is:
|
||||
# solar_sensor = (True | False)
|
||||
solar_sensor = True
|
||||
|
||||
# Date-time format of CSV field from which the WeeWX archive record
|
||||
# dateTime field is to be extracted. wee_import first attempts to interpret
|
||||
# date/time info in this format, if this fails it then attempts to
|
||||
# interpret it as a timestamp and if this fails it then raises an error.
|
||||
# Uses Python strptime() format codes.
|
||||
# raw_datetime_format = Python strptime() format string
|
||||
raw_datetime_format = %Y-%m-%d %H:%M
|
||||
|
||||
# Does the imported rain field represent the total rainfall since the last
|
||||
# record or a cumulative value. Available options are:
|
||||
# discrete - rain field represents total rainfall since last record
|
||||
# cumulative - rain field represents a cumulative rainfall reset at
|
||||
# midnight
|
||||
# rain = (discrete | cumulative)
|
||||
rain = cumulative
|
||||
|
||||
# Lower and upper bounds for imported wind direction. It is possible,
|
||||
# particularly for a calculated direction, to have a value (eg -45) outside
|
||||
# of the WeeWX limits (0 to 360 inclusive). Format is:
|
||||
#
|
||||
# wind_direction = lower,upper
|
||||
#
|
||||
# where :
|
||||
# lower is the lower limit of acceptable wind direction in degrees
|
||||
# (may be negative)
|
||||
# upper is the upper limit of acceptable wind direction in degrees
|
||||
#
|
||||
# Imported values from lower to upper will be normalised to the range 0 to
|
||||
# 360. Values outside of the parameter range will be stored as None.
|
||||
# Default is -360,360.
|
||||
wind_direction = -360,360
|
||||
|
||||
# Map CSV record fields to WeeWX archive fields. Format is:
|
||||
#
|
||||
# weewx_archive_field_name = csv_field_name, weewx_unit_name
|
||||
#
|
||||
# where:
|
||||
# weewx_archive_field_name - An observation name in the WeeWX database
|
||||
# schema.
|
||||
# csv_field_name - The name of a field from the CSV file.
|
||||
# weewx_unit_name - The name of the units, as defined in WeeWX,
|
||||
# used by csv_field_name. wee_import will do
|
||||
# the necessary conversions to the unit system
|
||||
# used by the WeeWX archive.
|
||||
# For example,
|
||||
# outTemp = Temp, degree_C
|
||||
# would map the CSV field Temp, in degrees C, to the archive field outTemp.
|
||||
#
|
||||
# A mapping for WeeWX field dateTime is mandatory and the WeeWX unit name
|
||||
# for the dateTime mapping must be unix_epoch. For example,
|
||||
# dateTime = csv_date_and_time, unix_epoch
|
||||
# would map the CSV field csv_date_and_time to the WeeWX dateTime field with
|
||||
# the csv_date_and_time field being interpreted first using the format
|
||||
# specified at the raw_datetime_format config option and if that fails as a
|
||||
# unix epoch timestamp.
|
||||
#
|
||||
# Field mapping to the WeeWX usUnits archive field is currently not
|
||||
# supported. If a usUnits field exists in the CSV data it should not be
|
||||
# mapped, rather WeeWX unit names should included against each field to be
|
||||
# imported in the field map.
|
||||
#
|
||||
# WeeWX archive fields that do not exist in the CSV data may be omitted.
|
||||
# Any omitted fields that are derived (eg dewpoint) may be calculated
|
||||
# during import using the equivalent of the WeeWX StdWXCalculate service
|
||||
# through setting the calc-missing parameter above.
|
||||
[[FieldMap]]
|
||||
dateTime = date_and_time
|
||||
interval =
|
||||
barometer = pressure_rel, hPa
|
||||
pressure = pressure_abs, hPa
|
||||
altimeter =
|
||||
inTemp = temp_in, degree_C
|
||||
outTemp = temp_out, degree_C
|
||||
inHumidity = humid_in, percent
|
||||
outHumidity = humid_out, percent
|
||||
windSpeed = wind, meter_per_second
|
||||
windDir = wind_dir, degree_compass
|
||||
windGust = wind_gust, meter_per_second
|
||||
windGustDir =
|
||||
rainRate = rain, mm_per_hour
|
||||
rain = rain_daily, mm
|
||||
dewpoint = temp_out_dew, degree_C
|
||||
windchill = temp_out_gust, degree_C
|
||||
heatindex =
|
||||
ET =
|
||||
radiation =
|
||||
UV =
|
||||
```
|
||||
|
||||
**DONE!**
|
||||
|
||||
regenerate / restart weewx daemon and check your data!
|
||||
Laravel Zero is an open-source software licensed under the MIT license.
|
||||
|
||||
@@ -8,20 +8,16 @@ class AppServiceProvider extends ServiceProvider
|
||||
{
|
||||
/**
|
||||
* Bootstrap any application services.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function boot()
|
||||
public function boot(): void
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Register any application services.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function register()
|
||||
public function register(): void
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
@@ -5,6 +5,10 @@
|
||||
"homepage": "https://github.com/comes/ecowitt2weewx",
|
||||
"type": "project",
|
||||
"license": "MIT",
|
||||
"support": {
|
||||
"issues": "https://github.com/comes/ecowitt2weewx/issues",
|
||||
"source": "https://github.com/comes/ecowitt2weewx"
|
||||
},
|
||||
"authors": [
|
||||
{
|
||||
"name": "Jeremias Wolff",
|
||||
@@ -12,15 +16,20 @@
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": "^8.0",
|
||||
"guzzlehttp/guzzle": "^7.5",
|
||||
"illuminate/http": "^9.47",
|
||||
"laravel-zero/framework": "^9.2",
|
||||
"nesbot/carbon": "^2.65"
|
||||
"php": "^8.1",
|
||||
"laravel-zero/framework": "^10.0.2",
|
||||
"nunomaduro/termwind": "^1.15.1"
|
||||
},
|
||||
"require-dev": {
|
||||
"laravel/pint": "^1.8",
|
||||
"mockery/mockery": "^1.5.1",
|
||||
"pestphp/pest": "^2.5"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"App\\": "app/"
|
||||
"App\\": "app/",
|
||||
"Database\\Factories\\": "database/factories/",
|
||||
"Database\\Seeders\\": "database/seeders/"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
@@ -36,7 +45,7 @@
|
||||
"pestphp/pest-plugin": true
|
||||
}
|
||||
},
|
||||
"minimum-stability": "dev",
|
||||
"minimum-stability": "stable",
|
||||
"prefer-stable": true,
|
||||
"bin": ["ecowitt2weewx"]
|
||||
}
|
||||
|
||||
4553
composer.lock
generated
4553
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -42,6 +42,19 @@ return [
|
||||
|
||||
'env' => 'development',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Application Timezone
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may specify the default timezone for your application, which
|
||||
| will be used by the PHP date and date-time functions. We have gone
|
||||
| ahead and set this to a sensible default for you out of the box.
|
||||
|
|
||||
*/
|
||||
|
||||
'timezone' => 'UTC',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Autoloaded Service Providers
|
||||
|
||||
@@ -56,10 +56,13 @@ return [
|
||||
|
||||
'hidden' => [
|
||||
NunoMaduro\LaravelConsoleSummary\SummaryCommand::class,
|
||||
Symfony\Component\Console\Command\DumpCompletionCommand::class,
|
||||
Symfony\Component\Console\Command\HelpCommand::class,
|
||||
Illuminate\Console\Scheduling\ScheduleRunCommand::class,
|
||||
Illuminate\Console\Scheduling\ScheduleListCommand::class,
|
||||
Illuminate\Console\Scheduling\ScheduleFinishCommand::class,
|
||||
Illuminate\Foundation\Console\VendorPublishCommand::class,
|
||||
LaravelZero\Framework\Commands\StubPublishCommand::class,
|
||||
],
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,13 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<phpunit backupGlobals="false"
|
||||
backupStaticAttributes="false"
|
||||
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd"
|
||||
bootstrap="vendor/autoload.php"
|
||||
colors="true"
|
||||
convertErrorsToExceptions="true"
|
||||
convertNoticesToExceptions="true"
|
||||
convertWarningsToExceptions="true"
|
||||
processIsolation="false"
|
||||
stopOnFailure="false">
|
||||
>
|
||||
<testsuites>
|
||||
<testsuite name="Feature">
|
||||
<directory suffix="Test.php">./tests/Feature</directory>
|
||||
@@ -16,9 +12,9 @@
|
||||
<directory suffix="Test.php">./tests/Unit</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
<coverage processUncoveredFiles="true">
|
||||
<source>
|
||||
<include>
|
||||
<directory suffix=".php">./app</directory>
|
||||
</include>
|
||||
</coverage>
|
||||
</source>
|
||||
</phpunit>
|
||||
|
||||
@@ -3,15 +3,14 @@
|
||||
namespace Tests;
|
||||
|
||||
use Illuminate\Contracts\Console\Kernel;
|
||||
use Illuminate\Foundation\Application;
|
||||
|
||||
trait CreatesApplication
|
||||
{
|
||||
/**
|
||||
* Creates the application.
|
||||
*
|
||||
* @return \Illuminate\Foundation\Application
|
||||
*/
|
||||
public function createApplication()
|
||||
public function createApplication(): Application
|
||||
{
|
||||
$app = require __DIR__.'/../bootstrap/app.php';
|
||||
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
<?php
|
||||
|
||||
test('inspiring command', function () {
|
||||
$this->artisan('inspiring')
|
||||
->expectsOutput('Simplicity is the ultimate sophistication.')
|
||||
->assertExitCode(0);
|
||||
});
|
||||
@@ -1,3 +1,45 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Test Case
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The closure you provide to your test functions is always bound to a specific PHPUnit test
|
||||
| case class. By default, that class is "PHPUnit\Framework\TestCase". Of course, you may
|
||||
| need to change it using the "uses()" function to bind a different classes or traits.
|
||||
|
|
||||
*/
|
||||
|
||||
uses(Tests\TestCase::class)->in('Feature');
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Expectations
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When you're writing tests, you often need to check that values meet certain conditions. The
|
||||
| "expect()" function gives you access to a set of "expectations" methods that you can use
|
||||
| to assert different things. Of course, you may extend the Expectation API at any time.
|
||||
|
|
||||
*/
|
||||
|
||||
expect()->extend('toBeOne', function () {
|
||||
return $this->toBe(1);
|
||||
});
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Functions
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| While Pest is very powerful out-of-the-box, you may have some testing code specific to your
|
||||
| project that you don't want to repeat in every file. Here you can also expose helpers as
|
||||
| global functions to help you to reduce the number of lines of code in your test files.
|
||||
|
|
||||
*/
|
||||
|
||||
function something(): void
|
||||
{
|
||||
// ..
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user